@agentworkforce/cli 2.0.1 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -113,6 +113,64 @@ test('startLaunchMetadataRecording writes a pending stamp and runs periodic plus
113
113
  assert.ok(ingests.length >= 2, 'expected at least one periodic ingest plus final ingest');
114
114
  assert.deepEqual(ingests.at(-1), { harness: 'codex' });
115
115
  });
116
+ test('startLaunchMetadataRecording stays quiet on transient ingest failures and warns on a sustained run', async () => {
117
+ const warnings = [];
118
+ const captureWarn = (msg) => {
119
+ warnings.push(msg);
120
+ };
121
+ // One failing ingest per run (only the final ingest on stop) — below the threshold, no warning.
122
+ const run = await startLaunchMetadataRecording({
123
+ selection: fakeSelection(),
124
+ personaSpec: fakeSpec(),
125
+ personaSource: 'cwd',
126
+ cwd: '/tmp/project',
127
+ intervalMs: 1_000_000,
128
+ onWarn: captureWarn,
129
+ sdk: {
130
+ writePendingStamp: () => { },
131
+ ingest: async () => {
132
+ throw new Error('ingest timed out after 5000ms');
133
+ }
134
+ }
135
+ });
136
+ await run.stop();
137
+ assert.deepEqual(warnings, [], 'a single failure is below the warn threshold');
138
+ // Sustained failures: drive enough ticks for the counter to cross the threshold.
139
+ const run2 = await startLaunchMetadataRecording({
140
+ selection: fakeSelection(),
141
+ personaSpec: fakeSpec(),
142
+ personaSource: 'cwd',
143
+ cwd: '/tmp/project',
144
+ intervalMs: 1,
145
+ onWarn: captureWarn,
146
+ sdk: {
147
+ writePendingStamp: () => { },
148
+ ingest: async () => {
149
+ throw new Error('ingest timed out after 5000ms');
150
+ }
151
+ }
152
+ });
153
+ await new Promise((r) => setTimeout(r, 50));
154
+ await run2.stop();
155
+ assert.equal(warnings.length, 1, 'sustained failures surface exactly one warning');
156
+ assert.match(warnings[0], /launch metadata ingest failed: ingest timed out after 5000ms/);
157
+ // Successful ingests stay quiet.
158
+ warnings.length = 0;
159
+ const run3 = await startLaunchMetadataRecording({
160
+ selection: fakeSelection(),
161
+ personaSpec: fakeSpec(),
162
+ personaSource: 'cwd',
163
+ cwd: '/tmp/project',
164
+ intervalMs: 1_000_000,
165
+ onWarn: captureWarn,
166
+ sdk: {
167
+ writePendingStamp: () => { },
168
+ ingest: async () => { }
169
+ }
170
+ });
171
+ await run3.stop();
172
+ assert.deepEqual(warnings, []);
173
+ });
116
174
  test('startLaunchMetadataRecording skips SDK loading and ingest when opted out', async () => {
117
175
  let loads = 0;
118
176
  const run = await startLaunchMetadataRecording({
@@ -1 +1 @@
1
- {"version":3,"file":"launch-metadata.test.js","sourceRoot":"","sources":["../src/launch-metadata.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"launch-metadata.test.js","sourceRoot":"","sources":["../src/launch-metadata.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Persona projection shown in the interactive picker. Description and source
3
+ * label come straight from the resolved spec / cascade so the user sees what
4
+ * they'd see in `agentworkforce list`.
5
+ */
6
+ export interface TuiCandidate {
7
+ id: string;
8
+ description: string;
9
+ source: string;
10
+ }
11
+ export declare function defaultRecentsPath(workforceHomeDir?: string): string;
12
+ /**
13
+ * Parse the on-disk recents file. Returns an empty list on any shape problem —
14
+ * the recents store is best-effort UX and must never block the CLI from
15
+ * launching an agent.
16
+ */
17
+ export declare function parseRecents(text: string): string[];
18
+ export declare function loadRecents(path?: string): string[];
19
+ /**
20
+ * Move `id` to the front of the recents list, dedup, cap. Pure so tests don't
21
+ * need a temp dir.
22
+ */
23
+ export declare function nextRecents(prev: readonly string[], id: string, cap?: number): string[];
24
+ /**
25
+ * Persist a persona id at the top of the recents list. Swallows IO errors —
26
+ * a corrupt or unwritable recents file should never block a launch.
27
+ */
28
+ export declare function recordRecent(id: string, path?: string): void;
29
+ /**
30
+ * Subsequence fuzzy match. Returns null when not all query chars appear in
31
+ * order; otherwise returns a numeric score where smaller is a better match.
32
+ * Score combines leading offset and gap size so prefix / dense matches sort
33
+ * above scattered ones.
34
+ */
35
+ export declare function fuzzyScore(query: string, target: string): number | null;
36
+ /**
37
+ * Rank candidates by best fuzzy match across name OR description. Name matches
38
+ * outrank description matches at equal score to keep the picker feeling
39
+ * direct — typing "rev" should surface "code-reviewer" not whichever persona
40
+ * happens to mention "reviews" in prose.
41
+ */
42
+ export declare function rankCandidates(candidates: readonly TuiCandidate[], query: string): TuiCandidate[];
43
+ /**
44
+ * Project recent ids onto the candidate list, preserving recency order and
45
+ * dropping ids that no longer resolve (uninstalled pack, renamed local
46
+ * persona, etc.).
47
+ */
48
+ export declare function recentCandidates(candidates: readonly TuiCandidate[], recentIds: readonly string[], cap?: number): TuiCandidate[];
49
+ export interface RunPersonaTuiOptions {
50
+ candidates: readonly TuiCandidate[];
51
+ recentIds: readonly string[];
52
+ stdin?: NodeJS.ReadStream;
53
+ stderr?: NodeJS.WriteStream;
54
+ /** Cap on visible rows. Tests inject a small number; default 20. */
55
+ visibleCap?: number;
56
+ /** Escape-sequence debounce in ms. Tests inject 0; default 50. */
57
+ escapeTimeoutMs?: number;
58
+ }
59
+ export type TuiViewMode = 'recents' | 'all' | 'matches';
60
+ export interface TuiView {
61
+ mode: TuiViewMode;
62
+ items: TuiCandidate[];
63
+ }
64
+ /**
65
+ * Decide what the picker should show given the candidate set, recents list,
66
+ * and current query. Exported (and pure) so the recents-header logic can be
67
+ * unit-tested without spinning up a TTY.
68
+ *
69
+ * - `recents` — empty query AND at least one recent id still resolves to a
70
+ * known candidate.
71
+ * - `all` — empty query AND no recent ids resolve (fresh install, or all
72
+ * previously-used personas have been uninstalled/renamed).
73
+ * - `matches` — non-empty query; items are the ranked fuzzy hits.
74
+ */
75
+ export declare function computeTuiView(candidates: readonly TuiCandidate[], recentIds: readonly string[], query: string, visibleCap?: number): TuiView;
76
+ /**
77
+ * Interactive persona picker. Renders inside the alternate screen buffer so
78
+ * scrollback survives, raw-mode reads single keystrokes for arrow/enter/esc
79
+ * handling, and resolves with the chosen persona id (or undefined on quit).
80
+ *
81
+ * Falls back to undefined immediately when stdin or stderr isn't a TTY — the
82
+ * caller should print the regular help text in that case.
83
+ */
84
+ export declare function runPersonaPickerTui(opts: RunPersonaTuiOptions): Promise<string | undefined>;
85
+ //# sourceMappingURL=persona-tui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona-tui.d.ts","sourceRoot":"","sources":["../src/persona-tui.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,wBAAgB,kBAAkB,CAAC,gBAAgB,SAA4B,GAAG,MAAM,CAEvF;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAqBnD;AAED,wBAAgB,WAAW,CAAC,IAAI,SAAuB,GAAG,MAAM,EAAE,CAOjE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,EAAE,MAAM,EACV,GAAG,SAAc,GAChB,MAAM,EAAE,CAGV;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,SAAuB,GAAG,IAAI,CAU1E;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBvE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,SAAS,YAAY,EAAE,EACnC,KAAK,EAAE,MAAM,GACZ,YAAY,EAAE,CAoBhB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,SAAS,YAAY,EAAE,EACnC,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,GAAG,SAAyB,GAC3B,YAAY,EAAE,CAUhB;AAsBD,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,SAAS,YAAY,EAAE,CAAC;IACpC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IAC5B,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAYD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,CAAC;AAExD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,SAAS,YAAY,EAAE,EACnC,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,KAAK,EAAE,MAAM,EACb,UAAU,GAAE,MAA4B,GACvC,OAAO,CAUT;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA4K7B"}
@@ -0,0 +1,390 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { defaultWorkforceHomeDir } from './local-personas.js';
4
+ const RECENTS_FILENAME = 'recents.json';
5
+ const RECENTS_CAP = 20;
6
+ const RECENT_DEFAULT_VISIBLE = 3;
7
+ export function defaultRecentsPath(workforceHomeDir = defaultWorkforceHomeDir()) {
8
+ return join(workforceHomeDir, RECENTS_FILENAME);
9
+ }
10
+ /**
11
+ * Parse the on-disk recents file. Returns an empty list on any shape problem —
12
+ * the recents store is best-effort UX and must never block the CLI from
13
+ * launching an agent.
14
+ */
15
+ export function parseRecents(text) {
16
+ let parsed;
17
+ try {
18
+ parsed = JSON.parse(text);
19
+ }
20
+ catch {
21
+ return [];
22
+ }
23
+ if (typeof parsed !== 'object' || parsed === null)
24
+ return [];
25
+ const ids = parsed.ids;
26
+ if (!Array.isArray(ids))
27
+ return [];
28
+ const out = [];
29
+ const seen = new Set();
30
+ for (const id of ids) {
31
+ if (typeof id !== 'string')
32
+ continue;
33
+ const trimmed = id.trim();
34
+ if (!trimmed || seen.has(trimmed))
35
+ continue;
36
+ seen.add(trimmed);
37
+ out.push(trimmed);
38
+ if (out.length >= RECENTS_CAP)
39
+ break;
40
+ }
41
+ return out;
42
+ }
43
+ export function loadRecents(path = defaultRecentsPath()) {
44
+ if (!existsSync(path))
45
+ return [];
46
+ try {
47
+ return parseRecents(readFileSync(path, 'utf8'));
48
+ }
49
+ catch {
50
+ return [];
51
+ }
52
+ }
53
+ /**
54
+ * Move `id` to the front of the recents list, dedup, cap. Pure so tests don't
55
+ * need a temp dir.
56
+ */
57
+ export function nextRecents(prev, id, cap = RECENTS_CAP) {
58
+ const filtered = prev.filter((x) => x !== id);
59
+ return [id, ...filtered].slice(0, cap);
60
+ }
61
+ /**
62
+ * Persist a persona id at the top of the recents list. Swallows IO errors —
63
+ * a corrupt or unwritable recents file should never block a launch.
64
+ */
65
+ export function recordRecent(id, path = defaultRecentsPath()) {
66
+ if (!id)
67
+ return;
68
+ try {
69
+ const prev = loadRecents(path);
70
+ const next = nextRecents(prev, id);
71
+ mkdirSync(dirname(path), { recursive: true });
72
+ writeFileSync(path, `${JSON.stringify({ version: 1, ids: next }, null, 2)}\n`, 'utf8');
73
+ }
74
+ catch {
75
+ /* best-effort */
76
+ }
77
+ }
78
+ /**
79
+ * Subsequence fuzzy match. Returns null when not all query chars appear in
80
+ * order; otherwise returns a numeric score where smaller is a better match.
81
+ * Score combines leading offset and gap size so prefix / dense matches sort
82
+ * above scattered ones.
83
+ */
84
+ export function fuzzyScore(query, target) {
85
+ if (!query)
86
+ return 0;
87
+ const q = query.toLowerCase();
88
+ const t = target.toLowerCase();
89
+ let qi = 0;
90
+ let firstIdx = -1;
91
+ let lastIdx = -1;
92
+ let totalGap = 0;
93
+ for (let ti = 0; ti < t.length && qi < q.length; ti++) {
94
+ if (t[ti] === q[qi]) {
95
+ if (firstIdx === -1)
96
+ firstIdx = ti;
97
+ if (lastIdx !== -1)
98
+ totalGap += ti - lastIdx - 1;
99
+ lastIdx = ti;
100
+ qi += 1;
101
+ }
102
+ }
103
+ if (qi < q.length)
104
+ return null;
105
+ return firstIdx + totalGap * 2 + Math.floor(t.length / 32);
106
+ }
107
+ /**
108
+ * Rank candidates by best fuzzy match across name OR description. Name matches
109
+ * outrank description matches at equal score to keep the picker feeling
110
+ * direct — typing "rev" should surface "code-reviewer" not whichever persona
111
+ * happens to mention "reviews" in prose.
112
+ */
113
+ export function rankCandidates(candidates, query) {
114
+ const trimmed = query.trim();
115
+ if (!trimmed)
116
+ return [...candidates];
117
+ const DESCRIPTION_PENALTY = 5;
118
+ const scored = [];
119
+ for (const c of candidates) {
120
+ const nameScore = fuzzyScore(trimmed, c.id);
121
+ const descScore = fuzzyScore(trimmed, c.description);
122
+ let score = null;
123
+ if (nameScore !== null && descScore !== null) {
124
+ score = Math.min(nameScore, descScore + DESCRIPTION_PENALTY);
125
+ }
126
+ else if (nameScore !== null) {
127
+ score = nameScore;
128
+ }
129
+ else if (descScore !== null) {
130
+ score = descScore + DESCRIPTION_PENALTY;
131
+ }
132
+ if (score !== null)
133
+ scored.push({ c, s: score });
134
+ }
135
+ scored.sort((a, b) => a.s - b.s || a.c.id.localeCompare(b.c.id));
136
+ return scored.map((r) => r.c);
137
+ }
138
+ /**
139
+ * Project recent ids onto the candidate list, preserving recency order and
140
+ * dropping ids that no longer resolve (uninstalled pack, renamed local
141
+ * persona, etc.).
142
+ */
143
+ export function recentCandidates(candidates, recentIds, cap = RECENT_DEFAULT_VISIBLE) {
144
+ const byId = new Map(candidates.map((c) => [c.id, c]));
145
+ const out = [];
146
+ for (const id of recentIds) {
147
+ const c = byId.get(id);
148
+ if (!c)
149
+ continue;
150
+ out.push(c);
151
+ if (out.length >= cap)
152
+ break;
153
+ }
154
+ return out;
155
+ }
156
+ const ESC = '\x1b';
157
+ const SEQ = {
158
+ enterAlt: `${ESC}[?1049h`,
159
+ leaveAlt: `${ESC}[?1049l`,
160
+ hideCursor: `${ESC}[?25l`,
161
+ showCursor: `${ESC}[?25h`,
162
+ clear: `${ESC}[2J${ESC}[H`,
163
+ reset: `${ESC}[0m`,
164
+ inverse: `${ESC}[7m`,
165
+ dim: `${ESC}[2m`,
166
+ bold: `${ESC}[1m`,
167
+ cyan: `${ESC}[36m`
168
+ };
169
+ function truncate(text, max) {
170
+ if (text.length <= max)
171
+ return text;
172
+ if (max <= 1)
173
+ return text.slice(0, Math.max(0, max));
174
+ return `${text.slice(0, max - 1)}…`;
175
+ }
176
+ const DEFAULT_VISIBLE_CAP = 20;
177
+ /**
178
+ * Window we wait for the rest of an escape sequence before treating a bare
179
+ * `\x1b` as a quit keystroke. Arrow keys arrive as `\x1b[A` / `\x1b[B`, and
180
+ * over slow connections (SSH, multiplexers, low-baud serial) those bytes can
181
+ * land in separate `data` events. 50ms is well below the human-perceptible
182
+ * delay for a real Esc press but plenty of slack for fragmented sequences.
183
+ */
184
+ const DEFAULT_ESCAPE_TIMEOUT_MS = 50;
185
+ /**
186
+ * Decide what the picker should show given the candidate set, recents list,
187
+ * and current query. Exported (and pure) so the recents-header logic can be
188
+ * unit-tested without spinning up a TTY.
189
+ *
190
+ * - `recents` — empty query AND at least one recent id still resolves to a
191
+ * known candidate.
192
+ * - `all` — empty query AND no recent ids resolve (fresh install, or all
193
+ * previously-used personas have been uninstalled/renamed).
194
+ * - `matches` — non-empty query; items are the ranked fuzzy hits.
195
+ */
196
+ export function computeTuiView(candidates, recentIds, query, visibleCap = DEFAULT_VISIBLE_CAP) {
197
+ if (!query.trim()) {
198
+ const recents = recentCandidates(candidates, recentIds, RECENT_DEFAULT_VISIBLE);
199
+ if (recents.length > 0)
200
+ return { mode: 'recents', items: recents };
201
+ return { mode: 'all', items: [...candidates].slice(0, visibleCap) };
202
+ }
203
+ return {
204
+ mode: 'matches',
205
+ items: rankCandidates(candidates, query).slice(0, visibleCap)
206
+ };
207
+ }
208
+ /**
209
+ * Interactive persona picker. Renders inside the alternate screen buffer so
210
+ * scrollback survives, raw-mode reads single keystrokes for arrow/enter/esc
211
+ * handling, and resolves with the chosen persona id (or undefined on quit).
212
+ *
213
+ * Falls back to undefined immediately when stdin or stderr isn't a TTY — the
214
+ * caller should print the regular help text in that case.
215
+ */
216
+ export async function runPersonaPickerTui(opts) {
217
+ const stdin = opts.stdin ?? process.stdin;
218
+ const stderr = opts.stderr ?? process.stderr;
219
+ if (!stdin.isTTY || !stderr.isTTY)
220
+ return undefined;
221
+ const visibleCap = opts.visibleCap ?? DEFAULT_VISIBLE_CAP;
222
+ const escapeTimeoutMs = opts.escapeTimeoutMs ?? DEFAULT_ESCAPE_TIMEOUT_MS;
223
+ let query = '';
224
+ let cursor = 0;
225
+ let view = computeTuiView(opts.candidates, opts.recentIds, query, visibleCap);
226
+ function render() {
227
+ const cols = stderr.columns ?? 100;
228
+ const items = view.items;
229
+ let out = SEQ.clear;
230
+ out += `${SEQ.bold}agentworkforce${SEQ.reset} · pick a persona\n`;
231
+ out += `${SEQ.dim}↑↓ navigate · enter run · esc quit · type to search${SEQ.reset}\n\n`;
232
+ out += `${SEQ.cyan}›${SEQ.reset} ${query || `${SEQ.dim}(type to search by name or description)${SEQ.reset}`}\n\n`;
233
+ const header = items.length === 0
234
+ ? 'NO MATCHES'
235
+ : view.mode === 'recents'
236
+ ? 'RECENT'
237
+ : 'PERSONAS';
238
+ out += `${SEQ.dim}${header}${SEQ.reset}\n`;
239
+ if (items.length === 0) {
240
+ out += `${SEQ.dim}(no persona name or description matches "${query}")${SEQ.reset}\n`;
241
+ }
242
+ else {
243
+ const nameWidth = Math.min(32, Math.max(8, ...items.map((c) => c.id.length)));
244
+ const sourceWidth = Math.min(14, Math.max(7, ...items.map((c) => c.source.length)));
245
+ const descBudget = Math.max(20, cols - nameWidth - sourceWidth - 7);
246
+ for (let i = 0; i < items.length; i += 1) {
247
+ const c = items[i];
248
+ const isSel = i === cursor;
249
+ const marker = isSel ? `${SEQ.cyan}›${SEQ.reset}` : ' ';
250
+ const desc = truncate(c.description.replace(/\s+/g, ' ').trim(), descBudget);
251
+ const body = `${c.id.padEnd(nameWidth)} ${c.source.padEnd(sourceWidth)} ${desc}`;
252
+ const styled = isSel ? `${SEQ.inverse}${body}${SEQ.reset}` : `${SEQ.dim}${body}${SEQ.reset}`;
253
+ out += `${marker} ${styled}\n`;
254
+ }
255
+ }
256
+ stderr.write(out);
257
+ }
258
+ function refresh() {
259
+ view = computeTuiView(opts.candidates, opts.recentIds, query, visibleCap);
260
+ if (cursor >= view.items.length)
261
+ cursor = Math.max(0, view.items.length - 1);
262
+ render();
263
+ }
264
+ return new Promise((resolve) => {
265
+ let settled = false;
266
+ // Buffered bare-Escape: stays set while we wait for the rest of a possible
267
+ // escape sequence. If `escapeTimer` fires first the user pressed Esc on
268
+ // its own; if more bytes arrive first we glue them together and dispatch.
269
+ let pendingEscape = '';
270
+ let escapeTimer;
271
+ function clearEscapeBuffer() {
272
+ pendingEscape = '';
273
+ if (escapeTimer) {
274
+ clearTimeout(escapeTimer);
275
+ escapeTimer = undefined;
276
+ }
277
+ }
278
+ function settle(value) {
279
+ if (settled)
280
+ return;
281
+ settled = true;
282
+ clearEscapeBuffer();
283
+ stdin.removeListener('data', onData);
284
+ try {
285
+ stdin.setRawMode?.(false);
286
+ }
287
+ catch {
288
+ /* not a TTY anymore */
289
+ }
290
+ stdin.pause();
291
+ stderr.write(`${SEQ.showCursor}${SEQ.leaveAlt}`);
292
+ resolve(value);
293
+ }
294
+ function handleKey(text) {
295
+ // Ctrl-C — quit.
296
+ if (text === '\x03') {
297
+ settle(undefined);
298
+ return;
299
+ }
300
+ // Bare Escape that has already cleared the debounce window.
301
+ if (text === '\x1b') {
302
+ settle(undefined);
303
+ return;
304
+ }
305
+ // Enter — accept current selection.
306
+ if (text === '\r' || text === '\n') {
307
+ const sel = view.items[cursor];
308
+ settle(sel?.id);
309
+ return;
310
+ }
311
+ // Arrow Up / Ctrl-P
312
+ if (text === '\x1b[A' || text === '\x10') {
313
+ if (view.items.length === 0)
314
+ return;
315
+ cursor = (cursor - 1 + view.items.length) % view.items.length;
316
+ render();
317
+ return;
318
+ }
319
+ // Arrow Down / Ctrl-N
320
+ if (text === '\x1b[B' || text === '\x0e') {
321
+ if (view.items.length === 0)
322
+ return;
323
+ cursor = (cursor + 1) % view.items.length;
324
+ render();
325
+ return;
326
+ }
327
+ // Backspace
328
+ if (text === '\x7f' || text === '\b') {
329
+ if (query.length > 0) {
330
+ query = query.slice(0, -1);
331
+ cursor = 0;
332
+ refresh();
333
+ }
334
+ return;
335
+ }
336
+ // Anything else that *starts* with ESC is an unrecognized CSI / SS3 /
337
+ // function-key sequence — swallow it rather than typing the bytes into
338
+ // the search box.
339
+ if (text.startsWith('\x1b'))
340
+ return;
341
+ // Strip any remaining control bytes and append printable input.
342
+ let printable = '';
343
+ for (const ch of text) {
344
+ const code = ch.charCodeAt(0);
345
+ if (code >= 0x20 && code !== 0x7f)
346
+ printable += ch;
347
+ }
348
+ if (printable.length > 0) {
349
+ query += printable;
350
+ cursor = 0;
351
+ refresh();
352
+ }
353
+ }
354
+ function onData(chunk) {
355
+ const text = typeof chunk === 'string' ? chunk : chunk.toString('utf8');
356
+ // Mid-sequence: the previous tick buffered a lone ESC. Glue and
357
+ // dispatch as a single keystroke so `\x1b` + `[A` is treated as an
358
+ // arrow press, not Esc-then-`[A`.
359
+ if (pendingEscape) {
360
+ const combined = pendingEscape + text;
361
+ clearEscapeBuffer();
362
+ handleKey(combined);
363
+ return;
364
+ }
365
+ // Lone ESC: wait briefly for the rest of a possible sequence.
366
+ if (text === '\x1b' && escapeTimeoutMs > 0) {
367
+ pendingEscape = text;
368
+ escapeTimer = setTimeout(() => {
369
+ if (pendingEscape !== '\x1b')
370
+ return;
371
+ clearEscapeBuffer();
372
+ handleKey('\x1b');
373
+ }, escapeTimeoutMs);
374
+ return;
375
+ }
376
+ handleKey(text);
377
+ }
378
+ try {
379
+ stdin.setRawMode?.(true);
380
+ }
381
+ catch {
382
+ /* not a TTY */
383
+ }
384
+ stdin.resume();
385
+ stderr.write(`${SEQ.enterAlt}${SEQ.hideCursor}`);
386
+ stdin.on('data', onData);
387
+ render();
388
+ });
389
+ }
390
+ //# sourceMappingURL=persona-tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona-tui.js","sourceRoot":"","sources":["../src/persona-tui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAa9D,MAAM,gBAAgB,GAAG,cAAc,CAAC;AACxC,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAEjC,MAAM,UAAU,kBAAkB,CAAC,gBAAgB,GAAG,uBAAuB,EAAE;IAC7E,OAAO,IAAI,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7D,MAAM,GAAG,GAAI,MAA4B,CAAC,GAAG,CAAC;IAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,IAAI,OAAO,EAAE,KAAK,QAAQ;YAAE,SAAS;QACrC,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,SAAS;QAC5C,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClB,IAAI,GAAG,CAAC,MAAM,IAAI,WAAW;YAAE,MAAM;IACvC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAI,GAAG,kBAAkB,EAAE;IACrD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,IAAuB,EACvB,EAAU,EACV,GAAG,GAAG,WAAW;IAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,EAAU,EAAE,IAAI,GAAG,kBAAkB,EAAE;IAClE,IAAI,CAAC,EAAE;QAAE,OAAO;IAChB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzF,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,MAAc;IACtD,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IACrB,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAC/B,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;IAClB,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;IACjB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QACtD,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YACpB,IAAI,QAAQ,KAAK,CAAC,CAAC;gBAAE,QAAQ,GAAG,EAAE,CAAC;YACnC,IAAI,OAAO,KAAK,CAAC,CAAC;gBAAE,QAAQ,IAAI,EAAE,GAAG,OAAO,GAAG,CAAC,CAAC;YACjD,OAAO,GAAG,EAAE,CAAC;YACb,EAAE,IAAI,CAAC,CAAC;QACV,CAAC;IACH,CAAC;IACD,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC/B,OAAO,QAAQ,GAAG,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,UAAmC,EACnC,KAAa;IAEb,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC;IACrC,MAAM,mBAAmB,GAAG,CAAC,CAAC;IAC9B,MAAM,MAAM,GAA0C,EAAE,CAAC;IACzD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,KAAK,GAAkB,IAAI,CAAC;QAChC,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YAC7C,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,mBAAmB,CAAC,CAAC;QAC/D,CAAC;aAAM,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YAC9B,KAAK,GAAG,SAAS,CAAC;QACpB,CAAC;aAAM,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YAC9B,KAAK,GAAG,SAAS,GAAG,mBAAmB,CAAC;QAC1C,CAAC;QACD,IAAI,KAAK,KAAK,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,UAAmC,EACnC,SAA4B,EAC5B,GAAG,GAAG,sBAAsB;IAE5B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAU,CAAC,CAAC,CAAC;IAChE,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvB,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACZ,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG;YAAE,MAAM;IAC/B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,GAAG,GAAG,MAAM,CAAC;AACnB,MAAM,GAAG,GAAG;IACV,QAAQ,EAAE,GAAG,GAAG,SAAS;IACzB,QAAQ,EAAE,GAAG,GAAG,SAAS;IACzB,UAAU,EAAE,GAAG,GAAG,OAAO;IACzB,UAAU,EAAE,GAAG,GAAG,OAAO;IACzB,KAAK,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI;IAC1B,KAAK,EAAE,GAAG,GAAG,KAAK;IAClB,OAAO,EAAE,GAAG,GAAG,KAAK;IACpB,GAAG,EAAE,GAAG,GAAG,KAAK;IAChB,IAAI,EAAE,GAAG,GAAG,KAAK;IACjB,IAAI,EAAE,GAAG,GAAG,MAAM;CACV,CAAC;AAEX,SAAS,QAAQ,CAAC,IAAY,EAAE,GAAW;IACzC,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACrD,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;AACtC,CAAC;AAaD,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B;;;;;;GAMG;AACH,MAAM,yBAAyB,GAAG,EAAE,CAAC;AASrC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAC5B,UAAmC,EACnC,SAA4B,EAC5B,KAAa,EACb,aAAqB,mBAAmB;IAExC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,gBAAgB,CAAC,UAAU,EAAE,SAAS,EAAE,sBAAsB,CAAC,CAAC;QAChF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QACnE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC;IACtE,CAAC;IACD,OAAO;QACL,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;KAC9D,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAA0B;IAE1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAC7C,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAEpD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,mBAAmB,CAAC;IAC1D,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,yBAAyB,CAAC;IAC1E,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAE9E,SAAS,MAAM;QACb,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;QACpB,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,iBAAiB,GAAG,CAAC,KAAK,uBAAuB,CAAC;QACpE,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,sDAAsD,GAAG,CAAC,KAAK,MAAM,CAAC;QACvF,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,IAAI,KAAK,IAAI,GAAG,GAAG,CAAC,GAAG,0CAA0C,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;QAClH,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC;YAC/B,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS;gBACvB,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,UAAU,CAAC;QACjB,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI,CAAC;QAC3C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,4CAA4C,KAAK,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC;QACvF,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,EAAE,EACF,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAC9C,CAAC;YACF,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAC1B,EAAE,EACF,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAClD,CAAC;YACF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,GAAG,SAAS,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC;YACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACnB,MAAM,KAAK,GAAG,CAAC,KAAK,MAAM,CAAC;gBAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;gBACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;gBAC7E,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC;gBACnF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC7F,GAAG,IAAI,GAAG,MAAM,IAAI,MAAM,IAAI,CAAC;YACjC,CAAC;QACH,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,SAAS,OAAO;QACd,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAC1E,IAAI,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7E,MAAM,EAAE,CAAC;IACX,CAAC;IAED,OAAO,IAAI,OAAO,CAAqB,CAAC,OAAO,EAAE,EAAE;QACjD,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,2EAA2E;QAC3E,wEAAwE;QACxE,0EAA0E;QAC1E,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,IAAI,WAAuC,CAAC;QAC5C,SAAS,iBAAiB;YACxB,aAAa,GAAG,EAAE,CAAC;YACnB,IAAI,WAAW,EAAE,CAAC;gBAChB,YAAY,CAAC,WAAW,CAAC,CAAC;gBAC1B,WAAW,GAAG,SAAS,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,SAAS,MAAM,CAAC,KAAyB;YACvC,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,iBAAiB,EAAE,CAAC;YACpB,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACrC,IAAI,CAAC;gBACH,KAAK,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;YACD,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YACjD,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;QACD,SAAS,SAAS,CAAC,IAAY;YAC7B,iBAAiB;YACjB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACpB,MAAM,CAAC,SAAS,CAAC,CAAC;gBAClB,OAAO;YACT,CAAC;YACD,4DAA4D;YAC5D,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACpB,MAAM,CAAC,SAAS,CAAC,CAAC;gBAClB,OAAO;YACT,CAAC;YACD,oCAAoC;YACpC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACnC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC/B,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YACD,oBAAoB;YACpB,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACzC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO;gBACpC,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;gBAC9D,MAAM,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YACD,sBAAsB;YACtB,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACzC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO;gBACpC,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;gBAC1C,MAAM,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YACD,YAAY;YACZ,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACrC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC3B,MAAM,GAAG,CAAC,CAAC;oBACX,OAAO,EAAE,CAAC;gBACZ,CAAC;gBACD,OAAO;YACT,CAAC;YACD,sEAAsE;YACtE,uEAAuE;YACvE,kBAAkB;YAClB,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,OAAO;YACpC,gEAAgE;YAChE,IAAI,SAAS,GAAG,EAAE,CAAC;YACnB,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;gBACtB,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBAC9B,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI;oBAAE,SAAS,IAAI,EAAE,CAAC;YACrD,CAAC;YACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,KAAK,IAAI,SAAS,CAAC;gBACnB,MAAM,GAAG,CAAC,CAAC;gBACX,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QACD,SAAS,MAAM,CAAC,KAAsB;YACpC,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACxE,gEAAgE;YAChE,mEAAmE;YACnE,kCAAkC;YAClC,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,QAAQ,GAAG,aAAa,GAAG,IAAI,CAAC;gBACtC,iBAAiB,EAAE,CAAC;gBACpB,SAAS,CAAC,QAAQ,CAAC,CAAC;gBACpB,OAAO;YACT,CAAC;YACD,8DAA8D;YAC9D,IAAI,IAAI,KAAK,MAAM,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;gBAC3C,aAAa,GAAG,IAAI,CAAC;gBACrB,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC5B,IAAI,aAAa,KAAK,MAAM;wBAAE,OAAO;oBACrC,iBAAiB,EAAE,CAAC;oBACpB,SAAS,CAAC,MAAM,CAAC,CAAC;gBACpB,CAAC,EAAE,eAAe,CAAC,CAAC;gBACpB,OAAO;YACT,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC;YACH,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;QACD,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACjD,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzB,MAAM,EAAE,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=persona-tui.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona-tui.test.d.ts","sourceRoot":"","sources":["../src/persona-tui.test.ts"],"names":[],"mappings":""}