weaver-work-cli 0.1.32 → 0.1.36

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 (211) hide show
  1. package/README.md +2 -2
  2. package/dist/chunks/{archive-UMGX72K6.js → archive-XBVH7JU7.js} +2 -2
  3. package/dist/chunks/{archive-oa-N2IYBLF3.js → archive-oa-MZM3EKFQ.js} +2 -2
  4. package/dist/chunks/{asset-GLEGKFG5.js → asset-4XO7UOUW.js} +2 -2
  5. package/dist/chunks/{attachment-content-AQNX5N3S.js → attachment-content-VXSWANAC.js} +3 -2
  6. package/dist/chunks/{blog-E44OTVDA.js → blog-PGZKOPSC.js} +2 -2
  7. package/dist/chunks/{caizhilian-DQUFZXZL.js → caizhilian-BH4ZVGUN.js} +2 -2
  8. package/dist/chunks/{calendar-JKPIRKFD.js → calendar-MXEMTIO4.js} +2 -2
  9. package/dist/chunks/{chunk-QWY6PGL6.js → chunk-2LV74IWP.js} +361 -56
  10. package/dist/chunks/chunk-3SO6QL6U.js +73 -0
  11. package/dist/chunks/chunk-5DQEEGCC.js +229 -0
  12. package/dist/chunks/{chunk-G3QJULO2.js → chunk-6LLJFKJE.js} +1 -1
  13. package/dist/chunks/{chunk-C6R3B2ML.js → chunk-BPE37FPB.js} +35 -7
  14. package/dist/chunks/chunk-BYATLLEF.js +68 -0
  15. package/dist/chunks/chunk-BYBSCN4X.js +932 -0
  16. package/dist/chunks/{chunk-CVZ2JOSW.js → chunk-F746NKNF.js} +1 -1
  17. package/dist/chunks/{chunk-GCG2NMWR.js → chunk-HXJQI5NM.js} +4 -2
  18. package/dist/chunks/{chunk-YRVDW4WN.js → chunk-I6QGIBDM.js} +2 -2
  19. package/dist/chunks/{chunk-H7J4DC5R.js → chunk-JCSN3JGM.js} +2 -2
  20. package/dist/chunks/{chunk-2GA5ZIQL.js → chunk-JNG42JKG.js} +30 -1
  21. package/dist/chunks/{chunk-DW6AUUKS.js → chunk-JUXVYKII.js} +9 -4
  22. package/dist/chunks/{chunk-6RKD4DRZ.js → chunk-JYKABYCV.js} +2 -2
  23. package/dist/chunks/{chunk-6EFWDL7Y.js → chunk-NCOVUAZK.js} +2 -2
  24. package/dist/chunks/{chunk-E4Z23GHM.js → chunk-QHFANTX7.js} +1114 -904
  25. package/dist/chunks/{ebuilder-form-V5FG2EHC.js → chunk-QYGO5EE2.js} +22 -1148
  26. package/dist/chunks/{chunk-IURUFGZK.js → chunk-T72N74ZT.js} +50 -33
  27. package/dist/chunks/{chunk-H6XSTSLM.js → chunk-TC6MZAO3.js} +137 -204
  28. package/dist/chunks/{chunk-WKI2FBIQ.js → chunk-VPUTVEMC.js} +737 -341
  29. package/dist/chunks/{chunk-WSKBSQ2U.js → chunk-VPXOPQJI.js} +2 -2
  30. package/dist/chunks/chunk-WXFPWCXG.js +774 -0
  31. package/dist/chunks/{chunk-4YC43QQ4.js → chunk-XMGSYD6S.js} +4 -4
  32. package/dist/chunks/conflict-JAB2LJEZ.js +21 -0
  33. package/dist/chunks/continuation-RN6PZN2M.js +11 -0
  34. package/dist/chunks/contract-XI2EEIZU.js +9110 -0
  35. package/dist/chunks/cowork-SCPGLBA4.js +2527 -0
  36. package/dist/chunks/ebuilder-form-EYLHNOTA.js +121 -0
  37. package/dist/chunks/{ehr-HMFY6VIL.js → ehr-EAP77IMT.js} +1344 -27
  38. package/dist/chunks/{esb-ZYSVB7SG.js → esb-2TGGXEE7.js} +4 -4
  39. package/dist/chunks/{fna-B7RKPAZD.js → fna-2X7ZE7BU.js} +13 -8
  40. package/dist/chunks/{host-OCH2BCCV.js → host-C6EL2RKL.js} +3 -3
  41. package/dist/chunks/{host-45WED2KK.js → host-I4NRK4MX.js} +3 -3
  42. package/dist/chunks/{host-I4Z6BFYX.js → host-Q4LZGCRU.js} +3 -3
  43. package/dist/chunks/host-UEI5FGDM.js +23 -0
  44. package/dist/chunks/{host-KNZ52LJZ.js → host-XCLDDXKQ.js} +3 -3
  45. package/dist/chunks/{hrm-2KAZGUHI.js → hrm-YXERJM76.js} +3 -3
  46. package/dist/chunks/{im-ACJJWH4U.js → im-A4VZN2TQ.js} +88 -12
  47. package/dist/chunks/{invoice-ZK3WCX2U.js → invoice-2Z6YPMIS.js} +3 -3
  48. package/dist/chunks/{jiuchuanhui-5PQD3IL2.js → jiuchuanhui-AR5GMKZB.js} +2 -2
  49. package/dist/chunks/{lazy-dispatch-JQXBW3GM.js → lazy-dispatch-QXW7P4X3.js} +4 -4
  50. package/dist/chunks/{mail-S2HDDXO2.js → mail-7GZ6CPBJ.js} +45 -24
  51. package/dist/chunks/{meeting-QVN3I37L.js → meeting-3NMGA3MB.js} +278 -43
  52. package/dist/chunks/{okr-QNG4VC2Q.js → okr-BZ6XUOAG.js} +2 -2
  53. package/dist/chunks/operations-5QL3AECO.js +11 -0
  54. package/dist/chunks/{plan-A25EMW6U.js → plan-DR5CMUYP.js} +2 -2
  55. package/dist/chunks/{project-G6XV66DZ.js → project-6J63MK33.js} +2 -2
  56. package/dist/chunks/{registry-DC6KR3NH.js → registry-KDD7DHNK.js} +4 -4
  57. package/dist/chunks/{registry-2VLUAESA.js → registry-OZSMDVPP.js} +2 -2
  58. package/dist/chunks/{registry-7C5UMIPL.js → registry-TKX2E7C7.js} +2 -2
  59. package/dist/chunks/{registry-TI3CIUXF.js → registry-VRTNC6UR.js} +8 -6
  60. package/dist/chunks/{room-recommend-WRTHO6Y2.js → room-recommend-XCWRMB5P.js} +4 -3
  61. package/dist/chunks/{schedule-KFIITGSK.js → schedule-IVBICP32.js} +4 -3
  62. package/dist/chunks/{workflow-DJ7SYWAF.js → workflow-D74NFK3C.js} +179 -6
  63. package/dist/index.js +35 -25
  64. package/dist/internal/e10/auth-recovery.js +14 -4
  65. package/dist/internal/e10/fetch-timing.js +31 -0
  66. package/dist/internal/e10/request-runtime.js +5 -0
  67. package/dist/shortcuts/contract/host.js +34 -59
  68. package/dist/shortcuts/cowork/continuation.js +70 -0
  69. package/dist/shortcuts/cowork/errors.js +59 -0
  70. package/dist/shortcuts/cowork/host.js +180 -0
  71. package/dist/shortcuts/cowork/index.js +166 -0
  72. package/dist/shortcuts/cowork/manifest.js +65 -0
  73. package/dist/shortcuts/cowork/operations/discuss-write.js +277 -0
  74. package/dist/shortcuts/cowork/operations/item-write.js +380 -0
  75. package/dist/shortcuts/cowork/operations/member-write.js +283 -0
  76. package/dist/shortcuts/cowork/operations/permission-write.js +286 -0
  77. package/dist/shortcuts/cowork/operations/read.js +423 -0
  78. package/dist/shortcuts/cowork/operations/registry.js +39 -0
  79. package/dist/shortcuts/cowork/operations/review-write.js +157 -0
  80. package/dist/shortcuts/cowork/operations/shared.js +215 -0
  81. package/dist/shortcuts/cowork/operations/types.js +39 -0
  82. package/dist/shortcuts/cowork/operations.js +19 -0
  83. package/dist/shortcuts/ehr/host.js +4 -1
  84. package/dist/shortcuts/ehr/operations/recruit-candidate-import.js +757 -0
  85. package/dist/shortcuts/ehr/operations/recruit-position.js +367 -0
  86. package/dist/shortcuts/ehr/operations/recruit-stats.js +133 -0
  87. package/dist/shortcuts/ehr/operations/recruit-write.js +43 -16
  88. package/dist/shortcuts/ehr/operations/recruit.js +182 -10
  89. package/dist/shortcuts/ehr/operations/registry.js +6 -0
  90. package/dist/shortcuts/fna/operations/expense-chart.js +19 -7
  91. package/dist/shortcuts/im/diagnostics.js +97 -0
  92. package/dist/shortcuts/im/host.js +58 -31
  93. package/dist/shortcuts/im/index.js +7 -2
  94. package/dist/shortcuts/im/operations/at-mention.js +127 -0
  95. package/dist/shortcuts/im/operations/file-user.js +10 -2
  96. package/dist/shortcuts/im/operations/group-read.js +26 -5
  97. package/dist/shortcuts/im/operations/group-write.js +35 -28
  98. package/dist/shortcuts/im/operations/msg-sync.js +7 -2
  99. package/dist/shortcuts/im/operations/msg-write.js +76 -10
  100. package/dist/shortcuts/im/operations/quote-mention.js +119 -0
  101. package/dist/shortcuts/im/operations/session.js +1 -1
  102. package/dist/shortcuts/im/operations/shared.js +10 -0
  103. package/dist/shortcuts/im/operations/types.js +13 -0
  104. package/dist/shortcuts/index.js +10 -0
  105. package/dist/shortcuts/mail/host.js +12 -1
  106. package/dist/shortcuts/mail/operations/types.js +17 -2
  107. package/dist/shortcuts/meeting/host.js +27 -34
  108. package/dist/shortcuts/meeting/index.js +79 -1
  109. package/dist/shortcuts/meeting/manifest.js +10 -0
  110. package/dist/shortcuts/meeting/operations/create.js +4 -1
  111. package/dist/shortcuts/meeting/operations/eb/catalog.js +10 -0
  112. package/dist/shortcuts/meeting/operations/eb/conflict.js +84 -8
  113. package/dist/shortcuts/meeting/operations/eb/create-flow.js +1195 -140
  114. package/dist/shortcuts/meeting/operations/eb/factory.js +170 -8
  115. package/dist/shortcuts/meeting/operations/eb/index.js +16 -3
  116. package/dist/shortcuts/meeting/operations/eb/room-recommend.js +50 -5
  117. package/dist/shortcuts/meeting/operations/eb-fallback.js +163 -0
  118. package/dist/shortcuts/meeting/operations/env.js +99 -46
  119. package/dist/shortcuts/meeting/operations/form-fields.js +110 -0
  120. package/dist/shortcuts/meeting/operations/invitation.js +79 -20
  121. package/dist/shortcuts/meeting/operations/registry.js +2 -0
  122. package/dist/shortcuts/meeting/operations/standard-guard.js +71 -0
  123. package/dist/shortcuts/meeting/operations.js +16 -0
  124. package/dist/shortcuts/workflow/endpoints.js +8 -3
  125. package/dist/shortcuts/workflow/index.js +110 -1
  126. package/dist/shortcuts/workflow/operations/form.js +204 -36
  127. package/dist/shortcuts/workflow/operations/read.js +104 -23
  128. package/dist/shortcuts/workflow/operations/todoSmartConvert/aigroupRules.js +448 -0
  129. package/dist/shortcuts/workflow/operations/todoSmartConvert/aigroupStore.js +106 -0
  130. package/dist/shortcuts/workflow/operations/todoSmartConvert/businessRules.js +47 -0
  131. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.collect.js +30 -23
  132. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.core.js +1 -0
  133. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.group.js +1 -0
  134. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.groupSummary.js +2 -1
  135. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.js +2 -4
  136. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.smartGroup.js +138 -181
  137. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.summary.js +12 -7
  138. package/dist/shortcuts/workflow/operations.js +23 -1
  139. package/docs/e10-auth.md +1 -1
  140. package/docs/ehr.md +1 -1
  141. package/docs/fna.md +2 -1
  142. package/docs/im.md +8 -1
  143. package/docs/todo-smart-convert/README.md +1 -1
  144. package/docs/todo-smart-convert/data-contract.md +2 -2
  145. package/docs/todo-smart-convert/subgroup-rules.md +6 -0
  146. package/package.json +1 -1
  147. package/skill-template/business-info.json +18 -0
  148. package/skill-template/domains/cowork.md +14 -0
  149. package/skill-template/domains/yimiaoban.md +3 -3
  150. package/skill-template/skill-template.md +1 -1
  151. package/skills/weaver-e10-blog/SKILL.md +5 -5
  152. package/skills/weaver-e10-caizhilian/SKILL.md +5 -5
  153. package/skills/weaver-e10-calendar/SKILL.md +5 -5
  154. package/skills/weaver-e10-cowork/SKILL.md +101 -0
  155. package/skills/weaver-e10-cowork/references/cowork-read.md +90 -0
  156. package/skills/weaver-e10-cowork/references/cowork-write.md +131 -0
  157. package/skills/weaver-e10-cowork/references/safety-boundaries.md +45 -0
  158. package/skills/weaver-e10-esb/SKILL.md +5 -5
  159. package/skills/weaver-e10-hrm/SKILL.md +5 -5
  160. package/skills/weaver-e10-jinchengda/SKILL.md +2 -2
  161. package/skills/weaver-e10-jiuchuanhui/SKILL.md +5 -5
  162. package/skills/weaver-e10-jucailin/SKILL.md +38 -14
  163. package/skills/weaver-e10-jucailin/references/recruit-create.md +104 -0
  164. package/skills/weaver-e10-jucailin/references/recruit-read.md +25 -0
  165. package/skills/weaver-e10-jucailin/references/recruit-write.md +13 -0
  166. package/skills/weaver-e10-jucailin/references/salary.md +15 -11
  167. package/skills/weaver-e10-mail/SKILL.md +17 -14
  168. package/skills/weaver-e10-meeting/SKILL.md +442 -46
  169. package/skills/weaver-e10-meeting/references/meeting-eb.md +135 -3
  170. package/skills/weaver-e10-meeting/references/meeting-invitation.md +28 -2
  171. package/skills/weaver-e10-meeting/references/meeting-queries.md +9 -6
  172. package/skills/weaver-e10-meeting/references/meeting-verification.md +8 -6
  173. package/skills/weaver-e10-meeting.zip +0 -0
  174. package/skills/weaver-e10-okr/SKILL.md +5 -5
  175. package/skills/weaver-e10-okr/references/source-manifest.json +3 -3
  176. package/skills/weaver-e10-plan/SKILL.md +5 -5
  177. package/skills/weaver-e10-qiyecheng/SKILL.md +5 -2
  178. package/skills/weaver-e10-qiyecheng/references/catalog.md +2 -2
  179. package/skills/weaver-e10-qiyecheng/references/expense-chart.md +15 -1
  180. package/skills/weaver-e10-qiyecheng/references/source-manifest.json +22 -21
  181. package/skills/weaver-e10-shared/SKILL.md +12 -12
  182. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +4 -4
  183. package/skills/weaver-e10-wenshuding/SKILL.md +5 -5
  184. package/skills/weaver-e10-workflow/SKILL.md +29 -5
  185. package/skills/weaver-e10-workflow/aigroup/default.json +88 -0
  186. package/skills/weaver-e10-workflow/references/todo-smart-convert.md +66 -14
  187. package/skills/weaver-e10-workflow/references/workflow-agent-entry.md +1 -1
  188. package/skills/weaver-e10-workflow/references/workflow-memory.md +1 -1
  189. package/skills/weaver-e10-workflow/references/workflow-query.md +12 -10
  190. package/skills/weaver-e10-workflow/references/workflow-view.md +2 -2
  191. package/skills/weaver-e10-workflow/tools/todo-serve.cjs +239 -0
  192. package/skills/weaver-e10-workflow/{scripts → tools}/todo-summary.cjs +218 -28
  193. package/skills/weaver-e10-yepiaotong/SKILL.md +10 -8
  194. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +7 -7
  195. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +10 -10
  196. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +40 -37
  197. package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +4 -4
  198. package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +27 -38
  199. package/skills/weaver-e10-yepiaotong/references/reim-phone-subsidy-rules.md +4 -4
  200. package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +37 -29
  201. package/skills/weaver-e10-yimiaoban/SKILL.md +156 -33
  202. package/skills/weaver-e10-yimiaoban/references/ding-write.md +1 -1
  203. package/skills/weaver-e10-yimiaoban/references/error-codes.md +5 -1
  204. package/skills/weaver-e10-yimiaoban/references/group-read.md +5 -1
  205. package/skills/weaver-e10-yimiaoban/references/group-write.md +6 -4
  206. package/skills/weaver-e10-yimiaoban/references/msg-read.md +1 -0
  207. package/skills/weaver-e10-yimiaoban/references/msg-write.md +34 -2
  208. package/skills/weaver-e10-yimiaoban/references/safety-boundaries.md +5 -2
  209. package/skills/weaver-e10-yimiaoban/references/source-manifest.json +79 -58
  210. package/skills/weaver-e10-yimiaoban/references/user-remind.md +2 -2
  211. package/skills/weaver-e10-ziguanjia/SKILL.md +5 -5
@@ -37,9 +37,8 @@
37
37
  |------|-----|------|
38
38
  | 默认合同编号 | `"20260999"` | **不向用户询问合同号。** 用户本轮自己说了才用用户的;否则用已确认相关项目在 `historyRequestData` 里对上的那条合同号(多条取最近一条);对不上或项目「不填」则用它。表单默认已是它时不必再传。合同号不是它时,承担主体以合同联动为准;相关客户 / 相关项目仍按 Step 4.5 一次问齐并写入 |
39
39
  | 非出差相关客户 | `"泛微上海(100504500000311504)"` | 仅非出差且合同号仍是 `20260999` 时使用。合同号不是它、或出差单,必须先问用户,禁止空着先建草稿。见 [reim-form-fill-rules.md](reim-form-fill-rules.md#相关客户相关项目必须在建单前确认) |
40
- | 发票金额 | 价税合计 `info.comm_info.price.total` | 报销金额字段一律填它;**不是** `price.amount` / `invoice.get` 的 `amount`(都是不含税) |
41
- | 兜底费用科目 | `"其他-管理费用(100502270000000104)"` | 所有科目匹配策略均未命中时使用 |
42
- | 人民币币种 | `"人民币(100001050000000001)"` | 明细每行必传(即使表单默认带出),否则字段联动失效,见 [reim-form-fill-rules.md](reim-form-fill-rules.md) |
40
+ | 发票金额 | 价税合计 `info.comm_info.price.total` | 主表金额字段(可写时)按它求和;明细金额不传,由发票联动带出。**不是** `price.amount` / `invoice.get` 的 `amount`(都是不含税) |
41
+ | 明细可写列 | 相关发票(+ 绑定事前申请时的相关流程) | 明细每行只写这两列,币种、金额、日期、科目等其余列都不传,由发票联动带出,见 [reim-form-fill-rules.md](reim-form-fill-rules.md#费用明细字段规则) |
43
42
  | 报销方式默认值 | `"银行(个人报销)"` | Select 传选项名;表单默认带出时不传 |
44
43
  | 全额红冲状态值 | `status = 8` | `comm_info.pro.status`;此类发票必须过滤,不允许报销 |
45
44
  | 相关凭证 typeCode | 17, 18, 57, 58 | 不能独立成行;明细「相关凭证」不赋值,由发票联动带出 |
@@ -127,7 +126,7 @@ CLI 已默认 `sreim="3"`、`bill_type=0`、`page_size=10`。报销查票时默
127
126
  | "帮我报销" / "我要报销" | 查**最近一周**发票 → 无结果则查**最近一个月** → **展示发票汇总,询问确认** → 确认后走后续流程 |
128
127
  | "报销打车费" | 设置 `content="滴滴"` 筛选交通类 → **展示发票汇总,询问确认** → 确认后走后续流程 |
129
128
  | "报销上周的发票" | 设置时间范围为上周 → **展示发票汇总,询问确认** → 确认后走后续流程 |
130
- | "报销上周去北京的费用" / "报销去重庆的发票" | 按**出差时间 + 城市**查票(见 Step 1A「出差 / 城市意图查票」)→ **展示发票汇总,询问确认** → 确认后走后续流程 |
129
+ | "报销上周去北京的费用" / "报销去重庆的发票" | 按**出差时间 + 城市**查票:目的城市的票,加上出差期间**出发城市(没说默认上海)**的打车票(见 Step 1A「出差 / 城市意图查票」)→ **展示发票汇总,询问确认** → 确认后走后续流程 |
131
130
  | "报销发票号码 xxx" | 设置 `number="xxx"` 精确匹配 → **展示发票汇总,询问确认** → 确认后走后续流程 |
132
131
  | 用户直接提供了发票数据 | **跳过 Step 1A** → **展示发票汇总,询问确认** → 确认后继续后续流程 |
133
132
  | 用户提供了 fileId | 先调用 `invoice.reim.file-ocr.preview`(Step 0)→ **展示发票汇总,询问确认** → 确认后继续 |
@@ -203,7 +202,6 @@ Step 2.6: 按工作流分组(多个工作流 → 多组,各组独立执行
203
202
  ┌──────────────────────────────────────────────┐
204
203
  │ ▼ 并行组 A(同时发起) │
205
204
  │ Step 3: workflow.createForm(载入报销表单) │
206
- │ Step 3.5: invoice.reim.row-info-batch │
207
205
  │ Step 3.6: invoice.browse-field.data(发票对象) │
208
206
  │ 交通类额外: invoice.get × M │
209
207
  └──────────────────────────────────────────────┘
@@ -227,7 +225,7 @@ Step 6 (可选): workflow.editLoad / editPrepare / editApply → 用户修正(
227
225
  | 并行组 | 可并行的操作 | 说明 |
228
226
  |--------|------------|------|
229
227
  | **Step 1 并行** | `invoice.reim.requests.list` 与 Step 1C 发票展示 | 用户确认期间预取事前申请 |
230
- | **Step 3 并行** | `workflow.createForm` + `invoice.reim.row-info-batch` + `invoice.browse-field.data` + `invoice.get` × M | 全部互相独立,**必须同时发起** |
228
+ | **Step 3 并行** | `workflow.createForm` + `invoice.browse-field.data` + `invoice.get` × M | 全部互相独立,**必须同时发起**。建单不再调用 `invoice.reim.row-info-batch` |
231
229
  | **交通类行程** | 多张交通发票的 `invoice.get` | 各发票独立,强制并行 |
232
230
 
233
231
  > **`createForm` 不跨组复用**:它返回的 `continuation` 与本次单据绑定,**每个报销单各调一次 `createForm`**,不能拿上一单的 `continuation` 再发起。
@@ -271,10 +269,11 @@ Step 6 (可选): workflow.editLoad / editPrepare / editApply → 用户修正(
271
269
 
272
270
  用户提到了去某个城市(「去北京」「重庆的发票」)时,**不能只按开票日期筛**:出差的票常在回来后才开,用户说的"上周"是出差时间,不是开票时间。
273
271
 
272
+ 0. **先定出发城市**:用户说了从哪出发(「从杭州去北京」「杭州出发」)→ 用用户的;**没说 → 默认上海**,不要问用户。目的城市就是出发城市(如没说出发地却说「去上海」)时,不再单独找出发地的票,按目的城市筛即可。
274
273
  1. **时间范围(消费日期 `consumption_tm_begin` / `consumption_tm_end`)**
275
- - 用户说了出差时间(「上周」「10月12日到15日」)→ 从**出差开始日**查到**今天**
274
+ - 用户说了出差时间(「上周」「10月12日到15日」)→ 从**出差开始日前 1 天**查到**今天**(去车站 / 机场的打车可能在出发前一天晚上)
276
275
  - 没说时间 → 最近一个月;没有与该城市相关的票 → 扩到最近 90 天
277
- 2. **按城市逐张筛**(不按 `content` 关键词筛,城市不在消费内容里):
276
+ 2. **按目的城市逐张筛**(不按 `content` 关键词筛,城市不在消费内容里):
278
277
 
279
278
  | 发票 | 怎么判断与目的城市相关 |
280
279
  | --- | --- |
@@ -284,8 +283,18 @@ Step 6 (可选): workflow.editLoad / editPrepare / editApply → 用户修正(
284
283
  | 其他 | 销方名称或地址里的城市;判断不了的不算相关 |
285
284
 
286
285
  3. **按出差时间再筛一次**:用户说了出差时间时,火车票 / 机票的乘车日期、酒店入住日期要落在出差时间内(前后各放宽 1 天);打车票和其他票只要开票日期不早于出差开始日即可。
287
- 4. **展示**:Step 1C 只列与该城市相关的票,并说明「按 {城市}、{时间范围} 查的」。同期查到的其他票不混进来,只在表格下一句话提示「同期还有 N 张其他发票,需要一起报请告诉我」。
288
- 5. **没有相关的票** → 明确告诉用户查了哪个时间范围、按什么条件筛的、为什么同期的票不算(如「火车票是杭州东 → 全椒」),然后停下,不要自己扩到不相关的票或无限放宽时间。
286
+ 4. **把出发城市的打车票一起筛进来**(去车站 / 机场、回程到家的打车):同期查到的票里,同时满足下面三条的也算本次出差的票:
287
+
288
+ | 条件 | 怎么判断 |
289
+ | --- | --- |
290
+ | 是打车类交通票 | 出租车、网约车、打车(滴滴、高德、曹操、T3、享道、强生等出行平台,或消费内容是客运 / 运输服务)。出发城市的酒店、餐饮、其他票**不算** |
291
+ | 在出发城市 | 销方名称或地址里的城市是出发城市(「上海强生出租汽车有限公司」→ 上海);或行程单 / `from` / `to` 起止点在出发城市(「虹桥火车站」「浦东机场」);或 `info.province` 是出发城市。销方是「北京小桔科技有限公司」这类全国平台、列表又没有起止点时,调 `invoice.get` 看 `from` / `to` 再判断 |
292
+ | 消费日期落在出差时间内 | 消费日期取 `info.modify_info.cstm`(`candidates.list` 没有这个字段,用 `invoice.list` 或 `invoice.get` 取)。出差时间:用户说了 → 用用户的,前后各放宽 1 天;没说 → 取第 2 步已筛出的目的城市票里最早到最晚的日期(火车票 / 机票用乘车日期),前后各放宽 1 天 |
293
+
294
+ - **第 2 步一张目的城市的票都没有时,不单独拿出发城市的打车票凑出差报销**,按第 6 步停下。
295
+ - 判断不了城市、但消费日期落在出差时间内的打车票,不自动算进来,在第 5 步的提示里单独说一句「另有 N 张同期打车票看不出是不是在 {出发城市}」。
296
+ 5. **展示**:Step 1C 只列目的城市的票和第 4 步筛进来的出发城市打车票,并说明「按 {出发城市}出发去 {目的城市}、{时间范围} 查的,第 x、y 张是出差期间在 {出发城市} 的打车票」。出发城市是默认的上海时,加一句「没说出发地,默认按上海」。同期查到的其他票不混进来,只在表格下一句话提示「同期还有 N 张其他发票,需要一起报请告诉我」。
297
+ 6. **没有相关的票** → 明确告诉用户查了哪个时间范围、按什么条件筛的、为什么同期的票不算(如「火车票是杭州东 → 全椒」),然后停下,不要自己扩到不相关的票或无限放宽时间。
289
298
 
290
299
  ### 日期筛选参数
291
300
 
@@ -432,7 +441,7 @@ weaver-work-cli --json workflow run workflow.createForm --input-json '{"workflow
432
441
  ```
433
442
 
434
443
  > ⚠️ **AI 报销调用 `createForm` 时不传 `userQuestion`**(`workflow-create.md` 里「强烈建议每次都传」**不适用于报销**),也**不用 `workflow.createRequestDirect`**(一步发起)。
435
- > 传了 `userQuestion` 会让流程侧的智能填参按用户原话算 `data`:发票字段只给 `"invoice"` 占位符、承担主体会按用户口述填(与「合同联动为准」冲突)、不会逐行传币种,标题也不按本技能格式;同时 `historyRequestData` 不再返回。报销的 `data` 一律按本技能 Step 4 的规则自己组装。费用说明不在这份 `data` 里。
444
+ > 传了 `userQuestion` 会让流程侧的智能填参按用户原话算 `data`:发票字段只给 `"invoice"` 占位符、承担主体会按用户口述填(与「合同联动为准」冲突),标题也不按本技能格式;同时 `historyRequestData` 不再返回。报销的 `data` 一律按本技能 Step 4 的规则自己组装。费用说明不在这份 `data` 里。
436
445
  > 万一返回里还是带了 `data`(例如别的环节传了 `userQuestion`),**忽略它**,照常按 Step 4 组装;此时没有 `historyRequestData`,费用承担公司交给 `missingFields` 提醒。
437
446
 
438
447
  从返回里取:
@@ -454,9 +463,8 @@ weaver-work-cli --json workflow run workflow.createForm --input-json '{"workflow
454
463
 
455
464
  ## Step 3.5: 获取发票预填信息(`invoice.reim.row-info-batch`)
456
465
 
457
- - 入参:`invoiceIds`=本组全部**发票**(不含凭证)ID,`requestid`=匹配到的事前申请 ID(无则留空)
458
- - 返回的 `date`、`subjectId`、`subjectName` **在 Step 4 中优先使用**。`fysm` 不要写入「费用说明」;`itinerary` 不用来写「相关凭证」
459
- - 某张失败或字段为空 → 该行回退到 AI 推断逻辑(费用说明除外,失败也不要自己生成)
466
+ > **报销建单不再调用。** 明细只写「相关发票」(及「相关流程」),`row-info-batch` 返回的日期、科目、凭证、费用说明都属于发票联动带出的列,AI 不写。只在用户单独要查某张发票的预填信息时使用。
467
+
460
468
  - `itineraryData`(行程单逐段明细)**暂不拆行**,仍一张发票一行,见 [reim-form-fill-rules.md](reim-form-fill-rules.md#4-行程单多段行程暂不拆行)。不要为了费用说明额外调用 `invoice.get`。
461
469
 
462
470
  ---
@@ -468,16 +476,16 @@ weaver-work-cli --json workflow run workflow.createForm --input-json '{"workflow
468
476
  macOS/Linux(bash/zsh):
469
477
 
470
478
  ```bash
471
- weaver-work-cli --json invoice run invoice.browse-field.data --input-json '{"fids":["1295366637717012482","1298798990831518001"]}'
479
+ weaver-work-cli --json invoice run invoice.browse-field.data --input-json '{"fids":["1295366637717012482"]}'
472
480
  ```
473
481
 
474
482
  Windows PowerShell:
475
483
 
476
484
  ```powershell
477
- weaver-work-cli --json invoice run invoice.browse-field.data --input-json '{"fids":["1295366637717012482","1298798990831518001"]}'
485
+ weaver-work-cli --json invoice run invoice.browse-field.data --input-json '{"fids":["1295366637717012482"]}'
478
486
  ```
479
487
 
480
- > 只传发票,不依赖 Step 3.5 的返回,可以和 Step 3 其他调用并行;`itinerary` 返回了凭证 ID 也不补调。
488
+ > 只传发票,和 Step 3 其他调用并行。
481
489
 
482
490
  > 发票都来自用户已确认的票夹,属于 `workflow-create.md` 里"指名从票夹取"的情形,**不需要**上传提醒。
483
491
 
@@ -497,7 +505,7 @@ weaver-work-cli --json invoice run invoice.browse-field.data --input-json '{"fid
497
505
  ## Step 4: 组装 `createRequest` 的 `data`
498
506
 
499
507
  > **详细填值规则见 [reim-form-fill-rules.md](reim-form-fill-rules.md)**
500
- > **费用科目匹配规则见 [reim-expense-subject-rules.md](reim-expense-subject-rules.md)**
508
+ > **明细「费用类型(科目)」不传,由发票联动带出;建单时不使用 [reim-expense-subject-rules.md](reim-expense-subject-rules.md)。**
501
509
 
502
510
  ```json
503
511
  {
@@ -509,12 +517,10 @@ weaver-work-cli --json invoice run invoice.browse-field.data --input-json '{"fid
509
517
  **关键约束:**
510
518
  - **⚠️ `createRequest` 必传 `requestName`**:按 [reim-form-fill-rules.md](reim-form-fill-rules.md)「流程标题」公式生成,**禁止留用表单默认标题**(不传会静默留用「{流程名}-{申请人}-{日期}」默认值,无任何提示)
511
519
  - **⚠️ 主表必填「报销事由」**:按 [reim-form-fill-rules.md](reim-form-fill-rules.md)「报销事由」公式生成写入 `data.main`,**禁止留空**
512
- - 键只取 `createForm` 的 `fields[].id`;`fields` 里没有的字段不传,带默认值且不需改写的字段不传(例外:明细「币种」每行必传)
520
+ - 键只取 `createForm` 的 `fields[].id`;`fields` 里没有的字段不传,带默认值且不需改写的字段不传
513
521
  - 浏览按钮写 `名称(ID)`;Select 写选项名;发票字段写 `[发票对象]`
514
- - 一张发票一行;相关凭证(17/18/57/58)不成行
515
- - **明细「费用说明」「费用明细」「相关凭证」都不传**,由「相关发票」联动自动填充。不要用 `fysm`、起止点或账单说明自己生成费用说明
516
- - 行程单有多段行程也**不拆行**
517
- - **费用类型(科目)每行必须有值**,匹配不到填 `"其他-管理费用(100502270000000104)"`
522
+ - 一张发票一行;相关凭证(17/18/57/58)不成行;行程单有多段行程也**不拆行**
523
+ - **⚠️ 明细每行只写「相关发票」**;有绑定的事前申请时再写「相关流程」(差旅 / 外出每行必须有,见 Step 4.7)。**其余明细列一律不传**:费用日期、金额、币种、费用类型(科目)、费用说明、费用明细、相关凭证、明细相关客户 / 项目、附件数,都由「相关发票」联动带出
518
524
  - **合同号不问用户。** 用户本轮自己说了才用用户的;否则按已确认的相关项目,从 `historyRequestData` 里该项目最近一条带出合同号;对不上或项目「不填」则用 `"20260999"`(表单默认已是它时不传)
519
525
  - **带出的合同号不是 `20260999` → 创建时承担主体不传,以合同联动为准**。**相关客户、相关项目不能空着等联动**:必须先按 Step 4.5 **一次**问齐(项目可「不填」),把已确认的值写入 `data` 再 `createRequest`。创建后从 `linkageResult` 读出实际带出的承担主体和合同号告诉用户;客户 / 项目若被联动改成别的值,如实告诉用户已按合同联动为准;若被冲空,用已确认值走 Step 6 写回。见 [reim-form-fill-rules.md](reim-form-fill-rules.md#相关客户相关项目必须在建单前确认)
520
526
  - **⚠️ 总部费用报销历史参考见 Step 4.4;相关客户 / 相关项目建单前确认见 Step 4.5;话费报销规则见 Step 4.6;差旅 / 外出明细「相关流程」见 Step 4.7。**
@@ -647,7 +653,7 @@ weaver-work-cli --json workflow run workflow.createRequest --input .\reim-create
647
653
  "action": "draft",
648
654
  "data": {
649
655
  "main": {"100003720000000088": "上海市内交通费(滴滴出行)", "100003720000000687": "泛微上海(100504500000311504)"},
650
- "details": {"100003690000000011": [{"100003720000016373": "108.2", "100003720000052200": "人民币(100001050000000001)"}]}
656
+ "details": {"100003690000000011": [{"100003720000077896": ["<browse-field.data 返回的发票对象>"]}]}
651
657
  }
652
658
  }
653
659
  ```
@@ -662,7 +668,7 @@ weaver-work-cli --json workflow run workflow.createRequest --input .\reim-create
662
668
  | --- | --- |
663
669
  | `CREATED` | **原样粘贴 `finalMarkdown`**,一字不改;链接只出现在回复文本里。之后按需补几句:合同联动带出的承担主体与用户口述不同、客户 / 项目被联动改写、话费核算明细、`missingFields` 提交前要补的字段。然后**必须做 Step 5.3** |
664
670
  | `BROWSER_FILL`(小e 环境) | **没有写服务端、没有 `requestId`**:把 `finalMarkdown`(一段 `<browsertool>` 标签块)**整段原样输出**作为回复正文,不包代码块、不加任何前后说明,也不补上面那几句提醒;由页面打开新建页带入字段值,用户在页面上保存。之后**不要走 Step 6**(没有可改的单据) |
665
- | `NEEDS_INPUT` | 缺的是承担主体、上级、合同号、相关客户、科目等本技能有规则的字段 → 按 [reim-form-fill-rules.md](reim-form-fill-rules.md) 补值后用同一 `context` 重发;其余原样粘贴 `finalMarkdown` 一次问齐用户 |
671
+ | `NEEDS_INPUT` | 缺的是承担主体、上级、合同号、相关客户等本技能有规则的字段(明细科目除外,不补) → 按 [reim-form-fill-rules.md](reim-form-fill-rules.md) 补值后用同一 `context` 重发;其余原样粘贴 `finalMarkdown` 一次问齐用户 |
666
672
  | `NEEDS_CONFIRMATION` | 按 `ambiguities` 处理(浏览按钮多候选让用户选;`MULTIPLICITY` 只保留 1 个值) |
667
673
  | `partial` / `write_uncertain` | 停止,不重放;只读回查一次后告知用户 |
668
674
 
@@ -679,13 +685,15 @@ weaver-work-cli --json workflow run workflow.createRequest --input .\reim-create
679
685
 
680
686
  | 检查 | 什么时候算没填上 | 原因怎么说 |
681
687
  | --- | --- | --- |
682
- | **相关客户没有值** | **任何报销单**。主表「相关客户」为空;明细有这个字段时该行也为空。非出差且已是「泛微上海」不算 | 合同联动把建单前已确认的客户冲空了 |
683
- | 相关项目没填写 | 主表「相关项目」为空,且用户没有说过「不填」;明细有这个字段时也为空 | 合同联动把建单前已确认的项目冲空了 |
688
+ | **相关客户没有值** | **任何报销单**。主表「相关客户」为空(明细的相关客户不检查、不写)。非出差且已是「泛微上海」不算 | 合同联动把建单前已确认的客户冲空了 |
689
+ | 相关项目没填写 | 主表「相关项目」为空,且用户没有说过「不填」(明细的相关项目不检查、不写) | 合同联动把建单前已确认的项目冲空了 |
684
690
  | 明细「费用说明」 | 表单有这一列,落库后仍空 | 发票联动没有带出。只告知,不要补写,也不要让用户填,不要自己生成 |
685
691
  | 明细「费用明细」 | 表单有这一列,落库后仍空 | 发票联动没有带出。只告知,不要补写,也不要让用户填 |
686
692
  | 明细「相关凭证」 | 表单有这一列,落库后仍空 | 发票联动没有带出。只告知,不要补写,也不要让用户挂行程单 |
693
+ | 明细「费用类型(科目)」 | 落库后仍空 | 发票联动没有带出。只告知,不要补写,也不要让用户选科目 |
694
+ | 明细其他列(费用日期、金额、币种等) | 落库后仍空 | 发票联动没有带出。只告知,不要补写 |
687
695
 
688
- 表里各项都有合格值时,不要再补一句「检查通过」。有缺项时,在 `finalMarkdown` 后面一次说完。**相关客户、相关项目若本轮 Step 4.5 已经确认过,直接用已确认的 `名称(ID)` 走 Step 6 写回,不要再问。** 明细「费用说明」「费用明细」「相关凭证」只告知,不写回。只有建单前漏问了(不应发生)才补问客户和项目:客户不接受「不填」,项目可以说「不填」。例如:
696
+ 表里各项都有合格值时,不要再补一句「检查通过」。有缺项时,在 `finalMarkdown` 后面一次说完。**相关客户、相关项目若本轮 Step 4.5 已经确认过,直接用已确认的 `名称(ID)` 走 Step 6 写回,不要再问。** 明细除「相关发票」「相关流程」外的列只告知,不写回。只有建单前漏问了(不应发生)才补问客户和项目:客户不接受「不填」,项目可以说「不填」。例如:
689
697
 
690
698
  ```markdown
691
699
  这张草稿里还有 2 项没有填上:
@@ -739,7 +747,7 @@ Step 5.3 里用户刚给出的行程、客户名称、相关项目,就是这
739
747
  - [reim-api-reference.md](reim-api-reference.md) - 报销数据准备 CLI operation 入参与返回值
740
748
  - [reim-matching-rules.md](reim-matching-rules.md) - 发票与事前申请匹配逻辑
741
749
  - [reim-form-fill-rules.md](reim-form-fill-rules.md) - `createRequest` 的 `data` 填值规则
742
- - [reim-expense-subject-rules.md](reim-expense-subject-rules.md) - 费用科目自动匹配规则
750
+ - [reim-expense-subject-rules.md](reim-expense-subject-rules.md) - 费用科目匹配规则(建单不用;只在用户明确要求改某行科目时参考)
743
751
  - [reim-phone-subsidy-rules.md](reim-phone-subsidy-rules.md) - 话费补贴 / 话费报销月度标准与实报金额
744
752
  - [reim-examples.md](reim-examples.md) - 完整端到端示例
745
753
  - [`workflow-create.md`](../../weaver-e10-workflow/references/workflow-create.md) / [`workflow-edit.md`](../../weaver-e10-workflow/references/workflow-edit.md) - 发起与修改流程的命令契约
@@ -5,7 +5,7 @@ display_name_en: Weaver E10 Yimiaoban IM
5
5
  description: 泛微 E10 易秒办即时通讯能力(单聊/群聊消息、发送与必达、群组管理、会话与系统消息),通过 weaver-work-cli im 命令执行。
6
6
  description_zh: 泛微 E10 易秒办即时通讯能力:拉取单聊/群聊/系统消息、发送与撤回消息、发必达、群组管理(建群/邀人/踢人/退群/解散/公告)、会话列表、文件上传下载与人员解析,全部通过 weaver-work-cli im 命令执行,写操作走 prepare→apply 确认链。
7
7
  description_en: Weaver E10 Yimiaoban (IM) capabilities - fetching single/group/system messages, sending, withdrawing and ding messages, group management, sessions, file upload/download and people resolution, executed through the weaver-work-cli im command with a prepare-then-apply confirmation chain for writes.
8
- version: 1.1.1
8
+ version: 1.1.6
9
9
  author: 泛微网络科技股份有限公司
10
10
  agent_created: true
11
11
  requires:
@@ -24,18 +24,52 @@ cliHelp: "weaver-work-cli im --help"
24
24
 
25
25
  本技能覆盖易秒办(E10 即时通讯)业务域:**消息(msg)**、**必达(ding)**、**群组(group)**、**会话(session)**、**系统消息(sysmsg)**,以及支撑能力**人员解析(person)**、**文件上传/预览/下载(file)**、**用户状态与免打扰设置(user)**、**i18n 标签(i18n)**。所有写操作走 prepare→apply 确认协议。
26
26
 
27
+ ## 共享包依赖(发布与安装约束)
28
+
29
+ 本包通过相对路径引用共享规则 `../weaver-e10-shared/`(当前本 `SKILL.md` 内 7 处相对路径引用,另有 `references/safety-boundaries.md` 的文本级引用)。这些引用**只有在共享包以同名目录 `weaver-e10-shared` 存在时才可解析**。
30
+
31
+ - 发布共享规则时,必须使用原 installId **覆盖同名共享包**,不要以新技能名上传并与旧包并存;否则本包引用仍指向旧版共享规则,新版超时、降级识别与非交互处置一行都不会被读取。
32
+ - 若确需改用新的共享包目录名,必须同步全量替换本包所有跨包引用(当前 7 处)并做一次回归验证。
33
+ - Agent 发现引用目标不存在或内容明显过期时,停止执行并提示用户补齐/覆盖同名共享包,不要改写相对路径去适配其它目录名。
34
+
35
+ ## 路由优先级(先判断是不是易秒办 IM,再选 operation)
36
+
37
+ 易秒办不是通用 E10 对象。**只要用户的核心对象是 E10 即时通讯(消息、群、会话、必达),就优先使用 `weaver-e10-yimiaoban`。**
38
+
39
+ 出现以下任一语义时,优先走本 Skill:
40
+
41
+ - 单聊 / 群聊 / 聊天记录 / 拉消息 / 历史消息 / 置顶消息 / 已读未读
42
+ - 发消息 / 发图片 / 发文件 / 撤回 / 转发必达 / 必达消息 / 催办
43
+ - 建群 / 拉群 / 邀人 / 踢人 / 退群 / 解散群 / 群公告 / 群主 / 群管理员 / 群成员
44
+ - 会话列表 / 系统消息 / 消息提醒 / 免打扰
45
+ - IM 人员解析(按姓名/工号/手机/邮箱查人)、群内文件上传/预览/下载
46
+
47
+ **判定规则:** 只要最终动作是对 E10 IM 的消息读取/发送/撤回/置顶/必达、群组读写、会话与系统消息查询、IM 文件与人员解析,就归 `weaver-e10-yimiaoban`。只有当用户处理的是非 IM 类 E10 业务、通用流程编排,或尚未封装的 IM 能力时,才不使用本 Skill。
48
+
49
+ **常见误用:**
50
+
51
+ - 「给某人发消息」先要**解析人**:用 `im resolve` / `im.person.resolve` 拿 `uid`+`cid`,不要拿群成员接口的 `name` 反推 id。
52
+ - 「查某人发给我的消息」是单聊同步(`im.msg.sync.single`),不是群聊;群聊必须显式给 `groupId`。
53
+ - 「群成员叫什么」是 hrm 解析(`im.person.resolveByIds`),不是 `im.group.users` 的 `name` 字段。
54
+ - 「一共多少条消息」不支持(见「不在本技能范围」),不要改用逐页拉全量凑数。
55
+
27
56
  ## 认证与请求头契约
28
57
 
29
- **登录与会话一律由 `weaver-e10-shared` 共享规则和 `weaver-work-cli auth ...` 命令体系托管**。业务命令返回 `authentication` / `session_expired` 时立即停止,并强制执行以下分流:
58
+ **登录与会话由 `weaver-work-cli` 底层托管,shared 只描述首次认证规则**。业务命令返回认证错误时立即停止,并执行以下分流:
30
59
 
31
- - Agent 复用任务开始时的宿主判定,禁止调用任何其他登录 Skill。
32
- - 明确为 XiaoE 时,只执行 `weaver-work-cli auth xiaoe`,不得改用 `auth login`;返回 `xiaoe_credential_unavailable` 时停止,不回退浏览器登录。
33
- - 非 XiaoE 时不得执行 `auth xiaoe`;取得用户确认的真实 E10 登录域名后,执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
60
+ - 已有 XiaoE 会话的 `session_expired` 已由 CLI 底层自动换票并重放一次;最终仍失败时 Agent 只反馈,不运行登录、其他登录 Skill 或原业务命令。
61
+ - 仅首次无会话或 `auth not found` 才复用宿主判定:XiaoE 执行一次 `weaver-work-cli auth xiaoe`,若返回 `xiaoe_credential_unavailable` 则停止;非 XiaoE 取得真实 E10 域名后执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
34
62
  - 会话恢复后只读操作可以重放;写操作不得复用旧 continuation,必须重新 prepare 和确认;`partial` / `write_uncertain` 必须先只读回查。
35
63
 
36
64
  本技能**不自建登录**:禁止扫码/账号密码/自建 OAuth 取 token,禁止使用浏览器自动化登录,也不接触、打印、转存任何认证文件。
37
65
 
38
- `weaver-work-cli im` 发往 E10 的每个请求都由 CLI 统一注入请求头三件套,业务入参里不要传这些字段,也不要手工拼装请求头;唯一权威声明见 [`../weaver-e10-shared/SKILL.md`](../weaver-e10-shared/SKILL.md) 的「请求头契约」章节。每个 operation 都已在请求头中带齐,缺任一服务端都无法识别操作者或会判定登录失效。
66
+ 本技能接口调用(由 `weaver-work-cli` 统一发起)的请求头认证契约如下,三项缺一不可:
67
+
68
+ - Cookie: <e10-login 返回的完整原始 Cookie 串>(禁止裁剪/去重/改写)
69
+ - eteamsid: <e10-login 返回的 ETEAMSID>
70
+ - User-Agent: AgentType=<agentType>,IsAgent=true
71
+
72
+ 上述 Cookie(完整原始串)、eteamsid、User-Agent 请求头三件套由 `weaver-work-cli` 统一注入,业务入参里不要传这些字段,也不要手工拼装或覆盖。**唯一权威声明**见 [`../weaver-e10-shared/SKILL.md`](../weaver-e10-shared/SKILL.md) 的「请求头契约」章节,本技能只做指针引用,不复制完整代码块。
39
73
 
40
74
  业务输入只描述业务对象与意图,凭证与请求头由 CLI 托管;需要诊断登录态时只用 `weaver-work-cli auth` / `doctor --e10` 与业务命令返回的 JSON 错误。
41
75
 
@@ -49,32 +83,96 @@ weaver-work-cli --json im run <operation> --input-json '{"key":"value"}'
49
83
 
50
84
  `schema` 是可用能力的唯一事实来源(含每个 operation 的 `inputSchema`、`risk`、`requiresConfirmation`、`deprecatedInputAliases`)。禁止把本技能或源文档里的接口路径当成可直接调用的地址,也禁止把未出现在 `schema` 中的能力当作可用 operation。
51
85
 
52
- ## Reference 路由表
53
-
54
- 命中任一条件时,执行下一步前读取对应 reference。
55
-
56
- | 触发条件 | Reference |
57
- | --- | --- |
58
- | 按姓名/工号/手机/邮箱解析人员,uid 批量解析 | [`references/person.md`](references/person.md) |
59
- | 名称 → ID 解析规则、同名消歧、未匹配处理、接口间上下文传递契约 | [`references/field-resolution.md`](references/field-resolution.md) |
60
- | 拉单聊/群聊消息、群置顶消息、消息阅读状态(只读) | [`references/msg-read.md`](references/msg-read.md) |
61
- | 发送单聊/群聊消息(文本/图片/文件)、撤回、群消息置顶(写) | [`references/msg-write.md`](references/msg-write.md) |
62
- | 必达消息:普通必达、已有消息转必达、仅未读/指定接收人(写) | [`references/ding-write.md`](references/ding-write.md) |
63
- | 搜群、群信息、群成员、群主/管理员、群存在性、群公告(读) | [`references/group-read.md`](references/group-read.md) |
64
- | 建群、邀请、踢人、退群、解散、申请入群、改群属性/群名、群公告增改删(写) | [`references/group-write.md`](references/group-write.md) |
65
- | 会话列表、系统消息分组/类型/消息查询 | [`references/session-sysmsg.md`](references/session-sysmsg.md) |
66
- | 文件上传/预览/下载到本地、用户在线状态、i18n 标签翻译 | [`references/file-user-i18n.md`](references/file-user-i18n.md) |
67
- | 把某个群/某个人/某个系统会话设为免打扰或恢复提醒 | [`references/user-remind.md`](references/user-remind.md) |
68
- | 易秒办红线(操作人字段、本人身份取用、人名解析、id 边界、分页与全量、展示完整)、写链停止条件、已知禁用边界 | [`references/safety-boundaries.md`](references/safety-boundaries.md) |
69
- | 业务错误码含义与处理建议(群 12xx / 消息 15xx / 数据 13xx + CLI 校验错误) | [`references/error-codes.md`](references/error-codes.md) |
70
- | 源资料清单、chunk 与 operation 影响索引、产物基线(源资料更新检测用) | [`references/source-manifest.json`](references/source-manifest.json) |
86
+ 若 `schema` 或 reference 提供 `inputExamples`,优先复用其中和当前意图最接近的样例并只替换用户明确给出的值;标记为 `synthetic` 的样例需业务复核,不能当作源资料事实。若 operation 标记了 `missingExamples` 或参数覆盖矩阵中的 `needs-confirmation` 字段,先向用户说明缺少哪些入参事实并索取补充,不要通过反复尝试不同 JSON 格式来猜。
87
+
88
+ ## 选哪个命令(路由表)
89
+
90
+ 命中任一条件时,执行下一步前读取对应 reference。下表「命令」列给出最常用入口;等价的 `im run <operation>` 写法以 `im schema` 为准。
91
+
92
+ | 想做什么 | 命令 | 按需读取 reference |
93
+ | --- | --- | --- |
94
+ | 按姓名/工号/手机/邮箱解析人员 | `im resolve --name <kw>`;批量按 uid 解析用 `im.person.resolveByIds` | [`references/person.md`](references/person.md) |
95
+ | 名称 → ID 解析规则、同名消歧、未匹配处理、接口间上下文传递契约 | AI 内部规则(无单独命令) | [`references/field-resolution.md`](references/field-resolution.md) |
96
+ | 拉单聊消息 | `im msg sync-single --from-uid <uid> --from-cid <cid> [--latest|--from/--to]` | [`references/msg-read.md`](references/msg-read.md) |
97
+ | 拉群聊消息、群置顶消息 | `im msg sync-group --gid <id> [--latest|--from/--to|--start-id/--end-id]`;置顶用 `im msg top --gid <id>` | [`references/msg-read.md`](references/msg-read.md) |
98
+ | 消息阅读状态 | `im.msg.read.single` / `im.msg.read.group` / `im.msg.read.group.detail` | [`references/msg-read.md`](references/msg-read.md) |
99
+ | 发送单聊消息(文本/图片/文件)、撤回 | `im send single-prepare --to-uid <对方uid> --to-cid <对方cid> --txt/--img/--file` → `im send single-apply`;撤回 `im.msg.withdraw.prepare/apply` | [`references/msg-write.md`](references/msg-write.md) |
100
+ | 发送群聊消息、群消息置顶 | `im.msg.send.group.prepare/apply`、`im.msg.top.set.prepare/apply` | [`references/msg-write.md`](references/msg-write.md) |
101
+ | 必达消息:普通必达、已有消息转必达、仅未读/指定接收人 | `im.ding.send.prepare/apply` | [`references/ding-write.md`](references/ding-write.md) |
102
+ | 搜群 | `im group search --name <kw> [--precise|--members|--owner|--creator] [--type]` | [`references/group-read.md`](references/group-read.md) |
103
+ | 群信息、群成员、群主/管理员、群存在性、群公告 | `im group info --gid <ids>`(支持逗号批量)、`im group users --gid <id>`、`im.group.admins`、`im.group.exist`、`im.group.userExist`、`im.group.announce.get/list` | [`references/group-read.md`](references/group-read.md) |
104
+ | 建群、邀请、踢人、退群、解散、申请入群、改群属性/群名、群公告增改删 | `im.group.create/invite/kick/exit/destroy/join/modify/rename/announce.modify` 的 `.prepare` → `.apply` | [`references/group-write.md`](references/group-write.md) |
105
+ | 会话列表 | `im session list [--num] [--msgid] [--flag] [--type]`(不自动翻页) | [`references/session-sysmsg.md`](references/session-sysmsg.md) |
106
+ | 系统消息分组/类型/消息查询 | `im.sysmsg.groupSearch` / `im.sysmsg.typeSync` / `im.sysmsg.query` | [`references/session-sysmsg.md`](references/session-sysmsg.md) |
107
+ | 文件上传/预览/下载到本地 | `im.file.upload` / `im.file.preview` / `im.file.download` | [`references/file-user-i18n.md`](references/file-user-i18n.md) |
108
+ | 用户在线状态、i18n 标签翻译 | `im.user.state` / `im.i18n.labels` | [`references/file-user-i18n.md`](references/file-user-i18n.md) |
109
+ | 把某个群/某个人/某个系统会话设为免打扰或恢复提醒 | `im.user.setRemind.prepare/apply` | [`references/user-remind.md`](references/user-remind.md) |
110
+ | 易秒办红线、写链停止条件、已知禁用边界 | AI 内部规则(写操作前必读) | [`references/safety-boundaries.md`](references/safety-boundaries.md) |
111
+ | 业务错误码含义与处理建议 | AI 内部规则(失败时读) | [`references/error-codes.md`](references/error-codes.md) |
112
+ | 源资料清单、chunk 与 operation 影响索引、产物基线 | 源资料更新检测用 | [`references/source-manifest.json`](references/source-manifest.json) |
113
+
114
+ ## 处理链(常见多步链路,避免临时拼步骤)
115
+
116
+ - **拉某人的聊天记录**:`im resolve --name <姓名>` 取 `uid`+`cid` → `im msg sync-single --from-uid <对方uid> --from-cid <对方cid>`(缺省当天;要更早用 `--latest` 或 `--from/--to`)→ 按展示规则输出。对不上人时先问用户确认,不要猜。
117
+ - **拉某个群的聊天记录**:`im group search --name <群名>` 或 `--members` 取 `groupId` → `im msg sync-group --gid <群id>` → 输出。群名唯一命中可直接用;多个同名群必须让用户选。
118
+ - **发单聊消息**:`im resolve`/`resolveByIds` 定接收人 → `im send single-prepare` → 展示 `summary` 并确认 → `im send single-apply` → 按 apply 响应汇报结果。**要引用某条消息**:传 `quoteMsgId` = 该单聊会话内消息 `msgid`(prepare 自动定位并组装 ref);**单聊仅支持引用,不支持回复**(传 `replyMsgId` 会被拒绝)。
119
+ - **发群聊消息**:`im group search`/`group info` 定 `groupId` → `im.msg.send.group.prepare` → 确认 → `im.msg.send.group.apply` → 按 apply 响应汇报结果。**要 @ 人**:`txt` 里直接写 `@<姓名>`,同时传 `atUids`(uid 数组,prepare 会核实都在群内)或 `atAll:true`(@全体成员);仅群聊、仅文本消息支持,@具体人不在群内会被拒绝,如实告知用户即可。**要引用/回复某条消息**:传 `quoteMsgId`(引用)或 `replyMsgId`(回复)= 被引消息 `msgid`(二选一,可与 @ 叠加),prepare 自动定位被引消息并组装原生 ref/rmsg。
120
+ - **发必达/催办**:定接收人或源消息(`msgid`)→ `im.ding.send.prepare` → 展示接收人数量与范围 → 确认 → `im.ding.send.apply` → 按 apply 响应汇报结果。
121
+ - **建群并拉人**:`im resolve` 逐个解析成员(同名必须消歧)→ `im.group.create.prepare` → 确认群名与成员清单 → `im.group.create.apply` → 取 `groupId` 后逐项 `im.group.invite.prepare/apply`。**不要建群后再拉群成员核对**。
122
+ - **设/取消免打扰**:确定会话类型(`1` 单聊 `toUid`+`toCid` / `2` 群聊 `groupId` / `4` 系统会话 `group`)→ `im.user.setRemind.prepare` → 确认 → `im.user.setRemind.apply`。
123
+ - **看图片/取附件**:从消息 `media[]` 取 `fileId`/`msgid` → 提醒用户文件将落地本地并确认路径 → `im.file.download`(父目录须存在、已存在不覆盖)。
124
+ - **查系统消息**:`im.sysmsg.groupSearch` 拿分组 id → `im.sysmsg.typeSync` 拿类型 id → `im.sysmsg.query`(`start` 为排除边界)。
125
+
126
+ ## 执行原则(减少误路由、误重试和无效消耗)
127
+
128
+ 本文件在技能加载时已整体注入上下文,**不要再用 Read 读本 SKILL.md**;仅需核对 `version` / `agent_created` 时读前 15 行,且**修改本包内文件不必先确认 `agent_created`**(此处已声明 `true`)。
129
+
130
+ ### 1) 先拿最小必要信息,再执行
131
+
132
+ - 只是拉聊天记录时,直接用 `im msg sync-single`/`sync-group`,不要先 `session list` 再筛。
133
+ - 列表类默认先取小页:会话列表 `--num 20`(默认)、群搜索 `--page-size`(默认 100,最多 200);用户没要求全量时不要自动扫完。
134
+ - 用户没给时间范围时按**当天**拉;要更早的记录先问清口径(具体日期或「最近 N 天」),不要默认拉全量。
135
+ - 已经给出 `groupId` / `msgid` / `uid` / `cid` 时不要先 search 再过滤,直接进对应 operation。
136
+ - **只读命中路由的那个 reference**;reference 已覆盖的参数不要再跑 `--help`,`schema` 只用于确认 operation 清单与风险等级。
137
+ - **同一字段不重复查**:一轮内已有新鲜结果就复用,不要为「再确认一次」重跑同一个只读 operation。
138
+ - **改本包内 reference 时**,`Edit` 自身会读取原文件做精确匹配,不要在此之前额外 Read 一遍。
139
+
140
+ ### 2) 大结果只摘要给用户
141
+
142
+ - 当前 CLI 的 `--json` 会把完整 JSON envelope 写 stdout;Agent 回复时不要原样粘贴完整 JSON。
143
+ - 列表(会话 / 群搜索 / 群成员 / 阅读状态)只展示最相关的前 10 条,带关键 id、名称、时间、数量;需要更多时用 `nextMsgid` / 页码显式续拉,并说明已读页数与是否还有更多。
144
+ - **消息正文例外**:聊天消息 `content` 必须完整展示、不截断,见「输出与展示规则」。
145
+ - 超长文本、OCR/导出/详情原始响应或调试 JSON 需要保留时,优先落本地文件并向用户提供摘要和路径。
146
+
147
+ ### 3) 已知对象时直达动作
148
+
149
+ - 已拿到 `groupId`、`msgid`、`uid`/`cid`、本地文件路径时,直接调用对应 operation,不要再走 `search → info → users` 全链路。
150
+ - 同一轮里已有新鲜查询结果时,不要重复查询同一会话、同一群或同一成员列表。
151
+
152
+ ### 4) 错误语义驱动,而不是盲目重试
153
+
154
+ - 失败后先看进程退出码、`error.type`、`error.subtype` 和 `error.message`,不要用退出码 `0` 判断成功。
155
+ - **除非错误明确提示可恢复或需要补充参数,否则不要重复刷同一个 operation**。
156
+ - 写请求已经发出后,遇到结果不确定必须停止;不要把 `.apply` 当成可重试读操作。
157
+
158
+ ### 5) 附件、图片和文件解析确认
159
+
160
+ - 命中 `im.file.upload`、`im.msg.send.*` 带 `--img`/`--file`、`im.file.download`、读取本地图片/文件或复用已上传文件对象时,**必须先提醒用户**:文件内容可能被上传到 E10 易秒办与文件服务,并可能进入当前大模型上下文用于理解和处理。
161
+ - 用户未明确确认前,不要运行会读取、上传、下载或解析该文件的命令;确认信息里要带上具体文件路径/名称与目标接收人。
162
+ - 下载落地是写本地文件:`output` 必须是明确路径、父目录须已存在、目标已存在时 CLI 拒绝覆盖;不要为了「省事」改成覆盖写。
163
+
164
+ ### 6) 写操作以 apply 响应为准,不做二次校验
165
+
166
+ - `<op>.apply` 返回 `ok:true` **即视为成功**,直接向用户汇报"做了什么、返回了哪些 id",**不要再拉群成员、拉群消息、查群信息、查会话列表去证明它成功了**。
167
+ - 明确禁止的事后核对:建群后 `group.users` 核对成员是否入群、邀请后回查人数、踢人后回查名单、解散后 `group.info` 确认消失、发消息后 `msg.sync.*` 找那条消息、必达后翻系统消息确认送达、免打扰后翻会话列表看 `dontDisturb`。
168
+ - 只有**结果确实未知**时才需要停下(`partial` / `write_uncertain` / 超时 / 响应丢失):如实告诉用户"命令已发出但结果未知",并问是否需要回查;**由用户决定后**再执行一次只读查询,不要自动回查、更不要自动重试。
169
+ - `prepare` 内部的只读解析(成员解析、源消息读取、人数回查)属于 CLI 自身逻辑,不需要 Agent 重做一遍。
71
170
 
72
171
  ## 关键差异(必须先知道)
73
172
 
74
- - **消息以 `msg` JSON 字符串 + `datas[].datas[]` 行结构返回**:CLI 的 `msg.sync.*`/`msg.top.sync` 已把每条消息解析成结构化行(`msgid/sender/time/typeName/content/media/must/fileName/...`),`content` 是可读文本(@ 提及已还原、媒体显示为 `[图片]名称`/`[视频]名称`/`[文件]名称`、必达内容带 `[必达]` 前缀)。解析结果直接使用,不要再本地拼装。
173
+ - **消息以 `msg` JSON 字符串 + `datas[].datas[]` 行结构返回**:CLI 的 `msg.sync.*`/`msg.top.sync` 已把每条消息解析成结构化行(`msgid/sender/time/typeName/content/media/must/fileName/...`),`content` 是可读文本(@ 提及已还原、媒体显示为 `[图片]名称`/`[视频]名称`/`[文件]名称`、必达内容带 `[必达]` 前缀)。**引用/回复消息**在行内多一个顶层 `quote`(kind/id/fromName/text)与 `quoteTime`,展示时必须带上引用关系。解析结果直接使用,不要再本地拼装。`content` 里的换行以 `⏎` 表示,不要按 `\n` 拆分。
75
174
  - **分页口径(与源 skill 一致)**:消息类每页默认 **50** 条、单页上限 **50**;**有界区间(指定了时间范围、默认当天、或显式 `end`/`endId`)自动循环翻页把区间拉完再返回**(最多 100 页,触及上限时返回 `hasMore:true` + `nextStart`);**无界区间(`latest:true`)只拉一页**,需要更早数据时用 `nextStart` 继续。**会话列表(`session.list`)不参与自动翻页**(默认 20、上限 50,用 `msgid`/`nextMsgid` 翻页)。
76
175
  - **时间范围强制收敛到 7 天**:单聊/群聊/系统消息的 `from`/`to` 跨度 > 7 天时,CLI 自动缩短为该范围**最后 7 个自然日**,并在 `data.rangeShrink` 返回 `notice`。**展示结果时必须把这条收敛提示原样转述给用户**,不要静默省略,也不要替用户改小范围。
77
- - **展示顺序**:消息按消息 id 从新到旧(最新在前)返回;`content` 完整不截断,表格化时自行转义 `|`、保留换行与 `[必达]` 前缀、媒体保持可点击链接。
78
176
  - **发送者「我」由 CLI 判定**:`sender` 与当前登录人 IM uid 比对,自己发的消息返回「我」;他人优先消息内 `sname`、其次 hrm 姓名、最后回退 uid。
79
177
  - **人名一律由 CLI 走 hrm 解析**(`/api/hrm/common/getEmployeeByIds`),本技能不展示也不依赖 IM 群成员 `name` 字段;群成员接口返回的 `name` 不可信。
80
178
  - **本人 IM 身份(cid/uid)只用于本机组装**:`group.search` 的 `members/owner/creator` 条件、撤回消息体、必达消息体、建群自检、消息展示「我」都用 CLI 通过 `teamsCheck` 取得的本人 `imCid`/`imUid`;**它绝不作为请求体操作人字段,也不接受调用方传入**(传 `user`/`sender`/`operator` 会被拒绝:`forbidden_key`)。
@@ -85,22 +183,32 @@ weaver-work-cli --json im run <operation> --input-json '{"key":"value"}'
85
183
 
86
184
  ## 写操作决策树(prepare → apply)
87
185
 
88
- 易秒办所有写操作(发消息/撤回/置顶/必达/群组写操作)统一为两段式,均在 `schema` 中带 `requiresConfirmation`:
186
+ 易秒办所有写操作(发消息/撤回/置顶/必达/群组写操作/免打扰)统一为两段式,均在 `schema` 中带 `requiresConfirmation`:
89
187
 
90
188
  1. 调用 `<op>.prepare`(只读校验:解析成员、读源消息、计算接收人),得到 `summary` + `continuation`。
91
189
  2. 向用户展示 `summary`(动作、目标、数量、差异/风险),请求明确确认。
92
190
  3. 用户确认后调用 `<op>.apply`,传 `{"confirm":true,"continuation":"<prepare 返回的 token>"}`。
93
- 4. `apply` 返回 `partial` / `write_uncertain` 或网络中断时**立即停止,不自动重试**,先做一次只读回查(如群成员、消息是否已存在)再决定。
191
+ 4. `apply` 返回 `ok:true` 即成功,直接汇报结果并结束;**不要追加只读回查**。只有 `partial` / `write_uncertain` / 超时 / 响应丢失时才立即停止、如实说明"结果未知"、**不自动重试**,是否回查由用户决定(见「执行原则 6」)。
192
+
193
+ continuation 由 CLI 用 HMAC-SHA256 签发、10 分钟有效、绑定 baseUrl/profile/userId 与目标指纹,**不手工拼、不复用、不跨操作**。任何一步出现登录失效/上下文变化(`context_mismatch`/`continuation_expired`/`target_changed`)都回到第一步重新 prepare。可安全重试的只有 `prepare` 这类纯只读准备。
94
194
 
95
- 任何一步出现登录失效/上下文变化(`context_mismatch`/`continuation_expired`/`target_changed`)都回到第一步重新 prepare。
195
+ ## 输出与展示规则
196
+
197
+ - **消息正文完整不截断**:`content` 原样展示,无论多长;不得截断、省略或以「…」改写。顺序按 CLI 返回(消息 id 从新到旧,最新在前)。
198
+ - **表格化时转义**:正文里的 `|` 转义为 `\|`,换行用 `⏎` 标注,`[必达]` 前缀保留在最前。
199
+ - **媒体保持可点击**:展示为 `[图片]名称` / `[视频]名称` / `[文件]名称`,`previewUrl`/`downloadUrl` 原样保留为可点击 Markdown 链接(需登录态,直接打开可能 401),真正取回附件用 `im.file.download`。
200
+ - **收敛提示必须转述**:`data.rangeShrink.notice` 原样转述给用户,不静默省略。
201
+ - 展示口径必须写明本次实际范围(如「默认拉了今天,共 N 条」或「已收敛为 2026-10-15~2026-10-21,共 N 条」)。
96
202
 
97
203
  ## 失败处理
98
204
 
99
- - 业务失败看 stderr JSON 的 `error.type` / `error.subtype` / `error.message`,不要用退出码 `0` 判断成功。
100
- - `code=302` 或认证类错误(`session_expired`):按共享规则引导用户重新登录,禁止猜域名或手工拼凭证。
205
+ - 业务失败:CLI 会输出 `ok:false` 的 JSON envelope,**stdout 与 stderr 各一份(内容相同)**;读 `error.type` / `error.subtype` / `error.message`,不要用退出码 `0` 判断成功。只读 stdout 的调用方也能拿到错误,不需要再单独接 stderr。
206
+ - 需要知道「这一次到底打了几个接口、各花了多久」时,加 `im --trace`(im 命令级开关,等价环境变量 `WEAVER_WORK_CLI_TRACE=1`):每个 HTTP 请求在 stderr 打一行 `[trace] POST /api/... op=... status=200 123ms`,不含 Cookie/eteamsid。**只在排障/统计时用,正常调用不要加**。
207
+ - `code=302` 或 `session_expired`:XiaoE 的底层自动恢复已执行,最终仍失败时停止并反馈,禁止再次登录、重试或手工拼凭证。
101
208
  - 业务语义错误码:`1303` 表示无聊天记录(成功空列表,看 `emptyReason`);群不存在 `1209`;`members_resolve_failed`/`members_empty` 说明成员解析失败,向用户说明后请其决定是否 `removeFailed:true` 继续;其余码值对照 [`references/error-codes.md`](references/error-codes.md)。
102
209
  - `alias_conflict`:旧字段(如 `filePath`/`shareGroups`)与新字段同时出现且取值不一致,请只保留一个。
103
- - 展示给用户时保持「完整不截断」红线,参考 [`references/safety-boundaries.md`](references/safety-boundaries.md)。
210
+ - `output_exists` / `output_parent_missing`:下载目标冲突,换路径或先建父目录,不要覆盖既有文件。
211
+ - 数据与预期不符(返回 0 条、条数不符、字段缺失)时,先给证据再让用户选方向,禁止换参数反复探测或编造数据;提问模板见 [`references/safety-boundaries.md`](references/safety-boundaries.md)。
104
212
 
105
213
  ## 平台兼容
106
214
 
@@ -119,3 +227,18 @@ weaver-work-cli --json im run im.msg.sync.group --input-json '{"groupId":"178833
119
227
  ```
120
228
 
121
229
  复杂 JSON 建议保存为 UTF-8 文件后按平台传给 `--input <file>`;Windows PowerShell 下不要使用 `printf`、`~/` 路径或反斜杠续行。
230
+
231
+ ## 不在本技能范围
232
+
233
+ - **禁止绕过 CLI 直连接口**:不得用 curl / fetch / 浏览器自动化直接访问 `/api/em/msg/executeIm/...` 等原始路径;`schema` 之外的接口路径一律不可调用。
234
+ - **禁止自建登录**:登录与会话一律由 `weaver-e10-shared` + `weaver-work-cli auth` 提供,不得自行实现登录流程,也不得自行换取或拼接会话凭证。
235
+ - **禁止读取或复制 CLI runtime 内部 Token、Cookie、ETEAMSID**,包括打印、落盘、写进业务入参。
236
+ - 禁止读取、列出、打印或解析用户主目录下的旧 `.e10-cli`、auth、config 或 Keychain 数据。
237
+ - **不支持统计消息总数 / 会话总数**,也不做消息统计分析、报表、词云等衍生加工。
238
+ - **不支持删除或清空消息、编辑已发消息**:只能撤回本人消息(有时限),他人消息与超过时限的消息不可撤回。
239
+ - **不支持建非普通群**(部门群 / 全员群 / 事项群等):`im.group.create` 只建普通群(type=0)。
240
+ - **不支持定时推送、机器人托管、自动回复、群机器人接入**。
241
+ - **不支持移动端打卡、定位、设备凭证**,不做跨平台 IM(企业微信 / 钉钉 / 邮件)代发;这类请求请改用对应技能。
242
+ - **不支持「按接口未支持的字段做本地过滤」**(免打扰、未读、发送人等):接口不支持就如实告知,引导改用原生参数(`flag` / `deal` / `type` 等),不要先拉数据再本地筛。
243
+ - **不支持已读回执的主动标记、系统消息的「已处理」状态回写**:CLI 未暴露,避免伪装处理。
244
+ - 非 IM 类 E10 能力(发票、报销、表单、审批、组织架构等)不由本 Skill 承载。
@@ -59,7 +59,7 @@ weaver-work-cli --json im run im.ding.send.apply --input-json '{"confirm":true,"
59
59
 
60
60
  - 必达是**高打扰**动作:默认全体成员 + 发短信,必须向用户明确说明接收范围和短信费用,经确认后才 apply。
61
61
  - `unreadOnly:true` 转必达依赖目标消息存在且群内有未读人员;源消息找不到(`source_not_found`)或全员已读(`unread_empty`)都会失败,按错误向用户说明,不自动回退全员。
62
- - apply 不确定(网络/超时)时停止,用 `im.msg.top.sync`/拉群消息或系统消息只读回查必达是否已发出,**不自动重试**(避免重复必达)。
62
+ - apply 返回 `ok:true` 即视为必达已发出,直接汇报,**不要**再用系统消息/群置顶/群消息去证明送达。仅当 apply 结果不确定(网络/超时/`partial`)时停止并说明"结果未知",**不自动重试、不自动回查**(避免重复必达),由用户决定是否核对。
63
63
 
64
64
  ## 失败处理
65
65
 
@@ -1,6 +1,6 @@
1
1
  # 易秒办错误码参考
2
2
 
3
- 接口返回非 0 错误码(`actionMsg.code` / `ret`)时,据此向用户解释原因;成功码为 `0`。命令失败时 stderr JSON 的 `error.code` / `error.subtype` / `error.message` 与之对应,**不要用退出码 0 判断成功**。
3
+ 接口返回非 0 错误码(`actionMsg.code` / `ret`)时,据此向用户解释原因;成功码为 `0`。命令失败时 CLI 输出 `ok:false` 的 JSON envelope(**stdout 与 stderr 各一份,内容相同**),`error.code` / `error.subtype` / `error.message` 与接口码对应,**不要用退出码 0 判断成功**。要统计接口级调用次数与耗时,加 `im --trace`(每请求一行 `[trace]`,不含凭证)。
4
4
 
5
5
  ## 通用 / 基础
6
6
 
@@ -90,6 +90,10 @@
90
90
  | `num_invalid` / `time_invalid` | `num` 非正整数,或时间参数无法解析(支持 unix 秒 / `YYYY-MM-DD` / `YYYY-MM-DD HH:mm:ss`) |
91
91
  | `session_type_invalid` / `reminder_invalid` | 会话提醒设置(`im.user.setRemind`)的 `sessionType` 不是 `1` 单聊会话 / `2` 群聊会话 / `4` 系统会话,或 `reminder` 不是 `0` 接收提醒 / `1` 免打扰 |
92
92
  | `target_required` 补充 | 会话免打扰目标缺失:单聊会话缺 `toUid`/`toCid`、群聊会话缺 `groupId`、系统会话缺 `group` |
93
+ | `at_not_supported` / `at_requires_txt` | @ 提及仅群聊文本消息支持:单聊传 `atAll`/`atUids`,或 @ 与 `img`/`file` 同发 |
94
+ | `at_members_unavailable` / `at_member_not_in_group` | 核实 @ 目标时群成员拉取失败 / @ 目标不在群内(系统成员不可 @),列出未进群 uid |
95
+ | `quote_requires_txt` / `reply_not_supported` / `quote_target_required` | 引用与 `img`/`file` 同发(仅文本)/ 单聊传了 `replyMsgId`(**单聊仅支持引用**,不支持回复)/ 单聊引用缺少 `toUid`+`toCid` |
96
+ | `quote_id_invalid` / `quote_conflict` / `quote_msg_not_found` | 引用 id 非 0 纯数字 / `quoteMsgId` 与 `replyMsgId` 同时传(二选一)/ 被引消息定位不到(不在群内或已撤回) |
93
97
 
94
98
  ## 拉取口径相关的成功语义(非错误)
95
99
 
@@ -19,6 +19,9 @@
19
19
 
20
20
  - 搜群至少给一个条件;`type` 常见 1 普通/6 部门/7 全员。搜索/过滤全部由服务端完成,**禁止本地过滤结果**。
21
21
  - `group.users` 默认返回 uid/cid/角色/入群时间(mask=142),**默认不含 `name` 位**;姓名由 CLI 逐条走 hrm 解析后回填 `name`。不要依赖接口自身的 name 字段。
22
+ - 🔴 **`group.info` 的 `creatorUid` / `creatorCid` 是「群创建者」,不是群主**(服务端字段 `host_uid` / `host_cid`)。转让群主后这两个字段**不会变**,联机实测已复现:把群主转给他人后,`creatorUid` 仍是建群的人。
23
+ - 🔴 **群主只认成员列表的 `role`**:`im.group.users` 返回 `role` / `roleName`(`0 不可用 / 1 普通成员 / 2 管理员 / 3 群主 / 4 客户 / 5 负责人 / 6 协助人员`),`role=3` 即群主;批量场景用 `im.group.admins`。**不要用 `creatorUid` 推断群主**。
24
+ - 🔴 **系统成员不是真实员工**:服务端可能在建群时自动补入 1 个系统成员(`cid=10002`,群内系统消息的投递载体,属租户可选能力)。`members[]` 里它的 `isSystem=true`、`name` 回落成 uid、hrm 解析不到。`totalNum` 含它,`personNum` 已排除它;判断「群里还剩几个人」「是不是只剩自己」请用 `personNum`。
22
25
  - 成员增量同步:拿到 `server_uc` 游标后传 `syncType:1` + `clientUc` 拉增量。
23
26
  - `group.announce.list` 单页若干条;还有更多时用返回的 id 锚点继续请求下一页。
24
27
  - `group.announce.get` 返回 `found`(是否查到公告)+ `aid`/`annouce`/`addUserName`/`time`/`updateTime`/`mustRead`/`related`;查不到时为 `found:false`(不是报错)。
@@ -44,7 +47,8 @@ weaver-work-cli --json im run im.group.info --input-json '{"groupIds":["17883342
44
47
  ## 输出处理
45
48
 
46
49
  - 群搜索结果:`data.groups[]` 每行是 `id`(群 id)/`name`/`type`/`num`(群人数)/`createTime`;结果量大时按共享规则汇总渲染(列群名/id/人数/类型),不要整表倾倒。
47
- - 成员列表:`data.members[].name` 是 hrm 解析结果,角色取 `roleName`、入群时间取 `addTime`;响应还带 `totalNum`(成员总数)、`endFlag`、`serverUc`(增量同步游标)。展示大群成员时按需分页输出。
50
+ - 成员列表:`data.members[].name` 是 hrm 解析结果,角色取 `roleName`、入群时间取 `addTime`;响应还带 `totalNum`(含系统成员的原始条数)、`personNum`(真实成员数)、`endFlag`、`serverUc`(增量同步游标)。展示大群成员时按需分页输出,**系统成员(`isSystem:true`)不必出现在名单里**,可单独一句说明「另有 1 个系统成员」。
51
+ - 群信息:`data.groups[]` 的 `creatorUid`/`creatorCid` 只用来回答「谁建的群」;问「谁是群主」必须另取 `group.users` 里 `role=3` 的人(或 `group.admins`)。
48
52
  - 「谁在群里」用 `group.userExist`:返回 `users[].inGroup` 布尔,便于区分在群/不在群。
49
53
  - 群公告内容同样"完整展示不截断"。
50
54
 
@@ -20,13 +20,14 @@
20
20
 
21
21
  - `users` 可以是数组 `["uid1","uid2"]` 或逗号串 `"uid1,uid2"`。成员先经 hrm 解析出 uid+cid;解析失败且未传 `removeFailed:true` 会中止并列出失败成员,由用户决定是否移除失败项继续。
22
22
  - 建群:**`users` 必须包含操作者自己**(否则返回 `self_not_included`,服务端会把操作者设为群主);`name` 缺省时 CLI 按"自己的姓名 + 另外最多 4 个成员姓名"生成群名(可传 `names` 与 `users` 顺序一一对应覆盖姓名);`admins` 指定管理员(解析失败会中止并列出失败人)。
23
+ - 建群后**实际成员数可能比 `users` 多 1**:服务端会自动补入一个系统成员(`cid=10002`,群内系统消息载体,属租户可选能力,可自行开启/关闭)。这是产品行为不是缺陷,`create.prepare` 的 `summary.systemMemberNote` 已说明;`group.users` 里它 `isSystem:true`,**不要去踢它**(无法枚举、无 hrm 资料,且踢掉会影响群内系统消息)。
23
24
  - 解散群风险最高,prepare 的 summary 必须向用户明确"不可恢复、仅群主可解散"。
24
25
  - `group.modify` 传字段即改该字段:`num` 人数、`switchs`(`flag:onoff` 逗号串,如 `1:1,8:0`)、`admins`(新增管理员,字段 `admins`)、`delAdmins`(移除管理员,字段 `del_admins`,**两者语义不同不能混用**)、`creator` 转让群主、`history`、`gtId` 等;**禁止传操作人字段**(操作者由会话 eteamsid 识别)。管理员/群主解析失败会中止,确认移除后可传 `removeFailed:true`。
25
26
  - `group.rename` 一次只能改一项(顺序枚举 mask):`name`/`history`/`host`(转让群主,uid)/`display`/`msgSetting`/`mark`/`gtid`;`announce`/`type`/`state` 被禁用(公告走 `group.announce.modify`,type/state 属高危)。
26
27
  - 建群成功返回新建群 `groupId`(服务端字段 `group_id`)与 `rawData`;`group.announce.modify` 新增/修改返回 `aid`,删除返回被删除的 `aid` 且 `deleted:true`。
27
28
  - 公告:`annouce` 内容;`aid` 缺省/0=新增、非 0=修改、`del:true`+`aid`=删除。`notice` 0 发通知(默认)/1 不发/2 发并@全体;`fmark` 新人必看。
28
29
  - 群 id 一律字符串非 0。
29
- - **加入群(`group.join`)是"提交申请"而不是"立即进群"**(联机实测):`apply` 成功会返回 `flag:0` + `note:"需管理员/群主审批"`,真正入群要等群主/管理员审批;若该群已无成员或不允许申请,会直接业务失败 `1210 没有权限`。申请后不要反复重试,也不要自行猜测是否已入群,用 `group.userExist` 复核。
30
+ - **加入群(`group.join`)是"提交申请"而不是"立即进群"**(联机实测):`apply` 成功会返回 `flag:0` + `note:"需管理员/群主审批"`,真正入群要等群主/管理员审批;若该群已无成员或不允许申请,会直接业务失败 `1210 没有权限`。申请后**按"申请已提交"汇报即可**,不要反复重试,也不要用 `group.userExist` 去复核是否已入群(审批异步,立刻查只会得到"未入群")。
30
31
 
31
32
  ## 命令
32
33
 
@@ -61,10 +62,11 @@ weaver-work-cli --json im run im.group.invite.apply --input-json '{"confirm":tru
61
62
  ## 注意
62
63
 
63
64
  - 踢人、解散、转让群主都是不可逆/高影响动作,summary 必须讲清对象与后果,等用户明确确认。
64
- - **退群(`group.exit`)有护栏**:`prepare` 会只读回查群人数与群主;当你**是群主**或**是群里最后一个成员**时,必须显式传 `acknowledgeOrphanRisk:true` 才会签发 continuation,否则返回 `owner_exit_ack_required`。原因(联机实测):这两种情形退群后群会变成**无主空群**,之后 `group.join` / `group.destroy` 都会被服务端拒绝(`1210 没有权限`),只能由客户端或管理员处理——不要为了"演练"随意退掉自己建的群。
65
- - 退群/解散/踢人前可先 `group.users` 只读回查当前成员与身份,避免误操作。
65
+ - **退群(`group.exit`)有护栏**:`prepare` 会只读回查**群成员列表的 `role`**(`role=3` 才算群主)与**真实成员数**(已排除 `cid=10002` 的系统成员);当你**是群主**或**是群里最后一个真实成员**时,必须显式传 `acknowledgeOrphanRisk:true` 才会签发 continuation,否则返回 `owner_exit_ack_required`。原因(联机实测):这两种情形退群后群会变成**无主空群**,之后 `group.join` / `group.destroy` 都会被服务端拒绝(`1210 没有权限`),只能由客户端或管理员处理——不要为了"演练"随意退掉自己建的群。
66
+ - 群主判定**不要看 `group.info` 的 `creatorUid`**:那是群创建者,转让群主后不会更新。转让给他人后 `exit.prepare` 会正常放行(联机实测:`isOwner:false`)。
66
67
  - apply 阶段只传 `confirm:true` + continuation;业务参数以 prepare 快照为准。
67
- - 不确定结果(partial/超时)时**不自动重试**,先 `group.info`/`group.users` 回查实际状态。
68
+ - **apply 返回 `ok:true` 即成功,直接汇报结果**:不要建群后拉 `group.users` 核对成员、不要邀请/踢人后回查人数或名单、不要解散后 `group.info` 确认群已消失。这些回查属多余动作,统一禁止。
69
+ - 不确定结果(`partial`/超时/响应丢失)时**不自动重试、不自动回查**:告知用户"命令已发出但结果未知",由用户决定是否查一次 `group.info`/`group.users`。
68
70
 
69
71
  ## 失败处理
70
72
 
@@ -43,6 +43,7 @@ weaver-work-cli --json im run im.msg.top.sync --input-json '{"groupId":"17883342
43
43
  ## 输出处理
44
44
 
45
45
  - `data.messages[]` 是已解析的结构化行:`sender`(姓名,走 hrm)、`time`、`typeName`(文本/图片/视频/文件…)、`content`(完整文本,不截断)、`media`(图片/视频/文件的预览与下载 URL,需登录态访问)、`must`(必达标记,`true` 展示加 `[必达]` 前缀)等。
46
+ - **引用/回复消息**:行内出现顶层 `quote`(`kind`:`quote` 引用 / `reply` 回复;含被引消息 `id`、被引人 `fromName`、被引内容 `text`、`quoteTime` 被引时间)。展示时把引用信息与正文一起呈现(如 `回复 <fromName>:<text>:<正文>`),不要只展示正文漏掉引用关系。
46
47
  - 顺序:消息按消息 id **从新到旧**(最新在最前)返回。
47
48
  - 分页字段:`pages`(本次实际拉了几页)、`autoPaged`(是否走了自动翻页)、`pageSize`、`exhausted`、`hasMore`、`nextStart`(还有更早数据时的续拉锚点)、`range.scope`(`today`/`range`/`latest`/`explicit-id`)、`rangeShrink`(7 天收敛提示)。
48
49
  - `sender` 为自己时显示「我」(CLI 用会话 uid 判定);媒体消息的 `content` 形如 `[图片]a.png` / `[视频]b.mp4` / `[文件]c.pdf`,同时单列 `fileName` 便于渲染。