hunter-mate 0.1.2 → 0.1.4
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.
- package/LICENSE +21 -0
- package/dist/assets/extension/_locales/en_US/messages.json +5 -0
- package/dist/assets/extension/_locales/zh_CN/messages.json +5 -0
- package/dist/assets/extension/background/service-worker.js +3342 -0
- package/dist/assets/extension/content/index.js +13765 -0
- package/dist/assets/extension/manifest.json +47 -0
- package/dist/assets/extension/package.json +24 -0
- package/dist/assets/extension/sidepanel/index.html +400 -0
- package/dist/assets/extension/sidepanel/index.js +926 -0
- package/dist/assets/server/agent-session/agent-session.controller.d.ts +32 -0
- package/dist/assets/server/agent-session/agent-session.controller.js +83 -0
- package/dist/assets/server/agent-session/agent-session.controller.js.map +1 -0
- package/dist/assets/server/agent-session/agent-session.guard.d.ts +4 -0
- package/dist/assets/server/agent-session/agent-session.guard.js +32 -0
- package/dist/assets/server/agent-session/agent-session.guard.js.map +1 -0
- package/dist/assets/server/agent-session/agent-session.module.d.ts +2 -0
- package/dist/assets/server/agent-session/agent-session.module.js +28 -0
- package/dist/assets/server/agent-session/agent-session.module.js.map +1 -0
- package/dist/assets/server/agent-session/agent-session.service.d.ts +54 -0
- package/dist/assets/server/agent-session/agent-session.service.js +431 -0
- package/dist/assets/server/agent-session/agent-session.service.js.map +1 -0
- package/dist/assets/server/agent-session/agent-session.types.d.ts +56 -0
- package/dist/assets/server/agent-session/agent-session.types.js +3 -0
- package/dist/assets/server/agent-session/agent-session.types.js.map +1 -0
- package/dist/assets/server/agent-session/entities/agent-event.entity.d.ts +12 -0
- package/dist/assets/server/agent-session/entities/agent-event.entity.js +73 -0
- package/dist/assets/server/agent-session/entities/agent-event.entity.js.map +1 -0
- package/dist/assets/server/agent-session/entities/agent-message.entity.d.ts +13 -0
- package/dist/assets/server/agent-session/entities/agent-message.entity.js +77 -0
- package/dist/assets/server/agent-session/entities/agent-message.entity.js.map +1 -0
- package/dist/assets/server/agent-session/entities/agent-session.entity.d.ts +14 -0
- package/dist/assets/server/agent-session/entities/agent-session.entity.js +83 -0
- package/dist/assets/server/agent-session/entities/agent-session.entity.js.map +1 -0
- package/dist/assets/server/app.module.d.ts +4 -0
- package/dist/assets/server/app.module.js +127 -0
- package/dist/assets/server/app.module.js.map +1 -0
- package/dist/assets/server/auth/auth.controller.d.ts +22 -0
- package/dist/assets/server/auth/auth.controller.js +88 -0
- package/dist/assets/server/auth/auth.controller.js.map +1 -0
- package/dist/assets/server/auth/auth.middleware.d.ts +5 -0
- package/dist/assets/server/auth/auth.middleware.js +34 -0
- package/dist/assets/server/auth/auth.middleware.js.map +1 -0
- package/dist/assets/server/auth/auth.module.d.ts +2 -0
- package/dist/assets/server/auth/auth.module.js +24 -0
- package/dist/assets/server/auth/auth.module.js.map +1 -0
- package/dist/assets/server/auth/auth.service.d.ts +30 -0
- package/dist/assets/server/auth/auth.service.js +183 -0
- package/dist/assets/server/auth/auth.service.js.map +1 -0
- package/dist/assets/server/auth/auth.types.d.ts +28 -0
- package/dist/assets/server/auth/auth.types.js +3 -0
- package/dist/assets/server/auth/auth.types.js.map +1 -0
- package/dist/assets/server/build-info.json +4 -0
- package/dist/assets/server/common/common.module.d.ts +2 -0
- package/dist/assets/server/common/common.module.js +22 -0
- package/dist/assets/server/common/common.module.js.map +1 -0
- package/dist/assets/server/common/crypto.service.d.ts +11 -0
- package/dist/assets/server/common/crypto.service.js +73 -0
- package/dist/assets/server/common/crypto.service.js.map +1 -0
- package/dist/assets/server/communication/communication-record.entity.d.ts +15 -0
- package/dist/assets/server/communication/communication-record.entity.js +80 -0
- package/dist/assets/server/communication/communication-record.entity.js.map +1 -0
- package/dist/assets/server/communication/communication.controller.d.ts +12 -0
- package/dist/assets/server/communication/communication.controller.js +61 -0
- package/dist/assets/server/communication/communication.controller.js.map +1 -0
- package/dist/assets/server/communication/communication.module.d.ts +2 -0
- package/dist/assets/server/communication/communication.module.js +25 -0
- package/dist/assets/server/communication/communication.module.js.map +1 -0
- package/dist/assets/server/communication/communication.service.d.ts +23 -0
- package/dist/assets/server/communication/communication.service.js +51 -0
- package/dist/assets/server/communication/communication.service.js.map +1 -0
- package/dist/assets/server/db/schema-validator.service.d.ts +25 -0
- package/dist/assets/server/db/schema-validator.service.js +107 -0
- package/dist/assets/server/db/schema-validator.service.js.map +1 -0
- package/dist/assets/server/db/schema-version.entity.d.ts +5 -0
- package/dist/assets/server/db/schema-version.entity.js +35 -0
- package/dist/assets/server/db/schema-version.entity.js.map +1 -0
- package/dist/assets/server/db/sqlite.module.d.ts +2 -0
- package/dist/assets/server/db/sqlite.module.js +83 -0
- package/dist/assets/server/db/sqlite.module.js.map +1 -0
- package/dist/assets/server/devops/devops-sink-init.d.ts +23 -0
- package/dist/assets/server/devops/devops-sink-init.js +101 -0
- package/dist/assets/server/devops/devops-sink-init.js.map +1 -0
- package/dist/assets/server/devops/devops-sink-init.spec.d.ts +1 -0
- package/dist/assets/server/devops/devops-sink-init.spec.js +71 -0
- package/dist/assets/server/devops/devops-sink-init.spec.js.map +1 -0
- package/dist/assets/server/devops/devops-sink.module.d.ts +2 -0
- package/dist/assets/server/devops/devops-sink.module.js +22 -0
- package/dist/assets/server/devops/devops-sink.module.js.map +1 -0
- package/dist/assets/server/doctor/doctor.controller.d.ts +13 -0
- package/dist/assets/server/doctor/doctor.controller.js +62 -0
- package/dist/assets/server/doctor/doctor.controller.js.map +1 -0
- package/dist/assets/server/doctor/doctor.module.d.ts +2 -0
- package/dist/assets/server/doctor/doctor.module.js +27 -0
- package/dist/assets/server/doctor/doctor.module.js.map +1 -0
- package/dist/assets/server/doctor/doctor.service.d.ts +15 -0
- package/dist/assets/server/doctor/doctor.service.js +209 -0
- package/dist/assets/server/doctor/doctor.service.js.map +1 -0
- package/dist/assets/server/doctor/doctor.types.d.ts +46 -0
- package/dist/assets/server/doctor/doctor.types.js +3 -0
- package/dist/assets/server/doctor/doctor.types.js.map +1 -0
- package/dist/assets/server/extension/extension-control.controller.d.ts +67 -0
- package/dist/assets/server/extension/extension-control.controller.js +173 -0
- package/dist/assets/server/extension/extension-control.controller.js.map +1 -0
- package/dist/assets/server/extension/extension-control.service.d.ts +46 -0
- package/dist/assets/server/extension/extension-control.service.js +212 -0
- package/dist/assets/server/extension/extension-control.service.js.map +1 -0
- package/dist/assets/server/extension/extension-core.module.d.ts +2 -0
- package/dist/assets/server/extension/extension-core.module.js +21 -0
- package/dist/assets/server/extension/extension-core.module.js.map +1 -0
- package/dist/assets/server/extension/extension-version.controller.d.ts +6 -0
- package/dist/assets/server/extension/extension-version.controller.js +41 -0
- package/dist/assets/server/extension/extension-version.controller.js.map +1 -0
- package/dist/assets/server/extension/extension.module.d.ts +2 -0
- package/dist/assets/server/extension/extension.module.js +25 -0
- package/dist/assets/server/extension/extension.module.js.map +1 -0
- package/dist/assets/server/extraction/adapter.service.d.ts +55 -0
- package/dist/assets/server/extraction/adapter.service.js +275 -0
- package/dist/assets/server/extraction/adapter.service.js.map +1 -0
- package/dist/assets/server/extraction/anomaly-report.service.d.ts +12 -0
- package/dist/assets/server/extraction/anomaly-report.service.js +81 -0
- package/dist/assets/server/extraction/anomaly-report.service.js.map +1 -0
- package/dist/assets/server/extraction/entities/adapter-rule.entity.d.ts +13 -0
- package/dist/assets/server/extraction/entities/adapter-rule.entity.js +71 -0
- package/dist/assets/server/extraction/entities/adapter-rule.entity.js.map +1 -0
- package/dist/assets/server/extraction/entities/company-profile.entity.d.ts +14 -0
- package/dist/assets/server/extraction/entities/company-profile.entity.js +81 -0
- package/dist/assets/server/extraction/entities/company-profile.entity.js.map +1 -0
- package/dist/assets/server/extraction/entities/job-posting.entity.d.ts +15 -0
- package/dist/assets/server/extraction/entities/job-posting.entity.js +86 -0
- package/dist/assets/server/extraction/entities/job-posting.entity.js.map +1 -0
- package/dist/assets/server/extraction/entities/parse-log.entity.d.ts +18 -0
- package/dist/assets/server/extraction/entities/parse-log.entity.js +102 -0
- package/dist/assets/server/extraction/entities/parse-log.entity.js.map +1 -0
- package/dist/assets/server/extraction/entities/talent-profile.entity.d.ts +15 -0
- package/dist/assets/server/extraction/entities/talent-profile.entity.js +86 -0
- package/dist/assets/server/extraction/entities/talent-profile.entity.js.map +1 -0
- package/dist/assets/server/extraction/extraction-entity.controller.d.ts +138 -0
- package/dist/assets/server/extraction/extraction-entity.controller.js +493 -0
- package/dist/assets/server/extraction/extraction-entity.controller.js.map +1 -0
- package/dist/assets/server/extraction/extraction-rule.controller.d.ts +7 -0
- package/dist/assets/server/extraction/extraction-rule.controller.js +48 -0
- package/dist/assets/server/extraction/extraction-rule.controller.js.map +1 -0
- package/dist/assets/server/extraction/extraction-rule.entity.d.ts +15 -0
- package/dist/assets/server/extraction/extraction-rule.entity.js +80 -0
- package/dist/assets/server/extraction/extraction-rule.entity.js.map +1 -0
- package/dist/assets/server/extraction/extraction-rule.service.d.ts +24 -0
- package/dist/assets/server/extraction/extraction-rule.service.js +89 -0
- package/dist/assets/server/extraction/extraction-rule.service.js.map +1 -0
- package/dist/assets/server/extraction/extraction.module.d.ts +2 -0
- package/dist/assets/server/extraction/extraction.module.js +53 -0
- package/dist/assets/server/extraction/extraction.module.js.map +1 -0
- package/dist/assets/server/extraction/extraction.service.d.ts +78 -0
- package/dist/assets/server/extraction/extraction.service.js +430 -0
- package/dist/assets/server/extraction/extraction.service.js.map +1 -0
- package/dist/assets/server/extraction/linkedin-extractor.d.ts +1 -0
- package/dist/assets/server/extraction/linkedin-extractor.js +244 -0
- package/dist/assets/server/extraction/linkedin-extractor.js.map +1 -0
- package/dist/assets/server/extraction/rrweb-snapshot.utils.d.ts +15 -0
- package/dist/assets/server/extraction/rrweb-snapshot.utils.js +48 -0
- package/dist/assets/server/extraction/rrweb-snapshot.utils.js.map +1 -0
- package/dist/assets/server/extraction/rrweb-snapshot.utils.spec.d.ts +1 -0
- package/dist/assets/server/extraction/rrweb-snapshot.utils.spec.js +60 -0
- package/dist/assets/server/extraction/rrweb-snapshot.utils.spec.js.map +1 -0
- package/dist/assets/server/extraction/script-rule.d.ts +14 -0
- package/dist/assets/server/extraction/script-rule.js +49 -0
- package/dist/assets/server/extraction/script-rule.js.map +1 -0
- package/dist/assets/server/extraction/snapshot-analysis.service.d.ts +23 -0
- package/dist/assets/server/extraction/snapshot-analysis.service.js +147 -0
- package/dist/assets/server/extraction/snapshot-analysis.service.js.map +1 -0
- package/dist/assets/server/extraction/structured-data.d.ts +7 -0
- package/dist/assets/server/extraction/structured-data.js +96 -0
- package/dist/assets/server/extraction/structured-data.js.map +1 -0
- package/dist/assets/server/hcapi/hcapi.module.d.ts +2 -0
- package/dist/assets/server/hcapi/hcapi.module.js +23 -0
- package/dist/assets/server/hcapi/hcapi.module.js.map +1 -0
- package/dist/assets/server/hcapi/hcapi.service.d.ts +28 -0
- package/dist/assets/server/hcapi/hcapi.service.js +81 -0
- package/dist/assets/server/hcapi/hcapi.service.js.map +1 -0
- package/dist/assets/server/health/health.controller.d.ts +19 -0
- package/dist/assets/server/health/health.controller.js +59 -0
- package/dist/assets/server/health/health.controller.js.map +1 -0
- package/dist/assets/server/jobcase/jobcase.controller.d.ts +12 -0
- package/dist/assets/server/jobcase/jobcase.controller.js +61 -0
- package/dist/assets/server/jobcase/jobcase.controller.js.map +1 -0
- package/dist/assets/server/jobcase/jobcase.entity.d.ts +13 -0
- package/dist/assets/server/jobcase/jobcase.entity.js +71 -0
- package/dist/assets/server/jobcase/jobcase.entity.js.map +1 -0
- package/dist/assets/server/jobcase/jobcase.module.d.ts +2 -0
- package/dist/assets/server/jobcase/jobcase.module.js +26 -0
- package/dist/assets/server/jobcase/jobcase.module.js.map +1 -0
- package/dist/assets/server/jobcase/jobcase.service.d.ts +21 -0
- package/dist/assets/server/jobcase/jobcase.service.js +56 -0
- package/dist/assets/server/jobcase/jobcase.service.js.map +1 -0
- package/dist/assets/server/llm/llm.module.d.ts +2 -0
- package/dist/assets/server/llm/llm.module.js +21 -0
- package/dist/assets/server/llm/llm.module.js.map +1 -0
- package/dist/assets/server/llm/llm.service.d.ts +18 -0
- package/dist/assets/server/llm/llm.service.js +65 -0
- package/dist/assets/server/llm/llm.service.js.map +1 -0
- package/dist/assets/server/main.d.ts +1 -0
- package/dist/assets/server/main.js +30 -0
- package/dist/assets/server/main.js.map +1 -0
- package/dist/assets/server/matching/matching.controller.d.ts +16 -0
- package/dist/assets/server/matching/matching.controller.js +97 -0
- package/dist/assets/server/matching/matching.controller.js.map +1 -0
- package/dist/assets/server/matching/matching.module.d.ts +2 -0
- package/dist/assets/server/matching/matching.module.js +36 -0
- package/dist/assets/server/matching/matching.module.js.map +1 -0
- package/dist/assets/server/matching/matching.service.d.ts +55 -0
- package/dist/assets/server/matching/matching.service.js +409 -0
- package/dist/assets/server/matching/matching.service.js.map +1 -0
- package/dist/assets/server/package.json +57 -0
- package/dist/assets/server/parsed-resume/parsed-resume.controller.d.ts +6 -0
- package/dist/assets/server/parsed-resume/parsed-resume.controller.js +42 -0
- package/dist/assets/server/parsed-resume/parsed-resume.controller.js.map +1 -0
- package/dist/assets/server/parsed-resume/parsed-resume.entity.d.ts +124 -0
- package/dist/assets/server/parsed-resume/parsed-resume.entity.js +72 -0
- package/dist/assets/server/parsed-resume/parsed-resume.entity.js.map +1 -0
- package/dist/assets/server/parsed-resume/parsed-resume.module.d.ts +2 -0
- package/dist/assets/server/parsed-resume/parsed-resume.module.js +26 -0
- package/dist/assets/server/parsed-resume/parsed-resume.module.js.map +1 -0
- package/dist/assets/server/parsed-resume/parsed-resume.service.d.ts +10 -0
- package/dist/assets/server/parsed-resume/parsed-resume.service.js +45 -0
- package/dist/assets/server/parsed-resume/parsed-resume.service.js.map +1 -0
- package/dist/assets/server/parsing/parse-error-report.entity.d.ts +11 -0
- package/dist/assets/server/parsing/parse-error-report.entity.js +66 -0
- package/dist/assets/server/parsing/parse-error-report.entity.js.map +1 -0
- package/dist/assets/server/parsing/parsing.controller.d.ts +19 -0
- package/dist/assets/server/parsing/parsing.controller.js +97 -0
- package/dist/assets/server/parsing/parsing.controller.js.map +1 -0
- package/dist/assets/server/parsing/parsing.module.d.ts +2 -0
- package/dist/assets/server/parsing/parsing.module.js +38 -0
- package/dist/assets/server/parsing/parsing.module.js.map +1 -0
- package/dist/assets/server/parsing/parsing.service.d.ts +38 -0
- package/dist/assets/server/parsing/parsing.service.js +263 -0
- package/dist/assets/server/parsing/parsing.service.js.map +1 -0
- package/dist/assets/server/query/fields-meta.controller.d.ts +28 -0
- package/dist/assets/server/query/fields-meta.controller.js +57 -0
- package/dist/assets/server/query/fields-meta.controller.js.map +1 -0
- package/dist/assets/server/query/query-builder.controller.d.ts +11 -0
- package/dist/assets/server/query/query-builder.controller.js +40 -0
- package/dist/assets/server/query/query-builder.controller.js.map +1 -0
- package/dist/assets/server/query/query-builder.service.d.ts +8 -0
- package/dist/assets/server/query/query-builder.service.js +41 -0
- package/dist/assets/server/query/query-builder.service.js.map +1 -0
- package/dist/assets/server/query/query.module.d.ts +2 -0
- package/dist/assets/server/query/query.module.js +23 -0
- package/dist/assets/server/query/query.module.js.map +1 -0
- package/dist/assets/server/recording/entities/recording-event.entity.d.ts +9 -0
- package/dist/assets/server/recording/entities/recording-event.entity.js +56 -0
- package/dist/assets/server/recording/entities/recording-event.entity.js.map +1 -0
- package/dist/assets/server/recording/entities/recording-snapshot.entity.d.ts +16 -0
- package/dist/assets/server/recording/entities/recording-snapshot.entity.js +91 -0
- package/dist/assets/server/recording/entities/recording-snapshot.entity.js.map +1 -0
- package/dist/assets/server/recording/recording-event-bus.service.d.ts +4 -0
- package/dist/assets/server/recording/recording-event-bus.service.js +25 -0
- package/dist/assets/server/recording/recording-event-bus.service.js.map +1 -0
- package/dist/assets/server/recording/recording-snapshot.service.d.ts +13 -0
- package/dist/assets/server/recording/recording-snapshot.service.js +81 -0
- package/dist/assets/server/recording/recording-snapshot.service.js.map +1 -0
- package/dist/assets/server/recording/recording-snapshot.service.spec.d.ts +1 -0
- package/dist/assets/server/recording/recording-snapshot.service.spec.js +65 -0
- package/dist/assets/server/recording/recording-snapshot.service.spec.js.map +1 -0
- package/dist/assets/server/recording/recording.controller.d.ts +54 -0
- package/dist/assets/server/recording/recording.controller.js +77 -0
- package/dist/assets/server/recording/recording.controller.js.map +1 -0
- package/dist/assets/server/recording/recording.gateway.d.ts +15 -0
- package/dist/assets/server/recording/recording.gateway.js +117 -0
- package/dist/assets/server/recording/recording.gateway.js.map +1 -0
- package/dist/assets/server/recording/recording.module.d.ts +2 -0
- package/dist/assets/server/recording/recording.module.js +36 -0
- package/dist/assets/server/recording/recording.module.js.map +1 -0
- package/dist/assets/server/recording/recording.service.d.ts +43 -0
- package/dist/assets/server/recording/recording.service.js +124 -0
- package/dist/assets/server/recording/recording.service.js.map +1 -0
- package/dist/assets/server/remark/remark.controller.d.ts +21 -0
- package/dist/assets/server/remark/remark.controller.js +59 -0
- package/dist/assets/server/remark/remark.controller.js.map +1 -0
- package/dist/assets/server/remark/remark.entity.d.ts +18 -0
- package/dist/assets/server/remark/remark.entity.js +67 -0
- package/dist/assets/server/remark/remark.entity.js.map +1 -0
- package/dist/assets/server/remark/remark.module.d.ts +2 -0
- package/dist/assets/server/remark/remark.module.js +26 -0
- package/dist/assets/server/remark/remark.module.js.map +1 -0
- package/dist/assets/server/remark/remark.service.d.ts +8 -0
- package/dist/assets/server/remark/remark.service.js +39 -0
- package/dist/assets/server/remark/remark.service.js.map +1 -0
- package/dist/assets/server/report/report.controller.d.ts +18 -0
- package/dist/assets/server/report/report.controller.js +41 -0
- package/dist/assets/server/report/report.controller.js.map +1 -0
- package/dist/assets/server/report/report.module.d.ts +2 -0
- package/dist/assets/server/report/report.module.js +24 -0
- package/dist/assets/server/report/report.module.js.map +1 -0
- package/dist/assets/server/report/report.service.d.ts +23 -0
- package/dist/assets/server/report/report.service.js +54 -0
- package/dist/assets/server/report/report.service.js.map +1 -0
- package/dist/assets/server/rules/rules.controller.d.ts +6 -0
- package/dist/assets/server/rules/rules.controller.js +35 -0
- package/dist/assets/server/rules/rules.controller.js.map +1 -0
- package/dist/assets/server/rules/rules.module.d.ts +2 -0
- package/dist/assets/server/rules/rules.module.js +23 -0
- package/dist/assets/server/rules/rules.module.js.map +1 -0
- package/dist/assets/server/rules/rules.service.d.ts +10 -0
- package/dist/assets/server/rules/rules.service.js +26 -0
- package/dist/assets/server/rules/rules.service.js.map +1 -0
- package/dist/assets/server/search/search.controller.d.ts +6 -0
- package/dist/assets/server/search/search.controller.js +53 -0
- package/dist/assets/server/search/search.controller.js.map +1 -0
- package/dist/assets/server/search/search.module.d.ts +2 -0
- package/dist/assets/server/search/search.module.js +24 -0
- package/dist/assets/server/search/search.module.js.map +1 -0
- package/dist/assets/server/search/search.service.d.ts +6 -0
- package/dist/assets/server/search/search.service.js +46 -0
- package/dist/assets/server/search/search.service.js.map +1 -0
- package/dist/assets/server/sentry.d.ts +3 -0
- package/dist/assets/server/sentry.js +10 -0
- package/dist/assets/server/sentry.js.map +1 -0
- package/dist/assets/server/site/entities/site-registry.entity.d.ts +13 -0
- package/dist/assets/server/site/entities/site-registry.entity.js +76 -0
- package/dist/assets/server/site/entities/site-registry.entity.js.map +1 -0
- package/dist/assets/server/site/site.controller.d.ts +38 -0
- package/dist/assets/server/site/site.controller.js +60 -0
- package/dist/assets/server/site/site.controller.js.map +1 -0
- package/dist/assets/server/site/site.module.d.ts +2 -0
- package/dist/assets/server/site/site.module.js +26 -0
- package/dist/assets/server/site/site.module.js.map +1 -0
- package/dist/assets/server/site/site.service.d.ts +38 -0
- package/dist/assets/server/site/site.service.js +141 -0
- package/dist/assets/server/site/site.service.js.map +1 -0
- package/dist/assets/server/snapshot/raw-snapshot.entity.d.ts +35 -0
- package/dist/assets/server/snapshot/raw-snapshot.entity.js +62 -0
- package/dist/assets/server/snapshot/raw-snapshot.entity.js.map +1 -0
- package/dist/assets/server/snapshot/snapshot.controller.d.ts +18 -0
- package/dist/assets/server/snapshot/snapshot.controller.js +76 -0
- package/dist/assets/server/snapshot/snapshot.controller.js.map +1 -0
- package/dist/assets/server/snapshot/snapshot.module.d.ts +2 -0
- package/dist/assets/server/snapshot/snapshot.module.js +26 -0
- package/dist/assets/server/snapshot/snapshot.module.js.map +1 -0
- package/dist/assets/server/snapshot/snapshot.service.d.ts +10 -0
- package/dist/assets/server/snapshot/snapshot.service.js +48 -0
- package/dist/assets/server/snapshot/snapshot.service.js.map +1 -0
- package/dist/assets/server/system/system.controller.d.ts +39 -0
- package/dist/assets/server/system/system.controller.js +93 -0
- package/dist/assets/server/system/system.controller.js.map +1 -0
- package/dist/assets/server/system/system.module.d.ts +2 -0
- package/dist/assets/server/system/system.module.js +26 -0
- package/dist/assets/server/system/system.module.js.map +1 -0
- package/dist/assets/server/system/system.service.d.ts +86 -0
- package/dist/assets/server/system/system.service.js +433 -0
- package/dist/assets/server/system/system.service.js.map +1 -0
- package/dist/assets/server/talent-fingerprint/fingerprint-match.service.d.ts +28 -0
- package/dist/assets/server/talent-fingerprint/fingerprint-match.service.js +186 -0
- package/dist/assets/server/talent-fingerprint/fingerprint-match.service.js.map +1 -0
- package/dist/assets/server/talent-fingerprint/talent-fingerprint.entity.d.ts +30 -0
- package/dist/assets/server/talent-fingerprint/talent-fingerprint.entity.js +55 -0
- package/dist/assets/server/talent-fingerprint/talent-fingerprint.entity.js.map +1 -0
- package/dist/assets/server/talent-fingerprint/talent-fingerprint.module.d.ts +2 -0
- package/dist/assets/server/talent-fingerprint/talent-fingerprint.module.js +25 -0
- package/dist/assets/server/talent-fingerprint/talent-fingerprint.module.js.map +1 -0
- package/dist/assets/server/talent-fingerprint/talent-fingerprint.service.d.ts +8 -0
- package/dist/assets/server/talent-fingerprint/talent-fingerprint.service.js +44 -0
- package/dist/assets/server/talent-fingerprint/talent-fingerprint.service.js.map +1 -0
- package/dist/assets/server/talent-job-match/talent-job-match.controller.d.ts +6 -0
- package/dist/assets/server/talent-job-match/talent-job-match.controller.js +42 -0
- package/dist/assets/server/talent-job-match/talent-job-match.controller.js.map +1 -0
- package/dist/assets/server/talent-job-match/talent-job-match.entity.d.ts +33 -0
- package/dist/assets/server/talent-job-match/talent-job-match.entity.js +73 -0
- package/dist/assets/server/talent-job-match/talent-job-match.entity.js.map +1 -0
- package/dist/assets/server/talent-job-match/talent-job-match.module.d.ts +2 -0
- package/dist/assets/server/talent-job-match/talent-job-match.module.js +26 -0
- package/dist/assets/server/talent-job-match/talent-job-match.module.js.map +1 -0
- package/dist/assets/server/talent-job-match/talent-job-match.service.d.ts +9 -0
- package/dist/assets/server/talent-job-match/talent-job-match.service.js +42 -0
- package/dist/assets/server/talent-job-match/talent-job-match.service.js.map +1 -0
- package/dist/assets/server/talent-portrait/portrait-merge.service.d.ts +17 -0
- package/dist/assets/server/talent-portrait/portrait-merge.service.js +200 -0
- package/dist/assets/server/talent-portrait/portrait-merge.service.js.map +1 -0
- package/dist/assets/server/talent-portrait/talent-portrait.controller.d.ts +7 -0
- package/dist/assets/server/talent-portrait/talent-portrait.controller.js +52 -0
- package/dist/assets/server/talent-portrait/talent-portrait.controller.js.map +1 -0
- package/dist/assets/server/talent-portrait/talent-portrait.entity.d.ts +91 -0
- package/dist/assets/server/talent-portrait/talent-portrait.entity.js +71 -0
- package/dist/assets/server/talent-portrait/talent-portrait.entity.js.map +1 -0
- package/dist/assets/server/talent-portrait/talent-portrait.module.d.ts +2 -0
- package/dist/assets/server/talent-portrait/talent-portrait.module.js +27 -0
- package/dist/assets/server/talent-portrait/talent-portrait.module.js.map +1 -0
- package/dist/assets/server/talent-portrait/talent-portrait.service.d.ts +10 -0
- package/dist/assets/server/talent-portrait/talent-portrait.service.js +46 -0
- package/dist/assets/server/talent-portrait/talent-portrait.service.js.map +1 -0
- package/dist/assets/server/telemetry/telemetry.module.d.ts +2 -0
- package/dist/assets/server/telemetry/telemetry.module.js +24 -0
- package/dist/assets/server/telemetry/telemetry.module.js.map +1 -0
- package/dist/assets/server/telemetry/telemetry.service.d.ts +29 -0
- package/dist/assets/server/telemetry/telemetry.service.js +116 -0
- package/dist/assets/server/telemetry/telemetry.service.js.map +1 -0
- package/dist/auto-doctor.d.ts +8 -0
- package/dist/auto-doctor.js +34 -0
- package/dist/bundled-assets.d.ts +22 -0
- package/dist/bundled-assets.js +80 -0
- package/dist/cache/db.js +10 -54
- package/dist/commands/addons.js +46 -71
- package/dist/commands/cache.js +29 -27
- package/dist/commands/config.d.ts +1 -1
- package/dist/commands/config.js +8 -12
- package/dist/commands/doctor.d.ts +38 -1
- package/dist/commands/doctor.js +214 -74
- package/dist/commands/extension.js +84 -98
- package/dist/commands/extras.d.ts +32 -2
- package/dist/commands/extras.js +252 -64
- package/dist/commands/init.js +18 -46
- package/dist/commands/install.js +31 -60
- package/dist/commands/job.js +27 -65
- package/dist/commands/login.js +50 -37
- package/dist/commands/logout.js +8 -12
- package/dist/commands/ops.js +94 -67
- package/dist/commands/record.js +21 -59
- package/dist/commands/report.js +14 -18
- package/dist/commands/search.js +14 -21
- package/dist/commands/server.d.ts +1 -1
- package/dist/commands/server.js +126 -112
- package/dist/commands/status.js +23 -27
- package/dist/commands/update.js +44 -79
- package/dist/config.d.ts +3 -0
- package/dist/config.js +12 -46
- package/dist/i18n/index.js +5 -11
- package/dist/i18n/locales/en-US.json +24 -1
- package/dist/i18n/locales/zh-CN.json +24 -1
- package/dist/index.cmd +3 -0
- package/dist/index.js +90 -98
- package/dist/index.ps1 +3 -0
- package/dist/keychain.js +9 -44
- package/dist/logger.d.ts +7 -0
- package/dist/logger.js +80 -0
- package/dist/native-check.d.ts +6 -0
- package/dist/native-check.js +23 -0
- package/dist/sentry.js +4 -8
- package/dist/updater.js +15 -52
- package/dist/utils/proc.d.ts +35 -0
- package/dist/utils/proc.js +81 -0
- package/dist/utils/spawn.d.ts +19 -0
- package/dist/utils/spawn.js +60 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +183 -81
- package/dist/watchdog.d.ts +1 -0
- package/dist/watchdog.js +128 -0
- package/package.json +7 -6
- package/dist/commands/native-check.d.ts +0 -22
- package/dist/commands/native-check.js +0 -93
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
/**
|
|
3
|
+
* Synchronous variant — useful for `stop` commands that cannot easily be
|
|
4
|
+
* turned into async functions. Returns `true` iff the first signal
|
|
5
|
+
* attempt appeared to succeed (status 0 from `taskkill`, or `SIGTERM`
|
|
6
|
+
* delivered without throwing on POSIX).
|
|
7
|
+
*/
|
|
8
|
+
export function killGracefullySync(pid) {
|
|
9
|
+
if (process.platform === "win32") {
|
|
10
|
+
return (spawnSync("taskkill", ["/pid", String(pid), "/T"], { encoding: "utf-8" })
|
|
11
|
+
.status === 0);
|
|
12
|
+
}
|
|
13
|
+
try {
|
|
14
|
+
process.kill(pid, "SIGTERM");
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Async graceful termination.
|
|
23
|
+
*
|
|
24
|
+
* On Windows, `process.kill(pid, 'SIGTERM')` is a no-op (Node only supports
|
|
25
|
+
* `SIGKILL`/`SIGINT`/`SIGQUIT`/etc as process-group signals on POSIX).
|
|
26
|
+
* `taskkill /pid <pid> /T` without `/F` sends WM_CLOSE to GUI children and
|
|
27
|
+
* CTRL_BREAK to console children — which NestJS + Next.js turn into a
|
|
28
|
+
* graceful shutdown through `enableShutdownHooks()`. If the process is
|
|
29
|
+
* still alive after `graceMs`, we escalate to `/F` (force).
|
|
30
|
+
*
|
|
31
|
+
* On POSIX we send SIGTERM, wait `graceMs`, then SIGKILL as a last resort.
|
|
32
|
+
*
|
|
33
|
+
* The polling interval (200ms) is intentionally short so the function
|
|
34
|
+
* returns promptly when the child exits but does not busy-spin.
|
|
35
|
+
*/
|
|
36
|
+
export async function killGracefully(pid, graceMs = 5000) {
|
|
37
|
+
const deadline = Date.now() + graceMs;
|
|
38
|
+
const pollGone = async () => {
|
|
39
|
+
while (Date.now() < deadline) {
|
|
40
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
41
|
+
try {
|
|
42
|
+
process.kill(pid, 0);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
};
|
|
50
|
+
if (process.platform === "win32") {
|
|
51
|
+
const r1 = spawnSync("taskkill", ["/pid", String(pid), "/T"], {
|
|
52
|
+
encoding: "utf-8",
|
|
53
|
+
});
|
|
54
|
+
if (r1.status === 0)
|
|
55
|
+
return "graceful";
|
|
56
|
+
const out = `${r1.stdout ?? ""}${r1.stderr ?? ""}`;
|
|
57
|
+
if (/not found|找不到|0x.*找不到/i.test(out))
|
|
58
|
+
return "esrch";
|
|
59
|
+
if (await pollGone())
|
|
60
|
+
return "graceful";
|
|
61
|
+
const r2 = spawnSync("taskkill", ["/pid", String(pid), "/T", "/F"], { encoding: "utf-8" });
|
|
62
|
+
return r2.status === 0 ? "forced" : "error";
|
|
63
|
+
}
|
|
64
|
+
// POSIX path
|
|
65
|
+
try {
|
|
66
|
+
process.kill(pid, "SIGTERM");
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
const e = err;
|
|
70
|
+
return e.code === "ESRCH" ? "esrch" : "error";
|
|
71
|
+
}
|
|
72
|
+
if (await pollGone())
|
|
73
|
+
return "graceful";
|
|
74
|
+
try {
|
|
75
|
+
process.kill(pid, "SIGKILL");
|
|
76
|
+
return "forced";
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return "error";
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -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():
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
167
|
+
export async function fetchLiveVersions(timeoutMs = 3000) {
|
|
168
|
+
const config = loadConfig();
|
|
104
169
|
try {
|
|
105
|
-
const res = await
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
147
|
-
|
|
148
|
-
|
|
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 =
|
|
272
|
+
const config = loadConfig();
|
|
169
273
|
const isLocal = /\/\/(localhost|127\.0\.0\.1|\[::1\])/i.test(config.serverUrl);
|
|
170
|
-
if (
|
|
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
|
|
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
|
-
|
|
201
|
-
const r = await
|
|
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
|
|
214
|
-
performed.push(`extension reload broadcast
|
|
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(
|
|
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(
|
|
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 {};
|
package/dist/watchdog.js
ADDED
|
@@ -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();
|