six-degrees 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (470) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +10 -0
  3. package/.next/standalone/.next/build-manifest.json +3 -3
  4. package/.next/standalone/.next/prerender-manifest.json +39 -11
  5. package/.next/standalone/.next/required-server-files.json +4 -1
  6. package/.next/standalone/.next/routes-manifest.json +60 -0
  7. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  17. package/.next/standalone/.next/server/app/_not-found.rsc +10 -10
  18. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +10 -10
  19. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +9 -9
  20. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  21. package/.next/standalone/.next/server/app/api/admin-delete/route.js +3 -2
  22. package/.next/standalone/.next/server/app/api/admin-delete/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/admin-update/route.js +3 -2
  24. package/.next/standalone/.next/server/app/api/admin-update/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/bridges/route.js +3 -2
  26. package/.next/standalone/.next/server/app/api/bridges/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/bulk-import/route.js +3 -2
  28. package/.next/standalone/.next/server/app/api/bulk-import/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/company-scores/legacy/route/app-paths-manifest.json +3 -0
  30. package/.next/standalone/.next/server/app/api/company-scores/legacy/route/build-manifest.json +12 -0
  31. package/.next/standalone/.next/server/app/api/company-scores/legacy/route/server-reference-manifest.json +4 -0
  32. package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js +9 -0
  33. package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js.map +5 -0
  34. package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js.nft.json +1 -0
  35. package/.next/standalone/.next/server/app/api/company-scores/legacy/route_client-reference-manifest.js +3 -0
  36. package/.next/standalone/.next/server/app/api/company-scores/route.js +3 -2
  37. package/.next/standalone/.next/server/app/api/company-scores/route.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/api/connections/route.js +3 -2
  39. package/.next/standalone/.next/server/app/api/connections/route.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/api/data/export/route/app-paths-manifest.json +3 -0
  41. package/.next/standalone/.next/server/app/api/data/export/route/build-manifest.json +12 -0
  42. package/.next/standalone/.next/server/app/api/data/export/route/server-reference-manifest.json +4 -0
  43. package/.next/standalone/.next/server/app/api/data/export/route.js +7 -0
  44. package/.next/standalone/.next/server/app/api/data/export/route.js.map +5 -0
  45. package/.next/standalone/.next/server/app/api/data/export/route.js.nft.json +1 -0
  46. package/.next/standalone/.next/server/app/api/data/export/route_client-reference-manifest.js +3 -0
  47. package/.next/standalone/.next/server/app/api/data/import/route/app-paths-manifest.json +3 -0
  48. package/.next/standalone/.next/server/app/api/data/import/route/build-manifest.json +12 -0
  49. package/.next/standalone/.next/server/app/api/data/import/route/server-reference-manifest.json +4 -0
  50. package/.next/standalone/.next/server/app/api/data/import/route.js +8 -0
  51. package/.next/standalone/.next/server/app/api/data/import/route.js.map +5 -0
  52. package/.next/standalone/.next/server/app/api/data/import/route.js.nft.json +1 -0
  53. package/.next/standalone/.next/server/app/api/data/import/route_client-reference-manifest.js +3 -0
  54. package/.next/standalone/.next/server/app/api/data/restart/route/app-paths-manifest.json +3 -0
  55. package/.next/standalone/.next/server/app/api/data/restart/route/build-manifest.json +12 -0
  56. package/.next/standalone/.next/server/app/api/data/restart/route/server-reference-manifest.json +4 -0
  57. package/.next/standalone/.next/server/app/api/data/restart/route.js +8 -0
  58. package/.next/standalone/.next/server/app/api/data/restart/route.js.map +5 -0
  59. package/.next/standalone/.next/server/app/api/data/restart/route.js.nft.json +1 -0
  60. package/.next/standalone/.next/server/app/api/data/restart/route_client-reference-manifest.js +3 -0
  61. package/.next/standalone/.next/server/app/api/data/reveal/route/app-paths-manifest.json +3 -0
  62. package/.next/standalone/.next/server/app/api/data/reveal/route/build-manifest.json +12 -0
  63. package/.next/standalone/.next/server/app/api/data/reveal/route/server-reference-manifest.json +4 -0
  64. package/.next/standalone/.next/server/app/api/data/reveal/route.js +7 -0
  65. package/.next/standalone/.next/server/app/api/data/reveal/route.js.map +5 -0
  66. package/.next/standalone/.next/server/app/api/data/reveal/route.js.nft.json +1 -0
  67. package/.next/standalone/.next/server/app/api/data/reveal/route_client-reference-manifest.js +3 -0
  68. package/.next/standalone/.next/server/app/api/data/route/app-paths-manifest.json +3 -0
  69. package/.next/standalone/.next/server/app/api/data/route/build-manifest.json +12 -0
  70. package/.next/standalone/.next/server/app/api/data/route/server-reference-manifest.json +4 -0
  71. package/.next/standalone/.next/server/app/api/data/route.js +7 -0
  72. package/.next/standalone/.next/server/app/api/data/route.js.map +5 -0
  73. package/.next/standalone/.next/server/app/api/data/route.js.nft.json +1 -0
  74. package/.next/standalone/.next/server/app/api/data/route_client-reference-manifest.js +3 -0
  75. package/.next/standalone/.next/server/app/api/delete-cluster/route.js +3 -2
  76. package/.next/standalone/.next/server/app/api/delete-cluster/route.js.nft.json +1 -1
  77. package/.next/standalone/.next/server/app/api/ingest/route.js +2 -2
  78. package/.next/standalone/.next/server/app/api/ingest/route.js.nft.json +1 -1
  79. package/.next/standalone/.next/server/app/api/network/route.js +3 -2
  80. package/.next/standalone/.next/server/app/api/network/route.js.nft.json +1 -1
  81. package/.next/standalone/.next/server/app/api/notifications/route.js +3 -2
  82. package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  83. package/.next/standalone/.next/server/app/api/outreach/route.js +3 -2
  84. package/.next/standalone/.next/server/app/api/outreach/route.js.nft.json +1 -1
  85. package/.next/standalone/.next/server/app/api/queue/route.js +3 -2
  86. package/.next/standalone/.next/server/app/api/queue/route.js.nft.json +1 -1
  87. package/.next/standalone/.next/server/app/api/scraper/route.js +3 -2
  88. package/.next/standalone/.next/server/app/api/scraper/route.js.nft.json +1 -1
  89. package/.next/standalone/.next/server/app/api/settings/route/app-paths-manifest.json +3 -0
  90. package/.next/standalone/.next/server/app/api/settings/route/build-manifest.json +12 -0
  91. package/.next/standalone/.next/server/app/api/settings/route/server-reference-manifest.json +4 -0
  92. package/.next/standalone/.next/server/app/api/settings/route.js +9 -0
  93. package/.next/standalone/.next/server/app/api/settings/route.js.map +5 -0
  94. package/.next/standalone/.next/server/app/api/settings/route.js.nft.json +1 -0
  95. package/.next/standalone/.next/server/app/api/settings/route_client-reference-manifest.js +3 -0
  96. package/.next/standalone/.next/server/app/api/settings/sector-preview/route/app-paths-manifest.json +3 -0
  97. package/.next/standalone/.next/server/app/api/settings/sector-preview/route/build-manifest.json +12 -0
  98. package/.next/standalone/.next/server/app/api/settings/sector-preview/route/server-reference-manifest.json +4 -0
  99. package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js +8 -0
  100. package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js.map +5 -0
  101. package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js.nft.json +1 -0
  102. package/.next/standalone/.next/server/app/api/settings/sector-preview/route_client-reference-manifest.js +3 -0
  103. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route/app-paths-manifest.json +3 -0
  104. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route/build-manifest.json +12 -0
  105. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route/server-reference-manifest.json +4 -0
  106. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js +8 -0
  107. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js.map +5 -0
  108. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js.nft.json +1 -0
  109. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route_client-reference-manifest.js +3 -0
  110. package/.next/standalone/.next/server/app/api/setup-profile/route.js +3 -2
  111. package/.next/standalone/.next/server/app/api/setup-profile/route.js.nft.json +1 -1
  112. package/.next/standalone/.next/server/app/api/unlock/route.js +3 -2
  113. package/.next/standalone/.next/server/app/api/unlock/route.js.nft.json +1 -1
  114. package/.next/standalone/.next/server/app/api/update/route.js +1 -1
  115. package/.next/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  116. package/.next/standalone/.next/server/app/api/update-images/route.js +3 -2
  117. package/.next/standalone/.next/server/app/api/update-images/route.js.nft.json +1 -1
  118. package/.next/standalone/.next/server/app/api/users/route.js +3 -2
  119. package/.next/standalone/.next/server/app/api/users/route.js.nft.json +1 -1
  120. package/.next/standalone/.next/server/app/avatars/[file]/route.js +2 -1
  121. package/.next/standalone/.next/server/app/avatars/[file]/route.js.nft.json +1 -1
  122. package/.next/standalone/.next/server/app/favicon.ico/route.js +2 -1
  123. package/.next/standalone/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  124. package/.next/standalone/.next/server/app/import/page.js.nft.json +1 -1
  125. package/.next/standalone/.next/server/app/import/page_client-reference-manifest.js +1 -1
  126. package/.next/standalone/.next/server/app/import.html +1 -1
  127. package/.next/standalone/.next/server/app/import.rsc +12 -12
  128. package/.next/standalone/.next/server/app/import.segments/_full.segment.rsc +12 -12
  129. package/.next/standalone/.next/server/app/import.segments/_tree.segment.rsc +1 -1
  130. package/.next/standalone/.next/server/app/import.segments/import/__PAGE__.segment.rsc +11 -11
  131. package/.next/standalone/.next/server/app/index.html +1 -1
  132. package/.next/standalone/.next/server/app/index.rsc +12 -12
  133. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +11 -11
  134. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +12 -12
  135. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  136. package/.next/standalone/.next/server/app/launch/page.js.nft.json +1 -1
  137. package/.next/standalone/.next/server/app/launch/page_client-reference-manifest.js +1 -1
  138. package/.next/standalone/.next/server/app/launch.html +2 -2
  139. package/.next/standalone/.next/server/app/launch.rsc +12 -12
  140. package/.next/standalone/.next/server/app/launch.segments/_full.segment.rsc +12 -12
  141. package/.next/standalone/.next/server/app/launch.segments/_tree.segment.rsc +1 -1
  142. package/.next/standalone/.next/server/app/launch.segments/launch/__PAGE__.segment.rsc +11 -11
  143. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  144. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  145. package/.next/standalone/.next/server/app/paths/page.js.nft.json +1 -1
  146. package/.next/standalone/.next/server/app/paths/page_client-reference-manifest.js +1 -1
  147. package/.next/standalone/.next/server/app/paths.html +1 -1
  148. package/.next/standalone/.next/server/app/paths.rsc +12 -12
  149. package/.next/standalone/.next/server/app/paths.segments/_full.segment.rsc +12 -12
  150. package/.next/standalone/.next/server/app/paths.segments/_tree.segment.rsc +1 -1
  151. package/.next/standalone/.next/server/app/paths.segments/paths/__PAGE__.segment.rsc +11 -11
  152. package/.next/standalone/.next/server/app/profile/page.js.nft.json +1 -1
  153. package/.next/standalone/.next/server/app/profile/page_client-reference-manifest.js +1 -1
  154. package/.next/standalone/.next/server/app/profile.html +1 -1
  155. package/.next/standalone/.next/server/app/profile.rsc +12 -12
  156. package/.next/standalone/.next/server/app/profile.segments/_full.segment.rsc +12 -12
  157. package/.next/standalone/.next/server/app/profile.segments/_tree.segment.rsc +1 -1
  158. package/.next/standalone/.next/server/app/profile.segments/profile/__PAGE__.segment.rsc +11 -11
  159. package/.next/standalone/.next/server/app/queue/page.js.nft.json +1 -1
  160. package/.next/standalone/.next/server/app/queue/page_client-reference-manifest.js +1 -1
  161. package/.next/standalone/.next/server/app/queue.html +1 -1
  162. package/.next/standalone/.next/server/app/queue.rsc +12 -12
  163. package/.next/standalone/.next/server/app/queue.segments/_full.segment.rsc +12 -12
  164. package/.next/standalone/.next/server/app/queue.segments/_tree.segment.rsc +1 -1
  165. package/.next/standalone/.next/server/app/queue.segments/queue/__PAGE__.segment.rsc +11 -11
  166. package/.next/standalone/.next/server/app/settings/page/app-paths-manifest.json +3 -0
  167. package/.next/standalone/.next/server/app/settings/page/build-manifest.json +20 -0
  168. package/.next/standalone/.next/server/app/settings/page/next-font-manifest.json +11 -0
  169. package/.next/standalone/.next/server/app/settings/page/react-loadable-manifest.json +1 -0
  170. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +4 -0
  171. package/.next/standalone/.next/server/app/settings/page.js +13 -0
  172. package/.next/standalone/.next/server/app/settings/page.js.map +5 -0
  173. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -0
  174. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +3 -0
  175. package/.next/standalone/.next/server/app/settings.html +1 -0
  176. package/.next/standalone/.next/server/app/settings.meta +26 -0
  177. package/.next/standalone/.next/server/app/settings.rsc +24 -0
  178. package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +24 -0
  179. package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +4 -0
  180. package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +28 -0
  181. package/.next/standalone/.next/server/app/setup/page.js.nft.json +1 -1
  182. package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  183. package/.next/standalone/.next/server/app/setup.html +1 -1
  184. package/.next/standalone/.next/server/app/setup.rsc +12 -12
  185. package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +12 -12
  186. package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +1 -1
  187. package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +11 -11
  188. package/.next/standalone/.next/server/app-paths-manifest.json +10 -0
  189. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-rnla2._.js +3 -0
  190. package/.next/standalone/.next/server/chunks/[root-of-the-server]__00la_y0._.js +3 -0
  191. package/.next/standalone/.next/server/chunks/[root-of-the-server]__07t47cm._.js +3 -0
  192. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cj5jqc._.js +3 -0
  193. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e0fei3._.js +3 -0
  194. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0i5hdu4._.js +3 -0
  195. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ljcioj._.js +3 -0
  196. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ljnyho._.js +3 -0
  197. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o5-tcg._.js +3 -0
  198. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qrnous._.js +3 -0
  199. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t3v1a1._.js +3 -0
  200. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0uag-k5._.js +8 -0
  201. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0um1uey._.js +3 -0
  202. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wmexuc._.js +3 -0
  203. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xu34sz._.js +3 -0
  204. package/.next/standalone/.next/server/chunks/[root-of-the-server]__133knx1._.js +3 -0
  205. package/.next/standalone/.next/server/chunks/[root-of-the-server]__14ou7j5._.js +3 -0
  206. package/.next/standalone/.next/server/chunks/[root-of-the-server]__15-17hl._.js +3 -0
  207. package/.next/standalone/.next/server/chunks/[root-of-the-server]__16iu0hv._.js +3 -0
  208. package/.next/standalone/.next/server/chunks/[root-of-the-server]__19b7mig._.js +3 -0
  209. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1bbcwub._.js +8 -0
  210. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1eris29._.js +3 -0
  211. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1gjo_cq._.js +3 -0
  212. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1kbl21f._.js +3 -0
  213. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qcm08_._.js +3 -0
  214. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1rphsdk._.js +3 -0
  215. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1t3rugi._.js +3 -0
  216. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1w25q0m._.js +3 -0
  217. package/.next/standalone/.next/server/chunks/_072jl0y._.js +3 -0
  218. package/.next/standalone/.next/server/chunks/_0lw8_i0._.js +3 -0
  219. package/.next/standalone/.next/server/chunks/_1_fynia._.js +21 -3
  220. package/.next/standalone/.next/server/chunks/_1fn30_l._.js +3 -0
  221. package/.next/standalone/.next/server/chunks/_1itd1o_._.js +2 -1
  222. package/.next/standalone/.next/server/chunks/_1iwkh8t._.js +1 -1
  223. package/.next/standalone/.next/server/chunks/_1mxn_lb._.js +3 -0
  224. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_company-scores_legacy_route_actions_1ncspu_.js +3 -0
  225. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_export_route_actions_1lkimty.js +3 -0
  226. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_import_route_actions_1eji0kd.js +3 -0
  227. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_restart_route_actions_00_-u6o.js +3 -0
  228. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_reveal_route_actions_0-moqtn.js +3 -0
  229. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_route_actions_0j0w5ep.js +3 -0
  230. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_settings_route_actions_1bpm9ac.js +3 -0
  231. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_settings_sector-preview_route_actions_0w79454.js +3 -0
  232. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_settings_sector-suggestions_route_actions_1eoqugp.js +3 -0
  233. package/.next/standalone/.next/server/chunks/lib_db-client_15le7cw.js +155 -0
  234. package/.next/standalone/.next/server/chunks/{lib_rpc_0mc73lk.js → lib_rpc_00tx2sm.js} +1 -1
  235. package/.next/standalone/.next/server/chunks/lib_rpc_02-qa4d.js +3 -0
  236. package/.next/standalone/.next/server/chunks/lib_rpc_02ndsg2.js +3 -0
  237. package/.next/standalone/.next/server/chunks/lib_rpc_08q5vp6.js +3 -0
  238. package/.next/standalone/.next/server/chunks/lib_rpc_0_8i3ft.js +3 -0
  239. package/.next/standalone/.next/server/chunks/lib_rpc_0c9d9ti.js +5 -2
  240. package/.next/standalone/.next/server/chunks/lib_rpc_0huvw-3.js +3 -0
  241. package/.next/standalone/.next/server/chunks/lib_rpc_0ip2vdh.js +3 -0
  242. package/.next/standalone/.next/server/chunks/lib_rpc_0jzisgh.js +3 -0
  243. package/.next/standalone/.next/server/chunks/lib_rpc_0yi9xvd.js +3 -0
  244. package/.next/standalone/.next/server/chunks/lib_rpc_1jyhd0o.js +3 -0
  245. package/.next/standalone/.next/server/chunks/lib_rpc_1kn59-i.js +3 -0
  246. package/.next/standalone/.next/server/chunks/lib_rpc_1q2jkza.js +3 -0
  247. package/.next/standalone/.next/server/chunks/lib_rpc_1vpm1sk.js +3 -0
  248. package/.next/standalone/.next/server/chunks/lib_rpc_1x6p_31.js +3 -0
  249. package/.next/standalone/.next/server/chunks/node_modules_next_1zc5q0a._.js +158 -0
  250. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0mocm6d._.js → [root-of-the-server]__0an6blh._.js} +3 -3
  251. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1m0255u._.js +3 -0
  252. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0bipr5s._.js → [root-of-the-server]__1z1j3ek._.js} +2 -2
  253. package/.next/standalone/.next/server/chunks/ssr/_07u8byv._.js +3 -0
  254. package/.next/standalone/.next/server/chunks/ssr/_08r_mlf._.js +3 -0
  255. package/.next/standalone/.next/server/chunks/ssr/{_0ggabjc._.js → _0942v8n._.js} +1 -1
  256. package/.next/standalone/.next/server/chunks/ssr/{_1djpk8t._.js → _0hl_t7r._.js} +2 -2
  257. package/.next/standalone/.next/server/chunks/ssr/_0tb83dw._.js +132 -0
  258. package/.next/standalone/.next/server/chunks/ssr/_1-87bs1._.js +3 -0
  259. package/.next/standalone/.next/server/chunks/ssr/_17gui6a._.js +1 -1
  260. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_11x4dq5.js +3 -0
  261. package/.next/standalone/.next/server/chunks/ssr/app_launch_page_19t0dyd.js +2 -2
  262. package/.next/standalone/.next/server/chunks/ssr/app_page_1fazqbf.js +4 -4
  263. package/.next/standalone/.next/server/chunks/ssr/app_profile_page_0u3-l5y.js +1 -1
  264. package/.next/standalone/.next/server/chunks/ssr/app_queue_page_0c6znd6.js +5 -5
  265. package/.next/standalone/.next/server/chunks/ssr/app_settings_page_1f8mjj_.js +3 -0
  266. package/.next/standalone/.next/server/chunks/ssr/app_setup_page_1-282zx.js +2 -2
  267. package/.next/standalone/.next/server/chunks/ssr/lib_0i8v-s3._.js +1 -1
  268. package/.next/standalone/.next/server/chunks/ssr/node_modules_1f8t_rp._.js +23 -0
  269. package/.next/standalone/.next/server/chunks/ssr/node_modules_1nkgb45._.js +2 -2
  270. package/.next/standalone/.next/server/chunks/ssr/{node_modules_01xbj_9._.js → node_modules_1wax83z._.js} +3 -3
  271. package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_00nap8h._.js → node_modules_next_dist_1bunoni._.js} +2 -2
  272. package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__0pco7a6._.js +2 -2
  273. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  274. package/.next/standalone/.next/server/middleware-manifest.json +15 -7
  275. package/.next/standalone/.next/server/next-font-manifest.js +1 -1
  276. package/.next/standalone/.next/server/next-font-manifest.json +4 -0
  277. package/.next/standalone/.next/server/pages/404.html +1 -1
  278. package/.next/standalone/.next/server/pages/500.html +1 -1
  279. package/.next/standalone/.next/server/prefetch-hints.json +14 -0
  280. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  281. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  282. package/.next/standalone/.next/static/chunks/06x3jiiz96m5t.js +1 -0
  283. package/.next/standalone/.next/static/chunks/{34at5d2ifl62i.js → 0ngx9s6-zgshe.js} +5 -5
  284. package/.next/standalone/.next/static/chunks/0q-_khndfxubv.js +2 -0
  285. package/.next/standalone/.next/static/chunks/1c79veqedvubt.js +1 -0
  286. package/.next/standalone/.next/static/chunks/1chp3nx45meg5.js +44 -0
  287. package/.next/standalone/.next/static/chunks/1irqj0lf-fu3d.js +1 -0
  288. package/.next/standalone/.next/static/chunks/1uadqylrod5_v.js +1 -0
  289. package/.next/standalone/.next/static/chunks/23u0zclgwpc4d.js +1 -0
  290. package/.next/standalone/.next/static/chunks/289ktj97di6zg.js +1 -0
  291. package/.next/standalone/.next/static/chunks/2b3lmf8e6uj8m.js +16 -0
  292. package/.next/standalone/.next/static/chunks/2jz311xl1pp_8.js +1 -0
  293. package/.next/standalone/.next/static/chunks/3npq5yd7c4dmn.js +2 -0
  294. package/.next/standalone/.next/static/qqqcxvzBUizkECrT4swyK/_clientMiddlewareManifest.js +14 -0
  295. package/.next/standalone/CHANGELOG.md +298 -0
  296. package/.next/standalone/CONTRIBUTING.md +5 -2
  297. package/.next/standalone/README.md +138 -30
  298. package/.next/standalone/SECURITY.md +117 -10
  299. package/.next/standalone/app/api/company-scores/legacy/route.js +32 -0
  300. package/.next/standalone/app/api/company-scores/route.js +20 -11
  301. package/.next/standalone/app/api/data/export/route.js +49 -0
  302. package/.next/standalone/app/api/data/import/route.js +83 -0
  303. package/.next/standalone/app/api/data/restart/route.js +37 -0
  304. package/.next/standalone/app/api/data/reveal/route.js +14 -0
  305. package/.next/standalone/app/api/data/route.js +39 -0
  306. package/.next/standalone/app/api/ingest/route.js +15 -47
  307. package/.next/standalone/app/api/scraper/route.js +264 -125
  308. package/.next/standalone/app/api/settings/route.js +58 -0
  309. package/.next/standalone/app/api/settings/sector-preview/route.js +38 -0
  310. package/.next/standalone/app/api/settings/sector-suggestions/route.js +20 -0
  311. package/.next/standalone/app/api/update/route.js +188 -23
  312. package/.next/standalone/app/avatars/[file]/route.js +4 -2
  313. package/.next/standalone/app/components/CompanyScores.js +28 -7
  314. package/.next/standalone/app/components/EmptyState.js +8 -0
  315. package/.next/standalone/app/components/ForceGraph.js +39 -35
  316. package/.next/standalone/app/components/LegacyScoresCard.js +129 -0
  317. package/.next/standalone/app/components/Sidebar.js +11 -10
  318. package/.next/standalone/app/components/UpdatePanel.js +306 -119
  319. package/.next/standalone/app/components/UserProvider.js +4 -3
  320. package/.next/standalone/app/components/settings/DataSection.js +437 -0
  321. package/.next/standalone/app/components/settings/SectorSection.js +445 -0
  322. package/.next/standalone/app/components/ui.js +62 -0
  323. package/.next/standalone/app/launch/page.js +30 -20
  324. package/.next/standalone/app/page.js +13 -0
  325. package/.next/standalone/app/paths/page.js +12 -4
  326. package/.next/standalone/app/profile/page.js +41 -8
  327. package/.next/standalone/app/queue/page.js +8 -2
  328. package/.next/standalone/app/settings/page.js +96 -0
  329. package/.next/standalone/app/setup/page.js +32 -16
  330. package/.next/standalone/bin/args.mjs +44 -0
  331. package/.next/standalone/bin/six-degrees.mjs +9 -15
  332. package/.next/standalone/lib/companies.js +44 -119
  333. package/.next/standalone/lib/csv.js +8 -0
  334. package/.next/standalone/lib/data-export.js +170 -0
  335. package/.next/standalone/lib/data-folder.js +238 -0
  336. package/.next/standalone/lib/data-import.js +878 -0
  337. package/.next/standalone/lib/db-client.js +48 -3
  338. package/.next/standalone/lib/durable.js +73 -0
  339. package/.next/standalone/lib/gate.js +90 -1
  340. package/.next/standalone/lib/ingest.js +40 -0
  341. package/.next/standalone/lib/legacy-offer.js +185 -0
  342. package/.next/standalone/lib/legacy-scores.js +77 -0
  343. package/.next/standalone/lib/linkedin-limits.js +124 -1
  344. package/.next/standalone/lib/rpc.js +121 -13
  345. package/.next/standalone/lib/sample-stats.js +16 -0
  346. package/.next/standalone/lib/scan-progress.js +13 -0
  347. package/.next/standalone/lib/scan-state.js +53 -0
  348. package/.next/standalone/lib/scanner-python.js +685 -0
  349. package/.next/standalone/lib/scanner-setup.js +104 -0
  350. package/.next/standalone/lib/scoring.js +747 -138
  351. package/.next/standalone/lib/scraper-client.js +9 -5
  352. package/.next/standalone/lib/sector-directory.js +1532 -0
  353. package/.next/standalone/lib/sector-focus.js +163 -0
  354. package/.next/standalone/lib/sector-labels.js +81 -0
  355. package/.next/standalone/lib/settings-effects.js +59 -0
  356. package/.next/standalone/lib/settings.js +83 -0
  357. package/.next/standalone/lib/updater-job.js +838 -0
  358. package/.next/standalone/lib/updater.js +494 -0
  359. package/.next/standalone/middleware.js +25 -28
  360. package/.next/standalone/next.config.mjs +19 -3
  361. package/.next/standalone/package-lock.json +2 -2
  362. package/.next/standalone/package.json +1 -2
  363. package/.next/standalone/scripts/apply-update.sh +482 -0
  364. package/.next/standalone/scripts/build-app.mjs +251 -9
  365. package/.next/standalone/scripts/requirements.txt +106 -4
  366. package/.next/standalone/scripts/test-release-server.mjs +143 -0
  367. package/.next/standalone/server.js +1 -1
  368. package/.next/static/chunks/06x3jiiz96m5t.js +1 -0
  369. package/.next/static/chunks/{34at5d2ifl62i.js → 0ngx9s6-zgshe.js} +5 -5
  370. package/.next/static/chunks/0q-_khndfxubv.js +2 -0
  371. package/.next/static/chunks/1c79veqedvubt.js +1 -0
  372. package/.next/static/chunks/1chp3nx45meg5.js +44 -0
  373. package/.next/static/chunks/1irqj0lf-fu3d.js +1 -0
  374. package/.next/static/chunks/1uadqylrod5_v.js +1 -0
  375. package/.next/static/chunks/23u0zclgwpc4d.js +1 -0
  376. package/.next/static/chunks/289ktj97di6zg.js +1 -0
  377. package/.next/static/chunks/2b3lmf8e6uj8m.js +16 -0
  378. package/.next/static/chunks/2jz311xl1pp_8.js +1 -0
  379. package/.next/static/chunks/3npq5yd7c4dmn.js +2 -0
  380. package/.next/static/qqqcxvzBUizkECrT4swyK/_clientMiddlewareManifest.js +14 -0
  381. package/CHANGELOG.md +298 -0
  382. package/README.md +138 -30
  383. package/SECURITY.md +117 -10
  384. package/bin/args.mjs +44 -0
  385. package/bin/six-degrees.mjs +9 -15
  386. package/lib/companies.js +44 -119
  387. package/lib/csv.js +8 -0
  388. package/lib/data-export.js +170 -0
  389. package/lib/data-folder.js +238 -0
  390. package/lib/data-import.js +878 -0
  391. package/lib/db-client.js +48 -3
  392. package/lib/durable.js +73 -0
  393. package/lib/gate.js +90 -1
  394. package/lib/ingest.js +40 -0
  395. package/lib/legacy-offer.js +185 -0
  396. package/lib/legacy-scores.js +77 -0
  397. package/lib/linkedin-limits.js +124 -1
  398. package/lib/rpc.js +121 -13
  399. package/lib/sample-stats.js +16 -0
  400. package/lib/scan-progress.js +13 -0
  401. package/lib/scan-state.js +53 -0
  402. package/lib/scanner-python.js +685 -0
  403. package/lib/scanner-setup.js +104 -0
  404. package/lib/scoring.js +747 -138
  405. package/lib/scraper-client.js +9 -5
  406. package/lib/sector-directory.js +1532 -0
  407. package/lib/sector-focus.js +163 -0
  408. package/lib/sector-labels.js +81 -0
  409. package/lib/settings-effects.js +59 -0
  410. package/lib/settings.js +83 -0
  411. package/lib/updater-job.js +838 -0
  412. package/lib/updater.js +494 -0
  413. package/package.json +1 -2
  414. package/scripts/requirements.txt +106 -4
  415. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0jrmmj-._.js +0 -150
  416. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qx548g._.js +0 -151
  417. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1an3leo._.js +0 -150
  418. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1m8zedk._.js +0 -155
  419. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1zor0ys._.js +0 -3
  420. package/.next/standalone/.next/server/chunks/_0_rp-01._.js +0 -3
  421. package/.next/standalone/.next/server/chunks/_0hzdk79._.js +0 -3
  422. package/.next/standalone/.next/server/chunks/_0ow7u5r._.js +0 -3
  423. package/.next/standalone/.next/server/chunks/_0t0zc2d._.js +0 -3
  424. package/.next/standalone/.next/server/chunks/_0wa631d._.js +0 -3
  425. package/.next/standalone/.next/server/chunks/_13ccnao._.js +0 -3
  426. package/.next/standalone/.next/server/chunks/_13es063._.js +0 -3
  427. package/.next/standalone/.next/server/chunks/_142872j._.js +0 -3
  428. package/.next/standalone/.next/server/chunks/_18wsb_a._.js +0 -8
  429. package/.next/standalone/.next/server/chunks/_1e-4h5h._.js +0 -3
  430. package/.next/standalone/.next/server/chunks/_1gvvd7n._.js +0 -158
  431. package/.next/standalone/.next/server/chunks/_1moda66._.js +0 -3
  432. package/.next/standalone/.next/server/chunks/_1p6ghzv._.js +0 -3
  433. package/.next/standalone/.next/server/chunks/_1xmmi_v._.js +0 -3
  434. package/.next/standalone/.next/server/chunks/_1z-yrlf._.js +0 -3
  435. package/.next/standalone/.next/server/chunks/ssr/_0bf3x4q._.js +0 -3
  436. package/.next/standalone/.next/server/chunks/ssr/app_paths_page_1ol90m7.js +0 -4
  437. package/.next/standalone/.next/static/ZGTiDrZ5NHGETgGdlhssu/_clientMiddlewareManifest.js +0 -6
  438. package/.next/standalone/.next/static/chunks/0jk64vo17avsb.js +0 -1
  439. package/.next/standalone/.next/static/chunks/0s65dsrthylo6.js +0 -2
  440. package/.next/standalone/.next/static/chunks/0uyfdhi8dek85.js +0 -16
  441. package/.next/standalone/.next/static/chunks/220-ne82aus0c.js +0 -44
  442. package/.next/standalone/.next/static/chunks/229haorf0f19b.js +0 -2
  443. package/.next/standalone/.next/static/chunks/2g54uafnwuakc.js +0 -1
  444. package/.next/standalone/.next/static/chunks/2spwqs6b6dx13.js +0 -1
  445. package/.next/standalone/.next/static/chunks/38dlepuubiox0.js +0 -1
  446. package/.next/standalone/scripts/score-connections.sql +0 -80
  447. package/.next/standalone/scripts/score_new_connections.sql +0 -77
  448. package/.next/standalone/site/app.js +0 -84
  449. package/.next/standalone/site/index.html +0 -221
  450. package/.next/standalone/site/style.css +0 -155
  451. package/.next/standalone/site/video/install-mac-poster.jpg +0 -0
  452. package/.next/standalone/site/video/install-mac.mp4 +0 -0
  453. package/.next/standalone/site/video/linux-poster.jpg +0 -0
  454. package/.next/standalone/site/video/linux.mp4 +0 -0
  455. package/.next/standalone/site/video/scan-poster.jpg +0 -0
  456. package/.next/standalone/site/video/scan.mp4 +0 -0
  457. package/.next/static/ZGTiDrZ5NHGETgGdlhssu/_clientMiddlewareManifest.js +0 -6
  458. package/.next/static/chunks/0jk64vo17avsb.js +0 -1
  459. package/.next/static/chunks/0s65dsrthylo6.js +0 -2
  460. package/.next/static/chunks/0uyfdhi8dek85.js +0 -16
  461. package/.next/static/chunks/220-ne82aus0c.js +0 -44
  462. package/.next/static/chunks/229haorf0f19b.js +0 -2
  463. package/.next/static/chunks/2g54uafnwuakc.js +0 -1
  464. package/.next/static/chunks/2spwqs6b6dx13.js +0 -1
  465. package/.next/static/chunks/38dlepuubiox0.js +0 -1
  466. package/scripts/score_new_connections.sql +0 -77
  467. /package/.next/standalone/.next/static/{ZGTiDrZ5NHGETgGdlhssu → qqqcxvzBUizkECrT4swyK}/_buildManifest.js +0 -0
  468. /package/.next/standalone/.next/static/{ZGTiDrZ5NHGETgGdlhssu → qqqcxvzBUizkECrT4swyK}/_ssgManifest.js +0 -0
  469. /package/.next/static/{ZGTiDrZ5NHGETgGdlhssu → qqqcxvzBUizkECrT4swyK}/_buildManifest.js +0 -0
  470. /package/.next/static/{ZGTiDrZ5NHGETgGdlhssu → qqqcxvzBUizkECrT4swyK}/_ssgManifest.js +0 -0
@@ -0,0 +1,163 @@
1
+ // Your sector (Settings): up to three sectors you work in, and how hard to
2
+ // lean toward them. Companies in them get +1 ("lean") or +2 ("strong") on
3
+ // their score, so the people there rank higher. A pick is one of the twelve
4
+ // broad industries (lib/companies.js INDUSTRIES), which a company matches by
5
+ // its one industry or by any of the industry's sectors, or a narrower sector
6
+ // from the directory (lib/sector-directory.js), which it matches by the
7
+ // directory's words. The
8
+ // model itself is in lib/scoring.js (companyScore); this file is the setting
9
+ // around it: what a valid choice is, the fingerprint the stored scores are
10
+ // stamped with, and the dry run the page shows before you save (which a save
11
+ // also reports).
12
+ //
13
+ // Pure functions; tests/sector.test.mjs pins them down.
14
+
15
+ import { readNetwork, scoreNetwork, SECTOR_BONUS } from './scoring.js';
16
+ import { SECTOR_KEYS, DIRECTORY_VERSION, sectorMatcher, sectorGroup } from './sector-directory.js';
17
+ import { TIER_ORDER } from './tiers.js';
18
+
19
+ export const MAX_SECTORS = 3;
20
+ export const STRENGTHS = Object.keys(SECTOR_BONUS);
21
+
22
+ /** Nothing chosen: the model as it is for everyone else. */
23
+ export const NO_FOCUS = Object.freeze({ sectors: Object.freeze([]), strength: 'lean' });
24
+
25
+ /**
26
+ * A sector focus as sent by the page → a clean one, or an Error whose message
27
+ * can be shown as is. Sectors are broad industry keys (the ones the rest of
28
+ * the app infers) and the directory's keys, deduplicated and kept in one
29
+ * order (each industry, then its sectors), so the same choice always stores
30
+ * the same way. A choice saved before the directory, of industries only,
31
+ * reads exactly as it did.
32
+ */
33
+ export function parseSectorFocus(value) {
34
+ if (value === null || value === undefined) return { sectors: [], strength: 'lean' };
35
+ if (typeof value !== 'object' || Array.isArray(value)) throw new Error('Your sector must be a choice of sectors and a strength.');
36
+ const raw = value.sectors ?? [];
37
+ if (!Array.isArray(raw)) throw new Error('Sectors must be a list.');
38
+ for (const s of raw) {
39
+ if (!SECTOR_KEYS.includes(s)) throw new Error(`There is no sector called '${String(s).slice(0, 40)}'.`);
40
+ }
41
+ const sectors = SECTOR_KEYS.filter((k) => raw.includes(k));
42
+ if (sectors.length > MAX_SECTORS) throw new Error(`Pick up to ${MAX_SECTORS} sectors.`);
43
+ const strength = value.strength ?? 'lean';
44
+ if (!STRENGTHS.includes(strength)) throw new Error('Strength is lean or strong.');
45
+ return { sectors, strength };
46
+ }
47
+
48
+ /** How Settings declares it (lib/settings.js). */
49
+ export const SECTOR_FOCUS_SETTING = { default: NO_FOCUS, parse: parseSectorFocus };
50
+
51
+ /**
52
+ * A short, stable string for a focus, stamped beside the stored scores
53
+ * (app_meta 'scoring_focus'). If the saved focus stops matching it (a
54
+ * restored or imported database, a save whose rescore never finished, an
55
+ * update that changed the directory's words), the scores are stale and are
56
+ * recomputed on the next load. Every pick matches by the directory's word
57
+ * lists (a broad industry includes its sectors), so the fingerprint carries
58
+ * the directory's version: "lean:health,dental@<version>". Stamps from before
59
+ * a broad industry included its sectors ("lean:media,tech") no longer match,
60
+ * so those scores are redone once. `version` is for tests.
61
+ */
62
+ export function focusFingerprint(focus, { version = DIRECTORY_VERSION } = {}) {
63
+ let f;
64
+ try { f = parseSectorFocus(focus); } catch { return 'none'; }
65
+ if (!f.sectors.length) return 'none';
66
+ return `${f.strength}:${f.sectors.join(',')}@${version}`;
67
+ }
68
+
69
+ export const sameFocus = (a, b) => focusFingerprint(a) === focusFingerprint(b);
70
+
71
+ const RANK = Object.fromEntries(TIER_ORDER.map((t, i) => [t, TIER_ORDER.length - i]));
72
+
73
+ /**
74
+ * Who changes tier between two scorings of the same rows. People are counted
75
+ * once (by profile URL) at their closest degree, the row the map shows.
76
+ * `tierBefore(row)` / `tierAfter(row)` return a tier letter or nothing.
77
+ * @returns { people, up, down, examples: [{ name, degree, company, from, to }] }
78
+ * people is how many people the rows are (a person can be several rows).
79
+ */
80
+ export function tierMoves(rows, tierBefore, tierAfter, { examples = 5, companyOf } = {}) {
81
+ const people = new Map();
82
+ for (const r of rows) {
83
+ const key = r.profile_url || `id:${r.id}`;
84
+ const prev = people.get(key);
85
+ if (!prev || (r.degree || 9) < (prev.degree || 9)) people.set(key, r);
86
+ }
87
+ const moves = [];
88
+ for (const r of people.values()) {
89
+ const from = tierBefore(r);
90
+ const to = tierAfter(r);
91
+ if (!to || from === to) continue;
92
+ moves.push({ r, from: from || null, to, up: (RANK[to] || 0) > (RANK[from] || 0) });
93
+ }
94
+ // The most telling first: into the highest tier, then out of the highest.
95
+ // When people move both ways, both show.
96
+ const ups = moves.filter((m) => m.up).sort((a, b) => RANK[b.to] - RANK[a.to] || (a.r.degree || 9) - (b.r.degree || 9));
97
+ const downs = moves.filter((m) => !m.up).sort((a, b) => (RANK[b.from] || 0) - (RANK[a.from] || 0) || (a.r.degree || 9) - (b.r.degree || 9));
98
+ const nUp = Math.min(ups.length, examples - Math.min(downs.length, Math.floor(examples / 2)));
99
+ const nDown = Math.min(downs.length, examples - nUp);
100
+ const pick = [...ups.slice(0, nUp), ...downs.slice(0, nDown)];
101
+ return {
102
+ people: people.size,
103
+ up: ups.length,
104
+ down: downs.length,
105
+ examples: pick.map((m) => ({
106
+ name: m.r.name || 'Someone',
107
+ degree: m.r.degree || null,
108
+ company: companyOf?.(m.r) || null,
109
+ from: m.from,
110
+ to: m.to,
111
+ })),
112
+ };
113
+ }
114
+
115
+ /**
116
+ * What changing the sector focus from `from` to `to` does to these rows,
117
+ * worked out in memory: every headline read once (the slow part), then the
118
+ * network scored once per focus. Nothing is written. Settings shows it before
119
+ * you save, with `from` the focus saved now; the save reports it afterwards
120
+ * (lib/rpc.js rescoreAll's compareWith), so what the preview says and what
121
+ * the save says are the same count. `overrides` are your company scores, and
122
+ * `industryOf`, `sectorsOf` and `groupOf` the injected inference and sector
123
+ * directory, as rescoreAll passes them (lib/rpc.js readForScoring); `read` is
124
+ * readNetwork() of these rows, when they have been read already.
125
+ * @returns { scored, people, companies, companiesUp, companiesDown, companyExamples, up, down, examples }
126
+ * scored counts rows and people counts people; companies are those whose
127
+ * score moves, up/down the people whose tier does.
128
+ */
129
+ export function previewSectorFocus(rows = [], {
130
+ overrides = new Map(), industryOf, sectorsOf = sectorMatcher(), groupOf = sectorGroup, from = NO_FOCUS, to = NO_FOCUS, examples = 5,
131
+ read = readNetwork(rows, { industryOf, sectorsOf, groupOf }),
132
+ } = {}) {
133
+ const before = scoreNetwork(rows, { overrides, focus: from, read });
134
+ const after = scoreNetwork(rows, { overrides, focus: to, read });
135
+
136
+ // Companies whose score moves, biggest first (by your people there now).
137
+ // Every company anyone names counts, a former employer too: its score moves
138
+ // like any other, and it can be the role that moves the person who named it.
139
+ // `sector` is the pick that leans the company (in either focus), else its industry.
140
+ const changed = [];
141
+ for (const [name, a] of before.companyScores) {
142
+ const b = after.companyScores.get(name);
143
+ if (!name || !b || a.score === b.score) continue;
144
+ const sector = b.sector || a.sector || read.companies.get(name)?.industry;
145
+ changed.push({ name, from: a.score, to: b.score, sector, people: read.headcount.get(name) || 0 });
146
+ }
147
+ changed.sort((x, y) => y.people - x.people || x.name.localeCompare(y.name));
148
+
149
+ const moved = tierMoves(rows,
150
+ (r) => before.scores.get(r.id)?.tier,
151
+ (r) => after.scores.get(r.id)?.tier,
152
+ { examples, companyOf: (r) => after.scores.get(r.id)?.company });
153
+
154
+ // `people` comes with the tier moves: people once each, as they are counted.
155
+ return {
156
+ scored: rows.length,
157
+ companies: changed.length,
158
+ companiesUp: changed.filter((c) => c.to > c.from).length,
159
+ companiesDown: changed.filter((c) => c.to < c.from).length,
160
+ companyExamples: changed.slice(0, examples).map(({ name, from: a, to: b, sector }) => ({ name, from: a, to: b, sector })),
161
+ ...moved,
162
+ };
163
+ }
@@ -0,0 +1,81 @@
1
+ // Each pick's label, colour, industry and kind, for pages that only name a
2
+ // pick (the profile's "Your Sectors"). The sector directory
3
+ // (lib/sector-directory.js) holds the same labels beside its word lists, which
4
+ // make it about 100 KB; a page that names a pick loads this instead.
5
+ // tests/sector-directory.test.mjs checks that the two agree.
6
+
7
+ import { INDUSTRIES, UNKNOWN_INDUSTRY } from './companies.js';
8
+
9
+ // The directory's sectors: key → [label, the industry it sits under, kind].
10
+ const SECTORS = {
11
+ software: ['Software & SaaS', 'tech', 'function'],
12
+ 'ai-data': ['AI & Data', 'tech', 'function'],
13
+ cybersecurity: ['Cybersecurity', 'tech', 'function'],
14
+ telecom: ['Telecom', 'tech', 'industry'],
15
+ fintech: ['Fintech & Payments', 'finance', 'industry'],
16
+ banking: ['Banking & Lending', 'finance', 'industry'],
17
+ 'vc-pe': ['Venture Capital & Private Equity', 'finance', 'industry'],
18
+ wealth: ['Wealth & Asset Management', 'finance', 'industry'],
19
+ insurance: ['Insurance', 'finance', 'industry'],
20
+ accounting: ['Accounting & Tax', 'finance', 'function'],
21
+ crypto: ['Crypto & Web3', 'finance', 'industry'],
22
+ hospitals: ['Hospitals & Clinics', 'health', 'industry'],
23
+ dental: ['Dental', 'health', 'industry'],
24
+ 'pharma-biotech': ['Pharma & Biotech', 'health', 'industry'],
25
+ 'medical-devices': ['Medical Devices', 'health', 'industry'],
26
+ 'mental-health': ['Mental Health', 'health', 'industry'],
27
+ 'fitness-wellness': ['Fitness & Wellness', 'health', 'industry'],
28
+ veterinary: ['Veterinary & Animal Care', 'health', 'industry'],
29
+ k12: ['K-12 Education', 'education', 'industry'],
30
+ 'higher-ed': ['Higher Education', 'education', 'industry'],
31
+ 'marketing-advertising': ['Marketing & Advertising', 'media', 'function'],
32
+ 'pr-comms': ['PR & Communications', 'media', 'function'],
33
+ 'media-publishing': ['Media & Publishing', 'media', 'industry'],
34
+ 'creator-economy': ['Creator Economy', 'media', 'industry'],
35
+ 'film-tv-music': ['Film, TV & Music', 'entertainment', 'industry'],
36
+ 'gaming-esports': ['Gaming & Esports', 'entertainment', 'industry'],
37
+ sports: ['Sports', 'entertainment', 'industry'],
38
+ 'ecommerce-retail': ['E-commerce & Retail', 'consumer', 'industry'],
39
+ 'consumer-goods': ['Consumer Goods', 'consumer', 'industry'],
40
+ restaurants: ['Restaurants & Food Service', 'consumer', 'industry'],
41
+ 'hospitality-travel': ['Hospitality & Travel', 'consumer', 'industry'],
42
+ 'beauty-personal-care': ['Beauty & Personal Care', 'consumer', 'industry'],
43
+ logistics: ['Logistics & Supply Chain', 'industry', 'industry'],
44
+ manufacturing: ['Manufacturing', 'industry', 'industry'],
45
+ energy: ['Energy & Utilities', 'industry', 'industry'],
46
+ automotive: ['Automotive', 'industry', 'industry'],
47
+ agriculture: ['Agriculture & Farming', 'industry', 'industry'],
48
+ 'aerospace-defense': ['Aerospace & Defense', 'defense', 'industry'],
49
+ military: ['Military', 'defense', 'industry'],
50
+ government: ['Government & Public Sector', 'defense', 'industry'],
51
+ legal: ['Legal', 'consulting', 'function'],
52
+ 'management-consulting': ['Management Consulting', 'consulting', 'function'],
53
+ 'hr-recruiting': ['HR & Recruiting', 'consulting', 'function'],
54
+ 'security-services': ['Security Services', 'consulting', 'function'],
55
+ 'real-estate': ['Real Estate', 'realestate', 'industry'],
56
+ 'construction-trades': ['Construction & Trades', 'realestate', 'industry'],
57
+ charities: ['Nonprofits & Charities', 'nonprofit', 'industry'],
58
+ 'social-work': ['Social Work & Human Services', 'nonprofit', 'industry'],
59
+ faith: ['Faith & Ministry', 'nonprofit', 'industry'],
60
+ };
61
+
62
+ const COLOR = new Map(INDUSTRIES.map((g) => [g.key, g.color]));
63
+
64
+ const BY_KEY = new Map([
65
+ ...INDUSTRIES.map((g) => [g.key, Object.freeze({ key: g.key, label: g.label, color: g.color, group: g.key, kind: 'industry' })]),
66
+ ...Object.entries(SECTORS).map(([key, [label, group, kind]]) => [key, Object.freeze({
67
+ key, label, color: COLOR.get(group) || UNKNOWN_INDUSTRY.color, group, kind,
68
+ })]),
69
+ ]);
70
+
71
+ /**
72
+ * A pick's label and colour, for a broad industry or a directory sector, with
73
+ * the industry it sits under and its kind: 'function' for a directory sector
74
+ * of work every company has (HR & Recruiting, Legal…), else 'industry'.
75
+ */
76
+ export function sectorByKey(key) {
77
+ return BY_KEY.get(key) || { key, label: UNKNOWN_INDUSTRY.label, color: UNKNOWN_INDUSTRY.color, group: null, kind: null };
78
+ }
79
+
80
+ /** A pick's label, or nothing for a key that isn't one. */
81
+ export const sectorLabel = (key) => BY_KEY.get(key)?.label;
@@ -0,0 +1,59 @@
1
+ // What saving a setting sets in motion. lib/settings.js only stores; the work a
2
+ // change causes lives here, so the store needs none of the modules that work
3
+ // uses (rescoring reads the settings itself, which would otherwise go in a
4
+ // circle). A setting with no entry here is simply saved.
5
+
6
+ import { rescoreAll } from './rpc.js';
7
+ import { sameFocus, NO_FOCUS } from './sector-focus.js';
8
+
9
+ // Each entry: `changed(before, after)` says whether a change matters (by
10
+ // default, any change to the stored value), and `run(db, after, before)` does
11
+ // the work and returns what to tell the page.
12
+ const EFFECTS = {
13
+ sectorFocus: {
14
+ // Only a change to what scoring uses: a strength with no sectors picked
15
+ // scores exactly like nothing picked, so it saves without a rescore.
16
+ changed: (before, after) => !sameFocus(before, after),
17
+ // Scores depend on the sector focus, so everyone is rescored, as when a
18
+ // company score changes (app/api/company-scores). The answer says how many
19
+ // people changed tier, counted by the preview's own function from the same
20
+ // rows (rescoreAll's compareWith), so it says what the preview said.
21
+ run(db, after, before) {
22
+ try {
23
+ const { scored, people, up, down } = rescoreAll({ compareWith: before ?? NO_FOCUS });
24
+ return { scored, people, moved: up + down, up, down };
25
+ } catch (err) {
26
+ // The choice is saved and the old scores are stamped with the old
27
+ // choice, so the next load of the map sees they are stale and retries.
28
+ throw new Error(`Saved, but rescoring your network failed (${err.message}). It will try again the next time the map loads.`);
29
+ }
30
+ },
31
+ },
32
+ };
33
+
34
+ const differs = (before, after) => JSON.stringify(before) !== JSON.stringify(after);
35
+
36
+ /**
37
+ * Run what each changed setting sets in motion. `before` and `after` are full
38
+ * settings objects as lib/settings.js returns them; `effects` defaults to the
39
+ * app's own (tests pass their own, as with lib/settings.js's schema).
40
+ * Every changed setting's work runs, even after another's fails.
41
+ * @returns { [setting]: its result } for those that ran, or null when none did.
42
+ * @throws an Error whose message names every failure, with `.effects` holding
43
+ * the results of those that did run (or null).
44
+ */
45
+ export function afterSettingsChange(db, before, after, effects = EFFECTS) {
46
+ let out = null;
47
+ const failed = [];
48
+ for (const [name, { changed = differs, run }] of Object.entries(effects)) {
49
+ if (!changed(before?.[name], after?.[name])) continue;
50
+ try {
51
+ const result = run(db, after?.[name], before?.[name]);
52
+ out = { ...out, [name]: result };
53
+ } catch (err) {
54
+ failed.push(err.message);
55
+ }
56
+ }
57
+ if (failed.length) throw Object.assign(new Error(failed.join(' ')), { effects: out });
58
+ return out;
59
+ }
@@ -0,0 +1,83 @@
1
+ // What the user chose on the Settings page.
2
+ //
3
+ // Kept in the database, not the browser: the browser's storage belongs to one
4
+ // window's address and port (and in the Mac app lives outside the data
5
+ // folder), so it would not travel with an export, a backup or a new computer.
6
+ // Everything sits in one JSON object under app_meta 'settings'.
7
+ //
8
+ // Each setting a feature adds declares itself in SETTINGS below: its default,
9
+ // and a parse() that returns the cleaned value or throws a plain-English
10
+ // error. A key that isn't declared is refused, so a stale page or a stray
11
+ // request can't plant values nothing reads.
12
+
13
+ import { SECTOR_FOCUS_SETTING } from './sector-focus.js';
14
+
15
+ export const SETTINGS = {
16
+ // Settings → Your sector: industries whose companies count for more (lib/sector-focus.js).
17
+ sectorFocus: SECTOR_FOCUS_SETTING,
18
+ };
19
+
20
+ const KEY = 'settings';
21
+
22
+ /** A setting the user sent that can't be accepted; its message is shown as is. */
23
+ export class SettingsError extends Error {}
24
+
25
+ /** The stored object exactly as saved, keys this version doesn't know included. */
26
+ function readStored(db) {
27
+ const row = db.prepare('SELECT value FROM app_meta WHERE key = ?').get(KEY);
28
+ if (!row?.value) return {};
29
+ try {
30
+ const parsed = JSON.parse(row.value);
31
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) return parsed;
32
+ } catch {
33
+ // A damaged value reads as "nothing chosen" rather than breaking every
34
+ // page. The next save overwrites it.
35
+ }
36
+ return {};
37
+ }
38
+
39
+ /** The stored settings, with defaults for anything never set. */
40
+ export function readSettings(db, schema = SETTINGS) {
41
+ const stored = readStored(db);
42
+ const out = {};
43
+ for (const [name, def] of Object.entries(schema)) {
44
+ let value = def.default;
45
+ if (Object.hasOwn(stored, name)) {
46
+ try { value = def.parse(stored[name]); } catch { value = def.default; }
47
+ }
48
+ out[name] = value;
49
+ }
50
+ return out;
51
+ }
52
+
53
+ /**
54
+ * Apply a partial change, validated, and store it.
55
+ *
56
+ * Only the settings in the patch are written. Everything else stays exactly as
57
+ * it was stored, including settings this version doesn't know and values it
58
+ * can't read: a newer copy (a beta, or an update on another Mac that shares the
59
+ * data) may have saved them, and an older copy saving its own choice must not
60
+ * erase them.
61
+ *
62
+ * @returns the full settings after the change.
63
+ * @throws SettingsError with a message fit to show the user; nothing is written.
64
+ */
65
+ export function writeSettings(db, patch, schema = SETTINGS) {
66
+ if (!patch || typeof patch !== 'object' || Array.isArray(patch)) {
67
+ throw new SettingsError('Settings must be an object.');
68
+ }
69
+ const changes = {};
70
+ for (const [name, value] of Object.entries(patch)) {
71
+ // Own keys only: 'constructor' or 'toString' aren't settings.
72
+ const def = Object.hasOwn(schema, name) ? schema[name] : null;
73
+ if (!def) throw new SettingsError(`There is no setting called '${name}'.`);
74
+ try {
75
+ changes[name] = def.parse(value);
76
+ } catch (err) {
77
+ throw new SettingsError(err.message);
78
+ }
79
+ }
80
+ db.prepare(`INSERT INTO app_meta (key, value) VALUES (?, ?)
81
+ ON CONFLICT(key) DO UPDATE SET value = excluded.value`).run(KEY, JSON.stringify({ ...readStored(db), ...changes }));
82
+ return readSettings(db, schema);
83
+ }