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