@hasna/browser 0.4.0 → 0.4.2

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
@@ -12691,7 +12691,35 @@ async function launchTui(command, options = {}) {
12691
12691
  waitUntil: "domcontentloaded"
12692
12692
  });
12693
12693
  await page.waitForSelector(".xterm-screen", { timeout: 1e4 });
12694
- return { ttydProcess, port, browser, page };
12694
+ let resolvedTheme = "dark";
12695
+ const requestedTheme = options.theme ?? "system";
12696
+ if (requestedTheme === "light") {
12697
+ resolvedTheme = "light";
12698
+ } else if (requestedTheme === "dark") {
12699
+ resolvedTheme = "dark";
12700
+ } else {
12701
+ try {
12702
+ const result = execSync2("defaults read -g AppleInterfaceStyle 2>/dev/null", { encoding: "utf8" }).trim();
12703
+ resolvedTheme = result === "Dark" ? "dark" : "light";
12704
+ } catch {
12705
+ resolvedTheme = "light";
12706
+ }
12707
+ }
12708
+ const themeColors = THEMES[resolvedTheme];
12709
+ await page.evaluate((theme) => {
12710
+ const term = window.term ?? window.terminal;
12711
+ if (term?.options) {
12712
+ term.options.theme = theme;
12713
+ }
12714
+ document.body.style.backgroundColor = theme.background;
12715
+ const container = document.getElementById("terminal-container");
12716
+ if (container)
12717
+ container.style.backgroundColor = theme.background;
12718
+ const viewport2 = document.querySelector(".xterm-viewport");
12719
+ if (viewport2)
12720
+ viewport2.style.backgroundColor = theme.background;
12721
+ }, themeColors);
12722
+ return { ttydProcess, port, browser, page, theme: resolvedTheme };
12695
12723
  } catch (err) {
12696
12724
  ttydProcess.kill();
12697
12725
  throw err;
@@ -12708,11 +12736,57 @@ async function closeTui(session) {
12708
12736
  session.ttydProcess.kill("SIGTERM");
12709
12737
  } catch {}
12710
12738
  }
12711
- var DEFAULT_TTYD_PORT_START = 7780, nextPort;
12739
+ var DEFAULT_TTYD_PORT_START = 7780, nextPort, THEMES;
12712
12740
  var init_tui = __esm(() => {
12713
12741
  init_types();
12714
12742
  init_playwright();
12715
12743
  nextPort = DEFAULT_TTYD_PORT_START;
12744
+ THEMES = {
12745
+ dark: {
12746
+ background: "#1e1e1e",
12747
+ foreground: "#d4d4d4",
12748
+ cursor: "#d4d4d4",
12749
+ selectionBackground: "#264f78",
12750
+ black: "#1e1e1e",
12751
+ red: "#f44747",
12752
+ green: "#6a9955",
12753
+ yellow: "#d7ba7d",
12754
+ blue: "#569cd6",
12755
+ magenta: "#c586c0",
12756
+ cyan: "#4ec9b0",
12757
+ white: "#d4d4d4",
12758
+ brightBlack: "#808080",
12759
+ brightRed: "#f44747",
12760
+ brightGreen: "#6a9955",
12761
+ brightYellow: "#d7ba7d",
12762
+ brightBlue: "#569cd6",
12763
+ brightMagenta: "#c586c0",
12764
+ brightCyan: "#4ec9b0",
12765
+ brightWhite: "#ffffff"
12766
+ },
12767
+ light: {
12768
+ background: "#ffffff",
12769
+ foreground: "#1e1e1e",
12770
+ cursor: "#1e1e1e",
12771
+ selectionBackground: "#add6ff",
12772
+ black: "#1e1e1e",
12773
+ red: "#cd3131",
12774
+ green: "#008000",
12775
+ yellow: "#795e26",
12776
+ blue: "#0451a5",
12777
+ magenta: "#af00db",
12778
+ cyan: "#0598bc",
12779
+ white: "#d4d4d4",
12780
+ brightBlack: "#808080",
12781
+ brightRed: "#cd3131",
12782
+ brightGreen: "#008000",
12783
+ brightYellow: "#795e26",
12784
+ brightBlue: "#0451a5",
12785
+ brightMagenta: "#af00db",
12786
+ brightCyan: "#0598bc",
12787
+ brightWhite: "#ffffff"
12788
+ }
12789
+ };
12716
12790
  });
12717
12791
 
12718
12792
  // src/engines/selector.ts
@@ -14149,7 +14223,8 @@ async function createSession2(opts = {}) {
14149
14223
  const command = opts.startUrl ?? "bash";
14150
14224
  const tuiSess = await launchTui(command, {
14151
14225
  headless: opts.headless ?? true,
14152
- viewport: opts.viewport
14226
+ viewport: opts.viewport,
14227
+ theme: opts.tuiTheme ?? "system"
14153
14228
  });
14154
14229
  browser = tuiSess.browser;
14155
14230
  page = tuiSess.page;
@@ -27577,12 +27652,26 @@ var init_helpers = __esm(() => {
27577
27652
 
27578
27653
  // src/mcp/sessions.ts
27579
27654
  function register4(server) {
27580
- server.tool("browser_session_create", "Create a new browser session. If agent_id is set and already has an active session, returns the existing one (use force_new to override). If session_id is omitted on other tools, the single active session is auto-selected. Use cdp_url to attach to an already-running Chrome instance.", {
27581
- engine: exports_external2.enum(["playwright", "cdp", "lightpanda", "bun", "tui", "auto"]).optional().default("auto"),
27582
- use_case: exports_external2.string().optional(),
27655
+ server.tool("browser_session_create", `Create a new browser session. Returns a session object with an id you must pass to other tools.
27656
+
27657
+ ENGINES:
27658
+ - "auto" (default): picks the best engine for your use case automatically
27659
+ - "playwright": full browser automation \u2014 forms, SPAs, auth flows, multi-tab
27660
+ - "cdp": Chrome DevTools Protocol \u2014 network monitoring, perf profiling, script injection
27661
+ - "lightpanda": fast headless for static pages
27662
+ - "bun": native Bun.WebView \u2014 fastest for screenshots and scraping
27663
+ - "tui": terminal UI testing \u2014 launches a CLI/TUI app (Ink, Blessed, Bubbletea, etc.) via ttyd and connects Playwright to it. Pass the shell command as start_url (e.g. "htop", "bun run app.tsx"). All browser tools (screenshot, click, type, wait) work on the terminal. Use tui_theme to control dark/light appearance.
27664
+
27665
+ TIPS:
27666
+ - If agent_id is set and already has an active session, returns the existing one (use force_new to override)
27667
+ - If session_id is omitted on other tools, the single active session is auto-selected
27668
+ - Use cdp_url to attach to an already-running Chrome instance
27669
+ - For TUI sessions: start_url is the shell command to run, NOT a URL`, {
27670
+ engine: exports_external2.enum(["playwright", "cdp", "lightpanda", "bun", "tui", "auto"]).optional().default("auto").describe("Browser engine. Use 'tui' for terminal/CLI app testing \u2014 pass the command as start_url"),
27671
+ use_case: exports_external2.string().optional().describe("Hint for auto engine selection: scrape, screenshot, form, auth, network, har, perf, terminal, tui"),
27583
27672
  project_id: exports_external2.string().optional(),
27584
27673
  agent_id: exports_external2.string().optional(),
27585
- start_url: exports_external2.string().optional(),
27674
+ start_url: exports_external2.string().optional().describe("URL to navigate to, OR for engine='tui': the shell command to run (e.g. 'htop', 'bun run app.tsx')"),
27586
27675
  headless: exports_external2.boolean().optional().default(true),
27587
27676
  viewport_width: exports_external2.number().optional().default(1280),
27588
27677
  viewport_height: exports_external2.number().optional().default(720),
@@ -27591,8 +27680,9 @@ function register4(server) {
27591
27680
  storage_state: exports_external2.string().optional().describe("Name of saved storage state to load (restores cookies/auth from previous session)"),
27592
27681
  force_new: exports_external2.boolean().optional().default(false).describe("Force create a new session even if agent already has one"),
27593
27682
  tags: exports_external2.array(exports_external2.string()).optional(),
27594
- 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")
27595
- }, 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 }) => {
27683
+ 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 }) => {
27596
27686
  try {
27597
27687
  if (agent_id && !force_new) {
27598
27688
  const existing = getActiveSessionForAgent2(agent_id);
@@ -27610,7 +27700,8 @@ function register4(server) {
27610
27700
  stealth,
27611
27701
  autoGallery: auto_gallery,
27612
27702
  storageState: storage_state,
27613
- cdpUrl: cdp_url
27703
+ cdpUrl: cdp_url,
27704
+ tuiTheme: tui_theme
27614
27705
  });
27615
27706
  if (tags?.length) {
27616
27707
  const { addSessionTag: addSessionTag2 } = await Promise.resolve().then(() => (init_sessions(), exports_sessions));
@@ -28807,6 +28898,40 @@ function register6(server) {
28807
28898
  return err(e);
28808
28899
  }
28809
28900
  });
28901
+ server.tool("browser_diff", "Visual diff between two URLs or a URL and a gallery entry. Screenshots both, returns a pixel diff image highlighting changes in red.", {
28902
+ session_id: exports_external2.string().optional(),
28903
+ url1: exports_external2.string().describe("First URL to screenshot"),
28904
+ url2: exports_external2.string().describe("Second URL to screenshot"),
28905
+ threshold: exports_external2.number().optional().default(10).describe("Pixel difference threshold (0-255, default 10)"),
28906
+ wait_ms: exports_external2.number().optional().default(1000).describe("Wait time after navigation before screenshot (ms)")
28907
+ }, async ({ session_id, url1, url2, threshold, wait_ms }) => {
28908
+ try {
28909
+ const sid = resolveSessionId(session_id);
28910
+ const page = getSessionPage(sid);
28911
+ await page.goto(url1, { waitUntil: "domcontentloaded" });
28912
+ await new Promise((r) => setTimeout(r, wait_ms));
28913
+ const ss1 = await takeScreenshot(page, { maxWidth: 1280, compress: true, track: false });
28914
+ await page.goto(url2, { waitUntil: "domcontentloaded" });
28915
+ await new Promise((r) => setTimeout(r, wait_ms));
28916
+ const ss2 = await takeScreenshot(page, { maxWidth: 1280, compress: true, track: false });
28917
+ const { diffImages: diffImages2 } = await Promise.resolve().then(() => (init_gallery_diff(), exports_gallery_diff));
28918
+ const diff = await diffImages2(ss1.path, ss2.path);
28919
+ logEvent(sid, "diff", { url1, url2, changed_percent: diff.changed_percent });
28920
+ return json({
28921
+ url1,
28922
+ url2,
28923
+ changed_pixels: diff.changed_pixels,
28924
+ total_pixels: diff.total_pixels,
28925
+ changed_percent: Math.round(diff.changed_percent * 100) / 100,
28926
+ diff_path: diff.diff_path,
28927
+ diff_base64: diff.diff_base64.length > 50000 ? undefined : diff.diff_base64,
28928
+ screenshot1_path: ss1.path,
28929
+ screenshot2_path: ss2.path
28930
+ });
28931
+ } catch (e) {
28932
+ return err(e);
28933
+ }
28934
+ });
28810
28935
  }
28811
28936
  var init_capture = __esm(() => {
28812
28937
  init_helpers();
@@ -31942,6 +32067,53 @@ function register7(server) {
31942
32067
  return err(e);
31943
32068
  }
31944
32069
  });
32070
+ server.tool("browser_performance_budget", "Check page performance against a budget. Set thresholds for LCP, FCP, CLS, TTFB, DOM complete, and load event. Returns pass/fail per metric with actual values.", {
32071
+ session_id: exports_external2.string().optional(),
32072
+ lcp_ms: exports_external2.number().optional().describe("Largest Contentful Paint budget in ms (good: <2500)"),
32073
+ fcp_ms: exports_external2.number().optional().describe("First Contentful Paint budget in ms (good: <1800)"),
32074
+ cls: exports_external2.number().optional().describe("Cumulative Layout Shift budget (good: <0.1)"),
32075
+ ttfb_ms: exports_external2.number().optional().describe("Time to First Byte budget in ms (good: <800)"),
32076
+ dom_complete_ms: exports_external2.number().optional().describe("DOM complete budget in ms"),
32077
+ load_event_ms: exports_external2.number().optional().describe("Load event budget in ms"),
32078
+ js_heap_mb: exports_external2.number().optional().describe("JS heap size budget in MB")
32079
+ }, async ({ session_id, lcp_ms, fcp_ms, cls, ttfb_ms, dom_complete_ms, load_event_ms, js_heap_mb }) => {
32080
+ try {
32081
+ const sid = resolveSessionId(session_id);
32082
+ const page = getSessionPage(sid);
32083
+ const metrics = await getPerformanceMetrics(page);
32084
+ const checks = [];
32085
+ let allPassed = true;
32086
+ const check = (name, budget, actual) => {
32087
+ if (budget === undefined)
32088
+ return;
32089
+ const passed = actual !== undefined && actual <= budget;
32090
+ if (!passed)
32091
+ allPassed = false;
32092
+ checks.push({ metric: name, budget, actual, passed });
32093
+ };
32094
+ check("lcp", lcp_ms, metrics.lcp);
32095
+ check("fcp", fcp_ms, metrics.fcp);
32096
+ check("cls", cls, metrics.cls);
32097
+ check("ttfb", ttfb_ms, metrics.ttfb);
32098
+ check("dom_complete", dom_complete_ms, metrics.dom_complete);
32099
+ check("load_event", load_event_ms, metrics.load_event);
32100
+ if (js_heap_mb !== undefined && metrics.js_heap_size_used !== undefined) {
32101
+ const heapMb = metrics.js_heap_size_used / (1024 * 1024);
32102
+ const passed = heapMb <= js_heap_mb;
32103
+ if (!passed)
32104
+ allPassed = false;
32105
+ checks.push({ metric: "js_heap_mb", budget: js_heap_mb, actual: Math.round(heapMb * 100) / 100, passed });
32106
+ }
32107
+ return json({
32108
+ passed: allPassed,
32109
+ checks,
32110
+ metrics,
32111
+ url: page.url()
32112
+ });
32113
+ } catch (e) {
32114
+ return err(e);
32115
+ }
32116
+ });
31945
32117
  }
31946
32118
  var init_network2 = __esm(() => {
31947
32119
  init_helpers();
@@ -32390,6 +32562,19 @@ function register8(server) {
32390
32562
  return err(e);
32391
32563
  }
32392
32564
  });
32565
+ server.tool("browser_record_export", "Export a recording as a Playwright test (.spec.ts), Puppeteer script, or JSON. Returns the generated code as text.", {
32566
+ recording_id: exports_external2.string().describe("ID of the recording to export"),
32567
+ format: exports_external2.enum(["playwright", "puppeteer", "json"]).optional().default("playwright").describe("Export format")
32568
+ }, async ({ recording_id, format }) => {
32569
+ try {
32570
+ const { exportRecording: exportRecording2 } = await Promise.resolve().then(() => (init_recorder(), exports_recorder));
32571
+ const code = exportRecording2(recording_id, format);
32572
+ const ext = format === "json" ? ".json" : format === "playwright" ? ".spec.ts" : ".js";
32573
+ return json({ format, filename: `recording-${recording_id}${ext}`, code });
32574
+ } catch (e) {
32575
+ return err(e);
32576
+ }
32577
+ });
32393
32578
  }
32394
32579
  var init_recordings2 = __esm(() => {
32395
32580
  init_helpers();
@@ -47967,7 +48152,8 @@ function register10(server) {
47967
48152
  { tool: "browser_screenshot", description: "Take a screenshot (PNG/JPEG/WebP, annotate=true for labels)" },
47968
48153
  { tool: "browser_pdf", description: "Generate a PDF of the page" },
47969
48154
  { tool: "browser_scroll_and_screenshot", description: "Scroll then screenshot in one call" },
47970
- { tool: "browser_scroll_to_element", description: "Scroll element into view + screenshot" }
48155
+ { tool: "browser_scroll_to_element", description: "Scroll element into view + screenshot" },
48156
+ { tool: "browser_diff", description: "Visual diff between two URLs \u2014 highlights changes in red" }
47971
48157
  ],
47972
48158
  Storage: [
47973
48159
  { tool: "browser_cookies_get", description: "Get cookies" },
@@ -47992,7 +48178,8 @@ function register10(server) {
47992
48178
  { tool: "browser_intercept_clear", description: "Remove all response intercepts" }
47993
48179
  ],
47994
48180
  Performance: [
47995
- { tool: "browser_performance", description: "Get performance metrics" }
48181
+ { tool: "browser_performance", description: "Get performance metrics" },
48182
+ { tool: "browser_performance_budget", description: "Check perf against budget thresholds (LCP, FCP, CLS, TTFB)" }
47996
48183
  ],
47997
48184
  Console: [
47998
48185
  { tool: "browser_console_log", description: "Get console messages" },
@@ -48005,6 +48192,7 @@ function register10(server) {
48005
48192
  { tool: "browser_record_step", description: "Add a step to recording" },
48006
48193
  { tool: "browser_record_stop", description: "Stop and save recording" },
48007
48194
  { tool: "browser_record_replay", description: "Replay a recorded sequence" },
48195
+ { tool: "browser_record_export", description: "Export recording as Playwright test, Puppeteer script, or JSON" },
48008
48196
  { tool: "browser_recordings_list", description: "List all recordings" }
48009
48197
  ],
48010
48198
  Auth: [
@@ -1,10 +1,12 @@
1
1
  import { type ChildProcess } from "node:child_process";
2
2
  import type { Browser, Page } from "playwright";
3
+ export type TuiTheme = "dark" | "light" | "system";
3
4
  export interface TuiSession {
4
5
  ttydProcess: ChildProcess;
5
6
  port: number;
6
7
  browser: Browser;
7
8
  page: Page;
9
+ theme: TuiTheme;
8
10
  }
9
11
  /**
10
12
  * Check if ttyd is installed on this system.
@@ -23,6 +25,7 @@ export declare function launchTui(command: string, options?: {
23
25
  width: number;
24
26
  height: number;
25
27
  };
28
+ theme?: TuiTheme;
26
29
  }): Promise<TuiSession>;
27
30
  /**
28
31
  * 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,WAAW,UAAU;IACzB,WAAW,EAAE,YAAY,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;CACZ;AAED;;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;CACzC,GACL,OAAO,CAAC,UAAU,CAAC,CAqDrB;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;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"}
package/dist/index.js CHANGED
@@ -18362,6 +18362,52 @@ init_types();
18362
18362
  import { execSync as execSync2, spawn as spawn2 } from "child_process";
18363
18363
  var DEFAULT_TTYD_PORT_START = 7780;
18364
18364
  var nextPort = DEFAULT_TTYD_PORT_START;
18365
+ var THEMES = {
18366
+ dark: {
18367
+ background: "#1e1e1e",
18368
+ foreground: "#d4d4d4",
18369
+ cursor: "#d4d4d4",
18370
+ selectionBackground: "#264f78",
18371
+ black: "#1e1e1e",
18372
+ red: "#f44747",
18373
+ green: "#6a9955",
18374
+ yellow: "#d7ba7d",
18375
+ blue: "#569cd6",
18376
+ magenta: "#c586c0",
18377
+ cyan: "#4ec9b0",
18378
+ white: "#d4d4d4",
18379
+ brightBlack: "#808080",
18380
+ brightRed: "#f44747",
18381
+ brightGreen: "#6a9955",
18382
+ brightYellow: "#d7ba7d",
18383
+ brightBlue: "#569cd6",
18384
+ brightMagenta: "#c586c0",
18385
+ brightCyan: "#4ec9b0",
18386
+ brightWhite: "#ffffff"
18387
+ },
18388
+ light: {
18389
+ background: "#ffffff",
18390
+ foreground: "#1e1e1e",
18391
+ cursor: "#1e1e1e",
18392
+ selectionBackground: "#add6ff",
18393
+ black: "#1e1e1e",
18394
+ red: "#cd3131",
18395
+ green: "#008000",
18396
+ yellow: "#795e26",
18397
+ blue: "#0451a5",
18398
+ magenta: "#af00db",
18399
+ cyan: "#0598bc",
18400
+ white: "#d4d4d4",
18401
+ brightBlack: "#808080",
18402
+ brightRed: "#cd3131",
18403
+ brightGreen: "#008000",
18404
+ brightYellow: "#795e26",
18405
+ brightBlue: "#0451a5",
18406
+ brightMagenta: "#af00db",
18407
+ brightCyan: "#0598bc",
18408
+ brightWhite: "#ffffff"
18409
+ }
18410
+ };
18365
18411
  function isTuiAvailable() {
18366
18412
  try {
18367
18413
  execSync2("which ttyd", { stdio: "ignore" });
@@ -18419,7 +18465,35 @@ async function launchTui(command, options = {}) {
18419
18465
  waitUntil: "domcontentloaded"
18420
18466
  });
18421
18467
  await page.waitForSelector(".xterm-screen", { timeout: 1e4 });
18422
- return { ttydProcess, port, browser, page };
18468
+ let resolvedTheme = "dark";
18469
+ const requestedTheme = options.theme ?? "system";
18470
+ if (requestedTheme === "light") {
18471
+ resolvedTheme = "light";
18472
+ } else if (requestedTheme === "dark") {
18473
+ resolvedTheme = "dark";
18474
+ } else {
18475
+ try {
18476
+ const result = execSync2("defaults read -g AppleInterfaceStyle 2>/dev/null", { encoding: "utf8" }).trim();
18477
+ resolvedTheme = result === "Dark" ? "dark" : "light";
18478
+ } catch {
18479
+ resolvedTheme = "light";
18480
+ }
18481
+ }
18482
+ const themeColors = THEMES[resolvedTheme];
18483
+ await page.evaluate((theme) => {
18484
+ const term = window.term ?? window.terminal;
18485
+ if (term?.options) {
18486
+ term.options.theme = theme;
18487
+ }
18488
+ document.body.style.backgroundColor = theme.background;
18489
+ const container = document.getElementById("terminal-container");
18490
+ if (container)
18491
+ container.style.backgroundColor = theme.background;
18492
+ const viewport2 = document.querySelector(".xterm-viewport");
18493
+ if (viewport2)
18494
+ viewport2.style.backgroundColor = theme.background;
18495
+ }, themeColors);
18496
+ return { ttydProcess, port, browser, page, theme: resolvedTheme };
18423
18497
  } catch (err) {
18424
18498
  ttydProcess.kill();
18425
18499
  throw err;
@@ -18842,7 +18916,8 @@ async function createSession2(opts = {}) {
18842
18916
  const command = opts.startUrl ?? "bash";
18843
18917
  const tuiSess = await launchTui(command, {
18844
18918
  headless: opts.headless ?? true,
18845
- viewport: opts.viewport
18919
+ viewport: opts.viewport,
18920
+ theme: opts.tuiTheme ?? "system"
18846
18921
  });
18847
18922
  browser = tuiSess.browser;
18848
18923
  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,CAiL3F;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,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 +1 @@
1
- {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/mcp/capture.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA6BzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,QAodzC"}
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/mcp/capture.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA6BzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,QAogBzC"}
package/dist/mcp/index.js CHANGED
@@ -10657,7 +10657,35 @@ async function launchTui(command, options = {}) {
10657
10657
  waitUntil: "domcontentloaded"
10658
10658
  });
10659
10659
  await page.waitForSelector(".xterm-screen", { timeout: 1e4 });
10660
- return { ttydProcess, port, browser, page };
10660
+ let resolvedTheme = "dark";
10661
+ const requestedTheme = options.theme ?? "system";
10662
+ if (requestedTheme === "light") {
10663
+ resolvedTheme = "light";
10664
+ } else if (requestedTheme === "dark") {
10665
+ resolvedTheme = "dark";
10666
+ } else {
10667
+ try {
10668
+ const result = execSync2("defaults read -g AppleInterfaceStyle 2>/dev/null", { encoding: "utf8" }).trim();
10669
+ resolvedTheme = result === "Dark" ? "dark" : "light";
10670
+ } catch {
10671
+ resolvedTheme = "light";
10672
+ }
10673
+ }
10674
+ const themeColors = THEMES[resolvedTheme];
10675
+ await page.evaluate((theme) => {
10676
+ const term = window.term ?? window.terminal;
10677
+ if (term?.options) {
10678
+ term.options.theme = theme;
10679
+ }
10680
+ document.body.style.backgroundColor = theme.background;
10681
+ const container = document.getElementById("terminal-container");
10682
+ if (container)
10683
+ container.style.backgroundColor = theme.background;
10684
+ const viewport2 = document.querySelector(".xterm-viewport");
10685
+ if (viewport2)
10686
+ viewport2.style.backgroundColor = theme.background;
10687
+ }, themeColors);
10688
+ return { ttydProcess, port, browser, page, theme: resolvedTheme };
10661
10689
  } catch (err) {
10662
10690
  ttydProcess.kill();
10663
10691
  throw err;
@@ -10674,11 +10702,57 @@ async function closeTui(session) {
10674
10702
  session.ttydProcess.kill("SIGTERM");
10675
10703
  } catch {}
10676
10704
  }
10677
- var DEFAULT_TTYD_PORT_START = 7780, nextPort;
10705
+ var DEFAULT_TTYD_PORT_START = 7780, nextPort, THEMES;
10678
10706
  var init_tui = __esm(() => {
10679
10707
  init_types();
10680
10708
  init_playwright();
10681
10709
  nextPort = DEFAULT_TTYD_PORT_START;
10710
+ THEMES = {
10711
+ dark: {
10712
+ background: "#1e1e1e",
10713
+ foreground: "#d4d4d4",
10714
+ cursor: "#d4d4d4",
10715
+ selectionBackground: "#264f78",
10716
+ black: "#1e1e1e",
10717
+ red: "#f44747",
10718
+ green: "#6a9955",
10719
+ yellow: "#d7ba7d",
10720
+ blue: "#569cd6",
10721
+ magenta: "#c586c0",
10722
+ cyan: "#4ec9b0",
10723
+ white: "#d4d4d4",
10724
+ brightBlack: "#808080",
10725
+ brightRed: "#f44747",
10726
+ brightGreen: "#6a9955",
10727
+ brightYellow: "#d7ba7d",
10728
+ brightBlue: "#569cd6",
10729
+ brightMagenta: "#c586c0",
10730
+ brightCyan: "#4ec9b0",
10731
+ brightWhite: "#ffffff"
10732
+ },
10733
+ light: {
10734
+ background: "#ffffff",
10735
+ foreground: "#1e1e1e",
10736
+ cursor: "#1e1e1e",
10737
+ selectionBackground: "#add6ff",
10738
+ black: "#1e1e1e",
10739
+ red: "#cd3131",
10740
+ green: "#008000",
10741
+ yellow: "#795e26",
10742
+ blue: "#0451a5",
10743
+ magenta: "#af00db",
10744
+ cyan: "#0598bc",
10745
+ white: "#d4d4d4",
10746
+ brightBlack: "#808080",
10747
+ brightRed: "#cd3131",
10748
+ brightGreen: "#008000",
10749
+ brightYellow: "#795e26",
10750
+ brightBlue: "#0451a5",
10751
+ brightMagenta: "#af00db",
10752
+ brightCyan: "#0598bc",
10753
+ brightWhite: "#ffffff"
10754
+ }
10755
+ };
10682
10756
  });
10683
10757
 
10684
10758
  // src/engines/selector.ts
@@ -12111,7 +12185,8 @@ async function createSession2(opts = {}) {
12111
12185
  const command = opts.startUrl ?? "bash";
12112
12186
  const tuiSess = await launchTui(command, {
12113
12187
  headless: opts.headless ?? true,
12114
- viewport: opts.viewport
12188
+ viewport: opts.viewport,
12189
+ theme: opts.tuiTheme ?? "system"
12115
12190
  });
12116
12191
  browser = tuiSess.browser;
12117
12192
  page = tuiSess.page;
@@ -19493,6 +19568,63 @@ var init_agents2 = __esm(() => {
19493
19568
  init_agents();
19494
19569
  });
19495
19570
 
19571
+ // src/lib/gallery-diff.ts
19572
+ var exports_gallery_diff = {};
19573
+ __export(exports_gallery_diff, {
19574
+ diffImages: () => diffImages
19575
+ });
19576
+ import { join as join11 } from "path";
19577
+ import { mkdirSync as mkdirSync9 } from "fs";
19578
+ async function diffImages(path1, path2) {
19579
+ const img1 = import_sharp2.default(path1);
19580
+ const img2 = import_sharp2.default(path2);
19581
+ const [meta1, meta2] = await Promise.all([img1.metadata(), img2.metadata()]);
19582
+ const w = Math.min(meta1.width ?? 1280, meta2.width ?? 1280);
19583
+ const h = Math.min(meta1.height ?? 720, meta2.height ?? 720);
19584
+ const [raw1, raw2] = await Promise.all([
19585
+ import_sharp2.default(path1).resize(w, h, { fit: "fill" }).raw().toBuffer(),
19586
+ import_sharp2.default(path2).resize(w, h, { fit: "fill" }).raw().toBuffer()
19587
+ ]);
19588
+ const totalPixels = w * h;
19589
+ const channels = 3;
19590
+ const diffBuffer = Buffer.alloc(raw1.length);
19591
+ let changedPixels = 0;
19592
+ for (let i = 0;i < raw1.length; i += channels) {
19593
+ const dr = Math.abs(raw1[i] - raw2[i]);
19594
+ const dg = Math.abs(raw1[i + 1] - raw2[i + 1]);
19595
+ const db = Math.abs(raw1[i + 2] - raw2[i + 2]);
19596
+ const diff = (dr + dg + db) / 3;
19597
+ if (diff > 10) {
19598
+ changedPixels++;
19599
+ diffBuffer[i] = 255;
19600
+ diffBuffer[i + 1] = 0;
19601
+ diffBuffer[i + 2] = 0;
19602
+ } else {
19603
+ diffBuffer[i] = Math.round(raw1[i] * 0.4);
19604
+ diffBuffer[i + 1] = Math.round(raw1[i + 1] * 0.4);
19605
+ diffBuffer[i + 2] = Math.round(raw1[i + 2] * 0.4);
19606
+ }
19607
+ }
19608
+ const dataDir = getDataDir2();
19609
+ const diffDir = join11(dataDir, "diffs");
19610
+ mkdirSync9(diffDir, { recursive: true });
19611
+ const diffPath = join11(diffDir, `diff-${Date.now()}.webp`);
19612
+ const diffImageBuffer = await import_sharp2.default(diffBuffer, { raw: { width: w, height: h, channels } }).webp({ quality: 85 }).toBuffer();
19613
+ await Bun.write(diffPath, diffImageBuffer);
19614
+ return {
19615
+ diff_path: diffPath,
19616
+ diff_base64: diffImageBuffer.toString("base64"),
19617
+ changed_pixels: changedPixels,
19618
+ total_pixels: totalPixels,
19619
+ changed_percent: changedPixels / totalPixels * 100
19620
+ };
19621
+ }
19622
+ var import_sharp2;
19623
+ var init_gallery_diff = __esm(() => {
19624
+ init_schema();
19625
+ import_sharp2 = __toESM(require_lib3(), 1);
19626
+ });
19627
+
19496
19628
  // src/lib/profiles.ts
19497
19629
  var exports_profiles = {};
19498
19630
  __export(exports_profiles, {
@@ -43580,57 +43712,9 @@ function detectType(filename) {
43580
43712
  };
43581
43713
  return map[ext] ?? "file";
43582
43714
  }
43583
- // src/lib/gallery-diff.ts
43584
- init_schema();
43585
- var import_sharp2 = __toESM(require_lib3(), 1);
43586
- import { join as join11 } from "path";
43587
- import { mkdirSync as mkdirSync9 } from "fs";
43588
- async function diffImages(path1, path2) {
43589
- const img1 = import_sharp2.default(path1);
43590
- const img2 = import_sharp2.default(path2);
43591
- const [meta1, meta2] = await Promise.all([img1.metadata(), img2.metadata()]);
43592
- const w = Math.min(meta1.width ?? 1280, meta2.width ?? 1280);
43593
- const h = Math.min(meta1.height ?? 720, meta2.height ?? 720);
43594
- const [raw1, raw2] = await Promise.all([
43595
- import_sharp2.default(path1).resize(w, h, { fit: "fill" }).raw().toBuffer(),
43596
- import_sharp2.default(path2).resize(w, h, { fit: "fill" }).raw().toBuffer()
43597
- ]);
43598
- const totalPixels = w * h;
43599
- const channels = 3;
43600
- const diffBuffer = Buffer.alloc(raw1.length);
43601
- let changedPixels = 0;
43602
- for (let i = 0;i < raw1.length; i += channels) {
43603
- const dr = Math.abs(raw1[i] - raw2[i]);
43604
- const dg = Math.abs(raw1[i + 1] - raw2[i + 1]);
43605
- const db = Math.abs(raw1[i + 2] - raw2[i + 2]);
43606
- const diff = (dr + dg + db) / 3;
43607
- if (diff > 10) {
43608
- changedPixels++;
43609
- diffBuffer[i] = 255;
43610
- diffBuffer[i + 1] = 0;
43611
- diffBuffer[i + 2] = 0;
43612
- } else {
43613
- diffBuffer[i] = Math.round(raw1[i] * 0.4);
43614
- diffBuffer[i + 1] = Math.round(raw1[i + 1] * 0.4);
43615
- diffBuffer[i + 2] = Math.round(raw1[i + 2] * 0.4);
43616
- }
43617
- }
43618
- const dataDir = getDataDir2();
43619
- const diffDir = join11(dataDir, "diffs");
43620
- mkdirSync9(diffDir, { recursive: true });
43621
- const diffPath = join11(diffDir, `diff-${Date.now()}.webp`);
43622
- const diffImageBuffer = await import_sharp2.default(diffBuffer, { raw: { width: w, height: h, channels } }).webp({ quality: 85 }).toBuffer();
43623
- await Bun.write(diffPath, diffImageBuffer);
43624
- return {
43625
- diff_path: diffPath,
43626
- diff_base64: diffImageBuffer.toString("base64"),
43627
- changed_pixels: changedPixels,
43628
- total_pixels: totalPixels,
43629
- changed_percent: changedPixels / totalPixels * 100
43630
- };
43631
- }
43632
43715
 
43633
43716
  // src/mcp/helpers.ts
43717
+ init_gallery_diff();
43634
43718
  init_snapshot();
43635
43719
 
43636
43720
  // src/lib/files-integration.ts
@@ -43806,12 +43890,26 @@ function resolveSessionId(sessionId) {
43806
43890
 
43807
43891
  // src/mcp/sessions.ts
43808
43892
  function register(server) {
43809
- server.tool("browser_session_create", "Create a new browser session. If agent_id is set and already has an active session, returns the existing one (use force_new to override). If session_id is omitted on other tools, the single active session is auto-selected. Use cdp_url to attach to an already-running Chrome instance.", {
43810
- engine: exports_external.enum(["playwright", "cdp", "lightpanda", "bun", "tui", "auto"]).optional().default("auto"),
43811
- use_case: exports_external.string().optional(),
43893
+ server.tool("browser_session_create", `Create a new browser session. Returns a session object with an id you must pass to other tools.
43894
+
43895
+ ENGINES:
43896
+ - "auto" (default): picks the best engine for your use case automatically
43897
+ - "playwright": full browser automation \u2014 forms, SPAs, auth flows, multi-tab
43898
+ - "cdp": Chrome DevTools Protocol \u2014 network monitoring, perf profiling, script injection
43899
+ - "lightpanda": fast headless for static pages
43900
+ - "bun": native Bun.WebView \u2014 fastest for screenshots and scraping
43901
+ - "tui": terminal UI testing \u2014 launches a CLI/TUI app (Ink, Blessed, Bubbletea, etc.) via ttyd and connects Playwright to it. Pass the shell command as start_url (e.g. "htop", "bun run app.tsx"). All browser tools (screenshot, click, type, wait) work on the terminal. Use tui_theme to control dark/light appearance.
43902
+
43903
+ TIPS:
43904
+ - If agent_id is set and already has an active session, returns the existing one (use force_new to override)
43905
+ - If session_id is omitted on other tools, the single active session is auto-selected
43906
+ - Use cdp_url to attach to an already-running Chrome instance
43907
+ - For TUI sessions: start_url is the shell command to run, NOT a URL`, {
43908
+ engine: exports_external.enum(["playwright", "cdp", "lightpanda", "bun", "tui", "auto"]).optional().default("auto").describe("Browser engine. Use 'tui' for terminal/CLI app testing \u2014 pass the command as start_url"),
43909
+ use_case: exports_external.string().optional().describe("Hint for auto engine selection: scrape, screenshot, form, auth, network, har, perf, terminal, tui"),
43812
43910
  project_id: exports_external.string().optional(),
43813
43911
  agent_id: exports_external.string().optional(),
43814
- start_url: exports_external.string().optional(),
43912
+ start_url: exports_external.string().optional().describe("URL to navigate to, OR for engine='tui': the shell command to run (e.g. 'htop', 'bun run app.tsx')"),
43815
43913
  headless: exports_external.boolean().optional().default(true),
43816
43914
  viewport_width: exports_external.number().optional().default(1280),
43817
43915
  viewport_height: exports_external.number().optional().default(720),
@@ -43820,8 +43918,9 @@ function register(server) {
43820
43918
  storage_state: exports_external.string().optional().describe("Name of saved storage state to load (restores cookies/auth from previous session)"),
43821
43919
  force_new: exports_external.boolean().optional().default(false).describe("Force create a new session even if agent already has one"),
43822
43920
  tags: exports_external.array(exports_external.string()).optional(),
43823
- 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")
43824
- }, 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 }) => {
43921
+ 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 }) => {
43825
43924
  try {
43826
43925
  if (agent_id && !force_new) {
43827
43926
  const existing = getActiveSessionForAgent2(agent_id);
@@ -43839,7 +43938,8 @@ function register(server) {
43839
43938
  stealth,
43840
43939
  autoGallery: auto_gallery,
43841
43940
  storageState: storage_state,
43842
- cdpUrl: cdp_url
43941
+ cdpUrl: cdp_url,
43942
+ tuiTheme: tui_theme
43843
43943
  });
43844
43944
  if (tags?.length) {
43845
43945
  const { addSessionTag: addSessionTag2 } = await Promise.resolve().then(() => (init_sessions(), exports_sessions));
@@ -44879,6 +44979,40 @@ function register3(server) {
44879
44979
  return err(e);
44880
44980
  }
44881
44981
  });
44982
+ server.tool("browser_diff", "Visual diff between two URLs or a URL and a gallery entry. Screenshots both, returns a pixel diff image highlighting changes in red.", {
44983
+ session_id: exports_external.string().optional(),
44984
+ url1: exports_external.string().describe("First URL to screenshot"),
44985
+ url2: exports_external.string().describe("Second URL to screenshot"),
44986
+ threshold: exports_external.number().optional().default(10).describe("Pixel difference threshold (0-255, default 10)"),
44987
+ wait_ms: exports_external.number().optional().default(1000).describe("Wait time after navigation before screenshot (ms)")
44988
+ }, async ({ session_id, url1, url2, threshold, wait_ms }) => {
44989
+ try {
44990
+ const sid = resolveSessionId(session_id);
44991
+ const page = getSessionPage(sid);
44992
+ await page.goto(url1, { waitUntil: "domcontentloaded" });
44993
+ await new Promise((r) => setTimeout(r, wait_ms));
44994
+ const ss1 = await takeScreenshot(page, { maxWidth: 1280, compress: true, track: false });
44995
+ await page.goto(url2, { waitUntil: "domcontentloaded" });
44996
+ await new Promise((r) => setTimeout(r, wait_ms));
44997
+ const ss2 = await takeScreenshot(page, { maxWidth: 1280, compress: true, track: false });
44998
+ const { diffImages: diffImages2 } = await Promise.resolve().then(() => (init_gallery_diff(), exports_gallery_diff));
44999
+ const diff = await diffImages2(ss1.path, ss2.path);
45000
+ logEvent(sid, "diff", { url1, url2, changed_percent: diff.changed_percent });
45001
+ return json({
45002
+ url1,
45003
+ url2,
45004
+ changed_pixels: diff.changed_pixels,
45005
+ total_pixels: diff.total_pixels,
45006
+ changed_percent: Math.round(diff.changed_percent * 100) / 100,
45007
+ diff_path: diff.diff_path,
45008
+ diff_base64: diff.diff_base64.length > 50000 ? undefined : diff.diff_base64,
45009
+ screenshot1_path: ss1.path,
45010
+ screenshot2_path: ss2.path
45011
+ });
45012
+ } catch (e) {
45013
+ return err(e);
45014
+ }
45015
+ });
44882
45016
  }
44883
45017
 
44884
45018
  // src/mcp/network.ts
@@ -45223,6 +45357,53 @@ function register4(server) {
45223
45357
  return err(e);
45224
45358
  }
45225
45359
  });
45360
+ server.tool("browser_performance_budget", "Check page performance against a budget. Set thresholds for LCP, FCP, CLS, TTFB, DOM complete, and load event. Returns pass/fail per metric with actual values.", {
45361
+ session_id: exports_external.string().optional(),
45362
+ lcp_ms: exports_external.number().optional().describe("Largest Contentful Paint budget in ms (good: <2500)"),
45363
+ fcp_ms: exports_external.number().optional().describe("First Contentful Paint budget in ms (good: <1800)"),
45364
+ cls: exports_external.number().optional().describe("Cumulative Layout Shift budget (good: <0.1)"),
45365
+ ttfb_ms: exports_external.number().optional().describe("Time to First Byte budget in ms (good: <800)"),
45366
+ dom_complete_ms: exports_external.number().optional().describe("DOM complete budget in ms"),
45367
+ load_event_ms: exports_external.number().optional().describe("Load event budget in ms"),
45368
+ js_heap_mb: exports_external.number().optional().describe("JS heap size budget in MB")
45369
+ }, async ({ session_id, lcp_ms, fcp_ms, cls, ttfb_ms, dom_complete_ms, load_event_ms, js_heap_mb }) => {
45370
+ try {
45371
+ const sid = resolveSessionId(session_id);
45372
+ const page = getSessionPage(sid);
45373
+ const metrics = await getPerformanceMetrics(page);
45374
+ const checks = [];
45375
+ let allPassed = true;
45376
+ const check = (name, budget, actual) => {
45377
+ if (budget === undefined)
45378
+ return;
45379
+ const passed = actual !== undefined && actual <= budget;
45380
+ if (!passed)
45381
+ allPassed = false;
45382
+ checks.push({ metric: name, budget, actual, passed });
45383
+ };
45384
+ check("lcp", lcp_ms, metrics.lcp);
45385
+ check("fcp", fcp_ms, metrics.fcp);
45386
+ check("cls", cls, metrics.cls);
45387
+ check("ttfb", ttfb_ms, metrics.ttfb);
45388
+ check("dom_complete", dom_complete_ms, metrics.dom_complete);
45389
+ check("load_event", load_event_ms, metrics.load_event);
45390
+ if (js_heap_mb !== undefined && metrics.js_heap_size_used !== undefined) {
45391
+ const heapMb = metrics.js_heap_size_used / (1024 * 1024);
45392
+ const passed = heapMb <= js_heap_mb;
45393
+ if (!passed)
45394
+ allPassed = false;
45395
+ checks.push({ metric: "js_heap_mb", budget: js_heap_mb, actual: Math.round(heapMb * 100) / 100, passed });
45396
+ }
45397
+ return json({
45398
+ passed: allPassed,
45399
+ checks,
45400
+ metrics,
45401
+ url: page.url()
45402
+ });
45403
+ } catch (e) {
45404
+ return err(e);
45405
+ }
45406
+ });
45226
45407
  }
45227
45408
 
45228
45409
  // src/mcp/recordings.ts
@@ -45397,6 +45578,19 @@ function register5(server) {
45397
45578
  return err(e);
45398
45579
  }
45399
45580
  });
45581
+ server.tool("browser_record_export", "Export a recording as a Playwright test (.spec.ts), Puppeteer script, or JSON. Returns the generated code as text.", {
45582
+ recording_id: exports_external.string().describe("ID of the recording to export"),
45583
+ format: exports_external.enum(["playwright", "puppeteer", "json"]).optional().default("playwright").describe("Export format")
45584
+ }, async ({ recording_id, format }) => {
45585
+ try {
45586
+ const { exportRecording: exportRecording2 } = await Promise.resolve().then(() => (init_recorder(), exports_recorder));
45587
+ const code = exportRecording2(recording_id, format);
45588
+ const ext = format === "json" ? ".json" : format === "playwright" ? ".spec.ts" : ".js";
45589
+ return json({ format, filename: `recording-${recording_id}${ext}`, code });
45590
+ } catch (e) {
45591
+ return err(e);
45592
+ }
45593
+ });
45400
45594
  }
45401
45595
 
45402
45596
  // src/mcp/scripts.ts
@@ -45809,7 +46003,8 @@ function register7(server) {
45809
46003
  { tool: "browser_screenshot", description: "Take a screenshot (PNG/JPEG/WebP, annotate=true for labels)" },
45810
46004
  { tool: "browser_pdf", description: "Generate a PDF of the page" },
45811
46005
  { tool: "browser_scroll_and_screenshot", description: "Scroll then screenshot in one call" },
45812
- { tool: "browser_scroll_to_element", description: "Scroll element into view + screenshot" }
46006
+ { tool: "browser_scroll_to_element", description: "Scroll element into view + screenshot" },
46007
+ { tool: "browser_diff", description: "Visual diff between two URLs \u2014 highlights changes in red" }
45813
46008
  ],
45814
46009
  Storage: [
45815
46010
  { tool: "browser_cookies_get", description: "Get cookies" },
@@ -45834,7 +46029,8 @@ function register7(server) {
45834
46029
  { tool: "browser_intercept_clear", description: "Remove all response intercepts" }
45835
46030
  ],
45836
46031
  Performance: [
45837
- { tool: "browser_performance", description: "Get performance metrics" }
46032
+ { tool: "browser_performance", description: "Get performance metrics" },
46033
+ { tool: "browser_performance_budget", description: "Check perf against budget thresholds (LCP, FCP, CLS, TTFB)" }
45838
46034
  ],
45839
46035
  Console: [
45840
46036
  { tool: "browser_console_log", description: "Get console messages" },
@@ -45847,6 +46043,7 @@ function register7(server) {
45847
46043
  { tool: "browser_record_step", description: "Add a step to recording" },
45848
46044
  { tool: "browser_record_stop", description: "Stop and save recording" },
45849
46045
  { tool: "browser_record_replay", description: "Replay a recorded sequence" },
46046
+ { tool: "browser_record_export", description: "Export recording as Playwright test, Puppeteer script, or JSON" },
45850
46047
  { tool: "browser_recordings_list", description: "List all recordings" }
45851
46048
  ],
45852
46049
  Auth: [
@@ -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,QAk7BzC"}
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 +1 @@
1
- {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/mcp/network.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiCzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,QA6czC"}
1
+ {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/mcp/network.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiCzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,QAmgBzC"}
@@ -1 +1 @@
1
- {"version":3,"file":"recordings.d.ts","sourceRoot":"","sources":["../../src/mcp/recordings.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkBzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,QA8OzC"}
1
+ {"version":3,"file":"recordings.d.ts","sourceRoot":"","sources":["../../src/mcp/recordings.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkBzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,QAiQzC"}
@@ -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,QAoXzC"}
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"}
@@ -18153,6 +18153,52 @@ init_types();
18153
18153
  import { execSync as execSync2, spawn as spawn2 } from "child_process";
18154
18154
  var DEFAULT_TTYD_PORT_START = 7780;
18155
18155
  var nextPort = DEFAULT_TTYD_PORT_START;
18156
+ var THEMES = {
18157
+ dark: {
18158
+ background: "#1e1e1e",
18159
+ foreground: "#d4d4d4",
18160
+ cursor: "#d4d4d4",
18161
+ selectionBackground: "#264f78",
18162
+ black: "#1e1e1e",
18163
+ red: "#f44747",
18164
+ green: "#6a9955",
18165
+ yellow: "#d7ba7d",
18166
+ blue: "#569cd6",
18167
+ magenta: "#c586c0",
18168
+ cyan: "#4ec9b0",
18169
+ white: "#d4d4d4",
18170
+ brightBlack: "#808080",
18171
+ brightRed: "#f44747",
18172
+ brightGreen: "#6a9955",
18173
+ brightYellow: "#d7ba7d",
18174
+ brightBlue: "#569cd6",
18175
+ brightMagenta: "#c586c0",
18176
+ brightCyan: "#4ec9b0",
18177
+ brightWhite: "#ffffff"
18178
+ },
18179
+ light: {
18180
+ background: "#ffffff",
18181
+ foreground: "#1e1e1e",
18182
+ cursor: "#1e1e1e",
18183
+ selectionBackground: "#add6ff",
18184
+ black: "#1e1e1e",
18185
+ red: "#cd3131",
18186
+ green: "#008000",
18187
+ yellow: "#795e26",
18188
+ blue: "#0451a5",
18189
+ magenta: "#af00db",
18190
+ cyan: "#0598bc",
18191
+ white: "#d4d4d4",
18192
+ brightBlack: "#808080",
18193
+ brightRed: "#cd3131",
18194
+ brightGreen: "#008000",
18195
+ brightYellow: "#795e26",
18196
+ brightBlue: "#0451a5",
18197
+ brightMagenta: "#af00db",
18198
+ brightCyan: "#0598bc",
18199
+ brightWhite: "#ffffff"
18200
+ }
18201
+ };
18156
18202
  function isTuiAvailable() {
18157
18203
  try {
18158
18204
  execSync2("which ttyd", { stdio: "ignore" });
@@ -18210,7 +18256,35 @@ async function launchTui(command, options = {}) {
18210
18256
  waitUntil: "domcontentloaded"
18211
18257
  });
18212
18258
  await page.waitForSelector(".xterm-screen", { timeout: 1e4 });
18213
- return { ttydProcess, port, browser, page };
18259
+ let resolvedTheme = "dark";
18260
+ const requestedTheme = options.theme ?? "system";
18261
+ if (requestedTheme === "light") {
18262
+ resolvedTheme = "light";
18263
+ } else if (requestedTheme === "dark") {
18264
+ resolvedTheme = "dark";
18265
+ } else {
18266
+ try {
18267
+ const result = execSync2("defaults read -g AppleInterfaceStyle 2>/dev/null", { encoding: "utf8" }).trim();
18268
+ resolvedTheme = result === "Dark" ? "dark" : "light";
18269
+ } catch {
18270
+ resolvedTheme = "light";
18271
+ }
18272
+ }
18273
+ const themeColors = THEMES[resolvedTheme];
18274
+ await page.evaluate((theme) => {
18275
+ const term = window.term ?? window.terminal;
18276
+ if (term?.options) {
18277
+ term.options.theme = theme;
18278
+ }
18279
+ document.body.style.backgroundColor = theme.background;
18280
+ const container = document.getElementById("terminal-container");
18281
+ if (container)
18282
+ container.style.backgroundColor = theme.background;
18283
+ const viewport2 = document.querySelector(".xterm-viewport");
18284
+ if (viewport2)
18285
+ viewport2.style.backgroundColor = theme.background;
18286
+ }, themeColors);
18287
+ return { ttydProcess, port, browser, page, theme: resolvedTheme };
18214
18288
  } catch (err) {
18215
18289
  ttydProcess.kill();
18216
18290
  throw err;
@@ -18577,7 +18651,8 @@ async function createSession2(opts = {}) {
18577
18651
  const command = opts.startUrl ?? "bash";
18578
18652
  const tuiSess = await launchTui(command, {
18579
18653
  headless: opts.headless ?? true,
18580
- viewport: opts.viewport
18654
+ viewport: opts.viewport,
18655
+ theme: opts.tuiTheme ?? "system"
18581
18656
  });
18582
18657
  browser = tuiSess.browser;
18583
18658
  page = tuiSess.page;
@@ -70,6 +70,7 @@ export interface SessionOptions {
70
70
  autoGallery?: boolean;
71
71
  cdpUrl?: string;
72
72
  storageState?: string;
73
+ tuiTheme?: "dark" | "light" | "system";
73
74
  }
74
75
  export interface Snapshot {
75
76
  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.0",
3
+ "version": "0.4.2",
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",