weaver-work-cli 0.1.39 → 0.1.42

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 (197) hide show
  1. package/README.md +4 -2
  2. package/dist/chunks/{archive-ENZYBBME.js → archive-J4I6MCKF.js} +2 -2
  3. package/dist/chunks/{archive-oa-YWLEC5V4.js → archive-oa-BRZKKTO4.js} +2 -2
  4. package/dist/chunks/{asset-OOV6DWPA.js → asset-L7D4FAOZ.js} +2 -2
  5. package/dist/chunks/{asset-idle-RE632MY5.js → asset-idle-DADLLV75.js} +2 -2
  6. package/dist/chunks/{attachment-content-RWN2FCLL.js → attachment-content-K4C7VLWQ.js} +3 -3
  7. package/dist/chunks/{blog-PEPOJAL7.js → blog-BVGQ7NZL.js} +2 -2
  8. package/dist/chunks/{caizhilian-WYIQDVPJ.js → caizhilian-SAADNFD6.js} +2 -2
  9. package/dist/chunks/{calendar-CIARBAOX.js → calendar-Q7NQY5Z2.js} +61 -23
  10. package/dist/chunks/{chunk-F2EQXUEE.js → chunk-3KTFS4IA.js} +397 -159
  11. package/dist/chunks/{chunk-G2JSIUWF.js → chunk-4PD5NWAX.js} +89 -0
  12. package/dist/chunks/{chunk-HJYVHXUQ.js → chunk-4RAE6JXP.js} +1 -1
  13. package/dist/chunks/{chunk-CQHGNCK2.js → chunk-72CKAUAG.js} +41 -8
  14. package/dist/chunks/{chunk-K3RUEEOL.js → chunk-APVFJUQH.js} +2 -2
  15. package/dist/chunks/{chunk-BJGXMFGD.js → chunk-BBKDXQEC.js} +2 -2
  16. package/dist/chunks/chunk-BIPYLLVS.js +501 -0
  17. package/dist/chunks/{chunk-GVPJZXJ2.js → chunk-EKWAQSLU.js} +92 -50
  18. package/dist/chunks/{chunk-XXJOSZTQ.js → chunk-FOAA27U5.js} +381 -57
  19. package/dist/chunks/{chunk-I2HB737U.js → chunk-G4UR6NXN.js} +2 -2
  20. package/dist/chunks/{chunk-YS5DPN4T.js → chunk-GEWYMQME.js} +1 -1
  21. package/dist/chunks/{chunk-P2DAISYW.js → chunk-GHXCDPTM.js} +1 -1
  22. package/dist/chunks/{chunk-L4N7B7ZD.js → chunk-IZ7S7QUS.js} +4 -4
  23. package/dist/chunks/{chunk-NLK2RZKG.js → chunk-JPRO6ER2.js} +122 -2214
  24. package/dist/chunks/{chunk-36DIFZAH.js → chunk-LADPYOWC.js} +2 -2
  25. package/dist/chunks/chunk-LDZQPUIA.js +1238 -0
  26. package/dist/chunks/chunk-NKZRQXST.js +2546 -0
  27. package/dist/chunks/{chunk-EINRJHQ3.js → chunk-QKNKR4RH.js} +3 -3
  28. package/dist/chunks/{chunk-T7JDJJ7H.js → chunk-R4CHUSKC.js} +126 -19
  29. package/dist/chunks/{chunk-EZGFHJFW.js → chunk-SA6VBIHY.js} +88 -15
  30. package/dist/chunks/{chunk-ZXRNHZTE.js → chunk-TTPJJJC4.js} +2 -2
  31. package/dist/chunks/{chunk-KTCB5R5H.js → chunk-W7BEHOSR.js} +2 -2
  32. package/dist/chunks/{chunk-MUQUHKPG.js → chunk-YRSZQUD2.js} +2 -2
  33. package/dist/chunks/{conflict-DRMDOL56.js → conflict-F2OMZRTO.js} +2 -2
  34. package/dist/chunks/{contract-73MERZWN.js → contract-5BETHRSG.js} +2 -2
  35. package/dist/chunks/{cowork-HNGBPD7A.js → cowork-3MN6EQQO.js} +27 -10
  36. package/dist/chunks/create-flow-5FQNNMVO.js +55 -0
  37. package/dist/chunks/{ebuilder-form-OY6DVNRK.js → ebuilder-form-SBHOYBUD.js} +3 -3
  38. package/dist/chunks/{ehr-RAQNEQO7.js → ehr-KMOJULKG.js} +432 -1234
  39. package/dist/chunks/env-LB7NBL2O.js +19 -0
  40. package/dist/chunks/{esb-6XV7C7YV.js → esb-W2PJCFCX.js} +4 -4
  41. package/dist/chunks/factory-6ZFQXQ46.js +30 -0
  42. package/dist/chunks/{fna-XTSRB7G7.js → fna-ZQPCUV4R.js} +2 -2
  43. package/dist/chunks/group-chat-2HHAJN46.js +20 -0
  44. package/dist/chunks/{host-YMBXWFWX.js → host-4CBHGOHT.js} +3 -3
  45. package/dist/chunks/{host-A7J6GDUP.js → host-ATKVNZAT.js} +3 -3
  46. package/dist/chunks/{host-3F5UM5GN.js → host-BQH22NTQ.js} +3 -3
  47. package/dist/chunks/{host-YAQAPYNP.js → host-X2CSLFM6.js} +3 -3
  48. package/dist/chunks/{host-VGPVP7YF.js → host-YTODKMSL.js} +3 -3
  49. package/dist/chunks/{hrm-TLHKC545.js → hrm-FFM4UJFS.js} +4 -4
  50. package/dist/chunks/{im-YOUCFMUK.js → im-VEHKDQPB.js} +8 -8
  51. package/dist/chunks/{invoice-WNBS2B4C.js → invoice-LVIKSIIF.js} +3 -3
  52. package/dist/chunks/{jiuchuanhui-XABWS5RN.js → jiuchuanhui-X6DINO5P.js} +2 -2
  53. package/dist/chunks/{lazy-dispatch-NLZ5UQQI.js → lazy-dispatch-KSWTN5L6.js} +4 -4
  54. package/dist/chunks/{mail-LRYMBFNL.js → mail-VDKRGUD3.js} +9 -4
  55. package/dist/chunks/{meeting-ESXL6MFI.js → meeting-CLC6HP3Z.js} +12 -10
  56. package/dist/chunks/{okr-EOV65SSF.js → okr-CHG4OO3U.js} +2 -2
  57. package/dist/chunks/{plan-YFPVKW6Y.js → plan-XWR75667.js} +2 -2
  58. package/dist/chunks/{project-MDVZUYQW.js → project-5BXOOKMG.js} +40 -23
  59. package/dist/chunks/recruit-stage-DGMFNNDE.js +4507 -0
  60. package/dist/chunks/{registry-VT5Y2HLA.js → registry-7FFOXIAW.js} +4 -4
  61. package/dist/chunks/{registry-QCLZEDAP.js → registry-BKBZPBAJ.js} +10 -8
  62. package/dist/chunks/{registry-YX4CSEMD.js → registry-RHMW6ANW.js} +2 -2
  63. package/dist/chunks/{registry-NYPYMZXG.js → registry-Z43434VG.js} +1 -1
  64. package/dist/chunks/{room-recommend-L3MWH4JW.js → room-recommend-62H7ZQQ6.js} +4 -4
  65. package/dist/chunks/{schedule-UASAVDVD.js → schedule-FNXKH3DQ.js} +4 -4
  66. package/dist/chunks/{workflow-KDGIUCNW.js → workflow-ADHKCAJK.js} +4 -4
  67. package/dist/index.js +33 -28
  68. package/dist/internal/e10/auth/commands.js +110 -56
  69. package/dist/internal/e10/auth/messages.js +6 -0
  70. package/dist/internal/e10/auth/session.js +28 -1
  71. package/dist/internal/e10/auth/xiaoe.js +315 -48
  72. package/dist/internal/e10/auth-recovery.js +36 -5
  73. package/dist/internal/e10/client.js +13 -0
  74. package/dist/internal/e10/context.js +61 -9
  75. package/dist/internal/e10/index.js +1 -1
  76. package/dist/internal/e10/network-error.js +93 -0
  77. package/dist/internal/e10/request-runtime.js +15 -0
  78. package/dist/shortcuts/calendar/operations/read.js +31 -22
  79. package/dist/shortcuts/calendar/operations/write.js +45 -1
  80. package/dist/shortcuts/cowork/operations/discuss-write.js +5 -1
  81. package/dist/shortcuts/cowork/operations/item-write.js +5 -3
  82. package/dist/shortcuts/cowork/operations/member-write.js +3 -1
  83. package/dist/shortcuts/cowork/operations/permission-write.js +5 -1
  84. package/dist/shortcuts/cowork/operations/shared.js +7 -0
  85. package/dist/shortcuts/ehr/operations/attend-write.js +43 -1
  86. package/dist/shortcuts/ehr/operations/hr-contact.js +7 -4
  87. package/dist/shortcuts/ehr/operations/hr-report.js +13 -7
  88. package/dist/shortcuts/ehr/operations/recruit-candidate-import.js +134 -59
  89. package/dist/shortcuts/ehr/operations/recruit-write.js +262 -17
  90. package/dist/shortcuts/ehr/operations/recruit.js +10 -4
  91. package/dist/shortcuts/ehr/operations/shared.js +47 -0
  92. package/dist/shortcuts/hrm/operations/org.js +118 -0
  93. package/dist/shortcuts/index.js +5 -0
  94. package/dist/shortcuts/mail/operations/mail-send.js +8 -2
  95. package/dist/shortcuts/meeting/operations/eb/catalog.js +9 -2
  96. package/dist/shortcuts/meeting/operations/eb/create-flow.js +461 -127
  97. package/dist/shortcuts/meeting/operations/eb/crm-search.js +87 -5
  98. package/dist/shortcuts/meeting/operations/eb/factory.js +33 -0
  99. package/dist/shortcuts/meeting/operations/eb/flow-memory.js +49 -0
  100. package/dist/shortcuts/meeting/operations/eb/group-chat.js +605 -0
  101. package/dist/shortcuts/meeting/operations/eb/index.js +2 -0
  102. package/dist/shortcuts/meeting/operations/eb/person-cache.js +96 -0
  103. package/dist/shortcuts/meeting/operations/eb/room-recommend.js +44 -6
  104. package/dist/shortcuts/meeting/operations/eb/room-summary.js +2 -0
  105. package/dist/shortcuts/meeting/operations/eb/usage-cache.js +99 -0
  106. package/dist/shortcuts/meeting/operations/from-group-chat.js +35 -12
  107. package/dist/shortcuts/project/operations/read.js +6 -25
  108. package/dist/shortcuts/project/operations/shared.js +22 -0
  109. package/dist/shortcuts/project/operations/write.js +28 -2
  110. package/dist/shortcuts/recruit-stage/context.js +119 -0
  111. package/dist/shortcuts/recruit-stage/continuation.js +73 -0
  112. package/dist/shortcuts/recruit-stage/errors.js +65 -0
  113. package/dist/shortcuts/recruit-stage/host.js +109 -0
  114. package/dist/shortcuts/recruit-stage/index.js +115 -0
  115. package/dist/shortcuts/recruit-stage/manifest.js +29 -0
  116. package/dist/shortcuts/recruit-stage/operations/interview-arrange.js +722 -0
  117. package/dist/shortcuts/recruit-stage/operations/interview-feedback.js +269 -0
  118. package/dist/shortcuts/recruit-stage/operations/jd-create.js +630 -0
  119. package/dist/shortcuts/recruit-stage/operations/list.js +431 -0
  120. package/dist/shortcuts/recruit-stage/operations/registry.js +38 -0
  121. package/dist/shortcuts/recruit-stage/operations/resume-import.js +1198 -0
  122. package/dist/shortcuts/recruit-stage/operations/search.js +158 -0
  123. package/dist/shortcuts/recruit-stage/operations/types.js +25 -0
  124. package/dist/shortcuts/recruit-stage/school-tiers.json +318 -0
  125. package/dist/shortcuts/recruit-stage/shared.js +608 -0
  126. package/dist/shortcuts/workflow/operations/form.js +21 -2
  127. package/dist/shortcuts/workflow/operations/todoSmartConvert/aigroupRules.js +52 -1
  128. package/dist/shortcuts/workflow/operations/todoSmartConvert/detailFieldRules.js +4 -2
  129. package/dist/shortcuts/workflow/operations/todoSmartConvert/summaryCache.js +19 -11
  130. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailCache.js +17 -24
  131. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailFetcher.js +14 -9
  132. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.collect.js +78 -10
  133. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.core.js +3 -1
  134. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.detail.js +17 -11
  135. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.group.js +16 -40
  136. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.groupSummary.js +3 -2
  137. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.js +52 -15
  138. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.pipeline.js +16 -1
  139. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.smartGroup.js +151 -63
  140. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.subGroup.js +56 -0
  141. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.summary.js +53 -16
  142. package/docs/e10-auth.md +22 -1
  143. package/docs/operation-manual.md +8 -0
  144. package/package.json +1 -1
  145. package/scripts/install-skill-to-xiaoe.mjs +105 -0
  146. package/scripts/mcp-meeting.mjs +234 -0
  147. package/scripts/package-skill.mjs +4 -2
  148. package/skill-template/business-info.json +24 -0
  149. package/skill-template/domains/recruit-stage.md +29 -0
  150. package/skills/weaver-e10-calendar/SKILL.md +2 -1
  151. package/skills/weaver-e10-calendar/references/calendar-write.md +54 -0
  152. package/skills/weaver-e10-cowork/SKILL.md +1 -1
  153. package/skills/weaver-e10-cowork/references/cowork-write.md +3 -1
  154. package/skills/weaver-e10-jucailin/SKILL.md +1 -1
  155. package/skills/weaver-e10-jucailin/references/attend-write.md +8 -0
  156. package/skills/weaver-e10-jucailin/references/hr-contact.md +8 -0
  157. package/skills/weaver-e10-jucailin/references/hr-report.md +8 -0
  158. package/skills/weaver-e10-jucailin/references/recruit-create.md +2 -2
  159. package/skills/weaver-e10-jucailin/references/recruit-read.md +1 -1
  160. package/skills/weaver-e10-jucailin/references/recruit-write.md +4 -3
  161. package/skills/weaver-e10-mail/SKILL.md +1 -1
  162. package/skills/weaver-e10-mail/references/mail-send.md +2 -0
  163. package/skills/weaver-e10-meeting/SKILL.md +119 -26
  164. package/skills/weaver-e10-meeting/references/meeting-minute-file.md +25 -11
  165. package/skills/weaver-e10-meeting.zip +0 -0
  166. package/skills/weaver-e10-recruit-stage/SKILL.md +226 -0
  167. package/skills/weaver-e10-recruit-stage/agents/openai.yaml +119 -0
  168. package/skills/weaver-e10-recruit-stage/lib/recruit-xiaoe-file.mjs +188 -0
  169. package/skills/weaver-e10-recruit-stage/references/recruit-arrange-interview.md +322 -0
  170. package/skills/weaver-e10-recruit-stage/references/recruit-capability-check.md +127 -0
  171. package/skills/weaver-e10-recruit-stage/references/recruit-check-install.md +65 -0
  172. package/skills/weaver-e10-recruit-stage/references/recruit-detail-process.md +63 -0
  173. package/skills/weaver-e10-recruit-stage/references/recruit-edit-interview-feedback.md +142 -0
  174. package/skills/weaver-e10-recruit-stage/references/recruit-jd-create.md +73 -0
  175. package/skills/weaver-e10-recruit-stage/references/recruit-jd-template.md +56 -0
  176. package/skills/weaver-e10-recruit-stage/references/recruit-list-candidate.md +101 -0
  177. package/skills/weaver-e10-recruit-stage/references/recruit-list-interview.md +148 -0
  178. package/skills/weaver-e10-recruit-stage/references/recruit-match-candidates.md +77 -0
  179. package/skills/weaver-e10-recruit-stage/references/recruit-output-links.md +59 -0
  180. package/skills/weaver-e10-recruit-stage/references/recruit-resolve-creator.md +69 -0
  181. package/skills/weaver-e10-recruit-stage/references/recruit-resolve-metadata.md +241 -0
  182. package/skills/weaver-e10-recruit-stage/references/recruit-resume-import.md +438 -0
  183. package/skills/weaver-e10-recruit-stage/references/recruit-resume-parse.md +128 -0
  184. package/skills/weaver-e10-recruit-stage/references/recruit-search-candidate.md +146 -0
  185. package/skills/weaver-e10-recruit-stage/references/recruit-urge-feedback.md +69 -0
  186. package/skills/weaver-e10-shared/SKILL.md +2 -2
  187. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +4 -2
  188. package/skills/weaver-e10-shijingran/SKILL.md +3 -2
  189. package/skills/weaver-e10-shijingran/references/operations.md +3 -1
  190. package/skills/weaver-e10-shijingran/references/source-manifest.json +41 -40
  191. package/skills/weaver-e10-shijingran/references/write-operations.md +2 -0
  192. package/skills/weaver-e10-workflow/SKILL.md +7 -1
  193. package/skills/weaver-e10-workflow/aigroup/default.json +23 -9
  194. package/skills/weaver-e10-workflow/references/todo-smart-convert.md +37 -21
  195. package/skills/weaver-e10-workflow/tools/todo-summary.cjs +135 -43
  196. package/skills/weaver-e10-yepiaotong/SKILL.md +9 -10
  197. package/skills/weaver-e10-yepiaotong/references/invoice-agent-entry.md +6 -3
@@ -21,10 +21,35 @@
21
21
 
22
22
  continuation 绑定当前登录环境与操作人,10 分钟有效。租户或账号变化触发 `context_mismatch`,字段与 prepare 快照不一致触发 `target_changed`,均需重新 `prepare`。
23
23
 
24
+ ## 时间冲突检查(创建 / 修改时间前必做)
25
+
26
+ 新建日程或修改日程的 `start_time`/`end_time` 之前,**必须**先做时间冲突检查,禁止未经检查直接写入。
27
+
28
+ **流程**
29
+ 1. 用 `calendar.list` 查询目标日期全天:入参 `start_time` 当天 `00:00`、`end_time` 当天 `23:59`,`page_size` 取足够大(如 50)。
30
+ 2. 将新建 / 拟改时间窗口与返回 `agenda` 逐条重叠检测:窗口 A=[a,b)、B=[i,j),重叠判定为 `max(a,i) < min(b,j)`。
31
+ 3. **存在冲突时,必须按下列表格结构呈现并给出处理建议,再交用户决策**(冲突仅提醒、不阻断写入):
32
+ - **现有日程明细表**:列出当日全部日程(名称 / 时间 / ID / 是否冲突)。
33
+ - **当日空闲时段表**:依据当日已排日程推算得出的可排期时间段。
34
+ - **冲突处理建议表**:给出改期 / 缩短 / 合并 / 委派等建议,并附具体候选时间或操作。
35
+ 4. 用户明确选择某方案或确认「仍按原时间创建」后,再走 prepare→apply。
36
+
37
+ **建议方案说明**
38
+ - **改期**:从空闲时段中挑选无冲突时段(如上午 09:00~15:00 区段、下午 15:30 之后区段)。
39
+ - **缩短**:将新窗口提前结束或延后开始,避开冲突段(如改为 14:30~15:00)。
40
+ - **合并**:若新日程与冲突项主题相关,并入冲突项(延长其时间或合并为一場)。
41
+ - **委派**:将 `participants` 改为他人,本人不再占用该时段。
42
+
43
+ > 修改时间(`calendar.update`)同样适用本小节:先查冲突,再 prepare。
44
+
24
45
  ## 创建日程
25
46
 
26
47
  必填 `agn_name`、`start_time`、`agn_type`、`priority`;`end_time` 缺省自动 `start_time + 1 小时`;`participants` 缺省自动带当前操作人。
27
48
 
49
+ **未指定时的默认值**
50
+ - **提醒默认关闭**:用户未要求提醒时,不传 `remind`、不设置提醒档位,呈现为「关闭」;只有用户明确要求提醒才按「提醒档位规则」开启。
51
+ - **重复默认不重复**:用户未要求重复时,不传重复字段(即 `NONE` 不重复),呈现为「不重复」;不要替用户默认加上任何提醒或重复规则。
52
+
28
53
  第一步 prepare(Windows PowerShell):
29
54
 
30
55
  ```powershell
@@ -43,6 +68,27 @@ printf '%s\n' '{"agn_name":"项目周会","start_time":"2026-08-15 09:00","agn_t
43
68
  weaver-work-cli --json calendar run calendar.create.apply --input-json '{"agn_name":"项目周会","start_time":"2026-08-15 09:00","agn_type":"1147539906291523593","priority":"1147539666016624641","confirm":true,"continuation":"<prepare返回的token>"}'
44
69
  ```
45
70
 
71
+ ### 创建结果返回(含详情卡片页链接)
72
+
73
+ `calendar.create.apply` 成功后返回**结构化结果**(不再直接透传后端原始 JSON,避免回显英文键):
74
+
75
+ | 字段 | 说明 |
76
+ | --- | --- |
77
+ | `status` | `COMPLETE` 表示创建成功(协议状态枚举,沿用 prepare/apply 一致命名,非业务文案) |
78
+ | `createdId` | 新建日程 ID(字符串,取 `datajson.dataIds[0]`) |
79
+ | `createdIds` | 新建日程 ID 列表 |
80
+ | `accessUrl` | 详情卡片页访问链接 `https://<E10地址>/sp/ebdfpage/card/0/{formId}/{createdId}`;`formId` 偶发获取失败时为 `null`(降级,不阻断创建结果) |
81
+
82
+ **AI 呈现要求**
83
+ - 创建成功后,日程信息**用表格展示**(日程 / 时间 / 参与人 / 类型与紧急程度 / 提醒 / 重复),**仅「日程」列的名称为可点击链接**(`[名称](accessUrl)`),其余单元格为纯文本;**不要**单独贴裸链接,也**不要**把后端原始 JSON 展示给用户。示例:
84
+
85
+ | 日程 | 时间 | 参与人 | 类型 / 紧急程度 | 提醒 | 重复 |
86
+ | --- | --- | --- | --- | --- | --- |
87
+ | [客户拜访](https://…/sp/ebdfpage/card/0/{formId}/{id}) | 2026-11-05 09:00 ~ 10:00 | 罗智辉 | 会议日程(EC) / 正常 | 关闭 | 不重复 |
88
+
89
+ - 面向用户的表述全部用中文,不出现 `prepare`/`apply`/`continuation` 等协议词(流程表述为「确认信息 → 提交」);只给结果,不输出「验证 / 回查 / 猜测 / 测试」等过程性语句。
90
+ - `accessUrl` 为 `null` 时说明原因并建议运行 `calendar.app.check` 检测,不阻断结果呈现。
91
+
46
92
  ## 更新日程(全量覆盖)
47
93
 
48
94
  `calendar.update.prepare` 先查当前详情再合并用户修改。只传 `id` 加要改的字段即可,未传字段保留原值。
@@ -83,6 +129,14 @@ weaver-work-cli --json calendar run calendar.delete.apply --input-json '{"id":"1
83
129
  - 提醒:`start_reminder`/`end_reminder`(`NOW`/`M5`/`M15`/`H1`/`D1`/`CUSTOM`)、`remind_type`(`system`/`message`/`email`)。
84
130
  - 重复:`repeat_type`(`NONE`/`D1`/`W1`/`W2`/`M1`/`CUSTOM`)、`repeat_custom_type`(`D`/`W`/`M`)、`repeat_custom_cycle`、`repeat_week_unit`(`MO`~`SU`)、`repeat_month_unit`(`1`~`31`)、`repeat_end_type`(`0`/`1`/`2`)、`repeat_end_date`、`repeat_end_num`。
85
131
 
132
+ ## 提醒档位规则
133
+
134
+ `start_reminder`/`end_reminder` 标准档位仅有 `NOW`/`M5`/`M15`/`H1`/`D1`(准时 / 提前 5 分 / 15 分 / 1 小时 / 1 天)。**当用户要求的提前量无法对应任一标准档位(如「提前 10 分钟」)时,必须使用 `CUSTOM` 自定义档位,不要硬套最接近的档位。**
135
+
136
+ - 开启提醒需 `remind:1`,并通过 `remind_type`(`system`/`message`/`email`)指定渠道(默认 `system`)。
137
+ - `CUSTOM` 用 `start_hours`/`start_mins` 传「开始前」提前量,结束提醒对应 `end_hours`/`end_mins`,单位分别为小时 / 分钟。
138
+ - 示例:提前 10 分钟 → `start_reminder:"CUSTOM"`、`start_hours:0`、`start_mins:10`;系统回写 `next_start_remind` 会自动减 10 分钟。
139
+
86
140
  ## 注意
87
141
 
88
142
  - 写操作请求带 `Content-Type: application/json; charset=utf-8`,中文字段(`agn_name`/`agn_desc`/`place`)按 UTF-8 写入,由 CLI 自动处理。
@@ -7,7 +7,7 @@ description: E10协作模块技能,认证由weaver-e10-shared与weaver-work-cl
7
7
  description_zh: E10协作模块技能,经weaver-e10-shared托管的CLI会话直调协作REST接口,支持按主题查询协作列表、查询协作详情,以及审批与退出、共享权限、行为等操作;秒级返回结构化结果;禁用浏览器自动化路径,所有接口地址与会话凭证由weaver-work-cli统一提供。
8
8
  description_en: E10 Cowork skill that calls cowork REST APIs directly with a CLI-managed session described by weaver-e10-shared, supporting list-by-topic, detail queries, approval/quit, share-permission and behavior operations in seconds; browser automation disabled; all endpoint URLs and credentials are provided by weaver-work-cli.
9
9
  category: business
10
- version: 2.0.0
10
+ version: 2.0.3
11
11
  author: 泛微网络科技股份有限公司
12
12
  permissions: [network]
13
13
  execution:
@@ -33,7 +33,9 @@ weaver-work-cli cowork run cowork.item.create.prepare --input-json '{"itemName":
33
33
  weaver-work-cli cowork run cowork.item.create.apply --input-json '{"itemName":"XX项目协作","sectionId":"<选项id>","itemContent":"目标与分工","confirm":true,"continuation":"<continuation>"}'
34
34
  ```
35
35
 
36
- prepare 会做三件事:版块 id 存在性校验(不存在直接报错并列可选版块)、负责人默认当前用户、开关默认全开。apply 成功后返回新协作 `id`。
36
+ prepare 会做三件事:版块 id 存在性校验(不存在直接报错并列可选版块)、负责人默认当前用户、开关默认全开。apply 成功后返回新协作 `id`,以及 `viewUrl`(PC 端 `/sp/cowork/view/{id}`)与 `mobileViewUrl`(移动端 `/mobile/cowork/view/{id}`)——`{id}` 为协作主键,链接可直接打开该协作。
37
+
38
+ **写操作回执的链接覆盖**:`item.create`/`item.action`/`item.flag`/`discuss.publish`/`discuss.action`/`member.action`/`permission.add`/`permission.remove` 的 apply 均带 `viewUrl` + `mobileViewUrl`(指向所属协作)。`apply.decide` 与 `review.*` 只拿得到申请/审批记录 id、无法确定所属协作,**不返回链接**(需先用 `cowork.list` 定位到协作)。
37
39
 
38
40
  ## 2. 协作级动作:`cowork.item.action.prepare` → `apply`(`action: "end"`)
39
41
 
@@ -7,7 +7,7 @@ description: 泛微E10聚才林人事管理,帮您处理人事日常事宜:[
7
7
  description_zh: 泛微E10聚才林人事管理,帮您处理人事日常事宜:[出勤]-查考勤数据做报表统计、考勤打卡(PC端签到签退)、发考勤流程处理考勤异常;[薪酬]-查工资、社保公积金、调薪记录;[招聘]-帮您找人才、管招聘需求、生成职位JD、导入简历建人才、查应聘者台账、安排面试、发Offer、办入职、看招聘统计;[人事基础]-查员工信息、组织编制及从不同维度汇总人事报表。
8
8
  description_en: "Weaver E10 Jucailin HR Management: your assistant for daily HR tasks. [Attendance] Check attendance data, generate reports & statistics, clock in/out on PC, and start attendance workflows to handle attendance exceptions. [Payroll] View pay slips, social security & housing fund, and salary adjustment records. [Recruitment] Find candidates, manage recruitment requisitions, generate job descriptions (JD), import resumes to build candidate profiles, view candidate pipeline records, arrange interviews, send offers, handle onboarding, and view recruitment statistics. [HR Basics] Look up employee information, organizational headcount, and compile HR reports from various dimensions."
9
9
  category: business
10
- version: 2.0.2
10
+ version: 2.0.6
11
11
  author: 泛微网络科技股份有限公司
12
12
  permissions: [network]
13
13
  execution:
@@ -80,3 +80,11 @@ printf '%s\n' '{"type":"CHECKIN","continuation":"<prepare 返回的 token>","con
80
80
  - `continuation_expired`:continuation 超过 10 分钟,重新执行 `prepare`。
81
81
  - `appeal_not_allowed`:`stillShowAppeal=false`,当前不可申诉,不要继续提交。
82
82
  - `partial/write_uncertain`:请求已发出但结果不确定。立即停止,禁止自动重试,先做只读回查再向用户报告。
83
+
84
+ ## 产物链接(CLI 0.1.41+)
85
+
86
+ `ehr.attend.appeal.save.apply` 成功后返回:
87
+ - `appealListUrl`:考勤异常/申诉页面地址(`{baseUrl}/sp/attend/abnormal`,真实环境取证路由,禁止改拼);
88
+ - `appeal`:回查定位到的新建申诉记录(含申诉 ID,处理申诉时用其 id);未定位到时给 `locateWarning`。
89
+
90
+ 展示时把 `appealListUrl` 作为可点击链接给用户。
@@ -90,3 +90,11 @@ printf '%s\n' '{"resourceId":123,"changeDateStart":"2026-01-01","changeDateEnd":
90
90
  - `date_range_incomplete`:`empchange.list` 的起止日期只提供了一个。
91
91
  - `date_range_invalid`:开始日期晚于结束日期。
92
92
  - 认证类错误:停止查询并执行入口 `SKILL.md` 的登录失效强制分流;XiaoE 只走 `auth xiaoe`,非 XiaoE 只走 `auth login`,禁止其他登录 Skill。
93
+
94
+ ## 产物链接(CLI 0.1.41+)
95
+
96
+ 查询类操作的 `meta` 增加两个字段:
97
+ - `viewUrl`:该查询对应的 EHR 页面地址(如在职员工名册 `/sp/hrm/hr/employeeManager`);
98
+ - `profileUrlTemplate`:人员详情卡片模板 `{baseUrl}/sp/hrm/profileInfo/{人员id}`,把 `{人员id}` 替换为结果中的人员 id 即可点击。
99
+
100
+ 只对已取证路由输出这两个字段;未见字段表示该接口无对应页面。
@@ -74,3 +74,11 @@ printf '%s\n' '{"startDate":"2026-01-01","endDate":"2026-03-31","dataType":"join
74
74
  - `date_range_invalid`:`turn.emp.table` 的 `startDate` 晚于 `endDate`。
75
75
  - `enum_invalid`:`type`、`dataType`、`calcLevel` 取值不在允许集合内。
76
76
  - 权限不足返回业务失败,先确认账号是否具备对应报表的查看权限。
77
+
78
+ ## 产物链接(CLI 0.1.41+)
79
+
80
+ 查询类操作的 `meta` 增加两个字段:
81
+ - `viewUrl`:该查询对应的 EHR 页面地址(如在职员工名册 `/sp/hrm/hr/employeeManager`);
82
+ - `profileUrlTemplate`:人员详情卡片模板 `{baseUrl}/sp/hrm/profileInfo/{人员id}`,把 `{人员id}` 替换为结果中的人员 id 即可点击。
83
+
84
+ 只对已取证路由输出这两个字段;未见字段表示该接口无对应页面。
@@ -49,7 +49,7 @@ weaver-work-cli ehr run ehr.recruit.position.create.apply --input-json '{"positi
49
49
 
50
50
  ```
51
51
  ① 你读懂简历(对话里已解析的内容 / 原件文本)→ 按下面 schema 整理成 JSON
52
- ② prepare:手机号查重 + 主表映射 + 6 张明细行数 + 标签核验(不写入)
52
+ ② prepare:手机号查重 + 主表映射 + 6 张明细行数 + 标签预检(按名核验,输出 `tagCheck.found/missing`,不写入)
53
53
  ③ 摘给用户确认
54
54
  ④ apply:主表+明细一次写入 → 人才批次 → 智能标签 → 平台标签 → 双链接
55
55
  ```
@@ -80,7 +80,7 @@ weaver-work-cli ehr run ehr.recruit.candidate.import.apply --input-json '{"candi
80
80
  - 手机号已存在 → apply 直接阻断,`preview.duplicate` 会带出已存在的人才 id;**不要重复建档**,改为告知用户走更新或在人才卡片补充。
81
81
  - 明细表在 `getTableMapping` 中无对应节点 → 该表整表跳过(主表照常建档),`preview.warnings` 会写明。
82
82
  - 批次初始化失败 → 人才仍已建档,`batch.note` 说明原因,不要重试建档。
83
- - 平台标签不在本环境清单 → `tagsSkipped` 列出,**不要自动新建标签**。
83
+ - 平台标签不在本环境清单 → `tagsSkipped` 列出,**不要自动新建标签**。标签按名精确解析(并行 type0/type1,N 个名字一轮请求),不再受环境标签总量影响;prepare 的 `tagCheck.missing` 就是 apply 会跳过的那些,可在确认摘要里先提示用户。
84
84
  - apply 返回 `partial/write_uncertain` → 先用人才库按手机号核对是否已建档,**禁止直接重试**。
85
85
 
86
86
  **产物**:`talentCardUrl`(人才卡片单页)+ `talentListLocateUrl`(人才库列表并滑出该人才)。两个都以 Markdown 链接放回答正文;自用系统会自动追加 `recruitType=useSelf`,不要手拼。
@@ -9,7 +9,7 @@
9
9
  | operation | 必填 | 说明 |
10
10
  | --- | --- | --- |
11
11
  | `ehr.recruit.candidate.search` | 无 | 按姓名/手机号模糊搜索人才库;都不传时列出全部人才用于浏览 |
12
- | `ehr.recruit.candidate.list` | `type` | 查询招聘业务列表,`type` 取 `demand`(招聘需求)/`position`(招聘职位)/`entry`(入职管理)/`offer`(录用管理)之一 |
12
+ | `ehr.recruit.candidate.list` | `type` | 查询招聘业务列表,`type` 取 `demand`(招聘需求)/`position`(招聘职位)/`entry`(入职管理)/`offer`(录用管理)/`interview`(面试管理)/`candidate`(应聘者)之一 |
13
13
  | `ehr.recruit.candidate.card` | `talentId` | 人才详情卡片:基本信息 + 应聘进展 + 面试安排 + 沟通备注 |
14
14
  | `ehr.recruit.context.resolve` | 无 | 返回当前环境的招聘模块运行时参数(appId/表单/列表),仅用于调试与兜底 |
15
15
 
@@ -15,7 +15,7 @@
15
15
  | operation(prepare/apply 成对) | 用途 | 关键校验 |
16
16
  | --- | --- | --- |
17
17
  | `ehr.recruit.candidate.create.*` | 新建人才 | 手机号建前查重(apply 二次查重强制拦截);渠道须在数据字典中 |
18
- | `ehr.recruit.candidate.interview.arrange.*` | 安排面试 | 候选人 READ 权限;面试方式/轮次须在枚举内;面试官姓名须解析到 userId |
18
+ | `ehr.recruit.candidate.interview.arrange.*` | 安排面试 | 候选人 READ 权限;面试方式/轮次须在枚举内;面试官可省略(默认当前登录人),显式指定时姓名须解析到 userId |
19
19
  | `ehr.recruit.offer.send.*` | 发送 Offer 邮件(L3) | Offer 状态必须「未发送」;邮箱必填;模板须存在于 uf_rcrt_notify_mould |
20
20
  | `ehr.recruit.entry.process.*` | 办理入职(落账号不可逆) | estValidateEntry 校验;已办理(status=2)拒绝;department/positionRank 必填 |
21
21
  | `ehr.recruit.candidate.interview.feedback.edit.*` | 提交/修改面试反馈 | 已失效(INVALID)面试拒绝;结果须在枚举内;全字段集保存防清空 + 乐观锁 |
@@ -32,7 +32,8 @@
32
32
  ## 参数要点
33
33
 
34
34
  - `create`:`name` + `mobile` 必填,`channel` 传中文名(如「BOSS直聘」),CLI 负责解析为字典 optionId,查不到报 `channel_not_found`。
35
- - `arrange`:`talentId` + `interviewer`(姓名)必填;`type`(现场/视频/电话/AI面试)、`session`(初试/复试等,须在该环境枚举内);`positionId` 不填时从人才当前应聘批次继承,继承不到报错要求显式提供。
35
+ - `arrange`:`talentId` 必填;`interviewer`(姓名)**可选,不填默认当前登录人**(teamsCheck 取姓名 → 同一人员解析通道);`type`(现场/视频/电话/AI面试)、`session`(初试/复试等,须在该环境枚举内);`positionId` 不填时从人才当前应聘批次继承,继承不到报错要求显式提供。
36
+ - **AI 面试**(`type=AI面试`):`aiPlan` 默认「大模型面试」(按名匹配,环境无此方案时错误详情 `candidates` 列出可选方案,不自动取第一条);`email` 不填则取人才资料里的邮箱,两者都缺会报 `email_required`。prepare 会把 `aiPlan`/`email`/`mobile` 一并写进 `willSubmit`。
36
37
  - `offer.send`:`talentId` 必填;`email`/`deadline` 缺省时从 Offer 记录继承;`template` 默认「offer通知」。
37
38
  - `entry.process`:`departmentId`/`positionRankId` 必填(Offer 记录无此字段);`subcompanyId`/`positionId`/`entryTime` 缺省时从 Offer 记录继承。
38
39
  - `feedback.edit`:`talentId` 必填;`feedbackId` 最稳定位,或 `feedbackIndex`(默认第 0 场含反馈的面试);`result`/`comment` 至少一项。
@@ -60,7 +61,7 @@ weaver-work-cli --json ehr run ehr.recruit.candidate.interview.arrange.apply --i
60
61
 
61
62
  ## 错误形状(稳定 subtype)
62
63
 
63
- `duplicate_blocked`(查重命中)/ `duplicate_ambiguous`(多条重复)/ `target_changed`(指纹不一致)/ `context_mismatch`(会话变化)/ `channel_not_found` / `interviewer_not_found` / `result_not_in_enum` / `offer_status_invalid` / `entry_already_processed` / `interview_invalid_status` / `esb_action_unresolved`(按钮/动作流解析不到,禁止编造 esbActionIds)/ `partial` + `write_uncertain`(多步写入中断)。
64
+ `duplicate_blocked`(查重命中)/ `duplicate_ambiguous`(多条重复)/ `target_changed`(指纹不一致)/ `context_mismatch`(会话变化)/ `channel_not_found` / `interviewer_not_found` / `interviewer_unresolved`(未指定面试官且当前登录人解析不到)/ `ai_plan_unavailable` / `ai_plan_not_found`(详情 `candidates` 列可选方案)/ `ai_plan_ambiguous` / `email_required` / `email_invalid` / `result_not_in_enum` / `offer_status_invalid` / `entry_already_processed` / `interview_invalid_status` / `esb_action_unresolved`(按钮/动作流解析不到,禁止编造 esbActionIds)/ `partial` + `write_uncertain`(多步写入中断)。
64
65
 
65
66
  ## 产物链接(apply 输出直接含 URL 字段,按「[标题](url)」Markdown 链接放回答正文)
66
67
 
@@ -7,7 +7,7 @@ description: 泛微E10邮件管理技能:帮你查询、阅读和管理 OA 邮
7
7
  description_zh: 泛微E10邮件管理技能:帮你查询、阅读和管理 OA 邮件。支持查看邮件列表与详情、写新邮件、回复、转发、保存草稿、上传附件、定时发送、标星、设待办、标记已读、删除,以及撤回和重发邮件。同时支持文件夹管理、联系人/分组管理、附件中心、模板/签名管理、黑名单设置等高级功能。当用户提出与邮件相关的操作需求时触发。
8
8
  description_en: "Weaver E10 Mail Management skill: helps you query, read and manage OA emails. Supports viewing mail lists and details, composing new mails, replying, forwarding, saving drafts, uploading attachments, scheduled sending, starring, setting todos, marking read, deleting, recalling and resending mails. Also supports folder management, contacts/group management, attachment center, template/signature management, blacklist settings and more advanced features. Triggered when the user asks for mail-related operations."
9
9
  category: business
10
- version: 3.0.0
10
+ version: 3.0.1
11
11
  author: 泛微网络科技股份有限公司
12
12
  permissions: [network]
13
13
  execution:
@@ -31,6 +31,8 @@ weaver-work-cli --json mail run mail.send.prepare --input-json '{"flag":"-1","to
31
31
  weaver-work-cli --json mail run mail.send.apply --input-json '{"continuation":"<PREPARE_CONTINUATION>","confirm":true}'
32
32
  ```
33
33
 
34
+ `apply` 成功后返回 `subject` 与 `mailResourceId`,并附 `viewUrl`(PC 端 `/sp/mail/view?mailResourceId=<id>`,可直接打开该邮件);存草稿分支同样返回 `mailResourceId` + `viewUrl`。`viewUrl` 为空时说明接口未回传邮件 id(极少数环境),此时提示用户到「已发送」手动确认即可。
35
+
34
36
  Windows PowerShell 与 macOS/Linux 命令一致(JSON 用单引号包裹)。
35
37
 
36
38
  ## 要点
@@ -5,7 +5,7 @@ display_name_en: Weaver E10 Meeting Management
5
5
  description: "泛微 E10 会议管理:查会议、预约建会(推荐会议室、查冲突与空闲时段)、改期/改地点/改参会人、取消删除、流程建会、会议室查询与推荐、生成邀请函、读取会议附件、回执签到、纪要与决议任务、参会二维码。详见 description_zh。"
6
6
  description_zh: "泛微 E10 会议管理,帮您处理会议日常事务:[会议]-查询今天/本周/我的会议与会议详情,预约建会(自动推荐会议室、检测参会人会议冲突与日程空闲、冲突时给出当天可选时段),改期/换地点/改参会人、取消、删除;受限环境可走审批流程建会,提交后必出邀请函;[会议室]-查询会议室与占用,按人数/设备/常用程度智能推荐;[邀请函]-生成邀请函文档(有会议 id 用真实数据;没有也能按会议名+时间出预置函);[资料]-读取会议与议题的附件、抽取文档正文;参会回执、签到与补签、纪要、议题、决议与决议任务;[二维码]-把文本渲染成参会码/签到码图片。认证与会话由 weaver-e10-shared 提供。"
7
7
  description_en: "Weaver E10 meeting management: [Meetings] query today/week/my meetings and details, book meetings with automatic room recommendation, attendee conflict and calendar-availability checks (plus same-day alternative slots), reschedule / change room / change attendees, cancel, delete; flow-based booking with automatic invitation when the app only allows workflow creation; [Rooms] occupancy queries and smart recommendation by capacity, equipment and personal usage; [Invitation] generate invitation docx from real meeting data; [Content] list and read meeting/topic attachments and extract document text; receipts, sign-in, minutes, topics, decisions and decision tasks; [QR] render text into attendee/sign-in QR images. Auth and session are provided by weaver-e10-shared."
8
- version: 2.45.8
8
+ version: 2.49.0
9
9
  author: 泛微网络科技股份有限公司
10
10
  agent_created: true
11
11
  requires:
@@ -29,6 +29,10 @@ cliHelp: "weaver-work-cli meeting --help"
29
29
 
30
30
  用户说「帮我约个会 / 预约明天和 XX 开会」时,**先按这个顺序做,不要一上来就问一堆**:
31
31
 
32
+ **⛔ 参会人员不许收集**:用户没点名要请谁时,**不要用任何弹框/表单/输入框问『参会人员』**,直接调用 CLI 且**不传 `hrm_members`** —— CLI 会自动填当前登录人(实测表单里就是 `| 参会人员 | 卜伟领 |`)。用户主动说"叫上张三"才传。
33
+ 这条优先于下面所有步骤:先弹『参会人员(可选)』再建会 = 多问一轮,用户明确投诉过。
34
+
35
+
32
36
  0. **不确定 CLI 有没有某个能力 → `weaver-work-cli meeting ops`(纯文本)**,查具体能力用
33
37
  `meeting ops --grep 关键词`(如 `--grep suggest`、`--grep 建会`)。
34
38
  ⛔ **不准用 `meeting schema --json` 判断能力存在性**:完整 308KB、stdout 只回 20KB 预览,
@@ -41,8 +45,9 @@ cliHelp: "weaver-work-cli meeting --help"
41
45
  - ✅ **只有这两种情况传 `true`**:
42
46
  ① 用户**原话明确**给出了("明天 9 点到 10 点"、"用 502 茶室");
43
47
  ② 用户**在选项里点选**后,把 `options[].value` **整体原样回传**(value 里自带该标记,别手动拼)。
44
- - ⛔ **其他一切情况都不传**:用户只说"明天/上午/下午"、你从上下文推断、你觉得 9 点最合适、
48
+ - ⛔ **其他一切情况都不传**:用户只说"明天"(没给时段词)、你从上下文推断、你觉得 9 点最合适、
45
49
  你觉得这间房最合适 —— **一律不传**。
50
+ (用户说了"上午 / 下午 / 晚上"**不算猜**:按第 2 条固定区间传 `time_slot`,CLI 自己展开并置标记。)
46
51
  不传时**即使你填了** `begin_datetime` / `address`,CLI 也不会当成已定,而是返回时段/房间选项让用户点选。
47
52
  - ⛔ **禁止把候选写成定论**。`NEEDS_SELECTION` 返回的 `options` 是**候选**,不是已选:
48
53
  不许说「时间:09:00–10:00」「地点:测试会议室1」这种既定语气,
@@ -50,14 +55,24 @@ cliHelp: "weaver-work-cli meeting --help"
50
55
  - ⛔ **禁止绕过**:不许先自己调 `room.list` / `room.recommend` 挑一间,再带 `roomConfirmed: true` 硬塞;
51
56
  也不许因为"懒得再多问一轮"就直接传标记。用户没说过,就是没说过。
52
57
 
53
- 1. **确认顺序固定:名称 → 时间 → 参会人 → 地点 → 流程**。
58
+ 1. **确认顺序固定:名称 → 时间 →(参会人,可省略)→ 地点 → 流程**。
54
59
  流程只是审批载体,**不许在四要素定下来之前就问"用哪条流程"**。CLI 也是这个顺序:
55
60
  时间没确认先回 `slot`,地点没确认再回 `room`,四个都定了才回 `flow`;
56
61
  `flow` 的 `options[].value` 里已带 `begin_datetime`/`end_datetime`/`address` 和两个确认标记,
57
62
  用户点选流程后**原样回传 value** 就直接进确认,不要再问一遍时间/地点。
58
63
 
59
- 2. **没给具体几点 → 直接走 ① 的 `prepare` 且不传 `begin_datetime`**,它会返回「所有参会人空闲 **且**
60
- 该时段有可用会议室」的时段选项,直接做成选项让用户挑;禁止问"安排在几点"。
64
+ 2. **时间只有粗粒度说法时,按固定口径直接定**(2026-11-02 用户确认,不要再弹候选):
65
+ - 说了「上午 / 早上」→ **09:00–12:00**;「下午」→ **13:00–18:00**;「晚上」→ **18:00–21:00**;
66
+ - **正确传法(优先用这个)**:`{"dateFrom":"2026-11-03","time_slot":"上午"}` —— CLI 会自己展开成
67
+ `2026-11-03 09:00`~`12:00` 并视为已确认;
68
+ 也可以直接写 `begin_datetime: "2026-11-03 上午"`,两种都认;
69
+ - ⛔ **不要只传 `dateFrom` 就等 CLI 返回时段候选** —— 用户已经说了"上午",再弹一次"选时段"就是重复问
70
+ (2026-11-02 用户投诉的就是这个);
71
+ - 只给了一个**开始时间** → 结束 = 开始 + 1 小时(`durationMinutes` 可覆盖);
72
+ - 给了**完整区间**("9 点到 11 点")→ 按给的,不做映射;
73
+ - 以上都算用户拍过板,CLI 会自动置 `timeConfirmed`,**不要再返回时段选项让他挑**。
74
+ 2.1 **连日期都没有时才返回候选**:不传 `begin_datetime`,`prepare` 会返回「所有参会人空闲 **且**
75
+ 该时段有可用会议室」的时段选项,做成选项让用户挑;禁止问"安排在几点"。
61
76
  只有"只想看空闲、还不建会"时才单独调 `meeting.eb.meeting.create.suggest`。
62
77
  - 每个时段选项的 `reason` 会写明「N 人全部空闲(会议回执 + 日程已核);M 间会议室可用:…」——
63
78
  这就是"人和房都空闲"的凭据,`options[].rooms` 是该时段真实的可用房间清单。
@@ -66,13 +81,19 @@ cliHelp: "weaver-work-cli meeting --help"
66
81
 
67
82
  3. **没指定会议室 → 不要"问",要"给选项"**。`suggest` 返回里的 `rooms`、`prepare` 返回里的
68
83
  `roomOptions` / `options` 自带候选(已按人数/常用/时段占用排序,默认 3 个)。
84
+ **带了客户(`crm_members` 非空)时,接待类会议室会排前面** —— 判据是会议室描述(`room_desc`,
85
+ 如「接待重要客户使用」)或名称含 接待/招待/客户/商务/贵宾,`reasons` 里会写明「带客户优先:…」。
86
+ 这一层是 CLI 自动做的,**不需要你额外传参、也不要自己按名字挑**。
69
87
  - ⛔ **禁止开放式提问**:不要说「会议地点是必填项,需要你指定一间 / 你想用哪间会议室」——
70
88
  这是把选择题变成填空题,等于没推荐。
71
89
  - ✅ **必须做成选项控件**:`options[].label` 作标题、`reason` 作副标题,第一个标「推荐」。
72
90
  - ⛔ **不要自己再去调 `meeting.eb.room.list` 拼候选** —— 排好序的 `options` 就在返回值里,
73
91
  另拉列表既丢排序又会把不合适(容量不够/已被占用)的房间混进来。
74
92
  - 候选为空(该时段全被占用)→ 给「改时段 / 线上会议 / 地点待定」三个选项,仍不要让用户手填房间名。
75
- 4. **不要问「参会人数」**。CLI 自动算 = `hrm_members` 人数 **+ 召集人自己**(已在上线账号里就不重复加),
93
+ 4. **没给参会人 → 不要弹窗问,CLI 默认就是当前登录人**(2026-11-02 用户要求):
94
+ `hrm_members` 不传时 CLI 自动填当前登录人并写进表单;用户后面想加人会说,
95
+ 所以**不要**为了"请选择参会人"打断他。
96
+ 4.1 **不要问「参会人数」**。CLI 自动算 = `hrm_members` 人数 **+ 召集人自己**(已在上线账号里就不重复加),
76
97
  用于会议室容量过滤;`total_member` / `memberCount` 是可选参数,**只有用户明确说了"几个人"才传**。
77
98
  ⛔ 不要自己推算人数、也不要因为"看起来只有 1 个参会人"就降级给人少的房间。
78
99
  5. **不要逐个问必填项**。会议名称没给就从上下文拟一个(如"十一月开发进度沟通会")让用户一次确认;
@@ -112,6 +133,11 @@ cliHelp: "weaver-work-cli meeting --help"
112
133
  不许因为"名字不完整"就跳过查询、改成弹「客户怎么写」的选择框 —— 2026-10-31 用户投诉的就是这个:
113
134
  小E 弹了「填入参会客户字段 / 仅写入会议内容备注」两个选项,**"仅写入备注"正是明令禁止的做法**。
114
135
  先查,再谈确认;不存在"先问怎么填"这一步。
136
+ - **`items` 可能有多条**(动作流是 like 模糊查:搜「中国民航」能命中"中国民航信息网络股份有限公司--…"、"中航信数智…"等一票近名客户)。
137
+ → **把前 3–5 个客户做成选项让用户选**(标题用客户全名),不要默认取第一个、也不要自己合并;
138
+ - 用户选定后,`crm_members` 传 **该客户的 `{id, name}`**(就是 `items[]` 里的那一项)。
139
+ CLI 会**直接用这个客户自己的联系人明细**(`contacts`),**不会再回查 ESB** —— 所以选中谁就只有谁的联系人。
140
+ 如果 `items[]` 里带了 `contacts`,原样一起传更稳(省掉一次查询)。
115
141
  - `exact: false`(命中名 ≠ 关键词)→ **把命中的全名原样念出来问"是这家吗"**,用户认了就往下走。
116
142
  ⛔ 不要问成选择题("填客户字段 / 只写备注"),也不要拿首个匹配当定论。
117
143
  - `items: []`(真没查到)→ 才问用户:「CRM 里没搜到「X」,能给我完整的公司名吗?或这家先不关联客户?」
@@ -197,6 +223,8 @@ cliHelp: "weaver-work-cli meeting --help"
197
223
 
198
224
  - 「今天的会议 / 下一个会」→ `meeting.eb.meeting.list`(`filterDate` 客户端过滤;接口 body 过滤实测不生效,不要现场试 body)。
199
225
  - 「会议室占用 / 空闲 / 推荐」→ `meeting.eb.room.recommend`(按人数/常用/时段占用排序,带理由);
226
+ **带客户时**(用户话里出现「接待/招待/贵宾/客户来访」或传了 `crm_members`)会自动给接待类会议室
227
+ (名称或描述含「接待/招待/贵宾/商务」)+35 分优先推荐;只有「客户」二字不算接待类(避免培训室误判)。
200
228
  只想看全部房间用 `meeting.eb.room.list`(`statusText=正常` 才是可用)。
201
229
  - **⛔ 建会只走这三步,不要再加任何前置查询(不要查 baseSet、不要查 schema、不要先查会议室/冲突)**:
202
230
  ```bash
@@ -262,7 +290,11 @@ cliHelp: "weaver-work-cli meeting --help"
262
290
  ```
263
291
  把 `label` 做成选项让用户挑一个(`value.begin/end/address` 直接可回填),选定后带时间走 prepare。
264
292
  - 没候选时它会说明原因(人没共同空闲 / 人空闲但订不到会议室),**如实转达**,别自己编一个时间;
265
- - 用户说了"上午/下午"这种粗粒度,也走它(`workStartHour`/`workEndHour` 约束),不要直接默认 9 点。
293
+ - ⛔ **用户说了"上午/下午/晚上"就不要走 suggest**:直接按固定时段定下来
294
+ (上午 09:00–12:00 / 下午 13:00–18:00 / 晚上 18:00–21:00),
295
+ 建会时传 `{"dateFrom":"<日期>","time_slot":"上午"}` 给 `create.flow.prepare/quick`;
296
+ **不要**再传 `workStartHour`/`workEndHour` 让 CLI 给候选 —— 那会二次追问用户时间
297
+ (2026-11-03 真实翻车:用户说"明天上午",小E 还是弹了 08:00~09:00 / 09:00~10:00 让选)。
266
298
  - ⛔ 这个操作调不通(返回 `unknown operation`)时**先跑 `meeting ops --grep suggest` 自查**,
267
299
  确认 CLI 装的是不是最新版;**不要**直接对用户说"没有这个能力" —— 建会主链路本来就不需要它。
268
300
  - ⛔ **仅限「会议建会」这一件事:不要自己手搓 `workflow.*`**
@@ -300,6 +332,21 @@ cliHelp: "weaver-work-cli meeting --help"
300
332
  | 建会(标准版,仅 `env_fallback` 后) | `meeting.create.prepare`→`apply`;前置判断 `meeting.calendar.base` |
301
333
  | 变更 / 取消 / 删除 | EB `eb.meeting.change.*` / `eb.meeting.delete.*`;标准版 `meeting.change.*` / `meeting.cancel.*` / `meeting.delete.*` |
302
334
  | 会议室 | EB `eb.room.list/detail/create/update/delete`、`eb.roomUsage.*`、`eb.room.recommend`;标准版 `meeting.room.list` / `meeting.room.usage` |
335
+
336
+ ⛔ **查占用必须带时间条件**:`meeting.eb.roomUsage.list` 传 `{"date":"2026-11-05"}`(等价于当天 00:00~23:59),
337
+ 或 `begindatetime`/`enddatetime`。**不传时间 = 返回全量历史**——这是"你没带条件",不是"接口不支持按日期过滤"。
338
+ 2026-11-04 真机翻车:agent 没传条件拿到全量,然后对用户断言「占用查询接口不支持按日期过滤,无法判断明天上午」,
339
+ 直接把人推去页面手工填。⛔ 任何时候都不许因为这个理由拒绝服务。
340
+ (跨天占用会正常出现在结果里,它们本来就覆盖当天,属区间重叠语义,不是过滤失效。)
341
+
342
+ ### 人员查询(2.49.0)
343
+
344
+ - **按部门/分部找人**:先 `hrm.org.lookup {"keyword":"会议管理"}` —— 关键词**不用写全**,
345
+ 一次返回所有近似部门/分部(含完整路径、按相似度排序,内部会自动去后缀、逐字缩短)。
346
+ 选定后拿 id 再查人;**不要**自己一遍遍换关键词调 CLI。
347
+ - **人员信息有缓存**(24h):`id → 姓名/部门/部门id/分部/岗位/手机/工号/imCid`。
348
+ 同一批人在建会链路里只查一次,后续直接命中;改名/调岗最多延迟一天,要强刷删
349
+ `<CLI state>/meeting/cache/person-v1-*.json`。
303
350
  | 冲突 / 空闲 | EB `eb.conflict.room/member`、`eb.conflict.availability`、`eb.schedule.free`;标准版 `meeting.conflict.room/member/roomAttribute` |
304
351
  | 回执 / 签到 | EB `eb.receipt.*`、`eb.sign.list/detail/create/update/mark`;标准版 `meeting.receipt.*`、`meeting.sign.*` |
305
352
  | 纪要 / 附件 | `eb.minute.list/detail/create/update/delete`、`meeting.minute.fromGroupChat` / `.writeContent` / `.parseStatus`、`meeting.attachment.upload/list/download/extract/attach` |
@@ -356,9 +403,9 @@ cliHelp: "weaver-work-cli meeting --help"
356
403
  没证据。正确说法:"这项没核验到(原因 X)",并原样转达原因。
357
404
  以前这些失败被 `.catch(() => null)` 静默吞掉,"没查"和"没冲突"长得一模一样,用户以为查过了
358
405
  (会议室查不到就卡在选房 → 冲突检测不跑 → 却答复"流程表单本身不做冲突检测",就是这么错的)。
359
- - **会议室台账缓存 24 小时,但「建会」链路强制拉最新**:`create.flow.prepare` / `create.flow.quick` /
360
- `create.suggest` 内部都会强制刷新台账,所以刚导入/新建的会议室在建会时一定看得到。
361
- 只有**纯查询**(`meeting.eb.room.recommend`)会走 24h 缓存(快);缓存超过 4 小时会在 warnings 提示
406
+ - **会议室台账缓存 24 小时(2026-11-03 松绑:建会链路也走缓存)**:`create.flow.prepare` / `create.flow.quick` /
407
+ 不再每次强制重拉台账(省 ~1s),靠「候选为空自动强制重拉」兜底;代价是**刚导入的会议室在缓存期可能按名称查不到**
408
+ (按 id 指定不受影响)。只有**纯查询**(`meeting.eb.room.recommend`)同样走 24h 缓存(快);缓存超过 4 小时会在 warnings 提示
362
409
  "数据可能过时",最近改过会议室就带 `refresh: true` 重查。候选为空时还会自动强制重拉一次
363
410
  (`meta.cacheRetried: true`)。
364
411
  ⛔ **不要因为"只有 1 间/查不到"就去断言系统里没有会议室** —— 先看 `meta.roomsTotal` 与 `cacheRetried`,
@@ -412,13 +459,17 @@ cliHelp: "weaver-work-cli meeting --help"
412
459
  - 取表单一律用 `meeting.eb.meeting.create.flow.prepare`(内部按固化流程候选、未命中回落 `mt_new_wf` 调 `workflow.createForm`),
413
460
  **不要**自己拼 `workflow.createRequestDirect` / `workflow.createForm`。
414
461
  3. **能自动推的绝不问用户;剩下要问的一次问全**
415
- - **时间没说具体几点**(只说"明天/下周三/上午")→ **不要问,直接调 ① 的 `prepare` 且不传 `begin_datetime`**,
416
- 它会返回「所有人都空闲 + 该时段有会议室」的时段选项(带会议室名,`value` 可直接回填)。
417
- 这是 2026-10-30 用户明确要求的:没填时间就要推荐时间,不许弹空输入框让人手填。
462
+ - **时间只说了日期**("明天 / 下周三",**且话里没有任何时段词**)→ 不要问,直接调 ① 的 `prepare`
463
+ 且不传 `begin_datetime`,它会返回「所有人都空闲 + 该时段有会议室」的时段选项(`value` 可直接回填)。
464
+ ⛔ **只要话里出现"上午/早上/下午/晚上",就不许走这条路**:必须按第 2 条传
465
+ `{"dateFrom":"<日期>","time_slot":"上午"}`,让 CLI 直接定成 09:00–12:00。
466
+ 2026-11-03 用户第二次投诉的就是这个:说了"明天上午",还是弹「09:00~10:00 / 10:00~11:00」让他选。
418
467
  只有"只想看空闲、不建会"才单独用 `meeting.eb.meeting.create.suggest`。
419
468
  - **会议室没指定** → **不要问,要给选项**(`prepare` 返回的 `options` / `roomOptions`,
420
469
  已排好序)。呈现规则见本节第 2 条:做成选项控件,禁止列成文本 + "需要你指定一间"。
421
- - 其余真正缺的(会议名称 / 参会人 / 会议类型)**一次列完问**,不要"先问人 → 再问类型"。
470
+ - 其余真正缺的(会议名称 / 会议类型)**一次列完问**,不要"先问人 → 再问类型"。
471
+ ⛔ **参会人不算"缺"**:不传 = 当前登录人(CLI 自动补进表单),**不许弹框问"参会人员是谁"**
472
+ (2026-11-03 用户投诉:明明可以默认自己,却又弹了一次输入框)。用户后面想加人会说。
422
473
  每多一轮追问就多一次模型推理(20–40 秒),用户体感"建个会要 2 分钟"基本都是这么来的(实测 CLI 全程只要 3 秒)。
423
474
  - 用户一句话里已经给全的要素**不要再复述确认**,直接进下一步。
424
475
  4. **不要在 prepare 之前自己先去查会议室/类型/冲突** —— `prepare`/`quick` 内部已并行跑完(见上面「会议室不能默默留空」)。
@@ -444,7 +495,7 @@ cliHelp: "weaver-work-cli meeting --help"
444
495
  5. 结果回读:`meeting.list` 确认状态(取消/删除后该会议不应再出现在正常列表)。
445
496
  6. **禁止**跳过 prepare 直接 apply;**禁止**在未确认目标存在时执行写操作。
446
497
 
447
- ## 处理链:生成邀请函(docx + 对话内正文,只读,不发送)
498
+ ## 处理链:生成邀请函(docx + 对话内正文,自动发群)
448
499
 
449
500
  ⛔ **邀请函要在对话里「贴出来」,不是丢个文件让人自己下载**(2026-10-31 用户明确要求:
450
501
  「不是发文件,是直接在智能体对话中展示」)。`meeting.invitation.render` 与建会返回的
@@ -452,6 +503,12 @@ cliHelp: "weaver-work-cli meeting --help"
452
503
  正确做法:**把 `text` 原样作为回复正文的一部分贴出来**(不要包在代码块里,不要省略),
453
504
  再附一句"docx 已生成在 `<filePath>`,可下载打印/外发"。
454
505
 
506
+ ✅ **建会时邀请函会自动发到会议群**(2.48.6):`create.flow.quick/apply` 建群成功、
507
+ 邀请函 docx 生成后,CLI 会自动把 **docx 文件**发进群里(返回 `invitation.sentToGroup = {groupId, ok}`)。
508
+ **两种提交档都会发**:服务端直提(有会议号,发完整版邀请函);浏览器填单(BROWSER_FILL,无会议号,发预置函)。
509
+ 你不用再手动转发;发失败只是 warning(会议和邀请函本身不受影响),如实说明即可。
510
+ 另外群里的会议信息消息现在显示的是**会议室名称**,开始/结束时间也一定有值(之前用 `time_slot` 时会空,已修)。
511
+
455
512
  **两种用法**:
456
513
 
457
514
  | 场景 | 入参 | 说明 |
@@ -540,7 +597,10 @@ weaver-work-cli --json meeting run meeting.minute.fromGroupChat --input-json '{"
540
597
  `attachment.upload` → `minute.create` 挂附件 → ESB「解析附件」(文档同步、可能 60s 超时报 `write_uncertain` 但**不代表没执行**;音频异步约 9s 返回、原文约 2 分钟就绪)→ 等 `video_taskResult=1` / `minutes_status=4` → ESB「生成智能纪要文本」(写 `parse_content`)→ ESB「保存解析并生成文档」。
541
598
  ⛔ 不要自己拟纪要文案(提示词在 ESB 里,自己写会和小E 现有格式不一致)。
542
599
  ⛔ 不要调「获取解析纪要音频结果」:它是 1 分钟一轮的定时任务、会自己写表单,重复调可能覆盖;查进度只用 `meeting.minute.parseStatus`。
543
- ⚠️ 流程 id / 页面 id 是**租户级配置**,文中 `<…>` 均为占位符。
600
+ ✅ **三个动作流 id 与智能纪要页面 id 已内置**(本租户 primary_key),`meeting.minute.fromGroupChat` 默认就用它们,
601
+ 你**不用传** `flowGenerateMinutes` / `flowGenerateDocument` / `aiPageId`;换租户才需要覆盖。
602
+ ⛔ 手工触发时用 `uniqueIndent: "<32位 primary_key>"`,**不要塞进 `esbFlowId`** —— 那个入参只认 19 位数字 id,
603
+ 传 GUID 会报 `can not cast to long` / `系统错误`。
544
604
  ## 读附件内容(会议附件 / 项目文件 / 议题资料)
545
605
 
546
606
  ⛔ **旧结论作废**:以前 skill 里写"附件回读只有文件名、拿不到 fileId ⇒ 下载不了",**是错的**。
@@ -583,6 +643,13 @@ weaver-work-cli --json meeting run meeting.attachment.extract --input-json '{"mt
583
643
 
584
644
  ## 冲突了要给出可选项(`decisions` 里能直接挑)
585
645
 
646
+ ⛔ **不许把活推回给用户**(2026-11-04 真实翻车):会议室查不到/推荐失败时,**不要**说
647
+ 「你去系统里自己发起吧,表单里点选会自动过滤占用」——这是 CLI 该做的事。
648
+ 正确做法:① 重跑一次 `create.flow.quick/prepare`(不传 address,让 CLI 推荐);
649
+ ② 仍失败就把 `options` 给用户挑,或传 `autoRoom: true` 让 CLI 沿用首选;
650
+ ③ 真查不到候选时如实说"该时段没有可用会议室",并给 3 个替代时段。
651
+ **任何情况下都不许让用户自己去页面填会议室/自己发起流程**。
652
+
586
653
  `create.prepare` / `change.prepare` / **流程建会 `create.flow.prepare`** 的返回里都有 `data.decisions`
587
654
  (流程建会在 `data.preview.decisions`),**一律用选项方式给用户挑,不要文字罗列**:
588
655
 
@@ -643,6 +710,12 @@ weaver-work-cli --json meeting run meeting.attachment.extract --input-json '{"mt
643
710
  - **不要**在建会前自己先跑 `hrm.employee.query`、`room.list`、`conflict.member`、`schedule.free` —— prepare/quick 内部已经并行做完了
644
711
  (只有在需要给用户**换人/换房/换时间**时才单独查);
645
712
  - 需要让用户挑选时(多流程 / 有冲突要改期 / 换会议室),用 `quick`/`prepare` 返回的 `options` 做**一次**选择,选定后再 `quick` 一次即可收口。
713
+ - ✅ **两个省时机制已内置(2.48.0),不用做任何事**:
714
+ ① **全天占用缓存**——quick/prepare 第一次跑某天会一次拉全天全部会议室占用(~2s,5 分钟内有效),
715
+ 同一天内改时间/换会议室/再推荐**不再打占用接口**;提交成功后当天缓存自动作废,不会拿旧台账放行冲突。
716
+ ② **流程记忆**——多个建会流程都可发起时,自动沿用**这个人上次成功用过的流程**直接发起
717
+ (留痕说明"沿用了你上次选的"),不再弹流程选项;要强制回到"每次都问"传 `flowChoice: "ask"`。
718
+ 权限过滤照做:记忆只是默认值,不是绕过权限。
646
719
 
647
720
  ## 流程建会(`meeting.eb.meeting.create.flow`)
648
721
 
@@ -679,21 +752,41 @@ weaver-work-cli --json meeting run meeting.eb.meeting.create.flow.apply \
679
752
  - **刷新为完整版**:审批通过后 `meeting.eb.meeting.list` 找到该会议 id →
680
753
  `meeting.invitation.render --mtId <id>`(只生成、不发送)。
681
754
  - ⛔ **不要因为"会议还在审批"就重复 `apply`** —— 会重复建单/重复建会。
682
- - **只有 `submit_mode=browser` 才可能返回 `status=BROWSER_FILL`**(2026-10-31 起默认不再进这一档,
683
- 见下方「提交方式」)。万一真进到这一档:CLI 会返回 `contextId` + `finalMarkdown`(那段 `<browsertool>` 表单)
684
- + `invitation.filePath`(按申请单预生成的预置函)。正确做法:把 `finalMarkdown` 内容原样作为本轮回复正文
685
- (从 `<browsertool>` 到 `</browsertool>`、不包代码块),并告诉用户邀请函已生成在哪个路径;
755
+ - **`status=BROWSER_FILL` 时**:CLI 返回 `contextId` + `finalMarkdown`(那段 `<browsertool>` 表单)
756
+ + `invitation`(按申请单预生成的预置函)。具体做法见下方「提交方式」第一条;
686
757
  ⛔ 不要说"流程没提交成功 / 没有邀请函",也不要因为"没有 requestId"重复 `apply`。
687
758
 
688
759
  - **✅ 提交方式默认「弹表单」**(2026-10-31 用户纠正;之前默认直提是错的,别再改回去):
689
- `create.flow.quick/apply` 默认 `submit_mode=browser` —— 在小e 里会**打开流程表单**,会议名称/时间/地点/参会人员/参会客户都已预填
690
- (浏览按钮传的是 id,页面能落值),用户核对、修改后**自己点提交**。
691
- - `browser` 下 CLI **不向服务端写入**,返回 `status=BROWSER_FILL` + `finalMarkdown`(那段 `<browsertool>`),
692
- 没有 `requestId` / `meetingId` —— ⛔ **不能说"流程已提交"**,要说"表单已打开,您在页面上核对后点提交";
693
- - 邀请函照给(预置函);审批通过、会议生成后再用 mtId 跑一次 `meeting.invitation.render` 拿完整版;
760
+ `create.flow.quick/apply` 默认 `submit_mode=browser` —— CLI **只把表单块返回给你,不会自己打开页面**。
761
+ 会议名称/时间/地点/参会人员/参会客户都已预填(浏览按钮传的是 id,页面能落值),用户核对、修改后自己点提交。
762
+ - **打开表单的唯一动作 = 把 `finalMarkdown` 原样贴进回复**(从 `<browsertool>` 到 `</browsertool>`):
763
+ - 放在回复**最后**、单独成段;⛔ 不包代码块、不省略、不转述、不改缩进;
764
+ - **发送前自检**:正文里必须能搜到 `<browsertool>` 和 `"toolId": "fill_form"`;搜不到就补上再发;
765
+ - ⛔ 没贴这段却写"表单已在右侧打开"=骗人,用户看到的就是没有表单(2026-11-02 就是这么翻车的)。
766
+ - `browser` 下 CLI **不向服务端写入**,返回 `status=BROWSER_FILL` + `finalMarkdown`,没有 `requestId` / `meetingId` ——
767
+ ⛔ **不能说"流程已提交"**,要说"表单已打开(贴在下方),您在页面上核对后点提交"。
768
+ - **邀请函照给,且 `invitation.text` 必须全文贴在回复里**(预置函:按申请单已知信息生成,字段可能不全)。
769
+ ⛔ 不要只丢一个 `filePath`;也**不要因为"流程还没提交成功"就不给邀请函** —— 这是两件独立的事。
694
770
  - 只有用户明确说"不用我确认,直接建"时才传 `submit_mode=direct`:直接写服务端 → 拿 `requestId` + `meetingId`,
695
- 会议当场生成;判断落库看这两个 id,并用 `meeting.eb.meeting.detail --id <meetingId>` 回读核对;
771
+ 会议当场生成;判断落库看这两个 id,并用 `meeting.eb.meeting.detail --id <meetingId>` 回读核对。
772
+ ⚠️ 小e 环境里即使传 `direct` 也可能仍返回 `BROWSER_FILL`(流程侧没有强制提交开关)——
773
+ **一切以返回的 `status` 为准**:只有 `status=COMPLETE` 且拿到 `meetingId` 才算建好,
774
+ 否则就是"表单已给出、等用户点提交",⛔ 不要说"已提交/已建好"。
696
775
  - ⛔ 不管哪种模式,`quick` / `apply` 都是真提交,必须已拿到用户对时间/地点/人/客户的确认。
776
+ - **群聊随建会同步创建**(2026-11-02 用户要求;CLI 自动做,不用你另外调):
777
+ `quick` / `apply` 的返回里带 `groupChat: {ok, groupId, groupName, created, bound}`。
778
+ - `groupChat.ok=true` → 群已按「会议名称」建好,并在群里发过一条会议信息;回复里说一句"会议群已建好(群名=会议名称)"即可;
779
+ - `bound=true` → 群 id 已回写会议记录 `imchat_groupid`;`bound=false`(browser 档必然如此,因为还没有会议 id)→
780
+ 告诉用户"群已建好,会议生成后再绑定";
781
+ **用户说"我提交了/审批过了"之后**,跑 `meeting.eb.meeting.group.ensure`:
782
+ - 有流程单号 → 传 `{"requestId":"<单据id>"}`(**首选**,会议记录的 `request_id` 是唯一凭据);
783
+ - 没单号 → 传 `{"lookupPending":true}`:CLI 读本机「表单已发出」记录,用建群时记的基线单号
784
+ 找出之后新提交的那张,再按它反查会议。
785
+ ⛔ **不要用会议名称反查**(用户可能在表单里改名、也可能有同名会议);
786
+ 返回 `requestCandidates` 说明同时有多张新单 —— 让用户确认是哪一张,别猜;
787
+ 返回 `meetingLookup` 就是找到的会议;查不到会明说"可能还没提交/还在审批",别反复重试;
788
+ - `groupChat.ok=false` → 如实说"群没建成功"+原因;⛔ 不许编群 id、不许说群已建好;
789
+ - ⛔ 不要重复建群:重试前先看已有返回里有没有 `groupChat.groupId`。
697
790
  - **⛔ 提交前必须把 `formPreview` 贴给用户过一眼**(2.44.0 起,2026-10-31 用户要求
698
791
  「为什么没有直接发起流程表单让我确认重填后让我点击提交」):
699
792
  浏览器填单那条路走不通(浏览按钮不赋值),所以用"把要提交的内容原样列出来"替代核对环节。
@@ -155,22 +155,36 @@ video_taskResult == '2' → 生成失败
155
155
 
156
156
  ## ESB 解析链路
157
157
 
158
- 三个动作流都可用 `esbFlowId` 或 `uniqueIndent` 触发,走 `esb.trigger.prepare → apply`。
158
+ 三个动作流走 `esb.trigger.prepare → apply`,但**目标入参按 id 形态二选一,不能混**:
159
159
 
160
- > ⚠️ **表里的 id / primary_key 都是租户级配置**,各环境不同,换租户必须替换。
161
- > `meeting.minute.fromGroupChat` 内置了参考租户的默认值(生成纪要 / 生成文档两条),
162
- > 其他租户用入参 `flowGenerateMinutes` / `flowGenerateDocument` 覆盖;解析附件那条由调用方显式传 `esbFlowId`。
160
+ | id 形态 | 用哪个入参 | 服务端行为 |
161
+ | --- | --- | --- |
162
+ | 19 位数字(如 `1333212605456498718`) | `esbFlowId` | 正常 |
163
+ | 32 位十六进制 primary_key(如 `7204936B2ACC4B12A1CECD1DAB60DD97`) | **`uniqueIndent`** | 传进 `esbFlowId` 会报 `can not cast to long, value : 7204…`(查模板)或 `{"code":400,"msg":"系统错误"}`(触发) |
163
164
 
164
- | 用途 | esbFlowId | primary_key | mainTable |
165
- | --- | --- | --- | --- |
166
- | **解析附件**(文档同步 / 音视频异步) | `<解析附件flowId>` | `<解析附件uniqueIndent>` | `mtAIMinutePageID*`、`minuteId*`、`mt_id*`;可选 `doc_file` / `video_file` / `file_type` |
167
- | **保存解析并生成文档** | `<生成文档flowId>` | `<生成文档uniqueIndent>` | `parse_content*`、`mt_minute_id*` |
168
- | 解析文本生成智能纪要(备用) | `<生成纪要flowId>` | `<生成纪要uniqueIndent>` | `minuteId*` |
165
+ > ⛔ **本租户(e-cology / 泛微网络)后台只给 primary_key,没有数字 id** —— 所以一律走 `uniqueIndent`。
166
+ > `uniqueIndent` 触发时 prepare 会提示"无法按 applicationId 回查模板",这是**正常**的,不影响执行。
167
+
168
+ | 用途 | primary_key(本租户) | mainTable |
169
+ | --- | --- | --- |
170
+ | **解析附件**(文档同步 / 音视频异步) | `AD8EE1B345FD4570AE1D0882FD1B5927` | `mtAIMinutePageID*`、`minuteId*`、`mt_id*`;可选 `doc_file` / `video_file` / `file_type` |
171
+ | **保存解析并生成文档** | `1F638AE31BC746C28A1D9DCF26D91037` | `parse_content*`、`mt_minute_id*` |
172
+ | **解析文本生成智能纪要** | `7204936B2ACC4B12A1CECD1DAB60DD97` | `minuteId*` |
173
+ | 获取解析纪要音频结果 | `1DB38C10699A47E89DD7CEFDAA76B8A1` | **由后台解析任务自己触发,不要手动调**(见下节) |
169
174
 
170
- 调用示例(解析附件):
175
+ 智能纪要页面 id(`mt_minutes_ai_page`,租户级、无接口可查):**`1250830691712172036`**。
176
+ `meeting.minute.fromGroupChat` 已内置上述三个 primary_key 与页面 id 作默认值,
177
+ 换租户用入参 `flowGenerateMinutes` / `flowGenerateDocument` / `aiPageId` 覆盖。
178
+
179
+ 调用示例(生成纪要文案 → 生成文档,实测 resultCode=200):
171
180
 
172
181
  ```bash
173
- weaver-work-cli esb run esb.trigger.prepare --input-json '{"employeeId":"<员工id>","esbFlowId":"<解析附件flowId>","customParams":{"mainTable":{"minuteId":"<纪要id>","mt_id":"<会议id>","file_type":"1","video_file":"<附件id>","mtAIMinutePageID":""}}}'
182
+ # ① 解析文本 → 智能纪要文本(写 parse_content)
183
+ weaver-work-cli esb run esb.trigger.prepare --input-json '{"employeeId":"<员工id>","uniqueIndent":"7204936B2ACC4B12A1CECD1DAB60DD97","customParams":{"mainTable":{"minuteId":"<纪要id>"}}}'
184
+ weaver-work-cli esb run esb.trigger.apply --input-json '{"continuation":"<上一步返回值>","confirm":true}'
185
+
186
+ # ② 保存解析并生成文档(回写 mt_minutes,返回 customData.mainTable.wdID)
187
+ weaver-work-cli esb run esb.trigger.prepare --input-json '{"employeeId":"<员工id>","uniqueIndent":"1F638AE31BC746C28A1D9DCF26D91037","customParams":{"mainTable":{"parse_content":"<①产出的正文>","mt_minute_id":"<纪要id>"}}}'
174
188
  weaver-work-cli esb run esb.trigger.apply --input-json '{"continuation":"<上一步返回值>","confirm":true}'
175
189
  ```
176
190
 
Binary file