praxis-agent 0.43.0 → 0.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -47
- package/dist/application/native-session-projection.d.ts +4 -0
- package/dist/application/native-session-projection.js +135 -0
- package/dist/application/session-service.d.ts +0 -1
- package/dist/application/session-service.js +9 -170
- package/dist/application/top-level-agent-manager.d.ts +7 -0
- package/dist/application/top-level-agent-manager.js +21 -3
- package/dist/cli/controls.js +4 -0
- package/dist/cli/interactive.js +112 -156
- package/dist/cli/protocol.d.ts +5 -0
- package/dist/cli/protocol.js +45 -0
- package/dist/cli/provider-auth-command.d.ts +32 -0
- package/dist/cli/provider-auth-command.js +249 -0
- package/dist/cli/tui/ansi-frame-renderer.d.ts +2 -0
- package/dist/cli/tui/ansi-frame-renderer.js +109 -21
- package/dist/cli/tui/ansi-surface.d.ts +6 -22
- package/dist/cli/tui/ansi-surface.js +6 -126
- package/dist/cli/tui/ansi-theme.d.ts +3 -2
- package/dist/cli/tui/ansi-theme.js +22 -1
- package/dist/cli/tui/quiet-choice-rows.d.ts +26 -0
- package/dist/cli/tui/quiet-choice-rows.js +302 -0
- package/dist/cli/tui/quiet-frame-adapter.d.ts +18 -0
- package/dist/cli/tui/quiet-frame-adapter.js +90 -0
- package/dist/cli/tui/quiet-frame.d.ts +43 -0
- package/dist/cli/tui/quiet-frame.js +346 -0
- package/dist/cli/tui/quiet-operational-rows.d.ts +17 -0
- package/dist/cli/tui/quiet-operational-rows.js +413 -0
- package/dist/cli/tui/quiet-screen-projector.d.ts +25 -0
- package/dist/cli/tui/quiet-screen-projector.js +110 -0
- package/dist/cli/tui/quiet-settings-rows.d.ts +17 -0
- package/dist/cli/tui/quiet-settings-rows.js +490 -0
- package/dist/cli/tui/status-line.d.ts +15 -9
- package/dist/cli/tui/status-line.js +15 -6
- package/dist/cli/tui/theme.js +20 -20
- package/dist/cli/tui/transcript-viewport.d.ts +5 -0
- package/dist/cli/tui/transcript-viewport.js +213 -78
- package/dist/cli/tui/tui-row-ir.js +4 -4
- package/dist/cli/workspace-trust-prompt.js +2 -2
- package/dist/cli-runtime.d.ts +34 -1
- package/dist/cli-runtime.js +587 -184
- package/dist/maintenance/doctor.js +100 -22
- package/dist/persistence/in-memory-transcript-store.js +1 -7
- package/dist/persistence/native-transcript-store.d.ts +0 -9
- package/dist/persistence/native-transcript-store.js +4 -38
- package/dist/persistence/provider-credential-vault.d.ts +72 -0
- package/dist/persistence/provider-credential-vault.js +498 -0
- package/dist/providers/codex-oauth.d.ts +104 -0
- package/dist/providers/codex-oauth.js +770 -0
- package/dist/providers/codex-subscription.d.ts +33 -0
- package/dist/providers/codex-subscription.js +849 -0
- package/dist/providers/provider-auth.d.ts +71 -0
- package/dist/providers/provider-auth.js +149 -0
- package/dist/providers/provider-registry.d.ts +52 -0
- package/dist/providers/provider-registry.js +187 -0
- package/dist/providers/provider-settings.d.ts +38 -0
- package/dist/providers/provider-settings.js +334 -0
- package/dist/security/workspace-trust.d.ts +4 -3
- package/dist/security/workspace-trust.js +35 -1
- package/package.json +8 -4
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
import { stripVTControlCharacters } from 'node:util';
|
|
2
|
+
import { terminalGraphemeWidth, terminalGraphemes, terminalTextHead, terminalTextTail, terminalTextWidth, } from './transcript-viewport.js';
|
|
3
|
+
export function resolveQuietFrameDensity(width) {
|
|
4
|
+
if (width >= 100)
|
|
5
|
+
return 'full';
|
|
6
|
+
if (width >= 80)
|
|
7
|
+
return 'standard';
|
|
8
|
+
if (width >= 60)
|
|
9
|
+
return 'compact';
|
|
10
|
+
if (width >= 40)
|
|
11
|
+
return 'narrow';
|
|
12
|
+
return 'minimal';
|
|
13
|
+
}
|
|
14
|
+
function positive(value, fallback) {
|
|
15
|
+
return Number.isFinite(value) && (value ?? 0) > 0
|
|
16
|
+
? Math.floor(value)
|
|
17
|
+
: fallback;
|
|
18
|
+
}
|
|
19
|
+
function cleanLines(value) {
|
|
20
|
+
if (typeof value !== 'string')
|
|
21
|
+
return [];
|
|
22
|
+
return stripVTControlCharacters(value)
|
|
23
|
+
.replace(/\r\n?/gu, '\n')
|
|
24
|
+
.split('\n')
|
|
25
|
+
.map((line) => [...line]
|
|
26
|
+
.filter((character) => {
|
|
27
|
+
const code = character.charCodeAt(0);
|
|
28
|
+
return !(code <= 0x08 ||
|
|
29
|
+
code === 0x0b ||
|
|
30
|
+
code === 0x0c ||
|
|
31
|
+
(code >= 0x0e && code <= 0x1f) ||
|
|
32
|
+
code === 0x7f ||
|
|
33
|
+
(code >= 0x80 && code <= 0x9f));
|
|
34
|
+
})
|
|
35
|
+
.join(''));
|
|
36
|
+
}
|
|
37
|
+
function cleanActiveTail(value, limit) {
|
|
38
|
+
if (typeof value !== 'string')
|
|
39
|
+
return { lines: [], hidden: false };
|
|
40
|
+
const max = Math.max(1, limit);
|
|
41
|
+
const preserveTrailingEmpty = limit === Number.POSITIVE_INFINITY;
|
|
42
|
+
const end = value.endsWith('\n') && !preserveTrailingEmpty
|
|
43
|
+
? value.length - 1
|
|
44
|
+
: value.length;
|
|
45
|
+
const starts = [end];
|
|
46
|
+
for (let index = end - 1; index >= 0 && starts.length <= max; index -= 1) {
|
|
47
|
+
if (value.charCodeAt(index) === 0x0a)
|
|
48
|
+
starts.push(index);
|
|
49
|
+
}
|
|
50
|
+
const hidden = starts.length > max;
|
|
51
|
+
const start = hidden ? (starts[max] ?? 0) + 1 : 0;
|
|
52
|
+
const tail = value.slice(start, end);
|
|
53
|
+
const rawLines = tail.split('\n');
|
|
54
|
+
const lines = cleanLines(tail);
|
|
55
|
+
let lineStart = start;
|
|
56
|
+
const positioned = lines.map((text, index) => {
|
|
57
|
+
const result = { text, start: lineStart };
|
|
58
|
+
lineStart += (rawLines[index]?.length ?? 0) + 1;
|
|
59
|
+
return result;
|
|
60
|
+
});
|
|
61
|
+
return { lines: positioned.slice(-max), hidden };
|
|
62
|
+
}
|
|
63
|
+
function clean(value) {
|
|
64
|
+
return cleanLines(value).join(' ');
|
|
65
|
+
}
|
|
66
|
+
function clipRowSegments(segments, columns) {
|
|
67
|
+
const limit = Math.max(0, columns);
|
|
68
|
+
const total = segments.reduce((sum, segment) => sum + terminalTextWidth(segment.text), 0);
|
|
69
|
+
if (total <= limit)
|
|
70
|
+
return segments;
|
|
71
|
+
const budget = Math.max(0, limit - 1);
|
|
72
|
+
let used = 0;
|
|
73
|
+
const output = [];
|
|
74
|
+
let stopped = false;
|
|
75
|
+
for (const segment of segments) {
|
|
76
|
+
const kept = [];
|
|
77
|
+
for (const cluster of terminalGraphemes(segment.text)) {
|
|
78
|
+
const width = terminalGraphemeWidth(cluster);
|
|
79
|
+
if (used + width > budget) {
|
|
80
|
+
stopped = true;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
kept.push(cluster);
|
|
84
|
+
used += width;
|
|
85
|
+
}
|
|
86
|
+
if (kept.length)
|
|
87
|
+
output.push({ ...segment, text: kept.join('') });
|
|
88
|
+
if (stopped || used >= budget)
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
const role = output.at(-1)?.role ?? segments[0]?.role ?? 'body';
|
|
92
|
+
if (limit > 0)
|
|
93
|
+
output.push({ text: '…', role });
|
|
94
|
+
return output;
|
|
95
|
+
}
|
|
96
|
+
function windowComposer(text, cursor, prefix, columns) {
|
|
97
|
+
const clusters = terminalGraphemes(text);
|
|
98
|
+
const codePoints = Array.from(text);
|
|
99
|
+
const sourceCursor = Number.isFinite(cursor)
|
|
100
|
+
? Math.min(Math.max(0, Math.floor(cursor)), codePoints.length)
|
|
101
|
+
: 0;
|
|
102
|
+
let codePointOffset = 0;
|
|
103
|
+
let insertion = clusters.length;
|
|
104
|
+
for (const [index, cluster] of clusters.entries()) {
|
|
105
|
+
const nextOffset = codePointOffset + Array.from(cluster).length;
|
|
106
|
+
if (sourceCursor <= codePointOffset) {
|
|
107
|
+
insertion = index;
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
if (sourceCursor < nextOffset) {
|
|
111
|
+
insertion = index + 1;
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
codePointOffset = nextOffset;
|
|
115
|
+
}
|
|
116
|
+
const before = clusters.slice(0, insertion);
|
|
117
|
+
const after = clusters.slice(insertion);
|
|
118
|
+
const prefixWidth = terminalTextWidth(prefix);
|
|
119
|
+
if (columns <= prefixWidth) {
|
|
120
|
+
const marker = columns > 0 ? '…' : '';
|
|
121
|
+
const shown = terminalTextHead(prefix, Math.max(0, columns - 1));
|
|
122
|
+
return { text: `${shown}${marker}`, cursor: Math.max(0, columns - 1) };
|
|
123
|
+
}
|
|
124
|
+
const available = Math.max(0, columns - prefixWidth);
|
|
125
|
+
const endCursor = after.length === 0;
|
|
126
|
+
const fullWidth = terminalTextWidth(text) + (endCursor ? 1 : 0);
|
|
127
|
+
if (fullWidth <= available)
|
|
128
|
+
return {
|
|
129
|
+
text: `${prefix}${text}`,
|
|
130
|
+
cursor: prefixWidth + terminalTextWidth(before.join('')),
|
|
131
|
+
};
|
|
132
|
+
const leading = before.length > 0;
|
|
133
|
+
const trailing = after.length > 0;
|
|
134
|
+
const markerCells = (leading ? 1 : 0) + (trailing ? 1 : 0);
|
|
135
|
+
let budget = Math.max(0, available - markerCells - (endCursor ? 1 : 0));
|
|
136
|
+
const afterFirst = after[0] ?? '';
|
|
137
|
+
const afterFirstWidth = terminalGraphemeWidth(afterFirst);
|
|
138
|
+
let visibleAfter = after.length && afterFirstWidth <= budget ? afterFirst : '';
|
|
139
|
+
if (visibleAfter)
|
|
140
|
+
budget -= afterFirstWidth;
|
|
141
|
+
const visibleBefore = terminalTextTail(before.join(''), budget);
|
|
142
|
+
budget -= terminalTextWidth(visibleBefore);
|
|
143
|
+
if (!visibleAfter && after.length) {
|
|
144
|
+
visibleAfter = terminalTextHead(after.join(''), budget);
|
|
145
|
+
budget -= terminalTextWidth(visibleAfter);
|
|
146
|
+
}
|
|
147
|
+
else if (after.length > 1 && budget > 0) {
|
|
148
|
+
const remainder = terminalTextHead(after.slice(1).join(''), budget);
|
|
149
|
+
visibleAfter += remainder;
|
|
150
|
+
}
|
|
151
|
+
const lead = visibleBefore !== before.join('') ? '…' : '';
|
|
152
|
+
const tail = visibleAfter !== after.join('') ? '…' : '';
|
|
153
|
+
const value = `${prefix}${lead}${visibleBefore}${visibleAfter}${tail}${endCursor ? ' ' : ''}`;
|
|
154
|
+
return {
|
|
155
|
+
text: value,
|
|
156
|
+
cursor: prefixWidth + terminalTextWidth(lead + visibleBefore),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
export function createQuietFrameRow(key, text, region, role = 'body', accessibleText) {
|
|
160
|
+
const value = clean(text) || ' ';
|
|
161
|
+
const segment = { text: value, role };
|
|
162
|
+
return {
|
|
163
|
+
key,
|
|
164
|
+
segments: [segment],
|
|
165
|
+
height: 1,
|
|
166
|
+
source: key,
|
|
167
|
+
region,
|
|
168
|
+
...(accessibleText === undefined
|
|
169
|
+
? {}
|
|
170
|
+
: { accessibleText: clean(accessibleText) }),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function withRegion(source, region) {
|
|
174
|
+
const segments = source.segments.map((segment) => ({
|
|
175
|
+
...segment,
|
|
176
|
+
text: clean(segment.text) || ' ',
|
|
177
|
+
}));
|
|
178
|
+
return {
|
|
179
|
+
...source,
|
|
180
|
+
segments,
|
|
181
|
+
region,
|
|
182
|
+
...(source.source === undefined ? {} : { source: source.source }),
|
|
183
|
+
...(source.accessibleText === undefined
|
|
184
|
+
? {}
|
|
185
|
+
: { accessibleText: clean(source.accessibleText) }),
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
function selectQuietFocusRows(rows, budget) {
|
|
189
|
+
const limit = Number.isFinite(budget)
|
|
190
|
+
? Math.max(0, Math.floor(budget))
|
|
191
|
+
: budget === Number.POSITIVE_INFINITY
|
|
192
|
+
? rows.length
|
|
193
|
+
: 0;
|
|
194
|
+
if (limit === 0 || rows.length === 0)
|
|
195
|
+
return [];
|
|
196
|
+
if (rows.length <= limit)
|
|
197
|
+
return rows;
|
|
198
|
+
const selected = rows.findIndex((row) => row.segments.some((segment) => segment.role === 'selection'));
|
|
199
|
+
if (limit === 1)
|
|
200
|
+
return [rows[selected >= 0 ? selected : 0]];
|
|
201
|
+
const anchorIndexes = new Set([0, rows.length - 1]);
|
|
202
|
+
if (selected >= 0)
|
|
203
|
+
anchorIndexes.add(selected);
|
|
204
|
+
const chosen = new Set();
|
|
205
|
+
if (anchorIndexes.size <= limit) {
|
|
206
|
+
for (const index of anchorIndexes)
|
|
207
|
+
chosen.add(index);
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
chosen.add(0);
|
|
211
|
+
if (selected >= 0)
|
|
212
|
+
chosen.add(selected);
|
|
213
|
+
if (chosen.size < limit)
|
|
214
|
+
chosen.add(rows.length - 1);
|
|
215
|
+
}
|
|
216
|
+
const center = selected >= 0 ? selected : 0;
|
|
217
|
+
const candidates = rows
|
|
218
|
+
.map((_, index) => index)
|
|
219
|
+
.filter((index) => !chosen.has(index))
|
|
220
|
+
.sort((left, right) => {
|
|
221
|
+
const distance = Math.abs(left - center) - Math.abs(right - center);
|
|
222
|
+
return distance || left - right;
|
|
223
|
+
});
|
|
224
|
+
for (const index of candidates) {
|
|
225
|
+
if (chosen.size >= limit)
|
|
226
|
+
break;
|
|
227
|
+
chosen.add(index);
|
|
228
|
+
}
|
|
229
|
+
return rows.filter((_, index) => chosen.has(index));
|
|
230
|
+
}
|
|
231
|
+
function projectIdentity(input, density) {
|
|
232
|
+
const body = input.screen.body;
|
|
233
|
+
if (body.kind === 'session-picker')
|
|
234
|
+
return [
|
|
235
|
+
createQuietFrameRow('quiet:identity', 'Praxis · Sessions', 'identity', 'heading'),
|
|
236
|
+
];
|
|
237
|
+
if (body.intro !== 'identity' && body.intro !== 'welcome')
|
|
238
|
+
return [];
|
|
239
|
+
const bits = ['Praxis'];
|
|
240
|
+
if (body.sessionLabel)
|
|
241
|
+
bits.push(`session ${clean(body.sessionLabel)}`);
|
|
242
|
+
if (density === 'full' || density === 'standard') {
|
|
243
|
+
if (input.display?.version)
|
|
244
|
+
bits.push(`v${clean(input.display.version)}`);
|
|
245
|
+
if (input.display?.model)
|
|
246
|
+
bits.push(`model ${clean(input.display.model)}`);
|
|
247
|
+
if (input.display?.cwd)
|
|
248
|
+
bits.push(`cwd ${clean(input.display.cwd).slice(0, 80)}`);
|
|
249
|
+
}
|
|
250
|
+
return [
|
|
251
|
+
createQuietFrameRow('quiet:identity', bits.join(' · '), 'identity', 'heading', 'Praxis session identity'),
|
|
252
|
+
];
|
|
253
|
+
}
|
|
254
|
+
export function projectQuietFrame(input) {
|
|
255
|
+
const columns = positive(input.width, 1);
|
|
256
|
+
const viewportRows = input.rows === undefined ? undefined : positive(input.rows, 1);
|
|
257
|
+
const screenReader = input.screen.presentation.screenReader;
|
|
258
|
+
const density = resolveQuietFrameDensity(columns);
|
|
259
|
+
const minimalVisualDensity = !screenReader && density === 'minimal';
|
|
260
|
+
const lines = [];
|
|
261
|
+
if (!minimalVisualDensity)
|
|
262
|
+
lines.push(...projectIdentity(input, density));
|
|
263
|
+
const body = input.screen.body;
|
|
264
|
+
if (body.kind === 'conversation') {
|
|
265
|
+
lines.push(...body.transcript.rows
|
|
266
|
+
.filter((item) => !minimalVisualDensity ||
|
|
267
|
+
item.segments.some((segment) => segment.role === 'error'))
|
|
268
|
+
.map((item) => withRegion(item, 'transcript')));
|
|
269
|
+
if (body.transcript.active.visible && !minimalVisualDensity) {
|
|
270
|
+
const activeTail = screenReader
|
|
271
|
+
? cleanActiveTail(body.transcript.active.text, Number.POSITIVE_INFINITY)
|
|
272
|
+
: cleanActiveTail(body.transcript.active.text, viewportRows === undefined ? 200 : Math.max(1, viewportRows - 2));
|
|
273
|
+
const activeText = activeTail.lines;
|
|
274
|
+
if (activeText.some(({ text }) => Boolean(text)))
|
|
275
|
+
activeText.forEach(({ text: part, start }, index) => lines.push(createQuietFrameRow(`quiet:active:text:${start}`, `${index === 0 ? 'praxis> ' : ' '}${index === 0 && activeTail.hidden ? '… ' : ''}${part}`, 'active', 'body', `${index === 0 ? 'Praxis: ' : ''}${part}`)));
|
|
276
|
+
const thinking = screenReader
|
|
277
|
+
? cleanActiveTail(body.transcript.active.thinking, Number.POSITIVE_INFINITY)
|
|
278
|
+
: cleanActiveTail(body.transcript.active.thinking, viewportRows === undefined ? 200 : Math.max(1, viewportRows - 2));
|
|
279
|
+
if (thinking.lines.some(({ text }) => Boolean(text)))
|
|
280
|
+
thinking.lines.forEach(({ text: part, start }, index) => lines.push(createQuietFrameRow(`quiet:active:thinking:${start}`, `${index === 0 ? '… ' : ' '}${part}`, 'active', 'muted', `${index === 0 ? 'Thinking: ' : ''}${part}`)));
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
const focus = input.focusRows.length > 0
|
|
284
|
+
? input.focusRows.map((item) => withRegion(item, 'focus'))
|
|
285
|
+
: [
|
|
286
|
+
createQuietFrameRow('quiet:composer', `${input.shellMode ? 'shell>' : 'you>'} ${clean(input.composerText)}`, 'composer', 'input', `${input.shellMode ? 'Shell' : 'Composer'} input field`),
|
|
287
|
+
];
|
|
288
|
+
lines.push(...focus);
|
|
289
|
+
const statusText = `${input.busy ? 'Working · ' : ''}${clean(input.status) || (input.busy ? 'In progress' : 'Ready')}`;
|
|
290
|
+
lines.push(createQuietFrameRow('quiet:status', statusText, 'status', input.busy ? 'warning' : 'muted', statusText));
|
|
291
|
+
if (!screenReader &&
|
|
292
|
+
viewportRows !== undefined &&
|
|
293
|
+
lines.length > viewportRows) {
|
|
294
|
+
const status = lines.at(-1);
|
|
295
|
+
const focusStart = lines.findIndex((item) => item.region === 'focus' || item.region === 'composer');
|
|
296
|
+
const focusRows = focusStart >= 0
|
|
297
|
+
? selectQuietFocusRows(lines.slice(focusStart, -1), viewportRows - 1).map((row) => row)
|
|
298
|
+
: [];
|
|
299
|
+
const budget = Math.max(0, viewportRows - focusRows.length - 1);
|
|
300
|
+
const beforeFocus = focusStart >= 0 ? lines.slice(0, focusStart) : lines.slice(0, -1);
|
|
301
|
+
const retained = beforeFocus.slice(-budget);
|
|
302
|
+
const compact = [...retained, ...focusRows, status];
|
|
303
|
+
lines.splice(0, lines.length, ...compact);
|
|
304
|
+
}
|
|
305
|
+
const composerPrefix = `${input.shellMode ? 'shell>' : 'you>'} `;
|
|
306
|
+
if (!screenReader) {
|
|
307
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
308
|
+
const row = lines[index];
|
|
309
|
+
if (!row)
|
|
310
|
+
continue;
|
|
311
|
+
if (row.key === 'quiet:composer' && input.focusRows.length === 0) {
|
|
312
|
+
const projection = windowComposer(clean(input.composerText), Number.isFinite(input.composerCursor) ? input.composerCursor : 0, composerPrefix, columns);
|
|
313
|
+
lines[index] = {
|
|
314
|
+
...row,
|
|
315
|
+
segments: [
|
|
316
|
+
{ text: projection.text, role: row.segments[0]?.role ?? 'input' },
|
|
317
|
+
],
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
lines[index] = {
|
|
322
|
+
...row,
|
|
323
|
+
segments: clipRowSegments(row.segments, columns),
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
const composer = lines.find((item) => item.key === 'quiet:composer');
|
|
329
|
+
const cursorColumn = composer
|
|
330
|
+
? windowComposer(clean(input.composerText), Number.isFinite(input.composerCursor) ? input.composerCursor : 0, composerPrefix, columns).cursor
|
|
331
|
+
: 0;
|
|
332
|
+
const cursor = composer
|
|
333
|
+
? {
|
|
334
|
+
rowKey: composer.key,
|
|
335
|
+
column: Math.min(Math.max(0, cursorColumn), columns - 1),
|
|
336
|
+
}
|
|
337
|
+
: undefined;
|
|
338
|
+
return {
|
|
339
|
+
columns,
|
|
340
|
+
rows: (screenReader ? lines.length : (viewportRows ?? lines.length)) || 1,
|
|
341
|
+
density,
|
|
342
|
+
lines,
|
|
343
|
+
...(cursor ? { cursor } : {}),
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=quiet-frame.js.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type QuietFrameDensity, type QuietFrameRow } from './quiet-frame.js';
|
|
2
|
+
import type { TuiHelpSurfaceModel } from './help-surface-model.js';
|
|
3
|
+
import type { TuiDiffSurfaceModel } from './diff-surface-model.js';
|
|
4
|
+
import type { TuiMcpSurfaceModel } from './mcp-surface-model.js';
|
|
5
|
+
import type { TuiTaskSurfaceModel } from './task-surface-model.js';
|
|
6
|
+
import type { TuiListSurfaceModel } from './list-surface-model.js';
|
|
7
|
+
import type { TuiBtwSurfaceModel } from './btw-surface-model.js';
|
|
8
|
+
import type { TuiRewindSurfaceModel } from './rewind-surface-model.js';
|
|
9
|
+
export type QuietOperationalSurface = TuiHelpSurfaceModel | TuiDiffSurfaceModel | TuiMcpSurfaceModel | TuiTaskSurfaceModel | TuiListSurfaceModel | TuiBtwSurfaceModel | TuiRewindSurfaceModel;
|
|
10
|
+
export interface QuietOperationalProjectionOptions {
|
|
11
|
+
readonly density: QuietFrameDensity;
|
|
12
|
+
readonly screenReader?: boolean;
|
|
13
|
+
readonly maxItems?: number;
|
|
14
|
+
readonly nowMs?: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function projectQuietOperationalRows(surface: QuietOperationalSurface, options: QuietOperationalProjectionOptions): readonly QuietFrameRow[];
|
|
17
|
+
//# sourceMappingURL=quiet-operational-rows.d.ts.map
|