six-degrees 0.2.0 → 0.3.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (478) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +10 -0
  3. package/.next/standalone/.next/build-manifest.json +3 -3
  4. package/.next/standalone/.next/prerender-manifest.json +39 -11
  5. package/.next/standalone/.next/required-server-files.json +4 -1
  6. package/.next/standalone/.next/routes-manifest.json +60 -0
  7. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  17. package/.next/standalone/.next/server/app/_not-found.rsc +11 -11
  18. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +11 -11
  19. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +9 -9
  20. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  21. package/.next/standalone/.next/server/app/api/admin-delete/route.js +3 -2
  22. package/.next/standalone/.next/server/app/api/admin-delete/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/admin-update/route.js +3 -2
  24. package/.next/standalone/.next/server/app/api/admin-update/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/bridges/route.js +3 -2
  26. package/.next/standalone/.next/server/app/api/bridges/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/bulk-import/route.js +3 -2
  28. package/.next/standalone/.next/server/app/api/bulk-import/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/company-scores/legacy/route/app-paths-manifest.json +3 -0
  30. package/.next/standalone/.next/server/app/api/company-scores/legacy/route/build-manifest.json +12 -0
  31. package/.next/standalone/.next/server/app/api/company-scores/legacy/route/server-reference-manifest.json +4 -0
  32. package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js +9 -0
  33. package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js.map +5 -0
  34. package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js.nft.json +1 -0
  35. package/.next/standalone/.next/server/app/api/company-scores/legacy/route_client-reference-manifest.js +3 -0
  36. package/.next/standalone/.next/server/app/api/company-scores/route.js +3 -2
  37. package/.next/standalone/.next/server/app/api/company-scores/route.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/api/connections/route.js +3 -2
  39. package/.next/standalone/.next/server/app/api/connections/route.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/api/data/export/route/app-paths-manifest.json +3 -0
  41. package/.next/standalone/.next/server/app/api/data/export/route/build-manifest.json +12 -0
  42. package/.next/standalone/.next/server/app/api/data/export/route/server-reference-manifest.json +4 -0
  43. package/.next/standalone/.next/server/app/api/data/export/route.js +7 -0
  44. package/.next/standalone/.next/server/app/api/data/export/route.js.map +5 -0
  45. package/.next/standalone/.next/server/app/api/data/export/route.js.nft.json +1 -0
  46. package/.next/standalone/.next/server/app/api/data/export/route_client-reference-manifest.js +3 -0
  47. package/.next/standalone/.next/server/app/api/data/import/route/app-paths-manifest.json +3 -0
  48. package/.next/standalone/.next/server/app/api/data/import/route/build-manifest.json +12 -0
  49. package/.next/standalone/.next/server/app/api/data/import/route/server-reference-manifest.json +4 -0
  50. package/.next/standalone/.next/server/app/api/data/import/route.js +8 -0
  51. package/.next/standalone/.next/server/app/api/data/import/route.js.map +5 -0
  52. package/.next/standalone/.next/server/app/api/data/import/route.js.nft.json +1 -0
  53. package/.next/standalone/.next/server/app/api/data/import/route_client-reference-manifest.js +3 -0
  54. package/.next/standalone/.next/server/app/api/data/restart/route/app-paths-manifest.json +3 -0
  55. package/.next/standalone/.next/server/app/api/data/restart/route/build-manifest.json +12 -0
  56. package/.next/standalone/.next/server/app/api/data/restart/route/server-reference-manifest.json +4 -0
  57. package/.next/standalone/.next/server/app/api/data/restart/route.js +8 -0
  58. package/.next/standalone/.next/server/app/api/data/restart/route.js.map +5 -0
  59. package/.next/standalone/.next/server/app/api/data/restart/route.js.nft.json +1 -0
  60. package/.next/standalone/.next/server/app/api/data/restart/route_client-reference-manifest.js +3 -0
  61. package/.next/standalone/.next/server/app/api/data/reveal/route/app-paths-manifest.json +3 -0
  62. package/.next/standalone/.next/server/app/api/data/reveal/route/build-manifest.json +12 -0
  63. package/.next/standalone/.next/server/app/api/data/reveal/route/server-reference-manifest.json +4 -0
  64. package/.next/standalone/.next/server/app/api/data/reveal/route.js +7 -0
  65. package/.next/standalone/.next/server/app/api/data/reveal/route.js.map +5 -0
  66. package/.next/standalone/.next/server/app/api/data/reveal/route.js.nft.json +1 -0
  67. package/.next/standalone/.next/server/app/api/data/reveal/route_client-reference-manifest.js +3 -0
  68. package/.next/standalone/.next/server/app/api/data/route/app-paths-manifest.json +3 -0
  69. package/.next/standalone/.next/server/app/api/data/route/build-manifest.json +12 -0
  70. package/.next/standalone/.next/server/app/api/data/route/server-reference-manifest.json +4 -0
  71. package/.next/standalone/.next/server/app/api/data/route.js +7 -0
  72. package/.next/standalone/.next/server/app/api/data/route.js.map +5 -0
  73. package/.next/standalone/.next/server/app/api/data/route.js.nft.json +1 -0
  74. package/.next/standalone/.next/server/app/api/data/route_client-reference-manifest.js +3 -0
  75. package/.next/standalone/.next/server/app/api/delete-cluster/route.js +3 -2
  76. package/.next/standalone/.next/server/app/api/delete-cluster/route.js.nft.json +1 -1
  77. package/.next/standalone/.next/server/app/api/ingest/route.js +2 -2
  78. package/.next/standalone/.next/server/app/api/ingest/route.js.nft.json +1 -1
  79. package/.next/standalone/.next/server/app/api/network/route.js +3 -2
  80. package/.next/standalone/.next/server/app/api/network/route.js.nft.json +1 -1
  81. package/.next/standalone/.next/server/app/api/notifications/route.js +3 -2
  82. package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  83. package/.next/standalone/.next/server/app/api/outreach/route.js +3 -2
  84. package/.next/standalone/.next/server/app/api/outreach/route.js.nft.json +1 -1
  85. package/.next/standalone/.next/server/app/api/queue/route.js +3 -2
  86. package/.next/standalone/.next/server/app/api/queue/route.js.nft.json +1 -1
  87. package/.next/standalone/.next/server/app/api/scraper/route.js +3 -2
  88. package/.next/standalone/.next/server/app/api/scraper/route.js.nft.json +1 -1
  89. package/.next/standalone/.next/server/app/api/settings/route/app-paths-manifest.json +3 -0
  90. package/.next/standalone/.next/server/app/api/settings/route/build-manifest.json +12 -0
  91. package/.next/standalone/.next/server/app/api/settings/route/server-reference-manifest.json +4 -0
  92. package/.next/standalone/.next/server/app/api/settings/route.js +9 -0
  93. package/.next/standalone/.next/server/app/api/settings/route.js.map +5 -0
  94. package/.next/standalone/.next/server/app/api/settings/route.js.nft.json +1 -0
  95. package/.next/standalone/.next/server/app/api/settings/route_client-reference-manifest.js +3 -0
  96. package/.next/standalone/.next/server/app/api/settings/sector-preview/route/app-paths-manifest.json +3 -0
  97. package/.next/standalone/.next/server/app/api/settings/sector-preview/route/build-manifest.json +12 -0
  98. package/.next/standalone/.next/server/app/api/settings/sector-preview/route/server-reference-manifest.json +4 -0
  99. package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js +8 -0
  100. package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js.map +5 -0
  101. package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js.nft.json +1 -0
  102. package/.next/standalone/.next/server/app/api/settings/sector-preview/route_client-reference-manifest.js +3 -0
  103. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route/app-paths-manifest.json +3 -0
  104. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route/build-manifest.json +12 -0
  105. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route/server-reference-manifest.json +4 -0
  106. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js +8 -0
  107. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js.map +5 -0
  108. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js.nft.json +1 -0
  109. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route_client-reference-manifest.js +3 -0
  110. package/.next/standalone/.next/server/app/api/setup-profile/route.js +3 -2
  111. package/.next/standalone/.next/server/app/api/setup-profile/route.js.nft.json +1 -1
  112. package/.next/standalone/.next/server/app/api/unlock/route.js +3 -2
  113. package/.next/standalone/.next/server/app/api/unlock/route.js.nft.json +1 -1
  114. package/.next/standalone/.next/server/app/api/update/route.js +1 -1
  115. package/.next/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  116. package/.next/standalone/.next/server/app/api/update-images/route.js +3 -2
  117. package/.next/standalone/.next/server/app/api/update-images/route.js.nft.json +1 -1
  118. package/.next/standalone/.next/server/app/api/users/route.js +3 -2
  119. package/.next/standalone/.next/server/app/api/users/route.js.nft.json +1 -1
  120. package/.next/standalone/.next/server/app/avatars/[file]/route.js +2 -1
  121. package/.next/standalone/.next/server/app/avatars/[file]/route.js.nft.json +1 -1
  122. package/.next/standalone/.next/server/app/favicon.ico/route.js +2 -1
  123. package/.next/standalone/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  124. package/.next/standalone/.next/server/app/import/page.js.nft.json +1 -1
  125. package/.next/standalone/.next/server/app/import/page_client-reference-manifest.js +1 -1
  126. package/.next/standalone/.next/server/app/import.html +1 -1
  127. package/.next/standalone/.next/server/app/import.rsc +13 -13
  128. package/.next/standalone/.next/server/app/import.segments/_full.segment.rsc +13 -13
  129. package/.next/standalone/.next/server/app/import.segments/_tree.segment.rsc +1 -1
  130. package/.next/standalone/.next/server/app/import.segments/import/__PAGE__.segment.rsc +11 -11
  131. package/.next/standalone/.next/server/app/index.html +1 -1
  132. package/.next/standalone/.next/server/app/index.rsc +13 -13
  133. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +11 -11
  134. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +13 -13
  135. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  136. package/.next/standalone/.next/server/app/launch/page.js.nft.json +1 -1
  137. package/.next/standalone/.next/server/app/launch/page_client-reference-manifest.js +1 -1
  138. package/.next/standalone/.next/server/app/launch.html +2 -2
  139. package/.next/standalone/.next/server/app/launch.rsc +13 -13
  140. package/.next/standalone/.next/server/app/launch.segments/_full.segment.rsc +13 -13
  141. package/.next/standalone/.next/server/app/launch.segments/_tree.segment.rsc +1 -1
  142. package/.next/standalone/.next/server/app/launch.segments/launch/__PAGE__.segment.rsc +11 -11
  143. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  144. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  145. package/.next/standalone/.next/server/app/paths/page.js.nft.json +1 -1
  146. package/.next/standalone/.next/server/app/paths/page_client-reference-manifest.js +1 -1
  147. package/.next/standalone/.next/server/app/paths.html +1 -1
  148. package/.next/standalone/.next/server/app/paths.rsc +13 -13
  149. package/.next/standalone/.next/server/app/paths.segments/_full.segment.rsc +13 -13
  150. package/.next/standalone/.next/server/app/paths.segments/_tree.segment.rsc +1 -1
  151. package/.next/standalone/.next/server/app/paths.segments/paths/__PAGE__.segment.rsc +11 -11
  152. package/.next/standalone/.next/server/app/profile/page.js.nft.json +1 -1
  153. package/.next/standalone/.next/server/app/profile/page_client-reference-manifest.js +1 -1
  154. package/.next/standalone/.next/server/app/profile.html +1 -1
  155. package/.next/standalone/.next/server/app/profile.rsc +13 -13
  156. package/.next/standalone/.next/server/app/profile.segments/_full.segment.rsc +13 -13
  157. package/.next/standalone/.next/server/app/profile.segments/_tree.segment.rsc +1 -1
  158. package/.next/standalone/.next/server/app/profile.segments/profile/__PAGE__.segment.rsc +11 -11
  159. package/.next/standalone/.next/server/app/queue/page.js.nft.json +1 -1
  160. package/.next/standalone/.next/server/app/queue/page_client-reference-manifest.js +1 -1
  161. package/.next/standalone/.next/server/app/queue.html +1 -1
  162. package/.next/standalone/.next/server/app/queue.rsc +13 -13
  163. package/.next/standalone/.next/server/app/queue.segments/_full.segment.rsc +13 -13
  164. package/.next/standalone/.next/server/app/queue.segments/_tree.segment.rsc +1 -1
  165. package/.next/standalone/.next/server/app/queue.segments/queue/__PAGE__.segment.rsc +11 -11
  166. package/.next/standalone/.next/server/app/settings/page/app-paths-manifest.json +3 -0
  167. package/.next/standalone/.next/server/app/settings/page/build-manifest.json +20 -0
  168. package/.next/standalone/.next/server/app/settings/page/next-font-manifest.json +11 -0
  169. package/.next/standalone/.next/server/app/settings/page/react-loadable-manifest.json +1 -0
  170. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +4 -0
  171. package/.next/standalone/.next/server/app/settings/page.js +13 -0
  172. package/.next/standalone/.next/server/app/settings/page.js.map +5 -0
  173. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -0
  174. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +3 -0
  175. package/.next/standalone/.next/server/app/settings.html +1 -0
  176. package/.next/standalone/.next/server/app/settings.meta +26 -0
  177. package/.next/standalone/.next/server/app/settings.rsc +24 -0
  178. package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +24 -0
  179. package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +4 -0
  180. package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +28 -0
  181. package/.next/standalone/.next/server/app/setup/page.js.nft.json +1 -1
  182. package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  183. package/.next/standalone/.next/server/app/setup.html +1 -1
  184. package/.next/standalone/.next/server/app/setup.rsc +13 -13
  185. package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +13 -13
  186. package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +1 -1
  187. package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +11 -11
  188. package/.next/standalone/.next/server/app-paths-manifest.json +10 -0
  189. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-rnla2._.js +3 -0
  190. package/.next/standalone/.next/server/chunks/[root-of-the-server]__00la_y0._.js +3 -0
  191. package/.next/standalone/.next/server/chunks/[root-of-the-server]__07t47cm._.js +3 -0
  192. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cj5jqc._.js +3 -0
  193. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e0fei3._.js +3 -0
  194. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0i5hdu4._.js +3 -0
  195. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ljcioj._.js +3 -0
  196. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ljnyho._.js +3 -0
  197. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o5-tcg._.js +3 -0
  198. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qrnous._.js +3 -0
  199. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t3v1a1._.js +3 -0
  200. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0uag-k5._.js +8 -0
  201. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0um1uey._.js +3 -0
  202. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wmexuc._.js +3 -0
  203. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xu34sz._.js +3 -0
  204. package/.next/standalone/.next/server/chunks/[root-of-the-server]__133knx1._.js +3 -0
  205. package/.next/standalone/.next/server/chunks/[root-of-the-server]__14ou7j5._.js +3 -0
  206. package/.next/standalone/.next/server/chunks/[root-of-the-server]__15-17hl._.js +3 -0
  207. package/.next/standalone/.next/server/chunks/[root-of-the-server]__16iu0hv._.js +3 -0
  208. package/.next/standalone/.next/server/chunks/[root-of-the-server]__19b7mig._.js +3 -0
  209. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1bbcwub._.js +8 -0
  210. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1eris29._.js +3 -0
  211. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1gjo_cq._.js +3 -0
  212. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1kbl21f._.js +3 -0
  213. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qcm08_._.js +3 -0
  214. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1rphsdk._.js +3 -0
  215. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1t3rugi._.js +3 -0
  216. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1w25q0m._.js +3 -0
  217. package/.next/standalone/.next/server/chunks/_072jl0y._.js +3 -0
  218. package/.next/standalone/.next/server/chunks/_0lw8_i0._.js +3 -0
  219. package/.next/standalone/.next/server/chunks/_1_fynia._.js +21 -3
  220. package/.next/standalone/.next/server/chunks/_1fn30_l._.js +3 -0
  221. package/.next/standalone/.next/server/chunks/_1itd1o_._.js +2 -1
  222. package/.next/standalone/.next/server/chunks/_1iwkh8t._.js +1 -1
  223. package/.next/standalone/.next/server/chunks/_1mxn_lb._.js +3 -0
  224. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_company-scores_legacy_route_actions_1ncspu_.js +3 -0
  225. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_export_route_actions_1lkimty.js +3 -0
  226. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_import_route_actions_1eji0kd.js +3 -0
  227. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_restart_route_actions_00_-u6o.js +3 -0
  228. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_reveal_route_actions_0-moqtn.js +3 -0
  229. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_route_actions_0j0w5ep.js +3 -0
  230. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_settings_route_actions_1bpm9ac.js +3 -0
  231. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_settings_sector-preview_route_actions_0w79454.js +3 -0
  232. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_settings_sector-suggestions_route_actions_1eoqugp.js +3 -0
  233. package/.next/standalone/.next/server/chunks/lib_db-client_15le7cw.js +155 -0
  234. package/.next/standalone/.next/server/chunks/{lib_rpc_0mc73lk.js → lib_rpc_00tx2sm.js} +1 -1
  235. package/.next/standalone/.next/server/chunks/lib_rpc_02-qa4d.js +3 -0
  236. package/.next/standalone/.next/server/chunks/lib_rpc_02ndsg2.js +3 -0
  237. package/.next/standalone/.next/server/chunks/lib_rpc_08q5vp6.js +3 -0
  238. package/.next/standalone/.next/server/chunks/lib_rpc_0_8i3ft.js +3 -0
  239. package/.next/standalone/.next/server/chunks/lib_rpc_0c9d9ti.js +5 -2
  240. package/.next/standalone/.next/server/chunks/lib_rpc_0huvw-3.js +3 -0
  241. package/.next/standalone/.next/server/chunks/lib_rpc_0ip2vdh.js +3 -0
  242. package/.next/standalone/.next/server/chunks/lib_rpc_0jzisgh.js +3 -0
  243. package/.next/standalone/.next/server/chunks/lib_rpc_0yi9xvd.js +3 -0
  244. package/.next/standalone/.next/server/chunks/lib_rpc_1jyhd0o.js +3 -0
  245. package/.next/standalone/.next/server/chunks/lib_rpc_1kn59-i.js +3 -0
  246. package/.next/standalone/.next/server/chunks/lib_rpc_1q2jkza.js +3 -0
  247. package/.next/standalone/.next/server/chunks/lib_rpc_1vpm1sk.js +3 -0
  248. package/.next/standalone/.next/server/chunks/lib_rpc_1x6p_31.js +3 -0
  249. package/.next/standalone/.next/server/chunks/node_modules_next_1zc5q0a._.js +158 -0
  250. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0mocm6d._.js → [root-of-the-server]__0an6blh._.js} +3 -3
  251. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h1_f_2._.js +1 -1
  252. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1m0255u._.js +3 -0
  253. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0bipr5s._.js → [root-of-the-server]__1z1j3ek._.js} +2 -2
  254. package/.next/standalone/.next/server/chunks/ssr/_07u8byv._.js +3 -0
  255. package/.next/standalone/.next/server/chunks/ssr/_08r_mlf._.js +3 -0
  256. package/.next/standalone/.next/server/chunks/ssr/{_0ggabjc._.js → _0942v8n._.js} +1 -1
  257. package/.next/standalone/.next/server/chunks/ssr/{_1djpk8t._.js → _0hl_t7r._.js} +2 -2
  258. package/.next/standalone/.next/server/chunks/ssr/_0tb83dw._.js +132 -0
  259. package/.next/standalone/.next/server/chunks/ssr/_1-87bs1._.js +3 -0
  260. package/.next/standalone/.next/server/chunks/ssr/_17gui6a._.js +1 -1
  261. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_11x4dq5.js +3 -0
  262. package/.next/standalone/.next/server/chunks/ssr/app_import_page_1fmu6_l.js +1 -1
  263. package/.next/standalone/.next/server/chunks/ssr/app_launch_page_19t0dyd.js +2 -2
  264. package/.next/standalone/.next/server/chunks/ssr/app_page_1fazqbf.js +4 -4
  265. package/.next/standalone/.next/server/chunks/ssr/app_profile_page_0u3-l5y.js +1 -1
  266. package/.next/standalone/.next/server/chunks/ssr/app_queue_page_0c6znd6.js +5 -5
  267. package/.next/standalone/.next/server/chunks/ssr/app_settings_page_1f8mjj_.js +3 -0
  268. package/.next/standalone/.next/server/chunks/ssr/app_setup_page_1-282zx.js +2 -2
  269. package/.next/standalone/.next/server/chunks/ssr/lib_0i8v-s3._.js +1 -1
  270. package/.next/standalone/.next/server/chunks/ssr/node_modules_1f8t_rp._.js +23 -0
  271. package/.next/standalone/.next/server/chunks/ssr/node_modules_1nkgb45._.js +2 -2
  272. package/.next/standalone/.next/server/chunks/ssr/{node_modules_01xbj_9._.js → node_modules_1wax83z._.js} +3 -3
  273. package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_00nap8h._.js → node_modules_next_dist_1bunoni._.js} +2 -2
  274. package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__0pco7a6._.js +2 -2
  275. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  276. package/.next/standalone/.next/server/middleware-manifest.json +15 -7
  277. package/.next/standalone/.next/server/next-font-manifest.js +1 -1
  278. package/.next/standalone/.next/server/next-font-manifest.json +4 -0
  279. package/.next/standalone/.next/server/pages/404.html +1 -1
  280. package/.next/standalone/.next/server/pages/500.html +1 -1
  281. package/.next/standalone/.next/server/prefetch-hints.json +14 -0
  282. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  283. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  284. package/.next/standalone/.next/static/chunks/06x3jiiz96m5t.js +1 -0
  285. package/.next/{static/chunks/34at5d2ifl62i.js → standalone/.next/static/chunks/0ngx9s6-zgshe.js} +5 -5
  286. package/.next/standalone/.next/static/chunks/0q-_khndfxubv.js +2 -0
  287. package/.next/standalone/.next/static/chunks/1c79veqedvubt.js +1 -0
  288. package/.next/standalone/.next/static/chunks/1chp3nx45meg5.js +44 -0
  289. package/.next/standalone/.next/static/chunks/1irqj0lf-fu3d.js +1 -0
  290. package/.next/standalone/.next/static/chunks/1uadqylrod5_v.js +1 -0
  291. package/.next/standalone/.next/static/chunks/23u0zclgwpc4d.js +1 -0
  292. package/.next/standalone/.next/static/chunks/289ktj97di6zg.js +1 -0
  293. package/.next/standalone/.next/static/chunks/2b3lmf8e6uj8m.js +16 -0
  294. package/.next/standalone/.next/static/chunks/2jz311xl1pp_8.js +1 -0
  295. package/.next/standalone/.next/static/chunks/2ot61qsv6_0eq.js +1 -0
  296. package/.next/standalone/.next/static/chunks/3npq5yd7c4dmn.js +2 -0
  297. package/.next/standalone/.next/static/frfHFnRYTA0Wjrw8oZJtY/_clientMiddlewareManifest.js +14 -0
  298. package/.next/standalone/AGENTS.md +10 -0
  299. package/.next/standalone/CHANGELOG.md +325 -0
  300. package/.next/standalone/CONTRIBUTING.md +14 -2
  301. package/.next/standalone/README.md +181 -53
  302. package/.next/standalone/SECURITY.md +120 -10
  303. package/.next/standalone/app/api/company-scores/legacy/route.js +32 -0
  304. package/.next/standalone/app/api/company-scores/route.js +20 -11
  305. package/.next/standalone/app/api/data/export/route.js +49 -0
  306. package/.next/standalone/app/api/data/import/route.js +83 -0
  307. package/.next/standalone/app/api/data/restart/route.js +37 -0
  308. package/.next/standalone/app/api/data/reveal/route.js +14 -0
  309. package/.next/standalone/app/api/data/route.js +39 -0
  310. package/.next/standalone/app/api/ingest/route.js +15 -47
  311. package/.next/standalone/app/api/scraper/route.js +268 -128
  312. package/.next/standalone/app/api/settings/route.js +58 -0
  313. package/.next/standalone/app/api/settings/sector-preview/route.js +38 -0
  314. package/.next/standalone/app/api/settings/sector-suggestions/route.js +20 -0
  315. package/.next/standalone/app/api/update/route.js +197 -24
  316. package/.next/standalone/app/avatars/[file]/route.js +4 -2
  317. package/.next/standalone/app/components/CompanyScores.js +28 -7
  318. package/.next/standalone/app/components/EmptyState.js +8 -0
  319. package/.next/standalone/app/components/ForceGraph.js +40 -36
  320. package/.next/standalone/app/components/LegacyScoresCard.js +129 -0
  321. package/.next/standalone/app/components/Sidebar.js +19 -18
  322. package/.next/standalone/app/components/UpdatePanel.js +317 -99
  323. package/.next/standalone/app/components/UserProvider.js +4 -3
  324. package/.next/standalone/app/components/settings/DataSection.js +437 -0
  325. package/.next/standalone/app/components/settings/SectorSection.js +445 -0
  326. package/.next/standalone/app/components/ui.js +62 -0
  327. package/.next/standalone/app/import/page.js +3 -3
  328. package/.next/standalone/app/launch/page.js +30 -20
  329. package/.next/standalone/app/layout.js +2 -2
  330. package/.next/standalone/app/page.js +15 -2
  331. package/.next/standalone/app/paths/page.js +13 -5
  332. package/.next/standalone/app/profile/page.js +41 -186
  333. package/.next/standalone/app/queue/page.js +8 -2
  334. package/.next/standalone/app/settings/page.js +96 -0
  335. package/.next/standalone/app/setup/page.js +35 -19
  336. package/.next/standalone/bin/args.mjs +44 -0
  337. package/.next/standalone/bin/six-degrees.mjs +16 -17
  338. package/.next/standalone/install.sh +1 -1
  339. package/.next/standalone/lib/companies.js +44 -119
  340. package/.next/standalone/lib/csv.js +61 -27
  341. package/.next/standalone/lib/data-export.js +170 -0
  342. package/.next/standalone/lib/data-folder.js +238 -0
  343. package/.next/standalone/lib/data-import.js +878 -0
  344. package/.next/standalone/lib/db-client.js +48 -3
  345. package/.next/standalone/lib/durable.js +73 -0
  346. package/.next/standalone/lib/gate.js +90 -1
  347. package/.next/standalone/lib/ingest.js +40 -0
  348. package/.next/standalone/lib/legacy-offer.js +185 -0
  349. package/.next/standalone/lib/legacy-scores.js +77 -0
  350. package/.next/standalone/lib/linkedin-limits.js +124 -1
  351. package/.next/standalone/lib/release.js +5 -2
  352. package/.next/standalone/lib/rpc.js +121 -13
  353. package/.next/standalone/lib/sample-stats.js +16 -0
  354. package/.next/standalone/lib/scan-progress.js +13 -0
  355. package/.next/standalone/lib/scan-state.js +53 -0
  356. package/.next/standalone/lib/scanner-python.js +685 -0
  357. package/.next/standalone/lib/scanner-setup.js +104 -0
  358. package/.next/standalone/lib/scoring.js +747 -138
  359. package/.next/standalone/lib/scraper-client.js +10 -6
  360. package/.next/standalone/lib/sector-directory.js +1532 -0
  361. package/.next/standalone/lib/sector-focus.js +163 -0
  362. package/.next/standalone/lib/sector-labels.js +81 -0
  363. package/.next/standalone/lib/settings-effects.js +59 -0
  364. package/.next/standalone/lib/settings.js +83 -0
  365. package/.next/standalone/lib/updater-job.js +838 -0
  366. package/.next/standalone/lib/updater.js +494 -0
  367. package/.next/standalone/middleware.js +25 -28
  368. package/.next/standalone/next.config.mjs +19 -3
  369. package/.next/standalone/package-lock.json +103 -9
  370. package/.next/standalone/package.json +12 -11
  371. package/.next/standalone/public/demo-data.json +1 -1
  372. package/.next/standalone/scripts/apply-update.sh +482 -0
  373. package/.next/standalone/scripts/build-app.mjs +251 -9
  374. package/.next/standalone/scripts/gen-synthetic.mjs +16 -1
  375. package/.next/standalone/scripts/readme_buttons.py +89 -0
  376. package/.next/standalone/scripts/requirements.txt +106 -4
  377. package/.next/standalone/scripts/screenshots.py +2 -0
  378. package/.next/standalone/scripts/test-release-server.mjs +143 -0
  379. package/.next/standalone/server.js +1 -1
  380. package/.next/static/chunks/06x3jiiz96m5t.js +1 -0
  381. package/.next/{standalone/.next/static/chunks/34at5d2ifl62i.js → static/chunks/0ngx9s6-zgshe.js} +5 -5
  382. package/.next/static/chunks/0q-_khndfxubv.js +2 -0
  383. package/.next/static/chunks/1c79veqedvubt.js +1 -0
  384. package/.next/static/chunks/1chp3nx45meg5.js +44 -0
  385. package/.next/static/chunks/1irqj0lf-fu3d.js +1 -0
  386. package/.next/static/chunks/1uadqylrod5_v.js +1 -0
  387. package/.next/static/chunks/23u0zclgwpc4d.js +1 -0
  388. package/.next/static/chunks/289ktj97di6zg.js +1 -0
  389. package/.next/static/chunks/2b3lmf8e6uj8m.js +16 -0
  390. package/.next/static/chunks/2jz311xl1pp_8.js +1 -0
  391. package/.next/static/chunks/2ot61qsv6_0eq.js +1 -0
  392. package/.next/static/chunks/3npq5yd7c4dmn.js +2 -0
  393. package/.next/static/frfHFnRYTA0Wjrw8oZJtY/_clientMiddlewareManifest.js +14 -0
  394. package/CHANGELOG.md +325 -0
  395. package/README.md +181 -53
  396. package/SECURITY.md +120 -10
  397. package/bin/args.mjs +44 -0
  398. package/bin/six-degrees.mjs +16 -17
  399. package/lib/companies.js +44 -119
  400. package/lib/csv.js +61 -27
  401. package/lib/data-export.js +170 -0
  402. package/lib/data-folder.js +238 -0
  403. package/lib/data-import.js +878 -0
  404. package/lib/db-client.js +48 -3
  405. package/lib/durable.js +73 -0
  406. package/lib/gate.js +90 -1
  407. package/lib/ingest.js +40 -0
  408. package/lib/legacy-offer.js +185 -0
  409. package/lib/legacy-scores.js +77 -0
  410. package/lib/linkedin-limits.js +124 -1
  411. package/lib/release.js +5 -2
  412. package/lib/rpc.js +121 -13
  413. package/lib/sample-stats.js +16 -0
  414. package/lib/scan-progress.js +13 -0
  415. package/lib/scan-state.js +53 -0
  416. package/lib/scanner-python.js +685 -0
  417. package/lib/scanner-setup.js +104 -0
  418. package/lib/scoring.js +747 -138
  419. package/lib/scraper-client.js +10 -6
  420. package/lib/sector-directory.js +1532 -0
  421. package/lib/sector-focus.js +163 -0
  422. package/lib/sector-labels.js +81 -0
  423. package/lib/settings-effects.js +59 -0
  424. package/lib/settings.js +83 -0
  425. package/lib/updater-job.js +838 -0
  426. package/lib/updater.js +494 -0
  427. package/package.json +12 -11
  428. package/public/demo-data.json +1 -1
  429. package/scripts/requirements.txt +106 -4
  430. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0jrmmj-._.js +0 -150
  431. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qx548g._.js +0 -151
  432. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1an3leo._.js +0 -150
  433. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1m8zedk._.js +0 -155
  434. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1zor0ys._.js +0 -3
  435. package/.next/standalone/.next/server/chunks/_0_rp-01._.js +0 -3
  436. package/.next/standalone/.next/server/chunks/_0hzdk79._.js +0 -3
  437. package/.next/standalone/.next/server/chunks/_0ow7u5r._.js +0 -3
  438. package/.next/standalone/.next/server/chunks/_0t0zc2d._.js +0 -3
  439. package/.next/standalone/.next/server/chunks/_0wa631d._.js +0 -3
  440. package/.next/standalone/.next/server/chunks/_13ccnao._.js +0 -3
  441. package/.next/standalone/.next/server/chunks/_13es063._.js +0 -3
  442. package/.next/standalone/.next/server/chunks/_142872j._.js +0 -3
  443. package/.next/standalone/.next/server/chunks/_18wsb_a._.js +0 -8
  444. package/.next/standalone/.next/server/chunks/_1e-4h5h._.js +0 -3
  445. package/.next/standalone/.next/server/chunks/_1gvvd7n._.js +0 -158
  446. package/.next/standalone/.next/server/chunks/_1moda66._.js +0 -3
  447. package/.next/standalone/.next/server/chunks/_1p6ghzv._.js +0 -3
  448. package/.next/standalone/.next/server/chunks/_1xmmi_v._.js +0 -3
  449. package/.next/standalone/.next/server/chunks/_1z-yrlf._.js +0 -3
  450. package/.next/standalone/.next/server/chunks/ssr/_0bf3x4q._.js +0 -3
  451. package/.next/standalone/.next/server/chunks/ssr/app_paths_page_1ol90m7.js +0 -4
  452. package/.next/standalone/.next/static/N9wokeIiC9rUIGmzBhj6T/_clientMiddlewareManifest.js +0 -6
  453. package/.next/standalone/.next/static/chunks/1odow92u6wxz0.js +0 -1
  454. package/.next/standalone/.next/static/chunks/1wb_is4wsdm-u.js +0 -1
  455. package/.next/standalone/.next/static/chunks/1zmpcmngg5c7-.js +0 -2
  456. package/.next/standalone/.next/static/chunks/220-ne82aus0c.js +0 -44
  457. package/.next/standalone/.next/static/chunks/2rrf5kzx2fhin.js +0 -2
  458. package/.next/standalone/.next/static/chunks/2s_k9x4d0gi9h.js +0 -16
  459. package/.next/standalone/.next/static/chunks/3hsi90cejq2dg.js +0 -1
  460. package/.next/standalone/.next/static/chunks/3pfyuezyqd9ob.js +0 -1
  461. package/.next/standalone/.next/static/chunks/3ts-_4i6bfkh2.js +0 -1
  462. package/.next/standalone/scripts/score-connections.sql +0 -80
  463. package/.next/standalone/scripts/score_new_connections.sql +0 -77
  464. package/.next/static/N9wokeIiC9rUIGmzBhj6T/_clientMiddlewareManifest.js +0 -6
  465. package/.next/static/chunks/1odow92u6wxz0.js +0 -1
  466. package/.next/static/chunks/1wb_is4wsdm-u.js +0 -1
  467. package/.next/static/chunks/1zmpcmngg5c7-.js +0 -2
  468. package/.next/static/chunks/220-ne82aus0c.js +0 -44
  469. package/.next/static/chunks/2rrf5kzx2fhin.js +0 -2
  470. package/.next/static/chunks/2s_k9x4d0gi9h.js +0 -16
  471. package/.next/static/chunks/3hsi90cejq2dg.js +0 -1
  472. package/.next/static/chunks/3pfyuezyqd9ob.js +0 -1
  473. package/.next/static/chunks/3ts-_4i6bfkh2.js +0 -1
  474. package/scripts/score_new_connections.sql +0 -77
  475. /package/.next/standalone/.next/static/{N9wokeIiC9rUIGmzBhj6T → frfHFnRYTA0Wjrw8oZJtY}/_buildManifest.js +0 -0
  476. /package/.next/standalone/.next/static/{N9wokeIiC9rUIGmzBhj6T → frfHFnRYTA0Wjrw8oZJtY}/_ssgManifest.js +0 -0
  477. /package/.next/static/{N9wokeIiC9rUIGmzBhj6T → frfHFnRYTA0Wjrw8oZJtY}/_buildManifest.js +0 -0
  478. /package/.next/static/{N9wokeIiC9rUIGmzBhj6T → frfHFnRYTA0Wjrw8oZJtY}/_ssgManifest.js +0 -0
@@ -1,35 +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
- // "Check for updates". Loading the panel only reads the local git state.
8
-
9
- const LINE = '1px solid rgba(255,255,255,0.1)';
8
+ // "Check for updates", here or in the Mac app's menu (which opens this page at
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.
10
14
 
11
15
  export default function UpdatePanel() {
12
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 }) {
13
40
  const [result, setResult] = useState(null);
14
41
  const [busy, setBusy] = useState(null);
15
42
  const [error, setError] = useState(null);
16
43
  const [done, setDone] = useState(null);
17
44
 
45
+ // The menu's "Check for Updates…" runs its check here too.
18
46
  useEffect(() => {
19
- 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.
20
52
  }, []);
21
53
 
22
54
  async function call(action) {
23
55
  setBusy(action);
24
56
  setError(null);
25
57
  try {
26
- const r = await fetch('/api/update', {
27
- method: 'POST',
28
- headers: { 'Content-Type': 'application/json' },
29
- body: JSON.stringify({ action }),
30
- });
31
- const d = await r.json();
32
- if (!r.ok) {
58
+ const { ok, d } = await post({ action });
59
+ if (!ok) {
33
60
  setError(d.error || 'Something went wrong.');
34
61
  if (d.dirty) setResult({ dirty: d.dirty });
35
62
  return;
@@ -43,23 +70,8 @@ export default function UpdatePanel() {
43
70
  }
44
71
  }
45
72
 
46
- if (!local) return null;
47
-
48
- if (local.installed) return <InstalledUpdates local={local} />;
49
-
50
- if (local.supported === false) {
51
- return (
52
- <Wrap>
53
- <Title>Updates</Title>
54
- <Body>{local.reason}</Body>
55
- </Wrap>
56
- );
57
- }
58
-
59
73
  return (
60
- <Wrap>
61
- <Title>Updates</Title>
62
-
74
+ <Section id="updates" title="Updates">
63
75
  {done ? (
64
76
  <>
65
77
  <Body>
@@ -77,7 +89,7 @@ export default function UpdatePanel() {
77
89
  You are on <Mono>{local.sha}</Mono> — “{local.subject}”.
78
90
  </Body>
79
91
 
80
- {result && result.behind === 0 && <Body>Up to date.</Body>}
92
+ {result && result.behind === 0 && <Status tone="ok">You&rsquo;re up to date.</Status>}
81
93
 
82
94
  {result && result.behind > 0 && (
83
95
  <>
@@ -96,7 +108,7 @@ export default function UpdatePanel() {
96
108
  </Body>
97
109
  )}
98
110
 
99
- <div style={{ display: 'flex', gap: 10, marginTop: 12, flexWrap: 'wrap' }}>
111
+ <Row>
100
112
  <Btn onClick={() => call('check')} disabled={!!busy}>
101
113
  {busy === 'check' ? 'Checking…' : 'Check for updates'}
102
114
  </Btn>
@@ -105,7 +117,7 @@ export default function UpdatePanel() {
105
117
  {busy === 'pull' ? 'Updating…' : `Install ${result.behind} update${result.behind === 1 ? '' : 's'}`}
106
118
  </Btn>
107
119
  )}
108
- </div>
120
+ </Row>
109
121
  </>
110
122
  )}
111
123
 
@@ -115,31 +127,99 @@ export default function UpdatePanel() {
115
127
  Nothing is checked automatically and nothing about you is sent — this runs the
116
128
  same <Mono>git fetch</Mono> and <Mono>git pull</Mono> you would type yourself.
117
129
  </Body>
118
- </Wrap>
130
+ </Section>
119
131
  );
120
132
  }
121
133
 
134
+ // ── an installed copy ─────────────────────────────────────────────────────────
122
135
  // The Mac app and the npm package update by installing the newer release over
123
- // the top. This asks GitHub for the newest version number — on a click only —
124
- // 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
+
125
144
  function InstalledUpdates({ local }) {
145
+ const mac = local.kind === 'mac-app';
126
146
  const [busy, setBusy] = useState(false);
127
147
  const [result, setResult] = useState(null);
128
148
  const [error, setError] = useState(null);
129
149
  const [copied, setCopied] = useState(false);
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);
161
+
162
+ // Opened from the menu's "Check for Updates…": bring the panel into view and
163
+ // run the check that click asked for. After an update the app opens here
164
+ // (#updates), to show how it went.
165
+ useEffect(() => {
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
171
+ panel()?.scrollIntoView({ block: 'center' });
172
+ check().then(() => panel()?.scrollIntoView({ block: 'end', behavior: 'smooth' }));
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]);
130
209
 
131
210
  async function check() {
132
211
  setBusy(true);
212
+ setResult(null);
133
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));
134
219
  try {
135
- const r = await fetch('/api/update', {
136
- method: 'POST',
137
- headers: { 'Content-Type': 'application/json' },
138
- body: JSON.stringify({ action: 'check-release' }),
139
- });
140
- const d = await r.json();
141
- if (!r.ok) setError(d.error || 'Could not check.');
142
- else setResult(d);
220
+ const { ok, d } = await post({ action: 'check-release' });
221
+ if (!ok) setError(d.error || 'Could not check.');
222
+ else { setResult(d); setCheckedAt(new Date()); }
143
223
  } catch (e) {
144
224
  setError(e.message);
145
225
  } finally {
@@ -147,6 +227,35 @@ function InstalledUpdates({ local }) {
147
227
  }
148
228
  }
149
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
+
150
259
  async function copy() {
151
260
  try {
152
261
  await navigator.clipboard.writeText(local.command);
@@ -157,90 +266,199 @@ function InstalledUpdates({ local }) {
157
266
  }
158
267
  }
159
268
 
160
- const how = local.kind === 'mac-app'
161
- ? 'Paste this into Terminal. It closes this app, puts the new version in its place and opens it. Your network stays where it is.'
162
- : local.kind === 'source'
163
- ? '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.'
164
- : 'Run this in a terminal 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 });
165
284
 
166
285
  return (
167
- <Wrap>
168
- <Title>Updates</Title>
286
+ <Section id="updates" title="Updates">
287
+ {local.lastUpdate && !active && <LastUpdate report={local.lastUpdate} />}
169
288
  <Body>You have version <Mono>{local.version}</Mono>.</Body>
170
289
 
171
- {result && !result.latest && <Body>No release has been published yet.</Body>}
172
- {result?.latest && !result.newer && <Body>That is the newest version.</Body>}
173
-
174
- {result?.newer && (
290
+ {active ? (
291
+ <Progress job={job} restarting={restarting} slow={slow} onCancel={cancel} />
292
+ ) : (
175
293
  <>
176
- <Body style={{ color: '#00ff88' }}>Version {result.latest.version} is available.</Body>
177
- <Body>{how}</Body>
178
- <pre style={pre}>{local.command}</pre>
179
- <div style={{ display: 'flex', gap: 10, marginTop: 10, flexWrap: 'wrap', alignItems: 'center' }}>
180
- <Btn onClick={copy} primary>{copied ? 'Copied' : 'Copy'}</Btn>
181
- {result.latest.url && (
182
- <a href={result.latest.url} target="_blank" rel="noreferrer"
183
- style={{ color: '#3498DB', fontSize: 13.5 }}>
184
- What changed →
185
- </a>
186
- )}
187
- </div>
188
- </>
189
- )}
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>}
190
299
 
191
- {!result?.newer && (
192
- <div style={{ marginTop: 12 }}>
193
- <Btn onClick={check} disabled={busy}>{busy ? 'Checking…' : 'Check for updates'}</Btn>
194
- </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
+ </>
195
359
  )}
196
360
 
197
361
  {error && <Body style={{ color: '#ff7676' }}>{error}</Body>}
198
362
 
199
363
  <Body style={{ fontSize: 12, color: '#667', marginTop: 12 }}>
200
364
  Nothing is checked automatically. The button asks GitHub for the newest version
201
- 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.'}
202
367
  </Body>
203
- </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>
204
374
  );
205
375
  }
206
376
 
207
- const pre = {
208
- background: 'rgba(0,0,0,0.45)', border: LINE, borderRadius: 8, padding: 12,
209
- margin: '8px 0 0', fontSize: 12, lineHeight: 1.7, color: '#b9c6c6',
210
- fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',
211
- whiteSpace: 'pre-wrap', maxHeight: 180, overflow: 'auto',
212
- };
377
+ const megabytes = (bytes) => Math.max(1, Math.round(bytes / 1e6));
378
+
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}`;
397
+ }
213
398
 
214
- function Wrap({ children }) {
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…';
215
407
  return (
216
- <div style={{ marginTop: 32, paddingTop: 24, borderTop: LINE }}>{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>
217
425
  );
218
426
  }
219
- function Title({ children }) {
220
- return <div style={{ fontSize: 15.5, fontWeight: 650, marginBottom: 6 }}>{children}</div>;
221
- }
222
- 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' });
223
431
  return (
224
- <div style={{ fontSize: 13.5, color: '#8b9a9a', lineHeight: 1.6, marginTop: 4, ...style }}>
225
- {children}
226
- </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>
227
441
  );
228
442
  }
229
- function Mono({ children }) {
443
+
444
+ function WhatChanged({ url }) {
445
+ if (!url) return null;
230
446
  return (
231
- <code style={{ background: 'rgba(255,255,255,0.08)', padding: '1px 5px', borderRadius: 4 }}>
232
- {children}
233
- </code>
447
+ <a href={url} target="_blank" rel="noreferrer" style={{ color: '#3498DB', fontSize: 13.5 }}>
448
+ What changed →
449
+ </a>
234
450
  );
235
451
  }
236
- function Btn({ children, onClick, disabled, primary }) {
452
+
453
+ function Row({ children }) {
237
454
  return (
238
- <button onClick={onClick} disabled={disabled} style={{
239
- padding: '9px 18px', borderRadius: 7, fontSize: 13.5, fontWeight: 650,
240
- color: disabled ? '#667' : '#fff', border: LINE,
241
- background: disabled ? 'rgba(255,255,255,0.05)'
242
- : primary ? 'linear-gradient(135deg, #9B59B6, #3498DB)' : 'rgba(255,255,255,0.08)',
243
- cursor: disabled ? 'not-allowed' : 'pointer',
244
- }}>{children}</button>
455
+ <div style={{ display: 'flex', gap: 10, marginTop: 12, flexWrap: 'wrap', alignItems: 'center' }}>{children}</div>
245
456
  );
246
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;