dsh-web-search-pro 0.2.0 → 0.2.1

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 (80) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +75 -6
  3. package/assets/skills/dsh-web-search-pro/SKILL.md +1 -1
  4. package/assets/skills/dsh-web-search-pro/references/sources.md +11 -2
  5. package/catalog/sources.v1.json +20 -12
  6. package/lib/actions/search.js +5 -4
  7. package/lib/actions/search.js.map +1 -1
  8. package/lib/actions/sources.js +42 -25
  9. package/lib/actions/sources.js.map +1 -1
  10. package/lib/cli/builtin-specs.js +306 -0
  11. package/lib/cli/builtin-specs.js.map +1 -0
  12. package/lib/cli/chain.js +192 -0
  13. package/lib/cli/chain.js.map +1 -0
  14. package/lib/cli/chains-spec.js +98 -0
  15. package/lib/cli/chains-spec.js.map +1 -0
  16. package/lib/cli/engine.js +83 -0
  17. package/lib/cli/engine.js.map +1 -0
  18. package/lib/cli/opencli.js +105 -0
  19. package/lib/cli/opencli.js.map +1 -0
  20. package/lib/cli/probe.js +128 -0
  21. package/lib/cli/probe.js.map +1 -0
  22. package/lib/cli/runner.js +374 -0
  23. package/lib/cli/runner.js.map +1 -0
  24. package/lib/cli/spec.js +416 -0
  25. package/lib/cli/spec.js.map +1 -0
  26. package/lib/client/SettingsCard.js +1 -1
  27. package/lib/client/SettingsCard.js.map +1 -1
  28. package/lib/client/form-specs.js +2 -0
  29. package/lib/client/form-specs.js.map +1 -1
  30. package/lib/client/form.js +14 -3
  31. package/lib/client/form.js.map +1 -1
  32. package/lib/client/locales.js +4 -0
  33. package/lib/client/locales.js.map +1 -1
  34. package/lib/client/validators.js +15 -0
  35. package/lib/client/validators.js.map +1 -1
  36. package/lib/client.js +1425 -3
  37. package/lib/client.js.map +1 -1
  38. package/lib/config.js +4 -0
  39. package/lib/config.js.map +1 -1
  40. package/lib/deps.js +109 -102
  41. package/lib/deps.js.map +1 -1
  42. package/lib/engine-error.js +19 -0
  43. package/lib/engine-error.js.map +1 -0
  44. package/lib/engines.js +31 -114
  45. package/lib/engines.js.map +1 -1
  46. package/lib/pipeline/candidates.js.map +1 -1
  47. package/lib/pipeline/run.js +4 -2
  48. package/lib/pipeline/run.js.map +1 -1
  49. package/lib/providers/builtin.js +10 -14
  50. package/lib/providers/builtin.js.map +1 -1
  51. package/lib/providers/platforms.js +114 -55
  52. package/lib/providers/platforms.js.map +1 -1
  53. package/lib/providers/registry.js.map +1 -1
  54. package/lib/router.js +63 -6
  55. package/lib/router.js.map +1 -1
  56. package/lib/types/cli/builtin-specs.d.ts +30 -0
  57. package/lib/types/cli/chain.d.ts +83 -0
  58. package/lib/types/cli/chains-spec.d.ts +39 -0
  59. package/lib/types/cli/engine.d.ts +43 -0
  60. package/lib/types/cli/opencli.d.ts +38 -0
  61. package/lib/types/cli/probe.d.ts +53 -0
  62. package/lib/types/cli/runner.d.ts +87 -0
  63. package/lib/types/cli/spec.d.ts +176 -0
  64. package/lib/types/client/form-specs.d.ts +1 -1
  65. package/lib/types/client/locales.d.ts +4 -0
  66. package/lib/types/client/validators.d.ts +6 -0
  67. package/lib/types/config.d.ts +11 -0
  68. package/lib/types/deps.d.ts +25 -23
  69. package/lib/types/engine-error.d.ts +12 -0
  70. package/lib/types/engines.d.ts +16 -9
  71. package/lib/types/index.d.ts +4 -0
  72. package/lib/types/pipeline/candidates.d.ts +2 -0
  73. package/lib/types/pipeline/run.d.ts +2 -1
  74. package/lib/types/providers/platforms.d.ts +15 -3
  75. package/lib/types/providers/registry.d.ts +3 -0
  76. package/lib/types/router.d.ts +13 -0
  77. package/lib/types/util.d.ts +6 -1
  78. package/lib/util.js +7 -3
  79. package/lib/util.js.map +1 -1
  80. package/package.json +2 -2
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Contract probes of CLI adapter specs (dev-plan M12, design §4.3 / §4.4): local only, cached with a TTL. A probe finds
3
+ * the command on PATH and runs ONLY the spec's version and help commands, then checks the contract the spec needs: a
4
+ * minimum version and the subcommands / flags that must appear in the help text. A same-named program with another
5
+ * contract is `incompatible`, not `detected`. A probe never runs a search and never logs in.
6
+ * @module web-search-pro/cli/probe
7
+ */
8
+ import fs from 'node:fs';
9
+ import path from 'node:path';
10
+ import { runCli } from "../util.js";
11
+ import { buildCliEnv } from "./runner.js";
12
+ import { compareVersions, parseVersion } from "./spec.js";
13
+ const DEFAULT_TTL_MS = 60_000;
14
+ const PROBE_TIMEOUT_MS = 8_000;
15
+ const cache = new Map();
16
+ const flights = new Map();
17
+ export function clearProbeCache() {
18
+ cache.clear();
19
+ flights.clear();
20
+ }
21
+ /** The executable `cmd` resolves to on PATH (no process is spawned; Windows tries PATHEXT). */
22
+ export function findOnPath(cmd, env = process.env) {
23
+ const win = process.platform === 'win32';
24
+ const dirs = (env.PATH ?? env.Path ?? '').split(path.delimiter).filter(Boolean);
25
+ const exts = win ? ['', ...(env.PATHEXT ?? '.COM;.EXE;.BAT;.CMD').split(';').filter(Boolean)] : [''];
26
+ for (const dir of dirs) {
27
+ for (const ext of exts) {
28
+ const file = path.join(dir, cmd + ext);
29
+ try {
30
+ const stat = fs.statSync(file);
31
+ if (stat.isFile() && (win || (stat.mode & 0o111) !== 0))
32
+ return file;
33
+ }
34
+ catch { /* not here */ }
35
+ }
36
+ }
37
+ return undefined;
38
+ }
39
+ const keyOf = (spec) => [spec.id, spec.bins.join(','), JSON.stringify(spec.probe), process.env.PATH ?? ''].join('\u0000');
40
+ /** The cached probe of a spec, when one is fresh (no spawn: `Engine.available()` is synchronous). */
41
+ export function cachedProbe(spec, ttlMs = DEFAULT_TTL_MS, now = Date.now) {
42
+ const hit = cache.get(keyOf(spec));
43
+ return hit && now() - hit.at <= ttlMs ? hit.result : undefined;
44
+ }
45
+ /**
46
+ * Decide whether version and help output satisfy a spec's contract. Pure (the fixtures tests call it directly).
47
+ * The version command may fail or print nothing unless the spec asks for a minimum version.
48
+ */
49
+ export function evaluateCliContract(spec, bin, version, help) {
50
+ const { probe } = spec;
51
+ const versionCmd = [bin, ...probe.versionArgs].join(' ');
52
+ const detected = version.code === 0 ? parseVersion(version.output) : undefined;
53
+ if (probe.minVersion !== undefined) {
54
+ if (version.code !== 0)
55
+ return { state: 'incompatible', reason: versionCmd + ' failed with exit ' + version.code };
56
+ if (!detected)
57
+ return { state: 'incompatible', reason: versionCmd + ' returned no semantic version' };
58
+ if (compareVersions(detected, probe.minVersion) < 0)
59
+ return { state: 'incompatible', version: detected, reason: bin + ' ' + detected + ' is older than required ' + probe.minVersion };
60
+ }
61
+ const withVersion = detected ? { version: detected } : {};
62
+ const helpCmd = [bin, ...probe.helpArgs].join(' ');
63
+ if (help.code !== 0)
64
+ return { state: 'incompatible', ...withVersion, reason: helpCmd + ' failed with exit ' + help.code };
65
+ const lower = help.output.toLowerCase();
66
+ const missing = probe.mustContain.filter(fragment => !lower.includes(fragment.toLowerCase()));
67
+ if (missing.length) {
68
+ const words = probe.helpArgs.filter(arg => !arg.startsWith('-')).join(' ') || 'help';
69
+ return { state: 'incompatible', ...withVersion, reason: bin + ' ' + words + ' contract missing ' + missing.join(', ') + ' (a different program with the same name?)' };
70
+ }
71
+ return { state: 'detected', ...withVersion };
72
+ }
73
+ async function probeUncached(spec, options) {
74
+ const run = options.run ?? runCli;
75
+ const now = options.now ?? Date.now;
76
+ const env = buildCliEnv(spec);
77
+ const call = async (bin, args) => {
78
+ const res = await run(bin, [...args], { timeoutMs: PROBE_TIMEOUT_MS, signal: undefined, env, cleanEnv: true, maxOutput: 128 * 1024, outputEncoding: 'utf-8' });
79
+ return { code: res.timedOut || res.spawnFailed ? -1 : res.code, output: res.stdout + '\n' + res.stderr };
80
+ };
81
+ let firstBad;
82
+ for (const bin of spec.bins) {
83
+ const found = findOnPath(bin);
84
+ if (!found)
85
+ continue;
86
+ const version = await call(found, spec.probe.versionArgs);
87
+ const help = await call(found, spec.probe.helpArgs);
88
+ const verdict = evaluateCliContract(spec, bin, version, help);
89
+ const result = { state: verdict.state, bin, path: found, ...verdict.version ? { version: verdict.version } : {}, ...verdict.reason ? { reason: verdict.reason } : {}, checkedAt: now() };
90
+ if (verdict.state === 'detected')
91
+ return result;
92
+ firstBad ??= result;
93
+ }
94
+ return firstBad ?? { state: 'missing', reason: spec.bins.join(' / ') + ' not found on PATH (' + spec.packageNote + ')', checkedAt: now() };
95
+ }
96
+ /** Probe one spec (cached; concurrent calls for the same spec share one run). */
97
+ export async function probeCli(spec, options = {}) {
98
+ const key = keyOf(spec);
99
+ const now = options.now ?? Date.now;
100
+ if (!options.force) {
101
+ const hit = cache.get(key);
102
+ if (hit && now() - hit.at <= (options.ttlMs ?? DEFAULT_TTL_MS))
103
+ return hit.result;
104
+ const flight = flights.get(key);
105
+ if (flight)
106
+ return flight;
107
+ }
108
+ const flight = probeUncached(spec, options).then(result => { cache.set(key, { at: now(), result }); return result; }).finally(() => { if (flights.get(key) === flight)
109
+ flights.delete(key); });
110
+ flights.set(key, flight);
111
+ return flight;
112
+ }
113
+ /** Probe many specs with a small concurrency bound (a settings refresh must not spawn dozens of processes at once). */
114
+ export async function probeAll(specs, options = {}, concurrency = 4) {
115
+ const out = new Map();
116
+ let next = 0;
117
+ const worker = async () => {
118
+ for (;;) {
119
+ const spec = specs[next++];
120
+ if (!spec)
121
+ return;
122
+ out.set(spec.id, await probeCli(spec, options));
123
+ }
124
+ };
125
+ await Promise.all(Array.from({ length: Math.min(concurrency, specs.length) }, worker));
126
+ return out;
127
+ }
128
+ //# sourceMappingURL=probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/cli/probe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,374 @@
1
+ /**
2
+ * The runner of CLI adapter specs (dev-plan M12): spawns the tool without a shell, decodes its output as UTF-8, caps
3
+ * time and size, maps the output to search sources and every failure to a structured error. It never logs or echoes
4
+ * environment values (error text is scrubbed of any value of a variable the spec names) and never runs a login.
5
+ * @module web-search-pro/cli/runner
6
+ */
7
+ import fs from 'node:fs';
8
+ import os from 'node:os';
9
+ import path from 'node:path';
10
+ import { capText, htmlDecode, jsYaml, runCli, stripTags } from "../util.js";
11
+ import { EngineError } from "../engine-error.js";
12
+ import { searchSpecFor, } from "./spec.js";
13
+ /** A structured failure of a CLI adapter: `code` is one of {@link CliErrorCode}; `hint` says what the user can do. */
14
+ export class CliAdapterError extends EngineError {
15
+ hint;
16
+ constructor(message, code, hint, retryable = false) {
17
+ super(message, code, retryable);
18
+ this.hint = hint;
19
+ this.name = 'CliAdapterError';
20
+ }
21
+ }
22
+ /** Variables every tool needs to start and reach the network; nothing else of the process environment is handed over. */
23
+ const BASE_ENV = [
24
+ 'PATH', 'PATHEXT', 'HOME', 'USERPROFILE', 'HOMEDRIVE', 'HOMEPATH', 'APPDATA', 'LOCALAPPDATA', 'SYSTEMROOT', 'SystemRoot', 'COMSPEC', 'WINDIR',
25
+ 'TEMP', 'TMP', 'TMPDIR', 'LANG', 'LANGUAGE', 'LC_ALL', 'LC_CTYPE', 'XDG_CONFIG_HOME', 'XDG_DATA_HOME', 'XDG_CACHE_HOME', 'XDG_STATE_HOME',
26
+ 'HTTP_PROXY', 'HTTPS_PROXY', 'ALL_PROXY', 'NO_PROXY', 'http_proxy', 'https_proxy', 'all_proxy', 'no_proxy',
27
+ 'SSL_CERT_FILE', 'SSL_CERT_DIR', 'REQUESTS_CA_BUNDLE', 'CURL_CA_BUNDLE', 'NODE_EXTRA_CA_CERTS',
28
+ ];
29
+ /** UTF-8 for Python tools (the Windows console otherwise answers in the system code page; dev issue #28). */
30
+ const UTF8_ENV = { PYTHONUTF8: '1', PYTHONIOENCODING: 'utf-8' };
31
+ /** The environment a spec's command runs with: the base set, what the spec lists, and the fixed UTF-8 / `env.set` values. */
32
+ export function buildCliEnv(spec, source = process.env) {
33
+ const out = {};
34
+ const take = (name) => { const value = source[name]; if (value !== undefined)
35
+ out[name] = value; };
36
+ for (const name of BASE_ENV)
37
+ take(name);
38
+ for (const name of spec.env.required ?? [])
39
+ take(name);
40
+ for (const name of spec.env.passthrough ?? [])
41
+ take(name);
42
+ return { ...out, ...UTF8_ENV, ...spec.env.set };
43
+ }
44
+ /** Names of the credential variables a spec relies on that are not set. */
45
+ export function missingEnv(spec, source = process.env) {
46
+ return (spec.env.required ?? []).filter(name => !source[name]);
47
+ }
48
+ /** The home-relative saved-login files of a spec that exist (existence only; the content is never read). */
49
+ export function savedLoginPresent(spec, opts = {}) {
50
+ const files = spec.login?.savedCredentialPaths;
51
+ if (!files?.length)
52
+ return undefined;
53
+ const home = opts.home ?? os.homedir();
54
+ const exists = opts.exists ?? ((file) => { try {
55
+ return fs.existsSync(file);
56
+ }
57
+ catch {
58
+ return false;
59
+ } });
60
+ return files.some(file => exists(path.join(home, file.replace(/^~\//, ''))));
61
+ }
62
+ /** What the user must do to log in: the tool's own command run by them, or the environment variables they set. Never run by the plugin. */
63
+ export function loginHint(spec) {
64
+ if (spec.login?.command)
65
+ return 'run `' + spec.login.command + '` yourself' + (spec.env.required?.length ? ' (or set ' + spec.env.required.join(' / ') + ')' : '');
66
+ if (spec.env.required?.length)
67
+ return 'set ' + spec.env.required.join(' / ') + ' in your environment (and run `' + spec.bins[0] + ' login` yourself if the tool has one)';
68
+ return 'run `' + spec.bins[0] + ' login` yourself';
69
+ }
70
+ // ── output → sources ────────────────────────────────────────────────────────
71
+ const isObject = (v) => v !== null && typeof v === 'object' && !Array.isArray(v);
72
+ export function getPath(root, dotted) {
73
+ let node = root;
74
+ for (const key of dotted.split('.')) {
75
+ if (Array.isArray(node))
76
+ node = node[Number(key)];
77
+ else if (isObject(node))
78
+ node = node[key];
79
+ else
80
+ return undefined;
81
+ }
82
+ return node;
83
+ }
84
+ function asText(value, empty) {
85
+ if (typeof value === 'string' || typeof value === 'number') {
86
+ const text = String(value).trim();
87
+ return text.length === 0 || empty.has(text) ? undefined : text;
88
+ }
89
+ return undefined;
90
+ }
91
+ function joinPart(part, item, empty) {
92
+ const p = typeof part === 'string' ? { path: part } : part;
93
+ const text = asText(getPath(item, p.path), empty);
94
+ return text === undefined ? undefined : (p.prefix ?? '') + text + (p.suffix ?? '');
95
+ }
96
+ function fillTemplate(source, item, empty) {
97
+ if (source.when && getPath(item, source.when.path) !== source.when.equals)
98
+ return undefined;
99
+ let missing = false;
100
+ const text = source.template.replace(/\{([^}]+)\}/g, (_m, p) => { const v = asText(getPath(item, p), empty); if (v === undefined)
101
+ missing = true; return v ?? ''; });
102
+ return missing ? undefined : text;
103
+ }
104
+ export function resolveField(source, item, empty = new Set()) {
105
+ if (source === undefined)
106
+ return undefined;
107
+ if (typeof source === 'string')
108
+ return asText(getPath(item, source), empty);
109
+ if (Array.isArray(source)) {
110
+ for (const entry of source) {
111
+ const text = typeof entry === 'string' ? asText(getPath(item, entry), empty) : fillTemplate(entry, item, empty);
112
+ if (text !== undefined)
113
+ return text;
114
+ }
115
+ return undefined;
116
+ }
117
+ if ('template' in source)
118
+ return fillTemplate(source, item, empty);
119
+ if ('epoch' in source) {
120
+ const raw = Number(getPath(item, source.epoch));
121
+ const date = Number.isFinite(raw) && raw > 0 ? new Date(raw * 1000) : undefined;
122
+ return date && !Number.isNaN(date.getTime()) ? date.toISOString() : undefined;
123
+ }
124
+ if ('date' in source)
125
+ return asText(getPath(item, source.date), empty)?.slice(0, 10);
126
+ const joined = source;
127
+ const parts = joined.join.map(part => joinPart(part, item, empty)).filter((v) => v !== undefined);
128
+ return parts.length ? parts.join(joined.sep ?? ' | ') : undefined;
129
+ }
130
+ function firstArray(value) {
131
+ if (Array.isArray(value))
132
+ return value;
133
+ if (!isObject(value))
134
+ return undefined;
135
+ for (const entry of Object.values(value))
136
+ if (Array.isArray(entry))
137
+ return entry;
138
+ const data = value.data;
139
+ if (isObject(data))
140
+ for (const entry of Object.values(data))
141
+ if (Array.isArray(entry))
142
+ return entry;
143
+ return undefined;
144
+ }
145
+ /** The label of a spec in messages (`bili`). */
146
+ const labelOf = (spec) => spec.bins[0];
147
+ /**
148
+ * Parse a tool's stdout into the items its output spec describes. A broken payload is CLI_CONTRACT_MISMATCH (the tool is not
149
+ * what the spec says); a payload that says it failed (`expect` not met) is CLI_FAILED with the tool's own message.
150
+ */
151
+ export function parseCliItems(spec, output, stdout) {
152
+ const label = labelOf(spec);
153
+ const text = stdout.replace(/^/, '');
154
+ if (output.format === 'text') {
155
+ const lines = text.split(/\r?\n/);
156
+ if (output.lines?.mode === 'url-lines') {
157
+ const items = [];
158
+ for (const line of lines) {
159
+ const m = /(https?:\/\/[^\s]+)/.exec(line);
160
+ if (!m)
161
+ continue;
162
+ const title = stripTags(line).replace(m[1], '').trim();
163
+ if (title)
164
+ items.push({ url: m[1], title });
165
+ }
166
+ return items;
167
+ }
168
+ const columns = output.lines?.mode === 'tsv' ? output.lines.columns : [];
169
+ return lines.filter(line => line.length > 0).map(line => Object.fromEntries(line.split('\t').map((cell, index) => [columns[index] ?? 'c' + index, cell])));
170
+ }
171
+ let parsed;
172
+ if (output.format === 'ndjson') {
173
+ const rows = [];
174
+ for (const line of text.split(/\r?\n/)) {
175
+ if (!line.trim())
176
+ continue;
177
+ try {
178
+ rows.push(JSON.parse(line));
179
+ }
180
+ catch { /* a progress or log line between records */ }
181
+ }
182
+ if (!rows.length && text.trim())
183
+ throw new CliAdapterError(label + ' output is not valid UTF-8 NDJSON', 'CLI_CONTRACT_MISMATCH', 'the installed ' + label + ' does not match this adapter: check `sources.deps`');
184
+ return rows;
185
+ }
186
+ if (output.format === 'yaml') {
187
+ try {
188
+ parsed = jsYaml.load(text);
189
+ }
190
+ catch {
191
+ throw new CliAdapterError(label + ' output is not valid YAML', 'CLI_CONTRACT_MISMATCH', 'the installed ' + label + ' does not match this adapter: check `sources.deps`');
192
+ }
193
+ }
194
+ else {
195
+ try {
196
+ parsed = JSON.parse(text);
197
+ }
198
+ catch {
199
+ throw new CliAdapterError(label + ' output is not valid UTF-8 JSON', 'CLI_CONTRACT_MISMATCH', 'the installed ' + label + ' does not match this adapter: check `sources.deps`');
200
+ }
201
+ }
202
+ for (const rule of output.expect ?? []) {
203
+ if (getPath(parsed, rule.path) !== rule.equals) {
204
+ const detail = (output.errorPaths ?? []).map(p => asText(getPath(parsed, p), new Set())).find(v => v !== undefined);
205
+ if (detail)
206
+ throw new CliAdapterError(label + ' search failed: ' + capText(detail, 200), 'CLI_FAILED');
207
+ throw new CliAdapterError(label + ' search failed: unexpected response envelope', 'CLI_CONTRACT_MISMATCH', 'the installed ' + label + ' does not match this adapter: check `sources.deps`');
208
+ }
209
+ }
210
+ const items = output.itemsPath !== undefined ? getPath(parsed, output.itemsPath) : firstArray(parsed);
211
+ if (!Array.isArray(items))
212
+ throw new CliAdapterError(label + ' output has no result list' + (output.itemsPath ? ' at ' + output.itemsPath : ''), 'CLI_CONTRACT_MISMATCH', 'the installed ' + label + ' does not match this adapter: check `sources.deps`');
213
+ return items;
214
+ }
215
+ /** The tool's own error text from a parsed json / yaml payload (`errorPaths`), when it carries one. */
216
+ export function payloadError(output, stdout) {
217
+ if (!output.errorPaths?.length || (output.format !== 'json' && output.format !== 'yaml'))
218
+ return undefined;
219
+ try {
220
+ const parsed = output.format === 'json' ? JSON.parse(stdout.replace(/^\uFEFF/, '')) : jsYaml.load(stdout);
221
+ return output.errorPaths.map(p => asText(getPath(parsed, p), new Set())).find(v => v !== undefined);
222
+ }
223
+ catch {
224
+ return undefined;
225
+ }
226
+ }
227
+ /**
228
+ * Strip markup from a field. Highlight tags (`<em>备案</em>`) vanish without leaving a space (Chinese words must not be split),
229
+ * block-level tags become a space, entities are decoded.
230
+ */
231
+ export function stripMarkup(input) {
232
+ return htmlDecode(input.replace(/<\/?(?:p|div|br|li|ul|ol|tr|td|th|h[1-6]|section|article|blockquote)\b[^>]*>/gi, ' ').replace(/<[^>]*>/g, '')).replace(/\s+/g, ' ').trim();
233
+ }
234
+ /**
235
+ * Map parsed items to sources by the output spec: http(s) URLs only, snippets and titles capped, tags stripped when asked.
236
+ * `skipped` counts the items (objects) that had no usable link, so the caller can say so instead of silently returning fewer.
237
+ */
238
+ export function mapCliItemsDetailed(output, items, count) {
239
+ const empty = new Set(output.emptyValues ?? []);
240
+ const clean = (text) => (text === undefined ? undefined : output.stripTags ? stripMarkup(text) : text);
241
+ const sources = [];
242
+ let skipped = 0;
243
+ for (const item of items) {
244
+ if (!isObject(item))
245
+ continue;
246
+ const url = resolveField(output.fields.url, item, empty);
247
+ if (!url || !/^https?:\/\//i.test(url)) {
248
+ skipped++;
249
+ continue;
250
+ }
251
+ const rawTitle = clean(resolveField(output.fields.title, item, empty));
252
+ const title = rawTitle ? capText(rawTitle, output.titleMax ?? 300) : undefined;
253
+ if (output.requireTitle && !title)
254
+ continue;
255
+ const snippet = clean(resolveField(output.fields.snippet, item, empty));
256
+ const publishedAt = resolveField(output.fields.publishedAt, item, empty);
257
+ sources.push({
258
+ url,
259
+ ...title ? { title } : {},
260
+ ...snippet ? { snippet: capText(snippet, output.snippetMax ?? 400) } : {},
261
+ ...publishedAt ? { publishedAt } : {},
262
+ });
263
+ if (sources.length >= count)
264
+ break;
265
+ }
266
+ return { sources, skipped };
267
+ }
268
+ export function mapCliItems(output, items, count) {
269
+ return mapCliItemsDetailed(output, items, count).sources;
270
+ }
271
+ /** Parse and map in one go (what the fixtures tests call). */
272
+ export function parseCliOutput(spec, search, stdout, count = 20) {
273
+ return mapCliItems(search.output, parseCliItems(spec, search.output, stdout), count);
274
+ }
275
+ // ── argv ────────────────────────────────────────────────────────────────────
276
+ /** Fill the placeholders of an argv template. A value that would read as a flag gets a leading space (the tool then takes it as the query). */
277
+ export function buildArgv(search, input) {
278
+ const count = Math.min(Math.max(Math.trunc(input.count) || 1, 1), search.maxCount ?? 50);
279
+ const dashdash = (index) => search.argv.slice(0, index).includes('--');
280
+ return search.argv.map((token, index) => {
281
+ const withCount = token.replace(/\{count\}/g, () => String(count));
282
+ if (withCount === '{query}' || withCount === '{url}')
283
+ return input.query.startsWith('-') && !dashdash(index) ? ' ' + input.query : input.query;
284
+ return withCount.replace(/\{(?:query|url)\}/g, () => input.query);
285
+ });
286
+ }
287
+ function redactor(spec, source) {
288
+ const secrets = [...spec.env.required ?? [], ...spec.env.passthrough ?? []].map(name => source[name]).filter((v) => typeof v === 'string' && v.length >= 6);
289
+ return text => secrets.reduce((acc, secret) => acc.split(secret).join('[redacted]'), text);
290
+ }
291
+ const includesAny = (text, fragments) => {
292
+ const lower = text.toLowerCase();
293
+ return !!fragments?.some(fragment => lower.includes(fragment.toLowerCase()));
294
+ };
295
+ /**
296
+ * Run one spec command for a query and return its sources. Throws {@link CliAdapterError} (CLI_NOT_FOUND,
297
+ * CLI_CONTRACT_MISMATCH, CLI_NOT_LOGGED_IN, CLI_FAILED), ENGINE_EMPTY for a valid empty answer, ENGINE_TIMEOUT, or the
298
+ * abort reason when the caller's signal fires. Nothing is run when the spec's credentials are missing.
299
+ */
300
+ export async function runCliSearch(spec, input, options = {}) {
301
+ return (await runCliSearchDetailed(spec, input, options)).sources;
302
+ }
303
+ /** {@link runCliSearch} that also reports how many results had no usable link and were skipped. */
304
+ export async function runCliSearchDetailed(spec, input, options = {}) {
305
+ const operation = options.operation ?? 'search';
306
+ const search = operation === 'read' ? spec.read : searchSpecFor(spec, options.platform ?? spec.platforms[0] ?? '');
307
+ const label = labelOf(spec);
308
+ if (!search)
309
+ throw new CliAdapterError(label + ' has no ' + operation + ' command in this adapter', 'CLI_CONTRACT_MISMATCH');
310
+ const source = options.env ?? process.env;
311
+ const redact = redactor(spec, source);
312
+ if (!options.skipCredentialGate) {
313
+ const missing = missingEnv(spec, source);
314
+ if (missing.length)
315
+ throw new CliAdapterError(label + ' is not logged in: ' + missing.join(' / ') + ' not set', 'CLI_NOT_LOGGED_IN', loginHint(spec));
316
+ if (savedLoginPresent(spec, options) === false) {
317
+ throw new CliAdapterError(label + ' has no saved login' + (spec.login?.readsBrowserCookiesWithoutLogin ? ' (it would read your browser cookies by itself, so it is not run)' : ''), 'CLI_NOT_LOGGED_IN', loginHint(spec));
318
+ }
319
+ }
320
+ const argv = buildArgv(search, input);
321
+ const run = options.run ?? runCli;
322
+ const result = await run(options.bin ?? spec.bins[0], argv, {
323
+ timeoutMs: spec.timeoutMs,
324
+ signal: input.signal,
325
+ env: buildCliEnv(spec, source),
326
+ cleanEnv: true,
327
+ maxOutput: spec.maxOutputBytes,
328
+ outputEncoding: 'utf-8',
329
+ });
330
+ if (input.signal?.aborted)
331
+ throw input.signal.reason ?? new DOMException('This operation was aborted', 'AbortError');
332
+ if (result.spawnFailed || (result.code === -1 && !result.timedOut && !result.stderr.trim() && !result.stdout.trim())) {
333
+ throw new CliAdapterError('the ' + label + ' command could not be started: install it (' + spec.packageNote + ')', 'CLI_NOT_FOUND', 'install: ' + spec.packageNote);
334
+ }
335
+ if (result.timedOut)
336
+ throw new EngineError(label + ' timed out after ' + Math.round(spec.timeoutMs / 1000) + 's', 'ENGINE_TIMEOUT', true);
337
+ if (result.truncated)
338
+ throw new CliAdapterError(label + ' output exceeded the ' + spec.maxOutputBytes + ' byte cap', 'CLI_FAILED', 'raise maxOutputBytes of the adapter or ask for fewer results');
339
+ const combined = result.stderr + '\n' + result.stdout;
340
+ const notLoggedIn = () => new CliAdapterError(label + ' is not logged in', 'CLI_NOT_LOGGED_IN', loginHint(spec));
341
+ if (result.code !== 0) {
342
+ if (includesAny(combined, search.notLoggedInPatterns))
343
+ throw notLoggedIn();
344
+ if (includesAny(combined, search.emptyWhen))
345
+ throw new EngineError(label + ' returned no results', 'ENGINE_EMPTY', false);
346
+ throw new CliAdapterError(label + ' ' + operation + ' failed: ' + redact(capText((result.stderr.trim() || result.stdout.trim() || 'exit ' + result.code), 200)), 'CLI_FAILED', undefined, true);
347
+ }
348
+ let sources;
349
+ let skipped = 0;
350
+ try {
351
+ const items = parseCliItems(spec, search.output, result.stdout);
352
+ ({ sources, skipped } = mapCliItemsDetailed(search.output, items, Math.min(Math.max(Math.trunc(input.count) || 1, 1), search.maxCount ?? input.count)));
353
+ }
354
+ catch (error) {
355
+ if (error instanceof CliAdapterError && error.code === 'CLI_FAILED' && includesAny(combined, search.notLoggedInPatterns))
356
+ throw notLoggedIn();
357
+ if (error instanceof CliAdapterError)
358
+ throw new CliAdapterError(redact(error.message), error.code, error.hint, error.retryable);
359
+ throw error;
360
+ }
361
+ if (!sources.length) {
362
+ if (includesAny(combined, search.notLoggedInPatterns))
363
+ throw notLoggedIn();
364
+ if (includesAny(combined, search.emptyWhen))
365
+ throw new EngineError(label + ' returned no results', 'ENGINE_EMPTY', false);
366
+ // A payload that carries the tool's own error list (omnireach `errors`) and no results is a failure, not an empty answer.
367
+ const detail = payloadError(search.output, result.stdout);
368
+ if (detail)
369
+ throw new CliAdapterError(label + ' ' + operation + ' failed: ' + redact(capText(detail, 200)), 'CLI_FAILED', undefined, true);
370
+ throw new EngineError(label + ' returned no results', 'ENGINE_EMPTY', false);
371
+ }
372
+ return { sources, skipped };
373
+ }
374
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/cli/runner.ts"],"names":[],"mappings":"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"}