six-degrees 0.2.0 → 0.3.0-beta.1

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 (478) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +10 -0
  3. package/.next/standalone/.next/build-manifest.json +3 -3
  4. package/.next/standalone/.next/prerender-manifest.json +39 -11
  5. package/.next/standalone/.next/required-server-files.json +4 -1
  6. package/.next/standalone/.next/routes-manifest.json +60 -0
  7. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  17. package/.next/standalone/.next/server/app/_not-found.rsc +11 -11
  18. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +11 -11
  19. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +9 -9
  20. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  21. package/.next/standalone/.next/server/app/api/admin-delete/route.js +3 -2
  22. package/.next/standalone/.next/server/app/api/admin-delete/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/admin-update/route.js +3 -2
  24. package/.next/standalone/.next/server/app/api/admin-update/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/bridges/route.js +3 -2
  26. package/.next/standalone/.next/server/app/api/bridges/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/bulk-import/route.js +3 -2
  28. package/.next/standalone/.next/server/app/api/bulk-import/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/company-scores/legacy/route/app-paths-manifest.json +3 -0
  30. package/.next/standalone/.next/server/app/api/company-scores/legacy/route/build-manifest.json +12 -0
  31. package/.next/standalone/.next/server/app/api/company-scores/legacy/route/server-reference-manifest.json +4 -0
  32. package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js +9 -0
  33. package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js.map +5 -0
  34. package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js.nft.json +1 -0
  35. package/.next/standalone/.next/server/app/api/company-scores/legacy/route_client-reference-manifest.js +3 -0
  36. package/.next/standalone/.next/server/app/api/company-scores/route.js +3 -2
  37. package/.next/standalone/.next/server/app/api/company-scores/route.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/api/connections/route.js +3 -2
  39. package/.next/standalone/.next/server/app/api/connections/route.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/api/data/export/route/app-paths-manifest.json +3 -0
  41. package/.next/standalone/.next/server/app/api/data/export/route/build-manifest.json +12 -0
  42. package/.next/standalone/.next/server/app/api/data/export/route/server-reference-manifest.json +4 -0
  43. package/.next/standalone/.next/server/app/api/data/export/route.js +7 -0
  44. package/.next/standalone/.next/server/app/api/data/export/route.js.map +5 -0
  45. package/.next/standalone/.next/server/app/api/data/export/route.js.nft.json +1 -0
  46. package/.next/standalone/.next/server/app/api/data/export/route_client-reference-manifest.js +3 -0
  47. package/.next/standalone/.next/server/app/api/data/import/route/app-paths-manifest.json +3 -0
  48. package/.next/standalone/.next/server/app/api/data/import/route/build-manifest.json +12 -0
  49. package/.next/standalone/.next/server/app/api/data/import/route/server-reference-manifest.json +4 -0
  50. package/.next/standalone/.next/server/app/api/data/import/route.js +8 -0
  51. package/.next/standalone/.next/server/app/api/data/import/route.js.map +5 -0
  52. package/.next/standalone/.next/server/app/api/data/import/route.js.nft.json +1 -0
  53. package/.next/standalone/.next/server/app/api/data/import/route_client-reference-manifest.js +3 -0
  54. package/.next/standalone/.next/server/app/api/data/restart/route/app-paths-manifest.json +3 -0
  55. package/.next/standalone/.next/server/app/api/data/restart/route/build-manifest.json +12 -0
  56. package/.next/standalone/.next/server/app/api/data/restart/route/server-reference-manifest.json +4 -0
  57. package/.next/standalone/.next/server/app/api/data/restart/route.js +8 -0
  58. package/.next/standalone/.next/server/app/api/data/restart/route.js.map +5 -0
  59. package/.next/standalone/.next/server/app/api/data/restart/route.js.nft.json +1 -0
  60. package/.next/standalone/.next/server/app/api/data/restart/route_client-reference-manifest.js +3 -0
  61. package/.next/standalone/.next/server/app/api/data/reveal/route/app-paths-manifest.json +3 -0
  62. package/.next/standalone/.next/server/app/api/data/reveal/route/build-manifest.json +12 -0
  63. package/.next/standalone/.next/server/app/api/data/reveal/route/server-reference-manifest.json +4 -0
  64. package/.next/standalone/.next/server/app/api/data/reveal/route.js +7 -0
  65. package/.next/standalone/.next/server/app/api/data/reveal/route.js.map +5 -0
  66. package/.next/standalone/.next/server/app/api/data/reveal/route.js.nft.json +1 -0
  67. package/.next/standalone/.next/server/app/api/data/reveal/route_client-reference-manifest.js +3 -0
  68. package/.next/standalone/.next/server/app/api/data/route/app-paths-manifest.json +3 -0
  69. package/.next/standalone/.next/server/app/api/data/route/build-manifest.json +12 -0
  70. package/.next/standalone/.next/server/app/api/data/route/server-reference-manifest.json +4 -0
  71. package/.next/standalone/.next/server/app/api/data/route.js +7 -0
  72. package/.next/standalone/.next/server/app/api/data/route.js.map +5 -0
  73. package/.next/standalone/.next/server/app/api/data/route.js.nft.json +1 -0
  74. package/.next/standalone/.next/server/app/api/data/route_client-reference-manifest.js +3 -0
  75. package/.next/standalone/.next/server/app/api/delete-cluster/route.js +3 -2
  76. package/.next/standalone/.next/server/app/api/delete-cluster/route.js.nft.json +1 -1
  77. package/.next/standalone/.next/server/app/api/ingest/route.js +2 -2
  78. package/.next/standalone/.next/server/app/api/ingest/route.js.nft.json +1 -1
  79. package/.next/standalone/.next/server/app/api/network/route.js +3 -2
  80. package/.next/standalone/.next/server/app/api/network/route.js.nft.json +1 -1
  81. package/.next/standalone/.next/server/app/api/notifications/route.js +3 -2
  82. package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  83. package/.next/standalone/.next/server/app/api/outreach/route.js +3 -2
  84. package/.next/standalone/.next/server/app/api/outreach/route.js.nft.json +1 -1
  85. package/.next/standalone/.next/server/app/api/queue/route.js +3 -2
  86. package/.next/standalone/.next/server/app/api/queue/route.js.nft.json +1 -1
  87. package/.next/standalone/.next/server/app/api/scraper/route.js +3 -2
  88. package/.next/standalone/.next/server/app/api/scraper/route.js.nft.json +1 -1
  89. package/.next/standalone/.next/server/app/api/settings/route/app-paths-manifest.json +3 -0
  90. package/.next/standalone/.next/server/app/api/settings/route/build-manifest.json +12 -0
  91. package/.next/standalone/.next/server/app/api/settings/route/server-reference-manifest.json +4 -0
  92. package/.next/standalone/.next/server/app/api/settings/route.js +9 -0
  93. package/.next/standalone/.next/server/app/api/settings/route.js.map +5 -0
  94. package/.next/standalone/.next/server/app/api/settings/route.js.nft.json +1 -0
  95. package/.next/standalone/.next/server/app/api/settings/route_client-reference-manifest.js +3 -0
  96. package/.next/standalone/.next/server/app/api/settings/sector-preview/route/app-paths-manifest.json +3 -0
  97. package/.next/standalone/.next/server/app/api/settings/sector-preview/route/build-manifest.json +12 -0
  98. package/.next/standalone/.next/server/app/api/settings/sector-preview/route/server-reference-manifest.json +4 -0
  99. package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js +8 -0
  100. package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js.map +5 -0
  101. package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js.nft.json +1 -0
  102. package/.next/standalone/.next/server/app/api/settings/sector-preview/route_client-reference-manifest.js +3 -0
  103. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route/app-paths-manifest.json +3 -0
  104. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route/build-manifest.json +12 -0
  105. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route/server-reference-manifest.json +4 -0
  106. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js +8 -0
  107. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js.map +5 -0
  108. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js.nft.json +1 -0
  109. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route_client-reference-manifest.js +3 -0
  110. package/.next/standalone/.next/server/app/api/setup-profile/route.js +3 -2
  111. package/.next/standalone/.next/server/app/api/setup-profile/route.js.nft.json +1 -1
  112. package/.next/standalone/.next/server/app/api/unlock/route.js +3 -2
  113. package/.next/standalone/.next/server/app/api/unlock/route.js.nft.json +1 -1
  114. package/.next/standalone/.next/server/app/api/update/route.js +1 -1
  115. package/.next/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  116. package/.next/standalone/.next/server/app/api/update-images/route.js +3 -2
  117. package/.next/standalone/.next/server/app/api/update-images/route.js.nft.json +1 -1
  118. package/.next/standalone/.next/server/app/api/users/route.js +3 -2
  119. package/.next/standalone/.next/server/app/api/users/route.js.nft.json +1 -1
  120. package/.next/standalone/.next/server/app/avatars/[file]/route.js +2 -1
  121. package/.next/standalone/.next/server/app/avatars/[file]/route.js.nft.json +1 -1
  122. package/.next/standalone/.next/server/app/favicon.ico/route.js +2 -1
  123. package/.next/standalone/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  124. package/.next/standalone/.next/server/app/import/page.js.nft.json +1 -1
  125. package/.next/standalone/.next/server/app/import/page_client-reference-manifest.js +1 -1
  126. package/.next/standalone/.next/server/app/import.html +1 -1
  127. package/.next/standalone/.next/server/app/import.rsc +13 -13
  128. package/.next/standalone/.next/server/app/import.segments/_full.segment.rsc +13 -13
  129. package/.next/standalone/.next/server/app/import.segments/_tree.segment.rsc +1 -1
  130. package/.next/standalone/.next/server/app/import.segments/import/__PAGE__.segment.rsc +11 -11
  131. package/.next/standalone/.next/server/app/index.html +1 -1
  132. package/.next/standalone/.next/server/app/index.rsc +13 -13
  133. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +11 -11
  134. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +13 -13
  135. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  136. package/.next/standalone/.next/server/app/launch/page.js.nft.json +1 -1
  137. package/.next/standalone/.next/server/app/launch/page_client-reference-manifest.js +1 -1
  138. package/.next/standalone/.next/server/app/launch.html +2 -2
  139. package/.next/standalone/.next/server/app/launch.rsc +13 -13
  140. package/.next/standalone/.next/server/app/launch.segments/_full.segment.rsc +13 -13
  141. package/.next/standalone/.next/server/app/launch.segments/_tree.segment.rsc +1 -1
  142. package/.next/standalone/.next/server/app/launch.segments/launch/__PAGE__.segment.rsc +11 -11
  143. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  144. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  145. package/.next/standalone/.next/server/app/paths/page.js.nft.json +1 -1
  146. package/.next/standalone/.next/server/app/paths/page_client-reference-manifest.js +1 -1
  147. package/.next/standalone/.next/server/app/paths.html +1 -1
  148. package/.next/standalone/.next/server/app/paths.rsc +13 -13
  149. package/.next/standalone/.next/server/app/paths.segments/_full.segment.rsc +13 -13
  150. package/.next/standalone/.next/server/app/paths.segments/_tree.segment.rsc +1 -1
  151. package/.next/standalone/.next/server/app/paths.segments/paths/__PAGE__.segment.rsc +11 -11
  152. package/.next/standalone/.next/server/app/profile/page.js.nft.json +1 -1
  153. package/.next/standalone/.next/server/app/profile/page_client-reference-manifest.js +1 -1
  154. package/.next/standalone/.next/server/app/profile.html +1 -1
  155. package/.next/standalone/.next/server/app/profile.rsc +13 -13
  156. package/.next/standalone/.next/server/app/profile.segments/_full.segment.rsc +13 -13
  157. package/.next/standalone/.next/server/app/profile.segments/_tree.segment.rsc +1 -1
  158. package/.next/standalone/.next/server/app/profile.segments/profile/__PAGE__.segment.rsc +11 -11
  159. package/.next/standalone/.next/server/app/queue/page.js.nft.json +1 -1
  160. package/.next/standalone/.next/server/app/queue/page_client-reference-manifest.js +1 -1
  161. package/.next/standalone/.next/server/app/queue.html +1 -1
  162. package/.next/standalone/.next/server/app/queue.rsc +13 -13
  163. package/.next/standalone/.next/server/app/queue.segments/_full.segment.rsc +13 -13
  164. package/.next/standalone/.next/server/app/queue.segments/_tree.segment.rsc +1 -1
  165. package/.next/standalone/.next/server/app/queue.segments/queue/__PAGE__.segment.rsc +11 -11
  166. package/.next/standalone/.next/server/app/settings/page/app-paths-manifest.json +3 -0
  167. package/.next/standalone/.next/server/app/settings/page/build-manifest.json +20 -0
  168. package/.next/standalone/.next/server/app/settings/page/next-font-manifest.json +11 -0
  169. package/.next/standalone/.next/server/app/settings/page/react-loadable-manifest.json +1 -0
  170. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +4 -0
  171. package/.next/standalone/.next/server/app/settings/page.js +13 -0
  172. package/.next/standalone/.next/server/app/settings/page.js.map +5 -0
  173. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -0
  174. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +3 -0
  175. package/.next/standalone/.next/server/app/settings.html +1 -0
  176. package/.next/standalone/.next/server/app/settings.meta +26 -0
  177. package/.next/standalone/.next/server/app/settings.rsc +24 -0
  178. package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +24 -0
  179. package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +4 -0
  180. package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +28 -0
  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 +13 -13
  185. package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +13 -13
  186. package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +1 -1
  187. package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +11 -11
  188. package/.next/standalone/.next/server/app-paths-manifest.json +10 -0
  189. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-rnla2._.js +3 -0
  190. package/.next/standalone/.next/server/chunks/[root-of-the-server]__00la_y0._.js +3 -0
  191. package/.next/standalone/.next/server/chunks/[root-of-the-server]__07t47cm._.js +3 -0
  192. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cj5jqc._.js +3 -0
  193. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e0fei3._.js +3 -0
  194. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0i5hdu4._.js +3 -0
  195. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ljcioj._.js +3 -0
  196. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ljnyho._.js +3 -0
  197. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o5-tcg._.js +3 -0
  198. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qrnous._.js +3 -0
  199. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t3v1a1._.js +3 -0
  200. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0uag-k5._.js +8 -0
  201. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0um1uey._.js +3 -0
  202. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wmexuc._.js +3 -0
  203. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xu34sz._.js +3 -0
  204. package/.next/standalone/.next/server/chunks/[root-of-the-server]__133knx1._.js +3 -0
  205. package/.next/standalone/.next/server/chunks/[root-of-the-server]__14ou7j5._.js +3 -0
  206. package/.next/standalone/.next/server/chunks/[root-of-the-server]__15-17hl._.js +3 -0
  207. package/.next/standalone/.next/server/chunks/[root-of-the-server]__16iu0hv._.js +3 -0
  208. package/.next/standalone/.next/server/chunks/[root-of-the-server]__19b7mig._.js +3 -0
  209. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1bbcwub._.js +8 -0
  210. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1eris29._.js +3 -0
  211. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1gjo_cq._.js +3 -0
  212. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1kbl21f._.js +3 -0
  213. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qcm08_._.js +3 -0
  214. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1rphsdk._.js +3 -0
  215. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1t3rugi._.js +3 -0
  216. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1w25q0m._.js +3 -0
  217. package/.next/standalone/.next/server/chunks/_072jl0y._.js +3 -0
  218. package/.next/standalone/.next/server/chunks/_0lw8_i0._.js +3 -0
  219. package/.next/standalone/.next/server/chunks/_1_fynia._.js +21 -3
  220. package/.next/standalone/.next/server/chunks/_1fn30_l._.js +3 -0
  221. package/.next/standalone/.next/server/chunks/_1itd1o_._.js +2 -1
  222. package/.next/standalone/.next/server/chunks/_1iwkh8t._.js +1 -1
  223. package/.next/standalone/.next/server/chunks/_1mxn_lb._.js +3 -0
  224. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_company-scores_legacy_route_actions_1ncspu_.js +3 -0
  225. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_export_route_actions_1lkimty.js +3 -0
  226. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_import_route_actions_1eji0kd.js +3 -0
  227. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_restart_route_actions_00_-u6o.js +3 -0
  228. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_reveal_route_actions_0-moqtn.js +3 -0
  229. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_route_actions_0j0w5ep.js +3 -0
  230. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_settings_route_actions_1bpm9ac.js +3 -0
  231. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_settings_sector-preview_route_actions_0w79454.js +3 -0
  232. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_settings_sector-suggestions_route_actions_1eoqugp.js +3 -0
  233. package/.next/standalone/.next/server/chunks/lib_db-client_15le7cw.js +155 -0
  234. package/.next/standalone/.next/server/chunks/{lib_rpc_0mc73lk.js → lib_rpc_00tx2sm.js} +1 -1
  235. package/.next/standalone/.next/server/chunks/lib_rpc_02-qa4d.js +3 -0
  236. package/.next/standalone/.next/server/chunks/lib_rpc_02ndsg2.js +3 -0
  237. package/.next/standalone/.next/server/chunks/lib_rpc_08q5vp6.js +3 -0
  238. package/.next/standalone/.next/server/chunks/lib_rpc_0_8i3ft.js +3 -0
  239. package/.next/standalone/.next/server/chunks/lib_rpc_0c9d9ti.js +5 -2
  240. package/.next/standalone/.next/server/chunks/lib_rpc_0huvw-3.js +3 -0
  241. package/.next/standalone/.next/server/chunks/lib_rpc_0ip2vdh.js +3 -0
  242. package/.next/standalone/.next/server/chunks/lib_rpc_0jzisgh.js +3 -0
  243. package/.next/standalone/.next/server/chunks/lib_rpc_0yi9xvd.js +3 -0
  244. package/.next/standalone/.next/server/chunks/lib_rpc_1jyhd0o.js +3 -0
  245. package/.next/standalone/.next/server/chunks/lib_rpc_1kn59-i.js +3 -0
  246. package/.next/standalone/.next/server/chunks/lib_rpc_1q2jkza.js +3 -0
  247. package/.next/standalone/.next/server/chunks/lib_rpc_1vpm1sk.js +3 -0
  248. package/.next/standalone/.next/server/chunks/lib_rpc_1x6p_31.js +3 -0
  249. package/.next/standalone/.next/server/chunks/node_modules_next_1zc5q0a._.js +158 -0
  250. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0mocm6d._.js → [root-of-the-server]__0an6blh._.js} +3 -3
  251. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h1_f_2._.js +1 -1
  252. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1m0255u._.js +3 -0
  253. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0bipr5s._.js → [root-of-the-server]__1z1j3ek._.js} +2 -2
  254. package/.next/standalone/.next/server/chunks/ssr/_07u8byv._.js +3 -0
  255. package/.next/standalone/.next/server/chunks/ssr/_08r_mlf._.js +3 -0
  256. package/.next/standalone/.next/server/chunks/ssr/{_0ggabjc._.js → _0942v8n._.js} +1 -1
  257. package/.next/standalone/.next/server/chunks/ssr/{_1djpk8t._.js → _0hl_t7r._.js} +2 -2
  258. package/.next/standalone/.next/server/chunks/ssr/_0tb83dw._.js +132 -0
  259. package/.next/standalone/.next/server/chunks/ssr/_1-87bs1._.js +3 -0
  260. package/.next/standalone/.next/server/chunks/ssr/_17gui6a._.js +1 -1
  261. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_11x4dq5.js +3 -0
  262. package/.next/standalone/.next/server/chunks/ssr/app_import_page_1fmu6_l.js +1 -1
  263. package/.next/standalone/.next/server/chunks/ssr/app_launch_page_19t0dyd.js +2 -2
  264. package/.next/standalone/.next/server/chunks/ssr/app_page_1fazqbf.js +4 -4
  265. package/.next/standalone/.next/server/chunks/ssr/app_profile_page_0u3-l5y.js +1 -1
  266. package/.next/standalone/.next/server/chunks/ssr/app_queue_page_0c6znd6.js +5 -5
  267. package/.next/standalone/.next/server/chunks/ssr/app_settings_page_1f8mjj_.js +3 -0
  268. package/.next/standalone/.next/server/chunks/ssr/app_setup_page_1-282zx.js +2 -2
  269. package/.next/standalone/.next/server/chunks/ssr/lib_0i8v-s3._.js +1 -1
  270. package/.next/standalone/.next/server/chunks/ssr/node_modules_1f8t_rp._.js +23 -0
  271. package/.next/standalone/.next/server/chunks/ssr/node_modules_1nkgb45._.js +2 -2
  272. package/.next/standalone/.next/server/chunks/ssr/{node_modules_01xbj_9._.js → node_modules_1wax83z._.js} +3 -3
  273. package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_00nap8h._.js → node_modules_next_dist_1bunoni._.js} +2 -2
  274. package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__0pco7a6._.js +2 -2
  275. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  276. package/.next/standalone/.next/server/middleware-manifest.json +15 -7
  277. package/.next/standalone/.next/server/next-font-manifest.js +1 -1
  278. package/.next/standalone/.next/server/next-font-manifest.json +4 -0
  279. package/.next/standalone/.next/server/pages/404.html +1 -1
  280. package/.next/standalone/.next/server/pages/500.html +1 -1
  281. package/.next/standalone/.next/server/prefetch-hints.json +14 -0
  282. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  283. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  284. package/.next/standalone/.next/static/chunks/06x3jiiz96m5t.js +1 -0
  285. package/.next/{static/chunks/34at5d2ifl62i.js → standalone/.next/static/chunks/0ngx9s6-zgshe.js} +5 -5
  286. package/.next/standalone/.next/static/chunks/0q-_khndfxubv.js +2 -0
  287. package/.next/standalone/.next/static/chunks/1c79veqedvubt.js +1 -0
  288. package/.next/standalone/.next/static/chunks/1chp3nx45meg5.js +44 -0
  289. package/.next/standalone/.next/static/chunks/1irqj0lf-fu3d.js +1 -0
  290. package/.next/standalone/.next/static/chunks/1uadqylrod5_v.js +1 -0
  291. package/.next/standalone/.next/static/chunks/23u0zclgwpc4d.js +1 -0
  292. package/.next/standalone/.next/static/chunks/289ktj97di6zg.js +1 -0
  293. package/.next/standalone/.next/static/chunks/2b3lmf8e6uj8m.js +16 -0
  294. package/.next/standalone/.next/static/chunks/2jz311xl1pp_8.js +1 -0
  295. package/.next/standalone/.next/static/chunks/2ot61qsv6_0eq.js +1 -0
  296. package/.next/standalone/.next/static/chunks/3npq5yd7c4dmn.js +2 -0
  297. package/.next/standalone/.next/static/frfHFnRYTA0Wjrw8oZJtY/_clientMiddlewareManifest.js +14 -0
  298. package/.next/standalone/AGENTS.md +10 -0
  299. package/.next/standalone/CHANGELOG.md +325 -0
  300. package/.next/standalone/CONTRIBUTING.md +14 -2
  301. package/.next/standalone/README.md +181 -53
  302. package/.next/standalone/SECURITY.md +120 -10
  303. package/.next/standalone/app/api/company-scores/legacy/route.js +32 -0
  304. package/.next/standalone/app/api/company-scores/route.js +20 -11
  305. package/.next/standalone/app/api/data/export/route.js +49 -0
  306. package/.next/standalone/app/api/data/import/route.js +83 -0
  307. package/.next/standalone/app/api/data/restart/route.js +37 -0
  308. package/.next/standalone/app/api/data/reveal/route.js +14 -0
  309. package/.next/standalone/app/api/data/route.js +39 -0
  310. package/.next/standalone/app/api/ingest/route.js +15 -47
  311. package/.next/standalone/app/api/scraper/route.js +268 -128
  312. package/.next/standalone/app/api/settings/route.js +58 -0
  313. package/.next/standalone/app/api/settings/sector-preview/route.js +38 -0
  314. package/.next/standalone/app/api/settings/sector-suggestions/route.js +20 -0
  315. package/.next/standalone/app/api/update/route.js +197 -24
  316. package/.next/standalone/app/avatars/[file]/route.js +4 -2
  317. package/.next/standalone/app/components/CompanyScores.js +28 -7
  318. package/.next/standalone/app/components/EmptyState.js +8 -0
  319. package/.next/standalone/app/components/ForceGraph.js +40 -36
  320. package/.next/standalone/app/components/LegacyScoresCard.js +129 -0
  321. package/.next/standalone/app/components/Sidebar.js +19 -18
  322. package/.next/standalone/app/components/UpdatePanel.js +317 -99
  323. package/.next/standalone/app/components/UserProvider.js +4 -3
  324. package/.next/standalone/app/components/settings/DataSection.js +437 -0
  325. package/.next/standalone/app/components/settings/SectorSection.js +445 -0
  326. package/.next/standalone/app/components/ui.js +62 -0
  327. package/.next/standalone/app/import/page.js +3 -3
  328. package/.next/standalone/app/launch/page.js +30 -20
  329. package/.next/standalone/app/layout.js +2 -2
  330. package/.next/standalone/app/page.js +15 -2
  331. package/.next/standalone/app/paths/page.js +13 -5
  332. package/.next/standalone/app/profile/page.js +41 -186
  333. package/.next/standalone/app/queue/page.js +8 -2
  334. package/.next/standalone/app/settings/page.js +96 -0
  335. package/.next/standalone/app/setup/page.js +35 -19
  336. package/.next/standalone/bin/args.mjs +44 -0
  337. package/.next/standalone/bin/six-degrees.mjs +16 -17
  338. package/.next/standalone/install.sh +1 -1
  339. package/.next/standalone/lib/companies.js +44 -119
  340. package/.next/standalone/lib/csv.js +61 -27
  341. package/.next/standalone/lib/data-export.js +170 -0
  342. package/.next/standalone/lib/data-folder.js +238 -0
  343. package/.next/standalone/lib/data-import.js +878 -0
  344. package/.next/standalone/lib/db-client.js +48 -3
  345. package/.next/standalone/lib/durable.js +73 -0
  346. package/.next/standalone/lib/gate.js +90 -1
  347. package/.next/standalone/lib/ingest.js +40 -0
  348. package/.next/standalone/lib/legacy-offer.js +185 -0
  349. package/.next/standalone/lib/legacy-scores.js +77 -0
  350. package/.next/standalone/lib/linkedin-limits.js +124 -1
  351. package/.next/standalone/lib/release.js +5 -2
  352. package/.next/standalone/lib/rpc.js +121 -13
  353. package/.next/standalone/lib/sample-stats.js +16 -0
  354. package/.next/standalone/lib/scan-progress.js +13 -0
  355. package/.next/standalone/lib/scan-state.js +53 -0
  356. package/.next/standalone/lib/scanner-python.js +685 -0
  357. package/.next/standalone/lib/scanner-setup.js +104 -0
  358. package/.next/standalone/lib/scoring.js +747 -138
  359. package/.next/standalone/lib/scraper-client.js +10 -6
  360. package/.next/standalone/lib/sector-directory.js +1532 -0
  361. package/.next/standalone/lib/sector-focus.js +163 -0
  362. package/.next/standalone/lib/sector-labels.js +81 -0
  363. package/.next/standalone/lib/settings-effects.js +59 -0
  364. package/.next/standalone/lib/settings.js +83 -0
  365. package/.next/standalone/lib/updater-job.js +838 -0
  366. package/.next/standalone/lib/updater.js +494 -0
  367. package/.next/standalone/middleware.js +25 -28
  368. package/.next/standalone/next.config.mjs +19 -3
  369. package/.next/standalone/package-lock.json +103 -9
  370. package/.next/standalone/package.json +12 -11
  371. package/.next/standalone/public/demo-data.json +1 -1
  372. package/.next/standalone/scripts/apply-update.sh +482 -0
  373. package/.next/standalone/scripts/build-app.mjs +251 -9
  374. package/.next/standalone/scripts/gen-synthetic.mjs +16 -1
  375. package/.next/standalone/scripts/readme_buttons.py +89 -0
  376. package/.next/standalone/scripts/requirements.txt +106 -4
  377. package/.next/standalone/scripts/screenshots.py +2 -0
  378. package/.next/standalone/scripts/test-release-server.mjs +143 -0
  379. package/.next/standalone/server.js +1 -1
  380. package/.next/static/chunks/06x3jiiz96m5t.js +1 -0
  381. package/.next/{standalone/.next/static/chunks/34at5d2ifl62i.js → static/chunks/0ngx9s6-zgshe.js} +5 -5
  382. package/.next/static/chunks/0q-_khndfxubv.js +2 -0
  383. package/.next/static/chunks/1c79veqedvubt.js +1 -0
  384. package/.next/static/chunks/1chp3nx45meg5.js +44 -0
  385. package/.next/static/chunks/1irqj0lf-fu3d.js +1 -0
  386. package/.next/static/chunks/1uadqylrod5_v.js +1 -0
  387. package/.next/static/chunks/23u0zclgwpc4d.js +1 -0
  388. package/.next/static/chunks/289ktj97di6zg.js +1 -0
  389. package/.next/static/chunks/2b3lmf8e6uj8m.js +16 -0
  390. package/.next/static/chunks/2jz311xl1pp_8.js +1 -0
  391. package/.next/static/chunks/2ot61qsv6_0eq.js +1 -0
  392. package/.next/static/chunks/3npq5yd7c4dmn.js +2 -0
  393. package/.next/static/frfHFnRYTA0Wjrw8oZJtY/_clientMiddlewareManifest.js +14 -0
  394. package/CHANGELOG.md +325 -0
  395. package/README.md +181 -53
  396. package/SECURITY.md +120 -10
  397. package/bin/args.mjs +44 -0
  398. package/bin/six-degrees.mjs +16 -17
  399. package/lib/companies.js +44 -119
  400. package/lib/csv.js +61 -27
  401. package/lib/data-export.js +170 -0
  402. package/lib/data-folder.js +238 -0
  403. package/lib/data-import.js +878 -0
  404. package/lib/db-client.js +48 -3
  405. package/lib/durable.js +73 -0
  406. package/lib/gate.js +90 -1
  407. package/lib/ingest.js +40 -0
  408. package/lib/legacy-offer.js +185 -0
  409. package/lib/legacy-scores.js +77 -0
  410. package/lib/linkedin-limits.js +124 -1
  411. package/lib/release.js +5 -2
  412. package/lib/rpc.js +121 -13
  413. package/lib/sample-stats.js +16 -0
  414. package/lib/scan-progress.js +13 -0
  415. package/lib/scan-state.js +53 -0
  416. package/lib/scanner-python.js +685 -0
  417. package/lib/scanner-setup.js +104 -0
  418. package/lib/scoring.js +747 -138
  419. package/lib/scraper-client.js +10 -6
  420. package/lib/sector-directory.js +1532 -0
  421. package/lib/sector-focus.js +163 -0
  422. package/lib/sector-labels.js +81 -0
  423. package/lib/settings-effects.js +59 -0
  424. package/lib/settings.js +83 -0
  425. package/lib/updater-job.js +838 -0
  426. package/lib/updater.js +494 -0
  427. package/package.json +12 -11
  428. package/public/demo-data.json +1 -1
  429. package/scripts/requirements.txt +106 -4
  430. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0jrmmj-._.js +0 -150
  431. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qx548g._.js +0 -151
  432. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1an3leo._.js +0 -150
  433. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1m8zedk._.js +0 -155
  434. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1zor0ys._.js +0 -3
  435. package/.next/standalone/.next/server/chunks/_0_rp-01._.js +0 -3
  436. package/.next/standalone/.next/server/chunks/_0hzdk79._.js +0 -3
  437. package/.next/standalone/.next/server/chunks/_0ow7u5r._.js +0 -3
  438. package/.next/standalone/.next/server/chunks/_0t0zc2d._.js +0 -3
  439. package/.next/standalone/.next/server/chunks/_0wa631d._.js +0 -3
  440. package/.next/standalone/.next/server/chunks/_13ccnao._.js +0 -3
  441. package/.next/standalone/.next/server/chunks/_13es063._.js +0 -3
  442. package/.next/standalone/.next/server/chunks/_142872j._.js +0 -3
  443. package/.next/standalone/.next/server/chunks/_18wsb_a._.js +0 -8
  444. package/.next/standalone/.next/server/chunks/_1e-4h5h._.js +0 -3
  445. package/.next/standalone/.next/server/chunks/_1gvvd7n._.js +0 -158
  446. package/.next/standalone/.next/server/chunks/_1moda66._.js +0 -3
  447. package/.next/standalone/.next/server/chunks/_1p6ghzv._.js +0 -3
  448. package/.next/standalone/.next/server/chunks/_1xmmi_v._.js +0 -3
  449. package/.next/standalone/.next/server/chunks/_1z-yrlf._.js +0 -3
  450. package/.next/standalone/.next/server/chunks/ssr/_0bf3x4q._.js +0 -3
  451. package/.next/standalone/.next/server/chunks/ssr/app_paths_page_1ol90m7.js +0 -4
  452. package/.next/standalone/.next/static/N9wokeIiC9rUIGmzBhj6T/_clientMiddlewareManifest.js +0 -6
  453. package/.next/standalone/.next/static/chunks/1odow92u6wxz0.js +0 -1
  454. package/.next/standalone/.next/static/chunks/1wb_is4wsdm-u.js +0 -1
  455. package/.next/standalone/.next/static/chunks/1zmpcmngg5c7-.js +0 -2
  456. package/.next/standalone/.next/static/chunks/220-ne82aus0c.js +0 -44
  457. package/.next/standalone/.next/static/chunks/2rrf5kzx2fhin.js +0 -2
  458. package/.next/standalone/.next/static/chunks/2s_k9x4d0gi9h.js +0 -16
  459. package/.next/standalone/.next/static/chunks/3hsi90cejq2dg.js +0 -1
  460. package/.next/standalone/.next/static/chunks/3pfyuezyqd9ob.js +0 -1
  461. package/.next/standalone/.next/static/chunks/3ts-_4i6bfkh2.js +0 -1
  462. package/.next/standalone/scripts/score-connections.sql +0 -80
  463. package/.next/standalone/scripts/score_new_connections.sql +0 -77
  464. package/.next/static/N9wokeIiC9rUIGmzBhj6T/_clientMiddlewareManifest.js +0 -6
  465. package/.next/static/chunks/1odow92u6wxz0.js +0 -1
  466. package/.next/static/chunks/1wb_is4wsdm-u.js +0 -1
  467. package/.next/static/chunks/1zmpcmngg5c7-.js +0 -2
  468. package/.next/static/chunks/220-ne82aus0c.js +0 -44
  469. package/.next/static/chunks/2rrf5kzx2fhin.js +0 -2
  470. package/.next/static/chunks/2s_k9x4d0gi9h.js +0 -16
  471. package/.next/static/chunks/3hsi90cejq2dg.js +0 -1
  472. package/.next/static/chunks/3pfyuezyqd9ob.js +0 -1
  473. package/.next/static/chunks/3ts-_4i6bfkh2.js +0 -1
  474. package/scripts/score_new_connections.sql +0 -77
  475. /package/.next/standalone/.next/static/{N9wokeIiC9rUIGmzBhj6T → frfHFnRYTA0Wjrw8oZJtY}/_buildManifest.js +0 -0
  476. /package/.next/standalone/.next/static/{N9wokeIiC9rUIGmzBhj6T → frfHFnRYTA0Wjrw8oZJtY}/_ssgManifest.js +0 -0
  477. /package/.next/static/{N9wokeIiC9rUIGmzBhj6T → frfHFnRYTA0Wjrw8oZJtY}/_buildManifest.js +0 -0
  478. /package/.next/static/{N9wokeIiC9rUIGmzBhj6T → frfHFnRYTA0Wjrw8oZJtY}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,37711,e=>{"use strict";var t=e.i(43476),r=e.i(71645);e.s(["default",0,function(){let[e,n]=(0,r.useState)(null);return((0,r.useEffect)(()=>{let e=!0;return fetch("/api/update").then(e=>e.json()).then(t=>{e&&t?.restartNeeded&&n(t)}).catch(()=>{}),()=>{e=!1}},[]),e)?(0,t.jsxs)("div",{role:"status",style:{position:"fixed",left:0,right:0,bottom:0,zIndex:9999,background:"linear-gradient(90deg, #FFD700, #FF6B35)",color:"#1a1200",padding:"9px 16px",fontSize:13,fontWeight:600,lineHeight:1.5,display:"flex",alignItems:"center",justifyContent:"center",gap:10,flexWrap:"wrap",textAlign:"center"},children:[(0,t.jsxs)("span",{children:["You have newer code on disk (",e.sha,") than this server is running (",e.bootSha,"). Restart it to see the changes — ",(0,t.jsx)("code",{style:{background:"rgba(0,0,0,0.16)",padding:"1px 6px",borderRadius:4},children:"Ctrl-C"})," in the terminal, then ",(0,t.jsx)("code",{style:{background:"rgba(0,0,0,0.16)",padding:"1px 6px",borderRadius:4},children:"npm run dev"}),"."]}),(0,t.jsx)("button",{onClick:()=>n(null),style:{border:"none",background:"rgba(0,0,0,0.18)",color:"#1a1200",borderRadius:6,padding:"3px 10px",fontWeight:700,cursor:"pointer"},children:"Dismiss"})]}):null}])},15812,64745,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(65084),l=e.i(47167),a=e.i(7837);let u="true"===l.default.env.NEXT_PUBLIC_DEMO_MODE,o={id:"synthetic-demo-user",name:"You",headline:"Sample network"},s=null;async function i(){if(s)return s;let e=await fetch("/demo-data.json",{cache:"no-cache"});if(!e.ok)throw Error("demo-data.json not found — run: node scripts/gen-synthetic.mjs");let t=await e.json();return s={degree1:t.degree1||[],degree2:t.degree2||[]}}async function d(){let e=await i();return(0,a.saveSessionNetwork)({degree1:e.degree1,degree2:e.degree2,source:"sample"}),{degree1:e.degree1.length,degree2:e.degree2.length}}e.s(["DEMO_USER",0,o,"IS_DEMO",0,u,"loadDemoNetwork",0,i,"loadSampleIntoSession",0,d],64745);let c=(0,r.createContext)({userId:null,userName:null,userProfile:null,ready:!1});e.s(["default",0,function({children:e}){let[l,s]=(0,r.useState)(null),[i,d]=(0,r.useState)(null),[f,p]=(0,r.useState)(null),[h,m]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{if(u){s(o.id),d(o.name),p({name:o.name,headline:o.headline,role:"",company:"",industry:"",sectors:[],goals:[],linkedin_url:""}),m(!0);return}if((0,a.hasCsvNetwork)()){s(a.CSV_USER.id),d(a.CSV_USER.name),p({name:a.CSV_USER.name,headline:"Imported from your LinkedIn CSV",role:"",company:"",industry:"",sectors:[],goals:[],linkedin_url:""}),m(!0);return}fetch("/api/users?me=1").then(e=>e.json()).then(e=>{let t=e.user;if(!t)throw Error("no profile");(0,n.setUser)(t.id,t.name),s(t.id),d(t.name),p({name:t.name,headline:t.headline||"",role:t.role||"",company:t.company||"",industry:t.industry||"",sectors:t.sectors||[],goals:t.goals||[],linkedin_url:t.linkedin_url||""})}).catch(()=>{(0,n.hasUser)()&&(s((0,n.getUserId)()),d((0,n.getUserName)()))}).finally(()=>m(!0))},[]),(0,t.jsx)(c.Provider,{value:{userId:l,userName:i,userProfile:f,ready:h,login:(e,t)=>{(0,n.setUser)(e,t),s(e),d(t),fetch(`/api/users?id=${e}`).then(e=>e.json()).then(e=>{e.user&&p({name:e.user.name,headline:e.user.headline||"",role:e.user.role||"",company:e.user.company||"",industry:e.user.industry||"",sectors:e.user.sectors||[],goals:e.user.goals||[],linkedin_url:e.user.linkedin_url||""})}).catch(()=>{})}},children:e})},"useUser",0,function(){return(0,r.useContext)(c)}],15812)},28298,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useRouterBFCache",{enumerable:!0,get:function(){return l}});let n=e.r(71645);function l(e,t,r){let[l,a]=(0,n.useState)(()=>({tree:e,cacheNode:t,stateKey:r,next:null}));if(l.tree===e)return l;let u={tree:e,cacheNode:t,stateKey:r,next:null},o=1,s=l,i=u;for(;null!==s&&o<1;){if(s.stateKey===r){i.next=s.next;break}{o++;let e={tree:s.tree,cacheNode:s.cacheNode,stateKey:s.stateKey,next:null};i.next=e,i=e}s=s.next}return a(u),u}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},47257,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ClientPageRoot",{enumerable:!0,get:function(){return i}});let n=e.r(43476),l=e.r(8372),a=e.r(71645),u=e.r(33906),o=e.r(61994),s=e.r(15783);function i({Component:e,serverProvidedParams:t}){let r,d;if(null!==t)r=t.searchParams,d=t.params;else{let e=(0,a.use)(l.LayoutRouterContext);d=null!==e?e.parentParams:{},r=(0,u.urlSearchParamsToParsedUrlQuery)((0,a.use)(o.SearchParamsContext))}let c=(0,s.createClientSearchParams)(r),f=(0,s.createClientParams)(d);return(0,n.jsx)(e,{params:f,searchParams:c})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},92825,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ClientSegmentRoot",{enumerable:!0,get:function(){return o}});let n=e.r(43476),l=e.r(8372),a=e.r(71645),u=e.r(15783);function o({Component:e,slots:t,serverProvidedParams:r}){let s;if(null!==r)s=r.params;else{let e=(0,a.use)(l.LayoutRouterContext);s=null!==e?e.parentParams:{}}let i=(0,u.createClientParams)(s);return(0,n.jsx)(e,{...t,params:i})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},68017,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"HTTPAccessFallbackBoundary",{enumerable:!0,get:function(){return d}});let n=e.r(90809),l=e.r(43476),a=n._(e.r(71645)),u=e.r(90373),o=e.r(54394),s=e.r(8372);class i extends a.default.Component{constructor(e){super(e),this.state={triggeredStatus:void 0,previousPathname:e.pathname}}componentDidCatch(){}static getDerivedStateFromError(e){if((0,o.isHTTPAccessFallbackError)(e))return{triggeredStatus:(0,o.getAccessFallbackHTTPStatus)(e)};throw e}static getDerivedStateFromProps(e,t){return e.pathname!==t.previousPathname&&t.triggeredStatus?{triggeredStatus:void 0,previousPathname:e.pathname}:{triggeredStatus:t.triggeredStatus,previousPathname:e.pathname}}render(){let{notFound:e,forbidden:t,unauthorized:r,children:n}=this.props,{triggeredStatus:a}=this.state,u={[o.HTTPAccessErrorStatus.NOT_FOUND]:e,[o.HTTPAccessErrorStatus.FORBIDDEN]:t,[o.HTTPAccessErrorStatus.UNAUTHORIZED]:r};if(a){let s=a===o.HTTPAccessErrorStatus.NOT_FOUND&&e,i=a===o.HTTPAccessErrorStatus.FORBIDDEN&&t,d=a===o.HTTPAccessErrorStatus.UNAUTHORIZED&&r;return s||i||d?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("meta",{name:"robots",content:"noindex"}),!1,u[a]]}):n}return n}}function d({notFound:e,forbidden:t,unauthorized:r,children:n}){let o=(0,u.useUntrackedPathname)(),c=(0,a.useContext)(s.MissingSlotContext);return e||t||r?(0,l.jsx)(i,{pathname:o,notFound:e,forbidden:t,unauthorized:r,missingSlots:c,children:n}):(0,l.jsx)(l.Fragment,{children:n})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},22976,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={InstantValidationBoundaryContext:function(){return a},PlaceValidationBoundaryBelowThisLevel:function(){return u},RenderValidationBoundaryAtThisLevel:function(){return o},SlotMarker:function(){return s}};for(var l in n)Object.defineProperty(r,l,{enumerable:!0,get:n[l]});let a=null,u=null,o=null,s=null;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},77694,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={InstantValidationBoundaryContext:function(){return a.InstantValidationBoundaryContext},PlaceValidationBoundaryBelowThisLevel:function(){return a.PlaceValidationBoundaryBelowThisLevel},RenderValidationBoundaryAtThisLevel:function(){return a.RenderValidationBoundaryAtThisLevel},SlotMarker:function(){return a.SlotMarker}};for(var l in n)Object.defineProperty(r,l,{enumerable:!0,get:n[l]});let a=e.r(22976);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},39756,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0});var n={LoadingBoundaryProvider:function(){return C},default:function(){return R}};for(var l in n)Object.defineProperty(r,l,{enumerable:!0,get:n[l]});let a=e.r(55682),u=e.r(90809),o=e.r(43476),s=u._(e.r(71645)),i=a._(e.r(74080)),d=e.r(8372),c=e.r(1244),f=e.r(72383),p=e.r(91915),h=e.r(58442),m=e.r(68017);e.r(77694);let y=e.r(70725),g=e.r(28298);e.r(74180);let b=e.r(61994),_=e.r(33906),v=e.r(95871);i.default.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function j(e,t,r){let n=e.getClientRects();if(0===n.length)return 0;let l=1/0;for(let e=0;e<n.length;e++){let t=n[e];t.top<l&&(l=t.top)}return l>=r()&&l<=t?1:2}s.default.Component;let P=function(e){let t=s.default.useRef(null);return(0,s.useLayoutEffect)(()=>{let{focusAndScrollRef:r,cacheNode:n}=e,l=r.forceScroll?r.scrollRef:n.scrollRef;if(null===l||!l.current)return;let a=null,u=r.hashFragment;if(u){var o;if(null===(a="top"===(o=u)?document.body:document.getElementById(o)??document.getElementsByName(o)[0]??null)){l.current=!1,r.onlyHashChange=!1,r.hashFragment=null;return}}else a=t.current;if(null===a)return;let s=!1;(0,p.disableSmoothScrollDuringRouteTransition)(()=>{let e=document.documentElement,t=null,r=null,n=null,o=()=>{var r,l;let a,u;return null===n&&(r=e,l=t,n=!Number.isFinite(u=Number.parseFloat(a=getComputedStyle(r).scrollPaddingTop))||u<0?0:a.endsWith("px")?u:a.endsWith("%")?u/100*l:0),n};(u||(t=e.clientHeight,0!==(r=j(a,t,o))))&&((s=!0,l.current=!1,u)?a.scrollIntoView():1!==r&&(e.scrollTop=0,2===j(a,t,o)&&a.scrollIntoView()))},{dontForceLayout:!0,onlyHashChange:r.onlyHashChange}),s&&(r.onlyHashChange=!1,r.hashFragment=null)},void 0),(0,o.jsx)(s.Fragment,{ref:t,children:e.children})};function x({children:e,cacheNode:t}){let r=(0,s.useContext)(d.GlobalLayoutRouterContext);if(!r)throw Object.defineProperty(Error("invariant global layout router not mounted"),"__NEXT_ERROR_CODE",{value:"E473",enumerable:!1,configurable:!0});return(0,o.jsx)(P,{focusAndScrollRef:r.focusAndScrollRef,cacheNode:t,children:e})}function O({tree:e,segmentPath:t,debugNameContext:r,cacheNode:n,params:l,url:a,isActive:u}){let i,f=(0,s.useContext)(d.GlobalLayoutRouterContext);if((0,s.useContext)(b.NavigationPromisesContext),!f)throw Object.defineProperty(Error("invariant global layout router not mounted"),"__NEXT_ERROR_CODE",{value:"E473",enumerable:!1,configurable:!0});let p=null!==n?n:(0,s.use)(c.unresolvedThenable),h=null!==p.prefetchRsc?p.prefetchRsc:p.rsc,m=(0,s.useDeferredValue)(p.rsc,h);if((0,v.isDeferredRsc)(m)){let e=(0,s.use)(m);null===e&&(0,s.use)(c.unresolvedThenable),i=e}else null===m&&(0,s.use)(c.unresolvedThenable),i=m;let y=i;return(0,o.jsx)(d.LayoutRouterContext.Provider,{value:{parentTree:e,parentCacheNode:p,parentSegmentPath:t,parentParams:l,parentLoadingData:null,debugNameContext:r,url:a,isActive:u},children:y})}function C({loading:e,children:t}){let r=(0,s.use)(d.LayoutRouterContext);return null===r?t:(0,o.jsx)(d.LayoutRouterContext.Provider,{value:{parentTree:r.parentTree,parentCacheNode:r.parentCacheNode,parentSegmentPath:r.parentSegmentPath,parentParams:r.parentParams,parentLoadingData:e,debugNameContext:r.debugNameContext,url:r.url,isActive:r.isActive},children:t})}function S({name:e,loading:t,children:r}){if(null!==t){let n=t[0],l=t[1],a=t[2];return(0,o.jsx)(s.Suspense,{name:e,fallback:(0,o.jsxs)(o.Fragment,{children:[l,a,n]}),children:r})}return(0,o.jsx)(o.Fragment,{children:r})}function R({parallelRouterKey:e,error:t,errorStyles:r,errorScripts:n,templateStyles:l,templateScripts:a,template:u,notFound:i,forbidden:p,unauthorized:b,segmentViewBoundaries:v}){let j=(0,s.useContext)(d.LayoutRouterContext);if(!j)throw Object.defineProperty(Error("invariant expected layout router to be mounted"),"__NEXT_ERROR_CODE",{value:"E56",enumerable:!1,configurable:!0});let{parentTree:P,parentCacheNode:C,parentSegmentPath:T,parentParams:M,parentLoadingData:E,url:N,isActive:F,debugNameContext:k}=j,B=P[0],A=null===T?[e]:T.concat([B,e]),D=P[1][e],w=C.slots;(void 0===D||null===w)&&(0,s.use)(c.unresolvedThenable);let L=D[0],U=w[e]??null,I=(0,y.createRouterCacheKey)(L,!0),H=(0,g.useRouterBFCache)(D,U,I),V=[];do{let e=H.tree,s=H.cacheNode,c=H.stateKey,y=e[0],g=M;if(Array.isArray(y)){let e=y[0],t=y[1],r=y[2],n=(0,_.getParamValueFromCacheKey)(t,r);null!==n&&(g={...M,[e]:n})}let v=function(e){if("/"===e)return"/";if("string"==typeof e)if("(__SLOT__)"===e)return;else return e+"/";return e[1]+"/"}(y),j=v??k,P=void 0===v?void 0:k,C=(0,o.jsxs)(x,{cacheNode:s,children:[(0,o.jsx)(f.ErrorBoundary,{errorComponent:t,errorStyles:r,errorScripts:n,children:(0,o.jsx)(S,{name:P,loading:E,children:(0,o.jsx)(m.HTTPAccessFallbackBoundary,{notFound:i,forbidden:p,unauthorized:b,children:(0,o.jsxs)(h.RedirectBoundary,{children:[(0,o.jsx)(O,{url:N,tree:e,params:g,cacheNode:s,segmentPath:A,debugNameContext:j,isActive:F&&c===I}),null]})})})}),null]}),R=(0,o.jsxs)(d.TemplateContext.Provider,{value:C,children:[l,a,u]},c);V.push(R),H=H.next}while(null!==H)return V}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},37457,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"default",{enumerable:!0,get:function(){return o}});let n=e.r(90809),l=e.r(43476),a=n._(e.r(71645)),u=e.r(8372);function o(){let e=(0,a.useContext)(u.TemplateContext);return(0,l.jsx)(l.Fragment,{children:e})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},6831,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderParamsFromClient",{enumerable:!0,get:function(){return l}});let n=new WeakMap;function l(e){let t=n.get(e);if(t)return t;let r=Promise.resolve(e);return n.set(e,r),r}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},97689,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderParamsFromClient",{enumerable:!0,get:function(){return n}});let n=e.r(6831).createRenderParamsFromClient;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},93504,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderSearchParamsFromClient",{enumerable:!0,get:function(){return l}});let n=new WeakMap;function l(e){let t=n.get(e);if(t)return t;let r=Promise.resolve(e);return n.set(e,r),r}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},66996,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderSearchParamsFromClient",{enumerable:!0,get:function(){return n}});let n=e.r(93504).createRenderSearchParamsFromClient;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},15783,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={createClientParams:function(){return a.createRenderParamsFromClient},createClientSearchParams:function(){return u.createRenderSearchParamsFromClient}};for(var l in n)Object.defineProperty(r,l,{enumerable:!0,get:n[l]});let a=e.r(97689),u=e.r(66996);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},27201,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"IconMark",{enumerable:!0,get:function(){return l}});let n=e.r(43476),l=()=>"u">typeof window?null:(0,n.jsx)("meta",{name:"«nxt-icon»"})},91915,(e,t,r)=>{"use strict";function n(e,t={}){if(t.onlyHashChange)return void e();let r=document.documentElement;if("smooth"!==r.dataset.scrollBehavior)return void e();let l=r.style.scrollBehavior;r.style.scrollBehavior="auto",t.dontForceLayout||r.getClientRects(),e(),r.style.scrollBehavior=l}e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"disableSmoothScrollDuringRouteTransition",{enumerable:!0,get:function(){return n}})}]);
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,68074,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(7837),o=e.i(65084),i=e.i(22016);let l={S:"#FFD700",A:"#9B59B6",B:"#3498DB",C:"#95A5A6",D:"#BDC3C7"},a={background:"rgba(255,255,255,0.03)",border:"1px solid rgba(255,255,255,0.08)",borderRadius:16,padding:24},s={minHeight:"100vh",background:"#0a0a1a",color:"#fff",padding:"56px 24px",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',display:"flex",justifyContent:"center"},c={background:"rgba(255,255,255,0.07)",padding:"2px 6px",borderRadius:5,fontSize:13,fontFamily:"ui-monospace, SFMono-Regular, Menlo, monospace"},u={display:"block",textAlign:"center",padding:"15px 20px",borderRadius:12,background:"linear-gradient(135deg,#FFD700,#9B59B6)",color:"#0a0a1a",fontWeight:800,fontSize:15,textDecoration:"none"};e.s(["default",0,function(){let[e,d]=(0,r.useState)(!1),[f,p]=(0,r.useState)(""),[h,g]=(0,r.useState)(null),[y,m]=(0,r.useState)(!1),x=(0,r.useRef)(null);function b(e){if(!e)return;let t=new FileReader;t.onload=e=>(function(e){m(!0),p("");try{let{connections:t,skipped:r}=(0,n.parseConnectionsCsv)(e);if(!(0,n.saveCsvNetwork)(t)){p("That network is too large to hold in this window. LinkedIn allows up to 30,000 connections and this app holds that many, so please report it with your connection count: github.com/blakeb056/six-degrees/issues"),m(!1);return}(0,o.setUser)(n.CSV_USER.id,n.CSV_USER.name);let i={};t.forEach(e=>{i[e.tier]=(i[e.tier]||0)+1}),g({count:t.length,skipped:r,tiers:i})}catch(e){p(e instanceof n.ConnectionsCsvError?e.message:"Could not read that file. Make sure it is Connections.csv from your LinkedIn export.")}m(!1)})(String(e.target.result||"")),t.onerror=()=>p("Could not read that file."),t.readAsText(e)}return h?(0,t.jsx)("div",{style:s,children:(0,t.jsxs)("div",{style:{maxWidth:560,width:"100%"},children:[(0,t.jsx)("div",{style:{fontSize:13,color:"#2ecc71",fontWeight:700,letterSpacing:2,marginBottom:10},children:"IMPORTED"}),(0,t.jsxs)("h1",{style:{fontSize:38,fontWeight:800,margin:"0 0 8px"},children:[h.count.toLocaleString()," connections mapped"]}),(0,t.jsxs)("p",{style:{color:"rgba(255,255,255,0.45)",margin:"0 0 28px",lineHeight:1.6},children:["Scored on seniority and company, sorted into tiers.",h.skipped>0&&` ${h.skipped} row${1===h.skipped?"":"s"} skipped (blank or duplicate).`]}),(0,t.jsxs)("div",{style:{...a,marginBottom:20},children:[(0,t.jsx)("div",{style:{fontSize:11,fontWeight:700,color:"#666",letterSpacing:2,marginBottom:14},children:"YOUR TIERS"}),["S","A","B","C","D"].map(e=>{let r=h.tiers[e]||0,n=h.count?r/h.count*100:0;return(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:12,marginBottom:8},children:[(0,t.jsx)("span",{style:{width:16,color:l[e],fontWeight:800},children:e}),(0,t.jsx)("div",{style:{flex:1,height:8,borderRadius:4,background:"rgba(255,255,255,0.05)",overflow:"hidden"},children:(0,t.jsx)("div",{style:{width:`${n}%`,height:"100%",background:l[e],borderRadius:4}})}),(0,t.jsx)("span",{style:{width:46,textAlign:"right",color:"rgba(255,255,255,0.6)",fontSize:13},children:r})]},e)})]}),(0,t.jsx)(i.default,{href:"/",style:u,children:"See your galaxy →"}),(0,t.jsx)("p",{style:{color:"#555",fontSize:12,marginTop:18,lineHeight:1.6},children:"Nothing was uploaded or saved: this lives only in this window (or browser tab), and closing it clears it."})]})}):(0,t.jsx)("div",{style:s,children:(0,t.jsxs)("div",{style:{maxWidth:620,width:"100%"},children:[(0,t.jsxs)("h1",{style:{fontSize:40,fontWeight:800,margin:"0 0 10px",letterSpacing:-1},children:["Map ",(0,t.jsx)("span",{style:{background:"linear-gradient(135deg,#FFD700,#9B59B6,#3498DB)",WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent"},children:"your"})," network"]}),(0,t.jsxs)("p",{style:{color:"rgba(255,255,255,0.45)",margin:"0 0 30px",lineHeight:1.6,fontSize:16},children:["Drop LinkedIn’s official ",(0,t.jsx)("code",{style:c,children:"Connections.csv"})," below. It is read in your browser, scored, and drawn as a galaxy — no account, no upload, nothing stored."]}),(0,t.jsxs)("div",{onDragOver:e=>{e.preventDefault(),d(!0)},onDragLeave:()=>d(!1),onDrop:e=>{e.preventDefault(),d(!1),b(e.dataTransfer.files?.[0])},onClick:()=>x.current?.click(),style:{...a,padding:"48px 24px",textAlign:"center",cursor:"pointer",marginBottom:16,borderStyle:"dashed",borderColor:e?"#FFD700":"rgba(255,255,255,0.12)",background:e?"rgba(255,215,0,0.05)":a.background,transition:"all 0.15s ease"},children:[(0,t.jsx)("div",{style:{fontSize:32,marginBottom:10},children:"📄"}),(0,t.jsx)("div",{style:{fontWeight:700,fontSize:17,marginBottom:6},children:y?"Reading…":"Drop Connections.csv here"}),(0,t.jsx)("div",{style:{color:"#666",fontSize:13},children:"or click to choose the file"}),(0,t.jsx)("input",{ref:x,type:"file",accept:".csv,text/csv",style:{display:"none"},onChange:e=>b(e.target.files?.[0])})]}),f&&(0,t.jsx)("div",{style:{background:"rgba(255,59,59,0.08)",border:"1px solid rgba(255,59,59,0.25)",borderRadius:12,padding:16,color:"#ff8080",fontSize:14,lineHeight:1.6,marginBottom:16},children:f}),(0,t.jsxs)("div",{style:{...a,marginBottom:16},children:[(0,t.jsx)("div",{style:{fontSize:11,fontWeight:700,color:"#666",letterSpacing:2,marginBottom:14},children:"HOW TO GET THE FILE"}),(0,t.jsxs)("ol",{style:{margin:0,paddingLeft:20,color:"rgba(255,255,255,0.6)",fontSize:14,lineHeight:2},children:[(0,t.jsxs)("li",{children:["LinkedIn → ",(0,t.jsx)("strong",{style:{color:"#fff"},children:"Settings & Privacy → Data privacy → Get a copy of your data"})]}),(0,t.jsxs)("li",{children:["Pick ",(0,t.jsx)("strong",{style:{color:"#fff"},children:"Connections"})," and request the archive"]}),(0,t.jsx)("li",{children:"LinkedIn emails a download link, usually within ~10 minutes"}),(0,t.jsxs)("li",{children:["Unzip it and drop ",(0,t.jsx)("code",{style:c,children:"Connections.csv"})," above"]})]})]}),(0,t.jsxs)("div",{style:{...a,marginBottom:16},children:[(0,t.jsx)("div",{style:{fontSize:11,fontWeight:700,color:"#2ecc71",letterSpacing:2,marginBottom:10},children:"PRIVATE BY DESIGN"}),(0,t.jsxs)("p",{style:{margin:0,color:"rgba(255,255,255,0.55)",fontSize:14,lineHeight:1.7},children:["Your file never leaves this browser. It is parsed locally, held for this tab only, and never written to any database. The ",(0,t.jsx)("strong",{style:{color:"#fff"},children:"Email Address column is ignored entirely"}),"."]})]}),(0,t.jsxs)("div",{style:{...a,borderColor:"rgba(255,215,0,0.15)"},children:[(0,t.jsx)("div",{style:{fontSize:11,fontWeight:700,color:"#FFD700",letterSpacing:2,marginBottom:10},children:"HONEST CAVEAT"}),(0,t.jsxs)("p",{style:{margin:"0 0 12px",color:"rgba(255,255,255,0.55)",fontSize:14,lineHeight:1.7},children:["LinkedIn’s export contains no profile photos, so everyone renders as initials on a tier-colored circle. It also only covers people you are ",(0,t.jsx)("em",{children:"already"})," connected to — so ",(0,t.jsx)("strong",{style:{color:"#fff"},children:"Degrees"})," and the ",(0,t.jsx)("strong",{style:{color:"#fff"},children:"Outlink queue"})," stay empty, because those map the people you haven’t met yet."]}),(0,t.jsxs)("p",{style:{margin:0,color:"#666",fontSize:13,lineHeight:1.7},children:["Want those? Run the local scanner — it captures 2nd-degree circles and real photos."," ",(0,t.jsx)(i.default,{href:"/setup",style:{color:"#3498DB",textDecoration:"none"},children:"See setup →"})]})]}),(0,t.jsx)("div",{style:{textAlign:"center",marginTop:26},children:(0,t.jsx)(i.default,{href:"/",style:{color:"#555",fontSize:13,textDecoration:"none"},children:"← Back"})})]})})}])},22016,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0});var n={default:function(){return m},useLinkStatus:function(){return b}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let i=e.r(90809),l=e.r(43476),a=i._(e.r(71645)),s=e.r(95057),c=e.r(8372),u=e.r(18581),d=e.r(18967),f=e.r(5550),p=e.r(88540),h=e.r(91949),g=e.r(73668),y=e.r(9396);function m(t){var r;let n,o,i,[m,b]=(0,a.useOptimistic)(h.IDLE_LINK_STATUS),v=(0,a.useRef)(null),{href:S,as:j,children:C,prefetch:k=null,passHref:E,replace:P,shallow:w,scroll:T,onClick:R,onMouseEnter:B,onTouchStart:O,legacyBehavior:_=!1,onNavigate:D,transitionTypes:A,ref:I,unstable_dynamicOnHover:L,...F}=t;n=C,_&&("string"==typeof n||"number"==typeof n)&&(n=(0,l.jsx)("a",{children:n}));let z=a.default.useContext(c.AppRouterContext),N=!1!==k,U=!1===k?"none":!0===k?"full":"auto",M="none"!==U?"auto"===U?y.FetchStrategy.PPR:y.FetchStrategy.Full:y.FetchStrategy.PPR,$="string"==typeof(r=j||S)?r:(0,s.formatUrl)(r);if(_){if(n?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});o=a.default.Children.only(n)}let W=_?o&&"object"==typeof o&&o.ref:I,H,K=a.default.useCallback(e=>(null!==z&&(v.current=(0,h.mountLinkInstance)(e,$,z,M,N,b,H)),()=>{v.current&&((0,h.unmountLinkForCurrentNavigation)(v.current),v.current=null),(0,h.unmountPrefetchableInstance)(e)}),[N,$,z,M,b,H]),V={ref:(0,u.useMergedRef)(K,W),onClick(t){_||"function"!=typeof R||R(t),_&&o.props&&"function"==typeof o.props.onClick&&o.props.onClick(t),!z||t.defaultPrevented||function(t,r,n,o,i,l,s,c="none"){if("u">typeof window){let u,{nodeName:d}=t.currentTarget;if("A"===d.toUpperCase()&&((u=t.currentTarget.getAttribute("target"))&&"_self"!==u||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,g.isLocalURL)(r)){o&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),l){let e=!1;if(l({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:f}=e.r(99781);a.default.startTransition(()=>{f(r,o?"replace":"push",!1===i?p.ScrollBehavior.NoScroll:p.ScrollBehavior.Default,n.current,s,c)})}}(t,$,v,P,T,D,A,U)},onMouseEnter(e){_||"function"!=typeof B||B(e),_&&o.props&&"function"==typeof o.props.onMouseEnter&&o.props.onMouseEnter(e),z&&N&&(0,h.onNavigationIntent)(e.currentTarget,!0===L)},onTouchStart:function(e){_||"function"!=typeof O||O(e),_&&o.props&&"function"==typeof o.props.onTouchStart&&o.props.onTouchStart(e),z&&N&&(0,h.onNavigationIntent)(e.currentTarget,!0===L)}};return(0,d.isAbsoluteUrl)($)?V.href=$:_&&!E&&("a"!==o.type||"href"in o.props)||(V.href=(0,f.addBasePath)($)),i=_?a.default.cloneElement(o,V):(0,l.jsx)("a",{...F,...V,children:n}),(0,l.jsx)(x.Provider,{value:m,children:i})}let x=(0,a.createContext)(h.IDLE_LINK_STATUS),b=()=>(0,a.useContext)(x);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return o}});let n=e.r(71645);function o(e,t){let r=(0,n.useRef)(null),o=(0,n.useRef)(null);return(0,n.useCallback)(n=>{if(null===n){let e=r.current;e&&(r.current=null,e());let t=o.current;t&&(o.current=null,t())}else e&&(r.current=i(e,n)),t&&(o.current=i(t,n))},[e,t])}function i(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},18967,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0});var n={DecodeError:function(){return m},MiddlewareNotFoundError:function(){return S},MissingStaticPage:function(){return v},NormalizeError:function(){return x},PageNotFoundError:function(){return b},SP:function(){return g},ST:function(){return y},WEB_VITALS:function(){return i},execOnce:function(){return l},getDisplayName:function(){return d},getLocationOrigin:function(){return c},getURL:function(){return u},isAbsoluteUrl:function(){return s},isResSent:function(){return f},loadGetInitialProps:function(){return h},normalizeRepeatedSlashes:function(){return p},stringifyError:function(){return j}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let i=["CLS","FCP","FID","INP","LCP","TTFB"];function l(e){let t,r=!1;return(...n)=>(r||(r=!0,t=e(...n)),t)}let a=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,s=e=>{let t=e.charCodeAt(0);return!!(t>=65&&t<=90||t>=97&&t<=122)&&a.test(e)};function c(){let{protocol:e,hostname:t,port:r}=window.location;return`${e}//${t}${r?":"+r:""}`}function u(){let{href:e}=window.location,t=c();return e.substring(t.length)}function d(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function f(e){return e.finished||e.headersSent}function p(e){let t=e.split("?");return t[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(t[1]?`?${t.slice(1).join("?")}`:"")}async function h(e,t){let r=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await h(t.Component,t.ctx)}:{};let n=await e.getInitialProps(t);if(r&&f(r))return n;if(!n)throw Object.defineProperty(Error(`"${d(e)}.getInitialProps()" should resolve to an object. But found "${n}" instead.`),"__NEXT_ERROR_CODE",{value:"E1025",enumerable:!1,configurable:!0});return n}let g="u">typeof performance,y=g&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class m extends Error{}class x extends Error{}class b extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message=`Cannot find module for page: ${e}`}}class v extends Error{constructor(e,t){super(),this.message=`Failed to load static file for page: ${e} ${t}`}}class S extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function j(e){return JSON.stringify({message:e.message,stack:e.stack})}},73668,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return i}});let n=e.r(18967),o=e.r(52817);function i(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,o.hasBasePath)(r.pathname)}catch(e){return!1}}},98183,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={assign:function(){return s},searchParamsToUrlQuery:function(){return i},urlQueryToSearchParams:function(){return a}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});function i(e){let t={};for(let[r,n]of e.entries()){let e=t[r];void 0===e?t[r]=n:Array.isArray(e)?e.push(n):t[r]=[e,n]}return t}function l(e){return"string"==typeof e?e:("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function a(e){let t=new URLSearchParams;for(let[r,n]of Object.entries(e))if(Array.isArray(n))for(let e of n)t.append(r,l(e));else t.set(r,l(n));return t}function s(e,...t){for(let r of t){for(let t of r.keys())e.delete(t);for(let[t,n]of r.entries())e.append(t,n)}return e}},95057,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0});var n={formatUrl:function(){return a},formatWithValidation:function(){return c},urlObjectKeys:function(){return s}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let i=e.r(90809)._(e.r(98183)),l=/https?|ftp|gopher|file/;function a(e){let{auth:t,hostname:r}=e,n=e.protocol||"",o=e.pathname||"",a=e.hash||"",s=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:r&&(c=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(c+=":"+e.port)),s&&"object"==typeof s&&(s=String(i.urlQueryToSearchParams(s)));let u=e.search||s&&`?${s}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||l.test(n))&&!1!==c?(c="//"+(c||""),o&&"/"!==o[0]&&(o="/"+o)):c||(c=""),a&&"#"!==a[0]&&(a="#"+a),u&&"?"!==u[0]&&(u="?"+u),o=o.replace(/[?#]/g,encodeURIComponent),u=u.replace("#","%23"),`${n}${c}${o}${u}${a}`}let s=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return a(e)}}]);
@@ -0,0 +1,2 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,85957,e=>{"use strict";var t=e.i(43476),n=e.i(71645),o=e.i(18566),r=e.i(40996),i=e.i(19821),l=e.i(64745),s=e.i(7837),a=e.i(2776);e.i(47716);var d=e.i(36534),c=e.i(77899),p=e.i(17983),h=e.i(43079),u=e.i(23731),f=e.i(22016);let g=e=>`${e.name} ${e.was} → ${e.estimated?"estimated":e.now}`,y=e=>({padding:"6px 12px",borderRadius:7,cursor:"pointer",fontSize:12,fontWeight:700,border:e?"none":"1px solid rgba(255,255,255,0.15)",background:e?"linear-gradient(135deg, #00ff88, #3498DB)":"transparent",color:e?"#000":"#cfd8d8"});function x({onAnswered:e}){var o;let r,i,[l,a]=(0,n.useState)(null),[d,c]=(0,n.useState)(!1),[p,h]=(0,n.useState)(()=>new Set),[u,f]=(0,n.useState)(!1),[m,b]=(0,n.useState)(null);if((0,n.useEffect)(()=>{if((0,s.csvNetworkSource)())return;let e=!1;return fetch("/api/company-scores/legacy").then(e=>e.json()).then(t=>{!e&&t.offer?.companies?.length&&(a(t.offer),h(new Set(t.offer.companies.map(e=>e.name))))}).catch(()=>{}),()=>{e=!0}},[]),!l)return null;let j=async t=>{f(!0),b(null);try{let n=await fetch("/api/company-scores/legacy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({keep:t})}),o=await n.json();if(!n.ok&&!o.kept)throw Error(o.error||"Could not save your answer.");a(null),e?.({kept:o.kept||[],scored:o.scored||0,error:n.ok?null:o.error})}catch(e){b(e.message)}finally{f(!1)}};return(0,t.jsxs)("section",{"aria-label":"Built-in scores changed",style:{marginBottom:14,padding:14,borderRadius:10,border:"1px solid rgba(255,215,0,0.35)",background:"rgba(255,215,0,0.06)",fontSize:12.5,color:"#cfd8d8",lineHeight:1.6},children:[(0,t.jsx)("b",{style:{color:"#fff"},children:"Built-in scores changed in this version:"})," ",(r=(o=l.companies).slice(0,3).map(g).join(", "),(i=o.length-3)>0?`${r} and ${i} more`:r),"."," ","Keep any of the old ones as your own?",(0,t.jsx)("div",{style:{marginTop:4,color:"#8b9a9a"},children:"The built-in list now holds only companies most professionals would recognise, scored the same for everyone; anything else is estimated from your network. A score you keep is yours, like one you set below, and Auto hands it back."}),d&&(0,t.jsx)("ul",{style:{listStyle:"none",padding:0,margin:"10px 0 0",display:"grid",gap:4},children:l.companies.map(e=>(0,t.jsx)("li",{children:(0,t.jsxs)("label",{style:{display:"flex",gap:8,alignItems:"baseline",cursor:"pointer"},children:[(0,t.jsx)("input",{type:"checkbox",checked:p.has(e.name),disabled:u,onChange:()=>{let t;return t=e.name,h(e=>{let n=new Set(e);return n.has(t)?n.delete(t):n.add(t),n})}}),(0,t.jsxs)("span",{children:[(0,t.jsx)("b",{style:{color:"#fff"},children:e.name})," ",e.was," → ",e.estimated?`estimated (${e.now})`:e.now,(0,t.jsxs)("span",{style:{color:"#778"},children:[` \xb7 ${e.people} ${1===e.people?"person":"people"} there now`,e.names.length>1&&` \xb7 for ${e.names.join(", ")}`]})]})]})},e.name))}),(0,t.jsxs)("div",{style:{display:"flex",gap:8,marginTop:10,flexWrap:"wrap"},children:[d?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("button",{disabled:u||!p.size,onClick:()=>j([...p]),style:{...y(!0),opacity:u||!p.size?.5:1},children:["Keep ",p.size," ",1===p.size?"score":"scores"]}),(0,t.jsx)("button",{disabled:u,onClick:()=>c(!1),style:y(!1),children:"Back"})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("button",{disabled:u,onClick:()=>j(l.companies.map(e=>e.name)),style:y(!0),children:"Keep all"}),(0,t.jsx)("button",{disabled:u,onClick:()=>c(!0),style:y(!1),children:"Choose…"})]}),(0,t.jsx)("button",{disabled:u,onClick:()=>j([]),style:y(!1),children:"No thanks"})]}),m&&(0,t.jsx)("div",{role:"alert",style:{marginTop:8,color:"#e74c3c"},children:m})]})}let m="1px solid rgba(255,255,255,0.1)",b={yours:{label:"your score",color:"#00ff88"},known:{label:"known list",color:"#3498DB"},network:{label:"estimated: many of your people",color:"#FF6B35"},default:{label:"unknown company",color:"#778"}};async function j(){let e=await fetch("/api/company-scores"),t=await e.json();if(!e.ok)throw Error(t.error||"Could not load company scores");return t.companies}function k(){let[e,t]=(0,n.useState)(null),[o,r]=(0,n.useState)(null);return(0,n.useEffect)(()=>{let e=!1;return j().then(n=>{e||t(n)}).catch(t=>{e||r(t.message)}),()=>{e=!0}},[]),{companies:e,error:o,setScore:(0,n.useCallback)(async(e,n)=>{let o=await fetch("/api/company-scores",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:e,score:n})}),r=await o.json();if(!o.ok)throw Error(r.error||"Could not save");return t(await j()),r},[]),reload:(0,n.useCallback)(async()=>t(await j()),[])}}function w({company:e,onSet:o,compact:r}){let[i,l]=(0,n.useState)(!1),s=async t=>{l(!0);try{await o(e.name,"auto"===t?null:Number(t))}finally{l(!1)}};return(0,t.jsxs)("select",{disabled:i,value:"yours"===e.source?String(e.score):"auto",onChange:e=>s(e.target.value),title:"Set this company's score. Auto uses the known list or an estimate.",style:{padding:r?"2px 4px":"4px 6px",borderRadius:6,border:m,background:"#11131c",color:"#dfe6e9",fontSize:12},children:[(0,t.jsxs)("option",{value:"auto",children:["Auto (","yours"===e.source?e.suggested??"est.":e.score,")"]}),[10,9,8,7,6,5,4,3,2,1].map(e=>(0,t.jsx)("option",{value:e,children:e},e))]})}function v({onRescored:e}){let{companies:o,error:r,setScore:i,reload:l}=k(),[s,a]=(0,n.useState)(""),[d,c]=(0,n.useState)("all"),[p,h]=(0,n.useState)(150),[u,g]=(0,n.useState)(null),y=e=>{g(e),setTimeout(()=>g(null),3500)},j=async(t,n)=>{let o=await i(t,n);y(`${t}: ${null==n?"back to auto":`set to ${n}`} \xb7 rescored ${o.scored} people`),e?.()},S=async({kept:t,scored:n,error:o})=>{if(!t.length)return y("Keeping the new built-in scores.");y(o||`Kept ${t.length} old ${1===t.length?"score":"scores"} as your own \xb7 rescored ${n} people`),await l().catch(()=>{}),e?.()},C=(0,n.useMemo)(()=>{if(!o)return[];let e=s.trim().toLowerCase();return o.filter(t=>(!e||t.name.toLowerCase().includes(e))&&("all"===d||t.source===d))},[o,s,d]);if(r)return(0,t.jsx)("div",{style:{padding:24,color:"#e74c3c"},children:r});if(!o)return(0,t.jsx)("div",{style:{padding:24,color:"#778"},children:"Loading companies…"});let z=e=>o.filter(t=>t.source===e).length;return(0,t.jsxs)("div",{style:{flex:1,overflow:"auto",padding:16},children:[(0,t.jsxs)("div",{style:{maxWidth:980,margin:"0 auto"},children:[(0,t.jsx)(x,{onAnswered:S}),(0,t.jsxs)("div",{style:{padding:14,borderRadius:10,border:m,background:"rgba(255,255,255,0.03)",fontSize:12.5,color:"#cfd8d8",lineHeight:1.6},children:[(0,t.jsx)("b",{style:{color:"#fff"},children:"How a power score works."})," power = ",(0,t.jsx)("b",{children:"title"})," × ",(0,t.jsx)("b",{children:"company weight"})," + bonus. The title (student 1 … founder or C-suite 10) comes from someone’s current role, with former roles at 70%. The company weight runs from 0.615 (no company found) to 1.0 (a company scored 10), so seniority counts for more at a bigger company. The bonus is at most +1.5, for investor, YC, an audience in the millions or the top award of any field, and counts half at an unknown company. A 1st-degree person whose circle is unusually strong gets up to +1 more. S ≥ 7.5 · A ≥ 5.5 · B ≥ 4 · C ≥ 2.5.",(0,t.jsxs)("div",{style:{marginTop:6,color:"#8b9a9a"},children:["So a VP at a 10 scores 9.0, a founder at an unknown company 6.7, a director at an unknown company 5.0, and an intern at a 10 scores 2.0. Set a company’s score below and everyone there is rescored. Companies in the sectors you pick in ",(0,t.jsx)(f.default,{href:"/settings#sector",style:{color:"#3498DB"},children:"Settings"})," get +1 or +2; a score you set is never changed."]})]}),(0,t.jsxs)("div",{style:{display:"flex",gap:8,alignItems:"center",flexWrap:"wrap",margin:"14px 0 10px"},children:[(0,t.jsx)("input",{value:s,onChange:e=>a(e.target.value),placeholder:"Find a company",style:{padding:"6px 10px",borderRadius:7,border:m,background:"rgba(255,255,255,0.05)",color:"#fff",fontSize:13,minWidth:180}}),[["all",`All ${o.length}`],["known",`Known list ${z("known")}`],["yours",`Yours ${z("yours")}`],["network",`Estimated ${z("network")}`],["default",`Unknown ${z("default")}`]].map(([e,n])=>(0,t.jsx)("button",{onClick:()=>c(e),style:{padding:"5px 10px",borderRadius:7,border:m,cursor:"pointer",fontSize:11.5,fontWeight:600,background:d===e?"rgba(52,152,219,0.25)":"transparent",color:d===e?"#cfe6f7":"#8b9a9a"},children:n},e))]}),(0,t.jsxs)("div",{style:{borderRadius:10,border:m,overflow:"hidden"},children:[(0,t.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 70px 70px 70px 60px 180px 110px",gap:8,padding:"8px 12px",fontSize:10.5,letterSpacing:.6,color:"#8b9a9a",background:"rgba(255,255,255,0.04)"},children:[(0,t.jsx)("span",{children:"COMPANY"}),(0,t.jsx)("span",{style:{textAlign:"right"},children:"PEOPLE"}),(0,t.jsx)("span",{style:{textAlign:"right"},children:"YOU KNOW"}),(0,t.jsx)("span",{style:{textAlign:"right"},children:"DIRECTOR+"}),(0,t.jsx)("span",{style:{textAlign:"right"},children:"SCORE"}),(0,t.jsx)("span",{children:"SOURCE"}),(0,t.jsx)("span",{children:"SET"})]}),C.slice(0,p).map(e=>(0,t.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 70px 70px 70px 60px 180px 110px",gap:8,padding:"7px 12px",alignItems:"center",borderTop:"1px solid rgba(255,255,255,0.05)",fontSize:12.5},children:[(0,t.jsxs)("span",{style:{display:"flex",alignItems:"center",gap:8,minWidth:0},children:[(0,t.jsx)("span",{title:`${e.industry.label} (inferred)`,style:{width:8,height:8,borderRadius:"50%",background:e.industry.color,flexShrink:0}}),(0,t.jsx)("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.name})]}),(0,t.jsx)("span",{style:{textAlign:"right"},children:e.people}),(0,t.jsx)("span",{style:{textAlign:"right",color:e.d1?"#00ff88":"#556"},children:e.d1}),(0,t.jsx)("span",{style:{textAlign:"right",color:e.senior?"#FFD700":"#556"},children:e.senior}),(0,t.jsx)("b",{style:{textAlign:"right",fontSize:15},children:e.score}),(0,t.jsxs)("span",{style:{fontSize:11,color:b[e.source]?.color},children:[b[e.source]?.label,e.sectorBonus>0&&(0,t.jsxs)("span",{style:{color:"#00ff88"},children:[" + ",e.sectorBonus," your sector"]})]}),(0,t.jsx)(w,{company:e,onSet:j,compact:!0})]},e.name))]}),C.length>p&&(0,t.jsxs)("button",{onClick:()=>h(e=>e+300),style:{marginTop:10,padding:"7px 14px",borderRadius:8,border:m,background:"rgba(255,255,255,0.05)",color:"#dfe6e9",cursor:"pointer",fontSize:12},children:["Show more (",C.length-p," left)"]})]}),u&&(0,t.jsx)("div",{role:"status",style:{position:"fixed",bottom:24,left:"50%",transform:"translateX(-50%)",padding:"10px 18px",borderRadius:24,background:"linear-gradient(135deg, #00ff88, #3498DB)",color:"#000",fontWeight:800,fontSize:13,zIndex:50},children:u})]})}var S=e.i(89154);let C={S:"#FFD700",A:"#9B59B6",B:"#3498DB",C:"#95A5A6",D:"#BDC3C7"},z="1px solid rgba(255,255,255,0.1)",M=[...S.INDUSTRIES,S.UNKNOWN_INDUSTRY];function B(e){let t=0x811c9dc5;for(let n=0;n<e.length;n++)t=Math.imul(t^e.charCodeAt(n),0x1000193);return(t>>>0)%1e3/1e3}function F({value:e,onChange:n,options:o}){return(0,t.jsx)("div",{style:{display:"flex",borderRadius:7,overflow:"hidden",border:z},children:o.map(([o,r])=>(0,t.jsx)("button",{onClick:()=>n(o),style:{padding:"5px 10px",fontSize:11.5,fontWeight:600,border:"none",cursor:"pointer",background:e===o?"rgba(52,152,219,0.25)":"transparent",color:e===o?"#cfe6f7":"#8b9a9a"},children:r},o))})}function $(e,t){return("all"===t.degree||String(e.degree)===t.degree)&&("senior"!==t.seniority||!!(0,S.isSenior)(e.headline))&&("csuite"!==t.seniority||!((0,S.getSeniority)(e.headline).level<6))&&("SA"!==t.tier||"S"===e.tier||"A"===e.tier)}function R({d1:e=[],d2:o=[],d3:r=[],tab:i="map",onOpenCompany:l}){let[s,a]=(0,n.useState)({degree:"all",seniority:"all",tier:"all"}),[d,c]=(0,n.useState)(()=>new Set),[p,h]=(0,n.useState)(""),[u,f]=(0,n.useState)(null),g=(0,n.useMemo)(()=>[...e,...o,...r],[e,o,r]),y=(0,n.useMemo)(()=>(0,S.buildCompanyIndex)(g),[g]),x=(0,n.useMemo)(()=>(0,S.companyLinks)(e,o),[e,o]),m=(0,n.useMemo)(()=>{let e=p.trim().toLowerCase(),t=[];for(let n of y.values()){if(d.has(n.industry.key)||e&&!n.name.toLowerCase().includes(e))continue;let o=n.people.filter(e=>$(e,s));o.length&&t.push({...n,shown:o})}return t.sort((e,t)=>t.shown.length-e.shown.length)},[y,s,d,p]),b=(0,n.useMemo)(()=>{let e=new Map(M.map(e=>[e.key,{...e,people:[],companies:new Map}])),t=new Set;for(let n of g){let o=n.profile_url||`id:${n.id}`;if(t.has(o)||(t.add(o),!$(n,s)))continue;let r=(0,S.companyOf)(n),i=r?y.get(r)?.industry||(0,S.industryOf)(r,n.headline):(0,S.industryOf)(null,n.headline),l=e.get(i.key);l.people.push(n),r&&l.companies.set(r,(l.companies.get(r)||0)+1)}return[...e.values()].filter(e=>e.people.length).sort((e,t)=>t.people.length-e.people.length)},[g,y,s]),j=u?.kind==="company"?y.get(u.key):u?.kind==="industry"?b.find(e=>e.key===u.key):null;return(0,t.jsxs)("div",{style:{display:"flex",flex:1,minHeight:0},children:[(0,t.jsxs)("div",{style:{flex:1,minWidth:0,display:"flex",flexDirection:"column"},children:[(0,t.jsx)(A,{filters:s,setFilters:a,query:p,setQuery:h,industries:b,hidden:d,setHidden:c,onIndustry:e=>f({kind:"industry",key:e})}),"map"===i?(0,t.jsx)(W,{companies:m,links:x,focus:u,onCompany:e=>f({kind:"company",key:e}),onIndustry:e=>f({kind:"industry",key:e}),onClear:()=>f(null)}):(0,t.jsx)(I,{industries:b,index:y,d1:e,d2:o,onIndustry:e=>f({kind:"industry",key:e}),onCompany:e=>f({kind:"company",key:e})})]}),j&&(0,t.jsx)(O,{focus:u,data:j,index:y,links:x,d1:e,d2:o,filters:s,onClose:()=>f(null),onCompany:e=>f({kind:"company",key:e}),onOpenCompany:l})]})}function A({filters:e,setFilters:n,query:o,setQuery:r,industries:i,hidden:l,setHidden:s,onIndustry:a}){let d=(e,t)=>n(n=>({...n,[e]:t}));return(0,t.jsxs)("div",{style:{padding:"10px 16px",borderBottom:z,display:"flex",flexDirection:"column",gap:8},children:[(0,t.jsxs)("div",{style:{display:"flex",gap:8,flexWrap:"wrap",alignItems:"center"},children:[(0,t.jsx)("input",{value:o,onChange:e=>r(e.target.value),placeholder:"Find a company",style:{padding:"6px 10px",borderRadius:7,border:z,background:"rgba(255,255,255,0.05)",color:"#fff",fontSize:13,minWidth:170}}),(0,t.jsx)(F,{value:e.degree,onChange:e=>d("degree",e),options:[["all","All degrees"],["1","1st"],["2","2nd"],["3","3rd"]]}),(0,t.jsx)(F,{value:e.seniority,onChange:e=>d("seniority",e),options:[["all","Any level"],["senior","Director+"],["csuite","C-suite"]]}),(0,t.jsx)(F,{value:e.tier,onChange:e=>d("tier",e),options:[["all","All tiers"],["SA","S & A only"]]})]}),(0,t.jsxs)("div",{style:{display:"flex",gap:6,flexWrap:"wrap"},children:[i.map(e=>{let n=l.has(e.key);return(0,t.jsxs)("span",{style:{display:"inline-flex",borderRadius:14,border:`1px solid ${e.color}55`,overflow:"hidden",opacity:n?.4:1},children:[(0,t.jsx)("button",{title:n?"Show on the map":"Hide from the map",onClick:()=>s(t=>{let n=new Set(t);return n.has(e.key)?n.delete(e.key):n.add(e.key),n}),style:{padding:"3px 7px",border:"none",background:`${e.color}22`,cursor:"pointer",color:e.color,fontSize:11},children:"●"}),(0,t.jsxs)("button",{onClick:()=>a(e.key),title:"Analyse this industry",style:{padding:"3px 9px 3px 5px",border:"none",background:"transparent",cursor:"pointer",color:"#cfd8d8",fontSize:11.5},children:[e.label," ",(0,t.jsx)("span",{style:{color:"#778"},children:e.people.length})]})]},e.key)}),(0,t.jsx)("span",{style:{fontSize:11,color:"#667",alignSelf:"center"},children:"industries inferred from companies and headlines"})]})]})}function W({companies:e,links:o,focus:r,onCompany:i,onIndustry:l,onClear:s}){let a=(0,n.useRef)(null),{w:f,h:g}=function(e){let[t,o]=(0,n.useState)({w:0,h:0});return(0,n.useEffect)(()=>{let t=e.current;if(!t)return;let n=()=>{let e=t.getBoundingClientRect();o(t=>t.w===Math.round(e.width)&&t.h===Math.round(e.height)?t:{w:Math.round(e.width),h:Math.round(e.height)})};n();let r=new ResizeObserver(n);return r.observe(t),()=>r.disconnect()},[e]),t}(a),[y,x]=(0,n.useState)(null),m=(0,n.useMemo)(()=>{let t=e.slice(0,140),n=new Set(t.map(e=>e.name)),r=[...new Set(t.map(e=>e.industry.key))],i=new Map(r.map((e,t)=>{let n=t/Math.max(1,r.length)*Math.PI*2-Math.PI/2;return[e,{x:260*Math.cos(n),y:260*Math.sin(n)}]})),l=t.map(e=>({id:e.name,co:e,r:4+3.4*Math.sqrt(e.shown.length),x:i.get(e.industry.key).x+(B(e.name)-.5)*40,y:i.get(e.industry.key).y+(B(e.name+"#")-.5)*40})),s=o.filter(e=>n.has(e.a)&&n.has(e.b)).map(e=>({source:e.a,target:e.b,weight:e.weight,via:e.via.size})),a=(0,h.forceSimulation)(l).force("x",(function(e){var t,n,o,r=(0,u.default)(.1);function i(e){for(var r,i=0,l=t.length;i<l;++i)r=t[i],r.vx+=(o[i]-r.x)*n[i]*e}function l(){if(t){var i,l=t.length;for(n=Array(l),o=Array(l),i=0;i<l;++i)n[i]=isNaN(o[i]=+e(t[i],i,t))?0:+r(t[i],i,t)}}return"function"!=typeof e&&(e=(0,u.default)(null==e?0:+e)),i.initialize=function(e){t=e,l()},i.strength=function(e){return arguments.length?(r="function"==typeof e?e:(0,u.default)(+e),l(),i):r},i.x=function(t){return arguments.length?(e="function"==typeof t?t:(0,u.default)(+t),l(),i):e},i})(e=>i.get(e.co.industry.key).x).strength(.12)).force("y",(function(e){var t,n,o,r=(0,u.default)(.1);function i(e){for(var r,i=0,l=t.length;i<l;++i)r=t[i],r.vy+=(o[i]-r.y)*n[i]*e}function l(){if(t){var i,l=t.length;for(n=Array(l),o=Array(l),i=0;i<l;++i)n[i]=isNaN(o[i]=+e(t[i],i,t))?0:+r(t[i],i,t)}}return"function"!=typeof e&&(e=(0,u.default)(null==e?0:+e)),i.initialize=function(e){t=e,l()},i.strength=function(e){return arguments.length?(r="function"==typeof e?e:(0,u.default)(+e),l(),i):r},i.y=function(t){return arguments.length?(e="function"==typeof t?t:(0,u.default)(+t),l(),i):e},i})(e=>i.get(e.co.industry.key).y).strength(.12)).force("collide",(0,d.forceCollide)(e=>e.r+3)).force("charge",(0,p.forceManyBody)().strength(-25)).force("link",(0,c.forceLink)(s).id(e=>e.id).strength(e=>Math.min(.25,.03*e.weight)).distance(60)).stop();for(let e=0;e<320;e++)a.tick();let f=l.flatMap(e=>[e.x-e.r,e.x+e.r]),g=l.flatMap(e=>[e.y-e.r,e.y+e.r]),y=l.length?{x:Math.min(...f)-60,y:Math.min(...g)-40,w:Math.max(...f)-Math.min(...f)+120,h:Math.max(...g)-Math.min(...g)+80}:{x:-300,y:-300,w:600,h:600},x=r.map(e=>{let t=l.filter(t=>t.co.industry.key===e),n=t.reduce((e,t)=>e+t.x,0)/t.length,o=t.reduce((e,t)=>e+t.y,0)/t.length,r=Math.hypot(n,o)||1,i=n/r,s=o/r,a=Math.max(...t.map(e=>(e.x-n)*i+(e.y-o)*s+e.r));return{key:e,x:n+i*(a+16),y:o+s*(a+16)+4,anchor:i>.35?"start":i<-.35?"end":"middle",ind:(0,S.industryByKey)(e)}});for(let e of x){let t=7.5*e.ind.label.length,n="start"===e.anchor?e.x:"end"===e.anchor?e.x-t:e.x-t/2,o=Math.max(y.x+y.w,n+t+10);y.x=Math.min(y.x,n-10),y.w=o-y.x;let r=Math.max(y.y+y.h,e.y+12);y.y=Math.min(y.y,e.y-18),y.h=r-y.y}return y.h+=Math.max(60,.1*y.h),{nodes:l,edges:s,box:y,labels:x,cut:Math.max(0,e.length-t.length)}},[e,o]),b=y||(r?.kind==="company"?r.key:null),j=r?.kind==="industry"?r.key:null,k=(0,n.useMemo)(()=>{if(!b)return null;let e=new Set([b]);for(let t of m.edges)t.source.id===b&&e.add(t.target.id),t.target.id===b&&e.add(t.source.id);return e},[b,m]),w=(0,n.useMemo)(()=>new Set(m.nodes.slice(0,28).map(e=>e.id)),[m]);return(0,t.jsxs)("div",{ref:a,style:{flex:1,minHeight:360,position:"relative"},onClick:s,children:[f>0&&(0,t.jsxs)("svg",{width:f,height:g,viewBox:`${m.box.x} ${m.box.y} ${m.box.w} ${m.box.h}`,style:{display:"block"},children:[(0,t.jsx)("g",{children:m.edges.map((e,n)=>{let o=b&&(e.source.id===b||e.target.id===b);return(0,t.jsx)("line",{x1:e.source.x,y1:e.source.y,x2:e.target.x,y2:e.target.y,stroke:o?"#FF6B35":"#8fa6c0",strokeOpacity:o?.8:b?.04:.14,strokeWidth:o?1+Math.log2(1+e.weight):.4+.5*Math.log2(1+e.weight)},n)})}),m.labels.map(e=>(0,t.jsx)("text",{x:e.x,y:e.y,textAnchor:e.anchor,fontSize:13,fontWeight:800,fill:e.ind.color,opacity:j&&j!==e.key?.25:.85,style:{cursor:"pointer"},onClick:t=>{t.stopPropagation(),l(e.key)},children:e.ind.label},e.key)),m.nodes.map(e=>{let n=k&&!k.has(e.id)||j&&e.co.industry.key!==j,o=r?.kind==="company"&&r.key===e.id;return(0,t.jsxs)("g",{transform:`translate(${e.x},${e.y})`,style:{cursor:"pointer"},opacity:n?.18:1,onMouseEnter:()=>x(e.id),onMouseLeave:()=>x(null),onClick:t=>{t.stopPropagation(),i(e.id)},children:[(0,t.jsx)("title",{children:`${e.co.name} \xb7 ${e.co.industry.label} (inferred)
2
+ ${e.co.d1} you know \xb7 ${e.co.d2} reachable${e.co.d3?` \xb7 ${e.co.d3} further`:""}`}),(0,t.jsx)("circle",{r:e.r,fill:e.co.industry.color,fillOpacity:.75,stroke:o?"#fff":e.co.S?C.S:"rgba(0,0,0,0.35)",strokeWidth:o?2.5:e.co.S?1.5:.6}),e.co.d1>0&&(0,t.jsx)("circle",{r:e.r*Math.sqrt(e.co.d1/Math.max(1,e.co.people.length)),fill:"#fff",fillOpacity:.35}),(w.has(e.id)||e.id===b||o)&&(0,t.jsx)("text",{y:e.r+11,textAnchor:"middle",fontSize:10,fill:"#e6edf0",style:{pointerEvents:"none"},children:e.co.name})]},e.id)})]}),(0,t.jsxs)("div",{style:{position:"absolute",left:12,bottom:10,fontSize:11,color:"#778",lineHeight:1.6,pointerEvents:"none"},children:["Bubble = a company, sized by your people there; white centre = the share you already know; gold ring = an S-tier person inside.",(0,t.jsx)("br",{}),"A line = one of your connections at one company knows people at the other.",m.cut?` Showing the 140 largest; ${m.cut} smaller companies are in Industries.`:""]})]})}function T({parts:e,total:n}){return(0,t.jsx)("div",{style:{display:"flex",height:6,borderRadius:3,overflow:"hidden",background:"rgba(255,255,255,0.06)"},children:e.map(([e,o],r)=>(0,t.jsx)("div",{style:{width:`${e/Math.max(1,n)*100}%`,background:o}},r))})}function I({industries:e,index:o,d1:r,d2:i,onIndustry:l,onCompany:s}){let a=(0,n.useMemo)(()=>{let e=new Map(r.map(e=>[e.id,e])),t=new Map;for(let e of i){let n=(0,S.companyOf)(e),r=n?o.get(n)?.industry.key:(0,S.industryOf)(null,e.headline).key;if(!r)continue;let i=t.get(r)||new Map;i.set(e.source_connection_id,(i.get(e.source_connection_id)||0)+1),t.set(r,i)}let n=new Map;for(let[o,r]of t){let[t,i]=[...r.entries()].sort((e,t)=>t[1]-e[1])[0]||[];e.get(t)&&n.set(o,{bridge:e.get(t),n:i})}return n},[o,r,i]);return(0,t.jsx)("div",{style:{flex:1,overflow:"auto",padding:16},children:(0,t.jsx)("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(280px, 1fr))",gap:12},children:e.map(e=>{let n=e.people.filter(e=>1===e.degree).length,o=e.people.filter(e=>2===e.degree).length,r=e.people.filter(e=>(0,S.isSenior)(e.headline)).length,i=e.people.filter(e=>"S"===e.tier).length,d=[...e.companies.entries()].sort((e,t)=>t[1]-e[1]).slice(0,3),c=a.get(e.key);return(0,t.jsxs)("div",{onClick:()=>l(e.key),style:{padding:14,borderRadius:10,border:z,borderTop:`3px solid ${e.color}`,background:"rgba(255,255,255,0.03)",cursor:"pointer"},children:[(0,t.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"baseline"},children:[(0,t.jsx)("b",{style:{fontSize:14,color:e.color},children:e.label}),(0,t.jsx)("span",{style:{fontSize:20,fontWeight:800},children:e.people.length})]}),(0,t.jsxs)("div",{style:{fontSize:11.5,color:"#8b9a9a",margin:"4px 0 6px"},children:[n," you know · ",o," reachable · ",e.companies.size," companies · ",r," director+ · ",i," S-tier"]}),(0,t.jsx)(T,{total:e.people.length,parts:[[n,"#00ff88"],[o,"#FF6B35"]]}),d.length>0&&(0,t.jsx)("div",{style:{marginTop:8,display:"flex",gap:6,flexWrap:"wrap"},children:d.map(([e,n])=>(0,t.jsxs)("button",{onClick:t=>{t.stopPropagation(),s(e)},style:{padding:"2px 8px",borderRadius:10,border:z,background:"rgba(255,255,255,0.05)",color:"#dfe6e9",fontSize:11,cursor:"pointer"},children:[e," ",(0,t.jsx)("span",{style:{color:"#778"},children:n})]},e))}),c&&(0,t.jsxs)("div",{style:{marginTop:8,fontSize:11.5,color:"#aab7b7"},children:["Best way in: ",(0,t.jsx)("b",{style:{color:C[c.bridge.tier]||"#ccc"},children:c.bridge.name})," knows ",c.n," here"]})]},e.key)})})})}function D({p:e,note:n}){return(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"5px 0",fontSize:12.5},children:[(0,t.jsx)("span",{style:{width:7,height:7,borderRadius:"50%",background:C[e.tier]||"#667",flexShrink:0}}),(0,t.jsxs)("div",{style:{minWidth:0,flex:1},children:[(0,t.jsx)("div",{style:{fontWeight:600,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.name}),(0,t.jsx)("div",{style:{fontSize:11,color:"#8b9a9a",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:n||e.headline})]})]})}function O({focus:e,data:o,index:r,links:i,d1:l,d2:s,filters:a,onClose:d,onCompany:c,onOpenCompany:p}){let h,u,f,g="company"===e.kind,y=o.people.filter(e=>$(e,a)),x=(0,n.useMemo)(()=>{let e=new Map;for(let t of y){let n=(0,S.getSeniority)(t.headline);e.set(n.label,{n:(e.get(n.label)?.n||0)+1,level:n.level})}return[...e.entries()].sort((e,t)=>t[1].level-e[1].level)},[y]),m=(0,n.useMemo)(()=>g?(0,S.waysInto)(o.name,l,s):null,[g,o,l,s]),b=(0,n.useMemo)(()=>g?i.filter(e=>e.a===o.name||e.b===o.name).map(e=>({name:e.a===o.name?e.b:e.a,weight:e.weight})).sort((e,t)=>t.weight-e.weight).slice(0,8):[],[g,i,o]),j=[...y].sort((e,t)=>(Number(t.power_score)||0)-(Number(e.power_score)||0)).slice(0,6),k=g?o.industry:o,w=y.filter(e=>1===e.degree).length,v=y.filter(e=>2===e.degree).length,C=g?[]:[...o.companies.entries()].sort((e,t)=>t[1]-e[1]).slice(0,10);return(0,t.jsxs)("aside",{style:{width:360,flexShrink:0,borderLeft:z,overflow:"auto",padding:16,background:"rgba(255,255,255,0.02)"},children:[(0,t.jsx)("button",{onClick:d,style:{background:"none",border:"none",color:"#888",cursor:"pointer",fontSize:12,padding:0},children:"✕ Close"}),(0,t.jsxs)("div",{style:{fontSize:10,letterSpacing:1,color:"#8b9a9a",marginTop:8},children:[g?"COMPANY":"INDUSTRY"," ANALYZER"]}),(0,t.jsx)("h2",{style:{margin:"4px 0 6px",fontSize:20},children:g?o.name:o.label}),(0,t.jsxs)("span",{style:{fontSize:11,padding:"2px 8px",borderRadius:10,background:`${k.color}22`,color:k.color},children:[k.label,g?" · inferred":""]}),g&&(0,t.jsx)(E,{name:o.name}),(0,t.jsx)("div",{style:{display:"grid",gridTemplateColumns:"repeat(3, 1fr)",gap:8,margin:"14px 0"},children:[[w,"you know","#00ff88"],[v,"reachable","#FF6B35"],[y.filter(e=>(0,S.isSenior)(e.headline)).length,"director+","#FFD700"]].map(([e,n,o])=>(0,t.jsxs)("div",{style:{padding:8,borderRadius:8,background:"rgba(255,255,255,0.04)",textAlign:"center"},children:[(0,t.jsx)("div",{style:{fontSize:20,fontWeight:800,color:o},children:e}),(0,t.jsx)("div",{style:{fontSize:10.5,color:"#8b9a9a"},children:n})]},n))}),(0,t.jsx)(N,{title:"By level",children:x.map(([e,{n}])=>(0,t.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"110px 1fr 28px",gap:8,alignItems:"center",fontSize:11.5,marginBottom:4},children:[(0,t.jsx)("span",{style:{color:"#aab7b7"},children:e}),(0,t.jsx)(T,{total:y.length,parts:[[n,"#3498DB"]]}),(0,t.jsx)("span",{style:{color:"#778",textAlign:"right"},children:n})]},e))}),g&&m&&(0,t.jsxs)(N,{title:"Ways in",children:[m.direct.length>0&&(0,t.jsxs)("div",{style:{fontSize:11,color:"#00ff88",margin:"2px 0"},children:["You already know ",m.direct.length," here"]}),(h=new Map(m.bridges.map(({bridge:e,n:t})=>[e.id,t])),u=[...m.direct].sort((e,t)=>(h.get(t.id)||0)-(h.get(e.id)||0)).slice(0,4),f=new Set(m.direct.map(e=>e.id)),(0,t.jsxs)(t.Fragment,{children:[u.map(e=>(0,t.jsx)(D,{p:e,note:h.get(e.id)?`works here \xb7 knows ${h.get(e.id)} here`:`works here \xb7 ${e.headline||""}`},e.id)),m.bridges.filter(({bridge:e})=>!f.has(e.id)).slice(0,5).map(({bridge:e,n})=>(0,t.jsx)(D,{p:e,note:`knows ${n} ${1===n?"person":"people"} here`},e.id))]})),!m.direct.length&&!m.bridges.length&&(0,t.jsx)("div",{style:{fontSize:12,color:"#778"},children:"No one you know links here yet."})]}),(0,t.jsx)(N,{title:g?"Most powerful people here":"Most powerful people in this industry",children:j.map(e=>(0,t.jsx)(D,{p:e,note:`${1===e.degree?"you know them":2===e.degree?"2nd degree":"3rd+"} \xb7 ${e.headline||""}`},e.id))}),g&&b.length>0&&(0,t.jsx)(N,{title:"Connected companies",children:(0,t.jsx)("div",{style:{display:"flex",gap:6,flexWrap:"wrap"},children:b.map(e=>(0,t.jsxs)("button",{onClick:()=>c(e.name),style:{padding:"3px 9px",borderRadius:10,border:z,background:`${r.get(e.name)?.industry.color||"#666"}22`,color:"#dfe6e9",fontSize:11.5,cursor:"pointer"},children:[e.name," ",(0,t.jsx)("span",{style:{color:"#778"},children:e.weight})]},e.name))})}),!g&&(0,t.jsx)(N,{title:"Companies",children:C.map(([e,n])=>(0,t.jsxs)("div",{onClick:()=>c(e),style:{display:"grid",gridTemplateColumns:"1fr 60px 24px",gap:8,alignItems:"center",fontSize:12,padding:"3px 0",cursor:"pointer"},children:[(0,t.jsx)("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e}),(0,t.jsx)(T,{total:C[0][1],parts:[[n,k.color]]}),(0,t.jsx)("span",{style:{color:"#778",textAlign:"right"},children:n})]},e))}),g&&p&&(0,t.jsxs)("button",{onClick:()=>p(o),style:{marginTop:14,width:"100%",padding:"10px",borderRadius:8,border:"none",cursor:"pointer",fontWeight:700,background:"linear-gradient(135deg, #00ff88, #3498DB)",color:"#000"},children:["Path to the top of ",o.name," →"]})]})}function N({title:e,children:n}){return(0,t.jsxs)("div",{style:{marginTop:14},children:[(0,t.jsx)("div",{style:{fontSize:10.5,letterSpacing:.8,color:"#8b9a9a",fontWeight:700,marginBottom:6},children:e.toUpperCase()}),n]})}function E({name:e}){let{companies:n,setScore:o}=k(),r=n?.find(t=>t.name===e);if(!r)return null;let i={yours:"your score",known:"known list",network:"estimated",default:"unknown company"}[r.source];return(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8,marginTop:10,fontSize:12,color:"#aab7b7"},children:["Company score ",(0,t.jsx)("b",{style:{color:"#fff",fontSize:15},children:r.score}),"/10 · ",i,(0,t.jsx)("span",{style:{marginLeft:"auto"},children:(0,t.jsx)(w,{company:r,onSet:o,compact:!0})})]})}var _=e.i(15812);let L=[["map","Map"],["industries","Industries"],["companies","Companies"],["scores","Scores"]];function U(){let{userId:e}=(0,_.useUser)(),[a,d]=(0,n.useState)([]),[c,p]=(0,n.useState)(null),[h,u]=(0,n.useState)([]),[g,y]=(0,n.useState)(!0),[x,m]=(0,n.useState)([]),[b,j]=(0,n.useState)([]),[k,w]=(0,n.useState)([]),C=(0,o.useSearchParams)().get("tab"),[z,M]=(0,n.useState)(()=>L.some(([e])=>e===C)?C:"map"),[B,F]=(0,n.useState)(0);(0,n.useEffect)(()=>{!l.IS_DEMO&&e&&t();async function t(){let t=(0,s.hasCsvNetwork)()?(0,s.loadCsvNetwork)():null,n=[],o=[],r=[];if(t)n=t.degree1,o=t.degree2||[];else{let t=await (0,i.loadNetwork)(e);n=t.degree1,o=t.degree2,r=t.degree3}m(n),j(o),w(r||[]);let l={},a=new Set;[...n,...o,...r].forEach(e=>{if(a.has(e.profile_url))return;a.add(e.profile_url);let t=(0,S.companyOf)(e);t&&(l[t]||(l[t]={name:t,d1:0,d2:0,d3:0,sCount:0,aCount:0,people:[]}),1===e.degree?l[t].d1++:2===e.degree?l[t].d2++:l[t].d3++,"S"===e.tier&&l[t].sCount++,"A"===e.tier&&l[t].aCount++,l[t].people.push(e))}),d(Object.values(l).filter(e=>e.d1+e.d2+e.d3>=3).sort((e,t)=>3*t.sCount+2*t.aCount+t.d1+t.d2+t.d3-(3*e.sCount+2*e.aCount+e.d1+e.d2+e.d3))),y(!1)}},[e,B]);let[$,A]=(0,n.useState)(!1),[W,T]=(0,n.useState)([]);function I(e){let t=new Set(x.map(e=>e.profile_url)),n=new Set([...x,...b].map(e=>e.profile_url));return e.map(o=>({...o,connected:t.has(o.profile_url||o.profileUrl),known:n.has(o.profile_url||o.profileUrl),seniority:(0,S.getSeniority)(o.headline),mutualCount:e.filter(e=>t.has(e.profile_url||e.profileUrl)&&e.id!==o.id).length}))}function D(e){p(e),u(I(e.people))}async function O(){if(l.IS_DEMO||!c)return;let e=!1;try{e="1"===localStorage.getItem("six-degrees-company-scan-ok")}catch{}if(!e){if(!window.confirm("Company scans are experimental: they have not been tested against live LinkedIn yet, so the results may be incomplete. Like any scan, it opens a Chrome window and counts toward the profile views LinkedIn watches.\n\nRun it anyway?"))return;try{localStorage.setItem("six-degrees-company-scan-ok","1")}catch{}}A(!0),T(["Checking the scanner..."]);let t=(0,r.notReadyMessage)(await (0,r.scraperStatus)().catch(()=>null));if(t){T([t]),A(!1);return}try{let e=await (0,r.runScrape)("company",{name:c.name,onLog:T});if(0===e.exitCode){T(e=>[...e,"Loading the new people..."]);let e=await fetch(`/api/connections?scanned_company=${encodeURIComponent(c.name)}&limit=500`),t=(await e.json()).connections||[];t.length?(u(I(t)),T(e=>[...e,`${t.length} people at ${c.name}.`])):T(e=>[...e,"Nothing new was found."])}}catch(e){T([e.message||"Failed to start the scan"])}finally{A(!1)}}let N={},E=0;h.forEach(e=>{let t=e.seniority.key;N[t]||(N[t]={...e.seniority,people:[]}),e.connected&&E++;let n=Math.min(90,12*e.mutualCount);e.seniority.level<=1?n+=20:e.seniority.level<=2?n+=10:e.seniority.level>=5&&(n-=10),n=Math.max(5,Math.min(95,n)),e.connected&&(n=100);let o=null;if(2===e.degree&&e.source_connection_id){let t=x.find(t=>t.id===e.source_connection_id);t&&(o=t.name)}let r={0:5,1:10,2:20,3:35,4:50,5:75,6:100}[e.seniority.level]||10;N[t].people.push({...e,likelihood:n,bridgeName:o,xp:r})}),Object.values(N).forEach(e=>e.people.sort((e,t)=>t.likelihood-e.likelihood));let U=Object.values(N).sort((e,t)=>t.level-e.level);return l.IS_DEMO?(0,t.jsxs)("div",{style:{minHeight:"100vh",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:12,background:"#0a0a1a",color:"rgba(255,255,255,0.7)",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},children:[(0,t.jsx)("h1",{style:{fontSize:20,fontWeight:700,margin:0,color:"#fff"},children:"Not part of the demo"}),(0,t.jsx)("p",{style:{fontSize:13,margin:0},children:"The public demo includes the Network Circle and Degrees views only."}),(0,t.jsx)(f.default,{href:"/",style:{fontSize:13,color:"#888",textDecoration:"none"},children:"← Back to the network"})]}):g?(0,t.jsx)("div",{style:{minHeight:"100vh",display:"flex",alignItems:"center",justifyContent:"center",background:"#0a0a1a",color:"#fff"},children:"Loading..."}):(0,t.jsxs)("div",{style:{height:"100vh",background:"#0a0a1a",color:"#fff",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',display:"flex",flexDirection:"column",overflow:"hidden"},children:[(0,t.jsx)("header",{style:{padding:"14px 24px",borderBottom:"1px solid rgba(255,255,255,0.1)",flexShrink:0},children:(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:12},children:[(0,t.jsxs)(f.default,{href:"/",style:{display:"flex",alignItems:"center",gap:6,color:"#888",textDecoration:"none",fontSize:13,fontWeight:600,padding:"6px 14px",borderRadius:6,background:"rgba(255,255,255,0.06)",border:"1px solid rgba(255,255,255,0.1)"},children:[(0,t.jsx)("span",{style:{fontSize:16},children:"←"})," Map"]}),(0,t.jsx)("h1",{style:{fontSize:20,fontWeight:700,margin:0,background:"linear-gradient(135deg, #00ff88, #3498DB)",WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent"},children:"Paths"}),!c&&(0,t.jsx)("div",{style:{display:"flex",gap:4,marginLeft:8,padding:3,borderRadius:8,background:"rgba(255,255,255,0.05)"},children:L.map(([e,n])=>(0,t.jsx)("button",{onClick:()=>M(e),style:{padding:"5px 12px",borderRadius:6,border:"none",cursor:"pointer",fontSize:12.5,fontWeight:700,background:z===e?"linear-gradient(135deg, #00ff88, #3498DB)":"transparent",color:z===e?"#000":"#aab"},children:n},e))}),c&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("button",{onClick:()=>{p(null),u([])},style:{background:"none",border:"none",color:"#888",cursor:"pointer",fontSize:12},children:"← Companies"}),(0,t.jsx)("span",{style:{fontSize:13,fontWeight:600},children:c.name}),(0,t.jsxs)("span",{style:{fontSize:11,color:"#888"},children:[E,"/",h.length," connected"]}),(0,t.jsx)("button",{onClick:O,disabled:$,style:{marginLeft:"auto",padding:"5px 12px",borderRadius:6,border:"none",cursor:$?"not-allowed":"pointer",background:$?"#333":"rgba(0,255,136,0.15)",color:$?"#555":"#00ff88",fontSize:11,fontWeight:600},children:$?"Scanning...":"+ Scan Full Company"}),(0,t.jsx)("span",{title:"Not yet tested against live LinkedIn. Results may be incomplete.",style:{fontSize:9.5,fontWeight:800,letterSpacing:.6,padding:"3px 7px",borderRadius:20,border:"1px solid rgba(255,215,0,0.45)",color:"#FFD700"},children:"EXPERIMENTAL"})]})]})}),c||"scores"!==z?c||"companies"===z?(0,t.jsx)("div",{style:{flex:1,overflow:"auto",padding:"16px 24px"},children:(0,t.jsxs)("div",{style:{maxWidth:700,margin:"0 auto"},children:[!c&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("p",{style:{fontSize:13,color:"#888",marginBottom:16},children:["Pick a company to see your path to the top. Based on ",x.length+b.length," people in your network."]}),(0,t.jsx)("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:10},children:a.slice(0,60).map(e=>(0,t.jsxs)("button",{onClick:()=>D(e),style:{padding:"14px",borderRadius:10,border:"none",cursor:"pointer",textAlign:"left",background:"rgba(255,255,255,0.04)",transition:"background 0.15s",borderLeft:`3px solid ${e.sCount>0?"#FFD700":e.aCount>0?"#9B59B6":"#3498DB"}`},onMouseEnter:e=>e.currentTarget.style.background="rgba(255,255,255,0.08)",onMouseLeave:e=>e.currentTarget.style.background="rgba(255,255,255,0.04)",children:[(0,t.jsx)("div",{style:{fontSize:14,fontWeight:700,color:"#fff",marginBottom:4},children:e.name}),(0,t.jsxs)("div",{style:{display:"flex",gap:8,fontSize:10,color:"#888"},children:[(0,t.jsxs)("span",{style:{color:"#00ff88"},children:[e.d1," connected"]}),(0,t.jsxs)("span",{children:[e.d2+e.d3," locked"]})]}),(0,t.jsxs)("div",{style:{display:"flex",gap:6,marginTop:4,fontSize:9},children:[e.sCount>0&&(0,t.jsxs)("span",{style:{color:"#FFD700",fontWeight:600},children:[e.sCount,"S"]}),e.aCount>0&&(0,t.jsxs)("span",{style:{color:"#9B59B6",fontWeight:600},children:[e.aCount,"A"]}),(0,t.jsxs)("span",{style:{color:"#555"},children:[e.d1+e.d2," total"]})]}),(0,t.jsx)("div",{style:{height:3,background:"rgba(255,255,255,0.08)",borderRadius:2,marginTop:6},children:(0,t.jsx)("div",{style:{height:"100%",borderRadius:2,width:`${e.d1/Math.max(e.d1+e.d2+e.d3,1)*100}%`,background:e.sCount>0?"#FFD700":"#00ff88"}})})]},e.name))})]}),$&&(0,t.jsxs)("div",{style:{padding:"10px",borderRadius:8,background:"rgba(0,255,136,0.06)",border:"1px solid rgba(0,255,136,0.2)",marginBottom:12},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:6,marginBottom:4},children:[(0,t.jsx)("div",{style:{width:6,height:6,borderRadius:"50%",background:"#00ff88",animation:"pulse 1s infinite"}}),(0,t.jsx)("span",{style:{fontSize:10,fontWeight:600,color:"#00ff88"},children:"Scanning LinkedIn..."})]}),(0,t.jsx)("div",{style:{fontFamily:"monospace",fontSize:9,color:"#777",maxHeight:60,overflow:"auto"},children:W.map((e,n)=>(0,t.jsx)("div",{children:e},n))})]}),c&&U.map(e=>(0,t.jsxs)("div",{style:{marginBottom:16},children:[(0,t.jsxs)("div",{style:{padding:"8px 12px",borderRadius:6,marginBottom:4,background:e.level>=5?"rgba(255,215,0,0.08)":e.level>=3?"rgba(155,89,182,0.08)":"rgba(52,152,219,0.08)",borderLeft:`3px solid ${e.level>=5?"#FFD700":e.level>=3?"#9B59B6":"#3498DB"}`,display:"flex",justifyContent:"space-between",alignItems:"center"},children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{style:{fontSize:12,fontWeight:700,color:e.level>=5?"#FFD700":e.level>=3?"#9B59B6":"#3498DB"},children:e.label}),e.level>=5&&(0,t.jsx)("span",{style:{fontSize:9,color:"#FF6B35",marginLeft:8,fontWeight:700},children:"TARGET"})]}),(0,t.jsxs)("div",{style:{display:"flex",gap:8,alignItems:"center"},children:[(0,t.jsxs)("span",{style:{fontSize:9,color:"#FF6B35",fontWeight:600},children:["+",e.people.filter(e=>!e.connected).reduce((e,t)=>e+(t.xp||0),0)," XP"]}),(0,t.jsxs)("span",{style:{fontSize:10,color:"#666"},children:[e.people.filter(e=>e.connected).length,"/",e.people.length]})]})]}),e.people.map((n,o)=>(0,t.jsx)(P,{p:n,level:e,companyPeople:h,d1Data:x,selectedCompany:c},n.id||o))]},e.key))]})}):(0,t.jsx)(R,{d1:x,d2:b,d3:k,tab:z,onOpenCompany:e=>D({...e,sCount:e.S,aCount:e.A})}):(0,t.jsx)(v,{onRescored:()=>F(e=>e+1)})]})}function P({p:e,level:o,companyPeople:r,d1Data:i,selectedCompany:l}){let[s,a]=(0,n.useState)(!1),d=new Set(i.map(e=>e.profile_url));r.filter(e=>d.has(e.profile_url||e.profileUrl));let c=r.filter(t=>(0,S.getSeniority)(t.headline).level>e.seniority.level&&!d.has(t.profile_url||t.profileUrl)),p=r.filter(t=>(0,S.getSeniority)(t.headline).level===e.seniority.level&&t.id!==e.id),h=[];if(!e.connected){let t=c.length;t>0&&h.push({icon:"⬆️",text:`Adding them gives you a mutual with ${t} people above in the hierarchy`,color:"#00ff88"});let n=p.filter(e=>d.has(e.profile_url||e.profileUrl)).length;n>0?h.push({icon:"🤝",text:`${n} people at their level already connected — high social proof`,color:"#FFD700"}):h.push({icon:"🎯",text:"First connection at this level — opens a new layer",color:"#3498DB"}),e.bridgeName&&h.push({icon:"🔗",text:`Reachable through ${e.bridgeName} — warm intro possible`,color:"#FF6B35"}),e.seniority.level>=5?h.push({icon:"👑",text:`${e.seniority.label} — decision maker, high strategic value but low accept rate`,color:"#FFD700"}):e.seniority.level>=3?h.push({icon:"📊",text:`${e.seniority.label} — middle management, good balance of access and accept rate`,color:"#9B59B6"}):h.push({icon:"✅",text:`${e.seniority.label} — highest accept rate, builds mutual foundation for people above`,color:"#00ff88"}),e.likelihood>=60?h.push({icon:"🔥",text:`${e.likelihood}% likely to accept — strong mutual overlap + approachable role`,color:"#00ff88"}):e.likelihood>=30?h.push({icon:"⚡",text:`${e.likelihood}% likely — moderate chance, add more people at their level first`,color:"#FFD700"}):h.push({icon:"🔒",text:`${e.likelihood}% likely — low chance right now, build more connections below them first`,color:"#ff5050"})}return(0,t.jsxs)("div",{style:{borderBottom:"1px solid rgba(255,255,255,0.03)"},children:[(0,t.jsxs)("div",{onClick:()=>a(!s),style:{display:"flex",alignItems:"center",gap:8,padding:"6px 8px",cursor:"pointer",opacity:e.connected?.7:1},onMouseEnter:e=>e.currentTarget.style.background="rgba(255,255,255,0.04)",onMouseLeave:e=>e.currentTarget.style.background="transparent",children:[(0,t.jsx)("span",{style:{fontSize:8,color:"#555",flexShrink:0,width:10},children:s?"▾":"▸"}),(0,t.jsx)("div",{style:{width:18,height:18,borderRadius:"50%",flexShrink:0,fontSize:8,display:"flex",alignItems:"center",justifyContent:"center",background:e.connected?"rgba(0,255,136,0.2)":"rgba(255,255,255,0.05)",color:e.connected?"#00ff88":"#555",border:`1px solid ${e.connected?"rgba(0,255,136,0.3)":"rgba(255,255,255,0.1)"}`},children:e.connected?"✓":"🔒"}),e.profile_image_url||e.imageUrl?(0,t.jsx)("img",{src:e.profile_image_url||e.imageUrl,alt:"",style:{width:26,height:26,borderRadius:"50%",objectFit:"cover",flexShrink:0},onError:e=>e.target.style.display="none"}):(0,t.jsx)("div",{style:{width:26,height:26,borderRadius:"50%",flexShrink:0,fontSize:10,fontWeight:700,background:"#333",color:"#888",display:"flex",alignItems:"center",justifyContent:"center"},children:e.name?.charAt(0)}),(0,t.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,t.jsx)("div",{style:{fontSize:11,fontWeight:600,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.name}),(0,t.jsx)("div",{style:{fontSize:8,color:"#666",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.headline?.substring(0,45)})]}),!e.connected&&e.bridgeName&&(0,t.jsxs)("span",{style:{fontSize:8,color:"#FF6B35",flexShrink:0,maxWidth:55,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:["via ",e.bridgeName.split(" ")[0]]}),!e.connected&&(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:6,flexShrink:0},children:[(0,t.jsxs)("span",{style:{fontSize:8,fontWeight:700,color:"#FF6B35"},children:["+",e.xp]}),(0,t.jsxs)("div",{style:{fontSize:9,fontWeight:700,minWidth:30,textAlign:"right",color:e.likelihood>=60?"#00ff88":e.likelihood>=30?"#FFD700":"#ff5050"},children:[e.likelihood,"%"]})]}),!e.connected&&(0,t.jsx)("a",{href:e.profile_url||e.profileUrl,target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),style:{padding:"3px 7px",borderRadius:4,fontSize:8,fontWeight:700,background:"#0077B5",color:"#fff",textDecoration:"none",flexShrink:0},children:"Add"})]}),s&&(0,t.jsxs)("div",{style:{padding:"8px 12px 10px 44px",background:"rgba(255,255,255,0.02)",borderTop:"1px solid rgba(255,255,255,0.04)"},children:[(0,t.jsx)("div",{style:{fontSize:11,color:"#aaa",marginBottom:8},children:e.headline||"No headline available"}),(0,t.jsxs)("div",{style:{display:"flex",gap:6,alignItems:"center",marginBottom:8,flexWrap:"wrap"},children:[(0,t.jsxs)("div",{style:{display:"inline-block",padding:"2px 8px",borderRadius:4,fontSize:9,fontWeight:600,background:e.seniority.level>=5?"rgba(255,215,0,0.1)":e.seniority.level>=3?"rgba(155,89,182,0.1)":"rgba(52,152,219,0.1)",color:e.seniority.level>=5?"#FFD700":e.seniority.level>=3?"#9B59B6":"#3498DB",border:`1px solid ${e.seniority.level>=5?"rgba(255,215,0,0.2)":e.seniority.level>=3?"rgba(155,89,182,0.2)":"rgba(52,152,219,0.2)"}`},children:[e.seniority.label," · Level ",e.seniority.level]}),!e.connected&&(0,t.jsxs)("div",{style:{display:"inline-block",padding:"2px 8px",borderRadius:4,fontSize:9,fontWeight:700,background:"rgba(255,107,53,0.1)",color:"#FF6B35",border:"1px solid rgba(255,107,53,0.2)"},children:["+",e.xp," XP"]})]}),!e.connected&&h.length>0&&(0,t.jsxs)("div",{style:{marginTop:4},children:[(0,t.jsx)("div",{style:{fontSize:9,fontWeight:700,color:"#888",letterSpacing:.5,marginBottom:4},children:"STRATEGIC VALUE"}),h.map((e,n)=>(0,t.jsxs)("div",{style:{display:"flex",gap:6,alignItems:"flex-start",padding:"2px 0",fontSize:10,color:"#bbb"},children:[(0,t.jsx)("span",{style:{fontSize:11,lineHeight:1},children:e.icon}),(0,t.jsx)("span",{style:{color:e.color},children:e.text})]},n))]}),e.connected&&(0,t.jsxs)("div",{style:{fontSize:10,color:"#00ff88",fontWeight:600},children:["✓ Already connected — contributes as mutual for others at ",l?.name]})]})]})}e.s(["default",0,function(){return(0,t.jsx)(a.default,{children:(0,t.jsx)(n.Suspense,{children:(0,t.jsx)(U,{})})})}],85957)},18566,(e,t,n)=>{t.exports=e.r(76562)}]);
@@ -0,0 +1,14 @@
1
+ self.__MIDDLEWARE_MATCHERS = [
2
+ {
3
+ "regexp": "^(?:\\/(_next\\/data\\/[^/]{1,}))?\\/api(\\.json|\\.rsc|\\.segments\\/.+\\.segment\\.rsc)?[\\/#\\?]?$",
4
+ "originalSource": "/api"
5
+ },
6
+ {
7
+ "regexp": "^(?:\\/(_next\\/data\\/[^/]{1,}))?\\/api(?:\\/((?!data\\/import$).*))(\\.json|\\.rsc|\\.segments\\/.+\\.segment\\.rsc)?[\\/#\\?]?$",
8
+ "originalSource": "/api/((?!data/import$).*)"
9
+ },
10
+ {
11
+ "regexp": "^(?:\\/(_next\\/data\\/[^/]{1,}))?\\/avatars(?:\\/((?:[^\\/#\\?]+?)(?:\\/(?:[^\\/#\\?]+?))*))?(\\.json|\\.rsc|\\.segments\\/.+\\.segment\\.rsc)?[\\/#\\?]?$",
12
+ "originalSource": "/avatars/:path*"
13
+ }
14
+ ];self.__MIDDLEWARE_MATCHERS_CB && self.__MIDDLEWARE_MATCHERS_CB()
package/CHANGELOG.md CHANGED
@@ -6,6 +6,331 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.3.0-beta.1] - 2026-09-26 (beta: a pre-release, never installed automatically)
10
+
11
+ ### Added
12
+ - **The Mac app scans with nothing to install.** It carries its own Python (3.12) with the
13
+ scanner's packages already inside it, so the Scan page's first step is ticked from the
14
+ start: nothing to install, nothing to click, and setting up needs no internet. Scanning
15
+ still needs Google Chrome. The download grows by about 22 MB, to about 220 MB.
16
+ Playwright's own copy of Node isn't duplicated: it runs on the one the app already has.
17
+ The Python inside is signed like the rest of the app, uses only its own packages (your
18
+ own Python settings, such as `PYTHONPATH`, don't reach it), and never writes into the
19
+ app; nor does a scan on another Python. If macOS ever won't run it, the Scan page says
20
+ so and offers the other way to set the scanner up, and the app doesn't try it again
21
+ until you restart it, so a warning from macOS about it doesn't keep coming back.
22
+ - **Set up the scanner** (`npx six-degrees`, or from source). On a computer with no Python
23
+ the scanner can use (none at all, one older than 3.10, or Ubuntu's without
24
+ `python3-venv`), the Scan page no longer ends at "install it from python.org". One
25
+ button downloads a private copy of Python 3.12 from GitHub (python-build-standalone,
26
+ 24 to 33 MB) into your data folder, checks it against a checksum built into Six Degrees
27
+ before unpacking anything, and installs the scanner's packages into it, with the
28
+ download's progress on the page. Only when you click it, and Stop stops it. Nothing
29
+ outside your data folder changes, and neither the Python nor the packages ever go into
30
+ a copy of your network. A stopped setup carries on from the Python already downloaded.
31
+ With Python 3.10 to 3.14 installed, Install works as before.
32
+ - **Settings.** A new page, from the ⚙ button beside the bell or *Six Degrees → Settings…*
33
+ (⌘,). It's the new home for **Updates**, and it shows which version this is and where
34
+ your network is kept. What you choose there is saved with your network, so it travels
35
+ with your data. *Check for Updates…* in the menu opens it and runs the check; the Scan
36
+ page links to it.
37
+ - **Your sector (Settings).** Pick up to three sectors you work in and how much to lean
38
+ toward them. A pick is one of twelve broad industries or one of 49 narrower sectors from a
39
+ built-in directory (Dental, Real Estate, Software & SaaS, Insurance, K-12 Education,
40
+ Beauty & Personal Care, Agriculture & Farming, Veterinary & Animal Care, Social Work &
41
+ Human Services, Security Services…): open an industry to see its sectors, search by a job,
42
+ a kind of business or a company ("dentist", "bakery", "Stripe"), or take a sector
43
+ suggested from your own network ("Dental: 42 people at 17 companies"). An industry
44
+ includes its sectors: it counts any company in one of its sectors, so Healthcare & Biotech
45
+ takes in a practice only the directory calls dental, and a company whose one industry the
46
+ built-in list or the company's own name gives. Not one known only from its people's job
47
+ titles: "Recruiter at Acme Widgets" doesn't make Acme a consulting firm, nor "Software
48
+ Engineer at Pinecrest Foods" a tech company (Paths still colours them by what their people
49
+ say). A directory sector goes by a fixed list of words, as whole words, in the company's
50
+ name or in the headlines of at least half of the people you know there; for a one-person
51
+ company, that person decides. Ten sectors are work every kind of company has (HR &
52
+ Recruiting, Marketing & Advertising, PR & Communications, Accounting & Tax, Legal,
53
+ Management Consulting, Software & SaaS, AI & Data, Cybersecurity, Security Services): for
54
+ those a job title in a headline doesn't count, so "Recruiter at Acme Widgets" doesn't make
55
+ Acme a recruiting firm and "Software Engineer at Chase" doesn't make a bank a software
56
+ company; the company's name ("Acme Staffing", "Smith CPA") or a kind of firm ("staffing
57
+ agency", "law firm", "SaaS") does. Nor do the industry words beside such a job ("University
58
+ Recruiter", "Insurance Defense Attorney", "Dental Marketing Manager"). The lists name only
59
+ companies known across the country, and schools by their names, not their short names
60
+ (UCF, NYU): a regional company or a school is placed by the words in its name and its
61
+ people's headlines, like everything else. There's no AI and nothing is sent anywhere: the
62
+ same words give the same answer on every computer, and anyone can add to the list. Companies in your sectors get +1 ("lean") or +2 ("strong") on their score,
63
+ once however many of your picks they're in, never above 10 and never on a score you set on
64
+ Paths → Scores, so the people there rank higher; the working names the sector ("4 + 1 your
65
+ sector: Dental"). It lifts companies, not what people claim: a reach bonus at an unknown
66
+ company stays halved. Before you save, it shows how many companies and people would move,
67
+ with examples; saving rescores everyone and reports the same count, and turning it off
68
+ gives back exactly the scores from before. When an update changes the directory's words,
69
+ scores that use it are redone on the next load. It applies to networks you've scanned: a
70
+ CSV import and the sample network aren't re-weighted or counted in the suggestions, and
71
+ the page says so when one is open. Tiers still rank how reachable someone is, not people.
72
+ The profile's *Your Sectors* now shows what you picked (it was always empty), and Paths →
73
+ Scores marks the companies your sector lifted. `/paths?tab=scores` opens Paths on its
74
+ Scores tab.
75
+ - **Settings → Your data.** Where your network is kept, with *Copy the path* and *Show in
76
+ Finder*; what it takes up (your network, profile photos, backups); every backup with its
77
+ date and why it was made; and whether a LinkedIn sign-in is kept here. The folder can't be
78
+ moved from the app, and the page says why.
79
+ - **Move your network to another computer.** *Save a copy of my network* makes one
80
+ `.sixdegrees` file: your network, your settings, the scanner's progress, skip lists and
81
+ LinkedIn budget, and the profile photos of the people in it unless you untick them. Your
82
+ LinkedIn sign-in is never in it; you sign in again on the new computer. There, *Import*
83
+ checks the file first and changes nothing if it isn't whole and undamaged, from this
84
+ version or an older one. It replaces the network there (the two are never merged, and a
85
+ network that has people asks you to confirm how many it replaces) the next time Six
86
+ Degrees starts, after keeping a copy of what was there in `backups/`; the README says how
87
+ to put it back. The LinkedIn search budget belongs to the account, so that computer keeps
88
+ its own: searches made on either computer still count, and a pause on scanning stays. The
89
+ Mac app finishes with *Restart now*; with `npx six-degrees`, stop it and start it again.
90
+ Refused while a scan, or setting up the scanner, runs (it says which), scans wait until
91
+ the import is finished, and the import waits while another copy of Six Degrees has the
92
+ same folder open.
93
+ - **Install and restart, in the Mac app: updating without Terminal.** When *Check for
94
+ Updates…* finds a newer version, one more click installs it. The app downloads that
95
+ release from GitHub (about 220 MB), checks it against the release's published checksums
96
+ and checks that the app's code signature is intact, and gets it ready while you keep
97
+ working. Then it closes, puts the new version in its place and opens it on Settings,
98
+ which says how it went ("Updated to 0.2.2"). Your network isn't touched, and the new
99
+ version backs it up before it opens it.
100
+ - Nothing is downloaded until you click Install, and it never happens by itself. It
101
+ installs the version the check showed you; if a newer one came out in between, it asks
102
+ you to check again.
103
+ - If the new version can't be put in place, won't open, or closes before its first page
104
+ appears, your previous version is put back and reopened, and Settings says why. Once
105
+ the new version has started, the previous one is kept, zipped, in
106
+ `~/Library/Caches/Six Degrees` until the next update: the way back if the new one
107
+ misbehaves later.
108
+ - While it swaps the app, it stops only the app's own programs. A Terminal or an editor
109
+ open in the app's folder is left alone.
110
+ - When the app can't replace itself (it's running from the disk image, from a folder your
111
+ user can't change, another user installed it or has it open, or your network is kept
112
+ inside the app), it says why and what to do. Where the Terminal line helps, it gives
113
+ you the line and says what it will do; where the line would delete your network, it
114
+ doesn't offer it. The npm and source copies keep their Terminal lines.
115
+ - Copies of 0.2.1 and older don't have the button: update them with the Terminal line
116
+ once more.
117
+
118
+ ### Changed
119
+ - The Scan page's first step is now **Set up the scanner**. When it can't use this
120
+ computer's Python, it says which one it found and why. Install no longer updates pip
121
+ first: everything it downloads is a pinned file. It leaves out pip settings that would
122
+ put the packages somewhere else (`PIP_TARGET`, `PIP_PREFIX`, `PIP_ROOT`, `PIP_USER`;
123
+ your index, proxy and certificate settings still apply), and it checks that the scanner
124
+ can load them before it says it has finished.
125
+ - **The scanner's Python packages are pinned**: exact versions (Playwright 1.63.0, requests
126
+ 2.34.2, Pillow 12.3.0 and everything they need) and the checksum of every file pip may
127
+ install. Only ready-built files (wheels), so nothing is built from source on your
128
+ computer, and pip refuses any file that isn't the one pinned. They need Python 3.10 to
129
+ 3.14 (the newest Playwright needs 3.10, and 3.14 is the newest the pinned files are built
130
+ for); a Python that already has the scanner's packages keeps working as it is.
131
+ - **The Queue and the person panel go by company scores, not a list of names.** Both kept
132
+ their own list of one person's favourite companies (Snap, Polymarket, Whatnot…), matched
133
+ anywhere in a headline: "Metadata Analyst" counted as Meta, "Snapdragon" as Snap, and an
134
+ ex-Googler as someone at Google. Now the Queue adds its +1 when the company someone's
135
+ score is built on scores 8 or more, once, and the panel's "top-tier company" and "former"
136
+ notes name a company that scores 8 or more, with its score: the one the score was built
137
+ on, when someone has two roles alike. That's the curated list's major companies and up, or
138
+ any company you score that high on Paths → Scores or lift there with *Your sector*.
139
+ - **Built-in company scores are the same for everyone.** The built-in list of well-known
140
+ companies, which every network's scores start from, held some personal and regional
141
+ picks: Snap at 9 as "home turf", UCF at 5 as a "local institution", and a group of 6s
142
+ from one network and one region. One written rule now decides who is on it: companies most US
143
+ professionals would recognise (household names, Fortune 500-sized companies, top
144
+ investment, consulting, law and accounting firms, frontier AI labs, top national
145
+ universities), scored on one scale from 7 to 10. Snap goes from 9 to 8, like Pinterest,
146
+ Reddit and X, and MrBeast from 8 to 7. 32 companies leave the list, among them UCF, the
147
+ University of Florida, AdventHealth, Polymarket, Kalshi and Anduril; they're estimated from
148
+ your network like any other company, and you can score any of them on Paths → Scores. If
149
+ your scanned network had people at a company whose score changed, Paths → Scores offers
150
+ once to keep the old scores as your own: keep all, choose, or no thanks. It offers each old
151
+ score only for its own company's names (a Snap-on person isn't counted under Snap), and
152
+ closes on its own when your network has nothing to offer. Not for a new database, a CSV
153
+ import or the sample. The words that guess a company's industry lose the same kind of
154
+ picks: "UCF" (education), "Snap", "Lens" and "AR" (media; "AR Specialist" is accounts
155
+ receivable), Polymarket, Anduril, Sandia and Whatnot ("whatnot" is also a word), and
156
+ "growth", a job title: "Head of Growth at Acme Software" works at a software company, and
157
+ "Summit Growth Equity" is an investment firm, not media ("growth marketing" is still
158
+ marketing). Your network is rescored once, automatically, on the first load after
159
+ updating.
160
+ - **The reach bonus counts the top award of every field.** It named four awards, from
161
+ advertising, TV, music and the web (Cannes Lions, the Emmys, the Grammys, the Webbys), so
162
+ a Pulitzer, an Oscar, a Nobel Prize or an Olympic medal earned nothing. Now it's the top
163
+ honour of each field: the Nobel, the Pulitzer, the Peabody, the Emmy, the Grammy, the
164
+ Oscar, the Tony, the Webby, the Clio and Cannes Lions, the James Beard, the Turing Award,
165
+ the Fields Medal, the Pritzker Prize, MacArthur Fellows, Rhodes Scholars, Olympians and
166
+ Paralympians, as well as "award-winning" and "prize-winning". A name that is also a
167
+ company's or a person's counts only as a claim ("Oscar-winning", "Tony Award", "Emmy
168
+ nominee"): Oscar Health, Peabody Energy and Clio get nothing, and "Emmy" or "Grammy"
169
+ anywhere in a headline no longer counts on its own. Your network is rescored once,
170
+ automatically, on the first load after updating; stored scores now carry a fingerprint of
171
+ scoring's rules as well as its lists, so a later change to them rescores the same way.
172
+ - **Two industries have plainer names.** "Finance, VC & Crypto" is "Finance & Investing"
173
+ and "Marketing, Media & Creator" is "Marketing & Media", in Settings, Paths and the
174
+ working beside a score. Crypto and the creator economy are sectors of their own in the
175
+ directory (Crypto & Web3, Creator Economy). What you picked stays picked.
176
+ - **The built-in company list reaches well beyond tech and finance.** 112 companies most US
177
+ professionals would recognise join it, taken from named sources so anyone can check the
178
+ choice: the household names of the Fortune 100 (CVS Health, Costco, Ford, UPS, State Farm,
179
+ Verizon, ExxonMobil…); the largest household names in health care, retail, food, hotels,
180
+ autos, airlines, telecoms, energy, shipping and news (Kaiser Permanente, Mayo Clinic,
181
+ McDonald's, Marriott, Honda, Delta, DHL, The New York Times…); nine of the ten largest US
182
+ law firms (Kirkland & Ellis, Latham & Watkins…); the largest private equity firms
183
+ (Blackstone, KKR, Apollo); and the top 20 national universities (Princeton, Yale, Johns
184
+ Hopkins…). They're scored on the same 7 to 10 scale as the companies already on it.
185
+ Nothing already on the list changes, so there's nothing to keep; your network is rescored
186
+ once, automatically, on the first load after updating. "Home Depot" now counts as a
187
+ company: it used to be dropped along with phrases like "at home".
188
+ - **Each company has one industry, used everywhere.** The curated list now names each
189
+ company's industry, so Adobe, Pfizer or MIT (no industry word in the name) no longer
190
+ take whatever their people's headlines say. Otherwise the name decides, else what
191
+ most of the people there say; a tie stays unclear. Paths' colours, the Scores list and
192
+ the "not for schools" rule in the company estimate now agree, where before each person's
193
+ own headline could put the same company in a different industry. Your network is
194
+ rescored once, automatically, on the first load after updating.
195
+
196
+ ### Removed
197
+ - **The retired SQL scorers.** `scripts/score_new_connections.sql`, the hosted-era scoring
198
+ model retired in 0.1.10, still shipped inside the Mac app and the npm package, headed
199
+ "CANONICAL SCORER" and holding the old list's personal picks. Nothing read it (imports
200
+ score with `lib/scoring.js`). It and its repo-only twin, `scripts/score-connections.sql`,
201
+ are deleted; git history keeps them.
202
+
203
+ ### Fixed
204
+ - **Students and school clubs read the same at every school.** The title rules named two
205
+ schools, UCF and UF: "President, UCF Marketing Club" counted as a student's club role and
206
+ "CS @ UCF" as a student, while "VP, NYU Finance Society" counted as a VP and "CS @ NYU" as
207
+ someone working at NYU. A school's short name in capitals (UCF, NYU, USC, BYU…) now counts
208
+ for every school, and an alumni club or a parents' association is no longer taken for a
209
+ student club. What that costs: a short name is two to four capitals that start or end with
210
+ a U, so companies and unions that look like one are set aside by name (the curated list's
211
+ companies, such as UPS, and UBS, UFC, UPMC, UnitedHealth's UHG and UHC, UA, UL, ULA, UTC,
212
+ the UAW, USW, SEIU, UFCW and UFT): "Finance @ UBS" works in finance, and "President, UAW
213
+ Local 600 Chapter" leads a union local. A school whose short name is on that list isn't read
214
+ from it; with a short name only a club or a society counts as a school's, or an association
215
+ named for a field of study ("USC Trojan Marketing Association"), so a chapter named only by
216
+ one ("President, UCF Chapter of IEEE") reads as the title it says; and a company's short name
217
+ that isn't on the list still reads as a school's in "Marketing @ …".
218
+ - **Companies that share a name with a well-known one are themselves.** The curated list's
219
+ names matched anything that started with them: Snap-on, Snap Finance and Specs Optical
220
+ counted as Snap, Harvard Pilgrim Health Care and Stanford Health Care as the universities,
221
+ Kellogg Brown & Root as Kellanova, Fidelity National Financial and Fidelity Bank as
222
+ Fidelity, Warner Music Group as Warner Bros. Discovery, J&J Snack Foods as Johnson &
223
+ Johnson, Toyota of Orlando and Coca-Cola Consolidated as the automaker and Coca-Cola, Citi
224
+ Trends as Citi, Merrill Gardens as Bank of America and Merck Millipore as Merck. A name
225
+ other companies share now matches only in its own company's forms ("Snap Inc.", "Harvard
226
+ Business School"); a dealership, a bottler, a venue or a company spun off keeps its own
227
+ name. So does a credential, a program or gig work on a company's platform, which used to
228
+ read as a job there when written first in a headline: "AWS Certified Solutions Architect"
229
+ was a role at Amazon (10), and "Uber Driver", "Airbnb Superhost", "Twitch Streamer",
230
+ "LinkedIn Top Voice" and "Google Alum" were at theirs. The sector directory reads names the
231
+ same way. Best Buy and Best Western count as companies (they were dropped with "at best"),
232
+ and so do Home Instead and Home Chef (dropped with "at home"). Chase Corporation and
233
+ Merrill Corporation aren't read as the banks once "Corporation" is trimmed, and a name
234
+ with initials is read in full: "J.P. Morgan" was cut to "J.P" and matched nothing, and
235
+ "J. Crew", "T. Rowe Price", "U.S. Bank" and "St. Jude Children's Research Hospital" lost
236
+ everything after the first full stop.
237
+ - **Paths groups people under the companies their scores are built on.** It merged
238
+ company names by a list of its own, which also folded other companies in: Oxford,
239
+ Hartford and Bradford counted as Ford, Bainbridge as Bain, and Mitsubishi UFJ, a bank, as
240
+ "Mitsubishi Power". Paths now names each company as the score does, from the one built-in
241
+ list, in its bubbles, its Companies list and its ways in; the score itself no longer reads
242
+ Mitsubishi's bank, lender or landlord as Mitsubishi. The launch page no longer claims "80+
243
+ company normalizations".
244
+ - **A refresh's notifications count who is new, and who scored high.** New connections were
245
+ the ones missing from a lookup of the first hundred, so a refresh of known people past a
246
+ hundred announced "10 new connections found!", and genuinely new ones were never announced.
247
+ "High-value connection" went by famous names anywhere in the headline ("Metadata Engineer",
248
+ "Engineer at Snap-on"). Now new means added by that refresh, and high-value means the model
249
+ scored them S or A.
250
+ - **The launch page's formula** is the one the app scores with, `T × (0.45 + 0.055 × C) + R +
251
+ B`, with S from 7.5. It showed the sum retired in 0.1.10.
252
+ - **The launch page shows the sample network's numbers, not one person's.** Its counters,
253
+ degree counts and feature cards were one real network's (2,438 connections, 25 bridges,
254
+ 798 recommendations…) shown as if they were the app's, and its footer named a company. They
255
+ are now counted from the invented sample network that comes with the app (873 connections,
256
+ 14 bridges, 748 people, 19 companies), and the page says so; the footer says the app is
257
+ open source (MIT). Its S tier card said 7.0+; S starts at 7.5. The public demo's profile no
258
+ longer names a company either.
259
+ - **Paths → Scores misstated the company weight.** It runs from 0.615 when no company is
260
+ found, not 0.56, up to 1.0 for a company scored 10.
261
+ - **Schools named like a company on the curated list were scored as that company.**
262
+ "Kellogg School of Management" counted as Kellanova (7), "Warner University" as Warner
263
+ Bros. Discovery (8), "Campbell University" as Campbell's (7) and "Chase College of Law" as
264
+ JPMorgan Chase (9). A name that says school, college or university now only matches a
265
+ school on the list. Bain Capital, a private equity firm, has its own entry (finance, still
266
+ 9) instead of being read as Bain & Company (consulting).
267
+ - **A relative `--data-dir` stays where you meant it.** `npx six-degrees --data-dir
268
+ my-network` used to keep that network inside npm's own cache (the server runs from the
269
+ package's folder), where clearing the cache deleted it; the Mac app looked for it inside
270
+ the app. It's now the folder from where you ran the command, the home folder when the
271
+ Mac app is opened with `open`, and `--data-dir=~/copy` means your home folder too.
272
+ - **No "Six Degrees stopped" error when something else closes the app.** When the
273
+ installer (or logging out) stops a running copy, the app's server ends with code 143
274
+ rather than by the signal, and the Mac app took any exit code for a crash. It now quits
275
+ quietly; a real crash is still reported.
276
+
277
+ ### Security
278
+ - **Pages on other local ports can no longer send the app commands.** The check that refuses
279
+ writes from other websites trusted the browser's "same-site" label. A site ignores the
280
+ port, so a page served by any other app or dev server on `127.0.0.1` counted as the same
281
+ site and could POST to `/api/update` and `/api/scraper`. A same-site write must now carry
282
+ an `Origin` that is exactly this app's host and port. The app's own pages are unaffected.
283
+ - **Websites can no longer read or change the network through DNS rebinding.** A site can
284
+ make its own domain point at `127.0.0.1`; the browser then treats the app as that site's
285
+ own origin, so the page could read `/api/network` and the photos, and send writes. While
286
+ the app is bound to loopback, requests to `/api` and `/avatars` must now be addressed to
287
+ `127.0.0.1`, `localhost` or `[::1]`; any other name gets a 421.
288
+ - The four new actions in Settings → Your data (save a copy, import, restart, show the
289
+ folder) are gated like the routes that delete data or start processes: never reachable
290
+ from another machine. An imported file is treated as untrusted and checked in full before
291
+ anything changes ([SECURITY.md](SECURITY.md)).
292
+
293
+ ## [0.2.1] - 2026-09-25
294
+
295
+ ### Added
296
+ - **Tutorial videos on the download website:** installing on a Mac, running it on Linux, and
297
+ how scanning works. They're short and silent, with the steps as captions.
298
+ - **`npx six-degrees` on Linux.** The npm package is published (0.2.0 was the first). The
299
+ README, the website and the installer's message now point Linux users to it, with how to
300
+ update it and where it keeps your data.
301
+
302
+ ### Fixed
303
+ - **Check for updates says what it found.** An up-to-date copy showed only a faint line, so
304
+ the button seemed to do nothing. The answer is now a clear status ("You're up to date: 0.2.1
305
+ is the newest version", with the time). The Mac app's **Check for Updates…** menu item opens
306
+ the Updates panel and runs the check, instead of just opening the top of the Scan page.
307
+ - **The profile page no longer starts scans.** Its "Set Up Account — Full Scan" and "Auto-Bridge
308
+ All Connections" cards are gone. The second mapped every connection in one go, with none of
309
+ the batch size, budget or warnings of the Scan page, where scanning lives.
310
+ - The window title is **Six Degrees** (it was "6 Degrees of Separation — LinkedIn Network
311
+ Research"), and the page description no longer claims to be a research project.
312
+ - The import page's "close the tab" note is true in the Mac app too.
313
+ - **Big LinkedIn exports import.** An export over about 9,000 connections was refused ("too large to hold in this browser tab"). The tab now keeps only what the export says about each person and scores it again on load, so exports up to LinkedIn's 30,000 maximum fit. Checked in a browser: 10,000 connections import and draw in about 4 seconds, 30,000 in about 25. It still never touches the database.
314
+ - **`npx six-degrees` downloads about 22 MB instead of about 235 MB.** The package already
315
+ carries its built server; Next, React and d3 are now build-time only.
316
+ - On Windows, npm now refuses the package with a clear "not supported" message instead of
317
+ installing it and crashing at start.
318
+ - On Linux without a desktop, `npx six-degrees` prints the address to open instead of a
319
+ crash when there's no browser to launch.
320
+ - The Scan page checks for Google Chrome on Linux too (where Playwright looks for it).
321
+ - Updating an npx copy says to stop it first, and keeps `--data-dir` if it was started
322
+ with one, so the new version finds your network.
323
+
324
+ ### Changed
325
+ - The app says **scanner** and **scan** everywhere you read it (the Scan page, the side
326
+ panel, the profile page, the import page); the code names are unchanged.
327
+ - Releases publish to npm through npm's trusted publishing: GitHub vouches for the release
328
+ workflow, so no npm token is stored anywhere. Each release builds the package on Linux,
329
+ installs it, checks it serves the app, and publishes that exact file.
330
+ - The README: macOS 15's second button is **Open Anyway**; the LinkedIn warning's link no
331
+ longer shows a file name; the release notes link the changelog.
332
+ - SECURITY.md lists all six gated routes (it said four).
333
+
9
334
  ## [0.2.0] - 2026-09-24
10
335
 
11
336
  ### Changed