@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.
- package/README.md +34 -5
- package/package.json +8 -7
- package/skills/boss-chat/README.md +2 -2
- package/skills/boss-chat/SKILL.md +7 -7
- package/skills/boss-recruit-pipeline/SKILL.md +23 -1
- package/src/chat-mcp.js +127 -88
- package/src/core/greet-quota/index.js +17 -0
- package/src/core/reporting/legacy-csv.js +5 -1
- package/src/domains/chat/detail.js +79 -47
- package/src/domains/chat/run-service.js +400 -158
- package/src/domains/recommend/colleague-contact.js +333 -0
- package/src/domains/recommend/index.js +1 -0
- package/src/domains/recommend/run-service.js +166 -77
- package/src/domains/recruit/constants.js +69 -0
- package/src/domains/recruit/instruction-parser.js +403 -86
- package/src/domains/recruit/run-service.js +320 -11
- package/src/domains/recruit/search.js +2118 -306
- package/src/index.js +38 -23
- package/src/parser.js +45 -2
- package/src/recommend-mcp.js +92 -18
- package/src/recruit-mcp.js +236 -3
package/src/recruit-mcp.js
CHANGED
|
@@ -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: {
|
|
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:
|
|
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
|
|