hunter-mate 0.1.19 → 0.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/dist/assets/extension/background/{service-worker.20261008011501.js → service-worker.20261015103433.js} +6 -6
  2. package/dist/assets/extension/background/service-worker.js +6 -6
  3. package/dist/assets/extension/build-info.json +1 -1
  4. package/dist/assets/extension/content/index.js +2 -2
  5. package/dist/assets/extension/manifest.json +3 -3
  6. package/dist/assets/extension/offscreen/offscreen.html +1 -1
  7. package/dist/assets/extension/offscreen/offscreen.js +2 -2
  8. package/dist/assets/extension/package.json +1 -1
  9. package/dist/assets/server/chunks/{chunk-IXYSL3NT.mjs → chunk-BLXHCSZD.mjs} +8 -10
  10. package/dist/assets/server/chunks/{script-rule-ANR2J7E6.mjs → script-rule-ZJN6CEYX.mjs} +1 -1
  11. package/dist/assets/server/main.mjs +4087 -2872
  12. package/dist/index.js +231 -52
  13. package/dist/web/dist/404.html +1 -1
  14. package/dist/web/dist/_next/static/2fPtjfAzNbYkpIoAQOsP3/_buildManifest.js +1 -0
  15. package/dist/web/dist/_next/static/chunks/105-dcd8f6d5867c8995.js +32 -0
  16. package/dist/web/dist/_next/static/chunks/166.b263e636ff66212f.js +1 -0
  17. package/dist/web/dist/_next/static/chunks/1e6d5a0c.75afa2d319272f42.js +15 -0
  18. package/dist/web/dist/_next/static/chunks/555-e2a871b9d2eccb03.js +12 -0
  19. package/dist/web/dist/_next/static/chunks/589-f984bff035a1cb85.js +1 -0
  20. package/dist/web/dist/_next/static/chunks/671.ae431f885d6c7f0c.js +1 -0
  21. package/dist/web/dist/_next/static/chunks/686-9f419b70feea9470.js +1 -0
  22. package/dist/web/dist/_next/static/chunks/852-248884963a986600.js +1 -0
  23. package/dist/web/dist/_next/static/chunks/865-0ed23dd43c0832a2.js +1 -0
  24. package/dist/web/dist/_next/static/chunks/935-7be3e60dd8bc29d2.js +5 -0
  25. package/dist/web/dist/_next/static/chunks/954-fb0212fe71f60a52.js +1 -0
  26. package/dist/web/dist/_next/static/chunks/a7067448-e416655baf443992.js +1 -0
  27. package/dist/web/dist/_next/static/chunks/app/_not-found/page-5b7249eb3c9a6cb9.js +1 -0
  28. package/dist/web/dist/_next/static/chunks/app/admin/data/page-14698e9c4ddaa6d9.js +1 -0
  29. package/dist/web/dist/_next/static/chunks/app/auth/verify/page-05304d5803008d61.js +1 -0
  30. package/dist/web/dist/_next/static/chunks/app/companies/page-ec27ce9ab3610221.js +1 -0
  31. package/dist/web/dist/_next/static/chunks/app/company/admin/page-c2584183bc4b34d1.js +1 -0
  32. package/dist/web/dist/_next/static/chunks/app/entity/page-08755f96102f0565.js +1 -0
  33. package/dist/web/dist/_next/static/chunks/app/jobs/page-4175a90f1b42f87d.js +1 -0
  34. package/dist/web/dist/_next/static/chunks/app/layout-af39afc7866e74db.js +1 -0
  35. package/dist/web/dist/_next/static/chunks/app/logs/page-be50a4e10b1a0024.js +1 -0
  36. package/dist/web/dist/_next/static/chunks/app/matching/jobs/[id]/talents/page-cf445b0cb8c2cb0a.js +1 -0
  37. package/dist/web/dist/_next/static/chunks/app/matching/portraits/[id]/jobs/page-c7ff0d79b6a75915.js +1 -0
  38. package/dist/web/dist/_next/static/chunks/app/page-bd282e1e5f0965f1.js +1 -0
  39. package/dist/web/dist/_next/static/chunks/app/parselog/page-9814e75d6900a743.js +1 -0
  40. package/dist/web/dist/_next/static/chunks/app/recordings/page-441016638b43c4f8.js +1 -0
  41. package/dist/web/dist/_next/static/chunks/app/resource-usage/page-f6fa06bfe21bcd32.js +1 -0
  42. package/dist/web/dist/_next/static/chunks/app/shared/[token]/page-c9c5042a2d07c0bc.js +1 -0
  43. package/dist/web/dist/_next/static/chunks/app/snapshots/[id]/agent-prompt/page-f54cf2f0058035ca.js +1 -0
  44. package/dist/web/dist/_next/static/chunks/app/talents/page-c0a0c250eb5f5459.js +1 -0
  45. package/dist/web/dist/_next/static/chunks/app/team/insights/page-8b3934df3e292368.js +1 -0
  46. package/dist/web/dist/_next/static/chunks/framework-8aa939434277315a.js +1 -0
  47. package/dist/web/dist/_next/static/chunks/main-8a2c75d6c43385dd.js +1 -0
  48. package/dist/web/dist/_next/static/chunks/main-app-f496bd51a73ef9f3.js +1 -0
  49. package/dist/web/dist/_next/static/chunks/pages/_app-037e1cd81d653e68.js +4 -0
  50. package/dist/web/dist/_next/static/chunks/pages/_error-59095d3b83385d1f.js +1 -0
  51. package/dist/web/dist/_next/static/chunks/{webpack-cf21e951181fd345.js → webpack-54e74ccc9e9451ee.js} +1 -1
  52. package/dist/web/dist/_next/static/css/bd072fee69ae8474.css +3 -0
  53. package/dist/web/dist/admin/data.html +1 -1
  54. package/dist/web/dist/admin/data.txt +8 -6
  55. package/dist/web/dist/auth/verify.html +1 -1
  56. package/dist/web/dist/auth/verify.txt +8 -6
  57. package/dist/web/dist/companies.html +1 -1
  58. package/dist/web/dist/companies.txt +9 -7
  59. package/dist/web/dist/company/admin.html +1 -1
  60. package/dist/web/dist/company/admin.txt +8 -6
  61. package/dist/web/dist/entity.html +1 -1
  62. package/dist/web/dist/entity.txt +9 -7
  63. package/dist/web/dist/index.html +1 -1
  64. package/dist/web/dist/index.txt +9 -7
  65. package/dist/web/dist/jobs.html +1 -1
  66. package/dist/web/dist/jobs.txt +9 -7
  67. package/dist/web/dist/logs.html +1 -1
  68. package/dist/web/dist/logs.txt +9 -7
  69. package/dist/web/dist/matching/jobs/placeholder/talents.html +1 -1
  70. package/dist/web/dist/matching/jobs/placeholder/talents.txt +8 -6
  71. package/dist/web/dist/matching/portraits/placeholder/jobs.html +1 -1
  72. package/dist/web/dist/matching/portraits/placeholder/jobs.txt +8 -6
  73. package/dist/web/dist/parselog.html +1 -1
  74. package/dist/web/dist/parselog.txt +9 -7
  75. package/dist/web/dist/recordings.html +1 -1
  76. package/dist/web/dist/recordings.txt +9 -7
  77. package/dist/web/dist/resource-usage.html +1 -1
  78. package/dist/web/dist/resource-usage.txt +9 -7
  79. package/dist/web/dist/shared/placeholder.html +1 -1
  80. package/dist/web/dist/shared/placeholder.txt +8 -6
  81. package/dist/web/dist/snapshots/placeholder/agent-prompt.html +1 -1
  82. package/dist/web/dist/snapshots/placeholder/agent-prompt.txt +8 -6
  83. package/dist/web/dist/talents.html +1 -1
  84. package/dist/web/dist/talents.txt +8 -6
  85. package/dist/web/dist/team/insights.html +1 -1
  86. package/dist/web/dist/team/insights.txt +8 -6
  87. package/package.json +1 -1
  88. package/dist/web/dist/_next/static/9Wm8FfXwBJyMk-wYf4l81/_buildManifest.js +0 -1
  89. package/dist/web/dist/_next/static/chunks/166.f30be223f694f8ee.js +0 -1
  90. package/dist/web/dist/_next/static/chunks/1e6d5a0c.0488932e17ecdf24.js +0 -15
  91. package/dist/web/dist/_next/static/chunks/542-4a43545450151f1d.js +0 -1
  92. package/dist/web/dist/_next/static/chunks/589-5e99e548a0ee6bac.js +0 -1
  93. package/dist/web/dist/_next/static/chunks/670-750aa43678fb0d30.js +0 -1
  94. package/dist/web/dist/_next/static/chunks/671.3b8e9cc96b25b6ea.js +0 -1
  95. package/dist/web/dist/_next/static/chunks/686-ade57c57a1737818.js +0 -1
  96. package/dist/web/dist/_next/static/chunks/852-5150a7ae95a599fb.js +0 -1
  97. package/dist/web/dist/_next/static/chunks/935-4058f12c3d405b32.js +0 -5
  98. package/dist/web/dist/_next/static/chunks/a7067448-d3882c7e74c162bf.js +0 -1
  99. package/dist/web/dist/_next/static/chunks/app/_not-found/page-cf5ab201496f0914.js +0 -1
  100. package/dist/web/dist/_next/static/chunks/app/admin/data/page-a566c6b13c61f9d4.js +0 -1
  101. package/dist/web/dist/_next/static/chunks/app/auth/verify/page-38fa28a48f76defa.js +0 -1
  102. package/dist/web/dist/_next/static/chunks/app/companies/page-058047767bc162f4.js +0 -1
  103. package/dist/web/dist/_next/static/chunks/app/company/admin/page-a2088b59c3820800.js +0 -1
  104. package/dist/web/dist/_next/static/chunks/app/entity/page-dc9664fb628e2d08.js +0 -1
  105. package/dist/web/dist/_next/static/chunks/app/jobs/page-4fb6a67d044b238d.js +0 -1
  106. package/dist/web/dist/_next/static/chunks/app/layout-1feb99bf08beb3c8.js +0 -1
  107. package/dist/web/dist/_next/static/chunks/app/logs/page-ccc6bb863cf77e56.js +0 -1
  108. package/dist/web/dist/_next/static/chunks/app/matching/jobs/[id]/talents/page-c6714cec1ffd7c5e.js +0 -1
  109. package/dist/web/dist/_next/static/chunks/app/matching/portraits/[id]/jobs/page-658eca1ae5ca29dc.js +0 -1
  110. package/dist/web/dist/_next/static/chunks/app/page-291cd145a56bd020.js +0 -1
  111. package/dist/web/dist/_next/static/chunks/app/parselog/page-b1b7ae9483273ce0.js +0 -1
  112. package/dist/web/dist/_next/static/chunks/app/recordings/page-c12948f01885099e.js +0 -1
  113. package/dist/web/dist/_next/static/chunks/app/resource-usage/page-8394e96892688180.js +0 -1
  114. package/dist/web/dist/_next/static/chunks/app/shared/[token]/page-e859e87f2301b120.js +0 -1
  115. package/dist/web/dist/_next/static/chunks/app/snapshots/[id]/agent-prompt/page-f519552be54e3bdf.js +0 -1
  116. package/dist/web/dist/_next/static/chunks/app/talents/page-75af05473ea322d9.js +0 -1
  117. package/dist/web/dist/_next/static/chunks/app/team/insights/page-7b8769e35cd9987b.js +0 -1
  118. package/dist/web/dist/_next/static/chunks/framework-b3a558b17a070965.js +0 -1
  119. package/dist/web/dist/_next/static/chunks/main-8d45182e1c21cb95.js +0 -1
  120. package/dist/web/dist/_next/static/chunks/main-app-70da092dee991648.js +0 -1
  121. package/dist/web/dist/_next/static/chunks/pages/_app-8438560f1c1a7980.js +0 -4
  122. package/dist/web/dist/_next/static/chunks/pages/_error-17756f67e0a11350.js +0 -1
  123. package/dist/web/dist/_next/static/css/9eaf0c9cc1c24641.css +0 -3
  124. /package/dist/web/dist/_next/static/{9Wm8FfXwBJyMk-wYf4l81 → 2fPtjfAzNbYkpIoAQOsP3}/_ssgManifest.js +0 -0
package/dist/index.js CHANGED
@@ -4744,14 +4744,14 @@ var require_templates = __commonJS({
4744
4744
  }
4745
4745
  return results;
4746
4746
  }
4747
- function buildStyle(chalk4, styles) {
4747
+ function buildStyle(chalk5, styles) {
4748
4748
  const enabled = {};
4749
4749
  for (const layer of styles) {
4750
4750
  for (const style of layer.styles) {
4751
4751
  enabled[style[0]] = layer.inverse ? null : style.slice(1);
4752
4752
  }
4753
4753
  }
4754
- let current = chalk4;
4754
+ let current = chalk5;
4755
4755
  for (const [styleName, styles2] of Object.entries(enabled)) {
4756
4756
  if (!Array.isArray(styles2)) {
4757
4757
  continue;
@@ -4763,7 +4763,7 @@ var require_templates = __commonJS({
4763
4763
  }
4764
4764
  return current;
4765
4765
  }
4766
- module2.exports = (chalk4, temporary) => {
4766
+ module2.exports = (chalk5, temporary) => {
4767
4767
  const styles = [];
4768
4768
  const chunks = [];
4769
4769
  let chunk = [];
@@ -4773,13 +4773,13 @@ var require_templates = __commonJS({
4773
4773
  } else if (style) {
4774
4774
  const string = chunk.join("");
4775
4775
  chunk = [];
4776
- chunks.push(styles.length === 0 ? string : buildStyle(chalk4, styles)(string));
4776
+ chunks.push(styles.length === 0 ? string : buildStyle(chalk5, styles)(string));
4777
4777
  styles.push({ inverse, styles: parseStyle(style) });
4778
4778
  } else if (close2) {
4779
4779
  if (styles.length === 0) {
4780
4780
  throw new Error("Found extraneous } in Chalk template literal");
4781
4781
  }
4782
- chunks.push(buildStyle(chalk4, styles)(chunk.join("")));
4782
+ chunks.push(buildStyle(chalk5, styles)(chunk.join("")));
4783
4783
  chunk = [];
4784
4784
  styles.pop();
4785
4785
  } else {
@@ -4827,16 +4827,16 @@ var require_source = __commonJS({
4827
4827
  }
4828
4828
  };
4829
4829
  var chalkFactory = (options) => {
4830
- const chalk5 = {};
4831
- applyOptions(chalk5, options);
4832
- chalk5.template = (...arguments_) => chalkTag(chalk5.template, ...arguments_);
4833
- Object.setPrototypeOf(chalk5, Chalk.prototype);
4834
- Object.setPrototypeOf(chalk5.template, chalk5);
4835
- chalk5.template.constructor = () => {
4830
+ const chalk6 = {};
4831
+ applyOptions(chalk6, options);
4832
+ chalk6.template = (...arguments_) => chalkTag(chalk6.template, ...arguments_);
4833
+ Object.setPrototypeOf(chalk6, Chalk.prototype);
4834
+ Object.setPrototypeOf(chalk6.template, chalk6);
4835
+ chalk6.template.constructor = () => {
4836
4836
  throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.");
4837
4837
  };
4838
- chalk5.template.Instance = ChalkClass;
4839
- return chalk5.template;
4838
+ chalk6.template.Instance = ChalkClass;
4839
+ return chalk6.template;
4840
4840
  };
4841
4841
  function Chalk(options) {
4842
4842
  return chalkFactory(options);
@@ -4947,7 +4947,7 @@ var require_source = __commonJS({
4947
4947
  return openAll + string + closeAll;
4948
4948
  };
4949
4949
  var template;
4950
- var chalkTag = (chalk5, ...strings) => {
4950
+ var chalkTag = (chalk6, ...strings) => {
4951
4951
  const [firstString] = strings;
4952
4952
  if (!isArray2(firstString) || !isArray2(firstString.raw)) {
4953
4953
  return strings.join(" ");
@@ -4963,14 +4963,14 @@ var require_source = __commonJS({
4963
4963
  if (template === void 0) {
4964
4964
  template = require_templates();
4965
4965
  }
4966
- return template(chalk5, parts.join(""));
4966
+ return template(chalk6, parts.join(""));
4967
4967
  };
4968
4968
  Object.defineProperties(Chalk.prototype, styles);
4969
- var chalk4 = Chalk();
4970
- chalk4.supportsColor = stdoutColor;
4971
- chalk4.stderr = Chalk({ level: stderrColor ? stderrColor.level : 0 });
4972
- chalk4.stderr.supportsColor = stderrColor;
4973
- module2.exports = chalk4;
4969
+ var chalk5 = Chalk();
4970
+ chalk5.supportsColor = stdoutColor;
4971
+ chalk5.stderr = Chalk({ level: stderrColor ? stderrColor.level : 0 });
4972
+ chalk5.stderr.supportsColor = stderrColor;
4973
+ module2.exports = chalk5;
4974
4974
  }
4975
4975
  });
4976
4976
 
@@ -68795,7 +68795,7 @@ async function ensureRuntimeConsistency(opts = {}) {
68795
68795
  }
68796
68796
  markChecked();
68797
68797
  if (opts.verbose && performed.length) {
68798
- for (const line of performed) console.log(import_chalk.default.gray(` [auto-update] ${line}`));
68798
+ for (const line of performed) console.log(import_chalk2.default.gray(` [auto-update] ${line}`));
68799
68799
  }
68800
68800
  return { checked: true, actions, performed };
68801
68801
  }
@@ -68814,12 +68814,12 @@ function markChecked() {
68814
68814
  } catch {
68815
68815
  }
68816
68816
  }
68817
- var import_chalk, __filename, __dirname5, ROOT, PLUGINS_DIR, EXTENSION_MANIFEST, EXTENSION_DIR, RUNTIME_FILE, LAST_CHECK_FILE, LAST_EXT_RELOAD_BROADCAST_FILE, CHECK_THROTTLE_MS;
68817
+ var import_chalk2, __filename, __dirname5, ROOT, PLUGINS_DIR, EXTENSION_MANIFEST, EXTENSION_DIR, RUNTIME_FILE, LAST_CHECK_FILE, LAST_EXT_RELOAD_BROADCAST_FILE, CHECK_THROTTLE_MS;
68818
68818
  var init_version3 = __esm({
68819
68819
  "src/version.ts"() {
68820
68820
  "use strict";
68821
68821
  init_axios2();
68822
- import_chalk = __toESM(require_source(), 1);
68822
+ import_chalk2 = __toESM(require_source(), 1);
68823
68823
  init_config2();
68824
68824
  init_server();
68825
68825
  init_extras();
@@ -69071,7 +69071,7 @@ import { spawnSync as spawnSync3 } from "node:child_process";
69071
69071
  import { fileURLToPath as fileURLToPath5 } from "node:url";
69072
69072
  async function fetchCdnLatestManifest() {
69073
69073
  try {
69074
- const res = await axios_default.get(`${CDN_RELEASES_BASE}/latest.json`, { timeout: 1e4, proxy: false });
69074
+ const res = await axios_default.get(`${CDN_RELEASES_BASE}/latest.json?_=${Date.now()}`, { timeout: 1e4, proxy: false });
69075
69075
  const m = res.data;
69076
69076
  if (m && typeof m.version === "string" && m.version && typeof m.tgz === "string" && m.tgz) return m;
69077
69077
  return null;
@@ -69385,7 +69385,7 @@ var init_updater2 = __esm({
69385
69385
  __dirname6 = path18.dirname(fileURLToPath5(import.meta.url));
69386
69386
  ROOT2 = resolveDataDir;
69387
69387
  CLI_PREFIX = () => path18.join(ROOT2(), "cli");
69388
- CDN_RELEASES_BASE = process.env.HUNTER_MATE_CDN_BASE || "https://image.hiredchina.com/hunter-mate-releases";
69388
+ CDN_RELEASES_BASE = process.env.HUNTER_MATE_CDN_BASE || "https://npm.hiredchina.com/packages/hunter-mate-releases";
69389
69389
  kitUpdater = createCliUpdater({
69390
69390
  npmPackage: "hunter-mate",
69391
69391
  envPrefix: "HUNTER_MATE",
@@ -70289,7 +70289,7 @@ function cleanValue(v) {
70289
70289
  function looseName(s) {
70290
70290
  return s.trim().toLowerCase().replace(/\s+/g, " ");
70291
70291
  }
70292
- async function authedHeaders5() {
70292
+ async function authedHeaders6() {
70293
70293
  const token = await getToken().catch(() => void 0);
70294
70294
  return token ? { Authorization: `UTOKEN ${token}` } : {};
70295
70295
  }
@@ -70334,7 +70334,7 @@ async function maybeSyncHmhLocal() {
70334
70334
  const persistState = () => writeState(state);
70335
70335
  const config = loadConfig();
70336
70336
  const serverUrl = config.serverUrl.replace(/\/$/, "");
70337
- const headers = await authedHeaders5();
70337
+ const headers = await authedHeaders6();
70338
70338
  const log3 = getCliLogger();
70339
70339
  try {
70340
70340
  const customersRes = await axios_default.get(`${serverUrl}/customers`, { headers, proxy: false, timeout: HTTP_TIMEOUT_MS });
@@ -70501,7 +70501,7 @@ var init_hmh_sync = __esm({
70501
70501
 
70502
70502
  // src/index.ts
70503
70503
  init_esm();
70504
- var import_chalk3 = __toESM(require_source(), 1);
70504
+ var import_chalk4 = __toESM(require_source(), 1);
70505
70505
 
70506
70506
  // src/sentry.ts
70507
70507
  init_dist();
@@ -70716,6 +70716,51 @@ var logoutCommand = new Command("logout").description(i18n.t("logout.description
70716
70716
  console.log(i18n.t("logout.success"));
70717
70717
  });
70718
70718
 
70719
+ // src/commands/token.ts
70720
+ init_esm();
70721
+ init_axios2();
70722
+ var import_chalk = __toESM(require_source(), 1);
70723
+ init_keychain();
70724
+ init_config2();
70725
+ var tokenCommand = new Command("token").description("\u8F93\u51FA\u5F53\u524D\u767B\u5F55\u6001\u7684 SaaS \u4EE4\u724C(HMJWT,\u9065\u6D4B/\u540C\u6B65\u4E0A\u62A5 dev-ops \u7684\u51ED\u8BC1)").option("--json", "JSON \u8F93\u51FA {token,email,hmUserId}", false).action(async (opts) => {
70726
+ let out;
70727
+ try {
70728
+ const session = await getSessionStatus();
70729
+ if (session.info && session.via === "server") {
70730
+ const serverUrl = loadConfig().serverUrl;
70731
+ const { data } = await axios_default.get(`${serverUrl}/auth/saas-token`, {
70732
+ headers: { Authorization: `UTOKEN ${session.info.token}` },
70733
+ proxy: false,
70734
+ timeout: 5e3
70735
+ });
70736
+ out = {
70737
+ token: String(data?.token ?? ""),
70738
+ email: String(data?.email ?? session.email ?? ""),
70739
+ hmUserId: typeof data?.hmUserId === "number" ? data.hmUserId : null
70740
+ };
70741
+ if (!out.token) throw new Error("server \u8FD4\u56DE\u7A7A\u4EE4\u724C");
70742
+ } else if (session.info && session.info.issuer === "saas") {
70743
+ out = { token: session.info.token, email: session.email ?? "", hmUserId: null };
70744
+ } else {
70745
+ console.error(import_chalk.default.red("\u672A\u767B\u5F55:\u8BF7\u8FD0\u884C hunter-mate login --email <\u90AE\u7BB1>"));
70746
+ process.exit(1);
70747
+ }
70748
+ } catch (e) {
70749
+ const status = e?.response?.status;
70750
+ console.error(
70751
+ import_chalk.default.red(
70752
+ status === 401 ? "\u767B\u5F55\u5DF2\u8FC7\u671F,\u8BF7\u91CD\u65B0\u8FD0\u884C hunter-mate login --email <\u90AE\u7BB1>" : `\u83B7\u53D6\u4EE4\u724C\u5931\u8D25: ${e?.message ?? e}`
70753
+ )
70754
+ );
70755
+ process.exit(1);
70756
+ }
70757
+ if (opts.json) {
70758
+ console.log(JSON.stringify(out));
70759
+ } else {
70760
+ console.log(out.token);
70761
+ }
70762
+ });
70763
+
70719
70764
  // src/commands/status.ts
70720
70765
  init_esm();
70721
70766
  init_axios2();
@@ -71158,8 +71203,12 @@ jobCommand.command("create <folder>").description(i18n.t("job.create")).option("
71158
71203
  process.exit(1);
71159
71204
  }
71160
71205
  });
71161
- jobCommand.command("list").description("List JobCases (\u4F18\u5148 server,\u5931\u8D25\u515C\u5E95\u672C\u5730\u7F13\u5B58)").action(async () => {
71206
+ jobCommand.command("list").description("List JobCases (\u4F18\u5148 server,\u5931\u8D25\u515C\u5E95\u672C\u5730\u7F13\u5B58)").option("--json", "JSON \u8F93\u51FA(\u542B externalId,\u4F9B\u811A\u672C/hmh \u95E8\u7981\u53CD\u67E5\u804C\u4F4D id)", false).action(async (opts) => {
71162
71207
  const cases = await runJobList();
71208
+ if (opts.json) {
71209
+ console.log(JSON.stringify(cases));
71210
+ return;
71211
+ }
71163
71212
  console.table(cases.map((c) => ({ id: c.id, folder: c.parsedFrom?.folderPath ?? c.folderPath, status: c.status, createdAt: c.createdAt })));
71164
71213
  });
71165
71214
 
@@ -71170,7 +71219,7 @@ init_config2();
71170
71219
  init_keychain();
71171
71220
  init_i18n();
71172
71221
  init_logger3();
71173
- var import_chalk2 = __toESM(require_source(), 1);
71222
+ var import_chalk3 = __toESM(require_source(), 1);
71174
71223
  init_version3();
71175
71224
  init_updater2();
71176
71225
  import * as fs18 from "fs";
@@ -71217,12 +71266,12 @@ function reportNativeCheck(prefix) {
71217
71266
  const failed = native.modules.filter((m) => m.status === "fail");
71218
71267
  for (const m of native.modules) {
71219
71268
  if (m.status === "skip") {
71220
- console.log(import_chalk2.default.gray(`${prefix}\u539F\u751F\u6A21\u5757 ${m.module}: \u8DF3\u8FC7(${m.detail})`));
71269
+ console.log(import_chalk3.default.gray(`${prefix}\u539F\u751F\u6A21\u5757 ${m.module}: \u8DF3\u8FC7(${m.detail})`));
71221
71270
  } else if (m.status === "ok") {
71222
- console.log(import_chalk2.default.gray(`${prefix}\u539F\u751F\u6A21\u5757 ${m.module}: ${m.detail}`));
71271
+ console.log(import_chalk3.default.gray(`${prefix}\u539F\u751F\u6A21\u5757 ${m.module}: ${m.detail}`));
71223
71272
  } else {
71224
- console.log(import_chalk2.default.red(`${prefix}\u539F\u751F\u6A21\u5757 ${m.module}: ${m.detail}`));
71225
- if (m.hint) console.log(import_chalk2.default.red(`${prefix} \u4FEE\u590D: ${m.hint}`));
71273
+ console.log(import_chalk3.default.red(`${prefix}\u539F\u751F\u6A21\u5757 ${m.module}: ${m.detail}`));
71274
+ if (m.hint) console.log(import_chalk3.default.red(`${prefix} \u4FEE\u590D: ${m.hint}`));
71226
71275
  }
71227
71276
  }
71228
71277
  return failed.length === 0;
@@ -71274,16 +71323,16 @@ var updateCommand = new Command("update").description(i18n.t("update.description
71274
71323
  console.log(i18n.t("update.checking"));
71275
71324
  const result = await runUpdate();
71276
71325
  if (result.cliVersion) {
71277
- console.log(import_chalk2.default.gray(`CLI/Server latest version: ${result.cliVersion}`));
71326
+ console.log(import_chalk3.default.gray(`CLI/Server latest version: ${result.cliVersion}`));
71278
71327
  } else {
71279
71328
  getCliLogger().warn("update:cli-server-check-failed", {
71280
71329
  hint: "Failed to check CLI/Server updates"
71281
71330
  });
71282
71331
  }
71283
71332
  if (result.ruleUpdated) {
71284
- console.log(import_chalk2.default.green(`New rule package available: ${result.ruleVersion}`));
71333
+ console.log(import_chalk3.default.green(`New rule package available: ${result.ruleVersion}`));
71285
71334
  } else if (result.ruleVersion) {
71286
- console.log(import_chalk2.default.gray(`Rule package is up to date: ${result.ruleVersion}`));
71335
+ console.log(import_chalk3.default.gray(`Rule package is up to date: ${result.ruleVersion}`));
71287
71336
  } else {
71288
71337
  getCliLogger().warn("update:rule-check-failed", {
71289
71338
  hint: "Failed to check rule updates"
@@ -71296,34 +71345,34 @@ var updateCommand = new Command("update").description(i18n.t("update.description
71296
71345
  const npmPackage = updateCfg.npmPackage ?? "hunter-mate";
71297
71346
  const installed = readInstalledVersions();
71298
71347
  if (channel3 === "off") {
71299
- console.log(import_chalk2.default.gray(`update.channel=off\uFF0C\u8DF3\u8FC7 CLI \u81EA\u66F4\u65B0`));
71348
+ console.log(import_chalk3.default.gray(`update.channel=off\uFF0C\u8DF3\u8FC7 CLI \u81EA\u66F4\u65B0`));
71300
71349
  } else if (isDevLinked()) {
71301
- console.log(import_chalk2.default.gray(`dev \u8F6F\u94FE\u6A21\u5F0F\uFF0C\u8DF3\u8FC7 CLI \u81EA\u66F4\u65B0(\u6539\u4EE3\u7801\u8BF7 pnpm build)\uFF1B\u7EE7\u7EED\u6267\u884C\u4E00\u81F4\u6027\u4FEE\u590D`));
71350
+ console.log(import_chalk3.default.gray(`dev \u8F6F\u94FE\u6A21\u5F0F\uFF0C\u8DF3\u8FC7 CLI \u81EA\u66F4\u65B0(\u6539\u4EE3\u7801\u8BF7 pnpm build)\uFF1B\u7EE7\u7EED\u6267\u884C\u4E00\u81F4\u6027\u4FEE\u590D`));
71302
71351
  } else if (channel3 === "npm") {
71303
71352
  const { version: latest, detail } = await npmLatestVersionRobust(npmPackage);
71304
71353
  if (!latest) {
71305
- console.log(import_chalk2.default.yellow(`npm registry \u67E5\u8BE2 ${npmPackage} \u5931\u8D25(${detail})\uFF0C\u8DF3\u8FC7\u81EA\u66F4\u65B0`));
71354
+ console.log(import_chalk3.default.yellow(`npm registry \u67E5\u8BE2 ${npmPackage} \u5931\u8D25(${detail})\uFF0C\u8DF3\u8FC7\u81EA\u66F4\u65B0`));
71306
71355
  } else if (latest === installed.cli) {
71307
- console.log(import_chalk2.default.gray(`CLI \u5DF2\u662F\u6700\u65B0: ${installed.cli}`));
71356
+ console.log(import_chalk3.default.gray(`CLI \u5DF2\u662F\u6700\u65B0: ${installed.cli}`));
71308
71357
  if (!reportNativeCheck("")) {
71309
- console.log(import_chalk2.default.yellow(" \u7248\u672C\u867D\u6700\u65B0,\u4F46\u539F\u751F\u7ED1\u5B9A\u4E0D\u53EF\u7528 \u2014 \u8BF7\u6309\u4E0A\u65B9\u4FEE\u590D\u63D0\u793A\u5904\u7406,\u7136\u540E\u91CD\u8DD1 hunter-mate doctor \u590D\u6838"));
71358
+ console.log(import_chalk3.default.yellow(" \u7248\u672C\u867D\u6700\u65B0,\u4F46\u539F\u751F\u7ED1\u5B9A\u4E0D\u53EF\u7528 \u2014 \u8BF7\u6309\u4E0A\u65B9\u4FEE\u590D\u63D0\u793A\u5904\u7406,\u7136\u540E\u91CD\u8DD1 hunter-mate doctor \u590D\u6838"));
71310
71359
  }
71311
71360
  } else {
71312
- console.log(import_chalk2.default.cyan(`CLI \u81EA\u66F4\u65B0: ${installed.cli} \u2192 ${latest}`));
71361
+ console.log(import_chalk3.default.cyan(`CLI \u81EA\u66F4\u65B0: ${installed.cli} \u2192 ${latest}`));
71313
71362
  const r = await npmSelfUpdate(npmPackage, latest);
71314
- console.log(r.ok && r.verified !== false ? import_chalk2.default.green(r.msg) : import_chalk2.default.yellow(r.msg));
71363
+ console.log(r.ok && r.verified !== false ? import_chalk3.default.green(r.msg) : import_chalk3.default.yellow(r.msg));
71315
71364
  if (r.ok && !reportNativeCheck("\u88C5\u540E\u9A8C\u8BC1 \u2014 ")) {
71316
- console.log(import_chalk2.default.yellow(" \u66F4\u65B0\u5DF2\u5B89\u88C5\u4F46\u539F\u751F\u7ED1\u5B9A\u4E0D\u53EF\u7528 \u2014 server \u5C06\u65E0\u6CD5\u542F\u52A8,\u8BF7\u6309\u4E0A\u65B9\u4FEE\u590D\u63D0\u793A\u5904\u7406"));
71365
+ console.log(import_chalk3.default.yellow(" \u66F4\u65B0\u5DF2\u5B89\u88C5\u4F46\u539F\u751F\u7ED1\u5B9A\u4E0D\u53EF\u7528 \u2014 server \u5C06\u65E0\u6CD5\u542F\u52A8,\u8BF7\u6309\u4E0A\u65B9\u4FEE\u590D\u63D0\u793A\u5904\u7406"));
71317
71366
  }
71318
71367
  }
71319
71368
  }
71320
71369
  const report = await ensureRuntimeConsistency({ force: true, verbose: true });
71321
71370
  if (!report.checked) {
71322
- console.log(import_chalk2.default.gray(`\u4E00\u81F4\u6027\u68C0\u6D4B\u8DF3\u8FC7: ${report.reason ?? "server not running"}`));
71371
+ console.log(import_chalk3.default.gray(`\u4E00\u81F4\u6027\u68C0\u6D4B\u8DF3\u8FC7: ${report.reason ?? "server not running"}`));
71323
71372
  } else if (report.performed.length) {
71324
- for (const line of report.performed) console.log(import_chalk2.default.green(` \u2713 ${line}`));
71373
+ for (const line of report.performed) console.log(import_chalk3.default.green(` \u2713 ${line}`));
71325
71374
  } else {
71326
- console.log(import_chalk2.default.gray("\u8FD0\u884C\u4E2D\u7248\u672C\u4E0E\u78C1\u76D8\u4E00\u81F4\uFF0C\u65E0\u9700 reload/\u91CD\u542F"));
71375
+ console.log(import_chalk3.default.gray("\u8FD0\u884C\u4E2D\u7248\u672C\u4E0E\u78C1\u76D8\u4E00\u81F4\uFF0C\u65E0\u9700 reload/\u91CD\u542F"));
71327
71376
  }
71328
71377
  }
71329
71378
  console.log(i18n.t("update.latest"));
@@ -72246,12 +72295,14 @@ withFormat(recordingsCommand.command("list").description("\u5217\u51FA\u5F55\u52
72246
72295
  process.exit(1);
72247
72296
  }
72248
72297
  });
72249
- recordingsCommand.command("run <url>").description("\u811A\u672C\u9A71\u52A8\u5F55\u5236:\u6309 adapter.recording.operations \u6267\u884C\u5E76\u81EA\u52A8\u89E3\u6790(\u767D\u540D\u5355\u5916 URL \u62D2\u7EDD)").option("--adapter <file>", "\u6307\u5B9A adapter \u76F8\u5BF9\u8DEF\u5F84(\u9ED8\u8BA4\u53D6\u767D\u540D\u5355\u547D\u4E2D\u7684\u89C4\u5219 externalId)").option("--title <text>", "\u5F55\u5236\u6807\u9898").action(async (url2, opts) => {
72298
+ recordingsCommand.command("run <url>").description("\u811A\u672C\u9A71\u52A8\u5F55\u5236:\u6309 adapter.recording.operations \u6267\u884C\u5E76\u81EA\u52A8\u89E3\u6790(\u767D\u540D\u5355\u5916 URL \u62D2\u7EDD)").option("--adapter <file>", "\u6307\u5B9A adapter \u76F8\u5BF9\u8DEF\u5F84(\u9ED8\u8BA4\u53D6\u767D\u540D\u5355\u547D\u4E2D\u7684\u89C4\u5219 externalId)").option("--title <text>", "\u5F55\u5236\u6807\u9898").option("--ready-selector <css>", "\u76EE\u6807 DOM \u5C31\u7EEA\u9009\u62E9\u5668(\u505C\u5F55\u524D\u8F6E\u8BE2,\u8D85\u65F6 502 \u62D2\u7EDD\u534A\u6210\u54C1)").option("--ready-timeout <ms>", "\u5C31\u7EEA\u8F6E\u8BE2\u8D85\u65F6,\u9ED8\u8BA4 15000").action(async (url2, opts) => {
72250
72299
  try {
72251
72300
  const r = await http7().post("/api/recordings/run", {
72252
72301
  url: url2,
72253
72302
  adapter: opts.adapter,
72254
- title: opts.title
72303
+ title: opts.title,
72304
+ readySelector: opts.readySelector,
72305
+ readyTimeoutMs: opts.readyTimeout ? Number(opts.readyTimeout) : void 0
72255
72306
  });
72256
72307
  console.log(JSON.stringify(r.data, null, 2));
72257
72308
  } catch (e) {
@@ -73199,6 +73250,130 @@ caseCommand.command("check").requiredOption("--customer <nameOrId>", "\u5BA2\u62
73199
73250
  }
73200
73251
  });
73201
73252
 
73253
+ // src/commands/recommend.ts
73254
+ init_esm();
73255
+ init_axios2();
73256
+ init_config2();
73257
+ init_keychain();
73258
+ init_command_error();
73259
+ var recommendCommand = new Command("recommend").description(
73260
+ "\u804C\u4F4D\u63A8\u8350\u8BB0\u5F55:\u5BFB\u8BBF\u4EA4\u4ED8\u767B\u8BB0\u4E0E\u9636\u6BB5\u6D41\u8F6C(hm \u670D\u52A1\u7AEF\u534F\u4F5C\u4E8B\u5B9E\u6E90,\u975E\u672C\u673A\u6587\u4EF6)"
73261
+ );
73262
+ async function authedHeaders5() {
73263
+ const token = await getToken().catch(() => void 0);
73264
+ return token ? { Authorization: `UTOKEN ${token}` } : {};
73265
+ }
73266
+ function parseFormPairs(pairs) {
73267
+ if (!pairs) return void 0;
73268
+ const out = {};
73269
+ for (const kv of pairs.split(",")) {
73270
+ const i = kv.indexOf("=");
73271
+ if (i <= 0) throw new Error(`--form \u952E\u503C\u5BF9\u683C\u5F0F\u5E94\u4E3A k=v,\u9017\u53F7\u5206\u9694: \u6536\u5230 "${kv}"`);
73272
+ out[kv.slice(0, i).trim()] = kv.slice(i + 1).trim();
73273
+ }
73274
+ return out;
73275
+ }
73276
+ recommendCommand.command("list").description("\u6309\u804C\u4F4D\u67E5\u63A8\u8350\u8BB0\u5F55(--json \u8F93\u51FA\u5168\u91CF,\u542B snapshot,\u4F9B\u5BFB\u8BBF\u53BB\u91CD\u6838\u5BF9)").argument("<jobCaseId>", "\u804C\u4F4D case id(\u6570\u5B57)").option("--stage <stage>", "\u9636\u6BB5\u8FC7\u6EE4,\u5982 recommended;\u5408\u6CD5\u503C GET /recommendations/meta").option("--json", "JSON \u8F93\u51FA\u5168\u91CF", false).action(async (jobCaseId, opts) => {
73277
+ try {
73278
+ const config = loadConfig();
73279
+ const q = opts.stage ? `?stage=${encodeURIComponent(opts.stage)}` : "";
73280
+ const res = await axios_default.get(
73281
+ `${config.serverUrl}/job-cases/${encodeURIComponent(jobCaseId)}/recommendations${q}`,
73282
+ { headers: await authedHeaders5(), proxy: false, timeout: 1e4 }
73283
+ );
73284
+ const data = res.data ?? {};
73285
+ if (opts.json) {
73286
+ console.log(JSON.stringify(data));
73287
+ return;
73288
+ }
73289
+ const items = Array.isArray(data.items) ? data.items : [];
73290
+ const counts = data.counts ?? {};
73291
+ const nonzero = Object.entries(counts).filter(([, n]) => Number(n) > 0);
73292
+ console.log(`\u804C\u4F4D #${jobCaseId} \u63A8\u8350\u8BB0\u5F55:\u5171 ${data.total ?? items.length} \u6761`);
73293
+ if (nonzero.length) {
73294
+ console.log(
73295
+ "\u9636\u6BB5\u5206\u5E03: " + nonzero.map(([k2, n]) => `${k2}=${n}`).join(" ")
73296
+ );
73297
+ }
73298
+ for (const r of items) {
73299
+ const name = r.snapshot?.name ?? r.portraitName ?? r.entityId ?? r.portraitId ?? "?";
73300
+ console.log(`- [${r.stage}] ${name} (\u66F4\u65B0 ${r.updatedAt ?? ""})`);
73301
+ }
73302
+ } catch (err) {
73303
+ printCommandError("recommend:list-failed", err);
73304
+ process.exit(1);
73305
+ }
73306
+ });
73307
+ recommendCommand.command("add").description("\u63A8\u8350\u5EFA\u6863(\u5E42\u7B49):\u5BFB\u8BBF\u4EA4\u4ED8\u767B\u8BB0;--stage recommended \u8FDB\u63A8\u8350\u4EBA\u624D\u6C60").argument("<jobCaseId>", "\u804C\u4F4D case id(\u6570\u5B57)").option("--entity <id>", "\u4EBA\u624D\u5B9E\u4F53 id(talent_profiles)").option("--portrait <id>", "\u4EBA\u624D\u7EDF\u4E00\u6863\u6848 id(talent_portraits)").option("--stage <stage>", "\u76EE\u6807\u9636\u6BB5", "recommended").option("--note <text>", "\u5907\u6CE8(\u5982\u53BB\u91CD\u6821\u9A8C\u7ED3\u8BBA)").option("--form <k=v,k=v>", "\u9636\u6BB5\u8868\u5355\u952E\u503C\u5BF9(\u9017\u53F7\u5206\u9694,\u6A21\u677F\u89C1 GET /recommendations/meta)").option("--name <name>", "\u4EBA\u624D\u540D\u5FEB\u7167(\u8DE8\u7AEF\u53EF\u8BFB)").option("--headline <text>", "headline \u5FEB\u7167").option("--source <text>", "\u6765\u6E90\u5FEB\u7167(\u5982 linkedin/liepin)").option("--url <url>", "\u4E3B\u9875 URL:\u672A\u7ED9 --entity/--portrait \u65F6\u5148\u7ECF /ingest/talents \u5EFA\u6863\u4EBA\u624D\u5B9E\u4F53,\u518D\u6302\u63A8\u8350\u8BB0\u5F55").option("--json", "JSON \u8F93\u51FA\u5EFA\u6863\u7ED3\u679C", false).action(async (jobCaseId, opts) => {
73308
+ try {
73309
+ const config = loadConfig();
73310
+ const headers = await authedHeaders5();
73311
+ let entityId = opts.entity ? Number(opts.entity) : void 0;
73312
+ const portraitId = opts.portrait ? String(opts.portrait) : void 0;
73313
+ if (!entityId && !portraitId && opts.url) {
73314
+ const ingest = await axios_default.post(
73315
+ `${config.serverUrl}/ingest/talents`,
73316
+ {
73317
+ runId: `recommend-cli-${Date.now()}`,
73318
+ items: [{ url: opts.url, source: opts.source || "linkedin.com", name: opts.name, headline: opts.headline }]
73319
+ },
73320
+ { headers, proxy: false, timeout: 15e3 }
73321
+ );
73322
+ const first = ingest.data?.results?.[0];
73323
+ if (!first?.id) {
73324
+ throw new Error(`\u4EBA\u624D\u5B9E\u4F53\u5EFA\u6863\u5931\u8D25: ${first?.error ?? JSON.stringify(ingest.data).slice(0, 200)}`);
73325
+ }
73326
+ entityId = first.id;
73327
+ }
73328
+ if (!entityId && !portraitId) {
73329
+ throw new Error("\u5FC5\u987B\u6307\u5B9A --entity <id> / --portrait <id>,\u6216\u7ED9 --url \u7531 CLI \u81EA\u52A8\u5EFA\u6863\u4EBA\u624D\u5B9E\u4F53");
73330
+ }
73331
+ const formData = parseFormPairs(opts.form);
73332
+ const snapshot = {};
73333
+ if (opts.name) snapshot.name = opts.name;
73334
+ if (opts.headline) snapshot.headline = opts.headline;
73335
+ if (opts.source) snapshot.source = opts.source;
73336
+ if (opts.url) snapshot.contact = { linkedinUrls: [opts.url] };
73337
+ const res = await axios_default.post(
73338
+ `${config.serverUrl}/recommendations`,
73339
+ {
73340
+ jobCaseId: Number(jobCaseId),
73341
+ stage: opts.stage,
73342
+ entityId,
73343
+ portraitId,
73344
+ note: opts.note,
73345
+ formData,
73346
+ snapshot: Object.keys(snapshot).length ? snapshot : void 0
73347
+ },
73348
+ { headers, proxy: false, timeout: 1e4 }
73349
+ );
73350
+ if (opts.json) console.log(JSON.stringify(res.data));
73351
+ else {
73352
+ const r = res.data ?? {};
73353
+ const name = r.snapshot?.name ?? opts.name ?? (entityId ? `entity#${entityId}` : `portrait#${portraitId}`);
73354
+ console.log(`\u2713 \u63A8\u8350\u5EFA\u6863: ${name} \u2192 ${r.stage ?? opts.stage} (\u804C\u4F4D #${jobCaseId}, id=${r.id ?? "?"})`);
73355
+ }
73356
+ } catch (err) {
73357
+ printCommandError("recommend:add-failed", err);
73358
+ process.exit(1);
73359
+ }
73360
+ });
73361
+ recommendCommand.command("move").description("\u9636\u6BB5\u8FC1\u79FB(\u5199 history):\u5982 recommended \u2192 pending_invite / rejected").argument("<id>", "\u63A8\u8350\u8BB0\u5F55 id(uuid)").requiredOption("--stage <stage>", "\u76EE\u6807\u9636\u6BB5;\u5408\u6CD5\u503C GET /recommendations/meta").option("--note <text>", "\u8FC1\u79FB\u5907\u6CE8(\u5982\u4E0D\u5408\u9002\u539F\u56E0)").option("--json", "JSON \u8F93\u51FA", false).action(async (id, opts) => {
73362
+ try {
73363
+ const config = loadConfig();
73364
+ const res = await axios_default.patch(
73365
+ `${config.serverUrl}/recommendations/${encodeURIComponent(id)}`,
73366
+ { stage: opts.stage, note: opts.note },
73367
+ { headers: await authedHeaders5(), proxy: false, timeout: 1e4 }
73368
+ );
73369
+ if (opts.json) console.log(JSON.stringify(res.data));
73370
+ else console.log(`\u2713 \u9636\u6BB5\u8FC1\u79FB: ${id} \u2192 ${opts.stage}`);
73371
+ } catch (err) {
73372
+ printCommandError("recommend:move-failed", err);
73373
+ process.exit(1);
73374
+ }
73375
+ });
73376
+
73202
73377
  // src/commands/issue-env.ts
73203
73378
  init_esm();
73204
73379
  init_axios2();
@@ -73318,7 +73493,7 @@ function installLocalProxyBypass() {
73318
73493
  // package.json
73319
73494
  var package_default = {
73320
73495
  name: "hunter-mate",
73321
- version: "0.1.19",
73496
+ version: "0.1.20",
73322
73497
  type: "module",
73323
73498
  description: "HiredChina \u730E\u5934 Agent \u6570\u636E\u52A9\u624B CLI:\u4EBA\u624D\u5E93/\u5BA2\u6237/\u804C\u4F4D\u6570\u636E\u8BBF\u95EE,\u6D4F\u89C8\u5668\u5F55\u5236\u89E3\u6790\u7B80\u5386,server/\u6269\u5C55\u4E00\u81F4\u6027\u81EA\u6108",
73324
73499
  license: "MIT",
@@ -73427,11 +73602,13 @@ program2.name("hunter-mate").description(i18n.t("cli.description") + "\uFF08\u5D
73427
73602
  const name = thisCommand.name();
73428
73603
  if (name === "update" || name === "start" || name === "stop") return;
73429
73604
  if (name === "migrate-data-dir") return;
73605
+ if (name === "token") return;
73606
+ if (name === "recommend") return;
73430
73607
  if (name === "doctor" || name === "repair-linkedin-dupes") return;
73431
73608
  const argv = process.argv;
73432
73609
  const jsonMode = argv.includes("--json") || argv.includes("--format=json") || argv.includes("-f=json") || argv.some((a, i) => (a === "--format" || a === "-f") && argv[i + 1] === "json");
73433
73610
  const notify = (line) => {
73434
- const text = import_chalk3.default.gray(` [auto-update] ${line}`);
73611
+ const text = import_chalk4.default.gray(` [auto-update] ${line}`);
73435
73612
  if (jsonMode) console.error(text);
73436
73613
  else console.log(text);
73437
73614
  };
@@ -73478,6 +73655,7 @@ program2.addCommand(startCommand);
73478
73655
  program2.addCommand(stopCommand);
73479
73656
  program2.addCommand(loginCommand);
73480
73657
  program2.addCommand(logoutCommand);
73658
+ program2.addCommand(tokenCommand);
73481
73659
  program2.addCommand(statusCommand);
73482
73660
  program2.addCommand(configCommand);
73483
73661
  program2.addCommand(searchCommand);
@@ -73505,6 +73683,7 @@ program2.addCommand(noteCommand);
73505
73683
  program2.addCommand(logsCommand);
73506
73684
  program2.addCommand(preferenceCommand);
73507
73685
  program2.addCommand(caseCommand);
73686
+ program2.addCommand(recommendCommand);
73508
73687
  program2.addCommand(issueEnvCommand);
73509
73688
  program2.parse();
73510
73689
  /*! Bundled license information:
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="zh-CN"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/9eaf0c9cc1c24641.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-cf21e951181fd345.js"/><script src="/_next/static/chunks/a7067448-d3882c7e74c162bf.js" async=""></script><script src="/_next/static/chunks/935-4058f12c3d405b32.js" async=""></script><script src="/_next/static/chunks/main-app-70da092dee991648.js" async=""></script><script src="/_next/static/chunks/589-5e99e548a0ee6bac.js" async=""></script><script src="/_next/static/chunks/app/layout-1feb99bf08beb3c8.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>HunterMate 采集仪表盘</title><meta name="description" content="HunterMate 采集/解析/入库仪表盘"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="flex h-screen overflow-hidden bg-gray-50 text-gray-900"><aside class="flex h-screen w-56 flex-col border-r border-gray-200 bg-white" style="border-top-color:var(--brand)"><div class="flex items-center gap-2 border-b border-gray-200 px-4 py-3" style="box-shadow:inset 3px 0 0 var(--brand)"><span class="text-xl">🤝</span><span class="font-semibold text-gray-900">HunterMate</span></div><nav class="flex-1 overflow-auto py-3"><a class="mx-2 flex items-center gap-3 rounded-lg px-3 py-2 text-sm transition-colors text-gray-600 hover:bg-gray-50 hover:text-gray-900" href="/"><span class="text-base">📊</span>仪表盘</a><a class="mx-2 flex items-center gap-3 rounded-lg px-3 py-2 text-sm transition-colors text-gray-600 hover:bg-gray-50 hover:text-gray-900" href="/talents"><span class="text-base">👤</span>人才</a><a class="mx-2 flex items-center gap-3 rounded-lg px-3 py-2 text-sm transition-colors text-gray-600 hover:bg-gray-50 hover:text-gray-900" href="/jobs"><span class="text-base">💼</span>职位</a><a class="mx-2 flex items-center gap-3 rounded-lg px-3 py-2 text-sm transition-colors text-gray-600 hover:bg-gray-50 hover:text-gray-900" href="/companies"><span class="text-base">🏢</span>公司</a><a class="mx-2 flex items-center gap-3 rounded-lg px-3 py-2 text-sm transition-colors text-gray-600 hover:bg-gray-50 hover:text-gray-900" href="/parselog"><span class="text-base">📋</span>解析日志</a><a class="mx-2 flex items-center gap-3 rounded-lg px-3 py-2 text-sm transition-colors text-gray-600 hover:bg-gray-50 hover:text-gray-900" href="/recordings"><span class="text-base">🔴</span>录制</a><a class="mx-2 flex items-center gap-3 rounded-lg px-3 py-2 text-sm transition-colors text-gray-600 hover:bg-gray-50 hover:text-gray-900" href="/resource-usage"><span class="text-base">💽</span>资源占用</a><a class="mx-2 flex items-center gap-3 rounded-lg px-3 py-2 text-sm transition-colors text-gray-600 hover:bg-gray-50 hover:text-gray-900" href="/team/insights"><span class="text-base">📈</span>团队统计</a></nav><div class="mx-2 mb-2 rounded-lg bg-gray-100 p-1" title="角色视角:列表与详情按视角展示内容,记住上次选择"><div class="grid grid-cols-2 gap-1"><button type="button" class="rounded-md px-2 py-1.5 text-xs font-medium transition bg-white shadow-sm" style="color:var(--brand-strong)">🎯<!-- --> <!-- -->交付</button><button type="button" class="rounded-md px-2 py-1.5 text-xs font-medium transition text-gray-500 hover:text-gray-700">🧭<!-- --> <!-- -->BD</button></div></div><div class="relative border-t border-gray-200 px-3 py-3"><div class="flex items-center justify-between"><div><div class="text-sm text-gray-500">未登录</div><div class="text-xs text-gray-400">登录后可跨设备同步数据</div></div><button class="rounded-lg bg-blue-600 px-3 py-1.5 text-sm text-white hover:bg-blue-700">登录</button></div></div></aside><main class="flex-1 overflow-hidden"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div></main><script src="/_next/static/chunks/webpack-cf21e951181fd345.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/css/9eaf0c9cc1c24641.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"2:I[6939,[],\"\"]\n4:I[4268,[],\"\"]\n5:I[1050,[],\"\"]\n6:I[2215,[\"589\",\"static/chunks/589-5e99e548a0ee6bac.js\",\"185\",\"static/chunks/app/layout-1feb99bf08beb3c8.js\"],\"SystemSidebar\"]\nc:I[2319,[],\"\"]\n7:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\n8:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\n9:{\"display\":\"inline-block\"}\na:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nd:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L2\",null,{\"buildId\":\"9Wm8FfXwBJyMk-wYf4l81\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L3\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/9eaf0c9cc1c24641.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"zh-CN\",\"children\":[\"$\",\"body\",null,{\"className\":\"flex h-screen overflow-hidden bg-gray-50 text-gray-900\",\"children\":[[\"$\",\"$L6\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 overflow-hidden\",\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$7\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$8\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$9\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$a\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$Lb\"],\"globalErrorComponent\":\"$c\",\"missingSlots\":\"$Wd\"}]\n"])</script><script>self.__next_f.push([1,"b:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"HunterMate 采集仪表盘\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"HunterMate 采集/解析/入库仪表盘\"}]]\n3:null\n"])</script></body></html>
1
+ <!DOCTYPE html><html lang="zh-CN"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/bd072fee69ae8474.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-54e74ccc9e9451ee.js"/><script src="/_next/static/chunks/a7067448-e416655baf443992.js" async=""></script><script src="/_next/static/chunks/935-7be3e60dd8bc29d2.js" async=""></script><script src="/_next/static/chunks/main-app-f496bd51a73ef9f3.js" async=""></script><script src="/_next/static/chunks/589-f984bff035a1cb85.js" async=""></script><script src="/_next/static/chunks/105-dcd8f6d5867c8995.js" async=""></script><script src="/_next/static/chunks/app/layout-af39afc7866e74db.js" async=""></script><meta name="robots" content="noindex"/><title>HunterMate 采集仪表盘</title><meta name="description" content="HunterMate 采集/解析/入库仪表盘"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="flex h-screen overflow-hidden bg-gray-50 text-gray-900"><div class="flex h-screen w-screen flex-col items-center justify-center bg-gray-50"><span class="hm-spinner" aria-label="加载中"></span><div class="mt-4 text-sm text-gray-400">正在加载,请稍候…</div></div><script src="/_next/static/chunks/webpack-54e74ccc9e9451ee.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/css/bd072fee69ae8474.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"2:I[76939,[],\"\"]\n4:I[74268,[],\"\"]\n5:I[81050,[],\"\"]\n6:I[15214,[\"589\",\"static/chunks/589-f984bff035a1cb85.js\",\"105\",\"static/chunks/105-dcd8f6d5867c8995.js\",\"185\",\"static/chunks/app/layout-af39afc7866e74db.js\"],\"AuthGate\"]\n7:I[67188,[\"589\",\"static/chunks/589-f984bff035a1cb85.js\",\"105\",\"static/chunks/105-dcd8f6d5867c8995.js\",\"185\",\"static/chunks/app/layout-af39afc7866e74db.js\"],\"AntdProvider\"]\n8:I[9424,[\"589\",\"static/chunks/589-f984bff035a1cb85.js\",\"105\",\"static/chunks/105-dcd8f6d5867c8995.js\",\"185\",\"static/chunks/app/layout-af39afc7866e74db.js\"],\"SystemSidebar\"]\ne:I[62319,[],\"\"]\n9:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\na:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\nb:{\"display\":\"inline-block\"}\nc:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nf:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L2\",null,{\"buildId\":\"2fPtjfAzNbYkpIoAQOsP3\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L3\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/bd072fee69ae8474.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"zh-CN\",\"children\":[\"$\",\"body\",null,{\"className\":\"flex h-screen overflow-hidden bg-gray-50 text-gray-900\",\"children\":[\"$\",\"$L6\",null,{\"children\":[\"$\",\"$L7\",null,{\"children\":[[\"$\",\"$L8\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 overflow-hidden\",\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$9\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$a\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$b\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$c\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]]}]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$Ld\"],\"globalErrorComponent\":\"$e\",\"missingSlots\":\"$Wf\"}]\n"])</script><script>self.__next_f.push([1,"d:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"HunterMate 采集仪表盘\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"HunterMate 采集/解析/入库仪表盘\"}]]\n3:null\n"])</script></body></html>
@@ -0,0 +1 @@
1
+ self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/_error":["static/chunks/pages/_error-59095d3b83385d1f.js"],sortedPages:["/_app","/_error"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();