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
@@ -0,0 +1,46 @@
1
+ // What the app says about a circle scan that stopped partway. Blake,
2
+ // 2026-10-03: "if someone was scanned but not finished it needs to show that in
3
+ // their profile card if clicked showing resume scanner in that actual card as we
4
+ // need to have some sort of in progress ones in the scanner as well to see all
5
+ // the ones they stopped and would like to resume".
6
+ //
7
+ // The person card (app/components/Sidebar.js) and the Scan page's In progress
8
+ // card (app/components/LinkedInLimits.js PausedList) both word it from here, so
9
+ // the two never say it differently. Who is stopped partway, and where Resume
10
+ // carries on, is lib/paused.js's to decide; this only says it. No Node imports:
11
+ // the browser loads it.
12
+
13
+ /** The scan box's heading on a person card: a read that stopped partway says so first. */
14
+ export function scanBoxTitle({ resume, hasCluster }) {
15
+ if (resume) return 'SCAN IN PROGRESS';
16
+ return hasCluster ? 'CLUSTER ACTIVE' : 'CREATE CLUSTER';
17
+ }
18
+
19
+ /**
20
+ * The line by their name on the card, from GET /api/scraper?resume=<id>
21
+ * ({ nextPage, pagesRead, legacy }). null when there is nothing to carry on with.
22
+ */
23
+ export function stoppedLine(resume) {
24
+ if (!resume) return null;
25
+ const read = Number(resume.pagesRead) || 0;
26
+ return read > 0 ? `Scan stopped after page ${read}` : 'Scan stopped before its first page';
27
+ }
28
+
29
+ /**
30
+ * The In progress card's line on the Scan page, from the status answer's
31
+ * `paused` (lib/paused.js pausedList). null when nobody is. People mapped
32
+ * before 0.1.6 kept notes (`legacy`) were read to page 10 and no further, which
33
+ * is why they're here at all, so it says so.
34
+ */
35
+ export function inProgressSummary(paused = []) {
36
+ const list = Array.isArray(paused) ? paused : [];
37
+ const n = list.length;
38
+ if (!n) return null;
39
+ const legacy = list.filter((p) => p?.legacy).length;
40
+ const line = n === 1
41
+ ? '1 person stopped partway. Resume carries on from the page they stopped at.'
42
+ : `${n} people stopped partway. Resume carries on from the page each one stopped at.`;
43
+ if (!legacy) return line;
44
+ const old = n === 1 ? 'Their list was' : legacy === 1 ? '1 of them was' : `${legacy} of them were`;
45
+ return `${line} ${old} read to page 10, before whole lists were read.`;
46
+ }
package/lib/ingest.js CHANGED
@@ -89,7 +89,7 @@ export function refreshNotifications({ added = [], checked = 0, tierOf = () => n
89
89
  if (!added.length) {
90
90
  return [{
91
91
  user_id, type: 'refresh_summary', title: 'Network up to date',
92
- message: `Checked ${checked} connections — no new additions`, icon: '✓',
92
+ message: `Checked ${checked} connections: no new additions`, icon: '✓',
93
93
  }];
94
94
  }
95
95
  const out = [{
@@ -0,0 +1,613 @@
1
+ // The Insights tab: your network ranked by power, and the boards that read it
2
+ // (Blake, 2026-10-03: "stats and insights … data and insights based off their
3
+ // circles … almost no moral tie to the person … base it off value like richest
4
+ // person or highest power people … an intro perspective look at the data of
5
+ // what we have … insights and analytics that speak our language and actual
6
+ // system at hand").
7
+ //
8
+ // Everything here is counted from what the app already keeps: the rows a scan
9
+ // or an import saved, the score each was given (lib/scoring.js, never scored
10
+ // again here), the circles you've scanned and what the scanner noted about
11
+ // them. Nothing is estimated that the app doesn't already estimate, and
12
+ // nothing about money: Six Degrees never sees pay, net worth or revenue, so
13
+ // "richest" is answered with what it can see (companyPower's `big`). Each board
14
+ // says where its numbers come from in `source`, for the page to print under
15
+ // them.
16
+ //
17
+ // The pieces are the app's own, reused rather than copied:
18
+ // separationPeople 2nd-degree rows merged into people, with every way in (lib/separation.js)
19
+ // exclusiveReach who only one connection reaches (lib/brokerage.js)
20
+ // rarityOf how rare the way in is, and whether LinkedIn or your scans counted it (lib/rarity.js)
21
+ // buildCompanyIndex companies and their one industry (lib/companies.js)
22
+ // reachIndex scanned, hidden and not yet, and how far lists were read (lib/reach.js)
23
+ // scoreGuess whether a score rests on a guess (lib/score-guess.js)
24
+ // readTitle someone's current title (lib/scoring.js; lib/title-ranking.js ranks the same levels)
25
+ //
26
+ // Plain functions, no React and no Node imports: the page runs them, and
27
+ // tests/insights-board.test.mjs runs them on invented rows.
28
+
29
+ import { separationPeople, keyFor, score1, compareBridges } from './separation.js';
30
+ import { exclusiveReach } from './brokerage.js';
31
+ import { RARITY, rarityOf } from './rarity.js';
32
+ import { buildCompanyIndex, industryByKey } from './companies.js';
33
+ import { reachIndex, circleState, circleScanCost } from './reach.js';
34
+ import { scoreGuess } from './score-guess.js';
35
+ import { readTitle, companyScore, currentCompany, TOP_COMPANY } from './scoring.js';
36
+ import { SAFE_LIMITS } from './search-risk.js';
37
+
38
+ export const TIERS = ['S', 'A', 'B', 'C', 'D'];
39
+ const RARITY_KEYS = RARITY.map((r) => r.key);
40
+ const isSA = (tier) => tier === 'S' || tier === 'A';
41
+ const byName = (a, b) => String(a?.name || '').localeCompare(String(b?.name || ''));
42
+ const zeroTiers = () => ({ S: 0, A: 0, B: 0, C: 0, D: 0 });
43
+ const pct = (part, whole) => (whole ? (100 * part) / whole : 0);
44
+
45
+ /** A tie this big gets a line of its own in the table, saying why so many share one score. */
46
+ export const BAND_MIN = 10;
47
+
48
+ // The stored working (lib/scoring.js explainScore): "C-Suite / Founder (10) ·
49
+ // Meridian Media (6/10)", with "Former " or "Student · " before the title, a
50
+ // company score set by hand as "(7/10, your score)", a sector lean as
51
+ // "(6/10: 5 + 1 your sector: Dental)", and "+2 strong circle" at the end when
52
+ // a circle lifted it. The same reading as lib/score-guess.js.
53
+ const WORKING = /^(?:Former )?(?:Student · )?(.+?) \([\d.]+(?:, your ranking)?\) · (no company found|.+?) \((\d+(?:\.\d+)?)\/10([:,][^)]*)?\)/;
54
+ const BOOST = /\+(\d+(?:\.\d+)?) strong circle/;
55
+
56
+ /**
57
+ * What a row's stored working says: the title and company its score is built
58
+ * on, the company's score and whether you set it, and the circle bonus.
59
+ * Null fields when the row has no working (a CSV import, an old row).
60
+ */
61
+ export function readWorking(row) {
62
+ const why = String(row?.score_why || '');
63
+ const m = why.match(WORKING);
64
+ const boost = Number(why.match(BOOST)?.[1]) || 0;
65
+ if (!m) return { title: null, company: null, companyScore: null, yours: false, sector: false, boost };
66
+ return {
67
+ title: m[1],
68
+ company: m[2] === 'no company found' ? null : m[2],
69
+ companyScore: Number(m[3]),
70
+ yours: /, (your|sample) score/.test(m[4] || ''),
71
+ sector: /your sector/.test(m[4] || ''),
72
+ boost,
73
+ };
74
+ }
75
+
76
+ /** The title and company to print under someone's name: the role their score is built on, else what the headline says. */
77
+ export function roleLine(row) {
78
+ const w = readWorking(row);
79
+ const title = w.title || readTitle(row?.headline || '', row?.role || '').label;
80
+ const company = w.company || row?.company || currentCompany(row || {}) || null;
81
+ return { title, company };
82
+ }
83
+
84
+ // ── The base: read once per network ─────────────────────────────────────────
85
+
86
+ /**
87
+ * Everything the boards share, built once per load.
88
+ *
89
+ * @param {{ degree1?: object[], degree2?: object[], degree3?: object[], notes?: object }} input
90
+ * the rows /api/network (or a CSV import, or the sample) gives the page, and
91
+ * what the scanner noted (lib/scraper-client.js loadScanNotes)
92
+ * @returns {{ d1, second, sep, yours, circles, reach, d3, degree2, hasCircles }}
93
+ * `d1` your connections, each once; `second` the people in your scanned
94
+ * circles who aren't your connections, each once, with their routes
95
+ * (separationPeople); `circles` connection id → the rows in their circle.
96
+ */
97
+ export function boardBase({ degree1 = [], degree2 = [], degree3 = [], notes } = {}) {
98
+ const yours = new Set();
99
+ const d1 = [];
100
+ for (const row of degree1 || []) {
101
+ const key = keyFor(row);
102
+ if (yours.has(key)) continue;
103
+ yours.add(key);
104
+ d1.push(row);
105
+ }
106
+ const sep = separationPeople(degree2 || [], degree1 || []);
107
+ // Someone in a circle who is also your connection is counted once, as yours.
108
+ const second = sep.people.filter((p) => !yours.has(p.key));
109
+ const circles = new Map();
110
+ for (const row of degree2 || []) {
111
+ const id = row?.source_connection_id;
112
+ if (id == null || yours.has(keyFor(row))) continue;
113
+ let list = circles.get(id);
114
+ if (!list) circles.set(id, (list = []));
115
+ list.push(row);
116
+ }
117
+ const seen = new Set([...yours, ...second.map((p) => p.key)]);
118
+ const d3 = [];
119
+ for (const row of degree3 || []) {
120
+ const key = keyFor(row);
121
+ if (seen.has(key)) continue;
122
+ seen.add(key);
123
+ d3.push(row);
124
+ }
125
+ const reach = reachIndex(d1, degree2 || [], notes || {});
126
+ return { d1, second, sep, yours, circles, reach, d3, degree2: degree2 || [], hasCircles: second.length > 0 };
127
+ }
128
+
129
+ /** One of your connections' circle: whether it's scanned, and who's in it by tier. */
130
+ export function circleOf(base, row) {
131
+ const list = base.circles.get(row?.id) || [];
132
+ const tiers = zeroTiers();
133
+ for (const r of list) if (tiers[r.tier] !== undefined) tiers[r.tier]++;
134
+ return { state: circleState(row, base.reach), size: list.length, S: tiers.S, A: tiers.A, tiers };
135
+ }
136
+
137
+ // ── 1. The Power Index ───────────────────────────────────────────────────────
138
+
139
+ /** Power order: shown score, then yours before 2nd degree, then most ways in, then the best way in, then name. */
140
+ function compareEntries(a, b) {
141
+ return b.score - a.score
142
+ || a.degree - b.degree
143
+ || b.waysIn - a.waysIn
144
+ || (a.routes[0]?.bridge && b.routes[0]?.bridge ? compareBridges(a.routes[0].bridge, b.routes[0].bridge) : 0)
145
+ || byName(a.row, b.row)
146
+ || (a.key < b.key ? -1 : a.key > b.key ? 1 : 0);
147
+ }
148
+
149
+ /**
150
+ * Everyone within two steps of you, each once, by power: your connections and
151
+ * the people in the circles you've scanned. A 2nd-degree person counts once
152
+ * however many of your connections know them (lib/separation.js).
153
+ *
154
+ * Ranks are competition ranks on the shown score alone ("#10=" for everyone at
155
+ * 7.8), worked out once for the whole list so a filter never renumbers anyone.
156
+ * A tie of BAND_MIN or more is a `band`: how many share the score, and the
157
+ * working most of them share, so the table can say why ("648 people share
158
+ * 7.8 …"). Inside a tie your connections come first, then most ways in.
159
+ *
160
+ * @returns {{ people, bands, counts, total, source }}
161
+ * each person: { key, row, degree, score, tier, rank, tied, waysIn, routes,
162
+ * rarity, circle, boost, haystack }
163
+ */
164
+ export function powerIndex(base) {
165
+ const people = [];
166
+ for (const row of base.d1) {
167
+ const circle = circleOf(base, row);
168
+ people.push({
169
+ key: keyFor(row), row, degree: 1, score: score1(row), tier: row.tier, waysIn: 0, routes: [], rarity: null,
170
+ circle, boost: readWorking(row).boost,
171
+ haystack: [row.name, row.headline, row.company, row.role].filter(Boolean).join('\n').toLowerCase(),
172
+ });
173
+ }
174
+ for (const p of base.second) {
175
+ people.push({
176
+ key: p.key, row: p.person, degree: 2, score: p.score, tier: p.tier, waysIn: p.waysIn, routes: p.routes,
177
+ rarity: rarityOf(p.person, p.waysIn), circle: null, boost: 0, haystack: p.haystack,
178
+ });
179
+ }
180
+ people.sort(compareEntries);
181
+
182
+ const bands = [];
183
+ for (let i = 0; i < people.length; i++) {
184
+ const p = people[i], prev = people[i - 1];
185
+ const same = prev && prev.score === p.score;
186
+ p.rank = same ? prev.rank : i + 1;
187
+ p.tied = false;
188
+ if (same) { p.tied = true; prev.tied = true; }
189
+ }
190
+ // The ties big enough for a line of their own, with the working most of them share.
191
+ for (let i = 0; i < people.length;) {
192
+ let j = i;
193
+ while (j < people.length && people[j].score === people[i].score) j++;
194
+ if (j - i >= BAND_MIN) bands.push(bandFor(people.slice(i, j), i));
195
+ i = j;
196
+ }
197
+
198
+ const counts = { degree: { 1: 0, 2: 0 }, tiers: zeroTiers(), rarity: Object.fromEntries(RARITY_KEYS.map((k) => [k, 0])) };
199
+ for (const p of people) {
200
+ counts.degree[p.degree]++;
201
+ if (counts.tiers[p.tier] !== undefined) counts.tiers[p.tier]++;
202
+ if (p.rarity) counts.rarity[p.rarity.key]++;
203
+ }
204
+ return {
205
+ people, bands, counts, total: people.length,
206
+ source: 'Power is title × company weight, plus up to +1.5 for named honours and up to +2 for a strong circle. '
207
+ + 'Read from headlines people write themselves. Rarity is LinkedIn’s mutual count where a scan read one, '
208
+ + 'else the ways in your scans saw (marked +, which can only go up).',
209
+ };
210
+ }
211
+
212
+ /** A tie of many: how many, where it starts, and the working most of them share. */
213
+ function bandFor(group, start) {
214
+ const shared = new Map();
215
+ let boosted = 0;
216
+ for (const p of group) {
217
+ const w = readWorking(p.row);
218
+ if (w.boost) boosted++;
219
+ if (!w.title || w.companyScore == null) continue;
220
+ const k = `${w.title}|${w.companyScore}`;
221
+ const s = shared.get(k) || { title: w.title, companyScore: w.companyScore, count: 0 };
222
+ s.count++;
223
+ shared.set(k, s);
224
+ }
225
+ const top = [...shared.values()].sort((a, b) => b.count - a.count || a.title.localeCompare(b.title))[0] || null;
226
+ const yours = group.filter((p) => p.degree === 1).length;
227
+ return { score: group[0].score, rank: group[0].rank, start, count: group.length, yours, boosted, common: top };
228
+ }
229
+
230
+ /**
231
+ * The band's sentence, in two parts so the page can set the first in bold:
232
+ * { head: "648 people share 7.8.", rest: "Every one is C-Suite / Founder at a company scored 6." }
233
+ */
234
+ export function bandText(band) {
235
+ const n = (x) => x.toLocaleString('en-US');
236
+ const head = `${n(band.count)} people share ${band.score.toFixed(1)}.`;
237
+ const c = band.common;
238
+ if (!c) return { head, rest: '' };
239
+ const what = `${c.title} at a company scored ${c.companyScore}`;
240
+ const rest = c.count === band.count ? `Every one is ${what}.`
241
+ : c.count * 2 > band.count ? `Most are ${what} (${n(c.count)} of them).`
242
+ : `The most common is ${what} (${n(c.count)} of them).`;
243
+ return { head, rest };
244
+ }
245
+
246
+ /**
247
+ * The Power Index as filtered on screen. Ranks stay the whole list's.
248
+ * @param {{ degree?: 'all'|1|2, tiers?: Set, rarities?: Set, query?: string }} f
249
+ * tiers and rarities are AND, as lib/rarity.js passes() has them; a rarity
250
+ * filter keeps 2nd-degree people only, since your connections have none.
251
+ */
252
+ export function filterIndex(index, { degree = 'all', tiers = new Set(), rarities = new Set(), query = '' } = {}) {
253
+ const q = String(query || '').trim().toLowerCase();
254
+ return index.people.filter((p) => (degree === 'all' || p.degree === Number(degree))
255
+ && (!tiers.size || tiers.has(p.tier))
256
+ && (!rarities.size || (p.rarity && rarities.has(p.rarity.key)))
257
+ && (!q || p.haystack.includes(q)));
258
+ }
259
+
260
+ // ── 2. Kingmakers ───────────────────────────────────────────────────────────
261
+
262
+ /**
263
+ * Your connections by the S and A people in their circle: the doors with the
264
+ * most power behind them. A title says what someone holds; a circle says what
265
+ * they can open, so a B-tier connection can top this.
266
+ * @returns {{ list: [{ row, size, S, A, SA, share }], scanned, source }}
267
+ */
268
+ export function kingmakers(base) {
269
+ const byId = new Map(base.d1.map((r) => [r.id, r]));
270
+ const list = [];
271
+ for (const [id, rows] of base.circles) {
272
+ const row = byId.get(id);
273
+ if (!row) continue;
274
+ const c = circleOf(base, row);
275
+ list.push({ row, size: c.size, S: c.S, A: c.A, SA: c.S + c.A, share: c.size ? (c.S + c.A) / c.size : 0, tiers: c.tiers, rows });
276
+ }
277
+ list.sort((a, b) => b.SA - a.SA || b.S - a.S || score1(b.row) - score1(a.row) || byName(a.row, b.row));
278
+ return {
279
+ list, scanned: list.length,
280
+ source: `From the ${list.length.toLocaleString('en-US')} circle${list.length === 1 ? '' : 's'} you’ve scanned: the S and A people in each, graded on your curve. Your own connections in a circle aren’t counted.`,
281
+ };
282
+ }
283
+
284
+ // ── 3. Gatekeepers ──────────────────────────────────────────────────────────
285
+
286
+ /**
287
+ * Who your S and A reach hangs on. An S or A person in your 2nd degree with one
288
+ * way in is credited to the connection who is that way (lib/brokerage.js
289
+ * exclusiveReach, run on the S and A only): lose them and those people drop
290
+ * off your map. The top three's share credits each S and A person evenly to
291
+ * everyone who reaches them, so the three never count anyone twice.
292
+ * @returns {{ list: [{ row, onlySA, onlyS, credit, size }], totalSA, onlySA, onlyShare, top3, top3Share, source }}
293
+ */
294
+ export function gatekeepers(base) {
295
+ const saKeys = new Set(base.second.filter((p) => isSA(p.tier)).map((p) => p.key));
296
+ const sKeys = new Set(base.second.filter((p) => p.tier === 'S').map((p) => p.key));
297
+ const saRows = base.degree2.filter((r) => saKeys.has(keyFor(r)));
298
+ const sa = exclusiveReach(saRows, base.d1);
299
+ const s = exclusiveReach(saRows.filter((r) => sKeys.has(keyFor(r))), base.d1);
300
+ const byId = new Map(base.d1.map((r) => [r.id, r]));
301
+ const list = [];
302
+ for (const [id, r] of sa) {
303
+ const row = byId.get(id);
304
+ if (!row) continue; // a way in the app can't name stays uncredited, never dropped from the totals
305
+ list.push({ row, onlySA: r.only, onlyS: s.get(id)?.only || 0, credit: r.reach, size: (base.circles.get(id) || []).length });
306
+ }
307
+ list.sort((a, b) => b.onlySA - a.onlySA || b.onlyS - a.onlyS || score1(b.row) - score1(a.row) || byName(a.row, b.row));
308
+ const totalSA = saKeys.size;
309
+ const onlySA = base.second.filter((p) => isSA(p.tier) && p.waysIn === 1).length;
310
+ const top3 = [...list].sort((a, b) => b.credit - a.credit || byName(a.row, b.row)).slice(0, 3)
311
+ .map((g) => ({ row: g.row, credit: g.credit, share: pct(g.credit, totalSA) }));
312
+ return {
313
+ list, totalSA, onlySA, onlyShare: pct(onlySA, totalSA), top3, top3Share: top3.reduce((t, g) => t + g.share, 0),
314
+ source: `Ways in seen across your ${base.circles.size.toLocaleString('en-US')} scanned circle${base.circles.size === 1 ? '' : 's'}. `
315
+ + 'For the share, each S and A person is split evenly between the connections who reach them. Every new circle can only add ways in, so these numbers fall as you scan.',
316
+ };
317
+ }
318
+
319
+ // ── 4. Hidden giants ────────────────────────────────────────────────────────
320
+
321
+ /**
322
+ * S-tier people with one way in: the connection who knows them is the only
323
+ * door you have. Rarity says whether that "one" is LinkedIn's own mutual count
324
+ * or the ways in your scans saw, which can only be a floor.
325
+ * @returns {{ list: [{ row, score, via, from, count }], count, ofS, fromLinkedIn, fromScans, source }}
326
+ */
327
+ export function hiddenGiants(base) {
328
+ const S = base.second.filter((p) => p.tier === 'S');
329
+ const list = [];
330
+ for (const p of S) {
331
+ const r = rarityOf(p.person, p.waysIn);
332
+ if (r.key !== 'only') continue;
333
+ list.push({ key: p.key, row: p.person, score: p.score, via: p.routes[0]?.bridge || null, viaId: p.routes[0]?.id ?? null, from: r.from, count: r.count });
334
+ }
335
+ list.sort((a, b) => b.score - a.score || byName(a.row, b.row));
336
+ const fromLinkedIn = list.filter((h) => h.from === 'linkedin').length;
337
+ return {
338
+ list, count: list.length, ofS: S.length, fromLinkedIn, fromScans: list.length - fromLinkedIn,
339
+ source: `Of your ${S.length.toLocaleString('en-US')} S-tier people one step out. ${fromLinkedIn.toLocaleString('en-US')} from LinkedIn’s own mutual count, `
340
+ + `${(list.length - fromLinkedIn).toLocaleString('en-US')} from the ways in your scans saw, which can only go up.`,
341
+ };
342
+ }
343
+
344
+ // ── 5. Tier × rarity ────────────────────────────────────────────────────────
345
+
346
+ /** Your 2nd degree by tier and rarity, and how many counts came from LinkedIn and how many from your scans. */
347
+ export function tierByRarity(base) {
348
+ const grid = Object.fromEntries(TIERS.map((t) => [t, Object.fromEntries(RARITY_KEYS.map((k) => [k, 0]))]));
349
+ const from = { linkedin: 0, scans: 0 };
350
+ for (const p of base.second) {
351
+ const r = rarityOf(p.person, p.waysIn);
352
+ if (grid[p.tier]) grid[p.tier][r.key]++;
353
+ from[r.from]++;
354
+ }
355
+ return {
356
+ grid, from,
357
+ source: 'Rarity bands: Only way in 1, Rare 2 to 3, Uncommon 4 to 10, Common 11 to 30, Warm 31 or more mutual connections. '
358
+ + `${from.linkedin.toLocaleString('en-US')} counts are LinkedIn’s own, ${from.scans.toLocaleString('en-US')} the ways in your scans saw.`,
359
+ };
360
+ }
361
+
362
+ // ── 6. Untapped ─────────────────────────────────────────────────────────────
363
+
364
+ /**
365
+ * S and A people in your 2nd degree with no request out, from the one list of
366
+ * requests every view reads (lib/requests-client.js hasRequest, passed in as
367
+ * `asked`).
368
+ * @param asked (row) => boolean
369
+ * @returns {{ S, A, total, asked, askedSA, source }}
370
+ */
371
+ export function untapped(base, asked = () => false) {
372
+ let S = 0, A = 0, n = 0, nSA = 0;
373
+ for (const p of base.second) {
374
+ const out = asked(p.person);
375
+ if (out) { n++; if (isSA(p.tier)) nSA++; continue; }
376
+ if (p.tier === 'S') S++;
377
+ else if (p.tier === 'A') A++;
378
+ }
379
+ return {
380
+ S, A, total: S + A, asked: n, askedSA: nSA,
381
+ source: `Requests marked sent in Six Degrees: ${n.toLocaleString('en-US')} to people in your 2nd degree. A request sent on LinkedIn alone isn’t known here.`,
382
+ };
383
+ }
384
+
385
+ // ── 7. The title ladder ─────────────────────────────────────────────────────
386
+
387
+ // lib/scoring.js LEVELS, grouped into the rungs people say: C-suite and
388
+ // founders (and their equals in government and the services), owners, VPs and
389
+ // partners, directors, managers, senior individual contributors, entry level.
390
+ export const LADDER = [
391
+ { key: 'csuite', label: 'C-suite / Founder', levels: ['csuite', 'govLeader', 'seniorGeneral'] },
392
+ { key: 'owner', label: 'Owner', levels: ['owner'] },
393
+ { key: 'vp', label: 'VP / Partner / GM', levels: ['vp', 'dean', 'govSenior', 'judge', 'general', 'audience10m'] },
394
+ { key: 'director', label: 'Director / Head', levels: ['director', 'professor', 'govOfficial', 'colonel', 'audience1m'] },
395
+ { key: 'manager', label: 'Manager / Lead', levels: ['manager', 'associateProfessor', 'ltColonel', 'seniorEnlisted', 'audience100k'] },
396
+ { key: 'senior', label: 'Senior IC', levels: ['senior', 'assistantProfessor', 'nco', 'major'] },
397
+ { key: 'ic', label: 'IC / Entry', levels: ['ic'] },
398
+ { key: 'unknown', label: 'Title unclear', levels: ['unknown'] },
399
+ { key: 'early', label: 'Intern / Student', levels: ['intern', 'student'] },
400
+ ];
401
+ const RUNG = new Map(LADDER.flatMap((r) => r.levels.map((l) => [l, r.key])));
402
+ /** Who decides: the top three rungs. */
403
+ export const DECIDES = ['csuite', 'owner', 'vp'];
404
+
405
+ /**
406
+ * Everyone within two steps by their current title (readTitle: the first
407
+ * current role their headline names), yours and 2nd degree apart.
408
+ * @returns {{ rungs: [{ key, label, d1, d2, total }], decide, decideYours, source }}
409
+ */
410
+ export function titleLadder(base) {
411
+ const rungs = new Map(LADDER.map((r) => [r.key, { key: r.key, label: r.label, d1: 0, d2: 0, total: 0 }]));
412
+ const add = (row, d) => {
413
+ const k = RUNG.get(readTitle(row?.headline || '', row?.role || '').key) || 'unknown';
414
+ const r = rungs.get(k);
415
+ r[d]++;
416
+ r.total++;
417
+ };
418
+ for (const row of base.d1) add(row, 'd1');
419
+ for (const p of base.second) add(p.person, 'd2');
420
+ const list = [...rungs.values()];
421
+ const decide = DECIDES.reduce((t, k) => t + rungs.get(k).total, 0);
422
+ const decideYours = DECIDES.reduce((t, k) => t + rungs.get(k).d1, 0);
423
+ return {
424
+ rungs: list, decide, decideYours,
425
+ source: 'Each person’s current title, read from their headline. Headlines are written by the people themselves.',
426
+ };
427
+ }
428
+
429
+ // ── 8. Company power ────────────────────────────────────────────────────────
430
+
431
+ /**
432
+ * Every company someone within two steps works at now, with the power of
433
+ * everyone there added up, its S and A, and its ways in: your connections
434
+ * there, and each connection whose circle holds someone there (as
435
+ * lib/companies.js waysInto counts them, from the routes already merged).
436
+ *
437
+ * A company's score is the one the people there were scored with (their
438
+ * stored working), else the model's for a company nobody's score is built on.
439
+ * `big` answers "richest?" as far as the app honestly can: the people whose
440
+ * score is built on a company scored TOP_COMPANY (8, Fortune 500 scale) or more.
441
+ * @returns {{ list, count, big: { people, companies }, estimated, source, bigSource }}
442
+ */
443
+ export function companyPower(base) {
444
+ const routesOf = new Map(base.second.map((p) => [p.key, p.routes]));
445
+ const rows = [...base.d1, ...base.second.map((p) => p.person)];
446
+ const index = buildCompanyIndex(rows);
447
+ const list = [];
448
+ for (const co of index.values()) {
449
+ let total = 0;
450
+ const via = new Map();
451
+ const scores = new Map();
452
+ let yours = false;
453
+ for (const r of co.people) {
454
+ total += score1(r);
455
+ if (r.degree !== 1) {
456
+ for (const route of routesOf.get(keyFor(r)) || []) {
457
+ if (!route.bridge) continue;
458
+ const v = via.get(route.id) || { bridge: route.bridge, people: 0 };
459
+ v.people++;
460
+ via.set(route.id, v);
461
+ }
462
+ }
463
+ const w = readWorking(r);
464
+ if (w.company === co.name && w.companyScore != null) {
465
+ scores.set(w.companyScore, (scores.get(w.companyScore) || 0) + 1);
466
+ if (w.yours) yours = true;
467
+ }
468
+ }
469
+ const stored = [...scores.entries()].sort((a, b) => b[1] - a[1] || b[0] - a[0])[0]?.[0];
470
+ const model = companyScore(co.name, { headcount: co.people.length, industry: co.industry.key });
471
+ const source = yours ? 'yours' : ['known', 'data'].includes(model.source) ? model.source : 'estimate';
472
+ const bridges = [...via.values()].sort((a, b) => b.people - a.people || compareBridges(a.bridge, b.bridge));
473
+ list.push({
474
+ name: co.name, people: co.people.length, d1: co.d1, d2: co.d2, S: co.S, A: co.A, total: Math.round(total * 10) / 10,
475
+ waysIn: co.d1 + via.size, bridges, industry: co.industry, score: stored ?? model.score, scoreSource: source,
476
+ });
477
+ }
478
+ list.sort((a, b) => b.total - a.total || b.S - a.S || a.name.localeCompare(b.name));
479
+ // "Richest?": the people whose score rests on a big company, and those companies.
480
+ const bigNames = new Set();
481
+ let bigPeople = 0;
482
+ for (const r of rows) {
483
+ if (!(Number(r.company_prestige_score) >= TOP_COMPANY)) continue;
484
+ bigPeople++;
485
+ const name = readWorking(r).company || currentCompany(r);
486
+ if (name) bigNames.add(name);
487
+ }
488
+ const estimated = list.filter((c) => c.scoreSource === 'estimate').length;
489
+ return {
490
+ list, count: list.length, big: { people: bigPeople, companies: bigNames.size }, estimated,
491
+ source: 'Total power adds up everyone within two steps who works there now, each once. '
492
+ + `${estimated.toLocaleString('en-US')} of ${list.length.toLocaleString('en-US')} company scores are estimated from how many of your people work there: no list knows them and you haven’t scored them.`,
493
+ bigSource: 'Company scale comes from the curated list and the public company dataset: 8 is Fortune 500 scale, about $20B or 20,000 staff. Scores you set count too.',
494
+ };
495
+ }
496
+
497
+ // ── 9. Industries ───────────────────────────────────────────────────────────
498
+
499
+ /**
500
+ * The companies by industry (each company's one industry, as scoring has it):
501
+ * people, S and A, power added up, and each industry's share of your S and A.
502
+ * @param companies companyPower(base), so the index is built once
503
+ */
504
+ export function industries(companies) {
505
+ const by = new Map();
506
+ for (const c of companies.list) {
507
+ const k = c.industry.key;
508
+ const e = by.get(k) || { key: k, label: c.industry.label, color: industryByKey(k).color, people: 0, S: 0, A: 0, total: 0, companies: 0 };
509
+ e.people += c.people; e.S += c.S; e.A += c.A; e.total += c.total; e.companies++;
510
+ by.set(k, e);
511
+ }
512
+ const list = [...by.values()].map((e) => ({ ...e, total: Math.round(e.total) }))
513
+ .sort((a, b) => (b.S + b.A) - (a.S + a.A) || b.total - a.total || a.label.localeCompare(b.label));
514
+ const SA = list.reduce((t, e) => t + e.S + e.A, 0);
515
+ for (const e of list) e.share = pct(e.S + e.A, SA);
516
+ return {
517
+ list, SA,
518
+ source: 'Industry is inferred from company names, then from what most people there say in their headlines. Unclear stays unclear.',
519
+ };
520
+ }
521
+
522
+ // ── 10. Coverage ────────────────────────────────────────────────────────────
523
+
524
+ /**
525
+ * What's scanned and what's left: your connections' circles as scanned,
526
+ * hidden (they keep their list private) or not yet, by tier; how far each
527
+ * scanned list was read (the scanner's notes, lib/reach.js); and the strongest
528
+ * circles not scanned yet, with what scanning them asks of LinkedIn
529
+ * (circleScanCost: one profile view and at most 100 searches each).
530
+ * @param {{ daily?: number, pace?: string, next?: number }} opts your daily search budget and speed, when known
531
+ */
532
+ export function coverage(base, { daily = SAFE_LIMITS.daily, pace = 'fast', next = 5 } = {}) {
533
+ const counts = { scanned: 0, hidden: 0, todo: 0 };
534
+ const byTier = Object.fromEntries(TIERS.map((t) => [t, { scanned: 0, hidden: 0, todo: 0, total: 0 }]));
535
+ const lists = { full: 0, partial: 0, unknown: 0 };
536
+ const todo = [];
537
+ for (const row of base.d1) {
538
+ const state = circleState(row, base.reach);
539
+ counts[state]++;
540
+ const t = byTier[row.tier];
541
+ if (t) { t[state]++; t.total++; }
542
+ if (state === 'todo') todo.push(row);
543
+ if (state !== 'scanned') continue;
544
+ const list = row.profile_url ? base.reach.lists?.get(keyFor(row)) : null;
545
+ if (!list) lists.unknown++;
546
+ else if (list.more) lists.partial++;
547
+ else lists.full++;
548
+ }
549
+ todo.sort((a, b) => score1(b) - score1(a) || byName(a, b));
550
+ const each = circleScanCost(100, pace);
551
+ const strongest = todo.slice(0, next);
552
+ const searches = each.searches * strongest.length;
553
+ const sizes = [...base.circles.values()].map((rows) => rows.length).sort((a, b) => a - b);
554
+ const budget = Math.max(1, Number(daily) || SAFE_LIMITS.daily);
555
+ return {
556
+ ...counts, total: base.d1.length, byTier, lists, strongest, each,
557
+ nextSearches: searches, nextDays: Math.ceil(searches / budget), daily: budget,
558
+ todoS: byTier.S.todo, todoSA: byTier.S.todo + byTier.A.todo,
559
+ perCircle: counts.scanned ? Math.round(base.second.length / counts.scanned) : 0,
560
+ medianCircle: sizes.length ? sizes[Math.floor(sizes.length / 2)] : 0,
561
+ source: `Each circle is one profile view and at most ${each.searches} searches, about ${each.minutes} minutes; most lists end sooner. `
562
+ + 'How far each list was read is the scanner’s own note; circles scanned before it kept one say “not recorded”.',
563
+ };
564
+ }
565
+
566
+ // ── 11. How sure ────────────────────────────────────────────────────────────
567
+
568
+ /**
569
+ * How much of the ranking rests on a guess (lib/score-guess.js): a headline
570
+ * with no title the rules read, or a company no list knows and you haven't
571
+ * scored. And the biggest tie, since a guessed company score is why so many
572
+ * people share one number.
573
+ * @param index powerIndex(base)
574
+ */
575
+ export function howSure(index) {
576
+ const g = { title: 0, company: 0, both: 0, never: 0, guessed: 0 };
577
+ for (const p of index.people) {
578
+ const why = scoreGuess(p.row);
579
+ if (!why) continue;
580
+ g.guessed++;
581
+ if (why.never) g.never++;
582
+ else if (why.title && why.company) g.both++;
583
+ else if (why.title) g.title++;
584
+ else g.company++;
585
+ }
586
+ // The highest score many people share (what decides the top of the table), and the biggest tie anywhere.
587
+ const top = index.bands[0] || null;
588
+ const biggest = [...index.bands].sort((a, b) => b.count - a.count || b.score - a.score)[0] || null;
589
+ return {
590
+ ...g, total: index.total, share: pct(g.guessed, index.total),
591
+ tie: top ? { score: top.score, count: top.count, rank: top.rank } : null,
592
+ biggest: biggest ? { score: biggest.score, count: biggest.count } : null,
593
+ source: 'A score is a guess when the headline names no title the app can read, or a company no list knows and you haven’t scored. Scoring the companies you know on the Scores tab firms them up.',
594
+ };
595
+ }
596
+
597
+ // ── 12. Reach and tiers, for the report's opening ───────────────────────────
598
+
599
+ /** How many people within two steps, by degree and tier, each once. */
600
+ export function reachSummary(base) {
601
+ const d1 = zeroTiers(), d2 = zeroTiers();
602
+ for (const r of base.d1) if (d1[r.tier] !== undefined) d1[r.tier]++;
603
+ for (const p of base.second) if (d2[p.tier] !== undefined) d2[p.tier]++;
604
+ const rowsSeen = base.degree2.filter((r) => !base.yours.has(keyFor(r))).length;
605
+ return {
606
+ d1: base.d1.length, d2: base.second.length, d3: base.d3.length, total: base.d1.length + base.second.length,
607
+ circles: base.circles.size, tiers: { d1, d2 }, sharedRows: Math.max(0, rowsSeen - base.second.length),
608
+ source: 'Each person counted once, at their nearest degree. Someone two of your connections know counts once.',
609
+ };
610
+ }
611
+
612
+ /** The share of a list, as a whole percent, for the page's words. */
613
+ export const percent = (part, whole) => Math.round(pct(part, whole));