@reconcrap/boss-recommend-mcp 2.1.23 → 2.1.25

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 (67) hide show
  1. package/README.md +5 -0
  2. package/bin/boss-recommend-mcp.js +4 -4
  3. package/package.json +6 -1
  4. package/scripts/install-macos.sh +280 -280
  5. package/scripts/postinstall.cjs +44 -44
  6. package/skills/boss-chat/README.md +43 -42
  7. package/skills/boss-chat/SKILL.md +107 -106
  8. package/skills/boss-recommend-pipeline/README.md +13 -13
  9. package/skills/boss-recommend-pipeline/SKILL.md +47 -47
  10. package/skills/boss-recruit-pipeline/README.md +19 -19
  11. package/skills/boss-recruit-pipeline/SKILL.md +89 -89
  12. package/src/chat-mcp.js +301 -127
  13. package/src/chat-runtime-config.js +7 -5
  14. package/src/core/boss-cards/index.js +199 -199
  15. package/src/core/browser/index.js +302 -145
  16. package/src/core/capture/index.js +2930 -1201
  17. package/src/core/cv-acquisition/index.js +512 -238
  18. package/src/core/cv-capture-target/index.js +513 -299
  19. package/src/core/greet-quota/index.js +71 -71
  20. package/src/core/infinite-list/index.js +31 -31
  21. package/src/core/reporting/legacy-csv.js +12 -12
  22. package/src/core/run/detached-launcher.js +305 -0
  23. package/src/core/run/index.js +109 -55
  24. package/src/core/run/timing.js +33 -33
  25. package/src/core/run/windows-detached-worker.ps1 +106 -0
  26. package/src/core/screening/index.js +2400 -2135
  27. package/src/core/self-heal/index.js +989 -973
  28. package/src/core/self-heal/viewport.js +1505 -564
  29. package/src/detached-worker.js +99 -99
  30. package/src/domains/chat/action-journal.js +536 -0
  31. package/src/domains/chat/cards.js +137 -137
  32. package/src/domains/chat/constants.js +9 -9
  33. package/src/domains/chat/detail.js +1684 -401
  34. package/src/domains/chat/index.js +8 -7
  35. package/src/domains/chat/jobs.js +620 -620
  36. package/src/domains/chat/page-guard.js +157 -122
  37. package/src/domains/chat/roots.js +56 -56
  38. package/src/domains/chat/run-service.js +1801 -760
  39. package/src/domains/common/account-rights-panel.js +314 -314
  40. package/src/domains/common/recovery-settle.js +159 -159
  41. package/src/domains/recommend/actions.js +1219 -472
  42. package/src/domains/recommend/cards.js +243 -243
  43. package/src/domains/recommend/colleague-contact.js +1079 -333
  44. package/src/domains/recommend/constants.js +92 -92
  45. package/src/domains/recommend/detail.js +4037 -136
  46. package/src/domains/recommend/filters.js +608 -590
  47. package/src/domains/recommend/index.js +9 -9
  48. package/src/domains/recommend/jobs.js +571 -542
  49. package/src/domains/recommend/location.js +754 -707
  50. package/src/domains/recommend/refresh.js +677 -392
  51. package/src/domains/recommend/roots.js +80 -80
  52. package/src/domains/recommend/run-service.js +4048 -1447
  53. package/src/domains/recommend/scopes.js +246 -246
  54. package/src/domains/recruit/actions.js +277 -277
  55. package/src/domains/recruit/cards.js +74 -74
  56. package/src/domains/recruit/constants.js +236 -236
  57. package/src/domains/recruit/detail.js +588 -588
  58. package/src/domains/recruit/index.js +9 -9
  59. package/src/domains/recruit/instruction-parser.js +866 -866
  60. package/src/domains/recruit/refresh.js +45 -45
  61. package/src/domains/recruit/roots.js +68 -68
  62. package/src/domains/recruit/run-service.js +1817 -1620
  63. package/src/domains/recruit/search.js +3229 -3229
  64. package/src/index.js +16 -1
  65. package/src/parser.js +1296 -1296
  66. package/src/recommend-mcp.js +1061 -450
  67. package/src/recommend-scheduler.js +75 -75
@@ -1,45 +1,45 @@
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
- recovery_settle: application.reset?.mini_fresh_start || null,
43
- application
44
- };
45
- }
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
+ recovery_settle: application.reset?.mini_fresh_start || null,
43
+ application
44
+ };
45
+ }
@@ -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
+ }