blun-king-cli 5.3.0 → 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.
- package/blun-cli.js +99 -14
- package/package.json +1 -1
package/blun-cli.js
CHANGED
|
@@ -147,8 +147,7 @@ function printHeader() {
|
|
|
147
147
|
// ── Update Checker ──
|
|
148
148
|
function checkForUpdates() {
|
|
149
149
|
try {
|
|
150
|
-
var currentVersion =
|
|
151
|
-
try { currentVersion = require(path.join(__dirname, "..", "package.json")).version; } catch(e) {}
|
|
150
|
+
var currentVersion = PKG_VERSION;
|
|
152
151
|
var nullDev = process.platform === "win32" ? "2>NUL" : "2>/dev/null";
|
|
153
152
|
var latest = execSync("npm view blun-king-cli version " + nullDev, { encoding: "utf8", timeout: 8000, stdio: ["pipe", "pipe", "pipe"] }).trim();
|
|
154
153
|
if (latest && latest !== currentVersion) {
|
|
@@ -565,6 +564,10 @@ async function handleCommand(input) {
|
|
|
565
564
|
await cmdRender(args);
|
|
566
565
|
break;
|
|
567
566
|
|
|
567
|
+
case "/browser":
|
|
568
|
+
await cmdBrowser(args);
|
|
569
|
+
break;
|
|
570
|
+
|
|
568
571
|
case "/exit":
|
|
569
572
|
case "/quit":
|
|
570
573
|
case "/q":
|
|
@@ -1709,27 +1712,109 @@ async function cmdAgent(args) {
|
|
|
1709
1712
|
async function cmdScreenshot(args) {
|
|
1710
1713
|
if (!args) { printError("Usage: /screenshot <url>"); return; }
|
|
1711
1714
|
try {
|
|
1712
|
-
|
|
1713
|
-
var
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
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
|
+
}
|
|
1718
1740
|
} catch(e) { printError(e.message); }
|
|
1719
1741
|
}
|
|
1720
1742
|
|
|
1721
1743
|
async function cmdRender(args) {
|
|
1722
1744
|
if (!args) { printError("Usage: /render <url>"); return; }
|
|
1723
1745
|
try {
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
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
|
+
}
|
|
1730
1767
|
} catch(e) { printError(e.message); }
|
|
1731
1768
|
}
|
|
1732
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
|
+
|
|
1733
1818
|
// ══════════════════════════════════════════════════
|
|
1734
1819
|
// ── 1. SETTINGS REGISTRY (Multi-Scope) ──
|
|
1735
1820
|
// ══════════════════════════════════════════════════
|