@reconcrap/boss-recommend-mcp 1.2.10 → 1.3.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 (34) hide show
  1. package/README.md +82 -1
  2. package/package.json +2 -1
  3. package/skills/boss-chat/README.md +5 -0
  4. package/skills/boss-chat/SKILL.md +69 -0
  5. package/skills/boss-recommend-pipeline/SKILL.md +40 -4
  6. package/src/adapters.js +19 -5
  7. package/src/boss-chat.js +436 -0
  8. package/src/cli.js +294 -129
  9. package/src/index.js +459 -108
  10. package/src/pipeline.js +605 -8
  11. package/src/run-state.js +5 -0
  12. package/src/test-adapters-runtime.js +69 -0
  13. package/src/test-boss-chat.js +399 -0
  14. package/src/test-index-async.js +238 -4
  15. package/src/test-pipeline.js +408 -1
  16. package/vendor/boss-chat-cli/README.md +134 -0
  17. package/vendor/boss-chat-cli/package.json +53 -0
  18. package/vendor/boss-chat-cli/src/app.js +783 -0
  19. package/vendor/boss-chat-cli/src/browser/chat-page.js +2698 -0
  20. package/vendor/boss-chat-cli/src/cli.js +1350 -0
  21. package/vendor/boss-chat-cli/src/mcp/server.js +149 -0
  22. package/vendor/boss-chat-cli/src/mcp/tool-runtime.js +193 -0
  23. package/vendor/boss-chat-cli/src/runtime/async-run-state.js +260 -0
  24. package/vendor/boss-chat-cli/src/runtime/interaction.js +102 -0
  25. package/vendor/boss-chat-cli/src/runtime/run-control.js +102 -0
  26. package/vendor/boss-chat-cli/src/services/chrome-client.js +97 -0
  27. package/vendor/boss-chat-cli/src/services/llm.js +352 -0
  28. package/vendor/boss-chat-cli/src/services/profile-store.js +157 -0
  29. package/vendor/boss-chat-cli/src/services/report-store.js +19 -0
  30. package/vendor/boss-chat-cli/src/services/resume-capture.js +554 -0
  31. package/vendor/boss-chat-cli/src/services/state-store.js +217 -0
  32. package/vendor/boss-chat-cli/src/utils/customer-key.js +82 -0
  33. package/vendor/boss-recommend-screen-cli/boss-recommend-screen-cli.cjs +902 -56
  34. package/vendor/boss-recommend-screen-cli/test-recoverable-resume-failures.cjs +387 -1
package/README.md CHANGED
@@ -7,6 +7,12 @@ Boss 推荐页自动化流水线 MCP(stdio)服务。
7
7
  - `boss-recommend-search-cli`: 只负责推荐页筛选项
8
8
  - `boss-recommend-screen-cli`: 只负责滚动列表、打开详情、提取完整简历图、多模态判断,并对通过人选统一执行 `favorite` 或 `greet`
9
9
 
10
+ 现在包内还内置了 `boss-chat` runtime,因此安装 `boss-recommend-mcp` 后可以直接:
11
+
12
+ - 单独运行 chat-only 任务,不需要再单独安装 `boss-chat`
13
+ - 在 recommend screen 完成后,通过同一个父 run 自动进入 `chat_followup`
14
+ - 继续把聊天页状态保存在工作区下的 `.boss-chat/`
15
+
10
16
  MCP 工具:
11
17
 
12
18
  - `start_recommend_pipeline_run`(异步启动;同样先经过前置门禁,通过后返回 run_id)
@@ -15,6 +21,12 @@ MCP 工具:
15
21
  - `pause_recommend_pipeline_run`(请求暂停 run;会在当前候选人处理完成后进入 paused)
16
22
  - `resume_recommend_pipeline_run`(继续 paused run;沿用同 run_id 与同 CSV)
17
23
  - `run_recommend_self_heal`(手动运维工具;扫描 Boss recommend 的 selector / network 规则漂移,并在确认后应用高置信度修复)
24
+ - `boss_chat_health_check`
25
+ - `start_boss_chat_run`
26
+ - `get_boss_chat_run`
27
+ - `pause_boss_chat_run`
28
+ - `resume_boss_chat_run`
29
+ - `cancel_boss_chat_run`
18
30
  - `validation_profile=safe`:只做非破坏性扫描与被动 network 观察
19
31
  - `validation_profile=full`:会主动打开候选人详情,并执行收藏往返校验与一次打招呼校验;若完整交互没跑通,会明确返回验证异常而不是静默跳过
20
32
  - 扫描会主动覆盖 recommend/latest/featured 三个 tab 的详情链路(详情打开、详情内关键 selector、popup 关闭)
@@ -37,6 +49,8 @@ MCP 工具:
37
49
  - `failed`
38
50
  - `canceled`
39
51
 
52
+ 当 recommend run 传入 `follow_up.chat` 且 screen 成功后,父 run 会进入 `chat_followup` 阶段并保持 `running`,直到内置 boss-chat 子任务结束。此时对父 run 的 `pause/resume/cancel` 会代理到子 chat run。
53
+
40
54
  ## 设计特点
41
55
 
42
56
  - 页面目标固定为 `https://www.zhipin.com/web/chat/recommend`
@@ -146,18 +160,73 @@ node src/cli.js set-port --port 9222
146
160
  node src/cli.js doctor --agent trae-cn
147
161
  node src/cli.js launch-chrome --port 9222
148
162
  node src/cli.js run --instruction-file request.txt --confirmation-file confirmation.json --overrides-file overrides.json
163
+ node src/cli.js run --instruction-file request.txt --confirmation-file confirmation.json --overrides-file overrides.json --follow-up-file follow-up.json
164
+ node src/cli.js chat health-check
165
+ node src/cli.js chat run --job "算法工程师" --start-from unread --criteria "有 AI Agent 经验" --targetCount 20
166
+ ```
167
+
168
+ ## Recommend + Chat Follow-up
169
+
170
+ 若要让 recommend screen 完成后自动开始 boss-chat,把 chat 配置放到同一个 recommend run 的顶层 `follow_up.chat`:
171
+
172
+ ```json
173
+ {
174
+ "follow_up": {
175
+ "chat": {
176
+ "criteria": "候选人需要继续在聊天页过滤有 AI Agent 经验的人选",
177
+ "start_from": "unread",
178
+ "target_count": 20,
179
+ "profile": "default",
180
+ "dry_run": false,
181
+ "no_state": false,
182
+ "safe_pacing": true,
183
+ "batch_rest_enabled": true
184
+ }
185
+ }
186
+ }
149
187
  ```
150
188
 
189
+ 说明:
190
+
191
+ - `criteria` / `start_from` / `target_count` 为必填
192
+ - `profile` 可选,默认 `default`
193
+ - `job` 与 `port` 继承 recommend run 已选岗位和调试端口
194
+ - `baseUrl` / `apiKey` / `model` 不再单独传入,固定复用 recommend 的 `screening-config.json`
195
+ - 若缺少 `follow_up.chat` 必填项,pipeline 会返回 `NEED_INPUT`
196
+ - recommend 成功后,父 run 继续存活并进入 `chat_followup`;chat 结束后父 run 才会进入最终终态
197
+
198
+ ## Chat-only
199
+
200
+ 安装 `boss-recommend-mcp` 后,无需额外安装 `boss-chat`:
201
+
202
+ - CLI:
203
+ - `boss-recommend-mcp chat health-check`
204
+ - `boss-recommend-mcp chat run --job "算法工程师" --start-from unread --targetCount 20 --criteria "有 AI Agent 经验"`(后台启动,不自动轮询)
205
+ - `boss-recommend-mcp chat start-run|get-run|pause-run|resume-run|cancel-run`
206
+ - MCP:
207
+ - `boss_chat_health_check`
208
+ - `start_boss_chat_run`
209
+ - `get_boss_chat_run`
210
+ - `pause_boss_chat_run`
211
+ - `resume_boss_chat_run`
212
+ - `cancel_boss_chat_run`
213
+
214
+ chat-only 交互建议:
215
+
216
+ - 先调用一次 `start_boss_chat_run`(可不带参数),服务会先导航到 `https://www.zhipin.com/web/chat/index` 并返回 `NEED_INPUT`,其中包含岗位 `job_options` 与待补字段。
217
+ - 然后基于 `job_options` 让用户选择 `job`,并补齐 `start_from`、`target_count`、`criteria` 后再次调用 `start_boss_chat_run` 启动任务。
218
+
151
219
  ## 长流程 Agent 兼容模式
152
220
 
153
221
  当宿主 agent 对“长时间无回包”敏感(容易误判失败)时,建议改用异步工具:
154
222
 
155
223
  1. 调用 `start_recommend_pipeline_run`。
156
224
  2. 若返回 `NEED_INPUT/NEED_CONFIRMATION/FAILED`,按同步流程先补齐前置条件(登录、页面就绪、岗位确认、最终确认)。
157
- 3. 仅当门禁通过时,接口才会返回 `ACCEPTED + run_id`;随后每 5~15 秒调用一次 `get_recommend_pipeline_run` 轮询。
225
+ 3. 仅当门禁通过时,接口才会返回 `ACCEPTED + run_id`;默认不自动轮询,建议按需调用 `get_recommend_pipeline_run`(长任务至少每 30 分钟一次,除非用户明确要求更频繁)。
158
226
  4. 若需临时中断,调用 `pause_recommend_pipeline_run`;接口会先返回 `PAUSE_REQUESTED`,随后在安全边界进入 `paused`。
159
227
  5. `paused` 后调用 `resume_recommend_pipeline_run` 继续执行;同一 `run_id` 会复用同一 CSV,并从 checkpoint 无缝续跑。
160
228
  6. 若需终止,调用 `cancel_recommend_pipeline_run`。
229
+ 7. 若该 run 配置了 `follow_up.chat`,screen 完成后父 run 会进入 `chat_followup`;继续轮询同一个 `run_id` 即可,不需要再新建 chat run。
161
230
 
162
231
  说明:
163
232
 
@@ -167,6 +236,7 @@ node src/cli.js run --instruction-file request.txt --confirmation-file confirmat
167
236
  - screen 阶段会持久化 checkpoint:`~/.boss-recommend-mcp/runs/<run_id>.checkpoint.json`。
168
237
  - 暂停采用“当前候选人处理完成后暂停”语义,避免停在详情页中间态。
169
238
  - 轮询期间不要重复 `start`,优先复用已有 `run_id`,避免重复筛选。
239
+ - 处于 `chat_followup` 时,对父 run 的 `pause/resume/cancel` 会自动代理到内置 boss-chat 子 run。
170
240
 
171
241
  ## MCP Tool Input
172
242
 
@@ -204,6 +274,15 @@ node src/cli.js run --instruction-file request.txt --confirmation-file confirmat
204
274
  "target_count": 20,
205
275
  "post_action": "greet",
206
276
  "max_greet_count": 10
277
+ },
278
+ "follow_up": {
279
+ "chat": {
280
+ "criteria": "继续在聊天页处理有 AI Agent 或 MCP 项目经验的人选",
281
+ "start_from": "unread",
282
+ "target_count": 20,
283
+ "profile": "default",
284
+ "safe_pacing": true
285
+ }
207
286
  }
208
287
  }
209
288
  ```
@@ -213,6 +292,8 @@ node src/cli.js run --instruction-file request.txt --confirmation-file confirmat
213
292
  ```bash
214
293
  npm run test:parser
215
294
  npm run test:pipeline
295
+ npm run test:async
296
+ npm run test:boss-chat
216
297
  ```
217
298
 
218
299
  ## 当前实现边界
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reconcrap/boss-recommend-mcp",
3
- "version": "1.2.10",
3
+ "version": "1.3.1",
4
4
  "description": "Unified MCP pipeline for recommend-page filtering and screening on Boss Zhipin",
5
5
  "keywords": [
6
6
  "boss",
@@ -25,6 +25,7 @@
25
25
  "test:run-state": "node src/test-run-state.js",
26
26
  "test:runtime": "node src/test-adapters-runtime.js",
27
27
  "test:async": "node src/test-index-async.js",
28
+ "test:boss-chat": "node src/test-boss-chat.js",
28
29
  "test:self-heal": "node src/test-self-heal.js",
29
30
  "test:search-job": "node vendor/boss-recommend-search-cli/src/test-job-selection.js",
30
31
  "test:screen-runtime": "node vendor/boss-recommend-screen-cli/test-recoverable-resume-failures.cjs"
@@ -0,0 +1,5 @@
1
+ # boss-chat
2
+
3
+ Bundled chat-page automation skill shipped with `boss-recommend-mcp`.
4
+
5
+ Use this skill when the user wants a chat-only Boss workflow without installing `boss-chat` separately.
@@ -0,0 +1,69 @@
1
+ ---
2
+ name: "boss-chat"
3
+ description: "Use when users want Boss chat-page screening/outreach via the bundled boss-chat runtime inside boss-recommend-mcp."
4
+ ---
5
+
6
+ # Boss Chat Skill
7
+
8
+ ## Goal
9
+
10
+ 当用户要在 Boss 聊天页单独跑筛选/沟通任务时,必须走内置的 chat 工具,而不是要求用户单独安装 `boss-chat`。
11
+
12
+ 适用范围是“chat-only 会话”。若用户意图包含推荐页找人(尤其是“先推荐再沟通”),必须让 `boss-recommend-pipeline` 接管,并通过 `follow_up.chat` 完成联动。
13
+
14
+ ## Tool Routing
15
+
16
+ - 健康检查:`boss_chat_health_check`
17
+ - 启动异步任务:`start_boss_chat_run`
18
+ - 查询进度:`get_boss_chat_run`
19
+ - 暂停:`pause_boss_chat_run`
20
+ - 继续:`resume_boss_chat_run`
21
+ - 取消:`cancel_boss_chat_run`
22
+
23
+ ## Required Inputs
24
+
25
+ - `job`
26
+ - `start_from`: `unread|all`
27
+ - `target_count`
28
+ - `criteria`
29
+
30
+ 可选:
31
+
32
+ - `target_count`
33
+ - `profile`(默认 `default`)
34
+ - `port`
35
+ - `dry_run`
36
+ - `no_state`
37
+ - `safe_pacing`
38
+ - `batch_rest_enabled`
39
+
40
+ ## Hard Rules
41
+
42
+ - LLM 配置必须复用 `boss-recommend-mcp` 的 `screening-config.json`;不要再向用户单独要 `baseUrl/apiKey/model`。
43
+ - 路由护栏(强制):
44
+ - 只在用户明确是 chat-only 任务时使用本 skill。
45
+ - 只要用户提到推荐页、先找人后沟通、或需要推荐筛选阶段,禁止调用 `start_boss_chat_run`;必须交给 `boss-recommend-pipeline` 并走 `follow_up.chat`。
46
+ - 不得在 recommend 任务尚未完成时并行启动独立 chat run。
47
+ - `job` / `start_from` / `criteria` 缺一不可;缺参时只补缺口。
48
+ - `target_count` 在 chat-only 启动前也是必填项,不能默认省略。
49
+ - 禁止 agent 自行补全 `job/start_from/criteria` 并直接执行,必须由用户明确给出或确认。
50
+ - chat-only 启动流程必须先进入聊天页并拉取岗位列表,再让用户从列表中选择 `job`。
51
+ - 允许先用空参调用 `start_boss_chat_run` 触发 `NEED_INPUT`;若返回了 `job_options`,必须完整展示所有岗位选项给用户确认。
52
+ - 默认不自动轮询;只有用户要求查进度时才调用 `get_boss_chat_run`。
53
+ - `start_boss_chat_run` 返回 `ACCEPTED` 后,默认立即结束当前回合,不得主动连续调用 `get_boss_chat_run`。
54
+ - 只有当用户明确给出“轮询频率/间隔”(例如“每30分钟查一次”)时,才允许按该频率查询进度。
55
+ - 长任务场景禁止高频轮询;若需持续观察,默认按 30 分钟间隔查询一次状态(除非用户明确要求更频繁)。
56
+ - `pause/resume/cancel` 必须复用同一个 `run_id`。
57
+
58
+ ## Handoff Rule (Recommend -> Chat)
59
+
60
+ - 若用户先运行了 recommend 流水线,并在手动状态检查时确认 recommend 已完成,且用户目标是“立即进入聊天沟通”:
61
+ - 若该 recommend run **未配置** `follow_up.chat`:应立即调用 `start_boss_chat_run` 启动 chat(不要等下一次 30 分钟轮询)。
62
+ - 若该 recommend run **已配置** `follow_up.chat`:不要再重复新开 chat run,改为查询同一父 run / 子 run 状态。
63
+
64
+ ## Response Style
65
+
66
+ - 用结构化中文。
67
+ - 首轮建议先调用一次 `start_boss_chat_run`(可空参)获取 `job_options` 与 `pending_questions`。
68
+ - 缺参时必须逐项确认:`job`(来自岗位列表)、`start_from`(`unread|all`)、`target_count`、`criteria`。
69
+ - 若健康检查失败,明确提示共享配置文件 `screening-config.json` 不可用。
@@ -7,15 +7,22 @@ description: "Use when users want Boss recommend-page filtering/screening via bo
7
7
 
8
8
  ## Goal
9
9
 
10
- 当用户要在 Boss 推荐页筛人时,必须走 `start_recommend_pipeline_run`,并按“两阶段确认 -> 页面就绪 -> 岗位确认 -> 最终确认 -> 执行”的顺序完成。
10
+ 当用户要在 Boss 推荐页筛人时,必须走 `start_recommend_pipeline_run`,并按“两阶段确认 -> 页面就绪 -> 岗位确认 -> 最终确认 -> 执行”的顺序完成。若用户还要求筛完后自动进入聊天页 follow-up,则必须把 chat 要求放进同一个 recommend run 的 `follow_up.chat`,不要要求单独再安装 `boss-chat`。
11
11
 
12
12
  ## Hard Rules (Must Follow)
13
13
 
14
14
  - **路由**
15
15
  - 语义是推荐页(`recommend/推荐页/recommend page//web/chat/recommend`)时,只能走本 skill。
16
+ - 语义是“推荐页找人 + 结束后沟通/聊天”时,仍然只能走本 skill;必须通过 `follow_up.chat` 挂到同一个 recommend run。
16
17
  - 只有用户**明确**说搜索页(`search/搜索页//web/chat/search`)时,才可转 `boss-recruit-pipeline`。
17
18
  - recommend 失败时(如 `JOB_TRIGGER_NOT_FOUND/NO_RECOMMEND_IFRAME/BOSS_LOGIN_REQUIRED`)禁止降级到 recruit;先修 recommend 页面就绪/登录态。
18
19
 
20
+ - **确认不可代填(强制)**
21
+ - 禁止 agent 自行“设置合理参数”并代替用户确认。
22
+ - 禁止在用户未明确回复前,把任意 `*_confirmed` 字段设为 `true`。
23
+ - 禁止在用户未明确回复前,自行填充 `page_scope/school_tag/degree/gender/recent_not_view/criteria/target_count/post_action/max_greet_count/job/follow_up.chat.*`。
24
+ - 若工具返回 `pending_questions`,必须逐项向用户提问并等待用户回复;不得跳过提问直接执行。
25
+
19
26
  - **岗位确认时机**
20
27
  - 页面未就绪前,禁止询问 `job`。
21
28
  - 仅当工具返回 `job_options` 后,才允许问 `job`,且必须展示全部选项。
@@ -29,6 +36,7 @@ description: "Use when users want Boss recommend-page filtering/screening via bo
29
36
  - 首次用户需求原文锁定为 `locked_instruction_raw`。
30
37
  - 后续所有调用复用原文,禁止改写/翻译/摘要。
31
38
  - 最终执行前逐字回显将提交的 `instruction`;若与锁定值不一致,先修正再执行。
39
+ - 禁止在中途把用户意图拆成“recommend 已默认确认 + chat 单独执行”两条链路。
32
40
 
33
41
  ## Two-Stage Confirmation
34
42
 
@@ -51,7 +59,25 @@ description: "Use when users want Boss recommend-page filtering/screening via bo
51
59
  必须确认:
52
60
 
53
61
  - `job`(来自 `job_options`,必须全量展示)
54
- - `final_review`(岗位 + 全参数总确认)
62
+ - `final_review`(岗位 + 全参数总确认;若有 `follow_up.chat`,必须把 chat summary 一并展示)
63
+
64
+ ## Follow-up Chat
65
+
66
+ 当用户要求“推荐页跑完后自动开始聊天页任务”时:
67
+
68
+ - 仍然只走 `start_recommend_pipeline_run`
69
+ - 把 chat 配置放入顶层 `follow_up.chat`
70
+ - `follow_up.chat` 必填:
71
+ - `criteria`
72
+ - `start_from`: `unread|all`
73
+ - `target_count`
74
+ - `follow_up.chat` 可选:
75
+ - `profile`(默认 `default`)
76
+ - `dry_run/no_state/safe_pacing/batch_rest_enabled`
77
+ - `job` / `port` 继承 recommend run 上下文;不要单独向用户再要一份
78
+ - LLM 配置固定复用 recommend 的 `screening-config.json`;不要单独向用户再要 `baseUrl/apiKey/model`
79
+ - 缺少 `follow_up.chat` 必填项时,按 `pending_questions` 补缺口;不要额外发起一轮独立的 chat 确认流程
80
+ - 不允许提前调用 `start_boss_chat_run`;必须等 recommend run 完成并由 `follow_up.chat` 自动衔接
55
81
 
56
82
  ## Closed vs Open Questions
57
83
 
@@ -72,18 +98,28 @@ description: "Use when users want Boss recommend-page filtering/screening via bo
72
98
  - 关键输入:
73
99
  - `confirmation`:`page_confirmed/page_value/filters_confirmed/school_tag_confirmed.../job_confirmed/job_value/final_confirmed`
74
100
  - `overrides`:`page_scope/school_tag/degree/gender/recent_not_view/criteria/job/target_count/post_action/max_greet_count`
101
+ - `follow_up.chat`:仅在“recommend 完成后自动进入 boss-chat”场景传入
75
102
 
76
103
  最小策略:
77
104
 
78
105
  - 若返回 `NEED_INPUT` 或 `NEED_CONFIRMATION`:只追问 `pending_questions`。
79
106
  - 已确认值不重复问;仅补缺口。
80
107
  - 拿到 `ACCEPTED + run_id` 后默认停止本轮,不自动轮询。
108
+ - 在拿到 `ACCEPTED + run_id` 之前,禁止以“我已帮你确认参数”为由越过必填确认阶段。
81
109
 
82
110
  ## Async Run Policy
83
111
 
84
112
  - 用户未明确要求“持续跟进”时,不自动 `sleep + get_recommend_pipeline_run`。
85
- - 用户要求查进度时,再用 `get_recommend_pipeline_run`(建议 5-15 秒间隔)。
113
+ - run 已进入 `chat_followup`,默认也不得自动轮询子 chat 状态;除非用户明确指定轮询频率/间隔。
114
+ - 用户要求查进度时,再用 `get_recommend_pipeline_run`。
115
+ - **长任务轮询节奏(强制)**:
116
+ - 推荐+聊天联动任务可能运行数小时,禁止高频轮询。
117
+ - 默认最小轮询间隔为 **30 分钟**(除非用户明确要求更频繁)。
118
+ - 若刚启动 run(拿到 `ACCEPTED + run_id`),不得立即进入连续轮询。
86
119
  - `pause/resume/cancel` 必须复用同一 `run_id`,不要重复 `start`。
120
+ - **完成后衔接(强制)**:
121
+ - 若本次 run 已带 `follow_up.chat`:chat 由同一 run 自动衔接,禁止再单独重复启动 chat run。
122
+ - 若用户手动触发 `get_recommend_pipeline_run` 且发现 recommend 已完成、而当前会话目标是“继续聊天沟通”且尚未启动 chat:应立即启动 chat(无需等待下一轮 30 分钟轮询)。
87
123
 
88
124
  ## Preflight and Recovery
89
125
 
@@ -108,7 +144,7 @@ description: "Use when users want Boss recommend-page filtering/screening via bo
108
144
 
109
145
  MCP 不可用时:
110
146
 
111
- `npx -y @reconcrap/boss-recommend-mcp@latest run --instruction "..." [--confirmation-json '{...}'] [--overrides-json '{...}']`
147
+ `npx -y @reconcrap/boss-recommend-mcp@latest run --instruction "..." [--confirmation-json '{...}'] [--overrides-json '{...}'] [--follow-up-json '{...}']`
112
148
 
113
149
  禁止错误回退:
114
150
 
package/src/adapters.js CHANGED
@@ -115,6 +115,15 @@ function normalizeText(value) {
115
115
  return String(value || "").replace(/\s+/g, " ").trim();
116
116
  }
117
117
 
118
+ function serializeInputSummary(value) {
119
+ if (!value || typeof value !== "object" || Array.isArray(value)) return null;
120
+ try {
121
+ return JSON.stringify(value);
122
+ } catch {
123
+ return null;
124
+ }
125
+ }
126
+
118
127
  function normalizePageScope(value) {
119
128
  const normalized = normalizeText(value).toLowerCase();
120
129
  if (!normalized) return null;
@@ -2794,6 +2803,7 @@ export async function runRecommendScreenCli({
2794
2803
  workspaceRoot,
2795
2804
  screenParams,
2796
2805
  pageScope = "recommend",
2806
+ inputSummary = null,
2797
2807
  resume = null,
2798
2808
  runtime = null
2799
2809
  }) {
@@ -2922,11 +2932,15 @@ export async function runRecommendScreenCli({
2922
2932
  if (pauseControlPath) {
2923
2933
  args.push("--pause-control-path", pauseControlPath);
2924
2934
  }
2925
- if (resumeRequested) {
2926
- args.push("--resume");
2927
- }
2928
-
2929
- let inferredProgress = {
2935
+ if (resumeRequested) {
2936
+ args.push("--resume");
2937
+ }
2938
+ const serializedInputSummary = serializeInputSummary(inputSummary);
2939
+ if (serializedInputSummary) {
2940
+ args.push("--input-summary-json", serializedInputSummary);
2941
+ }
2942
+
2943
+ let inferredProgress = {
2930
2944
  processed: 0,
2931
2945
  passed: 0,
2932
2946
  skipped: 0,