e10-data 0.1.30 → 0.1.32

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 CHANGED
@@ -1,5 +1,101 @@
1
1
  # 变更记录
2
2
 
3
+ ## 0.1.32(2026-10-22)—— 新增 `field options`:Select/下拉框字段选项值清单
4
+
5
+ ### 1. 背景
6
+
7
+ 宽表 / EB 表单的 Select 字段在 DSL 查询结果里存的是 **value_key(雪花 ID 编码)**,
8
+ 需要字典翻译才能给中文。旧口径有两条路都走不通:
9
+
10
+ - `field id2name`(testRemoteBrowser)只服务关联浏览按钮字段,对 Select 选项无效;
11
+ - 选项字典物理表(如 `t_vkrevnj43pemg6`)直查实测 500,且各数据集选项字典不固化。
12
+
13
+ 前端同款端点 `GET /api/ebuilder/common/ds/options?fieldName=&objId=&sourceType=&groupId=`
14
+ 实测对两种形态都可用(ETEAMS 宽表 + EB 表单),e10-data 原本未声明,本次收编为子命令。
15
+
16
+ ### 2. 改动
17
+
18
+ - **新增 `field options`**(挂在 `field name2id` 旁,不叫 ds options —— 它是通用下拉框
19
+ 选项方法,不限 DSL/宽表):
20
+
21
+ ```
22
+ field options --group <gid> --obj-id <数据集/表id> --field-name <字段name> [--source-type LOGIC|ETEAMS]
23
+ ```
24
+
25
+ - 端点:`GET /api/ebuilder/common/ds/options?fieldName=&objId=&sourceType=&groupId=`;
26
+ - `--field-name` 用 `ds fields` 返回的 `name`(EB 表单形如 `field_<id>`,ETEAMS 宽表
27
+ 形如 `wtlx` 等拼音缩写);`--obj-id` = 数据集/表 id;
28
+ - `--source-type` **需显式传参**(EB 表单=`LOGIC`、ETEAMS 宽表=`ETEAMS`);代码缺省给
29
+ `LOGIC` 兜底(与 ds 族口径一致),但 ETEAMS 场景漏传会查空,勿依赖默认值;
30
+ - 返回 `{id,name,archive}` 清单(EB 形态选项另带 `extra.valueKey`);`--json` 原样输出;
31
+ - 用途:Select 列存 value_key 时做显示映射,替代已停用的 id2name / 字典表直查。
32
+
33
+ - 改动点:`cmdFieldOptions()` 函数 + field 族 dispatch + `CMD_SUBS.field` 白名单 + 帮助文案。
34
+ - 版本号 0.1.31 → 0.1.32。
35
+
36
+ ### 3. 实测
37
+
38
+ - ETEAMS 宽表:`field options --group -98 --obj-id 1100575534012129280 --field-name wtlx
39
+ --source-type ETEAMS` → 4 项(缺陷 / 转需求 / 技术交流 / 技术交流【废弃】);
40
+ - EB 表单:`field options --group weaver-ebuilder-form-service --obj-id 840720984867880961
41
+ --field-name field_1068528184921841674`(缺省 LOGIC)→ 正常返回。
42
+
43
+ ## 0.1.31(2026-10-21)—— 凭据获取快路径 + cred-helper stale socket 自愈(性能)
44
+
45
+ ### 1. 背景
46
+
47
+ 每条命令启动都要取凭据,`providerWeaverWorkCli()` 用 `spawnSync` 起 **2 个** `weaver-work-cli`
48
+ 子进程:`auth export-weaver-env`(实测 3017 ms)+ `auth status --no-check`(2510 ms),
49
+ 合计约 5.6 s。原因:`weaver-work-cli/dist` 有 4.8 MB / 370 个 JS 文件,每次冷启动全量加载
50
+ (连 `--version` 都 2193 ms),在 0.25 核容器中被放大。而凭据本体只是
51
+ `~/.weaver-work-cli/e10/profiles/<profile>/auth` 一个加密文件,解密约 17 ms。
52
+
53
+ 两个子进程并行无效:实测并发墙钟 5799 ms(CPU 争抢,比串行 5605 ms 更慢)。
54
+
55
+ ### 2. 改动
56
+
57
+ **P1 · 凭据直读快路径(`bin/e10-data.mjs`)**
58
+
59
+ - 新增 `providerAuthFileDirect()`:直接 import `weaver-work-cli` 自带的
60
+ `dist/internal/e10/auth/session.js`,用官方 `E10AuthSession.fromFile()` 同步读+解密,
61
+ 不再加载 `dist/index.js`,**不起子进程**。
62
+ - `getBaseUrl()` / `eteamsId` / `cookieHeader()` / `uaHeader()` 与 `auth export-weaver-env`
63
+ 是同一份实现,语义等价。
64
+ - 挂到 `AUTH_PROVIDERS` 首位;原 CLI 保留为回落(解密失败 / 文件缺失 / 格式变更自动回落)。
65
+ - `weaver-authfile` 登记进 `AUTH_FALLBACK_PROVIDERS`,不写入 authMode memo,避免被锁死。
66
+ - 修正 `loadAuth()` 的排序逻辑:原代码无条件把 `weaver-work-cli` 提到最前,
67
+ 会让新增的快路径失效。
68
+ - 版本号 0.1.30 → 0.1.31。
69
+
70
+ **P2 · cred-helper stale socket 自愈(`bin/e10-cred-helper.mjs`)**
71
+
72
+ - 原逻辑收到 `EADDRINUSE` 即 `exit(0)`。容器被强杀时 helper 来不及 `unlink`,
73
+ 残留 socket 会让**新容器的 helper 永远起不来**,缓存全线失效。
74
+ - 改为:`EADDRINUSE` 时先 connect 探活,无人监听则 `unlink` 残留后重试一次。
75
+
76
+ ### 3. 实测(同环境,0.25 核)
77
+
78
+ | 命令 | 0.1.30 | 0.1.31 |
79
+ |---|---|---|
80
+ | `ds groups` 冷启动 | 6604 / 6712 ms | **1300 / 1302 / 1311 ms** |
81
+ | `ds groups` 同容器第 2 条 | 6587 ms | **198 / 280 / 289 ms** |
82
+ | `noun list --skill …` | 6400~6985 ms | **1202 ms** |
83
+ | 真实 DSL 取数 | 6790 ms | **1303 / 1404 ms** |
84
+ | 一次问数 3 条命令合计 | 9615 ms | **4495 ms** |
85
+
86
+ 结果一致性:两版均返回 `cnt=29, total_people=240`;`noun list` 输出逐字节相同。
87
+
88
+ ### 4. 回滚
89
+
90
+ - `E10_DATA_LEGACY_AUTH=1` → 完全回到子进程路径(实测 7377 ms,结果相同)。
91
+ - 安全边界不变:不落盘、不打日志、不打印任何凭据,仅复用 `weaver-work-cli` 自身解密逻辑。
92
+
93
+ ### 5. 已知边界
94
+
95
+ - 快路径依赖 `weaver-work-cli` 的 `dist/internal/e10/auth/session.js` 存在;
96
+ 路径缺失时自动回落,功能不受影响。
97
+ - 两个 `.mjs` 必须同目录(`e10-data.mjs` 用 `__dirname` 定位 helper)。
98
+
3
99
  ## 0.1.30(2026-10-19)—— `query` 适配 executeQueryDsl 新签名(4 个 URL query 参数 + 显式 Content-Type)
4
100
 
5
101
  ### 1. 背景
@@ -73,17 +73,34 @@ const server = net.createServer((sock) => {
73
73
  sock.on("error", () => { try { sock.destroy(); } catch {} });
74
74
  });
75
75
 
76
+ let _retriedAfterStale = false;
76
77
  server.on("error", (e) => {
77
- // EADDRINUSE:已有持有者在服务 → 本次静默退出,交给它
78
- if (e && (e.code === "EADDRINUSE" || e.code === "EACCES")) process.exit(0);
78
+ // EADDRINUSE:可能是「已有持有者在服务」,也可能是上一轮被强杀留下的 stale socket。
79
+ // 区分:主动 connect 一下,若被拒绝 ⇒ 无持有者 ⇒ 删掉残留后重试一次;否则交给它。
80
+ if (e && (e.code === "EADDRINUSE" || e.code === "EACCES") && !_retriedAfterStale) {
81
+ _retriedAfterStale = true;
82
+ let alive = false;
83
+ try {
84
+ const probe = net.connect(pipePath);
85
+ probe.on("connect", () => { alive = true; try { probe.destroy(); } catch {} });
86
+ probe.on("error", () => { try { probe.destroy(); } catch {} });
87
+ } catch {}
88
+ setTimeout(() => {
89
+ if (alive) process.exit(0); // 真有持有者 → 交给它
90
+ try { fs.unlinkSync(pipePath); } catch {} // stale → 清掉重试
91
+ server.listen(pipePath, onListening);
92
+ }, 50);
93
+ return;
94
+ }
79
95
  process.exit(0);
80
96
  });
81
97
 
82
- server.listen(pipePath, () => {
98
+ function onListening() {
83
99
  if (process.platform !== "win32") { try { fs.chmodSync(pipePath, 0o600); } catch {} }
84
100
  // TTL 到期自退。刻意不 unref:保证 TTL 一定生效,进程不会提前或滞后退出。
85
101
  setTimeout(() => cleanupAndExit(0), ttlSec * 1000);
86
- });
102
+ }
103
+ server.listen(pipePath, onListening);
87
104
 
88
105
  process.on("SIGINT", () => cleanupAndExit(0));
89
106
  process.on("SIGTERM", () => cleanupAndExit(0));
package/bin/e10-data.mjs CHANGED
@@ -302,6 +302,7 @@ function providerCacheMd() {
302
302
  // 凭据随进程结束即释放(后续调用仍走 v0.1.17 的内存 TTL 缓存,不落明文)。
303
303
  // 定位策略:与 e10-login 相同的四段式(WEAVER_WORK_CLI_ENTRY → 模块解析 → PATH shim → 常见全局前缀)。
304
304
  const WEAVER_PROVIDER_NAME = "weaver-work-cli";
305
+ const FAST_PROVIDER_NAME = "weaver-authfile"; // PATCH P1:需置顶的优先 provider
305
306
  const WEAVER_CLI_ENTRY_ENV = "WEAVER_WORK_CLI_ENTRY";
306
307
 
307
308
  let _weaverEntry;
@@ -434,11 +435,70 @@ function providerWeaverWorkCli() {
434
435
  // ⚠️ 2026-09-24:凭据**唯一来源 = weaver-work-cli**,不再回退 e10-login。
435
436
  // providerAuthJson / providerWhoamiJson / providerWhoamiText / providerCacheMd 保留函数定义但不挂载
436
437
  // (如需恢复回退,把对应条目加回本数组即可)。
438
+
439
+ // ================= PATCH P1:凭据直读快路径(不起子进程) =================
440
+ // 现状:providerWeaverWorkCli() 用 spawnSync 起 2 个 weaver-work-cli 子进程(export-weaver-env
441
+ // + auth status),每个都要加载 ~4.8MB / 370 个文件的 dist/index.js;在 0.25 核沙箱里各约
442
+ // 2.2~3.0s,串行合计 5.2~5.6s。
443
+ // 但凭据本身只是 profiles/<profile>/auth 的一个加密文件,解密仅约 17ms。
444
+ // 做法:直接 import weaver-work-cli 自带的 auth 子模块,用官方 E10AuthSession.fromFile()
445
+ // 同步读 + 解密;getBaseUrl()/eteamsId/cookieHeader()/uaHeader() 与 export-weaver-env
446
+ // 是同一份实现,语义完全等价,且完全不加载 dist/index.js。
447
+ // 安全:不落盘、不打日志、不打印任何凭据;仅复用 weaver-work-cli 自己的解密逻辑。
448
+ // 回滚:设置 E10_DATA_LEGACY_AUTH=1 即跳过本 provider,行为回到纯子进程路径。
449
+ let _weaverAuthMod = null;
450
+ let _weaverAuthTried = false;
451
+
452
+ async function loadWeaverAuthModule() {
453
+ if (_weaverAuthTried) return _weaverAuthMod;
454
+ _weaverAuthTried = true;
455
+ try {
456
+ const entry = resolveWeaverEntry(); // .../weaver-work-cli/dist/index.js
457
+ if (!entry) return null;
458
+ const modPath = path.join(path.dirname(entry), "internal", "e10", "auth", "session.js");
459
+ if (!fs.existsSync(modPath)) return null;
460
+ const { pathToFileURL } = await import("node:url");
461
+ _weaverAuthMod = await import(pathToFileURL(modPath).href);
462
+ } catch {
463
+ _weaverAuthMod = null; // 任何异常 → 交给回落 provider
464
+ }
465
+ return _weaverAuthMod;
466
+ }
467
+
468
+ /** 直读快路径(同步):与 export-weaver-env 同源实现;不可用时返回 null 由 CLI 回落 */
469
+ function providerAuthFileDirect() {
470
+ if (process.env.E10_DATA_LEGACY_AUTH === "1") return null;
471
+ const m = _weaverAuthMod;
472
+ if (!m || !m.E10AuthSession || !m.getActiveProfile || !m.getProfileAuthPath) return null;
473
+ try {
474
+ const s = m.E10AuthSession.fromFile(m.getProfileAuthPath(m.getActiveProfile()));
475
+ if (!s) return null;
476
+ const eteamsid = s.eteamsId;
477
+ const cookie = s.cookieHeader();
478
+ if (!eteamsid || !cookie) return null;
479
+ return normalizeAuth({
480
+ baseUrl: s.getBaseUrl(),
481
+ eteamsid,
482
+ cookie,
483
+ userAgent: s.uaHeader(),
484
+ userId: s.userId,
485
+ tenantKey: s.tenantKey,
486
+ source: "weaver-work-cli auth file(直读)",
487
+ });
488
+ } catch {
489
+ return null; // 解密失败 / 文件缺失 → 回落 CLI
490
+ }
491
+ }
492
+
493
+ // 顶层 await:本文件 L7xx 处本就有顶层 await,此处不改变模块执行模型
494
+ await loadWeaverAuthModule();
495
+
437
496
  const AUTH_PROVIDERS = [
438
- ["weaver-work-cli", providerWeaverWorkCli],
497
+ ["weaver-authfile", providerAuthFileDirect], // PATCH P1:快路径(无子进程)
498
+ ["weaver-work-cli", providerWeaverWorkCli], // 回落:直读失败 / 加密格式变更
439
499
  ];
440
500
  /** 预留:登记"命中后不进记忆"的出口(当前为空——唯一出口需要被记忆) */
441
- const AUTH_FALLBACK_PROVIDERS = new Set();
501
+ const AUTH_FALLBACK_PROVIDERS = new Set(["weaver-authfile"]); // PATCH P1
442
502
 
443
503
  function readAuthModeMemo() {
444
504
  try {
@@ -461,8 +521,13 @@ function loadAuth() {
461
521
  // 首选来源固定为 weaver-work-cli:无论 memo 指向谁,都把它提到最前再依次尝试
462
522
  // (仅当未用 E10_DATA_AUTH_MODE 显式指定时;它取不到凭据会自动回落后续出口)
463
523
  if (!override) {
464
- const wi = order.findIndex(([n]) => n === WEAVER_PROVIDER_NAME);
465
- if (wi > 0) order.unshift(order.splice(wi, 1)[0]);
524
+ // PATCH P1:优先快路径;CLI 仅在快路径缺席时置顶(回落顺序不变)
525
+ const fi = order.findIndex(([n]) => n === FAST_PROVIDER_NAME);
526
+ if (fi > 0) order.unshift(order.splice(fi, 1)[0]);
527
+ if (fi < 0) {
528
+ const wi = order.findIndex(([n]) => n === WEAVER_PROVIDER_NAME);
529
+ if (wi > 0) order.unshift(order.splice(wi, 1)[0]);
530
+ }
466
531
  }
467
532
 
468
533
  const diag = [];
@@ -714,7 +779,7 @@ const CMD_SUBS = {
714
779
  ds: ["groups", "find", "describe", "tables", "fields", "fields-dsl", "list", "chart", "stat", "count"],
715
780
  doc: ["count", "list"],
716
781
  noun: ["list", "scope"],
717
- field: ["id2name", "name2id"],
782
+ field: ["id2name", "name2id", "options"],
718
783
  conf: ["get", "batch", "batch-file", "group", "group-file", "resolve", "resolve-file", "add", "add-file", "update", "delete"],
719
784
  exp: ["status", "manifest", "commits", "file", "pull", "init", "commit", "lock", "release", "rollback"],
720
785
  attend: ["statis"],
@@ -1211,6 +1276,27 @@ async function cmdFieldsForDSL(args, json) {
1211
1276
  for (const f of (d.fields || [])) console.log([f.name, f.text, f.type, f.mainPrimaryKey ? "PK" : ""].filter(Boolean).join("\t"));
1212
1277
  }
1213
1278
  }
1279
+ // field options:Select/下拉框字段的选项值清单(2026-10-22 新增,挂在 field name2id 旁)
1280
+ // 端点:GET /api/ebuilder/common/ds/options?fieldName=&objId=&sourceType=&groupId=
1281
+ // 通用下拉框选项获取方法(不限 DSL/宽表):EB 表单与 ETEAMS 宽表都走它。
1282
+ // fieldName 用 ds fields 返回的 name(EB 表单形如 field_<id>,ETEAMS 宽表形如 wtlx 等
1283
+ // 拼音缩写),objId = 数据集/表 id;sourceType/groupId 与该表取数命令同源
1284
+ // (LOGIC + 业务分组,或 ETEAMS + 数据源分组)。
1285
+ // 用途:Select 字段列存 value_key 时,用本命令取 {id,name,archive} 字典完成显示映射
1286
+ // (替代已停用的 id2name / 选项字典物理表直查)。
1287
+ async function cmdFieldOptions(args, json) {
1288
+ const fieldName = need("field-name", args), objId = need("obj-id", args), groupId = need("group", args);
1289
+ const sourceType = args["source-type"] || "LOGIC";
1290
+ const qs = "fieldName=" + encodeURIComponent(fieldName)
1291
+ + "&objId=" + encodeURIComponent(objId)
1292
+ + "&sourceType=" + encodeURIComponent(sourceType)
1293
+ + "&groupId=" + encodeURIComponent(groupId);
1294
+ const r = await getUrl("/api/ebuilder/common/ds/options?" + qs);
1295
+ if (json) return r;
1296
+ const rows = Array.isArray(r.data) ? r.data : [];
1297
+ if (!rows.length) { console.log("(空:该字段无选项或参数不匹配) code=" + (r.code ?? "") + " msg=" + (r.msg || "")); return; }
1298
+ printHuman("选项清单 " + rows.length + " 项", rows, ["id", "name", "archive"]);
1299
+ }
1214
1300
  async function cmdList(args, json) {
1215
1301
  const gid = need("group", args), tid = need("table", args), fld = readListArg(need("fields", args));
1216
1302
  const fields = fld.split(",").map((f) => ({ fieldId: f, fieldName: f, objId: String(tid), mainField: true }));
@@ -3240,6 +3326,13 @@ noun 词库查询
3240
3326
  field 关联字段翻译
3241
3327
  field id2name --module <m> --type <t> --ids id1,id2 [--form-param '{"fieldId":"..","module":"ebuilderform"}'|--eb-browser-param '{..}'|--property-type x]
3242
3328
  field name2id --module <m> --type <t> --name 名称 [同上附加参数]
3329
+ field options --group <gid> --obj-id <数据集/表id> --field-name <字段name> [--source-type LOGIC|ETEAMS]
3330
+ # Select/下拉框字段的选项值 {id,name,archive}(GET /api/ebuilder/common/ds/options,
3331
+ # 通用下拉框选项方法,不限 DSL/宽表 —— EB 表单与 ETEAMS 宽表均适用)。
3332
+ # field-name 用 ds fields 的 name(EB 表单 field_<id> / ETEAMS 宽表拼音缩写如 wtlx);
3333
+ # ⚠️ --source-type 需**显式传参**(EB 表单=LOGIC、ETEAMS 宽表=ETEAMS);代码缺省给
3334
+ # LOGIC 兜底(与 ds 族口径一致),但 ETEAMS 场景漏传会查空,勿依赖默认值。
3335
+ # Select 列存 value_key 时用它做显示映射(替代已停用的 id2name / 字典表直查)。
3243
3336
  conf 环境参数配置中心(chatBi config map,替代 config-resolve 脚本 URL 直连;confType 默认由 CONN_/DS_/WF_/API_ 前缀推导,可 --type 显式)
3244
3337
  confGroup(配置分组,v0.1.9 新增,可选):confType=api 时后端支持二级分层(如 api/workflow),
3245
3338
  定位维度 = confType+confGroup+confKey;仅 confType=api(或显式传 --group)时才下发 confGroup,其他类型不带该字段
@@ -3356,6 +3449,7 @@ async function main() {
3356
3449
  } else if (family === "field") {
3357
3450
  if (sub === "id2name") result = await cmdFieldId2name(args, json);
3358
3451
  else if (sub === "name2id") result = await cmdFieldName2id(args, json);
3452
+ else if (sub === "options") result = await cmdFieldOptions(args, json);
3359
3453
  else { usage(); process.exit(1); }
3360
3454
  } else if (family === "conf") {
3361
3455
  if (!sub) { usage(); process.exit(1); }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "e10-data",
3
- "version": "0.1.30",
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)行为**完全不变**。 v0.1.28(2026-10-17):`module call` 支持 `--type <confType>`(自定义 confType / 域级配置分组,默认 `api`,不传时行为与旧版一致)与 `--show-params` 精简模式(默认省略 `request_example`,`--full` / `--with-example` 回显,`--no-example` 显式精简),`--show-params` 输出新增 `conf_type` 字段。v0.1.29(2026-10-19)本地增强:`module call` 新增 `--conf-file <文件|@文件>`——直接读本地 confAttrs 跳过 `conf get`(同一 confKey 一次问数只取一次配置),兼容模板缓存与 `conf get --json` 原样输出,带该参数时 `--group`/`--conf-key` 可从文件回填,stderr 提示「未请求配置中心」;缓存缺失/过期时去掉该参数即回退原路径。 v0.1.30(2026-10-19):query 透传后端 executeQueryDsl 新增的 4 个 @RequestParam(dimension=后端 confKey / confGroup / username / startDate,恒定发送、值允许为空,缺键即失败),并显式声明 Content-Type=application/json;charset=utf-8。",
3
+ "version": "0.1.32",
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)行为**完全不变**。 v0.1.28(2026-10-17):`module call` 支持 `--type <confType>`(自定义 confType / 域级配置分组,默认 `api`,不传时行为与旧版一致)与 `--show-params` 精简模式(默认省略 `request_example`,`--full` / `--with-example` 回显,`--no-example` 显式精简),`--show-params` 输出新增 `conf_type` 字段。v0.1.29(2026-10-19)本地增强:`module call` 新增 `--conf-file <文件|@文件>`——直接读本地 confAttrs 跳过 `conf get`(同一 confKey 一次问数只取一次配置),兼容模板缓存与 `conf get --json` 原样输出,带该参数时 `--group`/`--conf-key` 可从文件回填,stderr 提示「未请求配置中心」;缓存缺失/过期时去掉该参数即回退原路径。 v0.1.30(2026-10-19):query 透传后端 executeQueryDsl 新增的 4 个 @RequestParam(dimension=后端 confKey / confGroup / username / startDate,恒定发送、值允许为空,缺键即失败),并显式声明 Content-Type=application/json;charset=utf-8。v0.1.31(2026-10-21)凭据直读快路径(providerAuthFileDirect 直读 weaver-work-cli auth 文件解密,省 2 个子进程约 5.6s→~0.1s)+ cred-helper stale socket 自愈。v0.1.32(2026-10-22)新增 `field options` —— Select/下拉框字段的选项值清单 {id,name,archive}(GET /api/ebuilder/common/ds/options?fieldName=&objId=&sourceType=&groupId=,通用下拉框选项方法,不限 DSL/宽表:EB 表单与 ETEAMS 宽表均适用;--field-name 用 ds fields 的 name,--source-type 需显式传参 LOGIC|ETEAMS、代码缺省 LOGIC 兜底;Select 列存 value_key 时用它做显示映射,替代已停用的 id2name/字典表直查)。",
5
5
  "author": "e10-dw",
6
6
  "license": "MIT",
7
7
  "type": "module",