@downcity/city 1.1.6 → 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.
- package/bin/cli/agent/AgentManager.js +1 -1
- package/bin/cli/agent/AgentManager.js.map +1 -1
- package/bin/cli/agent/AgentReset.js +1 -1
- package/bin/cli/agent/AgentReset.js.map +1 -1
- package/bin/cli/agent/Init.d.ts.map +1 -1
- package/bin/cli/agent/Init.js +4 -2
- package/bin/cli/agent/Init.js.map +1 -1
- package/bin/cli/agent/Run.d.ts.map +1 -1
- package/bin/cli/agent/Run.js +4 -1
- package/bin/cli/agent/Run.js.map +1 -1
- package/bin/cli/control-plane/ControlPlaneInit.js +1 -1
- package/bin/cli/control-plane/ControlPlaneInit.js.map +1 -1
- package/bin/cli/control-plane/ControlPlaneProcess.d.ts.map +1 -1
- package/bin/cli/control-plane/ControlPlaneProcess.js +2 -1
- package/bin/cli/control-plane/ControlPlaneProcess.js.map +1 -1
- package/bin/cli/model/ModelCommandShared.d.ts +1 -1
- package/bin/cli/model/ModelCommandShared.d.ts.map +1 -1
- package/bin/cli/model/ModelCommandShared.js +1 -1
- package/bin/cli/model/ModelCommandShared.js.map +1 -1
- package/bin/cli/model/ModelCreateCommand.js +1 -1
- package/bin/cli/model/ModelCreateCommand.js.map +1 -1
- package/bin/cli/model/ModelManager.js +1 -1
- package/bin/cli/model/ModelManager.js.map +1 -1
- package/bin/cli/model/ModelReadCommand.js +1 -1
- package/bin/cli/model/ModelReadCommand.js.map +1 -1
- package/bin/cli/service/ServiceCommandSupport.d.ts.map +1 -1
- package/bin/cli/service/ServiceCommandSupport.js +2 -1
- package/bin/cli/service/ServiceCommandSupport.js.map +1 -1
- package/bin/cli/shared/ChatAuth.d.ts.map +1 -1
- package/bin/cli/shared/ChatAuth.js +6 -5
- package/bin/cli/shared/ChatAuth.js.map +1 -1
- package/bin/cli/shared/ChatManager.d.ts.map +1 -1
- package/bin/cli/shared/ChatManager.js +11 -7
- package/bin/cli/shared/ChatManager.js.map +1 -1
- package/bin/cli/shared/Env.js +1 -1
- package/bin/cli/shared/Env.js.map +1 -1
- package/bin/cli/shared/Plugins.js +2 -1
- package/bin/cli/shared/Plugins.js.map +1 -1
- package/bin/cli/shared/PublicHostEnv.js +1 -1
- package/bin/cli/shared/PublicHostEnv.js.map +1 -1
- package/bin/config/Paths.d.ts +1 -5
- package/bin/config/Paths.d.ts.map +1 -1
- package/bin/config/Paths.js +2 -8
- package/bin/config/Paths.js.map +1 -1
- package/bin/control/ChannelAccountApiRoutes.d.ts.map +1 -1
- package/bin/control/ChannelAccountApiRoutes.js +2 -1
- package/bin/control/ChannelAccountApiRoutes.js.map +1 -1
- package/bin/control/EnvApiRoutes.js +1 -1
- package/bin/control/EnvApiRoutes.js.map +1 -1
- package/bin/control/ModelApiRoutes.js +1 -1
- package/bin/control/ModelApiRoutes.js.map +1 -1
- package/bin/control/ModelPoolService.js +1 -1
- package/bin/control/ModelPoolService.js.map +1 -1
- package/bin/control/PluginApiRoutes.d.ts.map +1 -1
- package/bin/control/PluginApiRoutes.js +2 -1
- package/bin/control/PluginApiRoutes.js.map +1 -1
- package/bin/control/gateway/AgentActions.d.ts.map +1 -1
- package/bin/control/gateway/AgentActions.js +4 -3
- package/bin/control/gateway/AgentActions.js.map +1 -1
- package/bin/control/gateway/AgentCatalog.js +4 -4
- package/bin/control/gateway/AgentCatalog.js.map +1 -1
- package/bin/http/auth/AuthService.d.ts.map +1 -1
- package/bin/http/auth/AuthService.js +1 -1
- package/bin/http/auth/AuthService.js.map +1 -1
- package/bin/http/auth/AuthStore.js +2 -2
- package/bin/http/auth/AuthStore.js.map +1 -1
- package/bin/platform/PluginLifecycle.d.ts +51 -0
- package/bin/platform/PluginLifecycle.d.ts.map +1 -0
- package/bin/platform/PluginLifecycle.js +98 -0
- package/bin/platform/PluginLifecycle.js.map +1 -0
- package/bin/platform/chatAuthorization/Store.d.ts +31 -0
- package/bin/platform/chatAuthorization/Store.d.ts.map +1 -0
- package/bin/platform/chatAuthorization/Store.js +145 -0
- package/bin/platform/chatAuthorization/Store.js.map +1 -0
- package/bin/platform/store/StoreChannelAccountRepository.d.ts +34 -0
- package/bin/platform/store/StoreChannelAccountRepository.d.ts.map +1 -0
- package/bin/platform/store/StoreChannelAccountRepository.js +198 -0
- package/bin/platform/store/StoreChannelAccountRepository.js.map +1 -0
- package/bin/platform/store/StoreEnvRepository.d.ts +98 -0
- package/bin/platform/store/StoreEnvRepository.d.ts.map +1 -0
- package/bin/platform/store/StoreEnvRepository.js +334 -0
- package/bin/platform/store/StoreEnvRepository.js.map +1 -0
- package/bin/platform/store/StoreModelRepository.d.ts +61 -0
- package/bin/platform/store/StoreModelRepository.d.ts.map +1 -0
- package/bin/platform/store/StoreModelRepository.js +278 -0
- package/bin/platform/store/StoreModelRepository.js.map +1 -0
- package/bin/platform/store/StoreSchema.d.ts +13 -0
- package/bin/platform/store/StoreSchema.d.ts.map +1 -0
- package/bin/platform/store/StoreSchema.js +319 -0
- package/bin/platform/store/StoreSchema.js.map +1 -0
- package/bin/platform/store/StoreSecureSettings.d.ts +33 -0
- package/bin/platform/store/StoreSecureSettings.d.ts.map +1 -0
- package/bin/platform/store/StoreSecureSettings.js +91 -0
- package/bin/platform/store/StoreSecureSettings.js.map +1 -0
- package/bin/platform/store/StoreShared.d.ts +44 -0
- package/bin/platform/store/StoreShared.d.ts.map +1 -0
- package/bin/platform/store/StoreShared.js +40 -0
- package/bin/platform/store/StoreShared.js.map +1 -0
- package/bin/platform/store/crypto.d.ts +24 -0
- package/bin/platform/store/crypto.d.ts.map +1 -0
- package/bin/platform/store/crypto.js +101 -0
- package/bin/platform/store/crypto.js.map +1 -0
- package/bin/platform/store/index.d.ts +230 -0
- package/bin/platform/store/index.d.ts.map +1 -0
- package/bin/platform/store/index.js +360 -0
- package/bin/platform/store/index.js.map +1 -0
- package/bin/platform/store/schema.d.ts +690 -0
- package/bin/platform/store/schema.d.ts.map +1 -0
- package/bin/platform/store/schema.js +81 -0
- package/bin/platform/store/schema.js.map +1 -0
- package/bin/process/registry/AgentHostRuntime.d.ts +9 -1
- package/bin/process/registry/AgentHostRuntime.d.ts.map +1 -1
- package/bin/process/registry/AgentHostRuntime.js +77 -3
- package/bin/process/registry/AgentHostRuntime.js.map +1 -1
- package/package.json +2 -2
- package/src/cli/agent/AgentManager.ts +1 -1
- package/src/cli/agent/AgentReset.ts +1 -1
- package/src/cli/agent/Init.ts +13 -8
- package/src/cli/agent/Run.ts +4 -1
- package/src/cli/control-plane/ControlPlaneInit.ts +1 -1
- package/src/cli/control-plane/ControlPlaneProcess.ts +2 -1
- package/src/cli/model/ModelCommandShared.ts +1 -1
- package/src/cli/model/ModelCreateCommand.ts +1 -1
- package/src/cli/model/ModelManager.ts +1 -1
- package/src/cli/model/ModelReadCommand.ts +1 -1
- package/src/cli/service/ServiceCommandSupport.ts +2 -1
- package/src/cli/shared/ChatAuth.ts +5 -6
- package/src/cli/shared/ChatManager.ts +12 -7
- package/src/cli/shared/Env.ts +1 -1
- package/src/cli/shared/Plugins.ts +1 -1
- package/src/cli/shared/PublicHostEnv.ts +1 -1
- package/src/config/Paths.ts +2 -9
- package/src/control/ChannelAccountApiRoutes.ts +2 -1
- package/src/control/EnvApiRoutes.ts +1 -1
- package/src/control/ModelApiRoutes.ts +1 -1
- package/src/control/ModelPoolService.ts +1 -1
- package/src/control/PluginApiRoutes.ts +4 -2
- package/src/control/gateway/AgentActions.ts +24 -17
- package/src/control/gateway/AgentCatalog.ts +4 -4
- package/src/http/auth/AuthService.ts +1 -1
- package/src/http/auth/AuthStore.ts +2 -2
- package/src/platform/PluginLifecycle.ts +132 -0
- package/src/platform/chatAuthorization/Store.ts +181 -0
- package/src/platform/store/StoreChannelAccountRepository.ts +269 -0
- package/src/platform/store/StoreEnvRepository.ts +452 -0
- package/src/platform/store/StoreModelRepository.ts +324 -0
- package/src/platform/store/StoreSchema.ts +344 -0
- package/src/platform/store/StoreSecureSettings.ts +126 -0
- package/src/platform/store/StoreShared.ts +67 -0
- package/src/platform/store/crypto.ts +112 -0
- package/src/platform/store/index.ts +497 -0
- package/src/platform/store/schema.ts +103 -0
- package/src/process/registry/AgentHostRuntime.ts +79 -3
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* City 级 plugin 生命周期管理。
|
|
3
|
+
*
|
|
4
|
+
* 关键点(中文)
|
|
5
|
+
* - plugin 启用/关闭属于 city 全局配置,不应由 agent 自己写入。
|
|
6
|
+
* - 这里把状态落到平台安全配置中,由 city 统一读写。
|
|
7
|
+
* - 默认策略:未显式关闭时,一律视为启用。
|
|
8
|
+
*/
|
|
9
|
+
import { PlatformStore } from "../platform/store/index.js";
|
|
10
|
+
const PLUGIN_LIFECYCLE_SETTING_KEY = "plugins.lifecycle";
|
|
11
|
+
function normalizeLifecycleItem(input) {
|
|
12
|
+
if (!input || typeof input !== "object" || Array.isArray(input))
|
|
13
|
+
return null;
|
|
14
|
+
const record = input;
|
|
15
|
+
if (typeof record.enabled !== "boolean")
|
|
16
|
+
return null;
|
|
17
|
+
return {
|
|
18
|
+
enabled: record.enabled,
|
|
19
|
+
updatedAt: String(record.updatedAt || "").trim() || new Date().toISOString(),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function normalizeLifecycleConfig(input) {
|
|
23
|
+
if (!input || typeof input !== "object" || Array.isArray(input))
|
|
24
|
+
return {};
|
|
25
|
+
const out = {};
|
|
26
|
+
for (const [pluginName, raw] of Object.entries(input)) {
|
|
27
|
+
const key = String(pluginName || "").trim();
|
|
28
|
+
if (!key)
|
|
29
|
+
continue;
|
|
30
|
+
const item = normalizeLifecycleItem(raw);
|
|
31
|
+
if (!item)
|
|
32
|
+
continue;
|
|
33
|
+
out[key] = item;
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 读取 city 级 plugin 生命周期配置。
|
|
39
|
+
*/
|
|
40
|
+
export function readCityPluginLifecycleConfig() {
|
|
41
|
+
const store = new PlatformStore();
|
|
42
|
+
try {
|
|
43
|
+
return normalizeLifecycleConfig(store.getSecureSettingJsonSync(PLUGIN_LIFECYCLE_SETTING_KEY));
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
store.close();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 写入完整 city 级 plugin 生命周期配置。
|
|
51
|
+
*/
|
|
52
|
+
export function writeCityPluginLifecycleConfig(value) {
|
|
53
|
+
const normalized = normalizeLifecycleConfig(value);
|
|
54
|
+
const store = new PlatformStore();
|
|
55
|
+
try {
|
|
56
|
+
store.setSecureSettingJsonSync(PLUGIN_LIFECYCLE_SETTING_KEY, normalized);
|
|
57
|
+
return normalized;
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
store.close();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 读取单个 plugin 的 city 级生命周期状态。
|
|
65
|
+
*/
|
|
66
|
+
export function readCityPluginLifecycleItem(pluginName) {
|
|
67
|
+
const key = String(pluginName || "").trim();
|
|
68
|
+
if (!key)
|
|
69
|
+
return null;
|
|
70
|
+
return readCityPluginLifecycleConfig()[key] || null;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 判断单个 plugin 是否启用。
|
|
74
|
+
*/
|
|
75
|
+
export function isCityPluginEnabled(pluginName) {
|
|
76
|
+
const item = readCityPluginLifecycleItem(pluginName);
|
|
77
|
+
if (!item)
|
|
78
|
+
return true;
|
|
79
|
+
return item.enabled === true;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 设置单个 plugin 的启用态。
|
|
83
|
+
*/
|
|
84
|
+
export function setCityPluginEnabled(pluginName, enabled) {
|
|
85
|
+
const key = String(pluginName || "").trim();
|
|
86
|
+
if (!key) {
|
|
87
|
+
throw new Error("pluginName is required");
|
|
88
|
+
}
|
|
89
|
+
const current = readCityPluginLifecycleConfig();
|
|
90
|
+
return writeCityPluginLifecycleConfig({
|
|
91
|
+
...current,
|
|
92
|
+
[key]: {
|
|
93
|
+
enabled,
|
|
94
|
+
updatedAt: new Date().toISOString(),
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=PluginLifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginLifecycle.js","sourceRoot":"","sources":["../../src/platform/PluginLifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* City 级 chat authorization 配置存储。
|
|
3
|
+
*
|
|
4
|
+
* 关键点(中文)
|
|
5
|
+
* - 静态 chat 授权配置属于 city 维护的项目侧状态。
|
|
6
|
+
* - 这里把配置落在项目 `.downcity/chat/authorization/config.json`。
|
|
7
|
+
* - agent 只消费注入进来的读写能力,不再自己管理这份配置。
|
|
8
|
+
*/
|
|
9
|
+
import type { ChatAuthorizationChannel, ChatAuthorizationConfig } from "@downcity/agent";
|
|
10
|
+
/**
|
|
11
|
+
* 同步读取 chat authorization 配置。
|
|
12
|
+
*/
|
|
13
|
+
export declare function readChatAuthorizationConfigSync(projectRoot: string): ChatAuthorizationConfig;
|
|
14
|
+
/**
|
|
15
|
+
* 读取 chat authorization 配置。
|
|
16
|
+
*/
|
|
17
|
+
export declare function readChatAuthorizationConfig(projectRoot: string): Promise<ChatAuthorizationConfig>;
|
|
18
|
+
/**
|
|
19
|
+
* 覆盖写入 chat authorization 配置。
|
|
20
|
+
*/
|
|
21
|
+
export declare function writeChatAuthorizationConfig(projectRoot: string, nextConfig: ChatAuthorizationConfig): Promise<ChatAuthorizationConfig>;
|
|
22
|
+
/**
|
|
23
|
+
* 设置单个用户角色。
|
|
24
|
+
*/
|
|
25
|
+
export declare function setChatAuthorizationUserRole(params: {
|
|
26
|
+
projectRoot: string;
|
|
27
|
+
channel: ChatAuthorizationChannel;
|
|
28
|
+
userId: string;
|
|
29
|
+
roleId: string;
|
|
30
|
+
}): Promise<ChatAuthorizationConfig>;
|
|
31
|
+
//# sourceMappingURL=Store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Store.d.ts","sourceRoot":"","sources":["../../../src/platform/chatAuthorization/Store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EACV,wBAAwB,EACxB,uBAAuB,EAGxB,MAAM,iBAAiB,CAAC;AAmHzB;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,WAAW,EAAE,MAAM,GAAG,uBAAuB,CAE5F;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,uBAAuB,CAAC,CAElC;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,uBAAuB,GAClC,OAAO,CAAC,uBAAuB,CAAC,CAElC;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAAC,MAAM,EAAE;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,wBAAwB,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAenC"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* City 级 chat authorization 配置存储。
|
|
3
|
+
*
|
|
4
|
+
* 关键点(中文)
|
|
5
|
+
* - 静态 chat 授权配置属于 city 维护的项目侧状态。
|
|
6
|
+
* - 这里把配置落在项目 `.downcity/chat/authorization/config.json`。
|
|
7
|
+
* - agent 只消费注入进来的读写能力,不再自己管理这份配置。
|
|
8
|
+
*/
|
|
9
|
+
import fs from "fs-extra";
|
|
10
|
+
import path from "node:path";
|
|
11
|
+
import { CHAT_AUTHORIZATION_CHANNELS, createDefaultChatAuthorizationRoles, } from "@downcity/agent";
|
|
12
|
+
function normalizeText(value) {
|
|
13
|
+
const text = String(value || "").trim();
|
|
14
|
+
return text || undefined;
|
|
15
|
+
}
|
|
16
|
+
function normalizeRoleMap(input) {
|
|
17
|
+
const defaultRoles = createDefaultChatAuthorizationRoles();
|
|
18
|
+
if (!input || typeof input !== "object" || Array.isArray(input))
|
|
19
|
+
return defaultRoles;
|
|
20
|
+
const roles = {};
|
|
21
|
+
for (const [rawRoleId, rawRole] of Object.entries(input)) {
|
|
22
|
+
const roleId = normalizeText(rawRoleId);
|
|
23
|
+
if (!roleId)
|
|
24
|
+
continue;
|
|
25
|
+
const roleObj = rawRole && typeof rawRole === "object" && !Array.isArray(rawRole)
|
|
26
|
+
? rawRole
|
|
27
|
+
: null;
|
|
28
|
+
if (!roleObj)
|
|
29
|
+
continue;
|
|
30
|
+
const builtinRole = defaultRoles[roleId];
|
|
31
|
+
const permissions = Array.isArray(roleObj.permissions)
|
|
32
|
+
? [...new Set(roleObj.permissions.map((item) => normalizeText(item)).filter(Boolean))]
|
|
33
|
+
: [];
|
|
34
|
+
roles[roleId] = {
|
|
35
|
+
roleId,
|
|
36
|
+
name: normalizeText(roleObj.name) || builtinRole?.name || roleId,
|
|
37
|
+
...(normalizeText(roleObj.description) || builtinRole?.description
|
|
38
|
+
? {
|
|
39
|
+
description: normalizeText(roleObj.description) || builtinRole?.description || undefined,
|
|
40
|
+
}
|
|
41
|
+
: {}),
|
|
42
|
+
permissions: permissions,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
if (Object.keys(roles).length === 0)
|
|
46
|
+
return defaultRoles;
|
|
47
|
+
if (!roles.default)
|
|
48
|
+
roles.default = defaultRoles.default;
|
|
49
|
+
return roles;
|
|
50
|
+
}
|
|
51
|
+
function normalizeBindingMap(input, roles) {
|
|
52
|
+
if (!input || typeof input !== "object" || Array.isArray(input))
|
|
53
|
+
return {};
|
|
54
|
+
const out = {};
|
|
55
|
+
for (const [rawId, rawRoleId] of Object.entries(input)) {
|
|
56
|
+
const entityId = normalizeText(rawId);
|
|
57
|
+
const roleId = normalizeText(rawRoleId);
|
|
58
|
+
if (!entityId || !roleId || !roles[roleId])
|
|
59
|
+
continue;
|
|
60
|
+
out[entityId] = roleId;
|
|
61
|
+
}
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
function normalizeChannelConfig(input, roles) {
|
|
65
|
+
const raw = input && typeof input === "object" && !Array.isArray(input)
|
|
66
|
+
? input
|
|
67
|
+
: {};
|
|
68
|
+
const defaultUserRoleId = normalizeText(raw.defaultUserRoleId) || "default";
|
|
69
|
+
return {
|
|
70
|
+
defaultUserRoleId: roles[defaultUserRoleId] ? defaultUserRoleId : "default",
|
|
71
|
+
userRoles: normalizeBindingMap(raw.userRoles, roles),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function normalizeAuthorizationConfig(input) {
|
|
75
|
+
const raw = input && typeof input === "object" && !Array.isArray(input)
|
|
76
|
+
? input
|
|
77
|
+
: {};
|
|
78
|
+
const roles = normalizeRoleMap(raw.roles);
|
|
79
|
+
const channels = {};
|
|
80
|
+
for (const channel of CHAT_AUTHORIZATION_CHANNELS) {
|
|
81
|
+
channels[channel] = normalizeChannelConfig(raw.channels?.[channel], roles);
|
|
82
|
+
}
|
|
83
|
+
return { roles, channels };
|
|
84
|
+
}
|
|
85
|
+
function getChatAuthorizationConfigPath(projectRoot) {
|
|
86
|
+
return path.join(projectRoot, ".downcity", "chat", "authorization", "config.json");
|
|
87
|
+
}
|
|
88
|
+
function readConfigFile(projectRoot) {
|
|
89
|
+
const file = getChatAuthorizationConfigPath(projectRoot);
|
|
90
|
+
if (!fs.existsSync(file))
|
|
91
|
+
return normalizeAuthorizationConfig({});
|
|
92
|
+
try {
|
|
93
|
+
return normalizeAuthorizationConfig(fs.readJsonSync(file));
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return normalizeAuthorizationConfig({});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function writeConfigFile(projectRoot, config) {
|
|
100
|
+
const file = getChatAuthorizationConfigPath(projectRoot);
|
|
101
|
+
fs.ensureDirSync(path.dirname(file));
|
|
102
|
+
fs.writeJsonSync(file, normalizeAuthorizationConfig(config), { spaces: 2 });
|
|
103
|
+
return normalizeAuthorizationConfig(config);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 同步读取 chat authorization 配置。
|
|
107
|
+
*/
|
|
108
|
+
export function readChatAuthorizationConfigSync(projectRoot) {
|
|
109
|
+
return readConfigFile(String(projectRoot || "").trim());
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 读取 chat authorization 配置。
|
|
113
|
+
*/
|
|
114
|
+
export async function readChatAuthorizationConfig(projectRoot) {
|
|
115
|
+
return readChatAuthorizationConfigSync(projectRoot);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* 覆盖写入 chat authorization 配置。
|
|
119
|
+
*/
|
|
120
|
+
export async function writeChatAuthorizationConfig(projectRoot, nextConfig) {
|
|
121
|
+
return writeConfigFile(String(projectRoot || "").trim(), nextConfig);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* 设置单个用户角色。
|
|
125
|
+
*/
|
|
126
|
+
export async function setChatAuthorizationUserRole(params) {
|
|
127
|
+
const projectRoot = String(params.projectRoot || "").trim();
|
|
128
|
+
const userId = normalizeText(params.userId);
|
|
129
|
+
const roleId = normalizeText(params.roleId);
|
|
130
|
+
if (!projectRoot)
|
|
131
|
+
throw new Error("projectRoot is required");
|
|
132
|
+
if (!userId || !roleId)
|
|
133
|
+
throw new Error("userId and roleId are required");
|
|
134
|
+
const next = readConfigFile(projectRoot);
|
|
135
|
+
next.roles = normalizeRoleMap(next.roles);
|
|
136
|
+
if (!next.roles[roleId])
|
|
137
|
+
throw new Error(`Unknown roleId: ${roleId}`);
|
|
138
|
+
next.channels ??= {};
|
|
139
|
+
const channelConfig = normalizeChannelConfig(next.channels[params.channel], next.roles);
|
|
140
|
+
channelConfig.userRoles ??= {};
|
|
141
|
+
channelConfig.userRoles[userId] = roleId;
|
|
142
|
+
next.channels[params.channel] = channelConfig;
|
|
143
|
+
return writeConfigFile(projectRoot, next);
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=Store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Store.js","sourceRoot":"","sources":["../../../src/platform/chatAuthorization/Store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PlatformStore 渠道账号仓储。
|
|
3
|
+
*
|
|
4
|
+
* 关键点(中文)
|
|
5
|
+
* - 统一管理 `channel_accounts` 表。
|
|
6
|
+
* - 负责敏感字段解密/加密与 channel account 的语义化组装。
|
|
7
|
+
*/
|
|
8
|
+
import type { StoredChannelAccount, UpsertChannelAccountInput } from "@downcity/agent";
|
|
9
|
+
import type { PlatformStoreContext } from "./StoreShared.js";
|
|
10
|
+
/**
|
|
11
|
+
* 同步列出 channel accounts。
|
|
12
|
+
*/
|
|
13
|
+
export declare function listChannelAccountsSync(context: PlatformStoreContext, channelInput?: string): StoredChannelAccount[];
|
|
14
|
+
/**
|
|
15
|
+
* 同步按 ID 获取 channel account。
|
|
16
|
+
*/
|
|
17
|
+
export declare function getChannelAccountSync(context: PlatformStoreContext, accountIdInput: string): StoredChannelAccount | null;
|
|
18
|
+
/**
|
|
19
|
+
* 异步列出 channel accounts。
|
|
20
|
+
*/
|
|
21
|
+
export declare function listChannelAccounts(context: PlatformStoreContext, channelInput?: string): Promise<StoredChannelAccount[]>;
|
|
22
|
+
/**
|
|
23
|
+
* 异步按 ID 获取 channel account。
|
|
24
|
+
*/
|
|
25
|
+
export declare function getChannelAccount(context: PlatformStoreContext, accountIdInput: string): Promise<StoredChannelAccount | null>;
|
|
26
|
+
/**
|
|
27
|
+
* 新增或更新 channel account。
|
|
28
|
+
*/
|
|
29
|
+
export declare function upsertChannelAccount(context: PlatformStoreContext, input: UpsertChannelAccountInput): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* 删除 channel account。
|
|
32
|
+
*/
|
|
33
|
+
export declare function removeChannelAccount(context: PlatformStoreContext, accountIdInput: string): void;
|
|
34
|
+
//# sourceMappingURL=StoreChannelAccountRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StoreChannelAccountRepository.d.ts","sourceRoot":"","sources":["../../../src/platform/store/StoreChannelAccountRepository.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAQ7D;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,oBAAoB,EAC7B,YAAY,CAAC,EAAE,MAAM,GACpB,oBAAoB,EAAE,CA8BxB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,oBAAoB,EAC7B,cAAc,EAAE,MAAM,GACrB,oBAAoB,GAAG,IAAI,CAI7B;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,oBAAoB,EAC7B,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,oBAAoB,EAAE,CAAC,CA8BjC;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,oBAAoB,EAC7B,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAItC;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,IAAI,CAAC,CA4Df;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,oBAAoB,EAC7B,cAAc,EAAE,MAAM,GACrB,IAAI,CAGN"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PlatformStore 渠道账号仓储。
|
|
3
|
+
*
|
|
4
|
+
* 关键点(中文)
|
|
5
|
+
* - 统一管理 `channel_accounts` 表。
|
|
6
|
+
* - 负责敏感字段解密/加密与 channel account 的语义化组装。
|
|
7
|
+
*/
|
|
8
|
+
import { decryptText, decryptTextSync, encryptText } from "./crypto.js";
|
|
9
|
+
import { normalizeChannelAccountChannel, normalizeNonEmptyText, nowIso, optionalTrimmedText, } from "./StoreShared.js";
|
|
10
|
+
/**
|
|
11
|
+
* 同步列出 channel accounts。
|
|
12
|
+
*/
|
|
13
|
+
export function listChannelAccountsSync(context, channelInput) {
|
|
14
|
+
const maybeChannel = optionalTrimmedText(channelInput);
|
|
15
|
+
const rows = maybeChannel
|
|
16
|
+
? context.sqlite.prepare(`
|
|
17
|
+
SELECT
|
|
18
|
+
id, channel, name, identity, owner, creator,
|
|
19
|
+
bot_token_encrypted, app_id_encrypted, app_secret_encrypted,
|
|
20
|
+
domain, sandbox, created_at, updated_at
|
|
21
|
+
FROM channel_accounts
|
|
22
|
+
WHERE channel = ?
|
|
23
|
+
ORDER BY name ASC, id ASC;
|
|
24
|
+
`).all(maybeChannel)
|
|
25
|
+
: context.sqlite.prepare(`
|
|
26
|
+
SELECT
|
|
27
|
+
id, channel, name, identity, owner, creator,
|
|
28
|
+
bot_token_encrypted, app_id_encrypted, app_secret_encrypted,
|
|
29
|
+
domain, sandbox, created_at, updated_at
|
|
30
|
+
FROM channel_accounts
|
|
31
|
+
ORDER BY channel ASC, name ASC, id ASC;
|
|
32
|
+
`).all();
|
|
33
|
+
const out = [];
|
|
34
|
+
for (const row of rows) {
|
|
35
|
+
const entry = buildChannelAccountFromRowSync(row);
|
|
36
|
+
if (entry)
|
|
37
|
+
out.push(entry);
|
|
38
|
+
}
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 同步按 ID 获取 channel account。
|
|
43
|
+
*/
|
|
44
|
+
export function getChannelAccountSync(context, accountIdInput) {
|
|
45
|
+
const accountId = normalizeNonEmptyText(accountIdInput, "channel account id");
|
|
46
|
+
const rows = listChannelAccountsSync(context);
|
|
47
|
+
return rows.find((item) => item.id === accountId) || null;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 异步列出 channel accounts。
|
|
51
|
+
*/
|
|
52
|
+
export async function listChannelAccounts(context, channelInput) {
|
|
53
|
+
const maybeChannel = optionalTrimmedText(channelInput);
|
|
54
|
+
const rows = maybeChannel
|
|
55
|
+
? context.sqlite.prepare(`
|
|
56
|
+
SELECT
|
|
57
|
+
id, channel, name, identity, owner, creator,
|
|
58
|
+
bot_token_encrypted, app_id_encrypted, app_secret_encrypted,
|
|
59
|
+
domain, sandbox, created_at, updated_at
|
|
60
|
+
FROM channel_accounts
|
|
61
|
+
WHERE channel = ?
|
|
62
|
+
ORDER BY name ASC, id ASC;
|
|
63
|
+
`).all(maybeChannel)
|
|
64
|
+
: context.sqlite.prepare(`
|
|
65
|
+
SELECT
|
|
66
|
+
id, channel, name, identity, owner, creator,
|
|
67
|
+
bot_token_encrypted, app_id_encrypted, app_secret_encrypted,
|
|
68
|
+
domain, sandbox, created_at, updated_at
|
|
69
|
+
FROM channel_accounts
|
|
70
|
+
ORDER BY channel ASC, name ASC, id ASC;
|
|
71
|
+
`).all();
|
|
72
|
+
const out = [];
|
|
73
|
+
for (const row of rows) {
|
|
74
|
+
const entry = await buildChannelAccountFromRow(row);
|
|
75
|
+
if (entry)
|
|
76
|
+
out.push(entry);
|
|
77
|
+
}
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 异步按 ID 获取 channel account。
|
|
82
|
+
*/
|
|
83
|
+
export async function getChannelAccount(context, accountIdInput) {
|
|
84
|
+
const accountId = normalizeNonEmptyText(accountIdInput, "channel account id");
|
|
85
|
+
const rows = await listChannelAccounts(context);
|
|
86
|
+
return rows.find((item) => item.id === accountId) || null;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* 新增或更新 channel account。
|
|
90
|
+
*/
|
|
91
|
+
export async function upsertChannelAccount(context, input) {
|
|
92
|
+
const id = normalizeNonEmptyText(input.id, "channel account id");
|
|
93
|
+
const channel = normalizeChannelAccountChannel(input.channel);
|
|
94
|
+
const name = normalizeNonEmptyText(input.name, "channel account name");
|
|
95
|
+
const existing = await getChannelAccount(context, id);
|
|
96
|
+
const createdAt = existing?.createdAt || nowIso();
|
|
97
|
+
const updatedAt = nowIso();
|
|
98
|
+
const nextBotToken = Object.prototype.hasOwnProperty.call(input, "botToken")
|
|
99
|
+
? optionalTrimmedText(input.botToken)
|
|
100
|
+
: existing?.botToken;
|
|
101
|
+
const nextAppId = Object.prototype.hasOwnProperty.call(input, "appId")
|
|
102
|
+
? optionalTrimmedText(input.appId)
|
|
103
|
+
: existing?.appId;
|
|
104
|
+
const nextAppSecret = Object.prototype.hasOwnProperty.call(input, "appSecret")
|
|
105
|
+
? optionalTrimmedText(input.appSecret)
|
|
106
|
+
: existing?.appSecret;
|
|
107
|
+
const botTokenEncrypted = nextBotToken ? await encryptText(nextBotToken) : null;
|
|
108
|
+
const appIdEncrypted = nextAppId ? await encryptText(nextAppId) : null;
|
|
109
|
+
const appSecretEncrypted = nextAppSecret ? await encryptText(nextAppSecret) : null;
|
|
110
|
+
context.sqlite.prepare(`
|
|
111
|
+
INSERT INTO channel_accounts (
|
|
112
|
+
id, channel, name, identity, owner, creator,
|
|
113
|
+
bot_token_encrypted, app_id_encrypted, app_secret_encrypted,
|
|
114
|
+
domain, sandbox, created_at, updated_at
|
|
115
|
+
)
|
|
116
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
117
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
118
|
+
channel = excluded.channel,
|
|
119
|
+
name = excluded.name,
|
|
120
|
+
identity = excluded.identity,
|
|
121
|
+
owner = excluded.owner,
|
|
122
|
+
creator = excluded.creator,
|
|
123
|
+
bot_token_encrypted = excluded.bot_token_encrypted,
|
|
124
|
+
app_id_encrypted = excluded.app_id_encrypted,
|
|
125
|
+
app_secret_encrypted = excluded.app_secret_encrypted,
|
|
126
|
+
domain = excluded.domain,
|
|
127
|
+
sandbox = excluded.sandbox,
|
|
128
|
+
updated_at = excluded.updated_at;
|
|
129
|
+
`).run(id, channel, name, optionalTrimmedText(input.identity) || null, optionalTrimmedText(input.owner) || null, optionalTrimmedText(input.creator) || null, botTokenEncrypted, appIdEncrypted, appSecretEncrypted, optionalTrimmedText(input.domain) || null, input.sandbox === true ? 1 : 0, createdAt, updatedAt);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 删除 channel account。
|
|
133
|
+
*/
|
|
134
|
+
export function removeChannelAccount(context, accountIdInput) {
|
|
135
|
+
const accountId = normalizeNonEmptyText(accountIdInput, "channel account id");
|
|
136
|
+
context.sqlite.prepare("DELETE FROM channel_accounts WHERE id = ?;").run(accountId);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* 同步构造 channel account。
|
|
140
|
+
*/
|
|
141
|
+
function buildChannelAccountFromRowSync(row) {
|
|
142
|
+
const id = String(row.id || "").trim();
|
|
143
|
+
if (!id)
|
|
144
|
+
return null;
|
|
145
|
+
const channel = normalizeChannelAccountChannel(String(row.channel || ""));
|
|
146
|
+
const botTokenEncrypted = typeof row.bot_token_encrypted === "string" ? row.bot_token_encrypted : "";
|
|
147
|
+
const appIdEncrypted = typeof row.app_id_encrypted === "string" ? row.app_id_encrypted : "";
|
|
148
|
+
const appSecretEncrypted = typeof row.app_secret_encrypted === "string" ? row.app_secret_encrypted : "";
|
|
149
|
+
const botToken = botTokenEncrypted ? decryptTextSync(botTokenEncrypted) : undefined;
|
|
150
|
+
const appId = appIdEncrypted ? decryptTextSync(appIdEncrypted) : undefined;
|
|
151
|
+
const appSecret = appSecretEncrypted ? decryptTextSync(appSecretEncrypted) : undefined;
|
|
152
|
+
return {
|
|
153
|
+
id,
|
|
154
|
+
channel,
|
|
155
|
+
name: String(row.name || "").trim() || id,
|
|
156
|
+
identity: optionalTrimmedText(String(row.identity || "")),
|
|
157
|
+
owner: optionalTrimmedText(String(row.owner || "")),
|
|
158
|
+
creator: optionalTrimmedText(String(row.creator || "")),
|
|
159
|
+
botToken: optionalTrimmedText(botToken),
|
|
160
|
+
appId: optionalTrimmedText(appId),
|
|
161
|
+
appSecret: optionalTrimmedText(appSecret),
|
|
162
|
+
domain: optionalTrimmedText(String(row.domain || "")),
|
|
163
|
+
sandbox: Number(row.sandbox || 0) === 1,
|
|
164
|
+
createdAt: String(row.created_at || ""),
|
|
165
|
+
updatedAt: String(row.updated_at || ""),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* 异步构造 channel account。
|
|
170
|
+
*/
|
|
171
|
+
async function buildChannelAccountFromRow(row) {
|
|
172
|
+
const id = String(row.id || "").trim();
|
|
173
|
+
if (!id)
|
|
174
|
+
return null;
|
|
175
|
+
const channel = normalizeChannelAccountChannel(String(row.channel || ""));
|
|
176
|
+
const botTokenEncrypted = typeof row.bot_token_encrypted === "string" ? row.bot_token_encrypted : "";
|
|
177
|
+
const appIdEncrypted = typeof row.app_id_encrypted === "string" ? row.app_id_encrypted : "";
|
|
178
|
+
const appSecretEncrypted = typeof row.app_secret_encrypted === "string" ? row.app_secret_encrypted : "";
|
|
179
|
+
const botToken = botTokenEncrypted ? await decryptText(botTokenEncrypted) : undefined;
|
|
180
|
+
const appId = appIdEncrypted ? await decryptText(appIdEncrypted) : undefined;
|
|
181
|
+
const appSecret = appSecretEncrypted ? await decryptText(appSecretEncrypted) : undefined;
|
|
182
|
+
return {
|
|
183
|
+
id,
|
|
184
|
+
channel,
|
|
185
|
+
name: String(row.name || "").trim() || id,
|
|
186
|
+
identity: optionalTrimmedText(String(row.identity || "")),
|
|
187
|
+
owner: optionalTrimmedText(String(row.owner || "")),
|
|
188
|
+
creator: optionalTrimmedText(String(row.creator || "")),
|
|
189
|
+
botToken: optionalTrimmedText(botToken),
|
|
190
|
+
appId: optionalTrimmedText(appId),
|
|
191
|
+
appSecret: optionalTrimmedText(appSecret),
|
|
192
|
+
domain: optionalTrimmedText(String(row.domain || "")),
|
|
193
|
+
sandbox: Number(row.sandbox || 0) === 1,
|
|
194
|
+
createdAt: String(row.created_at || ""),
|
|
195
|
+
updatedAt: String(row.updated_at || ""),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=StoreChannelAccountRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StoreChannelAccountRepository.js","sourceRoot":"","sources":["../../../src/platform/store/StoreChannelAccountRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PlatformStore 环境变量仓储。
|
|
3
|
+
*
|
|
4
|
+
* 关键点(中文)
|
|
5
|
+
* - 统一管理 `env_entries` 单表。
|
|
6
|
+
* - 同时暴露 global / agent 两层语义化包装。
|
|
7
|
+
*/
|
|
8
|
+
import type { StoredAgentEnvEntry, StoredEnvEntry, StoredEnvScope, StoredGlobalEnvEntry, UpsertAgentEnvEntryInput, UpsertEnvEntryInput, UpsertGlobalEnvEntryInput } from "@downcity/agent";
|
|
9
|
+
import type { PlatformStoreContext } from "./StoreShared.js";
|
|
10
|
+
/**
|
|
11
|
+
* 规范化 env scope。
|
|
12
|
+
*/
|
|
13
|
+
export declare function normalizeEnvScope(input: string): StoredEnvScope;
|
|
14
|
+
/**
|
|
15
|
+
* 规范化 env 的 agent 目标。
|
|
16
|
+
*/
|
|
17
|
+
export declare function normalizeEnvAgentTarget(scope: StoredEnvScope, agentIdInput?: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* 同步列出 env 条目。
|
|
20
|
+
*/
|
|
21
|
+
export declare function listEnvEntriesSync(context: PlatformStoreContext, scopeInput?: StoredEnvScope, agentIdInput?: string): StoredEnvEntry[];
|
|
22
|
+
/**
|
|
23
|
+
* 异步列出 env 条目。
|
|
24
|
+
*/
|
|
25
|
+
export declare function listEnvEntries(context: PlatformStoreContext, scopeInput?: StoredEnvScope, agentIdInput?: string): Promise<StoredEnvEntry[]>;
|
|
26
|
+
/**
|
|
27
|
+
* 新增或更新 env 条目。
|
|
28
|
+
*/
|
|
29
|
+
export declare function upsertEnvEntry(context: PlatformStoreContext, input: UpsertEnvEntryInput): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* 删除单个 env 条目。
|
|
32
|
+
*/
|
|
33
|
+
export declare function removeEnvEntry(context: PlatformStoreContext, input: {
|
|
34
|
+
scope: StoredEnvScope;
|
|
35
|
+
agentId?: string;
|
|
36
|
+
key: string;
|
|
37
|
+
}): void;
|
|
38
|
+
/**
|
|
39
|
+
* 同步列出全局环境变量。
|
|
40
|
+
*/
|
|
41
|
+
export declare function listGlobalEnvEntriesSync(context: PlatformStoreContext): StoredGlobalEnvEntry[];
|
|
42
|
+
/**
|
|
43
|
+
* 同步读取全局环境变量映射。
|
|
44
|
+
*/
|
|
45
|
+
export declare function getGlobalEnvMapSync(context: PlatformStoreContext): Record<string, string>;
|
|
46
|
+
/**
|
|
47
|
+
* 异步列出全局环境变量。
|
|
48
|
+
*/
|
|
49
|
+
export declare function listGlobalEnvEntries(context: PlatformStoreContext): Promise<StoredGlobalEnvEntry[]>;
|
|
50
|
+
/**
|
|
51
|
+
* 异步读取全局环境变量映射。
|
|
52
|
+
*/
|
|
53
|
+
export declare function getGlobalEnvMap(context: PlatformStoreContext): Promise<Record<string, string>>;
|
|
54
|
+
/**
|
|
55
|
+
* 新增或更新全局环境变量。
|
|
56
|
+
*/
|
|
57
|
+
export declare function upsertGlobalEnvEntry(context: PlatformStoreContext, input: UpsertGlobalEnvEntryInput): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* 删除单个全局环境变量。
|
|
60
|
+
*/
|
|
61
|
+
export declare function removeGlobalEnvEntry(context: PlatformStoreContext, keyInput: string): void;
|
|
62
|
+
/**
|
|
63
|
+
* 清空全局环境变量。
|
|
64
|
+
*/
|
|
65
|
+
export declare function clearGlobalEnvEntries(context: PlatformStoreContext): void;
|
|
66
|
+
/**
|
|
67
|
+
* 同步列出指定 agent 的私有环境变量。
|
|
68
|
+
*/
|
|
69
|
+
export declare function listAgentEnvEntriesSync(context: PlatformStoreContext, agentIdInput: string): StoredAgentEnvEntry[];
|
|
70
|
+
/**
|
|
71
|
+
* 同步读取 agent 环境变量映射。
|
|
72
|
+
*/
|
|
73
|
+
export declare function getAgentEnvMapSync(context: PlatformStoreContext, agentIdInput: string): Record<string, string>;
|
|
74
|
+
/**
|
|
75
|
+
* 异步列出指定 agent 的私有环境变量。
|
|
76
|
+
*/
|
|
77
|
+
export declare function listAgentEnvEntries(context: PlatformStoreContext, agentIdInput: string): Promise<StoredAgentEnvEntry[]>;
|
|
78
|
+
/**
|
|
79
|
+
* 异步列出全部 agent 私有环境变量。
|
|
80
|
+
*/
|
|
81
|
+
export declare function listAllAgentEnvEntries(context: PlatformStoreContext): Promise<StoredAgentEnvEntry[]>;
|
|
82
|
+
/**
|
|
83
|
+
* 异步读取 agent 环境变量映射。
|
|
84
|
+
*/
|
|
85
|
+
export declare function getAgentEnvMap(context: PlatformStoreContext, agentIdInput: string): Promise<Record<string, string>>;
|
|
86
|
+
/**
|
|
87
|
+
* 新增或更新 agent 私有环境变量。
|
|
88
|
+
*/
|
|
89
|
+
export declare function upsertAgentEnvEntry(context: PlatformStoreContext, input: UpsertAgentEnvEntryInput): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* 删除指定 agent 的单个环境变量。
|
|
92
|
+
*/
|
|
93
|
+
export declare function removeAgentEnvEntry(context: PlatformStoreContext, agentIdInput: string, keyInput: string): void;
|
|
94
|
+
/**
|
|
95
|
+
* 清空指定 agent 的私有环境变量。
|
|
96
|
+
*/
|
|
97
|
+
export declare function clearAgentEnvEntries(context: PlatformStoreContext, agentIdInput: string): void;
|
|
98
|
+
//# sourceMappingURL=StoreEnvRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StoreEnvRepository.d.ts","sourceRoot":"","sources":["../../../src/platform/store/StoreEnvRepository.ts"],"names":[],"mappings":"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"}
|