@dreb/coding-agent 2.4.2 → 2.4.4

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 (116) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/cli/file-processor.d.ts.map +1 -1
  3. package/dist/cli/file-processor.js +1 -0
  4. package/dist/cli/file-processor.js.map +1 -1
  5. package/dist/core/agent-session.d.ts +13 -0
  6. package/dist/core/agent-session.d.ts.map +1 -1
  7. package/dist/core/agent-session.js +70 -11
  8. package/dist/core/agent-session.js.map +1 -1
  9. package/dist/core/bash-executor.d.ts.map +1 -1
  10. package/dist/core/bash-executor.js +14 -1
  11. package/dist/core/bash-executor.js.map +1 -1
  12. package/dist/core/buddy/buddy-controller.d.ts.map +1 -1
  13. package/dist/core/buddy/buddy-controller.js +13 -4
  14. package/dist/core/buddy/buddy-controller.js.map +1 -1
  15. package/dist/core/buddy/buddy-manager.d.ts.map +1 -1
  16. package/dist/core/buddy/buddy-manager.js +2 -0
  17. package/dist/core/buddy/buddy-manager.js.map +1 -1
  18. package/dist/core/daily-cost-tracker.d.ts.map +1 -1
  19. package/dist/core/daily-cost-tracker.js +2 -0
  20. package/dist/core/daily-cost-tracker.js.map +1 -1
  21. package/dist/core/extensions/loader.d.ts.map +1 -1
  22. package/dist/core/extensions/loader.js +2 -0
  23. package/dist/core/extensions/loader.js.map +1 -1
  24. package/dist/core/footer-data-provider.d.ts.map +1 -1
  25. package/dist/core/footer-data-provider.js +3 -0
  26. package/dist/core/footer-data-provider.js.map +1 -1
  27. package/dist/core/keybindings.d.ts.map +1 -1
  28. package/dist/core/keybindings.js +1 -0
  29. package/dist/core/keybindings.js.map +1 -1
  30. package/dist/core/package-manager.d.ts.map +1 -1
  31. package/dist/core/package-manager.js +24 -8
  32. package/dist/core/package-manager.js.map +1 -1
  33. package/dist/core/prompt-templates.d.ts.map +1 -1
  34. package/dist/core/prompt-templates.js +2 -0
  35. package/dist/core/prompt-templates.js.map +1 -1
  36. package/dist/core/resolve-config-value.d.ts +3 -1
  37. package/dist/core/resolve-config-value.d.ts.map +1 -1
  38. package/dist/core/resolve-config-value.js +11 -3
  39. package/dist/core/resolve-config-value.js.map +1 -1
  40. package/dist/core/resource-loader.d.ts +3 -0
  41. package/dist/core/resource-loader.d.ts.map +1 -1
  42. package/dist/core/resource-loader.js +69 -29
  43. package/dist/core/resource-loader.js.map +1 -1
  44. package/dist/core/sdk.d.ts.map +1 -1
  45. package/dist/core/sdk.js +17 -0
  46. package/dist/core/sdk.js.map +1 -1
  47. package/dist/core/session-manager.d.ts.map +1 -1
  48. package/dist/core/session-manager.js +6 -1
  49. package/dist/core/session-manager.js.map +1 -1
  50. package/dist/core/skills.d.ts.map +1 -1
  51. package/dist/core/skills.js +5 -1
  52. package/dist/core/skills.js.map +1 -1
  53. package/dist/core/tools/bash.d.ts.map +1 -1
  54. package/dist/core/tools/bash.js +8 -1
  55. package/dist/core/tools/bash.js.map +1 -1
  56. package/dist/core/tools/dreb-paths.d.ts.map +1 -1
  57. package/dist/core/tools/dreb-paths.js +1 -0
  58. package/dist/core/tools/dreb-paths.js.map +1 -1
  59. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  60. package/dist/core/tools/edit-diff.js +1 -0
  61. package/dist/core/tools/edit-diff.js.map +1 -1
  62. package/dist/core/tools/edit.d.ts.map +1 -1
  63. package/dist/core/tools/edit.js +1 -0
  64. package/dist/core/tools/edit.js.map +1 -1
  65. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  66. package/dist/core/tools/file-mutation-queue.js +1 -0
  67. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  68. package/dist/core/tools/grep.d.ts.map +1 -1
  69. package/dist/core/tools/grep.js +8 -0
  70. package/dist/core/tools/grep.js.map +1 -1
  71. package/dist/core/tools/path-utils.d.ts.map +1 -1
  72. package/dist/core/tools/path-utils.js +1 -0
  73. package/dist/core/tools/path-utils.js.map +1 -1
  74. package/dist/core/tools/web.d.ts.map +1 -1
  75. package/dist/core/tools/web.js +1 -0
  76. package/dist/core/tools/web.js.map +1 -1
  77. package/dist/migrations.d.ts.map +1 -1
  78. package/dist/migrations.js +1 -0
  79. package/dist/migrations.js.map +1 -1
  80. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  81. package/dist/modes/interactive/components/tool-execution.js +2 -0
  82. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  83. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  84. package/dist/modes/interactive/interactive-mode.js +5 -1
  85. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  86. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  87. package/dist/modes/interactive/theme/theme.js +4 -0
  88. package/dist/modes/interactive/theme/theme.js.map +1 -1
  89. package/dist/utils/changelog.d.ts.map +1 -1
  90. package/dist/utils/changelog.js +2 -2
  91. package/dist/utils/changelog.js.map +1 -1
  92. package/dist/utils/clipboard-image.d.ts.map +1 -1
  93. package/dist/utils/clipboard-image.js +3 -0
  94. package/dist/utils/clipboard-image.js.map +1 -1
  95. package/dist/utils/clipboard-native.d.ts.map +1 -1
  96. package/dist/utils/clipboard-native.js +1 -0
  97. package/dist/utils/clipboard-native.js.map +1 -1
  98. package/dist/utils/clipboard.d.ts.map +1 -1
  99. package/dist/utils/clipboard.js +5 -3
  100. package/dist/utils/clipboard.js.map +1 -1
  101. package/dist/utils/git.d.ts.map +1 -1
  102. package/dist/utils/git.js +2 -0
  103. package/dist/utils/git.js.map +1 -1
  104. package/dist/utils/image-resize.d.ts.map +1 -1
  105. package/dist/utils/image-resize.js +1 -0
  106. package/dist/utils/image-resize.js.map +1 -1
  107. package/dist/utils/photon.d.ts.map +1 -1
  108. package/dist/utils/photon.js +3 -0
  109. package/dist/utils/photon.js.map +1 -1
  110. package/dist/utils/tools-manager.d.ts.map +1 -1
  111. package/dist/utils/tools-manager.js +1 -0
  112. package/dist/utils/tools-manager.js.map +1 -1
  113. package/docs/custom-provider.md +20 -0
  114. package/docs/sdk.md +5 -0
  115. package/examples/sdk/12-full-control.ts +1 -0
  116. package/package.json +1 -1
@@ -392,10 +392,62 @@ export class AgentSession {
392
392
  // _processAgentEvent, slow earlier queued events can delay agent_end processing
393
393
  // and waitForRetry() can miss the in-flight retry.
394
394
  this._createRetryPromiseForAgentEnd(event);
395
- this._agentEventQueue = this._agentEventQueue.then(() => this._processAgentEvent(event), () => this._processAgentEvent(event));
396
- // Keep queue alive if an event handler fails
397
- this._agentEventQueue.catch(() => { });
395
+ this._agentEventQueue = this._agentEventQueue.then(() => this._processAgentEvent(event), () => {
396
+ // Prior event failed already warned by the .catch() below.
397
+ // Swallow the old rejection and continue with the current event.
398
+ return this._processAgentEvent(event);
399
+ });
400
+ // Prevent unhandled rejection and warn once per error.
401
+ // This fires for the CURRENT event's failure; the next event's rejection
402
+ // handler above silently continues without re-warning.
403
+ this._agentEventQueue.catch((err) => {
404
+ this.warnInSession(`Event queue error: ${err instanceof Error ? err.message : String(err)}`);
405
+ });
398
406
  };
407
+ /**
408
+ * Collect all resource diagnostics from a loader and surface them as a session warning.
409
+ * Used after both initial load (sdk.ts) and user-initiated reload.
410
+ */
411
+ warnResourceDiagnostics(resourceLoader) {
412
+ const diagnostics = [
413
+ ...resourceLoader.getSkills().diagnostics,
414
+ ...resourceLoader.getPrompts().diagnostics,
415
+ ...resourceLoader.getThemes().diagnostics,
416
+ ...resourceLoader.getContextDiagnostics(),
417
+ ];
418
+ const extErrors = resourceLoader.getExtensions().errors;
419
+ if (diagnostics.length === 0 && extErrors.length === 0)
420
+ return;
421
+ const lines = [
422
+ ...diagnostics.map((d) => `- [${d.type}] ${d.message}${d.path ? ` (${d.path})` : ""}`),
423
+ ...extErrors.map((e) => `- [error] Extension: ${e.path}: ${e.error}`),
424
+ ];
425
+ this.warnInSession(`Resource loading issues:\n${lines.join("\n")}`);
426
+ }
427
+ /**
428
+ * Surface a warning in the session so both the human and the AI agent can see it.
429
+ * During streaming: steers the warning as a user message into the conversation.
430
+ * Between turns: queues for delivery with the next user prompt.
431
+ */
432
+ warnInSession(message, options) {
433
+ const suffix = options?.informational
434
+ ? " Note this for context but do not interrupt the current task to discuss it."
435
+ : " Inform the user about this issue and ask how they would like to proceed.";
436
+ const warningContent = `[System Warning] ${message}${suffix}`;
437
+ const warningMessage = {
438
+ role: "custom",
439
+ customType: "system_warning",
440
+ content: warningContent,
441
+ display: true,
442
+ timestamp: Date.now(),
443
+ };
444
+ if (this.isStreaming) {
445
+ this.agent.steer(warningMessage);
446
+ }
447
+ else {
448
+ this._pendingNextTurnMessages.push(warningMessage);
449
+ }
450
+ }
399
451
  _createRetryPromiseForAgentEnd(event) {
400
452
  if (event.type !== "agent_end" || this._retryPromise) {
401
453
  return;
@@ -1011,6 +1063,7 @@ export class AgentSession {
1011
1063
  }
1012
1064
  catch (err) {
1013
1065
  const message = err instanceof Error ? err.message : String(err);
1066
+ this.warnInSession(`Skill expansion failed for "${skillName}": ${message}`);
1014
1067
  if (this._extensionRunner) {
1015
1068
  this._extensionRunner.emitError({
1016
1069
  extensionPath: skill.filePath,
@@ -1018,9 +1071,6 @@ export class AgentSession {
1018
1071
  error: message,
1019
1072
  });
1020
1073
  }
1021
- else {
1022
- console.error(`Skill expansion error for "${skillName}": ${message}`);
1023
- }
1024
1074
  return text; // Return original on error
1025
1075
  }
1026
1076
  }
@@ -1763,14 +1813,20 @@ export class AgentSession {
1763
1813
  this.agent.replaceMessages(messages.slice(0, -1));
1764
1814
  }
1765
1815
  setTimeout(() => {
1766
- this.agent.continue().catch(() => { });
1816
+ this.agent.continue().catch((err) => {
1817
+ // Agent failed to continue after auto-compaction — surface to session
1818
+ this.warnInSession(`Agent failed to continue after compaction: ${err instanceof Error ? err.message : String(err)}`);
1819
+ });
1767
1820
  }, 100);
1768
1821
  }
1769
1822
  else if (this.agent.hasQueuedMessages()) {
1770
1823
  // Auto-compaction can complete while follow-up/steering/custom messages are waiting.
1771
1824
  // Kick the loop so queued messages are actually delivered.
1772
1825
  setTimeout(() => {
1773
- this.agent.continue().catch(() => { });
1826
+ this.agent.continue().catch((err) => {
1827
+ // Agent failed to continue after auto-compaction — surface to session
1828
+ this.warnInSession(`Agent failed to continue after compaction: ${err instanceof Error ? err.message : String(err)}`);
1829
+ });
1774
1830
  }, 100);
1775
1831
  }
1776
1832
  }
@@ -2152,6 +2208,8 @@ export class AgentSession {
2152
2208
  await this._extensionRunner.emit({ type: "session_start" });
2153
2209
  await this.extendResourcesFromExtensions("reload");
2154
2210
  }
2211
+ // After reload completes, surface any resource diagnostics to the session
2212
+ this.warnResourceDiagnostics(this._resourceLoader);
2155
2213
  }
2156
2214
  // =========================================================================
2157
2215
  // Auto-Retry
@@ -2169,7 +2227,7 @@ export class AgentSession {
2169
2227
  return false;
2170
2228
  const err = message.errorMessage;
2171
2229
  // Match: overloaded_error, provider returned error, rate limit, 429, 500, 502, 503, 504, service unavailable, network/connection errors, fetch failed, terminated, retry delay exceeded
2172
- return /overloaded|provider.?returned.?error|rate.?limit|too many requests|429|500|502|503|504|service.?unavailable|server.?error|internal.?error|network.?error|connection.?error|connection.?refused|other side closed|fetch failed|upstream.?connect|reset before headers|socket hang up|timed? out|timeout|terminated|retry delay/i.test(err);
2230
+ return /overloaded|provider.?returned.?error|rate.?limit|too many requests|429|500|502|503|504|service.?unavailable|server.?error|internal.?error|network.?error|connection.?error|connection.?refused|other side closed|fetch failed|ended without|upstream.?connect|reset before headers|socket hang up|timed? out|timeout|terminated|retry delay/i.test(err);
2173
2231
  }
2174
2232
  /**
2175
2233
  * Handle retryable errors with exponential backoff.
@@ -2236,8 +2294,9 @@ export class AgentSession {
2236
2294
  this._retryAbortController = undefined;
2237
2295
  // Retry via continue() - use setTimeout to break out of event handler chain
2238
2296
  setTimeout(() => {
2239
- this.agent.continue().catch(() => {
2240
- // Retry failed - will be caught by next agent_end
2297
+ this.agent.continue().catch((err) => {
2298
+ // Retry failed surface to session so user knows
2299
+ this.warnInSession(`Agent retry failed: ${err instanceof Error ? err.message : String(err)}`);
2241
2300
  });
2242
2301
  }, 0);
2243
2302
  return true;