six-degrees 0.6.0 → 0.8.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/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +4 -0
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +42 -14
- package/.next/standalone/.next/routes-manifest.json +24 -0
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +26 -18
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +26 -18
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +25 -16
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/admin-delete/route.js +2 -2
- package/.next/standalone/.next/server/app/api/admin-delete/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/admin-update/route.js +2 -2
- package/.next/standalone/.next/server/app/api/admin-update/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/bridges/route.js +2 -2
- package/.next/standalone/.next/server/app/api/bridges/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/bulk-import/route.js +2 -2
- package/.next/standalone/.next/server/app/api/bulk-import/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js +3 -3
- package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/company-scores/route.js +3 -3
- package/.next/standalone/.next/server/app/api/company-scores/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/connections/route.js +2 -2
- package/.next/standalone/.next/server/app/api/connections/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/backup/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/data/backup/route/build-manifest.json +12 -0
- package/.next/standalone/.next/server/app/api/data/backup/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/data/backup/route.js +7 -0
- package/.next/standalone/.next/server/app/api/data/backup/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/data/backup/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/data/backup/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/data/csv/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/data/csv/route/build-manifest.json +12 -0
- package/.next/standalone/.next/server/app/api/data/csv/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/data/csv/route.js +8 -0
- package/.next/standalone/.next/server/app/api/data/csv/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/data/csv/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/data/csv/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/data/export/route.js +1 -1
- package/.next/standalone/.next/server/app/api/data/export/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/import/route.js +1 -1
- package/.next/standalone/.next/server/app/api/data/import/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/restart/route.js +1 -1
- package/.next/standalone/.next/server/app/api/data/restart/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/restore/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/data/restore/route/build-manifest.json +12 -0
- package/.next/standalone/.next/server/app/api/data/restore/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/data/restore/route.js +7 -0
- package/.next/standalone/.next/server/app/api/data/restore/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/data/restore/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/data/restore/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/data/reveal/route.js +1 -1
- package/.next/standalone/.next/server/app/api/data/reveal/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/route.js +1 -1
- package/.next/standalone/.next/server/app/api/data/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/delete-cluster/route.js +2 -2
- package/.next/standalone/.next/server/app/api/delete-cluster/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ingest/route.js +2 -2
- package/.next/standalone/.next/server/app/api/ingest/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/route.js +2 -2
- package/.next/standalone/.next/server/app/api/network/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/outreach/route.js +3 -3
- package/.next/standalone/.next/server/app/api/outreach/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/queue/route.js +2 -2
- package/.next/standalone/.next/server/app/api/queue/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/scraper/route.js +5 -3
- package/.next/standalone/.next/server/app/api/scraper/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/settings/route.js +3 -3
- package/.next/standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js +3 -3
- package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js +3 -3
- package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/setup-profile/route.js +2 -2
- package/.next/standalone/.next/server/app/api/setup-profile/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/crm/route.js +1 -1
- package/.next/standalone/.next/server/app/api/social/crm/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/messages/route.js +1 -1
- package/.next/standalone/.next/server/app/api/social/messages/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/route.js +2 -2
- package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/unlock/route.js +2 -2
- package/.next/standalone/.next/server/app/api/unlock/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/update-images/route.js +2 -2
- package/.next/standalone/.next/server/app/api/update-images/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/users/route.js +2 -2
- package/.next/standalone/.next/server/app/api/users/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/avatars/[file]/route.js +1 -1
- package/.next/standalone/.next/server/app/avatars/[file]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/import/page.js +1 -1
- package/.next/standalone/.next/server/app/import/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/import/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/import.html +1 -1
- package/.next/standalone/.next/server/app/import.rsc +32 -24
- package/.next/standalone/.next/server/app/import.segments/_full.segment.rsc +32 -24
- package/.next/standalone/.next/server/app/import.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/import.segments/import/__PAGE__.segment.rsc +23 -18
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +29 -22
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +20 -15
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +29 -22
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/insights/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/insights/page/build-manifest.json +20 -0
- package/.next/standalone/.next/server/app/insights/page/next-font-manifest.json +11 -0
- package/.next/standalone/.next/server/app/insights/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/insights/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/insights/page.js +13 -0
- package/.next/standalone/.next/server/app/insights/page.js.map +5 -0
- package/.next/standalone/.next/server/app/insights/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/insights/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/insights.html +1 -0
- package/.next/standalone/.next/server/app/insights.meta +26 -0
- package/.next/standalone/.next/server/app/insights.rsc +35 -0
- package/.next/standalone/.next/server/app/insights.segments/_full.segment.rsc +35 -0
- package/.next/standalone/.next/server/app/insights.segments/_tree.segment.rsc +4 -0
- package/.next/standalone/.next/server/app/insights.segments/insights/__PAGE__.segment.rsc +33 -0
- package/.next/standalone/.next/server/app/launch/page.js +1 -1
- package/.next/standalone/.next/server/app/launch/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/launch/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/launch.html +2 -2
- package/.next/standalone/.next/server/app/launch.rsc +32 -24
- package/.next/standalone/.next/server/app/launch.segments/_full.segment.rsc +32 -24
- package/.next/standalone/.next/server/app/launch.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/launch.segments/launch/__PAGE__.segment.rsc +23 -18
- package/.next/standalone/.next/server/app/page.js +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/paths/page.js +1 -1
- package/.next/standalone/.next/server/app/paths/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/paths/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/paths.html +1 -1
- package/.next/standalone/.next/server/app/paths.rsc +32 -24
- package/.next/standalone/.next/server/app/paths.segments/_full.segment.rsc +32 -24
- package/.next/standalone/.next/server/app/paths.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/paths.segments/paths/__PAGE__.segment.rsc +21 -18
- package/.next/standalone/.next/server/app/profile/page.js +1 -1
- package/.next/standalone/.next/server/app/profile/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/profile/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/profile.html +1 -1
- package/.next/standalone/.next/server/app/profile.rsc +32 -24
- package/.next/standalone/.next/server/app/profile.segments/_full.segment.rsc +32 -24
- package/.next/standalone/.next/server/app/profile.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/profile.segments/profile/__PAGE__.segment.rsc +23 -18
- package/.next/standalone/.next/server/app/queue/page.js +1 -1
- package/.next/standalone/.next/server/app/queue/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/queue/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/queue.html +1 -1
- package/.next/standalone/.next/server/app/queue.rsc +32 -24
- package/.next/standalone/.next/server/app/queue.segments/_full.segment.rsc +32 -24
- package/.next/standalone/.next/server/app/queue.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/queue.segments/queue/__PAGE__.segment.rsc +21 -18
- package/.next/standalone/.next/server/app/scores/page.js +1 -1
- package/.next/standalone/.next/server/app/scores/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/scores/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/scores.html +1 -1
- package/.next/standalone/.next/server/app/scores.rsc +32 -24
- package/.next/standalone/.next/server/app/scores.segments/_full.segment.rsc +32 -24
- package/.next/standalone/.next/server/app/scores.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/scores.segments/scores/__PAGE__.segment.rsc +23 -18
- package/.next/standalone/.next/server/app/settings/page.js +1 -1
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings.html +1 -1
- package/.next/standalone/.next/server/app/settings.rsc +32 -24
- package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +32 -24
- package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +20 -18
- package/.next/standalone/.next/server/app/setup/page.js +1 -1
- package/.next/standalone/.next/server/app/setup/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/setup.html +1 -1
- package/.next/standalone/.next/server/app/setup.rsc +32 -24
- package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +32 -24
- package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +21 -18
- package/.next/standalone/.next/server/app/social/page.js +1 -1
- package/.next/standalone/.next/server/app/social/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/social.html +1 -1
- package/.next/standalone/.next/server/app/social.rsc +32 -24
- package/.next/standalone/.next/server/app/social.segments/_full.segment.rsc +32 -24
- package/.next/standalone/.next/server/app/social.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/social.segments/social/__PAGE__.segment.rsc +23 -18
- package/.next/standalone/.next/server/app-paths-manifest.json +4 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__00la_y0._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__05_3-22._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__066rab1._.js +7 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__07t47cm._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cj5jqc._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e0fei3._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fooke1._.js +7 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ljnyho._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o5-tcg._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qrnous._.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__15wc9e-._.js → [root-of-the-server]__0r-0t-9._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ra6xyg._.js +15 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__20rwfdw._.js → [root-of-the-server]__0rcpjad._.js} +6 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t3v1a1._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t6y79e._.js +7 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wmexuc._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0x29muh._.js +7 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xu34sz._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__133knx1._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__15-17hl._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__19b7mig._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1a_6x37._.js +8 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1an_8pa._.js +7 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1bbcwub._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1ducpz2._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1eris29._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1gjo_cq._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qcm08_._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1tir0vc._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1w25q0m._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1xhyinn._.js +3 -0
- package/.next/standalone/.next/server/chunks/_072jl0y._.js +1 -1
- package/.next/standalone/.next/server/chunks/_0lw8_i0._.js +1 -1
- package/.next/standalone/.next/server/chunks/_0sqqpzb._.js +3 -0
- package/.next/standalone/.next/server/chunks/_1_fynia._.js +7 -7
- package/.next/standalone/.next/server/chunks/_1fn30_l._.js +1 -1
- package/.next/standalone/.next/server/chunks/_1itd1o_._.js +1 -1
- package/.next/standalone/.next/server/chunks/_1iwkh8t._.js +1 -1
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_backup_route_actions_0zoj04p.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_csv_route_actions_0l6m7lg.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_restore_route_actions_0-b05bv.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_02iz_9q._.js +4 -0
- package/.next/standalone/.next/server/chunks/lib_05agvk3._.js +4 -0
- package/.next/standalone/.next/server/chunks/lib_0v84u66._.js +4 -0
- package/.next/standalone/.next/server/chunks/lib_db-client_0_dch35.js +174 -0
- package/.next/standalone/.next/server/chunks/lib_linkedin-export_12imqxg.js +1 -1
- package/.next/standalone/.next/server/chunks/lib_rpc_00nndai.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_03ibb-x.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_03ri3ji.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_078ce48.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0a69mgr.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0c9d9ti.js +7 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0cej3t8.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0cmh4g6.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0nx2_pc.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0r79-w1.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0t552z6.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0yx8ynd.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_12p-o9-.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_1466dnb.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_1sryxv6.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_1trn-x5.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_1ygu_mv.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0egamyq._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qd8pzm._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0qdeuyo._.js → [root-of-the-server]__1-012q1._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_04am_h8._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_06rgzfh._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_07zb7lu._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0_79idq._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0gds903._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0hb-dhy._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0klqt9z._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_14jak5s._.js +7 -0
- package/.next/standalone/.next/server/chunks/ssr/_14nxd3q._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_1cj2yog._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_1fm1ih_._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_1hdqw0-._.js +7 -0
- package/.next/standalone/.next/server/chunks/ssr/_1k2nmbw._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_1r62six._.js +7 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_insights_page_actions_0-0tf75.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/app_141w189._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_components_0uuff77._.js +25 -2
- package/.next/standalone/.next/server/chunks/ssr/app_components_1j3q-h5._.js +25 -2
- package/.next/standalone/.next/server/chunks/ssr/app_components_CompanyScores_1g0mytz.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_components_settings_SectorPicker_1c-29qw.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_components_ui_0pdmz2z.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/app_import_page_1fmu6_l.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_insights_page_1d_chja.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/app_launch_page_19t0dyd.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_page_1fazqbf.js +26 -14
- package/.next/standalone/.next/server/chunks/ssr/app_paths_page_1ol90m7.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_profile_page_0u3-l5y.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_queue_page_0c6znd6.js +11 -11
- package/.next/standalone/.next/server/chunks/ssr/app_settings_page_1f8mjj_.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_setup_page_1-282zx.js +12 -13
- package/.next/standalone/.next/server/chunks/ssr/app_social_page_0h7zxda.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_1c4ieuw._.js → lib_csv_1ttiu_h.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/lib_galaxy-lab_108_lu-.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/lib_separation_1305zsx.js +3 -0
- package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__0pco7a6._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/middleware-manifest.json +5 -5
- package/.next/standalone/.next/server/next-font-manifest.js +1 -1
- package/.next/standalone/.next/server/next-font-manifest.json +4 -0
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/prefetch-hints.json +14 -0
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/02wnf8dkxegxg.js +34 -0
- package/.next/standalone/.next/static/chunks/03-_esd2x_yk6.js +1 -0
- package/.next/standalone/.next/static/chunks/03-demj2iy-0p.js +44 -0
- package/.next/standalone/.next/static/chunks/0838_s6w-i_ik.js +1 -0
- package/.next/standalone/.next/static/chunks/0_1r-3csplxnj.js +1 -0
- package/.next/standalone/.next/static/chunks/0ka4prpk3w9wn.js +34 -0
- package/.next/standalone/.next/static/chunks/0kscsqnvfq3-r.js +1 -0
- package/.next/standalone/.next/static/chunks/0s_xxwp7z88vv.js +1 -0
- package/.next/standalone/.next/static/chunks/1-nnl8amfm4yh.js +57 -0
- package/.next/standalone/.next/static/chunks/112mv-com-mqa.js +21 -0
- package/.next/standalone/.next/static/chunks/1bkt_hhjzvbh8.js +1 -0
- package/.next/standalone/.next/static/chunks/1cmphb3kh2ers.css +3 -0
- package/.next/standalone/.next/static/chunks/1d8yv3k_atka7.js +1 -0
- package/.next/standalone/.next/static/chunks/{0ws7zy0w57ufi.js → 1eyajb9ntzlrl.js} +1 -1
- package/.next/standalone/.next/static/chunks/1z9lb-dbcg4aa.js +1 -0
- package/.next/standalone/.next/static/chunks/23hc51oa4vkhc.js +5 -0
- package/.next/standalone/.next/static/chunks/27n8k9wxlz5-7.js +1 -0
- package/.next/standalone/.next/static/chunks/2q9i7pcxcnph1.js +7 -0
- package/.next/standalone/.next/static/chunks/2w-y83mjlpnse.js +1 -0
- package/.next/standalone/.next/static/chunks/2ws1xf293j-tm.js +5 -0
- package/.next/standalone/.next/static/chunks/2z1-q0_vunbql.js +2 -0
- package/.next/standalone/.next/static/chunks/34g73qhayuevu.js +1 -0
- package/.next/standalone/.next/static/chunks/3cqn-r-y5rrw1.js +5 -0
- package/.next/standalone/.next/static/chunks/3opgg1efrx8q6.js +1 -0
- package/.next/standalone/.next/static/chunks/3p51fpxxi4d5y.js +34 -0
- package/.next/standalone/.next/static/chunks/3y40z6of3r9py.js +1 -0
- package/.next/standalone/.next/static/chunks/403dpflln8ah5.js +1 -0
- package/.next/standalone/.next/static/chunks/43pg2sursiypz.js +1 -0
- package/.next/standalone/CHANGELOG.md +203 -0
- package/.next/standalone/README.md +96 -50
- package/.next/standalone/SECURITY.md +25 -11
- package/.next/standalone/app/api/data/backup/route.js +25 -0
- package/.next/standalone/app/api/data/csv/route.js +74 -0
- package/.next/standalone/app/api/data/export/route.js +1 -1
- package/.next/standalone/app/api/data/restore/route.js +48 -0
- package/.next/standalone/app/api/data/reveal/route.js +19 -6
- package/.next/standalone/app/api/data/route.js +15 -4
- package/.next/standalone/app/api/ingest/route.js +1 -1
- package/.next/standalone/app/api/outreach/route.js +13 -73
- package/.next/standalone/app/api/queue/route.js +1 -1
- package/.next/standalone/app/api/scraper/route.js +217 -36
- package/.next/standalone/app/api/social/crm/route.js +2 -1
- package/.next/standalone/app/components/AppHeader.js +41 -21
- package/.next/standalone/app/components/AppTabs.js +12 -8
- package/.next/standalone/app/components/AutoConnect.js +286 -0
- package/.next/standalone/app/components/AutoScanButton.js +2 -2
- package/.next/standalone/app/components/Avatar.js +1 -1
- package/.next/standalone/app/components/ChainView.js +258 -113
- package/.next/standalone/app/components/CirclePanel.js +16 -16
- package/.next/standalone/app/components/ClusterSpinner.js +64 -0
- package/.next/standalone/app/components/CompanyScores.js +20 -20
- package/.next/standalone/app/components/EmptyState.js +39 -18
- package/.next/standalone/app/components/FieldStep.js +15 -13
- package/.next/standalone/app/components/FilterPanel.js +25 -18
- package/.next/standalone/app/components/ForceGraph.js +49 -14
- package/.next/standalone/app/components/GalaxyLab.js +33 -33
- package/.next/standalone/app/components/GridView.js +18 -18
- package/.next/standalone/app/components/LegacyScoresCard.js +10 -11
- package/.next/standalone/app/components/LinkedInLimits.js +57 -27
- package/.next/standalone/app/components/LiquidGlass.js +99 -0
- package/.next/standalone/app/components/ListView.js +20 -20
- package/.next/standalone/app/components/MapControls.js +5 -5
- package/.next/standalone/app/components/MappingProgress.js +16 -16
- package/.next/standalone/app/components/NoteDetail.js +13 -13
- package/.next/standalone/app/components/OnboardingGate.js +4 -4
- package/.next/standalone/app/components/OutlinkQuest.js +56 -35
- package/.next/standalone/app/components/PathsAnalyzer.js +37 -36
- package/.next/standalone/app/components/PeopleMap.js +21 -21
- package/.next/standalone/app/components/RingsView.js +11 -11
- package/.next/standalone/app/components/ScanRadar.js +84 -39
- package/.next/standalone/app/components/ScanStatusBar.js +40 -21
- package/.next/standalone/app/components/ScanTrail.js +21 -8
- package/.next/standalone/app/components/SeparationView.js +172 -124
- package/.next/standalone/app/components/Sidebar.js +308 -199
- package/.next/standalone/app/components/StaleServerBanner.js +4 -4
- package/.next/standalone/app/components/TheirCircle.js +26 -26
- package/.next/standalone/app/components/ThemeDefs.js +42 -0
- package/.next/standalone/app/components/ThemeLoader.js +20 -1
- package/.next/standalone/app/components/UpdatePanel.js +22 -22
- package/.next/standalone/app/components/UserProvider.js +22 -15
- package/.next/standalone/app/components/insights/Boards.js +275 -0
- package/.next/standalone/app/components/insights/PeopleView.js +266 -0
- package/.next/standalone/app/components/insights/Rail.js +156 -0
- package/.next/standalone/app/components/insights/Report.js +382 -0
- package/.next/standalone/app/components/insights/parts.js +239 -0
- package/.next/standalone/app/components/settings/AppearanceSection.js +47 -24
- package/.next/standalone/app/components/settings/DataSection.js +276 -109
- package/.next/standalone/app/components/settings/NetworkHealthSection.js +13 -13
- package/.next/standalone/app/components/settings/SectorPicker.js +12 -12
- package/.next/standalone/app/components/settings/SectorSection.js +13 -14
- package/.next/standalone/app/components/settings/TierSection.js +9 -9
- package/.next/standalone/app/components/settings/TitleSection.js +11 -11
- package/.next/standalone/app/components/settings/UsageSection.js +360 -0
- package/.next/standalone/app/components/ui.js +8 -8
- package/.next/standalone/app/globals.css +161 -5
- package/.next/standalone/app/import/page.js +94 -38
- package/.next/standalone/app/insights/page.js +220 -0
- package/.next/standalone/app/launch/page.js +5 -5
- package/.next/standalone/app/layout.js +6 -2
- package/.next/standalone/app/page.js +53 -53
- package/.next/standalone/app/paths/page.js +63 -63
- package/.next/standalone/app/profile/page.js +58 -58
- package/.next/standalone/app/queue/page.js +84 -72
- package/.next/standalone/app/scores/page.js +2 -2
- package/.next/standalone/app/settings/page.js +16 -13
- package/.next/standalone/app/setup/page.js +236 -133
- package/.next/standalone/app/social/Crm.js +63 -62
- package/.next/standalone/app/social/SocialHub.js +22 -22
- package/.next/standalone/app/social/Thread.js +7 -7
- package/.next/standalone/app/social/page.js +2 -2
- package/.next/standalone/lib/auto-connect.js +145 -0
- package/.next/standalone/lib/backups.js +458 -0
- package/.next/standalone/lib/chain-layout.js +32 -0
- package/.next/standalone/lib/companies.js +1 -1
- package/.next/standalone/lib/csv-store.js +131 -0
- package/.next/standalone/lib/csv.js +137 -39
- package/.next/standalone/lib/data-folder.js +19 -3
- package/.next/standalone/lib/data-import.js +5 -2
- package/.next/standalone/lib/db-client.js +78 -20
- package/.next/standalone/lib/demo.js +5 -4
- package/.next/standalone/lib/galaxy-export.js +9 -2
- package/.next/standalone/lib/galaxy-lab.js +19 -5
- package/.next/standalone/lib/galaxy-layouts.js +43 -0
- package/.next/standalone/lib/gate.js +10 -4
- package/.next/standalone/lib/in-progress.js +46 -0
- package/.next/standalone/lib/ingest.js +1 -1
- package/.next/standalone/lib/insights-board.js +613 -0
- package/.next/standalone/lib/linkedin-limits.js +240 -14
- package/.next/standalone/lib/liquid-glass.js +59 -0
- package/.next/standalone/lib/notifications.js +13 -0
- package/.next/standalone/lib/requests-client.js +10 -0
- package/.next/standalone/lib/requests.js +124 -0
- package/.next/standalone/lib/scan-pace.js +11 -0
- package/.next/standalone/lib/scan-progress.js +20 -0
- package/.next/standalone/lib/scan-risk.js +44 -0
- package/.next/standalone/lib/scan-state.js +1 -0
- package/.next/standalone/lib/scanner-setup.js +97 -15
- package/.next/standalone/lib/scraper-client.js +35 -8
- package/.next/standalone/lib/search-risk.js +7 -3
- package/.next/standalone/lib/settings-client.js +5 -3
- package/.next/standalone/lib/settings.js +13 -0
- package/.next/standalone/lib/social-store.js +3 -2
- package/.next/standalone/lib/synced-setting.js +46 -0
- package/.next/standalone/lib/theme-store.js +42 -10
- package/.next/standalone/lib/themes.js +111 -21
- package/.next/standalone/lib/usage.js +200 -0
- package/.next/standalone/package-lock.json +2 -2
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/scripts/scrape.py +595 -11
- package/.next/static/chunks/02wnf8dkxegxg.js +34 -0
- package/.next/static/chunks/03-_esd2x_yk6.js +1 -0
- package/.next/static/chunks/03-demj2iy-0p.js +44 -0
- package/.next/static/chunks/0838_s6w-i_ik.js +1 -0
- package/.next/static/chunks/0_1r-3csplxnj.js +1 -0
- package/.next/static/chunks/0ka4prpk3w9wn.js +34 -0
- package/.next/static/chunks/0kscsqnvfq3-r.js +1 -0
- package/.next/static/chunks/0s_xxwp7z88vv.js +1 -0
- package/.next/static/chunks/1-nnl8amfm4yh.js +57 -0
- package/.next/static/chunks/112mv-com-mqa.js +21 -0
- package/.next/static/chunks/1bkt_hhjzvbh8.js +1 -0
- package/.next/static/chunks/1cmphb3kh2ers.css +3 -0
- package/.next/static/chunks/1d8yv3k_atka7.js +1 -0
- package/.next/static/chunks/{0ws7zy0w57ufi.js → 1eyajb9ntzlrl.js} +1 -1
- package/.next/static/chunks/1z9lb-dbcg4aa.js +1 -0
- package/.next/static/chunks/23hc51oa4vkhc.js +5 -0
- package/.next/static/chunks/27n8k9wxlz5-7.js +1 -0
- package/.next/static/chunks/2q9i7pcxcnph1.js +7 -0
- package/.next/static/chunks/2w-y83mjlpnse.js +1 -0
- package/.next/static/chunks/2ws1xf293j-tm.js +5 -0
- package/.next/static/chunks/2z1-q0_vunbql.js +2 -0
- package/.next/static/chunks/34g73qhayuevu.js +1 -0
- package/.next/static/chunks/3cqn-r-y5rrw1.js +5 -0
- package/.next/static/chunks/3opgg1efrx8q6.js +1 -0
- package/.next/static/chunks/3p51fpxxi4d5y.js +34 -0
- package/.next/static/chunks/3y40z6of3r9py.js +1 -0
- package/.next/static/chunks/403dpflln8ah5.js +1 -0
- package/.next/static/chunks/43pg2sursiypz.js +1 -0
- package/CHANGELOG.md +203 -0
- package/README.md +96 -50
- package/SECURITY.md +25 -11
- package/lib/auto-connect.js +145 -0
- package/lib/backups.js +458 -0
- package/lib/chain-layout.js +32 -0
- package/lib/companies.js +1 -1
- package/lib/csv-store.js +131 -0
- package/lib/csv.js +137 -39
- package/lib/data-folder.js +19 -3
- package/lib/data-import.js +5 -2
- package/lib/db-client.js +78 -20
- package/lib/demo.js +5 -4
- package/lib/galaxy-export.js +9 -2
- package/lib/galaxy-lab.js +19 -5
- package/lib/galaxy-layouts.js +43 -0
- package/lib/gate.js +10 -4
- package/lib/in-progress.js +46 -0
- package/lib/ingest.js +1 -1
- package/lib/insights-board.js +613 -0
- package/lib/linkedin-limits.js +240 -14
- package/lib/liquid-glass.js +59 -0
- package/lib/notifications.js +13 -0
- package/lib/requests-client.js +10 -0
- package/lib/requests.js +124 -0
- package/lib/scan-pace.js +11 -0
- package/lib/scan-progress.js +20 -0
- package/lib/scan-risk.js +44 -0
- package/lib/scan-state.js +1 -0
- package/lib/scanner-setup.js +97 -15
- package/lib/scraper-client.js +35 -8
- package/lib/search-risk.js +7 -3
- package/lib/settings-client.js +5 -3
- package/lib/settings.js +13 -0
- package/lib/social-store.js +3 -2
- package/lib/synced-setting.js +46 -0
- package/lib/theme-store.js +42 -10
- package/lib/themes.js +111 -21
- package/lib/usage.js +200 -0
- package/package.json +1 -1
- package/scripts/scrape.py +595 -11
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-rnla2._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__13dx4sd._.js +0 -8
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__14ou7j5._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__16iu0hv._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1kbl21f._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1rphsdk._.js +0 -3
- package/.next/standalone/.next/server/chunks/_02twlca._.js +0 -10
- package/.next/standalone/.next/server/chunks/lib_0851sk0._.js +0 -8
- package/.next/standalone/.next/server/chunks/lib_1q7p2ro._.js +0 -8
- package/.next/standalone/.next/server/chunks/lib_1r6l86l._.js +0 -8
- package/.next/standalone/.next/server/chunks/lib_db-client_15le7cw.js +0 -174
- package/.next/standalone/.next/server/chunks/lib_rpc_04s8mzr.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_053z7as.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_0b_-2te.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_0dhbxdm.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_0dxlk31.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_0f8b-qc.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_0pzie7_.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_0r76fq_.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_0ut7pjp.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_15zyqaz.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_18zpjtq.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_1a8xkiz.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_1e_55xo.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_1oxfd1_.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_1s0lod0.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08oxiqh._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_03l7vge._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_08g31gm._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0gk_ofx._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0nwsf93._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0vho1lb._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_1-658fq._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_1bc46kz._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_1f_n00p._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_2105jz8._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/app_components_0t908t-._.js +0 -3
- package/.next/standalone/.next/static/chunks/02pq76u7y4v9-.js +0 -22
- package/.next/standalone/.next/static/chunks/0cmq0exd4d0h9.js +0 -1
- package/.next/standalone/.next/static/chunks/0i02yxppzds1o.js +0 -1
- package/.next/standalone/.next/static/chunks/0m_p4k-q2qh--.js +0 -1
- package/.next/standalone/.next/static/chunks/0oyslj62jkubd.js +0 -1
- package/.next/standalone/.next/static/chunks/0vo-l8hxneba6.css +0 -3
- package/.next/standalone/.next/static/chunks/0yh8z2tbrc5i_.js +0 -1
- package/.next/standalone/.next/static/chunks/17-rhp8sg4m1b.js +0 -44
- package/.next/standalone/.next/static/chunks/172e10mi-tpo_.js +0 -34
- package/.next/standalone/.next/static/chunks/1ei5vbe2uw6fl.js +0 -1
- package/.next/standalone/.next/static/chunks/1f7_pl_wq7lh3.js +0 -11
- package/.next/standalone/.next/static/chunks/1jzbe7zdx9vbj.js +0 -2
- package/.next/standalone/.next/static/chunks/1m3017gp790pw.js +0 -45
- package/.next/standalone/.next/static/chunks/1t20e8u0st7ep.js +0 -1
- package/.next/standalone/.next/static/chunks/2-ch9rm27eril.js +0 -11
- package/.next/standalone/.next/static/chunks/2ldv-v3s9yaif.js +0 -1
- package/.next/standalone/.next/static/chunks/3bp284gjf7dyq.js +0 -1
- package/.next/standalone/.next/static/chunks/3k1f6clbn3gj3.js +0 -7
- package/.next/standalone/.next/static/chunks/3l4t8je6iguzc.js +0 -1
- package/.next/standalone/.next/static/chunks/3tplzuc9jk-tl.js +0 -1
- package/.next/standalone/.next/static/chunks/42m0bqr8pbovz.js +0 -11
- package/.next/static/chunks/02pq76u7y4v9-.js +0 -22
- package/.next/static/chunks/0cmq0exd4d0h9.js +0 -1
- package/.next/static/chunks/0i02yxppzds1o.js +0 -1
- package/.next/static/chunks/0m_p4k-q2qh--.js +0 -1
- package/.next/static/chunks/0oyslj62jkubd.js +0 -1
- package/.next/static/chunks/0vo-l8hxneba6.css +0 -3
- package/.next/static/chunks/0yh8z2tbrc5i_.js +0 -1
- package/.next/static/chunks/17-rhp8sg4m1b.js +0 -44
- package/.next/static/chunks/172e10mi-tpo_.js +0 -34
- package/.next/static/chunks/1ei5vbe2uw6fl.js +0 -1
- package/.next/static/chunks/1f7_pl_wq7lh3.js +0 -11
- package/.next/static/chunks/1jzbe7zdx9vbj.js +0 -2
- package/.next/static/chunks/1m3017gp790pw.js +0 -45
- package/.next/static/chunks/1t20e8u0st7ep.js +0 -1
- package/.next/static/chunks/2-ch9rm27eril.js +0 -11
- package/.next/static/chunks/2ldv-v3s9yaif.js +0 -1
- package/.next/static/chunks/3bp284gjf7dyq.js +0 -1
- package/.next/static/chunks/3k1f6clbn3gj3.js +0 -7
- package/.next/static/chunks/3l4t8je6iguzc.js +0 -1
- package/.next/static/chunks/3tplzuc9jk-tl.js +0 -1
- package/.next/static/chunks/42m0bqr8pbovz.js +0 -11
- /package/.next/standalone/.next/static/{dQUvvVSXqbkEFC3-CNcwT → 3NCyJyAPDCEYsYTwF1Ieu}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{dQUvvVSXqbkEFC3-CNcwT → 3NCyJyAPDCEYsYTwF1Ieu}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{dQUvvVSXqbkEFC3-CNcwT → 3NCyJyAPDCEYsYTwF1Ieu}/_ssgManifest.js +0 -0
- /package/.next/static/{dQUvvVSXqbkEFC3-CNcwT → 3NCyJyAPDCEYsYTwF1Ieu}/_buildManifest.js +0 -0
- /package/.next/static/{dQUvvVSXqbkEFC3-CNcwT → 3NCyJyAPDCEYsYTwF1Ieu}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{dQUvvVSXqbkEFC3-CNcwT → 3NCyJyAPDCEYsYTwF1Ieu}/_ssgManifest.js +0 -0
|
@@ -68,7 +68,7 @@ The links above always fetch the newest release.</sub>
|
|
|
68
68
|
|
|
69
69
|
**Which download?** Apple menu → **About This Mac**. If it says "Chip: Apple M…", take
|
|
70
70
|
**Apple Silicon**. If it says "Processor: …Intel…", take **Intel**. It needs **macOS 13.5
|
|
71
|
-
(Ventura) or later**, and it's about
|
|
71
|
+
(Ventura) or later**, and it's about 210 MB. Everything the scanner needs except Google
|
|
72
72
|
Chrome is inside, Python included, so there's nothing else to install.
|
|
73
73
|
|
|
74
74
|
**The first time you open it**, macOS stops it, because the app isn't signed with a
|
|
@@ -112,8 +112,9 @@ Downloading the new `.dmg` works too; you'll repeat step 3 once for it.
|
|
|
112
112
|
|
|
113
113
|
Your network isn't stored in the app. It's in a hidden folder in your home folder,
|
|
114
114
|
`.six-degrees` (open it any time with *Help → Show the Data Folder*), so updates never
|
|
115
|
-
touch it. Each new version also
|
|
116
|
-
first opens it
|
|
115
|
+
touch it. Each new version also backs up your data, photos and all, into its `backups`
|
|
116
|
+
folder before it first opens it, and Six Degrees makes a backup each day it's open
|
|
117
|
+
(see [Backups](#backups)). To take it to another computer, see
|
|
117
118
|
[Moving to a new computer](#moving-to-a-new-computer).
|
|
118
119
|
|
|
119
120
|
**Windows (beta):** download [Six-Degrees-Windows-Setup.exe](https://github.com/blakeb056/six-degrees/releases/download/v0.5.1-beta.1/Six-Degrees-Windows-Setup.exe)
|
|
@@ -192,6 +193,16 @@ in, and its most powerful people.
|
|
|
192
193
|
|
|
193
194
|
<img src="docs/img/paths.png" alt="Paths → Map with the company analyzer open: companies grouped by industry, and one company's people by level and ways in" width="100%">
|
|
194
195
|
|
|
196
|
+
**Insights.** Everyone within two steps of you in one table, ranked by power, each person
|
|
197
|
+
once: the **Power Index**, with filters for degree, tier and rarity, and Open circle, Scan
|
|
198
|
+
circle or Ask on every row. Beside it, and each a board of its own in the notch:
|
|
199
|
+
**Kingmakers** (your connections with the most S and A people behind them), **Gatekeepers**
|
|
200
|
+
(who your S and A reach hangs on), **Hidden giants** (S-tier with one way in), **Untapped**
|
|
201
|
+
(S and A with no request out), **Company power** and **Industries**. **Report** is the same
|
|
202
|
+
numbers as a page you scroll. Every number says where it came from, and nothing is about
|
|
203
|
+
money: *Richest?* says plainly that the app never sees it. Power ranks reachability, not
|
|
204
|
+
people.
|
|
205
|
+
|
|
195
206
|
**Scores.** How a power score is worked out, and the three things you can change about
|
|
196
207
|
it, in one place: your field (the sectors you work in), how tiers are graded (on your
|
|
197
208
|
network's curve or the fixed scale), and every scanned company's score.
|
|
@@ -201,6 +212,15 @@ circle offers its best five people at a time; mark invites as sent to fill the r
|
|
|
201
212
|
unlock the next five. It also shows the next best moves, levels and points (from
|
|
202
213
|
invites sent and people who accepted, never from browsing).
|
|
203
214
|
|
|
215
|
+
**Auto** *(needs a scan)*. Next to every Connect (a person's card, Outlink), Auto sends
|
|
216
|
+
that one person a connection request for you, from the scanner's Chrome, without a note.
|
|
217
|
+
One press, one person: never a batch, never on a timer. It asks once before the first one.
|
|
218
|
+
If LinkedIn wants their email address first, Auto closes that and sends nothing (use
|
|
219
|
+
Connect to add them yourself); if it offers a personal note (Premium), Auto sends without
|
|
220
|
+
one. It calls a request sent only once their profile shows it pending. It stops at 15 in
|
|
221
|
+
any 24 hours and 80 in any 7 days, opens their profile once (a profile view), and counts in
|
|
222
|
+
Settings → LinkedIn usage.
|
|
223
|
+
|
|
204
224
|
**Scan.** The guided scanner. It shows progress, the budget that's left, the cooldown
|
|
205
225
|
lock, and a **Paused** list you can carry on from.
|
|
206
226
|
|
|
@@ -283,6 +303,14 @@ Something out of date, or unfair to another tool? [Open an issue](https://github
|
|
|
283
303
|
>
|
|
284
304
|
> **The CSV import and the sample network carry no LinkedIn risk at all.** Details:
|
|
285
305
|
> [how scanning works and what it risks](docs/SCRAPING.md).
|
|
306
|
+
>
|
|
307
|
+
> The app asks for an explicit "I understand" once, before the first scan.
|
|
308
|
+
>
|
|
309
|
+
> **The scanner reads; the one thing it ever sends is a connection request, and only when
|
|
310
|
+
> you press Auto** on a person (one each press, without a note, at most 15 a day and 80 a
|
|
311
|
+
> week). Auto asks once before its first request.
|
|
312
|
+
>
|
|
313
|
+
> Six Degrees is not affiliated with or endorsed by LinkedIn.
|
|
286
314
|
|
|
287
315
|
## First run
|
|
288
316
|
|
|
@@ -298,7 +326,7 @@ The app opens on a welcome screen with three ways in, and asks nothing about you
|
|
|
298
326
|
- **Import my LinkedIn CSV**: LinkedIn's official export, read on your machine. On
|
|
299
327
|
LinkedIn: **Settings & Privacy → Data privacy → Get a copy of your data →
|
|
300
328
|
Connections**. LinkedIn emails a link in about ten minutes; unzip it and drop
|
|
301
|
-
`Connections.csv` into the app.
|
|
329
|
+
`Connections.csv` into the app. It's kept on your computer until you remove it.
|
|
302
330
|
- **Explore a sample network**: 150 invented connections and the 598 invented people
|
|
303
331
|
they know. Click through before deciding anything.
|
|
304
332
|
|
|
@@ -317,8 +345,12 @@ people you *haven't* met, have nothing to draw. That data exists in no official
|
|
|
317
345
|
the scanner is the only way to it, and it's opt-in for that reason.
|
|
318
346
|
|
|
319
347
|
While the sample or a CSV is loaded, the top bar shows *Sample network ×* or *Your CSV
|
|
320
|
-
|
|
321
|
-
|
|
348
|
+
×*, and Outlink and Scan are hidden. Neither is ever added to your network. The sample
|
|
349
|
+
lasts as long as the app's window is open. A CSV import is kept on your computer, in the
|
|
350
|
+
data folder (`csv-network.json`), so it's still there after you close the window or
|
|
351
|
+
restart; click × to remove it (your `Connections.csv` itself isn't touched). Once you've
|
|
352
|
+
scanned your own connections, the map shows your scan instead; the CSV stays kept until
|
|
353
|
+
you remove it from the import page.
|
|
322
354
|
|
|
323
355
|
## How scoring works
|
|
324
356
|
|
|
@@ -382,10 +414,12 @@ It estimates **network position**, not what anyone is worth as a person.
|
|
|
382
414
|
|
|
383
415
|
- Your network is stored on your computer and nowhere else. No account, no server, no
|
|
384
416
|
telemetry, no analytics, no crash reporting.
|
|
385
|
-
- A CSV import is read on your machine and never added to your network. It's
|
|
386
|
-
|
|
417
|
+
- A CSV import is read on your machine and never added to your network. It's kept in the
|
|
418
|
+
data folder as `csv-network.json` (names, positions, companies, profile links and when
|
|
419
|
+
you connected; never email addresses) until you click × beside *Your CSV*.
|
|
387
420
|
- The app contacts only these, and only when you act:
|
|
388
|
-
- **LinkedIn**, while you scan
|
|
421
|
+
- **LinkedIn**, while you scan, and when you press **Auto** (one connection request,
|
|
422
|
+
sent from the scanner's Chrome). Each profile photo is saved on your computer as the
|
|
389
423
|
scan reads it, and the app shows photos only from there, so looking at your network
|
|
390
424
|
never contacts LinkedIn. (Photos an older version kept as links to LinkedIn show
|
|
391
425
|
initials until the next scan, or *Save photos* on the Scan page, saves them.)
|
|
@@ -413,30 +447,58 @@ See [SECURITY.md](SECURITY.md) for the threat model.
|
|
|
413
447
|
```
|
|
414
448
|
.six-degrees/ in your home folder (hidden)
|
|
415
449
|
├── six-degrees.sqlite your network: connections, scores, tiers, queue, settings
|
|
416
|
-
├── backups/
|
|
417
|
-
│
|
|
450
|
+
├── backups/ backups of your network: daily, before each new version, before
|
|
451
|
+
│ an import or a restore, and any you make (see Backups below)
|
|
418
452
|
├── avatars/ profile photos, if you scan
|
|
419
453
|
├── chrome-profile/ the scanner's Chrome sign-in, if you scan (see below)
|
|
420
454
|
├── venv/ the scanner's Python add-ons, if you set it up without the Mac app
|
|
421
455
|
├── python/ a private Python for them, if Set up the scanner downloaded one
|
|
422
456
|
├── pushback/ what LinkedIn's page said if it ever pushed back
|
|
457
|
+
├── csv-network.json a LinkedIn CSV import, kept until you remove it
|
|
423
458
|
└── *.json the scanner's budget, cooldown, progress and skip lists
|
|
424
459
|
```
|
|
425
460
|
|
|
426
461
|
**Settings → Your data** shows where this folder is (with *Copy the path* and *Show in
|
|
427
462
|
Finder*), what each part takes up, and the backups in it.
|
|
428
463
|
|
|
464
|
+
### Backups
|
|
465
|
+
|
|
466
|
+
A backup is your whole network in one `.sixdegrees` file: your connections, their profile
|
|
467
|
+
photos, your settings (the look and your saved Galaxy layouts too), and the scanner's
|
|
468
|
+
progress, skip lists and LinkedIn budget. Each one is checked as it's made, the same way a
|
|
469
|
+
restore would check it, so a backup that's listed would restore. The Social tab's messages
|
|
470
|
+
and notes are never in a backup, so deleting them there (*Forget it*) deletes them
|
|
471
|
+
everywhere, and a restore leaves them as they are. Six Degrees makes one:
|
|
472
|
+
|
|
473
|
+
- **each day** it's open with a network in it (when it starts, and after a scan, if the
|
|
474
|
+
newest daily one is a day old; nothing runs on a timer), keeping the last 7;
|
|
475
|
+
- **before a new version** first opens your data, keeping the last 3;
|
|
476
|
+
- **when you click Back up now** in Settings → Your data. These are never deleted for you.
|
|
477
|
+
|
|
478
|
+
An import or a restore keeps what it replaced as well (`before-import-…`), keeping the
|
|
479
|
+
last 3, and never one that's under 30 days old. Anything else you put in `backups/`
|
|
480
|
+
yourself is never touched.
|
|
481
|
+
|
|
482
|
+
Settings → Your data says when the last backup was made and whether it passed its check
|
|
483
|
+
("Last backup: <time>, verified"), or what's wrong with it if it didn't. Each backup has
|
|
484
|
+
**Restore** and **Show in Finder**. Backups stay on this computer: to keep one safe if the
|
|
485
|
+
computer is lost, copy it somewhere else (Show in Finder, then drag it to a USB stick).
|
|
486
|
+
|
|
487
|
+
They take space. For a network of about 650 connections and 5,000 people beyond them,
|
|
488
|
+
with their photos, each backup is about 25 to 35 MB, so the kept ones add up to about
|
|
489
|
+
300 to 400 MB.
|
|
490
|
+
|
|
429
491
|
### Moving to a new computer
|
|
430
492
|
|
|
431
|
-
1. On the old computer, open **Settings → Your data** and click **
|
|
432
|
-
|
|
493
|
+
1. On the old computer, open **Settings → Your data** and click **Export backup
|
|
494
|
+
file…**. You get one file, `Six Degrees backup <date>.sixdegrees`, with your network,
|
|
433
495
|
your settings, the scanner's progress, skip lists and LinkedIn budget, and the profile
|
|
434
496
|
photos of the people in it (untick them to leave them out; they come back as you scan
|
|
435
497
|
again).
|
|
436
498
|
2. Move that file to the new computer yourself (a USB stick, AirDrop). It holds other
|
|
437
499
|
people's names and photos, so don't post it or share it.
|
|
438
|
-
3. On the new computer, install Six Degrees, open **Settings → Your data**,
|
|
439
|
-
file and click **
|
|
500
|
+
3. On the new computer, install Six Degrees, open **Settings → Your data**, click
|
|
501
|
+
**Restore from a file…**, choose the file and click **Restore**. It's checked first, and nothing changes if it isn't a whole
|
|
440
502
|
and undamaged Six Degrees copy. If that computer already has a network, you're asked to
|
|
441
503
|
confirm that the import replaces it. The two networks are never merged. Your LinkedIn
|
|
442
504
|
search budget is the one thing that is: it belongs to your LinkedIn account, not to a
|
|
@@ -446,42 +508,27 @@ Finder*), what each part takes up, and the backups in it.
|
|
|
446
508
|
**Restart now**; with `npx six-degrees`, press Ctrl-C and start it again. If another
|
|
447
509
|
copy of Six Degrees has the same folder open (one started from the Terminal, say), the
|
|
448
510
|
import waits, and Settings says so. What was there before is kept in `backups/`
|
|
449
|
-
(`before-import-…`),
|
|
450
|
-
[Undo an import](#undo-an-import).
|
|
511
|
+
(`before-import-…`), for at least 30 days: see [Undo an import](#undo-an-import).
|
|
451
512
|
5. Sign in to LinkedIn again on the new computer before you scan. Your sign-in never goes
|
|
452
|
-
into a copy. A
|
|
453
|
-
|
|
513
|
+
into a copy. A LinkedIn CSV import kept on the old computer does go into it, and opens
|
|
514
|
+
on the new one.
|
|
454
515
|
|
|
455
516
|
### Undo an import
|
|
456
517
|
|
|
457
|
-
An import keeps what it replaced in the data folder's `backups/`, named with
|
|
458
|
-
finished
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
network again: `six-degrees.sqlite`, and `six-degrees.sqlite-wal` and
|
|
472
|
-
`six-degrees.sqlite-shm` if they're there (a `-wal` left beside a different database
|
|
473
|
-
is replayed into it and damages it), then `avatars/` and the three `bridge-*.json`
|
|
474
|
-
files.
|
|
475
|
-
3. Copy `backups/before-import-<time>.sqlite` into the data folder and rename the copy
|
|
476
|
-
`six-degrees.sqlite`. If `before-import-<time>.sqlite-wal` and `-shm` files are beside
|
|
477
|
-
it, copy them too, renamed to match (`six-degrees.sqlite-wal`,
|
|
478
|
-
`six-degrees.sqlite-shm`).
|
|
479
|
-
4. Copy `avatars/` and the three `bridge-*.json` files from
|
|
480
|
-
`backups/before-import-<time>-files/` back into the data folder.
|
|
481
|
-
5. Leave `linkedin-activity.json`, `linkedin-cooldown.json` and `scan-limits.json` as they
|
|
482
|
-
are. They're your LinkedIn account's budget, which the import kept (it only added the
|
|
483
|
-
other computer's searches), so they're right whichever network you use.
|
|
484
|
-
6. Open Six Degrees again.
|
|
518
|
+
An import, or a restore, keeps what it replaced in the data folder's `backups/`, named with
|
|
519
|
+
the time it finished: `before-import-<time>.sqlite`, your network as it was, and
|
|
520
|
+
`before-import-<time>-files/` beside it, with its profile photos, the scanner's notes
|
|
521
|
+
about it, and a CSV import kept with it if there was one.
|
|
522
|
+
|
|
523
|
+
To put it back, open **Settings → Your data**, open **The backups**, find **Before an import
|
|
524
|
+
or a restore** with that time, and click **Restore**. It's checked first, then finishes when
|
|
525
|
+
Six Degrees restarts (**Restart now** in the Mac app; with `npx six-degrees`, press Ctrl-C
|
|
526
|
+
and start it again), and what's there now is kept in the same way, so you can go back
|
|
527
|
+
again. Your LinkedIn search budget stays as it is: it belongs to your LinkedIn account,
|
|
528
|
+
not to a network.
|
|
529
|
+
|
|
530
|
+
The same **Restore** puts back any other backup: yesterday's, or the one from before the
|
|
531
|
+
last update.
|
|
485
532
|
|
|
486
533
|
Don't put the live folder in iCloud Drive or Dropbox to share it between computers
|
|
487
534
|
instead. A sync service that copies the database while it's open can damage it, and it
|
|
@@ -490,8 +537,7 @@ would also sync your LinkedIn sign-in.
|
|
|
490
537
|
**To remove everything:** quit the app and drag **Six Degrees** from Applications to the
|
|
491
538
|
Trash. Then in Finder choose **Go → Go to Folder…** (⇧⌘G), paste `~/.six-degrees` and
|
|
492
539
|
move that folder to the Trash. Do the same for
|
|
493
|
-
`~/Library/Application Support/Six Degrees`, the app window's own storage and cache
|
|
494
|
-
(it can include a CSV you imported).
|
|
540
|
+
`~/Library/Application Support/Six Degrees`, the app window's own storage and cache.
|
|
495
541
|
|
|
496
542
|
> [!WARNING]
|
|
497
543
|
> `chrome-profile/` holds a **real, signed-in LinkedIn session**. It's the one thing here
|
|
@@ -505,7 +551,7 @@ Nothing to configure. Two optional environment variables exist:
|
|
|
505
551
|
| Variable | Purpose |
|
|
506
552
|
|---|---|
|
|
507
553
|
| `SIX_DEGREES_HOME` | Where your data lives. Defaults to `~/.six-degrees`. It's read at launch, so it applies to `npx six-degrees` and source runs (npx also takes `--data-dir`; see `npx six-degrees --help`), not when the Mac app is opened from the Dock or Finder. A relative folder is taken from the folder you run the command in. |
|
|
508
|
-
| `ADMIN_TOKEN` | Not needed on your own computer. The app listens only on 127.0.0.1 and isn't built to be exposed: don't put it behind a tunnel or bind it to another address ([SECURITY.md](SECURITY.md)). If it's ever bound elsewhere, the
|
|
554
|
+
| `ADMIN_TOKEN` | Not needed on your own computer. The app listens only on 127.0.0.1 and isn't built to be exposed: don't put it behind a tunnel or bind it to another address ([SECURITY.md](SECURITY.md)). If it's ever bound elsewhere, the eleven routes that delete, replace or hand over your data, run the scanner, open the data folder or update a copy run from source refuse every caller without this token, including the app's own buttons. Everything else, including reading your whole network, stays open. |
|
|
509
555
|
|
|
510
556
|
## Docs
|
|
511
557
|
|
|
@@ -12,21 +12,25 @@ This app is designed to run **on your own machine, against your own network**.
|
|
|
12
12
|
|
|
13
13
|
- The web UI binds to localhost. It is not hardened for exposure to the
|
|
14
14
|
internet, and it has no multi-user authentication or per-user authorization.
|
|
15
|
-
-
|
|
16
|
-
`setup-profile`, `scraper`, `update`,
|
|
17
|
-
`data/export`, `data/import`, `data/restart`, `data/reveal`
|
|
18
|
-
can irreversibly destroy or rewrite data,
|
|
19
|
-
`update` changes the code that runs next. `data/export` hands over the whole
|
|
15
|
+
- Thirteen API routes are gated (`admin-delete`, `admin-update`, `delete-cluster`,
|
|
16
|
+
`setup-profile`, `scraper`, `update`, Settings → Your data's
|
|
17
|
+
`data/export`, `data/import`, `data/restart`, `data/reveal`, `data/backup`,
|
|
18
|
+
`data/restore`, and `data/csv`). The first four can irreversibly destroy or rewrite data,
|
|
19
|
+
`scraper` starts processes, and `update` changes the code that runs next. `data/export` hands over the whole
|
|
20
20
|
network in one file, `data/import` replaces it, `data/restart` stops the
|
|
21
|
-
server,
|
|
22
|
-
browser, on the data folder's own path
|
|
21
|
+
server, `data/reveal` starts a process (Finder, or the Linux file
|
|
22
|
+
browser, on the data folder's own path or a backup in it), `data/backup`
|
|
23
|
+
writes the whole network to a file in `backups/`, `data/restore`
|
|
24
|
+
replaces the network with one of those backups, named as `backups/` lists
|
|
25
|
+
it, never by a path from the request, and `data/csv` keeps, hands over and
|
|
26
|
+
removes a LinkedIn CSV import kept in the data folder. While the server is bound to
|
|
23
27
|
127.0.0.1 they need no token — anyone who can reach it can already open the
|
|
24
28
|
database file directly, so a token there adds friction rather than safety. If
|
|
25
29
|
it is bound to any other address, every caller must send `ADMIN_TOKEN` as a
|
|
26
30
|
bearer, including this machine and the app's own buttons, and the routes
|
|
27
31
|
refuse to run when it is unset. Reading the data folder's facts
|
|
28
|
-
(`GET /api/data`: its path and
|
|
29
|
-
every other read.
|
|
32
|
+
(`GET /api/data`: its path, sizes and backups) changes nothing and stays
|
|
33
|
+
open, like every other read.
|
|
30
34
|
- A localhost-bound service is still reachable by any web page you visit — the
|
|
31
35
|
binding keeps other machines out, not your own browser. Every mutating API
|
|
32
36
|
request is therefore refused when the browser reports it came from another
|
|
@@ -113,8 +117,10 @@ This app is designed to run **on your own machine, against your own network**.
|
|
|
113
117
|
|
|
114
118
|
Everything stays local:
|
|
115
119
|
|
|
116
|
-
- A CSV import is parsed in the browser
|
|
117
|
-
|
|
120
|
+
- A CSV import is parsed in the browser. Only what the map needs about each
|
|
121
|
+
person (no email addresses) goes to the app on this computer, which keeps it
|
|
122
|
+
in the data folder as `csv-network.json` until you remove it, apart from the
|
|
123
|
+
database. It is never uploaded anywhere.
|
|
118
124
|
- Scanned data and cached avatars are written to your machine and are gitignored.
|
|
119
125
|
The app shows photos only from those files, so looking at your network never
|
|
120
126
|
contacts LinkedIn.
|
|
@@ -123,6 +129,14 @@ Everything stays local:
|
|
|
123
129
|
If you run the scanner, `chrome-profile/` in the data directory holds a live
|
|
124
130
|
logged-in LinkedIn session. Never copy, sync, or commit it.
|
|
125
131
|
|
|
132
|
+
The scanner reads LinkedIn. The one thing it ever sends there is a connection request,
|
|
133
|
+
and only when you press **Auto** on a person: one request per press, without a note, at
|
|
134
|
+
most 15 in any 24 hours and 80 in any 7 days. The app looks the person up by the id the
|
|
135
|
+
page sends and passes the scanner their profile URL from the database, never a URL or name
|
|
136
|
+
from the request, and refuses before anything starts during a cooldown, past those caps,
|
|
137
|
+
or before Auto's one-time question has been answered (`app/api/scraper/route.js`,
|
|
138
|
+
`lib/auto-connect.js`).
|
|
139
|
+
|
|
126
140
|
### Moving your data (Settings → Your data)
|
|
127
141
|
|
|
128
142
|
- **An export** is one `.sixdegrees` file the user saves and carries. It is
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { getDb, backupOptions } from '../../../../lib/db-client';
|
|
2
|
+
import { makeBackup, noteBackupFailure } from '../../../../lib/backups';
|
|
3
|
+
import { countPeople } from '../../../../lib/data-export';
|
|
4
|
+
|
|
5
|
+
// Settings → Your data → Back up now: a backup in backups/ like the daily ones
|
|
6
|
+
// (lib/backups.js), kept until the person deletes it. Nothing is taken from
|
|
7
|
+
// the request. Gated (lib/gate.js) with the routes that hand over or replace
|
|
8
|
+
// the whole network: it writes all of it to a file.
|
|
9
|
+
|
|
10
|
+
export async function POST() {
|
|
11
|
+
const db = getDb();
|
|
12
|
+
if (countPeople(db) === 0) {
|
|
13
|
+
return Response.json({ error: 'There’s no network here to back up yet.' }, { status: 409 });
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const made = makeBackup('manual', backupOptions(db));
|
|
17
|
+
return Response.json({
|
|
18
|
+
ok: true,
|
|
19
|
+
backup: { name: made.name, bytes: made.bytes, people: made.people, photos: made.photos, verified: made.verified },
|
|
20
|
+
});
|
|
21
|
+
} catch (err) {
|
|
22
|
+
noteBackupFailure('manual', err);
|
|
23
|
+
return Response.json({ error: `The backup couldn’t be made: ${err.message}` }, { status: 500 });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { dataDir } from '../../../../lib/db-client';
|
|
2
|
+
import { pendingImport } from '../../../../lib/data-import';
|
|
3
|
+
import { resolveProfile, networkCounts } from '../../../../lib/profile';
|
|
4
|
+
import {
|
|
5
|
+
readCsvNetwork, writeCsvNetwork, removeCsvNetwork, CsvStoreError, CSV_NETWORK_FILE,
|
|
6
|
+
} from '../../../../lib/csv-store';
|
|
7
|
+
|
|
8
|
+
// A LinkedIn Connections.csv import, kept in the data folder so it is still
|
|
9
|
+
// there after the window closes (lib/csv-store.js). The page reads the CSV and
|
|
10
|
+
// sends only what the map needs (lib/csv.js packConnections); nothing here
|
|
11
|
+
// sees the file itself.
|
|
12
|
+
//
|
|
13
|
+
// Gated with the other routes under /api/data (lib/gate.js): POST replaces the
|
|
14
|
+
// kept import, DELETE removes it, and GET hands it over, so all three answer
|
|
15
|
+
// only on this computer, as the server's bind address proves, never a header
|
|
16
|
+
// (TRAPS §2). POST and DELETE are writes, so middleware.js also refuses them
|
|
17
|
+
// from another site.
|
|
18
|
+
|
|
19
|
+
export async function GET() {
|
|
20
|
+
const { csv, problem } = readCsvNetwork(dataDir());
|
|
21
|
+
// Your scanned 1st-degree connections, under the profile the map shows
|
|
22
|
+
// (lib/profile.js): once there are any, pages show them instead of a kept
|
|
23
|
+
// CSV (lib/csv.js openNetworkSource).
|
|
24
|
+
let scanned;
|
|
25
|
+
try {
|
|
26
|
+
const me = resolveProfile({ create: false });
|
|
27
|
+
scanned = me ? networkCounts(me.id).first : 0;
|
|
28
|
+
} catch (err) {
|
|
29
|
+
return Response.json({ error: `Your network couldn't be read (${err.message}).` }, { status: 500 });
|
|
30
|
+
}
|
|
31
|
+
return Response.json({
|
|
32
|
+
csv,
|
|
33
|
+
scanned,
|
|
34
|
+
// Said, never shown as no import at all (TRAPS §7): the welcome screen
|
|
35
|
+
// puts this on the CSV card.
|
|
36
|
+
problem: problem ? `Your kept CSV import couldn't be read: ${problem}. Import Connections.csv again to replace it.` : null,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export async function POST(request) {
|
|
41
|
+
const dir = dataDir();
|
|
42
|
+
// An import from another computer waiting for the next start replaces the
|
|
43
|
+
// network's files, this one included: a CSV kept now would be set aside
|
|
44
|
+
// with what it replaces.
|
|
45
|
+
if (pendingImport(dir)) {
|
|
46
|
+
return Response.json({
|
|
47
|
+
error: 'A copy of a network is waiting to finish importing. Restart Six Degrees to finish it first (Settings → Your data says how), then import the CSV.',
|
|
48
|
+
}, { status: 409 });
|
|
49
|
+
}
|
|
50
|
+
let body;
|
|
51
|
+
try {
|
|
52
|
+
body = await request.json();
|
|
53
|
+
} catch {
|
|
54
|
+
return Response.json({ error: "The import didn't arrive whole, so nothing was kept. Try again." }, { status: 400 });
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
return Response.json({ ok: true, ...writeCsvNetwork(dir, body?.connections) });
|
|
58
|
+
} catch (err) {
|
|
59
|
+
if (err instanceof CsvStoreError) {
|
|
60
|
+
return Response.json({ error: `This import can't be kept (${err.message}), so nothing was saved.` }, { status: 400 });
|
|
61
|
+
}
|
|
62
|
+
return Response.json({ error: `The import couldn't be saved on this computer (${err.message}).` }, { status: 500 });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export async function DELETE() {
|
|
67
|
+
try {
|
|
68
|
+
return Response.json({ ok: true, removed: removeCsvNetwork(dataDir()) });
|
|
69
|
+
} catch (err) {
|
|
70
|
+
return Response.json({
|
|
71
|
+
error: `The import couldn't be removed (${err.message}). It is ${CSV_NETWORK_FILE} in your data folder.`,
|
|
72
|
+
}, { status: 500 });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -7,7 +7,7 @@ import { EXPORT_WORK_PREFIX, sweepLeftovers } from '../../../../lib/data-folder'
|
|
|
7
7
|
import { SCHEMA_SQL } from '../../../../db/schema';
|
|
8
8
|
import { APP_VERSION } from '../../../../lib/app-version';
|
|
9
9
|
|
|
10
|
-
//
|
|
10
|
+
// Export backup file…: a copy of the network to carry to another computer, one .sixdegrees
|
|
11
11
|
// file (lib/data-export.js), sent back as a download. A POST, so it takes a
|
|
12
12
|
// click on the app's own page (the cross-site guard applies), and gated with
|
|
13
13
|
// the other routes that hand over or replace everything (lib/gate.js).
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { getDb, dataDir, applySchema, backupsFolder } from '../../../../lib/db-client';
|
|
3
|
+
import { SCHEMA_SQL } from '../../../../db/schema';
|
|
4
|
+
import { APP_VERSION } from '../../../../lib/app-version';
|
|
5
|
+
import { countPeople } from '../../../../lib/data-export';
|
|
6
|
+
import { ImportError, pendingImport } from '../../../../lib/data-import';
|
|
7
|
+
import { findBackup, restoreBackup, restorePreflight } from '../../../../lib/backups';
|
|
8
|
+
import { scannerJob } from '../../../../lib/scan-state';
|
|
9
|
+
|
|
10
|
+
// Settings → Your data → Restore, on one backup: put that backup's network
|
|
11
|
+
// back. The same as importing it (lib/backups.js restoreBackup, through
|
|
12
|
+
// stageImport): checked first, applied at the next start (Restart now), and
|
|
13
|
+
// what is here kept in backups/ before anything is replaced.
|
|
14
|
+
//
|
|
15
|
+
// The body names a backup, {name, replace}: a name from backups/' own listing
|
|
16
|
+
// (lib/data-folder.js listBackups), never a path. Anything else is refused.
|
|
17
|
+
// `replace` is the number of people the person agreed to replace. Gated
|
|
18
|
+
// (lib/gate.js): it replaces the network.
|
|
19
|
+
|
|
20
|
+
export async function POST(request) {
|
|
21
|
+
let body = {};
|
|
22
|
+
try { body = await request.json(); } catch { /* refused below */ }
|
|
23
|
+
const name = typeof body?.name === 'string' ? body.name : '';
|
|
24
|
+
|
|
25
|
+
// The name first: one the folder doesn't hold is refused before anything else is asked.
|
|
26
|
+
if (!findBackup(backupsFolder(), name)) {
|
|
27
|
+
return Response.json({ error: 'There is no backup by that name in the backups folder.' }, { status: 404 });
|
|
28
|
+
}
|
|
29
|
+
const dir = path.resolve(dataDir());
|
|
30
|
+
const currentPeople = countPeople(getDb());
|
|
31
|
+
const refusal = restorePreflight({
|
|
32
|
+
scanRunning: scannerJob(),
|
|
33
|
+
pending: pendingImport(dir),
|
|
34
|
+
currentPeople,
|
|
35
|
+
confirmedPeople: Number(body?.replace),
|
|
36
|
+
});
|
|
37
|
+
if (refusal) return Response.json({ error: refusal.message, ...refusal.extra }, { status: refusal.status });
|
|
38
|
+
|
|
39
|
+
try {
|
|
40
|
+
const pending = restoreBackup(name, {
|
|
41
|
+
dir, backupsDir: backupsFolder(), applySchema, schemaSql: SCHEMA_SQL, appVersion: APP_VERSION, replacedPeople: currentPeople,
|
|
42
|
+
});
|
|
43
|
+
return Response.json({ ok: true, pending });
|
|
44
|
+
} catch (err) {
|
|
45
|
+
if (err instanceof ImportError) return Response.json({ error: err.message, ...err.extra }, { status: err.status });
|
|
46
|
+
return Response.json({ error: `The backup couldn’t be restored: ${err.message}` }, { status: 500 });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -1,14 +1,27 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
-
import { dataDir } from '../../../../lib/db-client';
|
|
2
|
+
import { dataDir, backupsFolder } from '../../../../lib/db-client';
|
|
3
3
|
import { revealFolder } from '../../../../lib/data-folder';
|
|
4
|
+
import { findBackup } from '../../../../lib/backups';
|
|
4
5
|
|
|
5
|
-
// Show the data folder in Finder (or the Linux file browser)
|
|
6
|
-
//
|
|
7
|
-
//
|
|
6
|
+
// Show the data folder in Finder (or the Linux file browser), or one backup in
|
|
7
|
+
// it, selected: {backup: name}, a name from backups/' own listing, never a
|
|
8
|
+
// path (lib/backups.js findBackup). Nothing else is taken from the request.
|
|
9
|
+
// Gated (lib/gate.js) like every route that starts a process.
|
|
8
10
|
|
|
9
|
-
export async function POST() {
|
|
11
|
+
export async function POST(request) {
|
|
12
|
+
let body = {};
|
|
13
|
+
try { body = await request.json(); } catch { /* no body: the data folder */ }
|
|
14
|
+
if (body?.backup !== undefined) {
|
|
15
|
+
const folder = path.resolve(backupsFolder());
|
|
16
|
+
const found = findBackup(folder, body.backup, { restorable: false });
|
|
17
|
+
if (!found) return Response.json({ error: 'There is no backup by that name in the backups folder.' }, { status: 404 });
|
|
18
|
+
const file = path.join(folder, found.name);
|
|
19
|
+
const result = await revealFolder(folder, { select: file });
|
|
20
|
+
if (result.ok) return Response.json({ ok: true });
|
|
21
|
+
return Response.json({ error: `${result.message} The backup is ${file}`, path: file }, { status: 500 });
|
|
22
|
+
}
|
|
10
23
|
const dir = path.resolve(dataDir());
|
|
11
24
|
const result = await revealFolder(dir);
|
|
12
25
|
if (result.ok) return Response.json({ ok: true });
|
|
13
|
-
return Response.json({ error: `${result.message} The folder is ${dir}
|
|
26
|
+
return Response.json({ error: `${result.message} The folder is ${dir}`, path: dir }, { status: 500 });
|
|
14
27
|
}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { homedir } from 'node:os';
|
|
3
|
-
import { getDb, dataDir, dbFile, AUTO_BACKUP_PREFIX } from '../../../lib/db-client';
|
|
3
|
+
import { getDb, dataDir, dbFile, backupsFolder, applySchema, AUTO_BACKUP_PREFIX } from '../../../lib/db-client';
|
|
4
4
|
import { folderReport } from '../../../lib/data-folder';
|
|
5
|
+
import { backupReport } from '../../../lib/backups';
|
|
6
|
+
import { SCHEMA_SQL } from '../../../db/schema';
|
|
7
|
+
import { APP_VERSION } from '../../../lib/app-version';
|
|
5
8
|
import { countPeople, referencedPhotos } from '../../../lib/data-export';
|
|
6
9
|
import {
|
|
7
10
|
pendingImport, lastImport, restartCodeFrom, restartAdvice, MAX_IMPORT_BYTES,
|
|
@@ -9,9 +12,11 @@ import {
|
|
|
9
12
|
import { projectRoot, isGitCheckout } from '../../../lib/paths';
|
|
10
13
|
import { installKind } from '../../../lib/release';
|
|
11
14
|
|
|
12
|
-
// Settings → Your data: where the network is kept, what it takes up,
|
|
13
|
-
// import waiting to finish. Sizes come from the file system
|
|
14
|
-
//
|
|
15
|
+
// Settings → Your data: where the network is kept, what it takes up, the
|
|
16
|
+
// backups, and any import waiting to finish. Sizes come from the file system,
|
|
17
|
+
// and chrome-profile/ is only reported as there or not. The one file read is
|
|
18
|
+
// the newest backup, checked as the importer would check it (once per file per
|
|
19
|
+
// server, lib/backups.js backupReport), so "verified" is never a guess. A read
|
|
15
20
|
// that changes nothing, so it stays open like every other read. The actions
|
|
16
21
|
// live under /api/data/… and are gated (lib/gate.js).
|
|
17
22
|
|
|
@@ -22,8 +27,14 @@ export async function GET() {
|
|
|
22
27
|
// A git checkout is its own kind here, as on the rest of the Settings page.
|
|
23
28
|
const kind = isGitCheckout() ? 'git' : installKind(process.env, projectRoot());
|
|
24
29
|
const custom = dir !== path.join(homedir(), '.six-degrees');
|
|
30
|
+
// One entry per backup (a database copy and its folder of photos are one), newest first.
|
|
31
|
+
const { backups, ...backupStatus } = backupReport(path.resolve(backupsFolder()), {
|
|
32
|
+
applySchema, schemaSql: SCHEMA_SQL, appVersion: APP_VERSION,
|
|
33
|
+
});
|
|
25
34
|
return Response.json({
|
|
26
35
|
...folderReport({ dir, dbFile: path.resolve(dbFile()), autoPrefix: AUTO_BACKUP_PREFIX, inNetwork: referencedPhotos(db) }),
|
|
36
|
+
backups,
|
|
37
|
+
backupStatus,
|
|
27
38
|
people: countPeople(db),
|
|
28
39
|
platform: process.platform,
|
|
29
40
|
kind,
|
|
@@ -322,7 +322,7 @@ export async function POST(request) {
|
|
|
322
322
|
user_id: userId || null,
|
|
323
323
|
type: 'request_accepted',
|
|
324
324
|
title: `${p.name} accepted! +${XP_ACCEPT[p.tier] || 5} XP`,
|
|
325
|
-
message: `${p.tier}-Tier connection
|
|
325
|
+
message: `${p.tier}-Tier connection: bridge their cluster to reach D3`,
|
|
326
326
|
icon: '🤝',
|
|
327
327
|
data: { personId: p.id, viaId: p.source_connection_id ?? null, tier: p.tier ?? null },
|
|
328
328
|
}))
|