hunter-mate 0.1.1 → 0.1.3

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 (403) hide show
  1. package/dist/assets/extension/_locales/en_US/messages.json +5 -0
  2. package/dist/assets/extension/_locales/zh_CN/messages.json +5 -0
  3. package/dist/assets/extension/background/service-worker.js +3253 -0
  4. package/dist/assets/extension/content/index.js +13660 -0
  5. package/dist/assets/extension/manifest.json +49 -0
  6. package/dist/assets/extension/package.json +24 -0
  7. package/dist/assets/extension/sidepanel/index.html +400 -0
  8. package/dist/assets/extension/sidepanel/index.js +852 -0
  9. package/dist/assets/server/agent-session/agent-session.controller.d.ts +32 -0
  10. package/dist/assets/server/agent-session/agent-session.controller.js +83 -0
  11. package/dist/assets/server/agent-session/agent-session.controller.js.map +1 -0
  12. package/dist/assets/server/agent-session/agent-session.guard.d.ts +4 -0
  13. package/dist/assets/server/agent-session/agent-session.guard.js +32 -0
  14. package/dist/assets/server/agent-session/agent-session.guard.js.map +1 -0
  15. package/dist/assets/server/agent-session/agent-session.module.d.ts +2 -0
  16. package/dist/assets/server/agent-session/agent-session.module.js +28 -0
  17. package/dist/assets/server/agent-session/agent-session.module.js.map +1 -0
  18. package/dist/assets/server/agent-session/agent-session.service.d.ts +54 -0
  19. package/dist/assets/server/agent-session/agent-session.service.js +431 -0
  20. package/dist/assets/server/agent-session/agent-session.service.js.map +1 -0
  21. package/dist/assets/server/agent-session/agent-session.types.d.ts +56 -0
  22. package/dist/assets/server/agent-session/agent-session.types.js +3 -0
  23. package/dist/assets/server/agent-session/agent-session.types.js.map +1 -0
  24. package/dist/assets/server/agent-session/entities/agent-event.entity.d.ts +12 -0
  25. package/dist/assets/server/agent-session/entities/agent-event.entity.js +73 -0
  26. package/dist/assets/server/agent-session/entities/agent-event.entity.js.map +1 -0
  27. package/dist/assets/server/agent-session/entities/agent-message.entity.d.ts +13 -0
  28. package/dist/assets/server/agent-session/entities/agent-message.entity.js +77 -0
  29. package/dist/assets/server/agent-session/entities/agent-message.entity.js.map +1 -0
  30. package/dist/assets/server/agent-session/entities/agent-session.entity.d.ts +14 -0
  31. package/dist/assets/server/agent-session/entities/agent-session.entity.js +83 -0
  32. package/dist/assets/server/agent-session/entities/agent-session.entity.js.map +1 -0
  33. package/dist/assets/server/app.module.d.ts +4 -0
  34. package/dist/assets/server/app.module.js +125 -0
  35. package/dist/assets/server/app.module.js.map +1 -0
  36. package/dist/assets/server/auth/auth.controller.d.ts +22 -0
  37. package/dist/assets/server/auth/auth.controller.js +88 -0
  38. package/dist/assets/server/auth/auth.controller.js.map +1 -0
  39. package/dist/assets/server/auth/auth.middleware.d.ts +5 -0
  40. package/dist/assets/server/auth/auth.middleware.js +34 -0
  41. package/dist/assets/server/auth/auth.middleware.js.map +1 -0
  42. package/dist/assets/server/auth/auth.module.d.ts +2 -0
  43. package/dist/assets/server/auth/auth.module.js +24 -0
  44. package/dist/assets/server/auth/auth.module.js.map +1 -0
  45. package/dist/assets/server/auth/auth.service.d.ts +30 -0
  46. package/dist/assets/server/auth/auth.service.js +183 -0
  47. package/dist/assets/server/auth/auth.service.js.map +1 -0
  48. package/dist/assets/server/auth/auth.types.d.ts +28 -0
  49. package/dist/assets/server/auth/auth.types.js +3 -0
  50. package/dist/assets/server/auth/auth.types.js.map +1 -0
  51. package/dist/assets/server/build-info.json +4 -0
  52. package/dist/assets/server/common/common.module.d.ts +2 -0
  53. package/dist/assets/server/common/common.module.js +22 -0
  54. package/dist/assets/server/common/common.module.js.map +1 -0
  55. package/dist/assets/server/common/crypto.service.d.ts +11 -0
  56. package/dist/assets/server/common/crypto.service.js +73 -0
  57. package/dist/assets/server/common/crypto.service.js.map +1 -0
  58. package/dist/assets/server/communication/communication-record.entity.d.ts +15 -0
  59. package/dist/assets/server/communication/communication-record.entity.js +80 -0
  60. package/dist/assets/server/communication/communication-record.entity.js.map +1 -0
  61. package/dist/assets/server/communication/communication.controller.d.ts +12 -0
  62. package/dist/assets/server/communication/communication.controller.js +61 -0
  63. package/dist/assets/server/communication/communication.controller.js.map +1 -0
  64. package/dist/assets/server/communication/communication.module.d.ts +2 -0
  65. package/dist/assets/server/communication/communication.module.js +25 -0
  66. package/dist/assets/server/communication/communication.module.js.map +1 -0
  67. package/dist/assets/server/communication/communication.service.d.ts +23 -0
  68. package/dist/assets/server/communication/communication.service.js +51 -0
  69. package/dist/assets/server/communication/communication.service.js.map +1 -0
  70. package/dist/assets/server/db/schema-validator.service.d.ts +25 -0
  71. package/dist/assets/server/db/schema-validator.service.js +107 -0
  72. package/dist/assets/server/db/schema-validator.service.js.map +1 -0
  73. package/dist/assets/server/db/schema-version.entity.d.ts +5 -0
  74. package/dist/assets/server/db/schema-version.entity.js +35 -0
  75. package/dist/assets/server/db/schema-version.entity.js.map +1 -0
  76. package/dist/assets/server/db/sqlite.module.d.ts +2 -0
  77. package/dist/assets/server/db/sqlite.module.js +79 -0
  78. package/dist/assets/server/db/sqlite.module.js.map +1 -0
  79. package/dist/assets/server/devops/devops-sink-init.d.ts +10 -0
  80. package/dist/assets/server/devops/devops-sink-init.js +96 -0
  81. package/dist/assets/server/devops/devops-sink-init.js.map +1 -0
  82. package/dist/assets/server/devops/devops-sink-init.spec.d.ts +1 -0
  83. package/dist/assets/server/devops/devops-sink-init.spec.js +71 -0
  84. package/dist/assets/server/devops/devops-sink-init.spec.js.map +1 -0
  85. package/dist/assets/server/devops/devops-sink.module.d.ts +2 -0
  86. package/dist/assets/server/devops/devops-sink.module.js +22 -0
  87. package/dist/assets/server/devops/devops-sink.module.js.map +1 -0
  88. package/dist/assets/server/extension/extension-control.controller.d.ts +67 -0
  89. package/dist/assets/server/extension/extension-control.controller.js +173 -0
  90. package/dist/assets/server/extension/extension-control.controller.js.map +1 -0
  91. package/dist/assets/server/extension/extension-control.service.d.ts +46 -0
  92. package/dist/assets/server/extension/extension-control.service.js +212 -0
  93. package/dist/assets/server/extension/extension-control.service.js.map +1 -0
  94. package/dist/assets/server/extension/extension-core.module.d.ts +2 -0
  95. package/dist/assets/server/extension/extension-core.module.js +21 -0
  96. package/dist/assets/server/extension/extension-core.module.js.map +1 -0
  97. package/dist/assets/server/extension/extension-version.controller.d.ts +6 -0
  98. package/dist/assets/server/extension/extension-version.controller.js +41 -0
  99. package/dist/assets/server/extension/extension-version.controller.js.map +1 -0
  100. package/dist/assets/server/extension/extension.module.d.ts +2 -0
  101. package/dist/assets/server/extension/extension.module.js +25 -0
  102. package/dist/assets/server/extension/extension.module.js.map +1 -0
  103. package/dist/assets/server/extraction/adapter.service.d.ts +41 -0
  104. package/dist/assets/server/extraction/adapter.service.js +161 -0
  105. package/dist/assets/server/extraction/adapter.service.js.map +1 -0
  106. package/dist/assets/server/extraction/entities/company-profile.entity.d.ts +14 -0
  107. package/dist/assets/server/extraction/entities/company-profile.entity.js +81 -0
  108. package/dist/assets/server/extraction/entities/company-profile.entity.js.map +1 -0
  109. package/dist/assets/server/extraction/entities/job-posting.entity.d.ts +15 -0
  110. package/dist/assets/server/extraction/entities/job-posting.entity.js +86 -0
  111. package/dist/assets/server/extraction/entities/job-posting.entity.js.map +1 -0
  112. package/dist/assets/server/extraction/entities/parse-log.entity.d.ts +15 -0
  113. package/dist/assets/server/extraction/entities/parse-log.entity.js +87 -0
  114. package/dist/assets/server/extraction/entities/parse-log.entity.js.map +1 -0
  115. package/dist/assets/server/extraction/entities/talent-profile.entity.d.ts +15 -0
  116. package/dist/assets/server/extraction/entities/talent-profile.entity.js +86 -0
  117. package/dist/assets/server/extraction/entities/talent-profile.entity.js.map +1 -0
  118. package/dist/assets/server/extraction/extraction-entity.controller.d.ts +100 -0
  119. package/dist/assets/server/extraction/extraction-entity.controller.js +310 -0
  120. package/dist/assets/server/extraction/extraction-entity.controller.js.map +1 -0
  121. package/dist/assets/server/extraction/extraction-rule.controller.d.ts +7 -0
  122. package/dist/assets/server/extraction/extraction-rule.controller.js +48 -0
  123. package/dist/assets/server/extraction/extraction-rule.controller.js.map +1 -0
  124. package/dist/assets/server/extraction/extraction-rule.entity.d.ts +15 -0
  125. package/dist/assets/server/extraction/extraction-rule.entity.js +80 -0
  126. package/dist/assets/server/extraction/extraction-rule.entity.js.map +1 -0
  127. package/dist/assets/server/extraction/extraction-rule.service.d.ts +24 -0
  128. package/dist/assets/server/extraction/extraction-rule.service.js +81 -0
  129. package/dist/assets/server/extraction/extraction-rule.service.js.map +1 -0
  130. package/dist/assets/server/extraction/extraction.module.d.ts +2 -0
  131. package/dist/assets/server/extraction/extraction.module.js +43 -0
  132. package/dist/assets/server/extraction/extraction.module.js.map +1 -0
  133. package/dist/assets/server/extraction/extraction.service.d.ts +62 -0
  134. package/dist/assets/server/extraction/extraction.service.js +347 -0
  135. package/dist/assets/server/extraction/extraction.service.js.map +1 -0
  136. package/dist/assets/server/extraction/script-rule.d.ts +13 -0
  137. package/dist/assets/server/extraction/script-rule.js +45 -0
  138. package/dist/assets/server/extraction/script-rule.js.map +1 -0
  139. package/dist/assets/server/extraction/structured-data.d.ts +7 -0
  140. package/dist/assets/server/extraction/structured-data.js +96 -0
  141. package/dist/assets/server/extraction/structured-data.js.map +1 -0
  142. package/dist/assets/server/hcapi/hcapi.module.d.ts +2 -0
  143. package/dist/assets/server/hcapi/hcapi.module.js +23 -0
  144. package/dist/assets/server/hcapi/hcapi.module.js.map +1 -0
  145. package/dist/assets/server/hcapi/hcapi.service.d.ts +28 -0
  146. package/dist/assets/server/hcapi/hcapi.service.js +81 -0
  147. package/dist/assets/server/hcapi/hcapi.service.js.map +1 -0
  148. package/dist/assets/server/health/health.controller.d.ts +19 -0
  149. package/dist/assets/server/health/health.controller.js +59 -0
  150. package/dist/assets/server/health/health.controller.js.map +1 -0
  151. package/dist/assets/server/jobcase/jobcase.controller.d.ts +12 -0
  152. package/dist/assets/server/jobcase/jobcase.controller.js +61 -0
  153. package/dist/assets/server/jobcase/jobcase.controller.js.map +1 -0
  154. package/dist/assets/server/jobcase/jobcase.entity.d.ts +13 -0
  155. package/dist/assets/server/jobcase/jobcase.entity.js +71 -0
  156. package/dist/assets/server/jobcase/jobcase.entity.js.map +1 -0
  157. package/dist/assets/server/jobcase/jobcase.module.d.ts +2 -0
  158. package/dist/assets/server/jobcase/jobcase.module.js +26 -0
  159. package/dist/assets/server/jobcase/jobcase.module.js.map +1 -0
  160. package/dist/assets/server/jobcase/jobcase.service.d.ts +21 -0
  161. package/dist/assets/server/jobcase/jobcase.service.js +56 -0
  162. package/dist/assets/server/jobcase/jobcase.service.js.map +1 -0
  163. package/dist/assets/server/llm/llm.module.d.ts +2 -0
  164. package/dist/assets/server/llm/llm.module.js +21 -0
  165. package/dist/assets/server/llm/llm.module.js.map +1 -0
  166. package/dist/assets/server/llm/llm.service.d.ts +18 -0
  167. package/dist/assets/server/llm/llm.service.js +65 -0
  168. package/dist/assets/server/llm/llm.service.js.map +1 -0
  169. package/dist/assets/server/main.d.ts +1 -0
  170. package/dist/assets/server/main.js +30 -0
  171. package/dist/assets/server/main.js.map +1 -0
  172. package/dist/assets/server/matching/matching.controller.d.ts +16 -0
  173. package/dist/assets/server/matching/matching.controller.js +97 -0
  174. package/dist/assets/server/matching/matching.controller.js.map +1 -0
  175. package/dist/assets/server/matching/matching.module.d.ts +2 -0
  176. package/dist/assets/server/matching/matching.module.js +36 -0
  177. package/dist/assets/server/matching/matching.module.js.map +1 -0
  178. package/dist/assets/server/matching/matching.service.d.ts +55 -0
  179. package/dist/assets/server/matching/matching.service.js +409 -0
  180. package/dist/assets/server/matching/matching.service.js.map +1 -0
  181. package/dist/assets/server/package.json +57 -0
  182. package/dist/assets/server/parsed-resume/parsed-resume.controller.d.ts +6 -0
  183. package/dist/assets/server/parsed-resume/parsed-resume.controller.js +42 -0
  184. package/dist/assets/server/parsed-resume/parsed-resume.controller.js.map +1 -0
  185. package/dist/assets/server/parsed-resume/parsed-resume.entity.d.ts +124 -0
  186. package/dist/assets/server/parsed-resume/parsed-resume.entity.js +72 -0
  187. package/dist/assets/server/parsed-resume/parsed-resume.entity.js.map +1 -0
  188. package/dist/assets/server/parsed-resume/parsed-resume.module.d.ts +2 -0
  189. package/dist/assets/server/parsed-resume/parsed-resume.module.js +26 -0
  190. package/dist/assets/server/parsed-resume/parsed-resume.module.js.map +1 -0
  191. package/dist/assets/server/parsed-resume/parsed-resume.service.d.ts +10 -0
  192. package/dist/assets/server/parsed-resume/parsed-resume.service.js +45 -0
  193. package/dist/assets/server/parsed-resume/parsed-resume.service.js.map +1 -0
  194. package/dist/assets/server/parsing/parse-error-report.entity.d.ts +11 -0
  195. package/dist/assets/server/parsing/parse-error-report.entity.js +66 -0
  196. package/dist/assets/server/parsing/parse-error-report.entity.js.map +1 -0
  197. package/dist/assets/server/parsing/parsing.controller.d.ts +19 -0
  198. package/dist/assets/server/parsing/parsing.controller.js +97 -0
  199. package/dist/assets/server/parsing/parsing.controller.js.map +1 -0
  200. package/dist/assets/server/parsing/parsing.module.d.ts +2 -0
  201. package/dist/assets/server/parsing/parsing.module.js +38 -0
  202. package/dist/assets/server/parsing/parsing.module.js.map +1 -0
  203. package/dist/assets/server/parsing/parsing.service.d.ts +38 -0
  204. package/dist/assets/server/parsing/parsing.service.js +263 -0
  205. package/dist/assets/server/parsing/parsing.service.js.map +1 -0
  206. package/dist/assets/server/query/fields-meta.controller.d.ts +28 -0
  207. package/dist/assets/server/query/fields-meta.controller.js +57 -0
  208. package/dist/assets/server/query/fields-meta.controller.js.map +1 -0
  209. package/dist/assets/server/query/query-builder.controller.d.ts +11 -0
  210. package/dist/assets/server/query/query-builder.controller.js +40 -0
  211. package/dist/assets/server/query/query-builder.controller.js.map +1 -0
  212. package/dist/assets/server/query/query-builder.service.d.ts +8 -0
  213. package/dist/assets/server/query/query-builder.service.js +41 -0
  214. package/dist/assets/server/query/query-builder.service.js.map +1 -0
  215. package/dist/assets/server/query/query.module.d.ts +2 -0
  216. package/dist/assets/server/query/query.module.js +23 -0
  217. package/dist/assets/server/query/query.module.js.map +1 -0
  218. package/dist/assets/server/recording/entities/recording-event.entity.d.ts +9 -0
  219. package/dist/assets/server/recording/entities/recording-event.entity.js +56 -0
  220. package/dist/assets/server/recording/entities/recording-event.entity.js.map +1 -0
  221. package/dist/assets/server/recording/recording.controller.d.ts +52 -0
  222. package/dist/assets/server/recording/recording.controller.js +73 -0
  223. package/dist/assets/server/recording/recording.controller.js.map +1 -0
  224. package/dist/assets/server/recording/recording.gateway.d.ts +15 -0
  225. package/dist/assets/server/recording/recording.gateway.js +117 -0
  226. package/dist/assets/server/recording/recording.gateway.js.map +1 -0
  227. package/dist/assets/server/recording/recording.module.d.ts +2 -0
  228. package/dist/assets/server/recording/recording.module.js +29 -0
  229. package/dist/assets/server/recording/recording.module.js.map +1 -0
  230. package/dist/assets/server/recording/recording.service.d.ts +59 -0
  231. package/dist/assets/server/recording/recording.service.js +111 -0
  232. package/dist/assets/server/recording/recording.service.js.map +1 -0
  233. package/dist/assets/server/remark/remark.controller.d.ts +21 -0
  234. package/dist/assets/server/remark/remark.controller.js +59 -0
  235. package/dist/assets/server/remark/remark.controller.js.map +1 -0
  236. package/dist/assets/server/remark/remark.entity.d.ts +18 -0
  237. package/dist/assets/server/remark/remark.entity.js +67 -0
  238. package/dist/assets/server/remark/remark.entity.js.map +1 -0
  239. package/dist/assets/server/remark/remark.module.d.ts +2 -0
  240. package/dist/assets/server/remark/remark.module.js +26 -0
  241. package/dist/assets/server/remark/remark.module.js.map +1 -0
  242. package/dist/assets/server/remark/remark.service.d.ts +8 -0
  243. package/dist/assets/server/remark/remark.service.js +39 -0
  244. package/dist/assets/server/remark/remark.service.js.map +1 -0
  245. package/dist/assets/server/report/report.controller.d.ts +18 -0
  246. package/dist/assets/server/report/report.controller.js +41 -0
  247. package/dist/assets/server/report/report.controller.js.map +1 -0
  248. package/dist/assets/server/report/report.module.d.ts +2 -0
  249. package/dist/assets/server/report/report.module.js +24 -0
  250. package/dist/assets/server/report/report.module.js.map +1 -0
  251. package/dist/assets/server/report/report.service.d.ts +23 -0
  252. package/dist/assets/server/report/report.service.js +54 -0
  253. package/dist/assets/server/report/report.service.js.map +1 -0
  254. package/dist/assets/server/rules/rules.controller.d.ts +6 -0
  255. package/dist/assets/server/rules/rules.controller.js +35 -0
  256. package/dist/assets/server/rules/rules.controller.js.map +1 -0
  257. package/dist/assets/server/rules/rules.module.d.ts +2 -0
  258. package/dist/assets/server/rules/rules.module.js +23 -0
  259. package/dist/assets/server/rules/rules.module.js.map +1 -0
  260. package/dist/assets/server/rules/rules.service.d.ts +10 -0
  261. package/dist/assets/server/rules/rules.service.js +26 -0
  262. package/dist/assets/server/rules/rules.service.js.map +1 -0
  263. package/dist/assets/server/search/search.controller.d.ts +6 -0
  264. package/dist/assets/server/search/search.controller.js +53 -0
  265. package/dist/assets/server/search/search.controller.js.map +1 -0
  266. package/dist/assets/server/search/search.module.d.ts +2 -0
  267. package/dist/assets/server/search/search.module.js +24 -0
  268. package/dist/assets/server/search/search.module.js.map +1 -0
  269. package/dist/assets/server/search/search.service.d.ts +6 -0
  270. package/dist/assets/server/search/search.service.js +46 -0
  271. package/dist/assets/server/search/search.service.js.map +1 -0
  272. package/dist/assets/server/sentry.d.ts +3 -0
  273. package/dist/assets/server/sentry.js +10 -0
  274. package/dist/assets/server/sentry.js.map +1 -0
  275. package/dist/assets/server/site/entities/site-registry.entity.d.ts +11 -0
  276. package/dist/assets/server/site/entities/site-registry.entity.js +66 -0
  277. package/dist/assets/server/site/entities/site-registry.entity.js.map +1 -0
  278. package/dist/assets/server/site/site.controller.d.ts +36 -0
  279. package/dist/assets/server/site/site.controller.js +60 -0
  280. package/dist/assets/server/site/site.controller.js.map +1 -0
  281. package/dist/assets/server/site/site.module.d.ts +2 -0
  282. package/dist/assets/server/site/site.module.js +26 -0
  283. package/dist/assets/server/site/site.module.js.map +1 -0
  284. package/dist/assets/server/site/site.service.d.ts +37 -0
  285. package/dist/assets/server/site/site.service.js +134 -0
  286. package/dist/assets/server/site/site.service.js.map +1 -0
  287. package/dist/assets/server/snapshot/raw-snapshot.entity.d.ts +35 -0
  288. package/dist/assets/server/snapshot/raw-snapshot.entity.js +62 -0
  289. package/dist/assets/server/snapshot/raw-snapshot.entity.js.map +1 -0
  290. package/dist/assets/server/snapshot/snapshot.controller.d.ts +18 -0
  291. package/dist/assets/server/snapshot/snapshot.controller.js +76 -0
  292. package/dist/assets/server/snapshot/snapshot.controller.js.map +1 -0
  293. package/dist/assets/server/snapshot/snapshot.module.d.ts +2 -0
  294. package/dist/assets/server/snapshot/snapshot.module.js +26 -0
  295. package/dist/assets/server/snapshot/snapshot.module.js.map +1 -0
  296. package/dist/assets/server/snapshot/snapshot.service.d.ts +10 -0
  297. package/dist/assets/server/snapshot/snapshot.service.js +48 -0
  298. package/dist/assets/server/snapshot/snapshot.service.js.map +1 -0
  299. package/dist/assets/server/system/system.controller.d.ts +39 -0
  300. package/dist/assets/server/system/system.controller.js +93 -0
  301. package/dist/assets/server/system/system.controller.js.map +1 -0
  302. package/dist/assets/server/system/system.module.d.ts +2 -0
  303. package/dist/assets/server/system/system.module.js +26 -0
  304. package/dist/assets/server/system/system.module.js.map +1 -0
  305. package/dist/assets/server/system/system.service.d.ts +86 -0
  306. package/dist/assets/server/system/system.service.js +433 -0
  307. package/dist/assets/server/system/system.service.js.map +1 -0
  308. package/dist/assets/server/talent-fingerprint/fingerprint-match.service.d.ts +28 -0
  309. package/dist/assets/server/talent-fingerprint/fingerprint-match.service.js +186 -0
  310. package/dist/assets/server/talent-fingerprint/fingerprint-match.service.js.map +1 -0
  311. package/dist/assets/server/talent-fingerprint/talent-fingerprint.entity.d.ts +30 -0
  312. package/dist/assets/server/talent-fingerprint/talent-fingerprint.entity.js +55 -0
  313. package/dist/assets/server/talent-fingerprint/talent-fingerprint.entity.js.map +1 -0
  314. package/dist/assets/server/talent-fingerprint/talent-fingerprint.module.d.ts +2 -0
  315. package/dist/assets/server/talent-fingerprint/talent-fingerprint.module.js +25 -0
  316. package/dist/assets/server/talent-fingerprint/talent-fingerprint.module.js.map +1 -0
  317. package/dist/assets/server/talent-fingerprint/talent-fingerprint.service.d.ts +8 -0
  318. package/dist/assets/server/talent-fingerprint/talent-fingerprint.service.js +44 -0
  319. package/dist/assets/server/talent-fingerprint/talent-fingerprint.service.js.map +1 -0
  320. package/dist/assets/server/talent-job-match/talent-job-match.controller.d.ts +6 -0
  321. package/dist/assets/server/talent-job-match/talent-job-match.controller.js +42 -0
  322. package/dist/assets/server/talent-job-match/talent-job-match.controller.js.map +1 -0
  323. package/dist/assets/server/talent-job-match/talent-job-match.entity.d.ts +33 -0
  324. package/dist/assets/server/talent-job-match/talent-job-match.entity.js +73 -0
  325. package/dist/assets/server/talent-job-match/talent-job-match.entity.js.map +1 -0
  326. package/dist/assets/server/talent-job-match/talent-job-match.module.d.ts +2 -0
  327. package/dist/assets/server/talent-job-match/talent-job-match.module.js +26 -0
  328. package/dist/assets/server/talent-job-match/talent-job-match.module.js.map +1 -0
  329. package/dist/assets/server/talent-job-match/talent-job-match.service.d.ts +9 -0
  330. package/dist/assets/server/talent-job-match/talent-job-match.service.js +42 -0
  331. package/dist/assets/server/talent-job-match/talent-job-match.service.js.map +1 -0
  332. package/dist/assets/server/talent-portrait/portrait-merge.service.d.ts +17 -0
  333. package/dist/assets/server/talent-portrait/portrait-merge.service.js +200 -0
  334. package/dist/assets/server/talent-portrait/portrait-merge.service.js.map +1 -0
  335. package/dist/assets/server/talent-portrait/talent-portrait.controller.d.ts +7 -0
  336. package/dist/assets/server/talent-portrait/talent-portrait.controller.js +52 -0
  337. package/dist/assets/server/talent-portrait/talent-portrait.controller.js.map +1 -0
  338. package/dist/assets/server/talent-portrait/talent-portrait.entity.d.ts +91 -0
  339. package/dist/assets/server/talent-portrait/talent-portrait.entity.js +71 -0
  340. package/dist/assets/server/talent-portrait/talent-portrait.entity.js.map +1 -0
  341. package/dist/assets/server/talent-portrait/talent-portrait.module.d.ts +2 -0
  342. package/dist/assets/server/talent-portrait/talent-portrait.module.js +27 -0
  343. package/dist/assets/server/talent-portrait/talent-portrait.module.js.map +1 -0
  344. package/dist/assets/server/talent-portrait/talent-portrait.service.d.ts +10 -0
  345. package/dist/assets/server/talent-portrait/talent-portrait.service.js +46 -0
  346. package/dist/assets/server/talent-portrait/talent-portrait.service.js.map +1 -0
  347. package/dist/assets/server/telemetry/telemetry.module.d.ts +2 -0
  348. package/dist/assets/server/telemetry/telemetry.module.js +24 -0
  349. package/dist/assets/server/telemetry/telemetry.module.js.map +1 -0
  350. package/dist/assets/server/telemetry/telemetry.service.d.ts +29 -0
  351. package/dist/assets/server/telemetry/telemetry.service.js +116 -0
  352. package/dist/assets/server/telemetry/telemetry.service.js.map +1 -0
  353. package/dist/bundled-assets.d.ts +22 -0
  354. package/dist/bundled-assets.js +80 -0
  355. package/dist/cache/db.js +10 -54
  356. package/dist/commands/addons.js +46 -71
  357. package/dist/commands/cache.js +29 -27
  358. package/dist/commands/config.d.ts +1 -1
  359. package/dist/commands/config.js +8 -12
  360. package/dist/commands/doctor.d.ts +0 -1
  361. package/dist/commands/doctor.js +52 -67
  362. package/dist/commands/extension.js +82 -96
  363. package/dist/commands/extras.d.ts +31 -1
  364. package/dist/commands/extras.js +248 -61
  365. package/dist/commands/init.js +18 -46
  366. package/dist/commands/install.js +20 -52
  367. package/dist/commands/job.js +27 -65
  368. package/dist/commands/login.js +50 -37
  369. package/dist/commands/logout.js +8 -12
  370. package/dist/commands/ops.js +94 -67
  371. package/dist/commands/record.js +21 -59
  372. package/dist/commands/report.js +14 -18
  373. package/dist/commands/search.js +14 -21
  374. package/dist/commands/server.d.ts +1 -1
  375. package/dist/commands/server.js +126 -112
  376. package/dist/commands/status.js +23 -27
  377. package/dist/commands/update.js +44 -79
  378. package/dist/config.d.ts +3 -0
  379. package/dist/config.js +12 -46
  380. package/dist/i18n/index.js +5 -11
  381. package/dist/i18n/locales/en-US.json +24 -1
  382. package/dist/i18n/locales/zh-CN.json +24 -1
  383. package/dist/index.cmd +3 -0
  384. package/dist/index.js +84 -97
  385. package/dist/index.ps1 +3 -0
  386. package/dist/keychain.js +9 -44
  387. package/dist/logger.d.ts +7 -0
  388. package/dist/logger.js +80 -0
  389. package/dist/native-check.d.ts +6 -0
  390. package/dist/native-check.js +23 -0
  391. package/dist/sentry.js +4 -8
  392. package/dist/updater.js +15 -52
  393. package/dist/utils/proc.d.ts +35 -0
  394. package/dist/utils/proc.js +81 -0
  395. package/dist/utils/spawn.d.ts +19 -0
  396. package/dist/utils/spawn.js +60 -0
  397. package/dist/version.d.ts +1 -1
  398. package/dist/version.js +183 -81
  399. package/dist/watchdog.d.ts +1 -0
  400. package/dist/watchdog.js +128 -0
  401. package/package.json +6 -5
  402. package/dist/commands/native-check.d.ts +0 -22
  403. package/dist/commands/native-check.js +0 -93
@@ -0,0 +1,19 @@
1
+ import { spawn, spawnSync, type ChildProcess } from "node:child_process";
2
+ type SpawnOptionsAny = Parameters<typeof spawn>[2] & Parameters<typeof spawnSync>[2];
3
+ /**
4
+ * Cross-platform child_process wrapper.
5
+ *
6
+ * On Windows we set `shell: true` so that PATHEXT resolution and `.cmd` /
7
+ * `.bat` execution work without an explicit path. The `%%` escape keeps
8
+ * cmd.exe from interpreting `%FOO%` style variable expansions inside the
9
+ * arguments (Windows expands `%` even inside quoted strings).
10
+ *
11
+ * On POSIX we keep the original behavior: direct `execve`, no shell,
12
+ * no argument transformation — identical to a plain `spawn` call.
13
+ */
14
+ export declare function spawnSafe(bin: string, args?: readonly string[], opts?: SpawnOptionsAny): ChildProcess;
15
+ /**
16
+ * Synchronous variant. Same semantics as {@link spawnSafe}.
17
+ */
18
+ export declare function spawnSyncSafe(bin: string, args?: readonly string[], opts?: SpawnOptionsAny): import("child_process").SpawnSyncReturns<string | NonSharedBuffer>;
19
+ export {};
@@ -0,0 +1,60 @@
1
+ import { spawn, spawnSync } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ /**
5
+ * On Windows, PATHEXT is honored by `cmd.exe` but not by Node's `spawn`.
6
+ * Without this resolver, `spawn("npm", ...)` returns ENOENT because the
7
+ * real binary is `npm.cmd`. We walk PATH and pick the first extension that
8
+ * matches an existing file. POSIX behavior is unchanged: return as-is.
9
+ */
10
+ function resolveBin(bin) {
11
+ if (process.platform !== "win32")
12
+ return bin;
13
+ if (/\.(cmd|bat|exe|com)$/i.test(bin))
14
+ return bin;
15
+ const pathEnv = process.env.PATH ?? "";
16
+ const exts = (process.env.PATHEXT ?? ".COM;.EXE;.BAT;.CMD").split(";");
17
+ for (const dir of pathEnv.split(path.delimiter)) {
18
+ if (!dir)
19
+ continue;
20
+ for (const ext of exts) {
21
+ const candidate = path.join(dir, bin + ext);
22
+ try {
23
+ if (fs.existsSync(candidate))
24
+ return candidate;
25
+ }
26
+ catch {
27
+ /* FS errors fall through to the next candidate */
28
+ }
29
+ }
30
+ }
31
+ return bin;
32
+ }
33
+ /**
34
+ * Cross-platform child_process wrapper.
35
+ *
36
+ * On Windows we set `shell: true` so that PATHEXT resolution and `.cmd` /
37
+ * `.bat` execution work without an explicit path. The `%%` escape keeps
38
+ * cmd.exe from interpreting `%FOO%` style variable expansions inside the
39
+ * arguments (Windows expands `%` even inside quoted strings).
40
+ *
41
+ * On POSIX we keep the original behavior: direct `execve`, no shell,
42
+ * no argument transformation — identical to a plain `spawn` call.
43
+ */
44
+ export function spawnSafe(bin, args = [], opts = {}) {
45
+ if (process.platform === "win32") {
46
+ const escaped = args.map((a) => a.replace(/%/g, "%%"));
47
+ return spawn(bin, escaped, { ...opts, shell: true });
48
+ }
49
+ return spawn(resolveBin(bin), [...args], opts);
50
+ }
51
+ /**
52
+ * Synchronous variant. Same semantics as {@link spawnSafe}.
53
+ */
54
+ export function spawnSyncSafe(bin, args = [], opts = {}) {
55
+ if (process.platform === "win32") {
56
+ const escaped = args.map((a) => a.replace(/%/g, "%%"));
57
+ return spawnSync(bin, escaped, { ...opts, shell: true });
58
+ }
59
+ return spawnSync(resolveBin(bin), [...args], opts);
60
+ }
package/dist/version.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { ConsistencyActions, InstalledVersions, SystemVersions } from '@hunter-mate/shared';
2
2
  export declare function readInstalledVersions(): InstalledVersions;
3
- export declare function readRuntimeStateFile(): any;
3
+ export declare function readRuntimeStateFile(): unknown;
4
4
  export declare function fetchLiveVersions(timeoutMs?: number): Promise<SystemVersions | null>;
5
5
  export declare function decideConsistencyActions(installed: InstalledVersions, live: SystemVersions | null): ConsistencyActions;
6
6
  export interface ConsistencyReport {
package/dist/version.js CHANGED
@@ -1,63 +1,24 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.readInstalledVersions = readInstalledVersions;
40
- exports.readRuntimeStateFile = readRuntimeStateFile;
41
- exports.fetchLiveVersions = fetchLiveVersions;
42
- exports.decideConsistencyActions = decideConsistencyActions;
43
- exports.ensureRuntimeConsistency = ensureRuntimeConsistency;
44
- exports.shouldCheckNow = shouldCheckNow;
45
- const fs = __importStar(require("fs"));
46
- const path = __importStar(require("path"));
47
- const axios_1 = __importDefault(require("axios"));
48
- const chalk_1 = __importDefault(require("chalk"));
49
- const config_1 = require("./config");
50
- const server_1 = require("./commands/server");
51
- const extras_1 = require("./commands/extras");
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { createHash } from 'crypto';
5
+ import axios from 'axios';
6
+ import chalk from 'chalk';
7
+ import { loadConfig } from './config.js';
8
+ import { runStop, runStart, tryReadPid, findServerRoot } from './commands/server.js';
9
+ import { runReload } from './commands/extras.js';
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = path.dirname(__filename);
52
12
  const HOME = () => process.env.HUNTER_MATE_HOME || process.env.HOME || process.env.USERPROFILE || '.';
53
13
  const ROOT = () => path.join(HOME(), '.hunter-mate');
54
14
  const PLUGINS_DIR = () => path.join(ROOT(), 'plugins');
55
15
  const EXTENSION_MANIFEST = () => path.join(ROOT(), 'extension', 'manifest.json');
16
+ const EXTENSION_DIR = () => path.join(ROOT(), 'extension');
56
17
  const RUNTIME_FILE = () => path.join(ROOT(), 'runtime.json');
57
18
  const LAST_CHECK_FILE = () => path.join(ROOT(), '.last-consistency-check');
58
19
  const CHECK_THROTTLE_MS = 60_000;
59
20
  // ---------------------------------------------------------------------------
60
- // 磁盘版本读取(SSOT)
21
+ // 三层指纹工具(version + checksum + mtime/linked)— 与 chromepilot version-manager / server SystemService 算法完全等价
61
22
  // ---------------------------------------------------------------------------
62
23
  function readJson(file) {
63
24
  try {
@@ -67,13 +28,114 @@ function readJson(file) {
67
28
  return null;
68
29
  }
69
30
  }
70
- function readInstalledVersions() {
31
+ /** 递归目录 SHA-1(文件名+内容)+ 最新 mtime — 与 server SystemService.dirChecksum 字节等价 */
32
+ function dirChecksum(dir) {
33
+ const hash = createHash('sha1');
34
+ let latest = 0;
35
+ function walk(d, rel = '') {
36
+ try {
37
+ const entries = fs.readdirSync(d, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));
38
+ for (const entry of entries) {
39
+ const relPath = path.join(rel, entry.name);
40
+ const full = path.join(d, entry.name);
41
+ if (entry.isDirectory()) {
42
+ walk(full, relPath);
43
+ }
44
+ else if (entry.isFile() || entry.isSymbolicLink()) {
45
+ try {
46
+ const stat = fs.statSync(full);
47
+ if (stat.mtimeMs > latest)
48
+ latest = stat.mtimeMs;
49
+ hash.update(relPath + '\0');
50
+ const buf = fs.readFileSync(full);
51
+ hash.update(buf);
52
+ }
53
+ catch {
54
+ /* ignore unreadable */
55
+ }
56
+ }
57
+ }
58
+ }
59
+ catch {
60
+ /* dir missing → empty */
61
+ }
62
+ }
63
+ walk(dir);
64
+ return { checksum: hash.digest('hex'), latestMtimeMs: latest };
65
+ }
66
+ function inspectArtifact(dir, versionSource) {
67
+ if (!fs.existsSync(dir))
68
+ return null;
69
+ const { checksum, latestMtimeMs } = dirChecksum(dir);
70
+ let linked = false;
71
+ try {
72
+ linked = fs.lstatSync(dir).isSymbolicLink();
73
+ }
74
+ catch { /* ignore */ }
75
+ return {
76
+ version: versionSource?.version ?? '0.0.0',
77
+ checksum,
78
+ latestMtimeMs,
79
+ linked,
80
+ rootDir: dir,
81
+ };
82
+ }
83
+ function resolveLinked(extensionInstallDir, serverEntryPath) {
84
+ function resolve(target) {
85
+ if (!fs.existsSync(target))
86
+ return { linked: false, source: null, target };
87
+ try {
88
+ if (fs.lstatSync(target).isSymbolicLink()) {
89
+ return { linked: true, source: fs.realpathSync(target), target };
90
+ }
91
+ }
92
+ catch { /* ignore */ }
93
+ return { linked: false, source: null, target };
94
+ }
95
+ return {
96
+ extension: resolve(extensionInstallDir),
97
+ serverEntry: resolve(serverEntryPath),
98
+ };
99
+ }
100
+ /** 扫描 CLI 侧(磁盘 SSOT)的 server + extension 两份三层指纹 */
101
+ function computeLocalArtifacts(cliInstalled) {
102
+ // Server 产物(dist 目录): findServerRoot 返回 packages/server 包根,dist 是其子目录
103
+ let serverArtifact = null;
104
+ const serverRoot = findServerRoot();
105
+ if (serverRoot) {
106
+ const distCandidates = [path.join(serverRoot, 'dist'), serverRoot];
107
+ let serverDist = '';
108
+ for (const c of distCandidates) {
109
+ if (fs.existsSync(path.join(c, 'main.js')) || fs.existsSync(path.join(c, 'index.js'))) {
110
+ serverDist = c;
111
+ break;
112
+ }
113
+ }
114
+ if (serverDist) {
115
+ const pkg = readJson(path.join(serverRoot, 'package.json'));
116
+ serverArtifact = inspectArtifact(serverDist, pkg ?? { version: cliInstalled.server ?? '0.0.0' });
117
+ }
118
+ }
119
+ // Extension 产物(~/.hunter-mate/extension)
120
+ const extManifest = readJson(EXTENSION_MANIFEST());
121
+ const extensionArtifact = inspectArtifact(EXTENSION_DIR(), extManifest ?? { version: cliInstalled.extension ?? '0.0.0' });
122
+ // Linked 判断
123
+ const serverEntry = serverArtifact
124
+ ? (fs.existsSync(path.join(serverArtifact.rootDir, 'main.js')) ? path.join(serverArtifact.rootDir, 'main.js') : path.join(serverArtifact.rootDir, 'index.js'))
125
+ : __filename;
126
+ const linked = resolveLinked(EXTENSION_DIR(), serverEntry);
127
+ return { server: serverArtifact, extension: extensionArtifact, linked };
128
+ }
129
+ // ---------------------------------------------------------------------------
130
+ // 磁盘版本读取(SSOT)
131
+ // ---------------------------------------------------------------------------
132
+ export function readInstalledVersions() {
71
133
  // CLI 自身: src/version.ts 与 dist/version.js 的上一级都是包根
72
134
  const cliPkg = readJson(path.join(__dirname, '..', 'package.json'));
73
135
  const cli = cliPkg?.version ?? '0.0.0';
74
136
  // Server: 定位 packages/server 包根(与 start 命令同一套候选逻辑)
75
137
  let server = null;
76
- const serverRoot = (0, server_1.findServerRoot)();
138
+ const serverRoot = findServerRoot();
77
139
  if (serverRoot) {
78
140
  const pkg = readJson(path.join(serverRoot, 'package.json'));
79
141
  server = pkg?.version ?? null;
@@ -91,18 +153,21 @@ function readInstalledVersions() {
91
153
  plugins[name] = pkg.version;
92
154
  }
93
155
  }
94
- return { cli, server, extension, plugins };
156
+ const base = { cli, server, extension, plugins };
157
+ // 三层指纹(CLI 磁盘侧计算;对比时拿 live.bootArtifacts 比)
158
+ base.artifacts = computeLocalArtifacts({ server, extension });
159
+ return base;
95
160
  }
96
- function readRuntimeStateFile() {
161
+ export function readRuntimeStateFile() {
97
162
  return readJson(RUNTIME_FILE());
98
163
  }
99
164
  // ---------------------------------------------------------------------------
100
165
  // live 运行中版本(来自 server /system/versions)
101
166
  // ---------------------------------------------------------------------------
102
- async function fetchLiveVersions(timeoutMs = 3000) {
103
- const config = (0, config_1.loadConfig)();
167
+ export async function fetchLiveVersions(timeoutMs = 3000) {
168
+ const config = loadConfig();
104
169
  try {
105
- const res = await axios_1.default.get(`${config.serverUrl}/system/versions`, {
170
+ const res = await axios.get(`${config.serverUrl}/system/versions`, {
106
171
  timeout: timeoutMs,
107
172
  proxy: false,
108
173
  });
@@ -113,9 +178,9 @@ async function fetchLiveVersions(timeoutMs = 3000) {
113
178
  }
114
179
  }
115
180
  // ---------------------------------------------------------------------------
116
- // 一致性决策(纯函数,便于测试)
181
+ // 一致性决策(纯函数,便于测试)— 三层指纹:version → checksum → linked_stale
117
182
  // ---------------------------------------------------------------------------
118
- function decideConsistencyActions(installed, live) {
183
+ export function decideConsistencyActions(installed, live) {
119
184
  const actions = {
120
185
  serverRestart: false,
121
186
  pluginsReload: [],
@@ -123,17 +188,34 @@ function decideConsistencyActions(installed, live) {
123
188
  };
124
189
  if (!live)
125
190
  return actions;
126
- // server: 磁盘版本 vs 运行版本(磁盘未知时不强制)
191
+ const local = installed.artifacts ?? null;
192
+ const boot = live.bootArtifacts ?? null;
193
+ // ==================== server: 三层 ====================
127
194
  if (installed.server !== null &&
128
195
  live.server.version !== installed.server) {
129
196
  actions.serverRestart = true;
130
- actions.serverReason = `running=${live.server.version} disk=${installed.server}`;
197
+ actions.serverReason = `running=${live.server.version} disk=${installed.server} (version_mismatch)`;
131
198
  }
132
199
  else if (live.server.needsRestart) {
133
200
  actions.serverRestart = true;
134
201
  actions.serverReason = 'server self-check marked needsRestart';
135
202
  }
136
- // 插件: 磁盘版本 vs 已加载版本
203
+ else if (!actions.serverRestart &&
204
+ local?.server?.checksum &&
205
+ boot?.server?.checksum &&
206
+ local.server.checksum !== boot.server.checksum) {
207
+ actions.serverRestart = true;
208
+ actions.serverReason = 'server 产物 checksum 与启动快照不一致(本地重新构建过)(checksum_mismatch)';
209
+ }
210
+ else if (!actions.serverRestart &&
211
+ boot?.linked?.serverEntry.linked === true &&
212
+ local?.server?.latestMtimeMs &&
213
+ live.server.latestMtimeMs &&
214
+ local.server.latestMtimeMs > live.server.latestMtimeMs) {
215
+ actions.serverRestart = true;
216
+ actions.serverReason = `server 软链模式下磁盘最新 mtime(${new Date(local.server.latestMtimeMs).toISOString()}) 新于启动快照(linked_stale)`;
217
+ }
218
+ // ==================== 插件: 磁盘版本 vs 已加载版本(保留单层逻辑) ====================
137
219
  const names = new Set([
138
220
  ...Object.keys(installed.plugins),
139
221
  ...Object.keys(live.plugins),
@@ -143,13 +225,35 @@ function decideConsistencyActions(installed, live) {
143
225
  actions.pluginsReload.push(name);
144
226
  }
145
227
  }
146
- // 浏览器扩展: 磁盘 manifest 版本 vs WS handshake 上报版本
147
- if (installed.extension) {
148
- actions.extensionReload = live.extensions.some((e) => e.version !== installed.extension);
228
+ // ==================== extension: 三层 ====================
229
+ const extVerDiff = installed.extension
230
+ && live.extensions.length > 0
231
+ && live.extensions.some((e) => e.version !== installed.extension);
232
+ const anyExtConnected = live.extensions.length > 0;
233
+ if (extVerDiff) {
234
+ actions.extensionReload = true;
235
+ actions.extensionReason = `running extension versions=[${[...new Set(live.extensions.map((e) => e.version))].join('/')}] != disk=${installed.extension} (version_mismatch)`;
236
+ }
237
+ else if (!actions.extensionReload &&
238
+ anyExtConnected &&
239
+ local?.extension?.checksum &&
240
+ boot?.extension?.checksum &&
241
+ local.extension.checksum !== boot.extension.checksum) {
242
+ actions.extensionReload = true;
243
+ actions.extensionReason = 'extension 产物 checksum 与启动快照不一致(改了 manifest/TS/HTML 但未改 package.json 版本)(checksum_mismatch)';
244
+ }
245
+ else if (!actions.extensionReload &&
246
+ anyExtConnected &&
247
+ boot?.linked?.extension.linked === true &&
248
+ local?.extension?.latestMtimeMs &&
249
+ boot?.extension?.latestMtimeMs &&
250
+ local.extension.latestMtimeMs > boot.extension.latestMtimeMs) {
251
+ actions.extensionReload = true;
252
+ actions.extensionReason = `extension 软链模式下磁盘最新 mtime(${new Date(local.extension.latestMtimeMs).toISOString()}) 新于启动快照(linked_stale)`;
149
253
  }
150
254
  return actions;
151
255
  }
152
- async function ensureRuntimeConsistency(opts = {}) {
256
+ export async function ensureRuntimeConsistency(opts = {}) {
153
257
  const performed = [];
154
258
  const noOp = (reason) => ({
155
259
  checked: false,
@@ -165,9 +269,9 @@ async function ensureRuntimeConsistency(opts = {}) {
165
269
  // 2) pid 缺失(用户手动 node dist/main.js 起的 / 旧版 CLI 起的)→
166
270
  // 本地地址做快速 HTTP 探测(ECONNREFUSED 即时返回,不拖慢命令);远程地址维持 pid 闸门
167
271
  let live = null;
168
- const config = (0, config_1.loadConfig)();
272
+ const config = loadConfig();
169
273
  const isLocal = /\/\/(localhost|127\.0\.0\.1|\[::1\])/i.test(config.serverUrl);
170
- if ((0, server_1.tryReadPid)()) {
274
+ if (tryReadPid()) {
171
275
  live = await fetchLiveVersions();
172
276
  }
173
277
  else if (isLocal) {
@@ -185,7 +289,7 @@ async function ensureRuntimeConsistency(opts = {}) {
185
289
  // 1) 插件热重载
186
290
  if (actions.pluginsReload.length) {
187
291
  try {
188
- await axios_1.default.post(`${config.serverUrl}/system/reload-plugins`, { reason: `cli-consistency: ${actions.pluginsReload.join(',')}` }, { timeout: 5000, proxy: false });
292
+ await axios.post(`${config.serverUrl}/system/reload-plugins`, { reason: `cli-consistency: ${actions.pluginsReload.join(',')}` }, { timeout: 5000, proxy: false });
189
293
  performed.push(`plugins reloaded: ${actions.pluginsReload
190
294
  .map((n) => `${n} ${live.plugins[n] ?? '-'}→${installed.plugins[n] ?? '?'}`)
191
295
  .join(', ')}`);
@@ -197,8 +301,8 @@ async function ensureRuntimeConsistency(opts = {}) {
197
301
  // 2) server 重启(stop + start)
198
302
  if (actions.serverRestart) {
199
303
  try {
200
- (0, server_1.runStop)();
201
- const r = await (0, server_1.runStart)({});
304
+ runStop();
305
+ const r = await runStart({});
202
306
  performed.push(r.started
203
307
  ? `server restarted (${actions.serverReason}) — new pid=${r.pid}`
204
308
  : `server restart FAILED: ${r.msg}`);
@@ -210,26 +314,24 @@ async function ensureRuntimeConsistency(opts = {}) {
210
314
  // 3) 浏览器扩展 reload 广播
211
315
  if (actions.extensionReload) {
212
316
  try {
213
- await (0, extras_1.runReload)(3000);
214
- performed.push(`extension reload broadcast (disk=${installed.extension}, running=${[
215
- ...new Set(live.extensions.map((e) => e.version)),
216
- ].join('/')})`);
317
+ const r = await runReload(3000);
318
+ performed.push(`extension reload broadcast: ${actions.extensionReason ?? 'version mismatch'} — broadcast=${r.broadcast}, msg=${r.msg}`);
217
319
  }
218
- catch {
219
- performed.push('extension reload broadcast skipped (no ws clients)');
320
+ catch (e) {
321
+ performed.push(`extension reload FAILED: ${e.message}. Tip: chrome://extensions → 点 HunterMate 卡片的刷新图标`);
220
322
  }
221
323
  }
222
324
  markChecked();
223
325
  if (opts.verbose && performed.length) {
224
326
  for (const line of performed)
225
- console.log(chalk_1.default.gray(` [auto-update] ${line}`));
327
+ console.log(chalk.gray(` [auto-update] ${line}`));
226
328
  }
227
329
  return { checked: true, actions, performed };
228
330
  }
229
331
  // ---------------------------------------------------------------------------
230
332
  // 节流
231
333
  // ---------------------------------------------------------------------------
232
- function shouldCheckNow() {
334
+ export function shouldCheckNow() {
233
335
  try {
234
336
  const stat = fs.statSync(LAST_CHECK_FILE());
235
337
  return Date.now() - stat.mtimeMs > CHECK_THROTTLE_MS;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,128 @@
1
+ import { spawn } from 'child_process';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ const HOME = () => process.env.HUNTER_MATE_HOME || process.env.HOME || process.env.USERPROFILE || '.';
5
+ const ROOT = () => path.join(HOME(), '.hunter-mate');
6
+ const SERVER_PID_FILE = () => path.join(ROOT(), 'server.pid');
7
+ const WATCHDOG_PID_FILE = () => path.join(ROOT(), 'watchdog.pid');
8
+ const CRASH_LOG_FILE = () => path.join(ROOT(), 'server-crash.log');
9
+ function writePid(file, pid) {
10
+ try {
11
+ fs.mkdirSync(path.dirname(file), { recursive: true });
12
+ fs.writeFileSync(file, String(pid));
13
+ }
14
+ catch { /* ignore */ }
15
+ }
16
+ function tryReadPid(file) {
17
+ try {
18
+ const raw = fs.readFileSync(file, 'utf-8').trim();
19
+ const pid = Number(raw);
20
+ if (!pid || !Number.isInteger(pid))
21
+ return null;
22
+ process.kill(pid, 0);
23
+ return pid;
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ function cleanPid(file) {
30
+ try {
31
+ fs.unlinkSync(file);
32
+ }
33
+ catch { /* ignore */ }
34
+ }
35
+ function logCrash(code, signal, restartCount) {
36
+ try {
37
+ fs.mkdirSync(ROOT(), { recursive: true });
38
+ const line = `[${new Date().toISOString()}] exit code=${code} signal=${signal} restartCount=${restartCount}\n`;
39
+ fs.appendFileSync(CRASH_LOG_FILE(), line);
40
+ }
41
+ catch { /* ignore */ }
42
+ }
43
+ function parseNodeArgs(raw) {
44
+ if (!raw)
45
+ return [];
46
+ return raw.split(',').filter(Boolean);
47
+ }
48
+ function runWatchdog() {
49
+ const entry = process.env.HM_SERVER_ENTRY;
50
+ const logFile = process.env.HM_SERVER_LOG;
51
+ const nodeArgs = parseNodeArgs(process.env.HM_SERVER_NODE_ARGS);
52
+ const maxRestartDelayMs = Number(process.env.HM_WATCHDOG_MAX_DELAY_MS || '30000');
53
+ if (!entry || !logFile) {
54
+ console.error('[HunterMate watchdog] HM_SERVER_ENTRY and HM_SERVER_LOG are required');
55
+ process.exit(1);
56
+ }
57
+ // 清理残留 pid
58
+ cleanPid(SERVER_PID_FILE());
59
+ const existingWatchdog = tryReadPid(WATCHDOG_PID_FILE());
60
+ if (existingWatchdog && existingWatchdog !== process.pid) {
61
+ console.error(`[HunterMate watchdog] another watchdog already running (pid=${existingWatchdog})`);
62
+ process.exit(1);
63
+ }
64
+ writePid(WATCHDOG_PID_FILE(), process.pid);
65
+ let child = null;
66
+ let restartCount = 0;
67
+ let restartTimer = null;
68
+ let stopping = false;
69
+ function startChild() {
70
+ if (stopping)
71
+ return;
72
+ try {
73
+ const logFd = fs.openSync(logFile, 'a');
74
+ const env = { ...process.env };
75
+ delete env.HM_SERVER_ENTRY;
76
+ delete env.HM_SERVER_LOG;
77
+ delete env.HM_SERVER_NODE_ARGS;
78
+ delete env.HM_WATCHDOG_MAX_DELAY_MS;
79
+ child = spawn(process.execPath, [...nodeArgs, entry], {
80
+ stdio: ['ignore', logFd, logFd],
81
+ env,
82
+ detached: false,
83
+ windowsHide: true,
84
+ });
85
+ if (child.pid)
86
+ writePid(SERVER_PID_FILE(), child.pid);
87
+ child.on('exit', (code, signal) => {
88
+ try {
89
+ fs.closeSync(logFd);
90
+ }
91
+ catch { /* ignore */ }
92
+ if (stopping)
93
+ return;
94
+ logCrash(code ?? null, signal, restartCount);
95
+ child = null;
96
+ restartCount++;
97
+ const delay = Math.min(1000 * Math.pow(2, restartCount), maxRestartDelayMs);
98
+ restartTimer = setTimeout(startChild, delay);
99
+ });
100
+ }
101
+ catch (err) {
102
+ console.error('[HunterMate watchdog] failed to start child', err);
103
+ restartCount++;
104
+ const delay = Math.min(1000 * Math.pow(2, restartCount), maxRestartDelayMs);
105
+ restartTimer = setTimeout(startChild, delay);
106
+ }
107
+ }
108
+ function stop() {
109
+ if (stopping)
110
+ return;
111
+ stopping = true;
112
+ if (restartTimer) {
113
+ clearTimeout(restartTimer);
114
+ restartTimer = null;
115
+ }
116
+ if (child && !child.killed) {
117
+ child.kill('SIGTERM');
118
+ }
119
+ cleanPid(WATCHDOG_PID_FILE());
120
+ }
121
+ process.on('SIGTERM', stop);
122
+ process.on('SIGINT', stop);
123
+ process.on('exit', () => {
124
+ cleanPid(WATCHDOG_PID_FILE());
125
+ });
126
+ startChild();
127
+ }
128
+ runWatchdog();
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "hunter-mate",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
+ "type": "module",
4
5
  "description": "HiredChina 猎头 Agent 数据助手 CLI:人才库/客户/职位数据访问,浏览器录制解析简历,server/扩展一致性自愈",
5
6
  "license": "UNLICENSED",
6
7
  "repository": {
7
8
  "type": "git",
8
- "url": "git+https://github.com/hiredchina-com/hunter-mate.git",
9
- "directory": "packages/cli"
9
+ "url": "git+github.com:hiredchina-com/hunter-mate.git"
10
10
  },
11
11
  "engines": {
12
12
  "node": ">=20"
@@ -19,6 +19,7 @@
19
19
  ],
20
20
  "dependencies": {
21
21
  "@chromepilot/kit": "^0.1.1",
22
+ "@chromepilot/logger-kit": "^0.1.3",
22
23
  "@sentry/node": "^10.70.0",
23
24
  "@types/ws": "^8.18.1",
24
25
  "axios": "^1.6.0",
@@ -30,7 +31,7 @@
30
31
  "open": "^8.4.0",
31
32
  "uuid": "^9.0.0",
32
33
  "ws": "^8.21.3",
33
- "@hunter-mate/shared": "0.1.1"
34
+ "@hunter-mate/shared": "0.1.2"
34
35
  },
35
36
  "devDependencies": {
36
37
  "@types/better-sqlite3": "^7.6.0",
@@ -42,7 +43,7 @@
42
43
  "vitest": "^1.3.0"
43
44
  },
44
45
  "scripts": {
45
- "build": "tsc",
46
+ "build": "tsc && node ../../scripts/postbuild-shim.mjs dist/index.js hunter-mate && node ../../scripts/postbuild-assets.mjs",
46
47
  "dev": "ts-node src/index.ts",
47
48
  "lint": "eslint .",
48
49
  "test": "vitest run",
@@ -1,22 +0,0 @@
1
- /**
2
- * 原生模块(node-gyp)ABI 自检 — 与 chromepilot packages/cli/src/native-check.ts 同源逻辑。
3
- *
4
- * 背景:better-sqlite3 等原生模块按编译时的 Node ABI 版本绑定
5
- * (Node 22=127, 23=131, 24=137, 25=138, 26=147)。
6
- * 换 node 版本后 server 起来即崩(dlopen 失败),且后台 spawn 会吞掉报错,
7
- * 表现为"自动启动超时, server 仍不可达"。
8
- *
9
- * 注意:仅 require 不触发 dlopen,必须 new Database 真验证。
10
- */
11
- export interface NativeModuleStatus {
12
- module: string;
13
- status: 'ok' | 'fail' | 'skip';
14
- detail: string;
15
- compiledAbi?: number;
16
- currentAbi?: number;
17
- hint?: string;
18
- }
19
- export declare function checkNativeModules(): {
20
- ok: boolean;
21
- modules: NativeModuleStatus[];
22
- };