@reconcrap/boss-recommend-mcp 2.1.14 → 2.1.16

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.
@@ -697,11 +697,27 @@ export function createRecruitPipelineInputSchema() {
697
697
  },
698
698
  confirmation: {
699
699
  type: "object",
700
+ description: "搜索页确认状态。新流程建议在用户看过总览后传 final_confirmed=true;逐字段 *_confirmed 为兼容旧调用保留。",
700
701
  properties: {
702
+ final_confirmed: {
703
+ type: "boolean",
704
+ description: "用户已确认包含岗位、关键词、城市、学历/院校、是否过滤已看、criteria、目标人数、动作和 restLevel 的总览。"
705
+ },
706
+ job_confirmed: { type: "boolean" },
707
+ job_value: { type: "string" },
701
708
  keyword_confirmed: { type: "boolean" },
702
709
  keyword_value: { type: "string" },
703
710
  search_params_confirmed: { type: "boolean" },
704
711
  criteria_confirmed: { type: "boolean" },
712
+ criteria_value: { type: "string" },
713
+ skip_recent_colleague_contacted_confirmed: { type: "boolean" },
714
+ skip_recent_colleague_contacted_value: { type: "boolean" },
715
+ post_action_confirmed: { type: "boolean" },
716
+ post_action_value: {
717
+ type: "string",
718
+ enum: ["greet", "none"]
719
+ },
720
+ max_greet_count_value: { type: "integer", minimum: 1 },
705
721
  use_default_for_missing: { type: "boolean" }
706
722
  },
707
723
  additionalProperties: false
@@ -709,18 +725,192 @@ export function createRecruitPipelineInputSchema() {
709
725
  overrides: {
710
726
  type: "object",
711
727
  properties: {
728
+ job: { type: "string" },
729
+ job_title: { type: "string" },
730
+ selected_job: { type: "string" },
712
731
  city: { type: "string" },
713
- degree: { type: "string" },
732
+ degree: {
733
+ anyOf: [
734
+ { type: "string" },
735
+ { type: "array", items: { type: "string" }, minItems: 1 }
736
+ ]
737
+ },
738
+ degrees: {
739
+ anyOf: [
740
+ { type: "string" },
741
+ { type: "array", items: { type: "string" }, minItems: 1 }
742
+ ]
743
+ },
714
744
  filter_recent_viewed: { type: "boolean" },
745
+ skip_recent_colleague_contacted: {
746
+ type: "boolean",
747
+ description: "默认 true。搜索页使用 Boss 的“近30天未和同事交换简历”过滤;false 会确保该过滤取消。"
748
+ },
749
+ recent_not_view: {
750
+ anyOf: [
751
+ { type: "boolean" },
752
+ { type: "string" }
753
+ ]
754
+ },
715
755
  schools: {
716
756
  anyOf: [
717
757
  { type: "array", items: { type: "string" } },
718
758
  { type: "string" }
719
759
  ]
720
760
  },
761
+ school_tag: {
762
+ anyOf: [
763
+ { type: "array", items: { type: "string" } },
764
+ { type: "string" }
765
+ ]
766
+ },
767
+ school_tags: {
768
+ anyOf: [
769
+ { type: "array", items: { type: "string" } },
770
+ { type: "string" }
771
+ ]
772
+ },
773
+ experience: {
774
+ anyOf: [
775
+ { type: "string" },
776
+ {
777
+ type: "object",
778
+ properties: {
779
+ mode: { type: "string" },
780
+ label: { type: "string" },
781
+ option: { type: "string" },
782
+ start: { anyOf: [{ type: "string" }, { type: "integer" }] },
783
+ end: { anyOf: [{ type: "string" }, { type: "integer" }] },
784
+ min: { anyOf: [{ type: "string" }, { type: "integer" }] },
785
+ max: { anyOf: [{ type: "string" }, { type: "integer" }] },
786
+ from: { anyOf: [{ type: "string" }, { type: "integer" }] },
787
+ to: { anyOf: [{ type: "string" }, { type: "integer" }] },
788
+ start_value: { type: "integer" },
789
+ end_value: { type: "integer" }
790
+ },
791
+ additionalProperties: false
792
+ }
793
+ ]
794
+ },
795
+ experiences: {
796
+ anyOf: [
797
+ { type: "array", items: { type: "string" } },
798
+ { type: "string" }
799
+ ]
800
+ },
801
+ experience_range: {
802
+ anyOf: [
803
+ { type: "string" },
804
+ {
805
+ type: "object",
806
+ properties: {
807
+ mode: { type: "string" },
808
+ label: { type: "string" },
809
+ option: { type: "string" },
810
+ start: { anyOf: [{ type: "string" }, { type: "integer" }] },
811
+ end: { anyOf: [{ type: "string" }, { type: "integer" }] },
812
+ min: { anyOf: [{ type: "string" }, { type: "integer" }] },
813
+ max: { anyOf: [{ type: "string" }, { type: "integer" }] },
814
+ from: { anyOf: [{ type: "string" }, { type: "integer" }] },
815
+ to: { anyOf: [{ type: "string" }, { type: "integer" }] },
816
+ start_value: { type: "integer" },
817
+ end_value: { type: "integer" }
818
+ },
819
+ additionalProperties: false
820
+ }
821
+ ]
822
+ },
823
+ experience_start: {
824
+ anyOf: [
825
+ { type: "string" },
826
+ { type: "integer" }
827
+ ]
828
+ },
829
+ experience_end: {
830
+ anyOf: [
831
+ { type: "string" },
832
+ { type: "integer" }
833
+ ]
834
+ },
835
+ gender: { type: "string" },
836
+ age: {
837
+ anyOf: [
838
+ { type: "string" },
839
+ {
840
+ type: "object",
841
+ properties: {
842
+ mode: { type: "string" },
843
+ label: { type: "string" },
844
+ option: { type: "string" },
845
+ min: { anyOf: [{ type: "string" }, { type: "integer" }] },
846
+ max: { anyOf: [{ type: "string" }, { type: "integer" }] },
847
+ start: { anyOf: [{ type: "string" }, { type: "integer" }] },
848
+ end: { anyOf: [{ type: "string" }, { type: "integer" }] },
849
+ from: { anyOf: [{ type: "string" }, { type: "integer" }] },
850
+ to: { anyOf: [{ type: "string" }, { type: "integer" }] }
851
+ },
852
+ additionalProperties: false
853
+ }
854
+ ]
855
+ },
856
+ ages: {
857
+ anyOf: [
858
+ { type: "array", items: { type: "string" } },
859
+ { type: "string" }
860
+ ]
861
+ },
862
+ age_range: {
863
+ anyOf: [
864
+ { type: "string" },
865
+ {
866
+ type: "object",
867
+ properties: {
868
+ mode: { type: "string" },
869
+ label: { type: "string" },
870
+ option: { type: "string" },
871
+ min: { anyOf: [{ type: "string" }, { type: "integer" }] },
872
+ max: { anyOf: [{ type: "string" }, { type: "integer" }] },
873
+ start: { anyOf: [{ type: "string" }, { type: "integer" }] },
874
+ end: { anyOf: [{ type: "string" }, { type: "integer" }] },
875
+ from: { anyOf: [{ type: "string" }, { type: "integer" }] },
876
+ to: { anyOf: [{ type: "string" }, { type: "integer" }] }
877
+ },
878
+ additionalProperties: false
879
+ }
880
+ ]
881
+ },
882
+ age_min: {
883
+ anyOf: [
884
+ { type: "string" },
885
+ { type: "integer" }
886
+ ]
887
+ },
888
+ age_max: {
889
+ anyOf: [
890
+ { type: "string" },
891
+ { type: "integer" }
892
+ ]
893
+ },
894
+ min_age: {
895
+ anyOf: [
896
+ { type: "string" },
897
+ { type: "integer" }
898
+ ]
899
+ },
900
+ max_age: {
901
+ anyOf: [
902
+ { type: "string" },
903
+ { type: "integer" }
904
+ ]
905
+ },
721
906
  keyword: { type: "string" },
722
907
  target_count: { type: "integer", minimum: 1 },
723
- criteria: { type: "string" }
908
+ criteria: { type: "string" },
909
+ post_action: {
910
+ type: "string",
911
+ enum: ["greet", "none"]
912
+ },
913
+ max_greet_count: { type: "integer", minimum: 1 }
724
914
  },
725
915
  additionalProperties: false
726
916
  },
@@ -805,6 +995,29 @@ export function createRecruitPipelineInputSchema() {
805
995
  type: "integer",
806
996
  minimum: 0,
807
997
  description: "候选人之间的延迟;live pause/resume 测试可增大它"
998
+ },
999
+ execute_post_action: {
1000
+ type: "boolean",
1001
+ description: "可选,是否实际执行通过后的 search 后置动作 greet;默认 true"
1002
+ },
1003
+ dry_run_post_action: {
1004
+ type: "boolean",
1005
+ description: "可选,只验证 search 打招呼动作发现/配额/可点击路径,不实际点击"
1006
+ },
1007
+ action_timeout_ms: {
1008
+ type: "integer",
1009
+ minimum: 1000,
1010
+ description: "可选,等待详情页 greet 控件出现的超时时间"
1011
+ },
1012
+ action_interval_ms: {
1013
+ type: "integer",
1014
+ minimum: 100,
1015
+ description: "可选,轮询详情页 greet 控件的间隔"
1016
+ },
1017
+ action_after_click_delay_ms: {
1018
+ type: "integer",
1019
+ minimum: 0,
1020
+ description: "可选,点击 greet 后等待页面状态稳定的时间"
808
1021
  }
809
1022
  },
810
1023
  required: ["instruction"],
@@ -836,6 +1049,7 @@ function buildRequiredConfirmations(parsedResult) {
836
1049
  if (parsedResult.needs_search_params_confirmation) confirmations.push("search_params");
837
1050
  if (parsedResult.needs_keyword_confirmation) confirmations.push("keyword");
838
1051
  if (parsedResult.needs_recent_viewed_filter_confirmation) confirmations.push("filter_recent_viewed");
1052
+ if (parsedResult.needs_skip_recent_colleague_contacted_confirmation) confirmations.push("skip_recent_colleague_contacted");
839
1053
  if (parsedResult.needs_criteria_confirmation) confirmations.push("criteria");
840
1054
  if (parsedResult.has_unresolved_missing_fields) confirmations.push("missing_fields_or_defaults");
841
1055
  if ((parsedResult.suspicious_fields || []).length) confirmations.push("suspicious_fields");
@@ -903,6 +1117,7 @@ function evaluateRecruitPipelineGate(parsed) {
903
1117
  if (
904
1118
  parsed.needs_keyword_confirmation
905
1119
  || parsed.needs_recent_viewed_filter_confirmation
1120
+ || parsed.needs_skip_recent_colleague_contacted_confirmation
906
1121
  || parsed.needs_criteria_confirmation
907
1122
  || parsed.needs_search_params_confirmation
908
1123
  || (parsed.suspicious_fields || []).length > 0
@@ -1183,6 +1398,9 @@ function getRunOptions(args, parsed, session, configResolution = null) {
1183
1398
  const targetCount = parsePositiveInteger(args.max_candidates, parsed.screenParams.target_count || 10);
1184
1399
  const screeningMode = normalizeScreeningModeArg(args);
1185
1400
  const humanBehavior = resolveHumanBehaviorForRun(args, configResolution?.config || {});
1401
+ const executePostAction = args.dry_run_post_action === true
1402
+ ? false
1403
+ : args.execute_post_action !== false;
1186
1404
  return {
1187
1405
  client: session.client,
1188
1406
  targetUrl: RECRUIT_TARGET_URL,
@@ -1215,6 +1433,14 @@ function getRunOptions(args, parsed, session, configResolution = null) {
1215
1433
  imageOutputDir: resolveBossConfiguredOutputDir("", getRecruitRunsDir()),
1216
1434
  humanRestEnabled: humanBehavior.restEnabled,
1217
1435
  humanBehavior,
1436
+ postAction: parsed.screenParams?.post_action || "none",
1437
+ maxGreetCount: Number.isInteger(parsed.screenParams?.max_greet_count)
1438
+ ? parsed.screenParams.max_greet_count
1439
+ : null,
1440
+ executePostAction,
1441
+ actionTimeoutMs: parsePositiveInteger(args.action_timeout_ms, slowLive ? 12000 : 8000),
1442
+ actionIntervalMs: parsePositiveInteger(args.action_interval_ms, 400),
1443
+ actionAfterClickDelayMs: parseNonNegativeInteger(args.action_after_click_delay_ms, 900),
1218
1444
  name: "mcp-recruit-pipeline-run"
1219
1445
  };
1220
1446
  }
@@ -1364,7 +1590,14 @@ async function startRecruitPipelineRunInternal(args = {}, { workspaceRoot = "",
1364
1590
  run: persistedStarted,
1365
1591
  poll_after_sec: DEFAULT_RECRUIT_POLL_AFTER_SEC,
1366
1592
  review: parsed.review,
1367
- message: "Recruit pipeline run started through shared CDP-only recruit service."
1593
+ message: parsed.screenParams?.post_action === "greet"
1594
+ ? `Recruit pipeline run started through shared CDP-only recruit service with post_action=greet${args.dry_run_post_action === true ? " in dry-run mode" : ""}.`
1595
+ : "Recruit pipeline run started through shared CDP-only recruit service.",
1596
+ post_action: {
1597
+ requested: parsed.screenParams?.post_action || "none",
1598
+ execute_post_action: args.dry_run_post_action === true ? false : args.execute_post_action !== false,
1599
+ max_greet_count: Number.isInteger(parsed.screenParams?.max_greet_count) ? parsed.screenParams.max_greet_count : null
1600
+ }
1368
1601
  };
1369
1602
  }
1370
1603