moderado 0.3.4 → 0.3.8
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/README.md +215 -215
- package/dist/args.js +29 -29
- package/dist/budget.d.ts +6 -0
- package/dist/budget.d.ts.map +1 -0
- package/dist/budget.js +25 -0
- package/dist/budget.js.map +1 -0
- package/dist/chat_mode.d.ts +14 -0
- package/dist/chat_mode.d.ts.map +1 -0
- package/dist/chat_mode.js +13 -0
- package/dist/chat_mode.js.map +1 -0
- package/dist/commands/chat.d.ts +5 -1
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +172 -43
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/host.d.ts +4 -0
- package/dist/commands/host.d.ts.map +1 -0
- package/dist/commands/host.js +30 -0
- package/dist/commands/host.js.map +1 -0
- package/dist/commands/models.d.ts.map +1 -1
- package/dist/commands/models.js +63 -16
- package/dist/commands/models.js.map +1 -1
- package/dist/config.d.ts +73 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +116 -0
- package/dist/config.js.map +1 -1
- package/dist/host/approval_queue.d.ts +9 -0
- package/dist/host/approval_queue.d.ts.map +1 -0
- package/dist/host/approval_queue.js +63 -0
- package/dist/host/approval_queue.js.map +1 -0
- package/dist/host/auto_approve.d.ts +22 -0
- package/dist/host/auto_approve.d.ts.map +1 -0
- package/dist/host/auto_approve.js +36 -0
- package/dist/host/auto_approve.js.map +1 -0
- package/dist/host/ndjson.d.ts +3 -0
- package/dist/host/ndjson.d.ts.map +1 -0
- package/dist/host/ndjson.js +68 -0
- package/dist/host/ndjson.js.map +1 -0
- package/dist/host/protocol_server.d.ts +9 -0
- package/dist/host/protocol_server.d.ts.map +1 -0
- package/dist/host/protocol_server.js +101 -0
- package/dist/host/protocol_server.js.map +1 -0
- package/dist/host/runtime.d.ts +30 -0
- package/dist/host/runtime.d.ts.map +1 -0
- package/dist/host/runtime.js +603 -0
- package/dist/host/runtime.js.map +1 -0
- package/dist/model_pricing.d.ts +14 -1
- package/dist/model_pricing.d.ts.map +1 -1
- package/dist/model_pricing.js +52 -0
- package/dist/model_pricing.js.map +1 -1
- package/dist/repo_map.d.ts +3 -0
- package/dist/repo_map.d.ts.map +1 -0
- package/dist/repo_map.js +29 -0
- package/dist/repo_map.js.map +1 -0
- package/dist/sessions.d.ts +22 -15
- package/dist/sessions.d.ts.map +1 -1
- package/dist/sessions.js +16 -1
- package/dist/sessions.js.map +1 -1
- package/dist/skills.d.ts +2 -2
- package/dist/skills.js +2 -2
- package/dist/ui/model_selector.d.ts +2 -2
- package/dist/ui/model_selector.d.ts.map +1 -1
- package/dist/ui/model_selector.js +25 -16
- package/dist/ui/model_selector.js.map +1 -1
- package/dist/ui/provider_connect.d.ts +6 -3
- package/dist/ui/provider_connect.d.ts.map +1 -1
- package/dist/ui/provider_connect.js +41 -14
- package/dist/ui/provider_connect.js.map +1 -1
- package/dist/ui/renderer.d.ts +4 -0
- package/dist/ui/renderer.d.ts.map +1 -1
- package/dist/ui/renderer.js +36 -0
- package/dist/ui/renderer.js.map +1 -1
- package/dist/ui/session_screen.d.ts +32 -0
- package/dist/ui/session_screen.d.ts.map +1 -0
- package/dist/ui/session_screen.js +148 -0
- package/dist/ui/session_screen.js.map +1 -0
- package/dist/ui/session_terminal.d.ts +46 -0
- package/dist/ui/session_terminal.d.ts.map +1 -0
- package/dist/ui/session_terminal.js +342 -0
- package/dist/ui/session_terminal.js.map +1 -0
- package/dist/ui/welcome.d.ts +11 -0
- package/dist/ui/welcome.d.ts.map +1 -1
- package/dist/ui/welcome.js +49 -32
- package/dist/ui/welcome.js.map +1 -1
- package/dist/vendor/contracts/events.d.ts +159 -0
- package/dist/vendor/contracts/events.d.ts.map +1 -1
- package/dist/vendor/contracts/events.js +12 -0
- package/dist/vendor/contracts/events.js.map +1 -1
- package/dist/vendor/contracts/host_protocol.d.ts +3545 -0
- package/dist/vendor/contracts/host_protocol.d.ts.map +1 -0
- package/dist/vendor/contracts/host_protocol.js +292 -0
- package/dist/vendor/contracts/host_protocol.js.map +1 -0
- package/dist/vendor/contracts/provider.d.ts +1 -0
- package/dist/vendor/contracts/provider.d.ts.map +1 -1
- package/dist/vendor/contracts/provider.js +6 -0
- package/dist/vendor/contracts/provider.js.map +1 -1
- package/dist/vendor/core/agent.d.ts +2 -1
- package/dist/vendor/core/agent.d.ts.map +1 -1
- package/dist/vendor/core/agent.js +145 -31
- package/dist/vendor/core/agent.js.map +1 -1
- package/dist/vendor/providers/model_discovery.d.ts +2 -2
- package/dist/vendor/providers/model_discovery.d.ts.map +1 -1
- package/dist/vendor/providers/model_discovery.js +4 -2
- package/dist/vendor/providers/model_discovery.js.map +1 -1
- package/dist/vendor/providers/nvidia/nvidia_adapter.d.ts.map +1 -1
- package/dist/vendor/providers/nvidia/nvidia_adapter.js +1 -0
- package/dist/vendor/providers/nvidia/nvidia_adapter.js.map +1 -1
- package/dist/vendor/providers/nvidia/sse_parser.d.ts +2 -1
- package/dist/vendor/providers/nvidia/sse_parser.d.ts.map +1 -1
- package/dist/vendor/providers/nvidia/sse_parser.js +30 -16
- package/dist/vendor/providers/nvidia/sse_parser.js.map +1 -1
- package/dist/web_search_route.d.ts +16 -0
- package/dist/web_search_route.d.ts.map +1 -0
- package/dist/web_search_route.js +60 -0
- package/dist/web_search_route.js.map +1 -0
- package/package.json +28 -28
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { parseAutoApproveSettings } from '../vendor/contracts/index.js';
|
|
3
|
+
import { AgentLoop, HostEventStream, PolicyManager, Router } from '../vendor/core/index.js';
|
|
4
|
+
import { canonicalizeRoot, createDefaultToolRegistry, createWebSearchTool, resolveInJail } from '../vendor/tools/index.js';
|
|
5
|
+
import { shouldFastRouteWebSearch, formatDirectWebSearchAnswer, buildSearchAnswerTask, replaceEvidenceTurn, resolveWebSearchOptions, } from '../web_search_route.js';
|
|
6
|
+
import { NvidiaAdapter } from '../vendor/providers/index.js';
|
|
7
|
+
import { CONNECT_PROVIDER_PRESET_META, findProviderPreset, freeModelPolicyFor, getActiveConnection, isLoopbackBaseUrl, loadConfig, resolveApiKey, resolveConnectionCredential, saveConnection, storeConnectionCredential, } from '../config.js';
|
|
8
|
+
import { MemoryCredentialStore } from '../credentials.js';
|
|
9
|
+
import { WindowsCredentialStore } from '../windows_credentials.js';
|
|
10
|
+
import { createSession, SessionStore } from '../sessions.js';
|
|
11
|
+
import { createAgentTask } from '../chat_mode.js';
|
|
12
|
+
import { isFreeModelOption } from '../model_pricing.js';
|
|
13
|
+
import { createWorkspaceFileSource, expandMentions } from '../ui/file_mentions.js';
|
|
14
|
+
import { ApprovalQueue } from './approval_queue.js';
|
|
15
|
+
import { AutoApproveHandler } from './auto_approve.js';
|
|
16
|
+
async function resolveDefaultProvider(customHome, credentialStore, providerIdOverride) {
|
|
17
|
+
const config = loadConfig(customHome);
|
|
18
|
+
const activeConn = providerIdOverride
|
|
19
|
+
? (config.connections?.[providerIdOverride] ?? getActiveConnection(config))
|
|
20
|
+
: getActiveConnection(config);
|
|
21
|
+
const store = credentialStore ??
|
|
22
|
+
(process.platform === 'win32'
|
|
23
|
+
? new WindowsCredentialStore()
|
|
24
|
+
: new MemoryCredentialStore());
|
|
25
|
+
if (activeConn) {
|
|
26
|
+
const resolved = await resolveConnectionCredential(activeConn, store);
|
|
27
|
+
if (!resolved.apiKey) {
|
|
28
|
+
throw new Error(`Configured provider "${resolved.displayName || resolved.id}" is missing an API key.`);
|
|
29
|
+
}
|
|
30
|
+
return new NvidiaAdapter({
|
|
31
|
+
apiKey: resolved.apiKey,
|
|
32
|
+
baseUrl: resolved.baseUrl,
|
|
33
|
+
providerId: resolved.id,
|
|
34
|
+
providerName: resolved.displayName,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
const legacyKey = resolveApiKey(customHome);
|
|
38
|
+
if (legacyKey) {
|
|
39
|
+
return new NvidiaAdapter({
|
|
40
|
+
apiKey: legacyKey,
|
|
41
|
+
baseUrl: 'https://integrate.api.nvidia.com/v1',
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
throw new Error('No provider configured. Please configure an API key or provider connection.');
|
|
45
|
+
}
|
|
46
|
+
export async function createHostRuntime(options) {
|
|
47
|
+
const { workspaceRoot, emit, dependencies } = options;
|
|
48
|
+
const canonicalRoot = canonicalizeRoot(workspaceRoot);
|
|
49
|
+
const customHome = dependencies?.customHome;
|
|
50
|
+
const sessionStore = dependencies?.sessionStore ?? new SessionStore(customHome);
|
|
51
|
+
const credentialStore = dependencies?.credentialStore ??
|
|
52
|
+
(process.platform === 'win32' ? new WindowsCredentialStore() : new MemoryCredentialStore());
|
|
53
|
+
// Provider resolution is lazy: the sidecar must start (and the model manager
|
|
54
|
+
// must be reachable) before any API key exists. DI providers win permanently;
|
|
55
|
+
// resolved adapters are invalidated by provider.connect so a switch takes
|
|
56
|
+
// effect without a sidecar restart.
|
|
57
|
+
let providerAdapter = dependencies?.provider;
|
|
58
|
+
let providerPromise;
|
|
59
|
+
const getProvider = async () => {
|
|
60
|
+
if (providerAdapter)
|
|
61
|
+
return providerAdapter;
|
|
62
|
+
if (!providerPromise) {
|
|
63
|
+
providerPromise = resolveDefaultProvider(customHome, credentialStore, options.providerId).then((resolved) => {
|
|
64
|
+
providerAdapter = resolved;
|
|
65
|
+
providerPromise = undefined;
|
|
66
|
+
return resolved;
|
|
67
|
+
}, (err) => {
|
|
68
|
+
providerPromise = undefined;
|
|
69
|
+
throw err;
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return providerPromise;
|
|
73
|
+
};
|
|
74
|
+
const invalidateProvider = () => {
|
|
75
|
+
if (dependencies?.provider)
|
|
76
|
+
return;
|
|
77
|
+
providerAdapter = undefined;
|
|
78
|
+
providerPromise = undefined;
|
|
79
|
+
};
|
|
80
|
+
// Builds a throwaway adapter for a provider that is not the active one
|
|
81
|
+
// (used when the model manager browses models for a different provider).
|
|
82
|
+
const buildAdapterForProvider = async (providerId) => {
|
|
83
|
+
const preset = findProviderPreset(providerId);
|
|
84
|
+
const saved = loadConfig(customHome).connections?.[providerId];
|
|
85
|
+
if (!preset && !saved) {
|
|
86
|
+
throw new Error(`Unknown provider "${providerId}".`);
|
|
87
|
+
}
|
|
88
|
+
const connection = saved ?? {
|
|
89
|
+
id: preset.id,
|
|
90
|
+
displayName: preset.label,
|
|
91
|
+
kind: preset.kind,
|
|
92
|
+
baseUrl: preset.baseUrl,
|
|
93
|
+
defaultModel: preset.defaultModel,
|
|
94
|
+
};
|
|
95
|
+
const resolved = await resolveConnectionCredential(connection, credentialStore);
|
|
96
|
+
const apiKey = resolved.apiKey?.trim() || undefined;
|
|
97
|
+
const requiresApiKey = preset
|
|
98
|
+
? preset.requiresApiKey
|
|
99
|
+
: !isLoopbackBaseUrl(connection.baseUrl);
|
|
100
|
+
if (requiresApiKey && !apiKey) {
|
|
101
|
+
throw new Error(`An API key is required to use ${connection.displayName || providerId}.`);
|
|
102
|
+
}
|
|
103
|
+
return new NvidiaAdapter({
|
|
104
|
+
apiKey,
|
|
105
|
+
baseUrl: connection.baseUrl,
|
|
106
|
+
providerId: connection.id,
|
|
107
|
+
providerName: connection.displayName,
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
const createHostTools = () => {
|
|
111
|
+
const config = loadConfig(customHome);
|
|
112
|
+
const searchOptions = resolveWebSearchOptions(config);
|
|
113
|
+
return createDefaultToolRegistry([createWebSearchTool(searchOptions)]);
|
|
114
|
+
};
|
|
115
|
+
const tools = dependencies?.tools ?? createHostTools();
|
|
116
|
+
const loop = dependencies?.agentLoop ?? new AgentLoop();
|
|
117
|
+
// Curated context metadata covers only a handful of models, and no provider
|
|
118
|
+
// advertises a window, so the session meter has no denominator for anything
|
|
119
|
+
// else and stays hidden. The user's `contextWindows` map is supplied here so
|
|
120
|
+
// a declared window reaches the panel for any model. Each entry is a partial
|
|
121
|
+
// override, so the curated access tier and tool support are left untouched.
|
|
122
|
+
const configuredWindows = loadConfig(customHome).contextWindows ?? {};
|
|
123
|
+
const router = new Router(Object.fromEntries(Object.entries(configuredWindows).map(([modelId, contextWindow]) => [modelId, { contextWindow }])));
|
|
124
|
+
const policy = new PolicyManager();
|
|
125
|
+
const approvalQueue = new ApprovalQueue();
|
|
126
|
+
let activeSession = sessionStore.loadLatestSession(canonicalRoot) ?? createSession(canonicalRoot);
|
|
127
|
+
sessionStore.save(activeSession);
|
|
128
|
+
let hostStream = new HostEventStream((envelope) => {
|
|
129
|
+
emit({ type: 'event', envelope }).catch(() => { });
|
|
130
|
+
}, activeSession.id);
|
|
131
|
+
/**
|
|
132
|
+
* Publish the session's context consumption.
|
|
133
|
+
*
|
|
134
|
+
* The panel meters the session box from this event alone, and the webview
|
|
135
|
+
* loses its state on every reload, so usage is published whenever the session
|
|
136
|
+
* or its model becomes known — at startup, when the router announces the
|
|
137
|
+
* serving model, and when a turn ends. Publishing only after a run would
|
|
138
|
+
* leave a freshly opened panel without a meter until the next turn finished.
|
|
139
|
+
* The window stays `undefined` while no model is known, so the bar keeps
|
|
140
|
+
* hiding itself rather than dividing by a guess.
|
|
141
|
+
*/
|
|
142
|
+
const publishSessionUsage = (modelId) => {
|
|
143
|
+
hostStream.emit({
|
|
144
|
+
type: 'session_usage',
|
|
145
|
+
totalTokens: activeSession.usage.totalTokens ?? 0,
|
|
146
|
+
contextWindow: modelId ? router.classifyModel(modelId).contextWindow : undefined,
|
|
147
|
+
modelId,
|
|
148
|
+
timestamp: Date.now(),
|
|
149
|
+
});
|
|
150
|
+
};
|
|
151
|
+
let activeGeneration = null;
|
|
152
|
+
let currentPromise = null;
|
|
153
|
+
const initialize = async (_req) => {
|
|
154
|
+
const sessions = sessionStore.listSessions(canonicalRoot);
|
|
155
|
+
const resumableSessions = sessions.map((s) => ({
|
|
156
|
+
sessionId: s.id,
|
|
157
|
+
title: s.messages.find((m) => m.role === 'user')?.content?.slice(0, 60) || undefined,
|
|
158
|
+
updatedAt: new Date(s.updatedAt).getTime(),
|
|
159
|
+
}));
|
|
160
|
+
// A recreated webview starts without usage, so the meter's data is
|
|
161
|
+
// re-published here rather than waiting for the next completed turn.
|
|
162
|
+
publishSessionUsage(options.modelId);
|
|
163
|
+
return {
|
|
164
|
+
protocolVersion: 1,
|
|
165
|
+
sessionId: activeSession.id,
|
|
166
|
+
workspaceName: path.basename(canonicalRoot),
|
|
167
|
+
resumableSessions,
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
const dispatch = async (request) => {
|
|
171
|
+
switch (request.method) {
|
|
172
|
+
case 'initialize': {
|
|
173
|
+
return initialize(request);
|
|
174
|
+
}
|
|
175
|
+
case 'session.new': {
|
|
176
|
+
if (request.params.sessionId !== activeSession.id) {
|
|
177
|
+
const err = new Error(`Session mismatch: expected ${activeSession.id}, got ${request.params.sessionId}`);
|
|
178
|
+
err.code = 'SESSION_NOT_FOUND';
|
|
179
|
+
throw err;
|
|
180
|
+
}
|
|
181
|
+
activeSession = createSession(canonicalRoot);
|
|
182
|
+
sessionStore.save(activeSession);
|
|
183
|
+
hostStream = new HostEventStream((envelope) => {
|
|
184
|
+
emit({ type: 'event', envelope }).catch(() => { });
|
|
185
|
+
}, activeSession.id);
|
|
186
|
+
return { sessionId: activeSession.id };
|
|
187
|
+
}
|
|
188
|
+
case 'session.resume': {
|
|
189
|
+
if (request.params.sessionId !== activeSession.id) {
|
|
190
|
+
const err = new Error(`Session mismatch: expected ${activeSession.id}, got ${request.params.sessionId}`);
|
|
191
|
+
err.code = 'SESSION_NOT_FOUND';
|
|
192
|
+
throw err;
|
|
193
|
+
}
|
|
194
|
+
const sessions = sessionStore.listSessions(canonicalRoot);
|
|
195
|
+
const target = sessions.find((s) => s.id === request.params.targetSessionId);
|
|
196
|
+
if (!target) {
|
|
197
|
+
const err = new Error(`Session '${request.params.targetSessionId}' not found in workspace`);
|
|
198
|
+
err.code = 'SESSION_NOT_FOUND';
|
|
199
|
+
throw err;
|
|
200
|
+
}
|
|
201
|
+
activeSession = target;
|
|
202
|
+
hostStream = new HostEventStream((envelope) => {
|
|
203
|
+
emit({ type: 'event', envelope }).catch(() => { });
|
|
204
|
+
}, activeSession.id);
|
|
205
|
+
return { sessionId: target.id };
|
|
206
|
+
}
|
|
207
|
+
case 'session.delete': {
|
|
208
|
+
if (request.params.sessionId !== activeSession.id) {
|
|
209
|
+
const err = new Error(`Session mismatch: expected ${activeSession.id}, got ${request.params.sessionId}`);
|
|
210
|
+
err.code = 'SESSION_NOT_FOUND';
|
|
211
|
+
throw err;
|
|
212
|
+
}
|
|
213
|
+
// The live session is never deletable. Its id is whatever the client last
|
|
214
|
+
// saw, so this is the only place that can be certain which one is running;
|
|
215
|
+
// deleting it would leave the turn machinery pointing at a file that is
|
|
216
|
+
// gone and every later save would silently resurrect it.
|
|
217
|
+
const targets = request.params.targetSessionIds.filter((id) => id !== activeSession.id);
|
|
218
|
+
if (targets.length === 0) {
|
|
219
|
+
const err = new Error('The active session cannot be deleted. Start a new session first.');
|
|
220
|
+
err.code = 'INVALID_REQUEST';
|
|
221
|
+
throw err;
|
|
222
|
+
}
|
|
223
|
+
const { deleted, notFound } = sessionStore.deleteSessions(canonicalRoot, targets);
|
|
224
|
+
// Re-read rather than filtering the previous list: this is the same
|
|
225
|
+
// authoritative read `initialize` uses, so the panel's list cannot drift
|
|
226
|
+
// from what is actually on disk.
|
|
227
|
+
const remaining = sessionStore.listSessions(canonicalRoot);
|
|
228
|
+
publishSessionUsage(options.modelId);
|
|
229
|
+
return {
|
|
230
|
+
deleted,
|
|
231
|
+
notFound: [...notFound, ...request.params.targetSessionIds.filter((id) => id === activeSession.id)],
|
|
232
|
+
sessions: remaining.map((s) => ({
|
|
233
|
+
sessionId: s.id,
|
|
234
|
+
title: s.messages.find((m) => m.role === 'user')?.content?.slice(0, 60) || undefined,
|
|
235
|
+
updatedAt: new Date(s.updatedAt).getTime(),
|
|
236
|
+
})),
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
case 'approval.respond': {
|
|
240
|
+
if (request.params.sessionId !== activeSession.id) {
|
|
241
|
+
const err = new Error(`Session mismatch: expected ${activeSession.id}, got ${request.params.sessionId}`);
|
|
242
|
+
err.code = 'SESSION_NOT_FOUND';
|
|
243
|
+
throw err;
|
|
244
|
+
}
|
|
245
|
+
const resolved = approvalQueue.resolve(request.params.requestId, request.params.status);
|
|
246
|
+
if (!resolved) {
|
|
247
|
+
const err = new Error(`Approval request '${request.params.requestId}' is stale or not found`);
|
|
248
|
+
err.code = 'APPROVAL_STALE';
|
|
249
|
+
throw err;
|
|
250
|
+
}
|
|
251
|
+
return { resolved: true };
|
|
252
|
+
}
|
|
253
|
+
case 'chat.cancel': {
|
|
254
|
+
if (request.params.sessionId !== activeSession.id) {
|
|
255
|
+
const err = new Error(`Session mismatch: expected ${activeSession.id}, got ${request.params.sessionId}`);
|
|
256
|
+
err.code = 'SESSION_NOT_FOUND';
|
|
257
|
+
throw err;
|
|
258
|
+
}
|
|
259
|
+
if (activeGeneration &&
|
|
260
|
+
(!request.params.targetRequestId ||
|
|
261
|
+
activeGeneration.requestId === request.params.targetRequestId)) {
|
|
262
|
+
activeGeneration.abortController.abort();
|
|
263
|
+
activeGeneration = null;
|
|
264
|
+
}
|
|
265
|
+
return { cancelled: true };
|
|
266
|
+
}
|
|
267
|
+
case 'provider.list': {
|
|
268
|
+
const config = loadConfig(customHome);
|
|
269
|
+
const activeId = options.providerId ?? getActiveConnection(config)?.id;
|
|
270
|
+
const providers = [];
|
|
271
|
+
for (const preset of CONNECT_PROVIDER_PRESET_META) {
|
|
272
|
+
const saved = config.connections?.[preset.id];
|
|
273
|
+
const virtualConnection = saved ?? {
|
|
274
|
+
id: preset.id,
|
|
275
|
+
displayName: preset.label,
|
|
276
|
+
kind: preset.kind,
|
|
277
|
+
baseUrl: preset.baseUrl,
|
|
278
|
+
defaultModel: preset.defaultModel,
|
|
279
|
+
};
|
|
280
|
+
const resolved = await resolveConnectionCredential(virtualConnection, credentialStore);
|
|
281
|
+
const legacyNvidiaKey = preset.id === 'nvidia-nim' ? config.apiKey?.trim() : undefined;
|
|
282
|
+
const hasApiKey = preset.requiresApiKey
|
|
283
|
+
? !!resolved.apiKey?.trim() || !!legacyNvidiaKey
|
|
284
|
+
: true;
|
|
285
|
+
providers.push({
|
|
286
|
+
id: preset.id,
|
|
287
|
+
label: preset.label,
|
|
288
|
+
description: preset.description,
|
|
289
|
+
requiresApiKey: preset.requiresApiKey,
|
|
290
|
+
hasApiKey,
|
|
291
|
+
isActive: preset.id === activeId,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
// Saved custom connections that are not built-in presets.
|
|
295
|
+
for (const connection of Object.values(config.connections ?? {})) {
|
|
296
|
+
if (CONNECT_PROVIDER_PRESET_META.some((preset) => preset.id === connection.id))
|
|
297
|
+
continue;
|
|
298
|
+
const resolved = await resolveConnectionCredential(connection, credentialStore);
|
|
299
|
+
const loopback = isLoopbackBaseUrl(connection.baseUrl);
|
|
300
|
+
providers.push({
|
|
301
|
+
id: connection.id,
|
|
302
|
+
label: connection.displayName,
|
|
303
|
+
description: connection.baseUrl,
|
|
304
|
+
requiresApiKey: !loopback,
|
|
305
|
+
hasApiKey: loopback || !!resolved.apiKey?.trim(),
|
|
306
|
+
isActive: connection.id === activeId,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
return { providers, activeProviderId: activeId };
|
|
310
|
+
}
|
|
311
|
+
case 'provider.connect': {
|
|
312
|
+
const { providerId, apiKey } = request.params;
|
|
313
|
+
const preset = findProviderPreset(providerId);
|
|
314
|
+
const saved = loadConfig(customHome).connections?.[providerId];
|
|
315
|
+
if (!preset && !saved) {
|
|
316
|
+
const err = new Error(`Unknown provider "${providerId}".`);
|
|
317
|
+
err.code = 'INVALID_REQUEST';
|
|
318
|
+
throw err;
|
|
319
|
+
}
|
|
320
|
+
const requiresApiKey = preset ? preset.requiresApiKey : !isLoopbackBaseUrl(saved.baseUrl);
|
|
321
|
+
const base = saved ?? {
|
|
322
|
+
id: preset.id,
|
|
323
|
+
displayName: preset.label,
|
|
324
|
+
kind: preset.kind,
|
|
325
|
+
baseUrl: preset.baseUrl,
|
|
326
|
+
defaultModel: preset.defaultModel,
|
|
327
|
+
};
|
|
328
|
+
let connection = apiKey ? { ...base, apiKey } : base;
|
|
329
|
+
if (!apiKey && requiresApiKey) {
|
|
330
|
+
const resolved = await resolveConnectionCredential(base, credentialStore);
|
|
331
|
+
if (!resolved.apiKey?.trim()) {
|
|
332
|
+
const err = new Error(`An API key is required to connect to ${base.displayName || providerId}.`);
|
|
333
|
+
err.code = 'INVALID_REQUEST';
|
|
334
|
+
throw err;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
// Mirror the CLI /connect flow: Windows Credential Manager on win32,
|
|
338
|
+
// plaintext config (mode 0600) elsewhere.
|
|
339
|
+
const persisted = process.platform === 'win32' && connection.apiKey?.trim()
|
|
340
|
+
? await storeConnectionCredential(connection, credentialStore)
|
|
341
|
+
: connection;
|
|
342
|
+
saveConnection(persisted, customHome);
|
|
343
|
+
options.providerId = providerId;
|
|
344
|
+
invalidateProvider();
|
|
345
|
+
return { providerId, connected: true };
|
|
346
|
+
}
|
|
347
|
+
case 'model.list': {
|
|
348
|
+
const explicitId = request.params.providerId;
|
|
349
|
+
// The adapter memoises its catalog, so an explicit refresh has to reach
|
|
350
|
+
// `discoverModels` or the list never changes within a sidecar session.
|
|
351
|
+
const forceRefresh = request.params.refresh === true;
|
|
352
|
+
const config = loadConfig(customHome);
|
|
353
|
+
const activeId = options.providerId ?? getActiveConnection(config)?.id;
|
|
354
|
+
const injected = dependencies?.provider;
|
|
355
|
+
let providerId;
|
|
356
|
+
let adapter;
|
|
357
|
+
if (injected && (!explicitId || explicitId === injected.id)) {
|
|
358
|
+
providerId = explicitId ?? injected.id;
|
|
359
|
+
adapter = injected;
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
const target = explicitId ?? activeId;
|
|
363
|
+
if (!target) {
|
|
364
|
+
const err = new Error('No provider configured. Connect a provider first.');
|
|
365
|
+
err.code = 'INVALID_REQUEST';
|
|
366
|
+
throw err;
|
|
367
|
+
}
|
|
368
|
+
providerId = target;
|
|
369
|
+
adapter =
|
|
370
|
+
target === activeId ? await getProvider() : await buildAdapterForProvider(target);
|
|
371
|
+
}
|
|
372
|
+
const MAX_MODELS = 400;
|
|
373
|
+
const entries = await adapter.discoverModels(undefined, forceRefresh);
|
|
374
|
+
// A preset may declare free models its catalog cannot prove: NVIDIA NIM
|
|
375
|
+
// prices nothing and runs on trial credits, OrcaRouter publishes no
|
|
376
|
+
// `pricing` but routes one free alias. Resolved by connection id, never
|
|
377
|
+
// by adapter brand, so an aggregator cannot inherit a free declaration.
|
|
378
|
+
const freePolicy = freeModelPolicyFor(providerId);
|
|
379
|
+
const models = entries
|
|
380
|
+
.filter((entry) => entry.id.length > 0 && entry.id.length <= 300)
|
|
381
|
+
.map((entry) => ({
|
|
382
|
+
id: entry.id,
|
|
383
|
+
// Free means "the provider says this costs nothing". The router
|
|
384
|
+
// heuristic is passed as the fallback classification only; it is
|
|
385
|
+
// never treated as evidence, or an aggregator's entire catalog
|
|
386
|
+
// reads as free.
|
|
387
|
+
isFree: isFreeModelOption(entry, router.classifyModel(entry.id), freePolicy),
|
|
388
|
+
ownedBy: entry.owned_by && entry.owned_by.length <= 120 ? entry.owned_by : undefined,
|
|
389
|
+
}))
|
|
390
|
+
.sort((a, b) => a.isFree === b.isFree ? a.id.localeCompare(b.id) : a.isFree ? -1 : 1);
|
|
391
|
+
const truncated = models.length > MAX_MODELS;
|
|
392
|
+
return {
|
|
393
|
+
providerId,
|
|
394
|
+
models: truncated ? models.slice(0, MAX_MODELS) : models,
|
|
395
|
+
truncated,
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
case 'chat.send': {
|
|
399
|
+
if (request.params.sessionId !== activeSession.id) {
|
|
400
|
+
const err = new Error(`Session mismatch: expected ${activeSession.id}, got ${request.params.sessionId}`);
|
|
401
|
+
err.code = 'SESSION_NOT_FOUND';
|
|
402
|
+
throw err;
|
|
403
|
+
}
|
|
404
|
+
if (activeGeneration !== null) {
|
|
405
|
+
const err = new Error('Another generation is already in flight for this session');
|
|
406
|
+
err.code = 'BUSY';
|
|
407
|
+
throw err;
|
|
408
|
+
}
|
|
409
|
+
// Validate selection context against workspace jail
|
|
410
|
+
if (request.params.context?.selection) {
|
|
411
|
+
try {
|
|
412
|
+
resolveInJail(canonicalRoot, request.params.context.selection.relativePath);
|
|
413
|
+
}
|
|
414
|
+
catch (jailErr) {
|
|
415
|
+
const err = new Error(jailErr?.message ?? 'Selection path is outside workspace jail');
|
|
416
|
+
err.code = 'WORKSPACE_DENIED';
|
|
417
|
+
throw err;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
const workspaceSource = createWorkspaceFileSource(canonicalRoot);
|
|
421
|
+
const expansion = await expandMentions(request.params.text, workspaceSource);
|
|
422
|
+
let turnPrompt = expansion.text;
|
|
423
|
+
if (request.params.context?.selection) {
|
|
424
|
+
const sel = request.params.context.selection;
|
|
425
|
+
turnPrompt = `Active selection in workspace file "${sel.relativePath}" (lines ${sel.startLine}-${sel.endLine}):\n\`\`\`\n${sel.text ?? ''}\n\`\`\`\n\n${turnPrompt}`;
|
|
426
|
+
}
|
|
427
|
+
// Plan mode is a read-only turn: the policy refuses every mutating tool,
|
|
428
|
+
// so the planning instruction cannot be talked out of safety by the model.
|
|
429
|
+
// An absent mode is `act`, which keeps older clients working unchanged.
|
|
430
|
+
const isPlan = request.params.mode === 'plan';
|
|
431
|
+
if (isPlan) {
|
|
432
|
+
turnPrompt = createAgentTask(turnPrompt, 'Plan');
|
|
433
|
+
}
|
|
434
|
+
const turnPolicy = isPlan ? new PolicyManager({ readOnly: true }) : policy;
|
|
435
|
+
const abortController = new AbortController();
|
|
436
|
+
const generationPromise = (async () => {
|
|
437
|
+
// Tracked from the router's own announcements so the reported window
|
|
438
|
+
// belongs to the model that actually served the turn, not the one the
|
|
439
|
+
// user merely pinned (the router may have failed over).
|
|
440
|
+
let turnModelId = options.modelId;
|
|
441
|
+
try {
|
|
442
|
+
const trimmedPrompt = request.params.text.trim();
|
|
443
|
+
// The extension can switch the live lane off; anything else keeps it on.
|
|
444
|
+
const webSearchEnabled = process.env.MODERADO_WEB_SEARCH_ENABLED !== 'false';
|
|
445
|
+
const liveSearchTool = webSearchEnabled ? tools.get('web_search') : undefined;
|
|
446
|
+
let liveSearch;
|
|
447
|
+
if (!isPlan && trimmedPrompt && shouldFastRouteWebSearch(trimmedPrompt) && liveSearchTool) {
|
|
448
|
+
const toolCallId = `search-${Date.now()}`;
|
|
449
|
+
hostStream.emit({
|
|
450
|
+
type: 'tool_call_initiated',
|
|
451
|
+
toolCallId,
|
|
452
|
+
toolName: 'web_search',
|
|
453
|
+
parameters: { query: trimmedPrompt },
|
|
454
|
+
timestamp: Date.now(),
|
|
455
|
+
});
|
|
456
|
+
liveSearch = await liveSearchTool.execute({ query: trimmedPrompt, maxResults: 5 }, { workspaceRoot: canonicalRoot, abortSignal: abortController.signal });
|
|
457
|
+
hostStream.emit({
|
|
458
|
+
type: 'tool_result',
|
|
459
|
+
toolCallId,
|
|
460
|
+
result: liveSearch,
|
|
461
|
+
timestamp: Date.now(),
|
|
462
|
+
});
|
|
463
|
+
let hasProvider = true;
|
|
464
|
+
try {
|
|
465
|
+
await getProvider();
|
|
466
|
+
}
|
|
467
|
+
catch {
|
|
468
|
+
hasProvider = false;
|
|
469
|
+
}
|
|
470
|
+
if (!hasProvider) {
|
|
471
|
+
const answer = formatDirectWebSearchAnswer(liveSearch);
|
|
472
|
+
hostStream.emit({
|
|
473
|
+
type: 'assistant_delta',
|
|
474
|
+
delta: answer,
|
|
475
|
+
timestamp: Date.now(),
|
|
476
|
+
});
|
|
477
|
+
activeSession.messages = [
|
|
478
|
+
...activeSession.messages,
|
|
479
|
+
{ role: 'user', content: turnPrompt },
|
|
480
|
+
{ role: 'assistant', content: answer },
|
|
481
|
+
];
|
|
482
|
+
sessionStore.save(activeSession);
|
|
483
|
+
// No model served this answer, but the selected model's window
|
|
484
|
+
// is still the session's denominator.
|
|
485
|
+
publishSessionUsage(turnModelId);
|
|
486
|
+
// Close the turn explicitly. The agent loop never runs on this path,
|
|
487
|
+
// so nothing else emits `completion` and the panel would spin forever.
|
|
488
|
+
hostStream.emit({
|
|
489
|
+
type: 'completion',
|
|
490
|
+
status: 'completed',
|
|
491
|
+
totalSteps: 1,
|
|
492
|
+
timestamp: Date.now(),
|
|
493
|
+
});
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
// Resolved lazily so a keyless first run can start and use the manager.
|
|
498
|
+
const provider = await getProvider();
|
|
499
|
+
const evidenceTask = liveSearch ? buildSearchAnswerTask(turnPrompt, liveSearch) : undefined;
|
|
500
|
+
// The per-category policy is applied here, in front of the queue, so
|
|
501
|
+
// the agent loop's approval boundary is unchanged and every
|
|
502
|
+
// auto-approved action still emits its approval events.
|
|
503
|
+
const turnApprovalHandler = new AutoApproveHandler(approvalQueue, parseAutoApproveSettings(request.params.autoApprove));
|
|
504
|
+
const result = await loop.run(evidenceTask ?? turnPrompt, {
|
|
505
|
+
workspaceRoot: canonicalRoot,
|
|
506
|
+
provider,
|
|
507
|
+
tools,
|
|
508
|
+
approvalHandler: turnApprovalHandler,
|
|
509
|
+
router,
|
|
510
|
+
policy: turnPolicy,
|
|
511
|
+
routeOptions: options.modelId ? { pinnedModelId: options.modelId } : undefined,
|
|
512
|
+
eventListener: (event) => {
|
|
513
|
+
if (event.type === 'model_change')
|
|
514
|
+
turnModelId = event.newModelId;
|
|
515
|
+
hostStream.emit(event);
|
|
516
|
+
// The router just named the model serving this turn, so the
|
|
517
|
+
// meter gets its denominator at turn start (and on every
|
|
518
|
+
// failover) instead of waiting for the turn to end.
|
|
519
|
+
if (event.type === 'model_change')
|
|
520
|
+
publishSessionUsage(turnModelId);
|
|
521
|
+
},
|
|
522
|
+
signal: abortController.signal,
|
|
523
|
+
conversationHistory: activeSession.messages,
|
|
524
|
+
});
|
|
525
|
+
activeSession.messages = evidenceTask
|
|
526
|
+
? replaceEvidenceTurn(result.messages, evidenceTask, turnPrompt)
|
|
527
|
+
: result.messages;
|
|
528
|
+
if (result.usage) {
|
|
529
|
+
activeSession.usage = {
|
|
530
|
+
promptTokens: (activeSession.usage.promptTokens ?? 0) + result.usage.promptTokens,
|
|
531
|
+
completionTokens: (activeSession.usage.completionTokens ?? 0) + result.usage.completionTokens,
|
|
532
|
+
totalTokens: (activeSession.usage.totalTokens ?? 0) + result.usage.totalTokens,
|
|
533
|
+
costKnown: false,
|
|
534
|
+
available: true,
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
sessionStore.save(activeSession);
|
|
538
|
+
// Cumulative session usage, so the panel can meter the context the
|
|
539
|
+
// conversation has actually filled. `contextWindow` is omitted when
|
|
540
|
+
// curated metadata does not know the model, and the panel then shows
|
|
541
|
+
// no meter rather than dividing by a guess.
|
|
542
|
+
publishSessionUsage(turnModelId);
|
|
543
|
+
}
|
|
544
|
+
catch (err) {
|
|
545
|
+
if (abortController.signal.aborted) {
|
|
546
|
+
hostStream.emit({
|
|
547
|
+
type: 'cancellation',
|
|
548
|
+
reason: 'Aborted by user',
|
|
549
|
+
timestamp: Date.now(),
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
else {
|
|
553
|
+
// Surface provider/config failures so the UI can offer the model
|
|
554
|
+
// manager instead of leaving the composer stuck in a busy state.
|
|
555
|
+
hostStream.emit({
|
|
556
|
+
type: 'error',
|
|
557
|
+
code: err?.code ?? 'TURN_FAILED',
|
|
558
|
+
message: err?.message ?? String(err),
|
|
559
|
+
recoverable: false,
|
|
560
|
+
timestamp: Date.now(),
|
|
561
|
+
});
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
finally {
|
|
565
|
+
const thisReqId = request.id;
|
|
566
|
+
if (activeGeneration && activeGeneration.requestId === thisReqId) {
|
|
567
|
+
activeGeneration = null;
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
})();
|
|
571
|
+
activeGeneration = {
|
|
572
|
+
requestId: request.id,
|
|
573
|
+
abortController,
|
|
574
|
+
promise: generationPromise,
|
|
575
|
+
};
|
|
576
|
+
currentPromise = generationPromise;
|
|
577
|
+
return { accepted: true };
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
};
|
|
581
|
+
const waitForActiveGeneration = async () => {
|
|
582
|
+
if (currentPromise) {
|
|
583
|
+
await currentPromise;
|
|
584
|
+
}
|
|
585
|
+
};
|
|
586
|
+
const close = async () => {
|
|
587
|
+
if (activeGeneration) {
|
|
588
|
+
activeGeneration.abortController.abort();
|
|
589
|
+
await activeGeneration.promise.catch(() => { });
|
|
590
|
+
activeGeneration = null;
|
|
591
|
+
}
|
|
592
|
+
approvalQueue.close();
|
|
593
|
+
};
|
|
594
|
+
return {
|
|
595
|
+
approvalQueue,
|
|
596
|
+
canonicalWorkspaceRoot: canonicalRoot,
|
|
597
|
+
initialize,
|
|
598
|
+
dispatch,
|
|
599
|
+
waitForActiveGeneration,
|
|
600
|
+
close,
|
|
601
|
+
};
|
|
602
|
+
}
|
|
603
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/host/runtime.ts"],"names":[],"mappings":"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"}
|