@hasna/browser 0.4.2 → 0.4.3

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/dist/cli/index.js CHANGED
@@ -12719,6 +12719,13 @@ async function launchTui(command, options = {}) {
12719
12719
  if (viewport2)
12720
12720
  viewport2.style.backgroundColor = theme.background;
12721
12721
  }, themeColors);
12722
+ if (options.fontSize) {
12723
+ await page.evaluate((size) => {
12724
+ const term = window.term ?? window.terminal;
12725
+ if (term?.options)
12726
+ term.options.fontSize = size;
12727
+ }, options.fontSize);
12728
+ }
12722
12729
  return { ttydProcess, port, browser, page, theme: resolvedTheme };
12723
12730
  } catch (err) {
12724
12731
  ttydProcess.kill();
@@ -14224,7 +14231,8 @@ async function createSession2(opts = {}) {
14224
14231
  const tuiSess = await launchTui(command, {
14225
14232
  headless: opts.headless ?? true,
14226
14233
  viewport: opts.viewport,
14227
- theme: opts.tuiTheme ?? "system"
14234
+ theme: opts.tuiTheme ?? "system",
14235
+ fontSize: opts.tuiFontSize
14228
14236
  });
14229
14237
  browser = tuiSess.browser;
14230
14238
  page = tuiSess.page;
@@ -27681,8 +27689,9 @@ TIPS:
27681
27689
  force_new: exports_external2.boolean().optional().default(false).describe("Force create a new session even if agent already has one"),
27682
27690
  tags: exports_external2.array(exports_external2.string()).optional(),
27683
27691
  cdp_url: exports_external2.string().optional().describe("Connect to existing Chrome via CDP (e.g. http://localhost:9222). Start Chrome with --remote-debugging-port=9222"),
27684
- tui_theme: exports_external2.enum(["dark", "light", "system"]).optional().default("system").describe("TUI engine only: terminal color theme. 'system' auto-detects OS dark/light mode. Choose 'light' for light backgrounds or 'dark' for dark backgrounds. AI agents should pick based on readability needs.")
27685
- }, async ({ engine, use_case, project_id, agent_id, start_url, headless, viewport_width, viewport_height, stealth, auto_gallery, storage_state, force_new, tags, cdp_url, tui_theme }) => {
27692
+ tui_theme: exports_external2.enum(["dark", "light", "system"]).optional().default("system").describe("TUI engine only: terminal color theme. 'system' auto-detects OS dark/light mode. Choose 'light' for light backgrounds or 'dark' for dark backgrounds."),
27693
+ tui_font_size: exports_external2.number().optional().default(14).describe("TUI engine only: terminal font size in pixels (default: 14). Larger = more readable screenshots, smaller = more content visible.")
27694
+ }, async ({ engine, use_case, project_id, agent_id, start_url, headless, viewport_width, viewport_height, stealth, auto_gallery, storage_state, force_new, tags, cdp_url, tui_theme, tui_font_size }) => {
27686
27695
  try {
27687
27696
  if (agent_id && !force_new) {
27688
27697
  const existing = getActiveSessionForAgent2(agent_id);
@@ -27701,7 +27710,8 @@ TIPS:
27701
27710
  autoGallery: auto_gallery,
27702
27711
  storageState: storage_state,
27703
27712
  cdpUrl: cdp_url,
27704
- tuiTheme: tui_theme
27713
+ tuiTheme: tui_theme,
27714
+ tuiFontSize: tui_font_size
27705
27715
  });
27706
27716
  if (tags?.length) {
27707
27717
  const { addSessionTag: addSessionTag2 } = await Promise.resolve().then(() => (init_sessions(), exports_sessions));
@@ -48267,6 +48277,18 @@ function register10(server) {
48267
48277
  { tool: "browser_tab_switch", description: "Switch to a tab by index" },
48268
48278
  { tool: "browser_tab_close", description: "Close a tab by index" }
48269
48279
  ],
48280
+ TUI: [
48281
+ { tool: "browser_tui_send_keys", description: "Send keystrokes (ctrl+c, arrow_up, tab, enter, etc.)" },
48282
+ { tool: "browser_tui_send_text", description: "Type text + optional Enter (most common TUI interaction)" },
48283
+ { tool: "browser_tui_resize", description: "Resize terminal cols/rows mid-session" },
48284
+ { tool: "browser_tui_get_text", description: "Get terminal text buffer (full or row range)" },
48285
+ { tool: "browser_tui_wait_for_text", description: "Wait for text to appear in terminal output" },
48286
+ { tool: "browser_tui_get_cursor", description: "Get cursor position (row, col)" },
48287
+ { tool: "browser_tui_assert", description: "Assert terminal conditions (text contains, row N contains, cursor at)" },
48288
+ { tool: "browser_tui_snapshot", description: "Structured terminal snapshot (rows array, cursor, dimensions)" },
48289
+ { tool: "browser_tui_record_start", description: "Start recording terminal as asciicast" },
48290
+ { tool: "browser_tui_record_stop", description: "Stop recording, return asciicast v2 JSON" }
48291
+ ],
48270
48292
  Meta: [
48271
48293
  { tool: "browser_check", description: "RECOMMENDED: One-call page summary with diagnostics" },
48272
48294
  { tool: "browser_version", description: "Show running binary version and tool count" },
@@ -48679,6 +48701,412 @@ var init_data = __esm(() => {
48679
48701
  init_meta();
48680
48702
  });
48681
48703
 
48704
+ // src/mcp/tui.ts
48705
+ function assertTuiSession(sessionId) {
48706
+ const { getSessionEngine: getSessionEngine2 } = (init_session(), __toCommonJS(exports_session));
48707
+ const engine = getSessionEngine2(sessionId);
48708
+ if (engine !== "tui") {
48709
+ throw new Error(`browser_tui_* tools require a TUI session (engine="tui"), but this session uses engine="${engine}". Create a TUI session with: browser_session_create(engine="tui", start_url="your-command")`);
48710
+ }
48711
+ }
48712
+ async function getTermText(page, startRow, endRow) {
48713
+ const result = await page.evaluate((args) => {
48714
+ const [sr, er] = args;
48715
+ const term = window.term ?? window.terminal;
48716
+ if (!term?.buffer?.active)
48717
+ return { text: "", rows: [], row_count: 0 };
48718
+ const buf = term.buffer.active;
48719
+ const allRows = [];
48720
+ for (let i = 0;i < buf.length; i++) {
48721
+ const line = buf.getLine(i);
48722
+ if (line)
48723
+ allRows.push(line.translateToString(true));
48724
+ }
48725
+ const start = sr ?? 0;
48726
+ const end = er ?? allRows.length;
48727
+ const filtered = allRows.slice(start, end);
48728
+ return { text: filtered.join(`
48729
+ `).trimEnd(), rows: filtered, row_count: allRows.length };
48730
+ }, [startRow, endRow]);
48731
+ return result;
48732
+ }
48733
+ function register12(server) {
48734
+ server.tool("browser_tui_send_keys", `Send keystrokes to a TUI terminal session. Use friendly key names.
48735
+
48736
+ SUPPORTED KEYS:
48737
+ - Control: ctrl+c, ctrl+d, ctrl+z, ctrl+l, ctrl+a, ctrl+e, ctrl+k, ctrl+u, ctrl+w, ctrl+r
48738
+ - Navigation: enter, tab, escape, backspace, delete, space
48739
+ - Arrows: up, down, left, right (or arrow_up, arrow_down, arrow_left, arrow_right)
48740
+ - Function: f1-f12
48741
+ - Position: home, end, page_up, page_down
48742
+
48743
+ Pass multiple keys as a comma-separated string: "tab,tab,enter" or "ctrl+c"
48744
+ For typing text, use browser_tui_send_text instead.`, {
48745
+ session_id: exports_external2.string().optional(),
48746
+ keys: exports_external2.string().describe("Comma-separated key names: 'enter', 'ctrl+c', 'tab,tab,enter', 'arrow_down,arrow_down,enter'")
48747
+ }, async ({ session_id, keys }) => {
48748
+ try {
48749
+ const sid = resolveSessionId(session_id);
48750
+ assertTuiSession(sid);
48751
+ const page = getSessionPage(sid);
48752
+ const keyList = keys.split(",").map((k) => k.trim().toLowerCase());
48753
+ const sent = [];
48754
+ for (const key of keyList) {
48755
+ const mapped = KEY_MAP[key];
48756
+ if (mapped) {
48757
+ if (mapped.length === 1 && mapped.charCodeAt(0) < 32) {
48758
+ await page.keyboard.insertText(mapped);
48759
+ } else {
48760
+ await page.keyboard.press(mapped);
48761
+ }
48762
+ sent.push(key);
48763
+ } else {
48764
+ await page.keyboard.press(key);
48765
+ sent.push(key);
48766
+ }
48767
+ }
48768
+ return json({ sent, count: sent.length });
48769
+ } catch (e) {
48770
+ return err(e);
48771
+ }
48772
+ });
48773
+ server.tool("browser_tui_send_text", `Type text into a TUI terminal and optionally press Enter. This is the most common way to interact with terminal apps.
48774
+
48775
+ Examples:
48776
+ - Send a command: text="ls -la", press_enter=true
48777
+ - Type without executing: text="partial input", press_enter=false
48778
+ - Send to a prompt: text="yes", press_enter=true`, {
48779
+ session_id: exports_external2.string().optional(),
48780
+ text: exports_external2.string().describe("Text to type into the terminal"),
48781
+ press_enter: exports_external2.boolean().optional().default(true).describe("Press Enter after typing (default: true)")
48782
+ }, async ({ session_id, text, press_enter }) => {
48783
+ try {
48784
+ const sid = resolveSessionId(session_id);
48785
+ assertTuiSession(sid);
48786
+ const page = getSessionPage(sid);
48787
+ const textarea = await page.$(".xterm-helper-textarea");
48788
+ if (textarea) {
48789
+ await textarea.type(text);
48790
+ } else {
48791
+ await page.keyboard.type(text);
48792
+ }
48793
+ if (press_enter) {
48794
+ await page.keyboard.press("Enter");
48795
+ }
48796
+ return json({ typed: text, pressed_enter: press_enter });
48797
+ } catch (e) {
48798
+ return err(e);
48799
+ }
48800
+ });
48801
+ server.tool("browser_tui_resize", "Resize the terminal to a specific number of columns and rows. Useful for testing responsive TUI layouts at different terminal sizes.", {
48802
+ session_id: exports_external2.string().optional(),
48803
+ cols: exports_external2.number().describe("Number of columns (e.g. 80, 120, 200)"),
48804
+ rows: exports_external2.number().describe("Number of rows (e.g. 24, 40, 50)")
48805
+ }, async ({ session_id, cols, rows }) => {
48806
+ try {
48807
+ const sid = resolveSessionId(session_id);
48808
+ assertTuiSession(sid);
48809
+ const page = getSessionPage(sid);
48810
+ const result = await page.evaluate((args) => {
48811
+ const [c, r] = args;
48812
+ const term = window.term ?? window.terminal;
48813
+ if (!term)
48814
+ return { resized: false, error: "No terminal instance found" };
48815
+ term.resize(c, r);
48816
+ return { resized: true, cols: c, rows: r };
48817
+ }, [cols, rows]);
48818
+ return json(result);
48819
+ } catch (e) {
48820
+ return err(e);
48821
+ }
48822
+ });
48823
+ server.tool("browser_tui_get_text", `Get the text content from the terminal buffer. Returns all visible text, or a specific row range.
48824
+
48825
+ Use this to read what the terminal is currently displaying. For waiting until specific text appears, use browser_tui_wait_for_text instead.`, {
48826
+ session_id: exports_external2.string().optional(),
48827
+ start_row: exports_external2.number().optional().describe("First row to read (0-indexed, default: 0)"),
48828
+ end_row: exports_external2.number().optional().describe("Last row (exclusive). Omit for all rows.")
48829
+ }, async ({ session_id, start_row, end_row }) => {
48830
+ try {
48831
+ const sid = resolveSessionId(session_id);
48832
+ assertTuiSession(sid);
48833
+ const page = getSessionPage(sid);
48834
+ const result = await getTermText(page, start_row, end_row);
48835
+ return json(result);
48836
+ } catch (e) {
48837
+ return err(e);
48838
+ }
48839
+ });
48840
+ server.tool("browser_tui_wait_for_text", `Wait for specific text to appear in the terminal output. Polls the terminal buffer until the text is found or timeout is reached.
48841
+
48842
+ Use this after sending a command to wait for its output, or to wait for a TUI app to finish loading.`, {
48843
+ session_id: exports_external2.string().optional(),
48844
+ text: exports_external2.string().describe("Text to wait for (substring match)"),
48845
+ timeout_ms: exports_external2.number().optional().default(30000).describe("Timeout in milliseconds (default: 30000)")
48846
+ }, async ({ session_id, text, timeout_ms }) => {
48847
+ try {
48848
+ const sid = resolveSessionId(session_id);
48849
+ assertTuiSession(sid);
48850
+ const page = getSessionPage(sid);
48851
+ const start = Date.now();
48852
+ while (Date.now() - start < timeout_ms) {
48853
+ const result = await getTermText(page);
48854
+ if (result.text.includes(text)) {
48855
+ return json({ found: true, elapsed_ms: Date.now() - start, terminal_text: result.text });
48856
+ }
48857
+ await new Promise((r) => setTimeout(r, 250));
48858
+ }
48859
+ const finalText = await getTermText(page);
48860
+ return json({ found: false, elapsed_ms: timeout_ms, terminal_text: finalText.text });
48861
+ } catch (e) {
48862
+ return err(e);
48863
+ }
48864
+ });
48865
+ server.tool("browser_tui_get_cursor", "Get the current cursor position (row and column) in the terminal.", {
48866
+ session_id: exports_external2.string().optional()
48867
+ }, async ({ session_id }) => {
48868
+ try {
48869
+ const sid = resolveSessionId(session_id);
48870
+ assertTuiSession(sid);
48871
+ const page = getSessionPage(sid);
48872
+ const cursor = await page.evaluate(() => {
48873
+ const term = window.term ?? window.terminal;
48874
+ if (!term?.buffer?.active)
48875
+ return null;
48876
+ return { row: term.buffer.active.cursorY, col: term.buffer.active.cursorX };
48877
+ });
48878
+ if (!cursor)
48879
+ return err(new Error("Could not read cursor position \u2014 no terminal instance"));
48880
+ return json(cursor);
48881
+ } catch (e) {
48882
+ return err(e);
48883
+ }
48884
+ });
48885
+ server.tool("browser_tui_assert", `Assert conditions on the terminal state. Chain multiple conditions with AND.
48886
+
48887
+ CONDITION SYNTAX:
48888
+ - "text contains X" \u2014 terminal buffer contains substring X
48889
+ - "row N contains X" \u2014 row N (0-indexed) contains substring X
48890
+ - "cursor at R,C" \u2014 cursor is at row R, column C
48891
+ - "row_count > N" \u2014 total rows greater than N
48892
+ - "row_count == N" \u2014 total rows equals N
48893
+
48894
+ Example: "text contains hello AND row 0 contains $ AND cursor at 1,0"`, {
48895
+ session_id: exports_external2.string().optional(),
48896
+ condition: exports_external2.string().describe("Assertion condition(s), joined with AND")
48897
+ }, async ({ session_id, condition }) => {
48898
+ try {
48899
+ const sid = resolveSessionId(session_id);
48900
+ assertTuiSession(sid);
48901
+ const page = getSessionPage(sid);
48902
+ const termData = await getTermText(page);
48903
+ const cursor = await page.evaluate(() => {
48904
+ const term = window.term ?? window.terminal;
48905
+ if (!term?.buffer?.active)
48906
+ return { row: -1, col: -1 };
48907
+ return { row: term.buffer.active.cursorY, col: term.buffer.active.cursorX };
48908
+ });
48909
+ const checks = [];
48910
+ let allPassed = true;
48911
+ for (const part of condition.split(/\s+AND\s+/i)) {
48912
+ const trimmed = part.trim();
48913
+ let result = false;
48914
+ if (/^text\s+contains\s+/i.test(trimmed)) {
48915
+ const needle = trimmed.replace(/^text\s+contains\s+/i, "").replace(/^["']|["']$/g, "");
48916
+ result = termData.text.includes(needle);
48917
+ } else if (/^row\s+(\d+)\s+contains\s+/i.test(trimmed)) {
48918
+ const match = trimmed.match(/^row\s+(\d+)\s+contains\s+(.+)/i);
48919
+ if (match) {
48920
+ const rowIdx = parseInt(match[1]);
48921
+ const needle = match[2].replace(/^["']|["']$/g, "");
48922
+ result = (termData.rows[rowIdx] ?? "").includes(needle);
48923
+ }
48924
+ } else if (/^cursor\s+at\s+(\d+)\s*,\s*(\d+)/i.test(trimmed)) {
48925
+ const match = trimmed.match(/^cursor\s+at\s+(\d+)\s*,\s*(\d+)/i);
48926
+ if (match) {
48927
+ result = cursor.row === parseInt(match[1]) && cursor.col === parseInt(match[2]);
48928
+ }
48929
+ } else if (/^row_count\s*(>|>=|<|<=|==|!=)\s*(\d+)/i.test(trimmed)) {
48930
+ const match = trimmed.match(/^row_count\s*(>|>=|<|<=|==|!=)\s*(\d+)/i);
48931
+ if (match) {
48932
+ const op = match[1];
48933
+ const n = parseInt(match[2]);
48934
+ const count = termData.row_count;
48935
+ result = op === ">" ? count > n : op === ">=" ? count >= n : op === "<" ? count < n : op === "<=" ? count <= n : op === "==" ? count === n : count !== n;
48936
+ }
48937
+ }
48938
+ checks.push({ assertion: trimmed, result });
48939
+ if (!result)
48940
+ allPassed = false;
48941
+ }
48942
+ return json({ passed: allPassed, checks, cursor, row_count: termData.row_count });
48943
+ } catch (e) {
48944
+ return err(e);
48945
+ }
48946
+ });
48947
+ server.tool("browser_tui_snapshot", "Capture a structured snapshot of the terminal buffer: all rows as an array, cursor position, dimensions, and theme. Useful for comparing terminal state before and after actions.", {
48948
+ session_id: exports_external2.string().optional()
48949
+ }, async ({ session_id }) => {
48950
+ try {
48951
+ const sid = resolveSessionId(session_id);
48952
+ assertTuiSession(sid);
48953
+ const page = getSessionPage(sid);
48954
+ const snapshot = await page.evaluate(() => {
48955
+ const term = window.term ?? window.terminal;
48956
+ if (!term?.buffer?.active)
48957
+ return null;
48958
+ const buf = term.buffer.active;
48959
+ const rows = [];
48960
+ for (let i = 0;i < buf.length; i++) {
48961
+ const line = buf.getLine(i);
48962
+ if (line)
48963
+ rows.push(line.translateToString(true));
48964
+ }
48965
+ return {
48966
+ rows,
48967
+ cols: term.cols,
48968
+ total_rows: term.rows,
48969
+ buffer_length: buf.length,
48970
+ cursor_row: buf.cursorY,
48971
+ cursor_col: buf.cursorX,
48972
+ font_size: term.options?.fontSize,
48973
+ theme: term.options?.theme?.background === "#ffffff" ? "light" : "dark"
48974
+ };
48975
+ });
48976
+ if (!snapshot)
48977
+ return err(new Error("Could not capture snapshot \u2014 no terminal instance"));
48978
+ return json(snapshot);
48979
+ } catch (e) {
48980
+ return err(e);
48981
+ }
48982
+ });
48983
+ server.tool("browser_tui_record_start", "Start recording the terminal session as an asciicast v2 file (asciinema-compatible). Polls the terminal buffer at an interval and captures changes.", {
48984
+ session_id: exports_external2.string().optional(),
48985
+ interval_ms: exports_external2.number().optional().default(500).describe("Polling interval in ms (default: 500)")
48986
+ }, async ({ session_id, interval_ms }) => {
48987
+ try {
48988
+ const sid = resolveSessionId(session_id);
48989
+ assertTuiSession(sid);
48990
+ const page = getSessionPage(sid);
48991
+ if (activeRecordings2.has(sid)) {
48992
+ return err(new Error("Recording already active for this session. Stop it first with browser_tui_record_stop."));
48993
+ }
48994
+ const dims = await page.evaluate(() => {
48995
+ const term = window.term ?? window.terminal;
48996
+ return term ? { cols: term.cols, rows: term.rows } : { cols: 80, rows: 24 };
48997
+ });
48998
+ const initialText = (await getTermText(page)).text;
48999
+ const recording = {
49000
+ sessionId: sid,
49001
+ startTime: Date.now(),
49002
+ cols: dims.cols,
49003
+ rows: dims.rows,
49004
+ events: [],
49005
+ lastText: initialText,
49006
+ intervalId: setInterval(async () => {
49007
+ try {
49008
+ const current = await getTermText(page);
49009
+ if (current.text !== recording.lastText) {
49010
+ const elapsed = (Date.now() - recording.startTime) / 1000;
49011
+ recording.events.push([elapsed, "o", current.text.slice(recording.lastText.length) || current.text]);
49012
+ recording.lastText = current.text;
49013
+ }
49014
+ } catch {}
49015
+ }, interval_ms)
49016
+ };
49017
+ activeRecordings2.set(sid, recording);
49018
+ return json({ recording: true, session_id: sid, interval_ms, cols: dims.cols, rows: dims.rows });
49019
+ } catch (e) {
49020
+ return err(e);
49021
+ }
49022
+ });
49023
+ server.tool("browser_tui_record_stop", "Stop recording and return the asciicast v2 JSON. Compatible with asciinema player.", {
49024
+ session_id: exports_external2.string().optional()
49025
+ }, async ({ session_id }) => {
49026
+ try {
49027
+ const sid = resolveSessionId(session_id);
49028
+ const recording = activeRecordings2.get(sid);
49029
+ if (!recording)
49030
+ return err(new Error("No active recording for this session"));
49031
+ clearInterval(recording.intervalId);
49032
+ activeRecordings2.delete(sid);
49033
+ const duration = (Date.now() - recording.startTime) / 1000;
49034
+ const header = {
49035
+ version: 2,
49036
+ width: recording.cols,
49037
+ height: recording.rows,
49038
+ timestamp: Math.floor(recording.startTime / 1000),
49039
+ duration,
49040
+ env: { TERM: "xterm-256color", SHELL: "/bin/bash" }
49041
+ };
49042
+ const lines = [JSON.stringify(header)];
49043
+ for (const [time, type2, data] of recording.events) {
49044
+ lines.push(JSON.stringify([time, type2, data]));
49045
+ }
49046
+ const asciicast = lines.join(`
49047
+ `);
49048
+ return json({
49049
+ format: "asciicast_v2",
49050
+ duration_seconds: Math.round(duration * 10) / 10,
49051
+ event_count: recording.events.length,
49052
+ asciicast
49053
+ });
49054
+ } catch (e) {
49055
+ return err(e);
49056
+ }
49057
+ });
49058
+ }
49059
+ var KEY_MAP, activeRecordings2;
49060
+ var init_tui2 = __esm(() => {
49061
+ init_helpers();
49062
+ KEY_MAP = {
49063
+ "ctrl+c": "\x03",
49064
+ "ctrl+d": "\x04",
49065
+ "ctrl+z": "\x1A",
49066
+ "ctrl+l": "\f",
49067
+ "ctrl+a": "\x01",
49068
+ "ctrl+e": "\x05",
49069
+ "ctrl+k": "\v",
49070
+ "ctrl+u": "\x15",
49071
+ "ctrl+w": "\x17",
49072
+ "ctrl+r": "\x12",
49073
+ "ctrl+p": "\x10",
49074
+ "ctrl+n": "\x0E",
49075
+ enter: "Enter",
49076
+ tab: "Tab",
49077
+ escape: "Escape",
49078
+ esc: "Escape",
49079
+ backspace: "Backspace",
49080
+ delete: "Delete",
49081
+ space: " ",
49082
+ up: "ArrowUp",
49083
+ down: "ArrowDown",
49084
+ left: "ArrowLeft",
49085
+ right: "ArrowRight",
49086
+ arrow_up: "ArrowUp",
49087
+ arrow_down: "ArrowDown",
49088
+ arrow_left: "ArrowLeft",
49089
+ arrow_right: "ArrowRight",
49090
+ home: "Home",
49091
+ end: "End",
49092
+ page_up: "PageUp",
49093
+ page_down: "PageDown",
49094
+ f1: "F1",
49095
+ f2: "F2",
49096
+ f3: "F3",
49097
+ f4: "F4",
49098
+ f5: "F5",
49099
+ f6: "F6",
49100
+ f7: "F7",
49101
+ f8: "F8",
49102
+ f9: "F9",
49103
+ f10: "F10",
49104
+ f11: "F11",
49105
+ f12: "F12"
49106
+ };
49107
+ activeRecordings2 = new Map;
49108
+ });
49109
+
48682
49110
  // src/mcp/index.ts
48683
49111
  var exports_mcp = {};
48684
49112
  import { McpServer as McpServer2 } from "@modelcontextprotocol/sdk/server/mcp.js";
@@ -48692,6 +49120,7 @@ var init_mcp = __esm(async () => {
48692
49120
  init_capture();
48693
49121
  init_network2();
48694
49122
  init_data();
49123
+ init_tui2();
48695
49124
  init_zod2();
48696
49125
  init_schema();
48697
49126
  _pkg = JSON.parse(readFileSync10(join21(import.meta.dir, "../../package.json"), "utf8"));
@@ -48704,6 +49133,7 @@ var init_mcp = __esm(async () => {
48704
49133
  register6(server);
48705
49134
  register7(server);
48706
49135
  register11(server);
49136
+ register12(server);
48707
49137
  server.tool("send_feedback", "Send feedback about this service", { message: exports_external2.string(), email: exports_external2.string().optional(), category: exports_external2.enum(["bug", "feature", "general"]).optional() }, async (params) => {
48708
49138
  try {
48709
49139
  const db2 = getDatabase();
@@ -49533,7 +49963,7 @@ init_recorder();
49533
49963
  init_recordings();
49534
49964
  init_lightpanda();
49535
49965
  import chalk4 from "chalk";
49536
- function register12(program2) {
49966
+ function register13(program2) {
49537
49967
  const recordCmd = program2.command("record").description("Manage action recordings");
49538
49968
  recordCmd.command("start <name>").description("Start recording actions in a new session").option("--url <url>", "Start URL").option("--engine <engine>", "Browser engine", "auto").option("--headed", "Run in headed (visible) mode").action(async (name, opts) => {
49539
49969
  const { session } = await createSession2({ engine: opts.engine, startUrl: opts.url, headless: !opts.headed });
@@ -49938,5 +50368,5 @@ program2.name("browser").description("@hasna/browser \u2014 general-purpose brow
49938
50368
  register(program2);
49939
50369
  register2(program2);
49940
50370
  register3(program2);
49941
- register12(program2);
50371
+ register13(program2);
49942
50372
  program2.parseAsync(process.argv);
@@ -26,6 +26,7 @@ export declare function launchTui(command: string, options?: {
26
26
  height: number;
27
27
  };
28
28
  theme?: TuiTheme;
29
+ fontSize?: number;
29
30
  }): Promise<TuiSession>;
30
31
  /**
31
32
  * Send keystrokes to the TUI app via the Playwright page.
@@ -1 +1 @@
1
- {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/engines/tui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAYhD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEnD,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,YAAY,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,QAAQ,CAAC;CACjB;AAkDD;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAOxC;AAqCD;;;;;;GAMG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,KAAK,CAAC,EAAE,QAAQ,CAAC;CACb,GACL,OAAO,CAAC,UAAU,CAAC,CAuFrB;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAStE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO3E;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBjE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,MAAe,GACzB,OAAO,CAAC,OAAO,CAAC,CAQlB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAUjE"}
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/engines/tui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAYhD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEnD,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,YAAY,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,QAAQ,CAAC;CACjB;AAkDD;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAOxC;AAqCD;;;;;;GAMG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACd,GACL,OAAO,CAAC,UAAU,CAAC,CA+FrB;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAStE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO3E;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBjE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,MAAe,GACzB,OAAO,CAAC,OAAO,CAAC,CAQlB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAUjE"}
package/dist/index.js CHANGED
@@ -18493,6 +18493,13 @@ async function launchTui(command, options = {}) {
18493
18493
  if (viewport2)
18494
18494
  viewport2.style.backgroundColor = theme.background;
18495
18495
  }, themeColors);
18496
+ if (options.fontSize) {
18497
+ await page.evaluate((size) => {
18498
+ const term = window.term ?? window.terminal;
18499
+ if (term?.options)
18500
+ term.options.fontSize = size;
18501
+ }, options.fontSize);
18502
+ }
18496
18503
  return { ttydProcess, port, browser, page, theme: resolvedTheme };
18497
18504
  } catch (err) {
18498
18505
  ttydProcess.kill();
@@ -18917,7 +18924,8 @@ async function createSession2(opts = {}) {
18917
18924
  const tuiSess = await launchTui(command, {
18918
18925
  headless: opts.headless ?? true,
18919
18926
  viewport: opts.viewport,
18920
- theme: opts.tuiTheme ?? "system"
18927
+ theme: opts.tuiTheme ?? "system",
18928
+ fontSize: opts.tuiFontSize
18921
18929
  });
18922
18930
  browser = tuiSess.browser;
18923
18931
  page = tuiSess.page;
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/lib/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAW,MAAM,mBAAmB,CAAC;AAG3D,OAAO,EAA0F,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE/I,OAAO,EAAE,iBAAiB,EAAyB,MAAM,2BAA2B,CAAC;AAyBrF,QAAA,MAAM,IAAI,aAAqB,CAAC;AA2ChC,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,wBAAsB,aAAa,CAAC,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAkL3F;AAID,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAkBtD;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAE7E;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAK5D;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAIjE;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAIlE;AAED,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAuBtE;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,aAAa,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,EAAE,CAE/F;AAED,wBAAgB,iBAAiB,IAAI,OAAO,EAAE,CAE7C;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAKtD;AAED,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,CAAC;AAE/B,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,kBAE5C;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,WAErD;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAGxF;AAID,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAcpF;AAID,wBAAgB,iBAAiB,IAAI,mBAAmB,GAAG,IAAI,CAa9D;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/lib/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAW,MAAM,mBAAmB,CAAC;AAG3D,OAAO,EAA0F,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE/I,OAAO,EAAE,iBAAiB,EAAyB,MAAM,2BAA2B,CAAC;AAyBrF,QAAA,MAAM,IAAI,aAAqB,CAAC;AA2ChC,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,wBAAsB,aAAa,CAAC,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAmL3F;AAID,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAkBtD;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAE7E;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAK5D;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAIjE;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAIlE;AAED,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAuBtE;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,aAAa,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,EAAE,CAE/F;AAED,wBAAgB,iBAAiB,IAAI,OAAO,EAAE,CAE7C;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAKtD;AAED,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,CAAC;AAE/B,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,kBAE5C;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,WAErD;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAGxF;AAID,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAcpF;AAID,wBAAgB,iBAAiB,IAAI,mBAAmB,GAAG,IAAI,CAa9D;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
package/dist/mcp/index.js CHANGED
@@ -10685,6 +10685,13 @@ async function launchTui(command, options = {}) {
10685
10685
  if (viewport2)
10686
10686
  viewport2.style.backgroundColor = theme.background;
10687
10687
  }, themeColors);
10688
+ if (options.fontSize) {
10689
+ await page.evaluate((size) => {
10690
+ const term = window.term ?? window.terminal;
10691
+ if (term?.options)
10692
+ term.options.fontSize = size;
10693
+ }, options.fontSize);
10694
+ }
10688
10695
  return { ttydProcess, port, browser, page, theme: resolvedTheme };
10689
10696
  } catch (err) {
10690
10697
  ttydProcess.kill();
@@ -12186,7 +12193,8 @@ async function createSession2(opts = {}) {
12186
12193
  const tuiSess = await launchTui(command, {
12187
12194
  headless: opts.headless ?? true,
12188
12195
  viewport: opts.viewport,
12189
- theme: opts.tuiTheme ?? "system"
12196
+ theme: opts.tuiTheme ?? "system",
12197
+ fontSize: opts.tuiFontSize
12190
12198
  });
12191
12199
  browser = tuiSess.browser;
12192
12200
  page = tuiSess.page;
@@ -43919,8 +43927,9 @@ TIPS:
43919
43927
  force_new: exports_external.boolean().optional().default(false).describe("Force create a new session even if agent already has one"),
43920
43928
  tags: exports_external.array(exports_external.string()).optional(),
43921
43929
  cdp_url: exports_external.string().optional().describe("Connect to existing Chrome via CDP (e.g. http://localhost:9222). Start Chrome with --remote-debugging-port=9222"),
43922
- tui_theme: exports_external.enum(["dark", "light", "system"]).optional().default("system").describe("TUI engine only: terminal color theme. 'system' auto-detects OS dark/light mode. Choose 'light' for light backgrounds or 'dark' for dark backgrounds. AI agents should pick based on readability needs.")
43923
- }, async ({ engine, use_case, project_id, agent_id, start_url, headless, viewport_width, viewport_height, stealth, auto_gallery, storage_state, force_new, tags, cdp_url, tui_theme }) => {
43930
+ tui_theme: exports_external.enum(["dark", "light", "system"]).optional().default("system").describe("TUI engine only: terminal color theme. 'system' auto-detects OS dark/light mode. Choose 'light' for light backgrounds or 'dark' for dark backgrounds."),
43931
+ tui_font_size: exports_external.number().optional().default(14).describe("TUI engine only: terminal font size in pixels (default: 14). Larger = more readable screenshots, smaller = more content visible.")
43932
+ }, async ({ engine, use_case, project_id, agent_id, start_url, headless, viewport_width, viewport_height, stealth, auto_gallery, storage_state, force_new, tags, cdp_url, tui_theme, tui_font_size }) => {
43924
43933
  try {
43925
43934
  if (agent_id && !force_new) {
43926
43935
  const existing = getActiveSessionForAgent2(agent_id);
@@ -43939,7 +43948,8 @@ TIPS:
43939
43948
  autoGallery: auto_gallery,
43940
43949
  storageState: storage_state,
43941
43950
  cdpUrl: cdp_url,
43942
- tuiTheme: tui_theme
43951
+ tuiTheme: tui_theme,
43952
+ tuiFontSize: tui_font_size
43943
43953
  });
43944
43954
  if (tags?.length) {
43945
43955
  const { addSessionTag: addSessionTag2 } = await Promise.resolve().then(() => (init_sessions(), exports_sessions));
@@ -46118,6 +46128,18 @@ function register7(server) {
46118
46128
  { tool: "browser_tab_switch", description: "Switch to a tab by index" },
46119
46129
  { tool: "browser_tab_close", description: "Close a tab by index" }
46120
46130
  ],
46131
+ TUI: [
46132
+ { tool: "browser_tui_send_keys", description: "Send keystrokes (ctrl+c, arrow_up, tab, enter, etc.)" },
46133
+ { tool: "browser_tui_send_text", description: "Type text + optional Enter (most common TUI interaction)" },
46134
+ { tool: "browser_tui_resize", description: "Resize terminal cols/rows mid-session" },
46135
+ { tool: "browser_tui_get_text", description: "Get terminal text buffer (full or row range)" },
46136
+ { tool: "browser_tui_wait_for_text", description: "Wait for text to appear in terminal output" },
46137
+ { tool: "browser_tui_get_cursor", description: "Get cursor position (row, col)" },
46138
+ { tool: "browser_tui_assert", description: "Assert terminal conditions (text contains, row N contains, cursor at)" },
46139
+ { tool: "browser_tui_snapshot", description: "Structured terminal snapshot (rows array, cursor, dimensions)" },
46140
+ { tool: "browser_tui_record_start", description: "Start recording terminal as asciicast" },
46141
+ { tool: "browser_tui_record_stop", description: "Stop recording, return asciicast v2 JSON" }
46142
+ ],
46121
46143
  Meta: [
46122
46144
  { tool: "browser_check", description: "RECOMMENDED: One-call page summary with diagnostics" },
46123
46145
  { tool: "browser_version", description: "Show running binary version and tool count" },
@@ -46522,6 +46544,408 @@ function register8(server) {
46522
46544
  register7(server);
46523
46545
  }
46524
46546
 
46547
+ // src/mcp/tui.ts
46548
+ var KEY_MAP = {
46549
+ "ctrl+c": "\x03",
46550
+ "ctrl+d": "\x04",
46551
+ "ctrl+z": "\x1A",
46552
+ "ctrl+l": "\f",
46553
+ "ctrl+a": "\x01",
46554
+ "ctrl+e": "\x05",
46555
+ "ctrl+k": "\v",
46556
+ "ctrl+u": "\x15",
46557
+ "ctrl+w": "\x17",
46558
+ "ctrl+r": "\x12",
46559
+ "ctrl+p": "\x10",
46560
+ "ctrl+n": "\x0E",
46561
+ enter: "Enter",
46562
+ tab: "Tab",
46563
+ escape: "Escape",
46564
+ esc: "Escape",
46565
+ backspace: "Backspace",
46566
+ delete: "Delete",
46567
+ space: " ",
46568
+ up: "ArrowUp",
46569
+ down: "ArrowDown",
46570
+ left: "ArrowLeft",
46571
+ right: "ArrowRight",
46572
+ arrow_up: "ArrowUp",
46573
+ arrow_down: "ArrowDown",
46574
+ arrow_left: "ArrowLeft",
46575
+ arrow_right: "ArrowRight",
46576
+ home: "Home",
46577
+ end: "End",
46578
+ page_up: "PageUp",
46579
+ page_down: "PageDown",
46580
+ f1: "F1",
46581
+ f2: "F2",
46582
+ f3: "F3",
46583
+ f4: "F4",
46584
+ f5: "F5",
46585
+ f6: "F6",
46586
+ f7: "F7",
46587
+ f8: "F8",
46588
+ f9: "F9",
46589
+ f10: "F10",
46590
+ f11: "F11",
46591
+ f12: "F12"
46592
+ };
46593
+ function assertTuiSession(sessionId) {
46594
+ const { getSessionEngine: getSessionEngine2 } = (init_session(), __toCommonJS(exports_session));
46595
+ const engine = getSessionEngine2(sessionId);
46596
+ if (engine !== "tui") {
46597
+ throw new Error(`browser_tui_* tools require a TUI session (engine="tui"), but this session uses engine="${engine}". Create a TUI session with: browser_session_create(engine="tui", start_url="your-command")`);
46598
+ }
46599
+ }
46600
+ async function getTermText(page, startRow, endRow) {
46601
+ const result = await page.evaluate((args) => {
46602
+ const [sr, er] = args;
46603
+ const term = window.term ?? window.terminal;
46604
+ if (!term?.buffer?.active)
46605
+ return { text: "", rows: [], row_count: 0 };
46606
+ const buf = term.buffer.active;
46607
+ const allRows = [];
46608
+ for (let i = 0;i < buf.length; i++) {
46609
+ const line = buf.getLine(i);
46610
+ if (line)
46611
+ allRows.push(line.translateToString(true));
46612
+ }
46613
+ const start = sr ?? 0;
46614
+ const end = er ?? allRows.length;
46615
+ const filtered = allRows.slice(start, end);
46616
+ return { text: filtered.join(`
46617
+ `).trimEnd(), rows: filtered, row_count: allRows.length };
46618
+ }, [startRow, endRow]);
46619
+ return result;
46620
+ }
46621
+ var activeRecordings2 = new Map;
46622
+ function register9(server) {
46623
+ server.tool("browser_tui_send_keys", `Send keystrokes to a TUI terminal session. Use friendly key names.
46624
+
46625
+ SUPPORTED KEYS:
46626
+ - Control: ctrl+c, ctrl+d, ctrl+z, ctrl+l, ctrl+a, ctrl+e, ctrl+k, ctrl+u, ctrl+w, ctrl+r
46627
+ - Navigation: enter, tab, escape, backspace, delete, space
46628
+ - Arrows: up, down, left, right (or arrow_up, arrow_down, arrow_left, arrow_right)
46629
+ - Function: f1-f12
46630
+ - Position: home, end, page_up, page_down
46631
+
46632
+ Pass multiple keys as a comma-separated string: "tab,tab,enter" or "ctrl+c"
46633
+ For typing text, use browser_tui_send_text instead.`, {
46634
+ session_id: exports_external.string().optional(),
46635
+ keys: exports_external.string().describe("Comma-separated key names: 'enter', 'ctrl+c', 'tab,tab,enter', 'arrow_down,arrow_down,enter'")
46636
+ }, async ({ session_id, keys }) => {
46637
+ try {
46638
+ const sid = resolveSessionId(session_id);
46639
+ assertTuiSession(sid);
46640
+ const page = getSessionPage(sid);
46641
+ const keyList = keys.split(",").map((k) => k.trim().toLowerCase());
46642
+ const sent = [];
46643
+ for (const key of keyList) {
46644
+ const mapped = KEY_MAP[key];
46645
+ if (mapped) {
46646
+ if (mapped.length === 1 && mapped.charCodeAt(0) < 32) {
46647
+ await page.keyboard.insertText(mapped);
46648
+ } else {
46649
+ await page.keyboard.press(mapped);
46650
+ }
46651
+ sent.push(key);
46652
+ } else {
46653
+ await page.keyboard.press(key);
46654
+ sent.push(key);
46655
+ }
46656
+ }
46657
+ return json({ sent, count: sent.length });
46658
+ } catch (e) {
46659
+ return err(e);
46660
+ }
46661
+ });
46662
+ server.tool("browser_tui_send_text", `Type text into a TUI terminal and optionally press Enter. This is the most common way to interact with terminal apps.
46663
+
46664
+ Examples:
46665
+ - Send a command: text="ls -la", press_enter=true
46666
+ - Type without executing: text="partial input", press_enter=false
46667
+ - Send to a prompt: text="yes", press_enter=true`, {
46668
+ session_id: exports_external.string().optional(),
46669
+ text: exports_external.string().describe("Text to type into the terminal"),
46670
+ press_enter: exports_external.boolean().optional().default(true).describe("Press Enter after typing (default: true)")
46671
+ }, async ({ session_id, text, press_enter }) => {
46672
+ try {
46673
+ const sid = resolveSessionId(session_id);
46674
+ assertTuiSession(sid);
46675
+ const page = getSessionPage(sid);
46676
+ const textarea = await page.$(".xterm-helper-textarea");
46677
+ if (textarea) {
46678
+ await textarea.type(text);
46679
+ } else {
46680
+ await page.keyboard.type(text);
46681
+ }
46682
+ if (press_enter) {
46683
+ await page.keyboard.press("Enter");
46684
+ }
46685
+ return json({ typed: text, pressed_enter: press_enter });
46686
+ } catch (e) {
46687
+ return err(e);
46688
+ }
46689
+ });
46690
+ server.tool("browser_tui_resize", "Resize the terminal to a specific number of columns and rows. Useful for testing responsive TUI layouts at different terminal sizes.", {
46691
+ session_id: exports_external.string().optional(),
46692
+ cols: exports_external.number().describe("Number of columns (e.g. 80, 120, 200)"),
46693
+ rows: exports_external.number().describe("Number of rows (e.g. 24, 40, 50)")
46694
+ }, async ({ session_id, cols, rows }) => {
46695
+ try {
46696
+ const sid = resolveSessionId(session_id);
46697
+ assertTuiSession(sid);
46698
+ const page = getSessionPage(sid);
46699
+ const result = await page.evaluate((args) => {
46700
+ const [c, r] = args;
46701
+ const term = window.term ?? window.terminal;
46702
+ if (!term)
46703
+ return { resized: false, error: "No terminal instance found" };
46704
+ term.resize(c, r);
46705
+ return { resized: true, cols: c, rows: r };
46706
+ }, [cols, rows]);
46707
+ return json(result);
46708
+ } catch (e) {
46709
+ return err(e);
46710
+ }
46711
+ });
46712
+ server.tool("browser_tui_get_text", `Get the text content from the terminal buffer. Returns all visible text, or a specific row range.
46713
+
46714
+ Use this to read what the terminal is currently displaying. For waiting until specific text appears, use browser_tui_wait_for_text instead.`, {
46715
+ session_id: exports_external.string().optional(),
46716
+ start_row: exports_external.number().optional().describe("First row to read (0-indexed, default: 0)"),
46717
+ end_row: exports_external.number().optional().describe("Last row (exclusive). Omit for all rows.")
46718
+ }, async ({ session_id, start_row, end_row }) => {
46719
+ try {
46720
+ const sid = resolveSessionId(session_id);
46721
+ assertTuiSession(sid);
46722
+ const page = getSessionPage(sid);
46723
+ const result = await getTermText(page, start_row, end_row);
46724
+ return json(result);
46725
+ } catch (e) {
46726
+ return err(e);
46727
+ }
46728
+ });
46729
+ server.tool("browser_tui_wait_for_text", `Wait for specific text to appear in the terminal output. Polls the terminal buffer until the text is found or timeout is reached.
46730
+
46731
+ Use this after sending a command to wait for its output, or to wait for a TUI app to finish loading.`, {
46732
+ session_id: exports_external.string().optional(),
46733
+ text: exports_external.string().describe("Text to wait for (substring match)"),
46734
+ timeout_ms: exports_external.number().optional().default(30000).describe("Timeout in milliseconds (default: 30000)")
46735
+ }, async ({ session_id, text, timeout_ms }) => {
46736
+ try {
46737
+ const sid = resolveSessionId(session_id);
46738
+ assertTuiSession(sid);
46739
+ const page = getSessionPage(sid);
46740
+ const start = Date.now();
46741
+ while (Date.now() - start < timeout_ms) {
46742
+ const result = await getTermText(page);
46743
+ if (result.text.includes(text)) {
46744
+ return json({ found: true, elapsed_ms: Date.now() - start, terminal_text: result.text });
46745
+ }
46746
+ await new Promise((r) => setTimeout(r, 250));
46747
+ }
46748
+ const finalText = await getTermText(page);
46749
+ return json({ found: false, elapsed_ms: timeout_ms, terminal_text: finalText.text });
46750
+ } catch (e) {
46751
+ return err(e);
46752
+ }
46753
+ });
46754
+ server.tool("browser_tui_get_cursor", "Get the current cursor position (row and column) in the terminal.", {
46755
+ session_id: exports_external.string().optional()
46756
+ }, async ({ session_id }) => {
46757
+ try {
46758
+ const sid = resolveSessionId(session_id);
46759
+ assertTuiSession(sid);
46760
+ const page = getSessionPage(sid);
46761
+ const cursor = await page.evaluate(() => {
46762
+ const term = window.term ?? window.terminal;
46763
+ if (!term?.buffer?.active)
46764
+ return null;
46765
+ return { row: term.buffer.active.cursorY, col: term.buffer.active.cursorX };
46766
+ });
46767
+ if (!cursor)
46768
+ return err(new Error("Could not read cursor position \u2014 no terminal instance"));
46769
+ return json(cursor);
46770
+ } catch (e) {
46771
+ return err(e);
46772
+ }
46773
+ });
46774
+ server.tool("browser_tui_assert", `Assert conditions on the terminal state. Chain multiple conditions with AND.
46775
+
46776
+ CONDITION SYNTAX:
46777
+ - "text contains X" \u2014 terminal buffer contains substring X
46778
+ - "row N contains X" \u2014 row N (0-indexed) contains substring X
46779
+ - "cursor at R,C" \u2014 cursor is at row R, column C
46780
+ - "row_count > N" \u2014 total rows greater than N
46781
+ - "row_count == N" \u2014 total rows equals N
46782
+
46783
+ Example: "text contains hello AND row 0 contains $ AND cursor at 1,0"`, {
46784
+ session_id: exports_external.string().optional(),
46785
+ condition: exports_external.string().describe("Assertion condition(s), joined with AND")
46786
+ }, async ({ session_id, condition }) => {
46787
+ try {
46788
+ const sid = resolveSessionId(session_id);
46789
+ assertTuiSession(sid);
46790
+ const page = getSessionPage(sid);
46791
+ const termData = await getTermText(page);
46792
+ const cursor = await page.evaluate(() => {
46793
+ const term = window.term ?? window.terminal;
46794
+ if (!term?.buffer?.active)
46795
+ return { row: -1, col: -1 };
46796
+ return { row: term.buffer.active.cursorY, col: term.buffer.active.cursorX };
46797
+ });
46798
+ const checks = [];
46799
+ let allPassed = true;
46800
+ for (const part of condition.split(/\s+AND\s+/i)) {
46801
+ const trimmed = part.trim();
46802
+ let result = false;
46803
+ if (/^text\s+contains\s+/i.test(trimmed)) {
46804
+ const needle = trimmed.replace(/^text\s+contains\s+/i, "").replace(/^["']|["']$/g, "");
46805
+ result = termData.text.includes(needle);
46806
+ } else if (/^row\s+(\d+)\s+contains\s+/i.test(trimmed)) {
46807
+ const match = trimmed.match(/^row\s+(\d+)\s+contains\s+(.+)/i);
46808
+ if (match) {
46809
+ const rowIdx = parseInt(match[1]);
46810
+ const needle = match[2].replace(/^["']|["']$/g, "");
46811
+ result = (termData.rows[rowIdx] ?? "").includes(needle);
46812
+ }
46813
+ } else if (/^cursor\s+at\s+(\d+)\s*,\s*(\d+)/i.test(trimmed)) {
46814
+ const match = trimmed.match(/^cursor\s+at\s+(\d+)\s*,\s*(\d+)/i);
46815
+ if (match) {
46816
+ result = cursor.row === parseInt(match[1]) && cursor.col === parseInt(match[2]);
46817
+ }
46818
+ } else if (/^row_count\s*(>|>=|<|<=|==|!=)\s*(\d+)/i.test(trimmed)) {
46819
+ const match = trimmed.match(/^row_count\s*(>|>=|<|<=|==|!=)\s*(\d+)/i);
46820
+ if (match) {
46821
+ const op = match[1];
46822
+ const n = parseInt(match[2]);
46823
+ const count = termData.row_count;
46824
+ result = op === ">" ? count > n : op === ">=" ? count >= n : op === "<" ? count < n : op === "<=" ? count <= n : op === "==" ? count === n : count !== n;
46825
+ }
46826
+ }
46827
+ checks.push({ assertion: trimmed, result });
46828
+ if (!result)
46829
+ allPassed = false;
46830
+ }
46831
+ return json({ passed: allPassed, checks, cursor, row_count: termData.row_count });
46832
+ } catch (e) {
46833
+ return err(e);
46834
+ }
46835
+ });
46836
+ server.tool("browser_tui_snapshot", "Capture a structured snapshot of the terminal buffer: all rows as an array, cursor position, dimensions, and theme. Useful for comparing terminal state before and after actions.", {
46837
+ session_id: exports_external.string().optional()
46838
+ }, async ({ session_id }) => {
46839
+ try {
46840
+ const sid = resolveSessionId(session_id);
46841
+ assertTuiSession(sid);
46842
+ const page = getSessionPage(sid);
46843
+ const snapshot = await page.evaluate(() => {
46844
+ const term = window.term ?? window.terminal;
46845
+ if (!term?.buffer?.active)
46846
+ return null;
46847
+ const buf = term.buffer.active;
46848
+ const rows = [];
46849
+ for (let i = 0;i < buf.length; i++) {
46850
+ const line = buf.getLine(i);
46851
+ if (line)
46852
+ rows.push(line.translateToString(true));
46853
+ }
46854
+ return {
46855
+ rows,
46856
+ cols: term.cols,
46857
+ total_rows: term.rows,
46858
+ buffer_length: buf.length,
46859
+ cursor_row: buf.cursorY,
46860
+ cursor_col: buf.cursorX,
46861
+ font_size: term.options?.fontSize,
46862
+ theme: term.options?.theme?.background === "#ffffff" ? "light" : "dark"
46863
+ };
46864
+ });
46865
+ if (!snapshot)
46866
+ return err(new Error("Could not capture snapshot \u2014 no terminal instance"));
46867
+ return json(snapshot);
46868
+ } catch (e) {
46869
+ return err(e);
46870
+ }
46871
+ });
46872
+ server.tool("browser_tui_record_start", "Start recording the terminal session as an asciicast v2 file (asciinema-compatible). Polls the terminal buffer at an interval and captures changes.", {
46873
+ session_id: exports_external.string().optional(),
46874
+ interval_ms: exports_external.number().optional().default(500).describe("Polling interval in ms (default: 500)")
46875
+ }, async ({ session_id, interval_ms }) => {
46876
+ try {
46877
+ const sid = resolveSessionId(session_id);
46878
+ assertTuiSession(sid);
46879
+ const page = getSessionPage(sid);
46880
+ if (activeRecordings2.has(sid)) {
46881
+ return err(new Error("Recording already active for this session. Stop it first with browser_tui_record_stop."));
46882
+ }
46883
+ const dims = await page.evaluate(() => {
46884
+ const term = window.term ?? window.terminal;
46885
+ return term ? { cols: term.cols, rows: term.rows } : { cols: 80, rows: 24 };
46886
+ });
46887
+ const initialText = (await getTermText(page)).text;
46888
+ const recording = {
46889
+ sessionId: sid,
46890
+ startTime: Date.now(),
46891
+ cols: dims.cols,
46892
+ rows: dims.rows,
46893
+ events: [],
46894
+ lastText: initialText,
46895
+ intervalId: setInterval(async () => {
46896
+ try {
46897
+ const current = await getTermText(page);
46898
+ if (current.text !== recording.lastText) {
46899
+ const elapsed = (Date.now() - recording.startTime) / 1000;
46900
+ recording.events.push([elapsed, "o", current.text.slice(recording.lastText.length) || current.text]);
46901
+ recording.lastText = current.text;
46902
+ }
46903
+ } catch {}
46904
+ }, interval_ms)
46905
+ };
46906
+ activeRecordings2.set(sid, recording);
46907
+ return json({ recording: true, session_id: sid, interval_ms, cols: dims.cols, rows: dims.rows });
46908
+ } catch (e) {
46909
+ return err(e);
46910
+ }
46911
+ });
46912
+ server.tool("browser_tui_record_stop", "Stop recording and return the asciicast v2 JSON. Compatible with asciinema player.", {
46913
+ session_id: exports_external.string().optional()
46914
+ }, async ({ session_id }) => {
46915
+ try {
46916
+ const sid = resolveSessionId(session_id);
46917
+ const recording = activeRecordings2.get(sid);
46918
+ if (!recording)
46919
+ return err(new Error("No active recording for this session"));
46920
+ clearInterval(recording.intervalId);
46921
+ activeRecordings2.delete(sid);
46922
+ const duration = (Date.now() - recording.startTime) / 1000;
46923
+ const header = {
46924
+ version: 2,
46925
+ width: recording.cols,
46926
+ height: recording.rows,
46927
+ timestamp: Math.floor(recording.startTime / 1000),
46928
+ duration,
46929
+ env: { TERM: "xterm-256color", SHELL: "/bin/bash" }
46930
+ };
46931
+ const lines = [JSON.stringify(header)];
46932
+ for (const [time, type2, data] of recording.events) {
46933
+ lines.push(JSON.stringify([time, type2, data]));
46934
+ }
46935
+ const asciicast = lines.join(`
46936
+ `);
46937
+ return json({
46938
+ format: "asciicast_v2",
46939
+ duration_seconds: Math.round(duration * 10) / 10,
46940
+ event_count: recording.events.length,
46941
+ asciicast
46942
+ });
46943
+ } catch (e) {
46944
+ return err(e);
46945
+ }
46946
+ });
46947
+ }
46948
+
46525
46949
  // src/mcp/index.ts
46526
46950
  init_schema();
46527
46951
  var _pkg = JSON.parse(readFileSync11(join20(import.meta.dir, "../../package.json"), "utf8"));
@@ -46534,6 +46958,7 @@ register2(server);
46534
46958
  register3(server);
46535
46959
  register4(server);
46536
46960
  register8(server);
46961
+ register9(server);
46537
46962
  server.tool("send_feedback", "Send feedback about this service", { message: exports_external.string(), email: exports_external.string().optional(), category: exports_external.enum(["bug", "feature", "general"]).optional() }, async (params) => {
46538
46963
  try {
46539
46964
  const db2 = getDatabase();
@@ -1 +1 @@
1
- {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../src/mcp/meta.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8CzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,QAq7BzC"}
1
+ {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../src/mcp/meta.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8CzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,QAi8BzC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/mcp/sessions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgCzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,QAwYzC"}
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/mcp/sessions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgCzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,QA2YzC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function register(server: McpServer): void;
3
+ //# sourceMappingURL=tui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/mcp/tui.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA4FzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,QA2ZzC"}
@@ -18284,6 +18284,13 @@ async function launchTui(command, options = {}) {
18284
18284
  if (viewport2)
18285
18285
  viewport2.style.backgroundColor = theme.background;
18286
18286
  }, themeColors);
18287
+ if (options.fontSize) {
18288
+ await page.evaluate((size) => {
18289
+ const term = window.term ?? window.terminal;
18290
+ if (term?.options)
18291
+ term.options.fontSize = size;
18292
+ }, options.fontSize);
18293
+ }
18287
18294
  return { ttydProcess, port, browser, page, theme: resolvedTheme };
18288
18295
  } catch (err) {
18289
18296
  ttydProcess.kill();
@@ -18652,7 +18659,8 @@ async function createSession2(opts = {}) {
18652
18659
  const tuiSess = await launchTui(command, {
18653
18660
  headless: opts.headless ?? true,
18654
18661
  viewport: opts.viewport,
18655
- theme: opts.tuiTheme ?? "system"
18662
+ theme: opts.tuiTheme ?? "system",
18663
+ fontSize: opts.tuiFontSize
18656
18664
  });
18657
18665
  browser = tuiSess.browser;
18658
18666
  page = tuiSess.page;
@@ -71,6 +71,7 @@ export interface SessionOptions {
71
71
  cdpUrl?: string;
72
72
  storageState?: string;
73
73
  tuiTheme?: "dark" | "light" | "system";
74
+ tuiFontSize?: number;
74
75
  }
75
76
  export interface Snapshot {
76
77
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/browser",
3
- "version": "0.4.2",
3
+ "version": "0.4.3",
4
4
  "description": "General-purpose browser agent toolkit — Playwright, Chrome DevTools Protocol, Lightpanda with auto engine selection. CLI + MCP + REST + SDK.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",