weaver-work-cli 0.1.32 → 0.1.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/chunks/{archive-UMGX72K6.js → archive-XBVH7JU7.js} +2 -2
- package/dist/chunks/{archive-oa-N2IYBLF3.js → archive-oa-MZM3EKFQ.js} +2 -2
- package/dist/chunks/{asset-GLEGKFG5.js → asset-4XO7UOUW.js} +2 -2
- package/dist/chunks/{attachment-content-AQNX5N3S.js → attachment-content-VXSWANAC.js} +3 -2
- package/dist/chunks/{blog-E44OTVDA.js → blog-PGZKOPSC.js} +2 -2
- package/dist/chunks/{caizhilian-DQUFZXZL.js → caizhilian-BH4ZVGUN.js} +2 -2
- package/dist/chunks/{calendar-JKPIRKFD.js → calendar-MXEMTIO4.js} +2 -2
- package/dist/chunks/{chunk-QWY6PGL6.js → chunk-2LV74IWP.js} +361 -56
- package/dist/chunks/chunk-3SO6QL6U.js +73 -0
- package/dist/chunks/chunk-5DQEEGCC.js +229 -0
- package/dist/chunks/{chunk-G3QJULO2.js → chunk-6LLJFKJE.js} +1 -1
- package/dist/chunks/{chunk-C6R3B2ML.js → chunk-BPE37FPB.js} +35 -7
- package/dist/chunks/chunk-BYATLLEF.js +68 -0
- package/dist/chunks/chunk-BYBSCN4X.js +932 -0
- package/dist/chunks/{chunk-CVZ2JOSW.js → chunk-F746NKNF.js} +1 -1
- package/dist/chunks/{chunk-GCG2NMWR.js → chunk-HXJQI5NM.js} +4 -2
- package/dist/chunks/{chunk-YRVDW4WN.js → chunk-I6QGIBDM.js} +2 -2
- package/dist/chunks/{chunk-H7J4DC5R.js → chunk-JCSN3JGM.js} +2 -2
- package/dist/chunks/{chunk-2GA5ZIQL.js → chunk-JNG42JKG.js} +30 -1
- package/dist/chunks/{chunk-DW6AUUKS.js → chunk-JUXVYKII.js} +9 -4
- package/dist/chunks/{chunk-6RKD4DRZ.js → chunk-JYKABYCV.js} +2 -2
- package/dist/chunks/{chunk-6EFWDL7Y.js → chunk-NCOVUAZK.js} +2 -2
- package/dist/chunks/{chunk-E4Z23GHM.js → chunk-QHFANTX7.js} +1114 -904
- package/dist/chunks/{ebuilder-form-V5FG2EHC.js → chunk-QYGO5EE2.js} +22 -1148
- package/dist/chunks/{chunk-IURUFGZK.js → chunk-T72N74ZT.js} +50 -33
- package/dist/chunks/{chunk-H6XSTSLM.js → chunk-TC6MZAO3.js} +137 -204
- package/dist/chunks/{chunk-WKI2FBIQ.js → chunk-VPUTVEMC.js} +737 -341
- package/dist/chunks/{chunk-WSKBSQ2U.js → chunk-VPXOPQJI.js} +2 -2
- package/dist/chunks/chunk-WXFPWCXG.js +774 -0
- package/dist/chunks/{chunk-4YC43QQ4.js → chunk-XMGSYD6S.js} +4 -4
- package/dist/chunks/conflict-JAB2LJEZ.js +21 -0
- package/dist/chunks/continuation-RN6PZN2M.js +11 -0
- package/dist/chunks/contract-XI2EEIZU.js +9110 -0
- package/dist/chunks/cowork-SCPGLBA4.js +2527 -0
- package/dist/chunks/ebuilder-form-EYLHNOTA.js +121 -0
- package/dist/chunks/{ehr-HMFY6VIL.js → ehr-EAP77IMT.js} +1344 -27
- package/dist/chunks/{esb-ZYSVB7SG.js → esb-2TGGXEE7.js} +4 -4
- package/dist/chunks/{fna-B7RKPAZD.js → fna-2X7ZE7BU.js} +13 -8
- package/dist/chunks/{host-OCH2BCCV.js → host-C6EL2RKL.js} +3 -3
- package/dist/chunks/{host-45WED2KK.js → host-I4NRK4MX.js} +3 -3
- package/dist/chunks/{host-I4Z6BFYX.js → host-Q4LZGCRU.js} +3 -3
- package/dist/chunks/host-UEI5FGDM.js +23 -0
- package/dist/chunks/{host-KNZ52LJZ.js → host-XCLDDXKQ.js} +3 -3
- package/dist/chunks/{hrm-2KAZGUHI.js → hrm-YXERJM76.js} +3 -3
- package/dist/chunks/{im-ACJJWH4U.js → im-A4VZN2TQ.js} +88 -12
- package/dist/chunks/{invoice-ZK3WCX2U.js → invoice-2Z6YPMIS.js} +3 -3
- package/dist/chunks/{jiuchuanhui-5PQD3IL2.js → jiuchuanhui-AR5GMKZB.js} +2 -2
- package/dist/chunks/{lazy-dispatch-JQXBW3GM.js → lazy-dispatch-QXW7P4X3.js} +4 -4
- package/dist/chunks/{mail-S2HDDXO2.js → mail-7GZ6CPBJ.js} +45 -24
- package/dist/chunks/{meeting-QVN3I37L.js → meeting-3NMGA3MB.js} +278 -43
- package/dist/chunks/{okr-QNG4VC2Q.js → okr-BZ6XUOAG.js} +2 -2
- package/dist/chunks/operations-5QL3AECO.js +11 -0
- package/dist/chunks/{plan-A25EMW6U.js → plan-DR5CMUYP.js} +2 -2
- package/dist/chunks/{project-G6XV66DZ.js → project-6J63MK33.js} +2 -2
- package/dist/chunks/{registry-DC6KR3NH.js → registry-KDD7DHNK.js} +4 -4
- package/dist/chunks/{registry-2VLUAESA.js → registry-OZSMDVPP.js} +2 -2
- package/dist/chunks/{registry-7C5UMIPL.js → registry-TKX2E7C7.js} +2 -2
- package/dist/chunks/{registry-TI3CIUXF.js → registry-VRTNC6UR.js} +8 -6
- package/dist/chunks/{room-recommend-WRTHO6Y2.js → room-recommend-XCWRMB5P.js} +4 -3
- package/dist/chunks/{schedule-KFIITGSK.js → schedule-IVBICP32.js} +4 -3
- package/dist/chunks/{workflow-DJ7SYWAF.js → workflow-D74NFK3C.js} +179 -6
- package/dist/index.js +35 -25
- package/dist/internal/e10/auth-recovery.js +14 -4
- package/dist/internal/e10/fetch-timing.js +31 -0
- package/dist/internal/e10/request-runtime.js +5 -0
- package/dist/shortcuts/contract/host.js +34 -59
- package/dist/shortcuts/cowork/continuation.js +70 -0
- package/dist/shortcuts/cowork/errors.js +59 -0
- package/dist/shortcuts/cowork/host.js +180 -0
- package/dist/shortcuts/cowork/index.js +166 -0
- package/dist/shortcuts/cowork/manifest.js +65 -0
- package/dist/shortcuts/cowork/operations/discuss-write.js +277 -0
- package/dist/shortcuts/cowork/operations/item-write.js +380 -0
- package/dist/shortcuts/cowork/operations/member-write.js +283 -0
- package/dist/shortcuts/cowork/operations/permission-write.js +286 -0
- package/dist/shortcuts/cowork/operations/read.js +423 -0
- package/dist/shortcuts/cowork/operations/registry.js +39 -0
- package/dist/shortcuts/cowork/operations/review-write.js +157 -0
- package/dist/shortcuts/cowork/operations/shared.js +215 -0
- package/dist/shortcuts/cowork/operations/types.js +39 -0
- package/dist/shortcuts/cowork/operations.js +19 -0
- package/dist/shortcuts/ehr/host.js +4 -1
- package/dist/shortcuts/ehr/operations/recruit-candidate-import.js +757 -0
- package/dist/shortcuts/ehr/operations/recruit-position.js +367 -0
- package/dist/shortcuts/ehr/operations/recruit-stats.js +133 -0
- package/dist/shortcuts/ehr/operations/recruit-write.js +43 -16
- package/dist/shortcuts/ehr/operations/recruit.js +182 -10
- package/dist/shortcuts/ehr/operations/registry.js +6 -0
- package/dist/shortcuts/fna/operations/expense-chart.js +19 -7
- package/dist/shortcuts/im/diagnostics.js +97 -0
- package/dist/shortcuts/im/host.js +58 -31
- package/dist/shortcuts/im/index.js +7 -2
- package/dist/shortcuts/im/operations/at-mention.js +127 -0
- package/dist/shortcuts/im/operations/file-user.js +10 -2
- package/dist/shortcuts/im/operations/group-read.js +26 -5
- package/dist/shortcuts/im/operations/group-write.js +35 -28
- package/dist/shortcuts/im/operations/msg-sync.js +7 -2
- package/dist/shortcuts/im/operations/msg-write.js +76 -10
- package/dist/shortcuts/im/operations/quote-mention.js +119 -0
- package/dist/shortcuts/im/operations/session.js +1 -1
- package/dist/shortcuts/im/operations/shared.js +10 -0
- package/dist/shortcuts/im/operations/types.js +13 -0
- package/dist/shortcuts/index.js +10 -0
- package/dist/shortcuts/mail/host.js +12 -1
- package/dist/shortcuts/mail/operations/types.js +17 -2
- package/dist/shortcuts/meeting/host.js +27 -34
- package/dist/shortcuts/meeting/index.js +79 -1
- package/dist/shortcuts/meeting/manifest.js +10 -0
- package/dist/shortcuts/meeting/operations/create.js +4 -1
- package/dist/shortcuts/meeting/operations/eb/catalog.js +10 -0
- package/dist/shortcuts/meeting/operations/eb/conflict.js +84 -8
- package/dist/shortcuts/meeting/operations/eb/create-flow.js +1195 -140
- package/dist/shortcuts/meeting/operations/eb/factory.js +170 -8
- package/dist/shortcuts/meeting/operations/eb/index.js +16 -3
- package/dist/shortcuts/meeting/operations/eb/room-recommend.js +50 -5
- package/dist/shortcuts/meeting/operations/eb-fallback.js +163 -0
- package/dist/shortcuts/meeting/operations/env.js +99 -46
- package/dist/shortcuts/meeting/operations/form-fields.js +110 -0
- package/dist/shortcuts/meeting/operations/invitation.js +79 -20
- package/dist/shortcuts/meeting/operations/registry.js +2 -0
- package/dist/shortcuts/meeting/operations/standard-guard.js +71 -0
- package/dist/shortcuts/meeting/operations.js +16 -0
- package/dist/shortcuts/workflow/endpoints.js +8 -3
- package/dist/shortcuts/workflow/index.js +110 -1
- package/dist/shortcuts/workflow/operations/form.js +204 -36
- package/dist/shortcuts/workflow/operations/read.js +104 -23
- package/dist/shortcuts/workflow/operations/todoSmartConvert/aigroupRules.js +448 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/aigroupStore.js +106 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/businessRules.js +47 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.collect.js +30 -23
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.core.js +1 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.group.js +1 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.groupSummary.js +2 -1
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.js +2 -4
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.smartGroup.js +138 -181
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.summary.js +12 -7
- package/dist/shortcuts/workflow/operations.js +23 -1
- package/docs/e10-auth.md +1 -1
- package/docs/ehr.md +1 -1
- package/docs/fna.md +2 -1
- package/docs/im.md +8 -1
- package/docs/todo-smart-convert/README.md +1 -1
- package/docs/todo-smart-convert/data-contract.md +2 -2
- package/docs/todo-smart-convert/subgroup-rules.md +6 -0
- package/package.json +1 -1
- package/skill-template/business-info.json +18 -0
- package/skill-template/domains/cowork.md +14 -0
- package/skill-template/domains/yimiaoban.md +3 -3
- package/skill-template/skill-template.md +1 -1
- package/skills/weaver-e10-blog/SKILL.md +5 -5
- package/skills/weaver-e10-caizhilian/SKILL.md +5 -5
- package/skills/weaver-e10-calendar/SKILL.md +5 -5
- package/skills/weaver-e10-cowork/SKILL.md +101 -0
- package/skills/weaver-e10-cowork/references/cowork-read.md +90 -0
- package/skills/weaver-e10-cowork/references/cowork-write.md +131 -0
- package/skills/weaver-e10-cowork/references/safety-boundaries.md +45 -0
- package/skills/weaver-e10-esb/SKILL.md +5 -5
- package/skills/weaver-e10-hrm/SKILL.md +5 -5
- package/skills/weaver-e10-jinchengda/SKILL.md +2 -2
- package/skills/weaver-e10-jiuchuanhui/SKILL.md +5 -5
- package/skills/weaver-e10-jucailin/SKILL.md +38 -14
- package/skills/weaver-e10-jucailin/references/recruit-create.md +104 -0
- package/skills/weaver-e10-jucailin/references/recruit-read.md +25 -0
- package/skills/weaver-e10-jucailin/references/recruit-write.md +13 -0
- package/skills/weaver-e10-jucailin/references/salary.md +15 -11
- package/skills/weaver-e10-mail/SKILL.md +17 -14
- package/skills/weaver-e10-meeting/SKILL.md +442 -46
- package/skills/weaver-e10-meeting/references/meeting-eb.md +135 -3
- package/skills/weaver-e10-meeting/references/meeting-invitation.md +28 -2
- package/skills/weaver-e10-meeting/references/meeting-queries.md +9 -6
- package/skills/weaver-e10-meeting/references/meeting-verification.md +8 -6
- package/skills/weaver-e10-meeting.zip +0 -0
- package/skills/weaver-e10-okr/SKILL.md +5 -5
- package/skills/weaver-e10-okr/references/source-manifest.json +3 -3
- package/skills/weaver-e10-plan/SKILL.md +5 -5
- package/skills/weaver-e10-qiyecheng/SKILL.md +5 -2
- package/skills/weaver-e10-qiyecheng/references/catalog.md +2 -2
- package/skills/weaver-e10-qiyecheng/references/expense-chart.md +15 -1
- package/skills/weaver-e10-qiyecheng/references/source-manifest.json +22 -21
- package/skills/weaver-e10-shared/SKILL.md +12 -12
- package/skills/weaver-e10-shared/references/e10-auth-and-session.md +4 -4
- package/skills/weaver-e10-wenshuding/SKILL.md +5 -5
- package/skills/weaver-e10-workflow/SKILL.md +29 -5
- package/skills/weaver-e10-workflow/aigroup/default.json +88 -0
- package/skills/weaver-e10-workflow/references/todo-smart-convert.md +66 -14
- package/skills/weaver-e10-workflow/references/workflow-agent-entry.md +1 -1
- package/skills/weaver-e10-workflow/references/workflow-memory.md +1 -1
- package/skills/weaver-e10-workflow/references/workflow-query.md +12 -10
- package/skills/weaver-e10-workflow/references/workflow-view.md +2 -2
- package/skills/weaver-e10-workflow/tools/todo-serve.cjs +239 -0
- package/skills/weaver-e10-workflow/{scripts → tools}/todo-summary.cjs +218 -28
- package/skills/weaver-e10-yepiaotong/SKILL.md +10 -8
- package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +7 -7
- package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +10 -10
- package/skills/weaver-e10-yepiaotong/references/reim-examples.md +40 -37
- package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +4 -4
- package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +27 -38
- package/skills/weaver-e10-yepiaotong/references/reim-phone-subsidy-rules.md +4 -4
- package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +37 -29
- package/skills/weaver-e10-yimiaoban/SKILL.md +156 -33
- package/skills/weaver-e10-yimiaoban/references/ding-write.md +1 -1
- package/skills/weaver-e10-yimiaoban/references/error-codes.md +5 -1
- package/skills/weaver-e10-yimiaoban/references/group-read.md +5 -1
- package/skills/weaver-e10-yimiaoban/references/group-write.md +6 -4
- package/skills/weaver-e10-yimiaoban/references/msg-read.md +1 -0
- package/skills/weaver-e10-yimiaoban/references/msg-write.md +34 -2
- package/skills/weaver-e10-yimiaoban/references/safety-boundaries.md +5 -2
- package/skills/weaver-e10-yimiaoban/references/source-manifest.json +79 -58
- package/skills/weaver-e10-yimiaoban/references/user-remind.md +2 -2
- package/skills/weaver-e10-ziguanjia/SKILL.md +5 -5
|
@@ -2,7 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
## 何时使用
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**默认就是 EB 版**:直接调 `meeting.eb.*`,不需要先判断环境。
|
|
6
|
+
|
|
7
|
+
- EB 在当前环境真的走不通时,CLI 会返回 `api/env_fallback` —— 此时它已经**实探过标准版并把环境模式固化成 `standard`**,按 `details.standardOperation` 改用标准版 operation 重试即可(`null` = 标准版没有该能力)。
|
|
8
|
+
- 用户明确问"当前是 EB 还是标准版"时,才跑 `meeting.env.detect --refresh` 实探;`assumed:true` 只是默认假设,不能当结论回答。
|
|
6
9
|
|
|
7
10
|
> 标准版与 EB 版是**两套独立接口与数据**:标准版是 Java REST(`/api/meeting/**`、表 `mt_detail` 等),
|
|
8
11
|
> EB 版是 eBuilder formdata(`/api/ebuilder/form/formdata/v2/**`、表 `uf_*`)。**不可混用、数据互不相通**——
|
|
@@ -49,12 +52,34 @@
|
|
|
49
52
|
> 未传 `sign_time` / `signback_time` / `sign_out_status` 时按"补签"语义**自动补当前时间**(带秒)并写入 `warnings`,
|
|
50
53
|
> 实际写入值在 `preview.after` 里可见;要指定时间请显式传 `sign_time`(`yyyy-MM-dd HH:mm:ss`,带秒)。
|
|
51
54
|
|
|
55
|
+
## 会议室列表:按名称查询(2026-10-30)
|
|
56
|
+
|
|
57
|
+
`meeting.eb.room.list` 支持 `room_name`(以及 `status` / `place` / `org_id` / `hrm_ids`)过滤,
|
|
58
|
+
条件走 body 的 `datajson.mainTable`,count 与 list 用**同一份**条件。
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# 精确名 → 服务端直接命中,1 次请求
|
|
62
|
+
weaver-work-cli --json meeting run meeting.eb.room.list --input-json '{"room_name":"测试会议室1"}'
|
|
63
|
+
|
|
64
|
+
# 部分词 → 服务端精确匹配不到(0 条),CLI 自动翻页扫全量并按「包含」重筛
|
|
65
|
+
weaver-work-cli --json meeting run meeting.eb.room.list --input-json '{"room_name":"重庆"}'
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
⚠️ 三个实测事实(e-cology 生产,2026-10-30):
|
|
69
|
+
|
|
70
|
+
1. **服务端是精确匹配,不是 like**:`room_name=测试会议室1` → 1 条;`room_name=测试` → 服务端 0 条。
|
|
71
|
+
所以传部分词时 CLI 会兜底翻页扫描(结果带 `progress.page.fallback = {pages, scanned}`),
|
|
72
|
+
实测 155 条扫完约 5 秒。传 `noFallback:true` 可跳过扫描(精确匹配不到就直接 0 条)。
|
|
73
|
+
2. **`pageSize` 服务端不生效,恒定回 10 条** —— 要全量只能翻页(兜底就是这么做的)。
|
|
74
|
+
⛔ 别把"本页 10 条"当成"总共 10 间"。
|
|
75
|
+
3. **列表 0 条不等于没有会议室**:2026-10-29 全天该接口为 0 条(应用侧视图配置问题),
|
|
76
|
+
10-30 下午租户把「会议室名称」配成传入字段后恢复到 155 条。
|
|
77
|
+
|
|
52
78
|
## 常用命令
|
|
53
79
|
|
|
54
80
|
Windows PowerShell:
|
|
55
81
|
|
|
56
82
|
```powershell
|
|
57
|
-
weaver-work-cli --json meeting run meeting.env.detect --input-json '{"refresh":true}'
|
|
58
83
|
weaver-work-cli --json meeting run meeting.eb.baseSet.get --input-json '{}'
|
|
59
84
|
weaver-work-cli --json meeting run meeting.eb.meeting.list --input-json '{"hrmmember":"100","mt_status":"2","pageSize":20}'
|
|
60
85
|
weaver-work-cli --json meeting run meeting.eb.meeting.detail --input-json '{"id":"<会议id>"}'
|
|
@@ -64,7 +89,6 @@ weaver-work-cli --json meeting run meeting.eb.meeting.create.prepare --input-jso
|
|
|
64
89
|
macOS/Linux(bash/zsh):
|
|
65
90
|
|
|
66
91
|
```bash
|
|
67
|
-
weaver-work-cli --json meeting run meeting.env.detect --input-json '{"refresh":true}'
|
|
68
92
|
weaver-work-cli --json meeting run meeting.eb.baseSet.get --input-json '{}'
|
|
69
93
|
weaver-work-cli --json meeting run meeting.eb.meeting.list --input-json '{"hrmmember":"100","mt_status":"2","pageSize":20}'
|
|
70
94
|
weaver-work-cli --json meeting run meeting.eb.meeting.detail --input-json '{"id":"<会议id>"}'
|
|
@@ -757,3 +781,111 @@ video_taskResult 为空 且 parse_content 为空 → 未触
|
|
|
757
781
|
|
|
758
782
|
实测遇到两次(`update_mt_decision_task` 首次调用、EB 列表接口),**重试即成功**,且数据未被写坏。
|
|
759
783
|
判定方法:报这个错时先 `list` 回查;没写进去再重试一次,**不要连试三次以上**。
|
|
784
|
+
|
|
785
|
+
## 流程建会字段:datakey(fieldId)固化
|
|
786
|
+
|
|
787
|
+
**为什么**:NEW 建会流程(`1325677244111462606`)的表单字段名带提示语 ——
|
|
788
|
+
`会议名称(请填写会议的具体名称)`、`开始时间(具体开始时间)`、`结束时间(具体结束时间)`。
|
|
789
|
+
按中文名**精确**匹配会全部落空,表现为 prepare 显示成功、但名称/时间实际没填进去(2026-10-30 真机踩到)。
|
|
790
|
+
现在两级兜底:① 归一化匹配(去掉括号提示语再比);② 解析结果按 workflowId 缓存成 datakey,之后直接用 id。
|
|
791
|
+
|
|
792
|
+
**泛微生产(www.e-cology.com.cn / t7akvdnf84)·「会议申请流程(NEW)」实测 datakey**:
|
|
793
|
+
|
|
794
|
+
| 语义键 | 表单字段 | datakey |
|
|
795
|
+
| --- | --- | --- |
|
|
796
|
+
| 会议名称 | 会议名称(请填写会议的具体名称) | 1325677252711735872 |
|
|
797
|
+
| 开始时间 | 开始时间(具体开始时间) | 1325677252711735890 |
|
|
798
|
+
| 结束时间 | 结束时间(具体结束时间) | 1325677252711735891 |
|
|
799
|
+
| 会议地点 | 会议地点 | 1325677252711735881 |
|
|
800
|
+
| 参会人员 | 参会人员 | 1325677252711735882 |
|
|
801
|
+
|
|
802
|
+
按 datakey 直接给值(绕过任何名字匹配,用 `fieldValues`):
|
|
803
|
+
|
|
804
|
+
```bash
|
|
805
|
+
weaver-work-cli --json meeting run meeting.eb.meeting.create.flow.prepare --input-json '{
|
|
806
|
+
"fieldValues": {
|
|
807
|
+
"1325677252711735872": "十一月开发进度沟通会",
|
|
808
|
+
"1325677252711735890": "2026-10-31 10:00",
|
|
809
|
+
"1325677252711735891": "2026-10-31 11:00",
|
|
810
|
+
"1325677252711735881": {"id":"1325772901753847972","name":"测试会议室1"},
|
|
811
|
+
"1325677252711735882": [{"id":"4980990112251498198","name":"卜伟领"}]
|
|
812
|
+
}
|
|
813
|
+
}'
|
|
814
|
+
```
|
|
815
|
+
|
|
816
|
+
⚠️ 浏览按钮类字段(会议地点 / 参会人员 / 召集人 / 联系人 / 会议类型)的值必须是 `{id,name}` 对象或数组,
|
|
817
|
+
纯文本会被服务端打回「请按名称选择」。
|
|
818
|
+
|
|
819
|
+
缓存文件:`~/.weaver-work-cli/meeting/cache/flow-fields-<workflowId>.json`。字段改名后仍按 datakey 填;
|
|
820
|
+
流程被重建、datakey 变了,删掉该文件让它重新解析即可。
|
|
821
|
+
|
|
822
|
+
## 查「CLI 到底有哪些能力」
|
|
823
|
+
|
|
824
|
+
```bash
|
|
825
|
+
weaver-work-cli meeting ops # 全部 135 项,纯文本、不压缩、按能力分组
|
|
826
|
+
weaver-work-cli meeting ops --grep suggest # 按名字/摘要搜(不区分大小写)
|
|
827
|
+
weaver-work-cli meeting ops --capability eb.meeting # 按分组看(支持前缀,如 --capability eb)
|
|
828
|
+
```
|
|
829
|
+
|
|
830
|
+
⛔ **不要用 `meeting schema --json` 判断能力存在性**:完整结果 308KB,stdout 只回 20KB 预览,
|
|
831
|
+
`operations` 数组被截到前 10 条,排在后面的 operation 一定看不到。
|
|
832
|
+
2026-10-30 真机事故就是这么来的——agent 在 schema 预览里没找到 `meeting.eb.meeting.create.suggest`,
|
|
833
|
+
于是回复用户「当前 CLI 版本没有建会建议时间操作」,而该 operation 一直存在且可用。
|
|
834
|
+
|
|
835
|
+
## 时间和会议室:必须由用户确认(timeConfirmed / roomConfirmed)
|
|
836
|
+
|
|
837
|
+
`create.flow.prepare` / `quick` 用两个标记区分「用户定的」和「agent 猜的」:
|
|
838
|
+
|
|
839
|
+
| 标记 | 传 true 的**唯一**两种情形 |
|
|
840
|
+
|---|---|
|
|
841
|
+
| `timeConfirmed` | ① 用户原话明确给出时间("明天 9 点到 10 点");② 用户在时段选项里点选后把 `options[].value` 整体原样回传 |
|
|
842
|
+
| `roomConfirmed` | ① 用户原话明确指定某间会议室;② 用户在房间选项里点选后把 `options[].value` 整体原样回传 |
|
|
843
|
+
|
|
844
|
+
不传(或 false)时:
|
|
845
|
+
- 即使传了 `begin_datetime`,也返回 `selectionType: 'slot'`(3 个时段选项),**不会**进确认摘要;
|
|
846
|
+
- 即使传了 `address`,也返回 `selectionType: 'room'`,把「你指定的那间」标成
|
|
847
|
+
`(你指定的,待确认)`排第一位,其余候选照常列在后面;
|
|
848
|
+
- `room_conflict`(占用拦截)只在 `roomConfirmed: true` 时才触发——没确认的房间不拦,只列出来。
|
|
849
|
+
|
|
850
|
+
这样设计的原因:2026-10-30 用户投诉「会议室没有推荐让我选择,时间没有推荐让我选择,智能体自己就决定了」。
|
|
851
|
+
旧行为里,agent 只要填了值 CLI 就照收,用户看到的是既成事实。
|
|
852
|
+
|
|
853
|
+
排查口诀:**选项回来的 `value` 要整体回传**(里面自带标记);只抄 `begin_datetime` / `address`
|
|
854
|
+
单个字段会丢掉确认标记,于是被再问一轮。这不是 bug。
|
|
855
|
+
|
|
856
|
+
## 闸门顺序:四要素先定,流程最后(2026-10-30 用户纠正)
|
|
857
|
+
|
|
858
|
+
`create.flow.prepare` 的顺序是固定的,**不要试图跳步**:
|
|
859
|
+
|
|
860
|
+
```
|
|
861
|
+
名称(mt_name,必填) → 时间(slot) → 地点(room / room_conflict / room_unavailable) → 流程(flow) → 确认(AWAITING_CONFIRMATION)
|
|
862
|
+
```
|
|
863
|
+
|
|
864
|
+
- 时间没确认(没带 `timeConfirmed`)时**不会出现 flow 选择**,先给时段;
|
|
865
|
+
地点没确认(没带 `roomConfirmed`)时同样不会出现 flow 选择,先给房间。
|
|
866
|
+
- 到 `selectionType: 'flow'` 这一步,四要素已经全部确认,返回里带 `confirmed`
|
|
867
|
+
(`mt_name` / `begin_datetime` / `end_datetime` / `address` / `addressName` / `hrm_members`),
|
|
868
|
+
每条 `options[].value` 也带着 `begin_datetime` / `end_datetime` / `address` + 两个确认标记。
|
|
869
|
+
**用户点选后把 value 整个回传**,下一轮直接 `AWAITING_CONFIRMATION`,不会再问时间/地点。
|
|
870
|
+
- 为什么要这样:用户原话「流程只是审批载体,应该先确认时间、人、地点、名称,再选流程」。
|
|
871
|
+
流程选择放到最后,用户在前三步就已经知道这会开不开得成,最后只是挑个审批口径。
|
|
872
|
+
|
|
873
|
+
## 时段候选到底核验了什么
|
|
874
|
+
|
|
875
|
+
`selectionType: 'slot'` 的每个候选都必须同时满足两件事,缺一不列:
|
|
876
|
+
|
|
877
|
+
1. **人空闲**:`findCommonFreeSlots` 先拉该时段所有会议候选 + 批量回执(`query_meeting_receipt_list`),
|
|
878
|
+
再叠加日程(ESB 动作流,**已过滤「会议日程」类型**,避免与会议回执重复计),
|
|
879
|
+
内存里按 30 分钟切槽判重叠 —— 任一参会人有占用就跳过该槽。
|
|
880
|
+
2. **会议室空闲**:每个「人空闲」的槽再并行跑 `room.recommend`(排除封存、容量不足、该时段被占用),
|
|
881
|
+
**一间可用房都没有的槽会被直接剔除**(不会出现"时间有了但没房间"的假选项)。
|
|
882
|
+
|
|
883
|
+
所以 `options[].reason` 里那句「N 人全部空闲(会议回执 + 日程已核);M 间会议室可用:…」是**核验结论**,
|
|
884
|
+
`options[].rooms` 是该时段真实的可用房间清单(含容量与推荐理由)。
|
|
885
|
+
|
|
886
|
+
边界(会写在 `warnings` 里,必须如实转达):
|
|
887
|
+
- **没传参会人** → 只核验了房间,人没核验;
|
|
888
|
+
- **姓名查不到员工 id** → 该人**未核验**(不会算进"全部空闲");
|
|
889
|
+
- **ESB 日程调用失败** → 退化为只看会议回执,`scheduleItems` 为空可判断;
|
|
890
|
+
- 被剔除的槽在 `skippedSlots` 里("人空闲但没房间"),可以据此解释为什么候选少。
|
|
891
|
+
|
|
@@ -11,15 +11,41 @@
|
|
|
11
11
|
|
|
12
12
|
## 入参
|
|
13
13
|
|
|
14
|
+
**两种用法,二选一**:
|
|
15
|
+
|
|
14
16
|
| 参数 | 必填 | 说明 |
|
|
15
17
|
| --- | --- | --- |
|
|
16
|
-
| `mtId` |
|
|
18
|
+
| `mtId` | 二选一 | 会议 id(EB 版会议主键,长 id 用字符串)。给了就按**会议真实数据**生成 |
|
|
19
|
+
| `mt_name` | 二选一✓ | **无 `mtId` 时必填** —— 会议名称 |
|
|
20
|
+
| `begin_datetime` | 二选一✓ | **无 `mtId` 时必填** —— 开始时间 `yyyy-MM-dd HH:mm` |
|
|
21
|
+
| `end_datetime` | | 结束时间(不填则文档里结束时间是【待补充】) |
|
|
22
|
+
| `address` | | 会议地点/会议室**名称**(不是 id) |
|
|
23
|
+
| `hrm_members` | | 参会人姓名,逗号/顿号分隔 |
|
|
24
|
+
| `mt_desc` | | 会议内容/议题概要 |
|
|
25
|
+
| `org_members` | | 落款单位(不传则取当前登录人部门,取不到留【待补充】) |
|
|
26
|
+
| `caller` / `contacter` / `total_member` | | 召集人 / 联系人 / 参会人数 |
|
|
17
27
|
| `extra` | | 键值对。**① 租户自定义字段**,如 `{"guest_org":"某某集团"}`——会议接口不会返回这类字段,只能从这里传;**② 保留键 `agenda`** 手动指定议程(见下文「议程表」),仅在会议没有议题时生效 |
|
|
18
28
|
| `outputPath` | | 输出文件完整路径;缺省写到 `~/.weaver-work-cli/meeting/invitations/邀请函-{会议名}-{yyyyMMdd}.docx` |
|
|
19
29
|
|
|
30
|
+
> ⛔ **既没 `mtId` 又没 `mt_name`+`begin_datetime`** → 报 `invitation_source_required`。
|
|
31
|
+
|
|
32
|
+
**无 `mtId` 模式**用于「会议还没生成」(流程审批中、或只有申请单信息)时预生成**预置函**——
|
|
33
|
+
邀请函本就是给人下载后自己改再自己发的,不该卡在"会议必须有 id"。缺的字段黄色高亮【待补充】。
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# 无会议 id:按申请单信息出预置函
|
|
37
|
+
weaver-work-cli --json meeting run meeting.invitation.render --input-json \
|
|
38
|
+
'{"mt_name":"研讨AI对接会议管理落地","begin_datetime":"2026-10-31 09:00","end_datetime":"2026-10-31 12:00","address":"120会议室","hrm_members":"易鹏、卜伟领","extra":{"guest_org":"某某集团"}}'
|
|
39
|
+
```
|
|
40
|
+
|
|
20
41
|
## 出参
|
|
21
42
|
|
|
22
|
-
`filePath` / `fileName` / `bytes` / `meetingId` / `meetingName` / `filledFields[]` / `pendingFields[]
|
|
43
|
+
`filePath` / `fileName` / `bytes` / `meetingId` / `meetingName` / `filledFields[]` / `pendingFields[]` / **`dataSource`**,以及 `warnings`(有待补充字段时会列出)。
|
|
44
|
+
|
|
45
|
+
| `dataSource` | 含义 |
|
|
46
|
+
| --- | --- |
|
|
47
|
+
| `meeting` | 按会议真实数据生成(`mtId` 模式),字段最全 |
|
|
48
|
+
| `payload` | 按申请单字段预生成(无 `mtId` 模式),属**预置函**,请人工核对 |
|
|
23
49
|
|
|
24
50
|
议程相关三个字段:
|
|
25
51
|
|
|
@@ -12,10 +12,11 @@
|
|
|
12
12
|
|
|
13
13
|
## 命令
|
|
14
14
|
|
|
15
|
+
> **默认按 EB 版执行,不需要先探测环境模式。** EB 在当前环境走不通时,CLI 会自动实探标准版、把环境模式固化成 `standard`,并返回 `api/env_fallback`(带 `details.standardOperation` 指明该改用哪个 operation)。只有要回答用户"当前是 EB 还是标准版"时,才跑 `meeting.env.detect --refresh` 实探。
|
|
16
|
+
|
|
15
17
|
Windows PowerShell:
|
|
16
18
|
|
|
17
19
|
```powershell
|
|
18
|
-
weaver-work-cli --json meeting run meeting.env.detect --input-json '{}'
|
|
19
20
|
weaver-work-cli --json meeting run meeting.list --input-json '{"filterDate":"2026-09-11"}'
|
|
20
21
|
weaver-work-cli --json meeting today
|
|
21
22
|
weaver-work-cli --json meeting run meeting.room.list --input-json '{"beginDate":"2026-09-11 09:00","endDate":"2026-09-11 10:00","onlyAvailable":true}'
|
|
@@ -28,7 +29,6 @@ weaver-work-cli --json meeting run meeting.detail.field --input-json '{"id":"<
|
|
|
28
29
|
macOS/Linux(bash/zsh):
|
|
29
30
|
|
|
30
31
|
```bash
|
|
31
|
-
weaver-work-cli --json meeting run meeting.env.detect --input-json '{}'
|
|
32
32
|
weaver-work-cli --json meeting run meeting.list --input-json '{"filterDate":"2026-09-11"}'
|
|
33
33
|
weaver-work-cli --json meeting today
|
|
34
34
|
weaver-work-cli --json meeting run meeting.room.list --input-json '{"beginDate":"2026-09-11 09:00","endDate":"2026-09-11 10:00","onlyAvailable":true}'
|
|
@@ -43,11 +43,14 @@ weaver-work-cli --json meeting run meeting.detail.field --input-json '{"id":"<
|
|
|
43
43
|
- `meeting.list` 返回 `meetings[]`(含 `id`/`name`/`beginDatetime`/`endDatetime`/`address`/`mtStatus`),按开始时间升序输出 Markdown 表格;CLI 自动翻页拉全量后做客户端 `filterDate` 过滤。
|
|
44
44
|
- `meeting.room.list` 返回 `rooms[]`(`disabled` 已归一化为布尔)与 `availableRooms[]`;带时间范围时 `disabled=true` 即该时段已被占用。
|
|
45
45
|
- `meeting.calendar.base` 返回 `createBaseData`:`onlyFlowCreate`(0=可手动建会 1=只能流程建会)、`workFlowBaseIds`、`repeatWorkFlowBaseIds`、`existWorkFlow`。
|
|
46
|
-
- `meeting.env.detect` 返回 `mode: "eb" | "standard"
|
|
47
|
-
-
|
|
48
|
-
- `
|
|
49
|
-
-
|
|
46
|
+
- `meeting.env.detect` 返回 `mode: "eb" | "standard"`:
|
|
47
|
+
- **没有探测结论时直接返回 `mode:"eb"` + `assumed:true`**(默认 EB,不冒烟、不写缓存、零网络请求);
|
|
48
|
+
- 命中缓存时返回 `fromCache:true`(按 baseUrl 固化);
|
|
49
|
+
- `refresh: true` 才实探:EB 冒烟优先,失败回退标准版,**成功即写缓存**;标准版回退时附带 `ebSmokeFailed`/`ebSmokeError`;
|
|
50
|
+
- `assumed:true` 只是默认假设,**不能当作"当前环境是 EB 版"的结论回答用户**;
|
|
50
51
|
- 两者冒烟均失败时报 `env_unavailable`(环境未配置完整,禁止强行执行)。
|
|
52
|
+
- **EB 失败降级**:EB operation 在环境级不可用时返回 `api/env_fallback`,`details` 含 `ebOperation` / `ebError` / `standardOperation`(对等标准版 operation,`null` 表示标准版没有该能力)/ `envModeUpdated`(`standard` 表示已固化缓存;`null` 表示只是偶发 5xx、未改缓存)。收到后按 `standardOperation` 重试,**不要**再跑 `meeting.env.detect`。
|
|
53
|
+
- 权限(403)、登录失效、参数校验、业务策略(`conflict_rejected` 等)**不会**触发降级 —— 换成标准版也一样失败,按原错误处理。
|
|
51
54
|
|
|
52
55
|
## 注意
|
|
53
56
|
|
|
@@ -9,9 +9,11 @@
|
|
|
9
9
|
1. **CLI**:`weaver-work-cli --version`。未安装或读取失败 → **必须先提示用户先补齐**(安装方式以共享规则为准,Agent 不能自行安装)。
|
|
10
10
|
2. **共享规则**:先读 `../weaver-e10-shared/SKILL.md`(安装、E10 认证、JSON 输出、高风险写入规则)。
|
|
11
11
|
3. **登录态**:`weaver-work-cli auth status --json` → `valid=true`;否 `=` `session_expired` 时按共享规则处理,**禁止**自行拼 Cookie。
|
|
12
|
-
4.
|
|
13
|
-
- `
|
|
12
|
+
4. **环境模式(默认 EB,不做前置探测)**:直接按 `meeting.eb.*` 执行即可。
|
|
13
|
+
- 无探测结论时 `meeting.env.detect` 会返回 `mode=eb` + `assumed:true`(**默认假设,不是探测结论**)。
|
|
14
|
+
- EB 真走不通会返回 `api/env_fallback`,此时 CLI 已实探标准版并把模式固化为 `standard`,按 `details.standardOperation` 改用标准版 operation;`standardOperation=null` 表示标准版没有该能力。
|
|
14
15
|
- **两套接口与数据互不相通**,在 EB 环境调标准版接口只会拿到空数据(反之亦然)。
|
|
16
|
+
- 只有要回答"当前是 EB 还是标准版"时,才跑 `meeting.env.detect --refresh` 实探。
|
|
15
17
|
5. **多租户提醒**:同一账号在不同站点(baseUrl)看到的会议不同;验证前先记录 `baseUrl` 与 `userId`,写入类验证**只用自建数据**。
|
|
16
18
|
|
|
17
19
|
## 2. 验证纪律(硬规则,违反即结论无效)
|
|
@@ -44,7 +46,7 @@
|
|
|
44
46
|
|
|
45
47
|
| # | operation | 风险 | 必填入参 | 判据 | 回读 / 清理 |
|
|
46
48
|
|---|---|---|---|---|---|
|
|
47
|
-
| 1 | `meeting.env.detect` | read | — |
|
|
49
|
+
| 1 | `meeting.env.detect` | read | — | 无缓存时返回 `mode=eb` + `assumed:true`(零请求);`refresh:true` 才实探 | — |
|
|
48
50
|
| 2 | `meeting.calendar.base` | read | — | 返回工作日/时段等日历基础设置 | — |
|
|
49
51
|
| 3 | `meeting.detail.field` | read | `id` | `R-DETAIL` | 用 `meeting.list` 取 id |
|
|
50
52
|
| 4 | `meeting.list` | read | — | `R-LIST`(客户端按 `filterDate` 过滤,天然覆盖各角色) | — |
|
|
@@ -272,9 +274,9 @@ weaver-work-cli --json meeting run meeting.eb.meeting.create.prepare --input-jso
|
|
|
272
274
|
你是会议模块的验证执行方。请读取本 skill 的 references/meeting-verification.md,按其中的顺序与判据,
|
|
273
275
|
对当前环境的会议功能做一次**全量验证**(标准版 28 + EB 版 91 + 跨模式 13,共 132 个 operation):
|
|
274
276
|
|
|
275
|
-
1.
|
|
276
|
-
2.
|
|
277
|
-
写入按「prepare → 我给确认 → apply → 回读 → 清理」四步走,**只用自建数据**(名称带 CLI-VERIFY-
|
|
277
|
+
1. 先做先决条件(CLI 版本、共享规则、登录态),并记录 `baseUrl` / `userId`;**环境模式默认按 EB 走,不要前置探测**——需要确认到底是 EB 还是标准版时,才跑 `meeting.env.detect --refresh` 实探(`assumed:true` 不算结论),把结果报给我。
|
|
278
|
+
2. 默认执行 EB 版 operation(第 4 节表格),逐条对判据;只读直接跑,
|
|
279
|
+
写入按「prepare → 我给确认 → apply → 回读 → 清理」四步走,**只用自建数据**(名称带 CLI-VERIFY- 前缀)。若某条返回 `api/env_fallback`,说明本环境是标准版,按 `details.standardOperation` 换标准版重跑并记录。
|
|
278
280
|
3. 第 6 节的 8 项不在范围,**不要尝试**,如实说明即可;第 7 节的 15 个负向用例必须逐个跑。
|
|
279
281
|
4. 任何失败都要给出原始 error.type/subtype 与报错文案,禁止把失败写成"没有数据"。
|
|
280
282
|
5. 最后按第 8 节模板给我一份完整回执,并列出未清理干净的数据 id。
|
|
Binary file
|
|
@@ -104,11 +104,11 @@ OKR 目标在不同租户走**两套互不兼容的接口链路**,由 `okr.ver
|
|
|
104
104
|
|
|
105
105
|
- 遇到 `partial`、`write_uncertain`、登录失效、回查失败或网络中断,立即停止当前写流程,不自动重试写入。
|
|
106
106
|
- 认证类错误(`authentication`/`session_expired`):停止当前操作并读取 `weaver-e10-shared` 的认证规则。
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
107
|
+
- 已有 XiaoE 会话的 `session_expired` 已由 CLI 底层自动换票并重放一次;若错误最终仍返回,Agent 只反馈并停止,不执行任何登录命令、其他登录 Skill 或原业务命令。
|
|
108
|
+
- 仅首次无会话或明确的 `auth not found` 才由 Agent 复用任务开始时的宿主判定。
|
|
109
|
+
- 首次认证明确为 XiaoE 时,执行一次 `weaver-work-cli auth xiaoe`;返回 `authentication/xiaoe_credential_unavailable` 时停止,不回退浏览器登录。
|
|
110
|
+
- 首次认证且非 XiaoE 时不得执行 `auth xiaoe`;取得用户确认的真实 E10 登录域名后,执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
|
|
111
|
+
- 显式登录后读操作可重新执行;写操作不得复用旧 continuation,必须重新 prepare 并重新确认。已返回 `partial/write_uncertain` 时先只读回查,禁止直接重放写入。
|
|
112
112
|
- `policy/link_unsupported`:当前链路没有该能力,不要换接口硬试,按 reference 中的替代路径处理。
|
|
113
113
|
- `validation/link_filter_unsupported`:ebuilder 链路列表不支持该筛选条件,改用 `query_scope=self` 或 `principalid` + 周期条件。
|
|
114
114
|
- `validation/period_quarter_invalid`、`validation/scope_data_id_required`、`validation/principal_dept_required`:补齐周期/部门参数后重试 prepare。
|
|
@@ -573,7 +573,7 @@
|
|
|
573
573
|
}
|
|
574
574
|
},
|
|
575
575
|
"artifactBaseline": {
|
|
576
|
-
"aggregateSha256": "
|
|
576
|
+
"aggregateSha256": "85e2d5c138f4a2c399e9a6aece690be88c53801e269504c63236292e61ea51b1",
|
|
577
577
|
"files": [
|
|
578
578
|
{
|
|
579
579
|
"path": "src/shortcuts/okr/errors.ts",
|
|
@@ -647,8 +647,8 @@
|
|
|
647
647
|
},
|
|
648
648
|
{
|
|
649
649
|
"path": "skills/weaver-e10-okr/SKILL.md",
|
|
650
|
-
"size":
|
|
651
|
-
"sha256": "
|
|
650
|
+
"size": 11399,
|
|
651
|
+
"sha256": "1fea70a1b74d4b089a1efc2f7e615ec9fb44a0afef895d43fcb1daaac5cd5b4c"
|
|
652
652
|
},
|
|
653
653
|
{
|
|
654
654
|
"path": "docs/okr.md",
|
|
@@ -110,11 +110,11 @@ weaver-work-cli --json plan run <operation> --input-json '{"key":"value"}'
|
|
|
110
110
|
## 失败处理
|
|
111
111
|
|
|
112
112
|
- 认证类错误(`authentication` / `session_expired`):停止当前操作并读取 `weaver-e10-shared` 的认证规则。
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
113
|
+
- 已有 XiaoE 会话的 `session_expired` 已由 CLI 底层自动换票并重放一次;若错误最终仍返回,Agent 只反馈并停止,不执行任何登录命令、其他登录 Skill 或原业务命令。
|
|
114
|
+
- 仅首次无会话或明确的 `auth not found` 才由 Agent 复用任务开始时的宿主判定。
|
|
115
|
+
- 首次认证明确为 XiaoE 时,执行一次 `weaver-work-cli auth xiaoe`;返回 `authentication/xiaoe_credential_unavailable` 时停止,不回退浏览器登录。
|
|
116
|
+
- 首次认证且非 XiaoE 时不得执行 `auth xiaoe`;取得用户确认的真实 E10 登录域名后,执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。
|
|
117
|
+
- 显式登录后读操作可重新执行;写操作不得复用旧 continuation,必须重新 prepare 并重新确认。已返回 `partial/write_uncertain` 时先只读回查,禁止直接重放写入。
|
|
118
118
|
- `policy` / `link_unsupported`:该能力在当前链路不可用(例如 eb 链路的撤回、提交提醒、评论),按错误 `message` 给出的替代路径处理。
|
|
119
119
|
- `validation` / `not_found` / `report_exists` / `already_published` / `not_published`:属业务前置条件不满足,先向用户说明再决定下一步,禁止反复重试。
|
|
120
120
|
- `partial` / `write_uncertain`:立即停止写入流程,做一次只读回查后向用户说明。
|
|
@@ -5,7 +5,7 @@ display_name_en: Weaver Qiyecheng FNA
|
|
|
5
5
|
description: 泛微齐业成费控中心(预算查询/费用中心/报销报表/借款管理/发票核销)的 E10 查询与提醒写操作能力,通过 weaver-work-cli fna 命令执行。
|
|
6
6
|
description_zh: 泛微齐业成费控中心助手:事前申请单预算详情、预算执行报表、报销/借款/预付核销金额、报销报表 AI 问答(自然语言出部门/期间/费用类型分组报表)、全公司借款汇总与列表、提醒还款、发票核销金额与列表、催票。所有能力通过 weaver-work-cli fna 命令执行,提醒还款与催票为写操作,必须先 prepare 预览并经用户明确确认后 apply。
|
|
7
7
|
description_en: Expense, budget and loan assistant for Weaver Qiyecheng FNA. Queries pre-application budget details, budget execution reports, reimbursed/loan/prepay amounts, natural-language expense reports (grouping by department, period or expense type), company-wide loan summary and list, invoice write-off summary and list. Sends repayment reminders and invoice call-tickets through the weaver-work-cli fna command with a prepare/apply confirmation chain.
|
|
8
|
-
version: 1.0.
|
|
8
|
+
version: 1.0.5
|
|
9
9
|
author: 泛微网络科技股份有限公司
|
|
10
10
|
agent_created: true
|
|
11
11
|
requires:
|
|
@@ -87,6 +87,7 @@ cliHelp: "weaver-work-cli fna --help"
|
|
|
87
87
|
- 费用中心日期口径不同:报销按明细费用日期、借款按流程创建时间、预付核销按核销记录创建时间。
|
|
88
88
|
- 借款费用中心接口 requestId/employeeId/workflowId 只认**数字**(字符串会静默返回空);超 2^53 的巨型 ID 保留字符串并提示人工核验。
|
|
89
89
|
- `fna.expense.chart` 是二开接口(`/api/secondev/fna/getExpenseChart`):服务端只把当前人/当前部门作为**提示文本**拼进 prompt,不做强制过滤,返回可能是全租户数据;个人金额口径必须改用 `fna.expense.reimbursed.sum`(按 `employeeId` 过滤),并在汇报中注明数据范围。
|
|
90
|
+
- `fna.expense.chart` 返回 `meta.permissionDenied=true`(或文案含「权限 / 越权」)表示当前账号数据权限不覆盖该范围,按执行原则第 9 条**立即停住**,不得改调其它接口拼装同一份报表。
|
|
90
91
|
|
|
91
92
|
## 执行原则
|
|
92
93
|
|
|
@@ -98,6 +99,7 @@ cliHelp: "weaver-work-cli fna --help"
|
|
|
98
99
|
6. 金额结论口径存疑时(如借款缺陷、瞬时空响应)先说明不确定性;`total=0` 或空列表提示「暂无记录」,不得伪造成功。
|
|
99
100
|
7. `fna.expense.chart` 的成败看 `data.kind` 而不是 `code`(`code` 恒为 200,追问/拦截也走 success):`rows`/`empty` 属正常,`clarify` 按文案补口径后最多重问一次,`blocked` 换更贴近报销业务的问法而**不是**自己写 SQL;`unexpected` 只描述现象并反馈维护者。
|
|
100
101
|
8. `fna.expense.chart` 每次调用都真实消耗一次大模型对话 + 一次 SQL,一轮对话最多问 1-2 次,禁止循环试探;`maxRows` 只截断本地展示、不改变服务端查询;列名由 AI SQL 别名决定,不要假设固定列名。
|
|
102
|
+
9. **权限拦截即终点(硬规则)**:`fna.expense.chart` 返回 `meta.permissionDenied=true`,或文案明确提示无数据权限 / 越权访问时,把接口原文如实告知用户并说明「当前账号数据权限不足,查不到该范围数据」,然后给出替代路径(换具备该权限的账号 / 请管理员扩权 / 由有权限方导出明细后再分析),由用户决定下一步。**禁止**换问法、换口径继续试探,**禁止**改调 `fna.expense.reimbursed.sum`、`fna.budget.*`、借款 / 发票核销等其它接口按部门 / 人员 / 金额自行拼装同一份报表,**禁止**自写 SQL 绕过——拼装结果与原报表口径不同源,属于越权尝试且极易产出错误结论。详见 [references/expense-chart.md](references/expense-chart.md) 的「无权限时的处理」。
|
|
101
103
|
|
|
102
104
|
## References
|
|
103
105
|
|
|
@@ -106,7 +108,7 @@ cliHelp: "weaver-work-cli fna --help"
|
|
|
106
108
|
| 接口目录与按模块路由 | [references/catalog.md](references/catalog.md) |
|
|
107
109
|
| 预算:事前申请单预算详情 / 预算执行报表 | [references/budget.md](references/budget.md) |
|
|
108
110
|
| 费用中心:报销 / 借款 / 预付核销 | [references/expense-center.md](references/expense-center.md) |
|
|
109
|
-
| 报销报表 AI 问答:自然语言出报表、五个 `kind
|
|
111
|
+
| 报销报表 AI 问答:自然语言出报表、五个 `kind`、无权限硬规则、额度与数据范围风险 | [references/expense-chart.md](references/expense-chart.md) |
|
|
110
112
|
| 借款管理:汇总 / 列表 / 提醒还款(prepare→apply) | [references/loan-management.md](references/loan-management.md) |
|
|
111
113
|
| 发票核销:金额 tab / 列表 / 催票(prepare→apply) | [references/invoice-writeoff.md](references/invoice-writeoff.md) |
|
|
112
114
|
| 源资料指纹与更新检测 | [references/source-manifest.json](references/source-manifest.json) |
|
|
@@ -139,5 +141,6 @@ weaver-work-cli --json fna run fna.loan.main.list --input-json '{"current":1,"pa
|
|
|
139
141
|
|
|
140
142
|
- 借款「确认已还 confirmRepay」、核销明细等页面按钮能力(源资料未提供接口)→ 见 `weaver-work-cli fna schema` 的 `withheldOperations`,不得编造 operation 或直连接口。
|
|
141
143
|
- 报销报表 AI 问答只接受自然语言 `userInput`:不接受自写 SQL、不暴露 AI 生成的 SQL,也没有 `scope=self/dept/tenant` 之类的强制过滤参数(服务端未提供)。
|
|
144
|
+
- 报表返回无权限后改调其它报销/借款/预算/流程接口拼装同一份报表,或自写 SQL 绕过权限边界——属于越权尝试,一律禁止。
|
|
142
145
|
- 姓名/流程名 → ID 的解析、创建借款单/预付单/事前申请单等需联动工作流的写流程(未提供接口依据)。
|
|
143
146
|
- 其它模块(发票票夹、人事、流程待办)请路由到对应 Skill,不在此重复实现。
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
- 报销口径:明细状态 `status=1`(审批完成)的 `reimburse_amount` 合计 = 已报销金额;无数据返回 `0.0`。
|
|
27
27
|
- ⚠️ 借款接口缺陷:仅统计首条借款记录(对外汇报注明);且首次/冷启动可能瞬时空响应(缺 data 键),CLI 自动重试最多 2 次。
|
|
28
28
|
- 借款接口 requestId 等必须传数字;预付核销接口日期按核销记录创建时间、employeeId 匹配预付单创建人。
|
|
29
|
-
- 报销报表 AI 问答(`fna.expense.chart`)是二开接口(`/api/secondev/fna/getExpenseChart`):自然语言进 AI 场景生成 SQL,服务端做租户隔离改写 + 安全校验后执行;返回 `kind=rows/empty/clarify/blocked/unexpected`(`code` 恒为 200,不能用它判成败)。每次调用消耗一次大模型对话 + 一次 SQL,且不做当前人强制过滤,详见 `expense-chart.md
|
|
29
|
+
- 报销报表 AI 问答(`fna.expense.chart`)是二开接口(`/api/secondev/fna/getExpenseChart`):自然语言进 AI 场景生成 SQL,服务端做租户隔离改写 + 安全校验后执行;返回 `kind=rows/empty/clarify/blocked/unexpected`(`code` 恒为 200,不能用它判成败)。每次调用消耗一次大模型对话 + 一次 SQL,且不做当前人强制过滤,详见 `expense-chart.md`。**返回无权限时(`meta.permissionDenied=true` 或文案含「权限 / 越权」)到此为止,不得改调其它接口拼数据,见 `expense-chart.md` 的「无权限时的处理」。**
|
|
30
30
|
|
|
31
31
|
## 三、借款管理(loan,管理员)
|
|
32
32
|
|
|
@@ -55,5 +55,5 @@
|
|
|
55
55
|
|
|
56
56
|
- 失败时按错误 envelope 的 `type/subtype` 处理:`confirmation.required` 缺确认;`partial.write_uncertain` 不确定结果立即停止并回查,禁止自动重试。
|
|
57
57
|
- 无记录时输出 `total=0`/空 `rows` 或 `segments:null`,提示「暂无记录」,不得伪造成功。
|
|
58
|
-
- `fna.expense.chart` 的「有结果」判断看 `kind`(不是 `code`):`code` 恒为 200,追问与安全拦截同样走 `WeaResult.success`;`clarify` 最多重问一次,`blocked` 换业务问法而不是自己写 SQL
|
|
58
|
+
- `fna.expense.chart` 的「有结果」判断看 `kind`(不是 `code`):`code` 恒为 200,追问与安全拦截同样走 `WeaResult.success`;`clarify` 最多重问一次,`blocked` 换业务问法而不是自己写 SQL;`meta.permissionDenied=true` 时不再追问,直接告知权限边界。
|
|
59
59
|
- 全部金额字段单位为元。
|
|
@@ -49,13 +49,25 @@ weaver-work-cli --json fna run fna.expense.chart --input-json '{"userInput":"202
|
|
|
49
49
|
|---|---|---|
|
|
50
50
|
| `rows` | 拿到结果集(`rows`/`columns`/`rowCount`) | 给「结论摘要 + 列名 + 行数」,不原样粘贴长 JSON;`truncated=true` 说明只展示前 `maxRows` 行,`meta.requestedRows` 是服务端实际返回行数 |
|
|
51
51
|
| `empty` | SQL 执行成功但 0 行 | 提示「暂无匹配记录」,可换问法再问一次,不得编造数据 |
|
|
52
|
-
| `clarify` | AI 判定需求不明确,`message` 是追问文案 |
|
|
52
|
+
| `clarify` | AI 判定需求不明确,`message` 是追问文案 | 转述文案,补充时间/部门/口径后**最多再问一次**;若文案属**权限类**(如「需求不明确,请注意权限」,此时 `meta.permissionDenied=true`),直接执行下文「无权限处理」硬规则,不再追问 |
|
|
53
53
|
| `blocked` | AI 生成的 SQL 未通过服务端安全校验 | 说明该问法触发安全拦截,换更贴近报销业务的问法;**不要**自己写 SQL 绕过 |
|
|
54
54
|
| `unexpected` | `data` 类型意外 | 只描述现象,不猜测数据,反馈维护者 |
|
|
55
55
|
|
|
56
56
|
- 列名由 AI 生成 SQL 的别名决定、**不固定**,展示时不要假设 `dept_name` / `total_amount` 一定存在。
|
|
57
57
|
- 金额单位为元;口径由 AI SQL 决定,关键结论建议用 `fna.expense.reimbursed.sum` 等标准接口交叉核对。
|
|
58
58
|
- `kind=clarify/blocked` 是按返回文案推断的(`meta.messageKindInferred=true`),原始 `message` 一并返回,口径存疑时以原文为准。
|
|
59
|
+
- `meta.permissionDenied` 是同一批字符串结果上的稳定布尔字段:文案含「权限 / 越权」即为 `true`(CLI 同时把它归到 `clarify`),其余为 `false`。判断权限时优先读它,不要自己再对中文做正则;`data.kind` 仍是 `rows/empty/clarify/blocked/unexpected` 五个值,不新增 kind。
|
|
60
|
+
|
|
61
|
+
## 无权限时的处理(硬规则)
|
|
62
|
+
|
|
63
|
+
**若报表接口返回无权限(`meta.permissionDenied=true`,即 `kind=clarify` 且文案含「权限」,或文案明确提示无数据权限 / 越权访问),则直接输出该结果,禁止再拼接参数去调用其他报销 / 借款 / 预算等查询接口。**
|
|
64
|
+
|
|
65
|
+
具体约束:
|
|
66
|
+
|
|
67
|
+
1. **到此为止**:把接口原文返回给用户(说明「当前账号数据权限不足,查不到该范围数据」),不再换问法、不再换口径、不再试探。
|
|
68
|
+
2. **不得绕行**:不允许为了「凑出」同一份报表,转而拼接 `fna.expense.reimbursed.sum`、`fna.budget.*`、借款 / 发票核销 / 流程查询(`workflow.search`、`ebuilder-form.*`)等其它接口,按部门 / 人员 / 金额自行拼装数据。这类拼装得到的数字与原报表口径不同源,属于越权尝试,且极易产出错误结论。
|
|
69
|
+
3. **不得自写 SQL**:`raw.sql` 之类需要自行拼 SQL 的方式同样禁止。
|
|
70
|
+
4. **正确做法**:如实告知权限边界 + 给出可行替代路径(换具备该数据权限的账号 / 请管理员扩权 / 由有权限方导出明细文件后再分析),由用户决定下一步。
|
|
59
71
|
|
|
60
72
|
## 注意
|
|
61
73
|
|
|
@@ -64,6 +76,7 @@ weaver-work-cli --json fna run fna.expense.chart --input-json '{"userInput":"202
|
|
|
64
76
|
3. **无服务端 LIMIT**:大租户下可能很慢或返回大量行;`maxRows` 只做本地截断。
|
|
65
77
|
4. **单轮问答**:每次请求生成新的会话 ID,不能凭上一次结果续聊;追问请把上下文重新写进新的 `userInput`。
|
|
66
78
|
5. **二开接口依赖**:路径是 `/api/secondev/fna/`(`FexsCommonController`)。若同租户其它 `fna.*` 正常、只有本 operation 返回 404 或 500,先怀疑该租户未安装 seconddev 的 fna 二开包,不要判为「能力不存在」。
|
|
79
|
+
6. **权限拦截即终点**:返回无权限时按上文「无权限时的处理」执行,直接输出结果,禁止拼接参数改写问法或改调其他报销 / 借款 / 预算接口绕行。
|
|
67
80
|
|
|
68
81
|
## 失败处理
|
|
69
82
|
|
|
@@ -74,5 +87,6 @@ weaver-work-cli --json fna run fna.expense.chart --input-json '{"userInput":"202
|
|
|
74
87
|
| `validation.max_rows_invalid` | `maxRows` 越界 | 用 1-5000 的整数 |
|
|
75
88
|
| `api.server_error`(HTTP 500) | 当前人查不到(服务端 NPE)/ AI 场景异常 / SQL 执行失败 | **不自动重试**;说明可能原因,必要时换标准接口 |
|
|
76
89
|
| `api.business_error` | `code != 200` | 按 `message` 转述,不猜测数据 |
|
|
90
|
+
| 返回无权限(`meta.permissionDenied=true`,文案含「权限 / 越权」) | 当前账号数据权限不覆盖该范围 | **直接输出该结果并说明权限边界**,不再换问法,禁止拼接参数改调其他报销 / 借款 / 预算接口 |
|
|
77
91
|
| `authentication.session_expired` | 登录态失效 | 先向用户确认 E10 登录域名,再刷新登录;不得带失效 Cookie 重试 |
|
|
78
92
|
| `network.timeout` | AI/SQL 串行超过 90s | 换更窄的时间范围;是否重试由用户决定(重试会再消耗一次模型额度) |
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schemaVersion": 2,
|
|
3
3
|
"module": "fna",
|
|
4
4
|
"skill": "weaver-e10-qiyecheng",
|
|
5
|
-
"generatedAt": "2026-10-
|
|
5
|
+
"generatedAt": "2026-10-30T11:22:07.931Z",
|
|
6
6
|
"generatedFrom": {
|
|
7
7
|
"kind": "user-provided-folder",
|
|
8
8
|
"sourceRoots": [
|
|
@@ -557,7 +557,7 @@
|
|
|
557
557
|
}
|
|
558
558
|
},
|
|
559
559
|
"artifactBaseline": {
|
|
560
|
-
"aggregateSha256": "
|
|
560
|
+
"aggregateSha256": "bc00a72b5448ee047ebfe3a224281bce87d7a35745fec7eb19b2f9673a841424",
|
|
561
561
|
"files": [
|
|
562
562
|
{
|
|
563
563
|
"path": "src/shortcuts/fna/manifest.ts",
|
|
@@ -640,14 +640,14 @@
|
|
|
640
640
|
{
|
|
641
641
|
"path": "src/shortcuts/index.ts",
|
|
642
642
|
"role": "generated",
|
|
643
|
-
"size":
|
|
644
|
-
"sha256": "
|
|
643
|
+
"size": 7750,
|
|
644
|
+
"sha256": "e12effd55fa2bc226f257762fc5061a9cca402fdea7a0efee0399b23afdf01b9"
|
|
645
645
|
},
|
|
646
646
|
{
|
|
647
647
|
"path": "test/business/fna-operations.test.ts",
|
|
648
648
|
"role": "generated",
|
|
649
|
-
"size":
|
|
650
|
-
"sha256": "
|
|
649
|
+
"size": 26986,
|
|
650
|
+
"sha256": "1dc4526a89e2e5fea11748eda841c1a6960fd57bf3971bc8ad3f4a047268d15e"
|
|
651
651
|
},
|
|
652
652
|
{
|
|
653
653
|
"path": "test/business/fna-host.test.ts",
|
|
@@ -658,14 +658,14 @@
|
|
|
658
658
|
{
|
|
659
659
|
"path": "docs/fna.md",
|
|
660
660
|
"role": "generated",
|
|
661
|
-
"size":
|
|
662
|
-
"sha256": "
|
|
661
|
+
"size": 7032,
|
|
662
|
+
"sha256": "e6ddd7ff74f049ec71210007fbd78887e74afabdd346b8c06863a866d27da7c3"
|
|
663
663
|
},
|
|
664
664
|
{
|
|
665
665
|
"path": "docs/_catalog.md",
|
|
666
666
|
"role": "generated",
|
|
667
|
-
"size":
|
|
668
|
-
"sha256": "
|
|
667
|
+
"size": 5515,
|
|
668
|
+
"sha256": "efb1dfb14eb3f97565046c406237c2b0c6f5bd41063acaa30b1772ab88e84187"
|
|
669
669
|
},
|
|
670
670
|
{
|
|
671
671
|
"path": "docs/SKILL.md",
|
|
@@ -676,8 +676,8 @@
|
|
|
676
676
|
{
|
|
677
677
|
"path": "skills/weaver-e10-qiyecheng/SKILL.md",
|
|
678
678
|
"role": "generated",
|
|
679
|
-
"size":
|
|
680
|
-
"sha256": "
|
|
679
|
+
"size": 15116,
|
|
680
|
+
"sha256": "ecc74612a2ff5802d3c05cfab2414787cc7538b040d55729961b75c48234796f"
|
|
681
681
|
},
|
|
682
682
|
{
|
|
683
683
|
"path": "skill-template/product.json",
|
|
@@ -688,8 +688,8 @@
|
|
|
688
688
|
{
|
|
689
689
|
"path": "skills/weaver-e10-qiyecheng/references/catalog.md",
|
|
690
690
|
"role": "generated",
|
|
691
|
-
"size":
|
|
692
|
-
"sha256": "
|
|
691
|
+
"size": 5254,
|
|
692
|
+
"sha256": "07e2a8477fabb3458127cf61933c156ee8bfc1537cf7ff9c89a47c65dca5504c"
|
|
693
693
|
},
|
|
694
694
|
{
|
|
695
695
|
"path": "skills/weaver-e10-qiyecheng/references/budget.md",
|
|
@@ -718,8 +718,8 @@
|
|
|
718
718
|
{
|
|
719
719
|
"path": "skill-template/business-info.json",
|
|
720
720
|
"role": "generated",
|
|
721
|
-
"size":
|
|
722
|
-
"sha256": "
|
|
721
|
+
"size": 9027,
|
|
722
|
+
"sha256": "aa2dcebc6e186761b4953a856a86d6d9acdfc227e39b107a293326f574f69f1c"
|
|
723
723
|
},
|
|
724
724
|
{
|
|
725
725
|
"path": "skill-template/domains/qiyecheng.md",
|
|
@@ -730,14 +730,14 @@
|
|
|
730
730
|
{
|
|
731
731
|
"path": "src/shortcuts/fna/operations/expense-chart.ts",
|
|
732
732
|
"role": "generated",
|
|
733
|
-
"size":
|
|
734
|
-
"sha256": "
|
|
733
|
+
"size": 7065,
|
|
734
|
+
"sha256": "c2e9e724144149ba20e9fa9aa8ca82617940b5ad6d77355305d65507151f4d56"
|
|
735
735
|
},
|
|
736
736
|
{
|
|
737
737
|
"path": "skills/weaver-e10-qiyecheng/references/expense-chart.md",
|
|
738
738
|
"role": "generated",
|
|
739
|
-
"size":
|
|
740
|
-
"sha256": "
|
|
739
|
+
"size": 7529,
|
|
740
|
+
"sha256": "7dae4ebfa5b1306299112e9474fbf0e340271a7ae5ba21d00ff84f8a5ab0def3"
|
|
741
741
|
}
|
|
742
742
|
]
|
|
743
743
|
},
|
|
@@ -747,6 +747,7 @@
|
|
|
747
747
|
"已知实现缺陷与口径(借款仅统计首条、日期口径差异、menuCode/permissionSetCode 环境相关、超 2^53 ID 保留字符串)写入 docs/fna.md 与 Skill references。",
|
|
748
748
|
"2026-09-09 由 weaver-e10-skill-maker 首次生成:CLI 命令后缀 fna、Skill 后缀 qiyecheng。",
|
|
749
749
|
"fna.expense.chart 只暴露自然语言 userInput,不接受也不回传 AI 生成的 SQL;data 由 CLI 归一化为 kind=rows/empty/clarify/blocked/unexpected,clarify 与 blocked 按文案推断并在 meta.messageKindInferred 标注;每次调用消耗一次大模型对话 + 一次 SQL,CLI 超时 180s。",
|
|
750
|
-
"2026-10-26 集成报销报表 AI 问答:新增 GET /api/secondev/fna/getExpenseChart(userInput 必填 ≤500 字、maxRows 本地截断 1-5000),同步 CLI operation、host 路径白名单、SKILL.md/catalog/docs/domain 与测试。"
|
|
750
|
+
"2026-10-26 集成报销报表 AI 问答:新增 GET /api/secondev/fna/getExpenseChart(userInput 必填 ≤500 字、maxRows 本地截断 1-5000),同步 CLI operation、host 路径白名单、SKILL.md/catalog/docs/domain 与测试。",
|
|
751
|
+
"2026-10-30 报销报表新增「无权限禁止绕行」硬规则:expense-chart 的字符串结果在文案命中「权限 / 越权」时归类为 clarify 并输出 meta.permissionDenied=true(纯权限提示不带「不明确」也识别,避免落进 unexpected),kind 枚举不变;Agent 侧必须停住并告知权限边界,禁止改调 reimbursed.sum / budget.* / 借款 / 核销等接口按部门或人员拼装同一份报表,也禁止自写 SQL 绕过。SKILL.md 执行原则第 9 条与 expense-chart.md「无权限时的处理」为权威口径。"
|
|
751
752
|
]
|
|
752
753
|
}
|