imperium-crawl 2.5.2 → 2.6.0
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/README.md +18 -16
- package/dist/batch/job-store.js +1 -1
- package/dist/batch/job-store.js.map +1 -1
- package/dist/brave-api/index.js +1 -1
- package/dist/brave-api/index.js.map +1 -1
- package/dist/cli/config.d.ts +21 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +51 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/engine.d.ts +17 -0
- package/dist/cli/engine.d.ts.map +1 -0
- package/dist/cli/engine.js +440 -0
- package/dist/cli/engine.js.map +1 -0
- package/dist/cli/explore.d.ts +30 -0
- package/dist/cli/explore.d.ts.map +1 -0
- package/dist/cli/explore.js +427 -0
- package/dist/cli/explore.js.map +1 -0
- package/dist/cli/onboarding.d.ts +10 -0
- package/dist/cli/onboarding.d.ts.map +1 -0
- package/dist/cli/onboarding.js +128 -0
- package/dist/cli/onboarding.js.map +1 -0
- package/dist/cli/recorder.d.ts +44 -0
- package/dist/cli/recorder.d.ts.map +1 -0
- package/dist/cli/recorder.js +67 -0
- package/dist/cli/recorder.js.map +1 -0
- package/dist/cli/tui.d.ts +12 -0
- package/dist/cli/tui.d.ts.map +1 -0
- package/dist/cli/tui.js +945 -0
- package/dist/cli/tui.js.map +1 -0
- package/dist/cli/ui.d.ts +26 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +58 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/core/action-executor.d.ts +66 -0
- package/dist/core/action-executor.d.ts.map +1 -0
- package/dist/core/action-executor.js +403 -0
- package/dist/core/action-executor.js.map +1 -0
- package/dist/core/config.d.ts +16 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +56 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/constants.d.ts +40 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +86 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/formatters.d.ts +36 -0
- package/dist/core/formatters.d.ts.map +1 -0
- package/dist/core/formatters.js +147 -0
- package/dist/core/formatters.js.map +1 -0
- package/dist/engines/camofox.d.ts +27 -0
- package/dist/engines/camofox.d.ts.map +1 -0
- package/dist/engines/camofox.js +432 -0
- package/dist/engines/camofox.js.map +1 -0
- package/dist/engines/index.d.ts +13 -0
- package/dist/engines/index.d.ts.map +1 -0
- package/dist/engines/index.js +41 -0
- package/dist/engines/index.js.map +1 -0
- package/dist/engines/types.d.ts +63 -0
- package/dist/engines/types.d.ts.map +1 -0
- package/dist/engines/types.js +8 -0
- package/dist/engines/types.js.map +1 -0
- package/dist/flows/engine.js +3 -3
- package/dist/flows/engine.js.map +1 -1
- package/dist/flows/storage.js +1 -1
- package/dist/flows/storage.js.map +1 -1
- package/dist/flows/templates.js +1 -1
- package/dist/flows/templates.js.map +1 -1
- package/dist/flows/types.d.ts +405 -405
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/knowledge/store.js +1 -1
- package/dist/knowledge/store.js.map +1 -1
- package/dist/network/index.d.ts +3 -0
- package/dist/network/index.d.ts.map +1 -0
- package/dist/network/index.js +2 -0
- package/dist/network/index.js.map +1 -0
- package/dist/recipes/data/crypto-websocket.json +11 -0
- package/dist/recipes/data/ecommerce-product.json +25 -0
- package/dist/recipes/data/github-trending.json +19 -0
- package/dist/recipes/data/hn-top-stories.json +22 -0
- package/dist/recipes/data/influencer-competitor-spy.json +14 -0
- package/dist/recipes/data/influencer-content-scout.json +14 -0
- package/dist/recipes/data/influencer-hashtag-scout.json +14 -0
- package/dist/recipes/data/influencer-niche-discovery.json +14 -0
- package/dist/recipes/data/job-listings-greenhouse.json +17 -0
- package/dist/recipes/data/news-article-reader.json +9 -0
- package/dist/recipes/data/product-reviews.json +33 -0
- package/dist/recipes/data/reddit-posts.json +8 -0
- package/dist/recipes/data/seo-page-audit.json +26 -0
- package/dist/recipes/data/social-media-mentions.json +31 -0
- package/dist/recipes/index.d.ts +1 -1
- package/dist/recipes/index.d.ts.map +1 -1
- package/dist/recipes/index.js +14 -14
- package/dist/recipes/index.js.map +1 -1
- package/dist/security/auth-vault.js +1 -1
- package/dist/security/auth-vault.js.map +1 -1
- package/dist/security/index.d.ts +6 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +4 -0
- package/dist/security/index.js.map +1 -0
- package/dist/sessions/browser-state.js +1 -1
- package/dist/sessions/browser-state.js.map +1 -1
- package/dist/sessions/encryption.js +1 -1
- package/dist/sessions/encryption.js.map +1 -1
- package/dist/sessions/manager.js +1 -1
- package/dist/sessions/manager.js.map +1 -1
- package/dist/skills/detector.js +1 -1
- package/dist/skills/detector.js.map +1 -1
- package/dist/skills/index.d.ts +9 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +6 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/manager.js +1 -1
- package/dist/skills/manager.js.map +1 -1
- package/dist/snapshot/store.js +1 -1
- package/dist/snapshot/store.js.map +1 -1
- package/dist/social/index.d.ts +7 -0
- package/dist/social/index.d.ts.map +1 -0
- package/dist/social/index.js +4 -0
- package/dist/social/index.js.map +1 -0
- package/dist/stealth/browser-pool.js +1 -1
- package/dist/stealth/browser-pool.js.map +1 -1
- package/dist/stealth/browser.js +2 -2
- package/dist/stealth/browser.js.map +1 -1
- package/dist/stealth/chrome-profile.js +2 -2
- package/dist/stealth/chrome-profile.js.map +1 -1
- package/dist/stealth/index.js +2 -2
- package/dist/stealth/index.js.map +1 -1
- package/dist/tools/ai-extract.js +1 -1
- package/dist/tools/ai-extract.js.map +1 -1
- package/dist/tools/batch-download.d.ts +1 -1
- package/dist/tools/batch-download.js +1 -1
- package/dist/tools/batch-download.js.map +1 -1
- package/dist/tools/batch-scrape.d.ts +2 -2
- package/dist/tools/batch-scrape.js +1 -1
- package/dist/tools/batch-scrape.js.map +1 -1
- package/dist/tools/browser.d.ts +8 -8
- package/dist/tools/browser.js +4 -4
- package/dist/tools/browser.js.map +1 -1
- package/dist/tools/camofox-status.d.ts +14 -0
- package/dist/tools/camofox-status.d.ts.map +1 -0
- package/dist/tools/camofox-status.js +61 -0
- package/dist/tools/camofox-status.js.map +1 -0
- package/dist/tools/camofox-update.d.ts +29 -0
- package/dist/tools/camofox-update.d.ts.map +1 -0
- package/dist/tools/camofox-update.js +108 -0
- package/dist/tools/camofox-update.js.map +1 -0
- package/dist/tools/crawl.d.ts +2 -2
- package/dist/tools/crawl.js +1 -1
- package/dist/tools/crawl.js.map +1 -1
- package/dist/tools/create-skill.js +3 -3
- package/dist/tools/create-skill.js.map +1 -1
- package/dist/tools/discover-apis.d.ts +1 -1
- package/dist/tools/discover-apis.js +1 -1
- package/dist/tools/discover-apis.js.map +1 -1
- package/dist/tools/download.d.ts +7 -7
- package/dist/tools/download.js +1 -1
- package/dist/tools/download.js.map +1 -1
- package/dist/tools/extract.d.ts +1 -1
- package/dist/tools/extract.js +1 -1
- package/dist/tools/extract.js.map +1 -1
- package/dist/tools/image-search.d.ts +1 -1
- package/dist/tools/image-search.js +2 -2
- package/dist/tools/image-search.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +5 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/instagram.d.ts +1 -1
- package/dist/tools/instagram.js +3 -3
- package/dist/tools/instagram.js.map +1 -1
- package/dist/tools/interact.d.ts +86 -86
- package/dist/tools/interact.js +5 -5
- package/dist/tools/interact.js.map +1 -1
- package/dist/tools/knowledge.js +1 -1
- package/dist/tools/knowledge.js.map +1 -1
- package/dist/tools/list-skills.js +1 -1
- package/dist/tools/list-skills.js.map +1 -1
- package/dist/tools/manifest.d.ts.map +1 -1
- package/dist/tools/manifest.js +9 -0
- package/dist/tools/manifest.js.map +1 -1
- package/dist/tools/map.js +1 -1
- package/dist/tools/map.js.map +1 -1
- package/dist/tools/monitor-websocket.d.ts +1 -1
- package/dist/tools/monitor-websocket.js +1 -1
- package/dist/tools/monitor-websocket.js.map +1 -1
- package/dist/tools/monitor.d.ts +2 -2
- package/dist/tools/news-search.d.ts +1 -1
- package/dist/tools/news-search.js +2 -2
- package/dist/tools/news-search.js.map +1 -1
- package/dist/tools/query-api.d.ts +5 -5
- package/dist/tools/query-api.js +1 -1
- package/dist/tools/query-api.js.map +1 -1
- package/dist/tools/readability.js +1 -1
- package/dist/tools/readability.js.map +1 -1
- package/dist/tools/record-flow.d.ts +2 -2
- package/dist/tools/record-flow.js +3 -3
- package/dist/tools/record-flow.js.map +1 -1
- package/dist/tools/reddit.d.ts +2 -2
- package/dist/tools/reddit.js +3 -3
- package/dist/tools/reddit.js.map +1 -1
- package/dist/tools/rss.js +1 -1
- package/dist/tools/rss.js.map +1 -1
- package/dist/tools/run-flow.d.ts +6 -6
- package/dist/tools/run-skill.d.ts +6 -6
- package/dist/tools/run-skill.js +2 -2
- package/dist/tools/run-skill.js.map +1 -1
- package/dist/tools/scrape.d.ts +4 -4
- package/dist/tools/scrape.js +1 -1
- package/dist/tools/scrape.js.map +1 -1
- package/dist/tools/screenshot.js +1 -1
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/search.d.ts +1 -1
- package/dist/tools/search.js +2 -2
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/snapshot.d.ts +5 -5
- package/dist/tools/snapshot.js +2 -2
- package/dist/tools/snapshot.js.map +1 -1
- package/dist/tools/video-search.d.ts +1 -1
- package/dist/tools/video-search.js +2 -2
- package/dist/tools/video-search.js.map +1 -1
- package/dist/tools/watch.d.ts +2 -2
- package/dist/tools/watch.js +1 -1
- package/dist/tools/watch.js.map +1 -1
- package/dist/tools/youtube.d.ts +1 -1
- package/dist/tools/youtube.js +4 -4
- package/dist/tools/youtube.js.map +1 -1
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/fetcher.js +1 -1
- package/dist/utils/fetcher.js.map +1 -1
- package/dist/utils/robots.js +1 -1
- package/dist/utils/robots.js.map +1 -1
- package/package.json +7 -3
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI engine for imperium-crawl.
|
|
3
|
+
*
|
|
4
|
+
* Dynamically maps each tool's Zod schema to Commander options,
|
|
5
|
+
* runs execute(), then formats output via formatters.ts.
|
|
6
|
+
*
|
|
7
|
+
* TTY-aware: spinners + colored output + tables in interactive mode;
|
|
8
|
+
* clean JSON to stdout when piped (non-TTY / CI / NO_COLOR).
|
|
9
|
+
*
|
|
10
|
+
* Lazy loading: only the requested tool's module is imported at startup.
|
|
11
|
+
* This keeps cold-start time fast even though some tools pull in heavy
|
|
12
|
+
* deps (cheerio, linkedom, playwright, stealth engine).
|
|
13
|
+
*/
|
|
14
|
+
import { Command, Option } from "commander";
|
|
15
|
+
import { z } from "zod";
|
|
16
|
+
import { writeFileSync } from "fs";
|
|
17
|
+
import { TOOL_MANIFEST } from "../tools/manifest.js";
|
|
18
|
+
import { formatOutput, parseToolOutput, parseImageOutput, } from "../core/formatters.js";
|
|
19
|
+
import { PACKAGE_VERSION } from "../core/constants.js";
|
|
20
|
+
import { isTTY, createSpinner, errorMsg, renderTable, colorUrl, } from "./ui.js";
|
|
21
|
+
/**
|
|
22
|
+
* Recursively unwrap ZodDefault, ZodOptional, ZodNullable
|
|
23
|
+
* to get the base type and metadata.
|
|
24
|
+
*/
|
|
25
|
+
function unwrapZod(schema) {
|
|
26
|
+
let isOptional = false;
|
|
27
|
+
let hasDefault = false;
|
|
28
|
+
let defaultValue = undefined;
|
|
29
|
+
const description = schema.description;
|
|
30
|
+
let current = schema;
|
|
31
|
+
for (let i = 0; i < 10; i++) {
|
|
32
|
+
const typeName = current._def.typeName;
|
|
33
|
+
if (typeName === "ZodDefault") {
|
|
34
|
+
hasDefault = true;
|
|
35
|
+
defaultValue = current._def.defaultValue();
|
|
36
|
+
current = current._def.innerType;
|
|
37
|
+
}
|
|
38
|
+
else if (typeName === "ZodOptional") {
|
|
39
|
+
isOptional = true;
|
|
40
|
+
current = current._def.innerType;
|
|
41
|
+
}
|
|
42
|
+
else if (typeName === "ZodNullable") {
|
|
43
|
+
isOptional = true;
|
|
44
|
+
current = current._def.innerType;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return { base: current, isOptional, hasDefault, defaultValue, description };
|
|
51
|
+
}
|
|
52
|
+
function getZodTypeName(schema) {
|
|
53
|
+
return schema._def.typeName ?? "";
|
|
54
|
+
}
|
|
55
|
+
// ── Name Converters ──────────────────────────────────────────────────
|
|
56
|
+
/** snake_case → --kebab-case */
|
|
57
|
+
function snakeToKebab(key) {
|
|
58
|
+
return key.replace(/_/g, "-");
|
|
59
|
+
}
|
|
60
|
+
/** camelCase → snake_case (Commander's camelCase back to Zod's keys) */
|
|
61
|
+
function camelToSnake(key) {
|
|
62
|
+
return key.replace(/[A-Z]/g, (m) => "_" + m.toLowerCase());
|
|
63
|
+
}
|
|
64
|
+
// ── Zod-to-Commander Option Mapper ───────────────────────────────────
|
|
65
|
+
function addOptionsFromSchema(cmd, schema) {
|
|
66
|
+
if (getZodTypeName(schema) !== "ZodObject")
|
|
67
|
+
return;
|
|
68
|
+
const shape = schema.shape;
|
|
69
|
+
for (const [key, fieldSchema] of Object.entries(shape)) {
|
|
70
|
+
const { base, isOptional, hasDefault, defaultValue, description, } = unwrapZod(fieldSchema);
|
|
71
|
+
const flag = snakeToKebab(key);
|
|
72
|
+
const desc = description ?? key;
|
|
73
|
+
const typeName = getZodTypeName(base);
|
|
74
|
+
const required = !isOptional && !hasDefault;
|
|
75
|
+
if (typeName === "ZodString") {
|
|
76
|
+
if (required) {
|
|
77
|
+
cmd.requiredOption(`--${flag} <value>`, desc);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
const opt = new Option(`--${flag} <value>`, desc);
|
|
81
|
+
if (hasDefault)
|
|
82
|
+
opt.default(defaultValue);
|
|
83
|
+
cmd.addOption(opt);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else if (typeName === "ZodNumber") {
|
|
87
|
+
const parseNum = (v) => {
|
|
88
|
+
const n = parseFloat(v);
|
|
89
|
+
if (isNaN(n))
|
|
90
|
+
throw new Error(`Invalid number: ${v}`);
|
|
91
|
+
return n;
|
|
92
|
+
};
|
|
93
|
+
if (required) {
|
|
94
|
+
cmd.requiredOption(`--${flag} <n>`, desc, parseNum);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
const opt = new Option(`--${flag} <n>`, desc);
|
|
98
|
+
opt.argParser(parseNum);
|
|
99
|
+
if (hasDefault)
|
|
100
|
+
opt.default(defaultValue);
|
|
101
|
+
cmd.addOption(opt);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else if (typeName === "ZodBoolean") {
|
|
105
|
+
if (hasDefault && defaultValue === true) {
|
|
106
|
+
cmd.option(`--no-${flag}`, desc);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
cmd.option(`--${flag}`, desc, hasDefault ? defaultValue : false);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else if (typeName === "ZodEnum") {
|
|
113
|
+
const values = base._def.values;
|
|
114
|
+
const opt = new Option(`--${flag} <value>`, desc).choices(values);
|
|
115
|
+
if (hasDefault)
|
|
116
|
+
opt.default(defaultValue);
|
|
117
|
+
if (required)
|
|
118
|
+
opt.makeOptionMandatory(true);
|
|
119
|
+
cmd.addOption(opt);
|
|
120
|
+
}
|
|
121
|
+
else if (typeName === "ZodArray") {
|
|
122
|
+
const collect = (val, prev) => prev.concat(val);
|
|
123
|
+
const innerTypeName = getZodTypeName(unwrapZod(base._def.type).base);
|
|
124
|
+
if (innerTypeName === "ZodEnum") {
|
|
125
|
+
const values = unwrapZod(base._def.type).base._def
|
|
126
|
+
.values;
|
|
127
|
+
const opt = new Option(`--${flag} <value>`, desc)
|
|
128
|
+
.choices(values)
|
|
129
|
+
.argParser(collect)
|
|
130
|
+
.default(hasDefault ? defaultValue : []);
|
|
131
|
+
cmd.addOption(opt);
|
|
132
|
+
}
|
|
133
|
+
else if (innerTypeName === "ZodObject") {
|
|
134
|
+
// Parse as single JSON array string (e.g. --actions '[{...},{...}]')
|
|
135
|
+
const parseJsonArray = (val) => {
|
|
136
|
+
try {
|
|
137
|
+
const parsed = JSON.parse(val);
|
|
138
|
+
if (!Array.isArray(parsed))
|
|
139
|
+
throw new Error("Expected JSON array");
|
|
140
|
+
return parsed;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
throw new Error(`Invalid JSON array for --${flag}: ${val}`);
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
if (required) {
|
|
147
|
+
cmd.requiredOption(`--${flag} <json>`, desc, parseJsonArray);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
const opt = new Option(`--${flag} <json>`, desc);
|
|
151
|
+
opt.argParser(parseJsonArray);
|
|
152
|
+
if (hasDefault)
|
|
153
|
+
opt.default(defaultValue);
|
|
154
|
+
cmd.addOption(opt);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
cmd.option(`--${flag} <value>`, desc, collect, (hasDefault ? defaultValue : []));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else if (typeName === "ZodRecord") {
|
|
162
|
+
const parseJson = (val) => {
|
|
163
|
+
try {
|
|
164
|
+
return JSON.parse(val);
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
throw new Error(`Invalid JSON for --${flag}: ${val}`);
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
if (required) {
|
|
171
|
+
cmd.requiredOption(`--${flag} <json>`, desc, parseJson);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
const opt = new Option(`--${flag} <json>`, desc);
|
|
175
|
+
opt.argParser(parseJson);
|
|
176
|
+
if (hasDefault)
|
|
177
|
+
opt.default(defaultValue);
|
|
178
|
+
cmd.addOption(opt);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
cmd.option(`--${flag} <value>`, desc);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// ── Reverse Key Mapper ───────────────────────────────────────────────
|
|
187
|
+
function optsToInput(opts, schema) {
|
|
188
|
+
if (getZodTypeName(schema) !== "ZodObject")
|
|
189
|
+
return {};
|
|
190
|
+
const shape = schema.shape;
|
|
191
|
+
const schemaKeys = new Set(Object.keys(shape));
|
|
192
|
+
const input = {};
|
|
193
|
+
for (const [camelKey, value] of Object.entries(opts)) {
|
|
194
|
+
if (value === undefined)
|
|
195
|
+
continue;
|
|
196
|
+
const snakeKey = camelToSnake(camelKey);
|
|
197
|
+
if (schemaKeys.has(snakeKey)) {
|
|
198
|
+
input[snakeKey] = value;
|
|
199
|
+
}
|
|
200
|
+
else if (schemaKeys.has(camelKey)) {
|
|
201
|
+
input[camelKey] = value;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return input;
|
|
205
|
+
}
|
|
206
|
+
// ── Lazy Tool Loader ─────────────────────────────────────────────────
|
|
207
|
+
/**
|
|
208
|
+
* Which tool command the user requested (from argv), or null for
|
|
209
|
+
* global commands (--help, setup, --version).
|
|
210
|
+
*
|
|
211
|
+
* Detected before Commander runs so we can load only that tool's module.
|
|
212
|
+
*/
|
|
213
|
+
function getRequestedCmd() {
|
|
214
|
+
const arg = process.argv[2];
|
|
215
|
+
if (!arg || arg.startsWith("-"))
|
|
216
|
+
return null;
|
|
217
|
+
return arg; // e.g., "scrape", "list-jobs", "setup"
|
|
218
|
+
}
|
|
219
|
+
function positionalKeyForCmd(cmd) {
|
|
220
|
+
if (["run-flow", "inspect-flow", "validate-flow"].includes(cmd))
|
|
221
|
+
return "flow";
|
|
222
|
+
if (cmd === "serve-flow")
|
|
223
|
+
return "family";
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
// ── Table Renderers ──────────────────────────────────────────────────
|
|
227
|
+
function tryRenderTable(toolName, data) {
|
|
228
|
+
if (!isTTY)
|
|
229
|
+
return null;
|
|
230
|
+
if (!data || typeof data !== "object")
|
|
231
|
+
return null;
|
|
232
|
+
const obj = data;
|
|
233
|
+
if (toolName === "list_jobs") {
|
|
234
|
+
const jobs = Array.isArray(obj.jobs) ? obj.jobs : [];
|
|
235
|
+
if (jobs.length === 0)
|
|
236
|
+
return null;
|
|
237
|
+
const headers = ["Job ID", "Status", "URLs", "Progress"];
|
|
238
|
+
const rows = jobs.map((j) => {
|
|
239
|
+
const job = j;
|
|
240
|
+
const total = Number(job.urls_total ?? 0);
|
|
241
|
+
const done = Number(job.urls_completed ?? 0);
|
|
242
|
+
const failed = Number(job.urls_failed ?? 0);
|
|
243
|
+
const pct = total > 0 ? Math.round(((done + failed) / total) * 100) : 0;
|
|
244
|
+
return [String(job.id ?? ""), String(job.status ?? ""), `${done + failed}/${total}`, `${pct}%`];
|
|
245
|
+
});
|
|
246
|
+
return renderTable(headers, rows);
|
|
247
|
+
}
|
|
248
|
+
if (toolName === "list_skills") {
|
|
249
|
+
const skills = Array.isArray(obj.skills) ? obj.skills : [];
|
|
250
|
+
if (skills.length === 0)
|
|
251
|
+
return null;
|
|
252
|
+
const headers = ["Name", "Type", "URL", "Fields", "Created"];
|
|
253
|
+
const rows = skills.map((s) => {
|
|
254
|
+
const skill = s;
|
|
255
|
+
const fields = Array.isArray(skill.fields) ? skill.fields.join(", ") : "";
|
|
256
|
+
const created = typeof skill.created_at === "string" ? skill.created_at.split("T")[0] : "";
|
|
257
|
+
const toolType = String(skill.tool ?? "extract");
|
|
258
|
+
const typeLabel = skill.builtin ? `${toolType} (built-in)` : toolType;
|
|
259
|
+
return [String(skill.name ?? ""), typeLabel, colorUrl(String(skill.url ?? "")), fields, created];
|
|
260
|
+
});
|
|
261
|
+
return renderTable(headers, rows);
|
|
262
|
+
}
|
|
263
|
+
if (toolName === "knowledge") {
|
|
264
|
+
const domains = Array.isArray(obj.domains) ? obj.domains : [];
|
|
265
|
+
if (domains.length === 0)
|
|
266
|
+
return null;
|
|
267
|
+
const headers = ["Domain", "Level", "Success%", "Reqs", "Rate/RPM", "AntiBot", "Updated"];
|
|
268
|
+
const rows = domains.map((d) => {
|
|
269
|
+
const dom = d;
|
|
270
|
+
return [
|
|
271
|
+
String(dom.domain ?? ""),
|
|
272
|
+
`L${dom.optimal_level ?? 1}`,
|
|
273
|
+
String(dom.success_rate ?? "0%"),
|
|
274
|
+
String(dom.requests ?? 0),
|
|
275
|
+
String(dom.rate_limit_rpm ?? 60),
|
|
276
|
+
String(dom.antibot ?? "none"),
|
|
277
|
+
String(dom.last_updated ?? ""),
|
|
278
|
+
];
|
|
279
|
+
});
|
|
280
|
+
return renderTable(headers, rows);
|
|
281
|
+
}
|
|
282
|
+
if (["search", "news_search", "image_search", "video_search"].includes(toolName)) {
|
|
283
|
+
const results = Array.isArray(obj.results) ? obj.results : [];
|
|
284
|
+
if (results.length === 0)
|
|
285
|
+
return null;
|
|
286
|
+
const headers = ["#", "Title", "URL"];
|
|
287
|
+
const rows = results.slice(0, 20).map((r, i) => {
|
|
288
|
+
const result = r;
|
|
289
|
+
const title = String(result.title ?? result.name ?? "").slice(0, 50);
|
|
290
|
+
const url = colorUrl(String(result.url ?? result.source ?? "").slice(0, 60));
|
|
291
|
+
return [String(i + 1), title, url];
|
|
292
|
+
});
|
|
293
|
+
return renderTable(headers, rows);
|
|
294
|
+
}
|
|
295
|
+
return null;
|
|
296
|
+
}
|
|
297
|
+
// ── Contextual Error Messages ────────────────────────────────────────
|
|
298
|
+
function handleToolError(toolName, msg) {
|
|
299
|
+
errorMsg(msg);
|
|
300
|
+
const needsKey = msg.includes("API_KEY") ||
|
|
301
|
+
msg.toLowerCase().includes("api key") ||
|
|
302
|
+
["search", "news_search", "image_search", "video_search", "ai_extract"].includes(toolName);
|
|
303
|
+
if (needsKey) {
|
|
304
|
+
process.stderr.write("\n Run \x1b[1mimperiumcrawl setup\x1b[0m to configure API keys.\n\n");
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// ── Program Builder ──────────────────────────────────────────────────
|
|
308
|
+
export async function buildCli() {
|
|
309
|
+
const program = new Command();
|
|
310
|
+
program
|
|
311
|
+
.name("imperiumcrawl")
|
|
312
|
+
.description("39-tool web scraping, crawling, search, media download, API discovery, and reusable browser workflow CLI.\nRun without arguments in TTY for interactive TUI.")
|
|
313
|
+
.version(PACKAGE_VERSION)
|
|
314
|
+
.addOption(new Option("--output-format <fmt>", "Output format")
|
|
315
|
+
.choices(["json", "jsonl", "csv", "markdown"])
|
|
316
|
+
.default("json"))
|
|
317
|
+
.option("--output <file>", "Write output to file instead of stdout")
|
|
318
|
+
.option("--pretty", "Pretty-print JSON output", false);
|
|
319
|
+
// ── Setup wizard ────────────────────────────────────────────────
|
|
320
|
+
program
|
|
321
|
+
.command("setup")
|
|
322
|
+
.description("Configure API keys and save them to ~/.imperium-crawl/config.json")
|
|
323
|
+
.action(async () => {
|
|
324
|
+
const { runSetup } = await import("./onboarding.js");
|
|
325
|
+
await runSetup();
|
|
326
|
+
});
|
|
327
|
+
// ── Explore REPL — interactive browser session with recording ──
|
|
328
|
+
program
|
|
329
|
+
.command("explore <url>")
|
|
330
|
+
.description("Open an interactive browser REPL. Navigate, click, type — every action is recorded. Run save-skill inside to export the session as a reusable skill.")
|
|
331
|
+
.option("--session-id <id>", "Restore and save cookies for this session ID")
|
|
332
|
+
.action(async (url, opts) => {
|
|
333
|
+
const { runExplore } = await import("./explore.js");
|
|
334
|
+
await runExplore(url, opts.sessionId);
|
|
335
|
+
});
|
|
336
|
+
// ── Tool commands — lazy loaded ──────────────────────────────────
|
|
337
|
+
const requestedCmd = getRequestedCmd();
|
|
338
|
+
for (const { cmd, description } of TOOL_MANIFEST) {
|
|
339
|
+
const sub = program.command(cmd).description(description);
|
|
340
|
+
const positionalKey = positionalKeyForCmd(cmd);
|
|
341
|
+
if (positionalKey === "flow")
|
|
342
|
+
sub.argument("[flow]", "Flow reference in '<family>/<variant>' form");
|
|
343
|
+
if (positionalKey === "family")
|
|
344
|
+
sub.argument("[family]", "Optional flow family to expose");
|
|
345
|
+
if (cmd === requestedCmd) {
|
|
346
|
+
// Load the full tool module for this command only.
|
|
347
|
+
// This is the only heavy import at startup — all others are skipped.
|
|
348
|
+
const toolModule = await import(`./tools/${cmd}.js`);
|
|
349
|
+
addOptionsFromSchema(sub, toolModule.schema);
|
|
350
|
+
sub.action(async (...args) => {
|
|
351
|
+
const last = args[args.length - 1];
|
|
352
|
+
const localOpts = typeof last.opts === "function"
|
|
353
|
+
? last.opts()
|
|
354
|
+
: last;
|
|
355
|
+
if (positionalKey && typeof args[0] === "string")
|
|
356
|
+
localOpts[positionalKey] = args[0];
|
|
357
|
+
await runTool(toolModule, localOpts, program);
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
// For all other commands: register with just name + description.
|
|
362
|
+
// Options are loaded lazily if the command is somehow invoked.
|
|
363
|
+
sub.action(async (...args) => {
|
|
364
|
+
const toolModule = await import(`./tools/${cmd}.js`);
|
|
365
|
+
// Re-parse options now that we have the schema
|
|
366
|
+
const rawOpts = sub.opts();
|
|
367
|
+
if (positionalKey && typeof args[0] === "string")
|
|
368
|
+
rawOpts[positionalKey] = args[0];
|
|
369
|
+
await runTool(toolModule, rawOpts, program);
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return program;
|
|
374
|
+
}
|
|
375
|
+
async function runTool(tool, localOpts, program) {
|
|
376
|
+
const globalOpts = program.opts();
|
|
377
|
+
const input = optsToInput(localOpts, tool.schema);
|
|
378
|
+
let validated;
|
|
379
|
+
try {
|
|
380
|
+
validated = tool.schema.parse(input);
|
|
381
|
+
}
|
|
382
|
+
catch (err) {
|
|
383
|
+
if (err instanceof z.ZodError) {
|
|
384
|
+
const issues = err.issues
|
|
385
|
+
.map((i) => ` ${i.path.join(".")}: ${i.message}`)
|
|
386
|
+
.join("\n");
|
|
387
|
+
process.stderr.write(`Validation error:\n${issues}\n`);
|
|
388
|
+
process.exit(1);
|
|
389
|
+
}
|
|
390
|
+
throw err;
|
|
391
|
+
}
|
|
392
|
+
const spinner = createSpinner(`Running ${tool.name}...`);
|
|
393
|
+
const start = Date.now();
|
|
394
|
+
let result;
|
|
395
|
+
try {
|
|
396
|
+
result = await tool.execute(validated);
|
|
397
|
+
spinner.succeed(`Done in ${((Date.now() - start) / 1000).toFixed(1)}s`);
|
|
398
|
+
}
|
|
399
|
+
catch (err) {
|
|
400
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
401
|
+
spinner.fail(`Failed: ${msg}`);
|
|
402
|
+
handleToolError(tool.name, msg);
|
|
403
|
+
process.exit(1);
|
|
404
|
+
}
|
|
405
|
+
// Handle image responses (screenshot tool, interact with return_screenshot)
|
|
406
|
+
const imageResult = parseImageOutput(result);
|
|
407
|
+
if (imageResult) {
|
|
408
|
+
const imgPath = `screenshot-${Date.now()}.png`;
|
|
409
|
+
writeFileSync(imgPath, Buffer.from(imageResult.data, "base64"));
|
|
410
|
+
process.stderr.write(`Screenshot saved to ${imgPath}\n`);
|
|
411
|
+
}
|
|
412
|
+
const data = parseToolOutput(result);
|
|
413
|
+
// Image-only response (no text data) — we're done
|
|
414
|
+
if (imageResult && data === null)
|
|
415
|
+
return;
|
|
416
|
+
const table = tryRenderTable(tool.name, data);
|
|
417
|
+
if (table) {
|
|
418
|
+
process.stdout.write(table + "\n");
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
421
|
+
const formatOptions = {
|
|
422
|
+
format: globalOpts.outputFormat,
|
|
423
|
+
pretty: globalOpts.pretty,
|
|
424
|
+
};
|
|
425
|
+
const output = formatOutput(data, formatOptions);
|
|
426
|
+
const outputFile = globalOpts.output;
|
|
427
|
+
if (outputFile) {
|
|
428
|
+
writeFileSync(outputFile, output + "\n", "utf-8");
|
|
429
|
+
process.stderr.write(`Written to ${outputFile}\n`);
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
432
|
+
process.stdout.write(output + "\n");
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
// ── Entry Point ──────────────────────────────────────────────────────
|
|
436
|
+
export async function runCli() {
|
|
437
|
+
const program = await buildCli();
|
|
438
|
+
await program.parseAsync(process.argv);
|
|
439
|
+
}
|
|
440
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/cli/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Explore REPL — interactive browser session with live Playwright.
|
|
3
|
+
*
|
|
4
|
+
* Usage: imperium-crawl explore <url>
|
|
5
|
+
*
|
|
6
|
+
* Opens a headed (visible) browser window and gives the user a readline REPL
|
|
7
|
+
* to execute actions interactively. Every successful action is recorded.
|
|
8
|
+
* At any point, run `save-skill <name>` to export the session as a reusable skill.
|
|
9
|
+
*
|
|
10
|
+
* Commands:
|
|
11
|
+
* navigate <url> Navigate to URL
|
|
12
|
+
* click <selector> Click element
|
|
13
|
+
* type <selector> <text> Fill input field
|
|
14
|
+
* select <selector> <value> Select option
|
|
15
|
+
* wait [ms] Wait N ms (default 1000)
|
|
16
|
+
* screenshot [file] Save screenshot
|
|
17
|
+
* snapshot Show ARIA tree + refs
|
|
18
|
+
* evaluate <script> Run JS in page
|
|
19
|
+
* scroll [up|down] [px] Scroll page
|
|
20
|
+
* hover <selector> Hover element
|
|
21
|
+
* press <key> Press keyboard key
|
|
22
|
+
* save-skill <name> Export recording as skill JSON
|
|
23
|
+
* status Show URL, action count
|
|
24
|
+
* history List recorded actions
|
|
25
|
+
* undo Remove last action
|
|
26
|
+
* help Show command list
|
|
27
|
+
* exit / quit Close browser and exit
|
|
28
|
+
*/
|
|
29
|
+
export declare function runExplore(startUrl: string, sessionId?: string): Promise<void>;
|
|
30
|
+
//# sourceMappingURL=explore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explore.d.ts","sourceRoot":"","sources":["../../src/cli/explore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAgGH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6RpF"}
|