@reconcrap/boss-recommend-mcp 1.3.39 → 2.0.1

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 (88) hide show
  1. package/README.md +86 -33
  2. package/package.json +62 -9
  3. package/skills/boss-chat/SKILL.md +5 -4
  4. package/skills/boss-recommend-pipeline/SKILL.md +21 -31
  5. package/skills/boss-recruit-pipeline/README.md +17 -0
  6. package/skills/boss-recruit-pipeline/SKILL.md +55 -0
  7. package/src/chat-mcp.js +1333 -0
  8. package/src/chat-runtime-config.js +559 -0
  9. package/src/cli.js +1254 -225
  10. package/src/core/browser/index.js +378 -0
  11. package/src/core/capture/index.js +298 -0
  12. package/src/core/cv-acquisition/index.js +219 -0
  13. package/src/core/greet-quota/index.js +54 -0
  14. package/src/core/infinite-list/index.js +459 -0
  15. package/src/core/reporting/legacy-csv.js +332 -0
  16. package/src/core/run/index.js +286 -0
  17. package/src/core/screening/index.js +1166 -0
  18. package/src/core/self-heal/index.js +848 -0
  19. package/src/domains/chat/cards.js +129 -0
  20. package/src/domains/chat/constants.js +183 -0
  21. package/src/domains/chat/detail.js +1369 -0
  22. package/src/domains/chat/index.js +7 -0
  23. package/src/domains/chat/jobs.js +334 -0
  24. package/src/domains/chat/page-guard.js +88 -0
  25. package/src/domains/chat/roots.js +56 -0
  26. package/src/domains/chat/run-service.js +1101 -0
  27. package/src/domains/recommend/actions.js +457 -0
  28. package/src/domains/recommend/cards.js +228 -0
  29. package/src/domains/recommend/constants.js +141 -0
  30. package/src/domains/recommend/detail.js +341 -0
  31. package/src/domains/recommend/filters.js +581 -0
  32. package/src/domains/recommend/index.js +10 -0
  33. package/src/domains/recommend/jobs.js +232 -0
  34. package/src/domains/recommend/refresh.js +204 -0
  35. package/src/domains/recommend/roots.js +78 -0
  36. package/src/domains/recommend/run-service.js +903 -0
  37. package/src/domains/recommend/scopes.js +245 -0
  38. package/src/domains/recruit/actions.js +277 -0
  39. package/src/domains/recruit/cards.js +66 -0
  40. package/src/domains/recruit/constants.js +130 -0
  41. package/src/domains/recruit/detail.js +414 -0
  42. package/src/domains/recruit/index.js +9 -0
  43. package/src/domains/recruit/instruction-parser.js +451 -0
  44. package/src/domains/recruit/refresh.js +40 -0
  45. package/src/domains/recruit/roots.js +67 -0
  46. package/src/domains/recruit/run-service.js +580 -0
  47. package/src/domains/recruit/search.js +1149 -0
  48. package/src/index.js +578 -419
  49. package/src/recommend-mcp.js +1257 -0
  50. package/src/recruit-mcp.js +1035 -0
  51. package/src/adapters.js +0 -3079
  52. package/src/boss-chat.js +0 -1037
  53. package/src/pipeline.js +0 -2249
  54. package/src/recommend-healing-config.js +0 -131
  55. package/src/recommend-healing-rules.json +0 -261
  56. package/src/self-heal.js +0 -2237
  57. package/src/test-adapters-runtime.js +0 -628
  58. package/src/test-boss-chat.js +0 -3196
  59. package/src/test-index-async.js +0 -498
  60. package/src/test-parser.js +0 -742
  61. package/src/test-pipeline.js +0 -2703
  62. package/src/test-run-state.js +0 -152
  63. package/src/test-self-heal.js +0 -224
  64. package/vendor/boss-chat-cli/README.md +0 -134
  65. package/vendor/boss-chat-cli/package.json +0 -53
  66. package/vendor/boss-chat-cli/src/app.js +0 -1501
  67. package/vendor/boss-chat-cli/src/browser/chat-page.js +0 -3562
  68. package/vendor/boss-chat-cli/src/cli.js +0 -1713
  69. package/vendor/boss-chat-cli/src/mcp/server.js +0 -149
  70. package/vendor/boss-chat-cli/src/mcp/tool-runtime.js +0 -193
  71. package/vendor/boss-chat-cli/src/runtime/async-run-state.js +0 -260
  72. package/vendor/boss-chat-cli/src/runtime/interaction.js +0 -102
  73. package/vendor/boss-chat-cli/src/runtime/run-control.js +0 -102
  74. package/vendor/boss-chat-cli/src/services/chrome-client.js +0 -107
  75. package/vendor/boss-chat-cli/src/services/llm.js +0 -1292
  76. package/vendor/boss-chat-cli/src/services/llm.test.js +0 -326
  77. package/vendor/boss-chat-cli/src/services/profile-store.js +0 -173
  78. package/vendor/boss-chat-cli/src/services/report-store.js +0 -317
  79. package/vendor/boss-chat-cli/src/services/resume-capture.js +0 -469
  80. package/vendor/boss-chat-cli/src/services/resume-network.js +0 -727
  81. package/vendor/boss-chat-cli/src/services/state-store.js +0 -90
  82. package/vendor/boss-chat-cli/src/utils/customer-key.js +0 -82
  83. package/vendor/boss-recommend-screen-cli/boss-recommend-screen-cli.cjs +0 -7072
  84. package/vendor/boss-recommend-screen-cli/scripts/capture-full-resume-canvas.cjs +0 -817
  85. package/vendor/boss-recommend-screen-cli/scripts/stitch_resume_chunks.py +0 -141
  86. package/vendor/boss-recommend-screen-cli/test-recoverable-resume-failures.cjs +0 -2423
  87. package/vendor/boss-recommend-search-cli/src/cli.js +0 -1698
  88. package/vendor/boss-recommend-search-cli/src/test-job-selection.js +0 -211
@@ -1,141 +0,0 @@
1
- #!/usr/bin/env python
2
- """
3
- Stitch vertically captured resume chunks into one full-length image.
4
-
5
- Usage:
6
- python stitch_resume_chunks.py <metadata.json> <output.png>
7
- """
8
-
9
- from __future__ import annotations
10
-
11
- import json
12
- import math
13
- import os
14
- import sys
15
- from typing import Any, Dict, List, Tuple
16
-
17
- from PIL import Image
18
-
19
-
20
- def _clamp(value: int, low: int, high: int) -> int:
21
- return max(low, min(high, value))
22
-
23
-
24
- def _load_chunks(metadata_path: str) -> List[Dict[str, Any]]:
25
- with open(metadata_path, "r", encoding="utf-8") as f:
26
- meta = json.load(f)
27
-
28
- chunks = meta.get("chunks", [])
29
- if not isinstance(chunks, list) or not chunks:
30
- raise ValueError("No chunks found in metadata.")
31
-
32
- cleaned = []
33
- for idx, chunk in enumerate(chunks):
34
- file_path = chunk.get("file")
35
- if not file_path or not os.path.exists(file_path):
36
- raise FileNotFoundError(f"Chunk image missing: {file_path}")
37
- cleaned.append(
38
- {
39
- "index": int(chunk.get("index", idx)),
40
- "file": file_path,
41
- "scroll_top": float(chunk.get("scrollTop", 0.0)),
42
- "clip_h_css": float(chunk.get("clipHeightCss", 0.0)),
43
- }
44
- )
45
-
46
- cleaned.sort(key=lambda x: (x["scroll_top"], x["index"]))
47
- return cleaned
48
-
49
-
50
- def stitch(metadata_path: str, output_path: str) -> Dict[str, Any]:
51
- chunks = _load_chunks(metadata_path)
52
-
53
- opened: List[Tuple[Dict[str, Any], Image.Image]] = []
54
- for chunk in chunks:
55
- img = Image.open(chunk["file"]).convert("RGB")
56
- opened.append((chunk, img))
57
-
58
- try:
59
- segments: List[Image.Image] = []
60
- used: List[Dict[str, Any]] = []
61
- prev_chunk = None
62
-
63
- for chunk, img in opened:
64
- if prev_chunk is None:
65
- segments.append(img.copy())
66
- used.append(
67
- {
68
- "file": chunk["file"],
69
- "scrollTop": chunk["scroll_top"],
70
- "cropTopPx": 0,
71
- "keptHeightPx": img.height,
72
- }
73
- )
74
- prev_chunk = chunk
75
- continue
76
-
77
- delta_css = chunk["scroll_top"] - prev_chunk["scroll_top"]
78
- if delta_css <= 0.5:
79
- prev_chunk = chunk
80
- continue
81
-
82
- clip_h_css = chunk["clip_h_css"] if chunk["clip_h_css"] > 1 else prev_chunk["clip_h_css"]
83
- ratio = (img.height / clip_h_css) if clip_h_css > 1 else 1.0
84
- new_pixels = int(round(delta_css * ratio))
85
- new_pixels = _clamp(new_pixels, 1, img.height)
86
- crop_top = img.height - new_pixels
87
- crop_top = _clamp(crop_top, 0, img.height - 1)
88
-
89
- seg = img.crop((0, crop_top, img.width, img.height))
90
- segments.append(seg)
91
- used.append(
92
- {
93
- "file": chunk["file"],
94
- "scrollTop": chunk["scroll_top"],
95
- "cropTopPx": crop_top,
96
- "keptHeightPx": seg.height,
97
- }
98
- )
99
- prev_chunk = chunk
100
-
101
- out_width = max(seg.width for seg in segments)
102
- out_height = sum(seg.height for seg in segments)
103
- out = Image.new("RGB", (out_width, out_height), color=(255, 255, 255))
104
-
105
- y = 0
106
- for seg in segments:
107
- out.paste(seg, (0, y))
108
- y += seg.height
109
-
110
- out.save(output_path, format="PNG")
111
-
112
- return {
113
- "output": os.path.abspath(output_path),
114
- "segments": len(segments),
115
- "size": {"width": out_width, "height": out_height},
116
- "used": used,
117
- }
118
- finally:
119
- for _, img in opened:
120
- img.close()
121
-
122
-
123
- def main() -> None:
124
- if len(sys.argv) != 3:
125
- print("Usage: python stitch_resume_chunks.py <metadata.json> <output.png>", file=sys.stderr)
126
- sys.exit(1)
127
-
128
- metadata_path = os.path.abspath(sys.argv[1])
129
- output_path = os.path.abspath(sys.argv[2])
130
-
131
- try:
132
- result = stitch(metadata_path, output_path)
133
- print(json.dumps(result, ensure_ascii=False, indent=2))
134
- except Exception as exc:
135
- print(f"[stitch] failed: {exc}", file=sys.stderr)
136
- sys.exit(1)
137
-
138
-
139
- if __name__ == "__main__":
140
- main()
141
-