@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.
- package/CHANGELOG.md +13 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +69 -2
- package/dist/cli.js.map +1 -1
- package/dist/launch-metadata.d.ts.map +1 -1
- package/dist/launch-metadata.js +12 -1
- package/dist/launch-metadata.js.map +1 -1
- package/dist/launch-metadata.test.js +58 -0
- package/dist/launch-metadata.test.js.map +1 -1
- package/dist/persona-tui.d.ts +85 -0
- package/dist/persona-tui.d.ts.map +1 -0
- package/dist/persona-tui.js +390 -0
- package/dist/persona-tui.js.map +1 -0
- package/dist/persona-tui.test.d.ts +2 -0
- package/dist/persona-tui.test.d.ts.map +1 -0
- package/dist/persona-tui.test.js +130 -0
- package/dist/persona-tui.test.js.map +1 -0
- package/package.json +3 -3
|
@@ -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":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persona-tui.test.d.ts","sourceRoot":"","sources":["../src/persona-tui.test.ts"],"names":[],"mappings":""}
|