six-degrees 0.2.1 → 0.3.0

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