weaver-work-cli 0.1.38 → 0.1.40

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 (166) hide show
  1. package/README.md +7 -3
  2. package/dist/chunks/{archive-PDV724YK.js → archive-JHTONRST.js} +556 -66
  3. package/dist/chunks/{archive-oa-4XE4MNXQ.js → archive-oa-FCHLCPHC.js} +2 -2
  4. package/dist/chunks/{asset-PDL2QE2N.js → asset-RLIHC7DB.js} +2 -2
  5. package/dist/chunks/asset-idle-KVOFTLCP.js +670 -0
  6. package/dist/chunks/{attachment-content-MDDGOE5E.js → attachment-content-RZYDB3MB.js} +3 -3
  7. package/dist/chunks/{blog-UYR3EUXW.js → blog-42OZTJNP.js} +2 -2
  8. package/dist/chunks/{caizhilian-LG2X5NMF.js → caizhilian-KRK547K5.js} +2 -2
  9. package/dist/chunks/{calendar-FG4BAZHE.js → calendar-RTWAMKHD.js} +2 -2
  10. package/dist/chunks/{chunk-J7USS3ED.js → chunk-4CTESSKI.js} +4 -4
  11. package/dist/chunks/{chunk-OJQUJZQF.js → chunk-4TEDNCON.js} +45 -5
  12. package/dist/chunks/chunk-57IECMWX.js +487 -0
  13. package/dist/chunks/{chunk-ELYDWBZJ.js → chunk-7BRU4EFH.js} +13 -7
  14. package/dist/chunks/{chunk-6LTFIFLM.js → chunk-7E6MUOEK.js} +2 -2
  15. package/dist/chunks/{chunk-KKRL3REV.js → chunk-7U577Q7U.js} +2 -2
  16. package/dist/chunks/{chunk-UJJD4QWF.js → chunk-CAQNBBQA.js} +2 -2
  17. package/dist/chunks/{chunk-CORFRD7Q.js → chunk-CXRQWOZ5.js} +2 -2
  18. package/dist/chunks/{chunk-GGJFMNJM.js → chunk-FLS4DPGP.js} +110 -16
  19. package/dist/chunks/{chunk-JSMFPO43.js → chunk-I566ZYNF.js} +1 -1
  20. package/dist/chunks/{chunk-6FTTSA45.js → chunk-IZSSVYAG.js} +2 -2
  21. package/dist/chunks/{chunk-XJY7G4DD.js → chunk-JWRZM2H2.js} +3 -3
  22. package/dist/chunks/{chunk-NI6GIPIM.js → chunk-LFMSDBZN.js} +529 -395
  23. package/dist/chunks/{chunk-VRYHGG6O.js → chunk-LN447PY2.js} +92 -51
  24. package/dist/chunks/{chunk-NR6RKXPA.js → chunk-NETCCARD.js} +4 -2
  25. package/dist/chunks/{chunk-Z32KWY6G.js → chunk-NJKREDA3.js} +1 -1
  26. package/dist/chunks/{chunk-FUWVHMVV.js → chunk-SPRHHSVC.js} +2 -2
  27. package/dist/chunks/{chunk-IZUDA353.js → chunk-T6EGVBKU.js} +1 -1
  28. package/dist/chunks/{chunk-DMV2TOMH.js → chunk-VNBU55SL.js} +428 -145
  29. package/dist/chunks/{chunk-UZZBA6PV.js → chunk-WFFNM65B.js} +47 -6
  30. package/dist/chunks/{chunk-EG6ZU444.js → chunk-ZUX3P6BQ.js} +10 -5
  31. package/dist/chunks/{conflict-BQZEQ4SP.js → conflict-VR55AOOO.js} +2 -2
  32. package/dist/chunks/{contract-XIRAFTEV.js → contract-HI4FNPYE.js} +2 -2
  33. package/dist/chunks/{cowork-BLG62BL2.js → cowork-HJLI353D.js} +12 -5
  34. package/dist/chunks/{ebuilder-form-NUKG5QW4.js → ebuilder-form-HTGI63UU.js} +3 -3
  35. package/dist/chunks/{ehr-2STW5ILH.js → ehr-GYXIYH3A.js} +2 -2
  36. package/dist/chunks/env-DW3G4HUO.js +19 -0
  37. package/dist/chunks/{esb-UUDQUNKY.js → esb-I5INCEFE.js} +4 -4
  38. package/dist/chunks/factory-TKXGXS6L.js +30 -0
  39. package/dist/chunks/{fna-6RCY4NU5.js → fna-K2MHTQ24.js} +2 -2
  40. package/dist/chunks/group-chat-VYBNMJLG.js +18 -0
  41. package/dist/chunks/{host-FWDOSRH5.js → host-256GVCAH.js} +3 -3
  42. package/dist/chunks/{host-EJZFROU3.js → host-D5SERMAJ.js} +3 -3
  43. package/dist/chunks/{host-RHM3NPXV.js → host-JM4YVHFM.js} +3 -3
  44. package/dist/chunks/{host-7RXEDMAH.js → host-L3VLITMT.js} +3 -3
  45. package/dist/chunks/{host-UFF33TWJ.js → host-ZUQTJYYK.js} +3 -3
  46. package/dist/chunks/{hrm-PKJ6ELSH.js → hrm-VLRBKTZB.js} +3 -3
  47. package/dist/chunks/{im-YJAXS7CO.js → im-QK3VTLXK.js} +8 -8
  48. package/dist/chunks/{invoice-HWVSXGX6.js → invoice-T5JTA32H.js} +3 -3
  49. package/dist/chunks/{jiuchuanhui-L7VKILZB.js → jiuchuanhui-P2FNEQVZ.js} +2 -2
  50. package/dist/chunks/{lazy-dispatch-NMYEIHRH.js → lazy-dispatch-XRRI46M6.js} +5 -5
  51. package/dist/chunks/{mail-B42RRU7G.js → mail-3Y7MJ6PS.js} +9 -4
  52. package/dist/chunks/{meeting-CFYVBJSS.js → meeting-M7LTXGJE.js} +11 -10
  53. package/dist/chunks/{okr-GCLF6V7W.js → okr-OBC6S67L.js} +2 -2
  54. package/dist/chunks/{plan-ZVL7GBRI.js → plan-5H6I53SK.js} +2 -2
  55. package/dist/chunks/{project-4YWAAE2K.js → project-L75QZV4S.js} +2 -2
  56. package/dist/chunks/{registry-EP4VTHZS.js → registry-KMHCPAAD.js} +9 -8
  57. package/dist/chunks/{registry-OZSMDVPP.js → registry-QGHFNUWS.js} +2 -2
  58. package/dist/chunks/{registry-FRJ6H7BT.js → registry-RXPN6BBT.js} +4 -4
  59. package/dist/chunks/{registry-SG2PGVCF.js → registry-UGRBCBHO.js} +3 -3
  60. package/dist/chunks/{room-recommend-R3JVUUAC.js → room-recommend-A3UDC3CA.js} +4 -4
  61. package/dist/chunks/{schedule-NIJBTYDO.js → schedule-5GCACCK7.js} +4 -4
  62. package/dist/chunks/{workflow-BB24DFBY.js → workflow-M5ZJ7DWF.js} +11 -8
  63. package/dist/core/output.js +16 -6
  64. package/dist/index.js +33 -28
  65. package/dist/internal/e10/auth/commands.js +109 -56
  66. package/dist/internal/e10/auth/messages.js +1 -0
  67. package/dist/internal/e10/auth/session.js +11 -1
  68. package/dist/internal/e10/auth/xiaoe.js +29 -4
  69. package/dist/internal/e10/auth-recovery.js +13 -6
  70. package/dist/internal/e10/client.js +13 -0
  71. package/dist/internal/e10/context.js +24 -3
  72. package/dist/internal/e10/request-runtime.js +12 -1
  73. package/dist/shortcuts/archive/host.js +2 -0
  74. package/dist/shortcuts/archive/manifest.js +1 -1
  75. package/dist/shortcuts/archive/operations/borrow-list.js +13 -1
  76. package/dist/shortcuts/archive/operations/flow-url.js +1 -1
  77. package/dist/shortcuts/archive/operations/prelib.js +472 -0
  78. package/dist/shortcuts/archive/operations/registry.js +2 -0
  79. package/dist/shortcuts/archive/operations/upload.js +1 -1
  80. package/dist/shortcuts/asset-idle/errors.js +44 -0
  81. package/dist/shortcuts/asset-idle/host.js +161 -0
  82. package/dist/shortcuts/asset-idle/index.js +114 -0
  83. package/dist/shortcuts/asset-idle/manifest.js +159 -0
  84. package/dist/shortcuts/asset-idle/operations/idle.js +47 -0
  85. package/dist/shortcuts/asset-idle/operations/registry.js +33 -0
  86. package/dist/shortcuts/asset-idle/operations/shared.js +142 -0
  87. package/dist/shortcuts/asset-idle/operations/types.js +9 -0
  88. package/dist/shortcuts/asset-idle/operations.js +15 -0
  89. package/dist/shortcuts/cowork/operations/item-write.js +10 -2
  90. package/dist/shortcuts/index.js +5 -0
  91. package/dist/shortcuts/mail/operations/mail-send.js +8 -2
  92. package/dist/shortcuts/meeting/operations/eb/catalog.js +5 -1
  93. package/dist/shortcuts/meeting/operations/eb/create-flow.js +381 -104
  94. package/dist/shortcuts/meeting/operations/eb/crm-search.js +87 -5
  95. package/dist/shortcuts/meeting/operations/eb/flow-memory.js +49 -0
  96. package/dist/shortcuts/meeting/operations/eb/group-chat.js +583 -0
  97. package/dist/shortcuts/meeting/operations/eb/index.js +2 -0
  98. package/dist/shortcuts/meeting/operations/eb/room-recommend.js +19 -3
  99. package/dist/shortcuts/meeting/operations/eb/room-summary.js +2 -0
  100. package/dist/shortcuts/meeting/operations/eb/usage-cache.js +99 -0
  101. package/dist/shortcuts/meeting/operations/from-group-chat.js +35 -12
  102. package/dist/shortcuts/workflow/host.js +3 -0
  103. package/dist/shortcuts/workflow/index.js +1 -1
  104. package/dist/shortcuts/workflow/operations/form.js +65 -171
  105. package/dist/shortcuts/workflow/operations/todoSmartConvert/aigroupRules.js +129 -27
  106. package/dist/shortcuts/workflow/operations/todoSmartConvert/aigroupStore.js +6 -0
  107. package/dist/shortcuts/workflow/operations/todoSmartConvert/summaryCache.js +60 -117
  108. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailCache.js +44 -7
  109. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailFetcher.js +37 -29
  110. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.collect.js +48 -8
  111. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.core.js +1 -0
  112. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.detail.js +22 -18
  113. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.group.js +17 -9
  114. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.groupSummary.js +34 -10
  115. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.js +5 -2
  116. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.smartGroup.js +9 -2
  117. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.summary.js +122 -20
  118. package/docs/_catalog.md +3 -0
  119. package/docs/asset-idle.md +45 -0
  120. package/docs/e10-auth.md +16 -1
  121. package/docs/todo-smart-convert/subgroup-rules.md +1 -1
  122. package/package.json +1 -1
  123. package/scripts/mcp-meeting.mjs +234 -0
  124. package/scripts/package-skill.mjs +2 -0
  125. package/skill-template/business-info.json +14 -1
  126. package/skill-template/domains/asset-idle.md +13 -0
  127. package/skill-template/domains/wenshuding.md +3 -0
  128. package/skills/weaver-e10-archive-oa/SKILL.md +1 -0
  129. package/skills/weaver-e10-archive-oa/references/my-borrow.md +49 -0
  130. package/skills/weaver-e10-asset-idle/SKILL.md +73 -0
  131. package/skills/weaver-e10-asset-idle/references/idle-list.md +62 -0
  132. package/skills/weaver-e10-asset-idle/references/idle-stats-and-charts.md +65 -0
  133. package/skills/weaver-e10-asset-idle/references/source-manifest.json +193 -0
  134. package/skills/weaver-e10-asset-idle/references/widget-style.md +205 -0
  135. package/skills/weaver-e10-caizhilian/SKILL.md +29 -11
  136. package/skills/weaver-e10-caizhilian/references/auth-and-install.md +12 -0
  137. package/skills/weaver-e10-caizhilian/references/files.md +1 -1
  138. package/skills/weaver-e10-caizhilian/references/setting-encrypt.md +1 -1
  139. package/skills/weaver-e10-caizhilian/references/source-manifest.json +45 -45
  140. package/skills/weaver-e10-cowork/SKILL.md +2 -0
  141. package/skills/weaver-e10-cowork/references/cowork-write.md +1 -1
  142. package/skills/weaver-e10-jucailin/SKILL.md +2 -0
  143. package/skills/weaver-e10-jucailin/references/recruit-read.md +2 -0
  144. package/skills/weaver-e10-jucailin/references/recruit-write.md +1 -1
  145. package/skills/weaver-e10-mail/SKILL.md +3 -0
  146. package/skills/weaver-e10-mail/references/mail-send.md +2 -0
  147. package/skills/weaver-e10-meeting/SKILL.md +88 -25
  148. package/skills/weaver-e10-meeting/references/meeting-minute-file.md +25 -11
  149. package/skills/weaver-e10-meeting.zip +0 -0
  150. package/skills/weaver-e10-shared/SKILL.md +5 -5
  151. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +3 -3
  152. package/skills/weaver-e10-wenshuding/SKILL.md +29 -6
  153. package/skills/weaver-e10-wenshuding/references/archive-borrow-list.md +14 -0
  154. package/skills/weaver-e10-wenshuding/references/archive-download.md +2 -0
  155. package/skills/weaver-e10-wenshuding/references/archive-flow.md +1 -1
  156. package/skills/weaver-e10-wenshuding/references/archive-prelib-arrange.md +76 -0
  157. package/skills/weaver-e10-wenshuding/references/archive-prelib-list.md +107 -0
  158. package/skills/weaver-e10-wenshuding/references/archive-prelib-open.md +59 -0
  159. package/skills/weaver-e10-wenshuding/references/archive-upload.md +4 -1
  160. package/skills/weaver-e10-wenshuding/references/source-manifest.json +108 -65
  161. package/skills/weaver-e10-workflow/SKILL.md +9 -2
  162. package/skills/weaver-e10-workflow/aigroup/default.json +166 -19
  163. package/skills/weaver-e10-workflow/references/todo-smart-convert.md +72 -34
  164. package/skills/weaver-e10-workflow/tools/todo-serve.cjs +113 -25
  165. package/skills/weaver-e10-workflow/tools/todo-summary.cjs +350 -50
  166. package/dist/chunks/{chunk-2LV74IWP.js → chunk-E7OK5WD5.js} +5 -5
@@ -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.48.1
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」,能给我完整的公司名吗?或这家先不关联客户?」
@@ -262,7 +288,11 @@ cliHelp: "weaver-work-cli meeting --help"
262
288
  ```
263
289
  把 `label` 做成选项让用户挑一个(`value.begin/end/address` 直接可回填),选定后带时间走 prepare。
264
290
  - 没候选时它会说明原因(人没共同空闲 / 人空闲但订不到会议室),**如实转达**,别自己编一个时间;
265
- - 用户说了"上午/下午"这种粗粒度,也走它(`workStartHour`/`workEndHour` 约束),不要直接默认 9 点。
291
+ - ⛔ **用户说了"上午/下午/晚上"就不要走 suggest**:直接按固定时段定下来
292
+ (上午 09:00–12:00 / 下午 13:00–18:00 / 晚上 18:00–21:00),
293
+ 建会时传 `{"dateFrom":"<日期>","time_slot":"上午"}` 给 `create.flow.prepare/quick`;
294
+ **不要**再传 `workStartHour`/`workEndHour` 让 CLI 给候选 —— 那会二次追问用户时间
295
+ (2026-11-03 真实翻车:用户说"明天上午",小E 还是弹了 08:00~09:00 / 09:00~10:00 让选)。
266
296
  - ⛔ 这个操作调不通(返回 `unknown operation`)时**先跑 `meeting ops --grep suggest` 自查**,
267
297
  确认 CLI 装的是不是最新版;**不要**直接对用户说"没有这个能力" —— 建会主链路本来就不需要它。
268
298
  - ⛔ **仅限「会议建会」这一件事:不要自己手搓 `workflow.*`**
@@ -356,9 +386,9 @@ cliHelp: "weaver-work-cli meeting --help"
356
386
  没证据。正确说法:"这项没核验到(原因 X)",并原样转达原因。
357
387
  以前这些失败被 `.catch(() => null)` 静默吞掉,"没查"和"没冲突"长得一模一样,用户以为查过了
358
388
  (会议室查不到就卡在选房 → 冲突检测不跑 → 却答复"流程表单本身不做冲突检测",就是这么错的)。
359
- - **会议室台账缓存 24 小时,但「建会」链路强制拉最新**:`create.flow.prepare` / `create.flow.quick` /
360
- `create.suggest` 内部都会强制刷新台账,所以刚导入/新建的会议室在建会时一定看得到。
361
- 只有**纯查询**(`meeting.eb.room.recommend`)会走 24h 缓存(快);缓存超过 4 小时会在 warnings 提示
389
+ - **会议室台账缓存 24 小时(2026-11-03 松绑:建会链路也走缓存)**:`create.flow.prepare` / `create.flow.quick` /
390
+ 不再每次强制重拉台账(省 ~1s),靠「候选为空自动强制重拉」兜底;代价是**刚导入的会议室在缓存期可能按名称查不到**
391
+ (按 id 指定不受影响)。只有**纯查询**(`meeting.eb.room.recommend`)同样走 24h 缓存(快);缓存超过 4 小时会在 warnings 提示
362
392
  "数据可能过时",最近改过会议室就带 `refresh: true` 重查。候选为空时还会自动强制重拉一次
363
393
  (`meta.cacheRetried: true`)。
364
394
  ⛔ **不要因为"只有 1 间/查不到"就去断言系统里没有会议室** —— 先看 `meta.roomsTotal` 与 `cacheRetried`,
@@ -412,13 +442,17 @@ cliHelp: "weaver-work-cli meeting --help"
412
442
  - 取表单一律用 `meeting.eb.meeting.create.flow.prepare`(内部按固化流程候选、未命中回落 `mt_new_wf` 调 `workflow.createForm`),
413
443
  **不要**自己拼 `workflow.createRequestDirect` / `workflow.createForm`。
414
444
  3. **能自动推的绝不问用户;剩下要问的一次问全**
415
- - **时间没说具体几点**(只说"明天/下周三/上午")→ **不要问,直接调 ① 的 `prepare` 且不传 `begin_datetime`**,
416
- 它会返回「所有人都空闲 + 该时段有会议室」的时段选项(带会议室名,`value` 可直接回填)。
417
- 这是 2026-10-30 用户明确要求的:没填时间就要推荐时间,不许弹空输入框让人手填。
445
+ - **时间只说了日期**("明天 / 下周三",**且话里没有任何时段词**)→ 不要问,直接调 ① 的 `prepare`
446
+ 且不传 `begin_datetime`,它会返回「所有人都空闲 + 该时段有会议室」的时段选项(`value` 可直接回填)。
447
+ ⛔ **只要话里出现"上午/早上/下午/晚上",就不许走这条路**:必须按第 2 条传
448
+ `{"dateFrom":"<日期>","time_slot":"上午"}`,让 CLI 直接定成 09:00–12:00。
449
+ 2026-11-03 用户第二次投诉的就是这个:说了"明天上午",还是弹「09:00~10:00 / 10:00~11:00」让他选。
418
450
  只有"只想看空闲、不建会"才单独用 `meeting.eb.meeting.create.suggest`。
419
451
  - **会议室没指定** → **不要问,要给选项**(`prepare` 返回的 `options` / `roomOptions`,
420
452
  已排好序)。呈现规则见本节第 2 条:做成选项控件,禁止列成文本 + "需要你指定一间"。
421
- - 其余真正缺的(会议名称 / 参会人 / 会议类型)**一次列完问**,不要"先问人 → 再问类型"。
453
+ - 其余真正缺的(会议名称 / 会议类型)**一次列完问**,不要"先问人 → 再问类型"。
454
+ ⛔ **参会人不算"缺"**:不传 = 当前登录人(CLI 自动补进表单),**不许弹框问"参会人员是谁"**
455
+ (2026-11-03 用户投诉:明明可以默认自己,却又弹了一次输入框)。用户后面想加人会说。
422
456
  每多一轮追问就多一次模型推理(20–40 秒),用户体感"建个会要 2 分钟"基本都是这么来的(实测 CLI 全程只要 3 秒)。
423
457
  - 用户一句话里已经给全的要素**不要再复述确认**,直接进下一步。
424
458
  4. **不要在 prepare 之前自己先去查会议室/类型/冲突** —— `prepare`/`quick` 内部已并行跑完(见上面「会议室不能默默留空」)。
@@ -540,7 +574,10 @@ weaver-work-cli --json meeting run meeting.minute.fromGroupChat --input-json '{"
540
574
  `attachment.upload` → `minute.create` 挂附件 → ESB「解析附件」(文档同步、可能 60s 超时报 `write_uncertain` 但**不代表没执行**;音频异步约 9s 返回、原文约 2 分钟就绪)→ 等 `video_taskResult=1` / `minutes_status=4` → ESB「生成智能纪要文本」(写 `parse_content`)→ ESB「保存解析并生成文档」。
541
575
  ⛔ 不要自己拟纪要文案(提示词在 ESB 里,自己写会和小E 现有格式不一致)。
542
576
  ⛔ 不要调「获取解析纪要音频结果」:它是 1 分钟一轮的定时任务、会自己写表单,重复调可能覆盖;查进度只用 `meeting.minute.parseStatus`。
543
- ⚠️ 流程 id / 页面 id 是**租户级配置**,文中 `<…>` 均为占位符。
577
+ ✅ **三个动作流 id 与智能纪要页面 id 已内置**(本租户 primary_key),`meeting.minute.fromGroupChat` 默认就用它们,
578
+ 你**不用传** `flowGenerateMinutes` / `flowGenerateDocument` / `aiPageId`;换租户才需要覆盖。
579
+ ⛔ 手工触发时用 `uniqueIndent: "<32位 primary_key>"`,**不要塞进 `esbFlowId`** —— 那个入参只认 19 位数字 id,
580
+ 传 GUID 会报 `can not cast to long` / `系统错误`。
544
581
  ## 读附件内容(会议附件 / 项目文件 / 议题资料)
545
582
 
546
583
  ⛔ **旧结论作废**:以前 skill 里写"附件回读只有文件名、拿不到 fileId ⇒ 下载不了",**是错的**。
@@ -643,6 +680,12 @@ weaver-work-cli --json meeting run meeting.attachment.extract --input-json '{"mt
643
680
  - **不要**在建会前自己先跑 `hrm.employee.query`、`room.list`、`conflict.member`、`schedule.free` —— prepare/quick 内部已经并行做完了
644
681
  (只有在需要给用户**换人/换房/换时间**时才单独查);
645
682
  - 需要让用户挑选时(多流程 / 有冲突要改期 / 换会议室),用 `quick`/`prepare` 返回的 `options` 做**一次**选择,选定后再 `quick` 一次即可收口。
683
+ - ✅ **两个省时机制已内置(2.48.0),不用做任何事**:
684
+ ① **全天占用缓存**——quick/prepare 第一次跑某天会一次拉全天全部会议室占用(~2s,5 分钟内有效),
685
+ 同一天内改时间/换会议室/再推荐**不再打占用接口**;提交成功后当天缓存自动作废,不会拿旧台账放行冲突。
686
+ ② **流程记忆**——多个建会流程都可发起时,自动沿用**这个人上次成功用过的流程**直接发起
687
+ (留痕说明"沿用了你上次选的"),不再弹流程选项;要强制回到"每次都问"传 `flowChoice: "ask"`。
688
+ 权限过滤照做:记忆只是默认值,不是绕过权限。
646
689
 
647
690
  ## 流程建会(`meeting.eb.meeting.create.flow`)
648
691
 
@@ -679,21 +722,41 @@ weaver-work-cli --json meeting run meeting.eb.meeting.create.flow.apply \
679
722
  - **刷新为完整版**:审批通过后 `meeting.eb.meeting.list` 找到该会议 id →
680
723
  `meeting.invitation.render --mtId <id>`(只生成、不发送)。
681
724
  - ⛔ **不要因为"会议还在审批"就重复 `apply`** —— 会重复建单/重复建会。
682
- - **只有 `submit_mode=browser` 才可能返回 `status=BROWSER_FILL`**(2026-10-31 起默认不再进这一档,
683
- 见下方「提交方式」)。万一真进到这一档:CLI 会返回 `contextId` + `finalMarkdown`(那段 `<browsertool>` 表单)
684
- + `invitation.filePath`(按申请单预生成的预置函)。正确做法:把 `finalMarkdown` 内容原样作为本轮回复正文
685
- (从 `<browsertool>` 到 `</browsertool>`、不包代码块),并告诉用户邀请函已生成在哪个路径;
725
+ - **`status=BROWSER_FILL` 时**:CLI 返回 `contextId` + `finalMarkdown`(那段 `<browsertool>` 表单)
726
+ + `invitation`(按申请单预生成的预置函)。具体做法见下方「提交方式」第一条;
686
727
  ⛔ 不要说"流程没提交成功 / 没有邀请函",也不要因为"没有 requestId"重复 `apply`。
687
728
 
688
729
  - **✅ 提交方式默认「弹表单」**(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` 拿完整版;
730
+ `create.flow.quick/apply` 默认 `submit_mode=browser` —— CLI **只把表单块返回给你,不会自己打开页面**。
731
+ 会议名称/时间/地点/参会人员/参会客户都已预填(浏览按钮传的是 id,页面能落值),用户核对、修改后自己点提交。
732
+ - **打开表单的唯一动作 = 把 `finalMarkdown` 原样贴进回复**(从 `<browsertool>` 到 `</browsertool>`):
733
+ - 放在回复**最后**、单独成段;⛔ 不包代码块、不省略、不转述、不改缩进;
734
+ - **发送前自检**:正文里必须能搜到 `<browsertool>` 和 `"toolId": "fill_form"`;搜不到就补上再发;
735
+ - ⛔ 没贴这段却写"表单已在右侧打开"=骗人,用户看到的就是没有表单(2026-11-02 就是这么翻车的)。
736
+ - `browser` 下 CLI **不向服务端写入**,返回 `status=BROWSER_FILL` + `finalMarkdown`,没有 `requestId` / `meetingId` ——
737
+ ⛔ **不能说"流程已提交"**,要说"表单已打开(贴在下方),您在页面上核对后点提交"。
738
+ - **邀请函照给,且 `invitation.text` 必须全文贴在回复里**(预置函:按申请单已知信息生成,字段可能不全)。
739
+ ⛔ 不要只丢一个 `filePath`;也**不要因为"流程还没提交成功"就不给邀请函** —— 这是两件独立的事。
694
740
  - 只有用户明确说"不用我确认,直接建"时才传 `submit_mode=direct`:直接写服务端 → 拿 `requestId` + `meetingId`,
695
- 会议当场生成;判断落库看这两个 id,并用 `meeting.eb.meeting.detail --id <meetingId>` 回读核对;
741
+ 会议当场生成;判断落库看这两个 id,并用 `meeting.eb.meeting.detail --id <meetingId>` 回读核对。
742
+ ⚠️ 小e 环境里即使传 `direct` 也可能仍返回 `BROWSER_FILL`(流程侧没有强制提交开关)——
743
+ **一切以返回的 `status` 为准**:只有 `status=COMPLETE` 且拿到 `meetingId` 才算建好,
744
+ 否则就是"表单已给出、等用户点提交",⛔ 不要说"已提交/已建好"。
696
745
  - ⛔ 不管哪种模式,`quick` / `apply` 都是真提交,必须已拿到用户对时间/地点/人/客户的确认。
746
+ - **群聊随建会同步创建**(2026-11-02 用户要求;CLI 自动做,不用你另外调):
747
+ `quick` / `apply` 的返回里带 `groupChat: {ok, groupId, groupName, created, bound}`。
748
+ - `groupChat.ok=true` → 群已按「会议名称」建好,并在群里发过一条会议信息;回复里说一句"会议群已建好(群名=会议名称)"即可;
749
+ - `bound=true` → 群 id 已回写会议记录 `imchat_groupid`;`bound=false`(browser 档必然如此,因为还没有会议 id)→
750
+ 告诉用户"群已建好,会议生成后再绑定";
751
+ **用户说"我提交了/审批过了"之后**,跑 `meeting.eb.meeting.group.ensure`:
752
+ - 有流程单号 → 传 `{"requestId":"<单据id>"}`(**首选**,会议记录的 `request_id` 是唯一凭据);
753
+ - 没单号 → 传 `{"lookupPending":true}`:CLI 读本机「表单已发出」记录,用建群时记的基线单号
754
+ 找出之后新提交的那张,再按它反查会议。
755
+ ⛔ **不要用会议名称反查**(用户可能在表单里改名、也可能有同名会议);
756
+ 返回 `requestCandidates` 说明同时有多张新单 —— 让用户确认是哪一张,别猜;
757
+ 返回 `meetingLookup` 就是找到的会议;查不到会明说"可能还没提交/还在审批",别反复重试;
758
+ - `groupChat.ok=false` → 如实说"群没建成功"+原因;⛔ 不许编群 id、不许说群已建好;
759
+ - ⛔ 不要重复建群:重试前先看已有返回里有没有 `groupChat.groupId`。
697
760
  - **⛔ 提交前必须把 `formPreview` 贴给用户过一眼**(2.44.0 起,2026-10-31 用户要求
698
761
  「为什么没有直接发起流程表单让我确认重填后让我点击提交」):
699
762
  浏览器填单那条路走不通(浏览按钮不赋值),所以用"把要提交的内容原样列出来"替代核对环节。
@@ -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
@@ -53,7 +53,7 @@ XiaoE 环境有两种识别入口:桌面客户端由 Agent 根据宿主或任
53
53
  - 工作目录名含 `xiaoeUserData`、使用 XiaoE 内置 Node.js,或已安装相关 CLI;
54
54
  - 过去在同一台机器上登录或安装过 XiaoE。
55
55
 
56
- 桌面客户端首次没有本地会话时,Agent 判定为 XiaoE 后显式执行 `weaver-work-cli auth xiaoe`;后续业务命令只有需要 XiaoE 专属业务行为时才在 `weaver-work-cli` 之后加 `--runtime-agent xiaoe`,例如 `weaver-work-cli --runtime-agent xiaoe workflow ...`。已保存的 XiaoE 会话过期恢复不依赖这个参数,也不依赖 Skill 或 Agent:CLI 会根据会话内的 `agentType` / `loginSource` 在公共请求层自行处理。`--runtime-agent` 不携带、不选择凭据。
56
+ 桌面客户端首次没有本地会话时,Agent 判定为 XiaoE 后可显式执行 `weaver-work-cli auth xiaoe`,或通过 `--runtime-agent xiaoe` 标识宿主,让业务命令在加载会话时自动获取登录信息,例如 `weaver-work-cli --runtime-agent xiaoe workflow ...`;网页端已有 `XIAOE_*` 标记时自动识别。已保存的 XiaoE 会话过期恢复不依赖这个参数,也不依赖 Skill 或 Agent:CLI 会根据会话内的 `agentType` / `loginSource` 在公共请求层自行处理。`--runtime-agent` 表示运行时身份,不携带凭据。
57
57
 
58
58
  WorkBuddy、Codex 及其他智能体一律使用 `weaver-work-cli auth login --base-url "<用户确认的登录域名>" --agent_type "<当前智能体名称>"` 走浏览器 OAuth。`auth login` / `auth oidc` 不会读取或消费 XiaoE 凭据。
59
59
 
@@ -67,9 +67,9 @@ Token、Cookie、ETEAMSID 和业务凭证**只能由 `weaver-work-cli` 内部读
67
67
 
68
68
  下述 `auth xiaoe` 流程仅适用于上述已确认的 XiaoE 智能体环境;其他智能体不执行宿主脚本检测,直接进入浏览器 OAuth 流程。`auth xiaoe` 命令本身就是认证方式的显式选择;`hasXiaoEEnv` 使用桌面的 `--runtime-agent xiaoe` 或任意 `XIAOE_*` 环境变量识别运行环境。
69
69
 
70
- 首次缺少本地会话时只运行 `weaver-work-cli auth xiaoe`。CLI 内部按「平台凭证 Node 换票 → CLI 自带 `xiaoe_env.py` 兼容换票 → 宿主 `tokens.py` → 桌面 XiaoE 客户端会话 → `WEAVER_XIAOE_*` 环境映射」顺序取凭据;其中 `XIAOE_DOMAIN` 是 XiaoE/erpa 换票服务地址,不是 E10 地址。`xiaoe_env.py` 属于 CLI npm 包,不放入 shared Skill,且只能由 CLI 内部执行和解析。已有 XiaoE 会话被接口明确拒绝为失效时,CLI 根据会话元数据在公共请求层静默恢复并重放一次;这个流程绕开 shared Skill,Agent 不参与,也不得再补跑登录或原业务命令。失败时 CLI 返回最终结构化错误。
70
+ 首次缺少本地会话时,已识别为 XiaoE 的业务命令会在 CLI 公共会话加载层自动获取登录信息;如需提前登录,只运行 `weaver-work-cli auth xiaoe`。CLI 内部按「平台凭证 Node 换票 → CLI 自带 `xiaoe_env.py` 兼容换票 → 宿主 `tokens.py` → 桌面 XiaoE 客户端会话 → `WEAVER_XIAOE_*` 环境映射」顺序取凭据;其中 `XIAOE_DOMAIN` 是 XiaoE/erpa 换票服务地址,不是 E10 地址。`xiaoe_env.py` 属于 CLI npm 包,不放入 shared Skill,且只能由 CLI 内部执行和解析。已有 XiaoE 会话达到换票结果的 `expiryTimes` 时,CLI 会在业务请求发出前静默换票;已有 XiaoE 会话被接口明确拒绝为失效时,CLI 根据会话元数据在公共请求层静默恢复并重放一次。这个流程绕开 shared Skill,Agent 不参与,也不得再补跑登录或原业务命令。失败时 CLI 返回最终结构化错误。
71
71
 
72
- 1. 首次无本地登录态、准备执行业务命令前需要建立 E10 会话,或 `auth status --no-check` 显示未登录时,运行:
72
+ 1. 首次无本地登录态、需要在业务命令之前显式建立 E10 会话时,可运行:
73
73
  ```text
74
74
  weaver-work-cli auth xiaoe
75
75
  ```
@@ -77,7 +77,7 @@ Token、Cookie、ETEAMSID 和业务凭证**只能由 `weaver-work-cli` 内部读
77
77
  3. XiaoE 统一登录由 CLI 按序取凭证:① 平台注入的 `XIAOE_USER_TOKEN` + `XIAOE_DOMAIN`,先走 Node 换票,再由 CLI npm 包自带的标准库 `xiaoe_env.py` 作兼容回退;② 宿主 `xiaoeUserData/tokens.py`(仅桌面宿主,CLI 在 macOS/Windows 都会先自动发现 XiaoE 客户端内置 Python,再回退到系统 Python);③ 内置原生实现读取桌面 XiaoE 客户端会话换取 `eteamId`,依次查找 `XIAOE_USER_SETTINGS_PATH`、`XIAOE_ROBOT_DATA_ROOT` / `XIAOE_ROBOT_ROOT` 和默认 `XiaoE/Robots/<id>/user_settings.json`,因此会话有效时不要求存在 `tokens.py`;④ `WEAVER_XIAOE_*` 环境映射。宿主只注入 `XIAOE_DOMAIN`、`XIAOE_USER_TOKEN` 等平台变量,不会注入 ETEAMSID 环境变量,CLI 也不读取 `XIAOE_ETEAMSID`。Agent 不要打印、转述、索取或要求用户手动设置这些凭证,也不要直接执行任一脚本或因为脚本报缺依赖就让用户安装 Python 包——凭据链内部的兼容回退由 CLI 完成。
78
78
  4. `auth xiaoe` 是 XiaoE 认证方式的显式入口:CLI 不再判断当前宿主,只检查并消费可用凭据源。E10 目标地址按「显式 `--base-url` → 专用 `WEAVER_XIAOE_*` E10 配置/映射 → 当前 profile → CLI 内置默认值」解析,绝不能把 `XIAOE_DOMAIN` 当作 E10 地址。Token、Cookie、ETEAMSID 仍属于凭证,禁止在回复中展示。
79
79
  5. XiaoE 统一登录走不通时,无论 macOS、Windows、Linux 或 Web,CLI 都返回 `authentication/xiaoe_credential_unavailable`,绝不自动打开浏览器或降级到 `auth login`;本任务必须停止,不得另行调用其他登录 Skill 或登录命令。
80
- 6. `auth status --no-check` 不会触发 XiaoE 统一登录;业务命令加载到 `agentType=XiaoE` 或 `loginSource=xiaoe-unified` 的会话并被 E10 明确拒绝为失效时,即使没有 `XIAOE_*` 或 `--runtime-agent xiaoe`,也会静默触发一次统一登录并重放该请求一次。首次无本地会话仍须显式执行 `auth xiaoe`;具体读取 [`e10-auth-and-session.md`](references/e10-auth-and-session.md)。
80
+ 6. `auth status --no-check` 不会触发 XiaoE 统一登录;业务命令加载到 `agentType=XiaoE` 或 `loginSource=xiaoe-unified` 的会话并被 E10 明确拒绝为失效时,即使没有 `XIAOE_*` 或 `--runtime-agent xiaoe`,也会静默触发一次统一登录并重放该请求一次。无可读取的本地会话时,则需要当前 `XIAOE_*` 或 `--runtime-agent xiaoe` 等宿主标记才能自动获取;显式 `--auth` 不触发自动替换。具体读取 [`e10-auth-and-session.md`](references/e10-auth-and-session.md)。
81
81
 
82
82
  ### 认证错误只报告状态,不指定登录命令
83
83
 
@@ -202,4 +202,4 @@ User-Agent: AgentType=<agentType>,IsAgent=true
202
202
 
203
203
  7. 附件、图片上传或文件解析属于敏感数据处理。即便 operation 风险等级不是高风险写入,也必须先取得用户对“文件内容可能进入大模型/外部解析服务”的明确确认;不能把用户仅提供文件路径或文件名视为同意解析或上传。
204
204
 
205
- 8. Agent 明确选择 `auth xiaoe` 后,CLI 按顺序从平台注入凭证(Node 换票后由 CLI npm 包自带 `xiaoe_env.py` 兼容回退)、宿主 `xiaoeUserData/tokens.py`、内置原生实现读取的桌面 XiaoE 客户端会话(宿主注入路径优先、默认 `XiaoE/Robots/<id>/user_settings.json` 回退)、`WEAVER_XIAOE_*` 环境映射读取支持统一登录的凭证。业务命令不会在首次无会话时自动登录,但已有会话被接口明确拒绝时会根据持久化会话的 `agentType` / `loginSource` 静默恢复 1 次,不要求 Agent 添加 `--runtime-agent xiaoe`;该参数仅用于其他 XiaoE 专属业务行为。不要要求用户提供、展示或手动设置这些凭证。任意系统失败时都反馈结构化错误,不自动降级浏览器。
205
+ 8. Agent 明确选择 `auth xiaoe` 后,或业务命令在已识别的 XiaoE 运行时发现本地会话缺失时,CLI 按顺序从平台注入凭证(Node 换票后由 CLI npm 包自带 `xiaoe_env.py` 兼容回退)、宿主 `xiaoeUserData/tokens.py`、内置原生实现读取的桌面 XiaoE 客户端会话(宿主注入路径优先、默认 `XiaoE/Robots/<id>/user_settings.json` 回退)、`WEAVER_XIAOE_*` 环境映射读取支持统一登录的凭证。已有会话被接口明确拒绝时会根据持久化会话的 `agentType` / `loginSource` 静默恢复 1 次,不要求 Agent 添加 `--runtime-agent xiaoe`。不要要求用户提供、展示或手动设置这些凭证。任意系统失败时都反馈结构化错误,不自动降级浏览器。
@@ -29,7 +29,7 @@ weaver-work-cli auth whoami
29
29
  - 业务命令失败,stderr JSON 中 `error.type === "authentication"`(如 `E10 auth not found`)
30
30
  - 业务命令返回 `error.subtype === "session_expired"`(E10 登录态 401/302 失效)
31
31
 
32
- CLI 的认证错误只是状态信号,不是登录命令。已有 XiaoE 会话过期时,公共请求层会根据持久化会话的 `agentType` / `loginSource` 自动恢复,不依赖 `XIAOE_*`、`--runtime-agent xiaoe`、shared Skill 或 Agent。仅首次无会话、`auth not found` 等认证缺失才进入下述显式登录流程。
32
+ CLI 的认证错误只是状态信号,不是登录命令。已有 XiaoE 会话达到换票结果的 `expiryTimes` 时,CLI 会在业务请求发出前静默换票;被接口判定过期时,公共请求层会根据持久化会话的 `agentType` / `loginSource` 自动恢复,不依赖 `XIAOE_*`、`--runtime-agent xiaoe`、shared Skill 或 Agent。业务命令无可读取的本地会话时,若当前 `XIAOE_*`、`--runtime-agent xiaoe` 等标记已识别为 XiaoE,公共会话加载层也会先静默获取登录信息。失败时返回 `xiaoe_credential_unavailable`,提示已尝试自动获取,Agent 只反馈并停止;不要再次登录或重跑。需要在业务命令之前主动建立会话时,可按下述流程显式登录。
33
33
 
34
34
  此时**禁止**:
35
35
 
@@ -40,12 +40,12 @@ CLI 的认证错误只是状态信号,不是登录命令。已有 XiaoE 会话
40
40
 
41
41
  **正确流程(按序执行,缺一不可):**
42
42
 
43
- 0. **仅首次无本地会话时,由 XiaoE 智能体环境主动选择统一登录**:桌面端宿主/任务上下文明确标识为 XiaoE,或网页端命中原有环境变量判断时,才运行:
43
+ 0. **首次无本地会话且需要提前登录时,由 XiaoE 智能体环境显式选择统一登录**:桌面端宿主/任务上下文明确标识为 XiaoE,或网页端命中原有环境变量判断时,才运行:
44
44
  ```text
45
45
  weaver-work-cli auth xiaoe
46
46
  ```
47
47
  本机存在 `xiaoeUserData/tokens.py`、XiaoE 客户端目录、工作目录或历史登录,都不能作为宿主身份依据。桌面客户端可由 `--runtime-agent xiaoe` 标识;命令进程中存在任意 `XIAOE_*` 变量时也直接标识为 XiaoE。未命中这两类判断的 WorkBuddy、Codex 及其他智能体必须跳过此步,进入下方浏览器 OAuth 流程。
48
- CLI 会按“显式 `--base-url` → 专用 `WEAVER_XIAOE_*` E10 配置/映射 → 当前 profile `config.baseUrl` → CLI 内置默认值”解析 E10 登录域名;`XIAOE_DOMAIN` 只作为 XiaoE/erpa 换票服务地址。业务命令不会在缺少本地会话时主动登录;已有会话被接口明确拒绝为失效时,公共请求层根据会话内 `agentType=XiaoE` 或 `loginSource=xiaoe-unified` 静默恢复并重放一次,不要求 Agent 添加 `--runtime-agent xiaoe`。恢复失败或重放后仍失效时,Agent 只反馈最终错误并停止,不再运行登录或业务命令。
48
+ CLI 会按“显式 `--base-url` → 专用 `WEAVER_XIAOE_*` E10 配置/映射 → 当前 profile `config.baseUrl` → CLI 内置默认值”解析 E10 登录域名;`XIAOE_DOMAIN` 只作为 XiaoE/erpa 换票服务地址。已识别为 XiaoE 的业务命令缺少本地会话时会静默尝试统一登录;已有会话被接口明确拒绝为失效时,公共请求层根据会话内 `agentType=XiaoE` 或 `loginSource=xiaoe-unified` 静默恢复并重放一次,不要求 Agent 添加 `--runtime-agent xiaoe`。恢复失败或重放后仍失效时,Agent 只反馈最终错误并停止,不再运行登录或业务命令。
49
49
 
50
50
  1. **仅非 XiaoE 环境进入本步**。禁止先执行 `auth xiaoe` 或调用其他登录 Skill。先调用宿主提供的提问 / 弹框能力询问用户,让用户二选一:
51
51
  - 输入本次要登录的 E10 登录域名(base URL),形如 `https://<企业域名>`;或
@@ -3,9 +3,9 @@ name: weaver-e10-wenshuding
3
3
  display_name: 泛微E10文书定档案管理
4
4
  display_name_en: Weaver E10 Wenshuding
5
5
  description: "泛微 E10 文书定档案管理:全宗与预归档库、全文检索、档案基本信息、借阅车、借阅单、原文下载、发起借阅/续借流程页与预归档上传确认链。"
6
- description_zh: "泛微 E10 文书定档案管理。支持查询全宗与预归档电子文件库、全文检索可借档案、查看档案基本信息、查看借阅车并直接加入档案(免确认写操作)、查看借阅单与详情、下载借阅单原文 zip,并通过 prepare/apply 确认链处理发起借阅、续借和预归档上传。全宗信息仅在预归档上传时需要查询;借阅相关流程页面默认用系统默认浏览器打开。全文检索结果的默认返回显示样式为三段式卡片视图(标题可点击、命中词高亮、全宗/分类/日期摘要行)。"
6
+ description_zh: "泛微 E10 文书定档案管理。支持查询全宗与预归档电子文件库、全文检索可借档案、查看档案基本信息、查看借阅车并直接加入档案(免确认写操作)、查看借阅单与详情、下载借阅单原文 zip,并通过 prepare/apply 确认链处理发起借阅、续借和预归档上传。全宗信息仅在预归档上传时需要查询;借阅/续借流程页只生成 Markdown 超链接(a 标签)返回,不自动打开浏览器,由客户端决定打开方式。全文检索结果的默认返回显示样式为三段式卡片视图(标题可点击、命中词高亮、全宗/分类/日期摘要行)。"
7
7
  description_en: "Weaver E10 Wenshuding archive skill for fonds and pre-archive libraries, full-text search, archive info, borrow car, borrow orders, original file packaging and download, borrow/renew workflow URL generation, and confirmed pre-archive upload."
8
- version: 1.0.4
8
+ version: 1.0.5
9
9
  author: 泛微网络科技股份有限公司
10
10
  agent_created: true
11
11
  requires:
@@ -24,7 +24,21 @@ cliHelp: "weaver-work-cli archive --help"
24
24
 
25
25
  本 Skill 是 CLI 型技能,不自行发起 HTTP 请求:认证与会话**统一由 `weaver-e10-shared` 共享规则和 `weaver-work-cli auth ...` 命令体系托管**,禁止自建或绕过登录流程。
26
26
 
27
- 请求头三件套(Cookie 完整原始串 / `eteamsid` / `User-Agent`)由 `weaver-work-cli` 统一注入,唯一权威声明见 [`../weaver-e10-shared/SKILL.md`](../weaver-e10-shared/SKILL.md) 的「请求头契约」章节。
27
+ 接口请求头(由 CLI 注入,Agent 不手写):
28
+
29
+ ```text
30
+ Cookie: <登录返回的完整原始 Cookie 串> # 禁止裁剪、去重或改写
31
+ eteamsid: <登录返回的 ETEAMSID>
32
+ User-Agent: AgentType=<agentType>,IsAgent=true
33
+ ```
34
+
35
+ | 凭证 | 取值与要求 |
36
+ | --- | --- |
37
+ | `Cookie` | 登录返回的**完整原始 Cookie 串**,禁止裁剪、去重或改写 |
38
+ | `eteamsid` | 登录返回的 `ETEAMSID` |
39
+ | `User-Agent` | `AgentType=<agentType>,IsAgent=true` |
40
+
41
+ 完整权威说明见 [`../weaver-e10-shared/SKILL.md`](../weaver-e10-shared/SKILL.md) 的「请求头契约」章节。
28
42
 
29
43
  Agent 不得自行拼接、改写或向用户索取上述凭证(禁止要求用户贴 Cookie / ETEAMSID / token),也不得直接 `curl` / `fetch` E10 接口。
30
44
  所有命令通过 `weaver-work-cli --json archive run <operation>` 执行:简单 JSON 优先传 `--input-json '<json>'`,复杂或多行 JSON 先写入 UTF-8 文件再传 `--input <path>`,只有确认当前 shell 能稳定传管道时才使用 `--input -`。调用前先按需读取 references 下对应的文件,查参数结构,不要猜字段;**references 是第一信息源**,`weaver-work-cli archive schema` 是 operation、字段和风险等级的合约来源。
@@ -41,7 +55,7 @@ Agent 不得自行拼接、改写或向用户索取上述凭证(禁止要求
41
55
 
42
56
  出现以下任一语义时,优先走本 Skill:
43
57
 
44
- - 文书定 / 档案 / 全宗 / 收集库 / 管理库 / 预归档库 / 电子文件库
58
+ - 文书定 / 档案 / 全宗 / 收集库 / 管理库 / 预归档库 / 电子文件库 / 我上传的档案 / 我上传的档案文件
45
59
  - 档案检索 / 全文检索 / 可借档案 / 档号 / 案卷 / 保管期限 / 密级 / 库位
46
60
  - 借阅车 / 加入借阅车 / 我的借阅车
47
61
  - 借阅单 / 我的借阅 / 借阅记录 / 续借 / 归还期限
@@ -57,6 +71,11 @@ Agent 不得自行拼接、改写或向用户索取上述凭证(禁止要求
57
71
  |---|---|---|
58
72
  | 查看可用 operation、字段和风险等级 | `archive schema` | [`archive-agent-entry.md`](references/archive-agent-entry.md) |
59
73
  | 查询全宗 / 预归档电子文件库节点 | `archive run archive.fonds.list` / `archive.prelib.tree` | [`archive-fonds.md`](references/archive-fonds.md) |
74
+ | 查看电子文件库列表(预归档库内的数据) | `archive run archive.prelib.list` | [`archive-prelib-list.md`](references/archive-prelib-list.md) |
75
+ | 查看我的档案 / 我上传的档案(默认我上传的电子文件库) | `archive run archive.prelib.list` | [`archive-prelib-list.md`](references/archive-prelib-list.md) |
76
+ | 对电子文件库数据做智能识别 | `archive run archive.prelib.intelligent.prepare` -> 用户确认 -> `.apply` | [`archive-prelib-list.md`](references/archive-prelib-list.md) |
77
+ | 提交整理(预归档数据整理提交) | `archive run archive.prelib.arrange.prepare` -> 用户确认 -> `.apply` | [`archive-prelib-arrange.md`](references/archive-prelib-arrange.md) |
78
+ | 打开某条预归档档案(生成链接) | `archive run archive.prelib.open` | [`archive-prelib-open.md`](references/archive-prelib-open.md) |
60
79
  | 全文检索可借档案(默认卡片视图展示) | `archive run archive.search.run` | [`archive-search.md`](references/archive-search.md) |
61
80
  | 查看档案基本信息 | `archive run archive.info.get` | [`archive-info.md`](references/archive-info.md) |
62
81
  | 查看借阅车 | `archive run archive.borrow-car.list` | [`archive-borrow-car.md`](references/archive-borrow-car.md) |
@@ -72,11 +91,15 @@ Agent 不得自行拼接、改写或向用户索取上述凭证(禁止要求
72
91
  处理链:
73
92
 
74
93
  - 检索并借阅:`archive.search.run` -> 用户选择条目 -> `archive.borrow-car.add`(免确认直接加入)-> 需要时 `archive.borrow-car.list` 复核
75
- - 从借阅车发起借阅:`archive.borrow-car.list` 取 `arcDangan` 与 `dataId` -> `archive.flow.borrow-car.prepare` -> 用户确认 -> `.apply` -> 用系统默认浏览器打开返回的流程创建页 URL(仅用户强调内置打开时用 IDE 内置视图)
94
+ - 从借阅车发起借阅:`archive.borrow-car.list` 取 `arcDangan` 与 `dataId` -> `archive.flow.borrow-car.prepare` -> 用户确认 -> `.apply` -> 把流程创建页 URL 以 Markdown 超链接(a 标签)返回,不自动打开浏览器,由客户端决定打开方式
76
95
  - 从检索结果直接发起借阅:`archive.search.run` 取 `id`+`formId` -> `archive.flow.search.prepare` -> 用户确认 -> `.apply` -> 同上默认系统浏览器打开 URL
77
96
  - 续借:`archive.borrow-list.list` 取 `dataId` -> `archive.flow.renew.prepare` -> 用户确认 -> `.apply` -> 同上默认系统浏览器打开 URL
78
97
  - 下载原文:`archive.borrow-list.list` 取 `dataId` -> `archive.borrow-list.download.prepare`(校验未超期且有可下载原文)-> 用户确认 -> `.apply`(轮询打包并落盘)
79
- - 预归档上传:`archive.fonds.list` 取全宗 `id` -> 需要时 `archive.prelib.tree` 取 `treeId` -> `archive.upload.prelib.prepare` -> 用户确认 -> `.apply`
98
+ - 查看我的档案 / 我上传的档案:`archive.prelib.list`(默认即"我上传的电子文件库"数据,不传 treeId 自动取电子文件库节点)
99
+ - 提交整理:`archive.prelib.list` 取行 id -> `archive.prelib.arrange.prepare` -> 用户确认 -> `.apply`(只处理识别成功的数据,必须原样转达服务端 message,见 [`archive-prelib-arrange.md`](references/archive-prelib-arrange.md))
100
+ - 打开档案链接:`archive.prelib.list` 取行 id -> `archive.prelib.open` 生成 `/sp/custom/archive/fileLibEdit?singleMetaId=行id&treeId=节点treeId`(见 [`archive-prelib-open.md`](references/archive-prelib-open.md))
101
+ - 预归档上传:`archive.fonds.list` 取全宗 `id`(**名称字段是 `fonds_name`,不是 `name`/`content`**)-> 需要时 `archive.prelib.tree` 取 `treeId` -> `archive.upload.prelib.prepare` -> `.apply`(用户已给出文件 + 明确全宗即视为已确认,直接上传;全宗未定、有歧义或多节点未指定时必须先问,详见 [`archive-upload.md`](references/archive-upload.md))
102
+ - 查看并识别电子文件库数据:`archive.prelib.list`(取列表与行 `id`)-> 用户勾选 -> `archive.prelib.intelligent.prepare` -> 用户确认 -> `.apply` -> 返回识别任务 `taskId`(异步,不要声称识别完成)
80
103
 
81
104
  ## 执行原则(减少误路由、误重试和无效消耗)
82
105
 
@@ -39,6 +39,20 @@ weaver-work-cli --json archive run archive.borrow-list.detail --input-json '{"da
39
39
  - 表格样式:所有列(表头与内容)居中显示。
40
40
  - 无值列留空或用 `-`;题名过长时截断。
41
41
 
42
+ ## 详情展示(档案题名必须可点击)
43
+
44
+ `archive.borrow-list.detail` 返回的 `details[].arcDangan[]` 每项都带 `name`、`viewPath`、`url`(已拼好环境域名)。
45
+
46
+ 展示借阅明细时,**"档案"列用题名做超链接**(Markdown `[题名](url)`,渲染即 `<a>`),点击在系统里打开该档案:
47
+
48
+ | 档案 | 档号 | 文件日期 | 借阅方式 |
49
+ | :---: | :---: | :---: | :---: |
50
+ | [发文](http://host/sp/custom/archive/archiveView?arcId=...&arcFormId=...) | GXDA-XZ·2025-30-8 | 2025-11-03 | 电子查看、下载 |
51
+
52
+ - 优先用 `url`(含域名,可直接点);`url` 为空时用 `viewPath` 自行拼当前环境域名。
53
+ - `id` 形如 `{档案ID}_{表单ID}`,是内部标识,**不要直接展示**,也不要让用户抄。
54
+ - 同一明细有多条档案时,每条都要带链接;无 `url` 时退回纯文本题名,不要拼半个链接。
55
+
42
56
  ## 字段复用
43
57
 
44
58
  - `dataId` 是借阅单主表 ID,用于查看详情、下载和续借。
@@ -43,6 +43,8 @@ weaver-work-cli --json archive run archive.borrow-list.download.apply --input-js
43
43
  ## 注意
44
44
 
45
45
  - 下载是异步任务,`.apply` 可能持续一段时间;进度只在终端以进度条形式反馈,Agent 不要因为等待就中断并重试。
46
+ - 文件下载接口可能返回 **302 重定向**(跳到文件服务/CDN)。CLI 已对下载请求开启跟随重定向,**不会再把这种 302 误判为登录失效**;若仍报 `session_expired`,才是真的需要重新登录。
47
+ - 提交打包任务与下载是两个阶段:`batchDownloadBorrowZip`(提交)→ 轮询进度 → `file/remotedownload`(取文件)。若提交和轮询都成功、只有最后一步失败,说明是下载环节问题,不要把整个任务重复提交。
46
48
  - 打包完成前中断会浪费一次服务端任务;中断后如需继续,重新执行 `.prepare` 再 `.apply`。
47
49
  - 涉及本地文件写入:下载到的 zip 可能包含敏感档案内容,**必须先提醒用户文件内容会落到本地磁盘并可能进入当前大模型上下文,等待用户明确确认后才执行 `.apply`**。
48
50
  - `exportType=0`(直接导出)时其余三个分组字段必须为空;`exportType=1` 时按结构补齐分组字段,字段取值只能取档案基础字段候选。
@@ -41,6 +41,6 @@ weaver-work-cli --json archive run archive.flow.renew.prepare --input-json '{"da
41
41
  ## 注意
42
42
 
43
43
  - `.prepare` 会检查是否绑定借阅流程;未绑定时返回 `validation/borrow_flow_unbound`,应提示联系管理员在档案设置中绑定借阅流程,不要重试。
44
- - `.apply` 返回的是**流程创建页 URL**,CLI 不自动打开浏览器。Agent 拿到 URL 后**默认用系统默认浏览器打开**供用户填写提交(macOS `open`,Windows `start`),除非用户明确要求“在 IDE 内置浏览器打开”;不要声称“已发起借阅申请”。
44
+ - `.apply` 返回的是**流程创建页 URL**,CLI 不自动打开浏览器,**Agent 也不要自动打开**(不要执行 `open` / `start`)。把 URL 作为 **Markdown 超链接**返回,例如 `[填写并提交](URL)`(渲染即 `<a>` 标签),由客户端/用户自行决定打开方式(内置浏览器、系统浏览器或复制链接)。不要声称“已发起借阅申请”。
45
45
  - 从借阅车发起会缓存档案与借阅车两组参数(两次缓存写入),从检索结果发起只缓存档案,续借不缓存。
46
46
  - URL 中的缓存参数由服务端生成,Agent 不要手工拼接或改写 URL。
@@ -0,0 +1,76 @@
1
+ # 提交整理(预归档电子文件库)
2
+
3
+ ## 什么时候读取
4
+
5
+ 用户要对电子文件库里的数据做「提交整理 / 整理 / 归档整理」时读取本文件。写操作前也读取共享高风险协议:`../../weaver-e10-shared/references/high-risk-write.md`。
6
+
7
+ ## 链路
8
+
9
+ `archive.prelib.list` 取列表 -> 用户给序号 -> 取 `rows[序号-1].id` -> 提交整理。
10
+
11
+ | 阶段 | Operation | 必填输入 |
12
+ | --- | --- | --- |
13
+ | 准备 | `archive.prelib.arrange.prepare` | `checkIds`;可选 `treeId`、`formId` |
14
+ | 提交 | `archive.prelib.arrange.apply` | `continuation`、`confirm=true` |
15
+
16
+ Windows PowerShell:
17
+
18
+ ```powershell
19
+ weaver-work-cli --json archive run archive.prelib.arrange.prepare --input-json '{"checkIds":["1313909785262178418"]}'
20
+
21
+ weaver-work-cli --json archive run archive.prelib.arrange.apply --input-json '{"continuation":"PREPARE_CONTINUATION","confirm":true}'
22
+ ```
23
+
24
+ macOS/Linux(bash/zsh):
25
+
26
+ ```bash
27
+ weaver-work-cli --json archive run archive.prelib.arrange.prepare --input-json '{"checkIds":["1313909785262178418"]}'
28
+
29
+ weaver-work-cli --json archive run archive.prelib.arrange.apply --input-json '{"continuation":"PREPARE_CONTINUATION","confirm":true}'
30
+ ```
31
+
32
+ ## 前置参数
33
+
34
+ - `checkIds` 取 `archive.prelib.list` 返回 `rows[n].id`(该列 `hide=true` 不展示),**按用户给的序号取,不要让用户抄 id**。
35
+ - `treeId` 取 `archive.prelib.tree` 的电子文件库节点 `id`;不传时自动取第一个节点。
36
+ - `formId` 不传时取 `getTreeDetail` 的 `extraParams.metaFormId`。
37
+
38
+ ## 接口
39
+
40
+ `POST /api/archive/core/prefileBatch/batchSave`(无 query 参数)
41
+
42
+ ```json
43
+ {
44
+ "treeId": "1229705529974292495_1229705529974292495",
45
+ "autoBatchProduct": true,
46
+ "formId": "1042286248190812199",
47
+ "checkIds": "1330598993225465906",
48
+ "logFlag": "preLib"
49
+ }
50
+ ```
51
+
52
+ 与智能识别 `intelligentCate` **完全同参**,只多一个 `autoBatchProduct: true`。
53
+
54
+ ## 提交前:只有「已识别」的数据会被处理
55
+
56
+ - 提交整理**只处理识别状态为「已识别」**的数据;**未识别、识别中、识别异常**的行会被服务端**自动过滤掉**。
57
+ - 所以提交前先看列表的 `read_state`:若不是"已识别",**先提示用户**——这些行提交了也不会被处理,建议先做智能识别并确认识别成功(可再查一次列表确认状态变为"已识别")。
58
+ - 用户仍要提交也可以提交:**后台会过滤,不会报错**,但必须如实转达服务端 `message`,并说明实际处理了 0 条。
59
+
60
+ ## 关键:不要声称"整理完成"
61
+
62
+ - 该接口**只处理识别成功的数据**;未识别、识别异常的行会被跳过。
63
+ - 响应**没有 `data`**,处理说明在顶层 `msg`,例如:
64
+
65
+ ```
66
+ 选中1条数据包含1条异常数据,系统仅处理0条识别成功的数据!
67
+ ```
68
+
69
+ - 必须把 `message` **原样转达**给用户,不要说"已整理完成"。
70
+ - 若处理条数为 0(全是未识别/异常),要提示用户先做**智能识别**,识别成功后再提交整理。
71
+
72
+ ## 注意
73
+
74
+ - 提交整理是**写操作**:必须先 `prepare`、用户明确确认后才 `apply`,不要自动补 `confirm=true`。
75
+ - 任一步失败直接报错,不要自动重放 `.apply`。
76
+ - 未拿到 `treeId`(预归档树返回空)时按 [`archive-prelib-list.md`](archive-prelib-list.md) 的"获取不到节点"规则处理:重新获取一次 -> 仍无则判无权限并停止,**不要猜测 treeId**。