webcrawl 1.4.4 → 1.4.5

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.d.ts CHANGED
@@ -17,7 +17,9 @@ export interface Deps {
17
17
  /** Working directory override for `webcrawl setup` tests. */
18
18
  cwd?: string;
19
19
  }
20
- export declare const HELP = "Webcrawl Anything: search, scrape, parse and crawl any target on the internet\n\nUsage: webcrawl <command> [options]\n\nCommands\n search <query> Search the web or verticals. -c category, --sub, -n limit, --site <domain>\n scrape <url> Inspect a URL (website, SPA, PDF, Office, YouTube, GitHub, ArXiv, llms.txt)\n map <url> List a site's URLs. --filter <text>, -n limit\n crawl <url> Read several pages. -n max pages (default 5, max 25)\n extract <url> Structured JSON. --prompt <text> or --schema <file.json>\n rerank <query> Rank documents. --doc <text> (repeatable), --file <path>, or lines on stdin. -n top\n monitor [subcmd] Watch pages/sites: create <url...>, list, get <id>, check <id>, pause <id>, resume <id>, delete <id>\n targets List all supported crawl & search targets and their requirements\n categories List search categories and vertical filters\n setup Register Webcrawl MCP server and Agent Skill (Claude, Cursor, Codex, Gemini, Windsurf)\n doctor Check local crawl engine, parsers, stealth browser, and cloud configuration\n login / signup Create an account or sign in in your browser (default), or --email <addr> [--code <6-digit>], or --key <key>\n whoami Show execution mode (local vs cloud), account email, key source, and credit balance\n\nOptions\n --mode <m> Execution mode: auto (default: local without key, cloud with key), local, or cloud\n --email <addr> Email address for CLI account creation / OTP sign-in (assigns 1,000 free credits)\n --code <6-digit> 6-digit email verification code from `webcrawl login --email <addr>`\n --name <name> Optional display name when creating an account with `--email`\n --web Sign in via browser OAuth (default for login; no need to pass it)\n --json Print the raw JSON response\n --api-key <key> Override WEBCRAWL_API_KEY\n --url <base> Override WEBCRAWL_URL (default https://webcrawl.app)\n --country, --city Where to search from (default: this machine's timezone)\n --no-cache Skip cached pages (scrape)\n --scope <s|u|w> Monitor scope: page (default), urls, or site\n --interval <mins> Monitor check interval in minutes (default 60)\n --watch-for <text> What to watch for (e.g. \"Pricing tiers and discounts\")\n --condition <expr> Trigger rule expression (e.g. 'price < 50', 'content contains \"In Stock\"')\n --notify-email <e> Alert email address when triggered (or 'true' for account email)\n --webhook <url> Alert webhook URL when triggered\n --agent <name> Target agent for setup: claude, cursor, codex, gemini, windsurf, or all (repeatable)\n --schema-profile MCP schema profile for setup: compact (default) or full\n -h, --help\n\nConfig order: flags, then WEBCRAWL_API_KEY / WEBCRAWL_URL / WEBCRAWL_MODE, then ~/.config/webcrawl/config.json";
20
+ export declare const HELP = "Webcrawl Anything: search, scrape, parse and crawl any target on the internet\n\nUsage: webcrawl <command> [options]\n\nCommands\n search <query> Search the web or verticals. -c category, --sub, -n limit, --site <domain>\n scrape <url> Inspect a URL (website, SPA, PDF, Office, YouTube, GitHub, ArXiv, llms.txt)\n map <url> List a site's URLs. --filter <text>, -n limit\n crawl <url> Read several pages. -n max pages (default 5, max 25)\n extract <url> Structured JSON. --prompt <text> or --schema <file.json>\n rerank <query> Rank documents. --doc <text> (repeatable), --file <path>, or lines on stdin. -n top\n monitor [subcmd] Watch pages/sites: create <url...>, list, get <id>, check <id>, pause <id>, resume <id>, delete <id>\n targets List all supported crawl & search targets and their requirements\n categories List search categories and vertical filters\n setup Register Webcrawl MCP server and Agent Skill (Claude, Cursor, Codex, Gemini, Windsurf)\n doctor Check local crawl engine, parsers, stealth browser, and cloud configuration\n login / signup Create an account or sign in in your browser (default), or --email <addr> [--code <6-digit>], or --key <key>\n whoami Show execution mode (local vs cloud), account email, key source, and credit balance\n\nOptions\n --mode <m> Execution mode: auto (default: local without key, cloud with key), local, or cloud\n --email <addr> Email address for CLI account creation / OTP sign-in (assigns 1,000 free credits)\n --code <6-digit> 6-digit email verification code from `webcrawl login --email <addr>`\n --name <name> Optional display name when creating an account with `--email`\n --web Sign in via browser OAuth (default for login; no need to pass it)\n --json Print the raw JSON response\n --api-key <key> Override WEBCRAWL_API_KEY\n --url <base> Override WEBCRAWL_URL (default https://webcrawl.app)\n --country, --city Where to search from (default: this machine's timezone)\n --no-cache Skip cached pages (scrape)\n --scope <s|u|w> Monitor scope: page (default), urls, or site\n --interval <mins> Monitor check interval in minutes (default 60)\n --watch-for <text> What to watch for (e.g. \"Pricing tiers and discounts\")\n --condition <expr> Trigger rule expression (e.g. 'price < 50', 'content contains \"In Stock\"')\n --notify-email <e> Alert email address when triggered (or 'true' for account email)\n --webhook <url> Alert webhook URL when triggered\n --agent <name> Target agent for setup: claude, cursor, codex, gemini, windsurf, or all (repeatable)\n --schema-profile MCP schema profile for setup: compact (default) or full\n -v, --version Print the installed package version\n -h, --help\n\nConfig order: flags, then WEBCRAWL_API_KEY / WEBCRAWL_URL / WEBCRAWL_MODE, then ~/.config/webcrawl/config.json";
21
+ /** Installed `webcrawl` version, read from package.json at runtime. */
22
+ export declare function packageVersion(): string;
21
23
  /** Self-contained (no network assets) page served on the loopback callback. */
22
24
  export declare function callbackPage(opts: {
23
25
  kind: "success" | "error" | "info";
package/dist/cli.js CHANGED
@@ -2,7 +2,9 @@ import { execFile } from "node:child_process";
2
2
  import crypto from "node:crypto";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { createServer } from "node:http";
5
+ import { dirname, join } from "node:path";
5
6
  import { createInterface } from "node:readline";
7
+ import { fileURLToPath } from "node:url";
6
8
  import { parseArgs } from "node:util";
7
9
  import { WebcrawlClient, WebcrawlError, configPath, describeError, readConfigFile, resolveConfig, writeConfigFile, } from "@webcrawl/client";
8
10
  import { formatCrawl, formatCredits, formatMap, formatMonitor, formatRerank, formatScrape, formatSearch, formatTargets, } from "./format.js";
@@ -45,12 +47,14 @@ Options
45
47
  --webhook <url> Alert webhook URL when triggered
46
48
  --agent <name> Target agent for setup: claude, cursor, codex, gemini, windsurf, or all (repeatable)
47
49
  --schema-profile MCP schema profile for setup: compact (default) or full
50
+ -v, --version Print the installed package version
48
51
  -h, --help
49
52
 
50
53
  Config order: flags, then WEBCRAWL_API_KEY / WEBCRAWL_URL / WEBCRAWL_MODE, then ~/.config/webcrawl/config.json`;
51
54
  const OPTIONS = {
52
55
  json: { type: "boolean" },
53
56
  help: { type: "boolean", short: "h" },
57
+ version: { type: "boolean", short: "v" },
54
58
  "api-key": { type: "string" },
55
59
  url: { type: "string" },
56
60
  mode: { type: "string" },
@@ -84,6 +88,15 @@ const OPTIONS = {
84
88
  };
85
89
  class UsageError extends Error {
86
90
  }
91
+ /** Installed `webcrawl` version, read from package.json at runtime. */
92
+ export function packageVersion() {
93
+ const pkgPath = join(dirname(fileURLToPath(import.meta.url)), "..", "package.json");
94
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
95
+ if (!pkg.version) {
96
+ throw new Error("package.json is missing a version field");
97
+ }
98
+ return pkg.version;
99
+ }
87
100
  function int(v, name) {
88
101
  if (v === undefined) {
89
102
  return undefined;
@@ -356,6 +369,10 @@ export async function main(argv, io, deps = {}) {
356
369
  }
357
370
  const { values: v, positionals } = parsed;
358
371
  const [cmd, ...rest] = positionals;
372
+ if (v.version) {
373
+ io.out(`${packageVersion()}\n`);
374
+ return 0;
375
+ }
359
376
  if (v.help || !cmd || cmd === "help") {
360
377
  io.out(`${HELP}\n`);
361
378
  return cmd || v.help ? 0 : 2;
@@ -7,6 +7,11 @@
7
7
  */
8
8
  import { spawn } from "node:child_process";
9
9
  import { type ChromeHeadlessMode } from "./chrome-launch.js";
10
+ /** Chrome spawned but CDP never became ready. `hung` is true when the process was still alive. */
11
+ export declare class ChromeConnectError extends Error {
12
+ readonly hung: boolean;
13
+ constructor(message: string, hung?: boolean);
14
+ }
10
15
  export interface CdpSnapshot {
11
16
  html: string;
12
17
  title: string;
@@ -15,6 +20,8 @@ export interface CdpSnapshot {
15
20
  }
16
21
  export interface CdpRenderOptions {
17
22
  timeoutMs: number;
23
+ /** CDP launch/connect budget. Defaults to 4s (`WEBCRAWL_CHROME_CONNECT_TIMEOUT_MS`). */
24
+ connectTimeoutMs?: number;
18
25
  headless: ChromeHeadlessMode;
19
26
  /** Injected for tests. */
20
27
  spawnChrome?: typeof spawn;
@@ -9,7 +9,16 @@ import { spawn } from "node:child_process";
9
9
  import { mkdtempSync, rmSync } from "node:fs";
10
10
  import { tmpdir } from "node:os";
11
11
  import { join } from "node:path";
12
- import { chromeCdpArgs, killProcessGroup } from "./chrome-launch.js";
12
+ import { chromeCdpArgs, killProcessGroup, resolveChromeConnectTimeoutMs, } from "./chrome-launch.js";
13
+ /** Chrome spawned but CDP never became ready. `hung` is true when the process was still alive. */
14
+ export class ChromeConnectError extends Error {
15
+ hung;
16
+ constructor(message, hung = false) {
17
+ super(message);
18
+ this.name = "ChromeConnectError";
19
+ this.hung = hung;
20
+ }
21
+ }
13
22
  const SNAPSHOT_JS = `(() => {
14
23
  const body = document.body;
15
24
  const text = body && typeof body.innerText === "string" ? body.innerText.trim() : "";
@@ -64,8 +73,12 @@ const WAIT_FOR_CONTENT_JS = `(async () => {
64
73
  try { observer && observer.disconnect(); } catch (_) { /* ignore */ }
65
74
  return last;
66
75
  })()`;
76
+ function childStillRunning(child) {
77
+ return Boolean(child && child.pid && child.exitCode == null && !child.killed);
78
+ }
67
79
  export async function renderUrlViaCdp(chromePath, url, opts) {
68
80
  const timeoutMs = Math.max(1_500, opts.timeoutMs);
81
+ const connectTimeoutMs = resolveChromeConnectTimeoutMs(opts.connectTimeoutMs);
69
82
  const profile = mkdtempSync(join(tmpdir(), "wc-cdp-"));
70
83
  const port = 40000 + Math.floor(Math.random() * 20000);
71
84
  const spawnFn = opts.spawnChrome ?? spawn;
@@ -76,7 +89,9 @@ export async function renderUrlViaCdp(chromePath, url, opts) {
76
89
  binaryPath: chromePath,
77
90
  });
78
91
  let child;
92
+ let cdpReady = false;
79
93
  const ac = new AbortController();
94
+ // Page budget covers navigation after connect; connect has its own deadline.
80
95
  const timer = setTimeout(() => ac.abort(), timeoutMs);
81
96
  try {
82
97
  child = spawnFn(chromePath, args, {
@@ -86,12 +101,11 @@ export async function renderUrlViaCdp(chromePath, url, opts) {
86
101
  if (!child.pid) {
87
102
  throw new Error("Chrome failed to start (no pid)");
88
103
  }
89
- let cdpReady = false;
90
104
  child.once("exit", () => {
91
105
  if (!cdpReady && !ac.signal.aborted)
92
106
  ac.abort();
93
107
  });
94
- const wsUrl = await waitForPageWebSocket(port, timeoutMs, ac.signal);
108
+ const wsUrl = await waitForPageWebSocket(port, connectTimeoutMs, ac.signal);
95
109
  cdpReady = true;
96
110
  const snapshot = await withCdpSession(wsUrl, url, timeoutMs, ac.signal);
97
111
  if (!snapshot.html || snapshot.html.length < 40) {
@@ -100,6 +114,13 @@ export async function renderUrlViaCdp(chromePath, url, opts) {
100
114
  return snapshot;
101
115
  }
102
116
  catch (err) {
117
+ if (!cdpReady) {
118
+ const hung = childStillRunning(child);
119
+ const detail = err instanceof Error ? err.message : String(err);
120
+ throw new ChromeConnectError(hung
121
+ ? `Chrome did not respond over CDP within ${connectTimeoutMs}ms`
122
+ : `Chrome CDP failed to start (${detail})`, hung);
123
+ }
103
124
  if (ac.signal.aborted) {
104
125
  throw new Error(`CDP timed out after ${timeoutMs}ms`);
105
126
  }
@@ -117,8 +138,8 @@ export async function renderUrlViaCdp(chromePath, url, opts) {
117
138
  }
118
139
  }
119
140
  }
120
- async function waitForPageWebSocket(port, timeoutMs, signal) {
121
- const deadline = Date.now() + Math.min(timeoutMs, 8_000);
141
+ async function waitForPageWebSocket(port, connectTimeoutMs, signal) {
142
+ const deadline = Date.now() + connectTimeoutMs;
122
143
  let lastErr = "CDP HTTP endpoint never became ready";
123
144
  while (Date.now() < deadline) {
124
145
  if (signal.aborted)
@@ -1,7 +1,18 @@
1
1
  import type { ChildProcess } from "node:child_process";
2
2
  export declare const DUMP_MAX_BYTES: number;
3
+ /** Page navigation + DOM-wait budget once Chrome is answering over CDP. */
3
4
  export declare const DEFAULT_TIMEOUT_MS = 18000;
5
+ /**
6
+ * How long to wait for Chrome to accept CDP after spawn. Kept short and
7
+ * separate from `DEFAULT_TIMEOUT_MS` so a hung binary fails fast while a
8
+ * slow but working JS page (often ~7s) still has time to render.
9
+ */
10
+ export declare const DEFAULT_CONNECT_TIMEOUT_MS = 4000;
4
11
  export declare const VIRTUAL_TIME_MS = 10000;
12
+ /** `opts.timeoutMs`, else `WEBCRAWL_CHROME_TIMEOUT_MS`, else 18s. */
13
+ export declare function resolveChromeTimeoutMs(override?: number): number;
14
+ /** `opts.connectTimeoutMs`, else `WEBCRAWL_CHROME_CONNECT_TIMEOUT_MS`, else 4s. */
15
+ export declare function resolveChromeConnectTimeoutMs(override?: number): number;
5
16
  export type ChromeHeadlessMode = "new" | "old" | "shell";
6
17
  export declare function killProcessGroup(pid: number | undefined, child?: Pick<ChildProcess, "kill">): void;
7
18
  export declare function headlessFlag(mode: ChromeHeadlessMode, binaryPath: string): string[];
@@ -5,8 +5,38 @@ import { existsSync, readdirSync } from "node:fs";
5
5
  import { homedir } from "node:os";
6
6
  import { join } from "node:path";
7
7
  export const DUMP_MAX_BYTES = 2 * 1024 * 1024;
8
+ /** Page navigation + DOM-wait budget once Chrome is answering over CDP. */
8
9
  export const DEFAULT_TIMEOUT_MS = 18_000;
10
+ /**
11
+ * How long to wait for Chrome to accept CDP after spawn. Kept short and
12
+ * separate from `DEFAULT_TIMEOUT_MS` so a hung binary fails fast while a
13
+ * slow but working JS page (often ~7s) still has time to render.
14
+ */
15
+ export const DEFAULT_CONNECT_TIMEOUT_MS = 4_000;
9
16
  export const VIRTUAL_TIME_MS = 10_000;
17
+ function envPositiveMs(name, fallback, min) {
18
+ const raw = process.env[name];
19
+ if (raw == null || raw.trim() === "")
20
+ return fallback;
21
+ const n = Number(raw);
22
+ if (!Number.isFinite(n) || n <= 0)
23
+ return fallback;
24
+ return Math.max(min, n);
25
+ }
26
+ /** `opts.timeoutMs`, else `WEBCRAWL_CHROME_TIMEOUT_MS`, else 18s. */
27
+ export function resolveChromeTimeoutMs(override) {
28
+ if (typeof override === "number" && Number.isFinite(override) && override > 0) {
29
+ return Math.max(1_500, override);
30
+ }
31
+ return envPositiveMs("WEBCRAWL_CHROME_TIMEOUT_MS", DEFAULT_TIMEOUT_MS, 1_500);
32
+ }
33
+ /** `opts.connectTimeoutMs`, else `WEBCRAWL_CHROME_CONNECT_TIMEOUT_MS`, else 4s. */
34
+ export function resolveChromeConnectTimeoutMs(override) {
35
+ if (typeof override === "number" && Number.isFinite(override) && override > 0) {
36
+ return Math.max(500, override);
37
+ }
38
+ return envPositiveMs("WEBCRAWL_CHROME_CONNECT_TIMEOUT_MS", DEFAULT_CONNECT_TIMEOUT_MS, 500);
39
+ }
10
40
  export function killProcessGroup(pid, child) {
11
41
  if (pid && pid > 0) {
12
42
  try {
@@ -1,4 +1,5 @@
1
- export { DEFAULT_TIMEOUT_MS, VIRTUAL_TIME_MS, discoverChromeBinaries, findPlaywrightHeadlessShell, installedChromePath, isLocalChromeAvailable, parseDevToolsActivePort, chromeCdpArgs, chromeDumpDomArgs, killProcessGroup, type ChromeHeadlessMode, } from "./chrome-launch.js";
1
+ export { DEFAULT_CONNECT_TIMEOUT_MS, DEFAULT_TIMEOUT_MS, VIRTUAL_TIME_MS, discoverChromeBinaries, findPlaywrightHeadlessShell, installedChromePath, isLocalChromeAvailable, parseDevToolsActivePort, chromeCdpArgs, chromeDumpDomArgs, killProcessGroup, resolveChromeConnectTimeoutMs, resolveChromeTimeoutMs, type ChromeHeadlessMode, } from "./chrome-launch.js";
2
+ export { ChromeConnectError } from "./chrome-cdp.js";
2
3
  export interface ChromeRenderAttempt {
3
4
  ok: boolean;
4
5
  method: string;
@@ -17,6 +18,8 @@ export interface ChromeRenderResult {
17
18
  */
18
19
  export declare function renderViaLocalChrome(url: string, opts?: {
19
20
  timeoutMs?: number;
21
+ connectTimeoutMs?: number;
22
+ binaries?: string[];
20
23
  }): Promise<string | null>;
21
24
  /**
22
25
  * Same as `renderViaLocalChrome` but with the attempt log and an actionable
@@ -25,4 +28,6 @@ export declare function renderViaLocalChrome(url: string, opts?: {
25
28
  */
26
29
  export declare function renderViaLocalChromeDetailed(url: string, opts?: {
27
30
  timeoutMs?: number;
31
+ connectTimeoutMs?: number;
32
+ binaries?: string[];
28
33
  }): Promise<ChromeRenderResult>;
@@ -15,9 +15,10 @@ import { spawn } from "node:child_process";
15
15
  import { mkdtempSync, rmSync } from "node:fs";
16
16
  import { tmpdir } from "node:os";
17
17
  import { join } from "node:path";
18
- import { renderUrlViaCdp } from "./chrome-cdp.js";
19
- import { DEFAULT_TIMEOUT_MS, DUMP_MAX_BYTES, chromeDumpDomArgs, discoverChromeBinaries, killProcessGroup, } from "./chrome-launch.js";
20
- export { DEFAULT_TIMEOUT_MS, VIRTUAL_TIME_MS, discoverChromeBinaries, findPlaywrightHeadlessShell, installedChromePath, isLocalChromeAvailable, parseDevToolsActivePort, chromeCdpArgs, chromeDumpDomArgs, killProcessGroup, } from "./chrome-launch.js";
18
+ import { ChromeConnectError, renderUrlViaCdp } from "./chrome-cdp.js";
19
+ import { DUMP_MAX_BYTES, chromeDumpDomArgs, discoverChromeBinaries, killProcessGroup, resolveChromeConnectTimeoutMs, resolveChromeTimeoutMs, } from "./chrome-launch.js";
20
+ export { DEFAULT_CONNECT_TIMEOUT_MS, DEFAULT_TIMEOUT_MS, VIRTUAL_TIME_MS, discoverChromeBinaries, findPlaywrightHeadlessShell, installedChromePath, isLocalChromeAvailable, parseDevToolsActivePort, chromeCdpArgs, chromeDumpDomArgs, killProcessGroup, resolveChromeConnectTimeoutMs, resolveChromeTimeoutMs, } from "./chrome-launch.js";
21
+ export { ChromeConnectError } from "./chrome-cdp.js";
21
22
  function attemptPlan(binary) {
22
23
  const isShell = /headless[-_]?shell/i.test(binary);
23
24
  if (isShell) {
@@ -51,7 +52,7 @@ export async function renderViaLocalChrome(url, opts = {}) {
51
52
  * failures should use this.
52
53
  */
53
54
  export async function renderViaLocalChromeDetailed(url, opts = {}) {
54
- const binaries = discoverChromeBinaries();
55
+ const binaries = opts.binaries?.length ? opts.binaries : discoverChromeBinaries();
55
56
  if (binaries.length === 0) {
56
57
  return {
57
58
  html: null,
@@ -60,15 +61,20 @@ export async function renderViaLocalChromeDetailed(url, opts = {}) {
60
61
  attempts: [],
61
62
  };
62
63
  }
63
- const budgetMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
64
+ const budgetMs = resolveChromeTimeoutMs(opts.timeoutMs);
65
+ const connectTimeoutMs = resolveChromeConnectTimeoutMs(opts.connectTimeoutMs);
64
66
  const started = Date.now();
65
67
  const attempts = [];
66
68
  let lastError = "local Chrome produced no content";
67
69
  for (const binary of binaries) {
70
+ let hungConnect = false;
68
71
  for (const kind of attemptPlan(binary)) {
69
72
  const remaining = budgetMs - (Date.now() - started);
70
73
  if (remaining < 1_200)
71
74
  break;
75
+ // A process that launched but never answered CDP will hang dump-dom too.
76
+ if (kind.driver === "dump-dom" && hungConnect)
77
+ continue;
72
78
  const method = methodName(binary, kind);
73
79
  const attemptBudget = kind.driver === "cdp"
74
80
  ? Math.min(remaining, kind.headless === "new" ? 12_000 : 8_000)
@@ -78,6 +84,7 @@ export async function renderViaLocalChromeDetailed(url, opts = {}) {
78
84
  const html = kind.driver === "cdp"
79
85
  ? (await renderUrlViaCdp(binary, url, {
80
86
  timeoutMs: attemptBudget,
87
+ connectTimeoutMs: Math.min(connectTimeoutMs, remaining),
81
88
  headless: kind.headless,
82
89
  })).html
83
90
  : await dumpDom(binary, url, kind.headless, attemptBudget);
@@ -93,6 +100,8 @@ export async function renderViaLocalChromeDetailed(url, opts = {}) {
93
100
  const ms = Date.now() - t0;
94
101
  lastError = `${method}: ${err instanceof Error ? err.message : String(err)}`;
95
102
  attempts.push({ ok: false, method, ms, error: lastError });
103
+ if (err instanceof ChromeConnectError && err.hung)
104
+ hungConnect = true;
96
105
  }
97
106
  }
98
107
  }
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { main, HELP, type Deps, type Io } from "./cli.js";
1
+ export { main, HELP, packageVersion, type Deps, type Io } from "./cli.js";
2
2
  export { SUPPORTED_AGENTS, WEBCRAWL_SKILL_MD, runDoctor, runSetup, type AgentTarget, type DoctorCheck, type DoctorReport, type SetupOptions, type SetupResult, type SupportedAgentId, } from "./setup.js";
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { main, HELP } from "./cli.js";
1
+ export { main, HELP, packageVersion } from "./cli.js";
2
2
  export { SUPPORTED_AGENTS, WEBCRAWL_SKILL_MD, runDoctor, runSetup, } from "./setup.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webcrawl",
3
- "version": "1.4.4",
3
+ "version": "1.4.5",
4
4
  "description": "Webcrawl Anything CLI & Core Engine — crawl, search, and extract structured evidence from any website, SPA, PDF, Office file, YouTube video, GitHub repo, ArXiv paper, or CVE",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -127,8 +127,8 @@
127
127
  "@ai-sdk/gateway": "^4.0.123",
128
128
  "@firecrawl/pdf-inspector": "^1.25.2",
129
129
  "@vercel/sandbox": "^1.0.0",
130
- "@webcrawl/client": "^1.4.4",
131
- "@webcrawl/curl-impersonate": "^1.4.4",
130
+ "@webcrawl/client": "^1.4.5",
131
+ "@webcrawl/curl-impersonate": "^1.4.5",
132
132
  "ai": "^7.0.150",
133
133
  "impit": "^0.14.7",
134
134
  "mammoth": "^1.13.0",