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.
Files changed (609) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +4 -0
  3. package/.next/standalone/.next/build-manifest.json +3 -3
  4. package/.next/standalone/.next/prerender-manifest.json +42 -14
  5. package/.next/standalone/.next/routes-manifest.json +24 -0
  6. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  7. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_not-found/page.js +1 -1
  12. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  13. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  14. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  15. package/.next/standalone/.next/server/app/_not-found.rsc +26 -18
  16. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +26 -18
  17. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +25 -16
  18. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  19. package/.next/standalone/.next/server/app/api/admin-delete/route.js +2 -2
  20. package/.next/standalone/.next/server/app/api/admin-delete/route.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/api/admin-update/route.js +2 -2
  22. package/.next/standalone/.next/server/app/api/admin-update/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/bridges/route.js +2 -2
  24. package/.next/standalone/.next/server/app/api/bridges/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/bulk-import/route.js +2 -2
  26. package/.next/standalone/.next/server/app/api/bulk-import/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js +3 -3
  28. package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/company-scores/route.js +3 -3
  30. package/.next/standalone/.next/server/app/api/company-scores/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/connections/route.js +2 -2
  32. package/.next/standalone/.next/server/app/api/connections/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/data/backup/route/app-paths-manifest.json +3 -0
  34. package/.next/standalone/.next/server/app/api/data/backup/route/build-manifest.json +12 -0
  35. package/.next/standalone/.next/server/app/api/data/backup/route/server-reference-manifest.json +4 -0
  36. package/.next/standalone/.next/server/app/api/data/backup/route.js +7 -0
  37. package/.next/standalone/.next/server/app/api/data/backup/route.js.map +5 -0
  38. package/.next/standalone/.next/server/app/api/data/backup/route.js.nft.json +1 -0
  39. package/.next/standalone/.next/server/app/api/data/backup/route_client-reference-manifest.js +3 -0
  40. package/.next/standalone/.next/server/app/api/data/csv/route/app-paths-manifest.json +3 -0
  41. package/.next/standalone/.next/server/app/api/data/csv/route/build-manifest.json +12 -0
  42. package/.next/standalone/.next/server/app/api/data/csv/route/server-reference-manifest.json +4 -0
  43. package/.next/standalone/.next/server/app/api/data/csv/route.js +8 -0
  44. package/.next/standalone/.next/server/app/api/data/csv/route.js.map +5 -0
  45. package/.next/standalone/.next/server/app/api/data/csv/route.js.nft.json +1 -0
  46. package/.next/standalone/.next/server/app/api/data/csv/route_client-reference-manifest.js +3 -0
  47. package/.next/standalone/.next/server/app/api/data/export/route.js +1 -1
  48. package/.next/standalone/.next/server/app/api/data/export/route.js.nft.json +1 -1
  49. package/.next/standalone/.next/server/app/api/data/import/route.js +1 -1
  50. package/.next/standalone/.next/server/app/api/data/import/route.js.nft.json +1 -1
  51. package/.next/standalone/.next/server/app/api/data/restart/route.js +1 -1
  52. package/.next/standalone/.next/server/app/api/data/restart/route.js.nft.json +1 -1
  53. package/.next/standalone/.next/server/app/api/data/restore/route/app-paths-manifest.json +3 -0
  54. package/.next/standalone/.next/server/app/api/data/restore/route/build-manifest.json +12 -0
  55. package/.next/standalone/.next/server/app/api/data/restore/route/server-reference-manifest.json +4 -0
  56. package/.next/standalone/.next/server/app/api/data/restore/route.js +7 -0
  57. package/.next/standalone/.next/server/app/api/data/restore/route.js.map +5 -0
  58. package/.next/standalone/.next/server/app/api/data/restore/route.js.nft.json +1 -0
  59. package/.next/standalone/.next/server/app/api/data/restore/route_client-reference-manifest.js +3 -0
  60. package/.next/standalone/.next/server/app/api/data/reveal/route.js +1 -1
  61. package/.next/standalone/.next/server/app/api/data/reveal/route.js.nft.json +1 -1
  62. package/.next/standalone/.next/server/app/api/data/route.js +1 -1
  63. package/.next/standalone/.next/server/app/api/data/route.js.nft.json +1 -1
  64. package/.next/standalone/.next/server/app/api/delete-cluster/route.js +2 -2
  65. package/.next/standalone/.next/server/app/api/delete-cluster/route.js.nft.json +1 -1
  66. package/.next/standalone/.next/server/app/api/ingest/route.js +2 -2
  67. package/.next/standalone/.next/server/app/api/ingest/route.js.nft.json +1 -1
  68. package/.next/standalone/.next/server/app/api/network/route.js +2 -2
  69. package/.next/standalone/.next/server/app/api/network/route.js.nft.json +1 -1
  70. package/.next/standalone/.next/server/app/api/notifications/route.js +2 -2
  71. package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  72. package/.next/standalone/.next/server/app/api/outreach/route.js +3 -3
  73. package/.next/standalone/.next/server/app/api/outreach/route.js.nft.json +1 -1
  74. package/.next/standalone/.next/server/app/api/queue/route.js +2 -2
  75. package/.next/standalone/.next/server/app/api/queue/route.js.nft.json +1 -1
  76. package/.next/standalone/.next/server/app/api/scraper/route.js +5 -3
  77. package/.next/standalone/.next/server/app/api/scraper/route.js.nft.json +1 -1
  78. package/.next/standalone/.next/server/app/api/settings/route.js +3 -3
  79. package/.next/standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  80. package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js +3 -3
  81. package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js.nft.json +1 -1
  82. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js +3 -3
  83. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js.nft.json +1 -1
  84. package/.next/standalone/.next/server/app/api/setup-profile/route.js +2 -2
  85. package/.next/standalone/.next/server/app/api/setup-profile/route.js.nft.json +1 -1
  86. package/.next/standalone/.next/server/app/api/social/crm/route.js +1 -1
  87. package/.next/standalone/.next/server/app/api/social/crm/route.js.nft.json +1 -1
  88. package/.next/standalone/.next/server/app/api/social/messages/route.js +1 -1
  89. package/.next/standalone/.next/server/app/api/social/messages/route.js.nft.json +1 -1
  90. package/.next/standalone/.next/server/app/api/social/route.js +2 -2
  91. package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -1
  92. package/.next/standalone/.next/server/app/api/unlock/route.js +2 -2
  93. package/.next/standalone/.next/server/app/api/unlock/route.js.nft.json +1 -1
  94. package/.next/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  95. package/.next/standalone/.next/server/app/api/update-images/route.js +2 -2
  96. package/.next/standalone/.next/server/app/api/update-images/route.js.nft.json +1 -1
  97. package/.next/standalone/.next/server/app/api/users/route.js +2 -2
  98. package/.next/standalone/.next/server/app/api/users/route.js.nft.json +1 -1
  99. package/.next/standalone/.next/server/app/avatars/[file]/route.js +1 -1
  100. package/.next/standalone/.next/server/app/avatars/[file]/route.js.nft.json +1 -1
  101. package/.next/standalone/.next/server/app/import/page.js +1 -1
  102. package/.next/standalone/.next/server/app/import/page.js.nft.json +1 -1
  103. package/.next/standalone/.next/server/app/import/page_client-reference-manifest.js +1 -1
  104. package/.next/standalone/.next/server/app/import.html +1 -1
  105. package/.next/standalone/.next/server/app/import.rsc +32 -24
  106. package/.next/standalone/.next/server/app/import.segments/_full.segment.rsc +32 -24
  107. package/.next/standalone/.next/server/app/import.segments/_tree.segment.rsc +2 -2
  108. package/.next/standalone/.next/server/app/import.segments/import/__PAGE__.segment.rsc +23 -18
  109. package/.next/standalone/.next/server/app/index.html +1 -1
  110. package/.next/standalone/.next/server/app/index.rsc +29 -22
  111. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +20 -15
  112. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +29 -22
  113. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  114. package/.next/standalone/.next/server/app/insights/page/app-paths-manifest.json +3 -0
  115. package/.next/standalone/.next/server/app/insights/page/build-manifest.json +20 -0
  116. package/.next/standalone/.next/server/app/insights/page/next-font-manifest.json +11 -0
  117. package/.next/standalone/.next/server/app/insights/page/react-loadable-manifest.json +1 -0
  118. package/.next/standalone/.next/server/app/insights/page/server-reference-manifest.json +4 -0
  119. package/.next/standalone/.next/server/app/insights/page.js +13 -0
  120. package/.next/standalone/.next/server/app/insights/page.js.map +5 -0
  121. package/.next/standalone/.next/server/app/insights/page.js.nft.json +1 -0
  122. package/.next/standalone/.next/server/app/insights/page_client-reference-manifest.js +3 -0
  123. package/.next/standalone/.next/server/app/insights.html +1 -0
  124. package/.next/standalone/.next/server/app/insights.meta +26 -0
  125. package/.next/standalone/.next/server/app/insights.rsc +35 -0
  126. package/.next/standalone/.next/server/app/insights.segments/_full.segment.rsc +35 -0
  127. package/.next/standalone/.next/server/app/insights.segments/_tree.segment.rsc +4 -0
  128. package/.next/standalone/.next/server/app/insights.segments/insights/__PAGE__.segment.rsc +33 -0
  129. package/.next/standalone/.next/server/app/launch/page.js +1 -1
  130. package/.next/standalone/.next/server/app/launch/page.js.nft.json +1 -1
  131. package/.next/standalone/.next/server/app/launch/page_client-reference-manifest.js +1 -1
  132. package/.next/standalone/.next/server/app/launch.html +2 -2
  133. package/.next/standalone/.next/server/app/launch.rsc +32 -24
  134. package/.next/standalone/.next/server/app/launch.segments/_full.segment.rsc +32 -24
  135. package/.next/standalone/.next/server/app/launch.segments/_tree.segment.rsc +2 -2
  136. package/.next/standalone/.next/server/app/launch.segments/launch/__PAGE__.segment.rsc +23 -18
  137. package/.next/standalone/.next/server/app/page.js +1 -1
  138. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  139. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  140. package/.next/standalone/.next/server/app/paths/page.js +1 -1
  141. package/.next/standalone/.next/server/app/paths/page.js.nft.json +1 -1
  142. package/.next/standalone/.next/server/app/paths/page_client-reference-manifest.js +1 -1
  143. package/.next/standalone/.next/server/app/paths.html +1 -1
  144. package/.next/standalone/.next/server/app/paths.rsc +32 -24
  145. package/.next/standalone/.next/server/app/paths.segments/_full.segment.rsc +32 -24
  146. package/.next/standalone/.next/server/app/paths.segments/_tree.segment.rsc +2 -2
  147. package/.next/standalone/.next/server/app/paths.segments/paths/__PAGE__.segment.rsc +21 -18
  148. package/.next/standalone/.next/server/app/profile/page.js +1 -1
  149. package/.next/standalone/.next/server/app/profile/page.js.nft.json +1 -1
  150. package/.next/standalone/.next/server/app/profile/page_client-reference-manifest.js +1 -1
  151. package/.next/standalone/.next/server/app/profile.html +1 -1
  152. package/.next/standalone/.next/server/app/profile.rsc +32 -24
  153. package/.next/standalone/.next/server/app/profile.segments/_full.segment.rsc +32 -24
  154. package/.next/standalone/.next/server/app/profile.segments/_tree.segment.rsc +2 -2
  155. package/.next/standalone/.next/server/app/profile.segments/profile/__PAGE__.segment.rsc +23 -18
  156. package/.next/standalone/.next/server/app/queue/page.js +1 -1
  157. package/.next/standalone/.next/server/app/queue/page.js.nft.json +1 -1
  158. package/.next/standalone/.next/server/app/queue/page_client-reference-manifest.js +1 -1
  159. package/.next/standalone/.next/server/app/queue.html +1 -1
  160. package/.next/standalone/.next/server/app/queue.rsc +32 -24
  161. package/.next/standalone/.next/server/app/queue.segments/_full.segment.rsc +32 -24
  162. package/.next/standalone/.next/server/app/queue.segments/_tree.segment.rsc +2 -2
  163. package/.next/standalone/.next/server/app/queue.segments/queue/__PAGE__.segment.rsc +21 -18
  164. package/.next/standalone/.next/server/app/scores/page.js +1 -1
  165. package/.next/standalone/.next/server/app/scores/page.js.nft.json +1 -1
  166. package/.next/standalone/.next/server/app/scores/page_client-reference-manifest.js +1 -1
  167. package/.next/standalone/.next/server/app/scores.html +1 -1
  168. package/.next/standalone/.next/server/app/scores.rsc +32 -24
  169. package/.next/standalone/.next/server/app/scores.segments/_full.segment.rsc +32 -24
  170. package/.next/standalone/.next/server/app/scores.segments/_tree.segment.rsc +2 -2
  171. package/.next/standalone/.next/server/app/scores.segments/scores/__PAGE__.segment.rsc +23 -18
  172. package/.next/standalone/.next/server/app/settings/page.js +1 -1
  173. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  174. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  175. package/.next/standalone/.next/server/app/settings.html +1 -1
  176. package/.next/standalone/.next/server/app/settings.rsc +32 -24
  177. package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +32 -24
  178. package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  179. package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +20 -18
  180. package/.next/standalone/.next/server/app/setup/page.js +1 -1
  181. package/.next/standalone/.next/server/app/setup/page.js.nft.json +1 -1
  182. package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  183. package/.next/standalone/.next/server/app/setup.html +1 -1
  184. package/.next/standalone/.next/server/app/setup.rsc +32 -24
  185. package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +32 -24
  186. package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
  187. package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +21 -18
  188. package/.next/standalone/.next/server/app/social/page.js +1 -1
  189. package/.next/standalone/.next/server/app/social/page.js.nft.json +1 -1
  190. package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +1 -1
  191. package/.next/standalone/.next/server/app/social.html +1 -1
  192. package/.next/standalone/.next/server/app/social.rsc +32 -24
  193. package/.next/standalone/.next/server/app/social.segments/_full.segment.rsc +32 -24
  194. package/.next/standalone/.next/server/app/social.segments/_tree.segment.rsc +2 -2
  195. package/.next/standalone/.next/server/app/social.segments/social/__PAGE__.segment.rsc +23 -18
  196. package/.next/standalone/.next/server/app-paths-manifest.json +4 -0
  197. package/.next/standalone/.next/server/chunks/[root-of-the-server]__00la_y0._.js +1 -1
  198. package/.next/standalone/.next/server/chunks/[root-of-the-server]__05_3-22._.js +1 -1
  199. package/.next/standalone/.next/server/chunks/[root-of-the-server]__066rab1._.js +7 -0
  200. package/.next/standalone/.next/server/chunks/[root-of-the-server]__07t47cm._.js +1 -1
  201. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cj5jqc._.js +1 -1
  202. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e0fei3._.js +1 -1
  203. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fooke1._.js +7 -0
  204. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ljnyho._.js +1 -1
  205. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o5-tcg._.js +1 -1
  206. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qrnous._.js +1 -1
  207. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__15wc9e-._.js → [root-of-the-server]__0r-0t-9._.js} +2 -2
  208. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ra6xyg._.js +15 -0
  209. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__20rwfdw._.js → [root-of-the-server]__0rcpjad._.js} +6 -3
  210. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t3v1a1._.js +1 -1
  211. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t6y79e._.js +7 -0
  212. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wmexuc._.js +1 -1
  213. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0x29muh._.js +7 -0
  214. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xu34sz._.js +1 -1
  215. package/.next/standalone/.next/server/chunks/[root-of-the-server]__133knx1._.js +1 -1
  216. package/.next/standalone/.next/server/chunks/[root-of-the-server]__15-17hl._.js +1 -1
  217. package/.next/standalone/.next/server/chunks/[root-of-the-server]__19b7mig._.js +1 -1
  218. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1a_6x37._.js +8 -0
  219. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1an_8pa._.js +7 -0
  220. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1bbcwub._.js +1 -1
  221. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1ducpz2._.js +3 -0
  222. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1eris29._.js +1 -1
  223. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1gjo_cq._.js +1 -1
  224. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qcm08_._.js +1 -1
  225. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1tir0vc._.js +1 -1
  226. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1w25q0m._.js +1 -1
  227. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1xhyinn._.js +3 -0
  228. package/.next/standalone/.next/server/chunks/_072jl0y._.js +1 -1
  229. package/.next/standalone/.next/server/chunks/_0lw8_i0._.js +1 -1
  230. package/.next/standalone/.next/server/chunks/_0sqqpzb._.js +3 -0
  231. package/.next/standalone/.next/server/chunks/_1_fynia._.js +7 -7
  232. package/.next/standalone/.next/server/chunks/_1fn30_l._.js +1 -1
  233. package/.next/standalone/.next/server/chunks/_1itd1o_._.js +1 -1
  234. package/.next/standalone/.next/server/chunks/_1iwkh8t._.js +1 -1
  235. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_backup_route_actions_0zoj04p.js +3 -0
  236. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_csv_route_actions_0l6m7lg.js +3 -0
  237. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_restore_route_actions_0-b05bv.js +3 -0
  238. package/.next/standalone/.next/server/chunks/lib_02iz_9q._.js +4 -0
  239. package/.next/standalone/.next/server/chunks/lib_05agvk3._.js +4 -0
  240. package/.next/standalone/.next/server/chunks/lib_0v84u66._.js +4 -0
  241. package/.next/standalone/.next/server/chunks/lib_db-client_0_dch35.js +174 -0
  242. package/.next/standalone/.next/server/chunks/lib_linkedin-export_12imqxg.js +1 -1
  243. package/.next/standalone/.next/server/chunks/lib_rpc_00nndai.js +3 -0
  244. package/.next/standalone/.next/server/chunks/lib_rpc_03ibb-x.js +3 -0
  245. package/.next/standalone/.next/server/chunks/lib_rpc_03ri3ji.js +3 -0
  246. package/.next/standalone/.next/server/chunks/lib_rpc_078ce48.js +3 -0
  247. package/.next/standalone/.next/server/chunks/lib_rpc_0a69mgr.js +3 -0
  248. package/.next/standalone/.next/server/chunks/lib_rpc_0c9d9ti.js +7 -0
  249. package/.next/standalone/.next/server/chunks/lib_rpc_0cej3t8.js +3 -0
  250. package/.next/standalone/.next/server/chunks/lib_rpc_0cmh4g6.js +3 -0
  251. package/.next/standalone/.next/server/chunks/lib_rpc_0nx2_pc.js +3 -0
  252. package/.next/standalone/.next/server/chunks/lib_rpc_0r79-w1.js +3 -0
  253. package/.next/standalone/.next/server/chunks/lib_rpc_0t552z6.js +3 -0
  254. package/.next/standalone/.next/server/chunks/lib_rpc_0yx8ynd.js +3 -0
  255. package/.next/standalone/.next/server/chunks/lib_rpc_12p-o9-.js +3 -0
  256. package/.next/standalone/.next/server/chunks/lib_rpc_1466dnb.js +3 -0
  257. package/.next/standalone/.next/server/chunks/lib_rpc_1sryxv6.js +3 -0
  258. package/.next/standalone/.next/server/chunks/lib_rpc_1trn-x5.js +3 -0
  259. package/.next/standalone/.next/server/chunks/lib_rpc_1ygu_mv.js +3 -0
  260. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0egamyq._.js +3 -0
  261. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qd8pzm._.js +3 -0
  262. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0qdeuyo._.js → [root-of-the-server]__1-012q1._.js} +2 -2
  263. package/.next/standalone/.next/server/chunks/ssr/_04am_h8._.js +3 -0
  264. package/.next/standalone/.next/server/chunks/ssr/_06rgzfh._.js +3 -0
  265. package/.next/standalone/.next/server/chunks/ssr/_07zb7lu._.js +3 -0
  266. package/.next/standalone/.next/server/chunks/ssr/_0_79idq._.js +3 -0
  267. package/.next/standalone/.next/server/chunks/ssr/_0gds903._.js +3 -0
  268. package/.next/standalone/.next/server/chunks/ssr/_0hb-dhy._.js +3 -0
  269. package/.next/standalone/.next/server/chunks/ssr/_0klqt9z._.js +3 -0
  270. package/.next/standalone/.next/server/chunks/ssr/_14jak5s._.js +7 -0
  271. package/.next/standalone/.next/server/chunks/ssr/_14nxd3q._.js +3 -0
  272. package/.next/standalone/.next/server/chunks/ssr/_1cj2yog._.js +3 -0
  273. package/.next/standalone/.next/server/chunks/ssr/_1fm1ih_._.js +2 -2
  274. package/.next/standalone/.next/server/chunks/ssr/_1hdqw0-._.js +7 -0
  275. package/.next/standalone/.next/server/chunks/ssr/_1k2nmbw._.js +2 -2
  276. package/.next/standalone/.next/server/chunks/ssr/_1r62six._.js +7 -0
  277. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_insights_page_actions_0-0tf75.js +3 -0
  278. package/.next/standalone/.next/server/chunks/ssr/app_141w189._.js +1 -1
  279. package/.next/standalone/.next/server/chunks/ssr/app_components_0uuff77._.js +25 -2
  280. package/.next/standalone/.next/server/chunks/ssr/app_components_1j3q-h5._.js +25 -2
  281. package/.next/standalone/.next/server/chunks/ssr/app_components_CompanyScores_1g0mytz.js +1 -1
  282. package/.next/standalone/.next/server/chunks/ssr/app_components_settings_SectorPicker_1c-29qw.js +1 -1
  283. package/.next/standalone/.next/server/chunks/ssr/app_components_ui_0pdmz2z.js +3 -0
  284. package/.next/standalone/.next/server/chunks/ssr/app_import_page_1fmu6_l.js +1 -1
  285. package/.next/standalone/.next/server/chunks/ssr/app_insights_page_1d_chja.js +3 -0
  286. package/.next/standalone/.next/server/chunks/ssr/app_launch_page_19t0dyd.js +1 -1
  287. package/.next/standalone/.next/server/chunks/ssr/app_page_1fazqbf.js +26 -14
  288. package/.next/standalone/.next/server/chunks/ssr/app_paths_page_1ol90m7.js +2 -2
  289. package/.next/standalone/.next/server/chunks/ssr/app_profile_page_0u3-l5y.js +1 -1
  290. package/.next/standalone/.next/server/chunks/ssr/app_queue_page_0c6znd6.js +11 -11
  291. package/.next/standalone/.next/server/chunks/ssr/app_settings_page_1f8mjj_.js +1 -1
  292. package/.next/standalone/.next/server/chunks/ssr/app_setup_page_1-282zx.js +12 -13
  293. package/.next/standalone/.next/server/chunks/ssr/app_social_page_0h7zxda.js +1 -1
  294. package/.next/standalone/.next/server/chunks/ssr/{lib_1c4ieuw._.js → lib_csv_1ttiu_h.js} +2 -2
  295. package/.next/standalone/.next/server/chunks/ssr/lib_galaxy-lab_108_lu-.js +1 -1
  296. package/.next/standalone/.next/server/chunks/ssr/lib_separation_1305zsx.js +3 -0
  297. package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__0pco7a6._.js +1 -1
  298. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  299. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  300. package/.next/standalone/.next/server/next-font-manifest.js +1 -1
  301. package/.next/standalone/.next/server/next-font-manifest.json +4 -0
  302. package/.next/standalone/.next/server/pages/404.html +1 -1
  303. package/.next/standalone/.next/server/pages/500.html +1 -1
  304. package/.next/standalone/.next/server/prefetch-hints.json +14 -0
  305. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  306. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  307. package/.next/standalone/.next/static/chunks/02wnf8dkxegxg.js +34 -0
  308. package/.next/standalone/.next/static/chunks/03-_esd2x_yk6.js +1 -0
  309. package/.next/standalone/.next/static/chunks/03-demj2iy-0p.js +44 -0
  310. package/.next/standalone/.next/static/chunks/0838_s6w-i_ik.js +1 -0
  311. package/.next/standalone/.next/static/chunks/0_1r-3csplxnj.js +1 -0
  312. package/.next/standalone/.next/static/chunks/0ka4prpk3w9wn.js +34 -0
  313. package/.next/standalone/.next/static/chunks/0kscsqnvfq3-r.js +1 -0
  314. package/.next/standalone/.next/static/chunks/0s_xxwp7z88vv.js +1 -0
  315. package/.next/standalone/.next/static/chunks/1-nnl8amfm4yh.js +57 -0
  316. package/.next/standalone/.next/static/chunks/112mv-com-mqa.js +21 -0
  317. package/.next/standalone/.next/static/chunks/1bkt_hhjzvbh8.js +1 -0
  318. package/.next/standalone/.next/static/chunks/1cmphb3kh2ers.css +3 -0
  319. package/.next/standalone/.next/static/chunks/1d8yv3k_atka7.js +1 -0
  320. package/.next/standalone/.next/static/chunks/{0ws7zy0w57ufi.js → 1eyajb9ntzlrl.js} +1 -1
  321. package/.next/standalone/.next/static/chunks/1z9lb-dbcg4aa.js +1 -0
  322. package/.next/standalone/.next/static/chunks/23hc51oa4vkhc.js +5 -0
  323. package/.next/standalone/.next/static/chunks/27n8k9wxlz5-7.js +1 -0
  324. package/.next/standalone/.next/static/chunks/2q9i7pcxcnph1.js +7 -0
  325. package/.next/standalone/.next/static/chunks/2w-y83mjlpnse.js +1 -0
  326. package/.next/standalone/.next/static/chunks/2ws1xf293j-tm.js +5 -0
  327. package/.next/standalone/.next/static/chunks/2z1-q0_vunbql.js +2 -0
  328. package/.next/standalone/.next/static/chunks/34g73qhayuevu.js +1 -0
  329. package/.next/standalone/.next/static/chunks/3cqn-r-y5rrw1.js +5 -0
  330. package/.next/standalone/.next/static/chunks/3opgg1efrx8q6.js +1 -0
  331. package/.next/standalone/.next/static/chunks/3p51fpxxi4d5y.js +34 -0
  332. package/.next/standalone/.next/static/chunks/3y40z6of3r9py.js +1 -0
  333. package/.next/standalone/.next/static/chunks/403dpflln8ah5.js +1 -0
  334. package/.next/standalone/.next/static/chunks/43pg2sursiypz.js +1 -0
  335. package/.next/standalone/CHANGELOG.md +203 -0
  336. package/.next/standalone/README.md +96 -50
  337. package/.next/standalone/SECURITY.md +25 -11
  338. package/.next/standalone/app/api/data/backup/route.js +25 -0
  339. package/.next/standalone/app/api/data/csv/route.js +74 -0
  340. package/.next/standalone/app/api/data/export/route.js +1 -1
  341. package/.next/standalone/app/api/data/restore/route.js +48 -0
  342. package/.next/standalone/app/api/data/reveal/route.js +19 -6
  343. package/.next/standalone/app/api/data/route.js +15 -4
  344. package/.next/standalone/app/api/ingest/route.js +1 -1
  345. package/.next/standalone/app/api/outreach/route.js +13 -73
  346. package/.next/standalone/app/api/queue/route.js +1 -1
  347. package/.next/standalone/app/api/scraper/route.js +217 -36
  348. package/.next/standalone/app/api/social/crm/route.js +2 -1
  349. package/.next/standalone/app/components/AppHeader.js +41 -21
  350. package/.next/standalone/app/components/AppTabs.js +12 -8
  351. package/.next/standalone/app/components/AutoConnect.js +286 -0
  352. package/.next/standalone/app/components/AutoScanButton.js +2 -2
  353. package/.next/standalone/app/components/Avatar.js +1 -1
  354. package/.next/standalone/app/components/ChainView.js +258 -113
  355. package/.next/standalone/app/components/CirclePanel.js +16 -16
  356. package/.next/standalone/app/components/ClusterSpinner.js +64 -0
  357. package/.next/standalone/app/components/CompanyScores.js +20 -20
  358. package/.next/standalone/app/components/EmptyState.js +39 -18
  359. package/.next/standalone/app/components/FieldStep.js +15 -13
  360. package/.next/standalone/app/components/FilterPanel.js +25 -18
  361. package/.next/standalone/app/components/ForceGraph.js +49 -14
  362. package/.next/standalone/app/components/GalaxyLab.js +33 -33
  363. package/.next/standalone/app/components/GridView.js +18 -18
  364. package/.next/standalone/app/components/LegacyScoresCard.js +10 -11
  365. package/.next/standalone/app/components/LinkedInLimits.js +57 -27
  366. package/.next/standalone/app/components/LiquidGlass.js +99 -0
  367. package/.next/standalone/app/components/ListView.js +20 -20
  368. package/.next/standalone/app/components/MapControls.js +5 -5
  369. package/.next/standalone/app/components/MappingProgress.js +16 -16
  370. package/.next/standalone/app/components/NoteDetail.js +13 -13
  371. package/.next/standalone/app/components/OnboardingGate.js +4 -4
  372. package/.next/standalone/app/components/OutlinkQuest.js +56 -35
  373. package/.next/standalone/app/components/PathsAnalyzer.js +37 -36
  374. package/.next/standalone/app/components/PeopleMap.js +21 -21
  375. package/.next/standalone/app/components/RingsView.js +11 -11
  376. package/.next/standalone/app/components/ScanRadar.js +84 -39
  377. package/.next/standalone/app/components/ScanStatusBar.js +40 -21
  378. package/.next/standalone/app/components/ScanTrail.js +21 -8
  379. package/.next/standalone/app/components/SeparationView.js +172 -124
  380. package/.next/standalone/app/components/Sidebar.js +308 -199
  381. package/.next/standalone/app/components/StaleServerBanner.js +4 -4
  382. package/.next/standalone/app/components/TheirCircle.js +26 -26
  383. package/.next/standalone/app/components/ThemeDefs.js +42 -0
  384. package/.next/standalone/app/components/ThemeLoader.js +20 -1
  385. package/.next/standalone/app/components/UpdatePanel.js +22 -22
  386. package/.next/standalone/app/components/UserProvider.js +22 -15
  387. package/.next/standalone/app/components/insights/Boards.js +275 -0
  388. package/.next/standalone/app/components/insights/PeopleView.js +266 -0
  389. package/.next/standalone/app/components/insights/Rail.js +156 -0
  390. package/.next/standalone/app/components/insights/Report.js +382 -0
  391. package/.next/standalone/app/components/insights/parts.js +239 -0
  392. package/.next/standalone/app/components/settings/AppearanceSection.js +47 -24
  393. package/.next/standalone/app/components/settings/DataSection.js +276 -109
  394. package/.next/standalone/app/components/settings/NetworkHealthSection.js +13 -13
  395. package/.next/standalone/app/components/settings/SectorPicker.js +12 -12
  396. package/.next/standalone/app/components/settings/SectorSection.js +13 -14
  397. package/.next/standalone/app/components/settings/TierSection.js +9 -9
  398. package/.next/standalone/app/components/settings/TitleSection.js +11 -11
  399. package/.next/standalone/app/components/settings/UsageSection.js +360 -0
  400. package/.next/standalone/app/components/ui.js +8 -8
  401. package/.next/standalone/app/globals.css +161 -5
  402. package/.next/standalone/app/import/page.js +94 -38
  403. package/.next/standalone/app/insights/page.js +220 -0
  404. package/.next/standalone/app/launch/page.js +5 -5
  405. package/.next/standalone/app/layout.js +6 -2
  406. package/.next/standalone/app/page.js +53 -53
  407. package/.next/standalone/app/paths/page.js +63 -63
  408. package/.next/standalone/app/profile/page.js +58 -58
  409. package/.next/standalone/app/queue/page.js +84 -72
  410. package/.next/standalone/app/scores/page.js +2 -2
  411. package/.next/standalone/app/settings/page.js +16 -13
  412. package/.next/standalone/app/setup/page.js +236 -133
  413. package/.next/standalone/app/social/Crm.js +63 -62
  414. package/.next/standalone/app/social/SocialHub.js +22 -22
  415. package/.next/standalone/app/social/Thread.js +7 -7
  416. package/.next/standalone/app/social/page.js +2 -2
  417. package/.next/standalone/lib/auto-connect.js +145 -0
  418. package/.next/standalone/lib/backups.js +458 -0
  419. package/.next/standalone/lib/chain-layout.js +32 -0
  420. package/.next/standalone/lib/companies.js +1 -1
  421. package/.next/standalone/lib/csv-store.js +131 -0
  422. package/.next/standalone/lib/csv.js +137 -39
  423. package/.next/standalone/lib/data-folder.js +19 -3
  424. package/.next/standalone/lib/data-import.js +5 -2
  425. package/.next/standalone/lib/db-client.js +78 -20
  426. package/.next/standalone/lib/demo.js +5 -4
  427. package/.next/standalone/lib/galaxy-export.js +9 -2
  428. package/.next/standalone/lib/galaxy-lab.js +19 -5
  429. package/.next/standalone/lib/galaxy-layouts.js +43 -0
  430. package/.next/standalone/lib/gate.js +10 -4
  431. package/.next/standalone/lib/in-progress.js +46 -0
  432. package/.next/standalone/lib/ingest.js +1 -1
  433. package/.next/standalone/lib/insights-board.js +613 -0
  434. package/.next/standalone/lib/linkedin-limits.js +240 -14
  435. package/.next/standalone/lib/liquid-glass.js +59 -0
  436. package/.next/standalone/lib/notifications.js +13 -0
  437. package/.next/standalone/lib/requests-client.js +10 -0
  438. package/.next/standalone/lib/requests.js +124 -0
  439. package/.next/standalone/lib/scan-pace.js +11 -0
  440. package/.next/standalone/lib/scan-progress.js +20 -0
  441. package/.next/standalone/lib/scan-risk.js +44 -0
  442. package/.next/standalone/lib/scan-state.js +1 -0
  443. package/.next/standalone/lib/scanner-setup.js +97 -15
  444. package/.next/standalone/lib/scraper-client.js +35 -8
  445. package/.next/standalone/lib/search-risk.js +7 -3
  446. package/.next/standalone/lib/settings-client.js +5 -3
  447. package/.next/standalone/lib/settings.js +13 -0
  448. package/.next/standalone/lib/social-store.js +3 -2
  449. package/.next/standalone/lib/synced-setting.js +46 -0
  450. package/.next/standalone/lib/theme-store.js +42 -10
  451. package/.next/standalone/lib/themes.js +111 -21
  452. package/.next/standalone/lib/usage.js +200 -0
  453. package/.next/standalone/package-lock.json +2 -2
  454. package/.next/standalone/package.json +1 -1
  455. package/.next/standalone/scripts/scrape.py +595 -11
  456. package/.next/static/chunks/02wnf8dkxegxg.js +34 -0
  457. package/.next/static/chunks/03-_esd2x_yk6.js +1 -0
  458. package/.next/static/chunks/03-demj2iy-0p.js +44 -0
  459. package/.next/static/chunks/0838_s6w-i_ik.js +1 -0
  460. package/.next/static/chunks/0_1r-3csplxnj.js +1 -0
  461. package/.next/static/chunks/0ka4prpk3w9wn.js +34 -0
  462. package/.next/static/chunks/0kscsqnvfq3-r.js +1 -0
  463. package/.next/static/chunks/0s_xxwp7z88vv.js +1 -0
  464. package/.next/static/chunks/1-nnl8amfm4yh.js +57 -0
  465. package/.next/static/chunks/112mv-com-mqa.js +21 -0
  466. package/.next/static/chunks/1bkt_hhjzvbh8.js +1 -0
  467. package/.next/static/chunks/1cmphb3kh2ers.css +3 -0
  468. package/.next/static/chunks/1d8yv3k_atka7.js +1 -0
  469. package/.next/static/chunks/{0ws7zy0w57ufi.js → 1eyajb9ntzlrl.js} +1 -1
  470. package/.next/static/chunks/1z9lb-dbcg4aa.js +1 -0
  471. package/.next/static/chunks/23hc51oa4vkhc.js +5 -0
  472. package/.next/static/chunks/27n8k9wxlz5-7.js +1 -0
  473. package/.next/static/chunks/2q9i7pcxcnph1.js +7 -0
  474. package/.next/static/chunks/2w-y83mjlpnse.js +1 -0
  475. package/.next/static/chunks/2ws1xf293j-tm.js +5 -0
  476. package/.next/static/chunks/2z1-q0_vunbql.js +2 -0
  477. package/.next/static/chunks/34g73qhayuevu.js +1 -0
  478. package/.next/static/chunks/3cqn-r-y5rrw1.js +5 -0
  479. package/.next/static/chunks/3opgg1efrx8q6.js +1 -0
  480. package/.next/static/chunks/3p51fpxxi4d5y.js +34 -0
  481. package/.next/static/chunks/3y40z6of3r9py.js +1 -0
  482. package/.next/static/chunks/403dpflln8ah5.js +1 -0
  483. package/.next/static/chunks/43pg2sursiypz.js +1 -0
  484. package/CHANGELOG.md +203 -0
  485. package/README.md +96 -50
  486. package/SECURITY.md +25 -11
  487. package/lib/auto-connect.js +145 -0
  488. package/lib/backups.js +458 -0
  489. package/lib/chain-layout.js +32 -0
  490. package/lib/companies.js +1 -1
  491. package/lib/csv-store.js +131 -0
  492. package/lib/csv.js +137 -39
  493. package/lib/data-folder.js +19 -3
  494. package/lib/data-import.js +5 -2
  495. package/lib/db-client.js +78 -20
  496. package/lib/demo.js +5 -4
  497. package/lib/galaxy-export.js +9 -2
  498. package/lib/galaxy-lab.js +19 -5
  499. package/lib/galaxy-layouts.js +43 -0
  500. package/lib/gate.js +10 -4
  501. package/lib/in-progress.js +46 -0
  502. package/lib/ingest.js +1 -1
  503. package/lib/insights-board.js +613 -0
  504. package/lib/linkedin-limits.js +240 -14
  505. package/lib/liquid-glass.js +59 -0
  506. package/lib/notifications.js +13 -0
  507. package/lib/requests-client.js +10 -0
  508. package/lib/requests.js +124 -0
  509. package/lib/scan-pace.js +11 -0
  510. package/lib/scan-progress.js +20 -0
  511. package/lib/scan-risk.js +44 -0
  512. package/lib/scan-state.js +1 -0
  513. package/lib/scanner-setup.js +97 -15
  514. package/lib/scraper-client.js +35 -8
  515. package/lib/search-risk.js +7 -3
  516. package/lib/settings-client.js +5 -3
  517. package/lib/settings.js +13 -0
  518. package/lib/social-store.js +3 -2
  519. package/lib/synced-setting.js +46 -0
  520. package/lib/theme-store.js +42 -10
  521. package/lib/themes.js +111 -21
  522. package/lib/usage.js +200 -0
  523. package/package.json +1 -1
  524. package/scripts/scrape.py +595 -11
  525. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-rnla2._.js +0 -3
  526. package/.next/standalone/.next/server/chunks/[root-of-the-server]__13dx4sd._.js +0 -8
  527. package/.next/standalone/.next/server/chunks/[root-of-the-server]__14ou7j5._.js +0 -3
  528. package/.next/standalone/.next/server/chunks/[root-of-the-server]__16iu0hv._.js +0 -3
  529. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1kbl21f._.js +0 -3
  530. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1rphsdk._.js +0 -3
  531. package/.next/standalone/.next/server/chunks/_02twlca._.js +0 -10
  532. package/.next/standalone/.next/server/chunks/lib_0851sk0._.js +0 -8
  533. package/.next/standalone/.next/server/chunks/lib_1q7p2ro._.js +0 -8
  534. package/.next/standalone/.next/server/chunks/lib_1r6l86l._.js +0 -8
  535. package/.next/standalone/.next/server/chunks/lib_db-client_15le7cw.js +0 -174
  536. package/.next/standalone/.next/server/chunks/lib_rpc_04s8mzr.js +0 -3
  537. package/.next/standalone/.next/server/chunks/lib_rpc_053z7as.js +0 -3
  538. package/.next/standalone/.next/server/chunks/lib_rpc_0b_-2te.js +0 -3
  539. package/.next/standalone/.next/server/chunks/lib_rpc_0dhbxdm.js +0 -3
  540. package/.next/standalone/.next/server/chunks/lib_rpc_0dxlk31.js +0 -3
  541. package/.next/standalone/.next/server/chunks/lib_rpc_0f8b-qc.js +0 -3
  542. package/.next/standalone/.next/server/chunks/lib_rpc_0pzie7_.js +0 -3
  543. package/.next/standalone/.next/server/chunks/lib_rpc_0r76fq_.js +0 -3
  544. package/.next/standalone/.next/server/chunks/lib_rpc_0ut7pjp.js +0 -3
  545. package/.next/standalone/.next/server/chunks/lib_rpc_15zyqaz.js +0 -3
  546. package/.next/standalone/.next/server/chunks/lib_rpc_18zpjtq.js +0 -3
  547. package/.next/standalone/.next/server/chunks/lib_rpc_1a8xkiz.js +0 -3
  548. package/.next/standalone/.next/server/chunks/lib_rpc_1e_55xo.js +0 -3
  549. package/.next/standalone/.next/server/chunks/lib_rpc_1oxfd1_.js +0 -3
  550. package/.next/standalone/.next/server/chunks/lib_rpc_1s0lod0.js +0 -3
  551. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08oxiqh._.js +0 -3
  552. package/.next/standalone/.next/server/chunks/ssr/_03l7vge._.js +0 -3
  553. package/.next/standalone/.next/server/chunks/ssr/_08g31gm._.js +0 -3
  554. package/.next/standalone/.next/server/chunks/ssr/_0gk_ofx._.js +0 -3
  555. package/.next/standalone/.next/server/chunks/ssr/_0nwsf93._.js +0 -3
  556. package/.next/standalone/.next/server/chunks/ssr/_0vho1lb._.js +0 -3
  557. package/.next/standalone/.next/server/chunks/ssr/_1-658fq._.js +0 -3
  558. package/.next/standalone/.next/server/chunks/ssr/_1bc46kz._.js +0 -3
  559. package/.next/standalone/.next/server/chunks/ssr/_1f_n00p._.js +0 -3
  560. package/.next/standalone/.next/server/chunks/ssr/_2105jz8._.js +0 -3
  561. package/.next/standalone/.next/server/chunks/ssr/app_components_0t908t-._.js +0 -3
  562. package/.next/standalone/.next/static/chunks/02pq76u7y4v9-.js +0 -22
  563. package/.next/standalone/.next/static/chunks/0cmq0exd4d0h9.js +0 -1
  564. package/.next/standalone/.next/static/chunks/0i02yxppzds1o.js +0 -1
  565. package/.next/standalone/.next/static/chunks/0m_p4k-q2qh--.js +0 -1
  566. package/.next/standalone/.next/static/chunks/0oyslj62jkubd.js +0 -1
  567. package/.next/standalone/.next/static/chunks/0vo-l8hxneba6.css +0 -3
  568. package/.next/standalone/.next/static/chunks/0yh8z2tbrc5i_.js +0 -1
  569. package/.next/standalone/.next/static/chunks/17-rhp8sg4m1b.js +0 -44
  570. package/.next/standalone/.next/static/chunks/172e10mi-tpo_.js +0 -34
  571. package/.next/standalone/.next/static/chunks/1ei5vbe2uw6fl.js +0 -1
  572. package/.next/standalone/.next/static/chunks/1f7_pl_wq7lh3.js +0 -11
  573. package/.next/standalone/.next/static/chunks/1jzbe7zdx9vbj.js +0 -2
  574. package/.next/standalone/.next/static/chunks/1m3017gp790pw.js +0 -45
  575. package/.next/standalone/.next/static/chunks/1t20e8u0st7ep.js +0 -1
  576. package/.next/standalone/.next/static/chunks/2-ch9rm27eril.js +0 -11
  577. package/.next/standalone/.next/static/chunks/2ldv-v3s9yaif.js +0 -1
  578. package/.next/standalone/.next/static/chunks/3bp284gjf7dyq.js +0 -1
  579. package/.next/standalone/.next/static/chunks/3k1f6clbn3gj3.js +0 -7
  580. package/.next/standalone/.next/static/chunks/3l4t8je6iguzc.js +0 -1
  581. package/.next/standalone/.next/static/chunks/3tplzuc9jk-tl.js +0 -1
  582. package/.next/standalone/.next/static/chunks/42m0bqr8pbovz.js +0 -11
  583. package/.next/static/chunks/02pq76u7y4v9-.js +0 -22
  584. package/.next/static/chunks/0cmq0exd4d0h9.js +0 -1
  585. package/.next/static/chunks/0i02yxppzds1o.js +0 -1
  586. package/.next/static/chunks/0m_p4k-q2qh--.js +0 -1
  587. package/.next/static/chunks/0oyslj62jkubd.js +0 -1
  588. package/.next/static/chunks/0vo-l8hxneba6.css +0 -3
  589. package/.next/static/chunks/0yh8z2tbrc5i_.js +0 -1
  590. package/.next/static/chunks/17-rhp8sg4m1b.js +0 -44
  591. package/.next/static/chunks/172e10mi-tpo_.js +0 -34
  592. package/.next/static/chunks/1ei5vbe2uw6fl.js +0 -1
  593. package/.next/static/chunks/1f7_pl_wq7lh3.js +0 -11
  594. package/.next/static/chunks/1jzbe7zdx9vbj.js +0 -2
  595. package/.next/static/chunks/1m3017gp790pw.js +0 -45
  596. package/.next/static/chunks/1t20e8u0st7ep.js +0 -1
  597. package/.next/static/chunks/2-ch9rm27eril.js +0 -11
  598. package/.next/static/chunks/2ldv-v3s9yaif.js +0 -1
  599. package/.next/static/chunks/3bp284gjf7dyq.js +0 -1
  600. package/.next/static/chunks/3k1f6clbn3gj3.js +0 -7
  601. package/.next/static/chunks/3l4t8je6iguzc.js +0 -1
  602. package/.next/static/chunks/3tplzuc9jk-tl.js +0 -1
  603. package/.next/static/chunks/42m0bqr8pbovz.js +0 -11
  604. /package/.next/standalone/.next/static/{dQUvvVSXqbkEFC3-CNcwT → 3NCyJyAPDCEYsYTwF1Ieu}/_buildManifest.js +0 -0
  605. /package/.next/standalone/.next/static/{dQUvvVSXqbkEFC3-CNcwT → 3NCyJyAPDCEYsYTwF1Ieu}/_clientMiddlewareManifest.js +0 -0
  606. /package/.next/standalone/.next/static/{dQUvvVSXqbkEFC3-CNcwT → 3NCyJyAPDCEYsYTwF1Ieu}/_ssgManifest.js +0 -0
  607. /package/.next/static/{dQUvvVSXqbkEFC3-CNcwT → 3NCyJyAPDCEYsYTwF1Ieu}/_buildManifest.js +0 -0
  608. /package/.next/static/{dQUvvVSXqbkEFC3-CNcwT → 3NCyJyAPDCEYsYTwF1Ieu}/_clientMiddlewareManifest.js +0 -0
  609. /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 220 MB. Everything the scanner needs except Google
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 copies your data into its `backups` folder before it
116
- first opens it. To take it to another computer, see
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
- ×* (click × to go back), and Outlink and Scan are hidden. Neither is ever added to your
321
- network: they last as long as the app's window is open.
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 held only
386
- in the app window's own storage, and you import it again next time.
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. Each profile photo is saved on your computer as the
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/ copies of the database from before each new version, and
417
- │ before an import, touched it
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 **Save a copy of my
432
- network**. You get one file, `Six Degrees backup <date>.sixdegrees`, with your network,
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**, choose the
439
- file and click **Import**. It's checked first, and nothing changes if it isn't a whole
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-…`), and those copies are never deleted automatically: see
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 network opened from a LinkedIn CSV isn't in the copy either: it lives in
453
- its browser tab, so import the CSV again there.
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 the time it
458
- finished (Settings → Your data shows the exact name):
459
-
460
- - `before-import-<time>.sqlite`: your network as it was.
461
- - `before-import-<time>-files/`: its profile photos (`avatars/`), the scanner's notes about
462
- it (`bridge-progress.json`, `bridge-skips.json`, `bridge-unclear.json`), and a copy of
463
- your LinkedIn budget files as they were.
464
-
465
- To put it back (there's no button for this yet):
466
-
467
- 1. Quit Six Degrees (⌘Q in the Mac app, Ctrl-C for `npx six-degrees`). Do the rest while
468
- it's closed.
469
- 2. Open the data folder (Settings → Your data → *Show in Finder*, or `~/.six-degrees`).
470
- Move these out of it, to the Trash or somewhere safe if you might want the imported
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 ten 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. |
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
- - Ten API routes are gated (`admin-delete`, `admin-update`, `delete-cluster`,
16
- `setup-profile`, `scraper`, `update`, and Settings → Your data's
17
- `data/export`, `data/import`, `data/restart`, `data/reveal`). The first four
18
- can irreversibly destroy or rewrite data, `scraper` starts processes, and
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, and `data/reveal` starts a process (Finder, or the Linux file
22
- browser, on the data folder's own path). While the server is bound to
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 sizes) changes nothing and stays open, like
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 and held for that tab only. It is never
117
- uploaded and never written to a database.
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
- // Save a copy of the network to carry to another computer: one .sixdegrees
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). It opens the data
6
- // folder itself and takes nothing from the request. Gated (lib/gate.js) like
7
- // every route that starts a process.
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}` }, { status: 500 });
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, and any
13
- // import waiting to finish. Sizes come from the file system; nothing in the
14
- // folder is read, and chrome-profile/ is only reported as there or not. A read
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 — bridge their cluster to reach D3`,
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
  }))