hunter-mate 0.1.15 → 0.1.17

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 (654) hide show
  1. package/dist/assets/extension/background/service-worker.20261001153649.js +4618 -0
  2. package/dist/assets/extension/background/service-worker.js +536 -99
  3. package/dist/assets/extension/build-info.json +1 -1
  4. package/dist/assets/extension/content/index.js +2 -2
  5. package/dist/assets/extension/icons/icon128.png +0 -0
  6. package/dist/assets/extension/manifest.json +7 -3
  7. package/dist/assets/extension/offscreen/offscreen.html +1 -1
  8. package/dist/assets/extension/offscreen/offscreen.js +269 -117
  9. package/dist/assets/extension/package.json +2 -1
  10. package/dist/assets/extension/sidepanel/index.css +1 -1
  11. package/dist/assets/extension/sidepanel/index.html +1 -1
  12. package/dist/assets/extension/sidepanel/index.js +27 -10
  13. package/dist/assets/server/chunks/chunk-EKKMDS42.mjs +26 -0
  14. package/dist/assets/server/chunks/chunk-GNM26E3H.mjs +54 -0
  15. package/dist/assets/server/chunks/chunk-IXYSL3NT.mjs +567 -0
  16. package/dist/assets/server/chunks/chunk-SAJB6JRK.mjs +14421 -0
  17. package/dist/assets/server/chunks/chunk-U7FVFSKP.mjs +1565 -0
  18. package/dist/assets/server/chunks/esm-4U746B76.mjs +29 -0
  19. package/dist/assets/server/chunks/getMachineId-bsd-L5TFP6QC.mjs +46 -0
  20. package/dist/assets/server/chunks/getMachineId-darwin-OY4E7LEK.mjs +45 -0
  21. package/dist/assets/server/chunks/getMachineId-linux-NSVVMJTW.mjs +39 -0
  22. package/dist/assets/server/chunks/getMachineId-unsupported-WBPZVDKV.mjs +29 -0
  23. package/dist/assets/server/chunks/getMachineId-win-LGO5ETVN.mjs +48 -0
  24. package/dist/assets/server/chunks/script-rule-ANR2J7E6.mjs +14 -0
  25. package/dist/assets/server/main.mjs +302490 -0
  26. package/dist/index.js +72986 -174
  27. package/dist/postinstall.js +221 -27
  28. package/dist/watchdog.js +324 -233
  29. package/dist/web/dist/404.html +1 -1
  30. package/dist/web/dist/_next/static/chunks/170-b66b6f731381943e.js +1 -0
  31. package/dist/web/dist/_next/static/chunks/{589-d632233641f35681.js → 589-5e99e548a0ee6bac.js} +1 -1
  32. package/dist/web/dist/_next/static/chunks/686-ade57c57a1737818.js +1 -0
  33. package/dist/web/dist/_next/static/chunks/{935-99f57b7d4151d9e7.js → 935-bb4adb3868af4cd4.js} +2 -2
  34. package/dist/web/dist/_next/static/chunks/{a7067448-96dd4b8457c447e8.js → a7067448-d3882c7e74c162bf.js} +1 -1
  35. package/dist/web/dist/_next/static/chunks/app/_not-found/{page-fdf1a13a7656886a.js → page-cf5ab201496f0914.js} +1 -1
  36. package/dist/web/dist/_next/static/chunks/app/admin/data/page-37e01dad70306bf3.js +1 -0
  37. package/dist/web/dist/_next/static/chunks/app/auth/verify/page-38fa28a48f76defa.js +1 -0
  38. package/dist/web/dist/_next/static/chunks/app/companies/page-985002eea5b295d0.js +1 -0
  39. package/dist/web/dist/_next/static/chunks/app/company/admin/page-8c7ecc92bef09e92.js +1 -0
  40. package/dist/web/dist/_next/static/chunks/app/entity/{page-250f8a9b6d91ab19.js → page-dc9664fb628e2d08.js} +1 -1
  41. package/dist/web/dist/_next/static/chunks/app/jobs/page-e39b3e25f0a81254.js +1 -0
  42. package/dist/web/dist/_next/static/chunks/app/layout-d094dc654772bf32.js +1 -0
  43. package/dist/web/dist/_next/static/chunks/app/logs/{page-d478031d49f7ba00.js → page-ccc6bb863cf77e56.js} +1 -1
  44. package/dist/web/dist/_next/static/chunks/app/matching/jobs/[id]/talents/page-936f6190c968d20b.js +1 -0
  45. package/dist/web/dist/_next/static/chunks/app/matching/portraits/[id]/jobs/page-ea44a2236bd53cae.js +1 -0
  46. package/dist/web/dist/_next/static/chunks/app/page-41d8e008a9411221.js +1 -0
  47. package/dist/web/dist/_next/static/chunks/app/parselog/page-3f756bbd580f337e.js +1 -0
  48. package/dist/web/dist/_next/static/chunks/app/recordings/page-ffd507b12e67f2db.js +1 -0
  49. package/dist/web/dist/_next/static/chunks/app/resource-usage/page-3b8bd27536a7889a.js +1 -0
  50. package/dist/web/dist/_next/static/chunks/app/snapshots/[id]/agent-prompt/page-c89b32aa2ef509f5.js +1 -0
  51. package/dist/web/dist/_next/static/chunks/app/talents/page-8e0b4072df138fa3.js +1 -0
  52. package/dist/web/dist/_next/static/chunks/{main-app-74b80a6877b21dfc.js → main-app-d053d37cc3b76ace.js} +1 -1
  53. package/dist/web/dist/_next/static/chunks/{main-5a4e0cd75dd7f04b.js → main-ead3ac50aa4bc931.js} +1 -1
  54. package/dist/web/dist/_next/static/chunks/pages/{_app-638dc63058a49a9c.js → _app-e11d02a41d9f3cb9.js} +2 -2
  55. package/dist/web/dist/_next/static/chunks/webpack-cf21e951181fd345.js +1 -0
  56. package/dist/web/dist/_next/static/css/1dd88e02ef1af7b9.css +3 -0
  57. package/dist/web/dist/admin/data.html +1 -0
  58. package/dist/web/dist/admin/data.txt +7 -0
  59. package/dist/web/dist/auth/verify.html +1 -1
  60. package/dist/web/dist/auth/verify.txt +3 -3
  61. package/dist/web/dist/companies.html +1 -1
  62. package/dist/web/dist/companies.txt +3 -3
  63. package/dist/web/dist/company/admin.html +1 -0
  64. package/dist/web/dist/company/admin.txt +7 -0
  65. package/dist/web/dist/entity.html +1 -1
  66. package/dist/web/dist/entity.txt +3 -3
  67. package/dist/web/dist/index.html +1 -1
  68. package/dist/web/dist/index.txt +3 -3
  69. package/dist/web/dist/jobs.html +1 -1
  70. package/dist/web/dist/jobs.txt +7 -6
  71. package/dist/web/dist/logs.html +1 -1
  72. package/dist/web/dist/logs.txt +3 -3
  73. package/dist/web/dist/matching/jobs/placeholder/talents.html +1 -1
  74. package/dist/web/dist/matching/jobs/placeholder/talents.txt +3 -3
  75. package/dist/web/dist/matching/portraits/placeholder/jobs.html +1 -1
  76. package/dist/web/dist/matching/portraits/placeholder/jobs.txt +3 -3
  77. package/dist/web/dist/parselog.html +1 -1
  78. package/dist/web/dist/parselog.txt +3 -3
  79. package/dist/web/dist/recordings.html +1 -1
  80. package/dist/web/dist/recordings.txt +3 -3
  81. package/dist/web/dist/resource-usage.html +1 -0
  82. package/dist/web/dist/resource-usage.txt +8 -0
  83. package/dist/web/dist/snapshots/placeholder/agent-prompt.html +1 -1
  84. package/dist/web/dist/snapshots/placeholder/agent-prompt.txt +3 -3
  85. package/dist/web/dist/talents.html +1 -1
  86. package/dist/web/dist/talents.txt +3 -3
  87. package/package.json +18 -15
  88. package/dist/assets/server/agent-session/agent-session.controller.d.ts +0 -32
  89. package/dist/assets/server/agent-session/agent-session.controller.js +0 -83
  90. package/dist/assets/server/agent-session/agent-session.controller.js.map +0 -1
  91. package/dist/assets/server/agent-session/agent-session.guard.d.ts +0 -4
  92. package/dist/assets/server/agent-session/agent-session.guard.js +0 -32
  93. package/dist/assets/server/agent-session/agent-session.guard.js.map +0 -1
  94. package/dist/assets/server/agent-session/agent-session.module.d.ts +0 -2
  95. package/dist/assets/server/agent-session/agent-session.module.js +0 -28
  96. package/dist/assets/server/agent-session/agent-session.module.js.map +0 -1
  97. package/dist/assets/server/agent-session/agent-session.service.d.ts +0 -54
  98. package/dist/assets/server/agent-session/agent-session.service.js +0 -431
  99. package/dist/assets/server/agent-session/agent-session.service.js.map +0 -1
  100. package/dist/assets/server/agent-session/agent-session.types.d.ts +0 -56
  101. package/dist/assets/server/agent-session/agent-session.types.js +0 -3
  102. package/dist/assets/server/agent-session/agent-session.types.js.map +0 -1
  103. package/dist/assets/server/agent-session/entities/agent-event.entity.d.ts +0 -12
  104. package/dist/assets/server/agent-session/entities/agent-event.entity.js +0 -73
  105. package/dist/assets/server/agent-session/entities/agent-event.entity.js.map +0 -1
  106. package/dist/assets/server/agent-session/entities/agent-message.entity.d.ts +0 -13
  107. package/dist/assets/server/agent-session/entities/agent-message.entity.js +0 -77
  108. package/dist/assets/server/agent-session/entities/agent-message.entity.js.map +0 -1
  109. package/dist/assets/server/agent-session/entities/agent-session.entity.d.ts +0 -14
  110. package/dist/assets/server/agent-session/entities/agent-session.entity.js +0 -83
  111. package/dist/assets/server/agent-session/entities/agent-session.entity.js.map +0 -1
  112. package/dist/assets/server/app.module.d.ts +0 -4
  113. package/dist/assets/server/app.module.js +0 -141
  114. package/dist/assets/server/app.module.js.map +0 -1
  115. package/dist/assets/server/auth/auth.controller.d.ts +0 -43
  116. package/dist/assets/server/auth/auth.controller.js +0 -127
  117. package/dist/assets/server/auth/auth.controller.js.map +0 -1
  118. package/dist/assets/server/auth/auth.middleware.d.ts +0 -5
  119. package/dist/assets/server/auth/auth.middleware.js +0 -42
  120. package/dist/assets/server/auth/auth.middleware.js.map +0 -1
  121. package/dist/assets/server/auth/auth.module.d.ts +0 -2
  122. package/dist/assets/server/auth/auth.module.js +0 -27
  123. package/dist/assets/server/auth/auth.module.js.map +0 -1
  124. package/dist/assets/server/auth/auth.service.d.ts +0 -58
  125. package/dist/assets/server/auth/auth.service.js +0 -303
  126. package/dist/assets/server/auth/auth.service.js.map +0 -1
  127. package/dist/assets/server/auth/auth.types.d.ts +0 -28
  128. package/dist/assets/server/auth/auth.types.js +0 -3
  129. package/dist/assets/server/auth/auth.types.js.map +0 -1
  130. package/dist/assets/server/auth/saas-token.entity.d.ts +0 -7
  131. package/dist/assets/server/auth/saas-token.entity.js +0 -46
  132. package/dist/assets/server/auth/saas-token.entity.js.map +0 -1
  133. package/dist/assets/server/build-info.json +0 -4
  134. package/dist/assets/server/common/common.module.d.ts +0 -2
  135. package/dist/assets/server/common/common.module.js +0 -22
  136. package/dist/assets/server/common/common.module.js.map +0 -1
  137. package/dist/assets/server/common/crypto.service.d.ts +0 -11
  138. package/dist/assets/server/common/crypto.service.js +0 -73
  139. package/dist/assets/server/common/crypto.service.js.map +0 -1
  140. package/dist/assets/server/communication/communication-record.entity.d.ts +0 -15
  141. package/dist/assets/server/communication/communication-record.entity.js +0 -80
  142. package/dist/assets/server/communication/communication-record.entity.js.map +0 -1
  143. package/dist/assets/server/communication/communication.controller.d.ts +0 -12
  144. package/dist/assets/server/communication/communication.controller.js +0 -61
  145. package/dist/assets/server/communication/communication.controller.js.map +0 -1
  146. package/dist/assets/server/communication/communication.module.d.ts +0 -2
  147. package/dist/assets/server/communication/communication.module.js +0 -25
  148. package/dist/assets/server/communication/communication.module.js.map +0 -1
  149. package/dist/assets/server/communication/communication.service.d.ts +0 -23
  150. package/dist/assets/server/communication/communication.service.js +0 -51
  151. package/dist/assets/server/communication/communication.service.js.map +0 -1
  152. package/dist/assets/server/customer/customer.controller.d.ts +0 -18
  153. package/dist/assets/server/customer/customer.controller.js +0 -81
  154. package/dist/assets/server/customer/customer.controller.js.map +0 -1
  155. package/dist/assets/server/customer/customer.entity.d.ts +0 -17
  156. package/dist/assets/server/customer/customer.entity.js +0 -82
  157. package/dist/assets/server/customer/customer.entity.js.map +0 -1
  158. package/dist/assets/server/customer/customer.module.d.ts +0 -2
  159. package/dist/assets/server/customer/customer.module.js +0 -28
  160. package/dist/assets/server/customer/customer.module.js.map +0 -1
  161. package/dist/assets/server/customer/customer.service.d.ts +0 -36
  162. package/dist/assets/server/customer/customer.service.js +0 -200
  163. package/dist/assets/server/customer/customer.service.js.map +0 -1
  164. package/dist/assets/server/datasync/datasync.module.d.ts +0 -2
  165. package/dist/assets/server/datasync/datasync.module.js +0 -26
  166. package/dist/assets/server/datasync/datasync.module.js.map +0 -1
  167. package/dist/assets/server/datasync/datasync.service.d.ts +0 -50
  168. package/dist/assets/server/datasync/datasync.service.js +0 -389
  169. package/dist/assets/server/datasync/datasync.service.js.map +0 -1
  170. package/dist/assets/server/datasync/entities/sync-conflict.entity.d.ts +0 -10
  171. package/dist/assets/server/datasync/entities/sync-conflict.entity.js +0 -61
  172. package/dist/assets/server/datasync/entities/sync-conflict.entity.js.map +0 -1
  173. package/dist/assets/server/datasync/entities/sync-cursor.entity.d.ts +0 -9
  174. package/dist/assets/server/datasync/entities/sync-cursor.entity.js +0 -56
  175. package/dist/assets/server/datasync/entities/sync-cursor.entity.js.map +0 -1
  176. package/dist/assets/server/datasync/registry.d.ts +0 -8
  177. package/dist/assets/server/datasync/registry.js +0 -55
  178. package/dist/assets/server/datasync/registry.js.map +0 -1
  179. package/dist/assets/server/db/schema-validator.service.d.ts +0 -27
  180. package/dist/assets/server/db/schema-validator.service.js +0 -138
  181. package/dist/assets/server/db/schema-validator.service.js.map +0 -1
  182. package/dist/assets/server/db/schema-version.entity.d.ts +0 -5
  183. package/dist/assets/server/db/schema-version.entity.js +0 -35
  184. package/dist/assets/server/db/schema-version.entity.js.map +0 -1
  185. package/dist/assets/server/db/sqlite.module.d.ts +0 -3
  186. package/dist/assets/server/db/sqlite.module.js +0 -99
  187. package/dist/assets/server/db/sqlite.module.js.map +0 -1
  188. package/dist/assets/server/devops/devops-sink-init.d.ts +0 -10
  189. package/dist/assets/server/devops/devops-sink-init.js +0 -96
  190. package/dist/assets/server/devops/devops-sink-init.js.map +0 -1
  191. package/dist/assets/server/devops/devops-sink-init.spec.d.ts +0 -1
  192. package/dist/assets/server/devops/devops-sink-init.spec.js +0 -71
  193. package/dist/assets/server/devops/devops-sink-init.spec.js.map +0 -1
  194. package/dist/assets/server/devops/devops-sink.module.d.ts +0 -2
  195. package/dist/assets/server/devops/devops-sink.module.js +0 -22
  196. package/dist/assets/server/devops/devops-sink.module.js.map +0 -1
  197. package/dist/assets/server/doctor/doctor.controller.d.ts +0 -13
  198. package/dist/assets/server/doctor/doctor.controller.js +0 -62
  199. package/dist/assets/server/doctor/doctor.controller.js.map +0 -1
  200. package/dist/assets/server/doctor/doctor.module.d.ts +0 -2
  201. package/dist/assets/server/doctor/doctor.module.js +0 -27
  202. package/dist/assets/server/doctor/doctor.module.js.map +0 -1
  203. package/dist/assets/server/doctor/doctor.service.d.ts +0 -15
  204. package/dist/assets/server/doctor/doctor.service.js +0 -209
  205. package/dist/assets/server/doctor/doctor.service.js.map +0 -1
  206. package/dist/assets/server/doctor/doctor.types.d.ts +0 -46
  207. package/dist/assets/server/doctor/doctor.types.js +0 -3
  208. package/dist/assets/server/doctor/doctor.types.js.map +0 -1
  209. package/dist/assets/server/extension/extension-control.controller.d.ts +0 -86
  210. package/dist/assets/server/extension/extension-control.controller.js +0 -229
  211. package/dist/assets/server/extension/extension-control.controller.js.map +0 -1
  212. package/dist/assets/server/extension/extension-control.service.d.ts +0 -59
  213. package/dist/assets/server/extension/extension-control.service.js +0 -275
  214. package/dist/assets/server/extension/extension-control.service.js.map +0 -1
  215. package/dist/assets/server/extension/extension-core.module.d.ts +0 -2
  216. package/dist/assets/server/extension/extension-core.module.js +0 -21
  217. package/dist/assets/server/extension/extension-core.module.js.map +0 -1
  218. package/dist/assets/server/extension/extension-version.controller.d.ts +0 -6
  219. package/dist/assets/server/extension/extension-version.controller.js +0 -41
  220. package/dist/assets/server/extension/extension-version.controller.js.map +0 -1
  221. package/dist/assets/server/extension/extension.module.d.ts +0 -2
  222. package/dist/assets/server/extension/extension.module.js +0 -26
  223. package/dist/assets/server/extension/extension.module.js.map +0 -1
  224. package/dist/assets/server/extraction/adapter.service.d.ts +0 -58
  225. package/dist/assets/server/extraction/adapter.service.js +0 -396
  226. package/dist/assets/server/extraction/adapter.service.js.map +0 -1
  227. package/dist/assets/server/extraction/anomaly-report.service.d.ts +0 -12
  228. package/dist/assets/server/extraction/anomaly-report.service.js +0 -81
  229. package/dist/assets/server/extraction/anomaly-report.service.js.map +0 -1
  230. package/dist/assets/server/extraction/entities/adapter-rule.entity.d.ts +0 -15
  231. package/dist/assets/server/extraction/entities/adapter-rule.entity.js +0 -81
  232. package/dist/assets/server/extraction/entities/adapter-rule.entity.js.map +0 -1
  233. package/dist/assets/server/extraction/entities/company-profile.entity.d.ts +0 -14
  234. package/dist/assets/server/extraction/entities/company-profile.entity.js +0 -81
  235. package/dist/assets/server/extraction/entities/company-profile.entity.js.map +0 -1
  236. package/dist/assets/server/extraction/entities/job-posting.entity.d.ts +0 -15
  237. package/dist/assets/server/extraction/entities/job-posting.entity.js +0 -86
  238. package/dist/assets/server/extraction/entities/job-posting.entity.js.map +0 -1
  239. package/dist/assets/server/extraction/entities/parse-log.entity.d.ts +0 -18
  240. package/dist/assets/server/extraction/entities/parse-log.entity.js +0 -102
  241. package/dist/assets/server/extraction/entities/parse-log.entity.js.map +0 -1
  242. package/dist/assets/server/extraction/entities/talent-profile.entity.d.ts +0 -15
  243. package/dist/assets/server/extraction/entities/talent-profile.entity.js +0 -86
  244. package/dist/assets/server/extraction/entities/talent-profile.entity.js.map +0 -1
  245. package/dist/assets/server/extraction/extraction-entity.controller.d.ts +0 -156
  246. package/dist/assets/server/extraction/extraction-entity.controller.js +0 -528
  247. package/dist/assets/server/extraction/extraction-entity.controller.js.map +0 -1
  248. package/dist/assets/server/extraction/extraction-rule.controller.d.ts +0 -7
  249. package/dist/assets/server/extraction/extraction-rule.controller.js +0 -48
  250. package/dist/assets/server/extraction/extraction-rule.controller.js.map +0 -1
  251. package/dist/assets/server/extraction/extraction-rule.entity.d.ts +0 -15
  252. package/dist/assets/server/extraction/extraction-rule.entity.js +0 -80
  253. package/dist/assets/server/extraction/extraction-rule.entity.js.map +0 -1
  254. package/dist/assets/server/extraction/extraction-rule.service.d.ts +0 -24
  255. package/dist/assets/server/extraction/extraction-rule.service.js +0 -89
  256. package/dist/assets/server/extraction/extraction-rule.service.js.map +0 -1
  257. package/dist/assets/server/extraction/extraction.module.d.ts +0 -2
  258. package/dist/assets/server/extraction/extraction.module.js +0 -63
  259. package/dist/assets/server/extraction/extraction.module.js.map +0 -1
  260. package/dist/assets/server/extraction/extraction.service.d.ts +0 -81
  261. package/dist/assets/server/extraction/extraction.service.js +0 -488
  262. package/dist/assets/server/extraction/extraction.service.js.map +0 -1
  263. package/dist/assets/server/extraction/harness-overlay.service.d.ts +0 -41
  264. package/dist/assets/server/extraction/harness-overlay.service.js +0 -319
  265. package/dist/assets/server/extraction/harness-overlay.service.js.map +0 -1
  266. package/dist/assets/server/extraction/liepin-extractor.d.ts +0 -1
  267. package/dist/assets/server/extraction/liepin-extractor.js +0 -172
  268. package/dist/assets/server/extraction/liepin-extractor.js.map +0 -1
  269. package/dist/assets/server/extraction/linkedin-extractor.d.ts +0 -1
  270. package/dist/assets/server/extraction/linkedin-extractor.js +0 -244
  271. package/dist/assets/server/extraction/linkedin-extractor.js.map +0 -1
  272. package/dist/assets/server/extraction/rrweb-snapshot.utils.d.ts +0 -15
  273. package/dist/assets/server/extraction/rrweb-snapshot.utils.js +0 -48
  274. package/dist/assets/server/extraction/rrweb-snapshot.utils.js.map +0 -1
  275. package/dist/assets/server/extraction/rrweb-snapshot.utils.spec.d.ts +0 -1
  276. package/dist/assets/server/extraction/rrweb-snapshot.utils.spec.js +0 -60
  277. package/dist/assets/server/extraction/rrweb-snapshot.utils.spec.js.map +0 -1
  278. package/dist/assets/server/extraction/script-rule.d.ts +0 -14
  279. package/dist/assets/server/extraction/script-rule.js +0 -61
  280. package/dist/assets/server/extraction/script-rule.js.map +0 -1
  281. package/dist/assets/server/extraction/snapshot-analysis.service.d.ts +0 -23
  282. package/dist/assets/server/extraction/snapshot-analysis.service.js +0 -147
  283. package/dist/assets/server/extraction/snapshot-analysis.service.js.map +0 -1
  284. package/dist/assets/server/extraction/structured-data.d.ts +0 -7
  285. package/dist/assets/server/extraction/structured-data.js +0 -96
  286. package/dist/assets/server/extraction/structured-data.js.map +0 -1
  287. package/dist/assets/server/governance/action-audit.entity.d.ts +0 -12
  288. package/dist/assets/server/governance/action-audit.entity.js +0 -66
  289. package/dist/assets/server/governance/action-audit.entity.js.map +0 -1
  290. package/dist/assets/server/governance/governance.command-recorder.d.ts +0 -17
  291. package/dist/assets/server/governance/governance.command-recorder.js +0 -98
  292. package/dist/assets/server/governance/governance.command-recorder.js.map +0 -1
  293. package/dist/assets/server/governance/governance.controller.d.ts +0 -14
  294. package/dist/assets/server/governance/governance.controller.js +0 -77
  295. package/dist/assets/server/governance/governance.controller.js.map +0 -1
  296. package/dist/assets/server/governance/governance.ingester.d.ts +0 -21
  297. package/dist/assets/server/governance/governance.ingester.js +0 -117
  298. package/dist/assets/server/governance/governance.ingester.js.map +0 -1
  299. package/dist/assets/server/governance/governance.module.d.ts +0 -2
  300. package/dist/assets/server/governance/governance.module.js +0 -27
  301. package/dist/assets/server/governance/governance.module.js.map +0 -1
  302. package/dist/assets/server/governance/governance.service.d.ts +0 -122
  303. package/dist/assets/server/governance/governance.service.js +0 -398
  304. package/dist/assets/server/governance/governance.service.js.map +0 -1
  305. package/dist/assets/server/hcapi/hcapi.module.d.ts +0 -2
  306. package/dist/assets/server/hcapi/hcapi.module.js +0 -23
  307. package/dist/assets/server/hcapi/hcapi.module.js.map +0 -1
  308. package/dist/assets/server/hcapi/hcapi.service.d.ts +0 -28
  309. package/dist/assets/server/hcapi/hcapi.service.js +0 -81
  310. package/dist/assets/server/hcapi/hcapi.service.js.map +0 -1
  311. package/dist/assets/server/health/health.controller.d.ts +0 -19
  312. package/dist/assets/server/health/health.controller.js +0 -59
  313. package/dist/assets/server/health/health.controller.js.map +0 -1
  314. package/dist/assets/server/jobcase/jobcase.controller.d.ts +0 -13
  315. package/dist/assets/server/jobcase/jobcase.controller.js +0 -61
  316. package/dist/assets/server/jobcase/jobcase.controller.js.map +0 -1
  317. package/dist/assets/server/jobcase/jobcase.entity.d.ts +0 -14
  318. package/dist/assets/server/jobcase/jobcase.entity.js +0 -77
  319. package/dist/assets/server/jobcase/jobcase.entity.js.map +0 -1
  320. package/dist/assets/server/jobcase/jobcase.module.d.ts +0 -2
  321. package/dist/assets/server/jobcase/jobcase.module.js +0 -26
  322. package/dist/assets/server/jobcase/jobcase.module.js.map +0 -1
  323. package/dist/assets/server/jobcase/jobcase.service.d.ts +0 -23
  324. package/dist/assets/server/jobcase/jobcase.service.js +0 -57
  325. package/dist/assets/server/jobcase/jobcase.service.js.map +0 -1
  326. package/dist/assets/server/llm/llm.module.d.ts +0 -2
  327. package/dist/assets/server/llm/llm.module.js +0 -21
  328. package/dist/assets/server/llm/llm.module.js.map +0 -1
  329. package/dist/assets/server/llm/llm.service.d.ts +0 -18
  330. package/dist/assets/server/llm/llm.service.js +0 -65
  331. package/dist/assets/server/llm/llm.service.js.map +0 -1
  332. package/dist/assets/server/main.d.ts +0 -1
  333. package/dist/assets/server/main.js +0 -31
  334. package/dist/assets/server/main.js.map +0 -1
  335. package/dist/assets/server/matching/matching.controller.d.ts +0 -16
  336. package/dist/assets/server/matching/matching.controller.js +0 -97
  337. package/dist/assets/server/matching/matching.controller.js.map +0 -1
  338. package/dist/assets/server/matching/matching.module.d.ts +0 -2
  339. package/dist/assets/server/matching/matching.module.js +0 -36
  340. package/dist/assets/server/matching/matching.module.js.map +0 -1
  341. package/dist/assets/server/matching/matching.service.d.ts +0 -55
  342. package/dist/assets/server/matching/matching.service.js +0 -409
  343. package/dist/assets/server/matching/matching.service.js.map +0 -1
  344. package/dist/assets/server/package.json +0 -59
  345. package/dist/assets/server/parsed-resume/parsed-resume.controller.d.ts +0 -6
  346. package/dist/assets/server/parsed-resume/parsed-resume.controller.js +0 -42
  347. package/dist/assets/server/parsed-resume/parsed-resume.controller.js.map +0 -1
  348. package/dist/assets/server/parsed-resume/parsed-resume.entity.d.ts +0 -124
  349. package/dist/assets/server/parsed-resume/parsed-resume.entity.js +0 -72
  350. package/dist/assets/server/parsed-resume/parsed-resume.entity.js.map +0 -1
  351. package/dist/assets/server/parsed-resume/parsed-resume.module.d.ts +0 -2
  352. package/dist/assets/server/parsed-resume/parsed-resume.module.js +0 -26
  353. package/dist/assets/server/parsed-resume/parsed-resume.module.js.map +0 -1
  354. package/dist/assets/server/parsed-resume/parsed-resume.service.d.ts +0 -10
  355. package/dist/assets/server/parsed-resume/parsed-resume.service.js +0 -45
  356. package/dist/assets/server/parsed-resume/parsed-resume.service.js.map +0 -1
  357. package/dist/assets/server/parsing/parse-error-report.entity.d.ts +0 -11
  358. package/dist/assets/server/parsing/parse-error-report.entity.js +0 -66
  359. package/dist/assets/server/parsing/parse-error-report.entity.js.map +0 -1
  360. package/dist/assets/server/parsing/parsing.controller.d.ts +0 -19
  361. package/dist/assets/server/parsing/parsing.controller.js +0 -97
  362. package/dist/assets/server/parsing/parsing.controller.js.map +0 -1
  363. package/dist/assets/server/parsing/parsing.module.d.ts +0 -2
  364. package/dist/assets/server/parsing/parsing.module.js +0 -38
  365. package/dist/assets/server/parsing/parsing.module.js.map +0 -1
  366. package/dist/assets/server/parsing/parsing.service.d.ts +0 -38
  367. package/dist/assets/server/parsing/parsing.service.js +0 -263
  368. package/dist/assets/server/parsing/parsing.service.js.map +0 -1
  369. package/dist/assets/server/preference/preference.controller.d.ts +0 -14
  370. package/dist/assets/server/preference/preference.controller.js +0 -66
  371. package/dist/assets/server/preference/preference.controller.js.map +0 -1
  372. package/dist/assets/server/preference/preference.entity.d.ts +0 -13
  373. package/dist/assets/server/preference/preference.entity.js +0 -77
  374. package/dist/assets/server/preference/preference.entity.js.map +0 -1
  375. package/dist/assets/server/preference/preference.module.d.ts +0 -2
  376. package/dist/assets/server/preference/preference.module.js +0 -26
  377. package/dist/assets/server/preference/preference.module.js.map +0 -1
  378. package/dist/assets/server/preference/preference.service.d.ts +0 -33
  379. package/dist/assets/server/preference/preference.service.js +0 -122
  380. package/dist/assets/server/preference/preference.service.js.map +0 -1
  381. package/dist/assets/server/query/fields-meta.controller.d.ts +0 -28
  382. package/dist/assets/server/query/fields-meta.controller.js +0 -57
  383. package/dist/assets/server/query/fields-meta.controller.js.map +0 -1
  384. package/dist/assets/server/query/query-builder.controller.d.ts +0 -11
  385. package/dist/assets/server/query/query-builder.controller.js +0 -40
  386. package/dist/assets/server/query/query-builder.controller.js.map +0 -1
  387. package/dist/assets/server/query/query-builder.service.d.ts +0 -8
  388. package/dist/assets/server/query/query-builder.service.js +0 -41
  389. package/dist/assets/server/query/query-builder.service.js.map +0 -1
  390. package/dist/assets/server/query/query.module.d.ts +0 -2
  391. package/dist/assets/server/query/query.module.js +0 -23
  392. package/dist/assets/server/query/query.module.js.map +0 -1
  393. package/dist/assets/server/recording/entities/recording-event.entity.d.ts +0 -9
  394. package/dist/assets/server/recording/entities/recording-event.entity.js +0 -56
  395. package/dist/assets/server/recording/entities/recording-event.entity.js.map +0 -1
  396. package/dist/assets/server/recording/entities/recording-snapshot.entity.d.ts +0 -16
  397. package/dist/assets/server/recording/entities/recording-snapshot.entity.js +0 -91
  398. package/dist/assets/server/recording/entities/recording-snapshot.entity.js.map +0 -1
  399. package/dist/assets/server/recording/recording-event-bus.service.d.ts +0 -4
  400. package/dist/assets/server/recording/recording-event-bus.service.js +0 -25
  401. package/dist/assets/server/recording/recording-event-bus.service.js.map +0 -1
  402. package/dist/assets/server/recording/recording-event-queue.service.d.ts +0 -26
  403. package/dist/assets/server/recording/recording-event-queue.service.js +0 -115
  404. package/dist/assets/server/recording/recording-event-queue.service.js.map +0 -1
  405. package/dist/assets/server/recording/recording-retention.service.d.ts +0 -38
  406. package/dist/assets/server/recording/recording-retention.service.js +0 -174
  407. package/dist/assets/server/recording/recording-retention.service.js.map +0 -1
  408. package/dist/assets/server/recording/recording-snapshot.service.d.ts +0 -14
  409. package/dist/assets/server/recording/recording-snapshot.service.js +0 -85
  410. package/dist/assets/server/recording/recording-snapshot.service.js.map +0 -1
  411. package/dist/assets/server/recording/recording-snapshot.service.spec.d.ts +0 -1
  412. package/dist/assets/server/recording/recording-snapshot.service.spec.js +0 -65
  413. package/dist/assets/server/recording/recording-snapshot.service.spec.js.map +0 -1
  414. package/dist/assets/server/recording/recording.controller.d.ts +0 -74
  415. package/dist/assets/server/recording/recording.controller.js +0 -112
  416. package/dist/assets/server/recording/recording.controller.js.map +0 -1
  417. package/dist/assets/server/recording/recording.gateway.d.ts +0 -15
  418. package/dist/assets/server/recording/recording.gateway.js +0 -132
  419. package/dist/assets/server/recording/recording.gateway.js.map +0 -1
  420. package/dist/assets/server/recording/recording.module.d.ts +0 -2
  421. package/dist/assets/server/recording/recording.module.js +0 -50
  422. package/dist/assets/server/recording/recording.module.js.map +0 -1
  423. package/dist/assets/server/recording/recording.service.d.ts +0 -52
  424. package/dist/assets/server/recording/recording.service.js +0 -149
  425. package/dist/assets/server/recording/recording.service.js.map +0 -1
  426. package/dist/assets/server/remark/remark.controller.d.ts +0 -21
  427. package/dist/assets/server/remark/remark.controller.js +0 -50
  428. package/dist/assets/server/remark/remark.controller.js.map +0 -1
  429. package/dist/assets/server/remark/remark.entity.d.ts +0 -18
  430. package/dist/assets/server/remark/remark.entity.js +0 -67
  431. package/dist/assets/server/remark/remark.entity.js.map +0 -1
  432. package/dist/assets/server/remark/remark.module.d.ts +0 -2
  433. package/dist/assets/server/remark/remark.module.js +0 -26
  434. package/dist/assets/server/remark/remark.module.js.map +0 -1
  435. package/dist/assets/server/remark/remark.service.d.ts +0 -8
  436. package/dist/assets/server/remark/remark.service.js +0 -39
  437. package/dist/assets/server/remark/remark.service.js.map +0 -1
  438. package/dist/assets/server/report/report.controller.d.ts +0 -18
  439. package/dist/assets/server/report/report.controller.js +0 -41
  440. package/dist/assets/server/report/report.controller.js.map +0 -1
  441. package/dist/assets/server/report/report.module.d.ts +0 -2
  442. package/dist/assets/server/report/report.module.js +0 -24
  443. package/dist/assets/server/report/report.module.js.map +0 -1
  444. package/dist/assets/server/report/report.service.d.ts +0 -23
  445. package/dist/assets/server/report/report.service.js +0 -54
  446. package/dist/assets/server/report/report.service.js.map +0 -1
  447. package/dist/assets/server/rules/rules.controller.d.ts +0 -6
  448. package/dist/assets/server/rules/rules.controller.js +0 -35
  449. package/dist/assets/server/rules/rules.controller.js.map +0 -1
  450. package/dist/assets/server/rules/rules.module.d.ts +0 -2
  451. package/dist/assets/server/rules/rules.module.js +0 -23
  452. package/dist/assets/server/rules/rules.module.js.map +0 -1
  453. package/dist/assets/server/rules/rules.service.d.ts +0 -10
  454. package/dist/assets/server/rules/rules.service.js +0 -26
  455. package/dist/assets/server/rules/rules.service.js.map +0 -1
  456. package/dist/assets/server/search/search.controller.d.ts +0 -6
  457. package/dist/assets/server/search/search.controller.js +0 -53
  458. package/dist/assets/server/search/search.controller.js.map +0 -1
  459. package/dist/assets/server/search/search.module.d.ts +0 -2
  460. package/dist/assets/server/search/search.module.js +0 -24
  461. package/dist/assets/server/search/search.module.js.map +0 -1
  462. package/dist/assets/server/search/search.service.d.ts +0 -6
  463. package/dist/assets/server/search/search.service.js +0 -46
  464. package/dist/assets/server/search/search.service.js.map +0 -1
  465. package/dist/assets/server/sentry.d.ts +0 -3
  466. package/dist/assets/server/sentry.js +0 -10
  467. package/dist/assets/server/sentry.js.map +0 -1
  468. package/dist/assets/server/site/entities/site-registry.entity.d.ts +0 -13
  469. package/dist/assets/server/site/entities/site-registry.entity.js +0 -76
  470. package/dist/assets/server/site/entities/site-registry.entity.js.map +0 -1
  471. package/dist/assets/server/site/site.controller.d.ts +0 -38
  472. package/dist/assets/server/site/site.controller.js +0 -60
  473. package/dist/assets/server/site/site.controller.js.map +0 -1
  474. package/dist/assets/server/site/site.module.d.ts +0 -2
  475. package/dist/assets/server/site/site.module.js +0 -26
  476. package/dist/assets/server/site/site.module.js.map +0 -1
  477. package/dist/assets/server/site/site.service.d.ts +0 -42
  478. package/dist/assets/server/site/site.service.js +0 -154
  479. package/dist/assets/server/site/site.service.js.map +0 -1
  480. package/dist/assets/server/snapshot/raw-snapshot.entity.d.ts +0 -35
  481. package/dist/assets/server/snapshot/raw-snapshot.entity.js +0 -62
  482. package/dist/assets/server/snapshot/raw-snapshot.entity.js.map +0 -1
  483. package/dist/assets/server/snapshot/snapshot.controller.d.ts +0 -18
  484. package/dist/assets/server/snapshot/snapshot.controller.js +0 -76
  485. package/dist/assets/server/snapshot/snapshot.controller.js.map +0 -1
  486. package/dist/assets/server/snapshot/snapshot.module.d.ts +0 -2
  487. package/dist/assets/server/snapshot/snapshot.module.js +0 -26
  488. package/dist/assets/server/snapshot/snapshot.module.js.map +0 -1
  489. package/dist/assets/server/snapshot/snapshot.service.d.ts +0 -10
  490. package/dist/assets/server/snapshot/snapshot.service.js +0 -48
  491. package/dist/assets/server/snapshot/snapshot.service.js.map +0 -1
  492. package/dist/assets/server/system/system.controller.d.ts +0 -40
  493. package/dist/assets/server/system/system.controller.js +0 -93
  494. package/dist/assets/server/system/system.controller.js.map +0 -1
  495. package/dist/assets/server/system/system.module.d.ts +0 -2
  496. package/dist/assets/server/system/system.module.js +0 -26
  497. package/dist/assets/server/system/system.module.js.map +0 -1
  498. package/dist/assets/server/system/system.service.d.ts +0 -87
  499. package/dist/assets/server/system/system.service.js +0 -434
  500. package/dist/assets/server/system/system.service.js.map +0 -1
  501. package/dist/assets/server/talent-fingerprint/fingerprint-match.service.d.ts +0 -28
  502. package/dist/assets/server/talent-fingerprint/fingerprint-match.service.js +0 -186
  503. package/dist/assets/server/talent-fingerprint/fingerprint-match.service.js.map +0 -1
  504. package/dist/assets/server/talent-fingerprint/talent-fingerprint.entity.d.ts +0 -30
  505. package/dist/assets/server/talent-fingerprint/talent-fingerprint.entity.js +0 -55
  506. package/dist/assets/server/talent-fingerprint/talent-fingerprint.entity.js.map +0 -1
  507. package/dist/assets/server/talent-fingerprint/talent-fingerprint.module.d.ts +0 -2
  508. package/dist/assets/server/talent-fingerprint/talent-fingerprint.module.js +0 -25
  509. package/dist/assets/server/talent-fingerprint/talent-fingerprint.module.js.map +0 -1
  510. package/dist/assets/server/talent-fingerprint/talent-fingerprint.service.d.ts +0 -8
  511. package/dist/assets/server/talent-fingerprint/talent-fingerprint.service.js +0 -44
  512. package/dist/assets/server/talent-fingerprint/talent-fingerprint.service.js.map +0 -1
  513. package/dist/assets/server/talent-job-match/talent-job-match.controller.d.ts +0 -6
  514. package/dist/assets/server/talent-job-match/talent-job-match.controller.js +0 -42
  515. package/dist/assets/server/talent-job-match/talent-job-match.controller.js.map +0 -1
  516. package/dist/assets/server/talent-job-match/talent-job-match.entity.d.ts +0 -33
  517. package/dist/assets/server/talent-job-match/talent-job-match.entity.js +0 -73
  518. package/dist/assets/server/talent-job-match/talent-job-match.entity.js.map +0 -1
  519. package/dist/assets/server/talent-job-match/talent-job-match.module.d.ts +0 -2
  520. package/dist/assets/server/talent-job-match/talent-job-match.module.js +0 -26
  521. package/dist/assets/server/talent-job-match/talent-job-match.module.js.map +0 -1
  522. package/dist/assets/server/talent-job-match/talent-job-match.service.d.ts +0 -9
  523. package/dist/assets/server/talent-job-match/talent-job-match.service.js +0 -42
  524. package/dist/assets/server/talent-job-match/talent-job-match.service.js.map +0 -1
  525. package/dist/assets/server/talent-portrait/portrait-merge.service.d.ts +0 -17
  526. package/dist/assets/server/talent-portrait/portrait-merge.service.js +0 -200
  527. package/dist/assets/server/talent-portrait/portrait-merge.service.js.map +0 -1
  528. package/dist/assets/server/talent-portrait/talent-portrait.controller.d.ts +0 -7
  529. package/dist/assets/server/talent-portrait/talent-portrait.controller.js +0 -52
  530. package/dist/assets/server/talent-portrait/talent-portrait.controller.js.map +0 -1
  531. package/dist/assets/server/talent-portrait/talent-portrait.entity.d.ts +0 -91
  532. package/dist/assets/server/talent-portrait/talent-portrait.entity.js +0 -71
  533. package/dist/assets/server/talent-portrait/talent-portrait.entity.js.map +0 -1
  534. package/dist/assets/server/talent-portrait/talent-portrait.module.d.ts +0 -2
  535. package/dist/assets/server/talent-portrait/talent-portrait.module.js +0 -27
  536. package/dist/assets/server/talent-portrait/talent-portrait.module.js.map +0 -1
  537. package/dist/assets/server/talent-portrait/talent-portrait.service.d.ts +0 -10
  538. package/dist/assets/server/talent-portrait/talent-portrait.service.js +0 -46
  539. package/dist/assets/server/talent-portrait/talent-portrait.service.js.map +0 -1
  540. package/dist/assets/server/telemetry/telemetry.module.d.ts +0 -2
  541. package/dist/assets/server/telemetry/telemetry.module.js +0 -24
  542. package/dist/assets/server/telemetry/telemetry.module.js.map +0 -1
  543. package/dist/assets/server/telemetry/telemetry.service.d.ts +0 -29
  544. package/dist/assets/server/telemetry/telemetry.service.js +0 -116
  545. package/dist/assets/server/telemetry/telemetry.service.js.map +0 -1
  546. package/dist/auto-doctor.d.ts +0 -8
  547. package/dist/auto-doctor.js +0 -34
  548. package/dist/bundled-assets.d.ts +0 -22
  549. package/dist/bundled-assets.js +0 -80
  550. package/dist/cache/db.d.ts +0 -7
  551. package/dist/cache/db.js +0 -61
  552. package/dist/commands/addons.d.ts +0 -4
  553. package/dist/commands/addons.js +0 -354
  554. package/dist/commands/cache.d.ts +0 -8
  555. package/dist/commands/cache.js +0 -59
  556. package/dist/commands/case.d.ts +0 -67
  557. package/dist/commands/case.js +0 -101
  558. package/dist/commands/config.d.ts +0 -17
  559. package/dist/commands/config.js +0 -30
  560. package/dist/commands/customer.d.ts +0 -25
  561. package/dist/commands/customer.js +0 -137
  562. package/dist/commands/doctor.d.ts +0 -63
  563. package/dist/commands/doctor.js +0 -666
  564. package/dist/commands/extension.d.ts +0 -5
  565. package/dist/commands/extension.js +0 -420
  566. package/dist/commands/extras.d.ts +0 -55
  567. package/dist/commands/extras.js +0 -456
  568. package/dist/commands/init.d.ts +0 -10
  569. package/dist/commands/init.js +0 -58
  570. package/dist/commands/install.d.ts +0 -14
  571. package/dist/commands/install.js +0 -77
  572. package/dist/commands/issue-env.d.ts +0 -23
  573. package/dist/commands/issue-env.js +0 -101
  574. package/dist/commands/job.d.ts +0 -13
  575. package/dist/commands/job.js +0 -131
  576. package/dist/commands/login.d.ts +0 -22
  577. package/dist/commands/login.js +0 -192
  578. package/dist/commands/logout.d.ts +0 -3
  579. package/dist/commands/logout.js +0 -12
  580. package/dist/commands/migrate.d.ts +0 -32
  581. package/dist/commands/migrate.js +0 -116
  582. package/dist/commands/note.d.ts +0 -3
  583. package/dist/commands/note.js +0 -75
  584. package/dist/commands/ops.d.ts +0 -6
  585. package/dist/commands/ops.js +0 -461
  586. package/dist/commands/preference.d.ts +0 -6
  587. package/dist/commands/preference.js +0 -80
  588. package/dist/commands/record.d.ts +0 -12
  589. package/dist/commands/record.js +0 -56
  590. package/dist/commands/report.d.ts +0 -7
  591. package/dist/commands/report.js +0 -48
  592. package/dist/commands/search.d.ts +0 -14
  593. package/dist/commands/search.js +0 -46
  594. package/dist/commands/server.d.ts +0 -35
  595. package/dist/commands/server.js +0 -471
  596. package/dist/commands/status.d.ts +0 -24
  597. package/dist/commands/status.js +0 -98
  598. package/dist/commands/update.d.ts +0 -8
  599. package/dist/commands/update.js +0 -125
  600. package/dist/config.d.ts +0 -67
  601. package/dist/config.js +0 -121
  602. package/dist/extension-sync.d.ts +0 -35
  603. package/dist/extension-sync.js +0 -159
  604. package/dist/i18n/index.d.ts +0 -7
  605. package/dist/i18n/index.js +0 -18
  606. package/dist/i18n/locales/en-US.json +0 -79
  607. package/dist/i18n/locales/zh-CN.json +0 -79
  608. package/dist/index.d.ts +0 -2
  609. package/dist/keychain.d.ts +0 -18
  610. package/dist/keychain.js +0 -109
  611. package/dist/logger.d.ts +0 -7
  612. package/dist/logger.js +0 -80
  613. package/dist/native-check.d.ts +0 -6
  614. package/dist/native-check.js +0 -30
  615. package/dist/postinstall.d.ts +0 -1
  616. package/dist/sentry.d.ts +0 -4
  617. package/dist/sentry.js +0 -6
  618. package/dist/updater.d.ts +0 -119
  619. package/dist/updater.js +0 -475
  620. package/dist/utils/artifact-checksum.d.ts +0 -4
  621. package/dist/utils/artifact-checksum.js +0 -40
  622. package/dist/utils/command-error.d.ts +0 -11
  623. package/dist/utils/command-error.js +0 -47
  624. package/dist/utils/link.d.ts +0 -18
  625. package/dist/utils/link.js +0 -83
  626. package/dist/utils/local-http.d.ts +0 -7
  627. package/dist/utils/local-http.js +0 -30
  628. package/dist/utils/proc.d.ts +0 -35
  629. package/dist/utils/proc.js +0 -81
  630. package/dist/utils/proxy-detect.d.ts +0 -20
  631. package/dist/utils/proxy-detect.js +0 -96
  632. package/dist/utils/script-path.d.ts +0 -5
  633. package/dist/utils/script-path.js +0 -27
  634. package/dist/utils/spawn.d.ts +0 -19
  635. package/dist/utils/spawn.js +0 -60
  636. package/dist/version.d.ts +0 -16
  637. package/dist/version.js +0 -388
  638. package/dist/watchdog.d.ts +0 -31
  639. package/dist/web/dist/_next/static/chunks/539-cd9d7c0ee78f8874.js +0 -1
  640. package/dist/web/dist/_next/static/chunks/app/auth/verify/page-f13c66b48f7cf13e.js +0 -1
  641. package/dist/web/dist/_next/static/chunks/app/companies/page-e38a69e1929d0953.js +0 -1
  642. package/dist/web/dist/_next/static/chunks/app/jobs/page-6a281776fec065f6.js +0 -1
  643. package/dist/web/dist/_next/static/chunks/app/layout-83e623e973c1693f.js +0 -1
  644. package/dist/web/dist/_next/static/chunks/app/matching/jobs/[id]/talents/page-cdf1ed0971999f35.js +0 -1
  645. package/dist/web/dist/_next/static/chunks/app/matching/portraits/[id]/jobs/page-87f04f1d61b94cb2.js +0 -1
  646. package/dist/web/dist/_next/static/chunks/app/page-affa1ffde089f1dd.js +0 -1
  647. package/dist/web/dist/_next/static/chunks/app/parselog/page-31d3630d611649f7.js +0 -1
  648. package/dist/web/dist/_next/static/chunks/app/recordings/page-9cdefceb2bff613f.js +0 -1
  649. package/dist/web/dist/_next/static/chunks/app/snapshots/[id]/agent-prompt/page-6996f7f221b1a7eb.js +0 -1
  650. package/dist/web/dist/_next/static/chunks/app/talents/page-30748338da20d7e0.js +0 -1
  651. package/dist/web/dist/_next/static/chunks/webpack-1784baecc6fdcf0b.js +0 -1
  652. package/dist/web/dist/_next/static/css/b7097b50a6497650.css +0 -3
  653. /package/dist/web/dist/_next/static/{hG-sO5oTR0EvAw6sU7EMO → L4ZJv0swR7OTsvB_PaAB4}/_buildManifest.js +0 -0
  654. /package/dist/web/dist/_next/static/{hG-sO5oTR0EvAw6sU7EMO → L4ZJv0swR7OTsvB_PaAB4}/_ssgManifest.js +0 -0
@@ -1421,6 +1421,13 @@ async function cdpEvaluate(tabId, expression, timeoutMs = CDP_COMMAND_TIMEOUT_MS
1421
1421
  }
1422
1422
  return result.result?.value;
1423
1423
  }
1424
+ async function cdpEvaluateTransient(tabId, expression, timeoutMs = CDP_COMMAND_TIMEOUT_MS) {
1425
+ try {
1426
+ return await cdpEvaluate(tabId, expression, timeoutMs);
1427
+ } finally {
1428
+ await detachIfAttached(tabId);
1429
+ }
1430
+ }
1424
1431
 
1425
1432
  // src/background/capture-visible-tab.ts
1426
1433
  var DEFAULT_CAPTURE_TIMEOUT_MS = 4e3;
@@ -1452,6 +1459,20 @@ async function prepareCompositor(tab, dependencies) {
1452
1459
  await dependencies.activateTab(tab.id);
1453
1460
  await dependencies.wait(150);
1454
1461
  }
1462
+ async function ensureTargetTabActive(tab, dependencies, options) {
1463
+ try {
1464
+ const info = await dependencies.getTab?.(tab.id);
1465
+ if (info && info.active === false) {
1466
+ logCapture(options, "info", "activating target tab before capture", {
1467
+ tabId: tab.id,
1468
+ windowId: tab.windowId
1469
+ });
1470
+ await dependencies.activateTab(tab.id);
1471
+ await dependencies.wait(100);
1472
+ }
1473
+ } catch {
1474
+ }
1475
+ }
1455
1476
  function logCapture(opts, level, message, meta) {
1456
1477
  opts?.onLog?.(level, message, meta);
1457
1478
  }
@@ -1543,6 +1564,7 @@ async function captureActiveTabScreenshot2(tab, options = {}) {
1543
1564
  stealFocus,
1544
1565
  focusUsed: shouldPrepareCompositor
1545
1566
  });
1567
+ await ensureTargetTabActive(tab, dependencies, options);
1546
1568
  const startedAt = Date.now();
1547
1569
  const result = await captureWithTimeout(tab.windowId, dependencies, timeoutMs);
1548
1570
  logCapture(options, "info", "capture succeeded", {
@@ -1804,7 +1826,7 @@ async function startTitleMarquee(tabId, sessionId, text) {
1804
1826
  marqueeCounters.set(tabId, { count: 1, sessionId });
1805
1827
  try {
1806
1828
  const expression = buildRuntimeExpression("cp.title.marquee", { text: text ?? "\u{1F916}" });
1807
- await cdpEvaluate(tabId, expression);
1829
+ await cdpEvaluateTransient(tabId, expression);
1808
1830
  } catch (err3) {
1809
1831
  console.warn("[HunterMate] startTitleMarquee failed", { tabId, error: err3.message });
1810
1832
  }
@@ -1817,7 +1839,7 @@ async function stopTitleMarquee(tabId, _sessionId) {
1817
1839
  marqueeCounters.delete(tabId);
1818
1840
  try {
1819
1841
  const expression = buildRuntimeExpression("cp.title.restore", {});
1820
- await cdpEvaluate(tabId, expression);
1842
+ await cdpEvaluateTransient(tabId, expression);
1821
1843
  } catch (err3) {
1822
1844
  console.warn("[HunterMate] stopTitleMarquee failed", { tabId, error: err3.message });
1823
1845
  }
@@ -1872,6 +1894,7 @@ async function executeControlCommand(rawCommand, rawArgs, options = {}) {
1872
1894
  if (command === "cp.screenshot") {
1873
1895
  const tab2 = await getControlTab(tabOverride);
1874
1896
  if (!tab2?.id) return err2("no_active_tab");
1897
+ if (isBlankKilledUrl(tab2.url)) return err2(TAB_KILLED_SECSCAN_MESSAGE, TAB_KILLED_SECSCAN_CODE);
1875
1898
  const stealFocus = controlArgs.stealFocus === true;
1876
1899
  const result = await withSessionBrackets(sessionId, tab2, explicitTab, groupTitle, async () => {
1877
1900
  log("debug", "cp.screenshot capturing", { tabId: tab2.id, windowId: tab2.windowId, stealFocus });
@@ -1974,6 +1997,7 @@ async function executeControlCommand(rawCommand, rawArgs, options = {}) {
1974
1997
  }
1975
1998
  }
1976
1999
  if (!tab.id) return err2("no_active_tab");
2000
+ if (isBlankKilledUrl(tab.url)) return err2(TAB_KILLED_SECSCAN_MESSAGE, TAB_KILLED_SECSCAN_CODE);
1977
2001
  if (sessionId && !explicitTab) {
1978
2002
  ensureSessionGroup(sessionId, groupTitle, tab).catch(
1979
2003
  (err3) => log("warn", "ensureSessionGroup failed", { sessionId, tabId: tab.id, error: err3.message })
@@ -2062,6 +2086,7 @@ async function executeControlCommand(rawCommand, rawArgs, options = {}) {
2062
2086
  }
2063
2087
  return evaluateInFrame(tabId, expr, frameId, frameUrl);
2064
2088
  }
2089
+ if (controlArgs.detachAfter !== false) return cdpEvaluateTransient(tabId, expr);
2065
2090
  return cdpEvaluate(tabId, expr);
2066
2091
  };
2067
2092
  const useExpression = await evalWith(buildEvalSyntaxCheckExpression(script)).catch(() => false) === true;
@@ -2095,7 +2120,7 @@ async function executeControlCommand(rawCommand, rawArgs, options = {}) {
2095
2120
  return err2("liepin_extract_requires_http_page");
2096
2121
  }
2097
2122
  try {
2098
- const result = await cdpEvaluate(tab.id, LIEPIN_EXTRACT_SOURCE);
2123
+ const result = await cdpEvaluateTransient(tab.id, LIEPIN_EXTRACT_SOURCE);
2099
2124
  return ok(result);
2100
2125
  } catch (e) {
2101
2126
  return err2(e instanceof Error ? e.message : String(e));
@@ -2115,6 +2140,8 @@ async function executeControlCommand(rawCommand, rawArgs, options = {}) {
2115
2140
  } catch (e) {
2116
2141
  console.warn("[HunterMate] CDP control failed, falling back to executeScript:", e);
2117
2142
  }
2143
+ } else if (isBlankKilledUrl(tab.url)) {
2144
+ return err2(TAB_KILLED_SECSCAN_MESSAGE, TAB_KILLED_SECSCAN_CODE);
2118
2145
  } else if (tab.url?.startsWith("chrome://") || tab.url?.startsWith("chrome-extension://") || tab.url?.startsWith("about:")) {
2119
2146
  return err2(
2120
2147
  `Cannot access a ${tab.url.split("/")[0]}// page for control commands. Open the target page in a normal tab first.`
@@ -2459,8 +2486,8 @@ async function runLinkedInSearch(args, log, ctx) {
2459
2486
  let diagnostics = null;
2460
2487
  if (leads.size === 0 && tab.id != null) {
2461
2488
  const t = await chrome.tabs.get(tab.id).catch(() => null);
2462
- const signal = t && t.id != null ? await cdpEvaluate(t.id, LIEPIN_WALL_CHECK_SOURCE).catch(() => null) : null;
2463
- const bodySnippet = t && t.id != null && (!t.url || t.url !== "about:blank") ? await cdpEvaluate(
2489
+ const signal = t && t.id != null ? await cdpEvaluateTransient(t.id, LIEPIN_WALL_CHECK_SOURCE).catch(() => null) : null;
2490
+ const bodySnippet = t && t.id != null && (!t.url || t.url !== "about:blank") ? await cdpEvaluateTransient(
2464
2491
  t.id,
2465
2492
  '(() => { const b = document.body && document.body.innerText; return b ? b.replace(/\\s+/g, " ").trim().slice(0, 300) : null; })()'
2466
2493
  ).catch(() => null) : null;
@@ -2550,6 +2577,37 @@ var LIEPIN_EXTRACT_SOURCE = String.raw`(async () => {
2550
2577
  });
2551
2578
  return out;
2552
2579
  };
2580
+ /* 实体契约 SSOT: hunter-mate packages/server/src/extraction/talent-entity.ts(2026-09-22 用户裁定):
2581
+ 实体字段尽量填满;实体外信息不静默丢弃——条目级未映射 col 进条目 extra,
2582
+ 实体级未消费区块进 extra.sections。两侧(extract 脚本/服务端快照解析)逻辑必须对齐。 */
2583
+ const pickUnmappedCols = (cols, knownList) => {
2584
+ const known = new Set(knownList);
2585
+ const out = {};
2586
+ Object.keys(cols || {}).forEach((k) => { if (!known.has(k)) out[k] = cols[k]; });
2587
+ return Object.keys(out).length ? out : null;
2588
+ };
2589
+ const sweepExtraSections = () => {
2590
+ const CONSUMED = ['single', 'basic-info', 'job-exp-info', 'job-expectancy-info-wrap', 'work-info',
2591
+ 'project-info', 'edu-info', 'lang-info', 'skill-info', 'self-eva-info', 'self-evaluation-info', 'operation-wrap'];
2592
+ const sections = [];
2593
+ const seen = new Set();
2594
+ document.querySelectorAll('[id^="resume-detail-"], [class*="resume-detail-"]').forEach((el) => {
2595
+ const id = el.id || '';
2596
+ const cls = (typeof el.className === 'string' ? el.className : '').split(/\s+/)
2597
+ .find((c) => c.startsWith('resume-detail-') && c !== 'resume-detail-template' && c !== 'resume-detail-template-cont') || '';
2598
+ const key = (id || cls).replace(/^resume-detail-/, '');
2599
+ if (!key || seen.has(key)) return;
2600
+ const isSection = el.querySelector('.resume-detail-template-cont') !== null
2601
+ || !(el.parentElement && el.parentElement.closest('[id^="resume-detail-"], [class*="resume-detail-"]'));
2602
+ if (!isSection) return;
2603
+ seen.add(key);
2604
+ if (CONSUMED.includes(key)) return;
2605
+ const text = txt(el);
2606
+ if (!text) return;
2607
+ sections.push({ key, title: txt(el.querySelector('.resume-detail-template-title, .template-title, h3, h4')), text: text.length > 2000 ? text.slice(0, 2000) + '…' : text });
2608
+ });
2609
+ return sections;
2610
+ };
2553
2611
  const resIdFrom = (href, scm) => {
2554
2612
  if (scm) {
2555
2613
  const m = scm.match(/cid=([^&]+)/);
@@ -2567,12 +2625,22 @@ var LIEPIN_EXTRACT_SOURCE = String.raw`(async () => {
2567
2625
  const entities = [];
2568
2626
  const links = { talent: [], company: [], job: [] };
2569
2627
 
2570
- if (document.querySelector('#resume-detail-basic-info')) {
2571
- const basic = first('#resume-detail-basic-info');
2572
- const sepInfos = basic.querySelectorAll('.basic-cont .sep-info');
2573
- const parts0 = sepInfos.length > 0 ? splitByI(sepInfos[0]) : [];
2574
- const parts1 = sepInfos.length > 1 ? splitByI(sepInfos[1]) : [];
2575
- const joined0 = parts0.join(' ');
2628
+ /* 详情页锚点 2026-09-19 drift:容器由 id="resume-detail-*-info" 改为 class="resume-detail-*"(如
2629
+ .resume-detail-basic-info / .resume-detail-job-expectancy-info-wrap / .resume-detail-work-info),
2630
+ 工作经历条目由 .rd-work-item-cont 改为 .rd-info-tpl-item;新旧两种 DOM 均兼容(先 id 后 class)。 */
2631
+ const basicRoot = first('#resume-detail-basic-info') || first('.resume-detail-basic-info');
2632
+ if (basicRoot) {
2633
+ const basic = basicRoot;
2634
+ /* sep-info 分行定位:contact=含"方便联系时间";personal=含 岁/工作N年;company=其余(职位+公司)。
2635
+ 旧 DOM 公司名在个人行末段,新 DOM 公司名在独立行,两种形态都解析。 */
2636
+ const sepEls = Array.from(basic.querySelectorAll('.basic-cont .sep-info, .sep-info'));
2637
+ const sepParts = sepEls.map((el) => splitByI(el));
2638
+ const contactIdx = sepParts.findIndex((p) => /方便联系时间/.test(p.join(' ')));
2639
+ const personalIdx = sepParts.findIndex((p) => /岁|工作\s*\d+\s*年/.test(p.join(' ')));
2640
+ const partsP = personalIdx >= 0 ? sepParts[personalIdx] : (sepParts[0] || []);
2641
+ const companyIdx = sepParts.findIndex((p, i) => i !== personalIdx && i !== contactIdx && p.join(' ').trim().length > 0);
2642
+ const partsC = companyIdx >= 0 ? sepParts[companyIdx] : [];
2643
+ const joined0 = partsP.join(' ');
2576
2644
  const age = joined0.match(/(\d+)\s*岁/);
2577
2645
  const workYears = joined0.match(/工作\s*(\d+)\s*年/);
2578
2646
  const name = txt(first('.name-box .name', basic));
@@ -2580,10 +2648,11 @@ var LIEPIN_EXTRACT_SOURCE = String.raw`(async () => {
2580
2648
  const contactTimeRaw = txt(statusBox);
2581
2649
  const scm = attr(document.querySelector('[data-tlg-scm]'), 'data-tlg-scm');
2582
2650
 
2583
- const intentRoot = first('#resume-detail-job-exp-info');
2651
+ const intentRoot = first('#resume-detail-job-exp-info') || first('.resume-detail-job-expectancy-info-wrap');
2584
2652
  const workExperiences = [];
2585
- document.querySelectorAll('#resume-detail-work-info .rd-work-item-cont').forEach((item) => {
2653
+ document.querySelectorAll('#resume-detail-work-info .rd-work-item-cont, .resume-detail-work-info .rd-info-tpl-item').forEach((item) => {
2586
2654
  const cols = readInfoCols(item);
2655
+ const extra = pickUnmappedCols(cols, ['所在部门', '工作地点', '下属人数', '汇报对象', '职责业绩']);
2587
2656
  workExperiences.push({
2588
2657
  company: attr(first('.rd-work-comp h5', item), 'title') || txt(first('.rd-work-comp h5', item)),
2589
2658
  ...parsePeriod(txt(first('.rd-work-time', item))),
@@ -2593,11 +2662,13 @@ var LIEPIN_EXTRACT_SOURCE = String.raw`(async () => {
2593
2662
  subordinates: cols['下属人数'] != null ? Number(cols['下属人数']) : null,
2594
2663
  reportsTo: cols['汇报对象'] || null,
2595
2664
  responsibilities: cols['职责业绩'] || null,
2665
+ ...(extra ? { extra } : {}),
2596
2666
  });
2597
2667
  });
2598
2668
  const projects = [];
2599
- document.querySelectorAll('#resume-detail-project-info .rd-project-item-cont').forEach((item) => {
2669
+ document.querySelectorAll('#resume-detail-project-info .rd-project-item-cont, .resume-detail-project-info .rd-project-item-cont, .resume-detail-project-info .rd-info-tpl-item').forEach((item) => {
2600
2670
  const cols = readInfoCols(item);
2671
+ const extra = pickUnmappedCols(cols, ['项目职务', '所在公司', '项目描述', '项目职责']);
2601
2672
  projects.push({
2602
2673
  name: attr(first('.rd-project-name h5', item), 'title') || txt(first('.rd-project-name h5', item)),
2603
2674
  ...parsePeriod(txt(first('.rd-project-time', item))),
@@ -2605,34 +2676,51 @@ var LIEPIN_EXTRACT_SOURCE = String.raw`(async () => {
2605
2676
  company: cols['所在公司'] || null,
2606
2677
  description: cols['项目描述'] || null,
2607
2678
  duties: cols['项目职责'] || null,
2679
+ ...(extra ? { extra } : {}),
2608
2680
  });
2609
2681
  });
2610
2682
  const education = [];
2611
- document.querySelectorAll('#resume-detail-edu-info .rd-edu-info-item').forEach((item) => {
2683
+ document.querySelectorAll('#resume-detail-edu-info .rd-edu-info-item, .resume-detail-edu-info .rd-edu-info-item').forEach((item) => {
2684
+ /* 新 DOM 无 .school-special/.school-degree/.school-time,从条目文本 "学校 · 专业 · 学历时间段" 兜底解析 */
2685
+ const raw = txt(item) || '';
2686
+ const segs = raw.split('·').map((s) => clean(s)).filter(Boolean);
2687
+ const periodM = raw.match(/\d{4}\.\d{2}\s*-\s*(?:\d{4}\.\d{2}|至今)/);
2688
+ const segEdu = (segs.length > 2 ? segs[2] : (segs.length > 1 ? segs[1] : '')).match(/(博士|硕士|MBA|本科|大专|专科|高中|中专|初中)/);
2612
2689
  education.push({
2613
2690
  school: attr(first('.school-name', item), 'title') || txt(first('.school-name', item)),
2614
- major: attr(first('.school-special', item), 'title') || txt(first('.school-special', item)),
2615
- degree: attr(first('.school-degree', item), 'title') || txt(first('.school-degree', item)),
2616
- period: txt(first('.school-time', item)),
2617
- tags: Array.from(item.querySelectorAll('.edu-school-tags .tag-item')).map((t) => txt(t)).filter(Boolean),
2691
+ major: attr(first('.school-special', item), 'title') || txt(first('.school-special', item)) || (segs.length > 1 ? (segs[1].match(/(博士|硕士|MBA|本科|大专|专科|高中|中专|初中)/) ? null : segs[1]) : null),
2692
+ degree: attr(first('.school-degree', item), 'title') || txt(first('.school-degree', item)) || (segEdu ? segEdu[0] : null),
2693
+ period: txt(first('.school-time', item)) || (periodM ? periodM[0] : null),
2694
+ tags: Array.from(item.querySelectorAll('.edu-school-tags .tag-item, .tag-item')).map((t) => txt(t)).filter(Boolean),
2618
2695
  });
2619
2696
  });
2620
2697
 
2698
+ /* currentPosition/currentCompany:新 DOM 职位与公司同在独立行(首段=职位,其余=公司);
2699
+ 旧 DOM 公司名在个人行末段,回退取之。脱敏标记优先:个人行末段=「保密」时原样保留
2700
+ (2026-09-03 fixture=事实标准,spec「猎头端脱敏原样保留」,与 liepin-extractor.ts 同步)。 */
2701
+ const currentPosition = partsC.length ? partsC[0] : null;
2702
+ const personalLast = partsP.length ? partsP[partsP.length - 1] : null;
2703
+ const companyFromLine = partsC.length > 1 ? partsC.slice(1).join(' ') : null;
2704
+ const currentCompany = personalLast === '保密' ? '保密' : (companyFromLine || personalLast);
2705
+ /* 实体外区块兜底:未消费的简历区块(培训/证书/荣誉等)原文进 extra.sections */
2706
+ const extraSections = sweepExtraSections();
2621
2707
  entities.push({
2622
2708
  entityType: 'talent',
2623
2709
  platform: 'liepin',
2624
2710
  resId: resIdFrom(url, scm),
2625
2711
  name,
2626
2712
  nameMasked: name ? /\*/.test(name) : undefined,
2627
- statusTag: txt(first('.user-status-tag', basic)),
2628
- gender: parts0.find((p) => /^(男|女)$/.test(p)) || null,
2713
+ statusTag: txt(first('.user-status-tag', basic)) || (txt(basic).match(/在职[,,][^||]*/) || [])[0] || null,
2714
+ gender: partsP.find((p) => /^(男|女)$/.test(p)) || null,
2629
2715
  age: age ? Number(age[1]) : null,
2630
- city: parts0.find((p) => /^(北京|上海|广州|深圳|天津|重庆|杭州|南京|苏州|成都|武汉|西安|[一-龥]{2,6})$/.test(p) && !/^(男|女|保密)$/.test(p) && !/岁|年/.test(p)) || null,
2631
- degree: parts0.find((p) => /(博士|硕士|MBA|本科|大专|专科|高中|中专|初中)/.test(p)) || null,
2716
+ /* city:先精确匹配已知城市;泛化兜底必须排除学历词——否则「本科」先于「深圳」命中(2026-09-22 实体契约测试实证) */
2717
+ city: partsP.find((p) => /^(北京|上海|广州|深圳|天津|重庆|杭州|南京|苏州|成都|武汉|西安)$/.test(p))
2718
+ || partsP.find((p) => /^[一-龥]{2,6}$/.test(p) && !/^(男|女|保密)$/.test(p) && !/岁|年/.test(p) && !/(博士|硕士|MBA|本科|大专|专科|高中|中专|初中)/.test(p)) || null,
2719
+ degree: partsP.find((p) => /(博士|硕士|MBA|本科|大专|专科|高中|中专|初中)/.test(p)) || null,
2632
2720
  workYears: workYears ? Number(workYears[1]) : null,
2633
- currentCompany: parts0.length ? parts0[parts0.length - 1] : null,
2634
- currentCompanyMasked: parts0.includes('保密') ? true : undefined,
2635
- currentPosition: parts1.length ? parts1[0] : null,
2721
+ currentCompany: currentCompany || null,
2722
+ currentCompanyMasked: partsP.includes('保密') || (currentCompany ? /保密/.test(currentCompany) : false) ? true : undefined,
2723
+ currentPosition,
2636
2724
  contactTime: contactTimeRaw ? contactTimeRaw.replace(/^方便联系时间[::]\s*/, '') : null,
2637
2725
  photoUrl: (() => { const img = first('.logo-box img', basic); return img ? abs(img.getAttribute('src')) : null; })(),
2638
2726
  intent: intentRoot ? {
@@ -2644,13 +2732,91 @@ var LIEPIN_EXTRACT_SOURCE = String.raw`(async () => {
2644
2732
  workExperiences,
2645
2733
  projects,
2646
2734
  education,
2647
- languages: Array.from(document.querySelectorAll('#resume-detail-lang-info .rd-lang-item .lang-name')).map((el) => txt(el)).filter(Boolean),
2648
- selfEvaluation: txt(first('#resume-detail-self-eva-info .resume-detail-template-cont')),
2735
+ languages: Array.from(document.querySelectorAll('#resume-detail-lang-info .rd-lang-item .lang-name, .resume-detail-lang-info .rd-lang-item .lang-name')).map((el) => txt(el)).filter(Boolean),
2736
+ /* 我的技能(skill-tag 标签,2026-09-22 实测新 DOM 区块 resume-detail-skill-info) */
2737
+ skills: Array.from(document.querySelectorAll('#resume-detail-skill-info .skill-tag, .resume-detail-skill-info .skill-tag')).map((el) => txt(el)).filter(Boolean),
2738
+ selfEvaluation: txt(first('#resume-detail-self-eva-info .resume-detail-template-cont')) || txt(first('.resume-detail-self-evaluation-info')),
2649
2739
  statement: txt(first('.c-detail-statement')),
2650
2740
  hasAntiScrapeWatermark: document.querySelectorAll('.cozue').length > 0,
2741
+ ...(extraSections.length ? { extra: { sections: extraSections } } : {}),
2651
2742
  url: canonical,
2652
2743
  source: 'liepin',
2653
2744
  });
2745
+ } else if (document.querySelector('.detail-resume-card-wrap')) {
2746
+ /* 搜索结果列表 v3(2026-09-22 实测 drift,hmh#57):.detail-resume-card-wrap 卡片,
2747
+ resId 在卡片内 input[name="res_id_encode"];卡片无详情锚点(a[href*=showresumedetail]=0 实证),
2748
+ 正文行「姓名** | NN岁 | 工作N年 | 学历 | 地点…」,详情 URL 按 res_id_encode 构造。
2749
+ 字段解析策略参照 hmh outputs/liepin-uae/driver3.py(真实结果页验证通过实现)。 */
2750
+ document.querySelectorAll('.detail-resume-card-wrap').forEach((card) => {
2751
+ const inp = card.querySelector('input[name="res_id_encode"]');
2752
+ const resId = inp ? inp.value : null;
2753
+ if (!resId) return;
2754
+ const text = clean((card.innerText || card.textContent || '').replace(/\n+/g, ' '));
2755
+ const nameM = text.match(/([^\s|((]+)\*\*/);
2756
+ const ageM = text.match(/(\d+)岁/);
2757
+ const yrsM = text.match(/工作(\d+)年/);
2758
+ const eduM = text.match(/(博士|MBA|硕士|本科|大专|高中|中专|初中)/);
2759
+ const name = nameM ? nameM[1] + '**' : null;
2760
+ const titleBits = [
2761
+ ageM ? ageM[1] + '岁' : null,
2762
+ yrsM ? '工作' + yrsM[1] + '年' : null,
2763
+ eduM ? eduM[1] : null,
2764
+ ].filter(Boolean).join(' ');
2765
+ const href = 'https://h.liepin.com/resume/showresumedetail/?res_id_encode=' + resId + '&resOwnerType=0&sfrom=MY_RESUME';
2766
+ const lead = {
2767
+ url: href,
2768
+ name,
2769
+ titleLine: [name, titleBits].filter(Boolean).join(' | '),
2770
+ resId,
2771
+ education: eduM ? eduM[1] : null,
2772
+ recentWork: [],
2773
+ acquiredAt: null,
2774
+ activity: null,
2775
+ city: null,
2776
+ workYearsText: yrsM ? '工作' + yrsM[1] + '年' : null,
2777
+ expect: null,
2778
+ skills: [],
2779
+ source: 'liepin',
2780
+ };
2781
+ if (!links.talent.some((l) => l.url === lead.url)) links.talent.push(lead);
2782
+ });
2783
+ } else if (document.querySelector('.new-resume-card tbody tr')) {
2784
+ /* 搜索结果列表 v2(2026-09-19 实测 drift):table.new-resume-card > tbody > tr,每行一张卡片
2785
+ (.tlog-common-resume-card);resId 在 checkbox input[name="res_id_encode"];卡片无详情锚点,
2786
+ 详情 URL 按 res_id_encode 构造。旧 .talent-resume-card 分支保留兼容人才管理页。 */
2787
+ document.querySelectorAll('.new-resume-card tbody tr').forEach((tr) => {
2788
+ const card = tr.querySelector('.tlog-common-resume-card');
2789
+ if (!card) return;
2790
+ const cb = tr.querySelector('input[name="res_id_encode"]');
2791
+ const resId = cb ? cb.value : null;
2792
+ if (!resId) return;
2793
+ const cardName = txt(first('.new-resume-personal-name', card));
2794
+ const cardAge = txt(first('.personal-detail-age', card));
2795
+ const cardWorkYears = txt(first('.personal-detail-workyears', card));
2796
+ const cardEdu = txt(first('.personal-detail-edulevel', card));
2797
+ const cardDq = txt(first('.personal-detail-dq', card));
2798
+ const cardActivity = txt(first('.new-resume-offline', card));
2799
+ const cardExpect = txt(first('.personal-expect-content', card)) || txt(first('.new-resume-personal-expect', card));
2800
+ const cardSkills = Array.from(card.querySelectorAll('.new-resume-personal-skills .tag-item, .new-resume-personal-skills span, .new-resume-personal-skills li')).map((s) => txt(s)).filter(Boolean);
2801
+ const href = 'https://h.liepin.com/resume/showresumedetail/?res_id_encode=' + resId + '&resOwnerType=0&sfrom=MY_RESUME';
2802
+ const titleBits = [cardAge, cardWorkYears, cardEdu, cardDq].filter(Boolean).join(' ');
2803
+ const lead = {
2804
+ url: href,
2805
+ name: cardName,
2806
+ titleLine: [cardName, titleBits].filter(Boolean).join(' | '),
2807
+ resId,
2808
+ education: cardEdu,
2809
+ recentWork: [],
2810
+ acquiredAt: null,
2811
+ activity: cardActivity,
2812
+ city: cardDq,
2813
+ workYearsText: cardWorkYears,
2814
+ expect: cardExpect,
2815
+ skills: cardSkills,
2816
+ source: 'liepin',
2817
+ };
2818
+ if (!links.talent.some((l) => l.url === lead.url)) links.talent.push(lead);
2819
+ });
2654
2820
  } else if (document.querySelector('.talent-resume-card')) {
2655
2821
  /* 人才管理页/搜索结果列表:.talent-resume-card 卡片(事实源 §7) */
2656
2822
  document.querySelectorAll('.talent-resume-card').forEach((card) => {
@@ -2694,9 +2860,9 @@ var LIEPIN_EXTRACT_SOURCE = String.raw`(async () => {
2694
2860
  });
2695
2861
  }
2696
2862
 
2697
- const pageClass = document.querySelector('#resume-detail-basic-info')
2863
+ const pageClass = (document.querySelector('#resume-detail-basic-info') || document.querySelector('.resume-detail-basic-info'))
2698
2864
  ? 'talent'
2699
- : (document.querySelector('.talent-resume-card') ? 'resume-list' : (links.talent.length ? 'list' : 'unknown'));
2865
+ : ((document.querySelector('.detail-resume-card-wrap') || document.querySelector('.new-resume-card tbody tr') || document.querySelector('.talent-resume-card')) ? 'resume-list' : (links.talent.length ? 'list' : 'unknown'));
2700
2866
  return {
2701
2867
  url,
2702
2868
  canonical,
@@ -2875,7 +3041,7 @@ var LIEPIN_RESULT_WAIT_SOURCE = String.raw`(() => {
2875
3041
  const tick = () => {
2876
3042
  let hit = false;
2877
3043
  try {
2878
- hit = !!(document.querySelector('.talent-resume-card') || document.querySelector('a[href*="showresumedetail"]'));
3044
+ hit = !!(document.querySelector('.talent-resume-card') || document.querySelector('a[href*="showresumedetail"]') || document.querySelector('.new-resume-card tbody tr') || document.querySelector('input[name="res_id_encode"]'));
2879
3045
  if (!hit && /没有找到|暂无相关|0\s*条结果|共\s*0\s*条/.test(document.body ? document.body.innerText : '')) return resolve('empty');
2880
3046
  } catch (e) {}
2881
3047
  if (hit) return resolve(true);
@@ -2954,7 +3120,7 @@ async function runLiepinSearch(args, log, ctx) {
2954
3120
  if (!t.url || t.url === "about:blank") {
2955
3121
  throw new ControlBlockedError("LIE_PIN_BLANK_KILL", `liepin search aborted at ${phase}: page killed to about:blank (secscan)`);
2956
3122
  }
2957
- const blocked = await cdpEvaluate(tab.id, LIEPIN_WALL_CHECK_SOURCE).catch(() => null);
3123
+ const blocked = await cdpEvaluateTransient(tab.id, LIEPIN_WALL_CHECK_SOURCE).catch(() => null);
2958
3124
  if (blocked) {
2959
3125
  const code = liepinBlockedCode(blocked);
2960
3126
  log("warn", "hm.liepin.search blocked by liepin risk control", { blocked, code, phase });
@@ -2967,7 +3133,7 @@ async function runLiepinSearch(args, log, ctx) {
2967
3133
  await sleep(1500);
2968
3134
  await assertNotBlocked("after-load");
2969
3135
  const fillExpr = "(() => { const P = " + JSON.stringify(fillParams) + "; return (" + LIEPIN_FILL_AND_SEARCH_SOURCE + ")(P); })()";
2970
- const fillResult = await cdpEvaluate(tab.id, fillExpr, 6e4);
3136
+ const fillResult = await cdpEvaluateTransient(tab.id, fillExpr, 6e4);
2971
3137
  applied.push(...fillResult?.applied ?? []);
2972
3138
  fillErrors.push(...fillResult?.errors ?? []);
2973
3139
  if (!fillResult?.submitted) {
@@ -2977,14 +3143,14 @@ async function runLiepinSearch(args, log, ctx) {
2977
3143
  log("info", "hm.liepin.search form submitted", { applied, fillErrors });
2978
3144
  for (let page = 1; page <= maxPages; page++) {
2979
3145
  if (tab.id == null) break;
2980
- const waited = await cdpEvaluate(tab.id, LIEPIN_RESULT_WAIT_SOURCE, 3e4).catch(() => false);
3146
+ const waited = await cdpEvaluateTransient(tab.id, LIEPIN_RESULT_WAIT_SOURCE, 3e4).catch(() => false);
2981
3147
  await sleep(1200);
2982
3148
  await assertNotBlocked(`page-${page}`);
2983
3149
  if (waited === "empty") {
2984
3150
  log("info", "hm.liepin.search empty result", { page });
2985
3151
  break;
2986
3152
  }
2987
- const extracted = await cdpEvaluate(tab.id, LIEPIN_EXTRACT_SOURCE, 3e4);
3153
+ const extracted = await cdpEvaluateTransient(tab.id, LIEPIN_EXTRACT_SOURCE, 3e4);
2988
3154
  const pageLeads = extracted?.links?.talent || [];
2989
3155
  for (const l of pageLeads) {
2990
3156
  if (l.url && !leads.has(l.url)) {
@@ -3001,7 +3167,7 @@ async function runLiepinSearch(args, log, ctx) {
3001
3167
  pagesScanned = page;
3002
3168
  log("info", "hm.liepin.search page extracted", { page, pageLeads: pageLeads.length, total: leads.size });
3003
3169
  if (page >= maxPages) break;
3004
- const clicked = await cdpEvaluate(tab.id, LIEPIN_NEXT_CLICK_SOURCE).catch(() => false);
3170
+ const clicked = await cdpEvaluateTransient(tab.id, LIEPIN_NEXT_CLICK_SOURCE).catch(() => false);
3005
3171
  if (!clicked) break;
3006
3172
  await sleep(3e3 + Math.random() * 2e3);
3007
3173
  await assertNotBlocked(`page-${page}-next`);
@@ -3192,6 +3358,11 @@ var HIREDCHINA_EXTRACT_SOURCE = String.raw`(async () => {
3192
3358
  function err2(message, code) {
3193
3359
  return { status: "error", code, message };
3194
3360
  }
3361
+ var TAB_KILLED_SECSCAN_CODE = "tab_killed_secscan";
3362
+ var TAB_KILLED_SECSCAN_MESSAGE = "Tab was killed to about:blank (likely anti-bot secscan). Recovery: open a new tab (cp.tab.new) and navigate again.";
3363
+ function isBlankKilledUrl(url) {
3364
+ return !url || url === "about:blank";
3365
+ }
3195
3366
  async function handleCookiesCommand(args) {
3196
3367
  const action = typeof args.action === "string" ? args.action : "get";
3197
3368
  const domain = typeof args.domain === "string" ? args.domain : void 0;
@@ -3805,7 +3976,261 @@ async function createBackgroundLogForwarder(options) {
3805
3976
  };
3806
3977
  }
3807
3978
 
3979
+ // src/shared/diag.ts
3980
+ var ringKey = (src) => `hm.diag.ring.${src}`;
3981
+ var MAX_EVENTS = 400;
3982
+ var writeChain = Promise.resolve();
3983
+ function diag(src, event, detail, onError) {
3984
+ writeChain = writeChain.then(async () => {
3985
+ try {
3986
+ const key = ringKey(src);
3987
+ const got = await chrome.storage.local.get(key);
3988
+ const ring = Array.isArray(got[key]) ? got[key] : [];
3989
+ ring.push({ ts: Date.now(), src, event, detail });
3990
+ await chrome.storage.local.set({ [key]: ring.slice(-MAX_EVENTS) });
3991
+ } catch (e) {
3992
+ try {
3993
+ onError?.(e);
3994
+ } catch {
3995
+ }
3996
+ }
3997
+ });
3998
+ writeChain = writeChain.catch(() => void 0);
3999
+ }
4000
+ async function readDiagRing() {
4001
+ try {
4002
+ const got = await chrome.storage.local.get([ringKey("sw"), ringKey("offscreen")]);
4003
+ const sw = Array.isArray(got[ringKey("sw")]) ? got[ringKey("sw")] : [];
4004
+ const off = Array.isArray(got[ringKey("offscreen")]) ? got[ringKey("offscreen")] : [];
4005
+ return [...sw, ...off].sort((a, b) => a.ts - b.ts);
4006
+ } catch {
4007
+ return [];
4008
+ }
4009
+ }
4010
+
4011
+ // ../../node_modules/.pnpm/@chromepilot+kit@0.1.8_@sentry+node@10.70.0_@opentelemetry+core@2.10.0_@opentelemetry+api@1.9.1__/node_modules/@chromepilot/kit/dist/offscreen.js
4012
+ var OFFSCREEN_MSG = {
4013
+ /** SW → offscreen:注入身份(getManifest 在 offscreen 不可用) */
4014
+ INIT: "offscreen:init",
4015
+ /** SW → offscreen:上行 raw 帧(队列兜底在 offscreen 侧) */
4016
+ SEND: "offscreen:send",
4017
+ /** SW → offscreen:查询连接状态 */
4018
+ GET_STATE: "offscreen:get-state",
4019
+ /** offscreen → SW:连接状态变化 */
4020
+ WS_STATE: "offscreen:ws-state",
4021
+ /** offscreen → SW:server 下行透传(payload 为解析后的 JSON) */
4022
+ WS_MESSAGE: "offscreen:ws-message",
4023
+ /** offscreen → SW:诊断事件(offscreen 无 chrome.storage,经 SW 落环形缓冲) */
4024
+ DIAG: "offscreen:diag"
4025
+ };
4026
+ var OFFSCREEN_REASON_WORKERS = "WORKERS";
4027
+ var CLOSE_DOCUMENT_TIMEOUT_MS = 3e3;
4028
+ var RECREATE_SETTLE_MS = 1e3;
4029
+ var DEFAULT_WS_RECYCLE_TICKS = 2;
4030
+ function createSwOffscreenRelay(opts) {
4031
+ const recycleTicks = opts.recycleTicks ?? DEFAULT_WS_RECYCLE_TICKS;
4032
+ const closeTimeoutMs = opts.closeTimeoutMs ?? CLOSE_DOCUMENT_TIMEOUT_MS;
4033
+ const recreateSettleMs = opts.recreateSettleMs ?? RECREATE_SETTLE_MS;
4034
+ const diag2 = (src, event, detail) => {
4035
+ try {
4036
+ opts.onDiag?.(src, event, detail);
4037
+ } catch {
4038
+ }
4039
+ };
4040
+ let urlCache = null;
4041
+ let wsConnected = false;
4042
+ let wsDisconnectedTicks = 0;
4043
+ async function resolveUrl() {
4044
+ if (!urlCache)
4045
+ urlCache = await opts.getOffscreenUrl();
4046
+ return urlCache;
4047
+ }
4048
+ function sendInitToOffscreen() {
4049
+ const manifest = chrome.runtime.getManifest();
4050
+ chrome.runtime.sendMessage({
4051
+ type: OFFSCREEN_MSG.INIT,
4052
+ extensionId: chrome.runtime.id,
4053
+ version: manifest.version
4054
+ }).catch(() => {
4055
+ });
4056
+ }
4057
+ async function createWithZombieRecovery() {
4058
+ const url = await resolveUrl();
4059
+ try {
4060
+ await chrome.offscreen.createDocument({
4061
+ url,
4062
+ // @types/chrome: Reason 为枚举,字面量字符串不通过 tsc(运行时值相同)
4063
+ reasons: [OFFSCREEN_REASON_WORKERS],
4064
+ justification: opts.justification
4065
+ });
4066
+ diag2("sw", "ensureOffscreen:created", { attempt: 1 });
4067
+ sendInitToOffscreen();
4068
+ } catch (createErr) {
4069
+ const msg = createErr instanceof Error ? createErr.message : String(createErr);
4070
+ opts.sendLog?.("warn", "ensureOffscreen createDocument failed, retry after closeDocument", { error: msg });
4071
+ diag2("sw", "ensureOffscreen:create-conflict", { error: msg });
4072
+ try {
4073
+ await Promise.race([
4074
+ chrome.offscreen.closeDocument(),
4075
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`closeDocument timeout ${closeTimeoutMs / 1e3}s`)), closeTimeoutMs))
4076
+ ]);
4077
+ } catch {
4078
+ diag2("sw", "ensureOffscreen:close-failed-or-timeout", {});
4079
+ }
4080
+ await new Promise((r) => setTimeout(r, recreateSettleMs));
4081
+ await chrome.offscreen.createDocument({
4082
+ url: await resolveUrl(),
4083
+ reasons: [OFFSCREEN_REASON_WORKERS],
4084
+ justification: opts.justification
4085
+ });
4086
+ diag2("sw", "ensureOffscreen:created", { attempt: 2 });
4087
+ sendInitToOffscreen();
4088
+ }
4089
+ }
4090
+ let ensureInFlight = null;
4091
+ async function doEnsureOffscreen() {
4092
+ diag2("sw", "ensureOffscreen:begin", { wsConnected });
4093
+ let docExistedBefore = false;
4094
+ try {
4095
+ const contexts = await chrome.runtime.getContexts({
4096
+ contextTypes: [chrome.runtime.ContextType.OFFSCREEN_DOCUMENT]
4097
+ });
4098
+ diag2("sw", "ensureOffscreen:contexts", {
4099
+ count: contexts.length,
4100
+ // 全量快照(排除 documentId 长哈希):确认占据 offscreen 槽位的到底是谁
4101
+ docs: contexts.map((c) => ({
4102
+ url: c.url ?? null,
4103
+ documentUrl: c.documentUrl ?? null,
4104
+ frameId: c.frameId ?? null,
4105
+ origin: c.origin ?? null
4106
+ }))
4107
+ });
4108
+ if (contexts.length > 0) {
4109
+ docExistedBefore = true;
4110
+ sendInitToOffscreen();
4111
+ } else {
4112
+ await createWithZombieRecovery();
4113
+ }
4114
+ } catch (err3) {
4115
+ console.error("[SwOffscreenRelay] ensureOffscreen failed", err3);
4116
+ diag2("sw", "ensureOffscreen:fail", {
4117
+ error: err3 instanceof Error ? err3.message : String(err3)
4118
+ });
4119
+ opts.sendLog?.("error", "ensureOffscreen failed", {
4120
+ error: err3 instanceof Error ? err3.message : String(err3)
4121
+ });
4122
+ }
4123
+ try {
4124
+ const st = await chrome.runtime.sendMessage({ type: OFFSCREEN_MSG.GET_STATE });
4125
+ wsConnected = !!st?.wsConnected;
4126
+ diag2("sw", "ensureOffscreen:state", { wsConnected });
4127
+ opts.onWsState?.(wsConnected);
4128
+ } catch {
4129
+ diag2("sw", "ensureOffscreen:no-offscreen-response", {});
4130
+ }
4131
+ if (!wsConnected) {
4132
+ if (docExistedBefore) {
4133
+ wsDisconnectedTicks += 1;
4134
+ if (wsDisconnectedTicks >= recycleTicks) {
4135
+ wsDisconnectedTicks = 0;
4136
+ diag2("sw", "ensureOffscreen:recycle-suspect", {});
4137
+ opts.sendLog?.("warn", "offscreen alive but ws disconnected, recycling document", {});
4138
+ try {
4139
+ await chrome.offscreen.closeDocument();
4140
+ await new Promise((r) => setTimeout(r, 300));
4141
+ } catch {
4142
+ }
4143
+ return doEnsureOffscreen();
4144
+ }
4145
+ }
4146
+ } else {
4147
+ wsDisconnectedTicks = 0;
4148
+ }
4149
+ return wsConnected;
4150
+ }
4151
+ function ensureOffscreen2() {
4152
+ if (!ensureInFlight) {
4153
+ ensureInFlight = doEnsureOffscreen().finally(() => {
4154
+ ensureInFlight = null;
4155
+ });
4156
+ }
4157
+ return ensureInFlight;
4158
+ }
4159
+ function onRuntimeMessage(message) {
4160
+ if (message?.type === OFFSCREEN_MSG.WS_STATE) {
4161
+ wsConnected = !!message.wsConnected;
4162
+ diag2("sw", "ws-state-change", { wsConnected });
4163
+ opts.onWsState?.(wsConnected);
4164
+ return;
4165
+ }
4166
+ if (message?.type === OFFSCREEN_MSG.WS_MESSAGE) {
4167
+ try {
4168
+ opts.onDownlink?.(message.payload);
4169
+ } catch (err3) {
4170
+ diag2("sw", "downlink-handler-error", {
4171
+ error: err3 instanceof Error ? err3.message : String(err3)
4172
+ });
4173
+ }
4174
+ return;
4175
+ }
4176
+ if (message?.type === OFFSCREEN_MSG.DIAG && typeof message.event === "string") {
4177
+ diag2("offscreen", message.event, message.detail);
4178
+ return;
4179
+ }
4180
+ }
4181
+ return {
4182
+ attach() {
4183
+ chrome.runtime.onMessage.addListener(onRuntimeMessage);
4184
+ },
4185
+ ensureOffscreen: ensureOffscreen2,
4186
+ sendRaw(raw) {
4187
+ chrome.runtime.sendMessage({ type: OFFSCREEN_MSG.SEND, raw }).catch(() => {
4188
+ });
4189
+ },
4190
+ async getState() {
4191
+ try {
4192
+ const st = await chrome.runtime.sendMessage({ type: OFFSCREEN_MSG.GET_STATE });
4193
+ return { wsConnected: !!st?.wsConnected };
4194
+ } catch {
4195
+ return { wsConnected: false };
4196
+ }
4197
+ },
4198
+ async softReload() {
4199
+ diag2("sw", "soft-reload:begin", {});
4200
+ urlCache = null;
4201
+ wsDisconnectedTicks = 0;
4202
+ try {
4203
+ const contexts = await chrome.runtime.getContexts({
4204
+ contextTypes: [chrome.runtime.ContextType.OFFSCREEN_DOCUMENT]
4205
+ });
4206
+ if (contexts.length > 0)
4207
+ await chrome.offscreen.closeDocument();
4208
+ diag2("sw", "soft-reload:doc-closed", { count: contexts.length });
4209
+ } catch (err3) {
4210
+ diag2("sw", "soft-reload:close-failed", {
4211
+ error: err3 instanceof Error ? err3.message : String(err3)
4212
+ });
4213
+ }
4214
+ const ok2 = await ensureOffscreen2();
4215
+ diag2("sw", "soft-reload:done", {});
4216
+ return ok2;
4217
+ },
4218
+ get wsConnected() {
4219
+ return wsConnected;
4220
+ }
4221
+ };
4222
+ }
4223
+
3808
4224
  // src/background/service-worker.ts
4225
+ diag("sw", "sw-start", { reason: "top-level-eval" });
4226
+ self.addEventListener("error", (e) => diag("sw", "sw-error", { message: e.message, src: (e.filename || "").split("/").pop() }));
4227
+ self.addEventListener(
4228
+ "unhandledrejection",
4229
+ (e) => diag("sw", "sw-unhandledrejection", { reason: String(e.reason).slice(0, 300) })
4230
+ );
4231
+ chrome.runtime.onSuspend?.addListener(() => {
4232
+ diag("sw", "sw-suspend", { wsConnected: state.wsConnected });
4233
+ });
3809
4234
  var state = {
3810
4235
  serverConnected: false,
3811
4236
  wsConnected: false,
@@ -3815,6 +4240,7 @@ var state = {
3815
4240
  serverBuildTime: null
3816
4241
  };
3817
4242
  var tabStates = /* @__PURE__ */ new Map();
4243
+ var dedupAlertTargets = /* @__PURE__ */ new Map();
3818
4244
  var backgroundLogger = createExtensionLogger({ context: "background", sessionId: () => `bg-${Date.now()}` });
3819
4245
  backgroundLogger.patchConsole();
3820
4246
  var logForwarder = null;
@@ -3826,59 +4252,37 @@ createBackgroundLogForwarder({
3826
4252
  }).then((f) => {
3827
4253
  logForwarder = f;
3828
4254
  });
3829
- var OFFSCREEN_URL = "offscreen/offscreen.html";
3830
- function sendToOffscreen(raw) {
3831
- chrome.runtime.sendMessage({ type: "offscreen:send", raw }).catch(() => {
3832
- });
3833
- }
3834
- function sendInitToOffscreen() {
3835
- const manifest = chrome.runtime.getManifest();
3836
- chrome.runtime.sendMessage({ type: "offscreen:init", extensionId: chrome.runtime.id, version: manifest.version }).catch(() => {
3837
- });
3838
- }
3839
- async function ensureOffscreen() {
4255
+ async function getOffscreenUrl() {
4256
+ let v = "0";
3840
4257
  try {
3841
- const contexts = await chrome.runtime.getContexts({
3842
- contextTypes: [chrome.runtime.ContextType.OFFSCREEN_DOCUMENT]
3843
- });
3844
- if (contexts.length > 0) {
3845
- sendInitToOffscreen();
3846
- return;
3847
- }
3848
- try {
3849
- await chrome.offscreen.createDocument({
3850
- url: OFFSCREEN_URL,
3851
- // D1: WEBSOCKET 枚举从未在正式 Chrome 落地(152 实测抛枚举非法),必须用 WORKERS;
3852
- // @types/chrome 0.0.268 的 Reason 枚举同样没有 WEBSOCKET 成员,断言方向一致
3853
- reasons: ["WORKERS"],
3854
- justification: "hunter-mate \u9700\u4E0E\u672C\u5730 server \u4FDD\u6301\u5E38\u9A7B WebSocket \u8FDE\u63A5(MV3 SW \u4F1A\u88AB\u7A7A\u95F2\u56DE\u6536)"
3855
- });
3856
- sendInitToOffscreen();
3857
- } catch (createErr) {
3858
- const msg = createErr instanceof Error ? createErr.message : String(createErr);
3859
- sendLog("warn", "ensureOffscreen createDocument failed, retry after closeDocument", { error: msg });
3860
- try {
3861
- await chrome.offscreen.closeDocument();
3862
- } catch {
3863
- }
3864
- await new Promise((r) => setTimeout(r, 1e3));
3865
- await chrome.offscreen.createDocument({
3866
- url: OFFSCREEN_URL,
3867
- reasons: ["WORKERS"],
3868
- justification: "hunter-mate \u9700\u4E0E\u672C\u5730 server \u4FDD\u6301\u5E38\u9A7B WebSocket \u8FDE\u63A5(MV3 SW \u4F1A\u88AB\u7A7A\u95F2\u56DE\u6536)"
3869
- });
3870
- sendInitToOffscreen();
3871
- }
3872
- } catch (err3) {
3873
- console.error("[HunterMate] ensureOffscreen failed", err3);
3874
- sendLog("error", "ensureOffscreen failed", { error: err3 instanceof Error ? err3.message : String(err3) });
3875
- }
3876
- try {
3877
- const st = await chrome.runtime.sendMessage({ type: "offscreen:get-state" });
3878
- state.wsConnected = !!st?.wsConnected;
3879
- broadcastState();
4258
+ const r = await fetch(chrome.runtime.getURL("build-info.json"), { cache: "no-cache" });
4259
+ v = String((await r.json())?.buildTime ?? "0");
3880
4260
  } catch {
3881
4261
  }
4262
+ return `offscreen/offscreen.html?v=${encodeURIComponent(v)}`;
4263
+ }
4264
+ var offscreenRelay = createSwOffscreenRelay({
4265
+ getOffscreenUrl,
4266
+ justification: "hunter-mate \u9700\u4E0E\u672C\u5730 server \u4FDD\u6301\u5E38\u9A7B WebSocket \u8FDE\u63A5(MV3 SW \u4F1A\u88AB\u7A7A\u95F2\u56DE\u6536)",
4267
+ onDiag: (src, event, detail) => diag(src, event, detail),
4268
+ onDownlink: (payload) => {
4269
+ void handleServerMessage(payload);
4270
+ },
4271
+ onWsState: (connected) => {
4272
+ state.wsConnected = connected;
4273
+ broadcastState();
4274
+ },
4275
+ sendLog
4276
+ });
4277
+ offscreenRelay.attach();
4278
+ function sendToOffscreen(raw) {
4279
+ offscreenRelay.sendRaw(raw);
4280
+ }
4281
+ function ensureOffscreen() {
4282
+ return offscreenRelay.ensureOffscreen();
4283
+ }
4284
+ function softReloadExtension() {
4285
+ return offscreenRelay.softReload();
3882
4286
  }
3883
4287
  function sendLog(level, message, meta) {
3884
4288
  try {
@@ -3962,8 +4366,32 @@ async function handleServerMessage(data) {
3962
4366
  if (!data || typeof data !== "object") return;
3963
4367
  if (data.type === "pong" || data.type === "status" || data.type === "ack") return;
3964
4368
  if (data.type === "reload") {
3965
- console.log("[HunterMate] received reload broadcast, reloading extension in 200ms...");
3966
- setTimeout(() => chrome.runtime.reload(), 200);
4369
+ console.log("[HunterMate] received reload broadcast, soft-reloading offscreen...");
4370
+ diag("sw", "reload-broadcast-received", { mode: "soft" });
4371
+ void softReloadExtension();
4372
+ return;
4373
+ }
4374
+ if (data.type === "hm.dedup.alert" && data.entityId) {
4375
+ const entityId = Number(data.entityId);
4376
+ const count = Number(data.count) || 1;
4377
+ const topName = data.top?.name ? String(data.top.name) : "";
4378
+ sendLog("info", "extension dedup alert received", { entityId, count });
4379
+ try {
4380
+ const notifId = `hm-dedup-${entityId}`;
4381
+ chrome.notifications.create(notifId, {
4382
+ type: "basic",
4383
+ iconUrl: chrome.runtime.getURL("icons/icon128.png"),
4384
+ title: "\u4EBA\u624D\u5E93\u53D1\u73B0\u53EF\u80FD\u91CD\u590D\u7684\u8BB0\u5F55",
4385
+ message: `\u300C${topName || "\u4EBA\u624D"}\u300D\u7B49 ${count} \u6761\u5019\u9009\u4E0E\u521A\u5165\u5E93\u7684\u4EBA\u624D\u76F8\u4F3C,\u70B9\u51FB\u6253\u5F00\u8BE6\u60C5\u5904\u7406`,
4386
+ priority: 1
4387
+ }, () => {
4388
+ if (chrome.runtime.lastError) {
4389
+ sendLog("warn", "dedup notification create failed", { error: chrome.runtime.lastError.message });
4390
+ }
4391
+ });
4392
+ dedupAlertTargets.set(notifId, entityId);
4393
+ } catch {
4394
+ }
3967
4395
  return;
3968
4396
  }
3969
4397
  if ((data.type === "start-recording" || data.type === "stop-recording") && data.tabId) {
@@ -3991,6 +4419,11 @@ async function handleServerMessage(data) {
3991
4419
  wsHeldBy: "offscreen"
3992
4420
  }
3993
4421
  };
4422
+ } else if (data.command === "hm.diag") {
4423
+ outcome = {
4424
+ status: "ok",
4425
+ result: { ring: await readDiagRing(), state }
4426
+ };
3994
4427
  } else {
3995
4428
  try {
3996
4429
  outcome = await executeControlCommand(String(data.command ?? ""), data.params ?? {}, {
@@ -4020,23 +4453,13 @@ async function handleServerMessage(data) {
4020
4453
  sendLog("debug", "cmd_response sent", { requestId: data.requestId, status: resp.status, durationMs: resp.durationMs });
4021
4454
  }
4022
4455
  }
4023
- chrome.runtime.onMessage.addListener((message) => {
4024
- if (message?.type === "offscreen:ws-state") {
4025
- state.wsConnected = !!message.wsConnected;
4026
- broadcastState();
4027
- return;
4028
- }
4029
- if (message?.type === "offscreen:ws-message") {
4030
- void handleServerMessage(message.payload);
4031
- return;
4032
- }
4033
- });
4034
4456
  var RECONNECT_ALARM_NAME = "hm:reconnect";
4035
4457
  function ensureReconnectAlarm() {
4036
4458
  chrome.alarms.create(RECONNECT_ALARM_NAME, { periodInMinutes: 0.5 }).catch((err3) => console.error("[HunterMate] create reconnect alarm failed", err3));
4037
4459
  }
4038
4460
  chrome.alarms.onAlarm.addListener((alarm) => {
4039
4461
  if (alarm.name !== RECONNECT_ALARM_NAME) return;
4462
+ diag("sw", "alarm-tick", { wsConnected: state.wsConnected });
4040
4463
  checkHttpHealth();
4041
4464
  sendLog("debug", "sw:alarm-tick", { wsConnected: state.wsConnected });
4042
4465
  void ensureOffscreen();
@@ -4045,11 +4468,25 @@ ensureReconnectAlarm();
4045
4468
  void ensureOffscreen();
4046
4469
  chrome.runtime.onInstalled.addListener(() => {
4047
4470
  console.log("[HunterMate] onInstalled: cold-start offscreen");
4471
+ diag("sw", "onInstalled", {});
4048
4472
  ensureReconnectAlarm();
4049
4473
  void ensureOffscreen();
4050
4474
  });
4475
+ chrome.notifications?.onClicked.addListener((notifId) => {
4476
+ const entityId = dedupAlertTargets.get(notifId);
4477
+ if (!entityId) return;
4478
+ const url = `http://localhost:34571/talents?id=${entityId}`;
4479
+ chrome.tabs.query({ url: "http://localhost:34571/talents*" }).then((tabs) => {
4480
+ if (tabs.length > 0 && tabs[0].id != null) {
4481
+ return chrome.tabs.update(tabs[0].id, { url, active: true });
4482
+ }
4483
+ return chrome.tabs.create({ url, active: true });
4484
+ }).then(() => chrome.notifications.clear(notifId)).catch(() => {
4485
+ });
4486
+ });
4051
4487
  chrome.runtime.onStartup.addListener(() => {
4052
4488
  console.log("[HunterMate] onStartup: cold-start offscreen");
4489
+ diag("sw", "onStartup", {});
4053
4490
  ensureReconnectAlarm();
4054
4491
  void ensureOffscreen();
4055
4492
  });