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.
- package/README.md +47 -164
- package/dist/agent/affect.d.ts +13 -0
- package/dist/agent/affect.js +34 -0
- package/dist/agent/affect.js.map +1 -0
- package/dist/agent/compactor.d.ts +27 -4
- package/dist/agent/compactor.js +185 -54
- package/dist/agent/compactor.js.map +1 -1
- package/dist/agent/confess.d.ts +35 -0
- package/dist/agent/confess.js +296 -0
- package/dist/agent/confess.js.map +1 -0
- package/dist/agent/context.d.ts +0 -4
- package/dist/agent/context.js +0 -38
- package/dist/agent/context.js.map +1 -1
- package/dist/agent/domain-expertise.d.ts +22 -0
- package/dist/agent/domain-expertise.js +110 -0
- package/dist/agent/domain-expertise.js.map +1 -0
- package/dist/agent/executive-queue.d.ts +26 -0
- package/dist/agent/executive-queue.js +50 -0
- package/dist/agent/executive-queue.js.map +1 -0
- package/dist/agent/generational-flush.d.ts +28 -0
- package/dist/agent/generational-flush.js +48 -0
- package/dist/agent/generational-flush.js.map +1 -0
- package/dist/agent/loop-profile.d.ts +50 -0
- package/dist/agent/loop-profile.js +88 -0
- package/dist/agent/loop-profile.js.map +1 -0
- package/dist/agent/loop.d.ts +14 -5
- package/dist/agent/loop.js +167 -39
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/memory-consolidate.d.ts +14 -0
- package/dist/agent/memory-consolidate.js +141 -0
- package/dist/agent/memory-consolidate.js.map +1 -0
- package/dist/agent/mixture.d.ts +33 -0
- package/dist/agent/mixture.js +138 -0
- package/dist/agent/mixture.js.map +1 -0
- package/dist/agent/spawner.js +2 -2
- package/dist/agent/spawner.js.map +1 -1
- package/dist/agent/system-prompt.d.ts +1 -1
- package/dist/agent/system-prompt.js +50 -22
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/agent/unified-memory.d.ts +15 -0
- package/dist/agent/unified-memory.js +164 -0
- package/dist/agent/unified-memory.js.map +1 -0
- package/dist/checkpoints/engine.d.ts +44 -0
- package/dist/checkpoints/engine.js +324 -0
- package/dist/checkpoints/engine.js.map +1 -0
- package/dist/cli/command-palette.d.ts +26 -0
- package/dist/cli/command-palette.js +133 -0
- package/dist/cli/command-palette.js.map +1 -0
- package/dist/cli/context-health.d.ts +51 -0
- package/dist/cli/context-health.js +187 -0
- package/dist/cli/context-health.js.map +1 -0
- package/dist/cli/diamond.d.ts +67 -0
- package/dist/cli/diamond.js +222 -12
- package/dist/cli/diamond.js.map +1 -1
- package/dist/cli/dic.d.ts +2 -0
- package/dist/cli/dic.js +106 -0
- package/dist/cli/dic.js.map +1 -0
- package/dist/cli/diff-view.d.ts +18 -0
- package/dist/cli/diff-view.js +114 -0
- package/dist/cli/diff-view.js.map +1 -0
- package/dist/cli/display.d.ts +18 -4
- package/dist/cli/display.js +74 -151
- package/dist/cli/display.js.map +1 -1
- package/dist/cli/help-data.d.ts +7 -0
- package/dist/cli/help-data.js +80 -0
- package/dist/cli/help-data.js.map +1 -0
- package/dist/cli/index.js +1002 -852
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/markdown.d.ts +5 -0
- package/dist/cli/markdown.js +128 -0
- package/dist/cli/markdown.js.map +1 -0
- package/dist/cli/model-select.d.ts +39 -0
- package/dist/cli/model-select.js +65 -0
- package/dist/cli/model-select.js.map +1 -0
- package/dist/cli/tui.d.ts +34 -0
- package/dist/cli/tui.js +1176 -0
- package/dist/cli/tui.js.map +1 -0
- package/dist/config/defaults.d.ts +6 -17
- package/dist/config/defaults.js +25 -46
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/project-config.d.ts +2 -6
- package/dist/config/project-config.js +2 -2
- package/dist/config/project-config.js.map +1 -1
- package/dist/doctor/checks.d.ts +18 -0
- package/dist/doctor/checks.js +524 -0
- package/dist/doctor/checks.js.map +1 -0
- package/dist/doctor/index.d.ts +4 -0
- package/dist/doctor/index.js +229 -0
- package/dist/doctor/index.js.map +1 -0
- package/dist/doctor/repair.d.ts +19 -0
- package/dist/doctor/repair.js +126 -0
- package/dist/doctor/repair.js.map +1 -0
- package/dist/doctor/types.d.ts +38 -0
- package/dist/doctor/types.js +10 -0
- package/dist/doctor/types.js.map +1 -0
- package/dist/dream/dream.d.ts +79 -59
- package/dist/dream/dream.js +324 -144
- package/dist/dream/dream.js.map +1 -1
- package/dist/dream/episode.d.ts +17 -0
- package/dist/dream/episode.js +116 -0
- package/dist/dream/episode.js.map +1 -0
- package/dist/kanban/engine.d.ts +26 -0
- package/dist/kanban/engine.js +208 -0
- package/dist/kanban/engine.js.map +1 -0
- package/dist/kanban/types.d.ts +19 -0
- package/dist/kanban/types.js +9 -1
- package/dist/kanban/types.js.map +1 -1
- package/dist/machina/render-html.js +4 -2
- package/dist/machina/render-html.js.map +1 -1
- package/dist/machina/render-terminal.js +11 -4
- package/dist/machina/render-terminal.js.map +1 -1
- package/dist/machina/repair.d.ts +23 -0
- package/dist/machina/repair.js +98 -0
- package/dist/machina/repair.js.map +1 -0
- package/dist/machina/spec.js +12 -12
- package/dist/machina/spec.js.map +1 -1
- package/dist/machina/verify.d.ts +13 -1
- package/dist/machina/verify.js +12 -2
- package/dist/machina/verify.js.map +1 -1
- package/dist/mining/extract.d.ts +34 -0
- package/dist/mining/extract.js +229 -0
- package/dist/mining/extract.js.map +1 -0
- package/dist/mining/refine.d.ts +28 -0
- package/dist/mining/refine.js +256 -0
- package/dist/mining/refine.js.map +1 -0
- package/dist/perception/extractor.js +5 -3
- package/dist/perception/extractor.js.map +1 -1
- package/dist/perception/graph-store.d.ts +0 -11
- package/dist/perception/graph-store.js +0 -33
- package/dist/perception/graph-store.js.map +1 -1
- package/dist/perception/index.d.ts +1 -1
- package/dist/perception/index.js +1 -2
- package/dist/perception/index.js.map +1 -1
- package/dist/plugins/commands.d.ts +38 -0
- package/dist/plugins/commands.js +134 -0
- package/dist/plugins/commands.js.map +1 -0
- package/dist/plugins/frontmatter.d.ts +14 -0
- package/dist/plugins/frontmatter.js +78 -0
- package/dist/plugins/frontmatter.js.map +1 -0
- package/dist/plugins/hooks.d.ts +12 -0
- package/dist/plugins/hooks.js +148 -0
- package/dist/plugins/hooks.js.map +1 -0
- package/dist/plugins/loader.d.ts +7 -0
- package/dist/plugins/loader.js +255 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/market.d.ts +23 -0
- package/dist/plugins/market.js +281 -0
- package/dist/plugins/market.js.map +1 -0
- package/dist/plugins/types.d.ts +90 -0
- package/dist/plugins/types.js +20 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/providers/anthropic-oauth-draft.d.ts +119 -0
- package/dist/providers/anthropic-oauth-draft.js +414 -0
- package/dist/providers/anthropic-oauth-draft.js.map +1 -0
- package/dist/providers/anthropic.d.ts +4 -1
- package/dist/providers/anthropic.js +35 -7
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/factory.d.ts +43 -19
- package/dist/providers/factory.js +183 -129
- package/dist/providers/factory.js.map +1 -1
- package/dist/providers/google.js +9 -22
- package/dist/providers/google.js.map +1 -1
- package/dist/providers/live-models.d.ts +23 -0
- package/dist/providers/live-models.js +145 -0
- package/dist/providers/live-models.js.map +1 -0
- package/dist/providers/openai-compatible.d.ts +1 -12
- package/dist/providers/openai-compatible.js +71 -108
- package/dist/providers/openai-compatible.js.map +1 -1
- package/dist/providers/resilient-factory.js +1 -1
- package/dist/providers/resilient-factory.js.map +1 -1
- package/dist/repl/queue.d.ts +22 -0
- package/dist/repl/queue.js +165 -0
- package/dist/repl/queue.js.map +1 -0
- package/dist/repl/side-channel.d.ts +23 -0
- package/dist/repl/side-channel.js +63 -0
- package/dist/repl/side-channel.js.map +1 -0
- package/dist/research/council.d.ts +2 -0
- package/dist/research/council.js +29 -4
- package/dist/research/council.js.map +1 -1
- package/dist/ruby/alternator.d.ts +11 -30
- package/dist/ruby/alternator.js +59 -38
- package/dist/ruby/alternator.js.map +1 -1
- package/dist/ruby/episode-capture.d.ts +0 -10
- package/dist/ruby/episode-capture.js +0 -33
- package/dist/ruby/episode-capture.js.map +1 -1
- package/dist/ruby/types.js +1 -1
- package/dist/ruby/types.js.map +1 -1
- package/dist/safety/path-jail.d.ts +17 -0
- package/dist/safety/path-jail.js +100 -0
- package/dist/safety/path-jail.js.map +1 -0
- package/dist/safety/permissions.d.ts +12 -21
- package/dist/safety/permissions.js +81 -216
- package/dist/safety/permissions.js.map +1 -1
- package/dist/safety/ssrf.d.ts +29 -0
- package/dist/safety/ssrf.js +185 -0
- package/dist/safety/ssrf.js.map +1 -0
- package/dist/server/index.js +64 -10
- package/dist/server/index.js.map +1 -1
- package/dist/setup/first-run.d.ts +0 -24
- package/dist/setup/first-run.js +10 -344
- package/dist/setup/first-run.js.map +1 -1
- package/dist/setup/key-store.d.ts +12 -0
- package/dist/setup/key-store.js +108 -0
- package/dist/setup/key-store.js.map +1 -0
- package/dist/setup/provider-registry.js +31 -18
- package/dist/setup/provider-registry.js.map +1 -1
- package/dist/setup/provider-test.d.ts +7 -0
- package/dist/setup/provider-test.js +73 -10
- package/dist/setup/provider-test.js.map +1 -1
- package/dist/setup/provider-wizard.d.ts +4 -1
- package/dist/setup/provider-wizard.js +92 -26
- package/dist/setup/provider-wizard.js.map +1 -1
- package/dist/setup/xiaomi.d.ts +1 -1
- package/dist/setup/xiaomi.js +3 -3
- package/dist/setup/xiaomi.js.map +1 -1
- package/dist/tools/browser.js +14 -10
- package/dist/tools/browser.js.map +1 -1
- package/dist/tools/clipboard.js +7 -1
- package/dist/tools/clipboard.js.map +1 -1
- package/dist/tools/dictate.d.ts +60 -0
- package/dist/tools/dictate.js +983 -0
- package/dist/tools/dictate.js.map +1 -0
- package/dist/tools/dictate_patched.js +1057 -0
- package/dist/tools/edit-file.js +10 -2
- package/dist/tools/edit-file.js.map +1 -1
- package/dist/tools/http-request.js +14 -4
- package/dist/tools/http-request.js.map +1 -1
- package/dist/tools/image-read.js +34 -2
- package/dist/tools/image-read.js.map +1 -1
- package/dist/tools/index.d.ts +16 -1
- package/dist/tools/index.js +59 -8
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/mcp.js +12 -0
- package/dist/tools/mcp.js.map +1 -1
- package/dist/tools/read-file.js +10 -14
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/telegram-audio-policy.d.ts +30 -0
- package/dist/tools/telegram-audio-policy.js +49 -0
- package/dist/tools/telegram-audio-policy.js.map +1 -0
- package/dist/tools/telegram-bot.js +1136 -537
- package/dist/tools/telegram-bot.js.map +1 -1
- package/dist/tools/telegram-voice.d.ts +18 -5
- package/dist/tools/telegram-voice.js +54 -12
- package/dist/tools/telegram-voice.js.map +1 -1
- package/dist/tools/telegram.d.ts +3 -3
- package/dist/tools/telegram.js +5 -84
- package/dist/tools/telegram.js.map +1 -1
- package/dist/tools/tools.d.ts +2 -14
- package/dist/tools/tools.js +79 -144
- package/dist/tools/tools.js.map +1 -1
- package/dist/tools/web-fetch.js +39 -7
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/web-search.d.ts +0 -20
- package/dist/tools/web-search.js +40 -137
- package/dist/tools/web-search.js.map +1 -1
- package/dist/util/errors.js +1 -15
- package/dist/util/errors.js.map +1 -1
- package/dist/util/json-repair.d.ts +11 -0
- package/dist/util/json-repair.js +31 -0
- package/dist/util/json-repair.js.map +1 -0
- package/dist/util/rate-limiter.js +2 -8
- package/dist/util/rate-limiter.js.map +1 -1
- package/dist/viz/index.js +793 -792
- package/dist/viz/index.js.map +1 -1
- package/package.json +12 -32
package/dist/cli/dic.js
ADDED
|
@@ -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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"}
|
package/dist/cli/display.d.ts
CHANGED
|
@@ -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
|
-
/**
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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;
|
package/dist/cli/display.js
CHANGED
|
@@ -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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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 =
|
|
75
|
-
const
|
|
76
|
-
console.log('');
|
|
77
|
-
console.log(
|
|
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(
|
|
81
|
-
console.log(
|
|
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 =
|
|
85
|
-
const
|
|
86
|
-
console.log('');
|
|
87
|
-
console.log(
|
|
88
|
-
console.log(
|
|
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
|
-
|
|
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(
|
|
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 =
|
|
111
|
-
const
|
|
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(
|
|
116
|
-
console.log(
|
|
117
|
-
console.log(
|
|
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(
|
|
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(
|
|
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(
|
|
140
|
+
? chalk_1.default.hex(diamond_js_1.FAINT_HEX)(` ← ${s.dependsOn.map(d => idxMap.get(d) ?? '?').join(', ')}`)
|
|
124
141
|
: '';
|
|
125
|
-
console.log(
|
|
142
|
+
console.log(` ${num} ${spec} ${task}${deps}`);
|
|
126
143
|
});
|
|
127
|
-
console.log(
|
|
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(
|
|
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(
|
|
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
|