@dreb/coding-agent 2.19.0 → 2.19.1

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 (56) hide show
  1. package/README.md +1 -0
  2. package/dist/cli/args.d.ts.map +1 -1
  3. package/dist/cli/args.js +3 -2
  4. package/dist/cli/args.js.map +1 -1
  5. package/dist/cli/file-processor.d.ts.map +1 -1
  6. package/dist/cli/file-processor.js +3 -2
  7. package/dist/cli/file-processor.js.map +1 -1
  8. package/dist/core/agent-session.d.ts.map +1 -1
  9. package/dist/core/agent-session.js +6 -5
  10. package/dist/core/agent-session.js.map +1 -1
  11. package/dist/core/buddy/buddy-controller.d.ts.map +1 -1
  12. package/dist/core/buddy/buddy-controller.js +3 -2
  13. package/dist/core/buddy/buddy-controller.js.map +1 -1
  14. package/dist/core/event-bus.d.ts.map +1 -1
  15. package/dist/core/event-bus.js +2 -1
  16. package/dist/core/event-bus.js.map +1 -1
  17. package/dist/core/logger.d.ts +29 -0
  18. package/dist/core/logger.d.ts.map +1 -0
  19. package/dist/core/logger.js +54 -0
  20. package/dist/core/logger.js.map +1 -0
  21. package/dist/core/model-resolver.d.ts.map +1 -1
  22. package/dist/core/model-resolver.js +3 -2
  23. package/dist/core/model-resolver.js.map +1 -1
  24. package/dist/core/package-manager.d.ts.map +1 -1
  25. package/dist/core/package-manager.js +25 -2
  26. package/dist/core/package-manager.js.map +1 -1
  27. package/dist/core/stderr-guard.d.ts +37 -0
  28. package/dist/core/stderr-guard.d.ts.map +1 -0
  29. package/dist/core/stderr-guard.js +90 -0
  30. package/dist/core/stderr-guard.js.map +1 -0
  31. package/dist/core/timings.d.ts.map +1 -1
  32. package/dist/core/timings.js +5 -4
  33. package/dist/core/timings.js.map +1 -1
  34. package/dist/core/tools/subagent.d.ts.map +1 -1
  35. package/dist/core/tools/subagent.js +18 -17
  36. package/dist/core/tools/subagent.js.map +1 -1
  37. package/dist/core/tools/terminal-render.d.ts.map +1 -1
  38. package/dist/core/tools/terminal-render.js +2 -1
  39. package/dist/core/tools/terminal-render.js.map +1 -1
  40. package/dist/core/tools/web-search-queue.d.ts.map +1 -1
  41. package/dist/core/tools/web-search-queue.js +2 -1
  42. package/dist/core/tools/web-search-queue.js.map +1 -1
  43. package/dist/core/tools/web.d.ts.map +1 -1
  44. package/dist/core/tools/web.js +6 -5
  45. package/dist/core/tools/web.js.map +1 -1
  46. package/dist/main.d.ts.map +1 -1
  47. package/dist/main.js +25 -24
  48. package/dist/main.js.map +1 -1
  49. package/dist/modes/interactive/interactive-mode.d.ts +5 -0
  50. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  51. package/dist/modes/interactive/interactive-mode.js +32 -2
  52. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  53. package/dist/modes/print-mode.d.ts.map +1 -1
  54. package/dist/modes/print-mode.js +3 -2
  55. package/dist/modes/print-mode.js.map +1 -1
  56. package/package.json +1 -1
@@ -9,6 +9,7 @@ import { Type } from "@sinclair/typebox";
9
9
  import { CONFIG_DIR_NAME, getPackageDir, getSubagentSessionsDir } from "../../config.js";
10
10
  import { keyHint } from "../../modes/interactive/components/keybinding-hints.js";
11
11
  import { attachJsonlLineReader } from "../../modes/rpc/jsonl.js";
12
+ import { log } from "../logger.js";
12
13
  import { resolveCliModel } from "../model-resolver.js";
13
14
  import { getTextOutput, invalidArgText, str } from "./render-utils.js";
14
15
  import { wrapToolDefinition } from "./tool-definition-wrapper.js";
@@ -87,20 +88,20 @@ function loadAgentsFromDir(dir, agents) {
87
88
  const content = readFileSync(join(dir, file), "utf-8");
88
89
  const parsed = parseAgentFrontmatter(content);
89
90
  if (!parsed.ok) {
90
- console.error(`[subagent] Skipping agent file ${join(dir, file)}: ${parsed.error}`);
91
+ log.warn(`[subagent] Skipping agent file ${join(dir, file)}: ${parsed.error}`);
91
92
  }
92
93
  else {
93
94
  agents.set(parsed.config.name, parsed.config);
94
95
  }
95
96
  }
96
97
  catch (err) {
97
- console.error(`[subagent] Could not read agent file ${join(dir, file)}: ${err instanceof Error ? err.message : String(err)}`);
98
+ log.warn(`[subagent] Could not read agent file ${join(dir, file)}: ${err instanceof Error ? err.message : String(err)}`);
98
99
  }
99
100
  }
100
101
  }
101
102
  catch (err) {
102
103
  if (err.code !== "ENOENT") {
103
- console.error(`[subagent] Could not read agents directory ${dir}: ${err instanceof Error ? err.message : String(err)}`);
104
+ log.warn(`[subagent] Could not read agents directory ${dir}: ${err instanceof Error ? err.message : String(err)}`);
104
105
  }
105
106
  }
106
107
  }
@@ -141,7 +142,7 @@ function findDrebBinary() {
141
142
  }
142
143
  async function spawnSubagent(agentConfig, task, cwd, signal, onProgress, parentProvider, sessionDir) {
143
144
  const drebBin = findDrebBinary();
144
- console.error(`[subagent] spawn: agent=${agentConfig.name} cwd=${cwd}`);
145
+ log.debug(`[subagent] spawn: agent=${agentConfig.name} cwd=${cwd}`);
145
146
  // Validate cwd exists — spawn() throws a misleading ENOENT blaming the
146
147
  // binary when the cwd is invalid, making the real cause hard to diagnose
147
148
  if (!existsSync(cwd)) {
@@ -227,12 +228,12 @@ async function spawnSubagent(agentConfig, task, cwd, signal, onProgress, parentP
227
228
  }
228
229
  });
229
230
  proc.stderr?.on("error", (err) => {
230
- console.error(`[subagent] stderr stream error (agent=${agentConfig.name}): ${err.message}`);
231
+ log.warn(`[subagent] stderr stream error (agent=${agentConfig.name}): ${err.message}`);
231
232
  });
232
233
  // Parse JSONL events from stdout
233
234
  if (proc.stdout) {
234
235
  proc.stdout.on("error", (err) => {
235
- console.error(`[subagent] stdout stream error (agent=${agentConfig.name}): ${err.message}`);
236
+ log.warn(`[subagent] stdout stream error (agent=${agentConfig.name}): ${err.message}`);
236
237
  });
237
238
  attachJsonlLineReader(proc.stdout, (line) => {
238
239
  if (!line.trim())
@@ -248,7 +249,7 @@ async function spawnSubagent(agentConfig, task, cwd, signal, onProgress, parentP
248
249
  // (e.g. startup errors printed before JSONL mode begins)
249
250
  plainStdoutLines.push(line.trim());
250
251
  if (line.trim().startsWith("{")) {
251
- console.error(`[subagent] Failed to parse JSONL event: ${line.slice(0, 200)}`);
252
+ log.warn(`[subagent] Failed to parse JSONL event: ${line.slice(0, 200)}`);
252
253
  }
253
254
  return;
254
255
  }
@@ -304,7 +305,7 @@ async function spawnSubagent(agentConfig, task, cwd, signal, onProgress, parentP
304
305
  signal?.removeEventListener("abort", onAbort);
305
306
  const exitCode = code ?? 1;
306
307
  const stderr = stderrChunks.join("");
307
- console.error(`[subagent] close: agent=${agentConfig.name} exit=${exitCode} messages=${collectedMessages.length}${exitCode !== 0 ? ` stderr=${stderr.slice(0, 200)} stdout=${plainStdoutLines.join("|").slice(0, 200)}` : ""}`);
308
+ log.debug(`[subagent] close: agent=${agentConfig.name} exit=${exitCode} messages=${collectedMessages.length}${exitCode !== 0 ? ` stderr=${stderr.slice(0, 200)} stdout=${plainStdoutLines.join("|").slice(0, 200)}` : ""}`);
308
309
  // Extract final text output from collected assistant messages
309
310
  const outputParts = [];
310
311
  for (const msg of collectedMessages) {
@@ -375,12 +376,12 @@ export function discoverSessionFile(sessionDir, agentName) {
375
376
  }
376
377
  }
377
378
  if (best) {
378
- console.error(`[subagent] session file: ${best.path} (agent=${agentName})`);
379
+ log.debug(`[subagent] session file: ${best.path} (agent=${agentName})`);
379
380
  return best.path;
380
381
  }
381
382
  }
382
383
  catch (err) {
383
- console.error(`[subagent] failed to discover session file (agent=${agentName}): ${err instanceof Error ? err.message : String(err)}`);
384
+ log.warn(`[subagent] failed to discover session file (agent=${agentName}): ${err instanceof Error ? err.message : String(err)}`);
384
385
  }
385
386
  return undefined;
386
387
  }
@@ -570,7 +571,7 @@ export async function resolveModelForSubagentSpawn(models, parentProvider, regis
570
571
  lastError = resolved.error;
571
572
  const reason = compactErrorReason(resolved.error);
572
573
  skippedModels.push({ model: modelStr, reason });
573
- console.error(`[subagent] Model "${modelStr}" unavailable (${reason}). Trying next fallback...`);
574
+ log.warn(`[subagent] Model "${modelStr}" unavailable (${reason}). Trying next fallback...`);
574
575
  continue;
575
576
  }
576
577
  const modelObj = resolved.provider ? registry.find(resolved.provider, resolved.modelId) : undefined;
@@ -584,11 +585,11 @@ export async function resolveModelForSubagentSpawn(models, parentProvider, regis
584
585
  if (!probe.ok) {
585
586
  lastError = probe.reason;
586
587
  skippedModels.push({ model: modelStr, reason: probe.reason });
587
- console.error(`[subagent] Model "${modelStr}" failed probe (${probe.reason}). Trying next fallback...`);
588
+ log.warn(`[subagent] Model "${modelStr}" failed probe (${probe.reason}). Trying next fallback...`);
588
589
  continue;
589
590
  }
590
591
  }
591
- console.error(`[subagent] Using model "${resolved.modelId}" for subagent.`);
592
+ log.debug(`[subagent] Using model "${resolved.modelId}" for subagent.`);
592
593
  return { ...resolved, skippedModels };
593
594
  }
594
595
  if (signal?.aborted)
@@ -597,7 +598,7 @@ export async function resolveModelForSubagentSpawn(models, parentProvider, regis
597
598
  const parentResolved = resolveModelStringSingle(parentModel, parentProvider, registry);
598
599
  if (parentResolved.ok) {
599
600
  const warning = `Agent preferred models were unavailable. Falling back to parent model "${parentResolved.modelId}".`;
600
- console.error(`[subagent] ${warning}`);
601
+ log.warn(`[subagent] ${warning}`);
601
602
  return { ...parentResolved, warning, skippedModels };
602
603
  }
603
604
  lastError = parentResolved.error;
@@ -1019,7 +1020,7 @@ export function createSubagentToolDefinition(cwd, options) {
1019
1020
  onBackgroundComplete(agentId, result, bgSignal.aborted);
1020
1021
  }
1021
1022
  catch (err) {
1022
- console.error(`[subagent] onBackgroundComplete threw for agent ${agentId}: ${err instanceof Error ? err.message : String(err)}. Background result lost.`);
1023
+ log.warn(`[subagent] onBackgroundComplete threw for agent ${agentId}: ${err instanceof Error ? err.message : String(err)}. Background result lost.`);
1023
1024
  }
1024
1025
  };
1025
1026
  const run = async () => {
@@ -1051,7 +1052,7 @@ export function createSubagentToolDefinition(cwd, options) {
1051
1052
  }
1052
1053
  };
1053
1054
  run().catch((err) => {
1054
- console.error(`[subagent] Unhandled background error (${agentId}): ${err instanceof Error ? err.message : String(err)}`);
1055
+ log.warn(`[subagent] Unhandled background error (${agentId}): ${err instanceof Error ? err.message : String(err)}`);
1055
1056
  const entry = backgroundAgentRegistry.get(agentId);
1056
1057
  if (entry && entry.status === "running")
1057
1058
  entry.status = "failed";
@@ -1067,7 +1068,7 @@ export function createSubagentToolDefinition(cwd, options) {
1067
1068
  }, bgSignal.aborted);
1068
1069
  }
1069
1070
  catch (notifyErr) {
1070
- console.error(`[subagent] CRITICAL: Last-resort notification failed for ${agentId}: ${notifyErr instanceof Error ? notifyErr.message : String(notifyErr)}`);
1071
+ log.error(`[subagent] CRITICAL: Last-resort notification failed for ${agentId}: ${notifyErr instanceof Error ? notifyErr.message : String(notifyErr)}`);
1071
1072
  }
1072
1073
  });
1073
1074
  return agentId;