leadsradar-agent 1.0.3 → 1.0.4

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.
@@ -55,7 +55,11 @@ const SKILLS_LATEST = {
55
55
  // ⭐R79b 插件商店最新版:插件发版时同步 bump(与 SKILLS_LATEST 同一维护纪律)——管家栗对照
56
56
  // extension.extensionVersion 落后时提醒用户手动提速更新(商店自动更为主)
57
57
  const PLUGIN_LATEST = "1.0.0";
58
- const ADAPTER_VERSION = "1.2.23"; // ⭐R89 1.2.22→1.2.23:卫星模式等待插件话术补探测链(⭐2026-10-23 用户实报「刚开机测栗子在吗没自动连上」,WorkBuddy 卫星只泛泛说「去浏览器确认插件启用+开关打开」——根因=卫星分支 step=1 hint 是写死文案,没接主 Broker 分支同款 disconnectDiagnosis() || extensionLaunchHint() 探测链,说不出「插件装在 Chrome 的 Profile 1,开那个窗口 5 秒自动连」的精确指引;卫星经 device.extension.state 已同步主 Broker lastClose(诊断可用)、Profile 探测是无状态扫盘(卫星可跑),两条都安全) ⭐R79 1.2.21→1.2.22:①适配器自更新——启动后台异步查云端最新 mjs(npmmirror→unpkg 双源 fallback),提取其中 ADAPTER_VERSION 比对,更新则 tmp+rename 原子覆盖自己(本地文件型宿主覆盖下载目录 mjs、npx 型覆盖 _npx 缓存内的自己,下次进程启动即新版;失败静默保持旧版、只升不降、24h 节流);②connection_status 的 adapter.update 透出自更新三态(checking/up-to-date/updated-pending-restart)——升级挂「栗子在吗」常径不设专门触发词,宿主报到表格渲染「已自动升级,重启宿主生效」;③新工具 leadsradar_get_latest_skills(12→13 工具版判据):技能落后时宿主取最新 SKILL.md 全文递给用户粘贴(技能库装在宿主手里无法代写)。云端生效前提=npm 发版 leadsradar-agent(自更新与技能下载的同一源头) ⭐R76 1.2.20→1.2.21:①connection_status 附 skills_latest 五技能版本表(识别技能落后+指路更新——宿主技能版本不可自动更,Agent 对照自检指路);②R74/R75 期间加的工具(add_monitor/pair_login/get_daily_report,10→12)未 bump 版本号,复测无法分辨 mjs 新旧,一并 bump(v1.2.21=12 工具版判据) ⭐R56b 1.2.19→1.2.20:卫星登录态透传四处(中转宿主 loggedIn 恒 null 根修)+中转连接文案说人话(去宿主名硬编码黑话) ⭐msg11 1.2.18→1.2.19:AI 唤醒探栗 MCP——connection_status(「栗子在吗」探活指令)时 TL MCP 未运行则自动拉起(读 NM 注册表拿 exe 路径,detached spawn;只在交互信号点拉,不在 agent 启动时拉以尊重「托盘退出」;未装静默缓存跳过) ⭐B7b-P1 1.2.17→1.2.18:结果认领闭环(三原则 b 协议化——插件是结果的持有者与通知源,宿主是可断线重来的消费者):①extension.hello 附未领取结果摘要 pendingResults[{taskId,mode,keyword,url,createdAt}](connection_status 的 extension.pendingResults 透出,AI 开工前即知有存货);②新 MCP 工具 leadsradar_claim_pending_result(领取插件侧已完成但无人认领的任务结果——超时/宿主重启后回来领,不占采集限额;走普通任务通道 mode=claim_pending_result,卫星模式自动兼容);③device.extension.state 卫星透传摘要;④step=3 hint 有存货时提示「先领取再决定重发」(配合 1.2.17 的超时文案,AI 标准动作=超时→领取→查库→才重发,根除额度双耗);⭐1.2.16→1.2.17:HTTP 模式默认端口 17374→17375(撞车根修:17374 是本地服务 Rust IPC 的 NDJSON 端口,agent HTTP 监听同端口时扣子等 HTTP 宿主把请求头打到 Rust → service.log 刷 bad json;改 17375 后两端口各归其主,已按 17374 配 URL 的宿主需改指 17375,可用 LEADSRADAR_AGENT_HTTP_PORT 覆盖)+ B3 断开原因钩子(插件断开的 close frame code+reason 不再丢弃:disconnectDiagnosis() 区分「开关关/桥不可用/浏览器被杀或插件被禁」给精准指引——旧版一律报「start chrome」实测无效指引;插件侧 reason 真源 local-agent-connector.ts stop()="LF Agent disabled"/stopForAvailability()="…not publicly available",SW 被杀无告别帧=1006;卫星经 device.extension.state 同步诊断);⭐A2/B7/B9 1.2.15→1.2.16:撞墙自修三连——①任务中断秒失败(插件断开即中止全部等待任务 TASK_ABORTED,旧版傻等 300s 超时,2026-10-16 杀浏览器实测抓到);②撞墙文案自动探测插件所在浏览器+profile(扫 Chrome/Edge 各 profile 的 Preferences 找 unpacked 探栗 path,给出精确 start 命令——旧版「start chrome 开默认 profile、插件装在 Profile 1 → 桥永远不起」实测 bug);③extension.account.update 登录态保鲜(解绑/登出实时同步,旧版冻结在握手值「解绑了仍显示已登录」实测);⭐r96ze 1.2.14→1.2.15:卫星状态谎报根修(用户实报「未批准的 dsh 显示已连接可以开工」)——statusSnapshot 卫星分支旧逻辑借中转通道状态(主 Broker 与插件的连接)冒充自身就绪,未批准卫星恒报 step=3;新逻辑 selfPaired 标志(收到 purpose="session" 挑战=已配对、pairing=失效回退,SW 挑战类型即配对态真值),step 判定通道死→1/未配对→2/配对+通道→3,step=2 hint 明示「批准前任务会被拒绝别急着开工」(任务层本有 PAIRING_REQUIRED 门禁无越权,仅状态误导);⭐r96y 1.2.13→1.2.14:欢迎文案 v2(「探一下」品牌动词融入全部示例,示例即激活词教学;删「不用记命令」与能力清单黑话)+ 对外文案 9 处旧菜单名「智能体接管」→「智能体连接」(r96r-5 改名时适配器侧漏网:hint/错误 message/description/log,宿主 AI 按旧名指路用户找不到菜单);⭐r96t 1.2.12→1.2.13:HOST_LABELS 删 stepfun=「阶跃 AI」(渠道下线:用户拍板排除——自定义 MCP 入口未确认开放+用户量知名度低);⭐r96g 1.2.11→1.2.12:HOST_LABELS 补 cherry=「Cherry Studio」/stepfun=「阶跃 AI」(CLI·进阶档扩容:codex 回归+cherry+stepfun,dsh 并入该档);⭐r96e 1.2.10→1.2.11:HOST_LABELS 补 trae=「Trae」(Trae/编程 CLI 宿主:项目 .trae/mcp.json 配置拉起,本仓 dogfooding 实测);⭐r96 1.2.10:HOST_LABELS 补 qwen-office=「千问办公」;⭐r93 1.2.9:dsh=「DeepSeek」;⭐r90c 1.2.8:HTTP 模式;⭐r86c 1.2.7:kimi-work;⭐r85b 1.2.6:doubao/feishu 多客户端各自 HOST;⭐r85 1.2.5:Windows 动态端口自愈;⭐r82 1.2.4:initialize 注入呈现规范;⭐r81 1.2.3:登录态;⭐r77c 1.2.1:密钥迁用户目录;⭐r76 1.2.0:多宿主中转
58
+ const ADAPTER_VERSION = "1.2.24"; /* ⭐R92b 1.2.23→1.2.24:EADDRINUSE 崩进程根修——R92 tryListen 重构成
59
+ ws({server:httpSrv}) 同端口复用时把 EADDRINUSE handler 误挂 httpSrv,而 ws 库会把底层 server 的 error 冒泡转发到
60
+ WebSocketServer 实例 emit(转发 listener 构造时先注册,wss 零 listener 同步 throw 崩进程,httpSrv 上后注册的 handler
61
+ 执行不到)——任何 17373 被占场景新实例必崩(WorkBuddy 实报 MCP -32000 Connection closed),修=handler 挂回 wss +
62
+ httpSrv 留兜底日志。 ⭐R89 1.2.22→1.2.23:卫星模式等待插件话术补探测链(⭐2026-10-23 用户实报「刚开机测栗子在吗没自动连上」,WorkBuddy 卫星只泛泛说「去浏览器确认插件启用+开关打开」——根因=卫星分支 step=1 hint 是写死文案,没接主 Broker 分支同款 disconnectDiagnosis() || extensionLaunchHint() 探测链,说不出「插件装在 Chrome 的 Profile 1,开那个窗口 5 秒自动连」的精确指引;卫星经 device.extension.state 已同步主 Broker lastClose(诊断可用)、Profile 探测是无状态扫盘(卫星可跑),两条都安全) ⭐R79 1.2.21→1.2.22:①适配器自更新——启动后台异步查云端最新 mjs(npmmirror→unpkg 双源 fallback),提取其中 ADAPTER_VERSION 比对,更新则 tmp+rename 原子覆盖自己(本地文件型宿主覆盖下载目录 mjs、npx 型覆盖 _npx 缓存内的自己,下次进程启动即新版;失败静默保持旧版、只升不降、24h 节流);②connection_status 的 adapter.update 透出自更新三态(checking/up-to-date/updated-pending-restart)——升级挂「栗子在吗」常径不设专门触发词,宿主报到表格渲染「已自动升级,重启宿主生效」;③新工具 leadsradar_get_latest_skills(12→13 工具版判据):技能落后时宿主取最新 SKILL.md 全文递给用户粘贴(技能库装在宿主手里无法代写)。云端生效前提=npm 发版 leadsradar-agent(自更新与技能下载的同一源头) ⭐R76 1.2.20→1.2.21:①connection_status 附 skills_latest 五技能版本表(识别技能落后+指路更新——宿主技能版本不可自动更,Agent 对照自检指路);②R74/R75 期间加的工具(add_monitor/pair_login/get_daily_report,10→12)未 bump 版本号,复测无法分辨 mjs 新旧,一并 bump(v1.2.21=12 工具版判据) ⭐R56b 1.2.19→1.2.20:卫星登录态透传四处(中转宿主 loggedIn 恒 null 根修)+中转连接文案说人话(去宿主名硬编码黑话) ⭐msg11 1.2.18→1.2.19:AI 唤醒探栗 MCP——connection_status(「栗子在吗」探活指令)时 TL MCP 未运行则自动拉起(读 NM 注册表拿 exe 路径,detached spawn;只在交互信号点拉,不在 agent 启动时拉以尊重「托盘退出」;未装静默缓存跳过) ⭐B7b-P1 1.2.17→1.2.18:结果认领闭环(三原则 b 协议化——插件是结果的持有者与通知源,宿主是可断线重来的消费者):①extension.hello 附未领取结果摘要 pendingResults[{taskId,mode,keyword,url,createdAt}](connection_status 的 extension.pendingResults 透出,AI 开工前即知有存货);②新 MCP 工具 leadsradar_claim_pending_result(领取插件侧已完成但无人认领的任务结果——超时/宿主重启后回来领,不占采集限额;走普通任务通道 mode=claim_pending_result,卫星模式自动兼容);③device.extension.state 卫星透传摘要;④step=3 hint 有存货时提示「先领取再决定重发」(配合 1.2.17 的超时文案,AI 标准动作=超时→领取→查库→才重发,根除额度双耗);⭐1.2.16→1.2.17:HTTP 模式默认端口 17374→17375(撞车根修:17374 是本地服务 Rust IPC 的 NDJSON 端口,agent HTTP 监听同端口时扣子等 HTTP 宿主把请求头打到 Rust → service.log 刷 bad json;改 17375 后两端口各归其主,已按 17374 配 URL 的宿主需改指 17375,可用 LEADSRADAR_AGENT_HTTP_PORT 覆盖)+ B3 断开原因钩子(插件断开的 close frame code+reason 不再丢弃:disconnectDiagnosis() 区分「开关关/桥不可用/浏览器被杀或插件被禁」给精准指引——旧版一律报「start chrome」实测无效指引;插件侧 reason 真源 local-agent-connector.ts stop()="LF Agent disabled"/stopForAvailability()="…not publicly available",SW 被杀无告别帧=1006;卫星经 device.extension.state 同步诊断);⭐A2/B7/B9 1.2.15→1.2.16:撞墙自修三连——①任务中断秒失败(插件断开即中止全部等待任务 TASK_ABORTED,旧版傻等 300s 超时,2026-10-16 杀浏览器实测抓到);②撞墙文案自动探测插件所在浏览器+profile(扫 Chrome/Edge 各 profile 的 Preferences 找 unpacked 探栗 path,给出精确 start 命令——旧版「start chrome 开默认 profile、插件装在 Profile 1 → 桥永远不起」实测 bug);③extension.account.update 登录态保鲜(解绑/登出实时同步,旧版冻结在握手值「解绑了仍显示已登录」实测);⭐r96ze 1.2.14→1.2.15:卫星状态谎报根修(用户实报「未批准的 dsh 显示已连接可以开工」)——statusSnapshot 卫星分支旧逻辑借中转通道状态(主 Broker 与插件的连接)冒充自身就绪,未批准卫星恒报 step=3;新逻辑 selfPaired 标志(收到 purpose="session" 挑战=已配对、pairing=失效回退,SW 挑战类型即配对态真值),step 判定通道死→1/未配对→2/配对+通道→3,step=2 hint 明示「批准前任务会被拒绝别急着开工」(任务层本有 PAIRING_REQUIRED 门禁无越权,仅状态误导);⭐r96y 1.2.13→1.2.14:欢迎文案 v2(「探一下」品牌动词融入全部示例,示例即激活词教学;删「不用记命令」与能力清单黑话)+ 对外文案 9 处旧菜单名「智能体接管」→「智能体连接」(r96r-5 改名时适配器侧漏网:hint/错误 message/description/log,宿主 AI 按旧名指路用户找不到菜单);⭐r96t 1.2.12→1.2.13:HOST_LABELS 删 stepfun=「阶跃 AI」(渠道下线:用户拍板排除——自定义 MCP 入口未确认开放+用户量知名度低);⭐r96g 1.2.11→1.2.12:HOST_LABELS 补 cherry=「Cherry Studio」/stepfun=「阶跃 AI」(CLI·进阶档扩容:codex 回归+cherry+stepfun,dsh 并入该档);⭐r96e 1.2.10→1.2.11:HOST_LABELS 补 trae=「Trae」(Trae/编程 CLI 宿主:项目 .trae/mcp.json 配置拉起,本仓 dogfooding 实测);⭐r96 1.2.10:HOST_LABELS 补 qwen-office=「千问办公」;⭐r93 1.2.9:dsh=「DeepSeek」;⭐r90c 1.2.8:HTTP 模式;⭐r86c 1.2.7:kimi-work;⭐r85b 1.2.6:doubao/feishu 多客户端各自 HOST;⭐r85 1.2.5:Windows 动态端口自愈;⭐r82 1.2.4:initialize 注入呈现规范;⭐r81 1.2.3:登录态;⭐r77c 1.2.1:密钥迁用户目录;⭐r76 1.2.0:多宿主中转 */
59
63
  const HOST_LABELS = {
60
64
  "doubao-work": "豆包工作",
61
65
  // ⭐r85 字节系多客户端实测(用户已验证豆包客户端支持 stdio 连接器,与豆包工作同源):
@@ -319,7 +323,13 @@ class AgentBroker {
319
323
  };
320
324
  const attach = (server, httpSrv) => {
321
325
  server.on("connection", (ws) => this.handleConnection(ws));
322
- httpSrv.on("error", (err) => {
326
+ /* ⭐R92b EADDRINUSE handler 必须挂 wss(server 实例):ws 库在 options.server 模式会把底层 httpSrv
327
+ 的 error 冒泡转发到 WebSocketServer 实例 emit,且该转发 listener 在构造时注册(先于 attach)——
328
+ wss 上零 listener 即同步 throw 崩进程,后注册的 httpSrv handler 永远执行不到。
329
+ (R92 把 handler 从 wss 迁到 httpSrv 引发本 bug:任何 17373 被占的场景新实例必崩,
330
+ WorkBuddy 实报 MCP -32000 Connection closed、手动复跑实证栈
331
+ "Emitted 'error' event on WebSocketServer instance") */
332
+ server.on("error", (err) => {
323
333
  if (err?.code === "EADDRINUSE") {
324
334
  if (this.relay) return; // ⭐r76 已进入卫星中转模式,不再抢端口
325
335
  if (listenAttempts > 20) {
@@ -350,6 +360,7 @@ class AgentBroker {
350
360
  log(`[lf-agent] Broker error: ${err?.message}`);
351
361
  }
352
362
  });
363
+ httpSrv.on("error", (err) => log(`[lf-agent] httpSrv error 兜底: ${err?.message}`)); // ⭐R92b 防漏网
353
364
  };
354
365
  const tryListen = () => {
355
366
  if (this.relay) return; // ⭐r76 卫星模式下不监听端口(主 Broker 负责插件连接)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leadsradar-agent",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "探栗(LeadsRadar)AI 助手接入包——让豆包工作 / WorkBuddy / Codex / Claude 直接管住你的小红书·抖音获客雷达,全程本机流转",
5
5
  "type": "module",
6
6
  "main": "leadsradar-agent.mjs",