@roll-agent/browser-use-agent 0.9.1 → 0.10.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/SKILL.md CHANGED
@@ -12,7 +12,7 @@ metadata:
12
12
  ## 使用前提
13
13
 
14
14
  - 先启动 `browser-use-agent` HTTP 常驻服务;浏览器 session 跨调用持久。
15
- - 上层 orchestrator 若通过 Roll 调用,先用 `roll skills get browser-use-agent --include-references --json` 读取当前说明和 `references/*`,再用 `roll agent tools browser-use-agent --json` 读取真实 schema。
15
+ - 通过 Roll 调用本 Agent 时,先用 `roll skills get browser-use-agent --include-references --json` 读取当前说明和 `references/*`,再用 `roll agent tools browser-use-agent --json` 读取真实 schema。
16
16
  - 完整 `inputSchema` 以 `roll agent tools browser-use-agent --json` 为准。
17
17
  - `REPLY_AUTHORITY_KEYS_URL` 是必填环境变量;`roll doctor` 会通过 `references/env.yaml` 和 `browser_status.effectiveEnvSources` 检查它是否声明并在运行态生效。
18
18
  - 长任务前或状态异常时先跑 `roll doctor --fix-plan --json`;仅对配置迁移、`agents.dataDir`、孤儿 runtime 元数据这类安全项才使用 `roll doctor --fix --json`。
@@ -51,7 +51,8 @@ metadata:
51
51
  | `zhipin_open_chat_page()` | native CDP | 点击左侧导航切回「沟通」。 |
52
52
  | `zhipin_open_chat(conversationId?, candidateName?, index?, preferUnread?)` | native CDP | 打开目标聊天;匹配优先级为 `conversationId` > `candidateName` > `index`。 |
53
53
  | `zhipin_get_candidate_info(conversationId?, candidateName?, index?, maxMessages?)` | native CDP | 提取候选人资料、聊天记录、`conversationId`、`candidateId` 和页面职位信号。 |
54
- | `zhipin_send_reply(signedEnvelope, candidateName?, index?)` | native CDP | 验签 Reply Authority v2 envelope 后发送;输入路径为 native 点击编辑器、`Input.insertText`、native 点击发送。 |
54
+ | `zhipin_generate_reply_preview(conversationId?, candidateName?, index?, maxMessages?)` | native CDP | 读取聊天上下文,调用 Reply Authority SSE 流式生成回复,并在浏览器内展示阶段与临时草稿;返回 `preparedReplyId`,不返回 `signedEnvelope`。 |
55
+ | `zhipin_send_prepared_reply(preparedReplyId)` | native CDP | 发送 `zhipin_generate_reply_preview` 生成的预备回复;内部取回并验签 envelope;调用方只需要传 `preparedReplyId`,不需要保存或传递 `signedEnvelope`。 |
55
56
  | `zhipin_exchange_wechat(conversationId?, candidateName?, index?)` | native CDP | 点击「换微信」和确认弹窗,优先按 `conversationId` 定位聊天。 |
56
57
  | `zhipin_get_username()` | native CDP | 读取当前登录招聘者用户名;用于 `recruiterUsername` / `recruiterBinding` 链路。 |
57
58
 
@@ -66,8 +67,8 @@ metadata:
66
67
  | `zhipin_select_recommend_job(jobRef?, jobValue?, jobName?, index?, searchKeyword?, useSearch?, forceClick?)` | native CDP | 切换推荐页顶部招聘岗位筛选;优先传 `jobRef`,其次 `jobValue`,再次 `jobName`,`index` 只作当前下拉快照兜底;`forceClick:true` 时目标已选中也会点击一次岗位项。 |
67
68
  | `zhipin_filter_recommend_candidates(ageMin?, ageMax?, gender?, activity?)` | native CDP | 只设置年龄、性别、活跃度;未传维度重置为 `不限`,年龄默认 `16-不限`;若返回 `status:"requires_vip"`,表示当前账号无法使用该筛选。 |
68
69
  | `zhipin_get_candidate_list(maxResults?, autoScroll?, maxScrolls?)` | native CDP | 读取推荐候选人卡片;默认滚动并按 `candidateId` / `data-geek` 去重,返回 `candidateRef`。 |
69
- | `zhipin_say_hello(indices?, candidateRefs?)` | native CDP | 批量点击「打招呼」;orchestrator 优先传 `candidateRefs`,`indices` 只作当前 DOM 快照兜底。 |
70
- | `zhipin_open_resume(index?, candidateRef?)` | Playwright-backed | 打开简历弹窗;orchestrator 优先传 `candidateRef`,低优先级未迁移项。 |
70
+ | `zhipin_say_hello(indices?, candidateRefs?)` | native CDP | 批量点击「打招呼」;优先传 `candidateRefs`,`indices` 只作当前 DOM 快照兜底。 |
71
+ | `zhipin_open_resume(index?, candidateRef?)` | Playwright-backed | 打开简历弹窗;优先传 `candidateRef`,低优先级未迁移项。 |
71
72
  | `zhipin_locate_resume_canvas()` | Playwright-backed | 定位 `#recommendFrame -> iframe[src*="c-resume"] -> canvas#resume, div#resume canvas`。 |
72
73
  | `zhipin_close_resume()` | Playwright-backed | 关闭简历弹窗;selector 契约见 `src/pages/zhipin/resume-dom-contract.ts`。 |
73
74
 
@@ -85,39 +86,37 @@ metadata:
85
86
  1. `conversationId` / `candidateId` 是聊天稳定主键;`index` 只表示当前 DOM 快照。
86
87
  2. `zhipin_read_messages` 返回了 `conversationId` / `candidateId` 后,后续 related tool 必须复用这些真实输出。
87
88
  3. 调 `zhipin_open_chat`、`zhipin_get_candidate_info`、`zhipin_exchange_wechat` 时优先传 `conversationId`。
88
- 4. `smart-reply-agent.generate_reply(..., target)` 时,`target.conversationId` / `target.candidateId` 必须来自 `browser-use-agent` 输出。
89
- 5. 发送回复只能调用 `zhipin_send_reply(signedEnvelope)`;不要构造裸文本发送路径。
90
- 6. `zhipin_send_reply` 会校验 envelope 的 `conversationId + candidateId + recruiterBinding`,当前页面目标或招聘者不一致时拒绝。
91
- 7. `preferredBrand` 只来自 `zhipin_get_candidate_info` `communicationPosition` 的连字符格式解析;不要用通用岗位名或候选人公司名伪造。
92
- 8. 推荐页岗位筛选优先调用 `zhipin_list_recommend_jobs()`;若返回 `canSwitch:false`,说明当前账号/页面没有可切换目标,不要继续盲试岗位名。
93
- 9. `jobRef` 来自 `zhipin_list_recommend_jobs` 输出,格式如 `@j1`;选择岗位时优先传 `zhipin_select_recommend_job({ jobRef })`。
94
- 10. `jobRef` 只对最近一次岗位下拉快照有意义;筛选、搜索、刷新或页面重开后先重新调用 `zhipin_list_recommend_jobs`。
95
- 11. 推荐页岗位筛选的稳定主键是 `zhipin_list_recommend_jobs` / `zhipin_select_recommend_job` 返回的 `value`;已知 `value` 时传 `jobValue`。
96
- 12. 推荐岗位只知道标题时传 `jobName`;`index` 只表示当前岗位下拉快照,不要在搜索、筛选、刷新或跨步骤后复用。
97
- 13. `zhipin_select_recommend_job` 返回 `status:"selected"` 或 `status:"already_selected"` 都表示目标岗位已生效。
98
- 14. `zhipin_select_recommend_job` 返回 `status:"not_found"` 时不要盲目重试;先调用 `zhipin_list_recommend_jobs`,再选择最接近岗位的 `jobRef` 或 `value`。
99
- 15. 只有明确需要重新点击已选中岗位项时才传 `forceClick:true`;默认不要传,避免无意义重复点击。
100
- 16. `zhipin_filter_recommend_candidates` 返回 `status:"requires_vip"` 时不要反复尝试绕过筛选 UI;当前账号没有权限使用该筛选,改为直接读取当前推荐列表或调整业务策略。
101
- 17. 聊天消息列表不产生 `candidateRef`;聊天回复链路使用 `conversationId` / `candidateId`,推荐候选人链路才使用 `candidateRef`。
102
- 18. 推荐候选人列表的 `candidateRef` 来自 `zhipin_get_candidate_list` 输出,格式如 `@c1`;后续 `zhipin_say_hello` / `zhipin_open_resume` 优先传它。
103
- 19. `candidateRef` 只对最近一次推荐列表快照有意义;筛选、搜索、滚动加载、刷新或页面重开后先重新调用 `zhipin_get_candidate_list`。
104
- 20. orchestrator 不要自行构造 `jobRef` / `candidateRef`;只能传目标 agent 刚返回的 ref。
105
- 21. `zhipin_say_hello` 前,先从 `zhipin_get_candidate_list` 结果中过滤 `buttonText:"打招呼"` 的候选人;`buttonText` 为空通常表示已经打过招呼。
106
- 22. 如果业务有年龄、资格或岗位匹配约束,orchestrator 必须先按 `age` / `expectedPosition` / `tags` 等列表字段过滤;不要把刚读到的全部 `candidateRefs` 盲目提交。
107
- 23. `zhipin_say_hello({ candidateRefs })` 支持同一快照内连续提交多个 ref;若返回“候选人引用已过期”,说明 BOSS 列表已重排,重新执行 `zhipin_get_candidate_list` 后只重试剩余目标。
108
- 24. 高频连续 tool call 可由上层用 `roll run --batch-stdin --json` 批量提交,但每项仍要显式声明 `agent` / `tool` / `input`,不要假设 batch 自动传递上一步输出。
109
- 25. 不要用 `navigate_active_tab` 直接跳转 `https://www.zhipin.com/web/chat/*`;聊天页用 `zhipin_open_chat_page()`,推荐页用 `zhipin_open_recommend_page()`。
89
+ 4. 生成聊天回复优先调用 `zhipin_generate_reply_preview(conversationId)`;它会打开目标聊天、在浏览器内展示 Reply Authority SSE 的阶段、工具执行状态和临时草稿,不需要先额外调用 `zhipin_open_chat`。
90
+ 5. `draft.delta` 只能展示,不能发送;真正可发送内容只来自 Reply Authority `final` 事件生成的内部签名结果。
91
+ 6. 发送回复只能调用 `zhipin_send_prepared_reply(preparedReplyId)`;不要构造裸文本发送路径,也不要保存或传递 `signedEnvelope`。
92
+ 7. `zhipin_send_prepared_reply` 会校验 envelope `conversationId + candidateId + recruiterBinding`,当前页面目标或招聘者不一致时拒绝。
93
+ 8. `preferredBrand` 只来自 `zhipin_get_candidate_info` `communicationPosition` 的连字符格式解析;不要用通用岗位名或候选人公司名伪造。
94
+ 9. 推荐页岗位筛选优先调用 `zhipin_list_recommend_jobs()`;若返回 `canSwitch:false`,说明当前账号/页面没有可切换目标,不要继续盲试岗位名。
95
+ 10. `jobRef` 来自 `zhipin_list_recommend_jobs` 输出,格式如 `@j1`;选择岗位时优先传 `zhipin_select_recommend_job({ jobRef })`。
96
+ 11. `jobRef` 只对最近一次岗位下拉快照有意义;筛选、搜索、刷新或页面重开后先重新调用 `zhipin_list_recommend_jobs`。
97
+ 12. 推荐页岗位筛选的稳定主键是 `zhipin_list_recommend_jobs` / `zhipin_select_recommend_job` 返回的 `value`;已知 `value` 时传 `jobValue`。
98
+ 13. 推荐岗位只知道标题时传 `jobName`;`index` 只表示当前岗位下拉快照,不要在搜索、筛选、刷新或跨步骤后复用。
99
+ 14. `zhipin_select_recommend_job` 返回 `status:"selected"` `status:"already_selected"` 都表示目标岗位已生效。
100
+ 15. `zhipin_select_recommend_job` 返回 `status:"not_found"` 时不要盲目重试;先调用 `zhipin_list_recommend_jobs`,再选择最接近岗位的 `jobRef` 或 `value`。
101
+ 16. 只有明确需要重新点击已选中岗位项时才传 `forceClick:true`;默认不要传,避免无意义重复点击。
102
+ 17. `zhipin_filter_recommend_candidates` 返回 `status:"requires_vip"` 时不要反复尝试绕过筛选 UI;当前账号没有权限使用该筛选,改为直接读取当前推荐列表或调整业务策略。
103
+ 18. 聊天消息列表不产生 `candidateRef`;聊天回复链路使用 `conversationId` / `candidateId`,推荐候选人链路才使用 `candidateRef`。
104
+ 19. 推荐候选人列表的 `candidateRef` 来自 `zhipin_get_candidate_list` 输出,格式如 `@c1`;后续 `zhipin_say_hello` / `zhipin_open_resume` 优先传它。
105
+ 20. `candidateRef` 只对最近一次推荐列表快照有意义;筛选、搜索、滚动加载、刷新或页面重开后先重新调用 `zhipin_get_candidate_list`。
106
+ 21. 不要自行构造 `jobRef` / `candidateRef`;只能传本 Agent 刚返回的 ref。
107
+ 22. `zhipin_say_hello` 前,先从 `zhipin_get_candidate_list` 结果中过滤 `buttonText:"打招呼"` 的候选人;`buttonText` 为空通常表示已经打过招呼。
108
+ 23. 如果业务有年龄、资格或岗位匹配约束,必须先按 `age` / `expectedPosition` / `tags` 等列表字段过滤;不要把刚读到的全部 `candidateRefs` 盲目提交。
109
+ 24. `zhipin_say_hello({ candidateRefs })` 支持同一快照内连续提交多个 ref;若返回“候选人引用已过期”,说明 BOSS 列表已重排,重新执行 `zhipin_get_candidate_list` 后只重试剩余目标。
110
+ 25. 高频连续 tool call 可用 `roll run --batch-stdin --json` 批量提交,但每项仍要显式声明 `agent` / `tool` / `input`,不要假设 batch 自动传递上一步输出。
111
+ 26. 不要用 `navigate_active_tab` 直接跳转 `https://www.zhipin.com/web/chat/*`;聊天页用 `zhipin_open_chat_page()`,推荐页用 `zhipin_open_recommend_page()`。
110
112
 
111
113
  ## 典型链路
112
114
 
113
115
  ```text
114
116
  聊天回复:
115
117
  zhipin_read_messages
116
- -> zhipin_get_username
117
- -> zhipin_open_chat(conversationId)
118
- -> zhipin_get_candidate_info(conversationId)
119
- -> smart-reply-agent.generate_reply(..., target)
120
- -> zhipin_send_reply(signedEnvelope)
118
+ -> zhipin_generate_reply_preview(conversationId)
119
+ -> zhipin_send_prepared_reply(preparedReplyId)
121
120
 
122
121
  推荐候选人:
123
122
  zhipin_open_recommend_page
@@ -125,7 +124,7 @@ zhipin_open_recommend_page
125
124
  -> zhipin_select_recommend_job(jobRef | jobValue | jobName) # 可选;canSwitch=false 时跳过
126
125
  -> zhipin_filter_recommend_candidates(...) # 可选;requires_vip 时跳过筛选
127
126
  -> zhipin_get_candidate_list(maxResults?, autoScroll=true)
128
- -> orchestrator 过滤 buttonText/年龄/业务资格
127
+ -> buttonText/年龄/业务资格过滤
129
128
  -> zhipin_say_hello(candidateRefs)
130
129
  ```
131
130
 
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- export declare const BROWSER_USE_DECLARED_ENV_KEYS: readonly ["REPLY_AUTHORITY_KEYS_URL", "RECRUITMENT_EVENTS_ENABLED", "RECRUITMENT_EVENTS_API_BASE_URL", "RECRUITMENT_EVENTS_API_TOKEN", "RECRUITMENT_EVENTS_DEFAULT_AGENT_ID", "BROWSER_VISUAL_CURSOR", "BROWSER_VISUAL_ACTIVITY"];
2
+ export declare const BROWSER_USE_DECLARED_ENV_KEYS: readonly ["REPLY_AUTHORITY_URL", "REPLY_AUTHORITY_BEARER_TOKEN", "REPLY_AUTHORITY_KEYS_URL", "RECRUITMENT_EVENTS_ENABLED", "RECRUITMENT_EVENTS_API_BASE_URL", "RECRUITMENT_EVENTS_API_TOKEN", "RECRUITMENT_EVENTS_DEFAULT_AGENT_ID", "BROWSER_VISUAL_CURSOR", "BROWSER_VISUAL_ACTIVITY"];
3
3
  export declare const EffectiveEnvSourceSchema: z.ZodObject<{
4
4
  present: z.ZodBoolean;
5
5
  fingerprint: z.ZodOptional<z.ZodString>;