e10-data 0.1.25 → 0.1.27
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/CHANGELOG.md +110 -0
- package/README.md +58 -1
- package/bin/e10-data.mjs +174 -11
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,115 @@
|
|
|
1
1
|
# 变更记录
|
|
2
2
|
|
|
3
|
+
## 0.1.27(2026-10-15)—— 新增 `noun scope`:词库按生效范围批量检索
|
|
4
|
+
|
|
5
|
+
### 1. `noun` 族新增子命令 `scope`
|
|
6
|
+
|
|
7
|
+
- 端点:`POST /api/dw/newetl/chatBi/doc/getChatBiDocByScopeId`,**请求体 = 数据集 id 的 JSON 数组**(`List<Long>`,必填非空)。
|
|
8
|
+
- 入参(`--ids <id1,id2|@ids.json>`)= **数据集 id 列表**,即 `e10-data scene items --group <分组id>` 输出里每个条目的 `id`
|
|
9
|
+
(`ChatBiDataset.id`;接口条目与数据源条目同等适用)。支持逗号分隔或 `@文件`(JSON 数组或逗号串,沿用 `readListArg`)。
|
|
10
|
+
- **id 一律按字符串下发**:19 位雪花号超出 JS 安全整数(2^53),`Number()` 会丢精度
|
|
11
|
+
(实测 `Number("1060565684758507544")` 末位归零)→ 下发即检不到、且**不报错**,故 JSON 数组元素用字符串形态。
|
|
12
|
+
- 命中范围(服务端):`deleteType=0` 且同租户 且(`allScope=1` 全局词库 **或** `scopeEffectId LIKE '%<任一传入 id>%'`)
|
|
13
|
+
⇒ **全局词库恒返回**,与传入哪些 id 无关。
|
|
14
|
+
- 输出:`--json` = `{ scopeIds, count, globalCount, scopedCount, docs[] }`(`docs` 只留 `keyword` / `synonyms` / `wordExplain` / `allScope` / `scopeEffectId` / `docType`);
|
|
15
|
+
人读 = 逐条打印名词并标注生效范围(全局 / 数据集),「只命中全局词库」时额外给提示。
|
|
16
|
+
- 边界(实测):GET 不可用(业务失败);空数组 → `{"code":500,"msg":"getChatBiDocByScopeId.arg0: can not be empty"}`;
|
|
17
|
+
超出 `Long` 上限的位数 → 500;合法但未命中的 id **不报错**,只返回全局词库。
|
|
18
|
+
- ⚠️ **本命令为新增通道,不影响原有 `noun list`**(`getChatDocsBySkillKey`,仍按 skillKey + 数据源三参数检索,行为与输出完全不变);两条通道并存,`noun list` 的既有调用方无需改动。
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
e10-data noun scope --ids 1060565684758507544,1060565684758507545 # 人读:批量取回该数据集的词库
|
|
22
|
+
e10-data noun scope --ids @ids.json --json # ids.json = ["1060565684758507544","1060565684758507545"]
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### 2. 同步改动
|
|
26
|
+
|
|
27
|
+
- `CMD_SUBS` 白名单 `noun: ["list"]` → `noun: ["list", "scope"]`;`main()` 的 `noun` 分支新增 `scope`;
|
|
28
|
+
`usage()` 的 `noun` 帮助段新增 `noun scope` 条目;头部注释 `noun` 一行改为 `list|scope`;
|
|
29
|
+
`README.md` / `CHANGELOG.md` / `package.json`(版本 + description)同步。
|
|
30
|
+
|
|
31
|
+
## 0.1.26(2026-10-15)—— 新增 `refusal rules`:拒答话术规则
|
|
32
|
+
|
|
33
|
+
### 1. `refusal` 族新增子命令 `rules`
|
|
34
|
+
|
|
35
|
+
- 端点:`/api/dw/newetl/chatBi/getRefusalSpeechRules`,**无入参**(CLI 不传任何参数,也不提供任何入参开关 —— 参数面比 `refusal get` 更窄);
|
|
36
|
+
返回对象的 `data` = **需要使用的对象数组**(拒答话术规则清单,字段由后端定义、**CLI 不裁剪不改写**;允许为空数组 `[]`,**空 ≠ 失败**)。
|
|
37
|
+
- 调用方式**完全比照 `refusal get`**(同一族、同一策略,排障口径统一):
|
|
38
|
+
- 默认 `--http auto` = 先发 **POST 空 multipart 表单** → 判定拿不到 `data` 才回退 **`GET`(不带 query)**,任一条拿到 `data` 即止
|
|
39
|
+
(正常路径只发 1 次请求;回退仅在首条拿不到 `data` 时触发);
|
|
40
|
+
- `--http post` = 仅 POST 空表单;`--http get` = 仅 GET;取值非法直接报用法错误。
|
|
41
|
+
- 输出:人读直接打印 `data` 数组(漂亮 JSON,缩进 1;空数组打印 `[]` 并向 stderr 提示「拒答话术规则 0 条」);
|
|
42
|
+
`--json` = 原样输出整个响应对象(成功标记看 `actionMsg.code`,无顶层 `code`/`msg`)。
|
|
43
|
+
- 排障:`E10_DATA_DEBUG=1` 向 stderr 打印实际生效通道;两种通道均未拿到 `data` → 抛错并列出每条通道的 `code/msg`;
|
|
44
|
+
凭据失效(401)**不换通道重试**,直接报登录态失效(与 `refusal get` 同口径)。
|
|
45
|
+
- 与 `refusal get` 的**差异仅两点**:① 无入参(表单不带字段 / GET 不带 query);② `data` 是数组而非字符串。
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
e10-data refusal rules # 人读:直接打印规则数组
|
|
49
|
+
e10-data refusal rules --json # 原样输出整个响应对象(data 数组 + actionMsg)
|
|
50
|
+
e10-data refusal rules --http get # 锁定 GET 单通道
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### 2. 同步改动
|
|
54
|
+
|
|
55
|
+
- `CMD_SUBS` 白名单 `refusal: ["get"]` → `refusal: ["get", "rules"]`;
|
|
56
|
+
`main()` 的 `refusal` 分支新增 `rules`;`usage()` 的 `refusal` 帮助段新增 `rules` 条目;
|
|
57
|
+
头部注释新增 `refusal rules` 一行;`README.md` / `CHANGELOG.md` / `package.json`(版本 + description)同步。
|
|
58
|
+
另见 §4:`refusal get` / `refusal rules` 的通道循环抽出为共用实现 `refusalTryModes`(含错误归因,两条命令口径同源)。
|
|
59
|
+
|
|
60
|
+
### 3. 实测确认(2026-10-15)
|
|
61
|
+
|
|
62
|
+
**最终结论(12:43,服务端修复后复测通过)**:
|
|
63
|
+
|
|
64
|
+
- ✅ **POST 空 multipart 表单(不带任何字段)即命中**:`POST /api/dw/newetl/chatBi/getRefusalSpeechRules` →
|
|
65
|
+
`{"data":[…6 条规则…],"actionMsg":{"code":0,"message":"成功"}}` ⇒ **`auto` 正常路径只发 1 次请求**(POST 先命中)。
|
|
66
|
+
- ✅ **GET 同样可用**,且实测 `--http get` 与 `--http post` 的返回体**逐字相同**(`stdout` 全等)⇒ 两条通道均可,
|
|
67
|
+
不存在"只吃其中一条"的情况。
|
|
68
|
+
- **实测数据形状(`data` = 对象数组,6 条)**:元素字段 = `id` / `createTime` / `updateTime` / `creator` / `tenantKey` /
|
|
69
|
+
`deleteType` / `confKey` / `confValue`(话术正文)/ `confAttrs`(命中条件)[/ `confPlan`];
|
|
70
|
+
`confKey` 实测清单 = `加载完成_1`、`交付前_1`、`交付前_2`、`业务域确认完成_1`(带 `confPlan`)、`交付前_3`、`取数前_1`。
|
|
71
|
+
- **人读输出**实测:stderr `# 规则 6 条` + stdout 漂亮 JSON 数组(stdout 纯净,可重定向)。
|
|
72
|
+
|
|
73
|
+
**排障时间线(保留记录,非当前状态)**:本次实测跨了三个阶段,前两阶段的结论**已被推翻**,留档用于复现排障思路 ——
|
|
74
|
+
|
|
75
|
+
1. **401(登录态整体过期)**:首次测试时请求在网关层即被拒 ——
|
|
76
|
+
`HTTP 401 {"error":"authentication required","code":-2,"logout_url":"/_zt/logout?…"}`;
|
|
77
|
+
同一时刻 `getRefusalSpeechTechnique` / `getSceneGroups` 乃至配置中心接口**全部返回同一个 401** ⇒ 属**登录态整体过期**
|
|
78
|
+
(`weaver-work-cli auth status` 报 `loggedIn:true, valid:false`、凭据文件停留在前一日),非本命令特有问题。
|
|
79
|
+
重新登录(`weaver-work-cli auth login` / `auth xiaoe`)后即恢复。
|
|
80
|
+
2. **业务 500(服务端未就绪)**:登录态恢复后,请求能被业务逻辑受理,但**6 种请求形态全部返回同一个笼统业务错误** ——
|
|
81
|
+
空 multipart 表单 / multipart 带 `type` / JSON `{}` / JSON 带 `type` / urlencoded 空 / GET(无 query)/ GET 带 `type`、`skillKey`
|
|
82
|
+
⇒ 一律 `HTTP 200 {"code":500,"msg":"请求失败,请稍后再试","status":false,"fail":true}`;
|
|
83
|
+
追加 POST 上下文维度(AgentType UA、`agentType`/`isAgent` 头、表单 `datasetClient=agent`、`referer=/sp/ebddesigner/…`、
|
|
84
|
+
JSON `{datasetClient:"agent"}`)**响应逐字相同** ⇒ 与客户端可变的任何维度都无关。
|
|
85
|
+
同时确认**路由存在**(同前缀错误路径返回 `HTTP 404 Not Found`,与业务 500 可区分)⇒ 非路径错、非认证问题、非缺参。
|
|
86
|
+
该阶段催生了 §4 的错误归因改进(当时报错只写"已尝试 N 种通道",容易把排障方向带偏成"通道选错了")。
|
|
87
|
+
3. **↗ 服务端修复后(12:43)复测通过** —— 即本节的最终结论;**CLI 侧自始至终未做任何针对性改动**,
|
|
88
|
+
第 2 阶段的失败纯属服务端未就绪(或内部异常被折叠成该笼统错误)。
|
|
89
|
+
|
|
90
|
+
### 4. 错误归因改进(2026-10-15,未发布即改,不新开版本)
|
|
91
|
+
|
|
92
|
+
**问题**(由 §3 的实测暴露):`refusal get` / `refusal rules` 在"各通道都没拿到 `data`"时,只报
|
|
93
|
+
`已尝试 N 种通道 → post: code=500 … | get: code=500 …`。这句话把**两种性质完全不同**的失败混为一谈,
|
|
94
|
+
容易把排障方向带偏成"通道选错了",而实际可能是"请求已被业务逻辑受理、只是业务上失败"(如本接口的笼统 500)。
|
|
95
|
+
|
|
96
|
+
**改法**:
|
|
97
|
+
|
|
98
|
+
- 把通道循环从 `refusalCall` 中**抽出为共用实现 `refusalTryModes({label, ctx, modes, request, hasData})`**,
|
|
99
|
+
`refusal get` 与 `refusal rules` **共用同一份**(口径不会悄悄漂移);`refusalRequest` / `refusalRulesRequest` 保留为各自的取数函数。
|
|
100
|
+
- 新增 `refusalBusinessFail(r)`:识别**业务错误**(HTTP 200 但 `fail:true` / `status:false` / `code` 非 0),
|
|
101
|
+
非业务错误则维持原「`code=… msg=(无 data 字段)`」写法。
|
|
102
|
+
- 仅当**所有**失败都是业务错误时,在报错末尾补一句:
|
|
103
|
+
`;提示:以上均为业务错误(HTTP 200 + 业务码失败)—— 非通道问题,请以 msg 为准排查服务端/配置`;
|
|
104
|
+
若混有网络异常 / 无 `data` 字段,则**不补**(那种情况换通道仍有意义)。
|
|
105
|
+
- **行为不变**:分类只影响报错文案,**不改变「auto 两条通道都试」**、也不改变 401 立即中止的既有逻辑。
|
|
106
|
+
|
|
107
|
+
**验证(隔离单元测试,7/7 通过)**:把本文件复制一份、把末尾 `main()` 换成 `export { refusalTryModes }` 后,
|
|
108
|
+
用假 `request` 函数覆盖 ① 首条命中只发 1 次请求、② 首条业务错误仍回退且第二条命中、③ 全业务错误含归因提示、
|
|
109
|
+
④ 混合失败(网络异常 + 业务错误)不误报归因、⑤ 无 `data` 且无错误码如实提示、⑥ 401 立即中止不换通道、
|
|
110
|
+
⑦ 单通道 + 自定义上下文文案正确。真实接口侧同时确认:所有 `type` 目前均返回 `配置不存在`,
|
|
111
|
+
即 `refusal get` 在本环境暂无可用样本(与 2026-10-13 记录的 `type=Extraterritorial` 可命中**已不一致**,疑为该租户配置被移除)。
|
|
112
|
+
|
|
3
113
|
## 0.1.25(2026-10-14)—— 新增 `scene groups|items`:场景定位元数据
|
|
4
114
|
|
|
5
115
|
### 1. 新命令族 `scene`(子命令 `groups` / `items`)
|
package/README.md
CHANGED
|
@@ -20,13 +20,14 @@ e10-data login xiaoe-env [--domain <url>] 登录:环境变量 Xi
|
|
|
20
20
|
e10-data query <--conn <connId> --model <ebuilder|flow|eteams|attend|hr|document|dw|blog> --schema <数据库> [--table-id <流程ID>] [--debug true|false] --dsl @file.json>
|
|
21
21
|
e10-data ds tables|fields|list|chart|stat|count 数据源(业务模块)取数与元数据
|
|
22
22
|
e10-data doc count|list 文档查询(documentListCount + documentList)
|
|
23
|
-
e10-data noun list
|
|
23
|
+
e10-data noun list|scope 词库查询(list = 按 skill/数据源;scope = 按生效范围批量,2026-10-15 新增)
|
|
24
24
|
e10-data field id2name|name2id 关联字段翻译(testRemoteBrowser / complete)
|
|
25
25
|
e10-data conf get|batch|batch-file|group|group-file|resolve|resolve-file|add|add-file|update|delete 环境参数配置中心(chatBi config map,替代 config-resolve 脚本 URL 直连;confType 默认按 CONN_/DS_/WF_/API_ 前缀推导,可 --type 显式;confType=api 时支持 confGroup 分组,见下)
|
|
26
26
|
e10-data exp status|manifest|commits|file|pull|init|commit|lock|release|rollback 专家包版本管理
|
|
27
27
|
e10-data attend statis 考勤假期余额统计 getAttendInfoStatis(hr-attendance 病假/事假等,v0.1.5 新增)
|
|
28
28
|
e10-data module call 模块配置接口调用(配置中心驱动;已确定「哪个模块的哪条具体接口」之后的统一取数入口,v0.1.21 新增)
|
|
29
29
|
e10-data refusal get --type <type> 拒答话术 getRefusalSpeechTechnique(入参 type → data 话术字符串,v0.1.23 新增)
|
|
30
|
+
e10-data refusal rules 拒答话术规则 getRefusalSpeechRules(**无入参** → data 对象数组,v0.1.26 新增)
|
|
30
31
|
e10-data scene groups|items 场景定位元数据 getSceneGroups(① 分组骨架 ② 组内条目;**不取业务数据**,v0.1.25 新增)
|
|
31
32
|
```
|
|
32
33
|
|
|
@@ -75,6 +76,7 @@ e10-data ds count --group weaver-project-servicetask --table 715738355537494016
|
|
|
75
76
|
e10-data ds fields --group weaver-formreport-service --table 1307487628041044060
|
|
76
77
|
e10-data doc count --name 智能问数
|
|
77
78
|
e10-data noun list --skill rd-department
|
|
79
|
+
e10-data noun scope --ids 1060565684758507544,1060565684758507545 # 词库:按生效范围(数据集 id)批量取回
|
|
78
80
|
e10-data field id2name --module ebuilder/form --type ebuilder --ids 3194494277170470571 \
|
|
79
81
|
--form-param '{"fieldId":"966849910772850766","module":"ebuilderform"}'
|
|
80
82
|
e10-data conf get CONN_EC_EDCAPP # 读配置中心单条
|
|
@@ -95,6 +97,8 @@ e10-data attend statis --user 6264843388578732287 --begin 2026-09-01 --end 2026-
|
|
|
95
97
|
e10-data refusal get --type <type> # 拒答话术(人读:直接打印话术正文)
|
|
96
98
|
e10-data refusal get --type <type> --json # 原样输出整个响应对象(data + actionMsg)
|
|
97
99
|
e10-data refusal get --type <type> --http get # 强制走 GET ?type=(默认 auto:POST 表单优先、失败回退 GET)
|
|
100
|
+
e10-data refusal rules # 拒答话术规则(无入参;人读:直接打印 data 数组)
|
|
101
|
+
e10-data refusal rules --json # 原样输出整个响应对象(data 数组 + actionMsg)
|
|
98
102
|
# 无凭据时先登录(环境变量里的 XiaoE 全局 token 换 ETEAMSID)
|
|
99
103
|
XIAOE_USER_TOKEN=<XiaoE token> XIAOE_DOMAIN=<erpa域名> e10-data login xiaoe-env --domain https://www.e-cology.com.cn
|
|
100
104
|
```
|
|
@@ -341,6 +345,10 @@ e10-data refusal get --type <type> [--http auto|post|get] [--json]
|
|
|
341
345
|
- **`--json`**:原样输出整个响应对象(`{"data":"…","actionMsg":{"code":0,"message":"成功"}}`;**成功标记看 `actionMsg.code`,无顶层 `code`/`msg`**),供脚本 / Agent 消费。
|
|
342
346
|
- **排障**:`E10_DATA_DEBUG=1` 时向 **stderr** 打印实际生效的通道(`post` / `get`),stdout 保持纯净。
|
|
343
347
|
- **两种通道均未拿到 `data`**:抛错并列出每条通道的 `code/msg`;凭据失效(401)时**不换通道重试**,直接报登录态失效。
|
|
348
|
+
- **报错归因(v0.1.26 起)**:若各通道返回的都是**业务错误**(HTTP 200 + 业务码失败,如 `{"code":500,"fail":true}`),
|
|
349
|
+
报错末尾会补一句 `;提示:以上均为业务错误(HTTP 200 + 业务码失败)—— 非通道问题,请以 msg 为准排查服务端/配置`,
|
|
350
|
+
避免误判成通道选择问题;若失败里**混有网络异常 / 无 `data` 字段**等情况,则不补该句(此时换通道仍有意义)。
|
|
351
|
+
**注意:该分类只影响报错文案,不改变「auto 两条通道都试」的行为。**
|
|
344
352
|
|
|
345
353
|
```bash
|
|
346
354
|
# 人读:直接拿到话术正文
|
|
@@ -353,6 +361,55 @@ e10-data refusal get --type 1 --json
|
|
|
353
361
|
e10-data refusal get --type 1 --http get
|
|
354
362
|
```
|
|
355
363
|
|
|
364
|
+
## refusal rules 拒答话术规则(v0.1.26 新增)
|
|
365
|
+
|
|
366
|
+
**用途**:查询**拒答话术规则清单**(命中拒答场景时要使用的规则集合)。接口 `/api/dw/newetl/chatBi/getRefusalSpeechRules`,
|
|
367
|
+
**无入参**,返回对象中的 `data` 即**需要使用的对象数组**(规则清单)。
|
|
368
|
+
|
|
369
|
+
```bash
|
|
370
|
+
e10-data refusal rules [--http auto|post|get] [--json]
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
| 参数 | 说明 |
|
|
374
|
+
|---|---|
|
|
375
|
+
| (无位置参数) | 该接口**不接收任何入参**,CLI 也不提供任何入参开关(参数面比 `refusal get` 更窄) |
|
|
376
|
+
| `--http` | 通道,**语义与 `refusal get` 完全一致**:`auto`(默认)= 先 POST **空** multipart 表单 → 返回不含 `data` 时**自动回退** `GET`(不带 query),任一条拿到 `data` 即止;`post` = 仅 POST 空表单;`get` = 仅 `GET` |
|
|
377
|
+
|
|
378
|
+
- **返回契约**:`data` 为**对象数组**(每个元素一条规则,字段由后端定义、**CLI 不裁剪不改写**);允许为空数组 `[]`(语义 = 当前无规则,**空 ≠ 调用失败**)。
|
|
379
|
+
- **已实测的接口契约**(2026-10-15,泛微网络租户 `t7akvdnf84`):**POST 空 multipart 表单即命中** ——
|
|
380
|
+
`POST /api/dw/newetl/chatBi/getRefusalSpeechRules`(表单不带任何字段)→
|
|
381
|
+
`{"data":[…6 条规则…],"actionMsg":{"code":0,"message":"成功"}}`;**GET 同样可用,且返回体与 POST 逐字相同**
|
|
382
|
+
⇒ `auto` 正常路径**只发 1 次请求**。
|
|
383
|
+
- **规则元素字段**(接口原样下发,CLI **不裁剪不改写**):
|
|
384
|
+
|
|
385
|
+
| 字段 | 含义 |
|
|
386
|
+
|---|---|
|
|
387
|
+
| `confKey` | 规则标识,如 `加载完成_1`、`交付前_1/2/3`、`业务域确认完成_1`、`取数前_1` |
|
|
388
|
+
| `confValue` | **话术正文**(含 `<datasetName>` 等占位符,交付前需替换) |
|
|
389
|
+
| `confAttrs` | **命中条件**(判定说明) |
|
|
390
|
+
| `confPlan` | 可选;带选项计划时出现(如 `业务域确认完成_1` 会给出后续问题选项) |
|
|
391
|
+
| `id` / `createTime` / `updateTime` / `creator` / `tenantKey` / `deleteType` | 记录元信息 |
|
|
392
|
+
|
|
393
|
+
- **人读输出**:直接打印 `data` 数组(漂亮 JSON,缩进 1);空数组打印 `[]` 并向 **stderr** 提示「拒答话术规则 0 条」,**stdout 保持纯净**(可安全重定向/管道)。
|
|
394
|
+
- **`--json`**:原样输出整个响应对象(`{"data":[…],"actionMsg":{"code":0,"message":"成功"}}`;**成功标记看 `actionMsg.code`,无顶层 `code`/`msg`**),供脚本 / Agent 消费。
|
|
395
|
+
- **排障**:`E10_DATA_DEBUG=1` 时向 **stderr** 打印实际生效的通道(`post` / `get`)。
|
|
396
|
+
- **两种通道均未拿到 `data`**:抛错并列出每条通道的 `code/msg`;凭据失效(401)时**不换通道重试**,直接报登录态失效。
|
|
397
|
+
- **报错归因(v0.1.26 起)**:若各通道返回的都是**业务错误**(HTTP 200 + 业务码失败,如 `{"code":500,"fail":true}`),
|
|
398
|
+
报错末尾会补一句 `;提示:以上均为业务错误(HTTP 200 + 业务码失败)—— 非通道问题,请以 msg 为准排查服务端/配置`,
|
|
399
|
+
避免误判成通道选择问题;若失败里**混有网络异常 / 无 `data` 字段**等情况,则不补该句(此时换通道仍有意义)。
|
|
400
|
+
**注意:该分类只影响报错文案,不改变「auto 两条通道都试」的行为。**
|
|
401
|
+
|
|
402
|
+
```bash
|
|
403
|
+
# 人读:直接打印规则数组
|
|
404
|
+
e10-data refusal rules
|
|
405
|
+
|
|
406
|
+
# 取结构化结果(Agent / 脚本)
|
|
407
|
+
e10-data refusal rules --json
|
|
408
|
+
|
|
409
|
+
# 该端点确认走 GET 时,锁定单通道(少一次探测请求)
|
|
410
|
+
e10-data refusal rules --http get
|
|
411
|
+
```
|
|
412
|
+
|
|
356
413
|
## scene groups|items 场景定位元数据(v0.1.25 新增)
|
|
357
414
|
|
|
358
415
|
**用途**:E10「场景分组 → 接口/数据源」两级**定位**(**不取业务数据**)。端点 `/api/dw/newetl/chatBi/getSceneGroups`
|
package/bin/e10-data.mjs
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* 该值取自 ebdf_obj.app_id(2026-10-09 起不再做 EB 权限前置校验);
|
|
18
18
|
* 不带 appId 时按原样发送,由后端报错(CLI 不做拦截)
|
|
19
19
|
* e10-data doc count|list 文档查询 documentListCount / documentList
|
|
20
|
-
* e10-data noun list
|
|
20
|
+
* e10-data noun list|scope 词库:list = getChatDocsBySkillKey(按 skill/数据源);scope = getChatBiDocByScopeId(按生效范围批量)
|
|
21
21
|
* e10-data field id2name|name2id 关联字段翻译 testRemoteBrowser / complete
|
|
22
22
|
* e10-data conf get|batch|batch-file|group|group-file|resolve|resolve-file|add|add-file|update|delete
|
|
23
23
|
* 环境参数配置中心(chatBi config map,替代 config-resolve 脚本 URL 直连;
|
|
@@ -30,6 +30,8 @@
|
|
|
30
30
|
* 复用本 CLI 凭据缓存与 conf 通道、零临时文件
|
|
31
31
|
* e10-data refusal get 拒答话术 getRefusalSpeechTechnique(入参 type → data 话术字符串;
|
|
32
32
|
* auto 通道 = POST 表单优先、GET ?type= 回退,2026-10-13)
|
|
33
|
+
* e10-data refusal rules 拒答话术规则 getRefusalSpeechRules(**无入参** → data 对象数组;
|
|
34
|
+
* auto 通道 = POST 空表单优先、GET 回退;2026-10-15 实测 POST 空表单即命中(6 条规则))
|
|
33
35
|
* e10-data scene groups|items 场景定位元数据 getSceneGroups(2026-10-14 新增)
|
|
34
36
|
* groups 分组骨架(每个分组带 groupDesc =【场景】【触发词】【取数顺序】)
|
|
35
37
|
* items 组内条目(interface=接口 / datasource=数据源,每条带 datasetDesc)
|
|
@@ -47,6 +49,7 @@
|
|
|
47
49
|
* node e10-data.mjs ds count --group weaver-project-servicetask --table 715738355537494016
|
|
48
50
|
* node e10-data.mjs doc count --name 测试
|
|
49
51
|
* node e10-data.mjs noun list --skill rd-department
|
|
52
|
+
* node e10-data.mjs noun scope --ids 1060565684758507544,1060565684758507545
|
|
50
53
|
* node e10-data.mjs field id2name --module ebuilder/form --type ebuilder \
|
|
51
54
|
* --ids 3194494277170470571 --form-param '{"fieldId":"966849910772850766","module":"ebuilderform"}'
|
|
52
55
|
*/
|
|
@@ -708,13 +711,13 @@ async function cmdLoginXiaoeEnv(args, json) {
|
|
|
708
711
|
const CMD_SUBS = {
|
|
709
712
|
ds: ["groups", "find", "describe", "tables", "fields", "fields-dsl", "list", "chart", "stat", "count"],
|
|
710
713
|
doc: ["count", "list"],
|
|
711
|
-
noun: ["list"],
|
|
714
|
+
noun: ["list", "scope"],
|
|
712
715
|
field: ["id2name", "name2id"],
|
|
713
716
|
conf: ["get", "batch", "batch-file", "group", "group-file", "resolve", "resolve-file", "add", "add-file", "update", "delete"],
|
|
714
717
|
exp: ["status", "manifest", "commits", "file", "pull", "init", "commit", "lock", "release", "rollback"],
|
|
715
718
|
attend: ["statis"],
|
|
716
719
|
module: ["call"],
|
|
717
|
-
refusal: ["get"],
|
|
720
|
+
refusal: ["get", "rules"],
|
|
718
721
|
scene: ["groups", "items"],
|
|
719
722
|
};
|
|
720
723
|
function commandIsKnown(pos) {
|
|
@@ -1638,6 +1641,74 @@ async function cmdNoun(args, json) {
|
|
|
1638
1641
|
}
|
|
1639
1642
|
}
|
|
1640
1643
|
|
|
1644
|
+
// noun scope(2026-10-15 新增)—— 按生效范围批量检索词库 getChatBiDocByScopeId
|
|
1645
|
+
// 入参 = 数据集 id 列表(Long 数组)= 场景定位(scene items --group <gid>)里每个条目的 id
|
|
1646
|
+
// ⚠️ id 一律按**字符串**下发:19 位雪花号超出 JS 安全整数(2^53),Number() 会丢精度
|
|
1647
|
+
// (实测 Number("1060565684758507544") 末位归零)→ 下发即检不到,且不报错。
|
|
1648
|
+
const DOC_SCOPE_PATH = "/api/dw/newetl/chatBi/doc/getChatBiDocByScopeId";
|
|
1649
|
+
|
|
1650
|
+
/** 词库条目 → 模型真正要用的精简字段(+ 生效范围标识,便于判「有无专属词库」) */
|
|
1651
|
+
function normalizeDoc(d) {
|
|
1652
|
+
return {
|
|
1653
|
+
keyword: d.keyword ?? null,
|
|
1654
|
+
synonyms: d.synonyms ?? null,
|
|
1655
|
+
wordExplain: d.wordExplain ?? null,
|
|
1656
|
+
allScope: d.allScope ?? null, // 0=表级别 1=所有数据集 2=WorkBuddy Skill
|
|
1657
|
+
scopeEffectId: d.scopeEffectId ?? null,
|
|
1658
|
+
docType: d.docType ?? null,
|
|
1659
|
+
};
|
|
1660
|
+
}
|
|
1661
|
+
|
|
1662
|
+
/** --ids:逗号/空白分隔的 id 串,或 @文件(JSON 数组或逗号串)→ 字符串 id 数组(去重保序) */
|
|
1663
|
+
function parseScopeIds(val) {
|
|
1664
|
+
const raw = String(readListArg(val) ?? "").trim();
|
|
1665
|
+
const ids = raw.split(/[,\s]+/).map((s) => s.trim().replace(/^["']|["']$/g, "")).filter(Boolean);
|
|
1666
|
+
if (!ids.length) throw new Error("--ids 为空:请传数据集 id 列表(如 --ids 1060565684758507544,1060565684758507545 或 --ids @ids.json)");
|
|
1667
|
+
for (const id of ids) {
|
|
1668
|
+
if (!/^\d+$/.test(id)) throw new Error("--ids 含非法项「" + id + "」(须为数字型数据集 id,取自 scene items 的条目 id)");
|
|
1669
|
+
if (BigInt(id) > 9223372036854775807n) throw new Error("--ids 含超出 Long 上限的 id:" + id);
|
|
1670
|
+
}
|
|
1671
|
+
return [...new Set(ids)];
|
|
1672
|
+
}
|
|
1673
|
+
|
|
1674
|
+
/** 按生效范围批量取词库 → { scopeIds, count, globalCount, scopedCount, docs } */
|
|
1675
|
+
async function fetchDocsByScope(ids) {
|
|
1676
|
+
const r = await postJson(DOC_SCOPE_PATH, ids.map(String));
|
|
1677
|
+
const bad = r && typeof r === "object" && !Array.isArray(r)
|
|
1678
|
+
&& ((r.code !== undefined && Number(r.code) !== 0) || r.fail === true);
|
|
1679
|
+
if (bad) throw new Error("getChatBiDocByScopeId 业务失败:code=" + r.code + " msg=" + (r.msg || "(无 msg)"));
|
|
1680
|
+
const docs = ((r && r.data) || []).map(normalizeDoc);
|
|
1681
|
+
return {
|
|
1682
|
+
scopeIds: ids,
|
|
1683
|
+
count: docs.length,
|
|
1684
|
+
globalCount: docs.filter((d) => d.allScope === 1).length,
|
|
1685
|
+
scopedCount: docs.filter((d) => d.allScope !== 1).length,
|
|
1686
|
+
docs,
|
|
1687
|
+
};
|
|
1688
|
+
}
|
|
1689
|
+
|
|
1690
|
+
async function cmdNounScope(args, json) {
|
|
1691
|
+
const ids = parseScopeIds(need("ids", args));
|
|
1692
|
+
const out = await fetchDocsByScope(ids);
|
|
1693
|
+
if (json) return out;
|
|
1694
|
+
console.log("== 词库 " + out.count + " 条(生效范围 id " + ids.length + " 个;全局 " + out.globalCount
|
|
1695
|
+
+ " + 数据集级 " + out.scopedCount + ")==");
|
|
1696
|
+
if (!out.count) {
|
|
1697
|
+
console.log("(空词库:该环境未返回任何词库条目)");
|
|
1698
|
+
return;
|
|
1699
|
+
}
|
|
1700
|
+
for (const d of out.docs) {
|
|
1701
|
+
const tag = d.allScope === 1 ? "全局" : (d.allScope === 2 ? "Skill" : "数据集");
|
|
1702
|
+
const scope = d.allScope === 1 ? "全部数据" : (d.scopeEffectId || "");
|
|
1703
|
+
console.log("【" + (d.keyword || "") + "】" + (d.synonyms ? " 同义:" + d.synonyms : "")
|
|
1704
|
+
+ " [" + tag + " " + scope + "]");
|
|
1705
|
+
if (d.wordExplain) console.log(" " + String(d.wordExplain).replace(/\n/g, " "));
|
|
1706
|
+
}
|
|
1707
|
+
if (out.scopedCount === 0) {
|
|
1708
|
+
console.log("(提示:本次只命中全局词库,所选数据集均无专属词库 —— 为确定结论)");
|
|
1709
|
+
}
|
|
1710
|
+
}
|
|
1711
|
+
|
|
1641
1712
|
// ---------------- field:关联字段翻译 ----------------
|
|
1642
1713
|
function customParamFromArgs(args) {
|
|
1643
1714
|
if (args["form-param"]) return { formParam: args["form-param"] };
|
|
@@ -2700,27 +2771,58 @@ async function refusalRequest(mode, type) {
|
|
|
2700
2771
|
if (mode === "get") return getUrl(REFUSAL_PATH + "?type=" + encodeURIComponent(type));
|
|
2701
2772
|
return postMultipart(REFUSAL_PATH, { type }); // 与 fieldsForDSL 同口径:multipart 表单字段 type
|
|
2702
2773
|
}
|
|
2703
|
-
//
|
|
2704
|
-
|
|
2705
|
-
|
|
2774
|
+
// ---- 通道选择与错误分类(refusal get / refusal rules 共用,2026-10-15 抽出)----
|
|
2775
|
+
// 为什么共用:两条命令的通道策略必须**逐字同源**,否则口径会悄悄漂移(一个改了另一个忘记改)。
|
|
2776
|
+
// 「没拿到 data」其实是两种性质完全不同的情况,必须分开报,否则排障方向会跑偏:
|
|
2777
|
+
// ① **业务错误**:HTTP 200 但业务码失败(fail:true / status:false / code 非 0)⇒ 请求**已被业务逻辑受理**,
|
|
2778
|
+
// 换通道不会改变结果。2026-10-15 实测 getRefusalSpeechRules 的 6 种请求形态返回**同一个** code=500,
|
|
2779
|
+
// 就是典型情形(详见 CHANGELOG 0.1.26 §3)——此时应照 msg 查服务端/配置,而不是继续换通道。
|
|
2780
|
+
// ② **形态不符**:响应正常但就是没有 data 字段(如裸 ResultBean、非 JSON 包装)⇒ 才值得换通道再试。
|
|
2781
|
+
// 注意:分类只影响**报错文案**,不改变「auto 两条通道都试」的行为(避免误杀"第一条通道不支持、第二条能用"的端点)。
|
|
2782
|
+
function refusalBusinessFail(r) {
|
|
2783
|
+
if (!r || typeof r !== "object") return null;
|
|
2784
|
+
const code = r.code;
|
|
2785
|
+
const bad = r.fail === true || r.status === false || (code !== undefined && Number(code) !== 0);
|
|
2786
|
+
if (!bad) return null;
|
|
2787
|
+
return "code=" + code + " msg=" + (r.msg || r.message || r.error || "(无 msg)");
|
|
2788
|
+
}
|
|
2789
|
+
/** 依序试通道:拿到 data 即返回 { r, mode };全失败则抛出「含每通道明细 + 业务错误归因」的错误 */
|
|
2790
|
+
async function refusalTryModes({ label, ctx, modes, request, hasData }) {
|
|
2706
2791
|
const tried = [];
|
|
2792
|
+
let allBusiness = true; // 「全部失败都是业务错误」时才敢断言"换通道没用"
|
|
2707
2793
|
for (const mode of modes) {
|
|
2708
2794
|
let r;
|
|
2709
2795
|
try {
|
|
2710
|
-
r = await
|
|
2796
|
+
r = await request(mode);
|
|
2711
2797
|
} catch (e) {
|
|
2712
2798
|
const msg = (e && e.message) || String(e);
|
|
2713
2799
|
if (/登录态失效|401/.test(msg)) throw e; // 凭据问题与「通道选哪条」无关,不换通道重试(避免重复报错)
|
|
2714
2800
|
tried.push(mode + ": " + msg);
|
|
2801
|
+
allBusiness = false;
|
|
2715
2802
|
continue;
|
|
2716
2803
|
}
|
|
2717
|
-
if (
|
|
2718
|
-
if (process.env.E10_DATA_DEBUG) console.error("[debug]
|
|
2804
|
+
if (hasData(r)) {
|
|
2805
|
+
if (process.env.E10_DATA_DEBUG) console.error("[debug] " + label + " 命中通道=" + mode);
|
|
2719
2806
|
return { r, mode };
|
|
2720
2807
|
}
|
|
2721
|
-
|
|
2808
|
+
const biz = refusalBusinessFail(r);
|
|
2809
|
+
if (biz) tried.push(mode + ": " + biz);
|
|
2810
|
+
else { tried.push(mode + ": code=" + (r && r.code) + " msg=" + ((r && r.msg) || "(无 data 字段)")); allBusiness = false; }
|
|
2722
2811
|
}
|
|
2723
|
-
throw new Error("
|
|
2812
|
+
throw new Error(label + " 调用失败(" + ctx + ")已尝试 " + modes.length + " 种通道 → " + tried.join(" | ")
|
|
2813
|
+
+ (allBusiness && tried.length
|
|
2814
|
+
? ";提示:以上均为业务错误(HTTP 200 + 业务码失败)—— 非通道问题,请以 msg 为准排查服务端/配置"
|
|
2815
|
+
: ""));
|
|
2816
|
+
}
|
|
2817
|
+
// 返回 { r, mode }:r = 命中的响应体,mode = 实际生效的通道(post/get),供排障展示
|
|
2818
|
+
async function refusalCall(type, httpMode) {
|
|
2819
|
+
return refusalTryModes({
|
|
2820
|
+
label: "getRefusalSpeechTechnique",
|
|
2821
|
+
ctx: "type=" + type,
|
|
2822
|
+
modes: httpMode === "auto" ? ["post", "get"] : [httpMode],
|
|
2823
|
+
request: (mode) => refusalRequest(mode, type),
|
|
2824
|
+
hasData: refusalHasData,
|
|
2825
|
+
});
|
|
2724
2826
|
}
|
|
2725
2827
|
async function cmdRefusalGet(args, json) {
|
|
2726
2828
|
const type = need("type", args);
|
|
@@ -2737,6 +2839,55 @@ async function cmdRefusalGet(args, json) {
|
|
|
2737
2839
|
console.log(typeof d === "object" ? JSON.stringify(d, null, 1) : String(d));
|
|
2738
2840
|
}
|
|
2739
2841
|
|
|
2842
|
+
// ---------------- refusal rules:拒答话术规则 getRefusalSpeechRules(2026-10-15 新增)----------------
|
|
2843
|
+
// 端点:/api/dw/newetl/chatBi/getRefusalSpeechRules
|
|
2844
|
+
// 入参:**无**(CLI 不传任何参数,也不提供任何入参开关 —— 参数面比 refusal get 更窄)
|
|
2845
|
+
// 返回:对象,其中 data = **需要使用的对象数组**(拒答话术规则清单;可能为空数组 [],空 ≠ 失败)
|
|
2846
|
+
// 通道选择:与 refusal get **完全同口径**(同一族、同一策略,便于排障时口径统一):
|
|
2847
|
+
// auto(默认)= 先 POST 空 multipart 表单 → 判定拿不到 data 才回退 GET;任一条拿到 data 即止
|
|
2848
|
+
// (正常路径只发 1 次请求,回退仅在首条拿不到 data 时触发);可 --http post|get 强制单一通道。
|
|
2849
|
+
// 与 refusal get 的差异仅两点:① 无入参(表单不带字段 / GET 不带 query);② data 是数组而非字符串。
|
|
2850
|
+
// ✅ 2026-10-15 实测确认(泛微网络租户 t7akvdnf84):**POST 空 multipart 表单即命中** ——
|
|
2851
|
+
// 返回 { data: [6 条规则], actionMsg: { code: 0, message: "成功" } };GET 同样可用且**返回体与 POST 逐字相同**
|
|
2852
|
+
// (实测 `--http get` 与 `--http post` 的 stdout 完全一致)⇒ auto 正常路径**只发 1 次请求**(POST 先命中)。
|
|
2853
|
+
// 规则元素字段(接口原样下发,CLI 不裁剪):id / createTime / updateTime / creator / tenantKey /
|
|
2854
|
+
// deleteType / confKey(如「加载完成_1」「交付前_1」「取数前_1」)/ confValue(话术正文)/
|
|
2855
|
+
// confAttrs(命中条件)/ confPlan(可选,如「业务域确认完成_1」带选项计划)。
|
|
2856
|
+
const REFUSAL_RULES_PATH = "/api/dw/newetl/chatBi/getRefusalSpeechRules";
|
|
2857
|
+
// 有效返回判定:对象且带 data 字段(data 允许为空数组 —— 语义是「当前无规则」,不等于失败)
|
|
2858
|
+
function refusalRulesHasData(r) {
|
|
2859
|
+
return !!r && typeof r === "object" && r.data !== undefined && r.data !== null;
|
|
2860
|
+
}
|
|
2861
|
+
async function refusalRulesRequest(mode) {
|
|
2862
|
+
if (mode === "get") return getUrl(REFUSAL_RULES_PATH);
|
|
2863
|
+
return postMultipart(REFUSAL_RULES_PATH, {}); // 与 refusal get 同口径:multipart 表单,但无字段
|
|
2864
|
+
}
|
|
2865
|
+
// 返回 { r, mode }:r = 命中的响应体,mode = 实际生效的通道(post/get),供排障展示。
|
|
2866
|
+
// 通道循环与错误分类统一走 refusalTryModes —— 与 refusal get **同一份实现**(口径不会漂移)。
|
|
2867
|
+
async function refusalRulesCall(httpMode) {
|
|
2868
|
+
return refusalTryModes({
|
|
2869
|
+
label: "getRefusalSpeechRules",
|
|
2870
|
+
ctx: "该接口无入参",
|
|
2871
|
+
modes: httpMode === "auto" ? ["post", "get"] : [httpMode],
|
|
2872
|
+
request: (mode) => refusalRulesRequest(mode),
|
|
2873
|
+
hasData: refusalRulesHasData,
|
|
2874
|
+
});
|
|
2875
|
+
}
|
|
2876
|
+
async function cmdRefusalRules(args, json) {
|
|
2877
|
+
const httpMode = args.http === undefined ? "auto" : String(args.http).toLowerCase();
|
|
2878
|
+
if (!REFUSAL_HTTP_MODES.includes(httpMode)) throw new Error("--http 值必须为 " + REFUSAL_HTTP_MODES.join("|") + "(当前: " + args.http + ")");
|
|
2879
|
+
const { r } = await refusalRulesCall(httpMode);
|
|
2880
|
+
if (json) return r; // 原样输出整个响应对象(含 data)
|
|
2881
|
+
const d = r.data;
|
|
2882
|
+
if (Array.isArray(d)) {
|
|
2883
|
+
if (!d.length) { console.log("[]"); process.stderr.write("# 空:拒答话术规则 0 条\n"); return; }
|
|
2884
|
+
process.stderr.write("# 规则 " + d.length + " 条\n");
|
|
2885
|
+
console.log(JSON.stringify(d, null, 1));
|
|
2886
|
+
return;
|
|
2887
|
+
}
|
|
2888
|
+
console.log(typeof d === "object" ? JSON.stringify(d, null, 1) : String(d));
|
|
2889
|
+
}
|
|
2890
|
+
|
|
2740
2891
|
// ---------------- scene:场景定位元数据 getSceneGroups(2026-10-14 新增)----------------
|
|
2741
2892
|
// 端点:/api/dw/newetl/chatBi/getSceneGroups(别名 /getAgentSceneGroups,等价)
|
|
2742
2893
|
// ① scene groups → 分组骨架(不传 groupId;每个分组带 groupDesc 三段式)
|
|
@@ -2907,6 +3058,11 @@ doc 文档查询
|
|
|
2907
3058
|
doc list [同上条件] [--all 翻页到底] [--page N] [--size 100]
|
|
2908
3059
|
noun 词库查询
|
|
2909
3060
|
noun list --skill <skillKey> [--source-type LOGIC] [--source-group gid] [--source-table tid](数据源场景带三参数)
|
|
3061
|
+
noun scope --ids <id1,id2|@ids.json> [--json] # 2026-10-15 新增:按生效范围批量检索
|
|
3062
|
+
# 端点 /api/dw/newetl/chatBi/doc/getChatBiDocByScopeId(POST,body = 数据集 id 的 JSON 数组)
|
|
3063
|
+
# 入参 = **数据集 id 列表** = scene items --group <分组id> 里每个条目的 id 字段(接口/数据源条目同等适用)
|
|
3064
|
+
# 命中范围:allScope=1(所有数据集,恒返回)∪ scopeEffectId 含任一传入 id(数据集级)
|
|
3065
|
+
# ⚠️ id 按字符串下发(19 位雪花号超 2^53);空列表会被后端拒绝(arg0: can not be empty)
|
|
2910
3066
|
field 关联字段翻译
|
|
2911
3067
|
field id2name --module <m> --type <t> --ids id1,id2 [--form-param '{"fieldId":"..","module":"ebuilderform"}'|--eb-browser-param '{..}'|--property-type x]
|
|
2912
3068
|
field name2id --module <m> --type <t> --name 名称 [同上附加参数]
|
|
@@ -2958,6 +3114,11 @@ refusal 拒答话术(chatBi,2026-10-13 新增)
|
|
|
2958
3114
|
# --http:auto(默认)= 先 POST multipart 表单(同 ds fields-dsl 口径),
|
|
2959
3115
|
# 返回不含 data 时自动回退 GET ?type=;post = 仅 POST 表单;get = 仅 GET query
|
|
2960
3116
|
# 人读输出直接打印 data 话术正文(空串 → 提示该 type 无话术);--json 原样输出整个响应对象
|
|
3117
|
+
refusal rules [--http auto|post|get] [--json] # 接口 /api/dw/newetl/chatBi/getRefusalSpeechRules
|
|
3118
|
+
# **无入参**(参数面比 get 更窄,CLI 不传任何参数);返回对象的 data = **对象数组**(规则清单)
|
|
3119
|
+
# --http 语义同 refusal get:auto(默认)= 先 POST 空 multipart 表单,返回不含 data 时回退 GET;
|
|
3120
|
+
# post = 仅 POST 空表单;get = 仅 GET(不带 query)
|
|
3121
|
+
# 人读输出直接打印 data 数组(漂亮 JSON;空数组打印 []);--json 原样输出整个响应对象
|
|
2961
3122
|
scene 场景定位元数据(chatBi getSceneGroups,2026-10-14 新增;**不取业务数据**,只做「分组 → 条目」定位)
|
|
2962
3123
|
scene groups [--client agent|all|connector] # ① 分组骨架(groupDesc =【场景】【触发词】【取数顺序】)
|
|
2963
3124
|
scene items --group <groupId> [--client …] # ② 组内条目(每组带 datasetDesc;datasetType 决定分流)
|
|
@@ -3008,6 +3169,7 @@ async function main() {
|
|
|
3008
3169
|
else { usage(); process.exit(1); }
|
|
3009
3170
|
} else if (family === "noun") {
|
|
3010
3171
|
if (sub === "list") result = await cmdNoun(args, json);
|
|
3172
|
+
else if (sub === "scope") result = await cmdNounScope(args, json);
|
|
3011
3173
|
else { usage(); process.exit(1); }
|
|
3012
3174
|
} else if (family === "field") {
|
|
3013
3175
|
if (sub === "id2name") result = await cmdFieldId2name(args, json);
|
|
@@ -3033,6 +3195,7 @@ async function main() {
|
|
|
3033
3195
|
}
|
|
3034
3196
|
} else if (family === "refusal") {
|
|
3035
3197
|
if (sub === "get") result = await cmdRefusalGet(args, json);
|
|
3198
|
+
else if (sub === "rules") result = await cmdRefusalRules(args, json);
|
|
3036
3199
|
else { usage(); process.exit(1); }
|
|
3037
3200
|
} else if (family === "scene") {
|
|
3038
3201
|
if (sub === "groups") result = await cmdSceneGroups(args, json);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "e10-data",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "泛微 E10 数据接口统一 CLI(data-assistant 专家配套):登录(login xiaoe-env,环境变量 XiaoE 全局 token 换 ETEAMSID,免浏览器/免 python)/DSL 查询/数据源/文档/词库/关联字段翻译/环境参数配置中心(conf,支持 confGroup 分组)/专家包版本管理;ds 取数(list/chart/stat/count)的 appId 由调用方显式传入 --app-id(v0.1.14 起 CLI 不再自动反查;EB 建模表单 weaver-ebuilder-form-service 必须带,appId 取自 ebdf_obj.app_id;2026-10-09 起不再做 EB 权限前置校验);认证凭据**唯一来源 = weaver-work-cli**(通过 `auth export-weaver-env` 命令出口取明文凭据,**不设 e10-login 回退**;加解密由该 CLI 自行负责,本 CLI 不实现任何加解密;仅 login xiaoe-env 在无凭据时自行换 token,写 profile 仍交 e10-login set)。v0.1.17 性能改造:免凭据命令(--version/--help/未知命令)提前返回、直连 e10-login JS 入口(去掉 shell:true 的 cmd.exe 开销)、新增凭据进程间 TTL 缓存(不落明文);v0.1.19(2026-09-24)新增 ds 发现层聚合 groups/find/describe(进程内并发,全 58 分组扫表实测 ~5.5s),并修复 ds tables --name 因 listByPage 端点切换导致的关键词过滤静默失效;v0.1.18(2026-09-24)新增 ds fields-dsl(接口 /api/dw/newetl/chatBi/ds/fieldsForDSL),并移除凭据明文镜像同步(不再写 ~/.workbuddy/e10-login-cache.md);v0.1.20(2026-09-24)凭据来源切换为 weaver-work-cli 唯一来源、移除 e10-login 回退,并补齐 userId/tenantKey 传递(修复 attend statis 等命令报「缺少查询人员」的问题)。v0.1.21(2026-09-28)新增 module call —— 模块配置接口调用(配置中心驱动):已确定「哪个模块的哪条具体接口」之后的一条命令取数入口(精取该条 confAttrs → 按 http_method/input_params 组参 → 发请求(自动禁代理 + Cookie/eteamsid/UA 三件套)→ 提取精简结果),与技能自带 script/call_module.py 等价(参数名/退出码/提取口径全对齐),复用本 CLI 凭据缓存与 conf 通道、零临时文件;同时 auth 归一化与凭据缓存补齐 userAgent(供 AgentType UA 使用,缺失时从 cookie 的 agentType= 推导)。v0.1.22(2026-10-10):移除 `eb perm-page` 命令(EB 建模表单取数不再做权限前置校验,appId 直接取 ebdf_obj.app_id);`--fields`/`--group-by`/`--order` 等逗号列表支持 `@文件`(逗号字符串或 JSON 数组,与 --where/--stat/--dsl 一致,规避 shell 拆分导致的静默丢列/0 行)。v0.1.23(2026-10-13)新增 `refusal get` —— 拒答话术 getRefusalSpeechTechnique(入参仅 type,返回对象的 data = 话术字符串;默认 auto 通道 = POST multipart 表单优先、返回不含 data 时自动回退 GET ?type=,可用 --http post|get 锁定单通道)。v0.1.25(2026-10-14)新增 `scene groups|items` —— 场景定位元数据 getSceneGroups(① groups 分组骨架 / ② items --group <groupId> 组内条目),由技能 references/scene-locate/scripts/locate.mjs 整体迁入(属元数据定位接口、不取业务数据):默认输出精简 JSON(groups: groupId/groupName/itemCount/groupDesc;items: id/datasetName/datasetType/sourceId[/moduleName/sourceType/sourceGroupId/appId]/datasetDesc),--json 原样输出接口返回,计数走 stderr;--client agent|all|connector 默认 agent。",
|
|
3
|
+
"version": "0.1.27",
|
|
4
|
+
"description": "泛微 E10 数据接口统一 CLI(data-assistant 专家配套):登录(login xiaoe-env,环境变量 XiaoE 全局 token 换 ETEAMSID,免浏览器/免 python)/DSL 查询/数据源/文档/词库/关联字段翻译/环境参数配置中心(conf,支持 confGroup 分组)/专家包版本管理;ds 取数(list/chart/stat/count)的 appId 由调用方显式传入 --app-id(v0.1.14 起 CLI 不再自动反查;EB 建模表单 weaver-ebuilder-form-service 必须带,appId 取自 ebdf_obj.app_id;2026-10-09 起不再做 EB 权限前置校验);认证凭据**唯一来源 = weaver-work-cli**(通过 `auth export-weaver-env` 命令出口取明文凭据,**不设 e10-login 回退**;加解密由该 CLI 自行负责,本 CLI 不实现任何加解密;仅 login xiaoe-env 在无凭据时自行换 token,写 profile 仍交 e10-login set)。v0.1.17 性能改造:免凭据命令(--version/--help/未知命令)提前返回、直连 e10-login JS 入口(去掉 shell:true 的 cmd.exe 开销)、新增凭据进程间 TTL 缓存(不落明文);v0.1.19(2026-09-24)新增 ds 发现层聚合 groups/find/describe(进程内并发,全 58 分组扫表实测 ~5.5s),并修复 ds tables --name 因 listByPage 端点切换导致的关键词过滤静默失效;v0.1.18(2026-09-24)新增 ds fields-dsl(接口 /api/dw/newetl/chatBi/ds/fieldsForDSL),并移除凭据明文镜像同步(不再写 ~/.workbuddy/e10-login-cache.md);v0.1.20(2026-09-24)凭据来源切换为 weaver-work-cli 唯一来源、移除 e10-login 回退,并补齐 userId/tenantKey 传递(修复 attend statis 等命令报「缺少查询人员」的问题)。v0.1.21(2026-09-28)新增 module call —— 模块配置接口调用(配置中心驱动):已确定「哪个模块的哪条具体接口」之后的一条命令取数入口(精取该条 confAttrs → 按 http_method/input_params 组参 → 发请求(自动禁代理 + Cookie/eteamsid/UA 三件套)→ 提取精简结果),与技能自带 script/call_module.py 等价(参数名/退出码/提取口径全对齐),复用本 CLI 凭据缓存与 conf 通道、零临时文件;同时 auth 归一化与凭据缓存补齐 userAgent(供 AgentType UA 使用,缺失时从 cookie 的 agentType= 推导)。v0.1.22(2026-10-10):移除 `eb perm-page` 命令(EB 建模表单取数不再做权限前置校验,appId 直接取 ebdf_obj.app_id);`--fields`/`--group-by`/`--order` 等逗号列表支持 `@文件`(逗号字符串或 JSON 数组,与 --where/--stat/--dsl 一致,规避 shell 拆分导致的静默丢列/0 行)。v0.1.23(2026-10-13)新增 `refusal get` —— 拒答话术 getRefusalSpeechTechnique(入参仅 type,返回对象的 data = 话术字符串;默认 auto 通道 = POST multipart 表单优先、返回不含 data 时自动回退 GET ?type=,可用 --http post|get 锁定单通道)。v0.1.25(2026-10-14)新增 `scene groups|items` —— 场景定位元数据 getSceneGroups(① groups 分组骨架 / ② items --group <groupId> 组内条目),由技能 references/scene-locate/scripts/locate.mjs 整体迁入(属元数据定位接口、不取业务数据):默认输出精简 JSON(groups: groupId/groupName/itemCount/groupDesc;items: id/datasetName/datasetType/sourceId[/moduleName/sourceType/sourceGroupId/appId]/datasetDesc),--json 原样输出接口返回,计数走 stderr;--client agent|all|connector 默认 agent。v0.1.26(2026-10-15)新增 `refusal rules` —— 拒答话术规则 getRefusalSpeechRules(**无入参**,返回对象的 data = 对象数组;调用方式与 refusal get 同口径:默认 auto 通道 = POST 空 multipart 表单优先、返回不含 data 时回退 GET,可用 --http post|get 锁定单通道;人读直接打印 data 数组,--json 原样输出整个响应对象)。v0.1.27(2026-10-15)新增 `noun scope --ids <id1,id2|@ids.json>` —— 词库**按生效范围批量检索**(端点 /api/dw/newetl/chatBi/doc/getChatBiDocByScopeId,POST body = 数据集 id 的 JSON 数组;入参 = 数据集 id 列表 = `scene items --group <分组id>` 里每个条目的 `id`;命中 = allScope=1 全局词库 ∪ scopeEffectId 含任一传入 id;id 按字符串下发,避免 19 位雪花号超 2^53 丢精度)。属**新增通道**,原 `noun list --skill <skillKey>`(getChatDocsBySkillKey)行为**完全不变**。",
|
|
5
5
|
"author": "e10-dw",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|