@reconcrap/boss-recommend-mcp 1.3.39 → 2.0.0
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 +53 -33
- package/package.json +61 -9
- package/skills/boss-recommend-pipeline/SKILL.md +4 -0
- package/src/chat-mcp.js +1333 -0
- package/src/chat-runtime-config.js +559 -0
- package/src/cli.js +1095 -196
- package/src/core/browser/index.js +378 -0
- package/src/core/capture/index.js +298 -0
- package/src/core/cv-acquisition/index.js +219 -0
- package/src/core/greet-quota/index.js +54 -0
- package/src/core/infinite-list/index.js +459 -0
- package/src/core/reporting/legacy-csv.js +332 -0
- package/src/core/run/index.js +286 -0
- package/src/core/screening/index.js +1166 -0
- package/src/core/self-heal/index.js +848 -0
- package/src/domains/chat/cards.js +129 -0
- package/src/domains/chat/constants.js +183 -0
- package/src/domains/chat/detail.js +1369 -0
- package/src/domains/chat/index.js +7 -0
- package/src/domains/chat/jobs.js +334 -0
- package/src/domains/chat/page-guard.js +88 -0
- package/src/domains/chat/roots.js +56 -0
- package/src/domains/chat/run-service.js +1101 -0
- package/src/domains/recommend/actions.js +457 -0
- package/src/domains/recommend/cards.js +228 -0
- package/src/domains/recommend/constants.js +141 -0
- package/src/domains/recommend/detail.js +341 -0
- package/src/domains/recommend/filters.js +581 -0
- package/src/domains/recommend/index.js +10 -0
- package/src/domains/recommend/jobs.js +232 -0
- package/src/domains/recommend/refresh.js +204 -0
- package/src/domains/recommend/roots.js +78 -0
- package/src/domains/recommend/run-service.js +903 -0
- package/src/domains/recommend/scopes.js +245 -0
- package/src/domains/recruit/actions.js +277 -0
- package/src/domains/recruit/cards.js +67 -0
- package/src/domains/recruit/constants.js +130 -0
- package/src/domains/recruit/detail.js +414 -0
- package/src/domains/recruit/index.js +9 -0
- package/src/domains/recruit/instruction-parser.js +451 -0
- package/src/domains/recruit/refresh.js +40 -0
- package/src/domains/recruit/roots.js +68 -0
- package/src/domains/recruit/run-service.js +580 -0
- package/src/domains/recruit/search.js +1149 -0
- package/src/index.js +578 -419
- package/src/recommend-mcp.js +1257 -0
- package/src/recruit-mcp.js +1035 -0
- package/src/adapters.js +0 -3079
- package/src/boss-chat.js +0 -1037
- package/src/pipeline.js +0 -2249
- package/src/recommend-healing-config.js +0 -131
- package/src/recommend-healing-rules.json +0 -261
- package/src/self-heal.js +0 -2237
- package/src/test-adapters-runtime.js +0 -628
- package/src/test-boss-chat.js +0 -3196
- package/src/test-index-async.js +0 -498
- package/src/test-parser.js +0 -742
- package/src/test-pipeline.js +0 -2703
- package/src/test-run-state.js +0 -152
- package/src/test-self-heal.js +0 -224
- package/vendor/boss-chat-cli/README.md +0 -134
- package/vendor/boss-chat-cli/package.json +0 -53
- package/vendor/boss-chat-cli/src/app.js +0 -1501
- package/vendor/boss-chat-cli/src/browser/chat-page.js +0 -3562
- package/vendor/boss-chat-cli/src/cli.js +0 -1713
- package/vendor/boss-chat-cli/src/mcp/server.js +0 -149
- package/vendor/boss-chat-cli/src/mcp/tool-runtime.js +0 -193
- package/vendor/boss-chat-cli/src/runtime/async-run-state.js +0 -260
- package/vendor/boss-chat-cli/src/runtime/interaction.js +0 -102
- package/vendor/boss-chat-cli/src/runtime/run-control.js +0 -102
- package/vendor/boss-chat-cli/src/services/chrome-client.js +0 -107
- package/vendor/boss-chat-cli/src/services/llm.js +0 -1292
- package/vendor/boss-chat-cli/src/services/llm.test.js +0 -326
- package/vendor/boss-chat-cli/src/services/profile-store.js +0 -173
- package/vendor/boss-chat-cli/src/services/report-store.js +0 -317
- package/vendor/boss-chat-cli/src/services/resume-capture.js +0 -469
- package/vendor/boss-chat-cli/src/services/resume-network.js +0 -727
- package/vendor/boss-chat-cli/src/services/state-store.js +0 -90
- package/vendor/boss-chat-cli/src/utils/customer-key.js +0 -82
- package/vendor/boss-recommend-screen-cli/boss-recommend-screen-cli.cjs +0 -7072
- package/vendor/boss-recommend-screen-cli/scripts/capture-full-resume-canvas.cjs +0 -817
- package/vendor/boss-recommend-screen-cli/scripts/stitch_resume_chunks.py +0 -141
- package/vendor/boss-recommend-screen-cli/test-recoverable-resume-failures.cjs +0 -2423
- package/vendor/boss-recommend-search-cli/src/cli.js +0 -1698
- package/vendor/boss-recommend-search-cli/src/test-job-selection.js +0 -211
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert/strict";
|
|
2
|
-
import { RecommendSearchCli, normalizeJobTitle, parseArgs } from "./cli.js";
|
|
3
|
-
|
|
4
|
-
const JOBS = [
|
|
5
|
-
{
|
|
6
|
-
value: "b80ce74081810d060nZ93t24FlRY",
|
|
7
|
-
title: "数据分析实习生 _ 杭州",
|
|
8
|
-
label: "数据分析实习生 _ 杭州 100-150元/天",
|
|
9
|
-
current: true
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
value: "3208c73ad64d0e610nV93du7FFdZ",
|
|
13
|
-
title: "算法工程师(视频/图像模型方向) _ 杭州",
|
|
14
|
-
label: "算法工程师(视频/图像模型方向) _ 杭州 25-50K",
|
|
15
|
-
current: false
|
|
16
|
-
}
|
|
17
|
-
];
|
|
18
|
-
|
|
19
|
-
function createArgs(overrides = {}) {
|
|
20
|
-
return {
|
|
21
|
-
schoolTag: ["不限"],
|
|
22
|
-
degree: ["不限"],
|
|
23
|
-
gender: "不限",
|
|
24
|
-
recentNotView: "不限",
|
|
25
|
-
pageScope: "recommend",
|
|
26
|
-
port: 9222,
|
|
27
|
-
listJobs: false,
|
|
28
|
-
job: null,
|
|
29
|
-
help: false,
|
|
30
|
-
__provided: {
|
|
31
|
-
schoolTag: true,
|
|
32
|
-
degree: true,
|
|
33
|
-
gender: true,
|
|
34
|
-
recentNotView: true,
|
|
35
|
-
pageScope: true,
|
|
36
|
-
port: true,
|
|
37
|
-
job: true
|
|
38
|
-
},
|
|
39
|
-
...overrides
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function testParseArgsPageScope() {
|
|
44
|
-
const parsed = parseArgs(["--page-scope", "featured"]);
|
|
45
|
-
assert.equal(parsed.pageScope, "featured");
|
|
46
|
-
const latestParsed = parseArgs(["--page-scope", "latest"]);
|
|
47
|
-
assert.equal(latestParsed.pageScope, "latest");
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
class SelectJobCliMock extends RecommendSearchCli {
|
|
51
|
-
constructor(args, states) {
|
|
52
|
-
super(args);
|
|
53
|
-
this.states = Array.isArray(states) ? states.slice() : [];
|
|
54
|
-
this.stateIndex = 0;
|
|
55
|
-
this.dropdownClicks = 0;
|
|
56
|
-
this.clickedJob = null;
|
|
57
|
-
this.waitSelectedResult = true;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
async getJobListState() {
|
|
61
|
-
if (!this.states.length) {
|
|
62
|
-
return { ok: true, jobs: JOBS };
|
|
63
|
-
}
|
|
64
|
-
const index = Math.min(this.stateIndex, this.states.length - 1);
|
|
65
|
-
this.stateIndex += 1;
|
|
66
|
-
return this.states[index];
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
async clickJobDropdownTriggerBySelector() {
|
|
70
|
-
this.dropdownClicks += 1;
|
|
71
|
-
return { ok: true };
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
async clickJobBySelector(job) {
|
|
75
|
-
this.clickedJob = job;
|
|
76
|
-
return { ok: true };
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
async waitJobSelected() {
|
|
80
|
-
return this.waitSelectedResult;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
class ListJobsRunCliMock extends RecommendSearchCli {
|
|
85
|
-
constructor(args, state) {
|
|
86
|
-
super(args);
|
|
87
|
-
this.state = state;
|
|
88
|
-
this.connected = false;
|
|
89
|
-
this.disconnected = false;
|
|
90
|
-
this.filterOpened = false;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
async connect() {
|
|
94
|
-
this.connected = true;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
async disconnect() {
|
|
98
|
-
this.disconnected = true;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
async getFrameState() {
|
|
102
|
-
return { ok: true, frameUrl: "https://www.zhipin.com/web/frame/recommend/mock" };
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
async ensureJobListReady() {
|
|
106
|
-
return this.state;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
async openFilterPanel() {
|
|
110
|
-
this.filterOpened = true;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
function testNormalizeJobTitle() {
|
|
115
|
-
assert.equal(
|
|
116
|
-
normalizeJobTitle("算法工程师(视频/图像模型方向) _ 杭州 25-50K"),
|
|
117
|
-
"算法工程师(视频/图像模型方向) _ 杭州"
|
|
118
|
-
);
|
|
119
|
-
assert.equal(
|
|
120
|
-
normalizeJobTitle("数据分析实习生 _ 杭州 100-150元/天"),
|
|
121
|
-
"数据分析实习生 _ 杭州"
|
|
122
|
-
);
|
|
123
|
-
assert.equal(normalizeJobTitle(""), "");
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
function testFindJobMatchByValueTitleLabelAndPartial() {
|
|
127
|
-
const cli = new RecommendSearchCli(createArgs());
|
|
128
|
-
const byValue = cli.findJobMatch(JOBS, "3208c73ad64d0e610nV93du7FFdZ");
|
|
129
|
-
assert.equal(byValue?.title, "算法工程师(视频/图像模型方向) _ 杭州");
|
|
130
|
-
|
|
131
|
-
const byTitle = cli.findJobMatch(JOBS, "算法工程师(视频/图像模型方向) _ 杭州");
|
|
132
|
-
assert.equal(byTitle?.value, "3208c73ad64d0e610nV93du7FFdZ");
|
|
133
|
-
|
|
134
|
-
const byLabel = cli.findJobMatch(JOBS, "数据分析实习生 _ 杭州 100-150元/天");
|
|
135
|
-
assert.equal(byLabel?.value, "b80ce74081810d060nZ93t24FlRY");
|
|
136
|
-
|
|
137
|
-
const byPartial = cli.findJobMatch(JOBS, "视频/图像模型方向");
|
|
138
|
-
assert.equal(byPartial?.value, "3208c73ad64d0e610nV93du7FFdZ");
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
function testFindJobMatchAmbiguousThrows() {
|
|
142
|
-
const cli = new RecommendSearchCli(createArgs());
|
|
143
|
-
const ambiguousJobs = [
|
|
144
|
-
{ value: "v1", title: "算法工程师 _ 杭州", label: "算法工程师 _ 杭州 25-50K" },
|
|
145
|
-
{ value: "v2", title: "算法工程师 _ 上海", label: "算法工程师 _ 上海 25-50K" }
|
|
146
|
-
];
|
|
147
|
-
assert.throws(() => cli.findJobMatch(ambiguousJobs, "算法工程师"), /JOB_SELECTION_AMBIGUOUS/);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
async function testSelectJobRetriesThenClicks() {
|
|
151
|
-
const states = [
|
|
152
|
-
{ ok: true, jobs: [] },
|
|
153
|
-
{ ok: true, jobs: JOBS }
|
|
154
|
-
];
|
|
155
|
-
const cli = new SelectJobCliMock(createArgs(), states);
|
|
156
|
-
const selected = await cli.selectJob("算法工程师(视频/图像模型方向) _ 杭州");
|
|
157
|
-
assert.equal(cli.dropdownClicks >= 1, true);
|
|
158
|
-
assert.equal(cli.clickedJob?.value, "3208c73ad64d0e610nV93du7FFdZ");
|
|
159
|
-
assert.equal(selected?.title, "算法工程师(视频/图像模型方向) _ 杭州");
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
async function testSelectJobFailsWhenNotApplied() {
|
|
163
|
-
const cli = new SelectJobCliMock(createArgs(), [{ ok: true, jobs: JOBS }]);
|
|
164
|
-
cli.waitSelectedResult = false;
|
|
165
|
-
await assert.rejects(
|
|
166
|
-
async () => {
|
|
167
|
-
await cli.selectJob("数据分析实习生 _ 杭州");
|
|
168
|
-
},
|
|
169
|
-
/JOB_SELECTION_NOT_APPLIED/
|
|
170
|
-
);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
async function testRunListJobsModePrintsJobsAndSkipsFilter() {
|
|
174
|
-
const cli = new ListJobsRunCliMock(
|
|
175
|
-
createArgs({ listJobs: true }),
|
|
176
|
-
{
|
|
177
|
-
ok: true,
|
|
178
|
-
jobs: JOBS,
|
|
179
|
-
frame_url: "https://www.zhipin.com/web/frame/recommend/mock"
|
|
180
|
-
}
|
|
181
|
-
);
|
|
182
|
-
const originalLog = console.log;
|
|
183
|
-
const outputs = [];
|
|
184
|
-
console.log = (value) => outputs.push(String(value));
|
|
185
|
-
try {
|
|
186
|
-
await cli.run();
|
|
187
|
-
} finally {
|
|
188
|
-
console.log = originalLog;
|
|
189
|
-
}
|
|
190
|
-
assert.equal(cli.connected, true);
|
|
191
|
-
assert.equal(cli.disconnected, true);
|
|
192
|
-
assert.equal(cli.filterOpened, false);
|
|
193
|
-
assert.equal(outputs.length, 1);
|
|
194
|
-
const payload = JSON.parse(outputs[0]);
|
|
195
|
-
assert.equal(payload.status, "COMPLETED");
|
|
196
|
-
assert.equal(Array.isArray(payload.result.jobs), true);
|
|
197
|
-
assert.equal(payload.result.jobs.length, 2);
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
async function main() {
|
|
201
|
-
testParseArgsPageScope();
|
|
202
|
-
testNormalizeJobTitle();
|
|
203
|
-
testFindJobMatchByValueTitleLabelAndPartial();
|
|
204
|
-
testFindJobMatchAmbiguousThrows();
|
|
205
|
-
await testSelectJobRetriesThenClicks();
|
|
206
|
-
await testSelectJobFailsWhenNotApplied();
|
|
207
|
-
await testRunListJobsModePrintsJobsAndSkipsFilter();
|
|
208
|
-
console.log("search job tests passed");
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
await main();
|