@typescript-agent-harness/cli 0.35.0 → 0.37.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.
Files changed (48) hide show
  1. package/dist/ask-user.d.ts +18 -0
  2. package/dist/ask-user.d.ts.map +1 -0
  3. package/dist/ask-user.js +66 -0
  4. package/dist/ask-user.js.map +1 -0
  5. package/dist/browser.d.ts +19 -6
  6. package/dist/browser.d.ts.map +1 -1
  7. package/dist/browser.js +86 -44
  8. package/dist/browser.js.map +1 -1
  9. package/dist/host.d.ts +22 -0
  10. package/dist/host.d.ts.map +1 -1
  11. package/dist/host.js +93 -7
  12. package/dist/host.js.map +1 -1
  13. package/dist/index.d.ts +2 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/prompt.d.ts +2 -0
  17. package/dist/prompt.d.ts.map +1 -1
  18. package/dist/prompt.js +6 -1
  19. package/dist/prompt.js.map +1 -1
  20. package/dist/runtime.d.ts +6 -1
  21. package/dist/runtime.d.ts.map +1 -1
  22. package/dist/runtime.js +10 -2
  23. package/dist/runtime.js.map +1 -1
  24. package/dist/serve/http.d.ts +3 -0
  25. package/dist/serve/http.d.ts.map +1 -1
  26. package/dist/serve/http.js +105 -0
  27. package/dist/serve/http.js.map +1 -1
  28. package/dist/serve/hub.d.ts.map +1 -1
  29. package/dist/serve/hub.js +3 -0
  30. package/dist/serve/hub.js.map +1 -1
  31. package/dist/serve/protocol.d.ts +85 -0
  32. package/dist/serve/protocol.d.ts.map +1 -1
  33. package/dist/serve/screen.d.ts +41 -0
  34. package/dist/serve/screen.d.ts.map +1 -0
  35. package/dist/serve/screen.js +483 -0
  36. package/dist/serve/screen.js.map +1 -0
  37. package/dist/tui/app.d.ts.map +1 -1
  38. package/dist/tui/app.js +51 -1
  39. package/dist/tui/app.js.map +1 -1
  40. package/dist/tui/transcript.d.ts +6 -0
  41. package/dist/tui/transcript.d.ts.map +1 -1
  42. package/dist/tui/transcript.js +11 -1
  43. package/dist/tui/transcript.js.map +1 -1
  44. package/dist/web/assets/{index-idTqoQsm.css → index-BB_BHF1w.css} +1 -1
  45. package/dist/web/assets/index-WznEF5EK.js +49 -0
  46. package/dist/web/index.html +2 -2
  47. package/package.json +9 -9
  48. package/dist/web/assets/index-C_FzuyPs.js +0 -49
@@ -0,0 +1,483 @@
1
+ /** Connects to the browser-level endpoint Chrome lists at `/json/version`; gives up after `timeoutMs` (a stale port may never answer). */
2
+ export async function connectCdp(port, timeoutMs = 5000) {
3
+ const fail = () => new Error(`could not connect to the browser on port ${port}`);
4
+ const signal = AbortSignal.timeout(timeoutMs);
5
+ const version = (await fetch(`http://127.0.0.1:${port}/json/version`, { signal })
6
+ .then((res) => res.json())
7
+ .catch(() => {
8
+ throw fail();
9
+ }));
10
+ if (!version.webSocketDebuggerUrl)
11
+ throw fail();
12
+ const ws = new WebSocket(version.webSocketDebuggerUrl);
13
+ await new Promise((resolve, reject) => {
14
+ const timer = setTimeout(() => {
15
+ ws.close();
16
+ reject(fail());
17
+ }, timeoutMs);
18
+ ws.addEventListener("open", () => (clearTimeout(timer), resolve()), { once: true });
19
+ ws.addEventListener("error", () => (clearTimeout(timer), reject(fail())), { once: true });
20
+ });
21
+ let id = 0;
22
+ const pending = new Map();
23
+ const listeners = [];
24
+ const closers = [];
25
+ ws.addEventListener("message", (event) => {
26
+ const msg = JSON.parse(String(event.data));
27
+ if (msg.id !== undefined) {
28
+ const waiter = pending.get(msg.id);
29
+ pending.delete(msg.id);
30
+ if (msg.error)
31
+ waiter?.reject(new Error(msg.error.message));
32
+ else
33
+ waiter?.resolve(msg.result ?? {});
34
+ }
35
+ else if (msg.method) {
36
+ for (const listener of listeners)
37
+ listener(msg.method, msg.params ?? {}, msg.sessionId);
38
+ }
39
+ });
40
+ ws.addEventListener("close", () => {
41
+ for (const waiter of pending.values())
42
+ waiter.reject(new Error("the browser connection closed"));
43
+ pending.clear();
44
+ for (const closer of closers)
45
+ closer();
46
+ });
47
+ return {
48
+ send(method, params = {}, sessionId) {
49
+ return new Promise((resolve, reject) => {
50
+ if (ws.readyState !== WebSocket.OPEN)
51
+ return reject(new Error("the browser connection closed"));
52
+ id += 1;
53
+ pending.set(id, { resolve, reject });
54
+ ws.send(JSON.stringify({ id, method, params, ...(sessionId ? { sessionId } : {}) }));
55
+ });
56
+ },
57
+ on: (listener) => void listeners.push(listener),
58
+ onClose: (listener) => void closers.push(listener),
59
+ close: () => ws.close(),
60
+ };
61
+ }
62
+ const SELF = new Set(["127.0.0.1", "localhost", "[::1]"]);
63
+ /** What the panel may open: web pages other than tah itself (`port`), a blank page, or one of this server's file previews. */
64
+ export function browserURL(input, port) {
65
+ const text = input.trim();
66
+ if (text === "about:blank")
67
+ return text;
68
+ let url;
69
+ try {
70
+ if (text.startsWith("/")) {
71
+ url = new URL(text, `http://127.0.0.1:${port}`);
72
+ return url.pathname.startsWith("/preview/") ? url.href : undefined;
73
+ }
74
+ url = new URL(text);
75
+ }
76
+ catch {
77
+ return undefined;
78
+ }
79
+ if (url.protocol !== "http:" && url.protocol !== "https:")
80
+ return undefined;
81
+ const urlPort = Number(url.port || (url.protocol === "https:" ? 443 : 80));
82
+ if (SELF.has(url.hostname) && urlPort === port)
83
+ return undefined;
84
+ return url.href;
85
+ }
86
+ const num = (value, name) => {
87
+ if (typeof value !== "number" || !Number.isFinite(value))
88
+ throw new Error(`"${name}" must be a number`);
89
+ return value;
90
+ };
91
+ const int = (value, name) => {
92
+ if (typeof value !== "number" || !Number.isInteger(value) || value < 0)
93
+ throw new Error(`"${name}" must be a non-negative integer`);
94
+ return value;
95
+ };
96
+ const str = (value, name) => {
97
+ if (typeof value !== "string")
98
+ throw new Error(`"${name}" must be a string`);
99
+ return value;
100
+ };
101
+ const oneOf = (value, name, values) => {
102
+ if (!values.includes(value))
103
+ throw new Error(`"${name}" must be one of ${values.join(", ")}`);
104
+ return value;
105
+ };
106
+ /** Checks a `POST /api/browser/input` body; unknown fields are dropped. */
107
+ export function parseInput(body) {
108
+ switch (body.type) {
109
+ case "mouse":
110
+ return {
111
+ type: "mouse",
112
+ event: oneOf(body.event, "event", ["move", "down", "up"]),
113
+ x: num(body.x, "x"),
114
+ y: num(body.y, "y"),
115
+ button: oneOf(body.button, "button", ["left", "middle", "right", "none"]),
116
+ clickCount: int(body.clickCount, "clickCount"),
117
+ modifiers: int(body.modifiers, "modifiers"),
118
+ };
119
+ case "wheel":
120
+ return {
121
+ type: "wheel",
122
+ x: num(body.x, "x"),
123
+ y: num(body.y, "y"),
124
+ dx: num(body.dx, "dx"),
125
+ dy: num(body.dy, "dy"),
126
+ modifiers: int(body.modifiers, "modifiers"),
127
+ };
128
+ case "key": {
129
+ const key = {
130
+ type: "key",
131
+ event: oneOf(body.event, "event", ["down", "up"]),
132
+ key: str(body.key, "key"),
133
+ code: str(body.code, "code"),
134
+ keyCode: int(body.keyCode, "keyCode"),
135
+ modifiers: int(body.modifiers, "modifiers"),
136
+ };
137
+ return body.text === undefined ? key : { ...key, text: str(body.text, "text") };
138
+ }
139
+ case "text":
140
+ return { type: "text", text: str(body.text, "text") };
141
+ }
142
+ throw new Error('"type" must be one of mouse, wheel, key, text');
143
+ }
144
+ const MOUSE = { move: "mouseMoved", down: "mousePressed", up: "mouseReleased" };
145
+ /** The CDP command for one input. */
146
+ export function cdpInput(input) {
147
+ switch (input.type) {
148
+ case "mouse": {
149
+ const { x, y, button, clickCount, modifiers } = input;
150
+ return ["Input.dispatchMouseEvent", { type: MOUSE[input.event], x, y, button, clickCount, modifiers }];
151
+ }
152
+ case "wheel":
153
+ return [
154
+ "Input.dispatchMouseEvent",
155
+ { type: "mouseWheel", x: input.x, y: input.y, deltaX: input.dx, deltaY: input.dy, modifiers: input.modifiers },
156
+ ];
157
+ case "key": {
158
+ const params = {
159
+ type: input.event === "up" ? "keyUp" : input.text ? "keyDown" : "rawKeyDown",
160
+ key: input.key,
161
+ code: input.code,
162
+ windowsVirtualKeyCode: input.keyCode,
163
+ modifiers: input.modifiers,
164
+ };
165
+ if (input.text)
166
+ params.text = input.text;
167
+ // Chrome on macOS selects all only through the editing command, not the key press.
168
+ if (input.event === "down" && input.key.toLowerCase() === "a" && input.modifiers & 6)
169
+ params.commands = ["selectAll"];
170
+ return ["Input.dispatchKeyEvent", params];
171
+ }
172
+ case "text":
173
+ return ["Input.insertText", { text: input.text }];
174
+ }
175
+ }
176
+ const message = (err) => (err instanceof Error ? err.message : String(err));
177
+ /** Chrome sends no event when a page changes its title, so titles are re-read this often while someone watches. */
178
+ const RETITLE_MS = 1000;
179
+ /** The browser panel's side of the open folder's browser. */
180
+ export function createScreen(opts) {
181
+ const listeners = new Set();
182
+ const tabs = new Map();
183
+ let cdp;
184
+ let owner;
185
+ let connecting;
186
+ let active = null;
187
+ let session;
188
+ let showing = Promise.resolve();
189
+ let casting = false;
190
+ let lastFrame;
191
+ let error;
192
+ let dialog;
193
+ let retitling;
194
+ let disposed = false;
195
+ const state = () => {
196
+ const b = opts.browser();
197
+ return {
198
+ available: b !== undefined,
199
+ running: b?.running() ?? false,
200
+ agent: b?.agentAttached() ?? false,
201
+ tabs: [...tabs.values()],
202
+ active,
203
+ ...(error === undefined ? {} : { error }),
204
+ ...(dialog === undefined ? {} : { dialog }),
205
+ };
206
+ };
207
+ const emit = (event) => {
208
+ for (const listener of listeners)
209
+ listener(event);
210
+ };
211
+ const push = () => emit({ type: "state", state: state() });
212
+ const forget = () => {
213
+ tabs.clear();
214
+ active = null;
215
+ session = undefined;
216
+ casting = false;
217
+ lastFrame = undefined;
218
+ dialog = undefined;
219
+ };
220
+ const drop = () => {
221
+ const c = cdp;
222
+ cdp = undefined;
223
+ owner = undefined;
224
+ forget();
225
+ c?.close();
226
+ };
227
+ async function cast(on) {
228
+ const c = cdp;
229
+ const s = session;
230
+ if (!c || !s || casting === on)
231
+ return;
232
+ casting = on;
233
+ await c.send(on ? "Page.startScreencast" : "Page.stopScreencast", on ? { format: "jpeg", quality: 70 } : {}, s).catch(() => { });
234
+ }
235
+ async function retitle() {
236
+ const c = cdp;
237
+ if (!c)
238
+ return;
239
+ const { targetInfos } = (await c.send("Target.getTargets"));
240
+ if (c !== cdp)
241
+ return;
242
+ let changed = false;
243
+ for (const t of targetInfos) {
244
+ const tab = tabs.get(t.targetId);
245
+ if (!tab || tab.title === t.title)
246
+ continue;
247
+ tabs.set(t.targetId, { ...tab, title: t.title });
248
+ changed = true;
249
+ }
250
+ if (changed)
251
+ push();
252
+ }
253
+ /** Shows tab `id`: attaches to it (detaching the previous one) and streams it while someone watches. */
254
+ function show(id) {
255
+ const c = cdp;
256
+ if (!c)
257
+ return Promise.resolve();
258
+ const previous = session;
259
+ active = id;
260
+ session = undefined;
261
+ casting = false;
262
+ lastFrame = undefined;
263
+ dialog = undefined;
264
+ push();
265
+ showing = (async () => {
266
+ if (previous)
267
+ await c.send("Target.detachFromTarget", { sessionId: previous }).catch(() => { });
268
+ const { sessionId } = (await c.send("Target.attachToTarget", { targetId: id, flatten: true }));
269
+ if (active !== id || cdp !== c) {
270
+ await c.send("Target.detachFromTarget", { sessionId }).catch(() => { });
271
+ return;
272
+ }
273
+ session = sessionId;
274
+ if (error !== undefined) {
275
+ error = undefined;
276
+ push();
277
+ }
278
+ await c.send("Target.activateTarget", { targetId: id }).catch(() => { });
279
+ await c.send("Page.enable", {}, sessionId).catch(() => { });
280
+ if (listeners.size > 0)
281
+ await cast(true);
282
+ })().catch((err) => {
283
+ if (active !== id || cdp !== c)
284
+ return;
285
+ error = `could not show the tab: ${message(err)}`;
286
+ push();
287
+ });
288
+ return showing;
289
+ }
290
+ const onEvent = (c) => (method, params, sessionId) => {
291
+ if (c !== cdp)
292
+ return;
293
+ if (method === "Page.screencastFrame") {
294
+ if (sessionId === undefined || sessionId !== session)
295
+ return;
296
+ void c.send("Page.screencastFrameAck", { sessionId: params.sessionId }, sessionId).catch(() => { });
297
+ const meta = params.metadata;
298
+ lastFrame = { type: "frame", data: params.data, width: meta.deviceWidth, height: meta.deviceHeight };
299
+ emit(lastFrame);
300
+ return;
301
+ }
302
+ if (method === "Page.javascriptDialogOpening" || method === "Page.javascriptDialogClosed") {
303
+ if (sessionId === undefined || sessionId !== session)
304
+ return;
305
+ dialog = method === "Page.javascriptDialogOpening" ? { type: params.type, message: params.message } : undefined;
306
+ return push();
307
+ }
308
+ const info = params.targetInfo;
309
+ if (method === "Target.targetCreated" && info?.type === "page") {
310
+ tabs.set(info.targetId, { id: info.targetId, title: info.title, url: info.url });
311
+ void show(info.targetId);
312
+ }
313
+ else if (method === "Target.targetInfoChanged" && info && tabs.has(info.targetId)) {
314
+ tabs.set(info.targetId, { id: info.targetId, title: info.title, url: info.url });
315
+ push();
316
+ }
317
+ else if (method === "Target.targetDestroyed") {
318
+ const id = params.targetId;
319
+ if (!tabs.delete(id))
320
+ return;
321
+ if (active !== id)
322
+ return push();
323
+ active = null;
324
+ session = undefined;
325
+ casting = false;
326
+ lastFrame = undefined;
327
+ dialog = undefined;
328
+ const last = [...tabs.keys()].at(-1);
329
+ if (last)
330
+ void show(last);
331
+ else
332
+ push();
333
+ }
334
+ };
335
+ function connect() {
336
+ if (cdp)
337
+ return Promise.resolve(cdp);
338
+ connecting ??= (async () => {
339
+ const b = opts.browser();
340
+ const port = b?.cdpPort();
341
+ if (!b || port === undefined)
342
+ return undefined;
343
+ const c = await (opts.connect ?? connectCdp)(port);
344
+ if (disposed) {
345
+ c.close();
346
+ return undefined;
347
+ }
348
+ cdp = c;
349
+ owner = b;
350
+ c.on(onEvent(c));
351
+ c.onClose(() => {
352
+ if (cdp !== c)
353
+ return;
354
+ cdp = undefined;
355
+ owner = undefined;
356
+ forget();
357
+ push();
358
+ });
359
+ await c.send("Target.setDiscoverTargets", { discover: true });
360
+ const { targetInfos } = (await c.send("Target.getTargets"));
361
+ for (const t of targetInfos) {
362
+ if (t.type === "page" && !tabs.has(t.targetId))
363
+ tabs.set(t.targetId, { id: t.targetId, title: t.title, url: t.url });
364
+ }
365
+ const last = [...tabs.keys()].at(-1);
366
+ if (active === null && last)
367
+ await show(last);
368
+ else
369
+ push();
370
+ return c;
371
+ })().finally(() => (connecting = undefined));
372
+ return connecting;
373
+ }
374
+ /** The connection and the shown tab's session, once attached. */
375
+ async function ready() {
376
+ const c = cdp ?? (opts.browser()?.running() ? await connect() : undefined);
377
+ let shown;
378
+ do {
379
+ shown = showing;
380
+ await shown;
381
+ } while (shown !== showing);
382
+ if (!c || cdp !== c || !session)
383
+ throw new Error("the browser is not open");
384
+ return { c, s: session };
385
+ }
386
+ async function sync() {
387
+ const b = opts.browser();
388
+ if (cdp && (b !== owner || !b?.running()))
389
+ drop();
390
+ if (b?.running() && !cdp && listeners.size > 0) {
391
+ try {
392
+ await connect();
393
+ error = undefined;
394
+ }
395
+ catch (err) {
396
+ error = message(err);
397
+ }
398
+ }
399
+ push();
400
+ }
401
+ return {
402
+ state,
403
+ subscribe(listener) {
404
+ listeners.add(listener);
405
+ listener({ type: "state", state: state() });
406
+ if (lastFrame)
407
+ listener(lastFrame);
408
+ if (listeners.size === 1) {
409
+ void (cdp ? cast(true) : sync());
410
+ retitling = setInterval(() => void retitle().catch(() => { }), RETITLE_MS).unref();
411
+ }
412
+ return () => {
413
+ if (!listeners.delete(listener) || listeners.size > 0)
414
+ return;
415
+ clearInterval(retitling);
416
+ void cast(false);
417
+ };
418
+ },
419
+ sync,
420
+ async open(url) {
421
+ const b = opts.browser();
422
+ if (!b)
423
+ throw new Error("the built-in browser is off in this folder");
424
+ error = undefined;
425
+ try {
426
+ await b.launch();
427
+ if (cdp && owner !== b)
428
+ drop();
429
+ if (!(await connect()))
430
+ throw new Error("could not find the browser's debugging port");
431
+ }
432
+ catch (err) {
433
+ error = message(err);
434
+ push();
435
+ throw err;
436
+ }
437
+ if (url) {
438
+ const { c, s } = await ready();
439
+ await c.send("Page.navigate", { url }, s);
440
+ }
441
+ push();
442
+ },
443
+ async nav(action) {
444
+ const { c, s } = await ready();
445
+ if (action === "reload") {
446
+ await c.send("Page.reload", {}, s);
447
+ return;
448
+ }
449
+ const history = (await c.send("Page.getNavigationHistory", {}, s));
450
+ const entry = history.entries[history.currentIndex - 1];
451
+ if (entry)
452
+ await c.send("Page.navigateToHistoryEntry", { entryId: entry.id }, s);
453
+ },
454
+ async tab(id) {
455
+ if (!tabs.has(id))
456
+ throw new Error(`no tab "${id}"`);
457
+ await show(id);
458
+ },
459
+ async input(input) {
460
+ const { c, s } = await ready();
461
+ const [method, params] = cdpInput(input);
462
+ await c.send(method, params, s);
463
+ },
464
+ async dialog(accept, text) {
465
+ const { c, s } = await ready();
466
+ await c.send("Page.handleJavaScriptDialog", { accept, ...(text === undefined ? {} : { promptText: text }) }, s);
467
+ },
468
+ async close() {
469
+ const b = opts.browser();
470
+ drop();
471
+ error = undefined;
472
+ await b?.close();
473
+ push();
474
+ },
475
+ dispose() {
476
+ disposed = true;
477
+ listeners.clear();
478
+ clearInterval(retitling);
479
+ drop();
480
+ },
481
+ };
482
+ }
483
+ //# sourceMappingURL=screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.js","sourceRoot":"","sources":["../../src/serve/screen.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/tui/app.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAe3C,OAAO,KAAK,EAA+B,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAoH/E,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAEpG,wBAAgB,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,QAAQ,+BAgMlE"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/tui/app.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAe3C,OAAO,KAAK,EAA+B,UAAU,EAAE,MAAM,iBAAiB,CAAC;AA0I/E,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAEpG,wBAAgB,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,QAAQ,+BA0OlE"}
package/dist/tui/app.js CHANGED
@@ -53,6 +53,17 @@ function Picker({ rows, index, current }) {
53
53
  return (_jsx(Text, { inverse: n === index, children: `${mark}${String(n + 1).padStart(3)} ${r.id} ${r.state.padEnd(9)} ${String(r.turns).padStart(3)} turns ${r.preview}` }, r.id));
54
54
  })] }));
55
55
  }
56
+ function QuestionPrompt({ questions, progress }) {
57
+ const index = progress.answers.length;
58
+ const q = questions[index];
59
+ if (!q)
60
+ return null;
61
+ const count = questions.length > 1 ? ` (${index + 1}/${questions.length})` : "";
62
+ const hint = q.multiple
63
+ ? `1–${q.options.length} toggle · Enter confirm · or type your own answer · Esc skip`
64
+ : `1–${q.options.length} pick · or type your own answer and press Enter · Esc skip`;
65
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, children: [_jsx(Text, { bold: true, children: `? ${q.question}${count}` }), q.options.map((o, i) => (_jsxs(Text, { children: [q.multiple ? (progress.picked.includes(i) ? "[x] " : "[ ] ") : "", _jsx(Text, { color: "cyan", children: `${i + 1}.` }), " ", o] }, i))), _jsx(Text, { dimColor: true, children: hint })] }));
66
+ }
56
67
  export function App({ host, transcript, maxSteps, color }) {
57
68
  const snap = useSyncExternalStore(transcript.subscribe, () => transcript.snapshot);
58
69
  const { exit } = useApp();
@@ -116,6 +127,20 @@ export function App({ host, transcript, maxSteps, color }) {
116
127
  host.send(text).catch(fail);
117
128
  };
118
129
  const answer = (id, a) => host.answer(id, a);
130
+ const [, setAsked] = useState();
131
+ const askedRef = useRef(undefined);
132
+ const progressOf = (id) => askedRef.current?.id === id ? askedRef.current : { id, answers: [], picked: [] };
133
+ const setProgress = (p) => {
134
+ askedRef.current = p;
135
+ setAsked(p);
136
+ };
137
+ const nextQuestion = (id, total, answer) => {
138
+ const answers = [...progressOf(id).answers, answer];
139
+ setProgress({ id, answers, picked: [] });
140
+ if (answers.length >= total)
141
+ host.answerQuestion(id, answers);
142
+ };
143
+ const progress = progressOf(snap.question?.id ?? "");
119
144
  usePaste((text) => update((e) => insert(e, text)), { isActive: !snap.approval && !picker && !exiting });
120
145
  useInput((input, key) => {
121
146
  const s = transcript.snapshot;
@@ -144,6 +169,31 @@ export function App({ host, transcript, maxSteps, color }) {
144
169
  answer(s.approval.id, "no");
145
170
  return;
146
171
  }
172
+ const p = s.question && progressOf(s.question.id);
173
+ const current = p && s.question?.questions[p.answers.length];
174
+ if (s.question && p && current) {
175
+ const { id, questions } = s.question;
176
+ if (key.escape) {
177
+ update(() => emptyEditor());
178
+ return host.skipQuestion(id);
179
+ }
180
+ const typed = editorText(editorRef.current).trim();
181
+ const n = Number(input);
182
+ if (!typed && /^[1-9]$/.test(input) && n <= current.options.length) {
183
+ if (!current.multiple)
184
+ return nextQuestion(id, questions.length, [current.options[n - 1]]);
185
+ const picked = p.picked.includes(n - 1) ? p.picked.filter((i) => i !== n - 1) : [...p.picked, n - 1];
186
+ return setProgress({ ...p, picked });
187
+ }
188
+ if (key.return && !key.meta && !key.shift) {
189
+ const chosen = [...p.picked].sort((a, b) => a - b).map((i) => current.options[i]);
190
+ const answer = typed ? [...chosen, typed] : chosen;
191
+ if (answer.length === 0)
192
+ return;
193
+ update(() => emptyEditor());
194
+ return nextQuestion(id, questions.length, answer);
195
+ }
196
+ }
147
197
  if (picker) {
148
198
  const n = picker.rows.length;
149
199
  if (key.upArrow)
@@ -226,6 +276,6 @@ export function App({ host, transcript, maxSteps, color }) {
226
276
  : undefined);
227
277
  const hint = snap.busy ? "Ctrl+C stop" : "Enter send · Alt+Enter newline · / commands";
228
278
  const status = [snap.model ?? "tah", snap.sessionId, `${snap.rounds} rounds`, ...(host.approve ? [] : ["approve=off"])];
229
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Static, { items: snap.items, children: (item) => _jsx(StaticItem, { item: item }, item.id) }), exiting ? null : (_jsxs(_Fragment, { children: [_jsx(Live, { snap: snap, maxLines: Math.max(3, rows - 12) }), snap.approval ? (_jsx(Text, { children: withoutAnswerMark(formatPrompt({ name: snap.approval.tool, arguments: snap.approval.input }, color)) })) : null, snap.stepLimit && !snap.busy ? _jsx(Text, { children: withoutAnswerMark(formatContinuePrompt(maxSteps, color)) }) : null, picker ? _jsx(Picker, { rows: picker.rows, index: picker.index, current: snap.sessionId }) : null, matches.length > 0 && typing ? _jsx(Menu, { matches: matches, index: Math.min(menuIndex, matches.length - 1) }) : null, _jsx(Box, { ref: inputRef, borderStyle: "round", borderColor: typing ? "cyan" : "gray", paddingX: 1, flexDirection: "column", children: layout.rows.map((row, i) => (_jsxs(Text, { wrap: "truncate", children: [_jsx(Text, { color: "cyan", children: i === 0 ? "> " : " " }), row] }, i))) }), _jsxs(Box, { justifyContent: "space-between", gap: 1, paddingX: 1, children: [_jsx(Text, { dimColor: true, wrap: "truncate", children: status.join(" · ") }), _jsx(Text, { dimColor: true, wrap: "truncate", children: hint })] })] }))] }));
279
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Static, { items: snap.items, children: (item) => _jsx(StaticItem, { item: item }, item.id) }), exiting ? null : (_jsxs(_Fragment, { children: [_jsx(Live, { snap: snap, maxLines: Math.max(3, rows - 12) }), snap.approval ? (_jsx(Text, { children: withoutAnswerMark(formatPrompt({ name: snap.approval.tool, arguments: snap.approval.input }, color)) })) : null, snap.question ? _jsx(QuestionPrompt, { questions: snap.question.questions, progress: progress }) : null, snap.stepLimit && !snap.busy ? _jsx(Text, { children: withoutAnswerMark(formatContinuePrompt(maxSteps, color)) }) : null, picker ? _jsx(Picker, { rows: picker.rows, index: picker.index, current: snap.sessionId }) : null, matches.length > 0 && typing ? _jsx(Menu, { matches: matches, index: Math.min(menuIndex, matches.length - 1) }) : null, _jsx(Box, { ref: inputRef, borderStyle: "round", borderColor: typing ? "cyan" : "gray", paddingX: 1, flexDirection: "column", children: layout.rows.map((row, i) => (_jsxs(Text, { wrap: "truncate", children: [_jsx(Text, { color: "cyan", children: i === 0 ? "> " : " " }), row] }, i))) }), _jsxs(Box, { justifyContent: "space-between", gap: 1, paddingX: 1, children: [_jsx(Text, { dimColor: true, wrap: "truncate", children: status.join(" · ") }), _jsx(Text, { dimColor: true, wrap: "truncate", children: hint })] })] }))] }));
230
280
  }
231
281
  //# sourceMappingURL=app.js.map