weaver-work-cli 0.1.28 → 0.1.31

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 (219) hide show
  1. package/dist/chunks/archive-U766FTFH.js +2537 -0
  2. package/dist/chunks/archive-oa-DMWEKX3L.js +1317 -0
  3. package/dist/chunks/asset-TCR7VDEV.js +2109 -0
  4. package/dist/chunks/attachment-content-AQNX5N3S.js +23 -0
  5. package/dist/chunks/blog-EVZWGDVM.js +2157 -0
  6. package/dist/chunks/caizhilian-JOWS6SL5.js +10087 -0
  7. package/dist/chunks/calendar-5WNCV66Q.js +1195 -0
  8. package/dist/chunks/chunk-2DUV44UX.js +15606 -0
  9. package/dist/chunks/chunk-324YPTC2.js +1607 -0
  10. package/dist/chunks/chunk-65QMVWHS.js +231 -0
  11. package/dist/chunks/chunk-6V7ZLF34.js +387 -0
  12. package/dist/chunks/chunk-AC7KJWC5.js +358 -0
  13. package/dist/chunks/chunk-AJ62BGAW.js +29 -0
  14. package/dist/chunks/chunk-BUSC6UAE.js +43 -0
  15. package/dist/chunks/chunk-CVZ2JOSW.js +62 -0
  16. package/dist/chunks/chunk-D4LTJSJD.js +477 -0
  17. package/dist/chunks/chunk-EG6ZU444.js +654 -0
  18. package/dist/chunks/chunk-EZALDOQH.js +383 -0
  19. package/dist/chunks/chunk-FMPJJYYI.js +106 -0
  20. package/dist/chunks/chunk-G2JSIUWF.js +769 -0
  21. package/dist/chunks/chunk-GCG2NMWR.js +703 -0
  22. package/dist/chunks/chunk-GPMFD4RD.js +75 -0
  23. package/dist/chunks/chunk-H3WDBYJW.js +508 -0
  24. package/dist/chunks/chunk-H6XSTSLM.js +2357 -0
  25. package/dist/chunks/chunk-J7RJTZSV.js +5556 -0
  26. package/dist/chunks/chunk-LUSPKZKY.js +53 -0
  27. package/dist/chunks/chunk-NIAJ5ZCG.js +73 -0
  28. package/dist/chunks/chunk-NOODWMCL.js +584 -0
  29. package/dist/chunks/chunk-OOUTBLZ4.js +51 -0
  30. package/dist/chunks/chunk-P26ZWSKU.js +73 -0
  31. package/dist/chunks/chunk-QWY6PGL6.js +3472 -0
  32. package/dist/chunks/chunk-R2IJAK7T.js +464 -0
  33. package/dist/chunks/chunk-R7O5PUWO.js +205 -0
  34. package/dist/chunks/chunk-RCGYCOMG.js +6962 -0
  35. package/dist/chunks/chunk-VZTXRG6X.js +403 -0
  36. package/dist/chunks/chunk-WHD4XMRP.js +161 -0
  37. package/dist/chunks/chunk-YLCYX7LE.js +371 -0
  38. package/dist/chunks/chunk-ZEDWSH32.js +68 -0
  39. package/dist/chunks/continuation-2CKSBLA6.js +11 -0
  40. package/dist/chunks/continuation-HZIZRZBX.js +13 -0
  41. package/dist/chunks/continuation-NLECEJPX.js +11 -0
  42. package/dist/chunks/ebuilder-form-NJ4YK6CC.js +2276 -0
  43. package/dist/chunks/ehr-MMYN36VA.js +5241 -0
  44. package/dist/chunks/employee-SAK2QYXX.js +11 -0
  45. package/dist/chunks/esb-HIWHOU7Q.js +141 -0
  46. package/dist/chunks/fna-KBACQTA5.js +1444 -0
  47. package/dist/chunks/host-3OHS5QUX.js +21 -0
  48. package/dist/chunks/host-IG6KEH5Q.js +19 -0
  49. package/dist/chunks/host-KQL5N4HO.js +23 -0
  50. package/dist/chunks/host-LLSZQCWR.js +17 -0
  51. package/dist/chunks/hrm-LYEC67ZQ.js +244 -0
  52. package/dist/chunks/im-RN2UKAEU.js +252 -0
  53. package/dist/chunks/invoice-EEPHLAF6.js +5179 -0
  54. package/dist/chunks/jiuchuanhui-WVVZYSJE.js +1940 -0
  55. package/dist/chunks/lazy-dispatch-MDOFFL2S.js +28 -0
  56. package/dist/chunks/mail-LNQLTF6L.js +2695 -0
  57. package/dist/chunks/meeting-XSD3BDVQ.js +504 -0
  58. package/dist/chunks/msg-parse-4GSQ2WTO.js +41 -0
  59. package/dist/chunks/okr-TMWTIU2K.js +2482 -0
  60. package/dist/chunks/plan-A2FSFA7T.js +2025 -0
  61. package/dist/chunks/project-T26QLBQF.js +1361 -0
  62. package/dist/chunks/registry-2VLUAESA.js +14 -0
  63. package/dist/chunks/registry-JCFEYXOE.js +18 -0
  64. package/dist/chunks/registry-NYPYMZXG.js +16 -0
  65. package/dist/chunks/registry-Q7OQJ3SU.js +19 -0
  66. package/dist/chunks/registry-ZJMJVWFA.js +19 -0
  67. package/dist/chunks/room-recommend-UR4ZDZS6.js +20 -0
  68. package/dist/chunks/schedule-5L2PM4M6.js +24 -0
  69. package/dist/chunks/state-Y2XBP6YE.js +15 -0
  70. package/dist/chunks/workflow-TR6PG2SL.js +245 -0
  71. package/dist/cmd/argv.js +45 -0
  72. package/dist/cmd/docs/index.js +3 -3
  73. package/dist/cmd/lazy-dispatch.js +20 -0
  74. package/dist/cmd/root.js +2 -4
  75. package/dist/cmd/setup/index.js +2 -2
  76. package/dist/cmd/skills/index.js +2 -2
  77. package/dist/core/package-paths.js +47 -0
  78. package/dist/index.js +163 -7
  79. package/dist/internal/e10/auth/xiaoe.js +3 -3
  80. package/dist/internal/e10/request-runtime.js +18 -62
  81. package/dist/internal/skills/detector.js +2 -2
  82. package/dist/shortcuts/contract/data/performance-catalog.js +1306 -0
  83. package/dist/shortcuts/contract/host.js +91 -35
  84. package/dist/shortcuts/contract/index.js +213 -0
  85. package/dist/shortcuts/contract/manifest.js +928 -0
  86. package/dist/shortcuts/contract/ooxml/docx.js +295 -0
  87. package/dist/shortcuts/contract/ooxml/xlsx.js +221 -0
  88. package/dist/shortcuts/contract/ooxml/zip.js +158 -0
  89. package/dist/shortcuts/contract/operations/assistant.js +1156 -0
  90. package/dist/shortcuts/contract/operations/clause-library.js +522 -0
  91. package/dist/shortcuts/contract/operations/compare.js +193 -0
  92. package/dist/shortcuts/contract/operations/credit-page.js +34 -0
  93. package/dist/shortcuts/contract/operations/flow.js +98 -0
  94. package/dist/shortcuts/contract/operations/page.js +66 -0
  95. package/dist/shortcuts/contract/operations/performance.js +733 -0
  96. package/dist/shortcuts/contract/operations/quote.js +557 -0
  97. package/dist/shortcuts/contract/operations/recommend.js +78 -0
  98. package/dist/shortcuts/contract/operations/registry.js +18 -0
  99. package/dist/shortcuts/contract/operations/review.js +83 -0
  100. package/dist/shortcuts/contract/operations/shared.js +37 -0
  101. package/dist/shortcuts/contract/operations/upload.js +108 -0
  102. package/dist/shortcuts/contract/operations/write.js +3 -2
  103. package/dist/shortcuts/index.js +140 -40
  104. package/dist/shortcuts/invoice/host.js +2 -1
  105. package/dist/shortcuts/invoice/manifest.js +36 -12
  106. package/dist/shortcuts/invoice/operations/issuing-qys.js +132 -36
  107. package/dist/shortcuts/invoice/operations/reim-auto.js +9 -0
  108. package/dist/shortcuts/invoice/operations/reim.js +81 -5
  109. package/dist/shortcuts/invoice/operations/shared.js +12 -5
  110. package/dist/shortcuts/meeting/host.js +45 -3
  111. package/dist/shortcuts/meeting/invitation/docx.js +442 -0
  112. package/dist/shortcuts/meeting/operations/attachment-content.js +418 -0
  113. package/dist/shortcuts/meeting/operations/attachment.js +442 -0
  114. package/dist/shortcuts/meeting/operations/eb/cache.js +57 -0
  115. package/dist/shortcuts/meeting/operations/eb/catalog.js +343 -28
  116. package/dist/shortcuts/meeting/operations/eb/conflict.js +372 -11
  117. package/dist/shortcuts/meeting/operations/eb/create-flow.js +710 -0
  118. package/dist/shortcuts/meeting/operations/eb/decision.js +47 -1
  119. package/dist/shortcuts/meeting/operations/eb/factory.js +129 -11
  120. package/dist/shortcuts/meeting/operations/eb/index.js +122 -2
  121. package/dist/shortcuts/meeting/operations/eb/room-recommend.js +378 -0
  122. package/dist/shortcuts/meeting/operations/eb/room-summary.js +84 -0
  123. package/dist/shortcuts/meeting/operations/eb/schedule.js +450 -0
  124. package/dist/shortcuts/meeting/operations/from-group-chat.js +576 -0
  125. package/dist/shortcuts/meeting/operations/invitation.js +458 -0
  126. package/dist/shortcuts/meeting/operations/minute-content.js +266 -0
  127. package/dist/shortcuts/meeting/operations/pipeline.js +489 -0
  128. package/dist/shortcuts/meeting/operations/qrcode.js +131 -0
  129. package/dist/shortcuts/meeting/operations/receipts.js +1 -1
  130. package/dist/shortcuts/meeting/operations/registry.js +18 -0
  131. package/dist/shortcuts/meeting/operations/summary.js +276 -0
  132. package/dist/shortcuts/meeting/operations/task-notify.js +325 -0
  133. package/dist/shortcuts/meeting/operations.js +42 -1
  134. package/dist/shortcuts/meeting/qr/encoder.js +427 -0
  135. package/dist/shortcuts/meeting/qr/render.js +103 -0
  136. package/dist/shortcuts/workflow/index.js +3 -0
  137. package/dist/shortcuts/workflow/operations/form.js +17 -5
  138. package/dist/shortcuts/workflow/operations/read.js +13 -6
  139. package/dist/shortcuts/workflow/operations/registry.js +2 -0
  140. package/dist/shortcuts/workflow/operations/todoSmartConvert/businessRules.js +331 -0
  141. package/dist/shortcuts/workflow/operations/todoSmartConvert/detailFieldRules.js +133 -0
  142. package/dist/shortcuts/workflow/operations/todoSmartConvert/summaryCache.js +326 -0
  143. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailCache.js +113 -0
  144. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailFetcher.js +259 -0
  145. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoListRows.js +64 -0
  146. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoOutputPlanner.js +28 -0
  147. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.aggregate.js +70 -0
  148. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.collect.js +267 -0
  149. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.core.js +392 -0
  150. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.detail.js +165 -0
  151. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.group.js +448 -0
  152. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.groupSummary.js +348 -0
  153. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.js +222 -0
  154. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.pipeline.js +66 -0
  155. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.smartGroup.js +502 -0
  156. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.summary.js +540 -0
  157. package/docs/_catalog.md +1 -0
  158. package/docs/contract.md +39 -4
  159. package/docs/invoice.md +7 -7
  160. package/docs/todo-smart-convert/README.md +171 -0
  161. package/docs/todo-smart-convert/data-contract.md +236 -0
  162. package/docs/todo-smart-convert/mock/ai-todo-query-target.json +209 -0
  163. package/docs/todo-smart-convert/subgroup-rules.md +245 -0
  164. package/package.json +3 -2
  165. package/scripts/bundle.mjs +63 -0
  166. package/scripts/package-skill.mjs +1 -1
  167. package/skill-template/business-info.json +25 -4
  168. package/skill-template/domains/jinchengda.md +16 -3
  169. package/skill-template/domains/yepiaotong.md +3 -3
  170. package/skills/weaver-e10-jinchengda/SKILL.md +111 -31
  171. package/skills/weaver-e10-jinchengda/references/contract-agent-entry.md +7 -13
  172. package/skills/weaver-e10-jinchengda/references/contract-ai-assistant.md +150 -0
  173. package/skills/weaver-e10-jinchengda/references/contract-ai-review.md +87 -0
  174. package/skills/weaver-e10-jinchengda/references/contract-clause-library-crud.md +111 -0
  175. package/skills/weaver-e10-jinchengda/references/contract-clause-recommender.md +0 -15
  176. package/skills/weaver-e10-jinchengda/references/contract-clause-reference-save.md +0 -13
  177. package/skills/weaver-e10-jinchengda/references/contract-credit-page.md +50 -0
  178. package/skills/weaver-e10-jinchengda/references/contract-disabled-capabilities.md +4 -2
  179. package/skills/weaver-e10-jinchengda/references/contract-doc-compare.md +74 -0
  180. package/skills/weaver-e10-jinchengda/references/contract-flow-launch.md +84 -0
  181. package/skills/weaver-e10-jinchengda/references/contract-performance-query.md +29 -0
  182. package/skills/weaver-e10-jinchengda/references/contract-quote-to-contract.md +28 -0
  183. package/skills/weaver-e10-jinchengda/references/contract-request-status.md +2 -21
  184. package/skills/weaver-e10-jinchengda/references/contract-request-write.md +0 -24
  185. package/skills/weaver-e10-jinchengda/references/contract-signing-subjects.md +0 -15
  186. package/skills/weaver-e10-jinchengda/references/contract-subject-create.md +0 -17
  187. package/skills/weaver-e10-jinchengda/references/contract-template-recommend.md +70 -0
  188. package/skills/weaver-e10-jinchengda/references/contract-template-selector.md +0 -15
  189. package/skills/weaver-e10-jinchengda/references/contract-workflow-discovery.md +0 -15
  190. package/skills/weaver-e10-jinchengda/references/source-manifest.json +1168 -152
  191. package/skills/weaver-e10-meeting/SKILL.md +493 -17
  192. package/skills/weaver-e10-meeting/references/meeting-change.md +4 -4
  193. package/skills/weaver-e10-meeting/references/meeting-create.md +6 -6
  194. package/skills/weaver-e10-meeting/references/meeting-eb.md +503 -27
  195. package/skills/weaver-e10-meeting/references/meeting-invitation.md +113 -0
  196. package/skills/weaver-e10-meeting/references/meeting-lifecycle.md +6 -6
  197. package/skills/weaver-e10-meeting/references/meeting-minute-file.md +425 -0
  198. package/skills/weaver-e10-meeting/references/meeting-queries.md +4 -4
  199. package/skills/weaver-e10-meeting/references/meeting-receipts-signs.md +15 -15
  200. package/skills/weaver-e10-meeting/references/meeting-verification.md +19 -11
  201. package/skills/weaver-e10-meeting.zip +0 -0
  202. package/skills/weaver-e10-workflow/SKILL.md +23 -1
  203. package/skills/weaver-e10-workflow/references/todo-smart-convert.md +282 -0
  204. package/skills/weaver-e10-workflow/scripts/todo-summary.cjs +695 -0
  205. package/skills/weaver-e10-yepiaotong/SKILL.md +15 -11
  206. package/skills/weaver-e10-yepiaotong/references/invoice-enterprise-list.md +1 -1
  207. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +10 -7
  208. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-form-fill-rules.md +41 -14
  209. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-workflow.md +54 -26
  210. package/skills/weaver-e10-yepiaotong/references/invoice-personal-list.md +6 -5
  211. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +14 -11
  212. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +97 -56
  213. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +84 -60
  214. package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +142 -105
  215. package/skills/weaver-e10-yepiaotong/references/reim-matching-rules.md +53 -194
  216. package/skills/weaver-e10-yepiaotong/references/reim-phone-subsidy-rules.md +7 -7
  217. package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +164 -72
  218. package/skills/weaver-e10-yepiaotong/references/source-manifest.json +8 -2
  219. package/templates/meeting/invitation.docx +0 -0
@@ -2,10 +2,10 @@
2
2
  name: weaver-e10-meeting
3
3
  display_name: 泛微E10会议管理
4
4
  display_name_en: Weaver E10 Meeting Management
5
- description: "泛微 E10 会议管理,帮您处理会议日常事务:[会议]-查询今天/本周/我的会议与会议详情,预约建会(自动做会议室与参会人冲突检测),会议改期/换地点/改参会人、取消、删除;[会议室]-查询会议室与占用/空闲情况;[参会与回执]-查参会人名单、填写/更新会议回执;[签到]-查签到与签退情况、补签、补签退、清除签到记录;[会议资料]-会议议题(查看/更新/删除)、议题类型、会议纪要查询、会议类型与应用设置、会议决议发布与决议任务跟踪。认证与会话由 weaver-e10-shared 提供。"
6
- description_zh: "泛微 E10 会议管理,帮您处理会议日常事务:[会议]-查询今天/本周/我的会议与会议详情,预约建会(自动做会议室与参会人冲突检测),会议改期/换地点/改参会人、取消、删除;[会议室]-查询会议室与占用/空闲情况;[参会与回执]-查参会人名单、填写/更新会议回执;[签到]-查签到与签退情况、补签、补签退、清除签到记录;[会议资料]-会议议题(查看/更新/删除)、议题类型、会议纪要查询、会议类型与应用设置、会议决议发布与决议任务跟踪。认证与会话由 weaver-e10-shared 提供。"
7
- description_en: "Weaver E10 meeting management for daily meeting tasks: [Meetings] query today's / this week's / my meetings and meeting details, book meetings with automatic room & attendee conflict checks, reschedule / change location / change attendees, cancel, delete; [Rooms] query meeting rooms and occupancy / availability; [Attendees & receipts] view attendee lists, fill in / update meeting receipts; [Sign-in] view sign-in / sign-out status, manual sign-in, manual sign-out, clear sign-in records; [Meeting content] meeting agenda (view / update / delete), agenda types, minutes query, meeting types, application settings, meeting decision publishing and decision task tracking. Auth and session are provided by weaver-e10-shared."
8
- version: 2.14.0
5
+ description: "泛微 E10 会议管理:查会议、预约建会(推荐会议室、查冲突与空闲时段)、改期/改地点/改参会人、取消删除、流程建会、会议室查询与推荐、生成邀请函、读取会议附件、回执签到、纪要与决议任务、参会二维码。详见 description_zh。"
6
+ description_zh: "泛微 E10 会议管理,帮您处理会议日常事务:[会议]-查询今天/本周/我的会议与会议详情,预约建会(自动推荐会议室、检测参会人会议冲突与日程空闲、冲突时给出当天可选时段),改期/换地点/改参会人、取消、删除;受限环境可走审批流程建会并自动出邀请函;[会议室]-查询会议室与占用,按人数/设备/常用程度智能推荐;[邀请函]-按会议真实数据生成邀请函文档;[资料]-读取会议与议题的附件、抽取文档正文;参会回执、签到与补签、纪要、议题、决议与决议任务;[二维码]-把文本渲染成参会码/签到码图片。认证与会话由 weaver-e10-shared 提供。"
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.15.0
9
9
  author: 泛微网络科技股份有限公司
10
10
  agent_created: true
11
11
  requires:
@@ -21,9 +21,26 @@ cliHelp: "weaver-work-cli meeting --help"
21
21
  **`--is-connector` 判据**:用户明确使用连接器、或上下文要求用连接器完成任务 → 传 `true`;本次任务或上下文直接选择单独技能 → 不传;用户没有明确说明时,按**正在运行的这份 Skill 是哪一级**定——**用户级(条目标 `(user)`)不传,连接器级(标 `(connector)`)传**(同名 Skill 只会运行用户级那一份)。传 `true` 时不要再写 `--profile` / `--base-url`。完整规则见 [`../weaver-e10-shared/SKILL.md`](../weaver-e10-shared/SKILL.md)。
22
22
 
23
23
  凭证边界:所有 E10 调用凭证一律由 `weaver-work-cli` 的登录托管凭据(`auth` 命令/profile 体系)提供,禁止硬编码任何密钥,禁止向用户索取 Cookie、ETEAMSID、Token 或密码。
24
+ 业务命令返回 `authentication` / `session_expired` 时必须停止并读取共享认证规则:Agent 复用任务开始时的宿主判定且禁止调用任何其他登录 Skill;明确为 XiaoE 时只执行 `weaver-work-cli auth xiaoe`,返回 `xiaoe_credential_unavailable` 时停止且不自动改用浏览器登录;非 XiaoE 时取得用户确认的真实 E10 域名后执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。登录恢复后读操作可重放,写操作不得复用旧 continuation,必须重新 prepare 和确认,`partial` / `write_uncertain` 必须先只读回查。
24
25
 
25
26
  本 Skill 通过 `weaver-work-cli meeting` 命令调用真实 operation,不绕过 CLI 直接拼接口。
26
27
 
28
+ ## ⛔ 输出硬性规则(违反即交付不合格)
29
+
30
+ 1. **凡是给用户看的对象名称,一律是可点击链接**:会议 / 议题 / 纪要 / 会议室 / 签到 / 决议 的名字,
31
+ 必须渲染成 `[名称](url)`(Markdown 语法即 `<a>` 链接)。
32
+ - 链接**只能**由 `meeting.link` 生成(EB 版 `objid` 要按表 tag 动态解析,**禁止手工拼 URL**);
33
+ - 批量列表用 `meeting.link --dataIds` **一次**生成全部,别逐条调用;
34
+ - 链接**内联在名称本身**,禁止另起一列「详情链接」;
35
+ - 只有 `data.source=none`(标准版会议室/会议类型无单页)时才输出纯文本名称,并说明"该对象无详情页"。
36
+ - ⛔ 输出一串纯文本会议名 = 用户点不进去 = 交付不合格,**不是"格式偏好"问题**。
37
+ 2. **会议室 `status` 是 Select:`0` = 正常(可用)、`1` = 封存(不可用)**。
38
+ 不要读成"启用/停用"——`0` 才是正常,`1` 才是不可用。`meeting.eb.room.list` 已直接给 `progress.items[].statusText`
39
+ 和 `progress.summary.unusable`,**读现成的,别自己拿 `0/1` 推**。
40
+ 3. **两套「议题状态」不能混用**:
41
+ - 议题库 `uf_mt_topic.topic_status`:**1 呈批中 / 2 待上会 / 3 已上会**("上没上会");
42
+ - 会议议题明细 `detail1[].topic_status`:**0 待开始 / 1 进行中 / 2 已结束**("会上开到哪")。
43
+
27
44
  ## 触发场景(用户这样说时使用本 Skill)
28
45
 
29
46
  - 会议查询:「今天的会议」「我的会议」「下周有什么会」「这场会谁参加」「会议详情」
@@ -67,7 +84,7 @@ cliHelp: "weaver-work-cli meeting --help"
67
84
  - 「补签 / 帮他补上签到」→ 先 `meeting.sign.list` 定位记录 → `meeting.sign.mark.prepare` → 确认后 `apply`;「补签退」用 `meeting.sign.back.prepare`。二者会改写签到事实,必须用户明确确认。
68
85
  - 「清除签到记录 / 撤销签到」→ `meeting.sign.clear.prepare` → 确认后 `apply`。
69
86
  - 「我要签到 / 扫码签到」→ **CLI 不支持**(依赖现场二维码票据 qrticket 与设备 IP),引导用户现场扫码或走 H5 签到;**绝不代签**。
70
- - **EB 模式(mode=eb)下,同一意图改用 EB operations**(见「命令表(EB 版)」):今天的会议 → `meeting.eb.meeting.list`(先 count 再 list);建会 → 先读 `meeting.eb.baseSet.get` 判断是否需走流程,再 `meeting.eb.meeting.create.prepare`(**prepare 内部自动执行会议室/参会人冲突检测**:命中禁止提交 → `conflict_rejected` 直接停止;仅提醒 → 只写入 `warnings`,如实告知 + 建议换时间/换地点,是否继续由用户决定(不主动建议忽略冲突));变更/取消 → `meeting.eb.meeting.change.prepare`(取消用 `operate_type=CANCEL`、`mt_status=4`);签到 → `meeting.eb.sign.list`;回执 → `meeting.eb.receipt.list`;纪要 → `meeting.eb.minute.list`;议题 → `meeting.eb.topic.list`;**补签 → `meeting.eb.sign.mark`(走更新,禁止用 `sign.create`)**;**会议决议 → `meeting.eb.decision.publish`(写决议 + 自动把会议标为已决议,一步到位,勿拆成两步)**;决议任务 → `meeting.eb.decisionTask.list` / `.update`。
87
+ - **EB 模式(mode=eb)下,同一意图改用 EB operations**(见「命令表(EB 版)」):今天的会议 → `meeting.eb.meeting.list`(先 count 再 list);建会 → 先读 `meeting.eb.baseSet.get` 判断是否需走流程,再 `meeting.eb.meeting.create.prepare`(**prepare 内部自动执行会议室/参会人冲突检测**:命中禁止提交 → `conflict_rejected` 直接停止;仅提醒 → 只写入 `warnings`,如实告知 + 建议换时间/换地点,是否继续由用户决定(不主动建议忽略冲突));变更/取消 → `meeting.eb.meeting.change.prepare`(取消用 `operate_type=CANCEL`、`mt_status=4`);签到 → `meeting.eb.sign.list`;回执 → `meeting.eb.receipt.list`;纪要 → `meeting.eb.minute.list`;议题 → `meeting.eb.topic.list`;**补签 → `meeting.eb.sign.mark`(走更新,禁止用 `sign.create`)**;**会议决议 → `meeting.eb.decision.publish`(写决议 + 自动把会议标为已决议,一步到位,勿拆成两步)**;决议任务 → `meeting.eb.decisionTask.list` / `.update`;**改决议 → `meeting.eb.decision.update`**(改明细默认是追加,整组替换传 `detail1Mode:"cover"`)。
71
88
 
72
89
  ## 命令表(标准版,仅 mode=standard 使用)
73
90
 
@@ -108,22 +125,43 @@ cliHelp: "weaver-work-cli meeting --help"
108
125
  | EB 签到新建 / 更新 | `meeting.eb.sign.create` / `.update`(prepare→apply) | [meeting-eb.md](references/meeting-eb.md) |
109
126
  | EB 回执列表 / 详情 | `meeting.eb.receipt.list` / `.detail` | [meeting-eb.md](references/meeting-eb.md) |
110
127
  | EB 回执新建 / 更新 | `meeting.eb.receipt.create` / `.update`(prepare→apply) | [meeting-eb.md](references/meeting-eb.md) |
111
- | EB 纪要列表(纪要创建未实现) | `meeting.eb.minute.list` | [meeting-eb.md](references/meeting-eb.md) |
128
+ | EB 纪要列表 / 详情 | `meeting.eb.minute.list` / `.detail` | [meeting-eb.md](references/meeting-eb.md) |
129
+ | EB 纪要新建 / 更新 / 删除 | `meeting.eb.minute.create` / `.update` / `.delete`(各 prepare→apply) | [meeting-eb.md](references/meeting-eb.md) |
112
130
  | EB 会议类型列表 / 新建 / 删除 | `meeting.eb.type.list` / `.create` / `.delete` | [meeting-eb.md](references/meeting-eb.md) |
113
131
  | EB 议题类型列表 / 详情 / 更新 / 删除 | `meeting.eb.topicType.list` / `.detail` / `.update` / `.delete` | [meeting-eb.md](references/meeting-eb.md) |
132
+ | **EB 创建议题**(`create_mt_topic`,必填 `topic_title`;挂会议传 `mt_id`) | **`meeting.eb.topic.create.prepare` → `apply`** | [meeting-eb.md](references/meeting-eb.md) |
114
133
  | EB 会议议题列表 / 详情 / 更新 / 删除 | `meeting.eb.topic.list` / `.detail` / `.update` / `.delete` | [meeting-eb.md](references/meeting-eb.md) |
115
134
  | EB 应用设置(`only_flow_create`/`open_mt_approve` 建会闸门与冲突策略的依据) | `meeting.eb.baseSet.get` | [meeting-eb.md](references/meeting-eb.md) |
116
135
  | **EB 发布会议决议**(写决议 + 自动把会议标为已决议) | **`meeting.eb.decision.publish.prepare` → `apply`** | [meeting-eb.md](references/meeting-eb.md) |
117
136
  | EB 决议列表 / 详情 / 删除 | `meeting.eb.decision.list` / `.detail` / `.delete.prepare` → `apply` | [meeting-eb.md](references/meeting-eb.md) |
137
+ | **EB 更新决议**(改概述文本;改明细默认是**追加**,要整组替换传 `detail1Mode:"cover"`;不会同步到已生成任务) | **`meeting.eb.decision.update.prepare` → `apply`** | [meeting-eb.md](references/meeting-eb.md) |
118
138
  | EB 决议任务列表(按会议 / 执行人 / 状态) | `meeting.eb.decisionTask.list` | [meeting-eb.md](references/meeting-eb.md) |
119
139
  | EB 更新决议任务完成状态 | `meeting.eb.decisionTask.update.prepare` → `apply` | [meeting-eb.md](references/meeting-eb.md) |
140
+ | **直建 / 删除单条决议任务**(create **仅兜底**:ESB 已自动生成任务,手工再建会重复;`executor` 放 `detail1`) | `meeting.eb.decisionTask.create` / `.delete` 的 `prepare` → `apply` | [meeting-eb.md](references/meeting-eb.md) |
141
+ | **把决议任务推送到会议群聊**(默认只预览,`confirm:true` 才真发) | **`meeting.decision.notifyGroup`** | [meeting-eb.md](references/meeting-eb.md) |
142
+ | **一条命令跑完**:群聊→纪要→文档→提交决议(ESB 自动生成任务)→推群(`level` 分档,提交决议/发群要 `confirm`) | **`meeting.pipeline.run`** | 见下「一条命令跑完」 |
120
143
  | EB 补签 / 补签退(自动定位签到记录,走更新) | `meeting.eb.sign.mark.prepare` → `apply` | [meeting-eb.md](references/meeting-eb.md) |
121
144
  | EB 会议室 / 参会人冲突检测(只查不建) | `meeting.eb.conflict.room` / `.member` | [meeting-eb.md](references/meeting-eb.md) |
122
145
  | EB 详情页链接(会议/会议室/占用/签到/回执/纪要/议题/设置) | `meeting.link`(按 `type` 解析 objid 并缓存) | [meeting-eb.md](references/meeting-eb.md) |
146
+ | **按会议真实数据生成邀请函 docx**(只生成、不发送;有议题自动填议程表) | **`meeting.invitation.render`** | [meeting-invitation.md](references/meeting-invitation.md) |
147
+ | **文本 → 二维码图片**(参会码/签到码/链接码;PNG/SVG,本地零依赖、离线可出图) | **`meeting.qrcode.render`** | 见下「二维码生成」 |
148
+ | **参会人日程空闲**(查**日程应用**,不是会议表;自动过滤「会议日程」类型,id 动态解析不写死) | **`meeting.eb.schedule.free`** | 见下「日程空闲与会议室推荐」 |
149
+ | **会议室推荐**(人数 + 地点/设备/类型要求 + 个人常用 + 时段占用;会议室/常用走缓存,占用实时查) | **`meeting.eb.room.recommend`** | 见下「日程空闲与会议室推荐」 |
150
+ | **流程建会**(应用设置「只允许流程新建会议」时必须走这条;提交后自动出邀请函) | **`meeting.eb.meeting.create.flow.prepare` → `apply`** | 见下「流程建会」 |
151
+ | **一步建会**(prepare+apply 合并,一次调用建完并出邀请函;多流程/需选择时自动退回选项) | **`meeting.eb.meeting.create.flow.quick`** | 见下「流程建会」 |
152
+ | **找所有人共同空闲的时段**(冲突时给可选项,别只说"撞了") | **`meeting.eb.conflict.availability`** | 见下「冲突了要给出可选项」 |
153
+ | **上传本地文件拿附件 id**(给纪要 `doc_file`/`video_file` 用;秒传 + 超时自动复核) | **`meeting.attachment.upload`** | [meeting-minute-file.md](references/meeting-minute-file.md) |
154
+ | **查附件清单拿 fileId**(会议附件 `mt_accessorys`、项目文件 `project_files`、议题资料 `related_materials`) | **`meeting.attachment.list`** | 见下「读附件内容」 |
155
+ | **按 fileId 下载附件**(会议附件用 E10 登录态;也可按 mtId 批量下) | **`meeting.attachment.download`** | 见下「读附件内容」 |
156
+ | **下载并抽正文**(txt/md/csv/json/docx/xlsx/pptx;PDF/图片明确标 unsupported) | **`meeting.attachment.extract`** | 见下「读附件内容」 |
157
+ | **回写原文/纪要并自动推进状态**(音频原文→2;文档原文→4;纪要文案→2) | **`meeting.minute.writeContent`** | [meeting-minute-file.md](references/meeting-minute-file.md) |
158
+ | **单次查解析进度**(idle/pending/extracted/completed/failed,不轮询不阻塞) | **`meeting.minute.parseStatus`** | [meeting-minute-file.md](references/meeting-minute-file.md) |
159
+ | **给会议挂附件**(上传带 refId 绑定记录 + 写 mt_accessorys;写 id 读名字,追加需传旧 id) | **`meeting.attachment.attach`** | [meeting-eb.md](references/meeting-eb.md) |
160
+ | **群聊消息 → 纪要**(拉会议群消息→重排→过滤系统通知→拼原文→建纪要;可选接 ESB 生成文案/文档) | **`meeting.minute.fromGroupChat`** | [meeting-minute-file.md](references/meeting-minute-file.md) |
123
161
  | EB 传参口径(人员传 **HRM 员工 id**,非 E10 userId;日期 `yyyy-MM-dd HH:mm`) | — | [meeting-eb.md](references/meeting-eb.md) |
124
162
 
125
163
  > **给验证方(其他智能体)**:需要"验证所有会议功能"时,直接交付 [meeting-verification.md](references/meeting-verification.md)
126
- > —— 内含全部 **99 个 operation**(标准版 28 + EB 版 70 + 跨模式 1)的逐条判据、写链路模板、15 个负向用例、
164
+ > —— 内含全部 **133 个 operation**(标准版 28 + EB 版 91 + 跨模式 14)的逐条判据、写链路模板、15 个负向用例、
127
165
  > 8 项不在范围的功能清单,以及可直接粘贴的验证提示词与回执模板。
128
166
 
129
167
  ## 处理链:预约会议(高风险写,强制确认链)
@@ -134,7 +172,7 @@ cliHelp: "weaver-work-cli meeting --help"
134
172
  3. `meeting.create.prepare`:自动执行建会路径检查(`onlyFlowCreate=1` 或周期工作流 → 拒绝并提示走流程)与**强制冲突检测**(接口失败视为冲突;`cansub=false` 直接拒绝;`cansub=true` 有冲突描述 → warnings 如实告知并建议换时间/地点,**但不阻止提交**,是否继续由用户决定;CLI 不主动建议忽略冲突)。
135
173
  4. 向用户摘要 preview(含 caller/contacter 默认当前用户、周期 `repeatDesc` 自动拼接)。
136
174
  5. 用户明确确认 → `meeting.create.apply`(`confirm: true` + continuation,**10 分钟内有效,过期重新 prepare**)。
137
- **apply 的入参口径(2026-10-08 修正)**:只传 `confirm` + `continuation` 即可 —— 业务字段以 prepare 快照为准(快照就是用户刚确认过的内容);若同时传了业务字段,则必须与快照一致,否则报 `target_changed`(提示重新 prepare),**不会**绕过确认闸门。
175
+ **apply 的入参口径**:只传 `confirm` + `continuation` 即可 —— 业务字段以 prepare 快照为准(快照就是用户刚确认过的内容);若同时传了业务字段,则必须与快照一致,否则报 `target_changed`(提示重新 prepare),**不会**绕过确认闸门。
138
176
  6. 结果回读用 `meeting.list`;会议链接一律用 `meeting.link` 生成(**禁止手工拼 URL**:EB 版 objid 需动态解析,标准版会议室/会议类型没有单页),再按 `[名称](url)` **内联到名称单元格**输出。
139
177
 
140
178
  ## 处理链:变更 / 取消 / 删除会议(高风险写,强制确认链)
@@ -146,6 +184,449 @@ cliHelp: "weaver-work-cli meeting --help"
146
184
  5. 结果回读:`meeting.list` 确认状态(取消/删除后该会议不应再出现在正常列表)。
147
185
  6. **禁止**跳过 prepare 直接 apply;**禁止**在未确认目标存在时执行写操作。
148
186
 
187
+ ## 处理链:生成邀请函 docx(只读,不发送)
188
+
189
+ 1. 先确认 `meeting.env.detect` 的 `mode`;**EB 版**才能取到邀请函所需字段(`meeting.eb.meeting.list` 单查)。
190
+ 2. 定位会议 id:用户给了会议名 → 先用 `meeting.eb.meeting.list`(`mt_name` 模糊)让用户确认,**不要猜 id**。
191
+ 3. 问清「来访客户名称 / 客户单位」,作为 `extra.guest_org` 传入 —— **接口不返回该字段**,不传就会渲染成高亮【待补充】。
192
+ 4. 跑 `meeting.invitation.render`,把 `filePath` 与 `pendingFields` 原样告诉用户;有待补充字段时提示"文档里已黄色高亮标出,请补完再发出"。
193
+ 5. 议程**不用问、不用传**:会议有议题就按议题自动填进议程表,没有就保留模板示例行。看返回的 `agendaSource`:
194
+ - `meeting.topic` → 已按议题填好,正常;
195
+ - `template` → 该会议没排议题,**必须提醒用户议程表里还是模板示例内容,需人工改**(`warnings` 里也会说)。
196
+ 只有当用户明确说"议程这样写"时,才用 `extra.agenda`(`内容|时长|时间段`,换行分隔)覆盖。
197
+ 6. **本操作不发送任何消息**:不要调用 IM/邮件,也不要把文件内容读进上下文拼接。
198
+
199
+ ## 处理链:给纪要挂附件 + 回填文字(上传→解析→写回)
200
+
201
+ 用户给的是一段**录音/录像或一份会议材料**,要变成一条完整纪要时:
202
+
203
+ 1. `meeting.attachment.upload`(`file`=本地路径)→ 拿 `fileId`
204
+ - 返回 `reused:true` 表示秒传命中;`recovered:true` 表示超时但文件已落地 —— **这两种都不许再重试上传**。
205
+ 2. `meeting.eb.minute.create.prepare → apply`:`file_type`= `1`(音频/视频)或 `0`(文档),
206
+ 把 `fileId` 分别写进 `video_file` / `doc_file`。
207
+ 3. **解析由你自己做**(CLI 不做 ASR/OCR,接口也触发不了解析):
208
+ - 音频/视频(mp4/mp3/m4a/wav…)→ 用你的音频转写能力,直接转这个本地文件;
209
+ - docx / pdf / 图片 → 直接读该文件提取文字。
210
+ 输出**只保留原文**(不总结、不解读、不加开场白),格式按用户给过的"高精度文本提取器"提示词。
211
+ 4. 把原文写进 `minutes_content`:`meeting.eb.minute.update.prepare → apply`(必带 `id` + `mt_id`)。
212
+ 5. 再按"生成会议纪要"的提示词,把原文整理成结构化纪要,写进 `parse_content`(HTML 富文本)。
213
+ 6. 别承诺"已开始解析":判断解析是否完成看 `video_taskResult=='1'` 且 `parse_content` 非空,
214
+ **不要看 `minutes_status`**(该字段常年卡在 1)。
215
+ 7. 详见 [meeting-minute-file.md](references/meeting-minute-file.md)。
216
+
217
+ ### 走群聊消息生成纪要
218
+
219
+ **直接调 `meeting.minute.fromGroupChat`**,一条命令跑完,不用手工拼流程:
220
+
221
+ Windows PowerShell:
222
+
223
+ ```powershell
224
+ # 只要原文(最快,约 1.2 秒)
225
+ weaver-work-cli --json meeting run meeting.minute.fromGroupChat --input-json '{"mt_id":"<会议id>"}'
226
+ # 连纪要文案一起生成(ESB 633,约 40 秒)
227
+ weaver-work-cli --json meeting run meeting.minute.fromGroupChat --input-json '{"mt_id":"<会议id>","pipeline":"minutes"}'
228
+ # 再生成文档(ESB 628)
229
+ weaver-work-cli --json meeting run meeting.minute.fromGroupChat --input-json '{"mt_id":"<会议id>","pipeline":"document"}'
230
+ ```
231
+
232
+ macOS/Linux:命令完全一致,仅路径写法不同。
233
+
234
+ 它内部做的事(这些口径都踩过坑,写在操作里了):
235
+
236
+ 1. 按 `mt_id` 读会议 → 取 `imchat_groupid`(也可显式传 `groupId`);
237
+ 2. `im.msg.sync.group` 拉消息,**默认时间窗 = max(会议创建时间, 开始前 7 天) ~ min(现在, 结束后 2 小时)**
238
+ (群里分工多是会前发的,只拉当天会漏;窗口也别无限放大,见下条);
239
+ 3. **按 `msgtime` 升序重排**(接口返回是倒序,不排时间线就反了);
240
+ 4. 过滤 `typeName=通知` 的系统消息,并在 `warnings` 里报告忽略条数;需要保留传 `keepSystem=true`;
241
+ 5. `sender=我` 时用 `from_uid` 反查真名(`im.person.resolveByIds`);
242
+ 6. 拼「时间 说话人:内容」→ 建纪要写 `minutes_content`(状态 4);
243
+ 7. `mt_minutes_ai_page` 自动从该会议已有纪要反查,拿不到会 warning(也可传 `aiPageId`);
244
+ 8. **用户另外给了材料(`files` / `content`)时是「合并」不是二选一**:只要会议有
245
+ `imchat_groupid`,群聊照旧并入,用户材料排在前面(原文里能看到
246
+ `===== 用户提供的会议材料 =====` 与 `===== 群聊记录(N 条)=====` 两个分节)。
247
+ 只有**既没有群、也没有材料**才报 `group_missing`。
248
+
249
+ **⚠️ 权限边界**:读消息用**当前登录账号**调 `POST /api/em/msg/executeIm/chat/syncGroupMsg`,
250
+ 只能读到该账号所在的群;账号不在群里会返回空(是权限,不是接口坏了)。
251
+
252
+ **⚠️ 消息量很大时**(几千/几万条):超过 `sampleThreshold`(默认 200)会自动采样去噪
253
+ (保留 @ 与关键任务句、丢弃单字回复/纯表情/复读、每人非关键消息限 60 条),
254
+ 返回里 `sampled`/`sampledDropped` 会标出来,**必须如实告知用户"这是采样后的结果"**。
255
+ 真正的瓶颈是 ESB 633 会被超长原文撑爆,所以先跑 `pipeline=text` 出原文确认,再决定要不要生成纪要。
256
+
257
+ **⚠️ 原文超长会自动降级为摘要版**:采样后仍超 `maxTranscriptChars`(默认 20000 字)时,
258
+ 只保留**分工/结论/待办**类发言,写进纪要的内容开头会带
259
+ `【群聊摘要:共 N 条消息,仅保留… K 条,省略 M 条】`,完整原文另存到 `fullTranscriptPath`。
260
+ 返回里 `digestMode=true` 时**必须告诉用户"这是摘要口径、不是逐字全文"并给出那个路径** ——
261
+ 不然用户会以为纪要漏内容,而其实是我们主动省略的。
262
+
263
+ **任务怎么定 —— 由你(智能体)来分析,不要指望正则**:
264
+
265
+ 1. **主路径**:先跑 `level=text` 或读回 `minutes_content` 拿到原文,**你自己读懂语义**,
266
+ 把分析出的任务用 `decisions: [{executor, title}]` 传给 `meeting.pipeline.run`。
267
+ 给了 `decisions` 就以它为准(返回里 `tasks.source="agent"`),CLI 只负责解析执行人 + 建任务。
268
+ 2. **兜底**:没传 `decisions` 时 CLI 才用关键词匹配(返回里 `tasks.source="keyword"`),
269
+ 只认两种写法:"@某人 …负责 xxx"(@ 必须在词首,避免把邮箱 `a@163.com` 当成提及)、
270
+ 以及不带 @ 的"说话人:负责 xxx"。
271
+ ⛔ **覆盖不到**「我来出方案」「先请 @某人 梳理一下」这类常见分工句 —— 别拿兜底结果当最终答案,
272
+ 也别为了迁就它去改正则:**这是模型的活,不是正则的活**。
273
+ 兜底一条都没匹配到时不会建任务,并会提示改用 `decisions`。
274
+ 执行人用 `from_uid` 后**用 `username` 查 HRM**(`user1@example.com` 这类邮箱账号是真实员工,
275
+ 用 `email`/`keyword` 查会查不到);解析不出人的**列出来告诉用户**,不要静默丢弃。
276
+
277
+ ### 总结一场会议(`meeting.summary.get`)
278
+
279
+ 用户说"总结一下这场会""这个会讨论了什么""进展怎么样"时用它。**只读、零副作用**,
280
+ 一次把四路材料聚齐:
281
+
282
+ ```bash
283
+ weaver-work-cli --json meeting run meeting.summary.get --input-json '{"mt_id":"<会议id>"}'
284
+ # 只要某几路(少拉就快):{"mt_id":"<会议id>","include":["minutes","tasks"]}
285
+ ```
286
+
287
+ 返回 `data` 四段,缺哪段都会**在 `warnings` 里说清原因**,不会静默给 null:
288
+
289
+ | 段 | 内容 | 取不到时 |
290
+ | --- | --- | --- |
291
+ | `overview` | 会议名/时间/地点/主题/状态 + `groupId` | 会议不存在 → 直接报错 |
292
+ | `minute` | `content`(原文,群聊+材料合并)+ `parseContent`(**ESB 生成的结构化纪要**,信息密度最高) | 没有纪要 / 详情读空 → warning |
293
+ | `tasks` | `progress.summary`(total/done/overdue/inProgress/pending)+ `progress.items[]`(每任务每人 `finish_status`) | 没有任务 → warning |
294
+ | `attachments` | `items`(fileId 清单)+ `texts`(抽出的正文) | 没有附件 → warning;只要清单传 `withAttachmentText:false` |
295
+ | `chat` | `transcript`(时间正序、已过滤系统通知、`sender=我` 已换成真名)+ 实际窗口 | 会议没有 `imchat_groupid` → warning |
296
+
297
+ **总结由你来做,CLI 只负责取材料**(跟上面 `decisions` 一个道理):优先读 `minute.parseContent`
298
+ (已按"会议概况/议题讨论/决策事项/任务部署/待解决问题"分好段),它缺失时再读 `chat.transcript`
299
+ + `minute.content` 自己归纳;要讲进展就配 `tasks.progress`。
300
+
301
+ 常用入参:`minuteId`(指定纪要,默认取最新一条)、`groupId`(覆盖会议自带的群)、
302
+ `chatFrom`/`chatTo`(覆盖默认窗口)、`maxChatChars`(默认 20000,超了截断并标注)、
303
+ `maxAttachmentChars`(默认 4000)。
304
+
305
+ ⚠️ **群聊默认窗口**是 `max(会议创建时间, 开始前 7 天) ~ min(现在, 结束后 2 小时)`,
306
+ 因为群里分工多是**会前**发的(只拉当天会漏)。窗内没消息会明确提示放宽 `chatFrom`/`chatTo`。
307
+
308
+ ### 把任务推回群聊(`meeting.decision.notifyGroup`)
309
+
310
+ 决议任务生成后群里**不会自动收到通知**,要显式推。流程是「群聊 → 纪要 → 决议任务 → 推回群聊」的闭环:
311
+
312
+ ```powershell
313
+ # ① 先预览:不带 confirm 不会发出任何消息
314
+ weaver-work-cli --json meeting run meeting.decision.notifyGroup --input-json '{"mt_id":"<会议id>"}'
315
+ # ② 用户看过预览、确认后再发
316
+ weaver-work-cli --json meeting run meeting.decision.notifyGroup --input-json '{"mt_id":"<会议id>","confirm":true}'
317
+ ```
318
+
319
+ ⛔ **必须两步**:群消息对外可见、超时后撤不回。不带 `confirm:true` 时返回 `preview:true, sent:false`,
320
+ 正文在 `text` 里 —— **把预览读给用户看,等他点头再发第二次**,不要自己连着发。
321
+
322
+ 默认只推**未完成**任务(`onlyPending` 默认 true),已完成的不再刷一遍;执行人缺失写「未指派」,不猜人。
323
+
324
+ **默认会 @ 到任务执行人**(传 `mention:false` 可关):先 `im.group.users` 拿群成员,
325
+ 按姓名匹配 `executors`;发送时文本里用 `:@uid;` 占位符,**并且请求体必须带 `atUsers: [{cid, uid}]`** ——
326
+ 只有 `atUsers` 才能让服务端生成落库的 `aus`,客户端才显示成蓝色可点;手写 `@姓名` 或自己拼 `aus` 都无效。
327
+ 执行人不在群里就只在正文写名字,会 warning 列出,不硬凑。
328
+ 详见 [meeting-eb.md](references/meeting-eb.md)。
329
+
330
+ ### 一条命令跑完:`meeting.pipeline.run`
331
+
332
+ 前面几段都能单独调,但用户说"把这个会开完"时,串起来更合适(省 3~4 次进程启动)。
333
+
334
+ ```powershell
335
+ # 跑到文档为止(默认 level=document,约 30 秒)
336
+ weaver-work-cli --json meeting run meeting.pipeline.run --input-json '{"mt_id":"<会议id>"}'
337
+
338
+ # 预览"要建哪些任务 + 群里会发什么"(不写、不发)
339
+ weaver-work-cli --json meeting run meeting.pipeline.run --input-json '{"mt_id":"<会议id>","level":"notify"}'
340
+
341
+ # 确认后真跑(提交决议 → ESB 自动生成任务 → 推群);传 minuteId 复用上一步的纪要,省 30 秒
342
+ weaver-work-cli --json meeting run meeting.pipeline.run --input-json '{"mt_id":"<会议id>","level":"notify","minuteId":"<上一步返回的纪要id>","confirm":true}'
343
+ ```
344
+
345
+ `level` 分档:`text` < `minutes` < `document`(默认)< `tasks` < `notify`。
346
+
347
+ ⛔ **`tasks` / `notify` 必须 `confirm:true`**:不带 confirm 时只跑到文档,然后返回
348
+ `tasks.planned`(将从原文提取到哪些任务、指派给谁)和 `notifyPreview`(群里会发的原文),
349
+ **一个字都不写、不发**。把这两个给用户看,点头后再带 confirm 跑第二次。
350
+
351
+ 内部几个关键口径:
352
+
353
+ - **任务从纪要原文提取**:只认「@某人 负责 xxx」;邮箱里的 `@`(`a@example.com`)不算提及;
354
+ 自己推到群里的通知(以「【」开头)会被跳过 —— 否则转述会被再提取一遍,凭空多任务;
355
+ - **执行人用 `username` 查 HRM**(邮箱账号 `user1@example.com` 是真实员工,用 email/keyword 查不到),
356
+ 查不到的**列进 `tasks.unresolved` 跳过**,不猜人;
357
+ - **计划时间**:开始 = 会议结束时间,截止 = 开始 + `taskDueDays` 天(默认 7)的 18:00;
358
+ - **不重复提交决议**:会议已有任务时按 `skipExistingTasks`(默认 true)跳过,否则每跑一次就糊一层;
359
+ - **曾取消的会议**:`decision.publish` 会自动在「写决议」与「标记已决议」之间插 800ms(否则 ESB 会把同一批明细生成两轮任务,实测复现过),并在 warnings 里说明;
360
+ - **CLI 不手工建任务**:`tasks` 这一步只做 `decision.publish`(写决议概述 + 标记已决议),
361
+ 任务由**用户配置的 ESB 在"标记已决议"时自动生成**(一条明细 → 一个任务)。所以不要调 `decisionTask.create`;
362
+ - **推群前等任务落地**:ESB 自动生成任务有 3~6 秒延迟,立即推群会列不到刚生成的任务
363
+ (实测踩过)。所以 publish 后会轮询最多 15 秒,等任务数涨上来再发;
364
+ **如果服务端始终是 0 条任务,就跳过推送**(群里收到「共 0 项」比不发更糟),warning 里说明可稍后重推。
365
+
366
+ ### 走 ESB 解析(正式链路,全链路实测验证)
367
+
368
+ **五个动作流自己负责写入和状态推进,CLI 只管"传文件"和"查状态"**:
369
+
370
+ 1. `meeting.attachment.upload` → `fileId`;`meeting.eb.minute.create` 挂上
371
+ (`file_type` 0/1,`doc_file`/`video_file`,**`mt_minutes_ai_page` 传本租户的页面 id**,如 `<智能纪要页面id>`)。
372
+ 2. 调 ESB「解析附件」`esbFlowId=<解析附件flowId>`
373
+ (`mainTable`:`minuteId`/`mt_id` 必填,`doc_file`/`video_file`/`file_type` 可选)。
374
+ - **文档:同步**,可能顶到 60 s 超时报 `write_uncertain` —— **不代表没执行**,去查纪要字段;
375
+ - **音频:异步**,约 9 s 返回,原文约 2 分钟就绪(服务端写 `video_taskResult=0→1`)。
376
+ 3. 两种类型原文就绪后,服务端都会把 `minutes_status` 写成 **4(文字提取完成)**。
377
+ 用 `meeting.minute.parseStatus` 单次查询,别连续轮询。
378
+ 4. 调 ESB「根据智能体解析文本生成智能纪要文本」`esbFlowId=<生成纪要flowId>`
379
+ (`mainTable` 只需 `minuteId`)→ 它把结构化纪要写进 `parse_content`,状态置 **1(生成中)**。
380
+ ⛔ **不要自己拟纪要文案**:提示词在 ESB 里,自己写会和小E 现有格式不一致。
381
+ 5. 调 ESB「保存解析并生成文档」`esbFlowId=<生成文档flowId>`
382
+ (`mainTable`:`parse_content` + `mt_minute_id`)→ 生成文档、回写 `mt_minutes=<文档id>`、状态置 **2(已完成)**。
383
+ ✅ **直接调,不用问用户**(口径:"肯定要生成的啊,不要问")。
384
+ 6. ⛔ **不要调「获取解析纪要音频结果」**:它是 1 分钟一轮的定时任务、会自己写表单,重复调可能覆盖;
385
+ 只需要 `meeting.minute.parseStatus` 查进度(它返回 `nextAction` 直接告诉你下一步该调哪个)。
386
+
387
+ > ⚠️ **流程 id 是租户级配置**(各环境不同),文中 `<…flowId>` / `<智能纪要页面id>` 均为占位符。
388
+ > `meeting.minute.fromGroupChat` 对「生成纪要 / 生成文档」两条内置了参考租户默认值,
389
+ > 其他租户用 `flowGenerateMinutes` / `flowGenerateDocument` 覆盖;页面 id 传 `aiPageId`。
390
+
391
+ ## 读附件内容(会议附件 / 项目文件 / 议题资料)
392
+
393
+ ⛔ **旧结论作废**:以前 skill 里写"附件回读只有文件名、拿不到 fileId ⇒ 下载不了",**是错的**。
394
+ 实测直连 `query_mtDetail_info` 看到的是 `mt_accessorys = "<fileId>"` —— **就是 fileId**;
395
+ 拿到 id 后用 E10 登录态 GET `/api/file/remotedownload/{fileId}/meeting/true` 能取回原始字节。
396
+
397
+ ### 把智能体里上传的文件挂到会议详情
398
+
399
+ 用户在对话里上传的文件(截图、docx、pdf…)本质是**本地路径**,CLI 同机可读,所以能直接挂成会议附件:
400
+
401
+ ```bash
402
+ weaver-work-cli --json meeting run meeting.attachment.attach \
403
+ --input-json '{"id":"<会议id>","file":"<用户上传文件的本地绝对路径>"}'
404
+ ```
405
+
406
+ - **默认 `mode=append`**:保留会议已有附件,只把这次的文件追加上去(智能体补传场景最怕"一传就冲掉原附件")。
407
+ 只有显式 `"mode":"replace"` 才会覆盖整份列表,并返回覆盖提示。
408
+ - 现有附件 id 由 CLI 自己读(`query_mtDetail_info.mt_accessorys` 就是 fileId 列表),**不需要**再传 `existingFileIds`。
409
+ - 挂完用 `meeting.attachment.list` 核对 id 数量,用 `meeting.attachment.extract` 读回正文验证。
410
+ - 旧说法「智能体上传的附件关联不到会议」**作废**:那说的是"读不到附件内容",与挂载无关;挂载一直靠 fileId 写入。
411
+
412
+ ```bash
413
+ # ① 列清单(拿 fileId + 归属字段)
414
+ weaver-work-cli --json meeting run meeting.attachment.list --input-json '{"mtId":"<会议id>"}'
415
+ # 议题资料:{"topicId":"<议题id>"}
416
+
417
+ # ② 下载(单文件 / 整会批量),默认落 ~/.weaver-work-cli/meeting/attachments/
418
+ weaver-work-cli --json meeting run meeting.attachment.download --input-json '{"fileId":"<fileId>"}'
419
+ weaver-work-cli --json meeting run meeting.attachment.download --input-json '{"mtId":"<会议id>"}'
420
+
421
+ # ③ 下载 + 抽正文(给 AI 读),返回 text / chars / textPath
422
+ weaver-work-cli --json meeting run meeting.attachment.extract --input-json '{"mtId":"<会议id>"}'
423
+ ```
424
+
425
+ - 支持抽取:**txt / md / csv / tsv / json / xml / html / docx / xlsx / pptx**(xlsx 按行转 TSV,pptx 按页)。
426
+ - **PDF / 图片不解析**:仍会把文件下载下来(`kind: "unsupported"` + warning),读 PDF 请用 pdf 技能、读图片用视觉模型,
427
+ **不要**假装读到了内容。
428
+ - 下载走**会议模块自己的**二进制通道(host 的 `download`),不借 im 的下载(im 那条要群聊/单聊上下文,对会议附件是 401)。
429
+ - 会议附件字段值是 fileId 列表;`meeting.attachment.attach` 写入时是 id、回读也是 id(此前的"回读是文件名"是误判)。
430
+
431
+ ## 冲突了要给出可选项(`decisions` 里能直接挑)
432
+
433
+ `create.prepare` / `change.prepare` / **流程建会 `create.flow.prepare`** 的返回里都有 `data.decisions`
434
+ (流程建会在 `data.preview.decisions`),**一律用选项方式给用户挑,不要文字罗列**:
435
+
436
+ ```jsonc
437
+ {
438
+ "autoRoom": { "picked": { "name": "3F 大会议室", "reasons": ["该时段空闲", "容量 20 人,容纳 3 人"] }, "candidates": [...] },
439
+ "roomOptions": [ { "key": "R1", "label": "3F 大会议室(可容 20 人) · 推荐", "value": {"id":"…"} }, { "key": "R2", ... } ],
440
+ "memberConflicts": [ { "name": "周例会", "begin": "…", "end": "…", "conflictedMembers": ["…"] } ],
441
+ "suggestedSlots":[ { "begin": "2026-10-30 09:00", "end": "2026-10-30 10:00" } ], // 仅"会议当天"
442
+ "slotOptions": [ { "key": "T1", "label": "09:00~10:00", "value": {"begin":"…","end":"…"} } ],
443
+ "dayBlocked": { "day": "2026-11-10", "summary": "2026-11-10 当天 9:00-18:00 内没有所有人都空闲的 120 分钟时段(已同时核对会议回执与日程)——张三:会议《周例会》09:00~11:30…" },
444
+ "scheduleItems": [ { "title": "外出拜访", "begin": "2026-11-10 09:30", "end": "2026-11-10 11:00", "members": [...] } ],
445
+ "availabilityCost": { "candidateCalls": 1, "receiptCalls": 1, "scheduleCalls": 1 }
446
+ }
447
+ ```
448
+
449
+ 规则:
450
+
451
+ - **只看会议当天**:约的是 10-30 就只推 10-30 的时段,不跨天乱推(`maxDays` 默认 1)。
452
+ - **两个维度一起算**:① 会议回执;② **日程**(ESB 一次调用覆盖当天全部符合条件日程,会议日程类型由服务端过滤)。
453
+ `scheduleItems` 为空 = 当天没有日程占用;`availabilityCost.scheduleCalls=1` 说明日程确实核对过。
454
+ - **当天实在没人有空**:不返回空列表了事,给 `dayBlocked.summary`——点明是哪天、被哪些会议/日程占住(带人名),
455
+ 直接念给用户听:"11-10 当天 9:00-18:00 内没有所有人都空闲的 120 分钟时段,张三 09:00~11:30 有会…"。
456
+ - **选项必须自解释**:`slotOptions` 的 `label` 形如 `11:30~15:30(会议当天) · 全部参会人空闲`(**一定要带"空闲"字样**,否则用户只看到两个时间点,不知道这是推荐还是随便给的);`roomOptions` 带容量与 `· 推荐`;多流程 `options` 带流程名。
457
+ - **一律用选项**:`roomOptions`(R1/R2/R3)、`slotOptions`(T1/T2/T3)、多流程时 `options`(W1/W2)都带 `key`+`label`+`value`,
458
+ 直接做成选择项;选完把 `value` 回填(会议室 `address`、时段改 `begin_datetime/end_datetime`、流程带 `workflowId`)重新 prepare。
459
+ - 想单独查时段(不建会):
460
+ `weaver-work-cli --json meeting run meeting.eb.conflict.availability --input-json '{"rangeStart":"2026-10-30 00:00","rangeEnd":"2026-10-30 23:59","durationMinutes":120,"hrmMembers":"<id1>,<id2>"}'`
461
+
462
+ ## 建会要快:别在对话里来回试
463
+
464
+ 实测:
465
+
466
+ | 动作 | 实测耗时 |
467
+ |---|---|
468
+ | `create.flow.prepare`(推荐会议室 + 冲突检测 + 共同空闲时段,**三项并行**) | **≈0.4s**(并行段 0.2s) |
469
+ | `create.flow.apply`(提交流程 + 查会议 + 出邀请函) | **≈2.8s** |
470
+ | **`create.flow.quick`(两步合并,默认 `enrich: true`)** | **≈3.3s** |
471
+ | `quick` + `enrich: false`(人/时间/房间都已确定,跳过推荐与冲突) | **≈3.1s** |
472
+
473
+ `quick` 返回里带 `timings`(`prepareMs` / `applyMs` / `parallelMs` / `totalMs`),可直接判断时间花在哪。
474
+ 每次 CLI 调用还会往 `<CLI state>/meeting/logs/calls.jsonl` 追加一行(operation + ms + ok),
475
+ **排"慢"时先看这个文件**:里面若只有 1 条 `create.flow.quick` ≈3s,说明慢在对话轮次而不是 CLI。
476
+
477
+ ⛔ 常见现象:"建个会要等很久",**慢的不是 CLI**,是对话里来回:先自己查人、查房间、查冲突、prepare、再确认、再 apply……
478
+ 每轮都有模型推理 + 大 JSON 进上下文。所以:
479
+
480
+ - **建会优先用 `meeting.eb.meeting.create.flow.quick`**(带 `confirm: true`),一次调用拿到 `requestId / meetingId / invitation`;
481
+ 人、时间、房间都已经确定、只想快点建出来时加 `enrich: false`(跳过会议室推荐/冲突检测/空闲时段);
482
+ - **不要**在建会前自己先跑 `hrm.employee.query`、`room.list`、`conflict.member`、`schedule.free` —— prepare/quick 内部已经并行做完了
483
+ (只有在需要给用户**换人/换房/换时间**时才单独查);
484
+ - 需要让用户挑选时(多流程 / 有冲突要改期 / 换会议室),用 `quick`/`prepare` 返回的 `options` 做**一次**选择,选定后再 `quick` 一次即可收口。
485
+
486
+ ## 流程建会(`meeting.eb.meeting.create.flow`)
487
+
488
+ 应用设置勾了「只允许通过流程新建会议」(`only_flow_create=1`)或「会议提交需审批」
489
+ (`open_mt_approve=1`)时,**直连 `create_meeting` 会被闸门拒绝**——这是应用管控,CLI 不绕过。
490
+ 但这**不是停手**:改走流程即可,链路同样以「出邀请函」收尾。
491
+
492
+ ```bash
493
+ # ① 准备:按应用设置 mt_new_wf 载入建会流程表单,把会议字段按中文名映射(不提交)
494
+ weaver-work-cli --json meeting run meeting.eb.meeting.create.flow.prepare \
495
+ --input-json '{"mt_name":"周会","begin_datetime":"2026-11-05 14:00","end_datetime":"2026-11-05 15:00","mt_desc":"排期","total_member":3,"address":"<会议室名称(ID)>"}'
496
+
497
+ # ② 提交:确认后提交审批;提交成功后会轮询会议表,会议生成即自动出邀请函
498
+ weaver-work-cli --json meeting run meeting.eb.meeting.create.flow.apply \
499
+ --input-json '{"continuation":"<上一步 continuation>","confirm":true,"waitSeconds":20}'
500
+ ```
501
+
502
+ - 字段按**中文名**匹配(会议名称/开始时间/结束时间/会议内容/会议地点/参会人员/参会人数/召集人/联系人/备注),
503
+ 映射不到的原样进 `warnings` 并列出表单现有字段名——**租户改过字段名时看这条**,别硬编码 fieldId。
504
+ - **浏览按钮字段必须传对象 `{"id":"…","name":"…"}`**(实测):
505
+ 会议地点(会议室)、参会人员(数组)、召集人 / 联系人(单人)传**纯 id 或纯姓名都会被当"名称"去匹配**,
506
+ 匹配不到就返回 `status: NEEDS_CONFIRMATION`("无法唯一解析的选项")——这不是流程走不通,是值格式不对。
507
+ CLI 已自动补成对象(会议室名走会议室缓存/详情,人员名走 `hrm.employee.batch`),
508
+ 所以调用方照旧传 `address: "<会议室id或名称>"`、`hrm_members: "<id,id>"` 即可。
509
+ 实测结果:提交后返回 requestId,会议自动生成,并同步产出邀请函 docx。
510
+ - **会议由流程/审批生成**,提交≠建好。`apply` 会在 `waitSeconds`(默认 20s,可传 0~180)内轮询会议表:
511
+ 轮询节奏是**立即查一次 → 5 秒后再查一次**,仍未生成就返回 `invitation.pending=true`(不再干等 20 秒); 查到就把 `meetingId` + `invitation.filePath` 一起返回,并在 `timings.pollMs` 里给出耗时;
512
+ 「审批通过后再跑一次 `meeting.invitation.render`」——**不要**声称已生成邀请函。
513
+ - **多个建会流程怎么办(新增)**:应用设置 `mt_new_wf` 可能配多个(如「会议申请流程」「上会申请流程」)。
514
+ prepare 会**逐个探测当前账号能不能发起**(能载入表单 = 有权限),然后:
515
+ - 只有 1 个可发起 → 直接用;
516
+ - **多个可发起 → 返回 `status: NEEDS_SELECTION` + `options`(W1/W2…,带流程名)**,必须让用户选,不替用户拍板;
517
+ 选定后带 `workflowId` 重新 prepare;
518
+ - 一个都发不起 → 抛 `flow_not_launchable`,把每个流程的失败原因列出来(如 `formId=9 表单不存在`)。
519
+ `probes` 里能看到每个流程的探测结果(`launchable` / `reason`)。
520
+ - 流程 id 优先级:入参 `workflowId` > 应用设置 `mt_new_wf`(多个时按上面的探测+选择流程走)。
521
+
522
+ ## 日程空闲与会议室推荐(新增)
523
+
524
+ ### 两件容易混的事,先分清
525
+
526
+ | 你要判断的 | 用哪个 | 数据源 |
527
+ |---|---|---|
528
+ | 这个人此刻是不是**已经有别的会议** | `meeting.eb.conflict.member` | 会议表 + 回执表 |
529
+ | 这个人此刻是不是**有其它日程占用**(出差/外出/任务) | **`meeting.eb.schedule.free`** | 日程应用(ESB 动作流) |
530
+
531
+ `meeting.eb.schedule.free` 走 ESB 动作流(`WEAVER_MEETING_SCHEDULE_FLOW_ID` / `WEAVER_MEETING_SCHEDULE_FLOW_KEY`
532
+ 可覆盖,默认已内置本租户的 id 与 primary_key),入参即
533
+ `{startDate, endDate, memberIds, mtId?}`,返回 `verdict/freeMembers/busyMembers/filtered`。
534
+
535
+ ⛔ **「会议日程」必须排除**:会议冲突已由 `conflict.member` 判过,日程里由会议生成的那条再算一次=同一场会报两次冲突。
536
+ 该类型 id 每个环境都不同,所以**一律动态解析**
537
+ (日程类型字典按 `type_name=会议日程` / `type_code=HYRC` 匹配,缓存 7 天),**绝不在 skill 里写死**。
538
+ 要显式指定:`excludeTypeIds` 或环境变量 `WEAVER_MEETING_SCHEDULE_TYPE_IDS`。
539
+ 解析不到类型时不会静默放行:会给 warning 说明「本次未过滤,可能重复计入」。
540
+
541
+ > 实测口径:ESB 动作流**服务端已经按应用设置过滤掉「会议日程」类型**,
542
+ > 所以「某个时间段明明有日程却返回 0」往往是**正确结果**(那条就是会议生成的日程)。
543
+ > CLI 的客户端过滤是第二道保险,两层都不写死类型 id。
544
+
545
+ ### 会议室推荐
546
+
547
+ ```bash
548
+ weaver-work-cli --json meeting run meeting.eb.room.recommend \
549
+ --input-json '{"beginDatetime":"2026-11-03 10:00","endDatetime":"2026-11-03 11:00","memberCount":8,"equipmentsKeyword":"投影"}'
550
+ ```
551
+
552
+ - 排序:**个人常用**(近 180 天我建会用过的)> 满足要求 > 容量贴合(不浪费大间)> 名称稳定;
553
+ - 硬过滤:`status=0`(封存的不推)、容量上下限、`placeKeyword/nameKeyword/mrType/roomAttr/equipmentsKeyword`、该时段已被占用(`includeBusy:true` 可一并返回并排在最后);
554
+ - 两级缓存:会议室全量 24h、个人常用 7d(`refresh:true` 强制刷新),**占用每次实时查**(缓存占用会推荐出已被占的房间);
555
+ - **个人常用缓存会实时增量更新**:`create.apply` 建会成功后,CLI 直接把该会议室计入常用(+1),
556
+ 当天连开几场,下一次推荐立刻反映偏好,不用等 7 天 TTL。页面里手工建的会仍要靠 `refresh:true` 或等过期重算;
557
+ - 返回里 `meta` 会告诉你缓存是否命中、查了几次请求,便于判断是不是该刷缓存了。
558
+
559
+ ### 没填会议室时:**只推荐,不替用户决定**
560
+
561
+ `address` 为空时,CLI **不会**自己挑一间写进去,而是把候选交回来让用户选:
562
+
563
+ ```jsonc
564
+ // create.flow.prepare / create.flow.quick 的返回
565
+ {
566
+ "status": "NEEDS_SELECTION",
567
+ "selectionType": "room",
568
+ "message": "未指定会议室,请从 3 个候选里选择(已按人数/常用/时段占用排序)",
569
+ "options": [
570
+ { "key": "R1", "label": "3F 大会议室(可容 20 人) · 推荐", "value": { "id": "…", "name": "3F 大会议室" }, "reason": "…" },
571
+ { "key": "R2", "label": "5F 小间", "value": { "id": "…" } }
572
+ ],
573
+ "recommended": { "id": "…", "name": "3F 大会议室" },
574
+ "hint": "选定后把 value.id 作为 address 重新调用(quick 或 prepare)"
575
+ }
576
+ ```
577
+
578
+ - **必须用选项方式让用户挑**,选定后把 `value.id` 作为 `address` 重新调用;**不要**替用户默认选第一个。
579
+ - 直连建会(`meeting.eb.meeting.create.prepare`)在未填 `address` 时会直接**报** `room_selection_required`,
580
+ `details.roomOptions` 里带同样的候选。
581
+ - 只有显式要自动化时才跳过选择:`autoRoom: true`(采用推荐间);确实不需要会议室(线上会)用
582
+ `allowNoRoom: true`;直连路径对应环境变量 `WEAVER_MEETING_AUTO_ROOM=1`(自动选)/`=0`(不推荐也不拦)。
583
+ - **应用设置可能有多条记录**:读取时按 `update_time` 取**最新一条**有效记录,并在 warnings 里说明
584
+ 「库里存在 N 条设置,本次按哪条(id/更新时间)判断」——不要假设"第一条就是最新的",
585
+ 否则会出现"同一个请求上午能建、下午被拦"的诡异现象。
586
+ - **取不到的字段**在文档里渲染成【待补充】,**不再回显 dataKey**;需要知道缺哪些字段看返回的 `pendingFields`。
587
+ - **黄色高亮只覆盖【待补充】这几个字**,不会把整句染黄(已知问题:整行 `【待补充】 诚邀您参加「…」` 全黄)。
588
+ - **召集人(caller)有兜底**:会议没填 `caller` 时用**创建人**代替,并在 `callerSource` 里标明
589
+ (`meeting.caller` / `meeting.mt_creator` / `none`);此时 warnings 会说明"已用创建人代替,可传 extra.caller 覆盖"。
590
+ 所以**不会**出现"前面说召集人是张三、后面又说召集人要补"的矛盾 —— 那种情况是会议表的 caller 字段真的为空。
591
+ - **议程**:会议没有议题时保留模板示例行(`agendaSource: "template"`),warnings 会提示"请人工改成真实议程"。
592
+ - **建会成功**:`create.apply` 直接生成邀请函 docx,路径在 `data.association.invitation.filePath`;
593
+ 失败只回 `invitation.ok=false`(不影响建会),关掉:`WEAVER_MEETING_AUTO_INVITATION=0`。
594
+
595
+ ## 二维码生成:`meeting.qrcode.render`
596
+
597
+ **定位:只画码,不造码。** 文本从哪来(免登链接、票据串、会议 id+人员 id 的 JSON)由业务侧决定;
598
+ 本 operation 负责把这段文本变成**能被扫的图**,本地零依赖生成(不需要联网、不需要装第三方包)。
599
+
600
+ ```bash
601
+ # 参会码/签到码:直接出 PNG
602
+ weaver-work-cli --json meeting run meeting.qrcode.render \
603
+ --input-json '{"text":"https://e10.example.com/s/abc123","ecc":"Q","scale":10}'
604
+
605
+ # 指定文件与格式(SVG 矢量适合印刷/嵌文档)
606
+ weaver-work-cli --json meeting run meeting.qrcode.render \
607
+ --input-json '{"text":"{\"mid\":\"<会议id>\",\"uid\":\"<人员id>\"}","format":"svg","outPath":"D:/参会码.svg"}'
608
+ ```
609
+
610
+ - 返回 `path`(落地文件)、`version`/`modules`(码版本与模块数)、`imageSize`(像素边长)、`mask`。
611
+ - **参数口径**:`ecc` 默认 `M`(≈15% 冗余);会场灯光差、码面易折损用 `Q`/`H`,代价是版本变大(码更密)。
612
+ `scale` 屏幕 ≥6、打印 ≥10;`margin` **不要小于 4**(静区不足扫码器识别率骤降)。
613
+ - **容量**:中文按 3 字节计,单码约 980 个汉字(`M` 级);超了会明确报 `capacity_exceeded`,不静默出图。
614
+ - ⛔ **不要自己写二维码算法或让用户装库**;也**不要**把需要登录态的文件 URL 当码内容(扫出来是 401 页面)。
615
+ - 参会码走「门禁/食堂」时,**码内容必须是对方系统认可的票据格式**(一般由 ESB/门禁侧接口下发),
616
+ 本 operation 只做最后一步渲染;内容接口未就绪时不要自造格式。
617
+
618
+
619
+
620
+ ## ⚠️ 本 skill 的定位:EB 版会议(务必按此取 id)
621
+
622
+ 本 skill 面向的会议功能(议题、纪要、决议、邀请函、EB 写链路)**全部以 EB 版会议为准**:
623
+
624
+ - **会议 id 只用 `meeting.eb.meeting.list` 的 `id`**(或用户直接从 EB 会议详情页复制的 id)。
625
+ - **标准版 `meeting.list` 返回的 id 与 EB 不通用**:拿标准版 id 去调 `meeting.eb.*` 会 `not_found`;反之亦然。两套数据互不相通。
626
+ - 判断当前环境是 EB 还是标准版,只信 `meeting.env.detect` 的 `mode`(`refresh:true` 强制重探)。
627
+ - 用户只说"某个会议"但没给 id 时:**优先用 `meeting.eb.meeting.list` 按名称模糊查**,把候选列给用户确认,**不要**用标准版列表的 id 顶替。
628
+ - 纪要、议题这类"EB 独有"的数据,标准版环境下**没有**,如实说明,不要用标准版接口硬凑。
629
+
149
630
  ## 执行原则
150
631
 
151
632
  - 最小必要查询;列表结果默认摘要输出,不粘贴超长 JSON。
@@ -159,12 +640,7 @@ cliHelp: "weaver-work-cli meeting --help"
159
640
  - 写请求发出后网络中断 / 超时 → CLI 返回 `partial/write_uncertain`:**立即停止,禁止自动重试**,先 `meeting.list` / `meeting.receipt.list` 只读回查确认是否已生效,确未生效才可重新 prepare。
160
641
  - `apply` 返回 `target_changed` / `continuation_expired` → 重新执行 prepare,向用户重新确认。
161
642
  - 冲突 `conflict_rejected` → 直接停止,不提供任何绕过选项。
162
- - `session_expired` → 立即停止当前操作并读取 `weaver-e10-shared` 的认证规则。
163
- - 登录失效的认证方式必须由 Agent 复用本任务开始时的宿主判定,禁止调用任何其他登录 Skill。
164
- - 明确为 XiaoE 时,只执行 `weaver-work-cli auth xiaoe`,不得改用 `auth login`。
165
- - 统一登录返回 `authentication/xiaoe_credential_unavailable` 时停止并反馈宿主凭据不可用,不自动回退浏览器登录。
166
- - 非 XiaoE 时不得执行 `auth xiaoe`;取得用户确认的真实 E10 登录域名后,执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
167
- - 登录恢复后读操作可重新执行;写操作不得复用旧 continuation,必须重新 prepare 并重新确认。已返回 `partial/write_uncertain` 时先只读回查,禁止直接重放写入。
643
+ - `session_expired` → 先完成 E10 登录,再从失败步骤续跑,已成功的步骤不重做。
168
644
 
169
645
  ## 不在范围
170
646
 
@@ -172,12 +648,12 @@ cliHelp: "weaver-work-cli meeting --help"
172
648
  - **历史变更**:旧 `meeting.update.*` 已下线(它固定发送 `operateType=UPDATE`,与业务语义不符),改由 `meeting.change.*` 按会议状态自动分流;迁移说明见 [meeting-update.md](references/meeting-update.md)。
173
649
  - **提前结束会议(meeting.over)不提供**:服务端接口为空实现(源码中 service 调用被注释、直接返回成功),调用只会得到"假成功";请引导用户在系统页面操作,禁止绕过 CLI 自行拼接口。
174
650
  - **EB 版已实现**(`meeting.eb.*`,覆盖会议/会议室/占用/签到/回执/纪要/会议类型/议题类型/会议议题/应用设置/**会议决议与决议任务**的全部 interfacePk):`mode=eb` 时必须使用它们,**不要**再回答"EB 版未实现"。注意**标准版会议本身没有议题/纪要能力**(EB 版才有)——若当前是 standard 模式而用户问议题/纪要,如实说明属 EB 版能力(EB 环境下才可查)。
175
- - **⚠️ EB 返回值解析(真机踩坑,必看)**:EB 接口里**人员 / 关联 / 状态 / 选择类字段返回的是「对象数组」**(如 `[{"name":"崔智友","id":"1305319807700025376"}]`),**不是字符串** —— 取 id 读 `[0].id`、显示名读 `[0].name`;**禁止**把整个数组当字符串拼接(会显示成 `System.Object[]`,看起来像"字段为空")。已实测这类形态:`executors` / `rummager` / `mt_id` / `relate_decision` / `decision_status` / `detail1[].executor`;而 `finish_status`("未完成"/"已完成")、日期、`id` 是字符串。另注意 **`sign.list` 返回的 `mt_id` 是「会议室/会议名称」而筛选参数 `mt_id` 才是会议 id**。
176
- - **⚠️ EB 写操作失败语义(真机踩坑,必看)**:**EB 写接口"报错"≠"没有写入"** —— 实测 `create_mt_decision` 因字段校验失败返回错误时,主表与明细其实**已经落库**,重试产生了重复数据。因此写操作失败后**必须先回查**(list/detail)再决定重试或删除;CLI 的语义化写操作(`decision.publish`、`sign.mark`)在拿不到明确成功证据时会抛 **`partial`** 并提示"先回查、勿盲目重试",请如实转达用户。
651
+ - **⚠️ EB 返回值解析(实测踩坑,必看)**:EB 接口里**人员 / 关联 / 状态 / 选择类字段返回的是「对象数组」**(如 `[{"name":"王五","id":"1300000000000000001"}]`),**不是字符串** —— 取 id 读 `[0].id`、显示名读 `[0].name`;**禁止**把整个数组当字符串拼接(会显示成 `System.Object[]`,看起来像"字段为空")。已实测这类形态:`executors` / `rummager` / `mt_id` / `relate_decision` / `decision_status` / `detail1[].executor`;而 `finish_status`("未完成"/"已完成")、日期、`id` 是字符串。另注意 **`sign.list` 返回的 `mt_id` 是「会议室/会议名称」而筛选参数 `mt_id` 才是会议 id**。
652
+ - **⚠️ EB 写操作失败语义(实测踩坑,必看)**:**EB 写接口"报错"≠"没有写入"** —— 实测 `create_mt_decision` 因字段校验失败返回错误时,主表与明细其实**已经落库**,重试产生了重复数据。因此写操作失败后**必须先回查**(list/detail)再决定重试或删除;CLI 的语义化写操作(`decision.publish`、`sign.mark`)在拿不到明确成功证据时会抛 **`partial`** 并提示"先回查、勿盲目重试",请如实转达用户。
177
653
  - EB 版纪要**创建**未实现(该功能走 OpenAPI、无自定义 interfacePk),仅支持 `meeting.eb.minute.list` 查询。
178
654
  - 周期会议走工作流(`repeatWorkFlowBaseIds` 非空)与 `onlyFlowCreate=1`(EB 版为 `only_flow_create=1` / `open_mt_approve=1`)的流程建会需要工作流集成:**CLI 会主动拒绝并转 `weaver-e10-workflow`**(标准版 `assertCreatePathAllowed`;**EB 版为 `meeting.eb.meeting.create.prepare` 的建会路径闸门,2026-10-15 补齐** —— 此前 EB 版只写在文档里、代码未拦,导致 `only_flow_create=1` 仍能直接建会落库)。
179
655
  - **冲突处置严格按应用设置,CLI 不额外加码**:`=1`「禁止提交」→ 怎么都不允许提交(抛 `conflict_rejected`,不询问、不新建);`=0`「仅提醒」→ 如实告知冲突并建议换时间/换地点,**但不阻止提交** —— 用户了解冲突后仍要求新建时,可继续 `apply` 完成建会。**检测失败 → `conflict_check_failed` 拒绝**(策略无法判定时保守处理)。
180
- - **签到**:查询统计(`meeting.sign.list`)与写操作(补签 `meeting.sign.mark`、补签退 `meeting.sign.back`、清除签到 `meeting.sign.clear`)**已实现**;**本人扫码签到(`signMeeting`)不提供**——它依赖现场二维码票据(qrticket)与设备 IP,由 AI 代签会破坏签到真实性,请引导用户现场扫码或走 H5 签到;签到二维码与大屏签到未实现。
656
+ - **签到**:查询统计(`meeting.sign.list`)与写操作(补签 `meeting.sign.mark`、补签退 `meeting.sign.back`、清除签到 `meeting.sign.clear`)**已实现**;**本人扫码签到(`signMeeting`)不提供**——它依赖现场二维码票据(qrticket)与设备 IP,由 AI 代签会破坏签到真实性,请引导用户现场扫码或走 H5 签到;**平台签到二维码接口(getQrCode / downLoadQrCode)未接**(契约未确认)——若只是要把一段文本画成码图,用 `meeting.qrcode.render`,但**不要拿它冒充平台签到码**(平台校验的是自己的票据)。
181
657
  - **删除是软删**:`meeting.delete` 走 `update mt_detail set delete_type = 2`,会议**进入回收站、可以还原**;CLI 暂无还原能力,需要恢复时请引导用户到**会议回收站页面**操作。**不要**再对用户说"彻底删除、不可逆"。
182
658
  - **标准版**会议室管理(`addMeetingRoom`/`updateMeetingRoom`/`deleteMeetingRoom`/`lockMeetingRoom`)与会议类型管理接口未实现;EB 版请用 `meeting.eb.room.*` / `meeting.eb.type.*`。
183
659
  - **会议变更 / 取消 / 删除已实现**(`meeting.change.*` / `meeting.cancel.*` / `meeting.delete.*`,见「命令表」与「处理链」),不要因为本节的旧描述而把用户推去页面手改。当前唯一"未实现"的会议生命周期动作是**提前结束会议**(`meeting.over`,服务端空实现,调用只会假成功)。