@clappstore/connect 0.7.6 → 0.7.7
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/clapps/settings/handlers/settings-handler.js +135 -153
- package/dist/defaults.d.ts +1 -1
- package/dist/defaults.d.ts.map +1 -1
- package/dist/defaults.js +12 -20
- package/dist/defaults.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,8 +2,57 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
|
2
2
|
import { spawnSync } from "node:child_process";
|
|
3
3
|
import { dirname, resolve } from "node:path";
|
|
4
4
|
import { homedir } from "node:os";
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
// --- CLI helpers ---
|
|
6
|
+
function runCli(args) {
|
|
7
|
+
try {
|
|
8
|
+
const result = spawnSync("openclaw", args, {
|
|
9
|
+
encoding: "utf-8",
|
|
10
|
+
timeout: 15_000,
|
|
11
|
+
});
|
|
12
|
+
if (result.status !== 0)
|
|
13
|
+
return null;
|
|
14
|
+
return JSON.parse(result.stdout);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
let _modelsStatusCache = null;
|
|
21
|
+
function getModelsStatus() {
|
|
22
|
+
const now = Date.now();
|
|
23
|
+
if (_modelsStatusCache && now - _modelsStatusCache.ts < 5_000) {
|
|
24
|
+
return _modelsStatusCache.data;
|
|
25
|
+
}
|
|
26
|
+
const result = runCli(["models", "status", "--json"]);
|
|
27
|
+
if (result && typeof result === "object") {
|
|
28
|
+
_modelsStatusCache = { data: result, ts: now };
|
|
29
|
+
return _modelsStatusCache.data;
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
let _modelCatalogCache = null;
|
|
34
|
+
function getModelCatalog() {
|
|
35
|
+
const now = Date.now();
|
|
36
|
+
if (_modelCatalogCache && now - _modelCatalogCache.ts < 30_000) {
|
|
37
|
+
return _modelCatalogCache.data;
|
|
38
|
+
}
|
|
39
|
+
const result = runCli(["models", "list", "--json"]);
|
|
40
|
+
if (Array.isArray(result)) {
|
|
41
|
+
_modelCatalogCache = { data: result, ts: now };
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
function getAuthStorePath() {
|
|
47
|
+
const status = getModelsStatus();
|
|
48
|
+
const auth = status?.auth;
|
|
49
|
+
if (typeof auth?.storePath === "string" && auth.storePath.length > 0) {
|
|
50
|
+
return auth.storePath;
|
|
51
|
+
}
|
|
52
|
+
// Fallback to default path
|
|
53
|
+
return resolve(homedir(), ".openclaw", "agents", "main", "agent", "auth-profiles.json");
|
|
54
|
+
}
|
|
55
|
+
// --- Helper functions ---
|
|
7
56
|
function generateProfileId(provider, customName) {
|
|
8
57
|
const suffix = customName
|
|
9
58
|
? customName.toLowerCase().replace(/[^a-z0-9]/g, "-").replace(/-+/g, "-")
|
|
@@ -28,12 +77,6 @@ function formatProviderName(provider) {
|
|
|
28
77
|
};
|
|
29
78
|
return names[provider] ?? provider.charAt(0).toUpperCase() + provider.slice(1);
|
|
30
79
|
}
|
|
31
|
-
function formatModelLabel(modelId, meta) {
|
|
32
|
-
const alias = typeof meta?.alias === "string" ? meta.alias : "";
|
|
33
|
-
const [, ...rest] = modelId.split("/");
|
|
34
|
-
const shortId = rest.join("/") || modelId;
|
|
35
|
-
return alias ? `${alias} (${shortId})` : shortId;
|
|
36
|
-
}
|
|
37
80
|
function formatModelLabelFromId(modelId) {
|
|
38
81
|
if (!modelId)
|
|
39
82
|
return "Unknown";
|
|
@@ -86,48 +129,33 @@ function detectAuthType(profileId, profile) {
|
|
|
86
129
|
return "api-key";
|
|
87
130
|
}
|
|
88
131
|
function getActiveModel() {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
return null;
|
|
93
|
-
const config = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
94
|
-
const primary = config?.agents?.defaults?.model?.primary;
|
|
95
|
-
if (typeof primary === "string" && primary.includes("/")) {
|
|
96
|
-
const [provider, ...rest] = primary.split("/");
|
|
97
|
-
return { provider, model: rest.join("/") };
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
catch {
|
|
101
|
-
// Ignore
|
|
132
|
+
const status = getModelsStatus();
|
|
133
|
+
if (typeof status?.defaultModel === "string") {
|
|
134
|
+
return status.defaultModel;
|
|
102
135
|
}
|
|
103
136
|
return null;
|
|
104
137
|
}
|
|
105
138
|
function getModelCatalogByProvider() {
|
|
106
139
|
const map = new Map();
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
const
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
map.set(provider, existing);
|
|
123
|
-
}
|
|
124
|
-
for (const [provider, entries] of map) {
|
|
125
|
-
entries.sort((a, b) => a.label.localeCompare(b.label));
|
|
126
|
-
map.set(provider, entries);
|
|
127
|
-
}
|
|
140
|
+
const catalog = getModelCatalog();
|
|
141
|
+
if (!catalog)
|
|
142
|
+
return map;
|
|
143
|
+
for (const entry of catalog) {
|
|
144
|
+
const m = entry;
|
|
145
|
+
const key = m.key;
|
|
146
|
+
if (typeof key !== "string" || !key.includes("/"))
|
|
147
|
+
continue;
|
|
148
|
+
const [provider] = key.split("/");
|
|
149
|
+
if (!provider)
|
|
150
|
+
continue;
|
|
151
|
+
const name = typeof m.name === "string" ? m.name : key.split("/").slice(1).join("/");
|
|
152
|
+
const existing = map.get(provider) ?? [];
|
|
153
|
+
existing.push({ id: key, label: name });
|
|
154
|
+
map.set(provider, existing);
|
|
128
155
|
}
|
|
129
|
-
|
|
130
|
-
|
|
156
|
+
for (const [provider, entries] of map) {
|
|
157
|
+
entries.sort((a, b) => a.label.localeCompare(b.label));
|
|
158
|
+
map.set(provider, entries);
|
|
131
159
|
}
|
|
132
160
|
return map;
|
|
133
161
|
}
|
|
@@ -146,12 +174,13 @@ function getFirstModelForProvider(provider) {
|
|
|
146
174
|
}
|
|
147
175
|
function getConfiguredProviders() {
|
|
148
176
|
const providers = [];
|
|
149
|
-
const
|
|
177
|
+
const activeModelId = getActiveModel();
|
|
150
178
|
const modelsByProvider = getModelCatalogByProvider();
|
|
179
|
+
const authPath = getAuthStorePath();
|
|
151
180
|
try {
|
|
152
|
-
if (!existsSync(
|
|
181
|
+
if (!existsSync(authPath))
|
|
153
182
|
return providers;
|
|
154
|
-
const data = JSON.parse(readFileSync(
|
|
183
|
+
const data = JSON.parse(readFileSync(authPath, "utf-8"));
|
|
155
184
|
for (const [profileId, profile] of Object.entries(data.profiles)) {
|
|
156
185
|
let maskedCred = "";
|
|
157
186
|
let mode = profile.type;
|
|
@@ -172,7 +201,8 @@ function getConfiguredProviders() {
|
|
|
172
201
|
authType = "subscription";
|
|
173
202
|
}
|
|
174
203
|
if (maskedCred) {
|
|
175
|
-
const
|
|
204
|
+
const activeProvider = activeModelId?.split("/")[0];
|
|
205
|
+
const isActive = activeProvider === profile.provider;
|
|
176
206
|
const profileIdentifier = profileId.includes(":") ? profileId.split(":")[1] : profileId;
|
|
177
207
|
const baseName = formatProviderName(profile.provider);
|
|
178
208
|
const displayName = profile.customName || `${baseName} · ${profileIdentifier}`;
|
|
@@ -201,26 +231,22 @@ function getConfiguredProviders() {
|
|
|
201
231
|
}
|
|
202
232
|
return providers;
|
|
203
233
|
}
|
|
204
|
-
function
|
|
234
|
+
function readAuthProfiles() {
|
|
235
|
+
const authPath = getAuthStorePath();
|
|
205
236
|
try {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
if (existsSync(configPath)) {
|
|
209
|
-
config = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
210
|
-
}
|
|
211
|
-
if (!config.env || typeof config.env !== "object") {
|
|
212
|
-
config.env = {};
|
|
237
|
+
if (existsSync(authPath)) {
|
|
238
|
+
return JSON.parse(readFileSync(authPath, "utf-8"));
|
|
213
239
|
}
|
|
214
|
-
config.env[key] = value;
|
|
215
|
-
if (config.meta && typeof config.meta === "object") {
|
|
216
|
-
config.meta.lastTouchedAt = new Date().toISOString();
|
|
217
|
-
}
|
|
218
|
-
writeFileSync(configPath, JSON.stringify(config, null, 2), "utf-8");
|
|
219
|
-
console.log(`[settings] Set ${key} in openclaw.json`);
|
|
220
240
|
}
|
|
221
|
-
catch
|
|
222
|
-
|
|
241
|
+
catch {
|
|
242
|
+
// Start fresh
|
|
223
243
|
}
|
|
244
|
+
return { version: 1, profiles: {} };
|
|
245
|
+
}
|
|
246
|
+
function writeAuthProfiles(profiles) {
|
|
247
|
+
const authPath = getAuthStorePath();
|
|
248
|
+
mkdirSync(dirname(authPath), { recursive: true });
|
|
249
|
+
writeFileSync(authPath, JSON.stringify(profiles, null, 2), "utf-8");
|
|
224
250
|
}
|
|
225
251
|
function getSessionsData() {
|
|
226
252
|
try {
|
|
@@ -235,10 +261,7 @@ function getSessionsData() {
|
|
|
235
261
|
catch {
|
|
236
262
|
return { sessions: [], globalModel: null };
|
|
237
263
|
}
|
|
238
|
-
const
|
|
239
|
-
const globalModelId = globalDefault
|
|
240
|
-
? `${globalDefault.provider}/${globalDefault.model}`
|
|
241
|
-
: null;
|
|
264
|
+
const globalModelId = getActiveModel();
|
|
242
265
|
const sessions = rawSessions
|
|
243
266
|
.filter((s) => s.kind === "direct")
|
|
244
267
|
.map((s) => {
|
|
@@ -273,7 +296,7 @@ export default function createSettingsHandler(ctx) {
|
|
|
273
296
|
function writeSettingsState() {
|
|
274
297
|
const providers = getConfiguredProviders();
|
|
275
298
|
const isConfigured = providers.length > 0;
|
|
276
|
-
const
|
|
299
|
+
const activeModelId = getActiveModel();
|
|
277
300
|
const activeProvider = providers.find((p) => p.active);
|
|
278
301
|
const sessionsData = getSessionsData();
|
|
279
302
|
const state = {
|
|
@@ -283,7 +306,7 @@ export default function createSettingsHandler(ctx) {
|
|
|
283
306
|
active: {
|
|
284
307
|
isConfigured,
|
|
285
308
|
provider: activeProvider?.name ?? null,
|
|
286
|
-
model:
|
|
309
|
+
model: activeModelId,
|
|
287
310
|
},
|
|
288
311
|
configuredProviders: providers,
|
|
289
312
|
sessions: sessionsData,
|
|
@@ -305,6 +328,8 @@ export default function createSettingsHandler(ctx) {
|
|
|
305
328
|
}
|
|
306
329
|
}
|
|
307
330
|
function afterCredentialChange() {
|
|
331
|
+
// Invalidate caches so next read picks up changes
|
|
332
|
+
_modelsStatusCache = null;
|
|
308
333
|
writeSettingsState();
|
|
309
334
|
pushSettingsState();
|
|
310
335
|
ctx.checkAuthStatus();
|
|
@@ -396,10 +421,7 @@ export default function createSettingsHandler(ctx) {
|
|
|
396
421
|
console.warn(`[settings] Failed to parse sessions list`);
|
|
397
422
|
return;
|
|
398
423
|
}
|
|
399
|
-
const
|
|
400
|
-
const globalModelId = globalDefault
|
|
401
|
-
? `${globalDefault.provider}/${globalDefault.model}`
|
|
402
|
-
: null;
|
|
424
|
+
const globalModelId = getActiveModel();
|
|
403
425
|
const sessions = rawSessions
|
|
404
426
|
.filter((s) => s.kind === "direct")
|
|
405
427
|
.map((s) => {
|
|
@@ -438,15 +460,7 @@ export default function createSettingsHandler(ctx) {
|
|
|
438
460
|
}
|
|
439
461
|
// --- Credential setters ---
|
|
440
462
|
function setAnthropicKey(apiKey, customName, existingProfileId) {
|
|
441
|
-
|
|
442
|
-
try {
|
|
443
|
-
if (existsSync(authProfilesPath)) {
|
|
444
|
-
profiles = JSON.parse(readFileSync(authProfilesPath, "utf-8"));
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
catch {
|
|
448
|
-
// Start fresh
|
|
449
|
-
}
|
|
463
|
+
const profiles = readAuthProfiles();
|
|
450
464
|
const profileId = existingProfileId ?? generateProfileId("anthropic", customName);
|
|
451
465
|
profiles.profiles[profileId] = {
|
|
452
466
|
type: "token",
|
|
@@ -454,48 +468,25 @@ export default function createSettingsHandler(ctx) {
|
|
|
454
468
|
token: apiKey,
|
|
455
469
|
customName: customName || "Anthropic API",
|
|
456
470
|
};
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
console.log(`✅ Anthropic API key saved to ${authProfilesPath} (profile: ${profileId})`);
|
|
471
|
+
writeAuthProfiles(profiles);
|
|
472
|
+
console.log(`[settings] Anthropic API key saved (profile: ${profileId})`);
|
|
460
473
|
afterCredentialChange();
|
|
461
474
|
}
|
|
462
475
|
function setClaudeToken(token, customName) {
|
|
463
|
-
const
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
for (const [_key, profile] of Object.entries(profiles.profiles)) {
|
|
474
|
-
if (profile.provider === "anthropic" && (profile.access || profile.refresh)) {
|
|
475
|
-
profile.customName = customName;
|
|
476
|
-
break;
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
writeFileSync(authProfilesPath, JSON.stringify(profiles, null, 2), "utf-8");
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
catch {
|
|
483
|
-
// Ignore
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
console.log("✅ Claude subscription token saved via openclaw");
|
|
476
|
+
const profiles = readAuthProfiles();
|
|
477
|
+
const profileId = generateProfileId("anthropic", customName || "claude-sub");
|
|
478
|
+
profiles.profiles[profileId] = {
|
|
479
|
+
type: "token",
|
|
480
|
+
provider: "anthropic",
|
|
481
|
+
token,
|
|
482
|
+
customName: customName || "Claude Subscription",
|
|
483
|
+
};
|
|
484
|
+
writeAuthProfiles(profiles);
|
|
485
|
+
console.log(`[settings] Claude subscription token saved (profile: ${profileId})`);
|
|
487
486
|
afterCredentialChange();
|
|
488
487
|
}
|
|
489
488
|
function setOpenAIKey(apiKey, customName, existingProfileId) {
|
|
490
|
-
|
|
491
|
-
try {
|
|
492
|
-
if (existsSync(authProfilesPath)) {
|
|
493
|
-
profiles = JSON.parse(readFileSync(authProfilesPath, "utf-8"));
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
catch {
|
|
497
|
-
// Start fresh
|
|
498
|
-
}
|
|
489
|
+
const profiles = readAuthProfiles();
|
|
499
490
|
const profileId = existingProfileId ?? generateProfileId("openai", customName);
|
|
500
491
|
profiles.profiles[profileId] = {
|
|
501
492
|
type: "token",
|
|
@@ -503,22 +494,12 @@ export default function createSettingsHandler(ctx) {
|
|
|
503
494
|
token: apiKey,
|
|
504
495
|
customName: customName || "OpenAI API",
|
|
505
496
|
};
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
writeFileSync(authProfilesPath, JSON.stringify(profiles, null, 2), "utf-8");
|
|
509
|
-
console.log(`✅ OpenAI API key saved to ${authProfilesPath} (profile: ${profileId})`);
|
|
497
|
+
writeAuthProfiles(profiles);
|
|
498
|
+
console.log(`[settings] OpenAI API key saved (profile: ${profileId})`);
|
|
510
499
|
afterCredentialChange();
|
|
511
500
|
}
|
|
512
501
|
function setKimiCodingKey(apiKey, customName, existingProfileId) {
|
|
513
|
-
|
|
514
|
-
try {
|
|
515
|
-
if (existsSync(authProfilesPath)) {
|
|
516
|
-
profiles = JSON.parse(readFileSync(authProfilesPath, "utf-8"));
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
catch {
|
|
520
|
-
// Start fresh
|
|
521
|
-
}
|
|
502
|
+
const profiles = readAuthProfiles();
|
|
522
503
|
const profileId = existingProfileId ?? generateProfileId("kimi-coding", customName);
|
|
523
504
|
profiles.profiles[profileId] = {
|
|
524
505
|
type: "token",
|
|
@@ -526,10 +507,8 @@ export default function createSettingsHandler(ctx) {
|
|
|
526
507
|
token: apiKey,
|
|
527
508
|
customName: customName || "Kimi Coding",
|
|
528
509
|
};
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
writeFileSync(authProfilesPath, JSON.stringify(profiles, null, 2), "utf-8");
|
|
532
|
-
console.log(`✅ Kimi Coding API key saved to ${authProfilesPath} (profile: ${profileId})`);
|
|
510
|
+
writeAuthProfiles(profiles);
|
|
511
|
+
console.log(`[settings] Kimi Coding API key saved (profile: ${profileId})`);
|
|
533
512
|
afterCredentialChange();
|
|
534
513
|
}
|
|
535
514
|
function startOAuth(provider, customName) {
|
|
@@ -540,38 +519,40 @@ export default function createSettingsHandler(ctx) {
|
|
|
540
519
|
}
|
|
541
520
|
if (customName) {
|
|
542
521
|
try {
|
|
543
|
-
|
|
544
|
-
|
|
522
|
+
const authPath = getAuthStorePath();
|
|
523
|
+
if (existsSync(authPath)) {
|
|
524
|
+
const profiles = JSON.parse(readFileSync(authPath, "utf-8"));
|
|
545
525
|
for (const [_key, profile] of Object.entries(profiles.profiles)) {
|
|
546
526
|
if (profile.provider === provider && (profile.access || profile.refresh)) {
|
|
547
527
|
profile.customName = customName;
|
|
548
528
|
break;
|
|
549
529
|
}
|
|
550
530
|
}
|
|
551
|
-
writeFileSync(
|
|
531
|
+
writeFileSync(authPath, JSON.stringify(profiles, null, 2), "utf-8");
|
|
552
532
|
}
|
|
553
533
|
}
|
|
554
534
|
catch {
|
|
555
535
|
// Ignore
|
|
556
536
|
}
|
|
557
537
|
}
|
|
558
|
-
console.log(
|
|
538
|
+
console.log(`[settings] OAuth login completed for ${provider}`);
|
|
559
539
|
afterCredentialChange();
|
|
560
540
|
}
|
|
561
541
|
function deleteProvider(profileId) {
|
|
562
542
|
try {
|
|
563
|
-
|
|
543
|
+
const authPath = getAuthStorePath();
|
|
544
|
+
if (!existsSync(authPath)) {
|
|
564
545
|
console.warn(`[settings] No auth-profiles.json found`);
|
|
565
546
|
return;
|
|
566
547
|
}
|
|
567
|
-
const profiles = JSON.parse(readFileSync(
|
|
548
|
+
const profiles = JSON.parse(readFileSync(authPath, "utf-8"));
|
|
568
549
|
if (!profiles.profiles[profileId]) {
|
|
569
550
|
console.warn(`[settings] Profile "${profileId}" not found`);
|
|
570
551
|
return;
|
|
571
552
|
}
|
|
572
553
|
delete profiles.profiles[profileId];
|
|
573
|
-
writeFileSync(
|
|
574
|
-
console.log(
|
|
554
|
+
writeFileSync(authPath, JSON.stringify(profiles, null, 2), "utf-8");
|
|
555
|
+
console.log(`[settings] Deleted provider profile: ${profileId}`);
|
|
575
556
|
afterCredentialChange();
|
|
576
557
|
}
|
|
577
558
|
catch (err) {
|
|
@@ -596,18 +577,18 @@ export default function createSettingsHandler(ctx) {
|
|
|
596
577
|
console.error(`[settings] Failed to set default model: ${msg}`);
|
|
597
578
|
return;
|
|
598
579
|
}
|
|
580
|
+
_modelsStatusCache = null;
|
|
599
581
|
clearAgentModelOverrides(modelId);
|
|
600
|
-
console.log(
|
|
582
|
+
console.log(`[settings] Active model set system-wide to ${modelId}`);
|
|
601
583
|
writeSettingsState();
|
|
602
584
|
pushSettingsState();
|
|
603
585
|
}
|
|
604
586
|
function resetSessionModel(sessionKey) {
|
|
605
|
-
const
|
|
606
|
-
if (!
|
|
587
|
+
const globalModelId = getActiveModel();
|
|
588
|
+
if (!globalModelId) {
|
|
607
589
|
console.warn(`[settings] No global default model configured`);
|
|
608
590
|
return;
|
|
609
591
|
}
|
|
610
|
-
const modelId = `${globalDefault.provider}/${globalDefault.model}`;
|
|
611
592
|
const result = spawnSync("openclaw", [
|
|
612
593
|
"gateway",
|
|
613
594
|
"call",
|
|
@@ -615,7 +596,7 @@ export default function createSettingsHandler(ctx) {
|
|
|
615
596
|
"--params",
|
|
616
597
|
JSON.stringify({
|
|
617
598
|
sessionKey,
|
|
618
|
-
message: `/model ${
|
|
599
|
+
message: `/model ${globalModelId}`,
|
|
619
600
|
idempotencyKey: `clapps-reset-${sessionKey}-${Date.now()}`,
|
|
620
601
|
}),
|
|
621
602
|
], { encoding: "utf-8", timeout: 10_000 });
|
|
@@ -628,16 +609,17 @@ export default function createSettingsHandler(ctx) {
|
|
|
628
609
|
setTimeout(() => listSessions(), 1000);
|
|
629
610
|
}
|
|
630
611
|
function applyDefaultToAllSessions() {
|
|
631
|
-
const
|
|
632
|
-
if (!
|
|
612
|
+
const globalModelId = getActiveModel();
|
|
613
|
+
if (!globalModelId) {
|
|
633
614
|
console.warn(`[settings] No global default model configured`);
|
|
634
615
|
return;
|
|
635
616
|
}
|
|
636
|
-
|
|
637
|
-
patchAllSessionModels(modelId);
|
|
617
|
+
patchAllSessionModels(globalModelId);
|
|
638
618
|
setTimeout(() => listSessions(), 2000);
|
|
639
619
|
}
|
|
640
620
|
function refreshSettingsState() {
|
|
621
|
+
_modelsStatusCache = null;
|
|
622
|
+
_modelCatalogCache = null;
|
|
641
623
|
writeSettingsState();
|
|
642
624
|
pushSettingsState();
|
|
643
625
|
listSessions();
|
package/dist/defaults.d.ts
CHANGED
|
@@ -7,5 +7,5 @@ export declare function installDefaultClapps(): void;
|
|
|
7
7
|
/** Seed default views and apps registry */
|
|
8
8
|
export declare function seedDefaults(viewsDir: string, stateDir: string): void;
|
|
9
9
|
/** Check if the agent has an AI provider configured and write _status.json */
|
|
10
|
-
export declare function checkAuthStatus(stateDir: string
|
|
10
|
+
export declare function checkAuthStatus(stateDir: string): void;
|
|
11
11
|
//# sourceMappingURL=defaults.d.ts.map
|
package/dist/defaults.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAuJA,sCAAsC;AACtC,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,8DAA8D;AAC9D,wBAAgB,mBAAmB,IAAI,MAAM,CAG5C;AA6BD,8DAA8D;AAC9D,wBAAgB,oBAAoB,IAAI,IAAI,CAwB3C;AAED,2CAA2C;AAC3C,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CA2CrE;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAsCtD"}
|
package/dist/defaults.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { existsSync, readFileSync, writeFileSync, mkdirSync, cpSync } from "node:fs";
|
|
2
|
+
import { spawnSync } from "node:child_process";
|
|
2
3
|
import { resolve, dirname } from "node:path";
|
|
3
4
|
import { homedir } from "node:os";
|
|
4
5
|
import { fileURLToPath } from "node:url";
|
|
@@ -222,35 +223,26 @@ export function seedDefaults(viewsDir, stateDir) {
|
|
|
222
223
|
}
|
|
223
224
|
}
|
|
224
225
|
/** Check if the agent has an AI provider configured and write _status.json */
|
|
225
|
-
export function checkAuthStatus(stateDir
|
|
226
|
-
const defaultAuthProfilesPath = resolve(homedir(), ".openclaw", "agents", "main", "agent", "auth-profiles.json");
|
|
227
|
-
const targetPath = authProfilesPath ?? defaultAuthProfilesPath;
|
|
226
|
+
export function checkAuthStatus(stateDir) {
|
|
228
227
|
let setupRequired = true;
|
|
229
228
|
let message = "Your agent needs an AI provider key to respond to messages. Run:\n" +
|
|
230
229
|
"`openclaw models auth` to configure authentication.";
|
|
231
230
|
try {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
const
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
return ((typeof p.token === "string" && p.token.length > 0) ||
|
|
241
|
-
(typeof p.key === "string" && p.key.length > 0) ||
|
|
242
|
-
(typeof p.access === "string" && p.access.length > 0));
|
|
243
|
-
}
|
|
244
|
-
return false;
|
|
245
|
-
});
|
|
246
|
-
if (hasCredentials) {
|
|
231
|
+
const result = spawnSync("openclaw", ["models", "status", "--json"], {
|
|
232
|
+
encoding: "utf-8",
|
|
233
|
+
timeout: 10_000,
|
|
234
|
+
});
|
|
235
|
+
if (result.status === 0) {
|
|
236
|
+
const status = JSON.parse(result.stdout);
|
|
237
|
+
const hasProviders = (status.auth?.providers ?? []).some((p) => p.profiles > 0);
|
|
238
|
+
if (hasProviders) {
|
|
247
239
|
setupRequired = false;
|
|
248
240
|
message = "";
|
|
249
241
|
}
|
|
250
242
|
}
|
|
251
243
|
}
|
|
252
244
|
catch {
|
|
253
|
-
// If
|
|
245
|
+
// If CLI unavailable, assume setup is required
|
|
254
246
|
}
|
|
255
247
|
const statusPath = resolve(stateDir, "_status.json");
|
|
256
248
|
writeFileSync(statusPath, JSON.stringify({
|
|
@@ -259,7 +251,7 @@ export function checkAuthStatus(stateDir, authProfilesPath) {
|
|
|
259
251
|
state: { setupRequired, message },
|
|
260
252
|
}, null, 2), "utf-8");
|
|
261
253
|
if (setupRequired) {
|
|
262
|
-
console.warn("
|
|
254
|
+
console.warn("No AI provider configured — _status.json written with setupRequired: true");
|
|
263
255
|
}
|
|
264
256
|
}
|
|
265
257
|
//# sourceMappingURL=defaults.js.map
|
package/dist/defaults.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAUzC,gEAAgE;AAEhE,MAAM,mBAAmB,GAAG;;;;;;;;;;;;CAY3B,CAAC;AAEF,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBzB,CAAC;AAEF,MAAM,uBAAuB,GAAG;;;;;;;;;;;;CAY/B,CAAC;AAEF,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmC7B,CAAC;AAEF,MAAM,mBAAmB,GAAe;IACtC;QACE,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,qBAAqB;QAClC,MAAM,EAAE,IAAI;KACb;IACD;QACE,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,sBAAsB;QACnC,MAAM,EAAE,IAAI;KACb;CACF,CAAC;AAUF,MAAM,cAAc,GAAe;IACjC;QACE,EAAE,EAAE,MAAM;QACV,OAAO,EAAE,aAAa;QACtB,QAAQ,EAAE,sBAAsB;QAChC,KAAK,EAAE,mBAAmB;QAC1B,MAAM,EAAE,iBAAiB;KAC1B;IACD;QACE,EAAE,EAAE,UAAU;QACd,OAAO,EAAE,iBAAiB;QAC1B,QAAQ,EAAE,0BAA0B;QACpC,KAAK,EAAE,uBAAuB;QAC9B,MAAM,EAAE,qBAAqB;KAC9B;CACF,CAAC;AAEF,wBAAwB;AAExB,sCAAsC;AACtC,MAAM,UAAU,gBAAgB;IAC9B,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,mBAAmB;IACjC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,OAAO,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED,yFAAyF;AACzF,SAAS,QAAQ,CACf,OAAe,EACf,QAAgB,EAChB,QAAgB;IAEhB,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACzE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,mBAAmB,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC/E,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,oBAAoB;IAClC,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,CAAC;IAE/C,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACtD,MAAM,eAAe,GAAG,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAE5D,sCAAsC;QACtC,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,SAAS;QACX,CAAC;QAED,iCAAiC;QACjC,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7C,MAAM,CAAC,eAAe,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC3D,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,EAAE,OAAO,YAAY,EAAE,CAAC,CAAC;YACpE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,+BAA+B,KAAK,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,QAAgB;IAC7D,yCAAyC;IACzC,oBAAoB,EAAE,CAAC;IAEvB,wCAAwC;IACxC,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAEhG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,aAAa,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,mBAAmB,WAAW,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACxF,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,WAAW,KAAK,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACpF,aAAa,CAAC,YAAY,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,qCAAqC,QAAQ,EAAE,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,QAAQ,GAAe,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;YACzE,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,KAAK,MAAM,KAAK,IAAI,mBAAmB,EAAE,CAAC;gBACxC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;oBACjD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACrB,OAAO,GAAG,IAAI,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,EAAE,gCAAgC,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;YACD,IAAI,OAAO,EAAE,CAAC;gBACZ,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,uBAAuB,QAAQ,wBAAwB,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,IAAI,aAAa,GAAG,IAAI,CAAC;IACzB,IAAI,OAAO,GACT,oEAAoE;QACpE,qDAAqD,CAAC;IAExD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE;YACnE,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACzC,MAAM,YAAY,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,CACtD,CAAC,CAAuB,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAC5C,CAAC;YACF,IAAI,YAAY,EAAE,CAAC;gBACjB,aAAa,GAAG,KAAK,CAAC;gBACtB,OAAO,GAAG,EAAE,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+CAA+C;IACjD,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACrD,aAAa,CACX,UAAU,EACV,IAAI,CAAC,SAAS,CAAC;QACb,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;QACnB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,KAAK,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE;KAClC,EAAE,IAAI,EAAE,CAAC,CAAC,EACX,OAAO,CACR,CAAC;IACF,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC"}
|