six-degrees 0.3.0 → 0.4.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 (299) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +1 -0
  3. package/.next/standalone/.next/build-manifest.json +3 -3
  4. package/.next/standalone/.next/prerender-manifest.json +34 -6
  5. package/.next/standalone/.next/routes-manifest.json +6 -0
  6. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  7. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  14. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  16. package/.next/standalone/.next/server/app/_not-found.rsc +10 -10
  17. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +10 -10
  18. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +9 -9
  19. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  20. package/.next/standalone/.next/server/app/api/admin-delete/route.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/api/admin-update/route.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/api/bridges/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/bulk-import/route.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/company-scores/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/connections/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/data/export/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/data/import/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/data/restart/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/data/reveal/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/data/route.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/api/delete-cluster/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/ingest/route.js.nft.json +1 -1
  34. package/.next/standalone/.next/server/app/api/network/route.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/api/outreach/route.js +3 -3
  37. package/.next/standalone/.next/server/app/api/outreach/route.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/api/queue/route.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/api/scraper/route.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js.nft.json +1 -1
  43. package/.next/standalone/.next/server/app/api/setup-profile/route.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/api/unlock/route.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  46. package/.next/standalone/.next/server/app/api/update-images/route.js.nft.json +1 -1
  47. package/.next/standalone/.next/server/app/api/users/route.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/avatars/[file]/route.js.nft.json +1 -1
  49. package/.next/standalone/.next/server/app/import/page.js.nft.json +1 -1
  50. package/.next/standalone/.next/server/app/import/page_client-reference-manifest.js +1 -1
  51. package/.next/standalone/.next/server/app/import.html +1 -1
  52. package/.next/standalone/.next/server/app/import.rsc +12 -12
  53. package/.next/standalone/.next/server/app/import.segments/_full.segment.rsc +12 -12
  54. package/.next/standalone/.next/server/app/import.segments/_tree.segment.rsc +1 -1
  55. package/.next/standalone/.next/server/app/import.segments/import/__PAGE__.segment.rsc +11 -11
  56. package/.next/standalone/.next/server/app/index.html +1 -1
  57. package/.next/standalone/.next/server/app/index.rsc +12 -12
  58. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +11 -11
  59. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +12 -12
  60. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  61. package/.next/standalone/.next/server/app/launch/page.js.nft.json +1 -1
  62. package/.next/standalone/.next/server/app/launch/page_client-reference-manifest.js +1 -1
  63. package/.next/standalone/.next/server/app/launch.html +2 -2
  64. package/.next/standalone/.next/server/app/launch.rsc +12 -12
  65. package/.next/standalone/.next/server/app/launch.segments/_full.segment.rsc +12 -12
  66. package/.next/standalone/.next/server/app/launch.segments/_tree.segment.rsc +1 -1
  67. package/.next/standalone/.next/server/app/launch.segments/launch/__PAGE__.segment.rsc +11 -11
  68. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  69. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  70. package/.next/standalone/.next/server/app/paths/page.js.nft.json +1 -1
  71. package/.next/standalone/.next/server/app/paths/page_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/paths.html +1 -1
  73. package/.next/standalone/.next/server/app/paths.rsc +12 -12
  74. package/.next/standalone/.next/server/app/paths.segments/_full.segment.rsc +12 -12
  75. package/.next/standalone/.next/server/app/paths.segments/_tree.segment.rsc +1 -1
  76. package/.next/standalone/.next/server/app/paths.segments/paths/__PAGE__.segment.rsc +11 -11
  77. package/.next/standalone/.next/server/app/profile/page.js.nft.json +1 -1
  78. package/.next/standalone/.next/server/app/profile/page_client-reference-manifest.js +1 -1
  79. package/.next/standalone/.next/server/app/profile.html +1 -1
  80. package/.next/standalone/.next/server/app/profile.rsc +12 -12
  81. package/.next/standalone/.next/server/app/profile.segments/_full.segment.rsc +12 -12
  82. package/.next/standalone/.next/server/app/profile.segments/_tree.segment.rsc +1 -1
  83. package/.next/standalone/.next/server/app/profile.segments/profile/__PAGE__.segment.rsc +11 -11
  84. package/.next/standalone/.next/server/app/queue/page.js.nft.json +1 -1
  85. package/.next/standalone/.next/server/app/queue/page_client-reference-manifest.js +1 -1
  86. package/.next/standalone/.next/server/app/queue.html +1 -1
  87. package/.next/standalone/.next/server/app/queue.rsc +12 -12
  88. package/.next/standalone/.next/server/app/queue.segments/_full.segment.rsc +12 -12
  89. package/.next/standalone/.next/server/app/queue.segments/_tree.segment.rsc +1 -1
  90. package/.next/standalone/.next/server/app/queue.segments/queue/__PAGE__.segment.rsc +11 -11
  91. package/.next/standalone/.next/server/app/scores/page/app-paths-manifest.json +3 -0
  92. package/.next/standalone/.next/server/app/scores/page/build-manifest.json +20 -0
  93. package/.next/standalone/.next/server/app/scores/page/next-font-manifest.json +11 -0
  94. package/.next/standalone/.next/server/app/scores/page/react-loadable-manifest.json +1 -0
  95. package/.next/standalone/.next/server/app/scores/page/server-reference-manifest.json +4 -0
  96. package/.next/standalone/.next/server/app/scores/page.js +13 -0
  97. package/.next/standalone/.next/server/app/scores/page.js.map +5 -0
  98. package/.next/standalone/.next/server/app/scores/page.js.nft.json +1 -0
  99. package/.next/standalone/.next/server/app/scores/page_client-reference-manifest.js +3 -0
  100. package/.next/standalone/.next/server/app/scores.html +1 -0
  101. package/.next/standalone/.next/server/app/scores.meta +26 -0
  102. package/.next/standalone/.next/server/app/scores.rsc +24 -0
  103. package/.next/standalone/.next/server/app/scores.segments/_full.segment.rsc +24 -0
  104. package/.next/standalone/.next/server/app/scores.segments/_tree.segment.rsc +4 -0
  105. package/.next/standalone/.next/server/app/scores.segments/scores/__PAGE__.segment.rsc +28 -0
  106. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  107. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  108. package/.next/standalone/.next/server/app/settings.html +1 -1
  109. package/.next/standalone/.next/server/app/settings.rsc +12 -12
  110. package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +12 -12
  111. package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  112. package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +11 -11
  113. package/.next/standalone/.next/server/app/setup/page.js.nft.json +1 -1
  114. package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  115. package/.next/standalone/.next/server/app/setup.html +1 -1
  116. package/.next/standalone/.next/server/app/setup.rsc +12 -12
  117. package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +12 -12
  118. package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +1 -1
  119. package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +11 -11
  120. package/.next/standalone/.next/server/app-paths-manifest.json +1 -0
  121. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0rc27za._.js +8 -0
  122. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1kbl21f._.js +1 -1
  123. package/.next/standalone/.next/server/chunks/_02twlca._.js +10 -0
  124. package/.next/standalone/.next/server/chunks/_072jl0y._.js +1 -1
  125. package/.next/standalone/.next/server/chunks/_0lw8_i0._.js +1 -1
  126. package/.next/standalone/.next/server/chunks/_1_fynia._.js +7 -6
  127. package/.next/standalone/.next/server/chunks/_1itd1o_._.js +1 -1
  128. package/.next/standalone/.next/server/chunks/_1iwkh8t._.js +1 -1
  129. package/.next/standalone/.next/server/chunks/lib_db-client_15le7cw.js +3 -2
  130. package/.next/standalone/.next/server/chunks/lib_rpc_0c9d9ti.js +5 -5
  131. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0an6blh._.js → [root-of-the-server]__0zzcbqg._.js} +2 -2
  132. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1194jps._.js +3 -0
  133. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1z1j3ek._.js → [root-of-the-server]__19ip1qq._.js} +2 -2
  134. package/.next/standalone/.next/server/chunks/ssr/_01f38ty._.js +3 -0
  135. package/.next/standalone/.next/server/chunks/ssr/_0223v9s._.js +3 -0
  136. package/.next/standalone/.next/server/chunks/ssr/_0bcf13g._.js +3 -0
  137. package/.next/standalone/.next/server/chunks/ssr/_0cu6-an._.js +3 -0
  138. package/.next/standalone/.next/server/chunks/ssr/_0wxbq78._.js +3 -0
  139. package/.next/standalone/.next/server/chunks/ssr/_0z88zcl._.js +3 -0
  140. package/.next/standalone/.next/server/chunks/ssr/_17gui6a._.js +1 -1
  141. package/.next/standalone/.next/server/chunks/ssr/_1cyxocj._.js +3 -0
  142. package/.next/standalone/.next/server/chunks/ssr/_1gpbbw9._.js +3 -0
  143. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_scores_page_actions_0x-w58n.js +3 -0
  144. package/.next/standalone/.next/server/chunks/ssr/app_launch_page_19t0dyd.js +1 -1
  145. package/.next/standalone/.next/server/chunks/ssr/app_page_1fazqbf.js +4 -4
  146. package/.next/standalone/.next/server/chunks/ssr/app_paths_page_1ol90m7.js +4 -0
  147. package/.next/standalone/.next/server/chunks/ssr/app_profile_page_0u3-l5y.js +1 -1
  148. package/.next/standalone/.next/server/chunks/ssr/app_queue_page_0c6znd6.js +5 -5
  149. package/.next/standalone/.next/server/chunks/ssr/app_scores_page_09wepvv.js +3 -0
  150. package/.next/standalone/.next/server/chunks/ssr/app_settings_page_1f8mjj_.js +1 -1
  151. package/.next/standalone/.next/server/chunks/ssr/lib_1bn38gs._.js +3 -0
  152. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_0x3i8za._.js +131 -0
  153. package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_1bunoni._.js → node_modules_next_dist_1v8aef8._.js} +2 -2
  154. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  155. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  156. package/.next/standalone/.next/server/next-font-manifest.js +1 -1
  157. package/.next/standalone/.next/server/next-font-manifest.json +4 -0
  158. package/.next/standalone/.next/server/pages/404.html +1 -1
  159. package/.next/standalone/.next/server/pages/500.html +1 -1
  160. package/.next/standalone/.next/server/prefetch-hints.json +14 -0
  161. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  162. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  163. package/.next/standalone/.next/static/chunks/0_yurn4q91vq8.js +16 -0
  164. package/.next/standalone/.next/static/chunks/0d_mh-06srh2k.js +1 -0
  165. package/.next/standalone/.next/static/chunks/0x3oadfikvb1c.js +1 -0
  166. package/.next/standalone/.next/static/chunks/1d5hl1io798n2.js +1 -0
  167. package/.next/standalone/.next/static/chunks/1qt67cvj9sjwi.js +1 -0
  168. package/.next/{static/chunks/1chp3nx45meg5.js → standalone/.next/static/chunks/1roznk7hkjes1.js} +1 -1
  169. package/.next/standalone/.next/static/chunks/2_bf2n4gstad9.js +33 -0
  170. package/.next/standalone/.next/static/chunks/36gbwek52x_w-.js +2 -0
  171. package/.next/standalone/.next/static/chunks/3a55suosthntc.js +1 -0
  172. package/.next/standalone/.next/static/chunks/3fq1zq-6cfwbc.js +1 -0
  173. package/.next/standalone/.next/static/chunks/3nbnio971zlji.js +2 -0
  174. package/.next/standalone/.next/static/chunks/3s6awp3qq9s7w.js +1 -0
  175. package/.next/standalone/CHANGELOG.md +134 -0
  176. package/.next/standalone/README.md +30 -15
  177. package/.next/standalone/app/api/company-scores/legacy/route.js +1 -1
  178. package/.next/standalone/app/api/company-scores/route.js +1 -1
  179. package/.next/standalone/app/api/ingest/route.js +17 -1
  180. package/.next/standalone/app/api/outreach/route.js +107 -44
  181. package/.next/standalone/app/api/scraper/route.js +69 -8
  182. package/.next/standalone/app/api/settings/sector-preview/route.js +3 -2
  183. package/.next/standalone/app/api/settings/sector-suggestions/route.js +1 -1
  184. package/.next/standalone/app/components/CompanyScores.js +16 -10
  185. package/.next/standalone/app/components/LegacyScoresCard.js +1 -1
  186. package/.next/standalone/app/components/OrbitGraph.js +30 -0
  187. package/.next/standalone/app/components/PathsAnalyzer.js +1 -1
  188. package/.next/standalone/app/components/SeparationView.js +96 -14
  189. package/.next/standalone/app/components/Sidebar.js +258 -239
  190. package/.next/standalone/app/components/TheirCircle.js +293 -0
  191. package/.next/standalone/app/components/settings/SectorSection.js +5 -5
  192. package/.next/standalone/app/components/settings/TierSection.js +104 -0
  193. package/.next/standalone/app/components/useRequests.js +12 -0
  194. package/.next/standalone/app/components/useScanner.js +13 -0
  195. package/.next/standalone/app/components/views.js +1 -3
  196. package/.next/standalone/app/launch/page.js +4 -1
  197. package/.next/standalone/app/page.js +55 -51
  198. package/.next/standalone/app/paths/page.js +17 -12
  199. package/.next/standalone/app/profile/page.js +3 -3
  200. package/.next/standalone/app/queue/page.js +38 -50
  201. package/.next/standalone/app/scores/page.js +72 -0
  202. package/.next/standalone/app/settings/page.js +15 -3
  203. package/.next/standalone/db/schema.js +1 -0
  204. package/.next/standalone/lib/circle.js +169 -0
  205. package/.next/standalone/lib/companies.js +1 -1
  206. package/.next/standalone/lib/csv.js +17 -4
  207. package/.next/standalone/lib/db-client.js +1 -0
  208. package/.next/standalone/lib/ingest.js +12 -0
  209. package/.next/standalone/lib/legacy-offer.js +7 -6
  210. package/.next/standalone/lib/legacy-scores.js +2 -2
  211. package/.next/standalone/lib/rarity.js +80 -0
  212. package/.next/standalone/lib/requests-client.js +113 -0
  213. package/.next/standalone/lib/rpc.js +26 -15
  214. package/.next/standalone/lib/score-guess.js +60 -0
  215. package/.next/standalone/lib/scoring.js +1002 -61
  216. package/.next/standalone/lib/scraper-client.js +208 -17
  217. package/.next/standalone/lib/sector-directory.js +1 -1
  218. package/.next/standalone/lib/sector-focus.js +4 -3
  219. package/.next/standalone/lib/settings-effects.js +19 -1
  220. package/.next/standalone/lib/settings.js +4 -1
  221. package/.next/standalone/package-lock.json +2 -2
  222. package/.next/standalone/package.json +2 -2
  223. package/.next/standalone/public/demo-data.json +1 -1
  224. package/.next/standalone/scripts/gen-synthetic.mjs +1 -1
  225. package/.next/standalone/scripts/scrape.py +62 -0
  226. package/.next/static/chunks/0_yurn4q91vq8.js +16 -0
  227. package/.next/static/chunks/0d_mh-06srh2k.js +1 -0
  228. package/.next/static/chunks/0x3oadfikvb1c.js +1 -0
  229. package/.next/static/chunks/1d5hl1io798n2.js +1 -0
  230. package/.next/static/chunks/1qt67cvj9sjwi.js +1 -0
  231. package/.next/{standalone/.next/static/chunks/1chp3nx45meg5.js → static/chunks/1roznk7hkjes1.js} +1 -1
  232. package/.next/static/chunks/2_bf2n4gstad9.js +33 -0
  233. package/.next/static/chunks/36gbwek52x_w-.js +2 -0
  234. package/.next/static/chunks/3a55suosthntc.js +1 -0
  235. package/.next/static/chunks/3fq1zq-6cfwbc.js +1 -0
  236. package/.next/static/chunks/3nbnio971zlji.js +2 -0
  237. package/.next/static/chunks/3s6awp3qq9s7w.js +1 -0
  238. package/CHANGELOG.md +134 -0
  239. package/README.md +30 -15
  240. package/db/schema.js +1 -0
  241. package/lib/circle.js +169 -0
  242. package/lib/companies.js +1 -1
  243. package/lib/csv.js +17 -4
  244. package/lib/db-client.js +1 -0
  245. package/lib/ingest.js +12 -0
  246. package/lib/legacy-offer.js +7 -6
  247. package/lib/legacy-scores.js +2 -2
  248. package/lib/rarity.js +80 -0
  249. package/lib/requests-client.js +113 -0
  250. package/lib/rpc.js +26 -15
  251. package/lib/score-guess.js +60 -0
  252. package/lib/scoring.js +1002 -61
  253. package/lib/scraper-client.js +208 -17
  254. package/lib/sector-directory.js +1 -1
  255. package/lib/sector-focus.js +4 -3
  256. package/lib/settings-effects.js +19 -1
  257. package/lib/settings.js +4 -1
  258. package/package.json +2 -2
  259. package/public/demo-data.json +1 -1
  260. package/scripts/scrape.py +62 -0
  261. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1t3rugi._.js +0 -3
  262. package/.next/standalone/.next/server/chunks/lib_rpc_0jzisgh.js +0 -3
  263. package/.next/standalone/.next/server/chunks/ssr/_07u8byv._.js +0 -3
  264. package/.next/standalone/.next/server/chunks/ssr/_08r_mlf._.js +0 -3
  265. package/.next/standalone/.next/server/chunks/ssr/_0942v8n._.js +0 -3
  266. package/.next/standalone/.next/server/chunks/ssr/_0hl_t7r._.js +0 -3
  267. package/.next/standalone/.next/server/chunks/ssr/_0tb83dw._.js +0 -132
  268. package/.next/standalone/.next/server/chunks/ssr/lib_0i8v-s3._.js +0 -3
  269. package/.next/standalone/.next/server/chunks/ssr/node_modules_16vay6l._.js +0 -3
  270. package/.next/standalone/.next/server/chunks/ssr/node_modules_1kciwn4._.js +0 -3
  271. package/.next/standalone/.next/static/chunks/06x3jiiz96m5t.js +0 -1
  272. package/.next/standalone/.next/static/chunks/08k1crid-05dt.js +0 -1
  273. package/.next/standalone/.next/static/chunks/0ngx9s6-zgshe.js +0 -33
  274. package/.next/standalone/.next/static/chunks/0q-_khndfxubv.js +0 -2
  275. package/.next/standalone/.next/static/chunks/1c79veqedvubt.js +0 -1
  276. package/.next/standalone/.next/static/chunks/1irqj0lf-fu3d.js +0 -1
  277. package/.next/standalone/.next/static/chunks/1uadqylrod5_v.js +0 -1
  278. package/.next/standalone/.next/static/chunks/23u0zclgwpc4d.js +0 -1
  279. package/.next/standalone/.next/static/chunks/289ktj97di6zg.js +0 -1
  280. package/.next/standalone/.next/static/chunks/2b3lmf8e6uj8m.js +0 -16
  281. package/.next/standalone/.next/static/chunks/3npq5yd7c4dmn.js +0 -2
  282. package/.next/standalone/app/components/BridgeRing.js +0 -753
  283. package/.next/static/chunks/06x3jiiz96m5t.js +0 -1
  284. package/.next/static/chunks/08k1crid-05dt.js +0 -1
  285. package/.next/static/chunks/0ngx9s6-zgshe.js +0 -33
  286. package/.next/static/chunks/0q-_khndfxubv.js +0 -2
  287. package/.next/static/chunks/1c79veqedvubt.js +0 -1
  288. package/.next/static/chunks/1irqj0lf-fu3d.js +0 -1
  289. package/.next/static/chunks/1uadqylrod5_v.js +0 -1
  290. package/.next/static/chunks/23u0zclgwpc4d.js +0 -1
  291. package/.next/static/chunks/289ktj97di6zg.js +0 -1
  292. package/.next/static/chunks/2b3lmf8e6uj8m.js +0 -16
  293. package/.next/static/chunks/3npq5yd7c4dmn.js +0 -2
  294. /package/.next/standalone/.next/static/{qqqcxvzBUizkECrT4swyK → NnWlxbDF24KhrU1eHiEnv}/_buildManifest.js +0 -0
  295. /package/.next/standalone/.next/static/{qqqcxvzBUizkECrT4swyK → NnWlxbDF24KhrU1eHiEnv}/_clientMiddlewareManifest.js +0 -0
  296. /package/.next/standalone/.next/static/{qqqcxvzBUizkECrT4swyK → NnWlxbDF24KhrU1eHiEnv}/_ssgManifest.js +0 -0
  297. /package/.next/static/{qqqcxvzBUizkECrT4swyK → NnWlxbDF24KhrU1eHiEnv}/_buildManifest.js +0 -0
  298. /package/.next/static/{qqqcxvzBUizkECrT4swyK → NnWlxbDF24KhrU1eHiEnv}/_clientMiddlewareManifest.js +0 -0
  299. /package/.next/static/{qqqcxvzBUizkECrT4swyK → NnWlxbDF24KhrU1eHiEnv}/_ssgManifest.js +0 -0
@@ -0,0 +1,2 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,94657,e=>{"use strict";var t=e.i(43476),n=e.i(71645),r=e.i(7837);let o=e=>`${e.name} ${e.was} → ${e.estimated?"estimated":e.now}`,i=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 l({onAnswered:e}){var a;let s,c,[d,u]=(0,n.useState)(null),[p,f]=(0,n.useState)(!1),[h,g]=(0,n.useState)(()=>new Set),[y,m]=(0,n.useState)(!1),[x,b]=(0,n.useState)(null);if((0,n.useEffect)(()=>{if((0,r.csvNetworkSource)())return;let e=!1;return fetch("/api/company-scores/legacy").then(e=>e.json()).then(t=>{!e&&t.offer?.companies?.length&&(u(t.offer),g(new Set(t.offer.companies.map(e=>e.name))))}).catch(()=>{}),()=>{e=!0}},[]),!d)return null;let w=async t=>{m(!0),b(null);try{let n=await fetch("/api/company-scores/legacy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({keep:t})}),r=await n.json();if(!n.ok&&!r.kept)throw Error(r.error||"Could not save your answer.");u(null),e?.({kept:r.kept||[],scored:r.scored||0,error:n.ok?null:r.error})}catch(e){b(e.message)}finally{m(!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:"})," ",(s=(a=d.companies).slice(0,3).map(o).join(", "),(c=a.length-3)>0?`${s} and ${c} more`:s),"."," ","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."}),p&&(0,t.jsx)("ul",{style:{listStyle:"none",padding:0,margin:"10px 0 0",display:"grid",gap:4},children:d.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:h.has(e.name),disabled:y,onChange:()=>{let t;return t=e.name,g(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:[p?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("button",{disabled:y||!h.size,onClick:()=>w([...h]),style:{...i(!0),opacity:y||!h.size?.5:1},children:["Keep ",h.size," ",1===h.size?"score":"scores"]}),(0,t.jsx)("button",{disabled:y,onClick:()=>f(!1),style:i(!1),children:"Back"})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("button",{disabled:y,onClick:()=>w(d.companies.map(e=>e.name)),style:i(!0),children:"Keep all"}),(0,t.jsx)("button",{disabled:y,onClick:()=>f(!0),style:i(!1),children:"Choose…"})]}),(0,t.jsx)("button",{disabled:y,onClick:()=>w([]),style:i(!1),children:"No thanks"})]}),x&&(0,t.jsx)("div",{role:"alert",style:{marginTop:8,color:"#e74c3c"},children:x})]})}let a="1px solid rgba(255,255,255,0.1)",s={yours:{label:"your score",color:"#00ff88"},known:{label:"known list",color:"#3498DB"},data:{label:"public data",color:"#1abc9c"},network:{label:"estimated: many of your people",color:"#FF6B35"},default:{label:"unknown company",color:"#778"}};async function c(){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 d(){let[e,t]=(0,n.useState)(null),[r,o]=(0,n.useState)(null);return(0,n.useEffect)(()=>{let e=!1;return c().then(n=>{e||t(n)}).catch(t=>{e||o(t.message)}),()=>{e=!0}},[]),{companies:e,error:r,setScore:(0,n.useCallback)(async(e,n)=>{let r=await fetch("/api/company-scores",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:e,score:n})}),o=await r.json();if(!r.ok)throw Error(o.error||"Could not save");return t(await c()),o},[]),reload:(0,n.useCallback)(async()=>t(await c()),[])}}function u({company:e,onSet:r,compact:o}){let[i,l]=(0,n.useState)(!1),s=async t=>{l(!0);try{await r(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:o?"2px 4px":"4px 6px",borderRadius:6,border:a,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))]})}e.s(["ScorePicker",0,u,"default",0,function({onRescored:e,version:r=0}){let{companies:o,error:i,setScore:c,reload:p}=d();(0,n.useEffect)(()=>{r&&p().catch(()=>{})},[r,p]);let[f,h]=(0,n.useState)(""),[g,y]=(0,n.useState)("all"),[m,x]=(0,n.useState)(150),[b,w]=(0,n.useState)(null),k=e=>{w(e),setTimeout(()=>w(null),3500)},v=async(t,n)=>{let r=await c(t,n);k(`${t}: ${null==n?"back to auto":`set to ${n}`} \xb7 rescored ${r.scored} people`),e?.()},j=async({kept:t,scored:n,error:r})=>{if(!t.length)return k("Keeping the new built-in scores.");k(r||`Kept ${t.length} old ${1===t.length?"score":"scores"} as your own \xb7 rescored ${n} people`),await p().catch(()=>{}),e?.()},S=(0,n.useMemo)(()=>{if(!o)return[];let e=f.trim().toLowerCase();return o.filter(t=>(!e||t.name.toLowerCase().includes(e))&&("all"===g||t.source===g))},[o,f,g]);if(i)return(0,t.jsx)("div",{style:{padding:24,color:"#e74c3c"},children:i});if(!o)return(0,t.jsx)("div",{style:{padding:24,color:"#778"},children:"Loading companies…"});let C=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)(l,{onAnswered:j}),(0,t.jsxs)("div",{style:{padding:14,borderRadius:10,border:a,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 roles, with former roles at 70%; an audience of their own counts like a title (1M+ followers like a director). The company weight runs from 0.725 for a company we don’t know (or none found), the middle of the scale, 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 +2 more: up to +1 for a high share of it at A or S, or +1 for every 25 people there. Tiers are graded on your network’s curve unless you choose the fixed scale (",(0,t.jsx)("a",{href:"#tiers",style:{color:"#3498DB"},children:"Tiers"}),", above): your top 3% are S, the next 12% A, the next 25% B (it only lifts, and never lifts anyone under 4 into S or A). On the fixed scale, 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 7.3, a director at an unknown company 5.4, 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 (",(0,t.jsx)("a",{href:"#sector",style:{color:"#3498DB"},children:"Your sector"}),", above) 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:f,onChange:e=>h(e.target.value),placeholder:"Find a company",style:{padding:"6px 10px",borderRadius:7,border:a,background:"rgba(255,255,255,0.05)",color:"#fff",fontSize:13,minWidth:180}}),[["all",`All ${o.length}`],["known",`Known list ${C("known")}`],["data",`Public data ${C("data")}`],["yours",`Yours ${C("yours")}`],["network",`Estimated ${C("network")}`],["default",`Unknown ${C("default")}`]].map(([e,n])=>(0,t.jsx)("button",{onClick:()=>y(e),style:{padding:"5px 10px",borderRadius:7,border:a,cursor:"pointer",fontSize:11.5,fontWeight:600,background:g===e?"rgba(52,152,219,0.25)":"transparent",color:g===e?"#cfe6f7":"#8b9a9a"},children:n},e))]}),(0,t.jsxs)("div",{style:{borderRadius:10,border:a,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"})]}),S.slice(0,m).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:s[e.source]?.color},children:[s[e.source]?.label,e.sectorBonus>0&&(0,t.jsxs)("span",{style:{color:"#00ff88"},children:[" + ",e.sectorBonus," your sector"]})]}),(0,t.jsx)(u,{company:e,onSet:v,compact:!0})]},e.name))]}),S.length>m&&(0,t.jsxs)("button",{onClick:()=>x(e=>e+300),style:{marginTop:10,padding:"7px 14px",borderRadius:8,border:a,background:"rgba(255,255,255,0.05)",color:"#dfe6e9",cursor:"pointer",fontSize:12},children:["Show more (",S.length-m," left)"]})]}),b&&(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:b})]})},"useCompanyScores",0,d],94657)},2776,e=>{"use strict";var t=e.i(43476),n=e.i(15812);e.s(["default",0,function({children:e}){let{userId:r,ready:o}=(0,n.useUser)();return o&&r?e:(0,t.jsx)("div",{style:{minHeight:"100vh",display:"flex",alignItems:"center",justifyContent:"center",background:"#0a0a1a",color:"#fff",padding:24,textAlign:"center",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},children:o?(0,t.jsxs)("div",{style:{maxWidth:420},children:[(0,t.jsx)("div",{style:{fontSize:18,fontWeight:700,marginBottom:8},children:"Can’t reach 6 Degrees’ local server"}),(0,t.jsx)("div",{style:{color:"#888",fontSize:14,lineHeight:1.6},children:"The page loaded but the app behind it is not answering. If you started it from a terminal, check that window for an error, then reload this page."})]}):(0,t.jsx)("div",{style:{fontSize:18,fontWeight:600},children:"Loading…"})})}])},85957,e=>{"use strict";var t=e.i(43476),n=e.i(71645),r=e.i(18566),o=e.i(40996),i=e.i(19821),l=e.i(64745),a=e.i(7837),s=e.i(2776);e.i(47716);var c=e.i(36534),d=e.i(77899),u=e.i(17983),p=e.i(43079),f=e.i(23731),h=e.i(94657),g=e.i(89154);let y={S:"#FFD700",A:"#9B59B6",B:"#3498DB",C:"#95A5A6",D:"#BDC3C7"},m="1px solid rgba(255,255,255,0.1)",x=[...g.INDUSTRIES,g.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 w({value:e,onChange:n,options:r}){return(0,t.jsx)("div",{style:{display:"flex",borderRadius:7,overflow:"hidden",border:m},children:r.map(([r,o])=>(0,t.jsx)("button",{onClick:()=>n(r),style:{padding:"5px 10px",fontSize:11.5,fontWeight:600,border:"none",cursor:"pointer",background:e===r?"rgba(52,152,219,0.25)":"transparent",color:e===r?"#cfe6f7":"#8b9a9a"},children:o},r))})}function k(e,t){return("all"===t.degree||String(e.degree)===t.degree)&&("senior"!==t.seniority||!!(0,g.isSenior)(e.headline))&&("csuite"!==t.seniority||!((0,g.getSeniority)(e.headline).level<6))&&("SA"!==t.tier||"S"===e.tier||"A"===e.tier)}function v({d1:e=[],d2:r=[],d3:o=[],tab:i="map",onOpenCompany:l}){let[a,s]=(0,n.useState)({degree:"all",seniority:"all",tier:"all"}),[c,d]=(0,n.useState)(()=>new Set),[u,p]=(0,n.useState)(""),[f,h]=(0,n.useState)(null),y=(0,n.useMemo)(()=>[...e,...r,...o],[e,r,o]),m=(0,n.useMemo)(()=>(0,g.buildCompanyIndex)(y),[y]),b=(0,n.useMemo)(()=>(0,g.companyLinks)(e,r),[e,r]),w=(0,n.useMemo)(()=>{let e=u.trim().toLowerCase(),t=[];for(let n of m.values()){if(c.has(n.industry.key)||e&&!n.name.toLowerCase().includes(e))continue;let r=n.people.filter(e=>k(e,a));r.length&&t.push({...n,shown:r})}return t.sort((e,t)=>t.shown.length-e.shown.length)},[m,a,c,u]),C=(0,n.useMemo)(()=>{let e=new Map(x.map(e=>[e.key,{...e,people:[],companies:new Map}])),t=new Set;for(let n of y){let r=n.profile_url||`id:${n.id}`;if(t.has(r)||(t.add(r),!k(n,a)))continue;let o=(0,g.companyOf)(n),i=o?m.get(o)?.industry||(0,g.industryOf)(o,n.headline):(0,g.industryOf)(null,n.headline),l=e.get(i.key);l.people.push(n),o&&l.companies.set(o,(l.companies.get(o)||0)+1)}return[...e.values()].filter(e=>e.people.length).sort((e,t)=>t.people.length-e.people.length)},[y,m,a]),A=f?.kind==="company"?m.get(f.key):f?.kind==="industry"?C.find(e=>e.key===f.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)(j,{filters:a,setFilters:s,query:u,setQuery:p,industries:C,hidden:c,setHidden:d,onIndustry:e=>h({kind:"industry",key:e})}),"map"===i?(0,t.jsx)(S,{companies:w,links:b,focus:f,onCompany:e=>h({kind:"company",key:e}),onIndustry:e=>h({kind:"industry",key:e}),onClear:()=>h(null)}):(0,t.jsx)(M,{industries:C,index:m,d1:e,d2:r,onIndustry:e=>h({kind:"industry",key:e}),onCompany:e=>h({kind:"company",key:e})})]}),A&&(0,t.jsx)(z,{focus:f,data:A,index:m,links:b,d1:e,d2:r,filters:a,onClose:()=>h(null),onCompany:e=>h({kind:"company",key:e}),onOpenCompany:l})]})}function j({filters:e,setFilters:n,query:r,setQuery:o,industries:i,hidden:l,setHidden:a,onIndustry:s}){let c=(e,t)=>n(n=>({...n,[e]:t}));return(0,t.jsxs)("div",{style:{padding:"10px 16px",borderBottom:m,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:r,onChange:e=>o(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:170}}),(0,t.jsx)(w,{value:e.degree,onChange:e=>c("degree",e),options:[["all","All degrees"],["1","1st"],["2","2nd"],["3","3rd"]]}),(0,t.jsx)(w,{value:e.seniority,onChange:e=>c("seniority",e),options:[["all","Any level"],["senior","Director+"],["csuite","C-suite"]]}),(0,t.jsx)(w,{value:e.tier,onChange:e=>c("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:()=>a(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:()=>s(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 S({companies:e,links:r,focus:o,onCompany:i,onIndustry:l,onClear:a}){let s=(0,n.useRef)(null),{w:h,h:m}=function(e){let[t,r]=(0,n.useState)({w:0,h:0});return(0,n.useEffect)(()=>{let t=e.current;if(!t)return;let n=()=>{let e=t.getBoundingClientRect();r(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 o=new ResizeObserver(n);return o.observe(t),()=>o.disconnect()},[e]),t}(s),[x,w]=(0,n.useState)(null),k=(0,n.useMemo)(()=>{let t=e.slice(0,140),n=new Set(t.map(e=>e.name)),o=[...new Set(t.map(e=>e.industry.key))],i=new Map(o.map((e,t)=>{let n=t/Math.max(1,o.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})),a=r.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})),s=(0,p.forceSimulation)(l).force("x",(function(e){var t,n,r,o=(0,f.default)(.1);function i(e){for(var o,i=0,l=t.length;i<l;++i)o=t[i],o.vx+=(r[i]-o.x)*n[i]*e}function l(){if(t){var i,l=t.length;for(n=Array(l),r=Array(l),i=0;i<l;++i)n[i]=isNaN(r[i]=+e(t[i],i,t))?0:+o(t[i],i,t)}}return"function"!=typeof e&&(e=(0,f.default)(null==e?0:+e)),i.initialize=function(e){t=e,l()},i.strength=function(e){return arguments.length?(o="function"==typeof e?e:(0,f.default)(+e),l(),i):o},i.x=function(t){return arguments.length?(e="function"==typeof t?t:(0,f.default)(+t),l(),i):e},i})(e=>i.get(e.co.industry.key).x).strength(.12)).force("y",(function(e){var t,n,r,o=(0,f.default)(.1);function i(e){for(var o,i=0,l=t.length;i<l;++i)o=t[i],o.vy+=(r[i]-o.y)*n[i]*e}function l(){if(t){var i,l=t.length;for(n=Array(l),r=Array(l),i=0;i<l;++i)n[i]=isNaN(r[i]=+e(t[i],i,t))?0:+o(t[i],i,t)}}return"function"!=typeof e&&(e=(0,f.default)(null==e?0:+e)),i.initialize=function(e){t=e,l()},i.strength=function(e){return arguments.length?(o="function"==typeof e?e:(0,f.default)(+e),l(),i):o},i.y=function(t){return arguments.length?(e="function"==typeof t?t:(0,f.default)(+t),l(),i):e},i})(e=>i.get(e.co.industry.key).y).strength(.12)).force("collide",(0,c.forceCollide)(e=>e.r+3)).force("charge",(0,u.forceManyBody)().strength(-25)).force("link",(0,d.forceLink)(a).id(e=>e.id).strength(e=>Math.min(.25,.03*e.weight)).distance(60)).stop();for(let e=0;e<320;e++)s.tick();let h=l.flatMap(e=>[e.x-e.r,e.x+e.r]),y=l.flatMap(e=>[e.y-e.r,e.y+e.r]),m=l.length?{x:Math.min(...h)-60,y:Math.min(...y)-40,w:Math.max(...h)-Math.min(...h)+120,h:Math.max(...y)-Math.min(...y)+80}:{x:-300,y:-300,w:600,h:600},x=o.map(e=>{let t=l.filter(t=>t.co.industry.key===e),n=t.reduce((e,t)=>e+t.x,0)/t.length,r=t.reduce((e,t)=>e+t.y,0)/t.length,o=Math.hypot(n,r)||1,i=n/o,a=r/o,s=Math.max(...t.map(e=>(e.x-n)*i+(e.y-r)*a+e.r));return{key:e,x:n+i*(s+16),y:r+a*(s+16)+4,anchor:i>.35?"start":i<-.35?"end":"middle",ind:(0,g.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,r=Math.max(m.x+m.w,n+t+10);m.x=Math.min(m.x,n-10),m.w=r-m.x;let o=Math.max(m.y+m.h,e.y+12);m.y=Math.min(m.y,e.y-18),m.h=o-m.y}return m.h+=Math.max(60,.1*m.h),{nodes:l,edges:a,box:m,labels:x,cut:Math.max(0,e.length-t.length)}},[e,r]),v=x||(o?.kind==="company"?o.key:null),j=o?.kind==="industry"?o.key:null,C=(0,n.useMemo)(()=>{if(!v)return null;let e=new Set([v]);for(let t of k.edges)t.source.id===v&&e.add(t.target.id),t.target.id===v&&e.add(t.source.id);return e},[v,k]),M=(0,n.useMemo)(()=>new Set(k.nodes.slice(0,28).map(e=>e.id)),[k]);return(0,t.jsxs)("div",{ref:s,style:{flex:1,minHeight:360,position:"relative"},onClick:a,children:[h>0&&(0,t.jsxs)("svg",{width:h,height:m,viewBox:`${k.box.x} ${k.box.y} ${k.box.w} ${k.box.h}`,style:{display:"block"},children:[(0,t.jsx)("g",{children:k.edges.map((e,n)=>{let r=v&&(e.source.id===v||e.target.id===v);return(0,t.jsx)("line",{x1:e.source.x,y1:e.source.y,x2:e.target.x,y2:e.target.y,stroke:r?"#FF6B35":"#8fa6c0",strokeOpacity:r?.8:v?.04:.14,strokeWidth:r?1+Math.log2(1+e.weight):.4+.5*Math.log2(1+e.weight)},n)})}),k.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)),k.nodes.map(e=>{let n=C&&!C.has(e.id)||j&&e.co.industry.key!==j,r=o?.kind==="company"&&o.key===e.id;return(0,t.jsxs)("g",{transform:`translate(${e.x},${e.y})`,style:{cursor:"pointer"},opacity:n?.18:1,onMouseEnter:()=>w(e.id),onMouseLeave:()=>w(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:r?"#fff":e.co.S?y.S:"rgba(0,0,0,0.35)",strokeWidth:r?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}),(M.has(e.id)||e.id===v||r)&&(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.",k.cut?` Showing the 140 largest; ${k.cut} smaller companies are in Industries.`:""]})]})}function C({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,r],o)=>(0,t.jsx)("div",{style:{width:`${e/Math.max(1,n)*100}%`,background:r}},o))})}function M({industries:e,index:r,d1:o,d2:i,onIndustry:l,onCompany:a}){let s=(0,n.useMemo)(()=>{let e=new Map(o.map(e=>[e.id,e])),t=new Map;for(let e of i){let n=(0,g.companyOf)(e),o=n?r.get(n)?.industry.key:(0,g.industryOf)(null,e.headline).key;if(!o)continue;let i=t.get(o)||new Map;i.set(e.source_connection_id,(i.get(e.source_connection_id)||0)+1),t.set(o,i)}let n=new Map;for(let[r,o]of t){let[t,i]=[...o.entries()].sort((e,t)=>t[1]-e[1])[0]||[];e.get(t)&&n.set(r,{bridge:e.get(t),n:i})}return n},[r,o,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,r=e.people.filter(e=>2===e.degree).length,o=e.people.filter(e=>(0,g.isSenior)(e.headline)).length,i=e.people.filter(e=>"S"===e.tier).length,c=[...e.companies.entries()].sort((e,t)=>t[1]-e[1]).slice(0,3),d=s.get(e.key);return(0,t.jsxs)("div",{onClick:()=>l(e.key),style:{padding:14,borderRadius:10,border:m,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 · ",r," reachable · ",e.companies.size," companies · ",o," director+ · ",i," S-tier"]}),(0,t.jsx)(C,{total:e.people.length,parts:[[n,"#00ff88"],[r,"#FF6B35"]]}),c.length>0&&(0,t.jsx)("div",{style:{marginTop:8,display:"flex",gap:6,flexWrap:"wrap"},children:c.map(([e,n])=>(0,t.jsxs)("button",{onClick:t=>{t.stopPropagation(),a(e)},style:{padding:"2px 8px",borderRadius:10,border:m,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))}),d&&(0,t.jsxs)("div",{style:{marginTop:8,fontSize:11.5,color:"#aab7b7"},children:["Best way in: ",(0,t.jsx)("b",{style:{color:y[d.bridge.tier]||"#ccc"},children:d.bridge.name})," knows ",d.n," here"]})]},e.key)})})})}function A({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:y[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 z({focus:e,data:r,index:o,links:i,d1:l,d2:a,filters:s,onClose:c,onCompany:d,onOpenCompany:u}){let p,f,h,y="company"===e.kind,x=r.people.filter(e=>k(e,s)),b=(0,n.useMemo)(()=>{let e=new Map;for(let t of x){let n=(0,g.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)},[x]),w=(0,n.useMemo)(()=>y?(0,g.waysInto)(r.name,l,a):null,[y,r,l,a]),v=(0,n.useMemo)(()=>y?i.filter(e=>e.a===r.name||e.b===r.name).map(e=>({name:e.a===r.name?e.b:e.a,weight:e.weight})).sort((e,t)=>t.weight-e.weight).slice(0,8):[],[y,i,r]),j=[...x].sort((e,t)=>(Number(t.power_score)||0)-(Number(e.power_score)||0)).slice(0,6),S=y?r.industry:r,M=x.filter(e=>1===e.degree).length,$=x.filter(e=>2===e.degree).length,B=y?[]:[...r.companies.entries()].sort((e,t)=>t[1]-e[1]).slice(0,10);return(0,t.jsxs)("aside",{style:{width:360,flexShrink:0,borderLeft:m,overflow:"auto",padding:16,background:"rgba(255,255,255,0.02)"},children:[(0,t.jsx)("button",{onClick:c,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:[y?"COMPANY":"INDUSTRY"," ANALYZER"]}),(0,t.jsx)("h2",{style:{margin:"4px 0 6px",fontSize:20},children:y?r.name:r.label}),(0,t.jsxs)("span",{style:{fontSize:11,padding:"2px 8px",borderRadius:10,background:`${S.color}22`,color:S.color},children:[S.label,y?" · inferred":""]}),y&&(0,t.jsx)(R,{name:r.name}),(0,t.jsx)("div",{style:{display:"grid",gridTemplateColumns:"repeat(3, 1fr)",gap:8,margin:"14px 0"},children:[[M,"you know","#00ff88"],[$,"reachable","#FF6B35"],[x.filter(e=>(0,g.isSenior)(e.headline)).length,"director+","#FFD700"]].map(([e,n,r])=>(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:r},children:e}),(0,t.jsx)("div",{style:{fontSize:10.5,color:"#8b9a9a"},children:n})]},n))}),(0,t.jsx)(T,{title:"By level",children:b.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)(C,{total:x.length,parts:[[n,"#3498DB"]]}),(0,t.jsx)("span",{style:{color:"#778",textAlign:"right"},children:n})]},e))}),y&&w&&(0,t.jsxs)(T,{title:"Ways in",children:[w.direct.length>0&&(0,t.jsxs)("div",{style:{fontSize:11,color:"#00ff88",margin:"2px 0"},children:["You already know ",w.direct.length," here"]}),(p=new Map(w.bridges.map(({bridge:e,n:t})=>[e.id,t])),f=[...w.direct].sort((e,t)=>(p.get(t.id)||0)-(p.get(e.id)||0)).slice(0,4),h=new Set(w.direct.map(e=>e.id)),(0,t.jsxs)(t.Fragment,{children:[f.map(e=>(0,t.jsx)(A,{p:e,note:p.get(e.id)?`works here \xb7 knows ${p.get(e.id)} here`:`works here \xb7 ${e.headline||""}`},e.id)),w.bridges.filter(({bridge:e})=>!h.has(e.id)).slice(0,5).map(({bridge:e,n})=>(0,t.jsx)(A,{p:e,note:`knows ${n} ${1===n?"person":"people"} here`},e.id))]})),!w.direct.length&&!w.bridges.length&&(0,t.jsx)("div",{style:{fontSize:12,color:"#778"},children:"No one you know links here yet."})]}),(0,t.jsx)(T,{title:y?"Most powerful people here":"Most powerful people in this industry",children:j.map(e=>(0,t.jsx)(A,{p:e,note:`${1===e.degree?"you know them":2===e.degree?"2nd degree":"3rd+"} \xb7 ${e.headline||""}`},e.id))}),y&&v.length>0&&(0,t.jsx)(T,{title:"Connected companies",children:(0,t.jsx)("div",{style:{display:"flex",gap:6,flexWrap:"wrap"},children:v.map(e=>(0,t.jsxs)("button",{onClick:()=>d(e.name),style:{padding:"3px 9px",borderRadius:10,border:m,background:`${o.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))})}),!y&&(0,t.jsx)(T,{title:"Companies",children:B.map(([e,n])=>(0,t.jsxs)("div",{onClick:()=>d(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)(C,{total:B[0][1],parts:[[n,S.color]]}),(0,t.jsx)("span",{style:{color:"#778",textAlign:"right"},children:n})]},e))}),y&&u&&(0,t.jsxs)("button",{onClick:()=>u(r),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 ",r.name," →"]})]})}function T({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 R({name:e}){let{companies:n,setScore:r}=(0,h.useCompanyScores)(),o=n?.find(t=>t.name===e);if(!o)return null;let i={yours:"your score",known:"known list",network:"estimated",default:"unknown company"}[o.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:o.score}),"/10 · ",i,(0,t.jsx)("span",{style:{marginLeft:"auto"},children:(0,t.jsx)(h.ScorePicker,{company:o,onSet:r,compact:!0})})]})}var $=e.i(15812),B=e.i(30215),O=e.i(22016);let E=[["map","Map"],["industries","Industries"],["companies","Companies"]];function F(){let{userId:e}=(0,$.useUser)(),[s,c]=(0,n.useState)([]),[d,u]=(0,n.useState)(null),[p,f]=(0,n.useState)([]),[h,y]=(0,n.useState)(!0),[m,x]=(0,n.useState)([]),[b,w]=(0,n.useState)([]),[k,j]=(0,n.useState)([]),S=(0,r.useSearchParams)().get("tab"),[C,M]=(0,n.useState)(()=>E.some(([e])=>e===S)?S:"map"),A=(0,r.useRouter)();(0,n.useEffect)(()=>{"scores"===S&&A.replace("/scores#companies")},[S,A]);let[z,T]=(0,n.useState)(0);(0,n.useEffect)(()=>{!l.IS_DEMO&&e&&t();async function t(){let t=(0,a.hasCsvNetwork)()?(0,a.loadCsvNetwork)():null,n=[],r=[],o=[];if(t)n=t.degree1,r=t.degree2||[];else{let t=await (0,i.loadNetwork)(e);n=t.degree1,r=t.degree2,o=t.degree3}x(n),w(r),j(o||[]);let l={},s=new Set;[...n,...r,...o].forEach(e=>{if(s.has(e.profile_url))return;s.add(e.profile_url);let t=(0,g.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))}),c(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,z]);let[R,F]=(0,n.useState)(!1),[_,N]=(0,n.useState)([]),P=(0,B.default)(),W=!R&&P.running?(0,o.busyReason)(P):null;function D(e){let t=new Set(m.map(e=>e.profile_url)),n=new Set([...m,...b].map(e=>e.profile_url));return e.map(r=>({...r,connected:t.has(r.profile_url||r.profileUrl),known:n.has(r.profile_url||r.profileUrl),seniority:(0,g.getSeniority)(r.headline),mutualCount:e.filter(e=>t.has(e.profile_url||e.profileUrl)&&e.id!==r.id).length}))}function L(e){u(e),f(D(e.people))}async function U(){if(l.IS_DEMO||!d)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{}}F(!0),N(["Checking the scanner..."]);let t=(0,o.notReadyMessage)(await (0,o.scraperStatus)().catch(()=>null));if(t){N([t]),F(!1);return}try{let e=await (0,o.runScrape)("company",{name:d.name,onLog:N});if(0===e.exitCode){N(e=>[...e,"Loading the new people..."]);let e=await fetch(`/api/connections?scanned_company=${encodeURIComponent(d.name)}&limit=500`),t=(await e.json()).connections||[];t.length?(f(D(t)),N(e=>[...e,`${t.length} people at ${d.name}.`])):N(e=>[...e,"Nothing new was found."])}}catch(e){N([e.message||"Failed to start the scan"])}finally{F(!1)}}let K={},H=0;p.forEach(e=>{let t=e.seniority.key;K[t]||(K[t]={...e.seniority,people:[]}),e.connected&&H++;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 r=null;if(2===e.degree&&e.source_connection_id){let t=m.find(t=>t.id===e.source_connection_id);t&&(r=t.name)}let o={0:5,1:10,2:20,3:35,4:50,5:75,6:100}[e.seniority.level]||10;K[t].people.push({...e,likelihood:n,bridgeName:r,xp:o})}),Object.values(K).forEach(e=>e.people.sort((e,t)=>t.likelihood-e.likelihood));let Y=Object.values(K).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)(O.default,{href:"/",style:{fontSize:13,color:"#888",textDecoration:"none"},children:"← Back to the network"})]}):h?(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)(O.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"}),!d&&(0,t.jsx)("div",{style:{display:"flex",gap:4,marginLeft:8,padding:3,borderRadius:8,background:"rgba(255,255,255,0.05)"},children:E.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:C===e?"linear-gradient(135deg, #00ff88, #3498DB)":"transparent",color:C===e?"#000":"#aab"},children:n},e))}),d&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("button",{onClick:()=>{u(null),f([])},style:{background:"none",border:"none",color:"#888",cursor:"pointer",fontSize:12},children:"← Companies"}),(0,t.jsx)("span",{style:{fontSize:13,fontWeight:600},children:d.name}),(0,t.jsxs)("span",{style:{fontSize:11,color:"#888"},children:[H,"/",p.length," connected"]}),(0,t.jsx)("button",{onClick:U,disabled:R||!!W,title:W?`${W}. One scan at a time.`:void 0,style:{marginLeft:"auto",padding:"5px 12px",borderRadius:6,border:"none",cursor:R||W?"not-allowed":"pointer",background:R||W?"#333":"rgba(0,255,136,0.15)",color:R||W?"#555":"#00ff88",fontSize:11,fontWeight:600},children:R?"Scanning...":W?"Scanner busy":"+ 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"})]})]})}),d||"companies"===C?(0,t.jsx)("div",{style:{flex:1,overflow:"auto",padding:"16px 24px"},children:(0,t.jsxs)("div",{style:{maxWidth:700,margin:"0 auto"},children:[!d&&(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 ",m.length+b.length," people in your network."]}),(0,t.jsx)("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:10},children:s.slice(0,60).map(e=>(0,t.jsxs)("button",{onClick:()=>L(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))})]}),R&&(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:_.map((e,n)=>(0,t.jsx)("div",{children:e},n))})]}),d&&Y.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,r)=>(0,t.jsx)(I,{p:n,level:e,companyPeople:p,d1Data:m,selectedCompany:d},n.id||r))]},e.key))]})}):(0,t.jsx)(v,{d1:m,d2:b,d3:k,tab:C,onOpenCompany:e=>L({...e,sCount:e.S,aCount:e.A})})]})}function I({p:e,level:r,companyPeople:o,d1Data:i,selectedCompany:l}){let[a,s]=(0,n.useState)(!1),c=new Set(i.map(e=>e.profile_url));o.filter(e=>c.has(e.profile_url||e.profileUrl));let d=o.filter(t=>(0,g.getSeniority)(t.headline).level>e.seniority.level&&!c.has(t.profile_url||t.profileUrl)),u=o.filter(t=>(0,g.getSeniority)(t.headline).level===e.seniority.level&&t.id!==e.id),p=[];if(!e.connected){let t=d.length;t>0&&p.push({icon:"⬆️",text:`Adding them gives you a mutual with ${t} people above in the hierarchy`,color:"#00ff88"});let n=u.filter(e=>c.has(e.profile_url||e.profileUrl)).length;n>0?p.push({icon:"🤝",text:`${n} people at their level already connected — high social proof`,color:"#FFD700"}):p.push({icon:"🎯",text:"First connection at this level — opens a new layer",color:"#3498DB"}),e.bridgeName&&p.push({icon:"🔗",text:`Reachable through ${e.bridgeName} — warm intro possible`,color:"#FF6B35"}),e.seniority.level>=5?p.push({icon:"👑",text:`${e.seniority.label} — decision maker, high strategic value but low accept rate`,color:"#FFD700"}):e.seniority.level>=3?p.push({icon:"📊",text:`${e.seniority.label} — middle management, good balance of access and accept rate`,color:"#9B59B6"}):p.push({icon:"✅",text:`${e.seniority.label} — highest accept rate, builds mutual foundation for people above`,color:"#00ff88"}),e.likelihood>=60?p.push({icon:"🔥",text:`${e.likelihood}% likely to accept — strong mutual overlap + approachable role`,color:"#00ff88"}):e.likelihood>=30?p.push({icon:"⚡",text:`${e.likelihood}% likely — moderate chance, add more people at their level first`,color:"#FFD700"}):p.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:()=>s(!a),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:a?"▾":"▸"}),(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"})]}),a&&(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&&p.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"}),p.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)(s.default,{children:(0,t.jsx)(n.Suspense,{children:(0,t.jsx)(F,{})})})}],85957)},89154,e=>{"use strict";var t=e.i(90179);function n(e){let n=(0,t.readTitle)(e);return{key:n.key,label:n.label,level:n.level}}function r(e){return(0,t.currentCompany)(e)}let o=[{key:"defense",label:"Government, Defense & Aerospace",color:"#7f8c8d",words:/\b(government|federal|state of|county|city of|defen[cs]e|army|navy|air force|marine corps|military|dod|nasa|aerospace|lockheed|northrop|boeing|raytheon|l3harris|leidos|blue origin|spacex|public sector)\b/i},{key:"finance",label:"Finance & Investing",color:"#2ecc71",words:/\b(bank|banking|capital|ventures?|vc|investments?|investor|fund|private equity|growth equity|asset management|wealth|trading|trader|hedge|crypto|blockchain|web3|defi|fintech|stripe|coinbase|blackrock|robinhood|goldman|morgan stanley|jpmorgan|chase|bny|mellon|wells fargo|citi|citigroup|capital one|fidelity|vanguard|schwab|visa|mastercard|amex|american express|paypal|insurance|accounting|cpa|financial)\b/i},{key:"health",label:"Healthcare & Biotech",color:"#e74c3c",words:/\b(health|healthcare|medical|medicine|hospital|clinic|pharma|pharmaceutical|biotech|nurse|nursing|physician|doctor|dental|therapy|therapist|wellness)\b/i},{key:"education",label:"Education",color:"#f1c40f",words:/\b(university|college|school|education|student|professor|teacher|academy|phd|faculty|alumni)\b/i},{key:"media",label:"Marketing & Media",color:"#e67e22",words:/\b(marketing|brand|branding|advertising|agency|media|content|social media|creative|creator|influencer|pr|public relations|communications|tiktok|pinterest|youtube|growth marketing)\b/i},{key:"entertainment",label:"Entertainment & Gaming",color:"#9b59b6",words:/\b(entertainment|film|movie|music|records|gaming|games?|esports|studio|studios|netflix|disney|spotify|hollywood|theater|theatre|sports)\b/i},{key:"tech",label:"Tech, Software & AI",color:"#3498db",words:/\b(software|saas|engineer|engineering|developer|tech|technology|technologies|ai|artificial intelligence|machine learning|ml|data|cloud|cyber|security|devops|product manager|google|microsoft|apple|meta|amazon|nvidia|openai|anthropic|palantir|salesforce|oracle|ibm|intel|app|apps|startup|platform|labs?)\b/i},{key:"consulting",label:"Consulting, Legal & Services",color:"#1abc9c",words:/\b(consulting|consultant|consultancy|deloitte|accenture|mckinsey|kpmg|pwc|ey|bain|bcg|legal|law|lawyer|attorney|paralegal|recruiting|recruiter|staffing|talent)\b/i},{key:"realestate",label:"Real Estate & Construction",color:"#d35400",words:/\b(real estate|realtor|realty|property|properties|construction|architecture|architect|mortgage|homes|housing|builders?)\b/i},{key:"consumer",label:"Retail, Consumer & Hospitality",color:"#ff79c6",words:/\b(retail|e-?commerce|shopify|consumer|cpg|fashion|apparel|beauty|cosmetics|food|beverage|restaurant|hospitality|hotel|travel|tourism|coca-cola|nike|store|shop)\b/i},{key:"industry",label:"Manufacturing, Energy & Logistics",color:"#95a5a6",words:/\b(manufacturing|energy|oil|gas|solar|utilities|automotive|tesla|siemens|ge|general electric|honeywell|3m|logistics|supply chain|shipping|freight|fedex|ups|industrial|mining|chemicals?)\b/i},{key:"nonprofit",label:"Nonprofit & Community",color:"#bdc3c7",words:/\b(nonprofit|non-profit|foundation|charity|ngo|church|ministry|volunteer)\b/i}],i={key:"unknown",label:"Unclear",color:"#555c66"},l=Object.fromEntries([...o,i].map(e=>[e.key,e])),a=e=>l[e]||i;function s(e,t){for(let n of[e,t]){if(!n)continue;let e=o.find(e=>e.words.test(n));if(e)return e}return i}let c=(e,t)=>s(e,t).key,d=e=>n(e).level>=4;e.s(["INDUSTRIES",0,o,"UNKNOWN_INDUSTRY",0,i,"buildCompanyIndex",0,function(e=[]){let n=new Map,r=e=>(n.has(e)||n.set(e,(0,t.rolesWithCompanies)(e)),n.get(e)),{industries:o}=(0,t.networkCompanies)(e,{industryOf:c,rolesOf:r}),i=new Map;for(let t of e){let e=t.profile_url||`id:${t.id}`,n=i.get(e);(!n||(t.degree||9)<(n.degree||9))&&i.set(e,t)}let l=new Map;for(let e of i.values()){let t=r(e).find(e=>!e.former)?.company;if(!t)continue;let n=l.get(t);n||(n={name:t,people:[],d1:0,d2:0,d3:0,S:0,A:0,senior:0},l.set(t,n)),n.people.push(e),1===e.degree?n.d1++:2===e.degree?n.d2++:n.d3++,"S"===e.tier&&n.S++,"A"===e.tier&&n.A++,d(e.headline)&&n.senior++}for(let e of l.values())e.industry=a(o.get(e.name));return l},"companyLinks",0,function(e=[],t=[]){let n=new Map;for(let t of e){let e=r(t);e&&n.set(t.id,e)}let o=new Map;for(let e of t){let t=n.get(e.source_connection_id),i=r(e);if(!t||!i||t===i)continue;let[l,a]=t<i?[t,i]:[i,t],s=`${l}\u0000${a}`,c=o.get(s);c||(c={a:l,b:a,weight:0,via:new Set},o.set(s,c)),c.weight++,c.via.add(e.source_connection_id)}return[...o.values()]},"companyOf",0,r,"getSeniority",0,n,"industryByKey",0,a,"industryOf",0,s,"isSenior",0,d,"waysInto",0,function(e,t=[],n=[]){let o=t.filter(t=>r(t)===e),i=new Map;for(let t of n)r(t)===e&&i.set(t.source_connection_id,(i.get(t.source_connection_id)||0)+1);let l=new Map(t.map(e=>[e.id,e]));return{direct:o,bridges:[...i.entries()].map(([e,t])=>({bridge:l.get(e),n:t})).filter(e=>e.bridge).sort((e,t)=>t.n-e.n||(Number(t.bridge.power_score)||0)-(Number(e.bridge.power_score)||0))}}])},19821,e=>{"use strict";async function t(e){let t=e?`/api/network?userId=${encodeURIComponent(e)}`:"/api/network",n=await fetch(t);if(!n.ok)throw Error(`Failed to load network (${n.status})`);let r=await n.json();return{degree1:r.degree1||[],degree2:r.degree2||[],degree3:r.degree3||[]}}e.s(["loadNetwork",0,t])},40996,e=>{"use strict";async function t(){let e=await fetch("/api/scraper");if(!e.ok)throw Error("Could not reach the app.");return e.json()}async function n(e,t,r={}){let o=await fetch("/api/scraper",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:e,...t?{name:t}:{},...r})}),i=await o.json().catch(()=>({}));if(!o.ok)throw Error(i.error||"Could not start the scanner.");return i}async function r(e){let t=await fetch(`/api/scraper?resume=${encodeURIComponent(e)}`);return t.ok?(await t.json()).resume??null:null}async function o(){await fetch("/api/scraper",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"cancel"})})}Symbol.for("six-degrees.scan-state");let i=Object.freeze({known:!1,running:!1,pending:!1,action:null,target:null,startedAt:null,progress:null,log:[],finished:[]}),l=new Set,a=i,s=JSON.stringify(a),c=null,d=null,u=0,p=!1,f=new Set;function h(e){let t=JSON.stringify(e);if(t!==s)for(let n of(s=t,a=Object.freeze(e),[...l]))n()}async function g(){(!("u">typeof document&&document.hidden)||a.running)&&await function(){if(d&&d.epoch===u)return d.promise;let e=u,t=fetch("/api/scraper?job=1").then(e=>e.ok?e.json():null).then(t=>{e===u&&function(e){if(!e||"object"!=typeof e)return;let t=!0===e.running;t&&null!=e.startedAt&&f.add(e.startedAt);let n=(Array.isArray(e.recent)?e.recent:[]).filter(e=>f.has(e.startedAt)).map(n=>({...n,log:!t&&n.startedAt===e.startedAt&&Array.isArray(e.log)?e.log:[]}));h({known:!0,running:t||p,pending:p&&!t,action:t?e.action??null:p?a.action:null,target:t?e.target??null:p?a.target:null,startedAt:t?e.startedAt??null:null,progress:t?e.progress??null:null,log:t&&Array.isArray(e.log)?e.log:[],finished:n})}(t)}).catch(()=>{}).finally(()=>{d?.promise===t&&(d=null)});return d={epoch:e,promise:t},t}(),clearTimeout(c),c=l.size?setTimeout(g,a.running?1500:5e3):null}function y(e){return l.add(e),1===l.size&&g(),()=>{l.delete(e),l.size||(clearTimeout(c),c=null)}}async function m(e,{name:t,id:r,onLog:o,...i}={}){let l;u++,p=!0,h({...a,known:!0,running:!0,pending:!0,action:e,target:t||r?{id:r??null,name:t??null}:null,startedAt:null,progress:null,log:[]});try{l=await n(e,t,{...r?{id:r}:{},...i})}catch(e){throw p=!1,u++,a.pending&&h({...a,running:!1,pending:!1,action:null,target:null,log:[]}),g(),e}p=!1,u++;let s=l?.startedAt??null;null!=s&&f.add(s);let c=new Promise(e=>{let t=y(()=>{a.running&&a.startedAt===s&&o?.(a.log);let n=null==s?a.running?null:{exitCode:null,failure:null,log:[]}:a.finished.find(e=>e.startedAt===s);n&&(t(),n.log.length&&o?.(n.log),e(n))});g()});return{startedAt:s,ended:c}}function x(e){return!!e?.target&&["bridge","rescrape","resume"].includes(e.action)}e.s(["SCANNER_UNKNOWN",0,i,"beginScrape",0,m,"busyReason",0,function(e=a){if(!e?.running)return null;let t=e.target?.name;switch(e.action){case"bridge":case"rescrape":case"resume":return t?`${t}’s circle is being scanned`:"A circle is being scanned";case"company":return t?`${t} is being scanned`:"A company is being scanned";case"auto-bridge":case"auto-bridge-retry":case"resume-all":return"Your bridges are being mapped, one by one";case"full":case"refresh":return"Your own connections are being scanned";default:switch(e.action){case"install":return"The scanner's packages are being installed";case"setup":return"The scanner is being set up";case"login":return"The LinkedIn sign-in window is open";default:return"A scan is running"}}},"isCircleScan",0,x,"notReadyMessage",0,function(e){if(!e)return"Could not reach the app.";let t=e.checks||{};return t.scriptsFound?t.dependencies?t.chrome?null:"Google Chrome is not installed.":t.python||t.download?"The scanner is not set up yet — open Scan to set it up.":"No Python 3.10 to 3.14 is installed on this machine.":"The scanner files are missing from this install."},"resumePoint",0,r,"runScrape",0,function(e,t={}){return m(e,t).then(e=>e.ended)},"scannerNow",0,function(){return a},"scansCircleOf",0,function(e,t){if(!x(e)||!t)return!1;let{id:n,name:r}=e.target;return n&&t.id?n===t.id:!!r&&r===t.name},"scraperStatus",0,t,"stopScrape",0,o,"watchScanner",0,y],40996)},22016,(e,t,n)=>{"use strict";e.i(47167),Object.defineProperty(n,"__esModule",{value:!0});var r={default:function(){return m},useLinkStatus:function(){return b}};for(var o in r)Object.defineProperty(n,o,{enumerable:!0,get:r[o]});let i=e.r(90809),l=e.r(43476),a=i._(e.r(71645)),s=e.r(95057),c=e.r(8372),d=e.r(18581),u=e.r(18967),p=e.r(5550),f=e.r(88540),h=e.r(91949),g=e.r(73668),y=e.r(9396);function m(t){var n;let r,o,i,[m,b]=(0,a.useOptimistic)(h.IDLE_LINK_STATUS),w=(0,a.useRef)(null),{href:k,as:v,children:j,prefetch:S=null,passHref:C,replace:M,shallow:A,scroll:z,onClick:T,onMouseEnter:R,onTouchStart:$,legacyBehavior:B=!1,onNavigate:O,transitionTypes:E,ref:F,unstable_dynamicOnHover:I,..._}=t;r=j,B&&("string"==typeof r||"number"==typeof r)&&(r=(0,l.jsx)("a",{children:r}));let N=a.default.useContext(c.AppRouterContext),P=!1!==S,W=!1===S?"none":!0===S?"full":"auto",D="none"!==W?"auto"===W?y.FetchStrategy.PPR:y.FetchStrategy.Full:y.FetchStrategy.PPR,L="string"==typeof(n=v||k)?n:(0,s.formatUrl)(n);if(B){if(r?.$$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(r)}let U=B?o&&"object"==typeof o&&o.ref:F,K,H=a.default.useCallback(e=>(null!==N&&(w.current=(0,h.mountLinkInstance)(e,L,N,D,P,b,K)),()=>{w.current&&((0,h.unmountLinkForCurrentNavigation)(w.current),w.current=null),(0,h.unmountPrefetchableInstance)(e)}),[P,L,N,D,b,K]),Y={ref:(0,d.useMergedRef)(H,U),onClick(t){B||"function"!=typeof T||T(t),B&&o.props&&"function"==typeof o.props.onClick&&o.props.onClick(t),!N||t.defaultPrevented||function(t,n,r,o,i,l,s,c="none"){if("u">typeof window){let d,{nodeName:u}=t.currentTarget;if("A"===u.toUpperCase()&&((d=t.currentTarget.getAttribute("target"))&&"_self"!==d||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,g.isLocalURL)(n)){o&&(t.preventDefault(),location.replace(n));return}if(t.preventDefault(),l){let e=!1;if(l({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:p}=e.r(99781);a.default.startTransition(()=>{p(n,o?"replace":"push",!1===i?f.ScrollBehavior.NoScroll:f.ScrollBehavior.Default,r.current,s,c)})}}(t,L,w,M,z,O,E,W)},onMouseEnter(e){B||"function"!=typeof R||R(e),B&&o.props&&"function"==typeof o.props.onMouseEnter&&o.props.onMouseEnter(e),N&&P&&(0,h.onNavigationIntent)(e.currentTarget,!0===I)},onTouchStart:function(e){B||"function"!=typeof $||$(e),B&&o.props&&"function"==typeof o.props.onTouchStart&&o.props.onTouchStart(e),N&&P&&(0,h.onNavigationIntent)(e.currentTarget,!0===I)}};return(0,u.isAbsoluteUrl)(L)?Y.href=L:B&&!C&&("a"!==o.type||"href"in o.props)||(Y.href=(0,p.addBasePath)(L)),i=B?a.default.cloneElement(o,Y):(0,l.jsx)("a",{..._,...Y,children:r}),(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 n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},18581,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"useMergedRef",{enumerable:!0,get:function(){return o}});let r=e.r(71645);function o(e,t){let n=(0,r.useRef)(null),o=(0,r.useRef)(null);return(0,r.useCallback)(r=>{if(null===r){let e=n.current;e&&(n.current=null,e());let t=o.current;t&&(o.current=null,t())}else e&&(n.current=i(e,r)),t&&(o.current=i(t,r))},[e,t])}function i(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let n=e(t);return"function"==typeof n?n:()=>e(null)}}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},18967,(e,t,n)=>{"use strict";e.i(47167),Object.defineProperty(n,"__esModule",{value:!0});var r={DecodeError:function(){return m},MiddlewareNotFoundError:function(){return k},MissingStaticPage:function(){return w},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 u},getLocationOrigin:function(){return c},getURL:function(){return d},isAbsoluteUrl:function(){return s},isResSent:function(){return p},loadGetInitialProps:function(){return h},normalizeRepeatedSlashes:function(){return f},stringifyError:function(){return v}};for(var o in r)Object.defineProperty(n,o,{enumerable:!0,get:r[o]});let i=["CLS","FCP","FID","INP","LCP","TTFB"];function l(e){let t,n=!1;return(...r)=>(n||(n=!0,t=e(...r)),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:n}=window.location;return`${e}//${t}${n?":"+n:""}`}function d(){let{href:e}=window.location,t=c();return e.substring(t.length)}function u(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function p(e){return e.finished||e.headersSent}function f(e){let t=e.split("?");return t[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(t[1]?`?${t.slice(1).join("?")}`:"")}async function h(e,t){let n=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await h(t.Component,t.ctx)}:{};let r=await e.getInitialProps(t);if(n&&p(n))return r;if(!r)throw Object.defineProperty(Error(`"${u(e)}.getInitialProps()" should resolve to an object. But found "${r}" instead.`),"__NEXT_ERROR_CODE",{value:"E1025",enumerable:!1,configurable:!0});return r}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 w extends Error{constructor(e,t){super(),this.message=`Failed to load static file for page: ${e} ${t}`}}class k extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function v(e){return JSON.stringify({message:e.message,stack:e.stack})}},73668,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"isLocalURL",{enumerable:!0,get:function(){return i}});let r=e.r(18967),o=e.r(52817);function i(e){if(!(0,r.isAbsoluteUrl)(e))return!0;try{let t=(0,r.getLocationOrigin)(),n=new URL(e,t);return n.origin===t&&(0,o.hasBasePath)(n.pathname)}catch(e){return!1}}},98183,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={assign:function(){return s},searchParamsToUrlQuery:function(){return i},urlQueryToSearchParams:function(){return a}};for(var o in r)Object.defineProperty(n,o,{enumerable:!0,get:r[o]});function i(e){let t={};for(let[n,r]of e.entries()){let e=t[n];void 0===e?t[n]=r:Array.isArray(e)?e.push(r):t[n]=[e,r]}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[n,r]of Object.entries(e))if(Array.isArray(r))for(let e of r)t.append(n,l(e));else t.set(n,l(r));return t}function s(e,...t){for(let n of t){for(let t of n.keys())e.delete(t);for(let[t,r]of n.entries())e.append(t,r)}return e}},95057,(e,t,n)=>{"use strict";e.i(47167),Object.defineProperty(n,"__esModule",{value:!0});var r={formatUrl:function(){return a},formatWithValidation:function(){return c},urlObjectKeys:function(){return s}};for(var o in r)Object.defineProperty(n,o,{enumerable:!0,get:r[o]});let i=e.r(90809)._(e.r(98183)),l=/https?|ftp|gopher|file/;function a(e){let{auth:t,hostname:n}=e,r=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:n&&(c=t+(~n.indexOf(":")?`[${n}]`:n),e.port&&(c+=":"+e.port)),s&&"object"==typeof s&&(s=String(i.urlQueryToSearchParams(s)));let d=e.search||s&&`?${s}`||"";return r&&!r.endsWith(":")&&(r+=":"),e.slashes||(!r||l.test(r))&&!1!==c?(c="//"+(c||""),o&&"/"!==o[0]&&(o="/"+o)):c||(c=""),a&&"#"!==a[0]&&(a="#"+a),d&&"?"!==d[0]&&(d="?"+d),o=o.replace(/[?#]/g,encodeURIComponent),d=d.replace("#","%23"),`${r}${c}${o}${d}${a}`}let s=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return a(e)}},18566,(e,t,n)=>{t.exports=e.r(76562)}]);
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,2776,e=>{"use strict";var t=e.i(43476),n=e.i(15812);e.s(["default",0,function({children:e}){let{userId:r,ready:o}=(0,n.useUser)();return o&&r?e:(0,t.jsx)("div",{style:{minHeight:"100vh",display:"flex",alignItems:"center",justifyContent:"center",background:"#0a0a1a",color:"#fff",padding:24,textAlign:"center",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},children:o?(0,t.jsxs)("div",{style:{maxWidth:420},children:[(0,t.jsx)("div",{style:{fontSize:18,fontWeight:700,marginBottom:8},children:"Can’t reach 6 Degrees’ local server"}),(0,t.jsx)("div",{style:{color:"#888",fontSize:14,lineHeight:1.6},children:"The page loaded but the app behind it is not answering. If you started it from a terminal, check that window for an error, then reload this page."})]}):(0,t.jsx)("div",{style:{fontSize:18,fontWeight:600},children:"Loading…"})})}])},8819,e=>{"use strict";var t=e.i(43476);let n="1px solid rgba(255,255,255,0.1)";function r({children:e,style:n}){return(0,t.jsx)("div",{style:{fontSize:13.5,color:"#8b9a9a",lineHeight:1.6,marginTop:4,...n},children:e})}e.s(["Body",0,r,"Btn",0,function({children:e,onClick:r,disabled:o,primary:i,tone:a,type:s="button"}){return(0,t.jsx)("button",{type:s,onClick:r,disabled:o,style:{padding:"9px 18px",borderRadius:7,fontSize:13.5,fontWeight:650,color:o?"#667":"#fff",border:n,background:o?"rgba(255,255,255,0.05)":"bad"===a?"rgba(255,80,80,0.15)":i?"linear-gradient(135deg, #9B59B6, #3498DB)":"rgba(255,255,255,0.08)",cursor:o?"not-allowed":"pointer"},children:e})},"FONT",0,'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',"LINE",0,n,"Mono",0,function({children:e}){return(0,t.jsx)("code",{style:{background:"rgba(255,255,255,0.08)",padding:"1px 5px",borderRadius:4,wordBreak:"break-all"},children:e})},"Section",0,function({id:e,title:o,intro:i,children:a}){return(0,t.jsxs)("section",{id:e,style:{padding:"24px 0",borderBottom:n,scrollMarginTop:16},children:[(0,t.jsx)("h2",{style:{fontSize:16,fontWeight:650,margin:"0 0 6px"},children:o}),i&&(0,t.jsx)(r,{style:{marginTop:0,marginBottom:12},children:i}),a]})},"Status",0,function({children:e,tone:n}){return(0,t.jsxs)("div",{role:"status",style:{marginTop:10,padding:"10px 14px",borderRadius:8,fontSize:13.5,lineHeight:1.6,color:"ok"===n?"#00ff88":"bad"===n?"#ff7676":"#e8e8ee",background:"ok"===n?"rgba(0,255,136,0.08)":"bad"===n?"rgba(255,80,80,0.08)":"rgba(255,255,255,0.05)",border:`1px solid ${"ok"===n?"rgba(0,255,136,0.3)":"bad"===n?"rgba(255,80,80,0.3)":"rgba(255,255,255,0.12)"}`},children:["ok"===n&&"✓ ",e]})}])},5445,e=>{"use strict";var t=e.i(43476),n=e.i(71645),r=e.i(22016),o=e.i(18566),i=e.i(2776),a=e.i(8819);function s(){let[e,r]=(0,n.useState)(null);return((0,n.useEffect)(()=>{fetch("/api/update").then(e=>e.json()).then(r).catch(()=>{})},[]),e)?e.installed?(0,t.jsx)(u,{local:e}):(0,t.jsx)(c,{local:e}):null}async function l(e){let t=await fetch("/api/update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),n=await t.json().catch(()=>({}));return{ok:t.ok,d:n}}function c({local:e}){let[r,o]=(0,n.useState)(null),[i,s]=(0,n.useState)(null),[d,u]=(0,n.useState)(null),[h,p]=(0,n.useState)(null);async function f(e){s(e),u(null);try{let{ok:t,d:n}=await l({action:e});if(!t){u(n.error||"Something went wrong."),n.dirty&&o({dirty:n.dirty});return}"check"===e?o(n):(p(n),o(null))}catch(e){u(e.message)}finally{s(null)}}return(0,n.useEffect)(()=>{"updates"===new URLSearchParams(window.location.search).get("check")&&(document.getElementById("updates")?.scrollIntoView({block:"center"}),f("check"),window.history.replaceState(null,"",window.location.pathname))},[]),(0,t.jsxs)(a.Section,{id:"updates",title:"Updates",children:[h?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(a.Body,{children:["Updated to ",(0,t.jsx)(a.Mono,{children:h.sha})," — “",h.subject,"”."]}),(0,t.jsx)(a.Body,{style:{color:h.needsRestart?"#FFD700":void 0},children:h.needsRestart?"Stop the app in your terminal and start it again — this update changed how it starts.":"The page will pick up most changes on its own. Restart the app if anything looks odd."})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(a.Body,{children:["You are on ",(0,t.jsx)(a.Mono,{children:e.sha})," — “",e.subject,"”."]}),r&&0===r.behind&&(0,t.jsx)(a.Status,{tone:"ok",children:"You’re up to date."}),r&&r.behind>0&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(a.Body,{style:{color:"#00ff88"},children:[r.behind," update",1===r.behind?"":"s"," available."]}),(0,t.jsx)("pre",{style:m,children:r.commits.join("\n")})]}),r?.dirty?.length>0&&(0,t.jsxs)(a.Body,{children:["Changed files here:"," ",(0,t.jsx)(a.Mono,{children:r.dirty.join(", ")}),". Commit or discard them first — this will not throw away your work."]}),(0,t.jsxs)(g,{children:[(0,t.jsx)(a.Btn,{onClick:()=>f("check"),disabled:!!i,children:"check"===i?"Checking…":"Check for updates"}),r?.behind>0&&(0,t.jsx)(a.Btn,{onClick:()=>f("pull"),disabled:!!i,primary:!0,children:"pull"===i?"Updating…":`Install ${r.behind} update${1===r.behind?"":"s"}`})]})]}),d&&(0,t.jsx)(a.Body,{style:{color:"#ff7676"},children:d}),(0,t.jsxs)(a.Body,{style:{fontSize:12,color:"#667",marginTop:12},children:["Nothing is checked automatically and nothing about you is sent — this runs the same ",(0,t.jsx)(a.Mono,{children:"git fetch"})," and ",(0,t.jsx)(a.Mono,{children:"git pull"})," you would type yourself."]})]})}let d=["checking","downloading","verifying","preparing","restarting"];function u({local:e}){let r="mac-app"===e.kind,[o,i]=(0,n.useState)(!1),[s,c]=(0,n.useState)(null),[x,b]=(0,n.useState)(null),[j,w]=(0,n.useState)(!1),[k,S]=(0,n.useState)(null),[v,T]=(0,n.useState)(e.job||null),[B,C]=(0,n.useState)(!1),[I,D]=(0,n.useState)(null),[E,R]=(0,n.useState)(null),[P,O]=(0,n.useState)(void 0),[$,M]=(0,n.useState)(0),[N,L]=(0,n.useState)(!1),F=!!(v&&d.includes(v.phase)),A=F&&("restarting"===v.phase||$>0);async function z(){i(!0),c(null),b(null),D(null),R(null),O(void 0),T(e=>e&&d.includes(e.phase)?e:null);try{let{ok:e,d:t}=await l({action:"check-release"});e?(c(t),S(new Date)):b(t.error||"Could not check.")}catch(e){b(e.message)}finally{i(!1)}}async function _(){C(!0),D(null),R(null),O(void 0),M(0),L(!1);try{let{ok:e,d:t}=await l({action:"install-release"});t.job&&T(t.job),!e&&(D(t.error||"The update could not start."),R(t.refusal||null),"fallback"in t&&O(t.fallback))}catch(e){D(e.message)}finally{C(!1)}}async function U(){try{let{d:e}=await l({action:"cancel-install"});e.job&&T(e.job)}catch{}}async function W(){try{await navigator.clipboard.writeText(e.command),w(!0),setTimeout(()=>w(!1),1600)}catch{b("Could not copy — select the line and copy it by hand.")}}(0,n.useEffect)(()=>{"#updates"===window.location.hash&&document.getElementById("updates")?.scrollIntoView({block:"start"}),"updates"!==new URLSearchParams(window.location.search).get("check")||(window.history.replaceState(null,"",window.location.pathname),e.job&&d.includes(e.job.phase)||(document.getElementById("updates")?.scrollIntoView({block:"center"}),z().then(()=>document.getElementById("updates")?.scrollIntoView({block:"end",behavior:"smooth"}))))},[e.job]),(0,n.useEffect)(()=>{if(!F)return;let e=!0,t=setTimeout(async()=>{try{if(A){let t=await fetch("/api/update",{cache:"no-store"}),n=await t.json();if(!e)return;if(!n.job||n.job.id!==v.id)return void window.location.reload();M(0),T(n.job)}else{let{ok:t,d:n}=await l({action:"update-status"});e&&t&&n.job&&T(n.job)}}catch{e&&M(e=>e+1)}},A?1500:600);return()=>{e=!1,clearTimeout(t)}},[v,$,F,A]),(0,n.useEffect)(()=>{if(!A)return;let e=setTimeout(()=>L(!0),6e4);return()=>clearTimeout(e)},[A]);let Y=v?.phase==="failed",H=r&&s?.install?.possible,V=Y&&"stale-check"===v.code||"not-checked"===E,K=void 0!==P?P:s?.fallback,G=s?.newer&&(!r||K)&&(!H||Y||I||e.lastUpdate?.tone==="bad"),X=function({mac:e,kind:t,canInstall:n,fallback:r}){if(!e)return"source"===t?"A copy built from the source code updates by fetching the code and building it again, which it can't do while it runs. Stop it (Ctrl-C), then run this in the six-degrees folder. Your network stays where it is.":"This copy runs inside the terminal that started it, so it can't replace itself while it runs. Stop it first (Ctrl-C), then run this to start the newest version. Your network stays where it is.";if(!r)return null;let o=r.dataDir?` It opens the new version on the usual data folder, not on ${r.dataDir}: to use that one, quit it and open it again with --data-dir, as you opened this one.`:"";return"replace"===r.mode?`${n?"Or paste this into Terminal.":"Paste this into Terminal instead."} It closes this app, puts the new version in its place and opens it. Your network stays where it is.${o}`:`${n?"Or copy":"Copy"} this line, quit Six Degrees, then paste it into Terminal. It installs the new version at ${r.installsTo}, not where this copy is, and opens it: use that one from then on. Your network stays where it is.${o}`}({mac:r,kind:e.kind,canInstall:H,fallback:K});return(0,t.jsxs)(a.Section,{id:"updates",title:"Updates",children:[e.lastUpdate&&!F&&(0,t.jsx)(f,{report:e.lastUpdate}),(0,t.jsxs)(a.Body,{children:["You have version ",(0,t.jsx)(a.Mono,{children:e.version}),"."]}),F?(0,t.jsx)(p,{job:v,restarting:A,slow:N,onCancel:U}):(0,t.jsxs)(t.Fragment,{children:[Y&&(0,t.jsxs)(a.Status,{tone:"bad",children:[(0,t.jsx)("strong",{children:"The update didn’t finish."})," ",v.error," Nothing was changed."]}),v?.phase==="cancelled"&&(0,t.jsx)(a.Status,{children:"Cancelled. Nothing was changed."}),I&&(0,t.jsx)(a.Status,{tone:"bad",children:I}),s&&!s.latest&&(0,t.jsx)(a.Status,{children:"No release has been published yet."}),s?.latest&&!s.newer&&(0,t.jsxs)(a.Status,{tone:"ok",children:["You’re up to date: ",s.latest.version," is the newest version.",k&&(0,t.jsxs)("span",{style:{color:"#8b9a9a"},children:[" Checked at ",k.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),"."]})]}),s?.newer&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(a.Body,{style:{color:"#00ff88"},children:["Version ",s.latest.version," is available."]}),H&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(a.Body,{children:["It downloads ",s.install.size?`about ${h(s.install.size)} MB`:"the new version"," from GitHub, checks it, then closes, replaces itself and reopens. Your network isn’t touched, and a backup of it is made first."]}),(0,t.jsxs)(g,{children:[V?(0,t.jsx)(a.Btn,{onClick:z,disabled:o,primary:!0,children:o?"Checking…":"Check again"}):(0,t.jsx)(a.Btn,{onClick:_,disabled:B,primary:!0,children:B?"Starting…":Y||I?"Try again":"Install and restart"}),(0,t.jsx)(y,{url:s.latest.url})]})]}),r&&!H&&s.install?.reason&&(0,t.jsx)(a.Body,{children:s.install.reason}),G&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(a.Body,{children:X}),e.testReleases?(0,t.jsx)("pre",{style:m,children:"Not shown in test mode: it would install the real release from GitHub into Applications."}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("pre",{style:m,children:e.command}),(0,t.jsxs)(g,{children:[(0,t.jsx)(a.Btn,{onClick:W,primary:!H,children:j?"Copied":"Copy"}),!H&&(0,t.jsx)(y,{url:s.latest.url})]})]})]}),!H&&!G&&(0,t.jsx)(g,{children:(0,t.jsx)(y,{url:s.latest.url})})]}),!s?.newer&&(0,t.jsx)(g,{children:(0,t.jsx)(a.Btn,{onClick:z,disabled:o,children:o?"Checking…":s?"Check again":"Check for updates"})})]}),x&&(0,t.jsx)(a.Body,{style:{color:"#ff7676"},children:x}),(0,t.jsxs)(a.Body,{style:{fontSize:12,color:"#667",marginTop:12},children:["Nothing is checked automatically. The button asks GitHub for the newest version number, and nothing about you is sent.",r&&" Only a second click, Install and restart, downloads the new version."]}),e.testReleases&&(0,t.jsxs)(a.Body,{style:{fontSize:12,color:"#FFD700",marginTop:6},children:["Test mode: releases are read from ",(0,t.jsx)(a.Mono,{children:e.testReleases})," on this computer, not from GitHub."]})]})}let h=e=>Math.max(1,Math.round(e/1e6));function p({job:e,restarting:n,slow:r,onCancel:o}){let i=e.total?Math.min(100,Math.round(e.received/e.total*100)):null,s=n?"Restarting… Six Degrees closes and opens again in a moment.":"checking"===e.phase?"Asking GitHub for the newest version…":"downloading"===e.phase?`Downloading ${e.version}…${null!==i?` ${i}% (${h(e.received)} of ${h(e.total)} MB)`:""}`:"verifying"===e.phase?"Checking the download…":"Preparing the new version…";return(0,t.jsxs)("div",{role:"status","aria-live":"polite",style:{marginTop:12},children:[(0,t.jsx)(a.Body,{style:{color:"#e8e8ee"},children:s}),"downloading"===e.phase&&null!==i&&(0,t.jsx)("div",{role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":i,"aria-label":"Download",style:{height:6,borderRadius:3,background:"rgba(255,255,255,0.08)",marginTop:10,overflow:"hidden",maxWidth:420},children:(0,t.jsx)("div",{style:{width:`${i}%`,height:"100%",background:"linear-gradient(90deg, #9B59B6, #3498DB)",transition:"width 0.4s ease"}})}),r&&(0,t.jsx)(a.Body,{children:"This is taking longer than it should. If Six Degrees doesn’t open again by itself, open it from your Applications folder."}),!n&&(0,t.jsx)(g,{children:(0,t.jsx)(a.Btn,{onClick:o,children:"Cancel"})})]})}function f({report:e}){let n=new Date(e.at).toLocaleString([],{dateStyle:"medium",timeStyle:"short"});return(0,t.jsxs)(a.Status,{tone:"ok"===e.tone?"ok":"bad",children:[e.text," ",(0,t.jsxs)("span",{style:{color:"#8b9a9a"},children:["(",n,")"]}),"ok"===e.tone&&e.previous&&(0,t.jsxs)("span",{style:{display:"block",fontSize:12.5,color:"#8b9a9a",marginTop:4},children:["A copy of the version you had is kept in ",(0,t.jsx)(a.Mono,{children:e.previous})," until the next update. To go back to it, open that file and drag the app it gives you into your Applications folder."]})]})}function y({url:e}){return e?(0,t.jsx)("a",{href:e,target:"_blank",rel:"noreferrer",style:{color:"#3498DB",fontSize:13.5},children:"What changed →"}):null}function g({children:e}){return(0,t.jsx)("div",{style:{display:"flex",gap:10,marginTop:12,flexWrap:"wrap",alignItems:"center"},children:e})}let m={background:"rgba(0,0,0,0.45)",border:a.LINE,borderRadius:8,padding:12,margin:"8px 0 0",fontSize:12,lineHeight:1.7,color:"#b9c6c6",fontFamily:"ui-monospace, SFMono-Regular, Menlo, monospace",whiteSpace:"pre-wrap",maxHeight:180,overflow:"auto"};function x(e){if(!e)return"0 KB";if(e<1048576)return`${Math.max(1,Math.round(e/1024))} KB`;let t=e/1048576;return`${t<10?t.toFixed(1):Math.round(t)} MB`}let b=e=>Number(e||0).toLocaleString("en-US"),j=(e,t,n=`${t}s`)=>`${b(e)} ${1===Number(e)?t:n}`;function w(e,t=!0){if(!e)return null;let n=new Date(e);return Number.isNaN(n.getTime())?null:n.toLocaleString(void 0,t?{dateStyle:"medium",timeStyle:"short"}:{dateStyle:"medium"})}let k={auto:"before a new version",import:"before an import",manual:"made by hand"};async function S(e,t){let n=await e.json().catch(()=>({}));if(!e.ok)throw Object.assign(Error(n.error||t),{data:n});return n}let v={display:"flex",gap:10,marginTop:12,flexWrap:"wrap",alignItems:"center"},T={fontSize:12,color:"#667",marginTop:10},B={fontSize:14,fontWeight:650,margin:"26px 0 4px",color:"#e8e8ee"},C={display:"flex",gap:8,alignItems:"flex-start",marginTop:12,fontSize:13,color:"#c8d0d0",lineHeight:1.5,cursor:"pointer"};function I({label:e,children:n}){return(0,t.jsxs)("div",{style:{display:"flex",gap:12,justifyContent:"space-between",padding:"7px 0",borderTop:a.LINE,fontSize:13.5},children:[(0,t.jsx)("span",{style:{color:"#8b9a9a"},children:e}),(0,t.jsx)("span",{style:{color:"#e8e8ee",textAlign:"right"},children:n})]})}function D(){return(0,t.jsx)("a",{href:"https://github.com/blakeb056/six-degrees#undo-an-import",target:"_blank",rel:"noreferrer",style:{color:"inherit",textDecoration:"underline"},children:"Undo an import"})}function E(){let[e,r]=(0,n.useState)(null),[o,i]=(0,n.useState)(null),[s,l]=(0,n.useState)(null),[c,d]=(0,n.useState)(null),[u,h]=(0,n.useState)(null),[p,f]=(0,n.useState)(null),[y,g]=(0,n.useState)(!0),[m,E]=(0,n.useState)(null),[R,P]=(0,n.useState)(!1),[O,$]=(0,n.useState)(!1),M=(0,n.useRef)(null),N=(0,n.useRef)(!1),L=(0,n.useCallback)(()=>fetch("/api/data",{cache:"no-store"}).then(e=>S(e,"The data folder could not be read.")).then(e=>{let t=Date.parse(e.lastImport?.appliedAt||"");r({...e,importIsRecent:Number.isFinite(t)&&Date.now()-t<864e5}),i(null)}).catch(e=>i(e.message)),[]);async function F(){d(null);try{await navigator.clipboard.writeText(e.dataDir),d({tone:"ok",text:"Copied the folder’s path."})}catch{d({tone:"bad",text:"This window can’t copy. Select the path above and copy it instead."})}}async function A(){l("reveal"),d(null);try{await S(await fetch("/api/data/reveal",{method:"POST"}),"The folder could not be opened."),d({tone:"ok",text:"darwin"===e.platform?"Opened in Finder.":"Opened in your file browser."})}catch(e){d({tone:"bad",text:e.message})}finally{l(null)}}async function z(){l("export"),h(null);try{let e,t=await fetch("/api/data/export",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({photos:y})});t.ok||await S(t,"The copy could not be made.");let n=await t.blob(),r=/filename="([^"]+)"/.exec(t.headers.get("content-disposition")||"")?.[1]||"Six Degrees backup.sixdegrees",o=URL.createObjectURL(n),i=document.createElement("a");i.href=o,i.download=r,i.style.position="fixed",i.style.left="-9999px",document.body.appendChild(i),i.click(),i.remove(),setTimeout(()=>URL.revokeObjectURL(o),6e4);let a=[(e=Number(t.headers.get("x-six-degrees-people")),j(e,"person","people"))];a.push(y?j(Number(t.headers.get("x-six-degrees-photos")),"photo"):"no photos"),h({tone:"ok",text:`Made “${r}” (${x(n.size)}: ${a.join(", ")}). Look for it in your Downloads folder, or wherever you chose to save it.`})}catch(e){h({tone:"bad",text:e.message})}finally{l(null)}}async function _(){if(m){l("import"),f(null);try{let t={"Content-Type":"application/octet-stream","X-Six-Degrees-Size":String(m.size)};e.people>0&&(t["X-Six-Degrees-Replace"]=String(e.people)),await S(await fetch("/api/data/import",{method:"POST",headers:t,body:m}),"The file could not be imported."),E(null),P(!1),M.current&&(M.current.value=""),await L()}catch(e){e.data?.needsConfirm&&(P(!1),await L()),f({tone:"bad",text:e.message})}finally{l(null)}}}async function U(){l("cancel"),f(null);try{await S(await fetch("/api/data/import",{method:"DELETE"}),"The import could not be cancelled."),await L(),f({tone:"ok",text:"Cancelled. The network here stays as it is."})}catch(e){f({tone:"bad",text:e.message})}finally{l(null)}}async function W(){l("restart"),f(null);try{await S(await fetch("/api/data/restart",{method:"POST"}),"Six Degrees could not restart."),$(!0);let e=e=>new Promise(t=>setTimeout(t,e)),t=Date.now()+9e4;for(await e(2500);Date.now()<t;){try{if((await fetch("/api/data",{cache:"no-store"})).ok)return void window.location.reload()}catch{}await e(1e3)}$(!1),f({tone:"bad",text:"Six Degrees didn’t come back. Quit it and open it again: the import finishes as it starts."})}catch(e){f({tone:"bad",text:e.message})}finally{l(null)}}if((0,n.useEffect)(()=>{L()},[L]),(0,n.useEffect)(()=>{e&&!N.current&&(N.current=!0,"#data"===window.location.hash&&document.getElementById("data")?.scrollIntoView({block:"start"}))},[e]),!e)return(0,t.jsx)(a.Section,{id:"data",title:"Your data",children:o?(0,t.jsx)(a.Status,{tone:"bad",children:o}):(0,t.jsx)(a.Body,{children:"Loading…"})});let Y=e.pending,H=e.photosInCopy||e.photos,V=e.backups||[],K=V.reduce((e,t)=>e+(t.bytes||0),0),G=!!(m&&m.size>e.maxImportBytes),X=e.people>0,q=e.lastImport;return(0,t.jsxs)(a.Section,{id:"data",title:"Your data",intro:"Everything Six Degrees knows about your network is in one folder on this computer.",children:[(0,t.jsx)(a.Body,{children:(0,t.jsx)(a.Mono,{children:e.dataDir})}),(0,t.jsxs)("div",{style:v,children:[(0,t.jsx)(a.Btn,{onClick:F,children:"Copy the path"}),(0,t.jsx)(a.Btn,{onClick:A,disabled:"reveal"===s,children:"reveal"===s?"Opening…":"darwin"===e.platform?"Show in Finder":"Open the folder"})]}),c&&(0,t.jsx)(a.Status,{tone:c.tone,children:c.text}),(0,t.jsxs)("div",{style:{marginTop:16,borderBottom:a.LINE},children:[(0,t.jsxs)(I,{label:"Your network",children:[j(e.people,"person","people")," · ",x(e.databaseBytes)]}),(0,t.jsx)(I,{label:"Profile photos",children:e.photos.count?`${b(e.photos.count)} \xb7 ${x(e.photos.bytes)}`:"none saved yet"}),(0,t.jsx)(I,{label:"Backups",children:V.length?`${j(V.length,"copy","copies")} \xb7 ${x(K)}`:"none yet"}),(0,t.jsx)(I,{label:"LinkedIn sign-in for scanning",children:e.linkedinSignIn?"kept here, never put in a copy":"not signed in on this computer"})]}),V.length>0&&(0,t.jsxs)("details",{style:{marginTop:10,fontSize:13,color:"#8b9a9a"},children:[(0,t.jsx)("summary",{style:{cursor:"pointer"},children:"The backups"}),(0,t.jsx)("div",{style:{display:"grid",gridTemplateColumns:"minmax(0, 1fr) auto auto",gap:"6px 14px",marginTop:8},children:V.map(e=>(0,t.jsxs)("div",{style:{display:"contents"},children:[(0,t.jsxs)("span",{style:{wordBreak:"break-all",color:"#c8d0d0"},children:[e.name,e.folder?"/":"",(0,t.jsxs)("span",{style:{color:"#667"},children:[" · ",e.folder?"its photos and files":k[e.kind]||e.kind]})]}),(0,t.jsx)("span",{children:w(e.modifiedAt)}),(0,t.jsx)("span",{style:{textAlign:"right"},children:x(e.bytes)})]},e.name))})]}),(0,t.jsx)(a.Body,{style:T,children:"Backups are copies of your network from before a new version or an import. The newest five from new versions are kept; copies from before an import stay until you delete them."}),(0,t.jsx)(a.Body,{style:T,children:"The folder can’t be moved from here. A database that a sync service (iCloud Drive, Dropbox) copies while it’s open can be damaged, and this folder also holds your LinkedIn sign-in, which should never be synced. To use your network on another computer, save a copy below and import it there."}),(0,t.jsx)("h3",{style:B,children:"Move your network to another computer"}),(0,t.jsx)(a.Body,{children:"Save a copy here, then on the new computer install Six Degrees, open Settings → Your data and import the copy. Sign in to LinkedIn again there before you scan: your sign-in never goes into a copy."}),(0,t.jsxs)("label",{style:C,children:[(0,t.jsx)("input",{type:"checkbox",checked:y,onChange:e=>g(e.target.checked),style:{marginTop:3}}),(0,t.jsxs)("span",{children:["Include profile photos",H.count?` (${b(H.count)}, ${x(H.bytes)})`:"",". They can’t be downloaded again without a new scan."]})]}),(0,t.jsxs)("div",{style:v,children:[(0,t.jsx)(a.Btn,{primary:!0,onClick:z,disabled:!!s||O||0===e.people,children:"export"===s?"Saving…":"Save a copy of my network"}),0===e.people&&(0,t.jsx)("span",{style:{fontSize:13,color:"#8b9a9a"},children:"There’s no network here to save yet."})]}),u&&(0,t.jsx)(a.Status,{tone:u.tone,children:u.text}),(0,t.jsx)(a.Body,{style:T,children:"The copy holds the names, headlines and photos of the people in your network. Keep it private: don’t post it or share it, and delete it once it has been imported. A network opened from a LinkedIn CSV lives only in its browser tab, so it isn’t in the copy; import the CSV again on the new computer."}),(0,t.jsx)("h3",{style:B,children:"Bring in a network from another computer"}),Y?(0,t.jsxs)(a.Status,{children:[(0,t.jsx)("div",{style:{fontWeight:650},children:"An import is waiting to finish."}),(0,t.jsxs)("div",{children:["The network in the copy",Y.exportedAt?` saved ${w(Y.exportedAt,!1)}`:""," ","(",j(Y.people,"person","people"),Y.photos?`, ${j(Y.photos,"photo")}`:"",Y.fromVersion?`, from Six Degrees ${Y.fromVersion}`:"",")",Y.replacedPeople>0?` replaces the ${j(Y.replacedPeople,"person","people")} here the next time Six Degrees starts. A copy of what’s here now is kept in backups first, so the import can be undone.`:" becomes the network here the next time Six Degrees starts."," ","Your LinkedIn search budget and any pause on scanning are kept."]}),Y.error&&(0,t.jsxs)("div",{style:{color:"#ff7676",marginTop:6},children:["The last try stopped: ",Y.error.replace(/\.$/,""),". It tries again the next time Six Degrees starts."]}),O?(0,t.jsx)("div",{style:{marginTop:8},children:"Restarting… this page comes back in a few seconds."}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("div",{style:{marginTop:8},children:e.restart.how}),e.restart.command&&(0,t.jsx)("div",{style:{marginTop:6},children:(0,t.jsx)(a.Mono,{children:e.restart.command})}),(0,t.jsxs)("div",{style:v,children:[e.restart.canRestart&&(0,t.jsx)(a.Btn,{primary:!0,onClick:W,disabled:!!s,children:"restart"===s?"Restarting…":"Restart now"}),!Y.started&&(0,t.jsx)(a.Btn,{onClick:U,disabled:!!s,children:"cancel"===s?"Cancelling…":"Cancel the import"})]})]})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(a.Body,{children:"Pick the copy you saved on the other computer (a .sixdegrees file). It replaces the network here; the two networks are never merged. Your LinkedIn search budget and any pause on scanning are kept, with the other computer’s searches added."}),(0,t.jsx)("input",{ref:M,type:"file",accept:".sixdegrees",onChange:function(e){f(null),P(!1),E(e.target.files?.[0]||null)},style:{display:"none"}}),(0,t.jsxs)("div",{style:v,children:[(0,t.jsx)(a.Btn,{onClick:()=>M.current?.click(),disabled:!!s,children:"Choose a file…"}),m&&(0,t.jsxs)("span",{style:{fontSize:13,color:"#c8d0d0",wordBreak:"break-all"},children:[m.name," · ",x(m.size)]})]}),G&&(0,t.jsxs)(a.Status,{tone:"bad",children:["That file is ",x(m.size),". This copy can import files up to ",x(e.maxImportBytes),"."]}),m&&X&&!G&&(0,t.jsxs)("label",{style:C,children:[(0,t.jsx)("input",{type:"checkbox",checked:R,onChange:e=>P(e.target.checked),style:{marginTop:3}}),(0,t.jsxs)("span",{children:["Replace the ",j(e.people,"person","people")," in this copy’s network with the network in this file. A copy of what’s here is kept in backups first. Your search budget and any pause on scanning are kept too."]})]}),(0,t.jsx)("div",{style:v,children:(0,t.jsx)(a.Btn,{primary:!0,onClick:_,disabled:!m||G||X&&!R||!!s,children:"import"===s?"Checking the file…":"Import"})})]}),p&&(0,t.jsx)(a.Status,{tone:p.tone,children:p.text}),q&&!Y&&(e.importIsRecent?(0,t.jsxs)(a.Status,{tone:"ok",children:["Imported ",w(q.appliedAt),": ",j(q.people,"person","people"),q.exportedAt?` from the copy saved ${w(q.exportedAt,!1)}`:"",".",q.keptDatabase&&(0,t.jsxs)(t.Fragment,{children:[" ","What was here before is kept in ",(0,t.jsx)(a.Mono,{children:q.keptDatabase}),q.keptFiles?", with its photos and files beside it":"",".",q.keptAsIs&&" It couldn’t be read, so it was kept exactly as it was."," ","To go back to it, see ",(0,t.jsx)(D,{}),"."]})]}):(0,t.jsxs)(a.Body,{style:T,children:["Last import: ",w(q.appliedAt)," (",j(q.people,"person","people"),").",q.keptDatabase&&(0,t.jsxs)(t.Fragment,{children:[" What was here before is kept in ",(0,t.jsx)(a.Mono,{children:q.keptDatabase})," (",(0,t.jsx)(D,{}),")."]})]}))]})}var R=e.i(64745);let P={"mac-app":"the Mac app",npm:"the npm package (npx six-degrees)",source:"a copy built from the source code",git:"a git checkout of the source code"};function O(){let[e,i]=(0,n.useState)(null),[l,c]=(0,n.useState)(null),d=(0,o.useRouter)();if((0,n.useEffect)(()=>{let e=window.location.hash;("#sector"===e||"#tiers"===e)&&d.replace(`/scores${e}`)},[d]),(0,n.useEffect)(()=>{fetch("/api/settings").then(e=>e.json().then(t=>e.ok?t:Promise.reject(Error(t.error||"Could not load settings.")))).then(i).catch(e=>c(e.message))},[]),R.IS_DEMO)return(0,t.jsxs)("div",{style:{minHeight:"100vh",background:"#0a0a1a",color:"rgba(255,255,255,0.7)",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:12,textAlign:"center",padding:24,fontFamily:a.FONT},children:[(0,t.jsx)("h2",{style:{margin:0,fontSize:20,fontWeight:700,color:"#fff"},children:"Not part of the demo"}),(0,t.jsx)("p",{style:{margin:0,fontSize:13},children:"The public demo includes the Network Circle and Degrees views only."}),(0,t.jsx)(r.default,{href:"/",style:{fontSize:12,color:"rgba(255,255,255,0.5)",textDecoration:"none"},children:"← Back to the network"})]});let u=e?.about;return(0,t.jsxs)("div",{style:{minHeight:"100vh",background:"#0a0a1a",color:"#fff",fontFamily:a.FONT},children:[(0,t.jsxs)("header",{style:{padding:"16px 24px",borderBottom:a.LINE,display:"flex",alignItems:"center",gap:16},children:[(0,t.jsx)(r.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:a.LINE},children:"← Back to Map"}),(0,t.jsx)("h1",{style:{fontSize:22,fontWeight:700,margin:0,background:"linear-gradient(135deg, #FFD700, #9B59B6, #3498DB)",WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent"},children:"Settings"})]}),(0,t.jsxs)("main",{style:{maxWidth:720,margin:"0 auto",padding:"8px 24px 64px"},children:[l&&(0,t.jsx)(a.Body,{style:{color:"#ff7676",marginTop:16},children:l}),(0,t.jsx)(s,{}),(0,t.jsx)(a.Section,{id:"scoring",title:"Your field and tiers",children:(0,t.jsxs)(a.Body,{children:["They’re on the ",(0,t.jsx)(r.default,{href:"/scores",style:{color:"#3498DB"},children:"Scores"})," tab now, beside every company’s score: ",(0,t.jsx)(r.default,{href:"/scores#sector",style:{color:"#3498DB"},children:"your field"})," and"," ",(0,t.jsx)(r.default,{href:"/scores#tiers",style:{color:"#3498DB"},children:"how tiers are graded"}),"."]})}),(0,t.jsx)(E,{}),(0,t.jsx)(a.Section,{id:"about",title:"About this copy",children:u?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(a.Body,{children:["Version ",(0,t.jsx)(a.Mono,{children:u.version}),", running as ",P[u.kind]||u.kind,"."]}),(0,t.jsxs)(a.Body,{children:["Your network is kept in ",(0,t.jsx)(a.Mono,{children:u.dataDir}),u.customDataDir?" (a folder you chose).":".","mac-app"===u.kind&&" Help → Show the Data Folder opens it."]}),(0,t.jsx)(a.Body,{style:{fontSize:12,color:"#667",marginTop:10},children:"Settings are saved with your network, on this computer. Nothing here is sent anywhere."})]}):!l&&(0,t.jsx)(a.Body,{children:"Loading…"})})]})]})}e.s(["default",0,function(){return(0,t.jsx)(i.default,{children:(0,t.jsx)(O,{})})}],5445)},22016,(e,t,n)=>{"use strict";e.i(47167),Object.defineProperty(n,"__esModule",{value:!0});var r={default:function(){return m},useLinkStatus:function(){return b}};for(var o in r)Object.defineProperty(n,o,{enumerable:!0,get:r[o]});let i=e.r(90809),a=e.r(43476),s=i._(e.r(71645)),l=e.r(95057),c=e.r(8372),d=e.r(18581),u=e.r(18967),h=e.r(5550),p=e.r(88540),f=e.r(91949),y=e.r(73668),g=e.r(9396);function m(t){var n;let r,o,i,[m,b]=(0,s.useOptimistic)(f.IDLE_LINK_STATUS),j=(0,s.useRef)(null),{href:w,as:k,children:S,prefetch:v=null,passHref:T,replace:B,shallow:C,scroll:I,onClick:D,onMouseEnter:E,onTouchStart:R,legacyBehavior:P=!1,onNavigate:O,transitionTypes:$,ref:M,unstable_dynamicOnHover:N,...L}=t;r=S,P&&("string"==typeof r||"number"==typeof r)&&(r=(0,a.jsx)("a",{children:r}));let F=s.default.useContext(c.AppRouterContext),A=!1!==v,z=!1===v?"none":!0===v?"full":"auto",_="none"!==z?"auto"===z?g.FetchStrategy.PPR:g.FetchStrategy.Full:g.FetchStrategy.PPR,U="string"==typeof(n=k||w)?n:(0,l.formatUrl)(n);if(P){if(r?.$$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=s.default.Children.only(r)}let W=P?o&&"object"==typeof o&&o.ref:M,Y,H=s.default.useCallback(e=>(null!==F&&(j.current=(0,f.mountLinkInstance)(e,U,F,_,A,b,Y)),()=>{j.current&&((0,f.unmountLinkForCurrentNavigation)(j.current),j.current=null),(0,f.unmountPrefetchableInstance)(e)}),[A,U,F,_,b,Y]),V={ref:(0,d.useMergedRef)(H,W),onClick(t){P||"function"!=typeof D||D(t),P&&o.props&&"function"==typeof o.props.onClick&&o.props.onClick(t),!F||t.defaultPrevented||function(t,n,r,o,i,a,l,c="none"){if("u">typeof window){let d,{nodeName:u}=t.currentTarget;if("A"===u.toUpperCase()&&((d=t.currentTarget.getAttribute("target"))&&"_self"!==d||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,y.isLocalURL)(n)){o&&(t.preventDefault(),location.replace(n));return}if(t.preventDefault(),a){let e=!1;if(a({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:h}=e.r(99781);s.default.startTransition(()=>{h(n,o?"replace":"push",!1===i?p.ScrollBehavior.NoScroll:p.ScrollBehavior.Default,r.current,l,c)})}}(t,U,j,B,I,O,$,z)},onMouseEnter(e){P||"function"!=typeof E||E(e),P&&o.props&&"function"==typeof o.props.onMouseEnter&&o.props.onMouseEnter(e),F&&A&&(0,f.onNavigationIntent)(e.currentTarget,!0===N)},onTouchStart:function(e){P||"function"!=typeof R||R(e),P&&o.props&&"function"==typeof o.props.onTouchStart&&o.props.onTouchStart(e),F&&A&&(0,f.onNavigationIntent)(e.currentTarget,!0===N)}};return(0,u.isAbsoluteUrl)(U)?V.href=U:P&&!T&&("a"!==o.type||"href"in o.props)||(V.href=(0,h.addBasePath)(U)),i=P?s.default.cloneElement(o,V):(0,a.jsx)("a",{...L,...V,children:r}),(0,a.jsx)(x.Provider,{value:m,children:i})}let x=(0,s.createContext)(f.IDLE_LINK_STATUS),b=()=>(0,s.useContext)(x);("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},18581,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"useMergedRef",{enumerable:!0,get:function(){return o}});let r=e.r(71645);function o(e,t){let n=(0,r.useRef)(null),o=(0,r.useRef)(null);return(0,r.useCallback)(r=>{if(null===r){let e=n.current;e&&(n.current=null,e());let t=o.current;t&&(o.current=null,t())}else e&&(n.current=i(e,r)),t&&(o.current=i(t,r))},[e,t])}function i(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let n=e(t);return"function"==typeof n?n:()=>e(null)}}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},18967,(e,t,n)=>{"use strict";e.i(47167),Object.defineProperty(n,"__esModule",{value:!0});var r={DecodeError:function(){return m},MiddlewareNotFoundError:function(){return w},MissingStaticPage:function(){return j},NormalizeError:function(){return x},PageNotFoundError:function(){return b},SP:function(){return y},ST:function(){return g},WEB_VITALS:function(){return i},execOnce:function(){return a},getDisplayName:function(){return u},getLocationOrigin:function(){return c},getURL:function(){return d},isAbsoluteUrl:function(){return l},isResSent:function(){return h},loadGetInitialProps:function(){return f},normalizeRepeatedSlashes:function(){return p},stringifyError:function(){return k}};for(var o in r)Object.defineProperty(n,o,{enumerable:!0,get:r[o]});let i=["CLS","FCP","FID","INP","LCP","TTFB"];function a(e){let t,n=!1;return(...r)=>(n||(n=!0,t=e(...r)),t)}let s=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,l=e=>{let t=e.charCodeAt(0);return!!(t>=65&&t<=90||t>=97&&t<=122)&&s.test(e)};function c(){let{protocol:e,hostname:t,port:n}=window.location;return`${e}//${t}${n?":"+n:""}`}function d(){let{href:e}=window.location,t=c();return e.substring(t.length)}function u(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function h(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 f(e,t){let n=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await f(t.Component,t.ctx)}:{};let r=await e.getInitialProps(t);if(n&&h(n))return r;if(!r)throw Object.defineProperty(Error(`"${u(e)}.getInitialProps()" should resolve to an object. But found "${r}" instead.`),"__NEXT_ERROR_CODE",{value:"E1025",enumerable:!1,configurable:!0});return r}let y="u">typeof performance,g=y&&["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 j extends Error{constructor(e,t){super(),this.message=`Failed to load static file for page: ${e} ${t}`}}class w extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function k(e){return JSON.stringify({message:e.message,stack:e.stack})}},73668,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"isLocalURL",{enumerable:!0,get:function(){return i}});let r=e.r(18967),o=e.r(52817);function i(e){if(!(0,r.isAbsoluteUrl)(e))return!0;try{let t=(0,r.getLocationOrigin)(),n=new URL(e,t);return n.origin===t&&(0,o.hasBasePath)(n.pathname)}catch(e){return!1}}},98183,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={assign:function(){return l},searchParamsToUrlQuery:function(){return i},urlQueryToSearchParams:function(){return s}};for(var o in r)Object.defineProperty(n,o,{enumerable:!0,get:r[o]});function i(e){let t={};for(let[n,r]of e.entries()){let e=t[n];void 0===e?t[n]=r:Array.isArray(e)?e.push(r):t[n]=[e,r]}return t}function a(e){return"string"==typeof e?e:("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function s(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e))if(Array.isArray(r))for(let e of r)t.append(n,a(e));else t.set(n,a(r));return t}function l(e,...t){for(let n of t){for(let t of n.keys())e.delete(t);for(let[t,r]of n.entries())e.append(t,r)}return e}},95057,(e,t,n)=>{"use strict";e.i(47167),Object.defineProperty(n,"__esModule",{value:!0});var r={formatUrl:function(){return s},formatWithValidation:function(){return c},urlObjectKeys:function(){return l}};for(var o in r)Object.defineProperty(n,o,{enumerable:!0,get:r[o]});let i=e.r(90809)._(e.r(98183)),a=/https?|ftp|gopher|file/;function s(e){let{auth:t,hostname:n}=e,r=e.protocol||"",o=e.pathname||"",s=e.hash||"",l=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:n&&(c=t+(~n.indexOf(":")?`[${n}]`:n),e.port&&(c+=":"+e.port)),l&&"object"==typeof l&&(l=String(i.urlQueryToSearchParams(l)));let d=e.search||l&&`?${l}`||"";return r&&!r.endsWith(":")&&(r+=":"),e.slashes||(!r||a.test(r))&&!1!==c?(c="//"+(c||""),o&&"/"!==o[0]&&(o="/"+o)):c||(c=""),s&&"#"!==s[0]&&(s="#"+s),d&&"?"!==d[0]&&(d="?"+d),o=o.replace(/[?#]/g,encodeURIComponent),d=d.replace("#","%23"),`${r}${c}${o}${d}${s}`}let l=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return s(e)}},18566,(e,t,n)=>{t.exports=e.r(76562)}]);
@@ -6,6 +6,140 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.4.0-beta.1] - 2026-09-28 (beta: a pre-release, never installed automatically)
10
+
11
+ ### Added
12
+ - **Their circle, on every card.** Open one of your connections and the top of their card
13
+ is a small map of their circle. Their scanned connections sit round them (D2). Anyone
14
+ you connected with from it gets a green ring, and their own circle fans out behind
15
+ them (D3), on out to D6. A request you've sent and they haven't accepted is a dotted
16
+ dot. Tap the map for the large one, where any dot opens that person. It's built from
17
+ what the app already keeps (whose circle someone was found in, and who introduced
18
+ you), so it needs no extra scanning. Not scanned yet? It says so, and points at the
19
+ scan below.
20
+ - **Rarity, beside the tier.** How many mutual connections lead to someone, in five
21
+ bands: *Only way in* (1), *Rare* (2–3), *Uncommon* (4–10), *Common* (11–30) and
22
+ *Warm* (31+). It's a distinction, never a score: tiers and power are untouched.
23
+ Rarity and the tier filter together, in the circle and in Separation, so "S" and
24
+ "Only way in" is exactly the rare finds, and "S" and "Warm" the easy wins. Until a
25
+ scan saves LinkedIn's own count, it's counted from the circles you've scanned, which
26
+ can only go up as you scan more, and everywhere it shows says so.
27
+ - **Resume beside Rescan on a profile card.** When someone's list was only partly read (a
28
+ page limit, a stop, LinkedIn pushing back), their card offers *Resume from page N* next
29
+ to *Rescan from the start*: the same carry-on as the Scan page's Paused list, for that
30
+ one person. LinkedIn lists other people's connections in its own order, with no dates,
31
+ so anyone new can be on any page: Rescan reads the whole list again from page 1, and
32
+ Resume picks up where the last read stopped. A list read to the end says so instead.
33
+ - **LinkedIn's own mutual count, from circle scans.** Everyone a circle scan finds now
34
+ carries LinkedIn's count of the mutual connections you share with them, read from the
35
+ line under their result card ("Maya Chen and 23 other mutual connections" is 24).
36
+ - **No extra page views:** the line was already on the pages the scanner reads.
37
+ - **One count per person:** every copy of the person, one per bridge that knows them,
38
+ keeps the newest count read. A scan that doesn't see the line leaves the count alone.
39
+ - **Used by rarity** in place of the count from your scans, which could only be a floor.
40
+ - **Not yet tried against live LinkedIn,** and it reads English wording only. The first
41
+ real circle scan is the check. Any other wording reads as no count, never a wrong one.
42
+ - **A public company dataset: 631 organizations the built-in list leaves off,** scored 6
43
+ to 8 from public facts on one published scale, each with its source beside it (an exchange
44
+ listing, a reported valuation, a U.S. News rank, a federal department's size).
45
+ - **The Fortune 500 (2025):** 376 companies, and the brands their staff write as their
46
+ employer (KeyBank, Alaska Airlines, VMware, The Wall Street Journal…).
47
+ - **The U.S. federal government:** 114 entries. The departments and military branches
48
+ are 8; agencies and national labs 7. Each is matched only by forms that say which one
49
+ it is: "US Army", never "Army" alone.
50
+ - **Universities ranked 21–100 by U.S. News:** 77 of them.
51
+ - **64 more, researched one by one,** among them Anduril, CoreWeave, MLB, WWE, UF and UCF.
52
+
53
+ Someone there is scored from those facts, not as an unknown company, and the Scores tab
54
+ labels the score *public data*. The list is built from public sources only, never from
55
+ anyone's scan, and grows each release. The built-in list itself is unchanged: household
56
+ names only, 7 and up.
57
+ - **A card says when a score is a guess, and what would firm it up.** When someone's headline
58
+ gives the app no title to read, or no company it knows, the top of their card says so
59
+ ("Their score is a guess. The app couldn't find where they work.") and offers *Scan their
60
+ circle*, which brings the scan button into view. Who you can reach through them is what the
61
+ score can read instead, and a strong circle adds up to +2.
62
+
63
+ ### Fixed
64
+ - **A request you send shows everywhere, at once.**
65
+ - **Before:** *Connect to Unlock Path* marked one bridge's copy of the person and told
66
+ nothing else on the page.
67
+ - The card kept offering the link.
68
+ - Separation, Orbit and the circle never showed it, even after a reload.
69
+ - Every click awarded XP again.
70
+ - Undo took back only half of it.
71
+ - **Now:** a request belongs to the person, in one list every view reads, so the
72
+ card, Separation, Orbit, the new circle, the Outlink queue and the Pending badge
73
+ all change the moment you click.
74
+ - **The details:**
75
+ - The bridge whose circle you found them in is kept, so once they accept, their
76
+ card and circle say who introduced you.
77
+ - XP comes once per person.
78
+ - *Didn't send it? Undo* on the card takes all of it back, the XP too.
79
+ - **One scan at a time, and every Scan button knows it.** A scan started on one profile
80
+ card left the Scan button on every other card clickable, and *Auto-Bridge Next*, the ↻
81
+ refresh and Paths' company scan too. Pressing one was refused, and the card then said
82
+ *"Scan failed — connections may be private"* about a scan that had never started. Now
83
+ they all grey out while anything runs and say what does ("Ada Park's circle is being
84
+ scanned. One scan at a time…"), even a scan started on the Scan page or in another
85
+ window. Close a card mid-scan and open it again and its progress is still there; when it
86
+ ends, the card says so. The page asks the scanner once for all of them
87
+ (`/api/scraper?job=1`, which reads only memory), not once per button.
88
+ - **Company names written in styled letters or with a logo are read.** "𝗠𝗶𝗰𝗿𝗼𝘀𝗼𝗳𝘁",
89
+ "Apple " (with Apple's logo) and "Snapchat|ex-L'Oréal" (a full-width bar) used to read
90
+ as unknown companies. So did "Meta Superintelligence Labs" and "Snapchat MENA Region",
91
+ and a class year ("UCF ’26") hid the school.
92
+ - **"President's Club" is a sales award, not a president.** A title's possessive read as
93
+ the title, so "Account Executive at Oracle | 3x President's Club" scored 7.3 (A) as a
94
+ C-suite, and so did "Chairman's Award" and "Chief of Staff, CEO's Office". It's the
95
+ title's own: 3.6 (C), and a chief of staff is a director again (5.4, B).
96
+
97
+ ### Changed
98
+ - **Tiers are graded on your own network's curve** (new: *Scores → Tiers*, and the default).
99
+ Your top 3% of connections are S, the next 12% A, the next 25% B and the next 30% C, so
100
+ the first scan of any network has a top, not only a network full of companies the app
101
+ knows. The curve only lifts: nobody drops a tier because their network is strong, and
102
+ nobody under 4 is lifted into S or A. People tied at a line all come in or all stay out.
103
+ Choose *On the fixed scale* for the lines as they were (S ≥ 7.5, A ≥ 5.5, B ≥ 4, C ≥ 2.5).
104
+ A LinkedIn CSV import opened in the app is always graded on its own curve.
105
+ - **A company the app doesn't know is neutral.** It counts as 5, the middle of the scale
106
+ (it was 4, and 3 when no company was found), so the people the built-in list doesn't
107
+ know aren't pushed down a tier for it. A founder at an unknown company scores 7.3 (was
108
+ 6.7), a director 5.4 (was 5.0). Claims in their headlines still count half. Your network
109
+ is rescored once, the first time the map loads after updating.
110
+ - **The power score reads more of who someone is.** A review of the score found kinds of
111
+ people it ranked too low:
112
+ - A title's company written without "at" counts: "Global Category President | The
113
+ Coca-Cola Company" scores 9.5 (S), not 7.3 (A), and so does "Corporate VP, Samsung".
114
+ Only a company the app knows, and not after a founder's, an owner's or a CEO's title,
115
+ not a program or a degree ("AWS Community Builder", "Harvard MBA"), and not a school
116
+ after a title that isn't an academic's.
117
+ - "MD @ J.P. Morgan", "MD, Investment Banking", "Head of Country" and "Country Head" are
118
+ senior, like a managing director; "MD, MBA" and "Physician, MD" aren't.
119
+ - Universities have their own ladder: an assistant professor 5, an associate professor
120
+ 6.5, a professor 7.5 (was 4, an entry-level job), a dean 9, a provost or a chancellor 10.
121
+ - An audience of their own counts like a title: 100K+ followers like a manager's, 1M+ a
122
+ director's, 10M+ a VP's. A creator with 2.5M followers scores 5.8 (A), not 3.3 (C).
123
+ - A title the app can't read counts as an individual contributor's (4, was 3), so a
124
+ founder whose headline names no title or company isn't put below every job.
125
+ - A strong circle counts by how many strong people are in it, not only by their share:
126
+ +1 for every 25 at A or S, up to +2 (was up to +1). A vague title at a big company with
127
+ 72 of them in a circle of 600 scores 5.6 (A), not 3.6 (C).
128
+
129
+ Your network is rescored once, the first time the map loads after updating. The sample
130
+ network's tiers don't change.
131
+ - **Scores has a tab of its own.** How a power score is worked out and the three things you
132
+ can change about it are in one place: your field (*Your sector*), how tiers are graded
133
+ (*Tiers*) and every company's score. Company scores used to be a tab inside Paths, and the
134
+ other two were in Settings. Old links (*Paths → Scores*, *Settings → Your sector*,
135
+ *Settings → Tiers*) forward there, and Settings says where they went.
136
+ - **Separation's map is "who to ask next".** It skips anyone you've already asked or
137
+ already know. Send requests to its ten and the next ten come up. The list below
138
+ still shows everyone, marked *Request sent* or *Connected*, with their rarity.
139
+
140
+ ### Removed
141
+ - **The Revolver view.** Degrees keeps Separation, Orbit, Bridge Chains, Pyramid and List.
142
+
9
143
  ## [0.3.0] - 2026-09-26
10
144
 
11
145
  ### Changed
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <a href="https://blakeb056.github.io/six-degrees/"><img src="desktop/icon/icon.svg" width="128" height="128" alt="Six Degrees website"></a>
2
+ <a href="https://sixdegreesapp.com/"><img src="desktop/icon/icon.svg" width="128" height="128" alt="Six Degrees website"></a>
3
3
  </p>
4
4
 
5
5
  <h1 align="center">Six Degrees</h1>
@@ -18,7 +18,7 @@
18
18
  <a href="https://github.com/blakeb056/six-degrees/releases/latest/download/Six-Degrees-Mac-Intel.dmg"><img src="docs/img/download-intel.png" width="346" alt="Download Six Degrees for a Mac with an Intel chip"></a>
19
19
  </p>
20
20
 
21
- <p align="center"><sub>Free Mac app · macOS 13.5 or later · <a href="https://blakeb056.github.io/six-degrees/">website</a> · <a href="https://github.com/blakeb056/six-degrees/releases/latest">what's new</a></sub></p>
21
+ <p align="center"><sub>Free Mac app · macOS 13.5 or later · <a href="https://sixdegreesapp.com/">website</a> · <a href="https://github.com/blakeb056/six-degrees/releases/latest">what's new</a></sub></p>
22
22
 
23
23
  **Which download?** Apple menu → **About This Mac**. If it says "Chip: Apple M…", take
24
24
  **Apple Silicon**. If it says "Processor: …Intel…", take **Intel**. It needs **macOS 13.5
@@ -186,8 +186,8 @@ panel on the left.
186
186
 
187
187
  **Degrees** *(needs a scan or the sample)*. The people two steps away. **Separation**
188
188
  ranks every one of them with every way in: which of your connections knows them, and
189
- how many do. **Orbit**, **Bridge Chains**, **Revolver**, **Pyramid** and **List** draw
190
- the same people differently.
189
+ how many do. **Orbit**, **Bridge Chains**, **Pyramid** and **List** draw the same people
190
+ differently.
191
191
 
192
192
  <img src="docs/img/degrees.png" alt="Degrees → Separation: people two steps away, ranked, each with the connection who can introduce you" width="100%">
193
193
 
@@ -197,13 +197,16 @@ InMaps:
197
197
  where your connections at one know people at another.
198
198
  - **Industries**: a card per industry.
199
199
  - **Companies**: pick one to see its people level by level, up to the top.
200
- - **Scores**: every scanned company's score, which you can change.
201
200
 
202
201
  Click a company for its analyzer: who you know there, who you can reach, the warmest way
203
202
  in, and its most powerful people.
204
203
 
205
204
  <img src="docs/img/paths.png" alt="Paths → Map with the company analyzer open: companies grouped by industry, and one company's people by level and ways in" width="100%">
206
205
 
206
+ **Scores.** How a power score is worked out, and the three things you can change about
207
+ it, in one place: your field (the sectors you work in), how tiers are graded (on your
208
+ network's curve or the fixed scale), and every scanned company's score.
209
+
207
210
  **Outlink** *(needs a scan)*. Getting introduced, as a game. Each mapped connection's
208
211
  circle offers its best five people at a time; mark invites as sent to fill the ring and
209
212
  unlock the next five. It also shows the next best moves, levels and points (from
@@ -216,20 +219,26 @@ lock, and a **Paused** list you can carry on from.
216
219
 
217
220
  ```
218
221
  power = title × (0.45 + 0.055 × company score) + reach bonus + bridge boost
219
- tiers: S ≥ 7.5 A ≥ 5.5 B ≥ 4.0 C ≥ 2.5 D < 2.5
222
+ tiers, on your network's curve (the default): your top 3% S, then A to 15%, B to 40%, C to 70%
223
+ tiers, on the fixed scale: S ≥ 7.5 A ≥ 5.5 B ≥ 4.0 C ≥ 2.5 D < 2.5
220
224
  ```
221
225
 
222
- - **Title (1–10)** comes from someone's current role in their headline, with former
223
- roles at 70%; current students are capped.
224
- - **Company score (1–10)** is the one you set (Paths → Scores) if there is one. Otherwise
226
+ - **Title (1–10)** comes from someone's roles in their headline, with former roles at
227
+ 70%; current students are capped. Academics have their own ladder (an assistant
228
+ professor 5 up to a dean 9), an audience of their own counts like a title (100K+
229
+ followers 6.5, 1M+ 7.5, 10M+ 9), and a title it can't read counts as an individual
230
+ contributor's (4).
231
+ - **Company score (1–10)** is the one you set (the Scores tab) if there is one. Otherwise
225
232
  it comes from a built-in list of well-known companies, or from how many of your people
226
233
  work there. The built-in list is the same for everyone and follows one rule: only
227
234
  companies most US professionals would recognise (household names, the largest companies,
228
235
  top investment, consulting, law and accounting firms, frontier AI labs, top universities),
229
- scored 7 to 10. Anything else is estimated from your network. If you scanned with an
230
- earlier version, Paths → Scores offers once to keep its old scores for the companies in
236
+ scored 7 to 10. Anything else is estimated from your network: a company it doesn't
237
+ know counts as 5, the middle of the scale, a little more when several of your people
238
+ work there. If you scanned with an
239
+ earlier version, the Scores tab offers once to keep its old scores for the companies in
231
240
  your network whose score changed.
232
- - **Your sector (Settings, optional):** pick up to three sectors you work in, and companies
241
+ - **Your sector (Scores, optional):** pick up to three sectors you work in, and companies
233
242
  in them get +1 ("lean") or +2 ("strong") on that score, once, never above 10 and never on
234
243
  a score you set. A pick is one of twelve broad industries or a narrower sector from a
235
244
  built-in list of about fifty (Dental, Real Estate, Software & SaaS…). A sector matches by a
@@ -240,16 +249,22 @@ tiers: S ≥ 7.5 A ≥ 5.5 B ≥ 4.0 C ≥ 2.5 D < 2.5
240
249
  job titles do. Settings suggests the sectors your network is in and shows what would
241
250
  change before you save.
242
251
  - Multiplying means seniority counts for more at a bigger company. A VP at a company
243
- scored 10 gets 9.0; a founder at an unknown company, 6.7.
252
+ scored 10 gets 9.0; a founder at an unknown company, 7.3.
244
253
  - **Reach bonus (up to 1.5)**: investor, YC, an audience in the millions, the top award
245
254
  of any field (a Nobel, a Pulitzer, an Oscar, an Olympic medal…). It counts half
246
255
  at an unknown company, because headlines are self-written (your sector doesn't change
247
256
  that).
248
- - **Bridge boost (up to 1)**: someone whose mapped circle is unusually strong.
257
+ - **Bridge boost (up to 2)**: someone whose mapped circle is unusually strong: a high
258
+ share of it at A or S (up to +1), or many people there (+1 for every 25, up to +2).
259
+ - **Tiers (Scores):** graded on your own network's curve by default, so any network has a
260
+ top: your top 3% of connections are S, the next 12% A, the next 25% B and the next 30% C.
261
+ The curve only lifts, so a network full of well-known companies keeps its tiers, and it
262
+ never lifts anyone under 4 into S or A. People tied at a line all come in or all stay out.
263
+ Choose the fixed scale instead for the same lines as everyone else.
249
264
 
250
265
  Scanned and sample people show the working ("VP / Partner / GM (9) · Adobe (8/10) · +0.7
251
266
  strong circle"). A CSV import shows the score only, and uses the built-in company list
252
- rather than your own scores or sectors; the sample network keeps its own. The model is
267
+ rather than your own scores or sectors, graded on its own curve; the sample network keeps its own. The model is
253
268
  [`lib/scoring.js`](lib/scoring.js), explained in
254
269
  [`docs/brain/SCORING.md`](docs/brain/SCORING.md).
255
270
 
@@ -1,6 +1,6 @@
1
1
  import { legacyOffer, answerLegacyOffer, parseLegacyAnswer } from '../../../../lib/legacy-offer';
2
2
 
3
- // Paths → Scores' one-time offer to keep the curated list's old scores as your
3
+ // the Scores tab's one-time offer to keep the curated list's old scores as your
4
4
  // own, after the list was made neutral (lib/legacy-offer.js). GET says what is
5
5
  // offered: {offer: null} or {offer: {companies}}. POST answers it:
6
6
  // {keep: [names]} keeps those old scores, {keep: []} is No thanks, and either
@@ -6,7 +6,7 @@ import { industryByKey } from '../../../lib/companies';
6
6
  // Every company in your network with the score it gets and where that score
7
7
  // comes from — and the one place to set your own. Setting or clearing a score
8
8
  // rescores everyone, since a person's power depends on their company's.
9
- // Industries and the sector lean (Settings → Your sector) come from the same
9
+ // Industries and the sector lean (Scores → Your sector) come from the same
10
10
  // read rescoring uses (lib/rpc.js readForScoring), so a score here is the one
11
11
  // people carry.
12
12
 
@@ -1,5 +1,5 @@
1
1
  import { db as supabase } from '../../../lib/db';
2
- import { uniqueByProfile, splitAlreadyConnected, toIsoDate, refreshNotifications } from '../../../lib/ingest';
2
+ import { uniqueByProfile, splitAlreadyConnected, toIsoDate, refreshNotifications, mutualCountOf } from '../../../lib/ingest';
3
3
  import { promoteToFirstDegree } from '../../../lib/promote';
4
4
 
5
5
  function parseHeadline(h) {
@@ -31,6 +31,8 @@ export async function POST(request) {
31
31
  profile_url: c.profileUrl?.trim(),
32
32
  profile_image_url: c.imageUrl || null,
33
33
  connected_date: toIsoDate(c.connectedDate),
34
+ // LinkedIn's own count, read off a circle's result card; nothing else sends one.
35
+ mutual_count: degree === 2 ? mutualCountOf(c.mutualCount) : null,
34
36
  };
35
37
  if (degree === 2 && bridgeId) {
36
38
  rec.source_connection_id = bridgeId;
@@ -164,6 +166,20 @@ export async function POST(request) {
164
166
  return Response.json({ error: insertError.message }, { status: 500 });
165
167
  }
166
168
 
169
+ // How many mutual connections you share with someone is one fact about
170
+ // the two of you, whichever bridge's circle turned them up. Every copy of
171
+ // them gets the newest count read (a re-scan brings it up to date), and a
172
+ // scan that didn't read one leaves the count alone.
173
+ if (degree === 2) {
174
+ for (const rec of records) {
175
+ if (rec.mutual_count == null) continue;
176
+ let q = supabase.from('linkedin_connections').update({ mutual_count: rec.mutual_count })
177
+ .eq('profile_url', rec.profile_url).eq('degree', 2);
178
+ if (userId) q = q.eq('user_id', userId);
179
+ await q;
180
+ }
181
+ }
182
+
167
183
  // Image updates handled separately via /api/update-images (avoids timeout)
168
184
 
169
185
  // Rescore everyone (lib/scoring.js): a new circle changes company headcounts