@dreb/coding-agent 2.32.1 → 2.34.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 (80) hide show
  1. package/README.md +4 -0
  2. package/dist/core/agent-session.d.ts +14 -1
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +59 -8
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/settings-manager.d.ts +18 -0
  7. package/dist/core/settings-manager.d.ts.map +1 -1
  8. package/dist/core/settings-manager.js +22 -0
  9. package/dist/core/settings-manager.js.map +1 -1
  10. package/dist/core/tools/bash.d.ts.map +1 -1
  11. package/dist/core/tools/bash.js +4 -4
  12. package/dist/core/tools/bash.js.map +1 -1
  13. package/dist/core/tools/edit.d.ts.map +1 -1
  14. package/dist/core/tools/edit.js +2 -2
  15. package/dist/core/tools/edit.js.map +1 -1
  16. package/dist/core/tools/find.d.ts.map +1 -1
  17. package/dist/core/tools/find.js +2 -2
  18. package/dist/core/tools/find.js.map +1 -1
  19. package/dist/core/tools/grep.d.ts.map +1 -1
  20. package/dist/core/tools/grep.js +2 -2
  21. package/dist/core/tools/grep.js.map +1 -1
  22. package/dist/core/tools/ls.d.ts.map +1 -1
  23. package/dist/core/tools/ls.js +2 -2
  24. package/dist/core/tools/ls.js.map +1 -1
  25. package/dist/core/tools/read.d.ts.map +1 -1
  26. package/dist/core/tools/read.js +2 -2
  27. package/dist/core/tools/read.js.map +1 -1
  28. package/dist/core/tools/search.d.ts.map +1 -1
  29. package/dist/core/tools/search.js +2 -2
  30. package/dist/core/tools/search.js.map +1 -1
  31. package/dist/core/tools/skill.d.ts.map +1 -1
  32. package/dist/core/tools/skill.js +2 -2
  33. package/dist/core/tools/skill.js.map +1 -1
  34. package/dist/core/tools/subagent.d.ts.map +1 -1
  35. package/dist/core/tools/subagent.js +2 -2
  36. package/dist/core/tools/subagent.js.map +1 -1
  37. package/dist/core/tools/suggest-next.d.ts.map +1 -1
  38. package/dist/core/tools/suggest-next.js +5 -5
  39. package/dist/core/tools/suggest-next.js.map +1 -1
  40. package/dist/core/tools/tasks.d.ts.map +1 -1
  41. package/dist/core/tools/tasks.js +2 -2
  42. package/dist/core/tools/tasks.js.map +1 -1
  43. package/dist/core/tools/wait.d.ts.map +1 -1
  44. package/dist/core/tools/wait.js +2 -2
  45. package/dist/core/tools/wait.js.map +1 -1
  46. package/dist/core/tools/web.d.ts.map +1 -1
  47. package/dist/core/tools/web.js +4 -4
  48. package/dist/core/tools/web.js.map +1 -1
  49. package/dist/core/tools/write.d.ts.map +1 -1
  50. package/dist/core/tools/write.js +1 -1
  51. package/dist/core/tools/write.js.map +1 -1
  52. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  53. package/dist/modes/interactive/components/assistant-message.js +5 -10
  54. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  55. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  56. package/dist/modes/interactive/components/bash-execution.js +4 -4
  57. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  58. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  59. package/dist/modes/interactive/components/branch-summary-message.js +1 -1
  60. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  61. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  62. package/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  63. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  64. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  65. package/dist/modes/interactive/components/custom-message.js +1 -1
  66. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  67. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  68. package/dist/modes/interactive/components/skill-invocation-message.js +1 -1
  69. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  70. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  71. package/dist/modes/interactive/components/tool-execution.js +2 -2
  72. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  73. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  74. package/dist/modes/interactive/components/user-message.js +1 -1
  75. package/dist/modes/interactive/components/user-message.js.map +1 -1
  76. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  77. package/dist/modes/interactive/interactive-mode.js +36 -29
  78. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  79. package/docs/settings.md +20 -0
  80. package/package.json +1 -1
@@ -407,7 +407,7 @@ export class InteractiveMode {
407
407
  else {
408
408
  this.headerContainer.addChild(new Text(theme.bold(theme.fg("accent", "What's New")), 1, 0));
409
409
  this.headerContainer.addChild(new Spacer(1));
410
- this.headerContainer.addChild(new Markdown(this.changelogMarkdown.trim(), 1, 0, this.getMarkdownThemeWithSettings()));
410
+ this.headerContainer.addChild(new Markdown(this.changelogMarkdown.trim(), 1, 0, this.getMarkdownThemeWithSettings(), undefined, true));
411
411
  this.headerContainer.addChild(new Spacer(1));
412
412
  }
413
413
  this.headerContainer.addChild(new DynamicBorder());
@@ -907,7 +907,7 @@ export class InteractiveMode {
907
907
  const contextList = contextFiles
908
908
  .map((f) => theme.fg("dim", ` ${this.formatDisplayPath(f.path)}`))
909
909
  .join("\n");
910
- this.chatContainer.addChild(new Text(`${sectionHeader("Context")}\n${contextList}`, 0, 0));
910
+ this.chatContainer.addChild(new Text(`${sectionHeader("Context")}\n${contextList}`, 0, 0, undefined, true));
911
911
  this.chatContainer.addChild(new Spacer(1));
912
912
  }
913
913
  const memoryIndexes = this.session.resourceLoader.getMemoryIndexes();
@@ -920,7 +920,7 @@ export class InteractiveMode {
920
920
  return theme.fg("dim", ` ${this.formatDisplayPath(m.dir)}/MEMORY.md${label}`);
921
921
  })
922
922
  .join("\n");
923
- this.chatContainer.addChild(new Text(`${sectionHeader("Memory")}\n${memoryList}`, 0, 0));
923
+ this.chatContainer.addChild(new Text(`${sectionHeader("Memory")}\n${memoryList}`, 0, 0, undefined, true));
924
924
  this.chatContainer.addChild(new Spacer(1));
925
925
  }
926
926
  const skills = skillsResult.skills;
@@ -930,7 +930,7 @@ export class InteractiveMode {
930
930
  formatPath: (item) => this.formatDisplayPath(item.path),
931
931
  formatPackagePath: (item) => this.getShortPath(item.path, item.sourceInfo),
932
932
  });
933
- this.chatContainer.addChild(new Text(`${sectionHeader("Skills")}\n${skillList}`, 0, 0));
933
+ this.chatContainer.addChild(new Text(`${sectionHeader("Skills")}\n${skillList}`, 0, 0, undefined, true));
934
934
  this.chatContainer.addChild(new Spacer(1));
935
935
  }
936
936
  const templates = this.session.promptTemplates;
@@ -947,7 +947,7 @@ export class InteractiveMode {
947
947
  return template ? `/${template.name}` : this.formatDisplayPath(item.path);
948
948
  },
949
949
  });
950
- this.chatContainer.addChild(new Text(`${sectionHeader("Prompts")}\n${templateList}`, 0, 0));
950
+ this.chatContainer.addChild(new Text(`${sectionHeader("Prompts")}\n${templateList}`, 0, 0, undefined, true));
951
951
  this.chatContainer.addChild(new Spacer(1));
952
952
  }
953
953
  if (extensions.length > 0) {
@@ -956,7 +956,7 @@ export class InteractiveMode {
956
956
  formatPath: (item) => this.formatDisplayPath(item.path),
957
957
  formatPackagePath: (item) => this.getShortPath(item.path, item.sourceInfo),
958
958
  });
959
- this.chatContainer.addChild(new Text(`${sectionHeader("Extensions", "mdHeading")}\n${extList}`, 0, 0));
959
+ this.chatContainer.addChild(new Text(`${sectionHeader("Extensions", "mdHeading")}\n${extList}`, 0, 0, undefined, true));
960
960
  this.chatContainer.addChild(new Spacer(1));
961
961
  }
962
962
  // Show loaded themes (excluding built-in)
@@ -971,7 +971,7 @@ export class InteractiveMode {
971
971
  formatPath: (item) => this.formatDisplayPath(item.path),
972
972
  formatPackagePath: (item) => this.getShortPath(item.path, item.sourceInfo),
973
973
  });
974
- this.chatContainer.addChild(new Text(`${sectionHeader("Themes")}\n${themeList}`, 0, 0));
974
+ this.chatContainer.addChild(new Text(`${sectionHeader("Themes")}\n${themeList}`, 0, 0, undefined, true));
975
975
  this.chatContainer.addChild(new Spacer(1));
976
976
  }
977
977
  }
@@ -979,13 +979,13 @@ export class InteractiveMode {
979
979
  const skillDiagnostics = skillsResult.diagnostics;
980
980
  if (skillDiagnostics.length > 0) {
981
981
  const warningLines = this.formatDiagnostics(skillDiagnostics, sourceInfos);
982
- this.chatContainer.addChild(new Text(`${theme.fg("warning", "[Skill conflicts]")}\n${warningLines}`, 0, 0));
982
+ this.chatContainer.addChild(new Text(`${theme.fg("warning", "[Skill conflicts]")}\n${warningLines}`, 0, 0, undefined, true));
983
983
  this.chatContainer.addChild(new Spacer(1));
984
984
  }
985
985
  const promptDiagnostics = promptsResult.diagnostics;
986
986
  if (promptDiagnostics.length > 0) {
987
987
  const warningLines = this.formatDiagnostics(promptDiagnostics, sourceInfos);
988
- this.chatContainer.addChild(new Text(`${theme.fg("warning", "[Prompt conflicts]")}\n${warningLines}`, 0, 0));
988
+ this.chatContainer.addChild(new Text(`${theme.fg("warning", "[Prompt conflicts]")}\n${warningLines}`, 0, 0, undefined, true));
989
989
  this.chatContainer.addChild(new Spacer(1));
990
990
  }
991
991
  const extensionDiagnostics = [];
@@ -1002,13 +1002,13 @@ export class InteractiveMode {
1002
1002
  extensionDiagnostics.push(...shortcutDiagnostics);
1003
1003
  if (extensionDiagnostics.length > 0) {
1004
1004
  const warningLines = this.formatDiagnostics(extensionDiagnostics, sourceInfos);
1005
- this.chatContainer.addChild(new Text(`${theme.fg("warning", "[Extension issues]")}\n${warningLines}`, 0, 0));
1005
+ this.chatContainer.addChild(new Text(`${theme.fg("warning", "[Extension issues]")}\n${warningLines}`, 0, 0, undefined, true));
1006
1006
  this.chatContainer.addChild(new Spacer(1));
1007
1007
  }
1008
1008
  const themeDiagnostics = themesResult.diagnostics;
1009
1009
  if (themeDiagnostics.length > 0) {
1010
1010
  const warningLines = this.formatDiagnostics(themeDiagnostics, sourceInfos);
1011
- this.chatContainer.addChild(new Text(`${theme.fg("warning", "[Theme conflicts]")}\n${warningLines}`, 0, 0));
1011
+ this.chatContainer.addChild(new Text(`${theme.fg("warning", "[Theme conflicts]")}\n${warningLines}`, 0, 0, undefined, true));
1012
1012
  this.chatContainer.addChild(new Spacer(1));
1013
1013
  }
1014
1014
  }
@@ -1740,7 +1740,7 @@ export class InteractiveMode {
1740
1740
  */
1741
1741
  showExtensionError(extensionPath, error, stack) {
1742
1742
  const errorMsg = `Extension "${extensionPath}" error: ${error}`;
1743
- const errorText = new Text(theme.fg("error", errorMsg), 1, 0);
1743
+ const errorText = new Text(theme.fg("error", errorMsg), 1, 0, undefined, true);
1744
1744
  this.chatContainer.addChild(errorText);
1745
1745
  if (stack) {
1746
1746
  // Show stack trace in dim color, indented
@@ -1750,7 +1750,7 @@ export class InteractiveMode {
1750
1750
  .map((line) => theme.fg("dim", ` ${line.trim()}`))
1751
1751
  .join("\n");
1752
1752
  if (stackLines) {
1753
- this.chatContainer.addChild(new Text(stackLines, 1, 0));
1753
+ this.chatContainer.addChild(new Text(stackLines, 1, 0, undefined, true));
1754
1754
  }
1755
1755
  }
1756
1756
  this.ui.requestRender();
@@ -2268,7 +2268,7 @@ export class InteractiveMode {
2268
2268
  else if (event.errorMessage) {
2269
2269
  // Compaction failed (e.g., quota exceeded, API error)
2270
2270
  this.chatContainer.addChild(new Spacer(1));
2271
- this.chatContainer.addChild(new Text(theme.fg("error", event.errorMessage), 1, 0));
2271
+ this.chatContainer.addChild(new Text(theme.fg("error", event.errorMessage), 1, 0, undefined, true));
2272
2272
  }
2273
2273
  void this.flushCompactionQueue({ willRetry: event.willRetry });
2274
2274
  this.ui.requestRender();
@@ -2344,6 +2344,13 @@ export class InteractiveMode {
2344
2344
  this.updateBackgroundAgentStatus();
2345
2345
  break;
2346
2346
  }
2347
+ case "parent_paused_for_background_agents": {
2348
+ const count = event.runningAgentCount;
2349
+ const agentWord = count === 1 ? "agent" : "agents";
2350
+ this.showStatus(`Paused automatically — ${count} background ${agentWord} still working. dreb will resume when they report back, or send a message to continue. (configure via backgroundAgents settings)`);
2351
+ this.updateBackgroundAgentStatus();
2352
+ break;
2353
+ }
2347
2354
  case "tasks_update": {
2348
2355
  this.tasksPanel.update(event.tasks);
2349
2356
  this.ui.requestRender();
@@ -2409,7 +2416,7 @@ export class InteractiveMode {
2409
2416
  return;
2410
2417
  }
2411
2418
  const spacer = new Spacer(1);
2412
- const text = new Text(theme.fg("dim", message), 1, 0);
2419
+ const text = new Text(theme.fg("dim", message), 1, 0, undefined, true);
2413
2420
  this.chatContainer.addChild(spacer);
2414
2421
  this.chatContainer.addChild(text);
2415
2422
  this.lastStatusSpacer = spacer;
@@ -2907,12 +2914,12 @@ export class InteractiveMode {
2907
2914
  }
2908
2915
  showError(errorMessage) {
2909
2916
  this.chatContainer.addChild(new Spacer(1));
2910
- this.chatContainer.addChild(new Text(theme.fg("error", `Error: ${errorMessage}`), 1, 0));
2917
+ this.chatContainer.addChild(new Text(theme.fg("error", `Error: ${errorMessage}`), 1, 0, undefined, true));
2911
2918
  this.ui.requestRender();
2912
2919
  }
2913
2920
  showWarning(warningMessage) {
2914
2921
  this.chatContainer.addChild(new Spacer(1));
2915
- this.chatContainer.addChild(new Text(theme.fg("warning", `Warning: ${warningMessage}`), 1, 0));
2922
+ this.chatContainer.addChild(new Text(theme.fg("warning", `Warning: ${warningMessage}`), 1, 0, undefined, true));
2916
2923
  this.ui.requestRender();
2917
2924
  }
2918
2925
  showNewVersionNotification(newVersion) {
@@ -2922,7 +2929,7 @@ export class InteractiveMode {
2922
2929
  const changelogLine = theme.fg("muted", "Changelog: ") + changelogUrl;
2923
2930
  this.chatContainer.addChild(new Spacer(1));
2924
2931
  this.chatContainer.addChild(new DynamicBorder((text) => theme.fg("warning", text)));
2925
- this.chatContainer.addChild(new Text(`${theme.bold(theme.fg("warning", "Update Available"))}\n${updateInstruction}\n${changelogLine}`, 1, 0));
2932
+ this.chatContainer.addChild(new Text(`${theme.bold(theme.fg("warning", "Update Available"))}\n${updateInstruction}\n${changelogLine}`, 1, 0, undefined, true));
2926
2933
  this.chatContainer.addChild(new DynamicBorder((text) => theme.fg("warning", text)));
2927
2934
  this.ui.requestRender();
2928
2935
  }
@@ -2932,7 +2939,7 @@ export class InteractiveMode {
2932
2939
  const packageLines = packages.map((pkg) => `- ${pkg}`).join("\n");
2933
2940
  this.chatContainer.addChild(new Spacer(1));
2934
2941
  this.chatContainer.addChild(new DynamicBorder((text) => theme.fg("warning", text)));
2935
- this.chatContainer.addChild(new Text(`${theme.bold(theme.fg("warning", "Package Updates Available"))}\n${updateInstruction}\n${theme.fg("muted", "Packages:")}\n${packageLines}`, 1, 0));
2942
+ this.chatContainer.addChild(new Text(`${theme.bold(theme.fg("warning", "Package Updates Available"))}\n${updateInstruction}\n${theme.fg("muted", "Packages:")}\n${packageLines}`, 1, 0, undefined, true));
2936
2943
  this.chatContainer.addChild(new DynamicBorder((text) => theme.fg("warning", text)));
2937
2944
  this.ui.requestRender();
2938
2945
  }
@@ -3972,7 +3979,7 @@ export class InteractiveMode {
3972
3979
  const currentName = this.sessionManager.getSessionName();
3973
3980
  if (currentName) {
3974
3981
  this.chatContainer.addChild(new Spacer(1));
3975
- this.chatContainer.addChild(new Text(theme.fg("dim", `Session name: ${currentName}`), 1, 0));
3982
+ this.chatContainer.addChild(new Text(theme.fg("dim", `Session name: ${currentName}`), 1, 0, undefined, true));
3976
3983
  }
3977
3984
  else {
3978
3985
  this.showWarning("Usage: /name <name>");
@@ -3983,7 +3990,7 @@ export class InteractiveMode {
3983
3990
  this.sessionManager.appendSessionInfo(name);
3984
3991
  this.updateTerminalTitle();
3985
3992
  this.chatContainer.addChild(new Spacer(1));
3986
- this.chatContainer.addChild(new Text(theme.fg("dim", `Session name set: ${name}`), 1, 0));
3993
+ this.chatContainer.addChild(new Text(theme.fg("dim", `Session name set: ${name}`), 1, 0, undefined, true));
3987
3994
  this.ui.requestRender();
3988
3995
  }
3989
3996
  handleSessionCommand() {
@@ -4016,7 +4023,7 @@ export class InteractiveMode {
4016
4023
  info += `${theme.fg("dim", "Total:")} ${stats.cost.toFixed(4)}`;
4017
4024
  }
4018
4025
  this.chatContainer.addChild(new Spacer(1));
4019
- this.chatContainer.addChild(new Text(info, 1, 0));
4026
+ this.chatContainer.addChild(new Text(info, 1, 0, undefined, true));
4020
4027
  this.ui.requestRender();
4021
4028
  }
4022
4029
  handleChangelogCommand() {
@@ -4032,7 +4039,7 @@ export class InteractiveMode {
4032
4039
  this.chatContainer.addChild(new DynamicBorder());
4033
4040
  this.chatContainer.addChild(new Text(theme.bold(theme.fg("accent", "What's New")), 1, 0));
4034
4041
  this.chatContainer.addChild(new Spacer(1));
4035
- this.chatContainer.addChild(new Markdown(changelogMarkdown, 1, 1, this.getMarkdownThemeWithSettings()));
4042
+ this.chatContainer.addChild(new Markdown(changelogMarkdown, 1, 1, this.getMarkdownThemeWithSettings(), undefined, true));
4036
4043
  this.chatContainer.addChild(new DynamicBorder());
4037
4044
  this.ui.requestRender();
4038
4045
  }
@@ -4165,7 +4172,7 @@ ${cycleModelForward || cycleModelBackward ? `| \`${cycleModelForward}\` / \`${cy
4165
4172
  this.chatContainer.addChild(new DynamicBorder());
4166
4173
  this.chatContainer.addChild(new Text(theme.bold(theme.fg("accent", "Keyboard Shortcuts")), 1, 0));
4167
4174
  this.chatContainer.addChild(new Spacer(1));
4168
- this.chatContainer.addChild(new Markdown(hotkeys.trim(), 1, 1, this.getMarkdownThemeWithSettings()));
4175
+ this.chatContainer.addChild(new Markdown(hotkeys.trim(), 1, 1, this.getMarkdownThemeWithSettings(), undefined, true));
4169
4176
  this.chatContainer.addChild(new DynamicBorder());
4170
4177
  this.ui.requestRender();
4171
4178
  }
@@ -4213,7 +4220,7 @@ ${cycleModelForward || cycleModelBackward ? `| \`${cycleModelForward}\` / \`${cy
4213
4220
  fs.mkdirSync(path.dirname(debugLogPath), { recursive: true });
4214
4221
  fs.writeFileSync(debugLogPath, debugData);
4215
4222
  this.chatContainer.addChild(new Spacer(1));
4216
- this.chatContainer.addChild(new Text(`${theme.fg("accent", "✓ Debug log written")}\n${theme.fg("muted", debugLogPath)}`, 1, 1));
4223
+ this.chatContainer.addChild(new Text(`${theme.fg("accent", "✓ Debug log written")}\n${theme.fg("muted", debugLogPath)}`, 1, 1, undefined, true));
4217
4224
  this.ui.requestRender();
4218
4225
  }
4219
4226
  handleArminSaysHi() {
@@ -4510,7 +4517,7 @@ ${cycleModelForward || cycleModelBackward ? `| \`${cycleModelForward}\` / \`${cy
4510
4517
  case "off": {
4511
4518
  this.removeBuddy();
4512
4519
  this.chatContainer.addChild(new Spacer(1));
4513
- this.chatContainer.addChild(new Text(theme.fg("muted", "Buddy hidden. Use /buddy to bring them back."), 1, 0));
4520
+ this.chatContainer.addChild(new Text(theme.fg("muted", "Buddy hidden. Use /buddy to bring them back."), 1, 0, undefined, true));
4514
4521
  this.ui.requestRender();
4515
4522
  break;
4516
4523
  }
@@ -4525,7 +4532,7 @@ ${cycleModelForward || cycleModelBackward ? `| \`${cycleModelForward}\` / \`${cy
4525
4532
  }
4526
4533
  case "model": {
4527
4534
  this.chatContainer.addChild(new Spacer(1));
4528
- this.chatContainer.addChild(new Text(result.message, 1, 0));
4535
+ this.chatContainer.addChild(new Text(result.message, 1, 0, undefined, true));
4529
4536
  this.ui.requestRender();
4530
4537
  break;
4531
4538
  }
@@ -4628,12 +4635,12 @@ ${cycleModelForward || cycleModelBackward ? `| \`${cycleModelForward}\` / \`${cy
4628
4635
  async checkAndWarnOllama() {
4629
4636
  const status = await checkOllama();
4630
4637
  if (!status.available) {
4631
- this.chatContainer.addChild(new Text(theme.fg("warning", "⚠️ Buddy reactions require Ollama. Install it at https://ollama.com then pull a model."), 1, 0));
4638
+ this.chatContainer.addChild(new Text(theme.fg("warning", "⚠️ Buddy reactions require Ollama. Install it at https://ollama.com then pull a model."), 1, 0, undefined, true));
4632
4639
  return;
4633
4640
  }
4634
4641
  const nudge = this.buddyController.getModelNudge();
4635
4642
  if (nudge) {
4636
- this.chatContainer.addChild(new Text(theme.fg("warning", `⚠️ ${nudge}`), 1, 0));
4643
+ this.chatContainer.addChild(new Text(theme.fg("warning", `⚠️ ${nudge}`), 1, 0, undefined, true));
4637
4644
  }
4638
4645
  }
4639
4646
  async playHatchAnimation() {