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
@@ -1,37 +1,62 @@
1
1
  'use client';
2
2
 
3
3
  import { useState, useEffect } from 'react';
4
+ import { Section, Body, Mono, Status, Btn, LINE } from './ui';
4
5
 
5
6
  // Nothing here runs on its own. The spec forbids a silent update check, and
6
7
  // this respects that: the first network call happens when someone presses
7
8
  // "Check for updates", here or in the Mac app's menu (which opens this page at
8
- // /setup?check=updates — the same click, made from the menu). Loading the panel
9
- // only reads the local state.
10
-
11
- const LINE = '1px solid rgba(255,255,255,0.1)';
9
+ // /settings?check=updates — the same click, made from the menu). Loading the
10
+ // panel only reads the local state.
11
+ //
12
+ // In the Mac app, installing is a second, separate click ("Install and
13
+ // restart"). Nothing is downloaded before it.
12
14
 
13
15
  export default function UpdatePanel() {
14
16
  const [local, setLocal] = useState(null);
17
+
18
+ useEffect(() => {
19
+ fetch('/api/update').then((r) => r.json()).then(setLocal).catch(() => {});
20
+ }, []);
21
+
22
+ if (!local) return null;
23
+ if (local.installed) return <InstalledUpdates local={local} />;
24
+ return <GitUpdates local={local} />;
25
+ }
26
+
27
+ async function post(body) {
28
+ const r = await fetch('/api/update', {
29
+ method: 'POST',
30
+ headers: { 'Content-Type': 'application/json' },
31
+ body: JSON.stringify(body),
32
+ });
33
+ const d = await r.json().catch(() => ({}));
34
+ return { ok: r.ok, d };
35
+ }
36
+
37
+ // ── a git checkout ────────────────────────────────────────────────────────────
38
+ // `git fetch` and `git pull`, exactly as you would type them.
39
+ function GitUpdates({ local }) {
15
40
  const [result, setResult] = useState(null);
16
41
  const [busy, setBusy] = useState(null);
17
42
  const [error, setError] = useState(null);
18
43
  const [done, setDone] = useState(null);
19
44
 
45
+ // The menu's "Check for Updates…" runs its check here too.
20
46
  useEffect(() => {
21
- fetch('/api/update').then((r) => r.json()).then(setLocal).catch(() => {});
47
+ if (new URLSearchParams(window.location.search).get('check') !== 'updates') return;
48
+ document.getElementById('updates')?.scrollIntoView({ block: 'center' });
49
+ call('check');
50
+ window.history.replaceState(null, '', window.location.pathname);
51
+ // Runs once, when the panel appears.
22
52
  }, []);
23
53
 
24
54
  async function call(action) {
25
55
  setBusy(action);
26
56
  setError(null);
27
57
  try {
28
- const r = await fetch('/api/update', {
29
- method: 'POST',
30
- headers: { 'Content-Type': 'application/json' },
31
- body: JSON.stringify({ action }),
32
- });
33
- const d = await r.json();
34
- if (!r.ok) {
58
+ const { ok, d } = await post({ action });
59
+ if (!ok) {
35
60
  setError(d.error || 'Something went wrong.');
36
61
  if (d.dirty) setResult({ dirty: d.dirty });
37
62
  return;
@@ -45,23 +70,8 @@ export default function UpdatePanel() {
45
70
  }
46
71
  }
47
72
 
48
- if (!local) return null;
49
-
50
- if (local.installed) return <InstalledUpdates local={local} />;
51
-
52
- if (local.supported === false) {
53
- return (
54
- <Wrap>
55
- <Title>Updates</Title>
56
- <Body>{local.reason}</Body>
57
- </Wrap>
58
- );
59
- }
60
-
61
73
  return (
62
- <Wrap>
63
- <Title>Updates</Title>
64
-
74
+ <Section id="updates" title="Updates">
65
75
  {done ? (
66
76
  <>
67
77
  <Body>
@@ -79,7 +89,7 @@ export default function UpdatePanel() {
79
89
  You are on <Mono>{local.sha}</Mono> — “{local.subject}”.
80
90
  </Body>
81
91
 
82
- {result && result.behind === 0 && <Status ok>You&rsquo;re up to date.</Status>}
92
+ {result && result.behind === 0 && <Status tone="ok">You&rsquo;re up to date.</Status>}
83
93
 
84
94
  {result && result.behind > 0 && (
85
95
  <>
@@ -98,7 +108,7 @@ export default function UpdatePanel() {
98
108
  </Body>
99
109
  )}
100
110
 
101
- <div style={{ display: 'flex', gap: 10, marginTop: 12, flexWrap: 'wrap' }}>
111
+ <Row>
102
112
  <Btn onClick={() => call('check')} disabled={!!busy}>
103
113
  {busy === 'check' ? 'Checking…' : 'Check for updates'}
104
114
  </Btn>
@@ -107,7 +117,7 @@ export default function UpdatePanel() {
107
117
  {busy === 'pull' ? 'Updating…' : `Install ${result.behind} update${result.behind === 1 ? '' : 's'}`}
108
118
  </Btn>
109
119
  )}
110
- </div>
120
+ </Row>
111
121
  </>
112
122
  )}
113
123
 
@@ -117,43 +127,98 @@ export default function UpdatePanel() {
117
127
  Nothing is checked automatically and nothing about you is sent — this runs the
118
128
  same <Mono>git fetch</Mono> and <Mono>git pull</Mono> you would type yourself.
119
129
  </Body>
120
- </Wrap>
130
+ </Section>
121
131
  );
122
132
  }
123
133
 
134
+ // ── an installed copy ─────────────────────────────────────────────────────────
124
135
  // The Mac app and the npm package update by installing the newer release over
125
- // the top. This asks GitHub for the newest version number — on a click only —
126
- // and hands over the exact line to run.
136
+ // the top. "Check for updates" asks GitHub for the newest version number, on a
137
+ // click only. The Mac app can then install it itself, on a second click; when
138
+ // it can't (or for npm), this hands over the exact line to run instead, saying
139
+ // what that line would do for this copy. Where it would do harm (a network
140
+ // kept inside the app, which the line deletes with it), it isn't offered.
141
+
142
+ const ACTIVE = ['checking', 'downloading', 'verifying', 'preparing', 'restarting'];
143
+
127
144
  function InstalledUpdates({ local }) {
145
+ const mac = local.kind === 'mac-app';
128
146
  const [busy, setBusy] = useState(false);
129
147
  const [result, setResult] = useState(null);
130
148
  const [error, setError] = useState(null);
131
149
  const [copied, setCopied] = useState(false);
132
150
  const [checkedAt, setCheckedAt] = useState(null);
151
+ const [job, setJob] = useState(local.job || null); // an install, while it runs
152
+ const [starting, setStarting] = useState(false);
153
+ const [refused, setRefused] = useState(null); // why an install couldn't start
154
+ const [refusedCode, setRefusedCode] = useState(null);
155
+ const [refusedFallback, setRefusedFallback] = useState(undefined); // the Terminal line then (see fallbackText)
156
+ const [gone, setGone] = useState(0); // polls that found no server: it is restarting
157
+ const [slow, setSlow] = useState(false);
158
+
159
+ const active = Boolean(job && ACTIVE.includes(job.phase));
160
+ const restarting = active && (job.phase === 'restarting' || gone > 0);
133
161
 
134
162
  // Opened from the menu's "Check for Updates…": bring the panel into view and
135
- // run the check that click asked for.
163
+ // run the check that click asked for. After an update the app opens here
164
+ // (#updates), to show how it went.
136
165
  useEffect(() => {
137
- const params = new URLSearchParams(window.location.search);
138
- if (params.get('check') !== 'updates') return;
139
166
  const panel = () => document.getElementById('updates');
167
+ if (window.location.hash === '#updates') panel()?.scrollIntoView({ block: 'start' });
168
+ if (new URLSearchParams(window.location.search).get('check') !== 'updates') return;
169
+ window.history.replaceState(null, '', window.location.pathname);
170
+ if (local.job && ACTIVE.includes(local.job.phase)) return; // an install is already under way
140
171
  panel()?.scrollIntoView({ block: 'center' });
141
172
  check().then(() => panel()?.scrollIntoView({ block: 'end', behavior: 'smooth' }));
142
- window.history.replaceState(null, '', window.location.pathname);
143
- }, []);
173
+ }, [local.job]);
174
+
175
+ // Follow an install. Once it restarts, this server goes away. The next one to
176
+ // answer is the new version, or the old one put back; reloading shows which.
177
+ useEffect(() => {
178
+ if (!active) return undefined;
179
+ let alive = true;
180
+ const timer = setTimeout(async () => {
181
+ try {
182
+ if (restarting) {
183
+ const r = await fetch('/api/update', { cache: 'no-store' });
184
+ const d = await r.json();
185
+ if (!alive) return;
186
+ if (!d.job || d.job.id !== job.id) {
187
+ window.location.reload();
188
+ return;
189
+ }
190
+ setGone(0); // the same server, still here: not restarting after all
191
+ setJob(d.job);
192
+ } else {
193
+ const { ok, d } = await post({ action: 'update-status' });
194
+ if (alive && ok && d.job) setJob(d.job);
195
+ }
196
+ } catch {
197
+ if (alive) setGone((n) => n + 1);
198
+ }
199
+ }, restarting ? 1500 : 600);
200
+ return () => { alive = false; clearTimeout(timer); };
201
+ }, [job, gone, active, restarting]);
202
+
203
+ // A restart takes a few seconds. After a minute, say what to do.
204
+ useEffect(() => {
205
+ if (!restarting) return undefined;
206
+ const timer = setTimeout(() => setSlow(true), 60000);
207
+ return () => clearTimeout(timer);
208
+ }, [restarting]);
144
209
 
145
210
  async function check() {
146
211
  setBusy(true);
147
212
  setResult(null);
148
213
  setError(null);
214
+ // A new check is a new start: an earlier attempt's failure no longer applies.
215
+ setRefused(null);
216
+ setRefusedCode(null);
217
+ setRefusedFallback(undefined);
218
+ setJob((j) => (j && ACTIVE.includes(j.phase) ? j : null));
149
219
  try {
150
- const r = await fetch('/api/update', {
151
- method: 'POST',
152
- headers: { 'Content-Type': 'application/json' },
153
- body: JSON.stringify({ action: 'check-release' }),
154
- });
155
- const d = await r.json();
156
- if (!r.ok) setError(d.error || 'Could not check.');
220
+ const { ok, d } = await post({ action: 'check-release' });
221
+ if (!ok) setError(d.error || 'Could not check.');
157
222
  else { setResult(d); setCheckedAt(new Date()); }
158
223
  } catch (e) {
159
224
  setError(e.message);
@@ -162,6 +227,35 @@ function InstalledUpdates({ local }) {
162
227
  }
163
228
  }
164
229
 
230
+ async function install() {
231
+ setStarting(true);
232
+ setRefused(null);
233
+ setRefusedCode(null);
234
+ setRefusedFallback(undefined);
235
+ setGone(0);
236
+ setSlow(false);
237
+ try {
238
+ const { ok, d } = await post({ action: 'install-release' });
239
+ if (d.job) setJob(d.job);
240
+ if (!ok) {
241
+ setRefused(d.error || 'The update could not start.');
242
+ setRefusedCode(d.refusal || null);
243
+ if ('fallback' in d) setRefusedFallback(d.fallback);
244
+ }
245
+ } catch (e) {
246
+ setRefused(e.message);
247
+ } finally {
248
+ setStarting(false);
249
+ }
250
+ }
251
+
252
+ async function cancel() {
253
+ try {
254
+ const { d } = await post({ action: 'cancel-install' });
255
+ if (d.job) setJob(d.job);
256
+ } catch { /* the next poll shows where it got to */ }
257
+ }
258
+
165
259
  async function copy() {
166
260
  try {
167
261
  await navigator.clipboard.writeText(local.command);
@@ -172,106 +266,199 @@ function InstalledUpdates({ local }) {
172
266
  }
173
267
  }
174
268
 
175
- const how = local.kind === 'mac-app'
176
- ? 'Paste this into Terminal. It closes this app, puts the new version in its place and opens it. Your network stays where it is.'
177
- : local.kind === 'source'
178
- ? 'Stop the app (Ctrl-C), then run this in the six-degrees folder. It fetches the newest code, builds it and starts it again. Your network stays where it is.'
179
- : 'Stop this copy first (Ctrl-C in the terminal it runs in), then run this to start the newest version. Your network stays where it is.';
269
+ const failed = job?.phase === 'failed';
270
+ const canInstall = mac && result?.install?.possible;
271
+ // The install offered a version, and a newer one has come out since, or it
272
+ // was never offered one on this server: the answer is a new check, not "Try again".
273
+ const needsCheck = (failed && job.code === 'stale-check') || refusedCode === 'not-checked';
274
+ // What the Terminal line would do here (lib/updater.js terminalFallback);
275
+ // null for the Mac app where it must not be offered.
276
+ const fallback = refusedFallback !== undefined ? refusedFallback : result?.fallback;
277
+ // The Terminal line: always for npm and source copies, and for the Mac app
278
+ // whenever it can't install the update itself, or the last time it tried
279
+ // didn't work (so a second try that fails the same way isn't the only way),
280
+ // except where the line would do harm.
281
+ const showLine = result?.newer && (!mac || fallback)
282
+ && (!canInstall || failed || refused || local.lastUpdate?.tone === 'bad');
283
+ const how = fallbackText({ mac, kind: local.kind, canInstall, fallback });
180
284
 
181
285
  return (
182
- <Wrap>
183
- <Title>Updates</Title>
286
+ <Section id="updates" title="Updates">
287
+ {local.lastUpdate && !active && <LastUpdate report={local.lastUpdate} />}
184
288
  <Body>You have version <Mono>{local.version}</Mono>.</Body>
185
289
 
186
- {result && !result.latest && <Status>No release has been published yet.</Status>}
187
- {result?.latest && !result.newer && (
188
- <Status ok>
189
- You&rsquo;re up to date: {result.latest.version} is the newest version.
190
- {checkedAt && <span style={{ color: '#8b9a9a' }}> Checked at {checkedAt.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' })}.</span>}
191
- </Status>
192
- )}
193
-
194
- {result?.newer && (
290
+ {active ? (
291
+ <Progress job={job} restarting={restarting} slow={slow} onCancel={cancel} />
292
+ ) : (
195
293
  <>
196
- <Body style={{ color: '#00ff88' }}>Version {result.latest.version} is available.</Body>
197
- <Body>{how}</Body>
198
- <pre style={pre}>{local.command}</pre>
199
- <div style={{ display: 'flex', gap: 10, marginTop: 10, flexWrap: 'wrap', alignItems: 'center' }}>
200
- <Btn onClick={copy} primary>{copied ? 'Copied' : 'Copy'}</Btn>
201
- {result.latest.url && (
202
- <a href={result.latest.url} target="_blank" rel="noreferrer"
203
- style={{ color: '#3498DB', fontSize: 13.5 }}>
204
- What changed →
205
- </a>
206
- )}
207
- </div>
208
- </>
209
- )}
294
+ {failed && (
295
+ <Status tone="bad"><strong>The update didn&rsquo;t finish.</strong> {job.error} Nothing was changed.</Status>
296
+ )}
297
+ {job?.phase === 'cancelled' && <Status>Cancelled. Nothing was changed.</Status>}
298
+ {refused && <Status tone="bad">{refused}</Status>}
210
299
 
211
- {!result?.newer && (
212
- <div style={{ marginTop: 12 }}>
213
- <Btn onClick={check} disabled={busy}>{busy ? 'Checking…' : result ? 'Check again' : 'Check for updates'}</Btn>
214
- </div>
300
+ {result && !result.latest && <Status>No release has been published yet.</Status>}
301
+ {result?.latest && !result.newer && (
302
+ <Status tone="ok">
303
+ You&rsquo;re up to date: {result.latest.version} is the newest version.
304
+ {checkedAt && <span style={{ color: '#8b9a9a' }}> Checked at {checkedAt.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' })}.</span>}
305
+ </Status>
306
+ )}
307
+
308
+ {result?.newer && (
309
+ <>
310
+ <Body style={{ color: '#00ff88' }}>Version {result.latest.version} is available.</Body>
311
+ {canInstall && (
312
+ <>
313
+ <Body>
314
+ It downloads {result.install.size ? `about ${megabytes(result.install.size)} MB` : 'the new version'} from
315
+ GitHub, checks it, then closes, replaces itself and reopens. Your network isn&rsquo;t touched, and a
316
+ backup of it is made first.
317
+ </Body>
318
+ <Row>
319
+ {needsCheck ? (
320
+ <Btn onClick={check} disabled={busy} primary>{busy ? 'Checking…' : 'Check again'}</Btn>
321
+ ) : (
322
+ <Btn onClick={install} disabled={starting} primary>
323
+ {starting ? 'Starting…' : failed || refused ? 'Try again' : 'Install and restart'}
324
+ </Btn>
325
+ )}
326
+ <WhatChanged url={result.latest.url} />
327
+ </Row>
328
+ </>
329
+ )}
330
+ {mac && !canInstall && result.install?.reason && <Body>{result.install.reason}</Body>}
331
+ {showLine && (
332
+ <>
333
+ <Body>{how}</Body>
334
+ {local.testReleases ? (
335
+ // The line installs the real release from GitHub, not the
336
+ // test one, into Applications: over the copy someone uses.
337
+ <pre style={pre}>Not shown in test mode: it would install the real release from GitHub into Applications.</pre>
338
+ ) : (
339
+ <>
340
+ <pre style={pre}>{local.command}</pre>
341
+ <Row>
342
+ <Btn onClick={copy} primary={!canInstall}>{copied ? 'Copied' : 'Copy'}</Btn>
343
+ {!canInstall && <WhatChanged url={result.latest.url} />}
344
+ </Row>
345
+ </>
346
+ )}
347
+ </>
348
+ )}
349
+ {!canInstall && !showLine && <Row><WhatChanged url={result.latest.url} /></Row>}
350
+ </>
351
+ )}
352
+
353
+ {!result?.newer && (
354
+ <Row>
355
+ <Btn onClick={check} disabled={busy}>{busy ? 'Checking…' : result ? 'Check again' : 'Check for updates'}</Btn>
356
+ </Row>
357
+ )}
358
+ </>
215
359
  )}
216
360
 
217
361
  {error && <Body style={{ color: '#ff7676' }}>{error}</Body>}
218
362
 
219
363
  <Body style={{ fontSize: 12, color: '#667', marginTop: 12 }}>
220
364
  Nothing is checked automatically. The button asks GitHub for the newest version
221
- number and nothing about you is sent.
365
+ number, and nothing about you is sent.
366
+ {mac && ' Only a second click, Install and restart, downloads the new version.'}
222
367
  </Body>
223
- </Wrap>
368
+ {local.testReleases && (
369
+ <Body style={{ fontSize: 12, color: '#FFD700', marginTop: 6 }}>
370
+ Test mode: releases are read from <Mono>{local.testReleases}</Mono> on this computer, not from GitHub.
371
+ </Body>
372
+ )}
373
+ </Section>
224
374
  );
225
375
  }
226
376
 
227
- const pre = {
228
- background: 'rgba(0,0,0,0.45)', border: LINE, borderRadius: 8, padding: 12,
229
- margin: '8px 0 0', fontSize: 12, lineHeight: 1.7, color: '#b9c6c6',
230
- fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',
231
- whiteSpace: 'pre-wrap', maxHeight: 180, overflow: 'auto',
232
- };
377
+ const megabytes = (bytes) => Math.max(1, Math.round(bytes / 1e6));
233
378
 
234
- function Wrap({ children }) {
235
- return (
236
- <div id="updates" style={{ marginTop: 32, paddingTop: 24, borderTop: LINE }}>{children}</div>
237
- );
379
+ // What the Terminal line does, for this copy. For the Mac app that depends on
380
+ // where it is (lib/updater.js terminalFallback): install.sh replaces the app in
381
+ // Applications, and anywhere else it installs a second copy there, which only
382
+ // opens once this one has quit (one copy runs at a time).
383
+ function fallbackText({ mac, kind, canInstall, fallback }) {
384
+ if (!mac) {
385
+ return kind === 'source'
386
+ ? 'A copy built from the source code updates by fetching the code and building it again, which it can\'t do while it runs. Stop it (Ctrl-C), then run this in the six-degrees folder. Your network stays where it is.'
387
+ : 'This copy runs inside the terminal that started it, so it can\'t replace itself while it runs. Stop it first (Ctrl-C), then run this to start the newest version. Your network stays where it is.';
388
+ }
389
+ if (!fallback) return null;
390
+ const data = fallback.dataDir
391
+ ? ` It opens the new version on the usual data folder, not on ${fallback.dataDir}: to use that one, quit it and open it again with --data-dir, as you opened this one.`
392
+ : '';
393
+ if (fallback.mode === 'replace') {
394
+ return `${canInstall ? 'Or paste this into Terminal.' : 'Paste this into Terminal instead.'} It closes this app, puts the new version in its place and opens it. Your network stays where it is.${data}`;
395
+ }
396
+ return `${canInstall ? 'Or copy' : 'Copy'} this line, quit Six Degrees, then paste it into Terminal. It installs the new version at ${fallback.installsTo}, not where this copy is, and opens it: use that one from then on. Your network stays where it is.${data}`;
238
397
  }
239
- // The answer to a check, where it can't be missed.
240
- function Status({ children, ok }) {
398
+
399
+ function Progress({ job, restarting, slow, onCancel }) {
400
+ const pct = job.total ? Math.min(100, Math.round((job.received / job.total) * 100)) : null;
401
+ const text = restarting ? 'Restarting… Six Degrees closes and opens again in a moment.'
402
+ : job.phase === 'checking' ? 'Asking GitHub for the newest version…'
403
+ : job.phase === 'downloading'
404
+ ? `Downloading ${job.version}…${pct !== null ? ` ${pct}% (${megabytes(job.received)} of ${megabytes(job.total)} MB)` : ''}`
405
+ : job.phase === 'verifying' ? 'Checking the download…'
406
+ : 'Preparing the new version…';
241
407
  return (
242
- <div role="status" style={{
243
- marginTop: 10, padding: '10px 14px', borderRadius: 8, fontSize: 13.5, lineHeight: 1.6,
244
- color: ok ? '#00ff88' : '#e8e8ee',
245
- background: ok ? 'rgba(0,255,136,0.08)' : 'rgba(255,255,255,0.05)',
246
- border: `1px solid ${ok ? 'rgba(0,255,136,0.3)' : 'rgba(255,255,255,0.12)'}`,
247
- }}>{ok && '✓ '}{children}</div>
408
+ <div role="status" aria-live="polite" style={{ marginTop: 12 }}>
409
+ <Body style={{ color: '#e8e8ee' }}>{text}</Body>
410
+ {job.phase === 'downloading' && pct !== null && (
411
+ <div role="progressbar" aria-valuemin={0} aria-valuemax={100} aria-valuenow={pct} aria-label="Download"
412
+ style={{ height: 6, borderRadius: 3, background: 'rgba(255,255,255,0.08)', marginTop: 10, overflow: 'hidden', maxWidth: 420 }}>
413
+ <div style={{ width: `${pct}%`, height: '100%', background: 'linear-gradient(90deg, #9B59B6, #3498DB)', transition: 'width 0.4s ease' }} />
414
+ </div>
415
+ )}
416
+ {slow && (
417
+ <Body>This is taking longer than it should. If Six Degrees doesn&rsquo;t open again by itself, open it from your Applications folder.</Body>
418
+ )}
419
+ {!restarting && (
420
+ <Row>
421
+ <Btn onClick={onCancel}>Cancel</Btn>
422
+ </Row>
423
+ )}
424
+ </div>
248
425
  );
249
426
  }
250
- function Title({ children }) {
251
- return <div style={{ fontSize: 15.5, fontWeight: 650, marginBottom: 6 }}>{children}</div>;
252
- }
253
- function Body({ children, style }) {
427
+
428
+ // How the last update went, shown once the app is back (for a week).
429
+ function LastUpdate({ report }) {
430
+ const when = new Date(report.at).toLocaleString([], { dateStyle: 'medium', timeStyle: 'short' });
254
431
  return (
255
- <div style={{ fontSize: 13.5, color: '#8b9a9a', lineHeight: 1.6, marginTop: 4, ...style }}>
256
- {children}
257
- </div>
432
+ <Status tone={report.tone === 'ok' ? 'ok' : 'bad'}>
433
+ {report.text} <span style={{ color: '#8b9a9a' }}>({when})</span>
434
+ {report.tone === 'ok' && report.previous && (
435
+ <span style={{ display: 'block', fontSize: 12.5, color: '#8b9a9a', marginTop: 4 }}>
436
+ A copy of the version you had is kept in <Mono>{report.previous}</Mono> until the next update.
437
+ To go back to it, open that file and drag the app it gives you into your Applications folder.
438
+ </span>
439
+ )}
440
+ </Status>
258
441
  );
259
442
  }
260
- function Mono({ children }) {
443
+
444
+ function WhatChanged({ url }) {
445
+ if (!url) return null;
261
446
  return (
262
- <code style={{ background: 'rgba(255,255,255,0.08)', padding: '1px 5px', borderRadius: 4 }}>
263
- {children}
264
- </code>
447
+ <a href={url} target="_blank" rel="noreferrer" style={{ color: '#3498DB', fontSize: 13.5 }}>
448
+ What changed →
449
+ </a>
265
450
  );
266
451
  }
267
- function Btn({ children, onClick, disabled, primary }) {
452
+
453
+ function Row({ children }) {
268
454
  return (
269
- <button onClick={onClick} disabled={disabled} style={{
270
- padding: '9px 18px', borderRadius: 7, fontSize: 13.5, fontWeight: 650,
271
- color: disabled ? '#667' : '#fff', border: LINE,
272
- background: disabled ? 'rgba(255,255,255,0.05)'
273
- : primary ? 'linear-gradient(135deg, #9B59B6, #3498DB)' : 'rgba(255,255,255,0.08)',
274
- cursor: disabled ? 'not-allowed' : 'pointer',
275
- }}>{children}</button>
455
+ <div style={{ display: 'flex', gap: 10, marginTop: 12, flexWrap: 'wrap', alignItems: 'center' }}>{children}</div>
276
456
  );
277
457
  }
458
+
459
+ const pre = {
460
+ background: 'rgba(0,0,0,0.45)', border: LINE, borderRadius: 8, padding: 12,
461
+ margin: '8px 0 0', fontSize: 12, lineHeight: 1.7, color: '#b9c6c6',
462
+ fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',
463
+ whiteSpace: 'pre-wrap', maxHeight: 180, overflow: 'auto',
464
+ };
@@ -20,14 +20,15 @@ export default function UserProvider({ children }) {
20
20
  const [ready, setReady] = useState(false);
21
21
 
22
22
  useEffect(() => {
23
- // Demo mode: hand back a fixed identity so the app renders Blake's snapshot
24
- // for everyone, with no onboarding and no /api/users call.
23
+ // Demo mode: hand back a fixed identity so the app renders the invented
24
+ // sample network (public/demo-data.json) for everyone, with no onboarding
25
+ // and no /api/users call. It names no company, as a CSV import doesn't.
25
26
  if (IS_DEMO) {
26
27
  setUserId(DEMO_USER.id);
27
28
  setUserName(DEMO_USER.name);
28
29
  setUserProfile({
29
30
  name: DEMO_USER.name, headline: DEMO_USER.headline,
30
- role: '', company: 'Stead Labs', industry: '', sectors: [], goals: [], linkedin_url: '',
31
+ role: '', company: '', industry: '', sectors: [], goals: [], linkedin_url: '',
31
32
  });
32
33
  setReady(true);
33
34
  return;