dsh-ssh-tui 0.8.1 → 0.8.2

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 (93) hide show
  1. package/CHANGELOG.md +158 -0
  2. package/README.en.md +118 -15
  3. package/README.md +78 -13
  4. package/docs/release-notes-0.7.4.md +91 -0
  5. package/docs/release-notes-0.8.0.md +56 -0
  6. package/docs/release-notes-0.8.1.md +79 -0
  7. package/docs/release-notes-0.8.2-rc.1.md +159 -0
  8. package/docs/release-notes-0.8.2.md +62 -0
  9. package/docs/screenshots/reconnect.gif +0 -0
  10. package/docs/terminals.md +23 -0
  11. package/docs/windows.md +13 -0
  12. package/lib/approval-state.js +148 -0
  13. package/lib/approval-state.js.map +1 -0
  14. package/lib/auth-failure.js +38 -0
  15. package/lib/auth-failure.js.map +1 -1
  16. package/lib/color-depth.js +26 -0
  17. package/lib/color-depth.js.map +1 -1
  18. package/lib/copy-text.js +30 -8
  19. package/lib/copy-text.js.map +1 -1
  20. package/lib/dialogs.js +81 -0
  21. package/lib/dialogs.js.map +1 -1
  22. package/lib/display-sock.js +138 -23
  23. package/lib/display-sock.js.map +1 -1
  24. package/lib/footer-accents.js +28 -0
  25. package/lib/footer-accents.js.map +1 -0
  26. package/lib/footer-budget.js +328 -0
  27. package/lib/footer-budget.js.map +1 -0
  28. package/lib/footer-format.js +433 -0
  29. package/lib/footer-format.js.map +1 -0
  30. package/lib/footer-layout.js +407 -0
  31. package/lib/footer-layout.js.map +1 -0
  32. package/lib/footer-meters.js +185 -0
  33. package/lib/footer-meters.js.map +1 -0
  34. package/lib/footer.js +19 -558
  35. package/lib/footer.js.map +1 -1
  36. package/lib/i18n/en.js +65 -5
  37. package/lib/i18n/en.js.map +1 -1
  38. package/lib/i18n/zh.js +67 -5
  39. package/lib/i18n/zh.js.map +1 -1
  40. package/lib/paint.js +53 -8
  41. package/lib/paint.js.map +1 -1
  42. package/lib/plan-projection.js +291 -0
  43. package/lib/plan-projection.js.map +1 -0
  44. package/lib/plan.js +50 -0
  45. package/lib/plan.js.map +1 -1
  46. package/lib/question-state.js +83 -0
  47. package/lib/question-state.js.map +1 -0
  48. package/lib/representation.js +283 -0
  49. package/lib/representation.js.map +1 -0
  50. package/lib/screen.js +105 -0
  51. package/lib/screen.js.map +1 -0
  52. package/lib/selection.js +5 -3
  53. package/lib/selection.js.map +1 -1
  54. package/lib/startup.js +49 -0
  55. package/lib/startup.js.map +1 -1
  56. package/lib/stats.js +101 -3
  57. package/lib/stats.js.map +1 -1
  58. package/lib/term-text.js +154 -55
  59. package/lib/term-text.js.map +1 -1
  60. package/lib/theme.js +20 -3
  61. package/lib/theme.js.map +1 -1
  62. package/lib/throughput.js +305 -0
  63. package/lib/throughput.js.map +1 -0
  64. package/lib/tool-present.js +57 -7
  65. package/lib/tool-present.js.map +1 -1
  66. package/lib/tui.js +3776 -1105
  67. package/lib/tui.js.map +1 -1
  68. package/lib/types/approval-state.d.ts +75 -0
  69. package/lib/types/auth-failure.d.ts +25 -0
  70. package/lib/types/color-depth.d.ts +21 -0
  71. package/lib/types/copy-text.d.ts +18 -1
  72. package/lib/types/dialogs.d.ts +111 -1
  73. package/lib/types/display-sock.d.ts +15 -0
  74. package/lib/types/footer-accents.d.ts +22 -0
  75. package/lib/types/footer-budget.d.ts +204 -0
  76. package/lib/types/footer-format.d.ts +221 -0
  77. package/lib/types/footer-layout.d.ts +292 -0
  78. package/lib/types/footer-meters.d.ts +151 -0
  79. package/lib/types/footer.d.ts +19 -269
  80. package/lib/types/paint.d.ts +48 -0
  81. package/lib/types/plan-projection.d.ts +162 -0
  82. package/lib/types/plan.d.ts +13 -0
  83. package/lib/types/question-state.d.ts +96 -0
  84. package/lib/types/representation.d.ts +498 -0
  85. package/lib/types/screen.d.ts +126 -0
  86. package/lib/types/startup.d.ts +24 -0
  87. package/lib/types/stats.d.ts +64 -1
  88. package/lib/types/term-text.d.ts +45 -1
  89. package/lib/types/throughput.d.ts +163 -0
  90. package/lib/types/tool-present.d.ts +41 -0
  91. package/lib/types/transcript-types.d.ts +63 -2
  92. package/lib/types/tui.d.ts +862 -11
  93. package/package.json +16 -6
package/lib/footer.js CHANGED
@@ -1,566 +1,27 @@
1
1
  /**
2
- * Footer stats, status identity, context-pressure chips, and `/status` report.
3
- */
4
- import { t } from './i18n/index.js';
5
- import { pinEmojiCells, truncateAnsiToWidth, visibleWidth } from './term-text.js';
6
- import { describeSubagentFit, subagentProviderDiffers } from './subagent-model.js';
7
- import { activeTheme, themeExtraToken, themeThresholdToken, themeToken } from './theme.js';
8
- import { downgradeSgr } from './color-depth.js';
9
- import { commandCodeSourceFor, formatQuotaStatusLine, openCodeSourceFor, } from './quota.js';
10
- export const WAIT_INDICATOR_MS = 8000;
11
- /** Compact token count, matching the web stats line (517 / 12.2K / 1.2M). */
12
- export function formatTokens(n) {
13
- const scaled = (value) => value >= 100 ? String(Math.round(value)) : String(Math.round(value * 10) / 10);
14
- if (n < 1_000)
15
- return String(n);
16
- if (n < 1_000_000)
17
- return `${scaled(n / 1_000)}K`;
18
- return `${scaled(n / 1_000_000)}M`;
19
- }
20
- /**
21
- * Prompt occupancy of the next request, from DSH `contextPressure`.
22
- * Provider-agnostic: uses the routed model's advertised window, not a
23
- * hardcoded xAI size. Compaction-basic still owns in-turn pressure at 80%.
24
- */
25
- export const CONTEXT_PRESSURE_WARN_RATIO = 0.8;
26
- export const CONTEXT_PRESSURE_DANGER_RATIO = 0.95;
27
- /** Idle auto-compact starts here so recovery finishes before the 80% in-turn trigger. */
28
- export const CONTEXT_IDLE_COMPACT_RATIO = 0.72;
29
- /** Prompt-side occupancy of one usage sample: uncached input plus cache traffic. */
30
- export function promptPressureTokens(usage) {
31
- return usage.inputTokens + (usage.cacheReadTokens ?? 0) + (usage.cacheWriteTokens ?? 0);
32
- }
33
- /** Prefer the next-request projection; fall back to last-request pressure. */
34
- export function contextPressureUsedTokens(pressure) {
35
- if (pressure === undefined)
36
- return undefined;
37
- if (typeof pressure.projectedTokens === 'number' && Number.isFinite(pressure.projectedTokens)) {
38
- return Math.max(0, pressure.projectedTokens);
39
- }
40
- if (typeof pressure.pressureTokens === 'number' && Number.isFinite(pressure.pressureTokens)) {
41
- return Math.max(0, pressure.pressureTokens);
42
- }
43
- return undefined;
44
- }
45
- export function parseContextPressure(value) {
46
- if (value === null || typeof value !== 'object')
47
- return undefined;
48
- const raw = value;
49
- const window = typeof raw.contextWindow === 'number' && Number.isFinite(raw.contextWindow)
50
- ? raw.contextWindow
51
- : undefined;
52
- if (window === undefined || window <= 0)
53
- return undefined;
54
- const used = contextPressureUsedTokens({
55
- ...(typeof raw.projectedTokens === 'number' ? { projectedTokens: raw.projectedTokens } : {}),
56
- ...(typeof raw.pressureTokens === 'number' ? { pressureTokens: raw.pressureTokens } : {}),
57
- });
58
- if (used === undefined)
59
- return undefined;
60
- return { usedTokens: used, contextWindow: window };
61
- }
62
- export function contextPressureView(sample) {
63
- const percent = (sample.usedTokens / sample.contextWindow) * 100;
64
- return {
65
- usedTokens: sample.usedTokens,
66
- contextWindow: sample.contextWindow,
67
- percent,
68
- level: percent >= CONTEXT_PRESSURE_DANGER_RATIO * 100
69
- ? 'danger'
70
- : percent >= CONTEXT_PRESSURE_WARN_RATIO * 100
71
- ? 'warn'
72
- : 'ok',
73
- };
74
- }
75
- /**
76
- * 8-segment Braille ring. Empty `⣀`; full `⣿`. Width is always 1 cell.
77
- * Index is `ceil(percent / 12.5)` clamped to 0..8.
78
- */
79
- export const CONTEXT_RING_EMPTY = '⣀';
80
- export const CONTEXT_RING_SEGMENTS = ['⣀', '⠉', '⠋', '⠛', '⠞', '⠟', '⠿', '⡿', '⣿'];
81
- /** The full cell of the same Braille family, for bars built like the ring. */
82
- export const CONTEXT_RING_FULL = '⣿';
83
- export function formatContextPressureRing(percent) {
84
- if (!Number.isFinite(percent) || percent <= 0)
85
- return CONTEXT_RING_EMPTY;
86
- const filled = Math.min(8, Math.max(0, Math.ceil(percent / 12.5)));
87
- return CONTEXT_RING_SEGMENTS[filled] ?? '⣿';
88
- }
89
- export function contextPressureRingColor(level) {
90
- return themeThresholdToken(activeTheme(), level === 'danger' ? 'over' : level === 'warn' ? 'warn' : 'ok');
91
- }
92
- export function formatContextPressureChip(view, color = false) {
93
- const ring = formatContextPressureRing(view.percent);
94
- const painted = color
95
- ? `\x1b[${contextPressureRingColor(view.level)}m${ring}\x1b[0m`
96
- : ring;
97
- return t('footer.contextRing', {
98
- ring: painted,
99
- used: formatTokens(view.usedTokens),
100
- window: formatTokens(view.contextWindow),
101
- percent: Math.round(view.percent),
102
- });
103
- }
104
- export function formatContextPressureStatusLine(view) {
105
- if (view === undefined)
106
- return t('status.contextNone');
107
- return t('status.contextLine', {
108
- used: formatTokens(view.usedTokens),
109
- window: formatTokens(view.contextWindow),
110
- percent: view.percent.toFixed(1),
111
- level: t(`status.contextLevel.${view.level}`),
112
- });
113
- }
114
- export function contextPressureAlertText(view) {
115
- const vars = {
116
- used: formatTokens(view.usedTokens),
117
- window: formatTokens(view.contextWindow),
118
- percent: view.percent.toFixed(0),
119
- };
120
- return view.level === 'danger'
121
- ? t('context.alertDanger', vars)
122
- : t('context.alertWarn', vars);
123
- }
124
- export function shouldIdleAutoCompact(view) {
125
- if (view === undefined)
126
- return false;
127
- return view.usedTokens / view.contextWindow >= CONTEXT_IDLE_COMPACT_RATIO;
128
- }
129
- /** Compact duration, matching the web stats line (45.2s / 2m42s). */
130
- export function formatDuration(ms) {
131
- const seconds = ms / 1_000;
132
- if (seconds < 60)
133
- return `${Math.round(seconds * 10) / 10}s`;
134
- const whole = Math.round(seconds);
135
- return `${Math.floor(whole / 60)}m${whole % 60}s`;
136
- }
137
- export function formatTokensPerSecond(tokensPerSecond) {
138
- // A slow step (a few tokens over tens of seconds) still decoded something;
139
- // rounding that to "0 tok/s" reads as a stalled model.
140
- if (!Number.isFinite(tokensPerSecond) || tokensPerSecond <= 0)
141
- return '0 tok/s';
142
- if (tokensPerSecond < 0.5)
143
- return '<1 tok/s';
144
- return `${Math.round(tokensPerSecond)} tok/s`;
145
- }
146
- export function providerShortCode(provider) {
147
- const id = provider.trim();
148
- if (id === 'deepseek-official' || id === 'deepseek')
149
- return t('route.deepseek');
150
- if (id === 'xai' || id === 'grok' || id.startsWith('xai-'))
151
- return 'SuperGrok';
152
- if (id === 'opencode-go')
153
- return 'OpenCode Go';
154
- if (id === 'opencode')
155
- return 'OpenCode Zen';
156
- return id;
157
- }
158
- /** Stats groups in drop order (last is dropped first when the row is too wide). */
159
- export function footerStatsGroups(stats) {
160
- const groups = [];
161
- if (stats.steps > 0)
162
- groups.push(t('footer.turnsSteps', { turns: stats.turns, steps: stats.steps }));
163
- const billedInput = stats.inputTokens + stats.cacheReadTokens + stats.cacheWriteTokens;
164
- if (billedInput > 0 || stats.outputTokens > 0) {
165
- groups.push(t('footer.tokens', { input: formatTokens(billedInput), output: formatTokens(stats.outputTokens) }));
166
- }
167
- const speeds = [];
168
- if (stats.decodeMs > 0 && stats.decodeTokens > 0) {
169
- speeds.push(formatTokensPerSecond(stats.decodeTokens / (stats.decodeMs / 1_000)));
170
- }
171
- else if (stats.ttftSteps > 0) {
172
- speeds.push(t('footer.ttft', { duration: formatDuration(stats.ttftMs / stats.ttftSteps) }));
173
- }
174
- if (speeds.length > 0)
175
- groups.push(speeds.join(' '));
176
- const durations = [];
177
- if (stats.llmMs > 0)
178
- durations.push(t('footer.llmMs', { duration: formatDuration(stats.llmMs) }));
179
- if (stats.toolMs > 0)
180
- durations.push(t('footer.toolMs', { duration: formatDuration(stats.toolMs) }));
181
- if (durations.length > 0)
182
- groups.push(durations.join(' '));
183
- if (billedInput > 0)
184
- groups.push(t('footer.cacheHit', { percent: Math.round(stats.cacheReadTokens / billedInput * 100) }));
185
- return groups;
186
- }
187
- /**
188
- * Fit an ordered strip into `width` cells, losing text before graphics.
2
+ * The footer, in four parts — and the module every caller has always imported.
189
3
  *
190
- * The old fitter dropped whole groups from the end, so a narrow terminal lost
191
- * the ⚠ and the context ring — the two signals that say something is wrong —
192
- * while keeping long numeric groups. Two passes now: every chip trades its text
193
- * for its glyph in reverse priority order, and only then do whole groups go,
194
- * again lowest priority first. The result never exceeds the width.
4
+ * `tui.ts` paints from here, `/status` reports from here, and a dozen tests
5
+ * reach in through this path. The pass that turned the strip into a status row
6
+ * split the file along the four responsibilities that had grown together inside
7
+ * it; this module stays as the barrel so that split cost no call site:
195
8
  *
196
- * Chips may carry SGR accents (the link pips, the ⚠) and the caller may pass a
197
- * styled separator, so both the measurement and the final cut are ANSI-aware:
198
- * feeding styled text to a plain-text truncator strips the accent's `ESC` and
199
- * leaves its `[32m` body on the grid.
200
- */
201
- export function fitFooterChips(chips, width, separator = ' │ ') {
202
- const limit = Math.max(1, width);
203
- const state = chips
204
- .filter(chip => chip.long !== '' || chip.short !== '')
205
- .map(chip => ({ chip, full: true, present: true }));
206
- const render = () => state
207
- .filter(entry => entry.present)
208
- .map(entry => (entry.full ? entry.chip.long : entry.chip.short))
209
- .filter(text => text !== '')
210
- .join(separator);
211
- // Budget the way it will be painted: the frame pins a symbol like ⚠ with a
212
- // variation selector and a reserving space, so the raw string measures one or
213
- // two cells narrower than the row it becomes. Fitting the unpinned text left
214
- // a row that overflowed the terminal by exactly that much.
215
- const used = () => visibleWidth(pinEmojiCells(render()));
216
- const byLeastImportant = [...state].sort((a, b) => b.chip.priority - a.chip.priority);
217
- for (const entry of byLeastImportant) {
218
- if (used() <= limit)
219
- break;
220
- entry.full = false;
221
- }
222
- for (const entry of byLeastImportant) {
223
- if (used() <= limit)
224
- break;
225
- entry.present = false;
226
- }
227
- if (state.length > 0 && state.every(entry => !entry.present)) {
228
- // Nothing fits, not even the glyphs. Keeping the most important group and
229
- // letting the clip shorten it beats handing the user a blank row: a ⚠ cut
230
- // to one cell still says the install is broken.
231
- const best = [...state].sort((a, b) => a.chip.priority - b.chip.priority)[0];
232
- if (best !== undefined) {
233
- best.present = true;
234
- best.full = false;
235
- }
236
- }
237
- return truncateAnsiToWidth(render(), limit);
238
- }
239
- /**
240
- * The roster's health as a chip: absent means `/mode` cannot switch presets and
241
- * the preset-owned tools are missing. It leads the strip and keeps its glyph
242
- * longest, because it is the one group that reports a broken install.
243
- */
244
- export function footerHealthChip(missing, color = false,
245
- /** Which rows are missing: the 0.1.5 roster, or the 0.1.7 agent plane. */
246
- kind = 'roster') {
247
- if (!missing)
248
- return undefined;
249
- const glyph = color ? `\x1b[${themeExtraToken(activeTheme(), 'warn')}m⚠\x1b[0m` : '⚠';
250
- return {
251
- id: 'health',
252
- long: `${glyph} ${t(kind === 'agent-plane' ? 'footer.agentPlaneMissing' : 'footer.rosterMissing')}`,
253
- short: glyph,
254
- priority: 0,
255
- };
256
- }
257
- export function fitFooterStatsLine(chip, groups, width) {
258
- const kept = [...groups];
259
- const render = () => kept.length === 0 ? chip : `${chip} │ ${kept.join(' │ ')}`;
260
- while (kept.length > 0 && visibleWidth(render()) > width)
261
- kept.pop();
262
- return truncateAnsiToWidth(render(), Math.max(1, width));
263
- }
264
- export function footerActivity(input) {
265
- if (input.planReview)
266
- return { kind: 'plan-review', text: t('footer.planReview') };
267
- if (input.waitingQuestion)
268
- return { kind: 'waiting', text: t('footer.waiting') };
269
- if (input.compacting)
270
- return { kind: 'compacting', text: t('footer.compacting') };
271
- // Only a running turn can be retrying: a chip left over from a finished turn
272
- // (a missed event, or a retry of a background request such as the session
273
- // title) must not hide the state the user is actually in.
274
- if (input.running && input.retry !== undefined) {
275
- return { kind: 'retry', text: t('footer.retry', { retry: input.retry.retry, max: input.retry.maxRetries }) };
276
- }
277
- if (input.subagents > 0)
278
- return { kind: 'subagents', text: t('footer.subagents', { count: input.subagents }) };
279
- if (input.running && input.tools > 0)
280
- return { kind: 'tools', text: t('footer.tools', { count: input.tools }) };
281
- if (input.planLeftOpen)
282
- return { kind: 'plan-open', text: t('footer.planOpen') };
283
- if (input.planPending)
284
- return { kind: 'plan-pending', text: t('footer.planSwitching') };
285
- if (input.planActive)
286
- return { kind: 'plan-pending', text: t('footer.planMode') };
287
- if (input.goalPhase === 'active')
288
- return { kind: 'goal', text: t('footer.goalActive') };
289
- if (input.goalPhase === 'paused')
290
- return { kind: 'goal', text: t('footer.goalPaused') };
291
- if (input.goalPhase === 'blocked')
292
- return { kind: 'goal', text: t('footer.goalBlocked') };
293
- if (input.running && input.idleMs > WAIT_INDICATOR_MS) {
294
- return { kind: 'waiting-llm', text: t('footer.waitSeconds', { seconds: Math.floor(input.idleMs / 1000) }) };
295
- }
296
- if (input.running)
297
- return { kind: 'idle', text: t('footer.running') };
298
- return { kind: 'idle', text: t('footer.idle') };
299
- }
300
- /** Short remaining-quota bar: 8 pips, filled from the left. */
301
- export function formatQuotaBar(remainingPercent, width = 8) {
302
- const remaining = Math.max(0, Math.min(100, remainingPercent));
303
- const filled = Math.round(remaining / 100 * width);
304
- return `${'█'.repeat(filled)}${'░'.repeat(width - filled)}`;
305
- }
306
- /**
307
- * `sub:<model>` chip for the identity row: `sub:grok-4.5`, or
308
- * `sub:grok-4.5(xhigh)` when an explicit `/subeffort` is set.
9
+ * - `footer-format.ts` — a value in, text out (and the pressure reading).
10
+ * - `footer-meters.ts` — the three meter primitives.
11
+ * - `footer-budget.ts` — the responsive degradation ladder and the row.
12
+ * - `footer-layout.ts` — the two chrome rows, and `/status`.
309
13
  *
310
- * It shows the model name only, like the parent's own chip, unless `/submodel`
311
- * pinned a different provider — then `sub:xai/grok-4.5` so the foreign route
312
- * is visible on the identity row as well as the recolored chip.
313
- */
314
- export function subagentRouteLabel(model, provider, effort) {
315
- const id = shortModelName(model);
316
- if (id === '')
317
- return '';
318
- const suffix = effort === undefined || effort.trim() === '' ? '' : `(${effort.trim()})`;
319
- const host = provider === undefined || provider.trim() === '' ? '' : `${provider.trim()}/`;
320
- return `sub:${host}${id}${suffix}`;
321
- }
322
- /**
323
- * Paint the `sub:` chip on an otherwise muted status line.
14
+ * The one helper they all share — `accent`, the "paint this run in this role's
15
+ * colour" primitive — lives in `color-depth.ts` beside `downgradeSgr`, which is
16
+ * where "what can this terminal take" is already answered.
324
17
  *
325
- * Only a *foreign* route is accented: cyan when `/submodel` pinned a supplier
326
- * the parent is not on. A child that follows the parent (or that was pinned
327
- * back onto the parent's own provider) keeps the identity row's mute — the
328
- * accent means "this route is not your parent's", and spending it on every
329
- * child made the following case look pinned.
330
- *
331
- * The mute (`90`) is reopened after the chip so the rest of the identity row
332
- * stays dim.
333
- */
334
- export function paintFooterSubagentChip(line, chip, foreign, muteSgr = themeToken(activeTheme(), 'system'), depth = 'truecolor', identitySgr = themeExtraToken(activeTheme(), 'subagent-foreign')) {
335
- if (!foreign || chip === '' || !line.includes(chip))
336
- return line;
337
- const code = downgradeSgr(identitySgr, depth);
338
- if (code === '')
339
- return line;
340
- const mute = muteSgr === '' ? '0' : muteSgr;
341
- return line.replace(chip, `\x1b[${code}m${chip}\x1b[0m\x1b[${mute}m`);
342
- }
343
- export function footerSubagentForeign(input) {
344
- return subagentProviderDiffers(input.provider, input.subProvider);
345
- }
346
- /**
347
- * The model as the footer shows it: the model's own name, without a
348
- * `provider/model` route prefix.
349
- *
350
- * Some providers carry the vendor in the model id (`xai/grok-4.6`,
351
- * `deepseek-official/deepseek-v4-flash`). The route is worth a row in the header
352
- * and in `/status`; in the status line it spent cells on something the reader
353
- * already knows, and it pushed the quota badge towards the drop edge.
354
- * `sub:` routes keep their provider on purpose — that is a *different* route
355
- * from the parent's, and hiding it would make the two indistinguishable.
356
- */
357
- export function shortModelName(model) {
358
- const id = model.trim();
359
- const slash = id.lastIndexOf('/');
360
- if (slash < 0)
361
- return id;
362
- const tail = id.slice(slash + 1).trim();
363
- // A trailing slash (or a bare `/`) leaves nothing to show: keep the original.
364
- return tail === '' ? id : tail;
365
- }
366
- export function footerIdentityParts(input) {
367
- const parts = [];
368
- if (input.compactView === true)
369
- parts.push(`[${t('view.footerCompact')}]`);
370
- if (input.preset !== undefined && input.preset !== '')
371
- parts.push(`[${input.preset}]`);
372
- if (input.cwdLabel !== undefined && input.cwdLabel !== '')
373
- parts.push(input.cwdLabel);
374
- const modelName = shortModelName(input.model);
375
- const effort = input.effort === undefined || input.effort.trim() === '' ? '' : input.effort.trim();
376
- const model = [modelName, effort].filter(part => part !== '').join(' ');
377
- if (model !== '')
378
- parts.push(model);
379
- if (input.balanceText !== undefined && input.balanceText !== '') {
380
- parts.push(input.balanceText);
381
- }
382
- if (input.quotaUnknown === true) {
383
- parts.push(formatQuotaUnknown());
384
- }
385
- else if (input.quotaPercent !== undefined) {
386
- parts.push(formatFooterQuota(input.quotaPercent, input.quotaCode, input.quotaPeriod));
387
- }
388
- if (input.contextChip !== undefined && input.contextChip !== '')
389
- parts.push(input.contextChip);
390
- // The subagent route is what every child inherits, so it is always on the
391
- // line again (hiding it when it repeated the parent model read as a
392
- // regression) — but it sits after the quota/context chips, which are live
393
- // operational signals and should be the last thing a narrow row drops.
394
- const sub = subagentRouteLabel(input.subModel, input.subProvider, input.subEffort);
395
- if (sub !== '')
396
- parts.push(sub);
397
- if (input.search !== undefined)
398
- parts.push(t('footer.search', { index: input.search.index + 1, total: input.search.total }));
399
- if (input.foldedInput)
400
- parts.push(t('footer.inputFolded'));
401
- else if (input.multiLineInput)
402
- parts.push(t('footer.multiLine'));
403
- if (input.queued > 0)
404
- parts.push(t('footer.queued', { count: input.queued }));
405
- return parts;
406
- }
407
- /**
408
- * `SuperGrok 5Hr ███████░ 82%` — short plan badge, the window the number belongs
409
- * to, then the bar.
410
- *
411
- * The tags are fixed technical labels (`5Hr` / `1Wk` / `1Mo`) rather than
412
- * localized words: they sit in a footer that is already fighting for cells, and
413
- * a window tag that changes with the locale would be unreadable in a screenshot
414
- * or a bug report. Everything else about the window (label, reset time, detail)
415
- * stays in `/quota`.
416
- */
417
- export function formatFooterQuota(percent, code, period) {
418
- const bar = `${formatQuotaBar(percent)} ${percent.toFixed(0)}%`;
419
- const tag = quotaWindowTag(period);
420
- const name = code === undefined ? '' : code.trim();
421
- return [name, tag, bar].filter(part => part !== '').join(' ');
422
- }
423
- /**
424
- * The quota widget before the first reading arrives, or while the provider
425
- * cannot be reached: an empty bar and a question mark.
426
- *
427
- * Deliberately not `0%`: an unreachable quota API is not a used-up quota, and a
428
- * number the footer cannot back up is worse than no number. The bar is there
429
- * from the first frame so the row does not jump when the reading lands.
430
- */
431
- export function formatQuotaUnknown() {
432
- return `${formatQuotaBar(0)} ?%`;
433
- }
434
- /** Fixed-width tag for the window a footer quota number belongs to. */
435
- export function quotaWindowTag(period) {
436
- if (period === 'hourly')
437
- return '5Hr';
438
- if (period === 'weekly')
439
- return '1Wk';
440
- if (period === 'monthly')
441
- return '1Mo';
442
- return '';
443
- }
444
- /**
445
- * The badge the footer shows instead of the billing plan's own label:
446
- * `SuperGrok`, `OC·GO` (OpenCode Go), `CC·GOAT` (Command Code Goat).
447
- *
448
- * The long names live in `/quota`; this one has to survive next to a model id.
449
- * Without a `source` (a hand-built snapshot) the plan label is matched instead,
450
- * so old callers and tests keep a sensible badge.
451
- */
452
- export function shortQuotaPlanName(snapshot) {
453
- const plan = snapshot.plan.trim();
454
- if (snapshot.source === 'supergrok')
455
- return 'SuperGrok';
456
- if (snapshot.source === 'opencode-go')
457
- return 'OC·GO';
458
- if (snapshot.source === 'command-code') {
459
- const tier = plan === '' || plan.toLowerCase() === 'command code' ? '' : plan.toUpperCase();
460
- return tier === '' ? 'CC' : `CC·${tier}`;
461
- }
462
- if (/supergrok/iu.test(plan))
463
- return 'SuperGrok';
464
- if (/opencode/iu.test(plan))
465
- return 'OC·GO';
466
- if (/goat/iu.test(plan))
467
- return 'CC·GOAT';
468
- return plan;
469
- }
470
- /**
471
- * Drop the Go / SuperGrok plan name from a quota identity part, keeping the
472
- * remaining-percent bar. Returns true when a part was rewritten.
473
- */
474
- export function dropFooterQuotaPlanName(parts) {
475
- for (let index = 0; index < parts.length; index++) {
476
- const part = parts[index];
477
- if (part === undefined)
478
- continue;
479
- const barAt = part.search(/[█░]{8} \d+%$/);
480
- if (barAt <= 0)
481
- continue;
482
- // The window tag is the last thing before the bar and survives the badge:
483
- // `SuperGrok 5Hr ███ 82%` narrows to `5Hr ███ 82%`, not to a bare bar.
484
- const tag = /(?:5Hr|1Wk|1Mo)$/u.exec(part.slice(0, barAt).trimEnd())?.[0];
485
- parts[index] = tag === undefined ? part.slice(barAt) : `${tag} ${part.slice(barAt)}`;
486
- return true;
487
- }
488
- return false;
489
- }
490
- export function fitFooterStatusLine(activity, identity, width) {
491
- const kept = [...identity];
492
- const render = () => kept.length === 0 ? activity : `${activity} ${kept.join(' · ')}`;
493
- if (visibleWidth(render()) > width)
494
- dropFooterQuotaPlanName(kept);
495
- while (kept.length > 0 && visibleWidth(render()) > width)
496
- kept.pop();
497
- return truncateAnsiToWidth(render(), Math.max(1, width));
498
- }
499
- /** Lines printed by `/status` — SSH first-boot diagnostics, no extra command. */
500
- export function formatStatusReport(input) {
501
- const route = describeProviderRoute(input.provider);
502
- const effort = input.effort === undefined ? '' : ` (${input.effort})`;
503
- const fit = describeSubagentFit({
504
- parentProvider: input.provider,
505
- parentModel: input.parentModel,
506
- subProvider: input.subProvider,
507
- subModel: input.subModel,
508
- });
509
- return [
510
- `session: ${input.sessionId}`,
511
- `plugin: dsh-ssh-tui ${input.pluginVersion}`,
512
- `cwd: ${input.cwd ?? ''}`,
513
- `route: ${input.provider}/${input.model}${effort}`,
514
- `provider: ${route.kind}`,
515
- `status: ${input.agentStatus}`,
516
- `preset: ${input.preset}`,
517
- `subagents: ${input.activeSubagents}`,
518
- fit.line,
519
- `plan: ${input.plan}`,
520
- formatQuotaStatusLine(input.quota),
521
- formatContextPressureStatusLine(input.context),
522
- `paint: ${input.paint}`,
523
- `disconnect: ${input.disconnect ?? 'pause'}`,
524
- input.waitingQuestions > 0 ? `questions: waiting ${input.waitingQuestions}` : 'questions: none',
525
- ];
526
- }
527
- /** Human-facing kind for a live LLM route. */
528
- export function describeProviderRoute(provider) {
529
- const id = provider.trim();
530
- if (id === 'deepseek-official' || id === 'deepseek') {
531
- return { kind: t('route.deepseek'), short: t('route.deepseek') };
532
- }
533
- if (id === 'xai' || id === 'grok' || id.startsWith('xai-')) {
534
- return { kind: t('route.supergrokKind'), short: t('route.supergrokShort') };
535
- }
536
- if (id === 'opencode-go')
537
- return { kind: t('route.go'), short: t('route.go') };
538
- if (id === 'opencode')
539
- return { kind: t('route.zen'), short: t('route.zen') };
540
- return { kind: t('route.registered'), short: id };
541
- }
542
- /** Routes that authenticate without a harness API-key credential. */
543
- export function providerUsesLocalOAuth(provider) {
544
- const id = provider.trim();
545
- return id === 'xai' || id === 'grok' || id.startsWith('xai-');
546
- }
547
- /**
548
- * Whether a provider has a quota surface at all, without asking it.
18
+ * Import from here unless you are inside the footer; the four modules import
19
+ * each other in exactly that order and never back.
549
20
  *
550
- * The footer paints a quota widget from the first frame — an empty bar and `?%`
551
- * until a reading arrives — so it needs to tell "this provider will have one"
552
- * from "this provider reports a balance instead" (DeepSeek) or nothing at all.
553
- * Every branch is a synchronous settings read, so a repaint never does IO.
21
+ * @module dsh-ssh-tui/footer
554
22
  */
555
- export function providerHasQuotaSurface(provider, llmPiAiSection) {
556
- const id = provider.trim();
557
- if (id === '')
558
- return false;
559
- if (providerUsesLocalOAuth(id))
560
- return true;
561
- if (commandCodeSourceFor(id, llmPiAiSection) !== null)
562
- return true;
563
- const source = openCodeSourceFor(id, llmPiAiSection);
564
- return source !== null && source.flavor === 'go';
565
- }
23
+ export * from './footer-format.js';
24
+ export * from './footer-meters.js';
25
+ export * from './footer-budget.js';
26
+ export * from './footer-layout.js';
566
27
  //# sourceMappingURL=footer.js.map
package/lib/footer.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"footer.js","sourceRoot":"","sources":["../src/footer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"footer.js","sourceRoot":"","sources":["../src/footer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA"}