@pellux/goodvibes-sdk 0.34.1 → 0.35.0

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 (102) hide show
  1. package/dist/contracts/artifacts/operator-contract.json +4 -1
  2. package/dist/platform/agents/orchestrator-runner.d.ts.map +1 -1
  3. package/dist/platform/agents/orchestrator-runner.js +17 -3
  4. package/dist/platform/agents/wrfc-controller.d.ts.map +1 -1
  5. package/dist/platform/agents/wrfc-controller.js +10 -4
  6. package/dist/platform/automation/manager-runtime-delivery.d.ts +1 -1
  7. package/dist/platform/automation/manager-runtime-delivery.d.ts.map +1 -1
  8. package/dist/platform/automation/manager-runtime-delivery.js +4 -3
  9. package/dist/platform/channels/policy-manager.d.ts +8 -0
  10. package/dist/platform/channels/policy-manager.d.ts.map +1 -1
  11. package/dist/platform/channels/policy-manager.js +43 -1
  12. package/dist/platform/companion/companion-chat-manager.d.ts +1 -0
  13. package/dist/platform/companion/companion-chat-manager.d.ts.map +1 -1
  14. package/dist/platform/companion/companion-chat-manager.js +10 -0
  15. package/dist/platform/companion/companion-chat-routes.js +1 -0
  16. package/dist/platform/companion/companion-chat-types.d.ts +1 -0
  17. package/dist/platform/companion/companion-chat-types.d.ts.map +1 -1
  18. package/dist/platform/control-plane/approval-broker.d.ts +7 -0
  19. package/dist/platform/control-plane/approval-broker.d.ts.map +1 -1
  20. package/dist/platform/control-plane/approval-broker.js +30 -0
  21. package/dist/platform/control-plane/method-catalog-channels.d.ts.map +1 -1
  22. package/dist/platform/control-plane/method-catalog-channels.js +2 -0
  23. package/dist/platform/control-plane/method-catalog-email.d.ts.map +1 -1
  24. package/dist/platform/control-plane/method-catalog-email.js +1 -0
  25. package/dist/platform/core/compaction-sections.d.ts +0 -2
  26. package/dist/platform/core/compaction-sections.d.ts.map +1 -1
  27. package/dist/platform/core/compaction-sections.js +16 -8
  28. package/dist/platform/core/compaction-types.d.ts +7 -1
  29. package/dist/platform/core/compaction-types.d.ts.map +1 -1
  30. package/dist/platform/core/compaction-types.js +6 -0
  31. package/dist/platform/core/context-compaction.d.ts +20 -4
  32. package/dist/platform/core/context-compaction.d.ts.map +1 -1
  33. package/dist/platform/core/context-compaction.js +36 -8
  34. package/dist/platform/core/conversation-utils.js +1 -1
  35. package/dist/platform/core/conversation.js +1 -1
  36. package/dist/platform/core/orchestrator-context-runtime.js +1 -1
  37. package/dist/platform/core/orchestrator-tool-runtime.js +1 -1
  38. package/dist/platform/core/orchestrator-turn-loop.d.ts.map +1 -1
  39. package/dist/platform/core/orchestrator-turn-loop.js +4 -2
  40. package/dist/platform/core/orchestrator.d.ts +12 -0
  41. package/dist/platform/core/orchestrator.d.ts.map +1 -1
  42. package/dist/platform/core/orchestrator.js +36 -8
  43. package/dist/platform/daemon/http/home-graph-routes.d.ts.map +1 -1
  44. package/dist/platform/daemon/http/home-graph-routes.js +2 -1
  45. package/dist/platform/daemon/http/project-planning-routes.d.ts.map +1 -1
  46. package/dist/platform/daemon/http/project-planning-routes.js +2 -1
  47. package/dist/platform/hooks/dispatcher.d.ts.map +1 -1
  48. package/dist/platform/hooks/dispatcher.js +4 -0
  49. package/dist/platform/hooks/runners/command.d.ts.map +1 -1
  50. package/dist/platform/hooks/runners/command.js +11 -2
  51. package/dist/platform/integrations/delivery.d.ts.map +1 -1
  52. package/dist/platform/integrations/delivery.js +0 -2
  53. package/dist/platform/intelligence/import-graph.d.ts.map +1 -1
  54. package/dist/platform/intelligence/import-graph.js +8 -0
  55. package/dist/platform/knowledge/extractors.d.ts.map +1 -1
  56. package/dist/platform/knowledge/extractors.js +30 -4
  57. package/dist/platform/mcp/client.d.ts +2 -0
  58. package/dist/platform/mcp/client.d.ts.map +1 -1
  59. package/dist/platform/mcp/client.js +17 -3
  60. package/dist/platform/mcp/registry.d.ts.map +1 -1
  61. package/dist/platform/mcp/registry.js +4 -0
  62. package/dist/platform/media/builtin-generation-providers.d.ts.map +1 -1
  63. package/dist/platform/media/builtin-generation-providers.js +2 -3
  64. package/dist/platform/media/provider-registry.d.ts.map +1 -1
  65. package/dist/platform/media/provider-registry.js +3 -1
  66. package/dist/platform/multimodal/service.d.ts.map +1 -1
  67. package/dist/platform/multimodal/service.js +18 -3
  68. package/dist/platform/providers/anthropic-sse-assembler.d.ts.map +1 -1
  69. package/dist/platform/providers/anthropic-sse-assembler.js +24 -0
  70. package/dist/platform/providers/capabilities.d.ts +6 -0
  71. package/dist/platform/providers/capabilities.d.ts.map +1 -1
  72. package/dist/platform/providers/capabilities.js +20 -1
  73. package/dist/platform/providers/gemini.d.ts.map +1 -1
  74. package/dist/platform/providers/gemini.js +55 -46
  75. package/dist/platform/providers/index.d.ts +1 -0
  76. package/dist/platform/providers/index.d.ts.map +1 -1
  77. package/dist/platform/providers/index.js +1 -0
  78. package/dist/platform/providers/model-limits.d.ts.map +1 -1
  79. package/dist/platform/providers/model-limits.js +14 -2
  80. package/dist/platform/runtime/store/domains/conversation.d.ts +0 -2
  81. package/dist/platform/runtime/store/domains/conversation.d.ts.map +1 -1
  82. package/dist/platform/runtime/store/domains/conversation.js +0 -1
  83. package/dist/platform/runtime/store/helpers/reducers/conversation.d.ts.map +1 -1
  84. package/dist/platform/runtime/store/helpers/reducers/conversation.js +20 -2
  85. package/dist/platform/runtime/store/helpers/reducers/lifecycle.d.ts.map +1 -1
  86. package/dist/platform/runtime/store/helpers/reducers/lifecycle.js +3 -0
  87. package/dist/platform/runtime/store/helpers/reducers/sync.d.ts.map +1 -1
  88. package/dist/platform/runtime/store/helpers/reducers/sync.js +7 -1
  89. package/dist/platform/runtime/ui-read-models-core.d.ts.map +1 -1
  90. package/dist/platform/runtime/ui-read-models-core.js +4 -1
  91. package/dist/platform/tools/agent/index.d.ts +1 -0
  92. package/dist/platform/tools/agent/index.d.ts.map +1 -1
  93. package/dist/platform/tools/agent/index.js +1 -0
  94. package/dist/platform/tools/agent/predicates.d.ts +15 -0
  95. package/dist/platform/tools/agent/predicates.d.ts.map +1 -0
  96. package/dist/platform/tools/agent/predicates.js +15 -0
  97. package/dist/platform/utils/error-display.d.ts.map +1 -1
  98. package/dist/platform/utils/error-display.js +14 -6
  99. package/dist/platform/version.js +1 -1
  100. package/dist/platform/voice/providers/shared.d.ts.map +1 -1
  101. package/dist/platform/voice/providers/shared.js +2 -3
  102. package/package.json +9 -9
@@ -1 +1 @@
1
- {"version":3,"file":"extractors.d.ts","sourceRoot":"","sources":["../../../src/platform/knowledge/extractors.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAsB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAKhF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAI5D,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,yBAAyB,CAAC;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAggBD,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,UAAU,GAAG,UAAU,CAAC,EAC9D,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,yBAAyB,CAAC,CA4CpC"}
1
+ {"version":3,"file":"extractors.d.ts","sourceRoot":"","sources":["../../../src/platform/knowledge/extractors.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAsB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAKhF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAK5D,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,yBAAyB,CAAC;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAwhBD,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,UAAU,GAAG,UAAU,CAAC,EAC9D,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,yBAAyB,CAAC,CAiDpC"}
@@ -6,6 +6,7 @@ import { extractPdf } from './pdf-extractor.js';
6
6
  import { KNOWLEDGE_MAX_STRUCTURE_SEARCH_TEXT_CHARS } from './extraction-policy.js';
7
7
  import { summarizeError } from '../utils/error-display.js';
8
8
  import { logger } from '../utils/logger.js';
9
+ import { isRecord } from '../utils/record-coerce.js';
9
10
  function decodeHtmlEntities(value) {
10
11
  return value
11
12
  .replace(/ /g, ' ')
@@ -194,7 +195,7 @@ function extractJson(buffer) {
194
195
  const text = decodeBuffer(buffer);
195
196
  try {
196
197
  const parsed = JSON.parse(text);
197
- const rootKeys = typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)
198
+ const rootKeys = isRecord(parsed)
198
199
  ? Object.keys(parsed).slice(0, 24)
199
200
  : [];
200
201
  const title = rootKeys.length > 0 ? `JSON object: ${rootKeys.slice(0, 3).join(', ')}` : 'JSON document';
@@ -502,6 +503,26 @@ function chooseFormat(artifact) {
502
503
  return 'pdf';
503
504
  return 'unknown';
504
505
  }
506
+ async function extractOfficeWithFallback(buffer, format, extractor) {
507
+ try {
508
+ return await extractor(buffer);
509
+ }
510
+ catch (error) {
511
+ const parseWarning = `${format} parsing failed; used text fallback: ${summarizeError(error)}`;
512
+ logger.debug('Knowledge extraction: office parse failed; using text fallback', {
513
+ format,
514
+ error: summarizeError(error),
515
+ });
516
+ const fallback = extractTextLike(buffer, format, `${format}-fallback`);
517
+ return {
518
+ ...fallback,
519
+ metadata: {
520
+ ...fallback.metadata,
521
+ warnings: [parseWarning],
522
+ },
523
+ };
524
+ }
525
+ }
505
526
  export async function extractKnowledgeArtifact(artifact, buffer) {
506
527
  const format = chooseFormat(artifact);
507
528
  switch (format) {
@@ -520,12 +541,17 @@ export async function extractKnowledgeArtifact(artifact, buffer) {
520
541
  case 'yaml':
521
542
  return extractYaml(buffer);
522
543
  case 'docx':
523
- return extractDocx(buffer);
544
+ return extractOfficeWithFallback(buffer, 'docx', extractDocx);
524
545
  case 'xlsx':
525
- return extractXlsx(buffer);
546
+ return extractOfficeWithFallback(buffer, 'xlsx', extractXlsx);
526
547
  case 'pptx':
527
- return extractPptx(buffer);
548
+ return extractOfficeWithFallback(buffer, 'pptx', extractPptx);
528
549
  case 'pdf':
550
+ // PDFs must reject when no readable text can be extracted. extractPdf already
551
+ // performs its own pdfjs -> raw-stream fallbacks internally and only throws as a
552
+ // terminal failure; do NOT wrap it in the office text fallback. Decoding PDF binary
553
+ // as text yields garbage and would swallow 'PDF extraction failed', which callers
554
+ // rely on to know OCR / a dedicated PDF provider is required.
529
555
  return extractPdf(buffer);
530
556
  case 'text':
531
557
  return extractTextLike(buffer, 'text', 'text');
@@ -49,6 +49,8 @@ export declare class McpClient {
49
49
  private readLoopRunning;
50
50
  private restartCount;
51
51
  private initialized;
52
+ /** Set true by disconnect() to suppress the read-loop's auto-restart. Reset on each successful _startProcess(). */
53
+ private intentionalClose;
52
54
  /** Cache: tool name → full schema (populated lazily on first callTool) */
53
55
  private schemaCache;
54
56
  /** Minimal tool info loaded at connect time (name + description only) */
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/platform/mcp/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/platform/mcp/client.ts"],"names":[],"mappings":"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"}
@@ -45,6 +45,8 @@ export class McpClient {
45
45
  readLoopRunning = false;
46
46
  restartCount = 0;
47
47
  initialized = false;
48
+ /** Set true by disconnect() to suppress the read-loop's auto-restart. Reset on each successful _startProcess(). */
49
+ intentionalClose = false;
48
50
  /** Cache: tool name → full schema (populated lazily on first callTool) */
49
51
  schemaCache = new Map();
50
52
  /** Minimal tool info loaded at connect time (name + description only) */
@@ -133,6 +135,10 @@ export class McpClient {
133
135
  * disconnect — Stop the server process and clean up.
134
136
  */
135
137
  async disconnect() {
138
+ // Mark this as a deliberate shutdown so the read-loop finally does not
139
+ // resurrect the process via _scheduleRestart(). Set synchronously before
140
+ // any await so it is already true when the detached read loop runs.
141
+ this.intentionalClose = true;
136
142
  if (!this.proc)
137
143
  return;
138
144
  // Reject all pending requests
@@ -176,6 +182,7 @@ export class McpClient {
176
182
  });
177
183
  this.buffer = '';
178
184
  this.restartCount = 0;
185
+ this.intentionalClose = false;
179
186
  this._startReadLoop();
180
187
  }
181
188
  catch (err) {
@@ -275,8 +282,11 @@ export class McpClient {
275
282
  pending.reject(new Error(`McpClient(${this.config.name}): process exited unexpectedly`));
276
283
  }
277
284
  this.pendingRequests.clear();
278
- // Auto-restart if process crashed and we haven't exceeded retry limit
279
- if (this.restartCount < MAX_RESTART_ATTEMPTS) {
285
+ // Auto-restart only on an unexpected crash never after a deliberate disconnect.
286
+ if (this.intentionalClose) {
287
+ // Deliberate shutdown: leave the process down.
288
+ }
289
+ else if (this.restartCount < MAX_RESTART_ATTEMPTS) {
280
290
  this._scheduleRestart();
281
291
  }
282
292
  else {
@@ -422,13 +432,17 @@ export class McpClient {
422
432
  const delay = RESTART_DELAY_MS * this.restartCount;
423
433
  logger.info('McpClient: scheduling restart', { server: this.config.name, attempt: this.restartCount, delayMs: delay });
424
434
  const timer = setTimeout(async () => {
435
+ if (this.intentionalClose)
436
+ return; // Deliberately disconnected — do not restart
425
437
  if (this.proc && this.isConnected)
426
438
  return; // Already restarted by something else
427
439
  try {
428
440
  await this._startProcess();
429
441
  await this._initialize();
430
- // Invalidate tool cache so it's re-fetched after restart
442
+ // Invalidate tool caches so they're re-fetched after restart (the
443
+ // restarted server may advertise changed tool lists or schemas).
431
444
  this.toolInfoCache = null;
445
+ this.schemaCache.clear();
432
446
  logger.info('McpClient: restart successful', { server: this.config.name });
433
447
  }
434
448
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/platform/mcp/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/platform/mcp/registry.ts"],"names":[],"mappings":"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"}
@@ -439,6 +439,10 @@ export class McpRegistry {
439
439
  this.hookDispatcher.fire(connectedEvent).catch((err) => { logger.warn('Lifecycle:mcp:connected hook error', { error: summarizeError(err) }); });
440
440
  }
441
441
  catch (err) {
442
+ // Kill any half-started process so a failed handshake does not leak an
443
+ // orphan server. intentionalClose (set inside disconnect) suppresses the
444
+ // client's auto-restart, so this teardown does not resurrect the process.
445
+ await client.disconnect().catch((e) => logger.warn('McpRegistry: failed to clean up half-connected client', { name, err: summarizeError(e) }));
442
446
  if (sandboxSessionId) {
443
447
  this.sandboxSessions.stop(sandboxSessionId);
444
448
  this.sandboxSessionByServer.delete(name);
@@ -1 +1 @@
1
- {"version":3,"file":"builtin-generation-providers.d.ts","sourceRoot":"","sources":["../../../src/platform/media/builtin-generation-providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,aAAa,EAEd,MAAM,wBAAwB,CAAC;AA4pBhC,wBAAgB,0BAA0B,IAAI,SAAS,aAAa,EAAE,CAQrE"}
1
+ {"version":3,"file":"builtin-generation-providers.d.ts","sourceRoot":"","sources":["../../../src/platform/media/builtin-generation-providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,aAAa,EAEd,MAAM,wBAAwB,CAAC;AA2pBhC,wBAAgB,0BAA0B,IAAI,SAAS,aAAa,EAAE,CAQrE"}
@@ -2,6 +2,7 @@ import { instrumentedFetch } from '../utils/fetch-with-timeout.js';
2
2
  import { logger } from '../utils/logger.js';
3
3
  import { summarizeError } from '../utils/error-display.js';
4
4
  import { sleep } from '../utils/concurrency.js';
5
+ import { isRecord } from '../utils/record-coerce.js';
5
6
  function readFirstEnv(envVars) {
6
7
  for (const envVar of envVars) {
7
8
  const value = process.env[envVar];
@@ -22,9 +23,7 @@ function buildStatus(id, label, configured, detail) {
22
23
  };
23
24
  }
24
25
  function asRecord(value) {
25
- return typeof value === 'object' && value !== null && !Array.isArray(value)
26
- ? value
27
- : null;
26
+ return isRecord(value) ? value : null;
28
27
  }
29
28
  function trimString(value) {
30
29
  return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"provider-registry.d.ts","sourceRoot":"","sources":["../../../src/platform/media/provider-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider-registry.d.ts","sourceRoot":"","sources":["../../../src/platform/media/provider-registry.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,9 @@ export class MediaProviderRegistry {
8
8
  if (this.providers.has(id) && !options.replace) {
9
9
  throw new Error(`Media provider already registered: ${id}`);
10
10
  }
11
- const registered = { ...provider, id };
11
+ const registered = id === provider.id
12
+ ? provider
13
+ : Object.assign(Object.create(Object.getPrototypeOf(provider)), provider, { id });
12
14
  this.providers.set(id, registered);
13
15
  return () => {
14
16
  if (this.providers.get(id) === registered)
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/platform/multimodal/service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,KAAK,EACV,yBAAyB,EACzB,wBAAwB,EACxB,gBAAgB,EAEhB,gBAAgB,EAChB,4BAA4B,EAC5B,uBAAuB,EACvB,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAgFpB,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAHhB,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,qBAAqB,EACrC,YAAY,EAAE,YAAY,EAC1B,gBAAgB,EAAE,gBAAgB;IAG/C,SAAS,IAAI,OAAO,CAAC,uBAAuB,CAAC;IAU7C,aAAa,IAAI,OAAO,CAAC,SAAS,4BAA4B,EAAE,CAAC;IAoCjE,OAAO,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAcpF,WAAW,CAAC,MAAM,EAAE,wBAAwB,EAAE,MAAM,GAAE,gBAA6B,EAAE,WAAW,SAAyB,GAAG,gBAAgB;IA4BtI,iBAAiB,CACrB,MAAM,EAAE,wBAAwB,EAChC,KAAK,GAAE;QACL,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;QAC9C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACzC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;KACpD,GACL,OAAO,CAAC,yBAAyB,CAAC;YAoDvB,oBAAoB;IA0BlC,OAAO,CAAC,WAAW;YAaL,YAAY;YAwCZ,YAAY;YAyCZ,eAAe;YAgCf,YAAY;CAqF3B"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/platform/multimodal/service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,KAAK,EACV,yBAAyB,EACzB,wBAAwB,EACxB,gBAAgB,EAEhB,gBAAgB,EAChB,4BAA4B,EAC5B,uBAAuB,EACvB,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAgFpB,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAHhB,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,qBAAqB,EACrC,YAAY,EAAE,YAAY,EAC1B,gBAAgB,EAAE,gBAAgB;IAG/C,SAAS,IAAI,OAAO,CAAC,uBAAuB,CAAC;IAU7C,aAAa,IAAI,OAAO,CAAC,SAAS,4BAA4B,EAAE,CAAC;IAoCjE,OAAO,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAcpF,WAAW,CAAC,MAAM,EAAE,wBAAwB,EAAE,MAAM,GAAE,gBAA6B,EAAE,WAAW,SAAyB,GAAG,gBAAgB;IA4BtI,iBAAiB,CACrB,MAAM,EAAE,wBAAwB,EAChC,KAAK,GAAE;QACL,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;QAC9C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACzC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;KACpD,GACL,OAAO,CAAC,yBAAyB,CAAC;YAoDvB,oBAAoB;IA0BlC,OAAO,CAAC,WAAW;YAaL,YAAY;YAwCZ,YAAY;YAyCZ,eAAe;YAgCf,YAAY;CAmG3B"}
@@ -402,10 +402,10 @@ export class MultimodalService {
402
402
  },
403
403
  });
404
404
  }
405
- if (audioArtifactId || transcriptArtifactId) {
406
- const audioDescriptor = this.artifactStore.get(audioArtifactId ?? transcriptArtifactId);
405
+ if (audioArtifactId) {
406
+ const audioDescriptor = this.artifactStore.get(audioArtifactId);
407
407
  if (audioDescriptor) {
408
- const audioResult = await this.analyzeAudio(audioDescriptor, (await this.artifactStore.readContent(audioArtifactId ?? transcriptArtifactId)).buffer, {
408
+ const audioResult = await this.analyzeAudio(audioDescriptor, (await this.artifactStore.readContent(audioArtifactId)).buffer, {
409
409
  audioProviderId: request.audioProviderId,
410
410
  modelId: request.modelId,
411
411
  prompt: request.prompt,
@@ -418,6 +418,21 @@ export class MultimodalService {
418
418
  sceneSegments.push(...audioResult.segments.slice(0, 6));
419
419
  }
420
420
  }
421
+ else if (transcriptArtifactId) {
422
+ const transcriptDescriptor = this.artifactStore.get(transcriptArtifactId);
423
+ if (transcriptDescriptor) {
424
+ const transcriptText = (await this.artifactStore.readContent(transcriptArtifactId)).buffer
425
+ .toString('utf-8')
426
+ .trim();
427
+ if (transcriptText) {
428
+ sceneSegments.push({
429
+ kind: 'transcript',
430
+ text: compactText(transcriptText, 4_000) ?? transcriptText,
431
+ metadata: { transcriptArtifactId },
432
+ });
433
+ }
434
+ }
435
+ }
421
436
  const summary = compactText([
422
437
  sceneSegments[0]?.text,
423
438
  sceneSegments[1]?.text,
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic-sse-assembler.d.ts","sourceRoot":"","sources":["../../../src/platform/providers/anthropic-sse-assembler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"anthropic-sse-assembler.d.ts","sourceRoot":"","sources":["../../../src/platform/providers/anthropic-sse-assembler.ts"],"names":[],"mappings":"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"}
@@ -108,6 +108,30 @@ export async function readAnthropicSSEStream(reader, state, onDelta, providerLab
108
108
  processAnthropicSSEEvent(event, state, onDelta);
109
109
  }
110
110
  }
111
+ // Drain any bytes left after the last newline: servers (notably home-grown
112
+ // anthropic-compat proxies) may close the connection right after a final
113
+ // `data: {...}` line with no trailing newline, which would otherwise drop the
114
+ // closing message_delta (stop_reason + usage). flush() returns [] for
115
+ // newline-terminated streams, so this is a no-op for compliant servers.
116
+ for (const line of sseBuffer.flush()) {
117
+ if (!line.startsWith('data: '))
118
+ continue;
119
+ const data = line.slice(6).trim();
120
+ if (!data || data === '[DONE]')
121
+ continue;
122
+ let event;
123
+ try {
124
+ event = JSON.parse(data);
125
+ }
126
+ catch {
127
+ logger.warn(`${providerLabel} SSE: failed to parse JSON chunk`, {
128
+ chunkPreview: data.slice(0, 200),
129
+ chunkLength: data.length,
130
+ });
131
+ continue;
132
+ }
133
+ processAnthropicSSEEvent(event, state, onDelta);
134
+ }
111
135
  }
112
136
  finally {
113
137
  reader.releaseLock();
@@ -124,6 +124,12 @@ export declare class ProviderCapabilityRegistry {
124
124
  * @returns A fully-resolved, immutable `ProviderCapability`.
125
125
  */
126
126
  getCapability(providerId: string, modelId: string, provider?: Pick<LLMProvider, 'capabilities'>): ProviderCapability;
127
+ /**
128
+ * Build a stable, order-independent key fragment from a provider's
129
+ * self-declared capabilities so cache entries with vs without an instance
130
+ * (or with differing declarations) never collide.
131
+ */
132
+ private _selfCapabilitiesKey;
127
133
  /**
128
134
  * Invalidate all cached capability records.
129
135
  * Call after dynamic provider registration or model discovery.
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../src/platform/providers/capabilities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../src/platform/providers/capabilities.ts"],"names":[],"mappings":"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"}
@@ -325,7 +325,11 @@ export class ProviderCapabilityRegistry {
325
325
  * @returns A fully-resolved, immutable `ProviderCapability`.
326
326
  */
327
327
  getCapability(providerId, modelId, provider) {
328
- const key = `${providerId}::${modelId}`;
328
+ // Self-declared capabilities (custom/discovered providers) change the
329
+ // resolved record, so they must participate in the cache key. Otherwise a
330
+ // call WITHOUT a provider instance could poison the entry a later call WITH
331
+ // one — or with different declarations — reads back.
332
+ const key = `${providerId}::${modelId}::${this._selfCapabilitiesKey(provider?.capabilities)}`;
329
333
  const cached = this.cache.get(key);
330
334
  if (cached)
331
335
  return cached;
@@ -333,6 +337,21 @@ export class ProviderCapabilityRegistry {
333
337
  this.cache.set(key, resolved);
334
338
  return resolved;
335
339
  }
340
+ /**
341
+ * Build a stable, order-independent key fragment from a provider's
342
+ * self-declared capabilities so cache entries with vs without an instance
343
+ * (or with differing declarations) never collide.
344
+ */
345
+ _selfCapabilitiesKey(caps) {
346
+ if (!caps)
347
+ return '';
348
+ const keys = Object.keys(caps).sort();
349
+ if (keys.length === 0)
350
+ return '';
351
+ return keys
352
+ .map((k) => `${k}=${JSON.stringify(caps[k])}`)
353
+ .join('&');
354
+ }
336
355
  /**
337
356
  * Invalidate all cached capability records.
338
357
  * Call after dynamic provider registration or model discovery.
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/platform/providers/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,YAAY,EAEZ,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,EAC5B,MAAM,gBAAgB,CAAC;AAexB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAwB3D;;;;;GAKG;AACH,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,YAAY;IACzB,uEAAuE;IACvE,OAAO,CAAC,iBAAiB,CAA6B;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAM;IAE/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA0B;IACzD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsC;IAEtE,0EAA0E;IAC1E,OAAO,CAAC,iBAAiB,CAAuB;IAChD,yEAAyE;IACzE,OAAO,CAAC,iBAAiB,CAAuB;IAChD,wCAAwC;IACxC,OAAO,CAAC,mBAAmB,CAAa;IACxC,qEAAqE;IACrE,OAAO,CAAC,iBAAiB,CAAqB;gBAElC,MAAM,EAAE,MAAM,EAAE,eAAe,GAAE,IAAI,CAAC,eAAe,EAAE,YAAY,CAA0B;IAKzG,OAAO,CAAC,gBAAgB;YAWV,mBAAmB;IA2F3B,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAwMhD,KAAK,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAmD1E,eAAe,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAmC3F"}
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/platform/providers/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,YAAY,EAEZ,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,EAC5B,MAAM,gBAAgB,CAAC;AAexB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAwB3D;;;;;GAKG;AACH,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,YAAY;IACzB,uEAAuE;IACvE,OAAO,CAAC,iBAAiB,CAA6B;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAM;IAE/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA0B;IACzD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsC;IAEtE,0EAA0E;IAC1E,OAAO,CAAC,iBAAiB,CAAuB;IAChD,yEAAyE;IACzE,OAAO,CAAC,iBAAiB,CAAuB;IAChD,wCAAwC;IACxC,OAAO,CAAC,mBAAmB,CAAa;IACxC,qEAAqE;IACrE,OAAO,CAAC,iBAAiB,CAAqB;gBAElC,MAAM,EAAE,MAAM,EAAE,eAAe,GAAE,IAAI,CAAC,eAAe,EAAE,YAAY,CAA0B;IAKzG,OAAO,CAAC,gBAAgB;YAWV,mBAAmB;IA2F3B,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAgNhD,KAAK,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAmD1E,eAAe,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAmC3F"}
@@ -221,58 +221,67 @@ export class GeminiProvider {
221
221
  });
222
222
  }
223
223
  const sseBuffer = new SseLineBuffer();
224
- try {
225
- while (true) {
226
- const { done, value } = await reader.read();
227
- if (done)
228
- break;
229
- for (const line of sseBuffer.feed(value)) {
230
- if (!line.startsWith('data: '))
231
- continue;
232
- const data = line.slice(6).trim();
233
- if (!data || data === '[DONE]')
234
- continue;
235
- let chunk;
236
- try {
237
- chunk = JSON.parse(data);
238
- }
239
- catch {
240
- logger.warn('Gemini SSE: failed to parse JSON chunk', {
241
- chunkPreview: data.slice(0, 200),
242
- chunkLength: data.length,
243
- });
244
- continue;
224
+ const processSseLine = (line) => {
225
+ if (!line.startsWith('data: '))
226
+ return;
227
+ const data = line.slice(6).trim();
228
+ if (!data || data === '[DONE]')
229
+ return;
230
+ let chunk;
231
+ try {
232
+ chunk = JSON.parse(data);
233
+ }
234
+ catch {
235
+ logger.warn('Gemini SSE: failed to parse JSON chunk', {
236
+ chunkPreview: data.slice(0, 200),
237
+ chunkLength: data.length,
238
+ });
239
+ return;
240
+ }
241
+ const candidate = chunk.candidates?.[0];
242
+ if (candidate) {
243
+ const parts = candidate.content?.parts ?? [];
244
+ for (const part of parts) {
245
+ allParts.push(part);
246
+ if (part.text && onDelta) {
247
+ streamedText += part.text;
248
+ onDelta({ content: part.text });
245
249
  }
246
- const candidate = chunk.candidates?.[0];
247
- if (candidate) {
248
- const parts = candidate.content?.parts ?? [];
249
- for (const part of parts) {
250
- allParts.push(part);
251
- if (part.text && onDelta) {
252
- streamedText += part.text;
253
- onDelta({ content: part.text });
254
- }
255
- if (part.functionCall) {
256
- // Capture thoughtSignature if present (Gemini thinking models)
257
- if (part.thoughtSignature) {
258
- this.thoughtSignatures.set(part.functionCall.name, part.thoughtSignature);
259
- }
260
- if (onDelta) {
261
- onDelta({ toolCalls: [{ index: 0, name: part.functionCall.name, arguments: JSON.stringify(part.functionCall.args) }] });
262
- }
263
- }
250
+ if (part.functionCall) {
251
+ // Capture thoughtSignature if present (Gemini thinking models)
252
+ if (part.thoughtSignature) {
253
+ this.thoughtSignatures.set(part.functionCall.name, part.thoughtSignature);
264
254
  }
265
- if (candidate.finishReason) {
266
- lastFinishReason = candidate.finishReason;
255
+ if (onDelta) {
256
+ onDelta({ toolCalls: [{ index: 0, name: part.functionCall.name, arguments: JSON.stringify(part.functionCall.args) }] });
267
257
  }
268
258
  }
269
- if (chunk.usageMetadata) {
270
- inputTokens = chunk.usageMetadata.promptTokenCount ?? inputTokens;
271
- outputTokens = chunk.usageMetadata.candidatesTokenCount ?? outputTokens;
272
- cacheReadTokens = chunk.usageMetadata.cachedContentTokenCount ?? cacheReadTokens;
273
- }
274
259
  }
260
+ if (candidate.finishReason) {
261
+ lastFinishReason = candidate.finishReason;
262
+ }
263
+ }
264
+ if (chunk.usageMetadata) {
265
+ inputTokens = chunk.usageMetadata.promptTokenCount ?? inputTokens;
266
+ outputTokens = chunk.usageMetadata.candidatesTokenCount ?? outputTokens;
267
+ cacheReadTokens = chunk.usageMetadata.cachedContentTokenCount ?? cacheReadTokens;
268
+ }
269
+ };
270
+ try {
271
+ while (true) {
272
+ const { done, value } = await reader.read();
273
+ if (done)
274
+ break;
275
+ for (const line of sseBuffer.feed(value))
276
+ processSseLine(line);
275
277
  }
278
+ // Drain any bytes left after the last newline: a server that closes the
279
+ // connection right after a final `data:` line with no trailing newline
280
+ // would otherwise drop that last chunk (usageMetadata / finishReason).
281
+ // flush() returns [] for newline-terminated streams, so this is a no-op
282
+ // for compliant servers.
283
+ for (const line of sseBuffer.flush())
284
+ processSseLine(line);
276
285
  }
277
286
  finally {
278
287
  reader.releaseLock();
@@ -17,6 +17,7 @@ export { loadCustomProviders } from './custom-loader.js';
17
17
  export { LMStudioProvider } from './lm-studio.js';
18
18
  export { LlamaCppProvider } from './llama-cpp.js';
19
19
  export { DEFAULT_CONTEXT_WINDOW, LocalContextIngestionService, resolveContextWindow, } from './local-context-ingestion.js';
20
+ export { FALLBACK_CONTEXT_WINDOW, inferFallbackContextWindow, } from './context-window-fallback.js';
20
21
  export { createModelCatalog, getCatalogModelDefinitionsFrom, getCostFromPricingCatalog, hasKeyForProvider, normalizeModelId, } from './model-catalog.js';
21
22
  export type { CatalogDiff, CatalogModel, CatalogModelEntry, CatalogProvider, ModelCatalog, PricingCatalog, } from './model-catalog.js';
22
23
  export { diffCatalogs, filterRelevantChanges, formatChangeNotifications, } from './model-catalog-notifications.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/platform/providers/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/platform/providers/index.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@ export { loadCustomProviders } from './custom-loader.js';
12
12
  export { LMStudioProvider } from './lm-studio.js';
13
13
  export { LlamaCppProvider } from './llama-cpp.js';
14
14
  export { DEFAULT_CONTEXT_WINDOW, LocalContextIngestionService, resolveContextWindow, } from './local-context-ingestion.js';
15
+ export { FALLBACK_CONTEXT_WINDOW, inferFallbackContextWindow, } from './context-window-fallback.js';
15
16
  export { createModelCatalog, getCatalogModelDefinitionsFrom, getCostFromPricingCatalog, hasKeyForProvider, normalizeModelId, } from './model-catalog.js';
16
17
  export { diffCatalogs, filterRelevantChanges, formatChangeNotifications, } from './model-catalog-notifications.js';
17
18
  export { buildSyntheticCanonicalModels, nameToSlug, normalizeModelName, } from './model-catalog-synthetic.js';
@@ -1 +1 @@
1
- {"version":3,"file":"model-limits.d.ts","sourceRoot":"","sources":["../../../src/platform/providers/model-limits.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AA6ClE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEhE;AA6GD,qBAAa,kBAAkB;IAIjB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,WAAW,CAAiD;gBAEvC,OAAO,EAAE,yBAAyB;IAE/D,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,kBAAkB;IA4B1B,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAWpG,sBAAsB,CAAC,QAAQ,EAAE,eAAe,GAAG,QAAQ,CAAC,WAAW,CAAC;IAIxE,wBAAwB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM;IAc3D,6BAA6B,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM;IAK1E,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAiChC,IAAI,IAAI,IAAI;CASb"}
1
+ {"version":3,"file":"model-limits.d.ts","sourceRoot":"","sources":["../../../src/platform/providers/model-limits.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AA8ClE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEhE;AA6GD,qBAAa,kBAAkB;IAIjB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,WAAW,CAAiD;gBAEvC,OAAO,EAAE,yBAAyB;IAE/D,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,kBAAkB;IA4B1B,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAWpG,sBAAsB,CAAC,QAAQ,EAAE,eAAe,GAAG,QAAQ,CAAC,WAAW,CAAC;IAIxE,wBAAwB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM;IA2B3D,6BAA6B,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM;IAK1E,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAiChC,IAAI,IAAI,IAAI;CASb"}
@@ -4,6 +4,7 @@ import { logger } from '../utils/logger.js';
4
4
  import { summarizeError } from '../utils/error-display.js';
5
5
  import { TTL_24H_MS, isTtlCacheStale, validateTtlCacheEnvelope } from './json-ttl-cache.js';
6
6
  import { instrumentedFetch, fetchWithTimeout } from '../utils/fetch-with-timeout.js';
7
+ import { inferFallbackContextWindow } from './context-window-fallback.js';
7
8
  const OPENROUTER_MODELS_URL = 'https://openrouter.ai/api/v1/models';
8
9
  const FETCH_TIMEOUT_MS = 15_000;
9
10
  const DEFAULT_TOKEN_LIMITS = {
@@ -176,7 +177,12 @@ export class ModelLimitsService {
176
177
  return this.resolveTokenLimits(modelDef);
177
178
  }
178
179
  getContextWindowForModel(modelDef) {
179
- if (modelDef.contextWindowProvenance === 'provider_api' && modelDef.contextWindow > 0) {
180
+ // An explicit user-configured cap (configured_cap) is authoritative and must
181
+ // never be widened — or narrowed — by a fuzzy OpenRouter match. provider_api
182
+ // values are likewise trusted. Both short-circuit ahead of the OpenRouter lookup.
183
+ if ((modelDef.contextWindowProvenance === 'provider_api' ||
184
+ modelDef.contextWindowProvenance === 'configured_cap') &&
185
+ modelDef.contextWindow > 0) {
180
186
  return modelDef.contextWindow;
181
187
  }
182
188
  const orMap = this.ensureOpenRouterMap();
@@ -186,7 +192,13 @@ export class ModelLimitsService {
186
192
  return orMatch.context_length;
187
193
  }
188
194
  }
189
- return modelDef.contextWindow;
195
+ // Never emit 0/NaN: a non-positive or non-finite window would poison
196
+ // downstream budget math (used / contextWindow -> Infinity/NaN). Fall back to
197
+ // the family-aware floor instead.
198
+ const cw = modelDef.contextWindow;
199
+ return Number.isFinite(cw) && cw > 0
200
+ ? cw
201
+ : inferFallbackContextWindow(modelDef.provider, modelDef.id);
190
202
  }
191
203
  getToolResultMaxCharsForModel(model) {
192
204
  if (!model)