blun-king-cli 5.3.1 → 5.3.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.
Files changed (2) hide show
  1. package/blun-cli.js +98 -12
  2. package/package.json +1 -1
package/blun-cli.js CHANGED
@@ -564,6 +564,10 @@ async function handleCommand(input) {
564
564
  await cmdRender(args);
565
565
  break;
566
566
 
567
+ case "/browser":
568
+ await cmdBrowser(args);
569
+ break;
570
+
567
571
  case "/exit":
568
572
  case "/quit":
569
573
  case "/q":
@@ -1708,27 +1712,109 @@ async function cmdAgent(args) {
1708
1712
  async function cmdScreenshot(args) {
1709
1713
  if (!args) { printError("Usage: /screenshot <url>"); return; }
1710
1714
  try {
1711
- printInfo("Taking screenshot of " + args + "...");
1712
- var resp = await apiCall("POST", "/screenshot", { url: args });
1713
- if (resp.status !== 200) { printError(resp.data.error || "Error"); return; }
1714
- printSuccess("Screenshot: " + resp.data.title);
1715
- console.log(" Download: " + C.brightCyan + config.api.base_url + resp.data.screenshot + C.reset);
1716
- console.log("");
1715
+ // Try local Playwright first
1716
+ var browser = null;
1717
+ try { browser = require(path.join(__dirname, "browser-controller")); } catch(e) {}
1718
+ if (!browser) {
1719
+ try { browser = require("playwright"); } catch(e) {}
1720
+ }
1721
+
1722
+ if (browser && browser.open) {
1723
+ printInfo("Opening " + args + " (local Playwright)...");
1724
+ var snap = await browser.open(args);
1725
+ var shotPath = path.join(config.workdir, "screenshot-" + Date.now() + ".png");
1726
+ await browser.screenshot(shotPath);
1727
+ printSuccess("Screenshot saved: " + shotPath);
1728
+ console.log(" " + C.gray + "Title: " + C.reset + snap.title);
1729
+ console.log(" " + C.gray + "URL: " + C.reset + snap.url);
1730
+ console.log("");
1731
+ } else {
1732
+ // Fallback to server API
1733
+ printInfo("Taking screenshot via server...");
1734
+ var resp = await apiCall("POST", "/screenshot", { url: args });
1735
+ if (resp.status !== 200) { printError(resp.data.error || "Error"); return; }
1736
+ printSuccess("Screenshot: " + resp.data.title);
1737
+ console.log(" Download: " + C.brightCyan + config.api.base_url + resp.data.screenshot + C.reset);
1738
+ console.log("");
1739
+ }
1717
1740
  } catch(e) { printError(e.message); }
1718
1741
  }
1719
1742
 
1720
1743
  async function cmdRender(args) {
1721
1744
  if (!args) { printError("Usage: /render <url>"); return; }
1722
1745
  try {
1723
- printInfo("Rendering " + args + " with Playwright...");
1724
- var resp = await apiCall("POST", "/render", { url: args });
1725
- if (resp.status !== 200) { printError(resp.data.error || "Error"); return; }
1726
- printSuccess("Rendered: " + resp.data.title + " (" + resp.data.html_length + " chars)");
1727
- if (resp.data.screenshot) console.log(" Screenshot: " + C.brightCyan + resp.data.screenshot + C.reset);
1728
- console.log("");
1746
+ var browser = null;
1747
+ try { browser = require(path.join(__dirname, "browser-controller")); } catch(e) {}
1748
+
1749
+ if (browser && browser.open) {
1750
+ printInfo("Rendering " + args + " (local Playwright)...");
1751
+ var snap = await browser.open(args);
1752
+ printSuccess("Rendered: " + snap.title);
1753
+ console.log(" " + C.gray + "URL: " + C.reset + snap.url);
1754
+ if (snap.text) {
1755
+ console.log(C.dim + " " + BOX.h.repeat(40) + C.reset);
1756
+ console.log(" " + snap.text.slice(0, 500));
1757
+ }
1758
+ console.log("");
1759
+ } else {
1760
+ printInfo("Rendering " + args + " via server...");
1761
+ var resp = await apiCall("POST", "/render", { url: args });
1762
+ if (resp.status !== 200) { printError(resp.data.error || "Error"); return; }
1763
+ printSuccess("Rendered: " + resp.data.title + " (" + resp.data.html_length + " chars)");
1764
+ if (resp.data.screenshot) console.log(" Screenshot: " + C.brightCyan + resp.data.screenshot + C.reset);
1765
+ console.log("");
1766
+ }
1729
1767
  } catch(e) { printError(e.message); }
1730
1768
  }
1731
1769
 
1770
+ // ── Browser Control Commands ──
1771
+ async function cmdBrowser(args) {
1772
+ var browser = null;
1773
+ try { browser = require(path.join(__dirname, "browser-controller")); } catch(e) {}
1774
+ if (!browser) {
1775
+ printError("Playwright not available. Run: npx playwright install chromium");
1776
+ return;
1777
+ }
1778
+ var parts = (args || "").split(/\s+/);
1779
+ var action = parts[0] || "help";
1780
+
1781
+ if (action === "open" && parts[1]) {
1782
+ printInfo("Opening " + parts[1] + "...");
1783
+ var snap = await browser.open(parts[1]);
1784
+ printSuccess(snap.title + " — " + snap.url);
1785
+ } else if (action === "click" && parts[1]) {
1786
+ var snap = await browser.click(parts.slice(1).join(" "));
1787
+ printSuccess("Clicked. Now at: " + snap.url);
1788
+ } else if (action === "type" && parts[1]) {
1789
+ var selector = parts[1];
1790
+ var text = parts.slice(2).join(" ");
1791
+ var snap = await browser.type(selector, text);
1792
+ printSuccess("Typed into " + selector);
1793
+ } else if (action === "screenshot") {
1794
+ var shotPath = parts[1] || path.join(config.workdir, "screenshot-" + Date.now() + ".png");
1795
+ await browser.screenshot(shotPath);
1796
+ printSuccess("Screenshot: " + shotPath);
1797
+ } else if (action === "snap" || action === "snapshot") {
1798
+ var snap = await browser.snapshot();
1799
+ console.log(C.gray + " URL: " + C.reset + snap.url);
1800
+ console.log(C.gray + " Title: " + C.reset + snap.title);
1801
+ if (snap.text) console.log(" " + snap.text.slice(0, 300));
1802
+ } else if (action === "close") {
1803
+ await browser.close();
1804
+ printSuccess("Browser closed.");
1805
+ } else {
1806
+ console.log("");
1807
+ console.log(C.bold + " Browser Commands:" + C.reset);
1808
+ console.log(" /browser open <url> Open a URL");
1809
+ console.log(" /browser click <selector> Click an element");
1810
+ console.log(" /browser type <sel> <text> Type text into element");
1811
+ console.log(" /browser screenshot [path] Take screenshot");
1812
+ console.log(" /browser snap Get page text snapshot");
1813
+ console.log(" /browser close Close browser");
1814
+ console.log("");
1815
+ }
1816
+ }
1817
+
1732
1818
  // ══════════════════════════════════════════════════
1733
1819
  // ── 1. SETTINGS REGISTRY (Multi-Scope) ──
1734
1820
  // ══════════════════════════════════════════════════
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blun-king-cli",
3
- "version": "5.3.1",
3
+ "version": "5.3.2",
4
4
  "description": "BLUN King CLI — Your local AI assistant powered by Gemma4",
5
5
  "type": "commonjs",
6
6
  "bin": {