@cloudcli-ai/cloudcli 1.37.0 → 1.37.1
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/dist/assets/index-D3jfzuKN.css +32 -0
- package/dist/assets/{index-eGqPeIEu.js → index-DTMWjJj8.js} +324 -305
- package/dist/index.html +2 -2
- package/dist-server/server/modules/commands/commands.routes.js +3 -3
- package/dist-server/server/modules/commands/commands.routes.js.map +1 -1
- package/dist-server/server/modules/commands/tests/commands.test.js +2 -7
- package/dist-server/server/modules/commands/tests/commands.test.js.map +1 -1
- package/dist-server/server/modules/database/index.js +2 -0
- package/dist-server/server/modules/database/index.js.map +1 -1
- package/dist-server/server/modules/database/migrations.js +18 -1
- package/dist-server/server/modules/database/migrations.js.map +1 -1
- package/dist-server/server/modules/database/repositories/provider-models.js +112 -0
- package/dist-server/server/modules/database/repositories/provider-models.js.map +1 -0
- package/dist-server/server/modules/database/repositories/sessions.db.js +63 -7
- package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -1
- package/dist-server/server/modules/database/schema.js +28 -3
- package/dist-server/server/modules/database/schema.js.map +1 -1
- package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js +102 -0
- package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js.map +1 -0
- package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js +2 -1
- package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js.map +1 -1
- package/dist-server/server/modules/database/tests/sessions.db.integration.test.js +22 -0
- package/dist-server/server/modules/database/tests/sessions.db.integration.test.js.map +1 -1
- package/dist-server/server/modules/file-tree/file-tree.module.js +5 -1
- package/dist-server/server/modules/file-tree/file-tree.module.js.map +1 -1
- package/dist-server/server/modules/file-tree/file-tree.service.js +50 -18
- package/dist-server/server/modules/file-tree/file-tree.service.js.map +1 -1
- package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js +83 -7
- package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-models.provider.js +46 -14
- package/dist-server/server/modules/providers/list/claude/claude-models.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js +8 -15
- package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +58 -71
- package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js +1 -54
- package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +7 -7
- package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js +32 -669
- package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +105 -328
- package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js +0 -12
- package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js.map +1 -1
- package/dist-server/server/modules/providers/provider.routes.js +139 -31
- package/dist-server/server/modules/providers/provider.routes.js.map +1 -1
- package/dist-server/server/modules/providers/services/provider-models.service.js +167 -199
- package/dist-server/server/modules/providers/services/provider-models.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/provider-runtime.service.js +2 -2
- package/dist-server/server/modules/providers/services/provider-runtime.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/session-conversations-search.service.js +12 -4
- package/dist-server/server/modules/providers/services/session-conversations-search.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/sessions.service.js +62 -3
- package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -1
- package/dist-server/server/modules/providers/tests/codex-sessions.test.js +53 -17
- package/dist-server/server/modules/providers/tests/codex-sessions.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/opencode-models.test.js +15 -126
- package/dist-server/server/modules/providers/tests/opencode-models.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +5 -5
- package/dist-server/server/modules/providers/tests/opencode-sessions.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/provider-models.service.test.js +175 -292
- package/dist-server/server/modules/providers/tests/provider-models.service.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js +2 -6
- package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js +1 -0
- package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/provider.routes.test.js +126 -0
- package/dist-server/server/modules/providers/tests/provider.routes.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/sessions.service.test.js +87 -0
- package/dist-server/server/modules/providers/tests/sessions.service.test.js.map +1 -0
- package/dist-server/server/modules/websocket/services/chat-websocket.service.js +5 -1
- package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -1
- package/package.json +3 -3
- package/server/modules/commands/commands.routes.ts +3 -3
- package/server/modules/commands/tests/commands.test.ts +2 -7
- package/server/modules/database/index.ts +2 -0
- package/server/modules/database/migrations.ts +20 -0
- package/server/modules/database/repositories/provider-models.ts +168 -0
- package/server/modules/database/repositories/sessions.db.ts +85 -8
- package/server/modules/database/schema.ts +29 -3
- package/server/modules/database/tests/provider-models.db.integration.test.ts +125 -0
- package/server/modules/database/tests/sessions-provider-mapping.test.ts +2 -1
- package/server/modules/database/tests/sessions.db.integration.test.ts +32 -0
- package/server/modules/file-tree/file-tree.module.ts +5 -1
- package/server/modules/file-tree/file-tree.service.ts +68 -20
- package/server/modules/file-tree/tests/file-tree.service.test.ts +104 -7
- package/server/modules/providers/list/claude/claude-models.provider.ts +46 -14
- package/server/modules/providers/list/claude/claude-runtime.provider.js +8 -16
- package/server/modules/providers/list/codex/codex-models.provider.ts +58 -99
- package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +1 -60
- package/server/modules/providers/list/codex/codex-sessions.provider.ts +7 -7
- package/server/modules/providers/list/cursor/cursor-models.provider.ts +32 -710
- package/server/modules/providers/list/opencode/opencode-models.provider.ts +105 -413
- package/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.ts +0 -13
- package/server/modules/providers/provider.routes.ts +185 -33
- package/server/modules/providers/services/provider-models.service.ts +223 -288
- package/server/modules/providers/services/provider-runtime.service.ts +2 -3
- package/server/modules/providers/services/session-conversations-search.service.ts +12 -4
- package/server/modules/providers/services/sessions.service.ts +87 -3
- package/server/modules/providers/tests/codex-sessions.test.ts +57 -18
- package/server/modules/providers/tests/opencode-models.test.ts +34 -135
- package/server/modules/providers/tests/opencode-sessions.test.ts +5 -5
- package/server/modules/providers/tests/provider-models.service.test.ts +353 -450
- package/server/modules/providers/tests/provider-runtime.service.test.ts +2 -6
- package/server/modules/providers/tests/provider-token-usage.service.test.ts +1 -0
- package/server/modules/providers/tests/provider.routes.test.ts +183 -0
- package/server/modules/providers/tests/sessions.service.test.ts +127 -0
- package/server/modules/websocket/services/chat-websocket.service.ts +5 -1
- package/server/shared/interfaces.ts +4 -6
- package/server/shared/types.ts +29 -17
- package/dist/assets/index-DSlds633.css +0 -32
|
@@ -1,200 +1,146 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import os from 'node:os';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { sessionsDb } from '../../../modules/database/index.js';
|
|
1
|
+
import { providerModelsDb, sessionsDb } from '../../../modules/database/index.js';
|
|
5
2
|
import { providerRegistry } from '../../../modules/providers/provider.registry.js';
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
expiresAt: new Date(entry.expiresAt).toISOString(),
|
|
13
|
-
source,
|
|
3
|
+
import { AppError } from '../../../shared/utils.js';
|
|
4
|
+
const toCustomProviderModelOption = (record) => ({
|
|
5
|
+
value: record.modelId,
|
|
6
|
+
label: record.model,
|
|
7
|
+
recordId: record.recordId,
|
|
8
|
+
isCustom: true,
|
|
14
9
|
});
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
&& typeof value === 'object'
|
|
23
|
-
&& Array.isArray(value.OPTIONS)
|
|
24
|
-
&& value.OPTIONS.every(isProviderModelOption)
|
|
25
|
-
&& typeof value.DEFAULT === 'string');
|
|
26
|
-
const isProviderModelsCacheEntry = (value) => (Boolean(value)
|
|
27
|
-
&& typeof value === 'object'
|
|
28
|
-
&& typeof value.updatedAt === 'number'
|
|
29
|
-
&& typeof value.expiresAt === 'number'
|
|
30
|
-
&& isProviderModelsDefinition(value.models));
|
|
31
|
-
const readProviderModelsCacheFile = async (cachePath) => {
|
|
32
|
-
try {
|
|
33
|
-
const raw = await readFile(cachePath, 'utf8');
|
|
34
|
-
const parsed = JSON.parse(raw);
|
|
35
|
-
if (parsed.version !== PROVIDER_MODELS_CACHE_VERSION || !parsed.entries || typeof parsed.entries !== 'object') {
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
const entries = Object.fromEntries(Object.entries(parsed.entries).filter((entry) => isProviderModelsCacheEntry(entry[1])));
|
|
39
|
-
return {
|
|
40
|
-
version: PROVIDER_MODELS_CACHE_VERSION,
|
|
41
|
-
entries,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
catch {
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
const writeProviderModelsCacheFile = async (cachePath, entries, now) => {
|
|
49
|
-
const serializableEntries = Object.fromEntries([...entries.entries()].filter(([, entry]) => entry.expiresAt > now));
|
|
50
|
-
const payload = {
|
|
51
|
-
version: PROVIDER_MODELS_CACHE_VERSION,
|
|
52
|
-
entries: serializableEntries,
|
|
10
|
+
const mergeProviderModels = (predefined, custom) => {
|
|
11
|
+
return {
|
|
12
|
+
OPTIONS: [
|
|
13
|
+
...predefined.OPTIONS.map((option) => ({ ...option, isCustom: false })),
|
|
14
|
+
...custom.map(toCustomProviderModelOption),
|
|
15
|
+
],
|
|
16
|
+
DEFAULT: predefined.DEFAULT,
|
|
53
17
|
};
|
|
54
|
-
await mkdir(path.dirname(cachePath), { recursive: true });
|
|
55
|
-
await writeFile(cachePath, `${JSON.stringify(payload, null, 2)}\n`, 'utf8');
|
|
56
18
|
};
|
|
19
|
+
const normalizeCustomModelInput = (input) => ({
|
|
20
|
+
id: input.id.trim(),
|
|
21
|
+
model: input.model.trim(),
|
|
22
|
+
});
|
|
23
|
+
const isUniqueConstraintError = (error) => (error !== null
|
|
24
|
+
&& error !== undefined
|
|
25
|
+
&& typeof error === 'object'
|
|
26
|
+
&& 'code' in error
|
|
27
|
+
&& String(error.code).startsWith('SQLITE_CONSTRAINT'));
|
|
57
28
|
/**
|
|
58
|
-
*
|
|
29
|
+
* Creates the provider model application service used by Providers routes,
|
|
30
|
+
* Commands, and provider runtimes.
|
|
59
31
|
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
32
|
+
* Curated adapter definitions stay source-controlled and are merged at read
|
|
33
|
+
* time with custom SQLite rows. This deliberately has no predefined-model
|
|
34
|
+
* persistence, memory cache, disk cache, TTL, or provider-native discovery.
|
|
35
|
+
* Tests inject a small custom-model store through the same boundary.
|
|
63
36
|
*/
|
|
64
37
|
export const createProviderModelsService = (dependencies = {}) => {
|
|
65
38
|
const resolveProvider = dependencies.resolveProvider ?? providerRegistry.resolveProvider;
|
|
66
|
-
const
|
|
39
|
+
const catalog = dependencies.catalog ?? providerModelsDb;
|
|
67
40
|
const sessions = dependencies.sessions ?? sessionsDb;
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
const
|
|
74
|
-
const
|
|
75
|
-
if (!
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
models: cachedEntry.models,
|
|
81
|
-
cache: toProviderModelsCacheInfo(cachedEntry, source),
|
|
82
|
-
};
|
|
41
|
+
const getProviderModels = async (provider) => {
|
|
42
|
+
const predefined = await resolveProvider(provider).models.getSupportedModels();
|
|
43
|
+
return mergeProviderModels(predefined, catalog.listCustomProviderModels(provider));
|
|
44
|
+
};
|
|
45
|
+
const getCurrentActiveModel = async (provider, sessionId) => resolveProvider(provider).models.getCurrentActiveModel(sessionId);
|
|
46
|
+
const readCustomModel = (provider, recordId) => {
|
|
47
|
+
const existing = catalog.getCustomProviderModel(provider, recordId);
|
|
48
|
+
if (!existing) {
|
|
49
|
+
throw new AppError('Model not found.', {
|
|
50
|
+
code: 'MODEL_NOT_FOUND',
|
|
51
|
+
statusCode: 404,
|
|
52
|
+
});
|
|
83
53
|
}
|
|
84
|
-
|
|
85
|
-
return null;
|
|
54
|
+
return existing;
|
|
86
55
|
};
|
|
87
|
-
const
|
|
88
|
-
if (
|
|
89
|
-
|
|
56
|
+
const assertModelIdAvailable = (provider, predefined, modelId, currentRecordId) => {
|
|
57
|
+
if (predefined.OPTIONS.some((option) => option.value === modelId)) {
|
|
58
|
+
throw new AppError(`A ${provider} model with this ID already exists.`, {
|
|
59
|
+
code: 'MODEL_ID_ALREADY_EXISTS',
|
|
60
|
+
statusCode: 409,
|
|
61
|
+
});
|
|
90
62
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
if (entry.expiresAt > currentTime) {
|
|
97
|
-
memoryCache.set(provider, entry);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
persistedCacheLoaded = true;
|
|
101
|
-
})().finally(() => {
|
|
102
|
-
persistedCacheLoadPromise = null;
|
|
63
|
+
const duplicate = catalog.findCustomProviderModelByModelId(provider, modelId);
|
|
64
|
+
if (duplicate && duplicate.recordId !== currentRecordId) {
|
|
65
|
+
throw new AppError(`A ${provider} model with this ID already exists.`, {
|
|
66
|
+
code: 'MODEL_ID_ALREADY_EXISTS',
|
|
67
|
+
statusCode: 409,
|
|
103
68
|
});
|
|
104
69
|
}
|
|
105
|
-
await persistedCacheLoadPromise;
|
|
106
70
|
};
|
|
107
|
-
const
|
|
71
|
+
const createCustomModel = async (provider, input) => {
|
|
72
|
+
const predefined = await resolveProvider(provider).models.getSupportedModels();
|
|
73
|
+
const normalized = normalizeCustomModelInput(input);
|
|
74
|
+
assertModelIdAvailable(provider, predefined, normalized.id);
|
|
108
75
|
try {
|
|
109
|
-
|
|
76
|
+
const created = catalog.createCustomProviderModel(provider, normalized);
|
|
77
|
+
return {
|
|
78
|
+
model: toCustomProviderModelOption(created),
|
|
79
|
+
models: mergeProviderModels(predefined, catalog.listCustomProviderModels(provider)),
|
|
80
|
+
};
|
|
110
81
|
}
|
|
111
82
|
catch (error) {
|
|
112
|
-
|
|
83
|
+
if (isUniqueConstraintError(error)) {
|
|
84
|
+
throw new AppError(`A ${provider} model with this ID already exists.`, {
|
|
85
|
+
code: 'MODEL_ID_ALREADY_EXISTS',
|
|
86
|
+
statusCode: 409,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
throw error;
|
|
113
90
|
}
|
|
114
91
|
};
|
|
115
|
-
const
|
|
116
|
-
const
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
.then(async (models) => {
|
|
129
|
-
const entry = await setCacheEntry(provider, models);
|
|
130
|
-
return {
|
|
131
|
-
models,
|
|
132
|
-
cache: toProviderModelsCacheInfo(entry, 'fresh'),
|
|
133
|
-
};
|
|
134
|
-
})
|
|
135
|
-
.finally(() => {
|
|
136
|
-
pendingRequests.delete(provider);
|
|
137
|
-
});
|
|
138
|
-
pendingRequests.set(provider, request);
|
|
139
|
-
return request;
|
|
140
|
-
};
|
|
141
|
-
const loadDirectModels = (provider) => {
|
|
142
|
-
const request = resolveProvider(provider).models.getSupportedModels()
|
|
143
|
-
.then((models) => {
|
|
144
|
-
const currentTime = now();
|
|
92
|
+
const updateCustomModel = async (provider, recordId, input) => {
|
|
93
|
+
const predefined = await resolveProvider(provider).models.getSupportedModels();
|
|
94
|
+
readCustomModel(provider, recordId);
|
|
95
|
+
const normalized = normalizeCustomModelInput(input);
|
|
96
|
+
assertModelIdAvailable(provider, predefined, normalized.id, recordId);
|
|
97
|
+
try {
|
|
98
|
+
const updated = catalog.updateCustomProviderModel(provider, recordId, normalized);
|
|
99
|
+
if (!updated) {
|
|
100
|
+
throw new AppError('Model not found.', {
|
|
101
|
+
code: 'MODEL_NOT_FOUND',
|
|
102
|
+
statusCode: 404,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
145
105
|
return {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
updatedAt: new Date(currentTime).toISOString(),
|
|
149
|
-
expiresAt: new Date(currentTime).toISOString(),
|
|
150
|
-
source: 'fresh',
|
|
151
|
-
},
|
|
106
|
+
model: toCustomProviderModelOption(updated),
|
|
107
|
+
models: mergeProviderModels(predefined, catalog.listCustomProviderModels(provider)),
|
|
152
108
|
};
|
|
153
|
-
})
|
|
154
|
-
.finally(() => {
|
|
155
|
-
pendingRequests.delete(provider);
|
|
156
|
-
});
|
|
157
|
-
pendingRequests.set(provider, request);
|
|
158
|
-
return request;
|
|
159
|
-
};
|
|
160
|
-
const getProviderModels = async (provider, options = {}) => {
|
|
161
|
-
if (UNCACHED_PROVIDERS.has(provider)) {
|
|
162
|
-
const pendingRequest = pendingRequests.get(provider);
|
|
163
|
-
if (pendingRequest) {
|
|
164
|
-
return pendingRequest;
|
|
165
|
-
}
|
|
166
|
-
return loadDirectModels(provider);
|
|
167
109
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (isUniqueConstraintError(error)) {
|
|
112
|
+
throw new AppError(`A ${provider} model with this ID already exists.`, {
|
|
113
|
+
code: 'MODEL_ID_ALREADY_EXISTS',
|
|
114
|
+
statusCode: 409,
|
|
115
|
+
});
|
|
172
116
|
}
|
|
173
|
-
|
|
117
|
+
throw error;
|
|
174
118
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
const
|
|
180
|
-
if (
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
if (persistedModels) {
|
|
186
|
-
return persistedModels;
|
|
187
|
-
}
|
|
188
|
-
const postLoadPendingRequest = pendingRequests.get(provider);
|
|
189
|
-
if (postLoadPendingRequest) {
|
|
190
|
-
return postLoadPendingRequest;
|
|
119
|
+
};
|
|
120
|
+
const deleteCustomModel = async (provider, recordId) => {
|
|
121
|
+
const predefined = await resolveProvider(provider).models.getSupportedModels();
|
|
122
|
+
readCustomModel(provider, recordId);
|
|
123
|
+
const removed = catalog.deleteCustomProviderModel(provider, recordId, predefined.DEFAULT);
|
|
124
|
+
if (!removed) {
|
|
125
|
+
throw new AppError('Model not found.', {
|
|
126
|
+
code: 'MODEL_NOT_FOUND',
|
|
127
|
+
statusCode: 404,
|
|
128
|
+
});
|
|
191
129
|
}
|
|
192
|
-
return
|
|
130
|
+
return {
|
|
131
|
+
model: toCustomProviderModelOption(removed),
|
|
132
|
+
models: mergeProviderModels(predefined, catalog.listCustomProviderModels(provider)),
|
|
133
|
+
};
|
|
193
134
|
};
|
|
194
|
-
const
|
|
195
|
-
const readRecordedSessionModel = (sessionId) => {
|
|
135
|
+
const readRecordedSessionSelection = (sessionId) => {
|
|
196
136
|
const session = sessions.getSessionById(sessionId);
|
|
197
|
-
|
|
137
|
+
if (!session) {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
model: session.model?.trim() || null,
|
|
142
|
+
effort: session.effort?.trim() || null,
|
|
143
|
+
};
|
|
198
144
|
};
|
|
199
145
|
/**
|
|
200
146
|
* Records the model one session runs with.
|
|
@@ -211,7 +157,8 @@ export const createProviderModelsService = (dependencies = {}) => {
|
|
|
211
157
|
if (!normalizedSessionId || !normalizedModel) {
|
|
212
158
|
return null;
|
|
213
159
|
}
|
|
214
|
-
|
|
160
|
+
const recordedSelection = readRecordedSessionSelection(normalizedSessionId);
|
|
161
|
+
if (!recordedSelection) {
|
|
215
162
|
return null;
|
|
216
163
|
}
|
|
217
164
|
sessions.setSessionModel(normalizedSessionId, normalizedModel);
|
|
@@ -219,6 +166,31 @@ export const createProviderModelsService = (dependencies = {}) => {
|
|
|
219
166
|
provider,
|
|
220
167
|
sessionId: normalizedSessionId,
|
|
221
168
|
model: normalizedModel,
|
|
169
|
+
effort: recordedSelection.effort,
|
|
170
|
+
source: 'session',
|
|
171
|
+
};
|
|
172
|
+
};
|
|
173
|
+
/**
|
|
174
|
+
* Records the reasoning effort one session runs with.
|
|
175
|
+
*
|
|
176
|
+
* Like `setSessionModel`, this ignores an id that has not been allocated by
|
|
177
|
+
* the session gateway yet. The websocket send path records it once the row
|
|
178
|
+
* exists, so a pre-session composer choice is not lost.
|
|
179
|
+
*/
|
|
180
|
+
const setSessionEffort = (provider, sessionId, effort) => {
|
|
181
|
+
const normalizedSessionId = sessionId.trim();
|
|
182
|
+
const normalizedEffort = effort.trim();
|
|
183
|
+
if (!normalizedSessionId || !normalizedEffort) {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
if (!readRecordedSessionSelection(normalizedSessionId)) {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
sessions.setSessionEffort(normalizedSessionId, normalizedEffort);
|
|
190
|
+
return {
|
|
191
|
+
provider,
|
|
192
|
+
sessionId: normalizedSessionId,
|
|
193
|
+
effort: normalizedEffort,
|
|
222
194
|
source: 'session',
|
|
223
195
|
};
|
|
224
196
|
};
|
|
@@ -226,13 +198,10 @@ export const createProviderModelsService = (dependencies = {}) => {
|
|
|
226
198
|
* Answers "which model is this session using?" for every display surface.
|
|
227
199
|
*
|
|
228
200
|
* Precedence, highest first:
|
|
229
|
-
* 1. the model recorded on the session row
|
|
230
|
-
*
|
|
231
|
-
*
|
|
232
|
-
*
|
|
233
|
-
* 3. `requestedModel`, the client's current default, for a chat that has no
|
|
234
|
-
* session yet;
|
|
235
|
-
* 4. the provider catalog default.
|
|
201
|
+
* 1. the model recorded on the session row;
|
|
202
|
+
* 2. the provider's own session state for externally-created sessions;
|
|
203
|
+
* 3. `requestedModel`, the client's current default;
|
|
204
|
+
* 4. the source-controlled provider catalog default.
|
|
236
205
|
*/
|
|
237
206
|
const resolveSessionModel = async (provider, options = {}) => {
|
|
238
207
|
const normalizedSessionId = typeof options.sessionId === 'string' ? options.sessionId.trim() : '';
|
|
@@ -240,32 +209,33 @@ export const createProviderModelsService = (dependencies = {}) => {
|
|
|
240
209
|
? options.requestedModel.trim()
|
|
241
210
|
: '';
|
|
242
211
|
if (normalizedSessionId) {
|
|
243
|
-
const
|
|
244
|
-
if (
|
|
212
|
+
const recordedSelection = readRecordedSessionSelection(normalizedSessionId);
|
|
213
|
+
if (recordedSelection?.model) {
|
|
245
214
|
return {
|
|
246
215
|
provider,
|
|
247
216
|
sessionId: normalizedSessionId,
|
|
248
|
-
model:
|
|
217
|
+
model: recordedSelection.model,
|
|
218
|
+
effort: recordedSelection.effort,
|
|
249
219
|
source: 'session',
|
|
250
220
|
};
|
|
251
221
|
}
|
|
252
|
-
|
|
253
|
-
// state says before falling back to anything client-supplied.
|
|
254
|
-
const catalog = (await getProviderModels(provider)).models;
|
|
222
|
+
const providerCatalog = await getProviderModels(provider);
|
|
255
223
|
const providerModel = await getCurrentActiveModel(provider, normalizedSessionId);
|
|
256
224
|
const resolvedProviderModel = providerModel.model?.trim();
|
|
257
|
-
if (resolvedProviderModel && resolvedProviderModel !==
|
|
225
|
+
if (resolvedProviderModel && resolvedProviderModel !== providerCatalog.DEFAULT) {
|
|
258
226
|
return {
|
|
259
227
|
provider,
|
|
260
228
|
sessionId: normalizedSessionId,
|
|
261
229
|
model: resolvedProviderModel,
|
|
230
|
+
effort: recordedSelection?.effort ?? null,
|
|
262
231
|
source: 'provider',
|
|
263
232
|
};
|
|
264
233
|
}
|
|
265
234
|
return {
|
|
266
235
|
provider,
|
|
267
236
|
sessionId: normalizedSessionId,
|
|
268
|
-
model: normalizedRequestedModel ||
|
|
237
|
+
model: normalizedRequestedModel || providerCatalog.DEFAULT,
|
|
238
|
+
effort: recordedSelection?.effort ?? null,
|
|
269
239
|
source: normalizedRequestedModel ? 'session' : 'default',
|
|
270
240
|
};
|
|
271
241
|
}
|
|
@@ -274,24 +244,24 @@ export const createProviderModelsService = (dependencies = {}) => {
|
|
|
274
244
|
provider,
|
|
275
245
|
sessionId: null,
|
|
276
246
|
model: normalizedRequestedModel,
|
|
247
|
+
effort: null,
|
|
277
248
|
source: 'session',
|
|
278
249
|
};
|
|
279
250
|
}
|
|
280
|
-
const
|
|
251
|
+
const providerCatalog = await getProviderModels(provider);
|
|
281
252
|
return {
|
|
282
253
|
provider,
|
|
283
254
|
sessionId: null,
|
|
284
|
-
model:
|
|
255
|
+
model: providerCatalog.DEFAULT,
|
|
256
|
+
effort: null,
|
|
285
257
|
source: 'default',
|
|
286
258
|
};
|
|
287
259
|
};
|
|
288
260
|
/**
|
|
289
|
-
* Picks the model one run should use
|
|
261
|
+
* Picks the model one resumed provider run should use.
|
|
290
262
|
*
|
|
291
|
-
*
|
|
292
|
-
*
|
|
293
|
-
* from `getCurrentActiveModel`, which would silently override the model the
|
|
294
|
-
* user picked in the composer on every single run.
|
|
263
|
+
* Provider-global state is deliberately ignored because it must never
|
|
264
|
+
* override the model explicitly selected in the composer.
|
|
295
265
|
*/
|
|
296
266
|
const resolveResumeModel = async (provider, sessionId, requestedModel) => {
|
|
297
267
|
void provider;
|
|
@@ -300,22 +270,20 @@ export const createProviderModelsService = (dependencies = {}) => {
|
|
|
300
270
|
if (!normalizedSessionId) {
|
|
301
271
|
return normalizedRequestedModel || undefined;
|
|
302
272
|
}
|
|
303
|
-
const recordedModel =
|
|
273
|
+
const recordedModel = readRecordedSessionSelection(normalizedSessionId)?.model;
|
|
304
274
|
return recordedModel || normalizedRequestedModel || undefined;
|
|
305
275
|
};
|
|
306
|
-
const clearCache = () => {
|
|
307
|
-
memoryCache.clear();
|
|
308
|
-
pendingRequests.clear();
|
|
309
|
-
persistedCacheLoaded = false;
|
|
310
|
-
persistedCacheLoadPromise = null;
|
|
311
|
-
};
|
|
312
276
|
return {
|
|
313
277
|
getProviderModels,
|
|
278
|
+
createCustomModel,
|
|
279
|
+
updateCustomModel,
|
|
280
|
+
deleteCustomModel,
|
|
314
281
|
setSessionModel,
|
|
282
|
+
setSessionEffort,
|
|
315
283
|
resolveSessionModel,
|
|
316
284
|
resolveResumeModel,
|
|
317
|
-
clearCache,
|
|
318
285
|
};
|
|
319
286
|
};
|
|
287
|
+
/** Shared Providers service used by routes, Commands, and provider runtimes. */
|
|
320
288
|
export const providerModelsService = createProviderModelsService();
|
|
321
289
|
//# sourceMappingURL=provider-models.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-models.service.js","sourceRoot":"","sources":["../../../../../server/modules/providers/services/provider-models.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"provider-models.service.js","sourceRoot":"","sources":["../../../../../server/modules/providers/services/provider-models.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ const defaultDependencies = {
|
|
|
6
6
|
resolveProvider: (provider) => providerRegistry.resolveProvider(provider),
|
|
7
7
|
resolveProviderSessionId: (sessionId) => sessionsService.resolveProviderSessionId(sessionId),
|
|
8
8
|
resolveResumeModel: (provider, sessionId, requestedModel) => providerModelsService.resolveResumeModel(provider, sessionId, requestedModel),
|
|
9
|
-
getProviderModels: (provider
|
|
9
|
+
getProviderModels: (provider) => providerModelsService.getProviderModels(provider),
|
|
10
10
|
};
|
|
11
11
|
/**
|
|
12
12
|
* Creates the application-facing provider runtime dispatcher.
|
|
@@ -20,7 +20,7 @@ export function createProviderRuntimeService(dependencyOverrides = {}) {
|
|
|
20
20
|
const createRuntimeContext = (provider) => ({
|
|
21
21
|
resolveProviderSessionId: dependencies.resolveProviderSessionId,
|
|
22
22
|
resolveResumeModel: (sessionId, requestedModel) => dependencies.resolveResumeModel(provider.id, sessionId, requestedModel),
|
|
23
|
-
getProviderModels: async () =>
|
|
23
|
+
getProviderModels: async () => dependencies.getProviderModels(provider.id),
|
|
24
24
|
normalizeMessage: (raw, sessionId) => provider.sessions.normalizeMessage(raw, sessionId),
|
|
25
25
|
async isProviderInstalled() {
|
|
26
26
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-runtime.service.js","sourceRoot":"","sources":["../../../../../server/modules/providers/services/provider-runtime.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,yDAAyD,CAAC;AAChG,OAAO,EAAE,eAAe,EAAE,MAAM,kDAAkD,CAAC;AAuBnF,MAAM,mBAAmB,GAAuC;IAC9D,aAAa,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,aAAa,EAAE;IACrD,eAAe,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,gBAAgB,CAAC,eAAe,CAAC,QAAQ,CAAC;IACzE,wBAAwB,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,eAAe,CAAC,wBAAwB,CAAC,SAAS,CAAC;IAC5F,kBAAkB,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE,CAC1D,qBAAqB,CAAC,kBAAkB,CAAC,QAAQ,EAAE,SAAS,EAAE,cAAc,CAAC;IAC/E,iBAAiB,EAAE,CAAC,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"provider-runtime.service.js","sourceRoot":"","sources":["../../../../../server/modules/providers/services/provider-runtime.service.ts"],"names":[],"mappings":"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"}
|
package/dist-server/server/modules/providers/services/session-conversations-search.service.js
CHANGED
|
@@ -551,11 +551,18 @@ async function parseClaudeSessionMatches(session, runtime) {
|
|
|
551
551
|
const targetSessions = matchedSessionsForFile.length > 0
|
|
552
552
|
? matchedSessionsForFile
|
|
553
553
|
: [session];
|
|
554
|
-
|
|
554
|
+
// Transcript lines are tagged with the provider session id (e.g. Claude's own
|
|
555
|
+
// conversation UUID), which is not necessarily the app-facing `session_id`.
|
|
556
|
+
// Match and attribute by the provider id, but map results back to the
|
|
557
|
+
// internal `session_id` the rest of the app uses to identify sessions.
|
|
558
|
+
const providerToInternalId = new Map();
|
|
555
559
|
const customNameBySessionId = new Map();
|
|
556
560
|
for (const candidate of targetSessions) {
|
|
557
|
-
|
|
561
|
+
const providerId = candidate.provider_session_id || candidate.session_id;
|
|
562
|
+
providerToInternalId.set(providerId, candidate.session_id);
|
|
563
|
+
customNameBySessionId.set(providerId, candidate.custom_name ?? null);
|
|
558
564
|
}
|
|
565
|
+
const targetSessionIds = new Set(providerToInternalId.keys());
|
|
559
566
|
const sessionStateById = new Map();
|
|
560
567
|
const getSessionState = (sessionId) => {
|
|
561
568
|
if (!sessionStateById.has(sessionId)) {
|
|
@@ -655,8 +662,9 @@ async function parseClaudeSessionMatches(session, runtime) {
|
|
|
655
662
|
if (state.matches.length === 0) {
|
|
656
663
|
continue;
|
|
657
664
|
}
|
|
658
|
-
|
|
659
|
-
|
|
665
|
+
const internalSessionId = providerToInternalId.get(sessionId) ?? sessionId;
|
|
666
|
+
fileResults.set(internalSessionId, {
|
|
667
|
+
sessionId: internalSessionId,
|
|
660
668
|
provider: 'claude',
|
|
661
669
|
sessionSummary: toSummaryText(customNameBySessionId.get(sessionId) ?? null, state.resolvedSummary || state.fallbackUserText || state.fallbackAssistantText, 'New Session'),
|
|
662
670
|
matches: state.matches,
|