@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,18 @@
1
+ import type { Tool } from "@typescript-agent-harness/tools";
2
+ export type Question = {
3
+ question: string;
4
+ options: string[];
5
+ /** The user may pick more than one option. */
6
+ multiple?: boolean;
7
+ };
8
+ /**
9
+ * One answer per question: the picked options and / or the user's own text.
10
+ * `"skipped"`: the user dismissed the card (the host then ends the turn); `undefined`: the turn was stopped.
11
+ */
12
+ export type AskUser = (questions: Question[], signal: AbortSignal) => Promise<string[][] | "skipped" | undefined>;
13
+ export declare const SKIPPED_NOTE = "The user skipped these questions without answering. They were shown to the user as text and the turn ended; the user's next message may answer them in their own words.";
14
+ /** The questions as Markdown, shown in the conversation when the user skips the card. */
15
+ export declare function questionsText(questions: Question[]): string;
16
+ /** Multiple-choice questions shown to the user (web card or terminal); the turn waits for the answers. */
17
+ export declare function askUserTool(ask: AskUser): Tool;
18
+ //# sourceMappingURL=ask-user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-user.d.ts","sourceRoot":"","sources":["../src/ask-user.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iCAAiC,CAAC;AAE5D,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,SAAS,GAAG,SAAS,CAAC,CAAC;AAElH,eAAO,MAAM,YAAY,4KACkJ,CAAC;AAE5K,yFAAyF;AACzF,wBAAgB,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAI3D;AA0BD,0GAA0G;AAC1G,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAkC9C"}
@@ -0,0 +1,66 @@
1
+ export const SKIPPED_NOTE = "The user skipped these questions without answering. They were shown to the user as text and the turn ended; the user's next message may answer them in their own words.";
2
+ /** The questions as Markdown, shown in the conversation when the user skips the card. */
3
+ export function questionsText(questions) {
4
+ return questions
5
+ .map((q) => [`**${q.question}**${q.multiple ? " (pick any)" : ""}`, ...q.options.map((o) => `- ${o}`)].join("\n"))
6
+ .join("\n\n");
7
+ }
8
+ const MAX_QUESTIONS = 4;
9
+ const MIN_OPTIONS = 2;
10
+ const MAX_OPTIONS = 5;
11
+ function parse(input) {
12
+ const raw = input?.questions;
13
+ if (!Array.isArray(raw) || raw.length === 0 || raw.length > MAX_QUESTIONS) {
14
+ throw new Error(`questions must list 1–${MAX_QUESTIONS} questions`);
15
+ }
16
+ return raw.map((q, i) => {
17
+ const { question, options, multiple } = (q ?? {});
18
+ if (typeof question !== "string" || !question.trim())
19
+ throw new Error(`questions[${i}].question must be a non-empty string`);
20
+ if (!Array.isArray(options) ||
21
+ options.length < MIN_OPTIONS ||
22
+ options.length > MAX_OPTIONS ||
23
+ !options.every((o) => typeof o === "string" && o.trim())) {
24
+ throw new Error(`questions[${i}].options must list ${MIN_OPTIONS}–${MAX_OPTIONS} non-empty strings`);
25
+ }
26
+ return { question: question.trim(), options: options.map((o) => o.trim()), ...(multiple === true ? { multiple: true } : {}) };
27
+ });
28
+ }
29
+ /** Multiple-choice questions shown to the user (web card or terminal); the turn waits for the answers. */
30
+ export function askUserTool(ask) {
31
+ return {
32
+ name: "ask_user",
33
+ description: "Ask the user 1–4 multiple-choice questions and wait for the answers. Use it before doing the work when the request is ambiguous or has several reasonable approaches the user should choose between; do not use it when the request is clear. Keep questions short and give 2–5 concrete options each, the recommended one first. The user may type their own answer instead of picking an option.",
34
+ inputSchema: {
35
+ type: "object",
36
+ properties: {
37
+ questions: {
38
+ type: "array",
39
+ description: `1–${MAX_QUESTIONS} questions, answered together`,
40
+ items: {
41
+ type: "object",
42
+ properties: {
43
+ question: { type: "string" },
44
+ options: { type: "array", description: `${MIN_OPTIONS}–${MAX_OPTIONS} options`, items: { type: "string" } },
45
+ multiple: { type: "boolean", description: "Allow picking more than one option" },
46
+ },
47
+ required: ["question", "options"],
48
+ additionalProperties: false,
49
+ },
50
+ },
51
+ },
52
+ required: ["questions"],
53
+ additionalProperties: false,
54
+ },
55
+ async execute(input, ctx) {
56
+ const questions = parse(input);
57
+ const answers = await ask(questions, ctx.signal);
58
+ if (!answers)
59
+ throw new Error("the user did not answer");
60
+ if (answers === "skipped")
61
+ return { skipped: true, note: SKIPPED_NOTE };
62
+ return { answers: questions.map((q, i) => ({ question: q.question, answer: answers[i] ?? [] })) };
63
+ },
64
+ };
65
+ }
66
+ //# sourceMappingURL=ask-user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-user.js","sourceRoot":"","sources":["../src/ask-user.ts"],"names":[],"mappings":"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"}
package/dist/browser.d.ts CHANGED
@@ -9,16 +9,29 @@ export type BrowserServer = {
9
9
  export type BrowserOptions = {
10
10
  cwd: string;
11
11
  homeDir: string;
12
- /** `tah run` has nobody watching; chat and serve show the window. */
12
+ /** `tah chat` shows a Chrome window; `tah run` has nobody watching and `tah serve` shows the page in its browser panel. */
13
13
  headless: boolean;
14
14
  /** Tests swap in a fake MCP server. */
15
15
  server?: BrowserServer;
16
16
  };
17
- export declare function playwrightServer(o: BrowserOptions): BrowserServer;
18
- export declare function clipResult(out: unknown): unknown;
19
- /** `browser_open` starts Playwright MCP on first use and mounts the browser tools; `browser_close` takes them down again. */
20
- export declare function createBrowser(o: BrowserOptions): {
17
+ /** One tah host's browser: the agent's tools, plus what `tah serve`'s browser panel needs. */
18
+ export type Browser = {
21
19
  plugin: Plugin;
22
- isOpen(): boolean;
20
+ /** The agent's `browser_open` was approved and the browser tools are mounted. */
21
+ agentAttached(): boolean;
22
+ /** Playwright MCP is running. */
23
+ running(): boolean;
24
+ /** Starts the browser for the panel; mounts no tools. */
25
+ launch(): Promise<void>;
26
+ /** Chrome's debugging port; undefined while the browser is not running. */
27
+ cdpPort(): number | undefined;
28
+ /** Closes the browser and withdraws the tools. */
29
+ close(): Promise<void>;
23
30
  };
31
+ /** Playwright MCP's config: Chrome opens a random debugging port and writes it to `<profile>/DevToolsActivePort`. */
32
+ export declare function writeBrowserConfig(homeDir: string): void;
33
+ export declare function playwrightServer(o: BrowserOptions): BrowserServer;
34
+ export declare function clipResult(out: unknown): unknown;
35
+ /** `browser_open` starts Playwright MCP on first use and mounts the browser tools; `browser_close` takes them down again. The panel can start the browser first (`launch`) without mounting them. */
36
+ export declare function createBrowser(o: BrowserOptions): Browser;
24
37
  //# sourceMappingURL=browser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAI7D,6GAA6G;AAC7G,eAAO,MAAM,aAAa,UAmBzB,CAAC;AAEF,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAE3C,MAAM,MAAM,aAAa,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEhE,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,QAAQ,EAAE,OAAO,CAAC;IAClB,uCAAuC;IACvC,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,cAAc,GAAG,aAAa,CAmBjE;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAGhD;AAED,6HAA6H;AAC7H,wBAAgB,aAAa,CAAC,CAAC,EAAE,cAAc,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,IAAI,OAAO,CAAA;CAAE,CAoFtF"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAI7D,6GAA6G;AAC7G,eAAO,MAAM,aAAa,UAmBzB,CAAC;AAEF,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAE3C,MAAM,MAAM,aAAa,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEhE,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,2HAA2H;IAC3H,QAAQ,EAAE,OAAO,CAAC;IAClB,uCAAuC;IACvC,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB,CAAC;AAEF,8FAA8F;AAC9F,MAAM,MAAM,OAAO,GAAG;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,aAAa,IAAI,OAAO,CAAC;IACzB,iCAAiC;IACjC,OAAO,IAAI,OAAO,CAAC;IACnB,yDAAyD;IACzD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,2EAA2E;IAC3E,OAAO,IAAI,MAAM,GAAG,SAAS,CAAC;IAC9B,kDAAkD;IAClD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAKF,qHAAqH;AACrH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGxD;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,cAAc,GAAG,aAAa,CAyBjE;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAGhD;AAED,qMAAqM;AACrM,wBAAgB,aAAa,CAAC,CAAC,EAAE,cAAc,GAAG,OAAO,CAkHxD"}
package/dist/browser.js CHANGED
@@ -1,4 +1,4 @@
1
- import { readFileSync } from "node:fs";
1
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
2
  import { createRequire } from "node:module";
3
3
  import path from "node:path";
4
4
  import { mcpResultText, stdioMcpBackend } from "@typescript-agent-harness/mcp";
@@ -25,6 +25,13 @@ export const BROWSER_TOOLS = [
25
25
  "browser_close",
26
26
  ];
27
27
  export const BROWSER_RESULT_CHARS = 30_000;
28
+ const profileDir = (homeDir) => path.join(homeDir, ".tah", "browser-profile");
29
+ const configFile = (homeDir) => path.join(homeDir, ".tah", "browser-config.json");
30
+ /** Playwright MCP's config: Chrome opens a random debugging port and writes it to `<profile>/DevToolsActivePort`. */
31
+ export function writeBrowserConfig(homeDir) {
32
+ mkdirSync(path.dirname(configFile(homeDir)), { recursive: true });
33
+ writeFileSync(configFile(homeDir), `${JSON.stringify({ browser: { launchOptions: { args: ["--remote-debugging-port=0"] } } })}\n`);
34
+ }
28
35
  export function playwrightServer(o) {
29
36
  const require = createRequire(import.meta.url);
30
37
  const pkg = require.resolve("@playwright/mcp/package.json");
@@ -36,11 +43,17 @@ export function playwrightServer(o) {
36
43
  "--browser",
37
44
  "chrome",
38
45
  "--user-data-dir",
39
- path.join(o.homeDir, ".tah", "browser-profile"),
46
+ profileDir(o.homeDir),
40
47
  "--output-dir",
41
48
  path.join(o.cwd, ".tah", "browser"),
42
49
  "--image-responses",
43
50
  "omit",
51
+ "--config",
52
+ configFile(o.homeDir),
53
+ "--idle-timeout",
54
+ "0",
55
+ "--viewport-size",
56
+ "1280x720",
44
57
  ...(o.headless ? ["--headless"] : []),
45
58
  ],
46
59
  };
@@ -50,12 +63,14 @@ export function clipResult(out) {
50
63
  return out;
51
64
  return `${out.slice(0, BROWSER_RESULT_CHARS)}\n[truncated: ${out.length - BROWSER_RESULT_CHARS} more chars — use browser_find to search the page]`;
52
65
  }
53
- /** `browser_open` starts Playwright MCP on first use and mounts the browser tools; `browser_close` takes them down again. */
66
+ /** `browser_open` starts Playwright MCP on first use and mounts the browser tools; `browser_close` takes them down again. The panel can start the browser first (`launch`) without mounting them. */
54
67
  export function createBrowser(o) {
55
68
  let tools;
56
69
  let backend;
57
- let opening;
70
+ let starting;
71
+ let infos = [];
58
72
  let mounted = [];
73
+ let disposed = false;
59
74
  async function shut() {
60
75
  for (const name of mounted)
61
76
  tools?.unregister(name);
@@ -64,61 +79,63 @@ export function createBrowser(o) {
64
79
  backend = undefined;
65
80
  await b?.close?.();
66
81
  }
82
+ /** Playwright MCP starts Chrome on its first tool call; `browser_tabs` makes that happen now. */
67
83
  async function start() {
84
+ if (!o.server)
85
+ writeBrowserConfig(o.homeDir);
68
86
  const b = stdioMcpBackend({ ...(o.server ?? playwrightServer(o)), cwd: o.cwd });
69
87
  try {
70
- const infos = (await b.listTools()).filter((t) => BROWSER_TOOLS.includes(t.name));
71
- for (const info of infos) {
72
- tools.register({
73
- name: info.name,
74
- description: info.description,
75
- inputSchema: info.inputSchema,
76
- async execute(input) {
77
- const out = clipResult(mcpResultText(await b.callTool(info.name, input)));
78
- if (info.name === "browser_close")
79
- await shut();
80
- return out;
81
- },
82
- });
83
- mounted.push(info.name);
84
- }
85
- backend = b;
86
- return b;
88
+ infos = (await b.listTools()).filter((t) => BROWSER_TOOLS.includes(t.name));
89
+ mcpResultText(await b.callTool("browser_tabs", { action: "list" }));
87
90
  }
88
91
  catch (err) {
89
- for (const name of mounted)
90
- tools.unregister(name);
91
- mounted = [];
92
92
  await b.close?.();
93
- throw new Error(`could not start the browser: ${err instanceof Error ? err.message : String(err)}`);
93
+ const message = err instanceof Error ? err.message : String(err);
94
+ if (/already in use/i.test(message)) {
95
+ throw new Error(`the browser profile ${profileDir(o.homeDir)} is in use by another tah — close that tah (or its browser) and try again`);
96
+ }
97
+ throw new Error(`could not start the browser: ${message}`);
98
+ }
99
+ backend = b;
100
+ return b;
101
+ }
102
+ const ensure = () => disposed
103
+ ? Promise.reject(new Error("the browser was shut down"))
104
+ : backend
105
+ ? Promise.resolve(backend)
106
+ : (starting ??= start().finally(() => (starting = undefined)));
107
+ function mount(b) {
108
+ for (const info of infos) {
109
+ tools.register({
110
+ name: info.name,
111
+ description: info.description,
112
+ inputSchema: info.inputSchema,
113
+ async execute(input) {
114
+ const out = clipResult(mcpResultText(await b.callTool(info.name, input)));
115
+ if (info.name === "browser_close")
116
+ await shut();
117
+ return out;
118
+ },
119
+ });
120
+ mounted.push(info.name);
94
121
  }
95
122
  }
96
123
  const openTool = {
97
124
  name: "browser_open",
98
- description: "Open a Chrome window the user can see (or reuse the open one) and go to `url` (a blank page if omitted). Afterwards the browser_* tools (navigate, snapshot, click, type, fill_form, …) are available. Use it for clicking, forms, logins, or pages rendered by JavaScript; use web_fetch to just read a page.",
125
+ description: "Open a Chrome browser the user can watch (or reuse the open one) and go to `url` if given. Afterwards the browser_* tools (navigate, snapshot, click, type, fill_form, …) are available. Use it for clicking, forms, logins, or pages rendered by JavaScript; use web_fetch to just read a page.",
99
126
  inputSchema: {
100
127
  type: "object",
101
- properties: { url: { type: "string", description: "Page to open; omit for a blank page" } },
128
+ properties: { url: { type: "string", description: "Page to open; omit to stay on the current page" } },
102
129
  additionalProperties: false,
103
130
  },
104
131
  async execute(input) {
105
- const wasOpen = backend !== undefined;
106
- const b = backend ?? (await (opening ??= start().finally(() => (opening = undefined))));
132
+ const wasRunning = backend !== undefined;
133
+ const b = await ensure();
134
+ if (mounted.length === 0)
135
+ mount(b);
107
136
  const url = input?.url;
108
- const target = typeof url === "string" && url ? url : wasOpen ? undefined : "about:blank";
109
- let page = "";
110
- if (target) {
111
- try {
112
- page = mcpResultText(await b.callTool("browser_navigate", { url: target }));
113
- }
114
- catch (err) {
115
- if (wasOpen || !/already in use/i.test(err instanceof Error ? err.message : String(err)))
116
- throw err;
117
- await shut();
118
- throw new Error(`the browser profile ${path.join(o.homeDir, ".tah", "browser-profile")} is in use by another tah — close that tah (or its browser) and try again`);
119
- }
120
- }
121
- return { opened: !wasOpen, tools: [...mounted], page: clipResult(page) };
137
+ const page = typeof url === "string" && url ? mcpResultText(await b.callTool("browser_navigate", { url })) : "";
138
+ return { opened: !wasRunning, tools: [...mounted], page: clipResult(page) };
122
139
  },
123
140
  };
124
141
  return {
@@ -129,10 +146,35 @@ export function createBrowser(o) {
129
146
  tools.register(openTool);
130
147
  },
131
148
  async dispose() {
149
+ disposed = true;
150
+ await starting?.catch(() => { });
132
151
  await shut();
133
152
  },
134
153
  },
135
- isOpen: () => backend !== undefined,
154
+ agentAttached: () => mounted.length > 0,
155
+ running: () => backend !== undefined,
156
+ async launch() {
157
+ const wasRunning = backend !== undefined;
158
+ const b = await ensure();
159
+ // Playwright MCP relaunches a Chrome that crashed or was closed only on its next tool call.
160
+ if (wasRunning)
161
+ mcpResultText(await b.callTool("browser_tabs", { action: "list" }));
162
+ },
163
+ cdpPort() {
164
+ if (!backend)
165
+ return undefined;
166
+ try {
167
+ const port = Number(readFileSync(path.join(profileDir(o.homeDir), "DevToolsActivePort"), "utf8").split("\n")[0]);
168
+ return Number.isInteger(port) && port > 0 ? port : undefined;
169
+ }
170
+ catch {
171
+ return undefined;
172
+ }
173
+ },
174
+ async close() {
175
+ await starting?.catch(() => { });
176
+ await shut();
177
+ },
136
178
  };
137
179
  }
138
180
  //# sourceMappingURL=browser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
package/dist/host.d.ts CHANGED
@@ -2,7 +2,9 @@ import type { ChatMessage } from "@typescript-agent-harness/llm";
2
2
  import type { ApprovalAnswer, ApprovalPluginOptions } from "@typescript-agent-harness/permissions";
3
3
  import type { Todo } from "@typescript-agent-harness/tools";
4
4
  import type { CliFlags } from "./args.js";
5
+ import { type AskUser, type Question } from "./ask-user.js";
5
6
  import { type AttachmentMeta, type AttachmentRef } from "./attachments/store.js";
7
+ import type { Browser } from "./browser.js";
6
8
  import { type SessionFlag } from "./session-flags.js";
7
9
  import { type SessionRow } from "./sessions.js";
8
10
  export type HistoryItem = {
@@ -64,6 +66,13 @@ export type HostEvent = SessionEvent | {
64
66
  type: "approval.end";
65
67
  id: string;
66
68
  answer: ApprovalAnswer;
69
+ } | {
70
+ type: "question";
71
+ id: string;
72
+ questions: Question[];
73
+ } | {
74
+ type: "question.end";
75
+ id: string;
67
76
  } | {
68
77
  type: "notice";
69
78
  text: string;
@@ -82,6 +91,8 @@ export type HostEvent = SessionEvent | {
82
91
  export type ChatHost = {
83
92
  readonly sessionId: string;
84
93
  readonly approve: boolean;
94
+ /** The open folder's built-in browser (undefined when it is off); a reload replaces it. */
95
+ readonly browser: Browser | undefined;
85
96
  on(listener: (event: HostEvent) => void): () => void;
86
97
  /** Emits the startup notices and the first `session` event; call after subscribing. */
87
98
  open(): Promise<void>;
@@ -100,6 +111,10 @@ export type ChatHost = {
100
111
  compact(): Promise<void>;
101
112
  cancel(): void;
102
113
  answer(id: string, answer: ApprovalAnswer): void;
114
+ /** Answers an `ask_user` card: one list per question (picked options and / or typed text). */
115
+ answerQuestion(id: string, answers: string[][]): void;
116
+ /** Dismisses an `ask_user` card: the questions are shown as text and the turn ends. */
117
+ skipQuestion(id: string): void;
103
118
  reset(): Promise<void>;
104
119
  resume(ref: string): Promise<void>;
105
120
  fork(turns?: number): Promise<void>;
@@ -132,6 +147,13 @@ export declare function approvalQueue(emit: (event: HostEvent) => void): {
132
147
  answer(id: string, answer: ApprovalAnswer): void;
133
148
  rejectAll(): void;
134
149
  };
150
+ /** Like `approvalQueue` for `ask_user`: a stopped turn settles with no answers; each settle emits `question.end`. */
151
+ export declare function questionQueue(emit: (event: HostEvent) => void): {
152
+ ask: AskUser;
153
+ answer(id: string, answers: string[][]): void;
154
+ skip(id: string): void;
155
+ rejectAll(): void;
156
+ };
135
157
  /** "always" outlives a reload: the approval plugin's own memory goes away with its runtime. */
136
158
  export declare function rememberAlways(ask: ApprovalPluginOptions["ask"]): ApprovalPluginOptions["ask"];
137
159
  /** `historyTurns`: how many recent turns `session` events carry (default 3, for a terminal). */
@@ -1 +1 @@
1
- {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"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"}