weaver-work-cli 0.1.4 → 0.1.5

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 (87) hide show
  1. package/dist/internal/e10/request-runtime.js +3 -2
  2. package/dist/shortcuts/index.js +4 -0
  3. package/dist/shortcuts/meeting/continuation.js +70 -0
  4. package/dist/shortcuts/meeting/errors.js +63 -0
  5. package/dist/shortcuts/meeting/host.js +167 -0
  6. package/dist/shortcuts/meeting/index.js +123 -0
  7. package/dist/shortcuts/meeting/manifest.js +64 -0
  8. package/dist/shortcuts/meeting/operations/catalogs.js +58 -0
  9. package/dist/shortcuts/meeting/operations/change.js +242 -0
  10. package/dist/shortcuts/meeting/operations/conflicts.js +142 -0
  11. package/dist/shortcuts/meeting/operations/create.js +349 -0
  12. package/dist/shortcuts/meeting/operations/env.js +191 -0
  13. package/dist/shortcuts/meeting/operations/lifecycle.js +139 -0
  14. package/dist/shortcuts/meeting/operations/meetings.js +73 -0
  15. package/dist/shortcuts/meeting/operations/receipts.js +195 -0
  16. package/dist/shortcuts/meeting/operations/registry.js +47 -0
  17. package/dist/shortcuts/meeting/operations/rooms.js +132 -0
  18. package/dist/shortcuts/meeting/operations/shared.js +112 -0
  19. package/dist/shortcuts/meeting/operations/signs.js +41 -0
  20. package/dist/shortcuts/meeting/operations/types.js +25 -0
  21. package/dist/shortcuts/meeting/operations.js +19 -0
  22. package/dist/shortcuts/yimiaoban/continuation.js +70 -0
  23. package/dist/shortcuts/yimiaoban/errors.js +61 -0
  24. package/dist/shortcuts/yimiaoban/host.js +469 -0
  25. package/dist/shortcuts/yimiaoban/index.js +271 -0
  26. package/dist/shortcuts/yimiaoban/manifest.js +28 -0
  27. package/dist/shortcuts/yimiaoban/operations/file-user.js +288 -0
  28. package/dist/shortcuts/yimiaoban/operations/group-read.js +477 -0
  29. package/dist/shortcuts/yimiaoban/operations/group-write.js +591 -0
  30. package/dist/shortcuts/yimiaoban/operations/msg-parse.js +429 -0
  31. package/dist/shortcuts/yimiaoban/operations/msg-sync.js +519 -0
  32. package/dist/shortcuts/yimiaoban/operations/msg-write.js +593 -0
  33. package/dist/shortcuts/yimiaoban/operations/person.js +102 -0
  34. package/dist/shortcuts/yimiaoban/operations/registry.js +38 -0
  35. package/dist/shortcuts/yimiaoban/operations/session.js +437 -0
  36. package/dist/shortcuts/yimiaoban/operations/shared.js +236 -0
  37. package/dist/shortcuts/yimiaoban/operations/types.js +27 -0
  38. package/dist/shortcuts/yimiaoban/operations/write-util.js +78 -0
  39. package/dist/shortcuts/yimiaoban/operations.js +8 -0
  40. package/docs/_catalog.md +6 -0
  41. package/docs/meeting.md +48 -0
  42. package/docs/yimiaoban.md +86 -0
  43. package/package.json +1 -1
  44. package/skill-template/business-info.json +4 -1
  45. package/skill-template/domains/meeting.md +3 -0
  46. package/skill-template/domains/yimiaoban.md +21 -0
  47. package/skills/weaver-e10-calendar/SKILL.md +1 -0
  48. package/skills/weaver-e10-esb/SKILL.md +1 -0
  49. package/skills/weaver-e10-esb/references/source-manifest.json +3 -3
  50. package/skills/weaver-e10-hrm/SKILL.md +1 -0
  51. package/skills/weaver-e10-jiuchuanhui/SKILL.md +1 -0
  52. package/skills/weaver-e10-jucailin/SKILL.md +1 -0
  53. package/skills/weaver-e10-mail/SKILL.md +1 -0
  54. package/skills/weaver-e10-meeting/SKILL.md +106 -0
  55. package/skills/weaver-e10-meeting/product.json +8 -0
  56. package/skills/weaver-e10-meeting/references/meeting-change.md +67 -0
  57. package/skills/weaver-e10-meeting/references/meeting-create.md +52 -0
  58. package/skills/weaver-e10-meeting/references/meeting-lifecycle.md +57 -0
  59. package/skills/weaver-e10-meeting/references/meeting-queries.md +61 -0
  60. package/skills/weaver-e10-meeting/references/meeting-receipts-signs.md +48 -0
  61. package/skills/weaver-e10-meeting/references/meeting-update.md +7 -0
  62. package/skills/weaver-e10-meeting/references/source-manifest.json +50 -0
  63. package/skills/weaver-e10-plan/SKILL.md +1 -0
  64. package/skills/weaver-e10-plan/references/source-manifest.json +3 -3
  65. package/skills/weaver-e10-qiyecheng/SKILL.md +1 -0
  66. package/skills/weaver-e10-qiyecheng/references/source-manifest.json +3 -3
  67. package/skills/weaver-e10-shared/SKILL.md +4 -0
  68. package/skills/weaver-e10-skill-maker/SKILL.md +1 -0
  69. package/skills/weaver-e10-skill-maker/references/weaver-skill-style.md +1 -1
  70. package/skills/weaver-e10-wenshuding/SKILL.md +1 -0
  71. package/skills/weaver-e10-wenshuding/references/source-manifest.json +3 -3
  72. package/skills/weaver-e10-yepiaotong/references/source-manifest.json +5 -5
  73. package/skills/weaver-e10-yimiaoban/SKILL.md +104 -0
  74. package/skills/weaver-e10-yimiaoban/product.json +8 -0
  75. package/skills/weaver-e10-yimiaoban/references/ding-write.md +68 -0
  76. package/skills/weaver-e10-yimiaoban/references/error-codes.md +85 -0
  77. package/skills/weaver-e10-yimiaoban/references/field-resolution.md +46 -0
  78. package/skills/weaver-e10-yimiaoban/references/file-user-i18n.md +54 -0
  79. package/skills/weaver-e10-yimiaoban/references/group-read.md +55 -0
  80. package/skills/weaver-e10-yimiaoban/references/group-write.md +72 -0
  81. package/skills/weaver-e10-yimiaoban/references/msg-read.md +59 -0
  82. package/skills/weaver-e10-yimiaoban/references/msg-write.md +64 -0
  83. package/skills/weaver-e10-yimiaoban/references/person.md +44 -0
  84. package/skills/weaver-e10-yimiaoban/references/safety-boundaries.md +61 -0
  85. package/skills/weaver-e10-yimiaoban/references/session-sysmsg.md +47 -0
  86. package/skills/weaver-e10-yimiaoban/references/source-manifest.json +485 -0
  87. package/skills/weaver-e10-ziguanjia/SKILL.md +1 -0
@@ -977,7 +977,7 @@
977
977
  }
978
978
  },
979
979
  "artifactBaseline": {
980
- "aggregateSha256": "bb095c6a57fbdbd1ccbac4183556d5664e68944a8fd8d70e81a9c7f438c8e248",
980
+ "aggregateSha256": "8325423256231f274c6b39c6d8cdf47ca1cabfa49daf5f68ec48c5bc67ac1028",
981
981
  "files": [
982
982
  {
983
983
  "path": "docs/_catalog.md",
@@ -1012,8 +1012,8 @@
1012
1012
  {
1013
1013
  "path": "skills/weaver-e10-yepiaotong/SKILL.md",
1014
1014
  "role": "generated-skill-entry",
1015
- "size": 18169,
1016
- "sha256": "ce300d3ddcc207c5f48a14dd7d1453b045d17e5fe1ea59b29b3ada603039000a"
1015
+ "size": 18209,
1016
+ "sha256": "6845fec3dc0530efb09fa3ac51869db52e5c1fbaad8dbfe38bffe17279018d28"
1017
1017
  },
1018
1018
  {
1019
1019
  "path": "skills/weaver-e10-yepiaotong/references/invoice-browse-field-data.md",
@@ -1090,8 +1090,8 @@
1090
1090
  {
1091
1091
  "path": "test/skills/layout.test.ts",
1092
1092
  "role": "generated-test",
1093
- "size": 19086,
1094
- "sha256": "508bd7e3b8d4211766ce72e4616399f3fecc018dc3bb11878ffe151497cf2f0f"
1093
+ "size": 20585,
1094
+ "sha256": "9831a1168567bcd31c15f4014e44c06c3f0f8573db8783e0191dc3e259f3460e"
1095
1095
  }
1096
1096
  ]
1097
1097
  },
@@ -0,0 +1,104 @@
1
+ ---
2
+ name: weaver-e10-yimiaoban
3
+ display_name: 泛微易秒办
4
+ display_name_en: Weaver E10 Yimiaoban IM
5
+ description: 泛微 E10 易秒办即时通讯能力(单聊/群聊消息、发消息与必达、群组管理、会话与系统消息),通过 weaver-work-cli yimiaoban 命令执行。
6
+ description_zh: 泛微 E10 易秒办即时通讯能力(单聊/群聊消息拉取、发送/撤回/置顶/必达、群组管理、会话与系统消息),通过 weaver-work-cli yimiaoban 命令执行。
7
+ description_en: Weaver E10 Yimiaoban IM capabilities (single/group chat messages, sending/withdraw/pin/ding, group management, sessions and system messages), delivered through the weaver-work-cli yimiaoban command.
8
+ version: 1.0.0
9
+ author: 泛微网络科技股份有限公司
10
+ agent_created: true
11
+ requires:
12
+ bins: ["weaver-work-cli"]
13
+ cliHelp: "weaver-work-cli yimiaoban --help"
14
+ ---
15
+
16
+ # 泛微易秒办
17
+
18
+ **CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../weaver-e10-shared/SKILL.md`](../weaver-e10-shared/SKILL.md),其中包含安装、E10 认证、JSON 输出和高风险写入规则。若不存在则必须先执行 `weaver-work-cli skills install shared --skills-dir <当前Agent的Skills目录>`,若 CLI 未安装则先执行 `npm install -g weaver-work-cli`,安装或读取失败时必须停止执行。**
19
+
20
+ 共享规则覆盖命令可用性检查、E10 认证、JSON 输出契约、大结果渲染和高风险写入确认链,本技能不再重复。
21
+
22
+ 本技能覆盖易秒办(E10 即时通讯)业务域:**消息(msg)**、**必达(ding)**、**群组(group)**、**会话(session)**、**系统消息(sysmsg)**,以及支撑能力**人员解析(person)**、**文件上传/预览/下载(file)**、**用户状态(user)**、**i18n 标签(i18n)**。所有写操作走 prepare→apply 确认协议。
23
+
24
+ ## 命令入口
25
+
26
+ ```text
27
+ weaver-work-cli yimiaoban --help
28
+ weaver-work-cli yimiaoban schema
29
+ weaver-work-cli --json yimiaoban run <operation> --input -
30
+ ```
31
+
32
+ `schema` 是可用能力的唯一事实来源(含每个 operation 的 `inputSchema`、`risk`、`requiresConfirmation`)。禁止把本技能或源文档里的接口路径当成可直接调用的地址,也禁止把未出现在 `schema` 中的能力当作可用 operation。
33
+
34
+ ## 认证
35
+
36
+ 所有请求复用 `weaver-work-cli` 托管的 E10 会话(含 `eteamsid` 请求头),业务输入只描述业务对象和意图。禁止读取、列出、打印或解析 `.e10-cli` 等认证目录和文件;认证诊断只能通过 `weaver-work-cli auth` 系列命令、`weaver-work-cli doctor --e10` 和业务命令返回的 JSON 错误完成。登录失效时按共享规则引导用户执行 `weaver-work-cli auth login`,禁止猜域名或手工拼凭证。
37
+
38
+ ## Reference 路由表
39
+
40
+ 命中任一条件时,执行下一步前读取对应 reference。
41
+
42
+ | 触发条件 | Reference |
43
+ | --- | --- |
44
+ | 按姓名/工号/手机/邮箱解析人员,uid/cid 批量解析 | [`references/person.md`](references/person.md) |
45
+ | 名称 → ID 解析规则、同名消歧、接口间上下文传递契约 | [`references/field-resolution.md`](references/field-resolution.md) |
46
+ | 拉取单聊/群聊消息、群置顶消息、消息阅读状态(读) | [`references/msg-read.md`](references/msg-read.md) |
47
+ | 发送单聊/群聊消息(文本/图片/文件)、撤回、群消息置顶(写) | [`references/msg-write.md`](references/msg-write.md) |
48
+ | 必达消息:普通必达、已有消息转必达、仅未读/指定接收人(写) | [`references/ding-write.md`](references/ding-write.md) |
49
+ | 搜索群、群信息、群成员、群主/管理员、群存在性、群公告(读) | [`references/group-read.md`](references/group-read.md) |
50
+ | 建群、邀请、踢人、退群、解散、申请入群、改群属性/群名、群公告增改删(写) | [`references/group-write.md`](references/group-write.md) |
51
+ | 会话列表、系统消息分组/类型/消息查询 | [`references/session-sysmsg.md`](references/session-sysmsg.md) |
52
+ | 文件上传/预览/下载到本地、用户在线状态、i18n 标签翻译 | [`references/file-user-i18n.md`](references/file-user-i18n.md) |
53
+ | 易秒办红线(操作人字段、人名解析、id 边界、分页、展示完整)、写链停止条件 | [`references/safety-boundaries.md`](references/safety-boundaries.md) |
54
+ | 业务错误码含义与处理建议(群 12xx / 消息 15xx / 数据 13xx) | [`references/error-codes.md`](references/error-codes.md) |
55
+ | 源资料清单与 sha256(源 skill 更新检测用) | [`references/source-manifest.json`](references/source-manifest.json) |
56
+
57
+ ## 关键差异(必须先知道)
58
+
59
+ - **消息对象以 `msg` JSON 字符串 + `datas[].data[]` 行结构返回**:CLI 的 `msg.sync.*`/`msg.top.sync` 已把每条消息解析成结构化行(`sender/time/typeName/content/media/...`),`content` 为可读文本(@ 提及已替换、媒体显示为 `[图片]名称`/`[视频]名称`/`[文件]名称`、必达内容带 `[必达]` 前缀)。解析结果直接使用,不需要再本地拼装。
60
+ - **发送者「我」由 CLI 判定**:`sender` 与当前登录 uid(CLI 会话 `userId`)比对,自己发的消息返回「我」;他人优先消息内 `sname`、其次 hrm 姓名、最后回退 uid。
61
+ - **人名一律由 CLI 走 hrm 接口解析**(`/api/hrm/common/getEmployeeByIds`),本技能不展示也不依赖 IM 群成员 `name` 字段。群成员接口返回的 `name` 字段不可信且默认不请求。
62
+ - **uid/cid/群 id 都是 uint64**:JSON 中必须按字符串传(`"1788334281700000004"`),CLI 会把数字/逗号串统一归一,`0` 一律拒绝。
63
+ - **分页不自动翻页**:`msg.sync.*`/`session.list`/`sysmsg.*`/公告列表等每页默认 20(群搜索默认 100),单页最大 50(群搜索 200);Agent 只取单页,需要更多数据时用返回的 `nextStart`(消息类)/`nextMsgid`(会话类)显式请求下一页,绝不静默全量循环。消息类下一页会把边界那条重复返回,必须按 `msgid` 去重。
64
+ - **时间范围不是过滤条件**:单聊/群聊历史消息按**消息 id 区间**定位,`from/to` 时间会被 CLI 换算成 `[minId,maxId]` 区间;默认取当天。要"拉全部历史"必须显式给出 `from/to` 或 `latest:true`(仅最新一页)。`actionMsg.code=1303`(无聊天记录)按**成功空列表**返回,不报错,具体口径看返回的 `emptyReason`。
65
+ - **展示完整不截断**:消息文本有多长就展示多长,不得自行省略;正文换行/`|` 等原始字符在结构化字段中原样保留。渲染为表格/卡片时按既有消息展示红线转义 `|`、保留必达 `[必达]` 前缀与媒体可点击链接。
66
+ - **媒体需要登录态**:消息行里的 `media[].previewUrl/downloadUrl` 需登录态访问,直接嵌 Markdown 会 401;要真正查看图片/视频或取回附件,用 `yimiaoban.file.download` 落地到本地(`output` 为明确本地路径、父目录须存在、已存在则拒绝覆盖,图片会按文件头纠正扩展名)。
67
+ - **单页数量、超时与空白消息**:`num` 默认 20、单页上限 50;普通请求 15 秒超时即失败且不重试(上传 15/60 秒);全空白文本不算内容,禁止发送空白消息(返回 `content_required`)。
68
+ - 写操作一律 `prepare` → 向用户摘要 → 用户确认 → `apply`;`apply` 不接受手工构造的 continuation。
69
+
70
+ ## 写操作决策树(prepare → apply)
71
+
72
+ 易秒办所有写操作(发消息/撤回/置顶/必达/群组写操作)统一为两段式,均在 `schema` 中带 `requiresConfirmation`:
73
+
74
+ 1. 调用 `<op>.prepare`(只读校验:解析成员、读源消息、计算接收人),得到 `summary` + `continuation`。
75
+ 2. 向用户展示 `summary`(动作、目标、数量、差异/风险),请求明确确认。
76
+ 3. 用户确认后调用 `<op>.apply`,传 `{"confirm":true,"continuation":"<prepare 返回的 token>"}`。
77
+ 4. `apply` 返回 `partial` / `write_uncertain` 或网络中断时**立即停止,不自动重试**,先做一次只读回查(如群成员、消息是否已存在)再决定。
78
+
79
+ 任何一步出现登录失效/上下文变化(`context_mismatch`/`continuation_expired`)都回到第一步重新 prepare。
80
+
81
+ ## 失败处理
82
+
83
+ - 业务失败看 stderr JSON 的 `error.type` / `error.subtype` / `error.message`,不要用退出码 `0` 判断成功。
84
+ - `code=302` 或认证类错误:引导用户执行 `weaver-work-cli auth login`。
85
+ - 业务语义错误码:`1303` 表示无聊天记录(成功空列表,看 `emptyReason`);群不存在 `1209`;`members_resolve_failed`/`members_empty` 说明成员解析失败,向用户说明后请其决定是否 `removeFailed:true` 继续;其余码值对照 [`references/error-codes.md`](references/error-codes.md)。
86
+ - 展示给用户时保持"完整不截断"红线,参考 [`references/safety-boundaries.md`](references/safety-boundaries.md)。
87
+
88
+ ## 平台兼容
89
+
90
+ 命令示例必须同时兼容 Windows 与 macOS/Linux。简单 JSON 统一用 `--input-json`:
91
+
92
+ Windows PowerShell:
93
+
94
+ ```powershell
95
+ weaver-work-cli --json yimiaoban run yimiaoban.msg.sync.group --input-json '{"groupId":"1788334281700000004","num":20,"latest":true}'
96
+ ```
97
+
98
+ macOS/Linux(bash/zsh):
99
+
100
+ ```bash
101
+ weaver-work-cli --json yimiaoban run yimiaoban.msg.sync.group --input-json '{"groupId":"1788334281700000004","num":20,"latest":true}'
102
+ ```
103
+
104
+ 复杂 JSON 建议保存为 UTF-8 文件后按平台传给 `--input <file>`。
@@ -0,0 +1,8 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "product": "weaver-work-cli",
4
+ "productVersion": "0.1.3",
5
+ "packageName": "weaver-work-cli",
6
+ "command": "weaver-work-cli",
7
+ "nodeEngine": ">=18"
8
+ }
@@ -0,0 +1,68 @@
1
+ # 必达消息(ding,写)
2
+
3
+ ## 何时使用
4
+
5
+ 用户要发"必达/重要消息/Ding/应用通知"(红色必达卡片),或把群里已有消息转为必达、仅发给未读/指定人员。两段式写操作:
6
+
7
+ | operation 对 | 动作 |
8
+ | --- | --- |
9
+ | `yimiaoban.ding.send.prepare` / `.apply` | 发普通必达 或 已有消息转必达(走 `/api/em/msg/createDing`,非 executeIm) |
10
+
11
+ ## 场景与输入要点
12
+
13
+ 必达分两类,prepare 阶段二选一:
14
+
15
+ 1. **普通必达**:`txt` 必填(全空白文本会被拒绝);`groupId`(群必达)与 `toUid`(单聊必达)至少其一。
16
+ 2. **转必达**:`convertMsgid` = 源消息 `ser_msgid`,会把源消息内容原样转成必达卡片(文本/图片/文件/视频自动判别);无需 `txt`。群聊转必达传 `groupId`,**单聊转必达必须传 `toUid`+`toCid`**(`toCid` 用于按消息 id 拉取源消息,缺失会被拒绝:`to_cid_required`)。
17
+
18
+ 公共选项:
19
+
20
+ - `unreadOnly:true`(**仅群转必达**,单聊传会被拒绝:`unread_only_group_only`):只发给**未读**该消息的成员;若群里没有未读人员,**prepare 阶段**就会失败(`unread_empty`),需向用户说明是否改发全体/指定人员。
21
+ - `toUids:[...]`:群必达只发给指定 uid 列表(会先解析 cid,过滤发起者本人)。
22
+ - 不传 `unreadOnly`/`toUids` 时默认发给群内除本人外**全体成员**(自动解析成员)。
23
+ - `sendMsg`:0 不发短信 / 1 发短信(默认 1);`showType`:0 全体可见(默认)/ 1 仅发送人可见。
24
+
25
+ > **接收人集合在 prepare 阶段(只读)就已解析并写入确认快照**,摘要里带 `receiverSource`(全体成员/指定人员/仅未读人员/单聊对方)与 `receiverCount`;用户确认的就是这批人,apply 不再重新算人。
26
+ > 群成员内部复用 `getGroupUsers` 接口拉取(响应体兼容 `users`/`members`/`datas` 三种包裹层),成员 cid 走 hrm 解析(成员可能跨团队);必达接收人自动排除自己,`unreadOnly` 不自动回退全员。
27
+
28
+ ## 命令
29
+
30
+ Windows PowerShell:
31
+
32
+ ```powershell
33
+ weaver-work-cli --json yimiaoban run yimiaoban.ding.send.prepare --input-json '{"groupId":"1788334281700000004","txt":"请今天下班前确认三季度预算"}'
34
+ weaver-work-cli --json yimiaoban run yimiaoban.ding.send.prepare --input-json '{"groupId":"1788334281700000004","convertMsgid":"9000000000000000001","unreadOnly":true}'
35
+ ```
36
+
37
+ macOS/Linux(bash/zsh):
38
+
39
+ ```bash
40
+ weaver-work-cli --json yimiaoban run yimiaoban.ding.send.prepare --input-json '{"groupId":"1788334281700000004","txt":"请今天下班前确认三季度预算"}'
41
+ weaver-work-cli --json yimiaoban run yimiaoban.ding.send.prepare --input-json '{"groupId":"1788334281700000004","convertMsgid":"9000000000000000001","unreadOnly":true}'
42
+ ```
43
+
44
+ 向用户展示 prepare 的 `summary`(动作=发送必达/转必达、目标=群/单聊、是否全体/未读/指定人、是否发短信),确认后:
45
+
46
+ Windows PowerShell:
47
+
48
+ ```powershell
49
+ weaver-work-cli --json yimiaoban run yimiaoban.ding.send.apply --input-json '{"confirm":true,"continuation":"<prepare 返回的 continuation>"}'
50
+ ```
51
+
52
+ macOS/Linux(bash/zsh):
53
+
54
+ ```bash
55
+ weaver-work-cli --json yimiaoban run yimiaoban.ding.send.apply --input-json '{"confirm":true,"continuation":"<prepare 返回的 continuation>"}'
56
+ ```
57
+
58
+ ## 注意
59
+
60
+ - 必达是**高打扰**动作:默认全体成员 + 发短信,必须向用户明确说明接收范围和短信费用,经确认后才 apply。
61
+ - `unreadOnly:true` 转必达依赖目标消息存在且群内有未读人员;源消息找不到(`source_not_found`)或全员已读(`unread_empty`)都会失败,按错误向用户说明,不自动回退全员。
62
+ - apply 不确定(网络/超时)时停止,用 `yimiaoban.msg.top.sync`/拉群消息或系统消息只读回查必达是否已发出,**不自动重试**(避免重复必达)。
63
+
64
+ ## 失败处理
65
+
66
+ - `target_required`:缺群或单聊目标。`content_required`:普通必达缺 `txt` 且转必达缺 `convertMsgid`。
67
+ - `members_empty`:群里没有可接收成员(如只有本人)。
68
+ - 其余 confirmation/expired/mismatch 处理同 [`msg-write.md`](msg-write.md)。
@@ -0,0 +1,85 @@
1
+ # 易秒办错误码参考
2
+
3
+ 接口返回非 0 错误码(`actionMsg.code` / `ret`)时,据此向用户解释原因;成功码为 `0`。命令失败时 stderr JSON 的 `error.code` / `error.subtype` / `error.message` 与之对应,**不要用退出码 0 判断成功**。
4
+
5
+ ## 通用 / 基础
6
+
7
+ | 错误码 | 含义 |
8
+ |---:|---|
9
+ | 1014 | 服务器内部错误(常见于请求体缺必填协议字段,如 `trans_id`) |
10
+ | 1016 | 参数错误 |
11
+ | 1038 / 1039 | 解析错误 / 默认错误 |
12
+ | 1058 / 1059 | token 过期 / token 信息验证失败(登录态失效,重新登录) |
13
+ | 1060 | 禁止操作 |
14
+
15
+ ## 登录 / 用户
16
+
17
+ | 错误码 | 含义 |
18
+ |---:|---|
19
+ | 1100 / 1101 | token 错误 / token 过期 |
20
+ | 1106 / 1107 | 用户不存在 / 用户被禁用 |
21
+ | 1109 | 用户未登录 |
22
+
23
+ ## 群相关
24
+
25
+ | 错误码 | 含义 | 处理建议 |
26
+ |---:|---|---|
27
+ | 1200 | 群邀请人数超过最大限制 | 分批邀请 |
28
+ | 1201 | 一次获取群信息数量限制 | 减少 `groupIds` 数量 |
29
+ | 1203 | 一次踢人数量超过上限 | 分批踢人 |
30
+ | 1206 | 一次同步消息数量限制 | 降低 `num` |
31
+ | 1207 | 群成员人数为 0 | 确认群内是否仍有成员 |
32
+ | 1208 | 用户不是群成员 | 群 id 传错或操作者已不在群内 |
33
+ | 1209 | 群信息不存在 | 群 id 错误或群已解散 |
34
+ | 1210 | 没有权限 | 确认操作者是否为群主/管理员 |
35
+ | 1212 | 用户已存在(重复邀请) | 该成员已在群内 |
36
+ | 1218 | 邀请失败 | 被邀请人可能被 UCP「群邀请权限限制」拦截,需本人/管理员调整权限或改走申请入群 |
37
+ | 1220 | 超过管理员最大个数 | 减少管理员数量 |
38
+ | 1225 | 进群链接/二维码失效 | 让用户重新获取邀请入口 |
39
+ | 1226 | 群已销毁 | 无法再操作该群 |
40
+ | 1232 | 规则内人员不可主动退群 | 告知用户该群由规则维护 |
41
+ | 1233 / 1237 / 1246 | 部门群/全员群/事项群已存在 | 普通群建群不涉及;如需其他类型请在客户端操作 |
42
+ | 1269 / 1270 | 创建群聊功能关闭 / 超过每日建群上限 | 联系管理员或改日再试 |
43
+ | 1271 | 加入群需要对方同意 | 属于审批流程,等待管理员/群主处理 |
44
+
45
+ ## 消息相关
46
+
47
+ | 错误码 | 含义 | 处理建议 |
48
+ |---:|---|---|
49
+ | 1303 | 数据为空(无聊天记录) | **按成功空列表处理**,结合返回的 `emptyReason` 说明口径 |
50
+ | 1500 / 1501 | mask 无效 / 参数类型无效 | 检查输入字段 |
51
+ | 1502 | 无用户信息 | 检查 uid/cid |
52
+ | 1504 | 消息类型未定义 | 转必达等场景按源消息类型处理 |
53
+ | 1505 | 撤销超时 | 消息超过可撤回时限(回包 `time_out` 给出实际时限,CLI `withdrawInterval` 会带上) |
54
+ | 1506 | 消息不是自己撤回 | 只能撤回本人发送的消息 |
55
+ | 1507 | 编辑撤回超时 | 不支持再撤回 |
56
+ | 1511 / 1512 | 消息敏感词强控/弱控检测失败 | 调整内容后重试 |
57
+ | 1520 | 不允许删除未读会话 | 本技能不提供删除会话能力 |
58
+
59
+ ## 数据 / 其他
60
+
61
+ | 错误码 | 含义 |
62
+ |---:|---|
63
+ | 1307 | 用户不存在于 db |
64
+ | 1311 / 1312 / 1653 | 数据已存在 / 数据不存在 |
65
+ | 1654 | cid/uid 为 0(不允许,CLI 已在入参拦截) |
66
+ | 1655 | 请求超时 |
67
+ | 2000 | 网络异常,请稍后重试 |
68
+ | 2001 | json 解析失败 |
69
+
70
+ ## CLI 侧校验错误(`error.type=validation`)
71
+
72
+ | subtype | 含义与处理 |
73
+ |---|---|
74
+ | `forbidden_key` | 输入含操作人字段(`user`/`sender`/`creator` 等),去掉后重试 |
75
+ | `id_invalid` / `id_required` | uid/cid/群 id 缺失、为 0 或非数字 |
76
+ | `content_required` | 发送内容为空(含全空白文本)或必达既无 `txt` 也无 `convertMsgid` |
77
+ | `content_conflict` | 一次只允许一种媒体(`img` 与 `file` 不能同时传) |
78
+ | `members_resolve_failed` / `members_empty` | 成员 hrm 解析失败/为空,列出失败项后由用户决定是否 `removeFailed:true` |
79
+ | `members_empty` | 群内没有可接收成员(或只有本人) |
80
+ | `target_required` / `to_cid_required` | 必达缺少目标:群需 `groupId`,单聊需 `toUid`+`toCid` |
81
+ | `unread_only_group_only` | `unreadOnly` 仅支持群聊转必达 |
82
+ | `source_not_found` / `source_invalid` / `unread_empty` | 转必达源消息缺失/无法解析、群内无未读人员(不自动回退全员) |
83
+ | `self_not_included` | 建群成员必须包含操作者自己 |
84
+ | `output_required` / `output_parent_missing` / `output_exists` | `file.download` 输出路径缺失、父目录不存在、目标已存在(拒绝覆盖) |
85
+ | `context_mismatch` / `continuation_expired` / `target_changed` | 确认上下文变化/过期/目标变化,重新 `prepare` |
@@ -0,0 +1,46 @@
1
+ # 字段值解析与上下文传递
2
+
3
+ > 用户在对话里通常用**名称**描述关联对象("张三"、"项目攻坚群"),接口要的是 **ID**。只解析用户**明确提供**的字段值;未提及的字段不主动解析、不主动追问。
4
+
5
+ ## ID 判定规则
6
+
7
+ - 纯数字且长度 **>= 10** → 视为 ID,直接使用(按字符串传)。
8
+ - 其余(中文、字母、短数字) → 视为名称,走名称 → ID 解析。
9
+ - uid/cid/群 id/消息 id 都是 uint64,JSON 中必须写成字符串,`0` 一律非法。
10
+
11
+ ## 名称 → ID 解析
12
+
13
+ | 对象 | 解析方式 | 产出 |
14
+ | --- | --- | --- |
15
+ | 人员 | `yimiaoban.person.resolve`(姓名/工号/手机/邮箱模糊,走 hrm) | `uid`、`cid`(**成对使用**,对方 cid 可能与本人不同) |
16
+ | 人员(批量) | `yimiaoban.person.resolveByIds`(uid 列表 → 姓名/部门/cid) | 姓名、`cid`、部门、岗位 |
17
+ | 群聊 | `yimiaoban.group.search`(`name` + `precise:true` 精确匹配) | `id`(群 id) |
18
+ | 系统消息分组 | `yimiaoban.sysmsg.groupSearch`(名称模糊) | `groupId`、`typesIds` |
19
+
20
+ 解析优先级:① 本对话已出现的实体直接复用(已解析的 uid/cid、已拉取会话里的群 id);② 精确匹配;③ 模糊搜索 + 消歧。**禁止跳过前两步直接全量模糊搜索。**
21
+
22
+ ## 同名 / 模糊命中的消歧
23
+
24
+ 命中多个同名项时**必须先让用户选择**,禁止猜:
25
+
26
+ - 人员:`姓名(所属部门)`,如"张三(技术部)""张三(市场部)"。
27
+ - 群聊:`群名称(群 ID)`,如"测试群2(1787129175701000001)"。
28
+ - 候选超过 4 个只展示前 4 个并提示缩小范围。
29
+ - 人员候选优先按"是否出现在最近会话列表"排序,唯一命中时可用一句话确认。
30
+
31
+ ## 未匹配到(total=0)
32
+
33
+ 直接告知「人员名『XX』获取失败,请确认姓名是否输入错误」/「未找到该用户或者群聊,请检查名称是否正确」,**立即停止**。🔴 禁止通过回顾历史会话、拉会话列表、按相似名/部分名模糊搜索等方式去猜测、查找或推荐可能的人;未匹配就是未匹配。
34
+
35
+ ## 接口间上下文传递契约
36
+
37
+ 上游产出的字段直接喂给下游操作,禁止凭空构造或重新解析:
38
+
39
+ | 上游操作(产出) | 提取字段 | 下游操作(消费) |
40
+ | --- | --- | --- |
41
+ | `yimiaoban.person.resolve` | `uid`、`cid` | `msg.send.single`(`toUid`/`toCid`)、`msg.sync.single`(`fromUid`/`fromCid`)、`ding.send`(单聊 `toUid`/`toCid`)、`group.invite`/`group.kick`/`group.create`(`users`) |
42
+ | `yimiaoban.group.search` / `group.info` | `groupId` | `msg.sync.group`、`msg.send.group`、`ding.send`(群)、`group.users`/`group.admins`/`group.invite`/`group.kick`/`group.exit`/`group.destroy`/`group.modify`/`group.rename`/`group.announce.*` |
43
+ | `yimiaoban.session.list` | 会话类型、`fuser.uid/cid`(单聊)、`lastMsgid`(翻页锚点)、系统会话 `group` | `msg.sync.single` / `msg.sync.group` / `sysmsg.query`;翻页传 `msgid` |
44
+ | `yimiaoban.msg.sync.*` / `msg.top.sync` | `messages[].msgid`(`ser_msgid`)、`media[].fileId`、`nextStart` | `msg.withdraw`(`msgid`)、`msg.top.set`(`msgid`)、`ding.send`(`convertMsgid`)、`file.download`(`fileId`+`msgid`)、下一页 `start`/`startId` |
45
+ | `yimiaoban.sysmsg.groupSearch` / `sysmsg.typeSync` | `groupId`、`typeId` | `sysmsg.query`(`group`/`type`) |
46
+ | `yimiaoban.file.upload` | `fileObj.id` | 发消息的 `img`/`file`(或直接用本地路径让 CLI 内部上传) |
@@ -0,0 +1,54 @@
1
+ # 文件上传 / 媒体预览 / 用户状态 / i18n 标签
2
+
3
+ ## 何时使用
4
+
5
+ 发图/发文件前把本地文件传到 E10 文件服务;给图片/视频拼可访问的预览与下载链接;查某人各端在线状态;翻译 IM 里的 i18n 标签 id。
6
+
7
+ | operation | 用途 |
8
+ | --- | --- |
9
+ | `yimiaoban.file.upload` | 上传本地文件(module=im),返回 fileObj + 消息对象形态(供 `img`/`file` 引用) |
10
+ | `yimiaoban.file.preview` | 生成图片/视频预览与下载 URL(需登录态访问;图片支持 small/large/original) |
11
+ | `yimiaoban.file.download` | 把消息里的图片/视频/文件**下载到本地**(需登录态;父目录须存在、拒绝覆盖) |
12
+ | `yimiaoban.user.state` | 查指定人员各在线设备状态(sub_state 强制 0 不订阅) |
13
+ | `yimiaoban.i18n.labels` | 批量翻译国际化标签 id → 当前语言文案 |
14
+
15
+ ## 输入要点
16
+
17
+ - `file.upload`:`file` 本地路径(兼容旧名 `filePath`)+ 可选 `name`/`shareGroup`(发群消息用,兼容 `shareGroups`)/`shareUsers`(uid 数组,发单聊用)/`permission`。返回 `fileObj`、`img`、`file` 两种消息对象形态;发消息也可以直接传本地路径让 CLI 内部上传。
18
+ - `file.preview`:需要 `fileId` + `msgid` + `kind`(img/video) + 场景(`groupId` 或 `toUid`+`toCid`);`imgFormat` small/large/original。返回的是**绝对地址**(含 baseUrl),但需要登录态才能访问,直接嵌 Markdown 会 401。
19
+ - `file.download`:`fileId` + `msgid` + `output`(明确的本地文件路径)+ 场景(`groupId` 或 `toUid`+`toCid`);可选 `kind`(img/video/file,默认 img)、`imgFormat`(默认 small,要原图传 original)。父目录必须存在,目标文件已存在会拒绝覆盖;下载内容若是图片且扩展名与文件头不符会自动纠正(如实际为 PNG 时 `.jpg` → `.png`,返回 `renamedFrom`)。
20
+ - 用户状态:`users` uid 数组(不要写成 `uids`)+ 可选 `devType` 过滤;`mask` 控制返回字段(默认 7)。解析失败的 uid 需确认后传 `removeFailed:true` 跳过。
21
+ - 上传/预览涉及**本地文件**:必须先与用户确认文件内容可能进入大模型上下文、并会上传到 E10 文件服务。
22
+ - `file.download` 会把 E10 上的附件/媒体落到本地磁盘:下载前同样要与用户确认目标路径,下载完成后才可把本地文件当作可查看内容(不要先假装看过)。
23
+
24
+ ## 命令
25
+
26
+ Windows PowerShell:
27
+
28
+ ```powershell
29
+ weaver-work-cli --json yimiaoban run yimiaoban.file.upload --input-json '{"file":"C:\\tmp\\方案.docx","name":"方案.docx"}'
30
+ weaver-work-cli --json yimiaoban run yimiaoban.file.download --input-json '{"fileId":"FILE1","msgid":"1788334281700000004","kind":"img","groupId":"1788334281700000004","output":"C:\\tmp\\photo.png"}'
31
+ weaver-work-cli --json yimiaoban run yimiaoban.i18n.labels --input-json '{"ids":["1001","1002"]}'
32
+ ```
33
+
34
+ macOS/Linux(bash/zsh):
35
+
36
+ ```bash
37
+ weaver-work-cli --json yimiaoban run yimiaoban.file.upload --input-json '{"file":"/tmp/方案.docx","name":"方案.docx"}'
38
+ weaver-work-cli --json yimiaoban run yimiaoban.file.download --input-json '{"fileId":"FILE1","msgid":"1788334281700000004","kind":"img","groupId":"1788334281700000004","output":"/tmp/photo.png"}'
39
+ weaver-work-cli --json yimiaoban run yimiaoban.i18n.labels --input-json '{"ids":["1001","1002"]}'
40
+ ```
41
+
42
+ ## 输出处理
43
+
44
+ - `file.upload` 返回两种形态:`fileObj`(含 id/name/type/size,图片含宽高)与可直接嵌入消息的 img/file 对象。
45
+ - `file.download` 返回落地后的 `output`(可能因扩展名纠正与入参不同)、`size`,以及纠正时的 `renamedFrom`。
46
+ - 消息拉取里已经自带媒体 URL,一般不需要单独调 `file.preview`(仅当历史消息缺 URL 或要换规格时用);要真正看到内容用 `file.download`。
47
+ - 下载的本地文件路径可直接用 Markdown 图片语法展示(如 `![a.png](绝对路径)`)。
48
+
49
+ ## 失败处理
50
+
51
+ - 文件不存在/过大/类型不支持:按业务错误信息告知用户。
52
+ - 上传到一半网络中断:CLI 不会假装成功,重试需重新 upload(上传本身无副作用)。
53
+ - 下载失败(401/HTTP 非 200):按错误信息告知用户先完成 `weaver-work-cli auth login`;`output_exists` 时换路径,不覆盖既有文件。
54
+ - 只读/上传操作无确认链;认证失败参照共享规则。
@@ -0,0 +1,55 @@
1
+ # 群组读取(搜索 / 信息 / 成员 / 公告)
2
+
3
+ ## 何时使用
4
+
5
+ 找群、看群资料、拉群成员名单、找群主/管理员、判断群是否存在、读群公告。只读操作:
6
+
7
+ | operation | 用途 |
8
+ | --- | --- |
9
+ | `yimiaoban.group.search` | 按条件搜群(`name`/`type`/`members`/`owner`/`creator`/`today`/`yesterday`/`createBegin`/`createEnd`,服务端过滤) |
10
+ | `yimiaoban.group.info` | 群基础信息(`groupIds` 数组或 `groupId`,支持批量) |
11
+ | `yimiaoban.group.users` | 群成员列表(`groupId`;`syncType` 0 全量/1 增量 + `clientUc` 游标) |
12
+ | `yimiaoban.group.admins` | 群主/管理员批量获取(`mask` 位 1=群主/负责人、2=管理员,默认 3) |
13
+ | `yimiaoban.group.exist` | 群是否存在(ret=0 存在;1209 不存在) |
14
+ | `yimiaoban.group.userExist` | 某用户是否在群内 |
15
+ | `yimiaoban.group.announce.get` | 群公告(`aid` 不传/0 = 最新) |
16
+ | `yimiaoban.group.announce.list` | 公告列表(id 降序,`end_flag` 表示是否还有下一页) |
17
+
18
+ ## 输入要点
19
+
20
+ - 搜群至少给一个条件;`type` 常见 1 普通/6 部门/7 全员。搜索/过滤全部由服务端完成,**禁止本地过滤结果**。
21
+ - `group.users` 默认返回 uid/cid/角色/入群时间(mask=142),**默认不含 `name` 位**;姓名由 CLI 逐条走 hrm 解析后回填 `name`。不要依赖接口自身的 name 字段。
22
+ - 成员增量同步:拿到 `server_uc` 游标后传 `syncType:1` + `clientUc` 拉增量。
23
+ - `group.announce.list` 单页若干条;还有更多时用返回的 id 锚点继续请求下一页。
24
+ - `group.announce.get` 返回 `found`(是否查到公告)+ `aid`/`annouce`/`addUserName`/`time`/`updateTime`/`mustRead`/`related`;查不到时为 `found:false`(不是报错)。
25
+
26
+ ## 命令
27
+
28
+ Windows PowerShell:
29
+
30
+ ```powershell
31
+ weaver-work-cli --json yimiaoban run yimiaoban.group.search --input-json '{"members":true,"pageSize":100}'
32
+ weaver-work-cli --json yimiaoban run yimiaoban.group.users --input-json '{"groupId":"1788334281700000004"}'
33
+ weaver-work-cli --json yimiaoban run yimiaoban.group.info --input-json '{"groupIds":["1788334281700000004"]}'
34
+ ```
35
+
36
+ macOS/Linux(bash/zsh):
37
+
38
+ ```bash
39
+ weaver-work-cli --json yimiaoban run yimiaoban.group.search --input-json '{"members":true,"pageSize":100}'
40
+ weaver-work-cli --json yimiaoban run yimiaoban.group.users --input-json '{"groupId":"1788334281700000004"}'
41
+ weaver-work-cli --json yimiaoban run yimiaoban.group.info --input-json '{"groupIds":["1788334281700000004"]}'
42
+ ```
43
+
44
+ ## 输出处理
45
+
46
+ - 群搜索结果量大时按共享规则汇总渲染(列群名/id/人数/类型),不要整表倾倒。
47
+ - 成员列表渲染姓名走 `data.members[].name`(hrm 解析结果),角色取 `roleName`、入群时间取 `addTime`。展示大群成员时按需分页输出。
48
+ - 「谁在群里」用 `group.userExist`:返回 `users[].inGroup` 布尔,便于区分在群/不在群。
49
+ - 群公告内容同样"完整展示不截断"。
50
+
51
+ ## 失败处理
52
+
53
+ - `1209`/群不存在:告知用户该群不存在或已解散。
54
+ - 空条件(`cond_required`):补搜索条件。
55
+ - 只读操作,无确认链;认证失败参照共享规则。
@@ -0,0 +1,72 @@
1
+ # 群组写操作(建群 / 邀请 / 踢人 / 退群 / 解散 / 入群 / 改群 / 公告)
2
+
3
+ ## 何时使用
4
+
5
+ 用户要建群、拉人进群、踢人、退群、解散群、申请入群、改群名/群属性/转让群主、写群公告。全部是两段式写操作(prepare→apply):
6
+
7
+ | operation 对 | 动作 |
8
+ | --- | --- |
9
+ | `yimiaoban.group.create.prepare` / `.apply` | 创建普通群 |
10
+ | `yimiaoban.group.invite.prepare` / `.apply` | 邀请成员入群 |
11
+ | `yimiaoban.group.kick.prepare` / `.apply` | 踢出群成员 |
12
+ | `yimiaoban.group.exit.prepare` / `.apply` | 退出群聊 |
13
+ | `yimiaoban.group.destroy.prepare` / `.apply` | **解散群聊**(仅群主,不可恢复) |
14
+ | `yimiaoban.group.join.prepare` / `.apply` | 申请加入群聊(`groupId` 或 `token`) |
15
+ | `yimiaoban.group.modify.prepare` / `.apply` | 批量改群属性(人数/开关/管理员/转让群主等,batModGroupInfo) |
16
+ | `yimiaoban.group.rename.prepare` / `.apply` | 单字段改群信息(群名/历史/群主/显示/打扰/标记/gtid) |
17
+ | `yimiaoban.group.announce.modify.prepare` / `.apply` | 新增/修改/删除群公告 |
18
+
19
+ ## 输入要点
20
+
21
+ - `users` 可以是数组 `["uid1","uid2"]` 或逗号串 `"uid1,uid2"`。成员先经 hrm 解析出 uid+cid;解析失败且未传 `removeFailed:true` 会中止并列出失败成员,由用户决定是否移除失败项继续。
22
+ - 建群:**`users` 必须包含操作者自己**(否则返回 `self_not_included`,服务端会把操作者设为群主);`name` 缺省时 CLI 按"自己的姓名 + 另外最多 4 个成员姓名"生成群名(可传 `names` 与 `users` 顺序一一对应覆盖姓名);`admins` 指定管理员(解析失败会中止并列出失败人)。
23
+ - 解散群风险最高,prepare 的 summary 必须向用户明确"不可恢复、仅群主可解散"。
24
+ - `group.modify` 传字段即改该字段:`num` 人数、`switchs`(`flag:onoff` 逗号串,如 `1:1,8:0`)、`admins`(新增管理员,字段 `admins`)、`delAdmins`(移除管理员,字段 `del_admins`,**两者语义不同不能混用**)、`creator` 转让群主、`history`、`gtId` 等;**禁止传操作人字段**(操作者由会话 eteamsid 识别)。管理员/群主解析失败会中止,确认移除后可传 `removeFailed:true`。
25
+ - `group.rename` 一次只能改一项(顺序枚举 mask):`name`/`history`/`host`(转让群主,uid)/`display`/`msgSetting`/`mark`/`gtid`;`announce`/`type`/`state` 被禁用(公告走 `group.announce.modify`,type/state 属高危)。
26
+ - 建群成功返回新建群 `groupId`(服务端字段 `group_id`)与 `rawData`;`group.announce.modify` 新增/修改返回 `aid`,删除返回被删除的 `aid` 且 `deleted:true`。
27
+ - 公告:`annouce` 内容;`aid` 缺省/0=新增、非 0=修改、`del:true`+`aid`=删除。`notice` 0 发通知(默认)/1 不发/2 发并@全体;`fmark` 新人必看。
28
+ - 群 id 一律字符串非 0。
29
+
30
+ ## 命令
31
+
32
+ Windows PowerShell:
33
+
34
+ ```powershell
35
+ weaver-work-cli --json yimiaoban run yimiaoban.group.invite.prepare --input-json '{"groupId":"1788334281700000004","users":["100234","100235"]}'
36
+ weaver-work-cli --json yimiaoban run yimiaoban.group.rename.prepare --input-json '{"groupId":"1788334281700000004","name":"季度评审群"}'
37
+ ```
38
+
39
+ macOS/Linux(bash/zsh):
40
+
41
+ ```bash
42
+ weaver-work-cli --json yimiaoban run yimiaoban.group.invite.prepare --input-json '{"groupId":"1788334281700000004","users":["100234","100235"]}'
43
+ weaver-work-cli --json yimiaoban run yimiaoban.group.rename.prepare --input-json '{"groupId":"1788334281700000004","name":"季度评审群"}'
44
+ ```
45
+
46
+ 向用户展示 `summary`(动作/群/人数/变更字段),确认后:
47
+
48
+ Windows PowerShell:
49
+
50
+ ```powershell
51
+ weaver-work-cli --json yimiaoban run yimiaoban.group.invite.apply --input-json '{"confirm":true,"continuation":"<prepare 返回的 continuation>"}'
52
+ ```
53
+
54
+ macOS/Linux(bash/zsh):
55
+
56
+ ```bash
57
+ weaver-work-cli --json yimiaoban run yimiaoban.group.invite.apply --input-json '{"confirm":true,"continuation":"<prepare 返回的 continuation>"}'
58
+ ```
59
+
60
+ ## 注意
61
+
62
+ - 踢人、解散、转让群主都是不可逆/高影响动作,summary 必须讲清对象与后果,等用户明确确认。
63
+ - 退群/解散/踢人前可先 `group.users` 只读回查当前成员与身份,避免误操作。
64
+ - apply 阶段只传 `confirm:true` + continuation;业务参数以 prepare 快照为准。
65
+ - 不确定结果(partial/超时)时**不自动重试**,先 `group.info`/`group.users` 回查实际状态。
66
+
67
+ ## 失败处理
68
+
69
+ - `members_resolve_failed`:列出解析失败成员,问用户是否 `removeFailed:true`。
70
+ - `members_empty`:无有效成员。
71
+ - 无权限(非群主执行解散/转让等)会返回业务错误,告知用户权限不足。
72
+ - 其余 continuation 类错误同 [`msg-write.md`](msg-write.md)。
@@ -0,0 +1,59 @@
1
+ # 消息读取(拉取聊天/置顶/阅读状态)
2
+
3
+ ## 何时使用
4
+
5
+ 用户要"拉我和某人的聊天记录""拉某群的聊天消息""看群置顶""谁读了/没读某条消息"。覆盖只读操作:
6
+
7
+ | operation | 用途 |
8
+ | --- | --- |
9
+ | `yimiaoban.msg.sync.single` | 拉单聊消息(必填 `fromUid`+`fromCid`,为**对方**身份) |
10
+ | `yimiaoban.msg.sync.group` | 拉群聊消息(必填 `groupId`;type=0 由 CLI 固定,无需传) |
11
+ | `yimiaoban.msg.top.sync` | 群置顶消息摘要 + 内容(必填 `groupId`) |
12
+ | `yimiaoban.msg.read.single` | 单聊消息阅读状态(`msgids`=自己发出 / `recvMsgids`=自己接收) |
13
+ | `yimiaoban.msg.read.group` | 群消息阅读汇总(每条已读/未读情况) |
14
+ | `yimiaoban.msg.read.group.detail` | 群阅读详情(unread/read 数 + 每人状态,支持分页) |
15
+
16
+ ## 输入要点
17
+
18
+ - `fromUid`/`fromCid`/`groupId` 必须是**字符串数字**,禁止 `0`。对方 uid/cid 用 `yimiaoban.person.resolve`(按姓名/工号/手机/邮箱)先拿到,不要猜。
19
+ - 单页 `num` 默认 20、上限 50。**CLI 只返回一页**,不自动翻页。
20
+ - 时间范围:`from`/`to` 支持 `YYYY-MM-DD`、`YYYY-MM-DD HH:mm:ss`、unix 秒。默认当天。要跨天拉取必须显式给 `from`/`to`(内部换算成消息 id 区间);给 `latest:true` 则忽略日期拉最新一页。
21
+ - 显式 id 区间优先级最高:单聊用 `start`/`end`,群聊用 `startId`/`endId`(消息 id 即 `ser_msgid`,取自上页首/尾行)。
22
+ - `imgFormat`:`small`(默认)`large`/`original`,决定图片预览 URL 规格。
23
+
24
+ ## 命令
25
+
26
+ Windows PowerShell:
27
+
28
+ ```powershell
29
+ weaver-work-cli --json yimiaoban run yimiaoban.msg.sync.group --input-json '{"groupId":"1788334281700000004","num":20,"latest":true}'
30
+ weaver-work-cli --json yimiaoban run yimiaoban.msg.sync.single --input-json '{"fromUid":"100234","fromCid":"102","from":"2026-08-01","to":"2026-08-31"}'
31
+ weaver-work-cli --json yimiaoban run yimiaoban.msg.top.sync --input-json '{"groupId":"1788334281700000004"}'
32
+ ```
33
+
34
+ macOS/Linux(bash/zsh):
35
+
36
+ ```bash
37
+ weaver-work-cli --json yimiaoban run yimiaoban.msg.sync.group --input-json '{"groupId":"1788334281700000004","num":20,"latest":true}'
38
+ weaver-work-cli --json yimiaoban run yimiaoban.msg.sync.single --input-json '{"fromUid":"100234","fromCid":"102","from":"2026-08-01","to":"2026-08-31"}'
39
+ weaver-work-cli --json yimiaoban run yimiaoban.msg.top.sync --input-json '{"groupId":"1788334281700000004"}'
40
+ ```
41
+
42
+ ## 输出处理
43
+
44
+ - `data.messages[]` 是已解析的结构化行:`sender`(姓名,走 hrm)、`time`、`typeName`(文本/图片/视频/文件…)、`content`(完整文本,不截断)、`media`(图片/视频/文件的预览与下载 URL,需登录态访问)、`must`(必达标记,`true` 展示加 `[必达]` 前缀)等。
45
+ - `sender` 为自己时显示「我」(CLI 用会话 uid 判定);媒体消息的 `content` 形如 `[图片]a.png` / `[视频]b.mp4` / `[文件]c.pdf`,同时单列 `fileName` 便于渲染。
46
+ - 展示整段消息**不自行截断**;若将多行渲染进表格,保留换行提示、把 `|` 转义,媒体链接保留为可点击的 Markdown 链接。
47
+ - `data.hasMore` 为 `true` 时用返回的 `data.nextStart`(本页最小 `ser_msgid`)作为下页 `start`/`startId` 再请求;**服务端会重复返回该边界消息,务必按 `msgid` 去重**。除非用户明确要连续翻页,否则只交付当前页并告知还有更早内容。
48
+ - `data.empty=true` 表示本次为空页(`actionMsg.code=1303`):按成功处理,用 `data.emptyReason` 向用户说明口径(当天无消息 / 该时间范围无消息 / 该会话暂无任何消息记录),不要当报错重试。
49
+
50
+ ## 注意
51
+
52
+ - 消息内容可能较长(含敏感业务信息),返回内容会进入大模型上下文;拉取范围默认当天,跨天/全量必须经用户确认。
53
+ - 群聊必须给 `type=0` 是内部固定行为,接口文档要求,无需业务传入。
54
+
55
+ ## 失败处理
56
+
57
+ - `error.code=1303` 语义是"无聊天记录",按成功空列表处理(见 `emptyReason`),不要报错重试。
58
+ - 群不存在/无权限会返回 `1209` 或业务错误,向用户说明该群不可读。
59
+ - `context_mismatch`/认证错误:提示先 `weaver-work-cli auth login` 再重试。