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
@@ -1,17 +1,37 @@
1
1
  {
2
2
  "schemaVersion": 3,
3
+ "generalRules": {
4
+ "description": "通用规则区(2026-11-03):不与任何工作流绑定的全局行为定义;旧版本 CLI 忽略本区块。后续新的通用规则以新键扩展(预留)。",
5
+ "priorityGroup": {
6
+ "description": "第一分组「建议优先处理的流程」的入选规则(叠加视图,入选条目仍保留在原工作流分组)。",
7
+ "title": "建议优先处理的流程",
8
+ "rules": [
9
+ "overdue",
10
+ "levelFallback"
11
+ ],
12
+ "rulesNote": "overdue=已超时(overTime/userOverTime 判定,与紧急程度无关);levelFallback=紧急程度降级链(有 2 取 2,无 2 取 1,全 0 不因等级入选)。预留:expiringToday(今天到期)等后续扩展,未启用。"
13
+ }
14
+ },
3
15
  "defaults": {
4
16
  "weight": 999,
5
17
  "needSummary": true,
6
- "requestSummaryPrompt": "",
18
+ "requestSummaryPrompt": "根据流程详情信息,简单摘要核心内容,无需过度思考,追求极致速度。",
7
19
  "summaryMaxChars": 150,
8
20
  "groupSummaryMaxChars": 100,
9
- "groupSummaryTail": "可展开逐条查看或直接汇总处理"
21
+ "groupSummaryTail": "可展开逐条查看或直接汇总处理",
22
+ "excludeOriginFormDataFields": []
10
23
  },
11
24
  "rules": [
12
25
  {
13
- "workflowName": ["客户问题支持"],
26
+ "workflowName": [
27
+ "客户问题支持"
28
+ ],
14
29
  "weight": 100,
30
+ "requestSummaryPrompt": "根据以下模板进行摘要:{总结问题描述} 【{完结状态}】【{客户名称}】",
31
+ "excludeOriginFormDataFields": [
32
+ "备案环境",
33
+ "推荐答案"
34
+ ],
15
35
  "aiGroup": {
16
36
  "groupSummary": {
17
37
  "needAI": false,
@@ -21,34 +41,78 @@
21
41
  "focus": true,
22
42
  "sysArg": true,
23
43
  "aiContext": "流程详情",
24
- "focusKeyword": [["planFinishDatetime", "小于等于", "今天"]],
44
+ "focusKeyword": [
45
+ [
46
+ "planFinishDatetime",
47
+ "小于等于",
48
+ "今天"
49
+ ]
50
+ ],
25
51
  "groupTitle": "已过期及今天即将过期的流程"
26
52
  }
27
- }
53
+ },
54
+ "summaryRequiredFields": [
55
+ "【",
56
+ "】"
57
+ ]
28
58
  },
29
59
  {
30
- "workflowName": ["满意度", "满意调查", "评价调查", "服务评价", "问卷调查"],
60
+ "workflowName": [
61
+ "满意度",
62
+ "满意调查",
63
+ "评价调查",
64
+ "服务评价",
65
+ "问卷调查"
66
+ ],
31
67
  "weight": 200,
32
68
  "needSummary": false
33
69
  },
34
70
  {
35
- "workflowName": ["内部留言", "内部消息", "留言板", "意见建议"],
71
+ "workflowName": [
72
+ "内部留言",
73
+ "内部消息",
74
+ "留言板",
75
+ "意见建议"
76
+ ],
36
77
  "weight": 300,
78
+ "requestSummaryPrompt": "根据流程详情信息(非流程标题信息),言简意赅,禁止过度思考,追求极致速度,不追求摘要质量。",
37
79
  "aiGroup": {
38
80
  "groupSummary": {
39
81
  "needAI": true,
40
82
  "prompt": "用不超过 {{maxChars}} 字概括本组留言:主题集中在哪些事项、主要由谁发起、有无需要优先处理的。只使用给定上下文,不要编造。"
41
83
  },
42
- "groupRule": {
43
- "focus": false,
44
- "aiContext": "流程标题",
45
- "groupingPrompt": "按留言主题归类,组名只允许这七个:产品更新与发布、案例与方案分享、培训与课程通知、周报与月报、制度与流程提醒、测试与验证数据、其他通知。每条只归一组,不得新造组名;判断不出主题的放「其他通知」。"
46
- }
84
+ "groupRule": {
85
+ "focus": false,
86
+ "aiContext": "流程标题",
87
+ "groupingPrompt": "按留言主题归类,组名只允许这七个:产品更新与发布、案例与方案分享、培训与课程通知、周报与月报、制度与流程提醒、测试与验证数据、其他通知。每条只归一组,不得新造组名;判断不出主题的放「其他通知」。"
88
+ }
47
89
  }
48
90
  },
49
91
  {
50
- "workflowName": ["请假", "休假", "年假", "调休", "病假", "事假", "婚假", "产假", "陪产", "丧假", "探亲假", "工伤假", "哺乳假", "公休"],
92
+ "workflowName": [
93
+ "请假",
94
+ "休假",
95
+ "年假",
96
+ "调休",
97
+ "病假",
98
+ "事假",
99
+ "婚假",
100
+ "产假",
101
+ "陪产",
102
+ "丧假",
103
+ "探亲假",
104
+ "工伤假",
105
+ "哺乳假",
106
+ "公休"
107
+ ],
51
108
  "weight": 400,
109
+ "requestSummaryPrompt": "根据以下模板进行摘要:{申请人}于{起始时间}开始,请假:{请假天数}天,请假事由:{对:【请假原因】进行总结} ",
110
+ "excludeOriginFormDataFields": [
111
+ "契约锁人员所有上级",
112
+ "所有上级",
113
+ "年假提示",
114
+ "假期余额"
115
+ ],
52
116
  "aiGroup": {
53
117
  "groupSummary": {
54
118
  "needAI": false,
@@ -58,14 +122,40 @@
58
122
  "focus": true,
59
123
  "sysArg": false,
60
124
  "aiContext": "流程详情",
61
- "focusKeyword": [["请假天数", "小于等于", 1]],
125
+ "focusKeyword": [
126
+ [
127
+ "请假天数",
128
+ "小于等于",
129
+ 1
130
+ ]
131
+ ],
62
132
  "groupTitle": "1天以内"
63
133
  }
64
- }
134
+ },
135
+ "summaryRequiredFields": [
136
+ "请假:",
137
+ "请假事由"
138
+ ]
65
139
  },
66
140
  {
67
- "workflowName": ["报销", "费用", "付款", "请款", "借款", "发票", "差旅", "对公", "资金", "核销"],
141
+ "workflowName": [
142
+ "报销",
143
+ "费用",
144
+ "付款",
145
+ "请款",
146
+ "借款",
147
+ "发票",
148
+ "差旅",
149
+ "对公",
150
+ "资金",
151
+ "核销"
152
+ ],
68
153
  "weight": 500,
154
+ "requestSummaryPrompt": "根据流程详情进行摘要总结,需要以下几个要素:1、申请人 2、费用说明 3、人民币金额+币种 ",
155
+ "excludeOriginFormDataFields": [
156
+ "发起人所有上级",
157
+ "承担人所有上级"
158
+ ],
69
159
  "aiGroup": {
70
160
  "groupSummary": {
71
161
  "needAI": false,
@@ -75,13 +165,70 @@
75
165
  "focus": true,
76
166
  "sysArg": false,
77
167
  "aiContext": "流程详情",
78
- "focusKeyword": [["报销金额", "小于等于", 100]],
168
+ "focusKeyword": [
169
+ [
170
+ "报销金额",
171
+ "小于等于",
172
+ 100
173
+ ]
174
+ ],
79
175
  "groupTitle": "100元以内"
80
176
  }
81
- }
177
+ },
178
+ "summaryRequiredFields": [
179
+ "人民币"
180
+ ]
181
+ },
182
+ {
183
+ "workflowName": [
184
+ "产品开发计划制定及任务跟踪(e-todo)"
185
+ ],
186
+ "weight": 600,
187
+ "requestSummaryPrompt": "根据流程详情进行摘要总结,需要以下几个要素:1、需求编号 2、预计发布日期 3、任务总负责人 4、预估开发总人天 5、需求概述(简要总结下)",
188
+ "excludeOriginFormDataFields": [
189
+ "子任务名称",
190
+ "原型/效果图",
191
+ "技术实现思路",
192
+ "需求文档",
193
+ "关联需求"
194
+ ],
195
+ "summaryRequiredFields": [
196
+ "需求编号",
197
+ "预计发布日期",
198
+ "任务总负责人",
199
+ "预估开发总人天"
200
+ ]
201
+ },
202
+ {
203
+ "workflowName": [
204
+ "安全问题处理工单"
205
+ ],
206
+ "weight": 700,
207
+ "requestSummaryPrompt": "根据以下模板进行摘要:漏洞文件:{漏洞地址的文件(完整的文件,不能去掉数据库方言)及行号,行号是指地址最后的L{数字}-L{数字}} 漏洞类型:{漏洞类型} 最晚完成时间:{最晚完成日期}",
208
+ "excludeOriginFormDataFields": [
209
+ "修复方案"
210
+ ],
211
+ "aiGroup": {
212
+ "groupSummary": {
213
+ "needAI": true,
214
+ "prompt": "{【漏洞地址】中的git地址指向的文件,如果是mapper,去掉_oracle这种数据库方言},共:{组内数量}条"
215
+ },
216
+ "groupRule": {
217
+ "focus": false,
218
+ "aiContext": "流程详情",
219
+ "groupingPrompt": "按照【漏洞地址】中的git地址指向的文件(如果是mapper,去掉_oracle这种数据库方言),进行分组"
220
+ }
221
+ },
222
+ "summaryRequiredFields": [
223
+ "漏洞文件",
224
+ "漏洞类型",
225
+ "最晚完成时间"
226
+ ]
82
227
  },
83
228
  {
84
- "workflowName": ["*"],
229
+ "workflowName": [
230
+ "*"
231
+ ],
85
232
  "weight": 999
86
233
  }
87
234
  ]
@@ -6,14 +6,14 @@
6
6
 
7
7
  > **⚠️ 2026-10-28 起:分组规则已外置到 JSON,代码不再按业务类型分支。**
8
8
  > 唯一真源是 `skills/weaver-e10-workflow/aigroup/default.json`(`{defaults, rules[]}`,随 skill 分发、只读),用户意图另存 **CLI 状态目录**下的 `aigroup/user-intents.json`(`aigroup set` 写入,不落 skill 目录)。
9
- > 现行规则要点:①没有 `aiGroup` ⇒ 全平铺;②`focus:true` ⇒ 按 `focusKeyword`(`[指标, 算子, 值]`,十种算子)确定性成一组,`groupTitle` 为组名,`sysArg` 指明指标取自列表属性还是流程详情;③`focus:false` ⇒ `aiContext`(流程标题/流程详情)交 AI 分组,**必须**给 `aiGroups`;④`focus:true` 收到多个计划子组时**只保留条数最多的一个**,其余平铺;⑤`aiGroups.seq` 已删除,只认 `requestIds`;⑥组摘要 `groupSummary.needAI:false` 时由 CLI 按 JSON `template` 渲染,`true` 时交 AI;⑦单条摘要由 `needSummary` 决定(false ⇒ 用标题);⑧`focus:false` 还可给 `groupingPrompt`(二次分组口径,见下节)。
9
+ > 现行规则要点:①没有 `aiGroup` ⇒ 全平铺;②`focus:true` ⇒ 按 `focusKeyword`(`[指标, 算子, 值]`,十种算子)确定性成一组,`groupTitle` 为组名,`sysArg` 指明指标取自列表属性还是流程详情;③`focus:false` ⇒ `aiContext`(流程标题/流程详情)交 AI 分组,**必须**给 `aiGroups`;④`focus:true` 收到多个计划子组时**只保留条数最多的一个**,其余平铺;⑤`aiGroups.seq` 已删除,只认 `requestIds`;⑥组摘要 `groupSummary.needAI:false` 时由 CLI 按 JSON `template` 渲染,`true` 时交 AI;⑦单条摘要由 `needSummary` 决定(false ⇒ 用标题);⑧`focus:false` 还可给 `groupingPrompt`(二次分组口径,见下节);⑨**`summaryRequiredFields`(要素级交付闸门,2026-11-01)**:规则声明的关键字清单,本组每条摘要必须逐项包含,缺任一项 ⇒ 导出闸门 `exit 1`(见 §6.1)。
10
10
 
11
11
  **`groupingPrompt`(2026-10-29 新增,schemaVersion 3)**
12
12
  - 位置 `aiGroup.groupRule.groupingPrompt`,**只在 `focus:false` 时有意义**;`focus:true` 给它会直接校验失败。可选,不给就按素材自由分组。
13
13
  - 分工:`aiContext` 决定**看什么**(是否预取流程详情),`groupingPrompt` 决定**怎么切**(组名词表、归属规则)。
14
14
  - 下发方式:`collect` 会把该字段原样放进 `groupingBrief[].groupingPrompt`,`smartGroup` 的 `ai_groups_required` 报错文案也会带上。**模型生成 `aiGroups` 前必须先读它并照做**(组名只能取它给的词表,不得新造)。
15
15
  - 限制:非空字符串、≤500 字(会原样进模型上下文)。
16
- > 下面各节是按类型描述的**历史口径**,仅作背景参考;与本节冲突时以本节与 `default.json` 为准。
16
+ > 本文档只描述**机制与执行规则**(aiGroups 格式与校验、子组解散/平铺机制、意图判定、素材与缓存、交付形态);**分组阈值、组名词表、摘要模板、排除清单等业务口径一律以 `aigroup/default.json` 为准**(`prep`/`build` 输出会回显相关内容),与本文冲突时以 JSON 为准。
17
17
 
18
18
 
19
19
 
@@ -79,6 +79,11 @@ collect
79
79
  ### 取数
80
80
 
81
81
  - 默认 `category=todo`,只调用对应分类的列表接口;待办接口为 `getTodoListData`。collect 不调用总数、分组统计或详情接口。
82
+ - **小分类 / tabid(2026-11-02)**:用户明确提到小分类词(待处理 / 待阅 / 超时 / 未读 / 被退回 / 草稿 / 抄送 / 转发 / 传阅 / 关注 / 被督办 / 被转办 / 新反馈 / 已查阅)时,`prep`/`run` 传 `--sub-category <词>` 或 `--tabid <tabid>`(等价入口,**显式 tabid 优先**)。todo 词表:全部=0、待处理=7、未读=1、新反馈=2、已查阅=3、待阅=5、超时=6、被退回=8、转发=4、传阅=11、抄送=9、关注=10、被督办=12、被转办=13、草稿=14。用户未表达小分类时**不要传**(默认 tabid=0 = 全部待办,保住「汇总下待办 = 全量」的历史语义)。小分类与时间范围(`--days`/`--from`/`--to`)可叠加:接口先按 tab 圈定、再按时间过滤。**此参数只影响汇总取数**,`workflow.search` 等链路不受影响。
83
+ - **isremarks(2026-11-02,词表已按 wfc_operate.isremark 补齐)**:待办**参与身份**筛选,多个 code 用英文逗号拼接(如 `0,2,20`),放 `getTodoListData` 的 **`params` 层**;`prep`/`run` 传 `--isremarks`,多值取**并集**。**仅汇总链路生效**——注入点在 todoSmartConvert 的 collect 内部,`workflow.search` 的代码路径与 schema 均未改动。词表:`0`=节点操作者、`1`=节点操作者(代理)、`2`=节点协办人、`5`=超时指定干预人、`6`=超时指定干预人(代理)、`7`=异常处理指定干预人、`8`=异常处理指定干预人(代理)、`10`=意见征询接收人、`11`=意见征询接收人(代理)、`20`=传阅接收人、`21`=传阅接收人(代理)、`30`=抄送需反馈、`31`=抄送需反馈(代理)、`33`=抄送协办人、`40`=转发接收人、`41`=转发接收人(代理)、`50`=协办人、`60`=传阅接收人无需反馈、`61`=传阅接收人无需反馈(代理)、`70`=抄送无需反馈、`71`=抄送无需反馈(代理)、`80`=转发接收人无需反馈、`81`=转发接收人无需反馈(代理)。实测(近一年):`0`→54 条(节点操作者,当前待办的绝对主体),传阅/协办/抄送类身份→0 条;**不传 = 不过滤**(tabid 圈定的全部)。典型用法:「汇总下需要我反馈的抄送」→ `--isremarks 30,31`(抄送需反馈)。
84
+ - **标题摘要模式(2026-11-03 用户定稿)**:内部留言、公司重要通知、安全问题处理工单、产品开发计划制定及任务跟踪(e-todo)、E10项目版本发布申请流程 五类 `needSummary:false`(摘要=流程标题,**不取详情、不进模型**);安全问题/内部留言的 `aiContext` 改为「流程标题」(分组仍按标题分桶,模型 1 轮);e-todo 与安全工单的 `summaryRequiredFields` 已删除(标题模式下要素校验会误拦)。收益:单条摘要 282→0 条进模型、素材 194KB→~10KB、详情取数 -93%,冷缓存全量 35 分钟 → **2 轮模型往返(约 1 分钟)**。备份:`/tmp/aigroup-default-backup-20261103.json`(改前快照,含 generalRules)。
85
+ - **通用规则区 `generalRules`(2026-11-03)**:default.json 顶层可选区块(与具体工作流无关的全局行为;schemaVersion 仍为 3,旧版本 CLI 忽略)。当前仅启用 **`priorityGroup`**——第一分组标题与入选规则(`overdue` 已超时 / `levelFallback` 紧急程度降级链;预留 `expiringToday` 未启用)。`identityFilter`(默认排除抄送类身份)已于 11-03 下午移除:汇总默认**包含**抄送数据,需要排除时由调用方显式传 `--isremarks`(非抄送 18 码白名单见 git 历史/本文件 §2 词表)。后续新的通用规则以新键扩展(预留)。
86
+ - **空结果文案(2026-11-03 用户定稿)**:collect 取到 0 条(或排除条件滤光)时,`prep`/`run` **不进 build**(CLI 会抛 `items_empty`),直接以 `exit 0` 输出用户文案并结束——①无任何显式限制条件 ⇒ 「您当前没有待办。」;②带显式限制条件(时间范围/小分类/tabid/参与身份/排除清单/侧重点)⇒ 「您当前没有符合条件的待办,可以尝试调整限制数据的范围后重试。(当前条件:…)」并回显命中的条件。执行方原样转述即可,**不要自动放宽范围重查**。
82
87
  - 时间范围一次传入,通过 `current` 递增翻页。默认 `limit=200`,最大 `limit=500`;单页最多 100 条,最多 5 页。`pageSize` 是兼容参数,实际大小由 `limit` 推导。
83
88
  - 达到 limit、页内没有新增数据或返回空页时停止;跨页按 `requestId` 去重。超过上限会在 warnings 中说明。
84
89
  - 只使用响应中的 `displayData`,不把技术行当作回退数据。长 ID 始终按字符串处理。
@@ -88,11 +93,26 @@ collect
88
93
  ### 详情和缓存
89
94
 
90
95
  - 详情请求固定使用 `isReadRequest:false`,默认并发 10、单条超时 10 秒;单条失败不会拖垮整批。
91
- - 详情字段先清洗 HTML/CSS,再应用业务字段规则;正文全量传给模型,不做固定字数截断。
92
- - **两个持久化缓存**,key 都是 `requestId__lastFeedBackDateTime`,有效期 7 天、清理间隔 3 天:
93
- - 详情缓存:正文 / 阈值指标 / 分组字段,**详情为空也写**;
94
- - 摘要缓存:单条摘要文本。
95
- 记录里带 `lastFeedBackDateTime` 就是为了这个 key:**流程有新反馈 ⇒ key 变 ⇒ 缓存自然失效**,不需要另设版本号。
96
+ - **详情素材口径(2026-10-30 用户定稿,取代旧 selectSummaryFields 投影)**:只取接口返回的
97
+ `formData` + `basicInfo` 两块——
98
+ 1. 分发字段(`主送/抄送` 家族)无条件丢弃;内部留言类只留 `留言内容/发起人/发起时间`;
99
+ 2. 再按 aigroup JSON 的 **`excludeOriginFormDataFields`**(字段名清单,fieldName 精确匹配,
100
+ 两侧先做归一防排版差异)剔除;规则级可覆盖 defaults,显式 `[]` 可清空;
101
+ 3. 剔除后**最多保留 200 个字段**(取前 200 个),**单值超过 500 字只保留前 500 字**;
102
+ 4. `basicInfo` 保留但**剔除 `requestTitle` / `flowName` 两个标题类字段**(2026-11-01 用户定稿:
103
+ 给 AI 的素材与本地缓存都不允许出现——标题在素材里会诱导"按标题写摘要"与"标题未体现"类降级话术;
104
+ 标题本身由列表行 `requestNameTitle` 承载,素材里不需要);
105
+ 5. 缓存与喂模型的形态统一为 `fieldName:value`(逐行),basicInfo 的键值同样按 `key:value` 放在最前。
106
+ - **两个持久化缓存**,key 都是 `requestId__lastFeedBackDateTime`,有效期 7 天、清理间隔 3 天,
107
+ 位置固定取**当前 skill 自己的 `cache/`**(2026-11-01 用户定稿):`tools/todo-summary.cjs` 会把
108
+ 自身所在 skill 目录经 `WEAVER_WORK_CLI_SKILL_DIR` 显式指给 CLI,缓存与 aigroup 规则都锚定它;
109
+ 设了 `WEAVER_WORK_CLI_CACHE_DIR` 则仍以它为最高优先;CLI 裸调(不经脚本)时才走多安装发现排名:
110
+ - 详情缓存(条目格式 v3):过滤后的 formData 字段 / basicInfo(已剔除标题类字段)/ 阈值指标 / `excludeTag`,
111
+ **详情为空也写**;旧版本条目(v2 及更早,basicInfo 里还带标题)读取时视为无效,自动重拉;
112
+ `excludeOriginFormDataFields` 变了 ⇒ `excludeTag` 对不上 ⇒ 旧条目自动失效重拉(与摘要缓存的 pk 机制同思路);
113
+ - 摘要缓存:单条摘要文本。条目除 `maxChars`/`pk`(口径)外还带 **`dv`(详情素材特征值,2026-11-01 根治)**:写入时对当前详情素材(basicInfo+fields 内容哈希)取特征值,读取时与当前素材比对——素材升级/排除清单调整/详情缓存被清(无法核验)⇒ 旧摘要失效重写;无 `dv` 的旧条目按旧规则兼容命中。
114
+ **失效条件(2026-11-02 用户定稿):只由 `requestSummaryPrompt`(default.json / 用户意图)调整触发**——①条目缺 `pk` = 旧口径条目,**兼容命中**(无法证明口径变过就不作废);②`maxChars` 仅在用户显式传 `--summary-chars` 时参与比对,规则/默认字数变化(如 50→150)**不作废**历史摘要;③`dv` 仍比对素材变化。对照实测:修复前 285 条旧口径条目全 miss(冷缓存 35 分钟级),修复后同数据集 `prefilled=312|待写 0`。
115
+ 记录里带 `lastFeedBackDateTime` 就是为了这个 key:**流程有新反馈 ⇒ key 变 ⇒ 缓存自然失效**。
96
116
  - 详情取数时机:`collect` 只为「用户给了 `groupFocus` 且意图适用于本组」的组预取字段;`smartGroup` 对全部条目走一次「缓存优先」的取数(命中零请求)。因此**冷缓存下详情请求集中在 `smartGroup`,`summary` 阶段通常 0 请求**。
97
117
  - 摘要缓存**只省 AI、不省详情**:阈值指标只认流程详情数据,所以命中摘要的条目仍会查一次详情缓存;摘要为空的条目用标题兜底。
98
118
 
@@ -102,36 +122,38 @@ collect
102
122
  - 优先组固定为 `id=priority`、标题“建议优先处理的流程”,排在第一位。超时条目必入;没有级别 2 时才使用级别 1,级别 0 不因等级入选。
103
123
  - 优先组是**叠加视图**,不是筛选:入选条目**仍保留在各自的工作流分组里**(优先组只是置顶入口)。因此 `Σcount` 会大于 `totalCount`,**`totalCount` 一律按去重条数计(= collect 取到的全部条数),不做分组求和**。
104
124
  - 普通组保持接口返回的首次出现顺序。只有调用方明确给出排序意图时才传 `groupOrder`;`topN` 只影响中间 Markdown,不裁剪最终数组。
105
- - `groupingBrief` 用组内 1-based `idx` 标识条目。AI 生成 `aiGroups` 时优先用 `seq`,不要手抄长 `requestId`。
125
+ - `groupingBrief` 用组内 1-based `idx` 标识条目;`idx` 与 `prep` 输出目录 `state.json` 里 `planGroups[].rows[].requestId` 一一对应。生成 `aiGroups` 时一律用 `requestId`:需要映射就从 `state.json` 一次性提取,不要手抄,更不要用 `seq`(已废弃)。
106
126
 
107
127
  ## 4. `smartGroup` 和 `aiGroups`
108
128
 
109
- `aiGroups` 是扁平数组,每项只允许 `groupId`、`title`、`requestIds` 或 `seq`:
129
+ `aiGroups` 是扁平数组,每项只允许 `groupId`、`title`、`requestIds` 三个键(**`seq` 已废弃**:传入即报 `aiGroups 元素必须是 {groupId,title,requestIds:[...]}(seq 已废弃)`,2026-11-02 起文档统一只给 `requestIds` 写法):
110
130
 
111
131
  ```json
112
132
  [
113
- { "groupId": "workflow-id", "title": "安全通知", "seq": [1, 3] },
114
- { "groupId": "workflow-id", "title": "制度通知", "seq": [2, 4] }
133
+ { "groupId": "workflow-id", "title": "安全通知", "requestIds": ["101", "103"] },
134
+ { "groupId": "workflow-id", "title": "制度通知", "requestIds": ["102", "104"] }
115
135
  ]
116
136
  ```
117
137
 
118
- - `requestIds` 与 `seq` 二选一,不能同时出现,也不能都为空。
138
+ - `requestIds` 必填且非空,成员必须属于本组;未知 `groupId`、未知 `requestId`、重复分配直接失败。
119
139
  - 优先组不可二次分组。
120
140
  - 组内少于 3 条时**一律平铺单条**,不产生任何汇总项——阈值组(1天以内 / 100元以内)、问题支持过期组、内部留言整组都不例外;**即使给了 `aiGroups` 也忽略**(CLI 写 warning)。这条是硬门槛,没有例外。
121
- - 组内至少 3 条时,完全省略 `aiGroups` 走 CLI 确定性分组;显式传入后,未知 `groupId`、未知 `requestId`、重复分配和越界序号直接失败(**仅在本组计划会被采纳时校验**:意图适用于本类型,或本组是内部留言)。
122
- - `aiGroups` 不是必填,**而且只有两种情形该给**:
141
+ - **计划子组不足 2 条会被解散平铺**(CLI 写 warning「N 个子组不足 2 条,已解散」)——这是机制行为,与上一条相互独立:若 `groupingPrompt` 的自然粒度每组只有 1 条(如 安全问题处理工单 按 git 文件,11 条对应 11 个文件),按它给的计划会全部解散、整组平铺,**这是该计划的必然结果,不是错误**;要真正成组,就得按能凑够每组 ≥2 条的粒度给计划(如按文件族),且组名仍必须来自 `groupingPrompt` 口径、**不得为凑组虚构更粗粒度的新组名**(如"XML/Java 文件类型")。
142
+ - 组内至少 3 条时,完全省略 `aiGroups` 走 CLI 确定性分组;显式传入后,未知 `groupId`、未知 `requestId`、重复分配直接失败(**仅在本组计划会被采纳时校验**:意图适用于本类型,或本组是内部留言)。
143
+ - `aiGroups` 何时该给——**三种情形**(`prep` 输出会给组标 `[必须给 plan]`,照标注执行即可):
123
144
  - ① 用户给了侧重点(`groupFocus`),且侧重点**按意图表适用于本组类型**;
124
- - ② 本组是**内部留言** —— 而且**≥3 条时是必须给**:没有侧重点(或侧重点不适用)就按**流程标题**分组,缺计划直接报 `ai_groups_required`。
145
+ - ② 本组是**内部留言** —— 而且**≥3 条时是必须给**:没有侧重点(或侧重点不适用)就按**流程标题**分组,缺计划直接报 `ai_groups_required`;
146
+ - ③ 规则里 `aiGroup.groupRule.focus === false` 的组(如 **安全问题处理工单**,上下文=流程详情)——**≥3 条时必须给**,缺计划同样报 `ai_groups_required`。这类组的分组素材(如漏洞地址里的 git 文件)来自流程详情,prep 无侧重点时不带字段注记 ⇒ 按 references 上文的「单条查询详情」兜底取得,**不要用标题推断**。
125
147
  其他类(`other`)在无侧重点时**不要给**:给了也会被忽略,且该组**全部平铺单条**(会写 warning);请假/财务/客户问题支持按各自的阈值 / 过期规则分,不需要计划。
126
148
  - **意图按表判定,不是「随便一句中文都算」**(`INTENT_RULES`):专属意图(请假维度 / 财务维度 / 问题支持维度)只作用于对应类型;通用意图(客户 / 发起人 / 时间 / 紧急 / 标题主题 / 类型…)只作用于内部留言与其他类。意图不适用于本组时,CLI 按「没有意图」处理并写 warning,**不会硬失败**。
127
149
  - 意图适用于本组、却没给本组计划 ⇒ 按「没有意图」处理(确定性规则),不再报 `ai_groups_missing_group`。
128
150
  **例外:内部留言 ≥3 条没有这个退路**——必须给计划(按标题或按侧重点),缺计划报 `ai_groups_required`,并把可用 `groupId` 与 `1..N` 序号回传。
129
151
  - 无 `groupFocus` 时,子组按条数降序;有 `groupFocus` 时,子组沿用 AI 数组顺序。侧重点只作用于匹配的业务类型。
130
- - 请假类和财务类在无侧重点时使用 CLI 阈值兜底:分别合并不超过 1 天、不超过 100 元的条目,其余单条;**指标只取流程详情字段**,取不到就平铺并点名,不猜。
152
+ - 请假类和财务类在无侧重点时使用 CLI 阈值兜底:把符合阈值口径的条目合并成一个汇总项,其余单条——**阈值数字(多少天/多少元)不在此文档维护,以 `default.json` 对应规则的 `focusKeyword` 为准**;**指标只取流程详情字段**,取不到就平铺并点名,不猜。
131
153
  - **阈值分组与「传不传 `aiGroups`」无关**:只要本组没拿到生效计划、且没有匹配的侧重点,就始终按阈值分组。阈值组的 `summary` 由 CLI 固定生成,即使本轮传了 `aiGroups` 也不会留空——**不要把阈值组当成需要 AI 写摘要的组**。
132
- - `1天以内` / `100元以内` 是**保留标题**:模型把它们当子组名时,CLI 会逐条核阈值,超阈值的条目被剔出、按单条展示并写 warning。
133
- - **客户问题支持类**(`workflowName` **精确等于** `Ecology客户问题支持解决流程` / `E10客户问题支持解决流程`,不含 new / 明细 / 重庆机构 / FWSX-老客户):
134
- - **无侧重点**:CLI 固定产出一个汇总项「已过期及今天即将过期的流程」(判定 `overdue || expiringToday`),其余按单条展示;**一条都没命中就不产这个子组**,全部单条。
154
+ - 阈值组的**保留标题**(如"1天以内"/"100元以内",取自 `default.json` 规则的 `groupTitle`):模型把它们当子组名时,CLI 会逐条核阈值,超阈值的条目被剔出、按单条展示并写 warning。
155
+ - **客户问题支持类**(流程名清单以 `default.json` 对应规则的 `workflowName` 为准):
156
+ - **无侧重点**:CLI 按 `default.json` 该规则的口径(`focusKeyword` 的过期/今日到期判定 + `groupTitle`)产出一个固定汇总项,其余按单条展示;**一条都没命中就不产这个子组**,全部单条。
135
157
  - **有侧重点**:`collect` 会为这类流程额外拉一次详情,把字段键值放进 `groupingBrief.items[].fields`(最多 8 个字段、每个值截 80 字),模型按意图指向的字段值分桶(如"按问题小分类"→ 用 `问题所属模块` 的取值做子组名)。
136
158
  - `groupingBrief.items[]` 带 `overdue` / `expiringToday` / `userOverTime`,**不要自己解析「11-30到期」这类文案**。
137
159
  - **默认不二次分组**:没有生效计划时,只有两类会产汇总项——请假/财务的阈值组、客户问题支持类的过期组;**其他一律平铺单条**,不造「与父组同名」的整组汇总项,也**不造 `other`**。满意度类全单条,`summary` 用条目标题兜底(不调 AI、不为空)。AI 路径的漏分、子组只剩 1 条、保留标题里超阈值的条目,**一律落成单条**(不丢数据)并写 warnings。
@@ -173,6 +195,10 @@ collect
173
195
  - `summaryContext` 输出 `summaryBatches`,每个批次带组信息、条目标题、清洗后的 `context` 和 `contextAvailable`。
174
196
  - 批次不跨组;默认按 24,000 字或 100 条切分。摘要默认建议 50 字,可用 `summaryMaxChars` 覆盖。
175
197
  - 调用方只提交本轮有效的 `aiSummaries:[{requestId,summary}]`。未知或重复 ID 失败;漏写保留空串并告警。CLI 不截断或改写摘要。
198
+ - **模板要素完整性三条硬规则(2026-11-01,e-todo 要素缺失复盘定稿)**:
199
+ 1. **模板要素优先于字数偏好**:某组口径(`requestSummaryPrompt`)明确要求 N 个要素时,N 项必须写全,字数让位——字数只在要素齐全后用于收拢表达;
200
+ 2. **缺字段不静默**:素材里看不到某要素时,第一步**回查详情缓存**(`todo-detail-cache.json` 该条目的 `fields`——**已按 `excludeOriginFormDataFields` 过滤,首选**)或对单条跑 `workflow.detail` 补取;补不到就在摘要里明确标注该项缺失。**禁止**当作"字段不存在"而静默省略。**注意**:`workflow.detail` 返回的是**未过滤**的全量 formData(含被排除的字段,如 e-todo 的「子任务名称」)——**摘要中不得引用被排除的字段**,补取也只取模板要求的要素;
201
+ 3. **素材截断迹象 = 素材不全**:明细行出现半截字段名、异常结尾时一律按"素材不全"处理,先补取再动笔,不得基于残缺素材下结论(脚本侧 4000 字符内的素材视为完整;超长条目按上一条补取)。
176
202
 
177
203
  ### 组摘要
178
204
 
@@ -188,13 +214,22 @@ collect
188
214
 
189
215
  ### 6.1 交付形态:`params.dataSource` + 落文件(2026-10-28 现行口径)
190
216
 
217
+ **回复正文 = 只有 `<browsertool>` 组件块,其他一律不输出(2026-11-01 用户定稿,最高优先;本文其余任何段落——含下方旧口径小节与文末「最终交付」——与本节冲突时,一律以本节为准)**:
218
+
219
+ - **不要**几行总结、不要表格、不要逐组罗列、**不要耗时说明**、不要任何解释文字——正文里除了那一个组件块,一个字都不能多;
220
+ - **JSON 文件默认不在对话中输出**:不 `present_files`、不在正文提文件路径(脚本仍会自动落盘备用);**仅当用户提示词明确要求「需要输出 json」时**,才 `present_files` 脚本打印的「交付文件」路径。
221
+
191
222
  **2026-10-28 用户在 OA 页面实测通过后定稿**:载荷不再内联明细,只给一个本地 GET 地址,由组件自己取三键。
192
223
 
193
224
  - 脚本**默认**就走这条(`finish` 不带参数即生效):把
194
225
  `params.data.dataSource = http://127.0.0.1:<port>/s/<token>/todo.json` 写进载荷(**注意是 `params.data` 里的 `dataSource`,不是 `params.dataSource`**),不再带明细。
195
- - **单进程多快照(2026-10-29 方案 B)**:`todo-serve.cjs` 是**全局单例**,同一时间只有一个进程、一个端口。
196
- 进程信息记在 `<tmpdir>/weaver-work-cli-serve/current.json`(`{pid, port, version}`),同版本且 pid 存活就复用,
226
+ - **单进程多快照(2026-10-29 方案 B;2026-10-30 起为 v4 内存优先版)**:`todo-serve.cjs` 是**全局单例**,同一时间只有一个进程、一个端口。
227
+ 进程信息记在 `<tmpdir>/weaver-work-cli-serve/current.json`(`{pid, port, version, publishKey}`),同版本且 pid 存活就复用,
197
228
  不会每次汇总都新起一个(旧实现的「一次汇总一个进程」已废弃)。
229
+ **v4:发布改为 CLI 把三键 JSON 原文 `POST` 进服务内存(须带 `x-publish-key`,服务启动时随机生成、写在 current.json 里),
230
+ GET 从内存返回——服务端不再读任何磁盘文件。** 原因:宿主沙箱会回收常驻进程的文件读授权(能 stat 不能 read),
231
+ 「写文件给服务读」的旧路径会导致链接跨命令后必 404(`snapshot_empty`)。内存 miss 时仍回落读磁盘文件(兼容),
232
+ 服务也照旧 best-effort 写磁盘副本(只写不读,排错用)。内存快照上限 20 份(LRU),单份 ≤ 8MB。
198
233
  - 每份汇总 = 一个快照目录 `<tmpdir>/weaver-work-cli-serve/snapshots/<token>/todo.json`,
199
234
  URL 形态 `/s/<token>/todo.json`(同时兼容旧的 `/todo.json?token=`)。
200
235
  **多份快照并存互不覆盖**,旧链接在各自空闲期内继续可用。
@@ -204,16 +239,14 @@ collect
204
239
  - 响应体 = `params.data` 的三键对象**原样**(`smartSummaryTitle` / `totalCount` / `wfIdGroup`),组件拿到不需要任何转换。
205
240
  - 必回的头(缺一前端就废):`Access-Control-Allow-Origin`(回显请求 Origin)、`Access-Control-Allow-Private-Network: true`(Chrome 私有网络预检必需)、`Access-Control-Max-Age`。
206
241
  - 排错:`GET /health` 返回 `{pid, port, snapshots, hits}`;每个输出目录下的 `serve.json` 记录本次的 url/token/snapshotDir。
207
- - **正文必须内联完整的 `<browsertool>...</browsertool>` 块**(标签成对):dataSource 版载荷只有约 900 B,不算大载荷,所以照常内联;块内 `params.data.dataSource` 指向本地服务,**不内联明细数据**。
208
- - **另存一份纯 JSON 文件**(内容是三键数据本身,不是载荷外框):`~/Downloads/<用户名>_<YYYYmmddHHMMSS>.json`,落盘后 `present_files` 打开。
209
- `用户名` = 认证系统当前登录人的 `username`(`auth whoami` 拿 `employeeId` → `hrm.employee.detail` 取 `username`),
210
- **不要用本机账号名或数字 ID**。
242
+ - **正文必须内联完整的 `<browsertool>...</browsertool>` 块**(标签成对):dataSource 版载荷只有约 900 B,不算大载荷,所以照常内联;块内 `params.data.dataSource` 指向本地服务,**不内联明细数据**。**硬规则:标签与载荷必须原样贴在回复正文顶层,禁止包进代码块(``` 包裹)、禁止缩进/引用块/折叠**——包进代码块组件就不渲染(2026-11-01 用户实测踩坑后定为硬规则)。
243
+ - **交付 JSON 文件由脚本自动落盘**(2026-11-01 用户拍板):`finish`/`build` 导出时脚本把三键本体写到 `~/Downloads/<用户名>_<YYYYmmddHHMMSS>.json`(用户名 = `auth whoami` 的 employeeId → `hrm run hrm.employee.detail` 的 `username`,脚本自动查并缓存;时间戳为本地时间)。**执行方默认不输出它**(见 6.1 顶部:不 `present_files`、不提路径),仅当用户明确要求「需要输出 json」时才 `present_files`;不要手工拼名字、不要手工复制。
211
244
  - 回退:`--no-serve` 时回到旧的「内联 `params.data` 整块 + 内联 `<browsertool>`」形态,下列旧规则只在回退分支生效。
212
245
 
213
246
  **旧口径(2026-10-27,现仅 `--no-serve` 分支适用)**:不区分宿主与 agent 类型,交付**固定两份、缺一不可**:
214
247
 
215
248
  - **① 回复正文里直接内联完整的 `<browsertool>...</browsertool>` 块**(不省略、不用路径代替)+ 各阶段耗时。
216
- - **② 同时另存一份不带标签的纯 JSON 文件**(内容 = 同一个载荷对象),落盘后立刻用 `present_files` 打开。
249
+ - **② 同时另存一份不带标签的纯 JSON 文件**(内容 = 同一个载荷对象)。**【历史口径,已被 §6.1 顶部取代:JSON 文件默认不展示、不 `present_files`】**
217
250
  - 标签**必须成对**:`<browsertool>` 开头、`</browsertool>` 结尾;漏标签或只贴裸 JSON 都算交付失败。
218
251
  - `params.data` 的值就是最终三键对象(`smartSummaryTitle` / `totalCount` / `wfIdGroup`)**原样**:不裁剪、不改字段名、不再外包一层。
219
252
  - 载荷里除 `params.data` 外**不要**再带 `schemaVersion` / `ok` / `operation` / `meta` / `warnings` 等信封字段。
@@ -247,15 +280,17 @@ collect
247
280
  - `src` 取**当前认证环境**的 `baseUrl`(`weaver-work-cli --json auth status` 的 `baseUrl`)拼 `/workflow/list/todo`,不要写死某个租户。脚本已用 `state.json` 缓存 `baseUrl`,同一轮流水线不会重复启动 CLI。
248
281
  - `params_pc` / `params_mobile` 必须放在 `sdkOptions` 内、与 `routerProps_pc/mobile` 同级,**不要放进 `arguments` 层**。
249
282
  - `app` 的值按原始字符写 **`@weapp/workflow`**(`@` 后面**没有**斜杠,共 15 个字符):**不要写成 `@//weapp/workflow`、不要转义成 `@\/\/weapp\/workflow`、也不要加前导空格**——带前导空格会导致 app 解析失败(用户 2026-10-27 以截图校正)。
250
- - 脚本 `exportFinal` 已在 stdout 的 `[JSON_BEGIN]`/`[JSON_END]` 之间直接输出**带标签的整块载荷**,原样粘贴即可;交付时**要传 `--file`**,它会另存一份**不带标签的纯 JSON**(同一载荷)供 `present_files` 打开。
283
+ - 脚本 `exportFinal` 已在 stdout 的 `[JSON_BEGIN]`/`[JSON_END]` 之间直接输出**带标签的整块载荷**,原样粘贴即可;交付 JSON 文件(`~/Downloads/<用户名>_<时间戳>.json`)由脚本自动落盘并打印路径,**默认不 `present_files`(见 §6.1 顶部)**。旧 `--file` 分支(写 `待办汇总-*.json` 外框归档)已于 2026-11-01 **删除**——传了也会被忽略,不要再依赖它。
284
+ - **交付硬闸门(2026-11-01)**:`finish`/`build` 导出前强制校验——①空单条摘要 >0、②空组摘要 >0、③待写摘要未全部回填(列出缺失 requestId)、④详情取数失败(`failed>0`,防"静默降级+标题编内容")、⑤**降级话术黑名单**(摘要含「未在标题体现 / 标题未体现 / 标题里没有 / 详见流程 / 详见详情 / 待确认」即拦截——把取数失败写成业务信息缺失)、⑥**要素级校验**(规则 `summaryRequiredFields` 声明的关键字,本组每条摘要必须逐项包含,缺任一即拦截并列出缺失项)——任一命中即 `exit 1` 拒绝导出。显式豁免:`--allow-empty-summary`(豁免①②③⑤⑥)、`--allow-detail-fail`(豁免④)。**豁免是给"确认要带瑕疵出文件"用的,不要拿它当常规手段绕过校验。**
285
+ - **组摘要未回填 ≠ 失败(2026-11-02 P2 定稿)**:`finish`/`build` 遇到组摘要待回填时,把**完整素材**(含每个成员的 `requestId`、标题、发起人、单条摘要、`prompt`)写 `<out>/need-group-summaries.json`,以 **`exit 0` + `NEEDS_GROUP_SUMMARIES`** 返回、**不导出**(控制台只给紧凑清单,此前每批 400 字符的截断预览已废除);在该文件每个元素里补 `summary` 后用 `--group-summaries` **指回同一个文件**重跑即可(脚本自动只取 `groupId`/`summary`,`items` 等多余字段不外传)。`--allow-empty-summary` 豁免后才按空组摘要继续导出。上方①②④⑤⑥等真失败仍 `exit 1`。
251
286
  - 体积见 §6.2:**不能按组拆成多个 `<browsertool>` 块**(拆开就不是合法载荷);超限时先在正文说明条数与预计体积,建议缩小范围,用户坚持再照做。
252
287
 
253
288
 
254
289
  交付约束:**不改写条目字段、不做体积裁剪**(载荷里必须是完整明细)。
255
290
 
256
- #### 6.1.3 耗时口径(只在回复里用文字报出,不产出 md)
291
+ #### 6.1.3 耗时口径(只在脚本控制台统计;回复正文不再报耗时)
257
292
 
258
- 用户 2026-10-27 要求:**取消「耗时说明 md」这份交付物**,交付物只有那一块 `<browsertool>` 载荷;耗时仍照常统计,但只在回复正文里用文字给出。下面两个口径要分开报,**不要把两个数混成一个**:
293
+ 用户 2026-10-27 要求:**取消「耗时说明 md」这份交付物**。2026-11-01 进一步定稿:**回复正文只有组件块、禁止任何文字**,所以耗时也**不再写进回复**——仍照常统计、`--timing-report` 只在控制台打两行「耗时摘要」,执行方自己看即可。下面两个口径要分开,**不要把两个数混成一个**:
259
294
 
260
295
  | 口径 | 取法 | 含义 |
261
296
  | --- | --- | --- |
@@ -264,7 +299,7 @@ collect
264
299
 
265
300
  - **请求级埋点已移除**(2026-10-27 用户定:`internal/e10/requestTiming.ts` 模块及 `client.ts` / `request-runtime.ts` 的接线一并删除,`meta.timing` 现在只有 `startedAt / finishedAt / stage / steps / durationMs`)。不要再读 `meta.timing.requests`,也不要写 `WEAVER_WORK_CLI_TIMING=1`。
266
301
  - 常见误读:`collect` 的墙钟含进程启动(沙箱下 5~7s),真实取数只有 0.2~0.3s。脚本已分列输出 `collect 内部 / 含进程启动`。
267
- - **不落任何耗时文件**:`--timing-report` 只在控制台打两行「耗时摘要」(总墙钟+业务占比、以及一条"只统计 CLI 链路"的提示),不再写 md、不要 `present_files` 它;回复里用文字给出总墙钟与真实业务耗时可。
302
+ - **不落任何耗时文件**:`--timing-report` 只在控制台打两行「耗时摘要」(总墙钟+业务占比、以及一条"只统计 CLI 链路"的提示),不再写 md、不要 `present_files` 它;**回复里也不写耗时**(2026-11-01 定稿)。
268
303
 
269
304
  **端到端要分四层报,不要只报一个数**(实测 2026-10-26 近一年:端到端 4m58s,而 CLI 只占 23s):
270
305
 
@@ -277,7 +312,10 @@ collect
277
312
 
278
313
  ⇒ 端到端提速最有效的不是优化 CLI,而是**减少往返次数**:
279
314
 
280
- - 用 `run --days N --limit N --out DIR --file --timing-report` 一次跑完 `prep + build`(无待写摘要时连 `finish` 一起),别一步步手动跑。
315
+ - **第一原则(2026-11-02 用户定稿,先看这条)**:**不截断脚本输出、不探查中间产物**。`todo-summary.cjs` 打的是纯文本素材,`| head -c` 不会报错、只会让「待写摘要」悄悄缺条(实测 17.6 KB / 9 条被截成 5 条,缓存随后已写、重跑也补不回,只能整套重跑);`<out>/` 下的 `items.json` / `state.json` / `smartgroup.json` / `*.log` 更不能为"确认一下"去翻。遵守这两条,同一次汇总可从 12 轮压到 1 轮(脚本口径 71.9s → 3.0s);违反其中任一条,必然多 2~3 轮、约 25~60s。细则见 SKILL.md「5) 命令输出读取纪律」。
316
+ - **素材落盘(2026-11-02 P3-B)**:`build`/`run` 停在待写摘要时,完整素材(batches 数组,含 `items[].requestId/context` 等,**无损**)写 `<out>/need-summaries.json`,控制台只留批次索引(`NEEDS_SUMMARIES`);模型用 Read 按需读该文件写 `aiSummaries.json` 后 `finish --summaries` 回填,**不再解析控制台长日志**(冷缓存 268 条时旧输出达 850KB)。
317
+ - 用 `run --days N --limit N --out DIR --timing-report` 一次跑完 `prep + build`(无待写摘要时连 `finish` 一起),别一步步手动跑。
318
+ - **时间段默认(2026-11-01 用户定稿)**:用户**没有说明数据的时间段**时,**不加任何时间条件**——不传 `--days` / `--from` / `--to`,取数范围就是全部待办,默认取**前 500 条**(`--limit` 不传即为 500);只有用户明确说了时段("近一年""近 30 天""某区间")才传 `--days` 或 `--from/--to`。不要替用户默认加时间范围。
281
319
  - **有侧重点(`--focus`)时的最短路径是 4 轮**,多一轮就多 5~7s:
282
320
  ```
283
321
  R1 prep --days N --focus "请假类型、报销类型" # 输出组/行/序号,以及 collect 已预取的「请假类型 / 金额 / 费用说明」
@@ -285,7 +323,7 @@ collect
285
323
  R3 写 aiSummaries.json && finish --summaries … # 输出组摘要素材
286
324
  R4 写 aiGroupSummaries.json && finish --group-summaries … # 同一条命令内回填单条 + 组摘要并导出
287
325
  ```
288
- - `prep` 的每行后面会带 `‹字段=值›`(最多 3 个、相同值只留一个):**据此分桶,不要再自己去翻详情缓存**。
326
+ - `prep` 的每行后面会带 `‹字段=值›`(最多 3 个、相同值只留一个):分组**分桶**据此进行即可,此阶段不必再翻详情缓存。
289
327
  - `--group-summaries` 让 `finish` 在同一次调用里跑完 `summary` + `groupSummary`,省掉「读完素材再单独调一次 groupSummary」那一轮。
290
328
  - **启动开销的真相(2026-10-27 实测)**:宿主给每个 node 子进程注入 `NODE_OPTIONS=--require=…/node-language-shim.cjs`,它对**每次 fs 读取**加 ~10ms 审计;本 CLI 启动要读 387 个模块 ⇒ 每次 ~4s(负载高时 25s)。
291
329
  `todo-summary.cjs` 启动 CLI 时**只摘掉 shim 这一项**(`cliEnv()`),实测 `--version` 4.96s→0.16s、`workflow schema` 7.23s→0.19s、脚本 spawn 6.46s→0.56s。
@@ -324,11 +362,11 @@ weaver-work-cli --json workflow run workflow.todoSmartConvert --input-json '{"st
324
362
  | --- | --- |
325
363
  | `stage_invalid` / `input_unknown_key` | 按错误中的允许字段修正 |
326
364
  | `items_required` / `items_invalid` / `items_too_many` | 先执行 `collect`,再回灌原始 `items` |
327
- | `ai_groups_invalid` / `ai_group_*` | 检查 `groupId`、`title`、`seq`/`requestIds` 和覆盖范围 |
365
+ | `ai_groups_invalid` / `ai_group_*` | 检查 `groupId`、`title`、`requestIds`(`seq` 已废弃,改用 `requestIds`)和覆盖范围 |
328
366
  | `final_groups_required` / `wfidgroup_invalid` | 原样回灌上一步 `wfIdGroup` |
329
367
  | `ai_summaries_required` / `ai_summary_*` | 只提交本轮有效 `requestId`,不能重复 |
330
368
  | `ai_group_summaries_required` / `ai_group_summary_*` | 使用汇总项 id,不使用父组 id |
331
369
  | `forbidden_endpoint` | 只允许列表取数接口,检查是否误用了辅助分页接口 |
332
370
  | `authentication` / `network` | 按共享 skill 的认证和失败规则处理,不盲目重试 |
333
371
 
334
- 最终交付(2026-10-28 起):**载荷里给 `params.dataSource`(本地服务,脚本默认已生成)+ 一份 `<用户名>_<时间戳>.json` 文件用 `present_files` 打开**,正文只写结论与耗时,**不再内联大载荷**;只有 `--no-serve` 回退时才回到「内联 `<browsertool>` + 纯 JSON 文件」两份。不要用 Markdown 报告或摘要清单替代交付物,也不要产出「耗时说明 md」(见 §6.1、§6.1.3)。
372
+ 最终交付(**2026-11-01 定稿,以 §6.1 顶部为准**):**回复正文 = 只有一个 `<browsertool>` 组件块**——载荷里只给 `params.dataSource`(本地服务,脚本默认已生成),不写总结/表格/耗时/任何其他文字;`<用户名>_<时间戳>.json` 由脚本自动落盘**仅作备用,默认不 `present_files`、不提路径**,仅当用户明确要求「需要输出 json」时才展示。只有 `--no-serve` 回退时才回到「内联 `<browsertool>` + 内联明细」形态。不要用 Markdown 报告或摘要清单替代交付物,也不要产出「耗时说明 md」(见 §6.1、§6.1.3)。