@pellux/goodvibes-sdk 0.34.2 → 0.36.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 (156) hide show
  1. package/README.md +11 -1
  2. package/dist/contracts/artifacts/operator-contract.json +4 -1
  3. package/dist/events/agents.d.ts +14 -0
  4. package/dist/events/agents.d.ts.map +1 -1
  5. package/dist/events/index.d.ts +1 -1
  6. package/dist/events/index.d.ts.map +1 -1
  7. package/dist/events/turn.d.ts +17 -0
  8. package/dist/events/turn.d.ts.map +1 -1
  9. package/dist/events/workflows.d.ts +8 -0
  10. package/dist/events/workflows.d.ts.map +1 -1
  11. package/dist/platform/acp/connection.d.ts +16 -0
  12. package/dist/platform/acp/connection.d.ts.map +1 -1
  13. package/dist/platform/acp/connection.js +17 -0
  14. package/dist/platform/agents/orchestrator-runner.d.ts +1 -1
  15. package/dist/platform/agents/orchestrator-runner.d.ts.map +1 -1
  16. package/dist/platform/agents/orchestrator-runner.js +20 -24
  17. package/dist/platform/agents/orchestrator.d.ts.map +1 -1
  18. package/dist/platform/agents/orchestrator.js +3 -2
  19. package/dist/platform/agents/worktree.d.ts +11 -1
  20. package/dist/platform/agents/worktree.d.ts.map +1 -1
  21. package/dist/platform/agents/worktree.js +48 -14
  22. package/dist/platform/agents/wrfc-config.d.ts +23 -0
  23. package/dist/platform/agents/wrfc-config.d.ts.map +1 -1
  24. package/dist/platform/agents/wrfc-config.js +24 -0
  25. package/dist/platform/agents/wrfc-controller.d.ts +49 -1
  26. package/dist/platform/agents/wrfc-controller.d.ts.map +1 -1
  27. package/dist/platform/agents/wrfc-controller.js +271 -16
  28. package/dist/platform/agents/wrfc-types.d.ts +48 -1
  29. package/dist/platform/agents/wrfc-types.d.ts.map +1 -1
  30. package/dist/platform/automation/manager-runtime-delivery.d.ts +1 -1
  31. package/dist/platform/automation/manager-runtime-delivery.d.ts.map +1 -1
  32. package/dist/platform/automation/manager-runtime-delivery.js +4 -3
  33. package/dist/platform/channels/policy-manager.d.ts +8 -0
  34. package/dist/platform/channels/policy-manager.d.ts.map +1 -1
  35. package/dist/platform/channels/policy-manager.js +43 -1
  36. package/dist/platform/companion/companion-chat-manager.d.ts +1 -0
  37. package/dist/platform/companion/companion-chat-manager.d.ts.map +1 -1
  38. package/dist/platform/companion/companion-chat-manager.js +10 -0
  39. package/dist/platform/companion/companion-chat-routes.js +1 -0
  40. package/dist/platform/companion/companion-chat-types.d.ts +1 -0
  41. package/dist/platform/companion/companion-chat-types.d.ts.map +1 -1
  42. package/dist/platform/config/schema-domain-core.d.ts +3 -0
  43. package/dist/platform/config/schema-domain-core.d.ts.map +1 -1
  44. package/dist/platform/config/schema-domain-core.js +24 -0
  45. package/dist/platform/config/schema-types.d.ts +6 -2
  46. package/dist/platform/config/schema-types.d.ts.map +1 -1
  47. package/dist/platform/control-plane/approval-broker.d.ts +7 -0
  48. package/dist/platform/control-plane/approval-broker.d.ts.map +1 -1
  49. package/dist/platform/control-plane/approval-broker.js +30 -0
  50. package/dist/platform/control-plane/method-catalog-channels.d.ts.map +1 -1
  51. package/dist/platform/control-plane/method-catalog-channels.js +2 -0
  52. package/dist/platform/control-plane/method-catalog-email.d.ts.map +1 -1
  53. package/dist/platform/control-plane/method-catalog-email.js +1 -0
  54. package/dist/platform/core/compaction-sections.d.ts.map +1 -1
  55. package/dist/platform/core/compaction-sections.js +16 -5
  56. package/dist/platform/core/compaction-types.d.ts +7 -1
  57. package/dist/platform/core/compaction-types.d.ts.map +1 -1
  58. package/dist/platform/core/compaction-types.js +6 -0
  59. package/dist/platform/core/context-compaction.d.ts +20 -4
  60. package/dist/platform/core/context-compaction.d.ts.map +1 -1
  61. package/dist/platform/core/context-compaction.js +34 -7
  62. package/dist/platform/core/conversation-utils.js +1 -1
  63. package/dist/platform/core/conversation.d.ts.map +1 -1
  64. package/dist/platform/core/conversation.js +9 -4
  65. package/dist/platform/core/orchestrator-turn-loop.d.ts.map +1 -1
  66. package/dist/platform/core/orchestrator-turn-loop.js +22 -3
  67. package/dist/platform/core/orchestrator.d.ts +12 -0
  68. package/dist/platform/core/orchestrator.d.ts.map +1 -1
  69. package/dist/platform/core/orchestrator.js +36 -8
  70. package/dist/platform/daemon/http/home-graph-routes.d.ts.map +1 -1
  71. package/dist/platform/daemon/http/home-graph-routes.js +2 -1
  72. package/dist/platform/daemon/http/project-planning-routes.d.ts.map +1 -1
  73. package/dist/platform/daemon/http/project-planning-routes.js +2 -1
  74. package/dist/platform/hooks/dispatcher.d.ts.map +1 -1
  75. package/dist/platform/hooks/dispatcher.js +4 -0
  76. package/dist/platform/hooks/runners/command.d.ts.map +1 -1
  77. package/dist/platform/hooks/runners/command.js +11 -2
  78. package/dist/platform/integrations/delivery.d.ts.map +1 -1
  79. package/dist/platform/integrations/delivery.js +0 -2
  80. package/dist/platform/intelligence/import-graph.d.ts.map +1 -1
  81. package/dist/platform/intelligence/import-graph.js +8 -0
  82. package/dist/platform/knowledge/extractors.d.ts.map +1 -1
  83. package/dist/platform/knowledge/extractors.js +30 -4
  84. package/dist/platform/mcp/client.d.ts +2 -0
  85. package/dist/platform/mcp/client.d.ts.map +1 -1
  86. package/dist/platform/mcp/client.js +17 -3
  87. package/dist/platform/mcp/registry.d.ts.map +1 -1
  88. package/dist/platform/mcp/registry.js +4 -0
  89. package/dist/platform/media/builtin-generation-providers.d.ts.map +1 -1
  90. package/dist/platform/media/builtin-generation-providers.js +2 -3
  91. package/dist/platform/media/provider-registry.d.ts.map +1 -1
  92. package/dist/platform/media/provider-registry.js +3 -1
  93. package/dist/platform/multimodal/service.d.ts.map +1 -1
  94. package/dist/platform/multimodal/service.js +18 -3
  95. package/dist/platform/providers/anthropic-compat.js +2 -2
  96. package/dist/platform/providers/anthropic-sdk-provider.js +1 -1
  97. package/dist/platform/providers/anthropic-sse-assembler.d.ts.map +1 -1
  98. package/dist/platform/providers/anthropic-sse-assembler.js +24 -0
  99. package/dist/platform/providers/anthropic.js +2 -2
  100. package/dist/platform/providers/capabilities.d.ts +6 -0
  101. package/dist/platform/providers/capabilities.d.ts.map +1 -1
  102. package/dist/platform/providers/capabilities.js +20 -1
  103. package/dist/platform/providers/gemini.d.ts.map +1 -1
  104. package/dist/platform/providers/gemini.js +57 -48
  105. package/dist/platform/providers/index.d.ts +1 -0
  106. package/dist/platform/providers/index.d.ts.map +1 -1
  107. package/dist/platform/providers/index.js +1 -0
  108. package/dist/platform/providers/interface.d.ts +9 -1
  109. package/dist/platform/providers/interface.d.ts.map +1 -1
  110. package/dist/platform/providers/llama-cpp.js +1 -1
  111. package/dist/platform/providers/lm-studio.js +1 -1
  112. package/dist/platform/providers/model-limits.d.ts.map +1 -1
  113. package/dist/platform/providers/model-limits.js +14 -2
  114. package/dist/platform/providers/ollama.js +1 -1
  115. package/dist/platform/providers/openai-codex.js +1 -1
  116. package/dist/platform/providers/openai-compat.d.ts.map +1 -1
  117. package/dist/platform/providers/openai-compat.js +2 -2
  118. package/dist/platform/providers/openai.js +2 -2
  119. package/dist/platform/runtime/emitters/agents.d.ts +2 -0
  120. package/dist/platform/runtime/emitters/agents.d.ts.map +1 -1
  121. package/dist/platform/runtime/emitters/turn.d.ts +9 -0
  122. package/dist/platform/runtime/emitters/turn.d.ts.map +1 -1
  123. package/dist/platform/runtime/emitters/turn.js +4 -0
  124. package/dist/platform/runtime/emitters/workflows.d.ts +1 -0
  125. package/dist/platform/runtime/emitters/workflows.d.ts.map +1 -1
  126. package/dist/platform/runtime/store/domains/agents.d.ts +7 -0
  127. package/dist/platform/runtime/store/domains/agents.d.ts.map +1 -1
  128. package/dist/platform/runtime/store/domains/conversation.d.ts +0 -2
  129. package/dist/platform/runtime/store/domains/conversation.d.ts.map +1 -1
  130. package/dist/platform/runtime/store/domains/conversation.js +0 -1
  131. package/dist/platform/runtime/store/helpers/reducers/conversation.d.ts.map +1 -1
  132. package/dist/platform/runtime/store/helpers/reducers/conversation.js +20 -2
  133. package/dist/platform/runtime/store/helpers/reducers/lifecycle.d.ts.map +1 -1
  134. package/dist/platform/runtime/store/helpers/reducers/lifecycle.js +6 -0
  135. package/dist/platform/runtime/store/helpers/reducers/sync.d.ts.map +1 -1
  136. package/dist/platform/runtime/store/helpers/reducers/sync.js +7 -1
  137. package/dist/platform/runtime/tools/phases/execute.d.ts.map +1 -1
  138. package/dist/platform/runtime/tools/phases/execute.js +11 -1
  139. package/dist/platform/runtime/ui-read-models-core.d.ts.map +1 -1
  140. package/dist/platform/runtime/ui-read-models-core.js +4 -1
  141. package/dist/platform/tools/exec/runtime.d.ts.map +1 -1
  142. package/dist/platform/tools/exec/runtime.js +9 -0
  143. package/dist/platform/tools/shared/overflow.d.ts.map +1 -1
  144. package/dist/platform/tools/shared/overflow.js +21 -2
  145. package/dist/platform/types/errors.d.ts +26 -0
  146. package/dist/platform/types/errors.d.ts.map +1 -1
  147. package/dist/platform/types/errors.js +63 -1
  148. package/dist/platform/utils/error-display.d.ts.map +1 -1
  149. package/dist/platform/utils/error-display.js +14 -6
  150. package/dist/platform/utils/retry.d.ts +4 -2
  151. package/dist/platform/utils/retry.d.ts.map +1 -1
  152. package/dist/platform/utils/retry.js +4 -2
  153. package/dist/platform/version.js +1 -1
  154. package/dist/platform/voice/providers/shared.d.ts.map +1 -1
  155. package/dist/platform/voice/providers/shared.js +2 -3
  156. package/package.json +9 -9
@@ -1,9 +1,7 @@
1
- import { PermissionError, ProviderError, ToolError, isNonTransientProviderFailure } from '../types/errors.js';
1
+ import { ProviderError, isNonTransientProviderFailure } from '../types/errors.js';
2
2
  import { formatError, summarizeError } from '../utils/error-display.js';
3
3
  import { notifyCompletion } from '../utils/notify.js';
4
4
  import { logger } from '../utils/logger.js';
5
- import { ConsecutiveErrorBreaker } from './circuit-breaker.js';
6
- import { classifyIntent } from './intent-classifier.js';
7
5
  import { estimateConversationTokens } from './context-compaction.js';
8
6
  import { SessionLineageTracker } from './session-lineage.js';
9
7
  import { EventReplayQueue } from './event-replay.js';
@@ -315,13 +313,39 @@ export class Orchestrator {
315
313
  // Set the original task on the first user message (idempotent — subsequent calls are no-ops)
316
314
  getSessionLineageTracker(this.coreServices, this.ownedSessionLineageTracker).setOriginalTask(text.slice(0, 200));
317
315
  await this.runTurn(text, content, options);
318
- // Process any messages queued while the LLM was thinking (iterative, not recursive)
319
- while (this.messageQueue.length > 0) {
316
+ // Process any messages queued while the LLM was thinking. Draining is gated on
317
+ // isCompacting so a queued turn cannot start while a background auto-compaction is
318
+ // mid-flight (which would let compact() replace the message array and drop the
319
+ // in-flight turn's freshly appended messages). Messages left queued during
320
+ // compaction are drained by setCompacting() once compaction settles.
321
+ await this.drainMessageQueue();
322
+ }
323
+ /**
324
+ * Drain queued user messages sequentially. Skips draining while a turn is in
325
+ * flight or a background auto-compaction is running; in the latter case
326
+ * setCompacting() re-triggers the drain once compaction settles, so no queued
327
+ * message is lost.
328
+ */
329
+ async drainMessageQueue() {
330
+ while (this.messageQueue.length > 0 && !this.isThinking && !this.isCompacting) {
320
331
  const next = this.messageQueue.shift();
321
332
  await this.runTurn(next.text, next.content, next.options);
322
333
  }
323
334
  this.followUpRuntime.scheduleFlush();
324
335
  }
336
+ /**
337
+ * Single funnel for mutating the compaction flag. On the true->false edge it
338
+ * resumes draining any messages that were queued while compaction was in flight.
339
+ */
340
+ setCompacting(value) {
341
+ const wasCompacting = this.isCompacting;
342
+ this.isCompacting = value;
343
+ if (wasCompacting && !value && !this.isThinking && this.messageQueue.length > 0) {
344
+ void this.drainMessageQueue().catch((err) => logger.error('Orchestrator: queued message drain after compaction failed', {
345
+ error: err instanceof Error ? err.message : String(err),
346
+ }));
347
+ }
348
+ }
325
349
  startThinking(estimatedInputTokens) {
326
350
  this.isThinking = true;
327
351
  this.thinkingFrame = 0; // Reset each turn so gradient starts clean and frame never grows unbounded
@@ -469,7 +493,11 @@ export class Orchestrator {
469
493
  getMessageQueueLength: () => this.messageQueue.length,
470
494
  isReconciliationEnabled: () => this.isReconciliationEnabled(),
471
495
  setPendingToolCalls: (calls) => { this._pendingToolCalls = calls; },
472
- setAutoSpawnTimeout: (timeout) => { this.autoSpawnTimeout = timeout; },
496
+ setAutoSpawnTimeout: (timeout) => {
497
+ if (this.autoSpawnTimeout !== null)
498
+ clearTimeout(this.autoSpawnTimeout);
499
+ this.autoSpawnTimeout = timeout;
500
+ },
473
501
  setStreamingActive: (value) => { this.isStreaming = value; },
474
502
  setStreamingInputTokens: (value) => { this.streamingInputTokens = value; },
475
503
  addStreamingOutputTokens: (value) => { this.streamingOutputTokens += value; },
@@ -496,7 +524,7 @@ export class Orchestrator {
496
524
  sessionId: this.sessionId,
497
525
  requestRender: this.requestRender,
498
526
  isCompacting: this.isCompacting,
499
- setIsCompacting: (value) => { this.isCompacting = value; },
527
+ setIsCompacting: (value) => { this.setCompacting(value); },
500
528
  lastWarningBracket: this.lastWarningBracket,
501
529
  setLastWarningBracket: (value) => { this.lastWarningBracket = value; },
502
530
  }, turnId, this.lastInputTokens);
@@ -629,7 +657,7 @@ export class Orchestrator {
629
657
  runtimeBus: this.runtimeBus,
630
658
  emitterContext: (id) => createEmitterContext(this.sessionId, id),
631
659
  isCompacting: this.isCompacting,
632
- setIsCompacting: (value) => { this.isCompacting = value; },
660
+ setIsCompacting: (value) => { this.setCompacting(value); },
633
661
  }, turnId, model);
634
662
  }
635
663
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"home-graph-routes.d.ts","sourceRoot":"","sources":["../../../../src/platform/daemon/http/home-graph-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,8BAA8B,CAAC;AAetC,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,aAAa,EAAE,uBAAuB,CAAC;IAChD,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC5C,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC;IACzE,QAAQ,CAAC,qBAAqB,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC;IACxF,QAAQ,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,GAAG,IAAI,CAAC;CAC1D;AAED,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,qBAAqB;IAErD,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;YAqJtC,KAAK;YAML,QAAQ;YAMR,gBAAgB;CAK/B"}
1
+ {"version":3,"file":"home-graph-routes.d.ts","sourceRoot":"","sources":["../../../../src/platform/daemon/http/home-graph-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,8BAA8B,CAAC;AAgBtC,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,aAAa,EAAE,uBAAuB,CAAC;IAChD,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC5C,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC;IACzE,QAAQ,CAAC,qBAAqB,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC;IACxF,QAAQ,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,GAAG,IAAI,CAAC;CAC1D;AAED,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,qBAAqB;IAErD,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;YAqJtC,KAAK;YAML,QAAQ;YAMR,gBAAgB;CAK/B"}
@@ -1,4 +1,5 @@
1
1
  import { createArtifactFromUploadRequest, isArtifactUploadRequest, } from '@pellux/goodvibes-daemon-sdk';
2
+ import { jsonErrorResponse } from './error-response.js';
2
3
  import { readBoundedPositiveInteger, readOptionalBoundedInteger } from './route-helpers.js';
3
4
  export class HomeGraphRoutes {
4
5
  context;
@@ -153,7 +154,7 @@ export class HomeGraphRoutes {
153
154
  return Response.json({ error: 'Unknown Home Graph route' }, { status: 404 });
154
155
  }
155
156
  catch (error) {
156
- return Response.json({ error: error instanceof Error ? error.message : String(error) }, { status: 400 });
157
+ return jsonErrorResponse(error, { status: 400 });
157
158
  }
158
159
  }
159
160
  async admin(req, fn) {
@@ -1 +1 @@
1
- {"version":3,"file":"project-planning-routes.d.ts","sourceRoot":"","sources":["../../../../src/platform/daemon/http/project-planning-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,sBAAsB,EAUvB,MAAM,0BAA0B,CAAC;AAElC,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,UAAU,2BAA2B;IACnC,QAAQ,CAAC,sBAAsB,EAAE,sBAAsB,CAAC;IACxD,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC;IACzE,QAAQ,CAAC,qBAAqB,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC;IACxF,QAAQ,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,GAAG,IAAI,CAAC;CAC1D;AAED,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,2BAA2B;IAE3D,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;YA8GtC,KAAK;YAML,QAAQ;YAMR,gBAAgB;CAK/B"}
1
+ {"version":3,"file":"project-planning-routes.d.ts","sourceRoot":"","sources":["../../../../src/platform/daemon/http/project-planning-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,sBAAsB,EAUvB,MAAM,0BAA0B,CAAC;AAGlC,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,UAAU,2BAA2B;IACnC,QAAQ,CAAC,sBAAsB,EAAE,sBAAsB,CAAC;IACxD,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC;IACzE,QAAQ,CAAC,qBAAqB,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC;IACxF,QAAQ,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,GAAG,IAAI,CAAC;CAC1D;AAED,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,2BAA2B;IAE3D,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;YA8GtC,KAAK;YAML,QAAQ;YAMR,gBAAgB;CAK/B"}
@@ -1,3 +1,4 @@
1
+ import { jsonErrorResponse } from './error-response.js';
1
2
  export class ProjectPlanningRoutes {
2
3
  context;
3
4
  constructor(context) {
@@ -93,7 +94,7 @@ export class ProjectPlanningRoutes {
93
94
  return Response.json({ error: 'Unknown project planning route' }, { status: 404 });
94
95
  }
95
96
  catch (error) {
96
- return Response.json({ error: error instanceof Error ? error.message : String(error) }, { status: 400 });
97
+ return jsonErrorResponse(error, { status: 400 });
97
98
  }
98
99
  }
99
100
  async admin(req, fn) {
@@ -1 +1 @@
1
- {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../../src/platform/hooks/dispatcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAOrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAG1E,KAAK,cAAc,GAAG;IACpB,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC,GAAG,SAAS,CAAC;IACzF,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C,CAAC;AAgCF,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,cAAc,CAAmC;IACzD,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAC5C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsB;gBAE1C,UAAU,GAAE,cAAmB,EAAE,eAAe,GAAE,mBAA+C;IAK7G,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,EAAE,kBAAkB,GAAG,IAAI,GAAG,IAAI;IAItD,sCAAsC;IACtC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAmGpC,uCAAuC;IACvC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI;IAS1D,wCAAwC;IACxC,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAIrC;;;;;;;;;OASG;IACG,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IA+IjD,0DAA0D;IAC1D,QAAQ,IAAI,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IAIzC,gCAAgC;IAChC,SAAS,IAAI,SAAS,EAAE;IAIxB,qCAAqC;IACrC,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,SAAS,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,cAAc,CAAA;KAAE,CAAC;IAU7D;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAYjC;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAYlC;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAWlC"}
1
+ {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../../src/platform/hooks/dispatcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAOrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAG1E,KAAK,cAAc,GAAG;IACpB,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC,GAAG,SAAS,CAAC;IACzF,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C,CAAC;AAgCF,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,cAAc,CAAmC;IACzD,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAC5C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsB;gBAE1C,UAAU,GAAE,cAAmB,EAAE,eAAe,GAAE,mBAA+C;IAK7G,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,EAAE,kBAAkB,GAAG,IAAI,GAAG,IAAI;IAItD,sCAAsC;IACtC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAmGpC,uCAAuC;IACvC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI;IAS1D,wCAAwC;IACxC,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAIrC;;;;;;;;;OASG;IACG,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IAkJjD,0DAA0D;IAC1D,QAAQ,IAAI,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IAIzC,gCAAgC;IAChC,SAAS,IAAI,SAAS,EAAE;IAIxB,qCAAqC;IACrC,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,SAAS,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,cAAc,CAAA;KAAE,CAAC;IAU7D;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAYjC;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAYlC;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAWlC"}
@@ -175,6 +175,10 @@ export class HookDispatcher {
175
175
  for (const [pattern, defs] of this.hooks.entries()) {
176
176
  if (matchesEventPath(pattern, event.path)) {
177
177
  for (const hook of defs) {
178
+ // Skip hooks explicitly disabled via disableHook() or `enabled: false`
179
+ // in hooks.json. Strict === false preserves the default (undefined = enabled).
180
+ if (hook.enabled === false)
181
+ continue;
178
182
  const specificValue = event.specific;
179
183
  if (matchesMatcher(hook.matcher, specificValue)) {
180
184
  matchingEntries.push({ pattern, hook });
@@ -1 +1 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/platform/hooks/runners/command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIzE;;;;GAIG;AACH,wBAAsB,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAsErF"}
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/platform/hooks/runners/command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIzE;;;;GAIG;AACH,wBAAsB,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAgFrF"}
@@ -27,6 +27,12 @@ export async function run(hook, event) {
27
27
  killHookProcess(proc, command, 'timeout');
28
28
  }, timeoutMs);
29
29
  timer.unref?.();
30
+ // Start draining stdout/stderr concurrently with the exit wait. If we only
31
+ // read after exit, a hook that writes more than the OS pipe buffer (~64KB)
32
+ // blocks on write — the child never exits and `await proc.exited` deadlocks
33
+ // until the timeout kills it, discarding the hook's intended output.
34
+ const stdoutPromise = new Response(proc.stdout).text();
35
+ const stderrPromise = new Response(proc.stderr).text();
30
36
  let exitCode;
31
37
  try {
32
38
  exitCode = await proc.exited;
@@ -35,10 +41,13 @@ export async function run(hook, event) {
35
41
  catch (err) {
36
42
  clearTimeout(timer);
37
43
  killHookProcess(proc, command, 'spawn error');
44
+ // We're abandoning the drains on this path; settle them with a no-op
45
+ // catch so a stream rejection can't surface as an unhandled rejection.
46
+ void stdoutPromise.catch(() => { });
47
+ void stderrPromise.catch(() => { });
38
48
  throw err;
39
49
  }
40
- const stdout = await new Response(proc.stdout).text();
41
- const stderr = await new Response(proc.stderr).text();
50
+ const [stdout, stderr] = await Promise.all([stdoutPromise, stderrPromise]);
42
51
  if (exitCode !== 0) {
43
52
  logger.error('command hook exited with non-zero code', {
44
53
  command,
@@ -1 +1 @@
1
- {"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../../src/platform/integrations/delivery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../../src/platform/integrations/delivery.ts"],"names":[],"mappings":"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"}
@@ -204,8 +204,6 @@ export class DeliveryQueue {
204
204
  try {
205
205
  await entry.deliver();
206
206
  this._delivered += 1;
207
- if (entry.attempts > 1)
208
- this._retrying = Math.max(0, this._retrying - 1);
209
207
  this._pending.delete(entry.id);
210
208
  logger.debug('DeliveryQueue: delivered', {
211
209
  channel: entry.channel,
@@ -1 +1 @@
1
- {"version":3,"file":"import-graph.d.ts","sourceRoot":"","sources":["../../../src/platform/intelligence/import-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,2DAA2D;AAC3D,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAErD,uDAAuD;AACvD,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AA4BlD;;;GAGG;AACH,iBAAS,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAS5D;AAED,eAAO,MAAM,gCAAgC,kCAA4B,CAAC;AAiD1E,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,GAC3B,MAAM,GAAG,IAAI,CAGf;AAqCD,qBAAa,WAAW;IACtB,2CAA2C;IAC3C,OAAO,CAAC,OAAO,CAAyB;IAExC,+CAA+C;IAC/C,OAAO,CAAC,UAAU,CAA4B;IAE9C,iCAAiC;IACjC,OAAO,CAAC,WAAW,CAAuB;IAE1C,iDAAiD;IACjD,OAAO,CAAC,KAAK,CAAQ;IAErB,iDAAiD;IACjD,OAAO,CAAC,QAAQ,CAAgB;;IAIhC;;;OAGG;IACH,SAAS,IAAI,IAAI;IAIjB;;;OAGG;IACG,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyD/C;;;OAGG;IACH,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IA4B1D;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAI1C;;;OAGG;IACH,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAiBpD;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAIvC;;OAEG;IACH,KAAK,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE;IAQrF;;OAEG;IACH,WAAW,IAAI,MAAM,EAAE;IAIvB;;;OAGG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;CAQ/D"}
1
+ {"version":3,"file":"import-graph.d.ts","sourceRoot":"","sources":["../../../src/platform/intelligence/import-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,2DAA2D;AAC3D,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAErD,uDAAuD;AACvD,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AA8BlD;;;GAGG;AACH,iBAAS,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAa5D;AAED,eAAO,MAAM,gCAAgC,kCAA4B,CAAC;AAiD1E,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,GAC3B,MAAM,GAAG,IAAI,CAGf;AAqCD,qBAAa,WAAW;IACtB,2CAA2C;IAC3C,OAAO,CAAC,OAAO,CAAyB;IAExC,+CAA+C;IAC/C,OAAO,CAAC,UAAU,CAA4B;IAE9C,iCAAiC;IACjC,OAAO,CAAC,WAAW,CAAuB;IAE1C,iDAAiD;IACjD,OAAO,CAAC,KAAK,CAAQ;IAErB,iDAAiD;IACjD,OAAO,CAAC,QAAQ,CAAgB;;IAIhC;;;OAGG;IACH,SAAS,IAAI,IAAI;IAIjB;;;OAGG;IACG,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyD/C;;;OAGG;IACH,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IA4B1D;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAI1C;;;OAGG;IACH,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAiBpD;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAIvC;;OAEG;IACH,KAAK,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE;IAQrF;;OAEG;IACH,WAAW,IAAI,MAAM,EAAE;IAIvB;;;OAGG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;CAQ/D"}
@@ -33,6 +33,8 @@ function addImportGraphWarning(diagnostics, warning) {
33
33
  // Import extraction (line-by-line, no catastrophic backtracking)
34
34
  // ---------------------------------------------------------------------------
35
35
  const IMPORT_RE = /(?:import|export)\s.*?from\s+['"]([^'"]+)['"]/;
36
+ const SIDE_EFFECT_IMPORT_RE = /^\s*import\s+['"]([^'"]+)['"]/;
37
+ const DYNAMIC_IMPORT_RE = /import\(\s*['"]([^'"]+)['"]\s*\)/;
36
38
  const REQUIRE_RE = /require\(['"]([^'"]+)['"]\)/;
37
39
  /**
38
40
  * Extract all module specifiers (import/export/require) from a file's text.
@@ -44,6 +46,12 @@ function extractRelativeSpecifiers(content) {
44
46
  const im = IMPORT_RE.exec(line);
45
47
  if (im?.[1]?.startsWith('.'))
46
48
  specs.push(im[1]);
49
+ const sideEffect = SIDE_EFFECT_IMPORT_RE.exec(line);
50
+ if (sideEffect?.[1]?.startsWith('.'))
51
+ specs.push(sideEffect[1]);
52
+ const dynamic = DYNAMIC_IMPORT_RE.exec(line);
53
+ if (dynamic?.[1]?.startsWith('.'))
54
+ specs.push(dynamic[1]);
47
55
  const rq = REQUIRE_RE.exec(line);
48
56
  if (rq?.[1]?.startsWith('.'))
49
57
  specs.push(rq[1]);
@@ -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":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAInD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAiCD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAExC,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,SAAS,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,WAAW,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IACzC,cAAc,CAAC,EAAE,CAAC,CAAC,YAAY,EAAE,qBAAqB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC7E,eAAe,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC1E,mBAAmB,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,0BAA0B,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACpF;AA8BD,qBAAa,SAAS;IAgBlB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO,CAAC;IAhBlB,OAAO,CAAC,IAAI,CAA6C;IACzD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAAS;IAE5B,0EAA0E;IAC1E,OAAO,CAAC,WAAW,CAAoC;IAEvD,yEAAyE;IACzE,OAAO,CAAC,aAAa,CAA8B;gBAGzC,MAAM,EAAE,eAAe,EACvB,OAAO,CAAC,EAAE,gBAAgB,YAAA;IAGpC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,WAAW,IAAI,OAAO,CAOzB;IAED;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAczC;;;OAGG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAyBpE;;;OAGG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAWjF;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YA4BnB,aAAa;IAyB3B,wCAAwC;YAC1B,WAAW;IAgBzB,mDAAmD;IACnD,OAAO,CAAC,QAAQ;IAkChB,2DAA2D;IAC3D,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,cAAc;IAqCtB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,wBAAwB;IAmBhC,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,gBAAgB;IAoBxB;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;CAS/B"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/platform/mcp/client.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAInD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAiCD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAExC,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,SAAS,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,WAAW,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IACzC,cAAc,CAAC,EAAE,CAAC,CAAC,YAAY,EAAE,qBAAqB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC7E,eAAe,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC1E,mBAAmB,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,0BAA0B,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACpF;AA8BD,qBAAa,SAAS;IAkBlB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO,CAAC;IAlBlB,OAAO,CAAC,IAAI,CAA6C;IACzD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,mHAAmH;IACnH,OAAO,CAAC,gBAAgB,CAAS;IAEjC,0EAA0E;IAC1E,OAAO,CAAC,WAAW,CAAoC;IAEvD,yEAAyE;IACzE,OAAO,CAAC,aAAa,CAA8B;gBAGzC,MAAM,EAAE,eAAe,EACvB,OAAO,CAAC,EAAE,gBAAgB,YAAA;IAGpC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,WAAW,IAAI,OAAO,CAOzB;IAED;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAczC;;;OAGG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAyBpE;;;OAGG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAWjF;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAgCnB,aAAa;IA0B3B,wCAAwC;YAC1B,WAAW;IAgBzB,mDAAmD;IACnD,OAAO,CAAC,QAAQ;IAkChB,2DAA2D;IAC3D,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,cAAc;IAuCtB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,wBAAwB;IAmBhC,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,gBAAgB;IAuBxB;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;CAS/B"}
@@ -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,
@@ -54,7 +54,7 @@ export class AnthropicCompatProvider {
54
54
  return Boolean(this.apiKey) || this.anonymousConfigured;
55
55
  }
56
56
  async chat(params) {
57
- const { messages, tools, model, maxTokens, signal, systemPrompt, onDelta, reasoningEffort } = params;
57
+ const { messages, tools, model, maxTokens, signal, systemPrompt, onDelta, onRetry, reasoningEffort } = params;
58
58
  return (await instrumentedLlmCall(() => withRetry(async () => {
59
59
  const resolvedModel = model ?? this.defaultModel;
60
60
  const body = {
@@ -131,7 +131,7 @@ export class AnthropicCompatProvider {
131
131
  stopReason: resolveCompletedStopReason(state.stopReason, text),
132
132
  ...withProviderStopReason(state.rawStopReason),
133
133
  };
134
- }), { provider: this.name, model: model ?? this.defaultModel })).result;
134
+ }, undefined, onRetry), { provider: this.name, model: model ?? this.defaultModel })).result;
135
135
  }
136
136
  async describeRuntime(deps) {
137
137
  const { buildStandardProviderAuthRoutes } = await import('./runtime-metadata.js');
@@ -100,7 +100,7 @@ export class AnthropicSdkProvider {
100
100
  phase: 'stream',
101
101
  });
102
102
  }
103
- });
103
+ }, undefined, params.onRetry);
104
104
  }
105
105
  async describeRuntime(deps) {
106
106
  const authRoutes = await buildStandardProviderAuthRoutes({
@@ -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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"}