@downcity/city 1.1.7 → 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,334 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PlatformStore 环境变量仓储。
|
|
3
|
+
*
|
|
4
|
+
* 关键点(中文)
|
|
5
|
+
* - 统一管理 `env_entries` 单表。
|
|
6
|
+
* - 同时暴露 global / agent 两层语义化包装。
|
|
7
|
+
*/
|
|
8
|
+
import { decryptText, decryptTextSync, encryptText } from "./crypto.js";
|
|
9
|
+
import { normalizeNonEmptyText, nowIso } from "./StoreShared.js";
|
|
10
|
+
/**
|
|
11
|
+
* 规范化 env scope。
|
|
12
|
+
*/
|
|
13
|
+
export function normalizeEnvScope(input) {
|
|
14
|
+
const scope = String(input || "").trim().toLowerCase();
|
|
15
|
+
if (scope === "agent")
|
|
16
|
+
return "agent";
|
|
17
|
+
return "global";
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 规范化 env 的 agent 目标。
|
|
21
|
+
*/
|
|
22
|
+
export function normalizeEnvAgentTarget(scope, agentIdInput) {
|
|
23
|
+
if (scope === "global")
|
|
24
|
+
return "";
|
|
25
|
+
return normalizeNonEmptyText(agentIdInput || "", "agentId");
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 同步构造 env 条目。
|
|
29
|
+
*/
|
|
30
|
+
function buildEnvEntryFromRowSync(row) {
|
|
31
|
+
const scope = normalizeEnvScope(String(row.scope || ""));
|
|
32
|
+
const agentId = String(row.agent_id || "").trim();
|
|
33
|
+
const key = String(row.key || "").trim();
|
|
34
|
+
const encrypted = typeof row.value_encrypted === "string" ? row.value_encrypted : "";
|
|
35
|
+
if (!key || !encrypted)
|
|
36
|
+
return null;
|
|
37
|
+
return {
|
|
38
|
+
scope,
|
|
39
|
+
agentId: scope === "agent" ? agentId : undefined,
|
|
40
|
+
key,
|
|
41
|
+
description: String(row.description || "").trim() || undefined,
|
|
42
|
+
value: decryptTextSync(encrypted),
|
|
43
|
+
createdAt: String(row.created_at || ""),
|
|
44
|
+
updatedAt: String(row.updated_at || ""),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 异步构造 env 条目。
|
|
49
|
+
*/
|
|
50
|
+
async function buildEnvEntryFromRow(row) {
|
|
51
|
+
const scope = normalizeEnvScope(String(row.scope || ""));
|
|
52
|
+
const agentId = String(row.agent_id || "").trim();
|
|
53
|
+
const key = String(row.key || "").trim();
|
|
54
|
+
const encrypted = typeof row.value_encrypted === "string" ? row.value_encrypted : "";
|
|
55
|
+
if (!key || !encrypted)
|
|
56
|
+
return null;
|
|
57
|
+
return {
|
|
58
|
+
scope,
|
|
59
|
+
agentId: scope === "agent" ? agentId : undefined,
|
|
60
|
+
key,
|
|
61
|
+
description: String(row.description || "").trim() || undefined,
|
|
62
|
+
value: await decryptText(encrypted),
|
|
63
|
+
createdAt: String(row.created_at || ""),
|
|
64
|
+
updatedAt: String(row.updated_at || ""),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 同步列出 env 条目。
|
|
69
|
+
*/
|
|
70
|
+
export function listEnvEntriesSync(context, scopeInput, agentIdInput) {
|
|
71
|
+
const hasScope = Boolean(scopeInput);
|
|
72
|
+
const scope = hasScope ? normalizeEnvScope(scopeInput || "global") : undefined;
|
|
73
|
+
const hasAgentFilter = scope === "agent" && Boolean(String(agentIdInput || "").trim());
|
|
74
|
+
const agentId = hasAgentFilter
|
|
75
|
+
? normalizeEnvAgentTarget(scope, agentIdInput)
|
|
76
|
+
: undefined;
|
|
77
|
+
const rows = hasAgentFilter
|
|
78
|
+
? context.sqlite.prepare(`
|
|
79
|
+
SELECT scope, agent_id, key, description, value_encrypted, created_at, updated_at
|
|
80
|
+
FROM env_entries
|
|
81
|
+
WHERE scope = 'agent' AND agent_id = ?
|
|
82
|
+
ORDER BY key ASC;
|
|
83
|
+
`).all(agentId)
|
|
84
|
+
: scope === "agent"
|
|
85
|
+
? context.sqlite.prepare(`
|
|
86
|
+
SELECT scope, agent_id, key, description, value_encrypted, created_at, updated_at
|
|
87
|
+
FROM env_entries
|
|
88
|
+
WHERE scope = 'agent'
|
|
89
|
+
ORDER BY agent_id ASC, key ASC;
|
|
90
|
+
`).all()
|
|
91
|
+
: scope === "global"
|
|
92
|
+
? context.sqlite.prepare(`
|
|
93
|
+
SELECT scope, agent_id, key, description, value_encrypted, created_at, updated_at
|
|
94
|
+
FROM env_entries
|
|
95
|
+
WHERE scope = 'global'
|
|
96
|
+
ORDER BY key ASC;
|
|
97
|
+
`).all()
|
|
98
|
+
: context.sqlite.prepare(`
|
|
99
|
+
SELECT scope, agent_id, key, description, value_encrypted, created_at, updated_at
|
|
100
|
+
FROM env_entries
|
|
101
|
+
ORDER BY scope ASC, agent_id ASC, key ASC;
|
|
102
|
+
`).all();
|
|
103
|
+
const out = [];
|
|
104
|
+
for (const row of rows) {
|
|
105
|
+
const entry = buildEnvEntryFromRowSync(row);
|
|
106
|
+
if (entry)
|
|
107
|
+
out.push(entry);
|
|
108
|
+
}
|
|
109
|
+
return out;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 异步列出 env 条目。
|
|
113
|
+
*/
|
|
114
|
+
export async function listEnvEntries(context, scopeInput, agentIdInput) {
|
|
115
|
+
const hasScope = Boolean(scopeInput);
|
|
116
|
+
const scope = hasScope ? normalizeEnvScope(scopeInput || "global") : undefined;
|
|
117
|
+
const hasAgentFilter = scope === "agent" && Boolean(String(agentIdInput || "").trim());
|
|
118
|
+
const agentId = hasAgentFilter
|
|
119
|
+
? normalizeEnvAgentTarget(scope, agentIdInput)
|
|
120
|
+
: undefined;
|
|
121
|
+
const rows = hasAgentFilter
|
|
122
|
+
? context.sqlite.prepare(`
|
|
123
|
+
SELECT scope, agent_id, key, description, value_encrypted, created_at, updated_at
|
|
124
|
+
FROM env_entries
|
|
125
|
+
WHERE scope = 'agent' AND agent_id = ?
|
|
126
|
+
ORDER BY key ASC;
|
|
127
|
+
`).all(agentId)
|
|
128
|
+
: scope === "agent"
|
|
129
|
+
? context.sqlite.prepare(`
|
|
130
|
+
SELECT scope, agent_id, key, description, value_encrypted, created_at, updated_at
|
|
131
|
+
FROM env_entries
|
|
132
|
+
WHERE scope = 'agent'
|
|
133
|
+
ORDER BY agent_id ASC, key ASC;
|
|
134
|
+
`).all()
|
|
135
|
+
: scope === "global"
|
|
136
|
+
? context.sqlite.prepare(`
|
|
137
|
+
SELECT scope, agent_id, key, description, value_encrypted, created_at, updated_at
|
|
138
|
+
FROM env_entries
|
|
139
|
+
WHERE scope = 'global'
|
|
140
|
+
ORDER BY key ASC;
|
|
141
|
+
`).all()
|
|
142
|
+
: context.sqlite.prepare(`
|
|
143
|
+
SELECT scope, agent_id, key, description, value_encrypted, created_at, updated_at
|
|
144
|
+
FROM env_entries
|
|
145
|
+
ORDER BY scope ASC, agent_id ASC, key ASC;
|
|
146
|
+
`).all();
|
|
147
|
+
const out = [];
|
|
148
|
+
for (const row of rows) {
|
|
149
|
+
const entry = await buildEnvEntryFromRow(row);
|
|
150
|
+
if (entry)
|
|
151
|
+
out.push(entry);
|
|
152
|
+
}
|
|
153
|
+
return out;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* 新增或更新 env 条目。
|
|
157
|
+
*/
|
|
158
|
+
export async function upsertEnvEntry(context, input) {
|
|
159
|
+
const scope = normalizeEnvScope(input.scope);
|
|
160
|
+
const agentId = normalizeEnvAgentTarget(scope, input.agentId);
|
|
161
|
+
const key = normalizeNonEmptyText(input.key, `${scope} env key`);
|
|
162
|
+
const description = String(input.description || "").trim();
|
|
163
|
+
const value = String(input.value ?? "");
|
|
164
|
+
const existing = context.sqlite
|
|
165
|
+
.prepare(`
|
|
166
|
+
SELECT created_at
|
|
167
|
+
FROM env_entries
|
|
168
|
+
WHERE scope = ? AND agent_id = ? AND key = ?
|
|
169
|
+
LIMIT 1;
|
|
170
|
+
`)
|
|
171
|
+
.get(scope, agentId, key);
|
|
172
|
+
const createdAt = String(existing?.created_at || nowIso());
|
|
173
|
+
const updatedAt = nowIso();
|
|
174
|
+
const encrypted = await encryptText(value);
|
|
175
|
+
context.sqlite
|
|
176
|
+
.prepare(`
|
|
177
|
+
INSERT INTO env_entries (
|
|
178
|
+
scope,
|
|
179
|
+
agent_id,
|
|
180
|
+
key,
|
|
181
|
+
description,
|
|
182
|
+
value_encrypted,
|
|
183
|
+
created_at,
|
|
184
|
+
updated_at
|
|
185
|
+
)
|
|
186
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
187
|
+
ON CONFLICT(scope, agent_id, key) DO UPDATE SET
|
|
188
|
+
description = excluded.description,
|
|
189
|
+
value_encrypted = excluded.value_encrypted,
|
|
190
|
+
updated_at = excluded.updated_at;
|
|
191
|
+
`)
|
|
192
|
+
.run(scope, agentId, key, description || null, encrypted, createdAt, updatedAt);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* 删除单个 env 条目。
|
|
196
|
+
*/
|
|
197
|
+
export function removeEnvEntry(context, input) {
|
|
198
|
+
const scope = normalizeEnvScope(input.scope);
|
|
199
|
+
const agentId = normalizeEnvAgentTarget(scope, input.agentId);
|
|
200
|
+
const key = normalizeNonEmptyText(input.key, `${scope} env key`);
|
|
201
|
+
context.sqlite
|
|
202
|
+
.prepare("DELETE FROM env_entries WHERE scope = ? AND agent_id = ? AND key = ?;")
|
|
203
|
+
.run(scope, agentId, key);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* 同步列出全局环境变量。
|
|
207
|
+
*/
|
|
208
|
+
export function listGlobalEnvEntriesSync(context) {
|
|
209
|
+
return listEnvEntriesSync(context, "global");
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* 同步读取全局环境变量映射。
|
|
213
|
+
*/
|
|
214
|
+
export function getGlobalEnvMapSync(context) {
|
|
215
|
+
const entries = listGlobalEnvEntriesSync(context);
|
|
216
|
+
const map = {};
|
|
217
|
+
for (const item of entries) {
|
|
218
|
+
map[item.key] = item.value;
|
|
219
|
+
}
|
|
220
|
+
return map;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* 异步列出全局环境变量。
|
|
224
|
+
*/
|
|
225
|
+
export async function listGlobalEnvEntries(context) {
|
|
226
|
+
return listEnvEntries(context, "global");
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* 异步读取全局环境变量映射。
|
|
230
|
+
*/
|
|
231
|
+
export async function getGlobalEnvMap(context) {
|
|
232
|
+
const entries = await listGlobalEnvEntries(context);
|
|
233
|
+
const map = {};
|
|
234
|
+
for (const item of entries) {
|
|
235
|
+
map[item.key] = item.value;
|
|
236
|
+
}
|
|
237
|
+
return map;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* 新增或更新全局环境变量。
|
|
241
|
+
*/
|
|
242
|
+
export async function upsertGlobalEnvEntry(context, input) {
|
|
243
|
+
await upsertEnvEntry(context, {
|
|
244
|
+
scope: "global",
|
|
245
|
+
key: input.key,
|
|
246
|
+
value: input.value,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* 删除单个全局环境变量。
|
|
251
|
+
*/
|
|
252
|
+
export function removeGlobalEnvEntry(context, keyInput) {
|
|
253
|
+
removeEnvEntry(context, {
|
|
254
|
+
scope: "global",
|
|
255
|
+
key: keyInput,
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* 清空全局环境变量。
|
|
260
|
+
*/
|
|
261
|
+
export function clearGlobalEnvEntries(context) {
|
|
262
|
+
context.sqlite.prepare("DELETE FROM env_entries WHERE scope = 'global';").run();
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* 同步列出指定 agent 的私有环境变量。
|
|
266
|
+
*/
|
|
267
|
+
export function listAgentEnvEntriesSync(context, agentIdInput) {
|
|
268
|
+
return listEnvEntriesSync(context, "agent", agentIdInput);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* 同步读取 agent 环境变量映射。
|
|
272
|
+
*/
|
|
273
|
+
export function getAgentEnvMapSync(context, agentIdInput) {
|
|
274
|
+
const entries = listAgentEnvEntriesSync(context, agentIdInput);
|
|
275
|
+
const map = {};
|
|
276
|
+
for (const item of entries) {
|
|
277
|
+
map[item.key] = item.value;
|
|
278
|
+
}
|
|
279
|
+
return map;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* 异步列出指定 agent 的私有环境变量。
|
|
283
|
+
*/
|
|
284
|
+
export async function listAgentEnvEntries(context, agentIdInput) {
|
|
285
|
+
return listEnvEntries(context, "agent", agentIdInput);
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* 异步列出全部 agent 私有环境变量。
|
|
289
|
+
*/
|
|
290
|
+
export async function listAllAgentEnvEntries(context) {
|
|
291
|
+
return listEnvEntries(context, "agent");
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* 异步读取 agent 环境变量映射。
|
|
295
|
+
*/
|
|
296
|
+
export async function getAgentEnvMap(context, agentIdInput) {
|
|
297
|
+
const entries = await listAgentEnvEntries(context, agentIdInput);
|
|
298
|
+
const map = {};
|
|
299
|
+
for (const item of entries) {
|
|
300
|
+
map[item.key] = item.value;
|
|
301
|
+
}
|
|
302
|
+
return map;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* 新增或更新 agent 私有环境变量。
|
|
306
|
+
*/
|
|
307
|
+
export async function upsertAgentEnvEntry(context, input) {
|
|
308
|
+
await upsertEnvEntry(context, {
|
|
309
|
+
scope: "agent",
|
|
310
|
+
agentId: input.agentId,
|
|
311
|
+
key: input.key,
|
|
312
|
+
value: input.value,
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* 删除指定 agent 的单个环境变量。
|
|
317
|
+
*/
|
|
318
|
+
export function removeAgentEnvEntry(context, agentIdInput, keyInput) {
|
|
319
|
+
removeEnvEntry(context, {
|
|
320
|
+
scope: "agent",
|
|
321
|
+
agentId: agentIdInput,
|
|
322
|
+
key: keyInput,
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* 清空指定 agent 的私有环境变量。
|
|
327
|
+
*/
|
|
328
|
+
export function clearAgentEnvEntries(context, agentIdInput) {
|
|
329
|
+
const agentId = normalizeNonEmptyText(agentIdInput, "agentId");
|
|
330
|
+
context.sqlite
|
|
331
|
+
.prepare("DELETE FROM env_entries WHERE scope = 'agent' AND agent_id = ?;")
|
|
332
|
+
.run(agentId);
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=StoreEnvRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StoreEnvRepository.js","sourceRoot":"","sources":["../../../src/platform/store/StoreEnvRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PlatformStore 模型与 Provider 仓储。
|
|
3
|
+
*
|
|
4
|
+
* 关键点(中文)
|
|
5
|
+
* - 只负责 model/provider 相关读写,不处理 env、channel account、secure settings。
|
|
6
|
+
* - 对外暴露纯函数,`PlatformStore` 作为门面调用。
|
|
7
|
+
*/
|
|
8
|
+
import type { StoredModel, StoredModelProvider, StoredProviderMeta, UpsertModelInput, UpsertModelProviderInput } from "@downcity/agent";
|
|
9
|
+
import type { PlatformStoreContext } from "./StoreShared.js";
|
|
10
|
+
/**
|
|
11
|
+
* 列出 providers。
|
|
12
|
+
*/
|
|
13
|
+
export declare function listStoredProviders(context: PlatformStoreContext): Promise<StoredModelProvider[]>;
|
|
14
|
+
/**
|
|
15
|
+
* 同步列出 provider 元信息(不含 API Key)。
|
|
16
|
+
*/
|
|
17
|
+
export declare function listStoredProviderMetas(context: PlatformStoreContext): StoredProviderMeta[];
|
|
18
|
+
/**
|
|
19
|
+
* 获取单个 provider。
|
|
20
|
+
*/
|
|
21
|
+
export declare function getStoredProvider(context: PlatformStoreContext, providerId: string): Promise<StoredModelProvider | null>;
|
|
22
|
+
/**
|
|
23
|
+
* 新增或更新 provider。
|
|
24
|
+
*/
|
|
25
|
+
export declare function upsertStoredProvider(context: PlatformStoreContext, input: UpsertModelProviderInput): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* 删除 provider。
|
|
28
|
+
*/
|
|
29
|
+
export declare function removeStoredProvider(context: PlatformStoreContext, providerId: string): void;
|
|
30
|
+
/**
|
|
31
|
+
* 列出 models。
|
|
32
|
+
*/
|
|
33
|
+
export declare function listStoredModels(context: PlatformStoreContext): StoredModel[];
|
|
34
|
+
/**
|
|
35
|
+
* 获取单个 model。
|
|
36
|
+
*/
|
|
37
|
+
export declare function getStoredModel(context: PlatformStoreContext, modelId: string): StoredModel | null;
|
|
38
|
+
/**
|
|
39
|
+
* 新增或更新 model。
|
|
40
|
+
*/
|
|
41
|
+
export declare function upsertStoredModel(context: PlatformStoreContext, input: UpsertModelInput): void;
|
|
42
|
+
/**
|
|
43
|
+
* 切换 model 暂停状态。
|
|
44
|
+
*/
|
|
45
|
+
export declare function setStoredModelPaused(context: PlatformStoreContext, modelId: string, paused: boolean): void;
|
|
46
|
+
/**
|
|
47
|
+
* 删除 model。
|
|
48
|
+
*/
|
|
49
|
+
export declare function removeStoredModel(context: PlatformStoreContext, modelId: string): void;
|
|
50
|
+
/**
|
|
51
|
+
* 获取“model + provider”聚合信息。
|
|
52
|
+
*/
|
|
53
|
+
export declare function getResolvedStoredModel(context: PlatformStoreContext, modelId: string): Promise<{
|
|
54
|
+
model: StoredModel;
|
|
55
|
+
provider: StoredModelProvider;
|
|
56
|
+
} | null>;
|
|
57
|
+
/**
|
|
58
|
+
* 清空模型相关表。
|
|
59
|
+
*/
|
|
60
|
+
export declare function clearStoredModelsAndProviders(context: PlatformStoreContext): void;
|
|
61
|
+
//# sourceMappingURL=StoreModelRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StoreModelRepository.d.ts","sourceRoot":"","sources":["../../../src/platform/store/StoreModelRepository.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,EACzB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAG7D;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAkBhC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,oBAAoB,GAC5B,kBAAkB,EAAE,CAOtB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,oBAAoB,EAC7B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAmBrC;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAyCf;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,oBAAoB,EAC7B,UAAU,EAAE,MAAM,GACjB,IAAI,CAeN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,WAAW,EAAE,CAgB7E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,MAAM,GACd,WAAW,GAAG,IAAI,CAqBpB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,gBAAgB,GACtB,IAAI,CAoDN;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,GACd,IAAI,CAaN;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,MAAM,GACd,IAAI,CAEN;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,mBAAmB,CAAA;CAAE,GAAG,IAAI,CAAC,CAMvE;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,oBAAoB,GAC5B,IAAI,CAGN"}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PlatformStore 模型与 Provider 仓储。
|
|
3
|
+
*
|
|
4
|
+
* 关键点(中文)
|
|
5
|
+
* - 只负责 model/provider 相关读写,不处理 env、channel account、secure settings。
|
|
6
|
+
* - 对外暴露纯函数,`PlatformStore` 作为门面调用。
|
|
7
|
+
*/
|
|
8
|
+
import { eq } from "drizzle-orm";
|
|
9
|
+
import { decryptText, encryptText } from "./crypto.js";
|
|
10
|
+
import { modelProvidersTable, modelsTable } from "./schema.js";
|
|
11
|
+
import { nowIso } from "./StoreShared.js";
|
|
12
|
+
/**
|
|
13
|
+
* 列出 providers。
|
|
14
|
+
*/
|
|
15
|
+
export async function listStoredProviders(context) {
|
|
16
|
+
const rows = context.db.select().from(modelProvidersTable).all();
|
|
17
|
+
const result = [];
|
|
18
|
+
for (const row of rows) {
|
|
19
|
+
let apiKey;
|
|
20
|
+
if (row.apiKeyEncrypted) {
|
|
21
|
+
apiKey = await decryptText(row.apiKeyEncrypted);
|
|
22
|
+
}
|
|
23
|
+
result.push({
|
|
24
|
+
id: row.id,
|
|
25
|
+
type: row.type,
|
|
26
|
+
baseUrl: row.baseUrl || undefined,
|
|
27
|
+
apiKey,
|
|
28
|
+
createdAt: row.createdAt,
|
|
29
|
+
updatedAt: row.updatedAt,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 同步列出 provider 元信息(不含 API Key)。
|
|
36
|
+
*/
|
|
37
|
+
export function listStoredProviderMetas(context) {
|
|
38
|
+
const rows = context.db.select().from(modelProvidersTable).all();
|
|
39
|
+
return rows.map((row) => ({
|
|
40
|
+
id: row.id,
|
|
41
|
+
type: row.type,
|
|
42
|
+
baseUrl: row.baseUrl || undefined,
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 获取单个 provider。
|
|
47
|
+
*/
|
|
48
|
+
export async function getStoredProvider(context, providerId) {
|
|
49
|
+
const row = context.db
|
|
50
|
+
.select()
|
|
51
|
+
.from(modelProvidersTable)
|
|
52
|
+
.where(eq(modelProvidersTable.id, providerId))
|
|
53
|
+
.get();
|
|
54
|
+
if (!row)
|
|
55
|
+
return null;
|
|
56
|
+
let apiKey;
|
|
57
|
+
if (row.apiKeyEncrypted) {
|
|
58
|
+
apiKey = await decryptText(row.apiKeyEncrypted);
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
id: row.id,
|
|
62
|
+
type: row.type,
|
|
63
|
+
baseUrl: row.baseUrl || undefined,
|
|
64
|
+
apiKey,
|
|
65
|
+
createdAt: row.createdAt,
|
|
66
|
+
updatedAt: row.updatedAt,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 新增或更新 provider。
|
|
71
|
+
*/
|
|
72
|
+
export async function upsertStoredProvider(context, input) {
|
|
73
|
+
const id = String(input.id || "").trim();
|
|
74
|
+
if (!id)
|
|
75
|
+
throw new Error("providerId cannot be empty");
|
|
76
|
+
const existing = context.db
|
|
77
|
+
.select()
|
|
78
|
+
.from(modelProvidersTable)
|
|
79
|
+
.where(eq(modelProvidersTable.id, id))
|
|
80
|
+
.get();
|
|
81
|
+
const createdAt = existing?.createdAt || nowIso();
|
|
82
|
+
const updatedAt = nowIso();
|
|
83
|
+
const hasApiKeyField = Object.prototype.hasOwnProperty.call(input, "apiKey");
|
|
84
|
+
let apiKeyEncrypted = existing?.apiKeyEncrypted || null;
|
|
85
|
+
if (hasApiKeyField) {
|
|
86
|
+
if (typeof input.apiKey === "string" && input.apiKey.length > 0) {
|
|
87
|
+
apiKeyEncrypted = await encryptText(input.apiKey);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
apiKeyEncrypted = null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
context.db
|
|
94
|
+
.insert(modelProvidersTable)
|
|
95
|
+
.values({
|
|
96
|
+
id,
|
|
97
|
+
type: input.type,
|
|
98
|
+
baseUrl: input.baseUrl || null,
|
|
99
|
+
apiKeyEncrypted,
|
|
100
|
+
createdAt,
|
|
101
|
+
updatedAt,
|
|
102
|
+
})
|
|
103
|
+
.onConflictDoUpdate({
|
|
104
|
+
target: modelProvidersTable.id,
|
|
105
|
+
set: {
|
|
106
|
+
type: input.type,
|
|
107
|
+
baseUrl: input.baseUrl || null,
|
|
108
|
+
apiKeyEncrypted,
|
|
109
|
+
updatedAt,
|
|
110
|
+
},
|
|
111
|
+
})
|
|
112
|
+
.run();
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* 删除 provider。
|
|
116
|
+
*/
|
|
117
|
+
export function removeStoredProvider(context, providerId) {
|
|
118
|
+
const refs = context.db
|
|
119
|
+
.select()
|
|
120
|
+
.from(modelsTable)
|
|
121
|
+
.where(eq(modelsTable.providerId, providerId))
|
|
122
|
+
.all();
|
|
123
|
+
if (refs.length > 0) {
|
|
124
|
+
throw new Error(`Provider "${providerId}" is referenced by models: ${refs.map((item) => item.id).join(", ")}`);
|
|
125
|
+
}
|
|
126
|
+
context.db
|
|
127
|
+
.delete(modelProvidersTable)
|
|
128
|
+
.where(eq(modelProvidersTable.id, providerId))
|
|
129
|
+
.run();
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 列出 models。
|
|
133
|
+
*/
|
|
134
|
+
export function listStoredModels(context) {
|
|
135
|
+
const rows = context.db.select().from(modelsTable).all();
|
|
136
|
+
return rows.map((row) => ({
|
|
137
|
+
id: row.id,
|
|
138
|
+
providerId: row.providerId,
|
|
139
|
+
name: row.name,
|
|
140
|
+
temperature: row.temperature ?? undefined,
|
|
141
|
+
maxTokens: row.maxTokens ?? undefined,
|
|
142
|
+
topP: row.topP ?? undefined,
|
|
143
|
+
frequencyPenalty: row.frequencyPenalty ?? undefined,
|
|
144
|
+
presencePenalty: row.presencePenalty ?? undefined,
|
|
145
|
+
anthropicVersion: row.anthropicVersion ?? undefined,
|
|
146
|
+
isPaused: Number(row.isPaused || 0) === 1,
|
|
147
|
+
createdAt: row.createdAt,
|
|
148
|
+
updatedAt: row.updatedAt,
|
|
149
|
+
}));
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* 获取单个 model。
|
|
153
|
+
*/
|
|
154
|
+
export function getStoredModel(context, modelId) {
|
|
155
|
+
const row = context.db
|
|
156
|
+
.select()
|
|
157
|
+
.from(modelsTable)
|
|
158
|
+
.where(eq(modelsTable.id, modelId))
|
|
159
|
+
.get();
|
|
160
|
+
if (!row)
|
|
161
|
+
return null;
|
|
162
|
+
return {
|
|
163
|
+
id: row.id,
|
|
164
|
+
providerId: row.providerId,
|
|
165
|
+
name: row.name,
|
|
166
|
+
temperature: row.temperature ?? undefined,
|
|
167
|
+
maxTokens: row.maxTokens ?? undefined,
|
|
168
|
+
topP: row.topP ?? undefined,
|
|
169
|
+
frequencyPenalty: row.frequencyPenalty ?? undefined,
|
|
170
|
+
presencePenalty: row.presencePenalty ?? undefined,
|
|
171
|
+
anthropicVersion: row.anthropicVersion ?? undefined,
|
|
172
|
+
isPaused: Number(row.isPaused || 0) === 1,
|
|
173
|
+
createdAt: row.createdAt,
|
|
174
|
+
updatedAt: row.updatedAt,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* 新增或更新 model。
|
|
179
|
+
*/
|
|
180
|
+
export function upsertStoredModel(context, input) {
|
|
181
|
+
const id = String(input.id || "").trim();
|
|
182
|
+
if (!id)
|
|
183
|
+
throw new Error("modelId cannot be empty");
|
|
184
|
+
const providerId = String(input.providerId || "").trim();
|
|
185
|
+
if (!providerId)
|
|
186
|
+
throw new Error("providerId cannot be empty");
|
|
187
|
+
const provider = context.db
|
|
188
|
+
.select()
|
|
189
|
+
.from(modelProvidersTable)
|
|
190
|
+
.where(eq(modelProvidersTable.id, providerId))
|
|
191
|
+
.get();
|
|
192
|
+
if (!provider)
|
|
193
|
+
throw new Error(`Provider not found: ${providerId}`);
|
|
194
|
+
const existing = context.db
|
|
195
|
+
.select()
|
|
196
|
+
.from(modelsTable)
|
|
197
|
+
.where(eq(modelsTable.id, id))
|
|
198
|
+
.get();
|
|
199
|
+
const createdAt = existing?.createdAt || nowIso();
|
|
200
|
+
const updatedAt = nowIso();
|
|
201
|
+
context.db
|
|
202
|
+
.insert(modelsTable)
|
|
203
|
+
.values({
|
|
204
|
+
id,
|
|
205
|
+
providerId,
|
|
206
|
+
name: input.name,
|
|
207
|
+
temperature: input.temperature ?? null,
|
|
208
|
+
maxTokens: input.maxTokens ?? null,
|
|
209
|
+
topP: input.topP ?? null,
|
|
210
|
+
frequencyPenalty: input.frequencyPenalty ?? null,
|
|
211
|
+
presencePenalty: input.presencePenalty ?? null,
|
|
212
|
+
anthropicVersion: input.anthropicVersion ?? null,
|
|
213
|
+
isPaused: input.isPaused === true ? 1 : 0,
|
|
214
|
+
createdAt,
|
|
215
|
+
updatedAt,
|
|
216
|
+
})
|
|
217
|
+
.onConflictDoUpdate({
|
|
218
|
+
target: modelsTable.id,
|
|
219
|
+
set: {
|
|
220
|
+
providerId,
|
|
221
|
+
name: input.name,
|
|
222
|
+
temperature: input.temperature ?? null,
|
|
223
|
+
maxTokens: input.maxTokens ?? null,
|
|
224
|
+
topP: input.topP ?? null,
|
|
225
|
+
frequencyPenalty: input.frequencyPenalty ?? null,
|
|
226
|
+
presencePenalty: input.presencePenalty ?? null,
|
|
227
|
+
anthropicVersion: input.anthropicVersion ?? null,
|
|
228
|
+
isPaused: input.isPaused === true ? 1 : 0,
|
|
229
|
+
updatedAt,
|
|
230
|
+
},
|
|
231
|
+
})
|
|
232
|
+
.run();
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* 切换 model 暂停状态。
|
|
236
|
+
*/
|
|
237
|
+
export function setStoredModelPaused(context, modelId, paused) {
|
|
238
|
+
const id = String(modelId || "").trim();
|
|
239
|
+
if (!id)
|
|
240
|
+
throw new Error("modelId cannot be empty");
|
|
241
|
+
const current = getStoredModel(context, id);
|
|
242
|
+
if (!current)
|
|
243
|
+
throw new Error(`Model not found: ${id}`);
|
|
244
|
+
context.db
|
|
245
|
+
.update(modelsTable)
|
|
246
|
+
.set({
|
|
247
|
+
isPaused: paused ? 1 : 0,
|
|
248
|
+
updatedAt: nowIso(),
|
|
249
|
+
})
|
|
250
|
+
.where(eq(modelsTable.id, id))
|
|
251
|
+
.run();
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* 删除 model。
|
|
255
|
+
*/
|
|
256
|
+
export function removeStoredModel(context, modelId) {
|
|
257
|
+
context.db.delete(modelsTable).where(eq(modelsTable.id, modelId)).run();
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* 获取“model + provider”聚合信息。
|
|
261
|
+
*/
|
|
262
|
+
export async function getResolvedStoredModel(context, modelId) {
|
|
263
|
+
const model = getStoredModel(context, modelId);
|
|
264
|
+
if (!model)
|
|
265
|
+
return null;
|
|
266
|
+
const provider = await getStoredProvider(context, model.providerId);
|
|
267
|
+
if (!provider)
|
|
268
|
+
return null;
|
|
269
|
+
return { model, provider };
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* 清空模型相关表。
|
|
273
|
+
*/
|
|
274
|
+
export function clearStoredModelsAndProviders(context) {
|
|
275
|
+
context.sqlite.exec("DELETE FROM models;");
|
|
276
|
+
context.sqlite.exec("DELETE FROM model_providers;");
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=StoreModelRepository.js.map
|