@reconcrap/boss-recommend-mcp 2.0.47 → 2.0.48
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/bin/boss-recommend-mcp.js +4 -4
- package/config/screening-config.example.json +27 -27
- package/package.json +1 -1
- package/scripts/postinstall.cjs +44 -44
- package/skills/boss-chat/README.md +39 -39
- package/skills/boss-chat/SKILL.md +93 -93
- package/skills/boss-recommend-pipeline/README.md +12 -12
- package/skills/boss-recommend-pipeline/SKILL.md +180 -180
- package/skills/boss-recruit-pipeline/README.md +17 -17
- package/skills/boss-recruit-pipeline/SKILL.md +58 -58
- package/src/chat-mcp.js +1780 -1780
- package/src/chat-runtime-config.js +749 -749
- package/src/cli.js +3054 -3054
- package/src/core/boss-cards/index.js +199 -199
- package/src/core/browser/index.js +1586 -1453
- package/src/core/capture/index.js +1201 -1201
- package/src/core/cv-acquisition/index.js +238 -238
- package/src/core/cv-capture-target/index.js +299 -299
- package/src/core/greet-quota/index.js +54 -54
- package/src/core/infinite-list/index.js +1326 -1326
- package/src/core/reporting/legacy-csv.js +341 -341
- package/src/core/run/timing.js +33 -33
- package/src/core/self-heal/index.js +973 -973
- package/src/core/self-heal/viewport.js +564 -564
- package/src/domains/chat/cards.js +137 -137
- package/src/domains/chat/constants.js +221 -221
- package/src/domains/chat/detail.js +1668 -1668
- package/src/domains/chat/index.js +7 -7
- package/src/domains/chat/jobs.js +592 -592
- package/src/domains/chat/page-guard.js +98 -98
- package/src/domains/chat/roots.js +56 -56
- package/src/domains/chat/run-service.js +1977 -1977
- package/src/domains/recommend/actions.js +457 -457
- package/src/domains/recommend/cards.js +243 -243
- package/src/domains/recommend/constants.js +165 -165
- package/src/domains/recommend/filters.js +610 -610
- package/src/domains/recommend/index.js +10 -10
- package/src/domains/recommend/jobs.js +316 -316
- package/src/domains/recommend/refresh.js +472 -472
- package/src/domains/recommend/roots.js +80 -80
- package/src/domains/recommend/scopes.js +246 -246
- package/src/domains/recruit/actions.js +277 -277
- package/src/domains/recruit/cards.js +74 -74
- package/src/domains/recruit/constants.js +167 -167
- package/src/domains/recruit/detail.js +461 -461
- package/src/domains/recruit/index.js +9 -9
- package/src/domains/recruit/instruction-parser.js +451 -451
- package/src/domains/recruit/refresh.js +44 -44
- package/src/domains/recruit/roots.js +68 -68
- package/src/domains/recruit/run-service.js +1207 -1207
- package/src/domains/recruit/search.js +1202 -1202
- package/src/recommend-mcp.js +22 -22
- package/src/recruit-mcp.js +1338 -1338
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
import {
|
|
2
|
-
applyRecruitSearchParams,
|
|
3
|
-
normalizeRecruitSearchParams
|
|
4
|
-
} from "./search.js";
|
|
5
|
-
|
|
6
|
-
export function buildRecruitRefreshSearchParams(searchParams = {}, {
|
|
7
|
-
forceRecentViewed = true
|
|
8
|
-
} = {}) {
|
|
9
|
-
const normalizedSearchParams = normalizeRecruitSearchParams(searchParams);
|
|
10
|
-
return {
|
|
11
|
-
...normalizedSearchParams,
|
|
12
|
-
filter_recent_viewed: forceRecentViewed ? true : normalizedSearchParams.filter_recent_viewed
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export async function refreshRecruitSearchAtEnd(client, {
|
|
17
|
-
searchParams = {},
|
|
18
|
-
requireCards = true,
|
|
19
|
-
searchTimeoutMs = 90000,
|
|
20
|
-
resetTimeoutMs = 180000,
|
|
21
|
-
resetSettleMs = 5000,
|
|
22
|
-
cityOptionTimeoutMs = 30000,
|
|
23
|
-
forceRecentViewed = true
|
|
24
|
-
} = {}) {
|
|
25
|
-
const refreshSearchParams = buildRecruitRefreshSearchParams(searchParams, { forceRecentViewed });
|
|
26
|
-
const application = await applyRecruitSearchParams(client, {
|
|
27
|
-
searchParams: refreshSearchParams,
|
|
28
|
-
requireCards,
|
|
29
|
-
resetBeforeApply: true,
|
|
30
|
-
searchTimeoutMs,
|
|
31
|
-
resetTimeoutMs,
|
|
32
|
-
resetSettleMs,
|
|
33
|
-
cityOptionTimeoutMs
|
|
34
|
-
});
|
|
35
|
-
const cardCount = application.post_search_state?.counts?.candidate_card || 0;
|
|
36
|
-
return {
|
|
37
|
-
ok: !requireCards || cardCount > 0,
|
|
38
|
-
method: "page_reload_search",
|
|
39
|
-
forced_recent_viewed: Boolean(forceRecentViewed),
|
|
40
|
-
search_params: refreshSearchParams,
|
|
41
|
-
card_count: cardCount,
|
|
42
|
-
application
|
|
43
|
-
};
|
|
44
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
applyRecruitSearchParams,
|
|
3
|
+
normalizeRecruitSearchParams
|
|
4
|
+
} from "./search.js";
|
|
5
|
+
|
|
6
|
+
export function buildRecruitRefreshSearchParams(searchParams = {}, {
|
|
7
|
+
forceRecentViewed = true
|
|
8
|
+
} = {}) {
|
|
9
|
+
const normalizedSearchParams = normalizeRecruitSearchParams(searchParams);
|
|
10
|
+
return {
|
|
11
|
+
...normalizedSearchParams,
|
|
12
|
+
filter_recent_viewed: forceRecentViewed ? true : normalizedSearchParams.filter_recent_viewed
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export async function refreshRecruitSearchAtEnd(client, {
|
|
17
|
+
searchParams = {},
|
|
18
|
+
requireCards = true,
|
|
19
|
+
searchTimeoutMs = 90000,
|
|
20
|
+
resetTimeoutMs = 180000,
|
|
21
|
+
resetSettleMs = 5000,
|
|
22
|
+
cityOptionTimeoutMs = 30000,
|
|
23
|
+
forceRecentViewed = true
|
|
24
|
+
} = {}) {
|
|
25
|
+
const refreshSearchParams = buildRecruitRefreshSearchParams(searchParams, { forceRecentViewed });
|
|
26
|
+
const application = await applyRecruitSearchParams(client, {
|
|
27
|
+
searchParams: refreshSearchParams,
|
|
28
|
+
requireCards,
|
|
29
|
+
resetBeforeApply: true,
|
|
30
|
+
searchTimeoutMs,
|
|
31
|
+
resetTimeoutMs,
|
|
32
|
+
resetSettleMs,
|
|
33
|
+
cityOptionTimeoutMs
|
|
34
|
+
});
|
|
35
|
+
const cardCount = application.post_search_state?.counts?.candidate_card || 0;
|
|
36
|
+
return {
|
|
37
|
+
ok: !requireCards || cardCount > 0,
|
|
38
|
+
method: "page_reload_search",
|
|
39
|
+
forced_recent_viewed: Boolean(forceRecentViewed),
|
|
40
|
+
search_params: refreshSearchParams,
|
|
41
|
+
card_count: cardCount,
|
|
42
|
+
application
|
|
43
|
+
};
|
|
44
|
+
}
|
|
@@ -1,68 +1,68 @@
|
|
|
1
|
-
import {
|
|
2
|
-
findIframeDocument,
|
|
3
|
-
getDocumentRoot,
|
|
4
|
-
querySelector,
|
|
5
|
-
sleep
|
|
6
|
-
} from "../../core/browser/index.js";
|
|
7
|
-
import { RECRUIT_IFRAME_SELECTORS } from "./constants.js";
|
|
8
|
-
|
|
9
|
-
export async function getRecruitRoots(client, {
|
|
10
|
-
iframeSelectors = RECRUIT_IFRAME_SELECTORS,
|
|
11
|
-
requireFrame = true
|
|
12
|
-
} = {}) {
|
|
13
|
-
const topRoot = await getDocumentRoot(client);
|
|
14
|
-
const iframe = await findIframeDocument(client, topRoot.nodeId, iframeSelectors);
|
|
15
|
-
if (!iframe && requireFrame) {
|
|
16
|
-
throw new Error("searchFrame iframe was not found");
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
return {
|
|
20
|
-
topRoot,
|
|
21
|
-
iframe,
|
|
22
|
-
roots: [
|
|
23
|
-
{ name: "top", nodeId: topRoot.nodeId },
|
|
24
|
-
iframe ? { name: "search-frame", nodeId: iframe.documentNodeId } : null
|
|
25
|
-
].filter(Boolean),
|
|
26
|
-
rootNodes: {
|
|
27
|
-
top: topRoot.nodeId,
|
|
28
|
-
frame: iframe?.documentNodeId || 0,
|
|
29
|
-
frameOwner: iframe?.nodeId || 0
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export async function waitForRecruitRoots(client, {
|
|
35
|
-
timeoutMs = 12000,
|
|
36
|
-
intervalMs = 300,
|
|
37
|
-
iframeSelectors = RECRUIT_IFRAME_SELECTORS
|
|
38
|
-
} = {}) {
|
|
39
|
-
const started = Date.now();
|
|
40
|
-
let lastState = null;
|
|
41
|
-
while (Date.now() - started <= timeoutMs) {
|
|
42
|
-
lastState = await getRecruitRoots(client, {
|
|
43
|
-
iframeSelectors,
|
|
44
|
-
requireFrame: false
|
|
45
|
-
});
|
|
46
|
-
if (lastState.iframe?.documentNodeId) return lastState;
|
|
47
|
-
await sleep(intervalMs);
|
|
48
|
-
}
|
|
49
|
-
return lastState;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export async function queryFirstAcrossRoots(client, roots, selectors) {
|
|
53
|
-
for (const root of roots) {
|
|
54
|
-
if (!root?.nodeId) continue;
|
|
55
|
-
for (const selector of selectors) {
|
|
56
|
-
const nodeId = await querySelector(client, root.nodeId, selector);
|
|
57
|
-
if (nodeId) {
|
|
58
|
-
return {
|
|
59
|
-
root: root.name,
|
|
60
|
-
root_node_id: root.nodeId,
|
|
61
|
-
selector,
|
|
62
|
-
node_id: nodeId
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
return null;
|
|
68
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
findIframeDocument,
|
|
3
|
+
getDocumentRoot,
|
|
4
|
+
querySelector,
|
|
5
|
+
sleep
|
|
6
|
+
} from "../../core/browser/index.js";
|
|
7
|
+
import { RECRUIT_IFRAME_SELECTORS } from "./constants.js";
|
|
8
|
+
|
|
9
|
+
export async function getRecruitRoots(client, {
|
|
10
|
+
iframeSelectors = RECRUIT_IFRAME_SELECTORS,
|
|
11
|
+
requireFrame = true
|
|
12
|
+
} = {}) {
|
|
13
|
+
const topRoot = await getDocumentRoot(client);
|
|
14
|
+
const iframe = await findIframeDocument(client, topRoot.nodeId, iframeSelectors);
|
|
15
|
+
if (!iframe && requireFrame) {
|
|
16
|
+
throw new Error("searchFrame iframe was not found");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return {
|
|
20
|
+
topRoot,
|
|
21
|
+
iframe,
|
|
22
|
+
roots: [
|
|
23
|
+
{ name: "top", nodeId: topRoot.nodeId },
|
|
24
|
+
iframe ? { name: "search-frame", nodeId: iframe.documentNodeId } : null
|
|
25
|
+
].filter(Boolean),
|
|
26
|
+
rootNodes: {
|
|
27
|
+
top: topRoot.nodeId,
|
|
28
|
+
frame: iframe?.documentNodeId || 0,
|
|
29
|
+
frameOwner: iframe?.nodeId || 0
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export async function waitForRecruitRoots(client, {
|
|
35
|
+
timeoutMs = 12000,
|
|
36
|
+
intervalMs = 300,
|
|
37
|
+
iframeSelectors = RECRUIT_IFRAME_SELECTORS
|
|
38
|
+
} = {}) {
|
|
39
|
+
const started = Date.now();
|
|
40
|
+
let lastState = null;
|
|
41
|
+
while (Date.now() - started <= timeoutMs) {
|
|
42
|
+
lastState = await getRecruitRoots(client, {
|
|
43
|
+
iframeSelectors,
|
|
44
|
+
requireFrame: false
|
|
45
|
+
});
|
|
46
|
+
if (lastState.iframe?.documentNodeId) return lastState;
|
|
47
|
+
await sleep(intervalMs);
|
|
48
|
+
}
|
|
49
|
+
return lastState;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export async function queryFirstAcrossRoots(client, roots, selectors) {
|
|
53
|
+
for (const root of roots) {
|
|
54
|
+
if (!root?.nodeId) continue;
|
|
55
|
+
for (const selector of selectors) {
|
|
56
|
+
const nodeId = await querySelector(client, root.nodeId, selector);
|
|
57
|
+
if (nodeId) {
|
|
58
|
+
return {
|
|
59
|
+
root: root.name,
|
|
60
|
+
root_node_id: root.nodeId,
|
|
61
|
+
selector,
|
|
62
|
+
node_id: nodeId
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|