mcp-xdx-schema-ctx 1.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/.env.example +43 -0
  2. package/README.md +269 -0
  3. package/dist/config.d.ts +131 -0
  4. package/dist/config.js +138 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/crypto-utils.d.ts +29 -0
  7. package/dist/crypto-utils.js +118 -0
  8. package/dist/crypto-utils.js.map +1 -0
  9. package/dist/db.d.ts +10 -0
  10. package/dist/db.js +149 -0
  11. package/dist/db.js.map +1 -0
  12. package/dist/diff-utils.d.ts +42 -0
  13. package/dist/diff-utils.js +130 -0
  14. package/dist/diff-utils.js.map +1 -0
  15. package/dist/encrypt-secrets.d.ts +12 -0
  16. package/dist/encrypt-secrets.js +190 -0
  17. package/dist/encrypt-secrets.js.map +1 -0
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.js +30 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/migrate-utils.d.ts +91 -0
  22. package/dist/migrate-utils.js +399 -0
  23. package/dist/migrate-utils.js.map +1 -0
  24. package/dist/schema-compat.d.ts +46 -0
  25. package/dist/schema-compat.js +169 -0
  26. package/dist/schema-compat.js.map +1 -0
  27. package/dist/shared.d.ts +70 -0
  28. package/dist/shared.js +197 -0
  29. package/dist/shared.js.map +1 -0
  30. package/dist/sql-build.d.ts +121 -0
  31. package/dist/sql-build.js +254 -0
  32. package/dist/sql-build.js.map +1 -0
  33. package/dist/tool-availability.d.ts +35 -0
  34. package/dist/tool-availability.js +90 -0
  35. package/dist/tool-availability.js.map +1 -0
  36. package/dist/tools/data-tools.d.ts +2 -0
  37. package/dist/tools/data-tools.js +243 -0
  38. package/dist/tools/data-tools.js.map +1 -0
  39. package/dist/tools/dataflow-tools.d.ts +2 -0
  40. package/dist/tools/dataflow-tools.js +434 -0
  41. package/dist/tools/dataflow-tools.js.map +1 -0
  42. package/dist/tools/dbo-tools.d.ts +2 -0
  43. package/dist/tools/dbo-tools.js +228 -0
  44. package/dist/tools/dbo-tools.js.map +1 -0
  45. package/dist/tools/diff-tools.d.ts +2 -0
  46. package/dist/tools/diff-tools.js +224 -0
  47. package/dist/tools/diff-tools.js.map +1 -0
  48. package/dist/tools/form-tools.d.ts +2 -0
  49. package/dist/tools/form-tools.js +715 -0
  50. package/dist/tools/form-tools.js.map +1 -0
  51. package/dist/tools/migrate-tools.d.ts +2 -0
  52. package/dist/tools/migrate-tools.js +423 -0
  53. package/dist/tools/migrate-tools.js.map +1 -0
  54. package/dist/tools/system-tools.d.ts +2 -0
  55. package/dist/tools/system-tools.js +1102 -0
  56. package/dist/tools/system-tools.js.map +1 -0
  57. package/dist/tools/table-tools.d.ts +2 -0
  58. package/dist/tools/table-tools.js +1322 -0
  59. package/dist/tools/table-tools.js.map +1 -0
  60. package/package.json +48 -0
package/.env.example ADDED
@@ -0,0 +1,43 @@
1
+ # ============================================================
2
+ # 必填 - 系统 A SQL Server 连接参数
3
+ # ============================================================
4
+ DB_SERVER=localhost\MSSQLSERVER2019
5
+ DB_USER=sa
6
+ DB_PASSWORD=your-password-here
7
+ DB_DATABASE=XDWmsCommon
8
+
9
+ # ============================================================
10
+ # 可选 - 目标用户库(多个用逗号分隔)
11
+ # ============================================================
12
+ DB_TARGET_DATABASES=XDWmsUser
13
+
14
+ # ============================================================
15
+ # 可选 - 系统 B 连接参数(用于比对和迁移功能)
16
+ # 配置后 diff_xxx / migrate_xxx 系列工具可用
17
+ # ============================================================
18
+ # DB_B_SERVER=192.168.1.100
19
+ # DB_B_USER=sa
20
+ # DB_B_PASSWORD=your-password-here
21
+ # DB_B_DATABASE=XDWmsCommon_New
22
+ # DB_B_TARGET_DATABASES=XDWmsUser_New
23
+
24
+ # ============================================================
25
+ # 可选 - 凭据加密(DPAPI)替代明文
26
+ #
27
+ # 支持的加密字段:DB_SERVER, DB_PASSWORD, DB_B_SERVER, DB_B_PASSWORD
28
+ # 使用 _DPAPI 后缀字段替代明文,密文绑定当前 Windows 用户+机器。
29
+ # 运行 npm run encrypt-secrets 交互式生成密文。
30
+ # ============================================================
31
+ # DB_SERVER_DPAPI=dpapi:AQAAANCMnd8BFdERjHo...
32
+ # DB_PASSWORD_DPAPI=dpapi:AQAAANCMnd8BFdERjHo...
33
+ # DB_B_SERVER_DPAPI=dpapi:AQAAANCMnd8BFdERjHo...
34
+ # DB_B_PASSWORD_DPAPI=dpapi:AQAAANCMnd8BFdERjHo...
35
+
36
+ # ============================================================
37
+ # 可选 - 连接池选项(以下为默认值)
38
+ # ============================================================
39
+ # DB_TRUST_SERVER_CERT=true
40
+ # DB_ENCRYPT=false
41
+ # DB_POOL_MAX=10
42
+ # DB_POOL_MIN=0
43
+ # DB_POOL_IDLE_TIMEOUT=30000
package/README.md ADDED
@@ -0,0 +1,269 @@
1
+ # mcp-xdx-schema-ctx
2
+
3
+ 为 AI 助手提供 XDX SQL Server 数据库结构、应用元数据查询、**双系统比对**和**数据迁移脚本生成**能力的 MCP STDIO 服务。
4
+
5
+ ## 快速开始
6
+
7
+ ### 安装
8
+
9
+ ```bash
10
+ npm install -g mcp-xdx-schema-ctx
11
+ ```
12
+
13
+ ### MCP 客户端配置
14
+
15
+ ```json
16
+ {
17
+ "mcpServers": {
18
+ "xdx-schema": {
19
+ "command": "npx",
20
+ "args": ["-y", "mcp-xdx-schema-ctx"],
21
+ "env": {
22
+ "DB_SERVER_DPAPI": "dpapi:AQAAANCMnd8BFdERjHo...",
23
+ "DB_USER": "your-user",
24
+ "DB_PASSWORD_DPAPI": "dpapi:AQAAANCMnd8BFdERjHo...",
25
+ "DB_DATABASE": "XDWmsCommon",
26
+ "DB_TARGET_DATABASES": "XDWmsUser",
27
+ "DB_B_SERVER_DPAPI": "dpapi:AQAAANCMnd8BFdERjHo...",
28
+ "DB_B_USER": "your-user",
29
+ "DB_B_PASSWORD_DPAPI": "dpapi:AQAAANCMnd8BFdERjHo...",
30
+ "DB_B_DATABASE": "XDWmsCommon_New",
31
+ "DB_B_TARGET_DATABASES": "XDWmsUser_New"
32
+ }
33
+ }
34
+ }
35
+ }
36
+ ```
37
+
38
+ > 全局安装后可将 `command` 改为 `mcp-xdx-schema-ctx` 并移除 `args`。
39
+ > 推荐使用 `_DPAPI` 加密字段替代明文(见[凭据加密](#凭据加密))。
40
+
41
+ ## 环境变量
42
+
43
+ ### 系统 A(必填)
44
+
45
+ | 变量 | 必填 | 说明 |
46
+ | --------------------- | :--: | ------------------------------------------------------------ |
47
+ | `DB_SERVER` | 是 | SQL Server 主机,支持 `host` / `host,port` / `host\instance` |
48
+ | `DB_USER` | 是 | 数据库用户名 |
49
+ | `DB_PASSWORD` | 是 | 数据库密码 |
50
+ | `DB_DATABASE` | 是 | 环境库名(如 `XDWmsCommon`) |
51
+ | `DB_TARGET_DATABASES` | 否 | 目标用户库,多个用逗号分隔 |
52
+
53
+ ### 系统 B(可选)
54
+
55
+ 配置后 `diff_*` / `migrate_*` 系列工具可用,未配置时返回友好提示。
56
+
57
+ | 变量 | 说明 |
58
+ | ----------------------- | ---------------------- |
59
+ | `DB_B_SERVER` | 系统 B SQL Server 主机 |
60
+ | `DB_B_USER` | 系统 B 用户名 |
61
+ | `DB_B_PASSWORD` | 系统 B 密码 |
62
+ | `DB_B_DATABASE` | 系统 B 环境库 |
63
+ | `DB_B_TARGET_DATABASES` | 系统 B 用户库 |
64
+
65
+ ### 连接池选项
66
+
67
+ | 变量 | 默认值 | 说明 |
68
+ | ---------------------- | ------- | ---------------- |
69
+ | `DB_TRUST_SERVER_CERT` | `true` | 信任服务器证书 |
70
+ | `DB_ENCRYPT` | `false` | 加密连接 |
71
+ | `DB_POOL_MAX` | `10` | 最大连接池 |
72
+ | `DB_POOL_MIN` | `0` | 最小连接池 |
73
+ | `DB_POOL_IDLE_TIMEOUT` | `30000` | 空闲超时(毫秒) |
74
+
75
+ 项目目录中可使用 `.env` 文件(格式参考 `.env.example`),运行时优先读取 MCP 客户端传入的环境变量。
76
+
77
+ ## 凭据加密
78
+
79
+ 为避免 MCP JSON 配置或 `.env` 中明文暴露连接信息,支持 **Windows DPAPI** 加密 `DB_SERVER` / `DB_PASSWORD` / `DB_B_SERVER` / `DB_B_PASSWORD` 四个字段。
80
+
81
+ | 场景 | 命令 | 说明 |
82
+ | -------- | ----------------------------------------------- | ----------------------------------- |
83
+ | 开发环境 | `npm run encrypt-secrets` | 读取 `.env`,交互式确认后输出密文 |
84
+ | 生产环境 | `npx -p mcp-xdx-schema-ctx xdx-encrypt-secrets` | 纯交互输入,输出密文贴入 MCP config |
85
+
86
+ 加密后使用 `_DPAPI` 后缀字段替代明文:
87
+
88
+ - 密文绑定当前 **Windows 用户 + 机器**,文件被拷走无法解密
89
+ - 非 Windows 环境降级为 Base64 混淆
90
+ - 向后兼容:明文和 `_DPAPI` 二选一,明文仍然可用
91
+
92
+ ## 可用工具(43 个)
93
+
94
+ 所有工具输出统一为 `{ items, pagination, warnings, ...上下文键 }`;支持 **分页**(`page`/`pageSize`,默认每页 50 条)与 **安全截断**(超 50KB 保留数组前缀 + `_dropped_*` 计数)。详见文末「返回结构」与「分页与截断语义」。
95
+
96
+ ### 表结构 / 数据(12 个)
97
+
98
+ | 工具 | 说明 |
99
+ | ---------------------- | ------------------------------------------------------------ |
100
+ | `list_tables` | 列出表,`scope=registered`(登记表)/`system`(环境库物理表)/`all` |
101
+ | `describe_table` | 获取表的完整字段定义(未登记的系统表回退 INFORMATION_SCHEMA) |
102
+ | `search_schema` | 全局搜索表名/字段名/描述/字段使用追踪 |
103
+ | `get_table_relations` | 分析表的主从关系和外键关联 |
104
+ | `check_user_table` | 检查用户库表是否存在,对比环境库定义 |
105
+ | `get_table_indexes` | 查询索引和外键(用户库系统视图) |
106
+ | `suggest_indexes` | 基于字段定义分析索引优化建议 |
107
+ | `get_virtual_tables` | 查询虚拟表定义及关联物理表 |
108
+ | `get_module_tree` | 获取模块树及各模块功能数量 |
109
+ | `get_inoutkind_detail` | 出入库类型表(InOutKindTB)定义与明细数据 |
110
+ | `resolve_table` | 中文表名/关键词 → 实际表名(返回 `matchType=exact\|fuzzy`) |
111
+ | `query_table_data` | **只读查数据**:TOP≤200、值参数化、敏感列默认脱敏;列名写错返回候选建议 |
112
+
113
+ ### 窗体(4 个)
114
+
115
+ | 工具 | 说明 |
116
+ | ----------------------- | -------------------------------------------------------------------------------------- |
117
+ | `get_form_full` | **核心工具**:模块化解耦,子表缺失仅该模块 `available:false`;`include=basic` 永不失败 |
118
+ | `get_form` | 窗体存在性:只查 FormSetTB,中文名 → FormID |
119
+ | `list_forms` | 窗体清单(FormID/FormName/LinkTable/FormType),SQL 端分页 |
120
+ | `get_user_form_schemes` | 用户个性化窗体方案(字段显示/列宽/冻结等) |
121
+
122
+ ### DBO(1 个)
123
+
124
+ | 工具 | 说明 |
125
+ | ---------------- | ------------------------------------------------ |
126
+ | `get_dbo_detail` | DBO 定义 → 字段 → 操作方案 → 操作字段 → 操作参数 |
127
+
128
+ ### 数据流(3 个)
129
+
130
+ | 工具 | 说明 |
131
+ | ---------------------- | -------------------------------------------------------- |
132
+ | `trace_dataflow` | 业务流程全链路:定义 → 明细 → 节点 → 关系 → 关联窗体和表 |
133
+ | `get_data_source_full` | 数据源定义链:数据源头 → 关联表 → 字段映射 |
134
+ | `get_transfer_rules` | 跨库数据转换规则(Import / Export / Mapping) |
135
+
136
+ ### 系统(9 个)
137
+
138
+ | 工具 | 说明 |
139
+ | ---------------------- | ----------------------------------------------------------- |
140
+ | `get_capabilities` | **能力自描述**:分别探测环境库/用户库表与各工具可用性 |
141
+ | `get_function_tree` | 功能菜单树,含关联窗体/路由/组件,支持平台过滤 |
142
+ | `get_page_actions` | 按页面 Code 查询可用按钮及功能 |
143
+ | `get_choose_ui_detail` | UI 选择器(下拉框/参照)配置详情 |
144
+ | `get_button_detail` | 按钮定义及其使用场景(哪些窗体/页面引用) |
145
+ | `get_system_enums` | 内置字典:链接类型/操作类型/功能类型/用户报表方案(缺表降级) |
146
+ | `get_sys_dict` | 系统字典(SysDbType / SyDbValue),支持分类树 |
147
+ | `get_db_object_source` | 用户库视图/存储过程/函数的 CREATE SQL 源码 |
148
+ | `get_view_lineage` | 视图/对象依赖血缘(`sys.sql_expression_dependencies` 递归) |
149
+
150
+ ### 比对(7 个 · 需系统 B)
151
+
152
+ | 工具 | 业务键 | 说明 |
153
+ | ---------------- | ------------ | ----------------------------------- |
154
+ | `diff_tables` | TableName | 表定义比对(含字段级深入对比) |
155
+ | `diff_forms` | FormName | 窗体定义比对(含规则子表对比) |
156
+ | `diff_dbos` | DBOName | DBO 定义比对 |
157
+ | `diff_dataflows` | DataFlowName | 数据流定义比对 |
158
+ | `diff_functions` | FunctionName | 功能菜单定义比对 |
159
+ | `diff_sys_dict` | DbType | 系统字典类型比对 |
160
+ | `diff_all` | — | 并行运行上述 6 个比对,返回摘要汇总 |
161
+
162
+ ### 迁移(7 个 · 需系统 B)
163
+
164
+ | 工具 | 说明 |
165
+ | --------------------------- | ------------------------------------------------------------- |
166
+ | `list_migratable_features` | 列出源系统可迁移功能清单(窗体/DBO/数据流/功能菜单) |
167
+ | `analyze_feature` | 分析指定功能的完整依赖树 |
168
+ | `export_feature` | 导出功能关联的全部数据为 JSON |
169
+ | `check_migration_conflicts` | 预检目标系统是否存在同名实体及跨功能依赖 |
170
+ | `generate_migration_sql` | 生成 INSERT SQL 迁移脚本(skip / replace 策略,含 ID 重映射) |
171
+ | `migrate_sys_dict` | 生成系统字典迁移 SQL |
172
+ | `generate_rollback_sql` | 为迁移生成 DELETE 回滚脚本 |
173
+
174
+ ## 典型用法
175
+
176
+ ### 探索表结构
177
+
178
+ ```
179
+ list_tables(modular="CK", keyword="Order")
180
+ → describe_table(tableName="SaleOrderHedTB")
181
+ → get_table_relations(tableName="SaleOrderHedTB")
182
+ → search_schema(keyword="WareID", searchIn="usage")
183
+ ```
184
+
185
+ ### 查看窗体配置
186
+
187
+ ```
188
+ get_form_full(formId="SaleOrder", include="basic,colors,buttons,dataflows")
189
+ ```
190
+
191
+ ### 双系统比对
192
+
193
+ ```
194
+ diff_all()
195
+ → diff_tables(keyword="Order")
196
+ → diff_forms(keyword="SaleOrder")
197
+ ```
198
+
199
+ ### 功能迁移
200
+
201
+ ```
202
+ list_migratable_features(featureType="form", keyword="Sale")
203
+ → analyze_feature(featureType="form", featureName="SaleOrder")
204
+ → check_migration_conflicts(featureType="form", featureName="SaleOrder")
205
+ → generate_migration_sql(featureType="form", featureName="SaleOrder", options={conflictStrategy:"skip"})
206
+ ```
207
+
208
+ ### 查看存储过程/视图源码
209
+
210
+ ```
211
+ get_db_object_source(objectType="procedure", keyword="sp_")
212
+ → get_db_object_source(objectType="view", name="v_SaleOrder")
213
+ ```
214
+
215
+ ### 查数据 / 中文名定位(新增)
216
+
217
+ ```
218
+ resolve_table(nameOrKeyword="发货通知") # 中文名 → 表名
219
+ → query_table_data(tableName="SaleSendHedTB", top=5, filter=[{column:"BillNo", op:"like", value:"SO"}])
220
+ get_capabilities() # 本环境支持哪些工具?
221
+ → get_view_lineage(name="vwAboutOut") # 视图由哪些表构成
222
+ ```
223
+
224
+ ## 返回结构
225
+
226
+ 所有工具统一返回:
227
+
228
+ | 键 | 说明 |
229
+ | ----------------- | ---------------------------------------------------------------------------------------------------------- |
230
+ | `items` | 主结果数组(表数据 / 候选 / 工具可用性…) |
231
+ | `pagination` | 分页信息;SQL 端分页含 `totalItems/totalPages/hasMore/nextPage`,TOP N 查询为 `{mode:"topN",limit,returned,hasMore}` |
232
+ | `warnings` | 降级/跳过提示,元素含 `module`/`message`/`hint?`/`fallback?`;**有 warning 不代表失败** |
233
+ | 其余上下文键 | 如 `table`/`fields`/`env`/`candidates` 等 |
234
+
235
+ 旧键 → 新键映射:`tables`/`fields`/`values`/`objects`/`modules` → 统一为 `items`(次要结果保留在上下文键,如 `search_schema.fields`)。
236
+
237
+ ## 分页与截断语义
238
+
239
+ - **分页**:`page`(≥1)/`pageSize`(1..200,默认 50)。SQL 端 `COUNT(*)` + `OFFSET/FETCH`,`totalItems` 为真实总数,不再受 `TOP` 影响。
240
+ - **TOP N 查询**(`query_table_data`/`get_form`):`top` 默认 20、上限 200;`pagination.mode="topN"`。
241
+ - **截断**:输出超 50KB 时保留 `pagination`/`warnings`/`summary`/`fieldNames` 与各数组**前缀预览**,并给出 `_dropped_<key>` 丢弃计数与 `_hint`,不再返回空 body。`describe_table`/`get_form_full` 即使被截断也会返回 `fieldNames`(纯字段名清单)。用 `fieldKeyword`/`columns`/`pageSize` 缩小范围。
242
+
243
+ ## 安全
244
+
245
+ - **只读**:所有查询经 `FORBIDDEN` 关键字扫描(`INSERT`、`UPDATE`、`DELETE`、`DROP`、`CREATE`、`ALTER`、`TRUNCATE`、`EXEC` 等),拒绝写操作
246
+ - **防注入**:用户输入字符串参数经 `escapeSql()` 单引号转义;所有 `z.string()` 参数附加 `.max()` 约束
247
+ - **凭据加密**:支持 DPAPI 加密连接信息,避免明文泄露
248
+ - **输出保护**:JSON 输出经 `safeJson()` 检查,超 50KB 自动截断并提示分页
249
+ - **迁移不直写**:迁移工具仅生成 SQL 脚本,需人工审查后手动执行
250
+ - **最小权限**:建议使用仅具有必要读取权限的 SQL Server 账号
251
+
252
+ ## 本地开发
253
+
254
+ ```bash
255
+ # 安装依赖
256
+ npm install
257
+
258
+ # 编译
259
+ npm run build
260
+
261
+ # 开发模式(tsx 热加载)
262
+ npm run dev
263
+
264
+ # 凭据加密 CLI
265
+ npm run encrypt-secrets
266
+
267
+ # 启动
268
+ npm start
269
+ ```
@@ -0,0 +1,131 @@
1
+ export declare const env: {
2
+ DB_SERVER: string;
3
+ DB_USER: string;
4
+ DB_PASSWORD: string;
5
+ DB_DATABASE: string;
6
+ DB_TARGET_DATABASES: string;
7
+ DB_TRUST_SERVER_CERT: string;
8
+ DB_ENCRYPT: string;
9
+ DB_POOL_MAX: string;
10
+ DB_POOL_MIN: string;
11
+ DB_POOL_IDLE_TIMEOUT: string;
12
+ DB_QUERY_TIMEOUT: string;
13
+ DB_SENSITIVE_COLUMNS: string;
14
+ DB_B_SERVER: string;
15
+ DB_B_USER: string;
16
+ DB_B_PASSWORD: string;
17
+ DB_B_DATABASE: string;
18
+ DB_B_TARGET_DATABASES: string;
19
+ };
20
+ export declare const tableNames: {
21
+ readonly tableDef: "TableSetTB";
22
+ readonly fieldDef: "TableFieldSetTB";
23
+ readonly virtualTable: "VirtualTableTB";
24
+ readonly formDef: "FormSetTB";
25
+ readonly formState: "FormStateSetTB";
26
+ readonly formRuleHed: "FormRuleSetHedTB";
27
+ readonly formRuleDet: "FormRuleSetDetTB";
28
+ readonly formRuleButton: "FormRuleSetButtonTB";
29
+ readonly formRuleDataSource: "FormRuleSetDataSourceTB";
30
+ readonly formRuleLink: "FormRuleSetLinkTB";
31
+ readonly formRuleMenu: "FormRuleSetMenuTB";
32
+ readonly formRuleReferHed: "FormRuleSetReferHedTB";
33
+ readonly formRuleRefer: "FormRuleSetReferTB";
34
+ readonly formRuleReferCase: "FormRuleSetReferCaseTB";
35
+ readonly formRuleReferFilter: "FormRuleSetReferFilterTB";
36
+ readonly formRuleSQLReplace: "FormRuleSQLReplaceTB";
37
+ readonly formRuleDataFlow: "FormRuleDataFlowTB";
38
+ readonly formRuleColor: "FormRuleColorInfoTB";
39
+ readonly userFormHed: "UserFormSetHedTB";
40
+ readonly userFormDet: "UserFormSetDetTB";
41
+ readonly function: "FunctionTB";
42
+ readonly functionKind: "FunctionKindTB";
43
+ readonly menuFunction: "MenuFunction";
44
+ readonly button: "ButtonTB";
45
+ readonly moduleManage: "ModuleManageTB";
46
+ readonly dataSourceHed: "DataSourceSetHedTB";
47
+ readonly dataSourceDet: "DataSourceSetDetTB";
48
+ readonly dataSourceField: "DataSourceSetFieldTB";
49
+ readonly dboSet: "DBOSetTB";
50
+ readonly dboSetField: "DBOSetFieldTB";
51
+ readonly dboPrSetHed: "DBOPrSetHedTB";
52
+ readonly dboPrSetField: "DBOPrSetFieldTB";
53
+ readonly dboPrSetParam: "DBOPrSetParamTB";
54
+ readonly dataFlowHed: "DataFlowHedTB";
55
+ readonly dataFlowDet: "DataFlowDetTB";
56
+ readonly dataFlowNode: "DataFlowNodeTB";
57
+ readonly dataFlowRelation: "DataFlowRelationTB";
58
+ readonly transferRuleHed: "TransferRuleHedTB";
59
+ readonly transferRuleDet: "TransferRuleDetTB";
60
+ readonly chooseUISet: "ChooseUISetTB";
61
+ readonly linkType: "LinkTypeTB";
62
+ readonly operateType: "OperateTypeTB";
63
+ readonly inOutKind: "InOutKindTB";
64
+ readonly userReportFind: "UserReportFindSetTB";
65
+ };
66
+ export type TableKey = keyof typeof tableNames;
67
+ export declare const schemaSource: {
68
+ database: string;
69
+ tables: {
70
+ readonly tableDef: "TableSetTB";
71
+ readonly fieldDef: "TableFieldSetTB";
72
+ readonly virtualTable: "VirtualTableTB";
73
+ readonly formDef: "FormSetTB";
74
+ readonly formState: "FormStateSetTB";
75
+ readonly formRuleHed: "FormRuleSetHedTB";
76
+ readonly formRuleDet: "FormRuleSetDetTB";
77
+ readonly formRuleButton: "FormRuleSetButtonTB";
78
+ readonly formRuleDataSource: "FormRuleSetDataSourceTB";
79
+ readonly formRuleLink: "FormRuleSetLinkTB";
80
+ readonly formRuleMenu: "FormRuleSetMenuTB";
81
+ readonly formRuleReferHed: "FormRuleSetReferHedTB";
82
+ readonly formRuleRefer: "FormRuleSetReferTB";
83
+ readonly formRuleReferCase: "FormRuleSetReferCaseTB";
84
+ readonly formRuleReferFilter: "FormRuleSetReferFilterTB";
85
+ readonly formRuleSQLReplace: "FormRuleSQLReplaceTB";
86
+ readonly formRuleDataFlow: "FormRuleDataFlowTB";
87
+ readonly formRuleColor: "FormRuleColorInfoTB";
88
+ readonly userFormHed: "UserFormSetHedTB";
89
+ readonly userFormDet: "UserFormSetDetTB";
90
+ readonly function: "FunctionTB";
91
+ readonly functionKind: "FunctionKindTB";
92
+ readonly menuFunction: "MenuFunction";
93
+ readonly button: "ButtonTB";
94
+ readonly moduleManage: "ModuleManageTB";
95
+ readonly dataSourceHed: "DataSourceSetHedTB";
96
+ readonly dataSourceDet: "DataSourceSetDetTB";
97
+ readonly dataSourceField: "DataSourceSetFieldTB";
98
+ readonly dboSet: "DBOSetTB";
99
+ readonly dboSetField: "DBOSetFieldTB";
100
+ readonly dboPrSetHed: "DBOPrSetHedTB";
101
+ readonly dboPrSetField: "DBOPrSetFieldTB";
102
+ readonly dboPrSetParam: "DBOPrSetParamTB";
103
+ readonly dataFlowHed: "DataFlowHedTB";
104
+ readonly dataFlowDet: "DataFlowDetTB";
105
+ readonly dataFlowNode: "DataFlowNodeTB";
106
+ readonly dataFlowRelation: "DataFlowRelationTB";
107
+ readonly transferRuleHed: "TransferRuleHedTB";
108
+ readonly transferRuleDet: "TransferRuleDetTB";
109
+ readonly chooseUISet: "ChooseUISetTB";
110
+ readonly linkType: "LinkTypeTB";
111
+ readonly operateType: "OperateTypeTB";
112
+ readonly inOutKind: "InOutKindTB";
113
+ readonly userReportFind: "UserReportFindSetTB";
114
+ };
115
+ };
116
+ export interface SystemConfig {
117
+ server: string;
118
+ user: string;
119
+ password: string;
120
+ database: string;
121
+ targetDatabases: string[];
122
+ userDb: string;
123
+ }
124
+ export declare function getSystemConfig(systemName?: string): SystemConfig;
125
+ export declare function isSystemBConfigured(): boolean;
126
+ export declare function table(db: string, name: string): string;
127
+ export declare const envDb: () => string;
128
+ export declare const envTable: (key: TableKey) => string;
129
+ export declare function systemTable(systemName: string, key: TableKey): string;
130
+ export declare const userDb: (systemName?: string) => string;
131
+ export declare const targetDatabases: string[];
package/dist/config.js ADDED
@@ -0,0 +1,138 @@
1
+ import dotenv from "dotenv";
2
+ import { z } from "zod";
3
+ import { decryptEnv } from "./crypto-utils.js";
4
+ dotenv.config({ path: new URL("../.env", import.meta.url), quiet: true });
5
+ decryptEnv();
6
+ const envSchema = z.object({
7
+ // 必填项 - 系统 A
8
+ DB_SERVER: z.string().min(1, "DB_SERVER 是必填项"),
9
+ DB_USER: z.string().min(1, "DB_USER 是必填项"),
10
+ DB_PASSWORD: z.string().min(1, "DB_PASSWORD 是必填项"),
11
+ DB_DATABASE: z.string().min(1, "DB_DATABASE 是必填项"),
12
+ // 可选项 - 系统 A
13
+ DB_TARGET_DATABASES: z.string().optional().default(""),
14
+ DB_TRUST_SERVER_CERT: z.string().optional().default("true"),
15
+ DB_ENCRYPT: z.string().optional().default("false"),
16
+ DB_POOL_MAX: z.string().optional().default("10"),
17
+ DB_POOL_MIN: z.string().optional().default("0"),
18
+ DB_POOL_IDLE_TIMEOUT: z.string().optional().default("30000"),
19
+ // 查询与数据可见性
20
+ DB_QUERY_TIMEOUT: z.string().optional().default("30000"),
21
+ DB_SENSITIVE_COLUMNS: z
22
+ .string()
23
+ .optional()
24
+ .default("password|passwd|pwd|secret|token|credential"),
25
+ // 可选项 - 系统 B(第二套 XDX 系统,用于比对和迁移)
26
+ DB_B_SERVER: z.string().optional().default(""),
27
+ DB_B_USER: z.string().optional().default(""),
28
+ DB_B_PASSWORD: z.string().optional().default(""),
29
+ DB_B_DATABASE: z.string().optional().default(""),
30
+ DB_B_TARGET_DATABASES: z.string().optional().default(""),
31
+ });
32
+ export const env = envSchema.parse(process.env);
33
+ // ============================================================
34
+ // 37 张 XDX 系统表名映射
35
+ // ============================================================
36
+ export const tableNames = {
37
+ tableDef: "TableSetTB",
38
+ fieldDef: "TableFieldSetTB",
39
+ virtualTable: "VirtualTableTB",
40
+ formDef: "FormSetTB",
41
+ formState: "FormStateSetTB",
42
+ formRuleHed: "FormRuleSetHedTB",
43
+ formRuleDet: "FormRuleSetDetTB",
44
+ formRuleButton: "FormRuleSetButtonTB",
45
+ formRuleDataSource: "FormRuleSetDataSourceTB",
46
+ formRuleLink: "FormRuleSetLinkTB",
47
+ formRuleMenu: "FormRuleSetMenuTB",
48
+ formRuleReferHed: "FormRuleSetReferHedTB",
49
+ formRuleRefer: "FormRuleSetReferTB",
50
+ formRuleReferCase: "FormRuleSetReferCaseTB",
51
+ formRuleReferFilter: "FormRuleSetReferFilterTB",
52
+ formRuleSQLReplace: "FormRuleSQLReplaceTB",
53
+ formRuleDataFlow: "FormRuleDataFlowTB",
54
+ formRuleColor: "FormRuleColorInfoTB",
55
+ userFormHed: "UserFormSetHedTB",
56
+ userFormDet: "UserFormSetDetTB",
57
+ function: "FunctionTB",
58
+ functionKind: "FunctionKindTB",
59
+ menuFunction: "MenuFunction",
60
+ button: "ButtonTB",
61
+ moduleManage: "ModuleManageTB",
62
+ dataSourceHed: "DataSourceSetHedTB",
63
+ dataSourceDet: "DataSourceSetDetTB",
64
+ dataSourceField: "DataSourceSetFieldTB",
65
+ dboSet: "DBOSetTB",
66
+ dboSetField: "DBOSetFieldTB",
67
+ dboPrSetHed: "DBOPrSetHedTB",
68
+ dboPrSetField: "DBOPrSetFieldTB",
69
+ dboPrSetParam: "DBOPrSetParamTB",
70
+ dataFlowHed: "DataFlowHedTB",
71
+ dataFlowDet: "DataFlowDetTB",
72
+ dataFlowNode: "DataFlowNodeTB",
73
+ dataFlowRelation: "DataFlowRelationTB",
74
+ transferRuleHed: "TransferRuleHedTB",
75
+ transferRuleDet: "TransferRuleDetTB",
76
+ chooseUISet: "ChooseUISetTB",
77
+ linkType: "LinkTypeTB",
78
+ operateType: "OperateTypeTB",
79
+ inOutKind: "InOutKindTB",
80
+ userReportFind: "UserReportFindSetTB",
81
+ };
82
+ export const schemaSource = {
83
+ database: env.DB_DATABASE,
84
+ tables: tableNames,
85
+ };
86
+ export function getSystemConfig(systemName = "default") {
87
+ if (systemName === "b") {
88
+ return {
89
+ server: env.DB_B_SERVER,
90
+ user: env.DB_B_USER,
91
+ password: env.DB_B_PASSWORD,
92
+ database: env.DB_B_DATABASE,
93
+ targetDatabases: env.DB_B_TARGET_DATABASES
94
+ ? env.DB_B_TARGET_DATABASES.split(",").map((s) => s.trim())
95
+ : [],
96
+ userDb: env.DB_B_TARGET_DATABASES
97
+ ? env.DB_B_TARGET_DATABASES.split(",")[0].trim()
98
+ : "",
99
+ };
100
+ }
101
+ // "default" | "a" → 系统 A
102
+ return {
103
+ server: env.DB_SERVER,
104
+ user: env.DB_USER,
105
+ password: env.DB_PASSWORD,
106
+ database: env.DB_DATABASE,
107
+ targetDatabases: env.DB_TARGET_DATABASES
108
+ ? env.DB_TARGET_DATABASES.split(",").map((s) => s.trim())
109
+ : [],
110
+ userDb: env.DB_TARGET_DATABASES
111
+ ? env.DB_TARGET_DATABASES.split(",")[0].trim()
112
+ : "",
113
+ };
114
+ }
115
+ export function isSystemBConfigured() {
116
+ const cfg = getSystemConfig("b");
117
+ return cfg.server !== "" && cfg.user !== "" && cfg.database !== "";
118
+ }
119
+ // ============================================================
120
+ // 便捷导出
121
+ // ============================================================
122
+ export function table(db, name) {
123
+ return `[${db}].[dbo].[${name}]`;
124
+ }
125
+ export const envDb = () => env.DB_DATABASE;
126
+ export const envTable = (key) => table(env.DB_DATABASE, tableNames[key]);
127
+ export function systemTable(systemName, key) {
128
+ const cfg = getSystemConfig(systemName);
129
+ return table(cfg.database, tableNames[key]);
130
+ }
131
+ export const userDb = (systemName = "default") => {
132
+ const cfg = getSystemConfig(systemName);
133
+ return cfg.userDb;
134
+ };
135
+ export const targetDatabases = env.DB_TARGET_DATABASES
136
+ ? env.DB_TARGET_DATABASES.split(",").map((s) => s.trim())
137
+ : [];
138
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC1E,UAAU,EAAE,CAAC;AAEb,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IACzB,aAAa;IACb,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,gBAAgB,CAAC;IAC9C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC;IAC1C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,kBAAkB,CAAC;IAClD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,kBAAkB,CAAC;IAElD,aAAa;IACb,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACtD,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IAC3D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IAClD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAChD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IAC/C,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IAE5D,WAAW;IACX,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IACxD,oBAAoB,EAAE,CAAC;SACpB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,OAAO,CAAC,6CAA6C,CAAC;IAEzD,iCAAiC;IACjC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAChD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAChD,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;CACzD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAEhD,+DAA+D;AAC/D,kBAAkB;AAClB,+DAA+D;AAC/D,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,iBAAiB;IAC3B,YAAY,EAAE,gBAAgB;IAC9B,OAAO,EAAE,WAAW;IACpB,SAAS,EAAE,gBAAgB;IAC3B,WAAW,EAAE,kBAAkB;IAC/B,WAAW,EAAE,kBAAkB;IAC/B,cAAc,EAAE,qBAAqB;IACrC,kBAAkB,EAAE,yBAAyB;IAC7C,YAAY,EAAE,mBAAmB;IACjC,YAAY,EAAE,mBAAmB;IACjC,gBAAgB,EAAE,uBAAuB;IACzC,aAAa,EAAE,oBAAoB;IACnC,iBAAiB,EAAE,wBAAwB;IAC3C,mBAAmB,EAAE,0BAA0B;IAC/C,kBAAkB,EAAE,sBAAsB;IAC1C,gBAAgB,EAAE,oBAAoB;IACtC,aAAa,EAAE,qBAAqB;IACpC,WAAW,EAAE,kBAAkB;IAC/B,WAAW,EAAE,kBAAkB;IAC/B,QAAQ,EAAE,YAAY;IACtB,YAAY,EAAE,gBAAgB;IAC9B,YAAY,EAAE,cAAc;IAC5B,MAAM,EAAE,UAAU;IAClB,YAAY,EAAE,gBAAgB;IAC9B,aAAa,EAAE,oBAAoB;IACnC,aAAa,EAAE,oBAAoB;IACnC,eAAe,EAAE,sBAAsB;IACvC,MAAM,EAAE,UAAU;IAClB,WAAW,EAAE,eAAe;IAC5B,WAAW,EAAE,eAAe;IAC5B,aAAa,EAAE,iBAAiB;IAChC,aAAa,EAAE,iBAAiB;IAChC,WAAW,EAAE,eAAe;IAC5B,WAAW,EAAE,eAAe;IAC5B,YAAY,EAAE,gBAAgB;IAC9B,gBAAgB,EAAE,oBAAoB;IACtC,eAAe,EAAE,mBAAmB;IACpC,eAAe,EAAE,mBAAmB;IACpC,WAAW,EAAE,eAAe;IAC5B,QAAQ,EAAE,YAAY;IACtB,WAAW,EAAE,eAAe;IAC5B,SAAS,EAAE,aAAa;IACxB,cAAc,EAAE,qBAAqB;CAC7B,CAAC;AAIX,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,QAAQ,EAAE,GAAG,CAAC,WAAW;IACzB,MAAM,EAAE,UAAU;CACnB,CAAC;AAcF,MAAM,UAAU,eAAe,CAAC,UAAU,GAAG,SAAS;IACpD,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO;YACL,MAAM,EAAE,GAAG,CAAC,WAAW;YACvB,IAAI,EAAE,GAAG,CAAC,SAAS;YACnB,QAAQ,EAAE,GAAG,CAAC,aAAa;YAC3B,QAAQ,EAAE,GAAG,CAAC,aAAa;YAC3B,eAAe,EAAE,GAAG,CAAC,qBAAqB;gBACxC,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC3D,CAAC,CAAC,EAAE;YACN,MAAM,EAAE,GAAG,CAAC,qBAAqB;gBAC/B,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;gBAChD,CAAC,CAAC,EAAE;SACP,CAAC;IACJ,CAAC;IACD,yBAAyB;IACzB,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,SAAS;QACrB,IAAI,EAAE,GAAG,CAAC,OAAO;QACjB,QAAQ,EAAE,GAAG,CAAC,WAAW;QACzB,QAAQ,EAAE,GAAG,CAAC,WAAW;QACzB,eAAe,EAAE,GAAG,CAAC,mBAAmB;YACtC,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACzD,CAAC,CAAC,EAAE;QACN,MAAM,EAAE,GAAG,CAAC,mBAAmB;YAC7B,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YAC9C,CAAC,CAAC,EAAE;KACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,GAAG,CAAC,MAAM,KAAK,EAAE,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,CAAC;AACrE,CAAC;AAED,+DAA+D;AAC/D,OAAO;AACP,+DAA+D;AAC/D,MAAM,UAAU,KAAK,CAAC,EAAU,EAAE,IAAY;IAC5C,OAAO,IAAI,EAAE,YAAY,IAAI,GAAG,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC;AAE3C,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAa,EAAE,EAAE,CACxC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1C,MAAM,UAAU,WAAW,CAAC,UAAkB,EAAE,GAAa;IAC3D,MAAM,GAAG,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IACxC,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,UAAU,GAAG,SAAS,EAAE,EAAE;IAC/C,MAAM,GAAG,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IACxC,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAa,GAAG,CAAC,mBAAmB;IAC9D,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,CAAC,CAAC,EAAE,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * DPAPI 凭据加密工具
3
+ *
4
+ * Windows: 使用 System.Security.Cryptography.ProtectedData(绑定当前用户+机器)
5
+ * 非 Windows: 降级为 Base64 混淆(仅防无意泄露,不防定向攻击)
6
+ */
7
+ /** 需要加密的凭据字段名 */
8
+ export declare const SENSITIVE_FIELDS: readonly ["DB_SERVER", "DB_PASSWORD", "DB_B_SERVER", "DB_B_PASSWORD"];
9
+ /** DPAPI 后缀映射:DB_PASSWORD → DB_PASSWORD_DPAPI */
10
+ export declare function dpapiField(field: string): string;
11
+ /** 反向:DB_PASSWORD_DPAPI → DB_PASSWORD */
12
+ export declare function originalField(dpapiField: string): string;
13
+ /** 检测当前平台是否支持 DPAPI */
14
+ export declare function isDpapiAvailable(): boolean;
15
+ /**
16
+ * 加密明文 → 密文(前缀 dpapi:)
17
+ * Windows 上使用 DPAPI,非 Windows 使用 Base64 混淆
18
+ */
19
+ export declare function encrypt(plaintext: string): string;
20
+ /**
21
+ * 解密密文 → 原文
22
+ * 自动识别 dpapi: / obfuscated: 前缀
23
+ */
24
+ export declare function decrypt(encrypted: string): string;
25
+ /**
26
+ * 遍历 process.env,解密所有 *_DPAPI 字段并注入为原始字段名
27
+ * 在 dotenv 加载之后、zod 校验之前调用
28
+ */
29
+ export declare function decryptEnv(): void;