dsh-ssh-tui 0.5.2 → 0.5.4
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.en.md +36 -6
- package/README.md +24 -13
- package/lib/approval-reviewer.js +102 -17
- package/lib/approval-reviewer.js.map +1 -1
- package/lib/auto-approval.js +312 -29
- package/lib/auto-approval.js.map +1 -1
- package/lib/footer.js +337 -0
- package/lib/footer.js.map +1 -0
- package/lib/i18n/en.js +83 -8
- package/lib/i18n/en.js.map +1 -1
- package/lib/i18n/index.js +1 -0
- package/lib/i18n/index.js.map +1 -1
- package/lib/i18n/zh.js +83 -8
- package/lib/i18n/zh.js.map +1 -1
- package/lib/json-args.js +30 -0
- package/lib/json-args.js.map +1 -0
- package/lib/paint.js +262 -0
- package/lib/paint.js.map +1 -0
- package/lib/picker.js +407 -56
- package/lib/picker.js.map +1 -1
- package/lib/plan.js +369 -0
- package/lib/plan.js.map +1 -0
- package/lib/quota.js +408 -0
- package/lib/quota.js.map +1 -0
- package/lib/session-list.js +18 -21
- package/lib/session-list.js.map +1 -1
- package/lib/term-text.js +827 -0
- package/lib/term-text.js.map +1 -0
- package/lib/tool-present.js +744 -0
- package/lib/tool-present.js.map +1 -0
- package/lib/transcript-types.js +6 -0
- package/lib/transcript-types.js.map +1 -0
- package/lib/tui.js +747 -3077
- package/lib/tui.js.map +1 -1
- package/lib/types/approval-reviewer.d.ts +18 -4
- package/lib/types/auto-approval.d.ts +53 -2
- package/lib/types/footer.d.ts +155 -0
- package/lib/types/i18n/index.d.ts +2 -0
- package/lib/types/json-args.d.ts +7 -0
- package/lib/types/paint.d.ts +78 -0
- package/lib/types/picker.d.ts +99 -7
- package/lib/types/plan.d.ts +80 -0
- package/lib/types/quota.d.ts +94 -0
- package/lib/types/session-list.d.ts +13 -0
- package/lib/types/term-text.d.ts +130 -0
- package/lib/types/tool-present.d.ts +165 -0
- package/lib/types/transcript-types.d.ts +152 -0
- package/lib/types/tui.d.ts +39 -665
- package/package.json +1 -1
package/lib/footer.js
ADDED
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Footer stats, status identity, context-pressure chips, and `/status` report.
|
|
3
|
+
*/
|
|
4
|
+
import { t } from './i18n/index.js';
|
|
5
|
+
import { displayWidth, truncateToWidth } from './term-text.js';
|
|
6
|
+
import { describeSubagentFit } from './subagent-model.js';
|
|
7
|
+
import { formatQuotaStatusLine } from './quota.js';
|
|
8
|
+
export const WAIT_INDICATOR_MS = 8000;
|
|
9
|
+
/** Compact token count, matching the web stats line (517 / 12.2K / 1.2M). */
|
|
10
|
+
export function formatTokens(n) {
|
|
11
|
+
const scaled = (value) => value >= 100 ? String(Math.round(value)) : String(Math.round(value * 10) / 10);
|
|
12
|
+
if (n < 1_000)
|
|
13
|
+
return String(n);
|
|
14
|
+
if (n < 1_000_000)
|
|
15
|
+
return `${scaled(n / 1_000)}K`;
|
|
16
|
+
return `${scaled(n / 1_000_000)}M`;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Prompt occupancy of the next request, from DSH `contextPressure`.
|
|
20
|
+
* Provider-agnostic: uses the routed model's advertised window, not a
|
|
21
|
+
* hardcoded xAI size. Compaction-basic still owns in-turn pressure at 80%.
|
|
22
|
+
*/
|
|
23
|
+
export const CONTEXT_PRESSURE_WARN_RATIO = 0.8;
|
|
24
|
+
export const CONTEXT_PRESSURE_DANGER_RATIO = 0.95;
|
|
25
|
+
/** Idle auto-compact starts here so recovery finishes before the 80% in-turn trigger. */
|
|
26
|
+
export const CONTEXT_IDLE_COMPACT_RATIO = 0.72;
|
|
27
|
+
/** Prompt-side occupancy of one usage sample: uncached input plus cache traffic. */
|
|
28
|
+
export function promptPressureTokens(usage) {
|
|
29
|
+
return usage.inputTokens + (usage.cacheReadTokens ?? 0) + (usage.cacheWriteTokens ?? 0);
|
|
30
|
+
}
|
|
31
|
+
/** Prefer the next-request projection; fall back to last-request pressure. */
|
|
32
|
+
export function contextPressureUsedTokens(pressure) {
|
|
33
|
+
if (pressure === undefined)
|
|
34
|
+
return undefined;
|
|
35
|
+
if (typeof pressure.projectedTokens === 'number' && Number.isFinite(pressure.projectedTokens)) {
|
|
36
|
+
return Math.max(0, pressure.projectedTokens);
|
|
37
|
+
}
|
|
38
|
+
if (typeof pressure.pressureTokens === 'number' && Number.isFinite(pressure.pressureTokens)) {
|
|
39
|
+
return Math.max(0, pressure.pressureTokens);
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
export function parseContextPressure(value) {
|
|
44
|
+
if (value === null || typeof value !== 'object')
|
|
45
|
+
return undefined;
|
|
46
|
+
const raw = value;
|
|
47
|
+
const window = typeof raw.contextWindow === 'number' && Number.isFinite(raw.contextWindow)
|
|
48
|
+
? raw.contextWindow
|
|
49
|
+
: undefined;
|
|
50
|
+
if (window === undefined || window <= 0)
|
|
51
|
+
return undefined;
|
|
52
|
+
const used = contextPressureUsedTokens({
|
|
53
|
+
...(typeof raw.projectedTokens === 'number' ? { projectedTokens: raw.projectedTokens } : {}),
|
|
54
|
+
...(typeof raw.pressureTokens === 'number' ? { pressureTokens: raw.pressureTokens } : {}),
|
|
55
|
+
});
|
|
56
|
+
if (used === undefined)
|
|
57
|
+
return undefined;
|
|
58
|
+
return { usedTokens: used, contextWindow: window };
|
|
59
|
+
}
|
|
60
|
+
export function contextPressureView(sample) {
|
|
61
|
+
const percent = (sample.usedTokens / sample.contextWindow) * 100;
|
|
62
|
+
return {
|
|
63
|
+
usedTokens: sample.usedTokens,
|
|
64
|
+
contextWindow: sample.contextWindow,
|
|
65
|
+
percent,
|
|
66
|
+
level: percent >= CONTEXT_PRESSURE_DANGER_RATIO * 100
|
|
67
|
+
? 'danger'
|
|
68
|
+
: percent >= CONTEXT_PRESSURE_WARN_RATIO * 100
|
|
69
|
+
? 'warn'
|
|
70
|
+
: 'ok',
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 8-segment Braille ring. Empty `⣀`; full `⣿`. Width is always 1 cell.
|
|
75
|
+
* Index is `ceil(percent / 12.5)` clamped to 0..8.
|
|
76
|
+
*/
|
|
77
|
+
export const CONTEXT_RING_EMPTY = '⣀';
|
|
78
|
+
export const CONTEXT_RING_SEGMENTS = ['⣀', '⠉', '⠋', '⠛', '⠞', '⠟', '⠿', '⡿', '⣿'];
|
|
79
|
+
export function formatContextPressureRing(percent) {
|
|
80
|
+
if (!Number.isFinite(percent) || percent <= 0)
|
|
81
|
+
return CONTEXT_RING_EMPTY;
|
|
82
|
+
const filled = Math.min(8, Math.max(0, Math.ceil(percent / 12.5)));
|
|
83
|
+
return CONTEXT_RING_SEGMENTS[filled] ?? '⣿';
|
|
84
|
+
}
|
|
85
|
+
export function contextPressureRingColor(level) {
|
|
86
|
+
if (level === 'danger')
|
|
87
|
+
return '31';
|
|
88
|
+
if (level === 'warn')
|
|
89
|
+
return '33';
|
|
90
|
+
return '32';
|
|
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
|
+
return `${Math.round(tokensPerSecond)} tok/s`;
|
|
139
|
+
}
|
|
140
|
+
export function providerShortCode(provider) {
|
|
141
|
+
const id = provider.trim();
|
|
142
|
+
if (id === 'deepseek-official' || id === 'deepseek')
|
|
143
|
+
return t('route.deepseek');
|
|
144
|
+
if (id === 'xai' || id === 'grok' || id.startsWith('xai-'))
|
|
145
|
+
return 'SuperGrok';
|
|
146
|
+
if (id === 'opencode-go')
|
|
147
|
+
return 'OpenCode Go';
|
|
148
|
+
if (id === 'opencode')
|
|
149
|
+
return 'OpenCode Zen';
|
|
150
|
+
return id;
|
|
151
|
+
}
|
|
152
|
+
/** Stats groups in drop order (last is dropped first when the row is too wide). */
|
|
153
|
+
export function footerStatsGroups(stats) {
|
|
154
|
+
const groups = [];
|
|
155
|
+
if (stats.steps > 0)
|
|
156
|
+
groups.push(t('footer.turnsSteps', { turns: stats.turns, steps: stats.steps }));
|
|
157
|
+
const billedInput = stats.inputTokens + stats.cacheReadTokens + stats.cacheWriteTokens;
|
|
158
|
+
if (billedInput > 0 || stats.outputTokens > 0) {
|
|
159
|
+
groups.push(t('footer.tokens', { input: formatTokens(billedInput), output: formatTokens(stats.outputTokens) }));
|
|
160
|
+
}
|
|
161
|
+
const speeds = [];
|
|
162
|
+
if (stats.decodeMs > 0 && stats.decodeTokens > 0) {
|
|
163
|
+
speeds.push(formatTokensPerSecond(stats.decodeTokens / (stats.decodeMs / 1_000)));
|
|
164
|
+
}
|
|
165
|
+
else if (stats.ttftSteps > 0) {
|
|
166
|
+
speeds.push(t('footer.ttft', { duration: formatDuration(stats.ttftMs / stats.ttftSteps) }));
|
|
167
|
+
}
|
|
168
|
+
if (speeds.length > 0)
|
|
169
|
+
groups.push(speeds.join(' '));
|
|
170
|
+
const durations = [];
|
|
171
|
+
if (stats.llmMs > 0)
|
|
172
|
+
durations.push(t('footer.llmMs', { duration: formatDuration(stats.llmMs) }));
|
|
173
|
+
if (stats.toolMs > 0)
|
|
174
|
+
durations.push(t('footer.toolMs', { duration: formatDuration(stats.toolMs) }));
|
|
175
|
+
if (durations.length > 0)
|
|
176
|
+
groups.push(durations.join(' '));
|
|
177
|
+
if (billedInput > 0)
|
|
178
|
+
groups.push(t('footer.cacheHit', { percent: Math.round(stats.cacheReadTokens / billedInput * 100) }));
|
|
179
|
+
return groups;
|
|
180
|
+
}
|
|
181
|
+
export function fitFooterStatsLine(chip, groups, width) {
|
|
182
|
+
const kept = [...groups];
|
|
183
|
+
const render = () => kept.length === 0 ? chip : `${chip} │ ${kept.join(' │ ')}`;
|
|
184
|
+
while (kept.length > 0 && displayWidth(render()) > width)
|
|
185
|
+
kept.pop();
|
|
186
|
+
return truncateToWidth(render(), Math.max(1, width));
|
|
187
|
+
}
|
|
188
|
+
export function footerActivity(input) {
|
|
189
|
+
if (input.planReview)
|
|
190
|
+
return { kind: 'plan-review', text: t('footer.planReview') };
|
|
191
|
+
if (input.waitingQuestion)
|
|
192
|
+
return { kind: 'waiting', text: t('footer.waiting') };
|
|
193
|
+
if (input.compacting)
|
|
194
|
+
return { kind: 'compacting', text: t('footer.compacting') };
|
|
195
|
+
if (input.retry !== undefined) {
|
|
196
|
+
return { kind: 'retry', text: t('footer.retry', { retry: input.retry.retry, max: input.retry.maxRetries }) };
|
|
197
|
+
}
|
|
198
|
+
if (input.subagents > 0)
|
|
199
|
+
return { kind: 'subagents', text: t('footer.subagents', { count: input.subagents }) };
|
|
200
|
+
if (input.running && input.tools > 0)
|
|
201
|
+
return { kind: 'tools', text: t('footer.tools', { count: input.tools }) };
|
|
202
|
+
if (input.planLeftOpen)
|
|
203
|
+
return { kind: 'plan-open', text: t('footer.planOpen') };
|
|
204
|
+
if (input.planPending)
|
|
205
|
+
return { kind: 'plan-pending', text: t('footer.planSwitching') };
|
|
206
|
+
if (input.planActive)
|
|
207
|
+
return { kind: 'plan-pending', text: t('footer.planMode') };
|
|
208
|
+
if (input.goalPhase === 'active')
|
|
209
|
+
return { kind: 'goal', text: t('footer.goalActive') };
|
|
210
|
+
if (input.goalPhase === 'paused')
|
|
211
|
+
return { kind: 'goal', text: t('footer.goalPaused') };
|
|
212
|
+
if (input.goalPhase === 'blocked')
|
|
213
|
+
return { kind: 'goal', text: t('footer.goalBlocked') };
|
|
214
|
+
if (input.running && input.idleMs > WAIT_INDICATOR_MS) {
|
|
215
|
+
return { kind: 'waiting-llm', text: t('footer.waitSeconds', { seconds: Math.floor(input.idleMs / 1000) }) };
|
|
216
|
+
}
|
|
217
|
+
if (input.running)
|
|
218
|
+
return { kind: 'idle', text: t('footer.running') };
|
|
219
|
+
return { kind: 'idle', text: t('footer.idle') };
|
|
220
|
+
}
|
|
221
|
+
/** Short remaining-quota bar: 8 pips, filled from the left. */
|
|
222
|
+
export function formatQuotaBar(remainingPercent, width = 8) {
|
|
223
|
+
const remaining = Math.max(0, Math.min(100, remainingPercent));
|
|
224
|
+
const filled = Math.round(remaining / 100 * width);
|
|
225
|
+
return `${'█'.repeat(filled)}${'░'.repeat(width - filled)}`;
|
|
226
|
+
}
|
|
227
|
+
export function footerIdentityParts(input) {
|
|
228
|
+
const parts = [];
|
|
229
|
+
if (input.compactView === true)
|
|
230
|
+
parts.push(`[${t('view.footerCompact')}]`);
|
|
231
|
+
if (input.preset !== undefined && input.preset !== '')
|
|
232
|
+
parts.push(`[${input.preset}]`);
|
|
233
|
+
if (input.cwdLabel !== undefined && input.cwdLabel !== '')
|
|
234
|
+
parts.push(input.cwdLabel);
|
|
235
|
+
const model = input.effort === undefined ? input.model : `${input.model} ${input.effort}`;
|
|
236
|
+
if (model !== '')
|
|
237
|
+
parts.push(model);
|
|
238
|
+
if (input.subDiffers)
|
|
239
|
+
parts.push(`sub:${input.subModel}`);
|
|
240
|
+
if (input.balanceText !== undefined && input.balanceText !== '') {
|
|
241
|
+
parts.push(input.balanceText);
|
|
242
|
+
}
|
|
243
|
+
if (input.quotaPercent !== undefined) {
|
|
244
|
+
parts.push(formatFooterQuota(input.quotaPercent, input.quotaCode));
|
|
245
|
+
}
|
|
246
|
+
if (input.contextChip !== undefined && input.contextChip !== '')
|
|
247
|
+
parts.push(input.contextChip);
|
|
248
|
+
if (input.search !== undefined)
|
|
249
|
+
parts.push(t('footer.search', { index: input.search.index + 1, total: input.search.total }));
|
|
250
|
+
if (input.foldedInput)
|
|
251
|
+
parts.push(t('footer.inputFolded'));
|
|
252
|
+
else if (input.multiLineInput)
|
|
253
|
+
parts.push(t('footer.multiLine'));
|
|
254
|
+
if (input.queued > 0)
|
|
255
|
+
parts.push(t('footer.queued', { count: input.queued }));
|
|
256
|
+
return parts;
|
|
257
|
+
}
|
|
258
|
+
/** `SuperGrok ███████░ 82%`, or just the bar + percent when `code` is omitted. */
|
|
259
|
+
export function formatFooterQuota(percent, code) {
|
|
260
|
+
const bar = `${formatQuotaBar(percent)} ${percent.toFixed(0)}%`;
|
|
261
|
+
return code !== undefined && code.trim() !== '' ? `${code.trim()} ${bar}` : bar;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Drop the Go / SuperGrok plan name from a quota identity part, keeping the
|
|
265
|
+
* remaining-percent bar. Returns true when a part was rewritten.
|
|
266
|
+
*/
|
|
267
|
+
export function dropFooterQuotaPlanName(parts) {
|
|
268
|
+
for (let index = 0; index < parts.length; index++) {
|
|
269
|
+
const part = parts[index];
|
|
270
|
+
if (part === undefined)
|
|
271
|
+
continue;
|
|
272
|
+
const barAt = part.search(/ [█░]+ \d+%$/);
|
|
273
|
+
if (barAt <= 0)
|
|
274
|
+
continue;
|
|
275
|
+
parts[index] = part.slice(barAt + 1);
|
|
276
|
+
return true;
|
|
277
|
+
}
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
export function fitFooterStatusLine(activity, identity, width) {
|
|
281
|
+
const kept = [...identity];
|
|
282
|
+
const render = () => kept.length === 0 ? activity : `${activity} ${kept.join(' · ')}`;
|
|
283
|
+
if (displayWidth(render()) > width)
|
|
284
|
+
dropFooterQuotaPlanName(kept);
|
|
285
|
+
while (kept.length > 0 && displayWidth(render()) > width)
|
|
286
|
+
kept.pop();
|
|
287
|
+
return truncateToWidth(render(), Math.max(1, width));
|
|
288
|
+
}
|
|
289
|
+
/** Lines printed by `/status` — SSH first-boot diagnostics, no extra command. */
|
|
290
|
+
export function formatStatusReport(input) {
|
|
291
|
+
const route = describeProviderRoute(input.provider);
|
|
292
|
+
const effort = input.effort === undefined ? '' : ` (${input.effort})`;
|
|
293
|
+
const fit = describeSubagentFit({
|
|
294
|
+
parentProvider: input.provider,
|
|
295
|
+
parentModel: input.parentModel,
|
|
296
|
+
subProvider: input.subProvider,
|
|
297
|
+
subModel: input.subModel,
|
|
298
|
+
});
|
|
299
|
+
return [
|
|
300
|
+
`session: ${input.sessionId}`,
|
|
301
|
+
`plugin: dsh-ssh-tui ${input.pluginVersion}`,
|
|
302
|
+
`cwd: ${input.cwd ?? ''}`,
|
|
303
|
+
`route: ${input.provider}/${input.model}${effort}`,
|
|
304
|
+
`provider: ${route.kind}`,
|
|
305
|
+
`status: ${input.agentStatus}`,
|
|
306
|
+
`preset: ${input.preset}`,
|
|
307
|
+
`subagents: ${input.activeSubagents}`,
|
|
308
|
+
fit.line,
|
|
309
|
+
`plan: ${input.plan}`,
|
|
310
|
+
formatQuotaStatusLine(input.quota),
|
|
311
|
+
formatContextPressureStatusLine(input.context),
|
|
312
|
+
`paint: ${input.paint}`,
|
|
313
|
+
`disconnect: ${input.disconnect ?? 'pause'}`,
|
|
314
|
+
input.waitingQuestions > 0 ? `questions: waiting ${input.waitingQuestions}` : 'questions: none',
|
|
315
|
+
];
|
|
316
|
+
}
|
|
317
|
+
/** Human-facing kind for a live LLM route. */
|
|
318
|
+
export function describeProviderRoute(provider) {
|
|
319
|
+
const id = provider.trim();
|
|
320
|
+
if (id === 'deepseek-official' || id === 'deepseek') {
|
|
321
|
+
return { kind: t('route.deepseek'), short: t('route.deepseek') };
|
|
322
|
+
}
|
|
323
|
+
if (id === 'xai' || id === 'grok' || id.startsWith('xai-')) {
|
|
324
|
+
return { kind: t('route.supergrokKind'), short: t('route.supergrokShort') };
|
|
325
|
+
}
|
|
326
|
+
if (id === 'opencode-go')
|
|
327
|
+
return { kind: t('route.go'), short: t('route.go') };
|
|
328
|
+
if (id === 'opencode')
|
|
329
|
+
return { kind: t('route.zen'), short: t('route.zen') };
|
|
330
|
+
return { kind: t('route.registered'), short: id };
|
|
331
|
+
}
|
|
332
|
+
/** Routes that authenticate without a harness API-key credential. */
|
|
333
|
+
export function providerUsesLocalOAuth(provider) {
|
|
334
|
+
const id = provider.trim();
|
|
335
|
+
return id === 'xai' || id === 'grok' || id.startsWith('xai-');
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=footer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"footer.js","sourceRoot":"","sources":["../src/footer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAA;AACnC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,qBAAqB,EAAsB,MAAM,YAAY,CAAA;AAGtE,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAA;AACrC,6EAA6E;AAC7E,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAU,EAAE,CACvC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAA;IAChF,IAAI,CAAC,GAAG,KAAK;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;IAC/B,IAAI,CAAC,GAAG,SAAS;QAAE,OAAO,GAAG,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAA;IACjD,OAAO,GAAG,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAA;AACpC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAA;AAC9C,MAAM,CAAC,MAAM,6BAA6B,GAAG,IAAI,CAAA;AACjD,yFAAyF;AACzF,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,CAAA;AAc9C,oFAAoF;AACpF,MAAM,UAAU,oBAAoB,CAAC,KAIpC;IACC,OAAO,KAAK,CAAC,WAAW,GAAG,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAA;AACzF,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,yBAAyB,CAAC,QAG7B;IACX,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC5C,IAAI,OAAO,QAAQ,CAAC,eAAe,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAC9F,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAA;IAC9C,CAAC;IACD,IAAI,OAAO,QAAQ,CAAC,cAAc,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC5F,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAA;IAC7C,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAA;IACjE,MAAM,GAAG,GAAG,KAIX,CAAA;IACD,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,aAAa,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC;QACxF,CAAC,CAAC,GAAG,CAAC,aAAa;QACnB,CAAC,CAAC,SAAS,CAAA;IACb,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,SAAS,CAAA;IACzD,MAAM,IAAI,GAAG,yBAAyB,CAAC;QACrC,GAAG,CAAC,OAAO,GAAG,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,GAAG,CAAC,OAAO,GAAG,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1F,CAAC,CAAA;IACF,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACxC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAA;AACpD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAA6B;IAC/D,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,GAAG,CAAA;IAChE,OAAO;QACL,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,OAAO;QACP,KAAK,EAAE,OAAO,IAAI,6BAA6B,GAAG,GAAG;YACnD,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,OAAO,IAAI,2BAA2B,GAAG,GAAG;gBAC5C,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,IAAI;KACX,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAA;AACrC,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAA;AAE3F,MAAM,UAAU,yBAAyB,CAAC,OAAe;IACvD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC;QAAE,OAAO,kBAAkB,CAAA;IACxE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IAClE,OAAO,qBAAqB,CAAC,MAAM,CAAC,IAAI,GAAG,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAmC;IAC1E,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACnC,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IACjC,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAyB,EAAE,KAAK,GAAG,KAAK;IAChF,MAAM,IAAI,GAAG,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACpD,MAAM,OAAO,GAAG,KAAK;QACnB,CAAC,CAAC,QAAQ,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,SAAS;QAC/D,CAAC,CAAC,IAAI,CAAA;IACR,OAAO,CAAC,CAAC,oBAAoB,EAAE;QAC7B,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;QACnC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;QACxC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;KAClC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,IAAqC;IACnF,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,oBAAoB,CAAC,CAAA;IACtD,OAAO,CAAC,CAAC,oBAAoB,EAAE;QAC7B,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;QACnC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;QACxC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAChC,KAAK,EAAE,CAAC,CAAC,uBAAuB,IAAI,CAAC,KAAK,EAAE,CAAC;KAC9C,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAyB;IAChE,MAAM,IAAI,GAAG;QACX,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;QACnC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;QACxC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;KACjC,CAAA;IACD,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;QAC5B,CAAC,CAAC,CAAC,CAAC,qBAAqB,EAAE,IAAI,CAAC;QAChC,CAAC,CAAC,CAAC,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAqC;IACzE,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IACpC,OAAO,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,IAAI,0BAA0B,CAAA;AAC3E,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,MAAM,OAAO,GAAG,EAAE,GAAG,KAAK,CAAA;IAC1B,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAA;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACjC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,KAAK,GAAG,EAAE,GAAG,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,eAAuB;IAC3D,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAA;AAC/C,CAAC;AACD,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC1B,IAAI,EAAE,KAAK,mBAAmB,IAAI,EAAE,KAAK,UAAU;QAAE,OAAO,CAAC,CAAC,gBAAgB,CAAC,CAAA;IAC/E,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,WAAW,CAAA;IAC9E,IAAI,EAAE,KAAK,aAAa;QAAE,OAAO,aAAa,CAAA;IAC9C,IAAI,EAAE,KAAK,UAAU;QAAE,OAAO,cAAc,CAAA;IAC5C,OAAO,EAAE,CAAA;AACX,CAAC;AAiBD,mFAAmF;AACnF,MAAM,UAAU,iBAAiB,CAAC,KAAuB;IACvD,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IACpG,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,gBAAgB,CAAA;IACtF,IAAI,WAAW,GAAG,CAAC,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAA;IACjH,CAAC;IACD,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACnF,CAAC;SAAM,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAA;IAC7F,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACpD,MAAM,SAAS,GAAa,EAAE,CAAA;IAC9B,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC;QAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;IACjG,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;IACpG,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IAC1D,IAAI,WAAW,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,GAAG,WAAW,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IAC1H,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,MAAyB,EAAE,KAAa;IACvF,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;IACxB,MAAM,MAAM,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA;IACvF,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK;QAAE,IAAI,CAAC,GAAG,EAAE,CAAA;IACpE,OAAO,eAAe,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;AACtD,CAAC;AA+CD,MAAM,UAAU,cAAc,CAAC,KAAwB;IACrD,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAA;IAClF,IAAI,KAAK,CAAC,eAAe;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAA;IAChF,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAA;IACjF,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,CAAA;IAC9G,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,CAAA;IAC9G,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,CAAA;IAC/G,IAAI,KAAK,CAAC,YAAY;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAA;IAChF,IAAI,KAAK,CAAC,WAAW;QAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAA;IACvF,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAA;IACjF,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAA;IACvF,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAA;IACvF,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,oBAAoB,CAAC,EAAE,CAAA;IACzF,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACtD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA;IAC7G,CAAC;IACD,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAA;IACrE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,CAAA;AACjD,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,cAAc,CAAC,gBAAwB,EAAE,KAAK,GAAG,CAAC;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAA;IAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,GAAG,KAAK,CAAC,CAAA;IAClD,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,EAAE,CAAA;AAC7D,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAwB;IAC1D,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAA;IAC1E,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;IACtF,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IACrF,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAA;IACzF,IAAI,KAAK,KAAK,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnC,IAAI,KAAK,CAAC,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;IACzD,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,KAAK,CAAC,WAAW,KAAK,EAAE,EAAE,CAAC;QAChE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;IAC/B,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAA;IACpE,CAAC;IACD,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,KAAK,CAAC,WAAW,KAAK,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;IAC9F,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IAC5H,IAAI,KAAK,CAAC,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAA;SACrD,IAAI,KAAK,CAAC,cAAc;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAChE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IAC7E,OAAO,KAAK,CAAA;AACd,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,IAAa;IAC9D,MAAM,GAAG,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAA;IAC/D,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;AACjF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAe;IACrD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;QACzB,IAAI,IAAI,KAAK,SAAS;YAAE,SAAQ;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;QACzC,IAAI,KAAK,IAAI,CAAC;YAAE,SAAQ;QACxB,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;QACpC,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,QAA2B,EAAE,KAAa;IAC9F,MAAM,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAA;IAC1B,MAAM,MAAM,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA;IAC9F,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK;QAAE,uBAAuB,CAAC,IAAI,CAAC,CAAA;IACjE,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK;QAAE,IAAI,CAAC,GAAG,EAAE,CAAA;IACpE,OAAO,eAAe,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;AACtD,CAAC;AAuBD,iFAAiF;AACjF,MAAM,UAAU,kBAAkB,CAAC,KAAwB;IACzD,MAAM,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IACnD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAA;IACrE,MAAM,GAAG,GAAG,mBAAmB,CAAC;QAC9B,cAAc,EAAE,KAAK,CAAC,QAAQ;QAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAA;IACF,OAAO;QACL,YAAY,KAAK,CAAC,SAAS,EAAE;QAC7B,uBAAuB,KAAK,CAAC,aAAa,EAAE;QAC5C,QAAQ,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE;QACzB,UAAU,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,GAAG,MAAM,EAAE;QAClD,aAAa,KAAK,CAAC,IAAI,EAAE;QACzB,WAAW,KAAK,CAAC,WAAW,EAAE;QAC9B,WAAW,KAAK,CAAC,MAAM,EAAE;QACzB,cAAc,KAAK,CAAC,eAAe,EAAE;QACrC,GAAG,CAAC,IAAI;QACR,SAAS,KAAK,CAAC,IAAI,EAAE;QACrB,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC;QAClC,+BAA+B,CAAC,KAAK,CAAC,OAAO,CAAC;QAC9C,UAAU,KAAK,CAAC,KAAK,EAAE;QACvB,eAAe,KAAK,CAAC,UAAU,IAAI,OAAO,EAAE;QAC5C,KAAK,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,sBAAsB,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,iBAAiB;KAChG,CAAA;AACH,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC1B,IAAI,EAAE,KAAK,mBAAmB,IAAI,EAAE,KAAK,UAAU,EAAE,CAAC;QACpD,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAA;IAClE,CAAC;IACD,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,qBAAqB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAA;IAC7E,CAAC;IACD,IAAI,EAAE,KAAK,aAAa;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,CAAA;IAC9E,IAAI,EAAE,KAAK,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,CAAA;IAC7E,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;AACnD,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC1B,OAAO,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;AAC/D,CAAC"}
|
package/lib/i18n/en.js
CHANGED
|
@@ -36,11 +36,18 @@ export const en = {
|
|
|
36
36
|
'footer.inputFolded': 'input folded',
|
|
37
37
|
'footer.multiLine': 'multiline',
|
|
38
38
|
'footer.queued': 'queued {count}',
|
|
39
|
+
'footer.context': 'ctx {used}/{window} {percent}',
|
|
40
|
+
'footer.contextRing': '{ring} {used}/{window} {percent}%',
|
|
39
41
|
'footer.balance': 'bal {amount}',
|
|
40
42
|
'footer.cwdChip': 'dir:{name}',
|
|
41
43
|
'footer.effortDefault': 'follow provider default',
|
|
42
44
|
'status.quotaNone': 'quota: none',
|
|
43
45
|
'status.quotaLine': 'quota: {plan} {parts}',
|
|
46
|
+
'status.contextNone': 'context: unknown',
|
|
47
|
+
'status.contextLine': 'context: {used}/{window} {percent}% ({level})',
|
|
48
|
+
'status.contextLevel.ok': 'ok',
|
|
49
|
+
'status.contextLevel.warn': 'near limit',
|
|
50
|
+
'status.contextLevel.danger': 'critical',
|
|
44
51
|
'status.questionsWaiting': 'questions: waiting {count}',
|
|
45
52
|
'status.questionsNone': 'questions: none',
|
|
46
53
|
'status.planOff': 'off',
|
|
@@ -62,6 +69,7 @@ export const en = {
|
|
|
62
69
|
'quota.resetIn': 'resets in ~{duration}',
|
|
63
70
|
'quota.resetAt': 'reset at {when}',
|
|
64
71
|
'quota.resetInParen': ' (resets in ~{duration})',
|
|
72
|
+
'quota.resetInFull': 'resets in ~{duration} ({when})',
|
|
65
73
|
'quota.throttled': 'throttled',
|
|
66
74
|
'quota.ok': 'ok',
|
|
67
75
|
'quota.unknown': 'unknown',
|
|
@@ -100,6 +108,7 @@ export const en = {
|
|
|
100
108
|
'toolTitle.mv': 'rename',
|
|
101
109
|
'toolTitle.mkdir': 'mkdir',
|
|
102
110
|
'toolTitle.skills': 'skills',
|
|
111
|
+
'toolTitle.skill': 'skill',
|
|
103
112
|
'toolTitle.create_goal': 'create goal',
|
|
104
113
|
'toolTitle.update_goal': 'update goal',
|
|
105
114
|
'toolTitle.complete_goal': 'complete goal',
|
|
@@ -136,6 +145,8 @@ export const en = {
|
|
|
136
145
|
'prompt.inject': 'prompt inject',
|
|
137
146
|
'prompt.injectWith': 'prompt inject:{sources}',
|
|
138
147
|
'plan.nudge': 'The plan strip still has unfinished todos at turn end. Call todo_write once now: mark finished items completed and leave the rest pending. Do not add new tasks.',
|
|
148
|
+
'plan.nudgeQueued': 'Asked the model to refresh leftover todos (once for this list).',
|
|
149
|
+
'plan.nudgeFailed': 'Could not queue the leftover-todo follow-up: {error}',
|
|
139
150
|
'plan.leftOpen': 'Turn left open: {count} todos remaining (session log unchanged).',
|
|
140
151
|
'plan.pendingNext': 'Mode switch takes effect on the next step.',
|
|
141
152
|
'plan.planningOnly': 'Plan only, no code changes until you confirm.',
|
|
@@ -148,6 +159,28 @@ export const en = {
|
|
|
148
159
|
'plan.todoPending': '{count} pending',
|
|
149
160
|
'plan.list': 'todo list',
|
|
150
161
|
'plan.todoSummary': '{done}/{total} done',
|
|
162
|
+
'plan.todoSummaryActive': '{head} · {active}',
|
|
163
|
+
'plan.todoSummaryExtra': '{head} · {active} +{extra}',
|
|
164
|
+
'boot.banner': 'DeepSeek Harness — SSH TUI',
|
|
165
|
+
'boot.displayFailed': 'Display channel failed to start: {error}',
|
|
166
|
+
'prompt.contextPrefix': '(context) {text}',
|
|
167
|
+
'turn.failed': 'Turn {turn} failed: {error}',
|
|
168
|
+
'agent.disposed': 'Agent was disposed; press Ctrl+C to exit.',
|
|
169
|
+
'cmd.unknown': 'Unknown command: /{command} (try /help)',
|
|
170
|
+
'cmd.failedNamed': '/{command} failed: {error}',
|
|
171
|
+
'cmd.serviceMissing': '{service} service is unavailable',
|
|
172
|
+
'dialog.answer': 'dialog answer: {json}',
|
|
173
|
+
'dialog.error': 'dialog error: {error}',
|
|
174
|
+
'compact.lines': '{count} lines',
|
|
175
|
+
'sub.running': 'running',
|
|
176
|
+
'sub.ok': 'done',
|
|
177
|
+
'sub.aborted': 'interrupted',
|
|
178
|
+
'sub.failed': 'failed',
|
|
179
|
+
'sub.agentLabel': 'subagent {id}',
|
|
180
|
+
'approval.noCommand': '(no command args, tool: {tool})',
|
|
181
|
+
'title.running': 'running',
|
|
182
|
+
'title.planMode': 'plan mode',
|
|
183
|
+
'title.compacting': 'compacting',
|
|
151
184
|
'plan.waitConfirm': 'waiting to confirm the plan',
|
|
152
185
|
'plan.emptyBody': 'plan body is empty',
|
|
153
186
|
'plan.reviewing': 'plan review',
|
|
@@ -164,8 +197,6 @@ export const en = {
|
|
|
164
197
|
'plan.requestOff': 'Requested leaving plan mode.',
|
|
165
198
|
'plan.enterMode': 'enter plan mode',
|
|
166
199
|
'plan.exitMode': 'leave plan mode',
|
|
167
|
-
'plan.nudgeQueued': 'Asked the model to close leftover todos (once this turn).',
|
|
168
|
-
'plan.nudgeFailed': 'Failed to nudge todos: {error}',
|
|
169
200
|
'todo.list': 'todos',
|
|
170
201
|
'todo.empty': 'no tasks yet',
|
|
171
202
|
'todo.doneMark': 'done',
|
|
@@ -195,11 +226,31 @@ export const en = {
|
|
|
195
226
|
'onboard.envStale': 'System already injected {env} (it may be stale). First-run wizard will overwrite your key; restart the TUI after save.',
|
|
196
227
|
'onboard.needSetup': 'First launch: configure a provider and API key (/setup anytime).',
|
|
197
228
|
'onboard.title': 'First-run wizard — pick a provider (same as the official Models page)',
|
|
198
|
-
'approval.statusAuto': 'Auto-approval on: {allowed} allowed · {denied} auto-rejected (the model is told why)',
|
|
229
|
+
'approval.statusAuto': 'Auto-approval on: {allowed} allowed · {denied} auto-rejected · {reviewed} AI reviews (the model is told why)',
|
|
199
230
|
'approval.statusOff': 'Auto-approval off: every approval asks',
|
|
200
|
-
'approval.autoOn': 'Auto-approval ON: low-risk commands approve; dangerous shapes (rm -rf, sudo, curl|sh, git push --force) auto-REJECT with the reason fed back to the model; unrecognized shapes ask while attached and reject when detached.',
|
|
231
|
+
'approval.autoOn': 'Auto-approval ON: low-risk commands and workspace file tools approve; dangerous shapes (rm -rf, sudo, curl|sh, git push --force, sensitive-path reads) auto-REJECT with the reason fed back to the model; unrecognized shapes (npm publish, interpreter -c/-e) go to the subagent-model reviewer (authorization=yes required), then ask while attached and reject when detached.',
|
|
201
232
|
'approval.autoOff': 'Auto-approval OFF: back to per-request prompts.',
|
|
202
233
|
'approval.reviewRow': '⚠ Auto-approval review {verdict} (risk: {risk}, authorization: {authorization}): {reason}',
|
|
234
|
+
'approval.reviewFailed': '⚠ Auto-approval review failed; asking instead: {error}',
|
|
235
|
+
'approval.reviewUnparsed': '⚠ Auto-approval review had no usable verdict; asking instead: {output}',
|
|
236
|
+
'approval.reviewNoReply': 'reviewer produced no final reply',
|
|
237
|
+
'approval.decisionRow': 'Auto-approval {verdict} · {command} · risk {risk} · {reason}',
|
|
238
|
+
'approval.ruleAllow': 'allowlist rule',
|
|
239
|
+
'approval.ruleDeny': 'danger-shaped rule',
|
|
240
|
+
'approval.ruleDetached': 'unrecognized and detached; rejected',
|
|
241
|
+
'approval.reason.allowlist': 'allowlist rule',
|
|
242
|
+
'approval.reason.dangerPattern': 'danger-shaped rule',
|
|
243
|
+
'approval.reason.redirectRoot': 'redirect into a system path',
|
|
244
|
+
'approval.reason.sensitivePath': 'touches a sensitive path',
|
|
245
|
+
'approval.reason.privateUrl': 'private or file URL',
|
|
246
|
+
'approval.reason.networkRead': 'read-only network lookup',
|
|
247
|
+
'approval.reason.networkFetch': 'fetch of a remote page',
|
|
248
|
+
'approval.reason.workspaceFile': 'workspace file read/write',
|
|
249
|
+
'approval.reason.sandboxWiden': 'user-authorized sandbox widening',
|
|
250
|
+
'approval.reason.sandboxDanger': 'escalation to danger-full-access',
|
|
251
|
+
'approval.reason.unrecognized': 'unrecognized by the rule table',
|
|
252
|
+
'approval.reason.empty': 'empty command',
|
|
253
|
+
'approval.modelDenied': 'Auto-approval rejected this tool call; pick another approach, do not retry it unchanged. Command: {command}. Reason: {reason}.',
|
|
203
254
|
'approval.reviewApproved': 'approved',
|
|
204
255
|
'approval.reviewRejected': 'rejected',
|
|
205
256
|
'approval.mismatchNever': 'Note: the host approval policy is never (no approval requests are produced), so auto mode has no effect. Run /permission workspace-write (or restore the approval policy to ask) first.',
|
|
@@ -323,6 +374,18 @@ export const en = {
|
|
|
323
374
|
'compact.finished': 'Context compact finished.',
|
|
324
375
|
'compact.failedNotice': 'Context compact failed: {error}',
|
|
325
376
|
'compact.short': 'compact',
|
|
377
|
+
'compact.busy': 'Cannot compact now: a turn is still running, or compaction is already in progress. Wait until idle, then /compact (the command is not queued).',
|
|
378
|
+
'compact.nothing': 'No compactable history yet.',
|
|
379
|
+
'compact.usage': 'Usage: /compact (no arguments)',
|
|
380
|
+
'compact.cancelled': 'Compaction cancelled.',
|
|
381
|
+
'compact.noSummary': 'Compaction could not produce a useful summary. The conversation is unchanged.',
|
|
382
|
+
'compact.changed': 'The history selected for compaction changed before it could be replaced. The conversation is unchanged.',
|
|
383
|
+
'compact.commit': 'Compaction did not finish cleanly; some session history may have changed.',
|
|
384
|
+
'compact.persistence': 'Compaction finished, but the session could not be saved.',
|
|
385
|
+
'context.alertWarn': '⚠ Context is {used}/{window} ({percent}%). Idle auto-/compact will run; you can also run /compact now.',
|
|
386
|
+
'context.alertDanger': '⚠ Context is {used}/{window} ({percent}%), near the model window. Run /compact now, or start a new session.',
|
|
387
|
+
'context.autoCompact': 'Context near the window; compacting while idle…',
|
|
388
|
+
'context.autoCompactAt': 'Context is {used}/{window} ({percent}%); compacting while idle…',
|
|
326
389
|
'jump.planDock': 'Jumped to {category} (plan strip).',
|
|
327
390
|
'jump.missing': 'No {category} card right now.',
|
|
328
391
|
'jump.latest': 'Jumped to the latest {category}.',
|
|
@@ -360,6 +423,7 @@ export const en = {
|
|
|
360
423
|
'model.nextPage': '» next',
|
|
361
424
|
'model.current': 'current',
|
|
362
425
|
'model.pick': 'Pick a model (provider {provider} · {source}{pages})',
|
|
426
|
+
'model.pickPages': ' · {count}, ↑/↓ to browse',
|
|
363
427
|
'model.configured': 'configured list',
|
|
364
428
|
'model.fetching': 'Fetching {provider} models from the endpoint…',
|
|
365
429
|
'model.live': 'live endpoint list',
|
|
@@ -379,6 +443,7 @@ export const en = {
|
|
|
379
443
|
'mode.remembered': 'This session already has work; cannot switch mid-session. Remembered {name} for next launch.',
|
|
380
444
|
'mode.missingService': 'agentPresets service is unavailable.',
|
|
381
445
|
'mode.none': 'No modes (presets) available.',
|
|
446
|
+
'mode.unknown': 'Unknown mode "{id}". Available: {available}',
|
|
382
447
|
'resume.running': 'A turn is running. Wait or Esc/cancel before switching sessions.',
|
|
383
448
|
'resume.same': 'Already on this session.',
|
|
384
449
|
'resume.noCallback': 'Session switch callback unavailable; cannot /resume.',
|
|
@@ -386,6 +451,7 @@ export const en = {
|
|
|
386
451
|
'resume.noPersistence': 'sessionPersistence service is unavailable.',
|
|
387
452
|
'resume.none': 'No resumable sessions (or /resume <session-id>).',
|
|
388
453
|
'resume.pick': 'Pick a session to resume',
|
|
454
|
+
'resume.pickMany': 'Pick a session to resume ({count}, ↑/↓ to scroll)',
|
|
389
455
|
'resume.unreadable': '⚠ unreadable · ',
|
|
390
456
|
'resume.cancelled': 'Session picker cancelled.',
|
|
391
457
|
'picker.title': 'DeepSeek Harness — pick a session to resume',
|
|
@@ -396,16 +462,24 @@ export const en = {
|
|
|
396
462
|
'picker.attachable': 'attachable · pid {pid}{status} (live host after SSH drop)',
|
|
397
463
|
'picker.attachPaused': ' · paused',
|
|
398
464
|
'picker.attachRunning': ' · running in background',
|
|
465
|
+
'picker.filterHint': 'Type to filter by title / session id / cwd, or press /',
|
|
466
|
+
'picker.filter': 'filter: {query}',
|
|
467
|
+
'picker.count': '{shown}/{total} sessions',
|
|
468
|
+
'picker.noMatch': 'No sessions match "{query}"',
|
|
469
|
+
'picker.moreAbove': '↑ {count} more',
|
|
470
|
+
'picker.moreBelow': '↓ {count} more',
|
|
471
|
+
'picker.hint': '↑/↓ move · Enter resume · 1-9 this page · / filter · 0 new · Esc cancel',
|
|
472
|
+
'picker.hintFilter': '↑/↓ move · Enter resume · type to filter · Backspace delete · Esc leave filter',
|
|
399
473
|
'cmd.help': 'List all slash commands and shortcuts (runs immediately)',
|
|
400
474
|
'cmd.model': 'Switch model and reasoning effort (runs immediately, opens picker)',
|
|
401
475
|
'cmd.effort': 'Reasoning effort: run to pick, or /effort <default|off|low|medium|high|max|xhigh>',
|
|
402
476
|
'cmd.provider': 'Switch LLM provider and model (runs immediately, opens picker)',
|
|
403
477
|
'cmd.submodel': 'Subagent model: run directly to pick, or /submodel <name> (reset to follow parent)',
|
|
404
478
|
'cmd.subeffort': 'Subagent reasoning effort: run to pick, or /subeffort <default|off|low|medium|high|max|xhigh>',
|
|
405
|
-
'cmd.mode': 'Switch agent preset
|
|
479
|
+
'cmd.mode': 'Switch agent preset: run to pick, or /mode <standard|minimal|ptc|cordis>',
|
|
406
480
|
'cmd.quit': 'Exit the TUI and stop the Host (runs immediately; resume from the session log)',
|
|
407
481
|
'cmd.clear': 'Clear visible transcript and search results (runs immediately, keeps session history)',
|
|
408
|
-
'cmd.status': 'Status report: show session ID, route, quota, network RTT, and version (runs immediately)',
|
|
482
|
+
'cmd.status': 'Status report: show session ID, route, context occupancy, quota, network RTT, and version (runs immediately)',
|
|
409
483
|
'cmd.disconnect': 'SSH drop policy: run directly to pick, or /disconnect <pause (busy pause / idle exit) | continue (busy background)>',
|
|
410
484
|
'cmd.approval': 'Auto-approval: run directly to toggle, or /approval <auto (allow low-risk) | off | status>',
|
|
411
485
|
'cmd.view': 'Workspace view: run directly to pick, or /view <detailed | compact>',
|
|
@@ -413,7 +487,7 @@ export const en = {
|
|
|
413
487
|
'cmd.subagents': 'Manage subagents: run directly to list active subagents, or /subagents kill <id> to stop one',
|
|
414
488
|
'cmd.resume': 'Resume session: run directly to open history picker, or /resume <session-id> directly',
|
|
415
489
|
'cmd.setup': 'Setup provider: wizard to configure API Key, Base URL, and default model (runs immediately)',
|
|
416
|
-
'cmd.find': 'Search transcript: /find <query> or /find <thinking|plan|subagent|reply> <query>',
|
|
490
|
+
'cmd.find': 'Search transcript: /find <query> or /find <thinking|plan|subagent|reply|prompt|tool> <query>',
|
|
417
491
|
'cmd.language': 'UI language: run directly to pick, or /language <zh (Chinese) | en (English)>',
|
|
418
492
|
'cmd.dialog-test': 'Verify question dialog (runs immediately; developer debug)',
|
|
419
493
|
'permission.currentInfo': 'Current permission preset: {current} (available: {available})',
|
|
@@ -426,7 +500,7 @@ export const en = {
|
|
|
426
500
|
'cmd.permission': 'Permission preset: run to view current & available, or /permission <workspace-write (default)|danger-full-access|read-only>',
|
|
427
501
|
'cmd.plan': 'Plan mode: run to enter, /plan <task> to start with prompt, /plan off to exit',
|
|
428
502
|
'cmd.goal': 'Goal management: run to view, or /goal <objective> (supports pause/resume/clear/edit)',
|
|
429
|
-
'cmd.compact': 'Compact conversation context:
|
|
503
|
+
'cmd.compact': 'Compact conversation context: idle only; auto-runs near ~72% of the model window; fails while a turn or compaction is running (not queued)',
|
|
430
504
|
'cmd.feedback': 'Submit user feedback: /feedback <message>',
|
|
431
505
|
'cmd.export': 'Export session log: export current session history to file (runs immediately)',
|
|
432
506
|
'cmd.aliasOf': 'same as /{name}',
|
|
@@ -545,6 +619,7 @@ export const en = {
|
|
|
545
619
|
'compact.tools': 'called {count} tools',
|
|
546
620
|
'compact.toolsFailed': 'called {count} tools · {failed} failed',
|
|
547
621
|
'compact.edits': 'edited',
|
|
622
|
+
'compact.editsFile': 'edited {path}',
|
|
548
623
|
'compact.editsFiles': 'edited {files} files',
|
|
549
624
|
'tool.repeatCount': '×{count}',
|
|
550
625
|
'tool.readStats': '{chars} chars · {lines} lines',
|