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.
Files changed (115) hide show
  1. package/README.md +215 -215
  2. package/dist/args.js +29 -29
  3. package/dist/budget.d.ts +6 -0
  4. package/dist/budget.d.ts.map +1 -0
  5. package/dist/budget.js +25 -0
  6. package/dist/budget.js.map +1 -0
  7. package/dist/chat_mode.d.ts +14 -0
  8. package/dist/chat_mode.d.ts.map +1 -0
  9. package/dist/chat_mode.js +13 -0
  10. package/dist/chat_mode.js.map +1 -0
  11. package/dist/commands/chat.d.ts +5 -1
  12. package/dist/commands/chat.d.ts.map +1 -1
  13. package/dist/commands/chat.js +172 -43
  14. package/dist/commands/chat.js.map +1 -1
  15. package/dist/commands/host.d.ts +4 -0
  16. package/dist/commands/host.d.ts.map +1 -0
  17. package/dist/commands/host.js +30 -0
  18. package/dist/commands/host.js.map +1 -0
  19. package/dist/commands/models.d.ts.map +1 -1
  20. package/dist/commands/models.js +63 -16
  21. package/dist/commands/models.js.map +1 -1
  22. package/dist/config.d.ts +73 -0
  23. package/dist/config.d.ts.map +1 -1
  24. package/dist/config.js +116 -0
  25. package/dist/config.js.map +1 -1
  26. package/dist/host/approval_queue.d.ts +9 -0
  27. package/dist/host/approval_queue.d.ts.map +1 -0
  28. package/dist/host/approval_queue.js +63 -0
  29. package/dist/host/approval_queue.js.map +1 -0
  30. package/dist/host/auto_approve.d.ts +22 -0
  31. package/dist/host/auto_approve.d.ts.map +1 -0
  32. package/dist/host/auto_approve.js +36 -0
  33. package/dist/host/auto_approve.js.map +1 -0
  34. package/dist/host/ndjson.d.ts +3 -0
  35. package/dist/host/ndjson.d.ts.map +1 -0
  36. package/dist/host/ndjson.js +68 -0
  37. package/dist/host/ndjson.js.map +1 -0
  38. package/dist/host/protocol_server.d.ts +9 -0
  39. package/dist/host/protocol_server.d.ts.map +1 -0
  40. package/dist/host/protocol_server.js +101 -0
  41. package/dist/host/protocol_server.js.map +1 -0
  42. package/dist/host/runtime.d.ts +30 -0
  43. package/dist/host/runtime.d.ts.map +1 -0
  44. package/dist/host/runtime.js +603 -0
  45. package/dist/host/runtime.js.map +1 -0
  46. package/dist/model_pricing.d.ts +14 -1
  47. package/dist/model_pricing.d.ts.map +1 -1
  48. package/dist/model_pricing.js +52 -0
  49. package/dist/model_pricing.js.map +1 -1
  50. package/dist/repo_map.d.ts +3 -0
  51. package/dist/repo_map.d.ts.map +1 -0
  52. package/dist/repo_map.js +29 -0
  53. package/dist/repo_map.js.map +1 -0
  54. package/dist/sessions.d.ts +22 -15
  55. package/dist/sessions.d.ts.map +1 -1
  56. package/dist/sessions.js +16 -1
  57. package/dist/sessions.js.map +1 -1
  58. package/dist/skills.d.ts +2 -2
  59. package/dist/skills.js +2 -2
  60. package/dist/ui/model_selector.d.ts +2 -2
  61. package/dist/ui/model_selector.d.ts.map +1 -1
  62. package/dist/ui/model_selector.js +25 -16
  63. package/dist/ui/model_selector.js.map +1 -1
  64. package/dist/ui/provider_connect.d.ts +6 -3
  65. package/dist/ui/provider_connect.d.ts.map +1 -1
  66. package/dist/ui/provider_connect.js +41 -14
  67. package/dist/ui/provider_connect.js.map +1 -1
  68. package/dist/ui/renderer.d.ts +4 -0
  69. package/dist/ui/renderer.d.ts.map +1 -1
  70. package/dist/ui/renderer.js +36 -0
  71. package/dist/ui/renderer.js.map +1 -1
  72. package/dist/ui/session_screen.d.ts +32 -0
  73. package/dist/ui/session_screen.d.ts.map +1 -0
  74. package/dist/ui/session_screen.js +148 -0
  75. package/dist/ui/session_screen.js.map +1 -0
  76. package/dist/ui/session_terminal.d.ts +46 -0
  77. package/dist/ui/session_terminal.d.ts.map +1 -0
  78. package/dist/ui/session_terminal.js +342 -0
  79. package/dist/ui/session_terminal.js.map +1 -0
  80. package/dist/ui/welcome.d.ts +11 -0
  81. package/dist/ui/welcome.d.ts.map +1 -1
  82. package/dist/ui/welcome.js +49 -32
  83. package/dist/ui/welcome.js.map +1 -1
  84. package/dist/vendor/contracts/events.d.ts +159 -0
  85. package/dist/vendor/contracts/events.d.ts.map +1 -1
  86. package/dist/vendor/contracts/events.js +12 -0
  87. package/dist/vendor/contracts/events.js.map +1 -1
  88. package/dist/vendor/contracts/host_protocol.d.ts +3545 -0
  89. package/dist/vendor/contracts/host_protocol.d.ts.map +1 -0
  90. package/dist/vendor/contracts/host_protocol.js +292 -0
  91. package/dist/vendor/contracts/host_protocol.js.map +1 -0
  92. package/dist/vendor/contracts/provider.d.ts +1 -0
  93. package/dist/vendor/contracts/provider.d.ts.map +1 -1
  94. package/dist/vendor/contracts/provider.js +6 -0
  95. package/dist/vendor/contracts/provider.js.map +1 -1
  96. package/dist/vendor/core/agent.d.ts +2 -1
  97. package/dist/vendor/core/agent.d.ts.map +1 -1
  98. package/dist/vendor/core/agent.js +145 -31
  99. package/dist/vendor/core/agent.js.map +1 -1
  100. package/dist/vendor/providers/model_discovery.d.ts +2 -2
  101. package/dist/vendor/providers/model_discovery.d.ts.map +1 -1
  102. package/dist/vendor/providers/model_discovery.js +4 -2
  103. package/dist/vendor/providers/model_discovery.js.map +1 -1
  104. package/dist/vendor/providers/nvidia/nvidia_adapter.d.ts.map +1 -1
  105. package/dist/vendor/providers/nvidia/nvidia_adapter.js +1 -0
  106. package/dist/vendor/providers/nvidia/nvidia_adapter.js.map +1 -1
  107. package/dist/vendor/providers/nvidia/sse_parser.d.ts +2 -1
  108. package/dist/vendor/providers/nvidia/sse_parser.d.ts.map +1 -1
  109. package/dist/vendor/providers/nvidia/sse_parser.js +30 -16
  110. package/dist/vendor/providers/nvidia/sse_parser.js.map +1 -1
  111. package/dist/web_search_route.d.ts +16 -0
  112. package/dist/web_search_route.d.ts.map +1 -0
  113. package/dist/web_search_route.js +60 -0
  114. package/dist/web_search_route.js.map +1 -0
  115. 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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"}