aura-code 0.6.3 → 0.10.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 (265) hide show
  1. package/README.md +47 -164
  2. package/dist/agent/affect.d.ts +13 -0
  3. package/dist/agent/affect.js +34 -0
  4. package/dist/agent/affect.js.map +1 -0
  5. package/dist/agent/compactor.d.ts +27 -4
  6. package/dist/agent/compactor.js +185 -54
  7. package/dist/agent/compactor.js.map +1 -1
  8. package/dist/agent/confess.d.ts +35 -0
  9. package/dist/agent/confess.js +296 -0
  10. package/dist/agent/confess.js.map +1 -0
  11. package/dist/agent/context.d.ts +0 -4
  12. package/dist/agent/context.js +0 -38
  13. package/dist/agent/context.js.map +1 -1
  14. package/dist/agent/domain-expertise.d.ts +22 -0
  15. package/dist/agent/domain-expertise.js +110 -0
  16. package/dist/agent/domain-expertise.js.map +1 -0
  17. package/dist/agent/executive-queue.d.ts +26 -0
  18. package/dist/agent/executive-queue.js +50 -0
  19. package/dist/agent/executive-queue.js.map +1 -0
  20. package/dist/agent/generational-flush.d.ts +28 -0
  21. package/dist/agent/generational-flush.js +48 -0
  22. package/dist/agent/generational-flush.js.map +1 -0
  23. package/dist/agent/loop-profile.d.ts +50 -0
  24. package/dist/agent/loop-profile.js +88 -0
  25. package/dist/agent/loop-profile.js.map +1 -0
  26. package/dist/agent/loop.d.ts +14 -5
  27. package/dist/agent/loop.js +167 -39
  28. package/dist/agent/loop.js.map +1 -1
  29. package/dist/agent/memory-consolidate.d.ts +14 -0
  30. package/dist/agent/memory-consolidate.js +141 -0
  31. package/dist/agent/memory-consolidate.js.map +1 -0
  32. package/dist/agent/mixture.d.ts +33 -0
  33. package/dist/agent/mixture.js +138 -0
  34. package/dist/agent/mixture.js.map +1 -0
  35. package/dist/agent/spawner.js +2 -2
  36. package/dist/agent/spawner.js.map +1 -1
  37. package/dist/agent/system-prompt.d.ts +1 -1
  38. package/dist/agent/system-prompt.js +50 -22
  39. package/dist/agent/system-prompt.js.map +1 -1
  40. package/dist/agent/unified-memory.d.ts +15 -0
  41. package/dist/agent/unified-memory.js +164 -0
  42. package/dist/agent/unified-memory.js.map +1 -0
  43. package/dist/checkpoints/engine.d.ts +44 -0
  44. package/dist/checkpoints/engine.js +324 -0
  45. package/dist/checkpoints/engine.js.map +1 -0
  46. package/dist/cli/command-palette.d.ts +26 -0
  47. package/dist/cli/command-palette.js +133 -0
  48. package/dist/cli/command-palette.js.map +1 -0
  49. package/dist/cli/context-health.d.ts +51 -0
  50. package/dist/cli/context-health.js +187 -0
  51. package/dist/cli/context-health.js.map +1 -0
  52. package/dist/cli/diamond.d.ts +67 -0
  53. package/dist/cli/diamond.js +222 -12
  54. package/dist/cli/diamond.js.map +1 -1
  55. package/dist/cli/dic.d.ts +2 -0
  56. package/dist/cli/dic.js +106 -0
  57. package/dist/cli/dic.js.map +1 -0
  58. package/dist/cli/diff-view.d.ts +18 -0
  59. package/dist/cli/diff-view.js +114 -0
  60. package/dist/cli/diff-view.js.map +1 -0
  61. package/dist/cli/display.d.ts +18 -4
  62. package/dist/cli/display.js +74 -151
  63. package/dist/cli/display.js.map +1 -1
  64. package/dist/cli/help-data.d.ts +7 -0
  65. package/dist/cli/help-data.js +80 -0
  66. package/dist/cli/help-data.js.map +1 -0
  67. package/dist/cli/index.js +1002 -852
  68. package/dist/cli/index.js.map +1 -1
  69. package/dist/cli/markdown.d.ts +5 -0
  70. package/dist/cli/markdown.js +128 -0
  71. package/dist/cli/markdown.js.map +1 -0
  72. package/dist/cli/model-select.d.ts +39 -0
  73. package/dist/cli/model-select.js +65 -0
  74. package/dist/cli/model-select.js.map +1 -0
  75. package/dist/cli/tui.d.ts +34 -0
  76. package/dist/cli/tui.js +1176 -0
  77. package/dist/cli/tui.js.map +1 -0
  78. package/dist/config/defaults.d.ts +6 -17
  79. package/dist/config/defaults.js +25 -46
  80. package/dist/config/defaults.js.map +1 -1
  81. package/dist/config/project-config.d.ts +2 -6
  82. package/dist/config/project-config.js +2 -2
  83. package/dist/config/project-config.js.map +1 -1
  84. package/dist/doctor/checks.d.ts +18 -0
  85. package/dist/doctor/checks.js +524 -0
  86. package/dist/doctor/checks.js.map +1 -0
  87. package/dist/doctor/index.d.ts +4 -0
  88. package/dist/doctor/index.js +229 -0
  89. package/dist/doctor/index.js.map +1 -0
  90. package/dist/doctor/repair.d.ts +19 -0
  91. package/dist/doctor/repair.js +126 -0
  92. package/dist/doctor/repair.js.map +1 -0
  93. package/dist/doctor/types.d.ts +38 -0
  94. package/dist/doctor/types.js +10 -0
  95. package/dist/doctor/types.js.map +1 -0
  96. package/dist/dream/dream.d.ts +79 -59
  97. package/dist/dream/dream.js +324 -144
  98. package/dist/dream/dream.js.map +1 -1
  99. package/dist/dream/episode.d.ts +17 -0
  100. package/dist/dream/episode.js +116 -0
  101. package/dist/dream/episode.js.map +1 -0
  102. package/dist/kanban/engine.d.ts +26 -0
  103. package/dist/kanban/engine.js +208 -0
  104. package/dist/kanban/engine.js.map +1 -0
  105. package/dist/kanban/types.d.ts +19 -0
  106. package/dist/kanban/types.js +9 -1
  107. package/dist/kanban/types.js.map +1 -1
  108. package/dist/machina/render-html.js +4 -2
  109. package/dist/machina/render-html.js.map +1 -1
  110. package/dist/machina/render-terminal.js +11 -4
  111. package/dist/machina/render-terminal.js.map +1 -1
  112. package/dist/machina/repair.d.ts +23 -0
  113. package/dist/machina/repair.js +98 -0
  114. package/dist/machina/repair.js.map +1 -0
  115. package/dist/machina/spec.js +12 -12
  116. package/dist/machina/spec.js.map +1 -1
  117. package/dist/machina/verify.d.ts +13 -1
  118. package/dist/machina/verify.js +12 -2
  119. package/dist/machina/verify.js.map +1 -1
  120. package/dist/mining/extract.d.ts +34 -0
  121. package/dist/mining/extract.js +229 -0
  122. package/dist/mining/extract.js.map +1 -0
  123. package/dist/mining/refine.d.ts +28 -0
  124. package/dist/mining/refine.js +256 -0
  125. package/dist/mining/refine.js.map +1 -0
  126. package/dist/perception/extractor.js +5 -3
  127. package/dist/perception/extractor.js.map +1 -1
  128. package/dist/perception/graph-store.d.ts +0 -11
  129. package/dist/perception/graph-store.js +0 -33
  130. package/dist/perception/graph-store.js.map +1 -1
  131. package/dist/perception/index.d.ts +1 -1
  132. package/dist/perception/index.js +1 -2
  133. package/dist/perception/index.js.map +1 -1
  134. package/dist/plugins/commands.d.ts +38 -0
  135. package/dist/plugins/commands.js +134 -0
  136. package/dist/plugins/commands.js.map +1 -0
  137. package/dist/plugins/frontmatter.d.ts +14 -0
  138. package/dist/plugins/frontmatter.js +78 -0
  139. package/dist/plugins/frontmatter.js.map +1 -0
  140. package/dist/plugins/hooks.d.ts +12 -0
  141. package/dist/plugins/hooks.js +148 -0
  142. package/dist/plugins/hooks.js.map +1 -0
  143. package/dist/plugins/loader.d.ts +7 -0
  144. package/dist/plugins/loader.js +255 -0
  145. package/dist/plugins/loader.js.map +1 -0
  146. package/dist/plugins/market.d.ts +23 -0
  147. package/dist/plugins/market.js +281 -0
  148. package/dist/plugins/market.js.map +1 -0
  149. package/dist/plugins/types.d.ts +90 -0
  150. package/dist/plugins/types.js +20 -0
  151. package/dist/plugins/types.js.map +1 -0
  152. package/dist/providers/anthropic-oauth-draft.d.ts +119 -0
  153. package/dist/providers/anthropic-oauth-draft.js +414 -0
  154. package/dist/providers/anthropic-oauth-draft.js.map +1 -0
  155. package/dist/providers/anthropic.d.ts +4 -1
  156. package/dist/providers/anthropic.js +35 -7
  157. package/dist/providers/anthropic.js.map +1 -1
  158. package/dist/providers/factory.d.ts +43 -19
  159. package/dist/providers/factory.js +183 -129
  160. package/dist/providers/factory.js.map +1 -1
  161. package/dist/providers/google.js +9 -22
  162. package/dist/providers/google.js.map +1 -1
  163. package/dist/providers/live-models.d.ts +23 -0
  164. package/dist/providers/live-models.js +145 -0
  165. package/dist/providers/live-models.js.map +1 -0
  166. package/dist/providers/openai-compatible.d.ts +1 -12
  167. package/dist/providers/openai-compatible.js +71 -108
  168. package/dist/providers/openai-compatible.js.map +1 -1
  169. package/dist/providers/resilient-factory.js +1 -1
  170. package/dist/providers/resilient-factory.js.map +1 -1
  171. package/dist/repl/queue.d.ts +22 -0
  172. package/dist/repl/queue.js +165 -0
  173. package/dist/repl/queue.js.map +1 -0
  174. package/dist/repl/side-channel.d.ts +23 -0
  175. package/dist/repl/side-channel.js +63 -0
  176. package/dist/repl/side-channel.js.map +1 -0
  177. package/dist/research/council.d.ts +2 -0
  178. package/dist/research/council.js +29 -4
  179. package/dist/research/council.js.map +1 -1
  180. package/dist/ruby/alternator.d.ts +11 -30
  181. package/dist/ruby/alternator.js +59 -38
  182. package/dist/ruby/alternator.js.map +1 -1
  183. package/dist/ruby/episode-capture.d.ts +0 -10
  184. package/dist/ruby/episode-capture.js +0 -33
  185. package/dist/ruby/episode-capture.js.map +1 -1
  186. package/dist/ruby/types.js +1 -1
  187. package/dist/ruby/types.js.map +1 -1
  188. package/dist/safety/path-jail.d.ts +17 -0
  189. package/dist/safety/path-jail.js +100 -0
  190. package/dist/safety/path-jail.js.map +1 -0
  191. package/dist/safety/permissions.d.ts +12 -21
  192. package/dist/safety/permissions.js +81 -216
  193. package/dist/safety/permissions.js.map +1 -1
  194. package/dist/safety/ssrf.d.ts +29 -0
  195. package/dist/safety/ssrf.js +185 -0
  196. package/dist/safety/ssrf.js.map +1 -0
  197. package/dist/server/index.js +64 -10
  198. package/dist/server/index.js.map +1 -1
  199. package/dist/setup/first-run.d.ts +0 -24
  200. package/dist/setup/first-run.js +10 -344
  201. package/dist/setup/first-run.js.map +1 -1
  202. package/dist/setup/key-store.d.ts +12 -0
  203. package/dist/setup/key-store.js +108 -0
  204. package/dist/setup/key-store.js.map +1 -0
  205. package/dist/setup/provider-registry.js +31 -18
  206. package/dist/setup/provider-registry.js.map +1 -1
  207. package/dist/setup/provider-test.d.ts +7 -0
  208. package/dist/setup/provider-test.js +73 -10
  209. package/dist/setup/provider-test.js.map +1 -1
  210. package/dist/setup/provider-wizard.d.ts +4 -1
  211. package/dist/setup/provider-wizard.js +92 -26
  212. package/dist/setup/provider-wizard.js.map +1 -1
  213. package/dist/setup/xiaomi.d.ts +1 -1
  214. package/dist/setup/xiaomi.js +3 -3
  215. package/dist/setup/xiaomi.js.map +1 -1
  216. package/dist/tools/browser.js +14 -10
  217. package/dist/tools/browser.js.map +1 -1
  218. package/dist/tools/clipboard.js +7 -1
  219. package/dist/tools/clipboard.js.map +1 -1
  220. package/dist/tools/dictate.d.ts +60 -0
  221. package/dist/tools/dictate.js +983 -0
  222. package/dist/tools/dictate.js.map +1 -0
  223. package/dist/tools/dictate_patched.js +1057 -0
  224. package/dist/tools/edit-file.js +10 -2
  225. package/dist/tools/edit-file.js.map +1 -1
  226. package/dist/tools/http-request.js +14 -4
  227. package/dist/tools/http-request.js.map +1 -1
  228. package/dist/tools/image-read.js +34 -2
  229. package/dist/tools/image-read.js.map +1 -1
  230. package/dist/tools/index.d.ts +16 -1
  231. package/dist/tools/index.js +59 -8
  232. package/dist/tools/index.js.map +1 -1
  233. package/dist/tools/mcp.js +12 -0
  234. package/dist/tools/mcp.js.map +1 -1
  235. package/dist/tools/read-file.js +10 -14
  236. package/dist/tools/read-file.js.map +1 -1
  237. package/dist/tools/telegram-audio-policy.d.ts +30 -0
  238. package/dist/tools/telegram-audio-policy.js +49 -0
  239. package/dist/tools/telegram-audio-policy.js.map +1 -0
  240. package/dist/tools/telegram-bot.js +1136 -537
  241. package/dist/tools/telegram-bot.js.map +1 -1
  242. package/dist/tools/telegram-voice.d.ts +18 -5
  243. package/dist/tools/telegram-voice.js +54 -12
  244. package/dist/tools/telegram-voice.js.map +1 -1
  245. package/dist/tools/telegram.d.ts +3 -3
  246. package/dist/tools/telegram.js +5 -84
  247. package/dist/tools/telegram.js.map +1 -1
  248. package/dist/tools/tools.d.ts +2 -14
  249. package/dist/tools/tools.js +79 -144
  250. package/dist/tools/tools.js.map +1 -1
  251. package/dist/tools/web-fetch.js +39 -7
  252. package/dist/tools/web-fetch.js.map +1 -1
  253. package/dist/tools/web-search.d.ts +0 -20
  254. package/dist/tools/web-search.js +40 -137
  255. package/dist/tools/web-search.js.map +1 -1
  256. package/dist/util/errors.js +1 -15
  257. package/dist/util/errors.js.map +1 -1
  258. package/dist/util/json-repair.d.ts +11 -0
  259. package/dist/util/json-repair.js +31 -0
  260. package/dist/util/json-repair.js.map +1 -0
  261. package/dist/util/rate-limiter.js +2 -8
  262. package/dist/util/rate-limiter.js.map +1 -1
  263. package/dist/viz/index.js +793 -792
  264. package/dist/viz/index.js.map +1 -1
  265. package/package.json +12 -32
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const diamond_js_1 = require("./diamond.js");
9
+ const dictate_js_1 = require("../tools/dictate.js");
10
+ const minimist_1 = __importDefault(require("minimist"));
11
+ // ─────────────────────────────────────────────────────────────────────────────
12
+ // dic — standalone dictation command
13
+ // Usage:
14
+ // dic Record mic → transcribe (Ctrl+C to stop)
15
+ // dic speak <text> Speak text aloud via MiMo TTS
16
+ // dic devices List available audio input devices
17
+ // dic voices List available MiMo TTS voices
18
+ // dic --device <name> Use a specific audio input device
19
+ // ─────────────────────────────────────────────────────────────────────────────
20
+ const rawArgs = process.argv.slice(2);
21
+ const parsed = (0, minimist_1.default)(rawArgs);
22
+ const sub = parsed._[0];
23
+ if (sub === 'toggle') {
24
+ // One-hotkey dictation: 1st press starts recording, 2nd press stops +
25
+ // transcribes + types into the focused window (with Enter). Built for a
26
+ // global shortcut (e.g. KDE Super+Space bound to `dic toggle`).
27
+ const deviceId = parsed.device || undefined;
28
+ const submit = parsed.submit !== false && !parsed['no-submit'];
29
+ (0, dictate_js_1.toggleDictation)({ deviceId, submit }).catch(e => {
30
+ console.error(chalk_1.default.hex('#b15439')(`\nFatal: ${String(e)}`));
31
+ process.exit(1);
32
+ });
33
+ }
34
+ else if (sub === 'devices' || sub === 'device') {
35
+ (0, dictate_js_1.listDevices)();
36
+ }
37
+ else if (sub === 'speak') {
38
+ const voice = parsed.voice || undefined;
39
+ const textParts = parsed._.slice(1);
40
+ const text = textParts.join(' ').trim();
41
+ if (!text) {
42
+ console.error(chalk_1.default.hex('#b15439')('Usage: dic speak <text> [--voice <id>]\n'));
43
+ process.exit(1);
44
+ }
45
+ (0, dictate_js_1.speakText)(text, voice).catch(e => {
46
+ console.error(chalk_1.default.hex('#b15439')(`\nFatal: ${String(e)}`));
47
+ process.exit(1);
48
+ });
49
+ }
50
+ else if (sub === 'voices') {
51
+ (0, dictate_js_1.listVoices)();
52
+ }
53
+ else if (sub === 'help' || parsed.help || parsed.h) {
54
+ console.log(`
55
+ ${chalk_1.default.hex('#cc785c').bold('dic')} ${chalk_1.default.hex('#8a7768')('— speech-to-text & text-to-speech')}
56
+
57
+ ${chalk_1.default.hex(diamond_js_1.FAINT_HEX)('Usage:')}
58
+ ${chalk_1.default.hex('#8a7768')('dic')} Record → transcribe → copy + type into focused window
59
+ ${chalk_1.default.hex('#8a7768')('dic --no-inject')} Record → transcribe → clipboard only (no typing)
60
+ ${chalk_1.default.hex('#8a7768')('dic toggle')} Hotkey mode: 1st press records, 2nd press sends (types + Enter)
61
+ ${chalk_1.default.hex('#8a7768')('dic toggle --no-submit')} Toggle, but don't press Enter after typing
62
+ ${chalk_1.default.hex('#8a7768')('dic loop')} Continuous: speak → type → repeat (Ctrl+C to stop)
63
+ ${chalk_1.default.hex('#8a7768')('dic loop --silence 2000')} Continuous with custom silence threshold (ms)
64
+ ${chalk_1.default.hex('#8a7768')('dic --device <name>')} Record with a specific audio device
65
+ ${chalk_1.default.hex('#8a7768')('dic devices')} List available audio input devices
66
+ ${chalk_1.default.hex('#8a7768')('dic speak <text>')} Speak text aloud via MiMo TTS
67
+ ${chalk_1.default.hex('#8a7768')('dic speak <text> --voice Chloe')} Speak with a specific voice
68
+ ${chalk_1.default.hex('#8a7768')('dic voices')} List available TTS voices
69
+
70
+ ${chalk_1.default.hex(diamond_js_1.FAINT_HEX)('API keys:')}
71
+ PARAKEET_BASE_URL Local NVIDIA Parakeet ASR (self-hosted, no key)
72
+ XIAOMI_API_KEY MiMo ASR (STT) + MiMo TTS — free tier available
73
+ OPENAI_API_KEY OpenAI Whisper (STT fallback)
74
+ GROQ_API_KEY Groq Whisper (STT fallback, very fast)
75
+
76
+ ${chalk_1.default.hex(diamond_js_1.FAINT_HEX)('Notes:')}
77
+ - STT prioritizes PARAKEET_BASE_URL > XIAOMI_API_KEY > OPENAI_API_KEY > GROQ_API_KEY
78
+ - TTS requires XIAOMI_API_KEY (limited-time free)
79
+ - Transcriptions are automatically copied to clipboard
80
+ - Injection (typing into the focused window) is ON by default; use --no-inject to disable
81
+ - KDE/KWin Wayland rejects wtype — install ydotool and enable ydotoold for typing there
82
+ - 'dic loop' runs continuous dictation with auto-injection
83
+ - 'dic toggle' is meant for a global shortcut (e.g. KDE Super+Space → dic toggle)
84
+ - Press Ctrl+C to stop recording
85
+ \n`);
86
+ }
87
+ else if (sub === 'loop' || parsed.loop || parsed.l) {
88
+ // Continuous dictation loop
89
+ const deviceId = parsed.device || undefined;
90
+ const silenceMs = parsed.silence ? Number(parsed.silence) : 1500;
91
+ (0, dictate_js_1.dictationLoop)({ deviceId, silenceMs }).catch(e => {
92
+ console.error(chalk_1.default.hex('#b15439')(`\nFatal: ${String(e)}`));
93
+ process.exit(1);
94
+ });
95
+ }
96
+ else {
97
+ // Default: dictate. Injection is ON by default (transcription is typed into
98
+ // the focused window when it finishes); --no-inject gives clipboard-only.
99
+ const deviceId = parsed.device || undefined;
100
+ const inject = parsed.inject !== false && !parsed['clip-only'];
101
+ (0, dictate_js_1.dictate)({ deviceId, inject }).catch(e => {
102
+ console.error(chalk_1.default.hex('#b15439')(`\nFatal: ${String(e)}`));
103
+ process.exit(1);
104
+ });
105
+ }
106
+ //# sourceMappingURL=dic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dic.js","sourceRoot":"","sources":["../../src/cli/dic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface DiffLine {
2
+ type: 'add' | 'remove' | 'context' | 'hunk' | 'file';
3
+ content: string;
4
+ }
5
+ /**
6
+ * Compute a simple line-level diff between old and new text.
7
+ * Uses LCS-based approach for accuracy.
8
+ */
9
+ export declare function computeDiff(oldText: string, newText: string): DiffLine[];
10
+ /**
11
+ * Render a diff as styled terminal lines. Shows up to `maxLines` lines
12
+ * of context, then collapses with a "... N more lines" marker.
13
+ */
14
+ export declare function renderDiff(diff: DiffLine[], maxLines?: number): string[];
15
+ /**
16
+ * Quick diff preview for tool calls — shows a compact summary.
17
+ */
18
+ export declare function diffPreview(oldText: string, newText: string, filePath: string): string[];
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.computeDiff = computeDiff;
7
+ exports.renderDiff = renderDiff;
8
+ exports.diffPreview = diffPreview;
9
+ /**
10
+ * Inline diff renderer — shows file edits as colored +/- lines,
11
+ * like `git diff` but with Aura's palette.
12
+ */
13
+ const chalk_1 = __importDefault(require("chalk"));
14
+ const diamond_js_1 = require("./diamond.js");
15
+ const TEXT_DIM = chalk_1.default.hex(diamond_js_1.TEXT_DIM_HEX);
16
+ const RUBY = diamond_js_1.RUBY_ACCENT;
17
+ const ADDED = chalk_1.default.hex('#5a9e6e');
18
+ const REMOVED = chalk_1.default.hex('#b15439');
19
+ const HUNK_HEADER = chalk_1.default.hex(diamond_js_1.FAINT_HEX);
20
+ const FILE_HEADER = chalk_1.default.hex('#cc785c');
21
+ /**
22
+ * Compute a simple line-level diff between old and new text.
23
+ * Uses LCS-based approach for accuracy.
24
+ */
25
+ function computeDiff(oldText, newText) {
26
+ const oldLines = oldText.split('\n');
27
+ const newLines = newText.split('\n');
28
+ const diff = [];
29
+ // Simple LCS diff
30
+ const m = oldLines.length;
31
+ const n = newLines.length;
32
+ const dp = Array(m + 1).fill(null).map(() => Array(n + 1).fill(0));
33
+ for (let i = 1; i <= m; i++) {
34
+ for (let j = 1; j <= n; j++) {
35
+ if (oldLines[i - 1] === newLines[j - 1]) {
36
+ dp[i][j] = dp[i - 1][j - 1] + 1;
37
+ }
38
+ else {
39
+ dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
40
+ }
41
+ }
42
+ }
43
+ const traceDiff = (i, j) => {
44
+ if (i > 0 && j > 0 && oldLines[i - 1] === newLines[j - 1]) {
45
+ traceDiff(i - 1, j - 1);
46
+ diff.push({ type: 'context', content: oldLines[i - 1] });
47
+ }
48
+ else if (j > 0 && (i === 0 || dp[i][j - 1] >= dp[i - 1][j])) {
49
+ traceDiff(i, j - 1);
50
+ diff.push({ type: 'add', content: newLines[j - 1] });
51
+ }
52
+ else if (i > 0 && (j === 0 || dp[i][j - 1] < dp[i - 1][j])) {
53
+ traceDiff(i - 1, j);
54
+ diff.push({ type: 'remove', content: oldLines[i - 1] });
55
+ }
56
+ };
57
+ traceDiff(m, n);
58
+ return diff;
59
+ }
60
+ /**
61
+ * Render a diff as styled terminal lines. Shows up to `maxLines` lines
62
+ * of context, then collapses with a "... N more lines" marker.
63
+ */
64
+ function renderDiff(diff, maxLines = 30) {
65
+ const lines = [];
66
+ let shown = 0;
67
+ let totalChanges = 0;
68
+ for (const d of diff) {
69
+ if (d.type === 'add' || d.type === 'remove')
70
+ totalChanges++;
71
+ }
72
+ const maxChanges = Math.min(maxLines, totalChanges);
73
+ let changeCount = 0;
74
+ for (const d of diff) {
75
+ if (d.type === 'add' || d.type === 'remove') {
76
+ if (changeCount >= maxChanges)
77
+ continue;
78
+ changeCount++;
79
+ }
80
+ if (shown >= maxLines && d.type !== 'hunk' && d.type !== 'file') {
81
+ const remaining = totalChanges - changeCount;
82
+ if (remaining > 0) {
83
+ lines.push(TEXT_DIM(` … ${remaining} more changes`));
84
+ }
85
+ break;
86
+ }
87
+ shown++;
88
+ switch (d.type) {
89
+ case 'add':
90
+ lines.push(ADDED(` + ${d.content}`));
91
+ break;
92
+ case 'remove':
93
+ lines.push(REMOVED(` - ${d.content}`));
94
+ break;
95
+ case 'context':
96
+ lines.push(TEXT_DIM(` ${d.content}`));
97
+ break;
98
+ }
99
+ }
100
+ return lines;
101
+ }
102
+ /**
103
+ * Quick diff preview for tool calls — shows a compact summary.
104
+ */
105
+ function diffPreview(oldText, newText, filePath) {
106
+ const diff = computeDiff(oldText, newText);
107
+ const added = diff.filter(d => d.type === 'add').length;
108
+ const removed = diff.filter(d => d.type === 'remove').length;
109
+ const lines = [
110
+ FILE_HEADER.bold(` 📝 ${filePath}`) + TEXT_DIM(` +${added} -${removed}`),
111
+ ];
112
+ return [...lines, ...renderDiff(diff, 15)];
113
+ }
114
+ //# sourceMappingURL=diff-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-view.js","sourceRoot":"","sources":["../../src/cli/diff-view.ts"],"names":[],"mappings":"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"}
@@ -36,9 +36,23 @@ export interface Display {
36
36
  provider: string;
37
37
  state: 'closed' | 'open' | 'half-open';
38
38
  }): void;
39
+ /** One-line context health bar — shown before each LLM call. */
40
+ contextBar?(health: import('./context-health.js').ContextHealth): void;
41
+ /** Full context dashboard — shown on /context command. */
42
+ contextDashboard?(health: import('./context-health.js').ContextHealth): void;
43
+ /** Compaction event — replaces the current generic warning. */
44
+ compactionEvent?(info: {
45
+ beforeTokens: number;
46
+ afterTokens: number;
47
+ generation: number;
48
+ threshold: number;
49
+ }): void;
39
50
  }
40
51
  export declare function createTerminalDisplay(): Display;
41
- /** Format a token count compactly: 1234 → "1.2K", 25400 → "25.4K", 1000000 → "1M". */
42
- export declare function formatCompact(n: number): string;
43
- /** Build the context-bar line, e.g. ` 25.4K/1M [████░░░░░░] 23%`. */
44
- export declare function formatContextBar(used: number, limit: number, estimated: boolean): string;
52
+ /**
53
+ * One-line context-usage bar used by tests and any direct callers.
54
+ * Clamps the visual fill to the bar width but keeps the true percentage in text
55
+ * so over-limit usage (cumulative session tokens vs a single model window) is
56
+ * visible rather than hidden.
57
+ */
58
+ export declare function formatContextBar(usedTokens: number, limitTokens: number, isEstimated?: boolean): string;
@@ -4,22 +4,23 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.createTerminalDisplay = createTerminalDisplay;
7
- exports.formatCompact = formatCompact;
8
7
  exports.formatContextBar = formatContextBar;
9
8
  const chalk_1 = __importDefault(require("chalk"));
9
+ const context_health_js_1 = require("./context-health.js");
10
+ const diamond_js_1 = require("./diamond.js");
10
11
  function createTerminalDisplay() {
11
12
  let inStream = false;
12
13
  let currentTool = '';
13
14
  return {
14
15
  agentThinking() {
15
- // Subtle indicator don't spam
16
+ process.stdout.write(chalk_1.default.hex(diamond_js_1.FAINT_HEX)(' ◆ ') + chalk_1.default.hex(diamond_js_1.TEXT_DIM_HEX)('thinking…') + '\r');
16
17
  },
17
18
  streamText(text) {
18
19
  if (!inStream) {
19
- process.stdout.write('\n' + chalk_1.default.hex('#c8b5a0')(''));
20
+ process.stdout.write('\n' + chalk_1.default.hex(diamond_js_1.TEXT_HEX)(''));
20
21
  inStream = true;
21
22
  }
22
- process.stdout.write(chalk_1.default.hex('#ede0cc')(text));
23
+ process.stdout.write(chalk_1.default.hex(diamond_js_1.TEXT_HEX)(text));
23
24
  },
24
25
  streamEnd() {
25
26
  if (inStream) {
@@ -30,31 +31,41 @@ function createTerminalDisplay() {
30
31
  toolStart(name, _id) {
31
32
  currentTool = name;
32
33
  },
33
- toolCall(name, input) {
34
+ toolCall(name, input, model, provider) {
35
+ if (model) {
36
+ // Update the displayed model
37
+ console.log(`Model: ${model}`);
38
+ }
39
+ if (provider) {
40
+ // Update the displayed provider
41
+ console.log(`Provider: ${provider}`);
42
+ }
34
43
  process.stdout.write('\n');
35
44
  const icon = toolIcon(name);
45
+ // Reset thinking icon after processing
46
+ process.stdout.write('\n');
36
47
  const label = chalk_1.default.hex('#cc785c').bold(`${icon} ${name}`);
37
48
  const detail = formatInput(name, input);
38
- console.log(` ${label} ${chalk_1.default.hex('#8a7768')(detail)}`);
49
+ console.log(` ${label} ${chalk_1.default.hex(diamond_js_1.TEXT_DIM_HEX)(detail)}`);
39
50
  },
40
51
  toolResult(name, result, elapsedMs) {
41
52
  const lines = result.split('\n');
42
53
  const preview = lines.length > 8
43
- ? lines.slice(0, 8).join('\n') + chalk_1.default.hex('#4e3d30')(`\n ... (${lines.length - 8} more lines)`)
54
+ ? lines.slice(0, 8).join('\n') + chalk_1.default.hex(diamond_js_1.FAINT_HEX)(`\n ... (${lines.length - 8} more lines)`)
44
55
  : result;
45
- const elapsed = chalk_1.default.hex('#4e3d30')(`${elapsedMs}ms`);
56
+ const elapsed = chalk_1.default.hex(diamond_js_1.FAINT_HEX)(`${elapsedMs}ms`);
46
57
  const isError = result.startsWith('Error:') || result.startsWith('Tool error');
47
58
  if (isError) {
48
- console.log(' ' + chalk_1.default.hex('#b15439')('✗ ') + chalk_1.default.hex('#8a7768')(preview.replace(/\n/g, '\n ')));
59
+ console.log(' ' + chalk_1.default.hex('#b15439')('✗ ') + chalk_1.default.hex(diamond_js_1.TEXT_DIM_HEX)(preview.replace(/\n/g, '\n ')));
49
60
  }
50
61
  else {
51
62
  // Show a compact preview
52
63
  const firstLine = lines[0] ?? '';
53
64
  if (lines.length <= 3) {
54
- console.log(' ' + chalk_1.default.hex('#5a9e6e')('✓ ') + chalk_1.default.hex('#8a7768')(result));
65
+ console.log(' ' + chalk_1.default.hex('#5a9e6e')('✓ ') + chalk_1.default.hex(diamond_js_1.TEXT_DIM_HEX)(result));
55
66
  }
56
67
  else {
57
- console.log(' ' + chalk_1.default.hex('#5a9e6e')('✓ ') + chalk_1.default.hex('#8a7768')(`${firstLine}`) + chalk_1.default.hex('#4e3d30')(` (+${lines.length - 1} lines) ${elapsed}`));
68
+ console.log(' ' + chalk_1.default.hex('#5a9e6e')('✓ ') + chalk_1.default.hex(diamond_js_1.TEXT_DIM_HEX)(`${firstLine}`) + chalk_1.default.hex(diamond_js_1.FAINT_HEX)(` (+${lines.length - 1} lines) ${elapsed}`));
58
69
  }
59
70
  }
60
71
  },
@@ -71,29 +82,25 @@ function createTerminalDisplay() {
71
82
  console.error('\n' + chalk_1.default.hex('#b15439')(` ✗ ${msg}`));
72
83
  },
73
84
  header(title, subtitle) {
74
- const w = Math.min((process.stdout.columns ?? 80) - 2, 144);
75
- const pad = (s) => ` ${s}`;
76
- console.log('');
77
- console.log(boxTop(w));
78
- console.log(boxLine(chalk_1.default.hex('#cc785c').bold(pad(title)), w));
85
+ const w = process.stdout.columns ?? 80;
86
+ const line = '─'.repeat(Math.min(w - 4, 60));
87
+ console.log('\n' + chalk_1.default.hex(diamond_js_1.FAINT_HEX)(line));
88
+ console.log(chalk_1.default.hex('#cc785c').bold(` ${title}`));
79
89
  if (subtitle)
80
- console.log(boxLine(chalk_1.default.hex('#8a7768')(pad(subtitle)), w));
81
- console.log(boxBottom(w));
90
+ console.log(chalk_1.default.hex(diamond_js_1.TEXT_DIM_HEX)(` ${subtitle}`));
91
+ console.log(chalk_1.default.hex(diamond_js_1.FAINT_HEX)(line));
82
92
  },
83
93
  summary(text, turns, toolCount) {
84
- const w = Math.min((process.stdout.columns ?? 80) - 2, 144);
85
- const pad = (s) => ` ${s}`;
86
- console.log('');
87
- console.log(boxTop(w));
88
- console.log(boxLine(chalk_1.default.hex('#5a9e6e').bold(pad(' Done')), w));
89
- console.log(boxLine(chalk_1.default.hex('#8a7768')(pad(`${turns} turn${turns > 1 ? 's' : ''} · ${toolCount} tool call${toolCount > 1 ? 's' : ''}`)), w));
94
+ const w = process.stdout.columns ?? 80;
95
+ const line = '─'.repeat(Math.min(w - 4, 60));
96
+ console.log('\n' + chalk_1.default.hex(diamond_js_1.FAINT_HEX)(line));
97
+ console.log(chalk_1.default.hex('#5a9e6e').bold(' ✓ Done'));
98
+ console.log(chalk_1.default.hex(diamond_js_1.TEXT_DIM_HEX)(` ${turns} turn${turns > 1 ? 's' : ''} · ${toolCount} tool call${toolCount > 1 ? 's' : ''}`));
90
99
  if (text) {
91
- const innerWidth = Math.max(w - 4, 10); // w - 2 (border chars) - 2 (pad()'s leading spaces)
92
- text.split('\n').forEach(l => {
93
- wrapLine(l, innerWidth).forEach(wl => console.log(boxLine(chalk_1.default.hex('#c8b5a0')(pad(wl)), w)));
94
- });
100
+ console.log('');
101
+ text.split('\n').forEach(l => console.log(chalk_1.default.hex(diamond_js_1.TEXT_HEX)(` ${l}`)));
95
102
  }
96
- console.log(boxBottom(w) + '\n');
103
+ console.log(chalk_1.default.hex(diamond_js_1.FAINT_HEX)(line) + '\n');
97
104
  },
98
105
  retry(info) {
99
106
  const secs = (info.delayMs / 1000).toFixed(1);
@@ -106,147 +113,48 @@ function createTerminalDisplay() {
106
113
  const colour = info.state === 'open' ? '#b15439' : info.state === 'half-open' ? '#d4903a' : '#5a9e6e';
107
114
  console.log(chalk_1.default.hex(colour)(` ◯ Circuit ${info.provider}: ${info.state}`));
108
115
  },
116
+ contextBar(health) {
117
+ console.log((0, context_health_js_1.formatContextBar)(health));
118
+ },
119
+ contextDashboard(health) {
120
+ console.log((0, context_health_js_1.formatContextDashboard)(health));
121
+ },
122
+ compactionEvent(info) {
123
+ const saved = ((1 - info.afterTokens / info.beforeTokens) * 100).toFixed(0);
124
+ console.log(chalk_1.default.hex('#d4903a')(` ⚠ Context compacted: ${info.beforeTokens.toLocaleString()} → ${info.afterTokens.toLocaleString()} tokens (-${saved}%) · gen ${info.generation}`));
125
+ },
109
126
  showPlan(plan) {
110
- const w = Math.min((process.stdout.columns ?? 80) - 2, 144);
111
- const pad = (s) => ` ${s}`;
127
+ const w = process.stdout.columns ?? 80;
128
+ const line = '─'.repeat(Math.min(w - 4, 60));
112
129
  // Build a position map so dependency arrows show step numbers, not raw UUIDs
113
130
  const idxMap = new Map(plan.steps.map((s, i) => [s.id, i + 1]));
114
- console.log('');
115
- console.log(boxTop(w));
116
- console.log(boxLine(chalk_1.default.hex('#cc785c').bold(pad('Execution Plan')), w));
117
- console.log(boxLine(chalk_1.default.hex('#8a7768')(pad(`Goal: ${plan.goal}`)), w));
131
+ console.log('\n' + chalk_1.default.hex(diamond_js_1.FAINT_HEX)(line));
132
+ console.log(chalk_1.default.hex('#cc785c').bold(' Execution Plan'));
133
+ console.log(chalk_1.default.hex(diamond_js_1.TEXT_DIM_HEX)(` Goal: ${plan.goal}`));
134
+ console.log(chalk_1.default.hex(diamond_js_1.FAINT_HEX)(line));
118
135
  plan.steps.forEach((s, i) => {
119
- const num = chalk_1.default.hex('#4e3d30')(`${i + 1}.`);
136
+ const num = chalk_1.default.hex(diamond_js_1.FAINT_HEX)(`${i + 1}.`);
120
137
  const spec = chalk_1.default.hex('#cc785c').bold(`[${s.specialist}]`);
121
- const task = chalk_1.default.hex('#c8b5a0')(s.task.length > 55 ? s.task.slice(0, 52) + '…' : s.task);
138
+ const task = chalk_1.default.hex(diamond_js_1.TEXT_HEX)(s.task.length > 55 ? s.task.slice(0, 52) + '…' : s.task);
122
139
  const deps = s.dependsOn.length > 0
123
- ? chalk_1.default.hex('#4e3d30')(` ← ${s.dependsOn.map(d => idxMap.get(d) ?? '?').join(', ')}`)
140
+ ? chalk_1.default.hex(diamond_js_1.FAINT_HEX)(` ← ${s.dependsOn.map(d => idxMap.get(d) ?? '?').join(', ')}`)
124
141
  : '';
125
- console.log(boxLine(` ${num} ${spec} ${task}${deps}`, w));
142
+ console.log(` ${num} ${spec} ${task}${deps}`);
126
143
  });
127
- console.log(boxBottom(w) + '\n');
144
+ console.log(chalk_1.default.hex(diamond_js_1.FAINT_HEX)(line) + '\n');
128
145
  },
129
146
  stepStarted(step) {
130
147
  const spec = chalk_1.default.hex('#d4903a').bold(`[${step.specialist}]`);
131
- const task = chalk_1.default.hex('#8a7768')(step.task.length > 70 ? step.task.slice(0, 67) + '…' : step.task);
148
+ const task = chalk_1.default.hex(diamond_js_1.TEXT_DIM_HEX)(step.task.length > 70 ? step.task.slice(0, 67) + '…' : step.task);
132
149
  console.log('\n' + chalk_1.default.hex('#d4903a')(' →') + ` ${spec} ${task}`);
133
150
  },
134
151
  stepCompleted(step, _result) {
135
152
  const spec = chalk_1.default.hex('#5a9e6e').bold(`[${step.specialist}]`);
136
153
  const ms = step.durationMs != null ? `${step.durationMs}ms` : '?ms';
137
- console.log(chalk_1.default.hex('#5a9e6e')(' ✓') + ` ${spec} ${chalk_1.default.hex('#4e3d30')(`done (${ms})`)}`);
154
+ console.log(chalk_1.default.hex('#5a9e6e')(' ✓') + ` ${spec} ${chalk_1.default.hex(diamond_js_1.FAINT_HEX)(`done (${ms})`)}`);
138
155
  },
139
156
  };
140
157
  }
141
- // ── Box-drawing helpers ──────────────────────────────────────────────────────
142
- /** Render a colored top border: ┌──────────┐ */
143
- function boxTop(width, color = '#4e3d30') {
144
- const inner = '─'.repeat(Math.max(width - 2, 2));
145
- return chalk_1.default.hex(color)(`┌${inner}┐`);
146
- }
147
- /** Word-wrap a single line to fit within `width` visible characters. Breaks
148
- * on whitespace; a token longer than `width` alone is hard-broken rather
149
- * than left to overflow. Used so long lines (markdown table rows, bullet
150
- * points) flow across multiple box lines instead of being truncated. */
151
- function wrapLine(text, width) {
152
- if (text.length <= width)
153
- return [text];
154
- const words = text.split(' ');
155
- const out = [];
156
- let current = '';
157
- for (const word of words) {
158
- if (word.length > width) {
159
- if (current) {
160
- out.push(current);
161
- current = '';
162
- }
163
- for (let i = 0; i < word.length; i += width)
164
- out.push(word.slice(i, i + width));
165
- continue;
166
- }
167
- const candidate = current ? `${current} ${word}` : word;
168
- if (candidate.length > width) {
169
- out.push(current);
170
- current = word;
171
- }
172
- else {
173
- current = candidate;
174
- }
175
- }
176
- if (current)
177
- out.push(current);
178
- return out;
179
- }
180
- /** Render a colored bottom border: └──────────┘ */
181
- function boxBottom(width, color = '#4e3d30') {
182
- const inner = '─'.repeat(Math.max(width - 2, 2));
183
- return chalk_1.default.hex(color)(`└${inner}┘`);
184
- }
185
- /** Render a colored side-padded line: │ content │ */
186
- function boxLine(text, width, color = '#4e3d30') {
187
- const maxInner = Math.max(width - 2, 2);
188
- // Strip ANSI to measure visible length
189
- const visible = text.replace(/\x1b\[[0-9;]*m/g, '');
190
- if (visible.length > maxInner) {
191
- // Truncate with ellipsis to prevent box overflow.
192
- // Reserve 1 visible char for '…' so total = 1 + (truncLen + 1) + 1 = width.
193
- const truncLen = Math.max(maxInner - 1, 1);
194
- // Walk text char-by-char to preserve ANSI boundaries during truncation
195
- let visCount = 0;
196
- let idx = 0;
197
- const chars = [...text];
198
- while (idx < chars.length && visCount < truncLen) {
199
- if (chars[idx] === '\x1b') {
200
- // Skip the entire ANSI escape sequence
201
- while (idx < chars.length && chars[idx] !== 'm')
202
- idx++;
203
- idx++; // skip the 'm' terminator
204
- }
205
- else {
206
- visCount++;
207
- idx++;
208
- }
209
- }
210
- const truncated = text.slice(0, idx) + '…';
211
- return chalk_1.default.hex(color)('│') + truncated + chalk_1.default.hex(color)('│');
212
- }
213
- const padding = maxInner - visible.length;
214
- return chalk_1.default.hex(color)('│') + text + ' '.repeat(padding) + chalk_1.default.hex(color)('│');
215
- }
216
- // ── Context bar helpers ──────────────────────────────────────────────────────
217
- /** Format a token count compactly: 1234 → "1.2K", 25400 → "25.4K", 1000000 → "1M". */
218
- function formatCompact(n) {
219
- if (n >= 1_000_000) {
220
- const v = n / 1_000_000;
221
- return (v % 1 === 0 ? v.toFixed(0) : v.toFixed(1)) + 'M';
222
- }
223
- if (n >= 1_000) {
224
- const v = n / 1_000;
225
- return (v % 1 === 0 ? v.toFixed(0) : v.toFixed(1)) + 'K';
226
- }
227
- return String(n);
228
- }
229
- /** Build the context-bar line, e.g. ` 25.4K/1M │ [████░░░░░░] 23%`. */
230
- function formatContextBar(used, limit, estimated) {
231
- const pct = Math.round((used / limit) * 100);
232
- // Clamp: `used` can exceed `limit` (e.g. a session overruns the model's
233
- // context window faster than compaction catches up, or `limit` is wrong
234
- // for the active model). Without clamping, filled > 10 makes `empty`
235
- // negative, and '░'.repeat(negative) throws RangeError, crashing the
236
- // entire process on what should just be a "100% full" bar.
237
- const filled = Math.min(10, Math.max(0, Math.round(pct / 10)));
238
- const empty = 10 - filled;
239
- const bar = chalk_1.default.hex('#cc785c')('█'.repeat(filled)) + chalk_1.default.hex('#4e3d30')('░'.repeat(empty));
240
- const left = estimated
241
- ? chalk_1.default.hex('#d4903a')(`~${formatCompact(used)}`)
242
- : chalk_1.default.hex('#5a9e6e')(formatCompact(used));
243
- const right = chalk_1.default.hex('#8a7768')(formatCompact(limit));
244
- const pctStr = estimated
245
- ? chalk_1.default.hex('#d4903a')(`${pct}%`)
246
- : chalk_1.default.hex('#8a7768')(`${pct}%`);
247
- const estTag = estimated ? chalk_1.default.hex('#4e3d30')(' (estimated)') : '';
248
- return ` ${left}/${right} │ [${bar}] ${pctStr}${estTag}`;
249
- }
250
158
  // ── Helpers ───────────────────────────────────────────────────────────────────
251
159
  function toolIcon(name) {
252
160
  const icons = {
@@ -272,4 +180,19 @@ function formatInput(name, input) {
272
180
  default: return JSON.stringify(input).slice(0, 60);
273
181
  }
274
182
  }
183
+ /**
184
+ * One-line context-usage bar used by tests and any direct callers.
185
+ * Clamps the visual fill to the bar width but keeps the true percentage in text
186
+ * so over-limit usage (cumulative session tokens vs a single model window) is
187
+ * visible rather than hidden.
188
+ */
189
+ function formatContextBar(usedTokens, limitTokens, isEstimated = false) {
190
+ const barWidth = 10;
191
+ const pct = limitTokens > 0 ? (usedTokens / limitTokens) * 100 : 0;
192
+ const filled = Math.max(0, Math.min(barWidth, Math.round((usedTokens / Math.max(1, limitTokens)) * barWidth)));
193
+ const empty = barWidth - filled;
194
+ const bar = '█'.repeat(filled) + '░'.repeat(empty);
195
+ const label = isEstimated ? `~${usedTokens.toLocaleString()} (estimated)` : usedTokens.toLocaleString();
196
+ return ` ◆ Context: ${bar} ${pct.toFixed(0)}% (${label} / ${limitTokens.toLocaleString()})`;
197
+ }
275
198
  //# sourceMappingURL=display.js.map