dsh-web-search-pro 0.2.0 → 0.2.3
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/CHANGELOG.md +179 -0
- package/README.md +197 -32
- package/assets/skills/dsh-web-search-pro/SKILL.md +14 -13
- package/assets/skills/dsh-web-search-pro/references/config.md +36 -0
- package/assets/skills/dsh-web-search-pro/references/sources.md +19 -4
- package/assets/skills/dsh-web-search-pro/references/troubleshooting.md +3 -1
- package/catalog/sources.v1.json +22 -12
- package/lib/actions/approval.js +50 -1
- package/lib/actions/approval.js.map +1 -1
- package/lib/actions/config.js +274 -0
- package/lib/actions/config.js.map +1 -0
- package/lib/actions/errors.js +8 -1
- package/lib/actions/errors.js.map +1 -1
- package/lib/actions/format.js +10 -0
- package/lib/actions/format.js.map +1 -1
- package/lib/actions/index-view.js +2 -2
- package/lib/actions/index-view.js.map +1 -1
- package/lib/actions/read.js +7 -3
- package/lib/actions/read.js.map +1 -1
- package/lib/actions/registry.js +3 -1
- package/lib/actions/registry.js.map +1 -1
- package/lib/actions/run.js +2 -2
- package/lib/actions/run.js.map +1 -1
- package/lib/actions/schema.js +18 -0
- package/lib/actions/schema.js.map +1 -1
- package/lib/actions/search.js +12 -6
- package/lib/actions/search.js.map +1 -1
- package/lib/actions/sources.js +116 -41
- package/lib/actions/sources.js.map +1 -1
- package/lib/actions/types.js +19 -1
- package/lib/actions/types.js.map +1 -1
- package/lib/browser-access.js +25 -0
- package/lib/browser-access.js.map +1 -1
- package/lib/catalog/recommend.js +11 -3
- package/lib/catalog/recommend.js.map +1 -1
- package/lib/catalog/schema.js +3 -1
- package/lib/catalog/schema.js.map +1 -1
- package/lib/cli/builtin-specs.js +341 -0
- package/lib/cli/builtin-specs.js.map +1 -0
- package/lib/cli/chain.js +193 -0
- package/lib/cli/chain.js.map +1 -0
- package/lib/cli/chains-spec.js +118 -0
- package/lib/cli/chains-spec.js.map +1 -0
- package/lib/cli/engine.js +99 -0
- package/lib/cli/engine.js.map +1 -0
- package/lib/cli/opencli-sites.js +83 -0
- package/lib/cli/opencli-sites.js.map +1 -0
- package/lib/cli/opencli.js +153 -0
- package/lib/cli/opencli.js.map +1 -0
- package/lib/cli/probe.js +128 -0
- package/lib/cli/probe.js.map +1 -0
- package/lib/cli/runner.js +564 -0
- package/lib/cli/runner.js.map +1 -0
- package/lib/cli/spec.js +496 -0
- package/lib/cli/spec.js.map +1 -0
- package/lib/cli/time-text.js +79 -0
- package/lib/cli/time-text.js.map +1 -0
- package/lib/cli/trial.js +57 -0
- package/lib/cli/trial.js.map +1 -0
- package/lib/client/SettingsCard.js +14 -32
- package/lib/client/SettingsCard.js.map +1 -1
- package/lib/client/agent-mark.js +27 -0
- package/lib/client/agent-mark.js.map +1 -0
- package/lib/client/card-frame.js +118 -0
- package/lib/client/card-frame.js.map +1 -0
- package/lib/client/cli-form.js +257 -0
- package/lib/client/cli-form.js.map +1 -0
- package/lib/client/field-docs.js +130 -0
- package/lib/client/field-docs.js.map +1 -0
- package/lib/client/field-keys.js +81 -0
- package/lib/client/field-keys.js.map +1 -0
- package/lib/client/field-rows.js +71 -0
- package/lib/client/field-rows.js.map +1 -0
- package/lib/client/fill.js +3 -0
- package/lib/client/fill.js.map +1 -0
- package/lib/client/form-specs.js +15 -1
- package/lib/client/form-specs.js.map +1 -1
- package/lib/client/form.js +296 -27
- package/lib/client/form.js.map +1 -1
- package/lib/client/group-advanced.js +23 -0
- package/lib/client/group-advanced.js.map +1 -0
- package/lib/client/group-agent.js +28 -0
- package/lib/client/group-agent.js.map +1 -0
- package/lib/client/group-cli.js +136 -0
- package/lib/client/group-cli.js.map +1 -0
- package/lib/client/group-common.js +29 -0
- package/lib/client/group-common.js.map +1 -0
- package/lib/client/group-judge.js +67 -0
- package/lib/client/group-judge.js.map +1 -0
- package/lib/client/group-order.js +201 -0
- package/lib/client/group-order.js.map +1 -0
- package/lib/client/group-runtime.js +33 -0
- package/lib/client/group-runtime.js.map +1 -0
- package/lib/client/group-sources.js +83 -0
- package/lib/client/group-sources.js.map +1 -0
- package/lib/client/groups-basic.js +36 -0
- package/lib/client/groups-basic.js.map +1 -0
- package/lib/client/index.js.map +1 -1
- package/lib/client/json-list.js +50 -0
- package/lib/client/json-list.js.map +1 -0
- package/lib/client/locales.js +666 -215
- package/lib/client/locales.js.map +1 -1
- package/lib/client/order.js +192 -0
- package/lib/client/order.js.map +1 -0
- package/lib/client/overlay-ops.js +46 -0
- package/lib/client/overlay-ops.js.map +1 -0
- package/lib/client/sources-table.js +1 -0
- package/lib/client/sources-table.js.map +1 -1
- package/lib/client/styles.js +74 -47
- package/lib/client/styles.js.map +1 -1
- package/lib/client/text-view.js +98 -0
- package/lib/client/text-view.js.map +1 -0
- package/lib/client/ui-kit.js +120 -0
- package/lib/client/ui-kit.js.map +1 -0
- package/lib/client/validators.js +22 -0
- package/lib/client/validators.js.map +1 -1
- package/lib/client.js +9151 -1987
- package/lib/client.js.map +1 -1
- package/lib/config-fillers.js +53 -0
- package/lib/config-fillers.js.map +1 -0
- package/lib/config-groups.js +49 -0
- package/lib/config-groups.js.map +1 -0
- package/lib/config.js +87 -107
- package/lib/config.js.map +1 -1
- package/lib/default-chain.js +66 -0
- package/lib/default-chain.js.map +1 -0
- package/lib/deps.js +109 -102
- package/lib/deps.js.map +1 -1
- package/lib/engine-error.js +19 -0
- package/lib/engine-error.js.map +1 -0
- package/lib/engines.js +32 -115
- package/lib/engines.js.map +1 -1
- package/lib/fetch.js +23 -4
- package/lib/fetch.js.map +1 -1
- package/lib/index.js +30 -5
- package/lib/index.js.map +1 -1
- package/lib/overlay-types.js +88 -0
- package/lib/overlay-types.js.map +1 -0
- package/lib/overlay.js +683 -0
- package/lib/overlay.js.map +1 -0
- package/lib/pipeline/candidates.js +27 -1
- package/lib/pipeline/candidates.js.map +1 -1
- package/lib/pipeline/compile.js +63 -0
- package/lib/pipeline/compile.js.map +1 -1
- package/lib/pipeline/confidence.js +64 -0
- package/lib/pipeline/confidence.js.map +1 -0
- package/lib/pipeline/fusion.js +50 -3
- package/lib/pipeline/fusion.js.map +1 -1
- package/lib/pipeline/plan.js +2 -2
- package/lib/pipeline/plan.js.map +1 -1
- package/lib/pipeline/render.js +20 -2
- package/lib/pipeline/render.js.map +1 -1
- package/lib/pipeline/run.js +21 -7
- package/lib/pipeline/run.js.map +1 -1
- package/lib/pipeline/sources-spec.js +19 -3
- package/lib/pipeline/sources-spec.js.map +1 -1
- package/lib/providers/builtin.js +13 -14
- package/lib/providers/builtin.js.map +1 -1
- package/lib/providers/deepseek.js +348 -0
- package/lib/providers/deepseek.js.map +1 -0
- package/lib/providers/http.js.map +1 -1
- package/lib/providers/keyed-meta.js +7 -0
- package/lib/providers/keyed-meta.js.map +1 -1
- package/lib/providers/platforms.js +118 -58
- package/lib/providers/platforms.js.map +1 -1
- package/lib/providers/registry.js.map +1 -1
- package/lib/restart.js +47 -0
- package/lib/restart.js.map +1 -0
- package/lib/router.js +203 -27
- package/lib/router.js.map +1 -1
- package/lib/rpc-types.js +15 -0
- package/lib/rpc-types.js.map +1 -0
- package/lib/rpc.js +85 -0
- package/lib/rpc.js.map +1 -0
- package/lib/tools.js +10 -4
- package/lib/tools.js.map +1 -1
- package/lib/types/actions/approval.d.ts +11 -0
- package/lib/types/actions/config.d.ts +54 -0
- package/lib/types/actions/format.d.ts +9 -2
- package/lib/types/actions/run.d.ts +1 -0
- package/lib/types/actions/schema.d.ts +7 -1
- package/lib/types/actions/sources.d.ts +29 -3
- package/lib/types/actions/types.d.ts +28 -2
- package/lib/types/browser-access.d.ts +17 -0
- package/lib/types/catalog/recommend.d.ts +4 -0
- package/lib/types/catalog/schema.d.ts +2 -0
- package/lib/types/cli/builtin-specs.d.ts +38 -0
- package/lib/types/cli/chain.d.ts +83 -0
- package/lib/types/cli/chains-spec.d.ts +48 -0
- package/lib/types/cli/engine.d.ts +50 -0
- package/lib/types/cli/opencli-sites.d.ts +24 -0
- package/lib/types/cli/opencli.d.ts +77 -0
- package/lib/types/cli/probe.d.ts +53 -0
- package/lib/types/cli/runner.d.ts +126 -0
- package/lib/types/cli/spec.d.ts +269 -0
- package/lib/types/cli/time-text.d.ts +12 -0
- package/lib/types/cli/trial.d.ts +19 -0
- package/lib/types/client/SettingsCard.d.ts +17 -1
- package/lib/types/client/agent-mark.d.ts +22 -0
- package/lib/types/client/card-frame.d.ts +35 -0
- package/lib/types/client/cli-form.d.ts +97 -0
- package/lib/types/client/field-docs.d.ts +15 -0
- package/lib/types/client/field-keys.d.ts +41 -0
- package/lib/types/client/field-rows.d.ts +70 -0
- package/lib/types/client/fill.d.ts +2 -0
- package/lib/types/client/form-specs.d.ts +12 -3
- package/lib/types/client/form.d.ts +79 -1
- package/lib/types/client/group-advanced.d.ts +9 -0
- package/lib/types/client/group-agent.d.ts +20 -0
- package/lib/types/client/group-cli.d.ts +52 -0
- package/lib/types/client/group-common.d.ts +12 -0
- package/lib/types/client/group-judge.d.ts +17 -0
- package/lib/types/client/group-order.d.ts +26 -0
- package/lib/types/client/group-runtime.d.ts +15 -0
- package/lib/types/client/group-sources.d.ts +46 -0
- package/lib/types/client/groups-basic.d.ts +18 -0
- package/lib/types/client/index.d.ts +8 -0
- package/lib/types/client/json-list.d.ts +21 -0
- package/lib/types/client/locales.d.ts +1079 -196
- package/lib/types/client/order.d.ts +102 -0
- package/lib/types/client/overlay-ops.d.ts +37 -0
- package/lib/types/client/styles.d.ts +56 -41
- package/lib/types/client/text-view.d.ts +22 -0
- package/lib/types/client/ui-kit.d.ts +200 -0
- package/lib/types/client/validators.d.ts +6 -0
- package/lib/types/config-fillers.d.ts +9 -0
- package/lib/types/config-groups.d.ts +23 -0
- package/lib/types/config.d.ts +265 -216
- package/lib/types/default-chain.d.ts +63 -0
- package/lib/types/deps.d.ts +25 -23
- package/lib/types/engine-error.d.ts +12 -0
- package/lib/types/engines.d.ts +45 -10
- package/lib/types/fetch.d.ts +12 -3
- package/lib/types/index.d.ts +164 -146
- package/lib/types/overlay-types.d.ts +98 -0
- package/lib/types/overlay.d.ts +141 -0
- package/lib/types/pipeline/candidates.d.ts +19 -0
- package/lib/types/pipeline/compile.d.ts +11 -0
- package/lib/types/pipeline/confidence.d.ts +35 -0
- package/lib/types/pipeline/fusion.d.ts +23 -1
- package/lib/types/pipeline/render.d.ts +16 -0
- package/lib/types/pipeline/run.d.ts +3 -1
- package/lib/types/pipeline/sources-spec.d.ts +5 -2
- package/lib/types/pipeline/types.d.ts +37 -0
- package/lib/types/providers/deepseek.d.ts +130 -0
- package/lib/types/providers/http.d.ts +2 -1
- package/lib/types/providers/keyed-meta.d.ts +5 -0
- package/lib/types/providers/platforms.d.ts +15 -3
- package/lib/types/providers/registry.d.ts +10 -0
- package/lib/types/restart.d.ts +52 -0
- package/lib/types/router.d.ts +69 -9
- package/lib/types/rpc-types.d.ts +79 -0
- package/lib/types/rpc.d.ts +41 -0
- package/lib/types/tools.d.ts +6 -0
- package/lib/types/util.d.ts +16 -1
- package/lib/util.js +17 -4
- package/lib/util.js.map +1 -1
- package/package.json +51 -43
- package/scripts/check-client-bundle.mjs +1 -1
- package/scripts/cli-login-check.mjs +214 -0
- package/lib/client/RubricEditor.js +0 -47
- package/lib/client/RubricEditor.js.map +0 -1
- package/lib/client/fields.js +0 -31
- package/lib/client/fields.js.map +0 -1
- package/lib/types/client/RubricEditor.d.ts +0 -6
- package/lib/types/client/fields.d.ts +0 -65
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The form side of the custom CLI editor: a `cliAdapters` entry (the JSON spec) as the fields of the edit dialog and back. Two
|
|
3
|
+
* views of one object: the form writes the keys it has controls for onto a copy of the spec and leaves every other key as it
|
|
4
|
+
* was (searches, read, env, login, errorCodes, a field mapping that is not a plain path), and the JSON box edits the whole spec.
|
|
5
|
+
* Validation is `validateCliAdapterSpec`, the function the server registers specs with; its messages are sorted to the field they
|
|
6
|
+
* are about. `allowedSubcommands` is derived from the command words of the argv templates, never typed.
|
|
7
|
+
* Pure: no Host, no DOM.
|
|
8
|
+
* @module web-search-pro/client/cli-form
|
|
9
|
+
*/
|
|
10
|
+
import { commandWords, DEFAULT_CUSTOM_CONFIDENCE, OUTPUT_FORMATS, validateCliAdapterSpec, WHOLE_OUTPUT_DEFAULT_CHARS } from "../cli/spec.js";
|
|
11
|
+
const isRecord = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
12
|
+
const strings = (value) => (Array.isArray(value) ? value.filter((entry) => typeof entry === 'string') : []);
|
|
13
|
+
/** The result fields the form maps, in display order; each takes a dotted path into one item of the tool's output. */
|
|
14
|
+
export const FIELD_KEYS = ['url', 'title', 'snippet', 'publishedAt'];
|
|
15
|
+
/** How a plain text tool's lines become items (`whole` is a switch of its own). */
|
|
16
|
+
export const LINE_MODES = ['url-lines', 'tsv'];
|
|
17
|
+
/** The spec a new entry starts from: a JSON-printing tool mapped url / title / snippet. The form fills the command in. */
|
|
18
|
+
export function newSpec() {
|
|
19
|
+
return {
|
|
20
|
+
bins: [''], packageNote: '', platforms: [], engine: true,
|
|
21
|
+
probe: { versionArgs: ['--version'], helpArgs: ['--help'], mustContain: [] },
|
|
22
|
+
allowedSubcommands: [],
|
|
23
|
+
search: { argv: ['{query}'], output: { format: 'json', fields: { url: 'url', title: 'title', snippet: 'snippet' } } },
|
|
24
|
+
env: {}, needsLogin: false, timeoutMs: 15_000, maxOutputBytes: 1_048_576,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/** The example of the dialog: `echo`, whose whole output is the result (no field mapping), a way to see the pieces work without a real tool. */
|
|
28
|
+
export function echoSpec() {
|
|
29
|
+
return {
|
|
30
|
+
bins: ['echo'], packageNote: 'echo (part of the system)', platforms: [], engine: true, confidence: 0.5,
|
|
31
|
+
probe: { versionArgs: ['--version'], helpArgs: ['--help'], mustContain: [] },
|
|
32
|
+
allowedSubcommands: [],
|
|
33
|
+
search: { argv: ['{query}'], output: { format: 'text', lines: { mode: 'whole' } } },
|
|
34
|
+
env: {}, needsLogin: false, timeoutMs: 5_000, maxOutputBytes: 65_536,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const pathText = (value) => (typeof value === 'string' ? value : '');
|
|
38
|
+
/** The form fields of a spec (plain or not): everything the dialog shows, as text. */
|
|
39
|
+
export function specToForm(id, raw) {
|
|
40
|
+
const spec = isRecord(raw) ? raw : {};
|
|
41
|
+
const search = isRecord(spec.search) ? spec.search : {};
|
|
42
|
+
const output = isRecord(search.output) ? search.output : {};
|
|
43
|
+
const lines = isRecord(output.lines) ? output.lines : undefined;
|
|
44
|
+
const fields = isRecord(output.fields) ? output.fields : {};
|
|
45
|
+
const probe = isRecord(spec.probe) ? spec.probe : {};
|
|
46
|
+
const complex = FIELD_KEYS.filter(key => fields[key] !== undefined && typeof fields[key] !== 'string');
|
|
47
|
+
const numberText = (value) => (typeof value === 'number' || typeof value === 'string' ? String(value) : '');
|
|
48
|
+
return {
|
|
49
|
+
id,
|
|
50
|
+
bin: strings(spec.bins)[0] ?? '',
|
|
51
|
+
argv: strings(search.argv),
|
|
52
|
+
format: OUTPUT_FORMATS.includes(output.format) ? output.format : 'json',
|
|
53
|
+
whole: lines?.mode === 'whole',
|
|
54
|
+
wholeMax: lines?.mode === 'whole' && lines.maxChars !== undefined ? numberText(lines.maxChars) : '',
|
|
55
|
+
itemsPath: pathText(output.itemsPath),
|
|
56
|
+
linesMode: lines?.mode === 'tsv' ? 'tsv' : 'url-lines',
|
|
57
|
+
columns: lines?.mode === 'tsv' ? strings(lines.columns).join(', ') : '',
|
|
58
|
+
fields: Object.fromEntries(FIELD_KEYS.map(key => [key, pathText(fields[key])])),
|
|
59
|
+
complex,
|
|
60
|
+
timeoutMs: numberText(spec.timeoutMs),
|
|
61
|
+
maxOutputBytes: numberText(spec.maxOutputBytes),
|
|
62
|
+
engine: spec.engine === true,
|
|
63
|
+
platforms: strings(spec.platforms),
|
|
64
|
+
confidence: spec.confidence === undefined ? '' : numberText(spec.confidence),
|
|
65
|
+
packageNote: typeof spec.packageNote === 'string' ? spec.packageNote : '',
|
|
66
|
+
helpArgs: strings(probe.helpArgs).join(' '),
|
|
67
|
+
mustContain: strings(probe.mustContain),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/** A number typed in a box: the number when it is one, else the text itself, so the validation says what is wrong with it. */
|
|
71
|
+
const numberOrText = (text) => {
|
|
72
|
+
const trimmed = text.trim();
|
|
73
|
+
return trimmed !== '' && Number.isFinite(Number(trimmed)) ? Number(trimmed) : trimmed;
|
|
74
|
+
};
|
|
75
|
+
/** The command words the argv templates of a spec use, in order, without repeats: what `allowedSubcommands` must list. */
|
|
76
|
+
export function derivedSubcommands(spec) {
|
|
77
|
+
const argvs = [];
|
|
78
|
+
const probe = isRecord(spec.probe) ? spec.probe : {};
|
|
79
|
+
argvs.push(strings(probe.versionArgs), strings(probe.helpArgs));
|
|
80
|
+
const searchArgv = (value) => { if (isRecord(value))
|
|
81
|
+
argvs.push(strings(value.argv)); };
|
|
82
|
+
searchArgv(spec.search);
|
|
83
|
+
searchArgv(spec.read);
|
|
84
|
+
if (isRecord(spec.searches))
|
|
85
|
+
for (const entry of Object.values(spec.searches))
|
|
86
|
+
searchArgv(entry);
|
|
87
|
+
return [...new Set(argvs.flatMap(argv => commandWords(argv)))];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* The spec the form describes, built on `base` (the entry as it was: every key the form has no control for is kept). Nothing is
|
|
91
|
+
* validated here; a value that is not what its box wants is written as typed so `validateCliAdapterSpec` names it.
|
|
92
|
+
*/
|
|
93
|
+
export function formToSpec(form, base = {}) {
|
|
94
|
+
const spec = structuredClone(base);
|
|
95
|
+
delete spec.id;
|
|
96
|
+
const bins = strings(spec.bins);
|
|
97
|
+
spec.bins = [form.bin.trim(), ...bins.slice(1)];
|
|
98
|
+
spec.packageNote = form.packageNote.trim() || (form.bin.trim() ? form.bin.trim() + ' (installed by you)' : '');
|
|
99
|
+
spec.platforms = [...form.platforms];
|
|
100
|
+
if (form.engine)
|
|
101
|
+
spec.engine = true;
|
|
102
|
+
else
|
|
103
|
+
delete spec.engine;
|
|
104
|
+
if (form.confidence.trim() === '')
|
|
105
|
+
delete spec.confidence;
|
|
106
|
+
else
|
|
107
|
+
spec.confidence = numberOrText(form.confidence);
|
|
108
|
+
spec.needsLogin = typeof spec.needsLogin === 'boolean' ? spec.needsLogin : false;
|
|
109
|
+
if (!isRecord(spec.env))
|
|
110
|
+
spec.env = {};
|
|
111
|
+
if (form.timeoutMs.trim() === '')
|
|
112
|
+
delete spec.timeoutMs;
|
|
113
|
+
else
|
|
114
|
+
spec.timeoutMs = numberOrText(form.timeoutMs);
|
|
115
|
+
if (form.maxOutputBytes.trim() === '')
|
|
116
|
+
delete spec.maxOutputBytes;
|
|
117
|
+
else
|
|
118
|
+
spec.maxOutputBytes = numberOrText(form.maxOutputBytes);
|
|
119
|
+
const probe = isRecord(spec.probe) ? { ...spec.probe } : {};
|
|
120
|
+
probe.versionArgs = Array.isArray(probe.versionArgs) ? probe.versionArgs : ['--version'];
|
|
121
|
+
probe.helpArgs = form.helpArgs.trim() === '' ? ['--help'] : form.helpArgs.trim().split(/\s+/);
|
|
122
|
+
probe.mustContain = [...form.mustContain];
|
|
123
|
+
spec.probe = probe;
|
|
124
|
+
const search = isRecord(spec.search) ? { ...spec.search } : {};
|
|
125
|
+
search.argv = [...form.argv];
|
|
126
|
+
const previous = isRecord(search.output) ? search.output : {};
|
|
127
|
+
const output = { ...previous, format: form.format };
|
|
128
|
+
delete output.lines;
|
|
129
|
+
const fields = isRecord(previous.fields) ? { ...previous.fields } : {};
|
|
130
|
+
if (form.format === 'text') {
|
|
131
|
+
if (form.whole) {
|
|
132
|
+
output.lines = form.wholeMax.trim() === '' ? { mode: 'whole' } : { mode: 'whole', maxChars: numberOrText(form.wholeMax) };
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
output.lines = form.linesMode === 'tsv' ? { mode: 'tsv', columns: form.columns.split(',').map(column => column.trim()).filter(Boolean) } : { mode: 'url-lines' };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// The result array path belongs to json / yaml only (ndjson has one item per line).
|
|
139
|
+
if (form.format === 'json' || form.format === 'yaml') {
|
|
140
|
+
if (form.itemsPath.trim() !== '')
|
|
141
|
+
output.itemsPath = form.itemsPath.trim();
|
|
142
|
+
else
|
|
143
|
+
delete output.itemsPath;
|
|
144
|
+
}
|
|
145
|
+
else
|
|
146
|
+
delete output.itemsPath;
|
|
147
|
+
if (form.format === 'text' && form.whole) {
|
|
148
|
+
// A whole-output result maps nothing: the field mapping goes away (the JSON view of an old mapping is not kept as dead weight).
|
|
149
|
+
delete output.fields;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
for (const key of FIELD_KEYS) {
|
|
153
|
+
if (form.complex.includes(key))
|
|
154
|
+
continue;
|
|
155
|
+
const text = form.fields[key].trim();
|
|
156
|
+
if (text === '')
|
|
157
|
+
delete fields[key];
|
|
158
|
+
else
|
|
159
|
+
fields[key] = text;
|
|
160
|
+
}
|
|
161
|
+
output.fields = fields;
|
|
162
|
+
}
|
|
163
|
+
search.output = output;
|
|
164
|
+
spec.search = search;
|
|
165
|
+
spec.allowedSubcommands = derivedSubcommands(spec);
|
|
166
|
+
return spec;
|
|
167
|
+
}
|
|
168
|
+
/** Sort the validator's messages (`cliAdapters.<id>.<path>: ...`) to the dialog field they are about. */
|
|
169
|
+
export function errorsByField(id, errors) {
|
|
170
|
+
const out = {};
|
|
171
|
+
const add = (field, message) => { (out[field] ??= []).push(message); };
|
|
172
|
+
const prefix = 'cliAdapters.' + id;
|
|
173
|
+
for (const error of errors) {
|
|
174
|
+
// `cliAdapters.<id>.search.argv: ...` -> `search.argv: ...`; `cliAdapters.<id>: needsLogin ...` -> `needsLogin ...`
|
|
175
|
+
const message = error.startsWith(prefix) ? error.slice(prefix.length).replace(/^[.:]\s*/, '') : error;
|
|
176
|
+
const rule = [
|
|
177
|
+
[/^id\b/, 'id'], [/^bins\b/, 'bin'], [/^packageNote\b/, 'packageNote'], [/^platforms\b/, 'platforms'], [/^engine\b/, 'engine'], [/^confidence\b/, 'confidence'],
|
|
178
|
+
[/^timeoutMs\b/, 'timeoutMs'], [/^maxOutputBytes\b/, 'maxOutputBytes'], [/^probe\b/, 'probe'],
|
|
179
|
+
[/^search\.argv\b/, 'argv'], [/^search\.output\.format\b/, 'format'], [/^search\.output\.itemsPath\b/, 'itemsPath'], [/^search\.output\.lines\b/, 'lines'],
|
|
180
|
+
[/^search\.output\.fields\.url\b/, 'url'], [/^search\.output\.fields\.title\b/, 'title'], [/^search\.output\.fields\.snippet\b/, 'snippet'], [/^search\.output\.fields\.publishedAt\b/, 'publishedAt'], [/^search\.output\.fields\b/, 'fields'],
|
|
181
|
+
];
|
|
182
|
+
const hit = rule.find(([pattern]) => pattern.test(message));
|
|
183
|
+
add(hit ? hit[1] : 'general', message);
|
|
184
|
+
}
|
|
185
|
+
return out;
|
|
186
|
+
}
|
|
187
|
+
/** Build the spec of a form and validate it the way the server does; `taken` are the ids of the other entries (a new id may not repeat one). */
|
|
188
|
+
export function checkForm(form, base, taken = []) {
|
|
189
|
+
const spec = formToSpec(form, base);
|
|
190
|
+
return checkSpec(form.id, spec, taken);
|
|
191
|
+
}
|
|
192
|
+
/** Validate a spec (the JSON view): the server's function, plus the one rule only the editor has (an id is not used twice). */
|
|
193
|
+
export function checkSpec(id, spec, taken = []) {
|
|
194
|
+
const result = validateCliAdapterSpec({ ...spec, id }, 'user');
|
|
195
|
+
const errors = [...result.errors];
|
|
196
|
+
if (taken.includes(id))
|
|
197
|
+
errors.push('cliAdapters.' + id + '.id: "' + id + '" is already used by another entry');
|
|
198
|
+
return { spec, errors, byField: errorsByField(id, errors), ok: errors.length === 0 };
|
|
199
|
+
}
|
|
200
|
+
/** The confidence the entry has: its own, else the default. */
|
|
201
|
+
export const confidenceOfForm = (form) => {
|
|
202
|
+
const n = Number(form.confidence);
|
|
203
|
+
return form.confidence.trim() !== '' && Number.isFinite(n) ? n : DEFAULT_CUSTOM_CONFIDENCE;
|
|
204
|
+
};
|
|
205
|
+
export { WHOLE_OUTPUT_DEFAULT_CHARS };
|
|
206
|
+
// ── the JSON view ──────────────────────────────────────────────────────────
|
|
207
|
+
/** The JSON text of a spec as the dialog's raw box prints it. */
|
|
208
|
+
export const specText = (spec) => JSON.stringify(spec, null, 2);
|
|
209
|
+
/** The spec a raw JSON text holds, or the reason it is not one. */
|
|
210
|
+
export function parseSpecText(text) {
|
|
211
|
+
try {
|
|
212
|
+
const value = JSON.parse(text);
|
|
213
|
+
return isRecord(value) ? { spec: value } : { error: 'the spec must be a JSON object' };
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
return { error: error instanceof Error ? error.message : String(error) };
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// ── the entries inside the `cliAdapters` text ──────────────────────────────
|
|
220
|
+
/** The `cliAdapters` object of the staged text (empty text = no entries); undefined when it is not an object. */
|
|
221
|
+
export function adaptersOf(text) {
|
|
222
|
+
if (text.trim() === '')
|
|
223
|
+
return {};
|
|
224
|
+
try {
|
|
225
|
+
const value = JSON.parse(text);
|
|
226
|
+
return isRecord(value) ? value : undefined;
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
return undefined;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* The `cliAdapters` text with entry `id` set to `spec` (a new key goes last), or removed when `spec` is undefined. The other
|
|
234
|
+
* entries are kept as they were. The object with no entries comes back as the empty text, which the form model stores as "not set".
|
|
235
|
+
* Undefined when the current text is not an object (the raw JSON box has to be fixed first).
|
|
236
|
+
*/
|
|
237
|
+
export function withAdapter(text, id, spec) {
|
|
238
|
+
const all = adaptersOf(text);
|
|
239
|
+
if (!all)
|
|
240
|
+
return undefined;
|
|
241
|
+
const next = { ...all };
|
|
242
|
+
if (spec === undefined)
|
|
243
|
+
delete next[id];
|
|
244
|
+
else
|
|
245
|
+
next[id] = spec;
|
|
246
|
+
return Object.keys(next).length === 0 ? '' : JSON.stringify(next, null, 2);
|
|
247
|
+
}
|
|
248
|
+
/** A free id for a copy or a new entry: `base`, `base-2`, `base-3`, ... */
|
|
249
|
+
export function freeId(base, taken) {
|
|
250
|
+
const stem = base.toLowerCase().replace(/[^a-z0-9._-]+/g, '-').replace(/^[^a-z0-9]+|-+$/g, '').slice(0, 36) || 'mycli';
|
|
251
|
+
if (!taken.includes(stem))
|
|
252
|
+
return stem;
|
|
253
|
+
for (let n = 2;; n++)
|
|
254
|
+
if (!taken.includes(stem + '-' + n))
|
|
255
|
+
return stem + '-' + n;
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=cli-form.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-form.js","sourceRoot":"","sources":["../../src/client/cli-form.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The comment printed in front of every key of the text view ("Advanced: text mode"), in the language of the card: what the
|
|
3
|
+
* setting is for, its allowed values or range, its default, and the risk when there is one. Comment lines start with `#`, so
|
|
4
|
+
* the text stays valid YAML and a round trip never reads a comment as data. Pure (it imports only config-groups.ts): the text view and the
|
|
5
|
+
* tests read it, and the client bundle includes it. Nothing here names a secret value: keys are only ever referenced by name.
|
|
6
|
+
* @module web-search-pro/client/field-docs
|
|
7
|
+
*/
|
|
8
|
+
import { CONFIG_GROUP_TITLES } from "../config-groups.js";
|
|
9
|
+
/** Display name of a source in the docs (proper names, the same in both languages). */
|
|
10
|
+
const SOURCE_NAME = {
|
|
11
|
+
deepseek: 'DeepSeek Search / Fetch', bocha: 'Bocha', tavily: 'Tavily', brave: 'Brave Search', linkup: 'Linkup', serper: 'Serper',
|
|
12
|
+
metaso: 'Metaso', zhipu: 'Zhipu', 'baidu-qianfan': 'Baidu Qianfan',
|
|
13
|
+
};
|
|
14
|
+
const DOCS = {
|
|
15
|
+
engines: { en: 'Default engine chain of a plain search, tried in order: ids such as ddg, bing, exa, seam, jina. At least one. Default: ddg, bing, exa, seam, jina. While this is the default list a ready DeepSeek key puts deepseek first; a list you write is used as written.', zh: '普通搜索的默认引擎链,按顺序尝试:id 如 ddg、bing、exa、seam、jina,至少一个。默认 ddg, bing, exa, seam, jina。保持默认列表时,DeepSeek Key 就绪会把 deepseek 排最前;你自己写的列表按所写顺序。' },
|
|
16
|
+
parallelEngines: { en: 'true = query every default engine at once and merge by rank fusion | false = try them one after another. Default: false', zh: 'true = 同时查询全部默认引擎并按排名融合 | false = 依次回退。默认 false' },
|
|
17
|
+
searchMaxResults: { en: 'Results per search when the call gives no count, 1-20. Default: 8', zh: '调用未指定 count 时的结果数,1–20。默认 8' },
|
|
18
|
+
timeoutMs: { en: 'Time budget of one enhanced search in milliseconds, at least 1000. Default: 30000', zh: '单次增强搜索的时间预算(毫秒),至少 1000。默认 30000' },
|
|
19
|
+
fetchDefaultChars: { en: 'Characters one read.fetch returns, 1000-500000; longer pages continue with offset. Default: 20000', zh: 'read.fetch 单次返回的字数,1000–500000;更长的页面用 offset 续读。默认 20000' },
|
|
20
|
+
exaContentsPerUrlChars: { en: 'read.contents output per URL in characters, at least 500. Default: 8000', zh: 'read.contents 每个 URL 的输出字数,至少 500。默认 8000' },
|
|
21
|
+
exaContentsTotalChars: { en: 'read.contents output of one call over all URLs, at least 1000. Default: 30000', zh: 'read.contents 一次调用所有 URL 的输出字数总上限,至少 1000。默认 30000' },
|
|
22
|
+
exaApiKeyEnv: { en: 'Name of the DSH credential or environment variable holding the Exa key (the key itself is never stored here). Default: EXA_API_KEY', zh: '保存 Exa Key 的 DSH 凭据或环境变量名(Key 本身从不写在这里)。默认 EXA_API_KEY' },
|
|
23
|
+
jinaApiKeyEnv: { en: 'Name of the credential / environment variable holding the Jina key. Default: JINA_API_KEY', zh: '保存 Jina Key 的凭据 / 环境变量名。默认 JINA_API_KEY' },
|
|
24
|
+
githubTokenEnv: { en: 'Name of the credential / environment variable holding the GitHub token (raises the rate limit). Default: GITHUB_TOKEN', zh: '保存 GitHub Token 的凭据 / 环境变量名(只用来提高限额)。默认 GITHUB_TOKEN' },
|
|
25
|
+
twitterAuthTokenEnv: { en: 'Name of the credential / environment variable holding the twitter-cli auth_token cookie. Handed to the command only through its environment. Default: TWITTER_AUTH_TOKEN', zh: '保存 twitter-cli 的 auth_token 的凭据 / 环境变量名;只通过子进程环境变量交给命令。默认 TWITTER_AUTH_TOKEN' },
|
|
26
|
+
twitterCt0Env: { en: 'Name of the credential / environment variable holding the twitter-cli ct0 cookie. Default: TWITTER_CT0', zh: '保存 twitter-cli 的 ct0 的凭据 / 环境变量名。默认 TWITTER_CT0' },
|
|
27
|
+
bochaApiKeyEnv: { en: 'Name of the credential / environment variable holding the Bocha key; BOCHA_JEV_API_KEY is the fallback. Default: BOCHA_SEARCH_API_KEY', zh: '保存博查 Key 的凭据 / 环境变量名,找不到时回退 BOCHA_JEV_API_KEY。默认 BOCHA_SEARCH_API_KEY' },
|
|
28
|
+
bochaBaseUrl: { en: 'Bocha endpoint base (an http(s) URL; /v1/web-search is appended). Default: https://api.bocha.cn', zh: '博查接口地址(http(s) URL,/v1/web-search 会自动追加)。默认 https://api.bocha.cn' },
|
|
29
|
+
bochaSummary: { en: 'true = ask Bocha for its longer page summary (better for evidence scoring) | false. Default: true', zh: 'true = 请求博查较长的页面摘要(更利于证据评分)| false。默认 true' },
|
|
30
|
+
deepseekFetch: { en: 'true = read.fetch may use the DeepSeek Fetch API (billed: $0.75 per 1,000 successful requests) after Jina and a direct request found no content, and mode=deepseek works | false. Risk: spends money. Default: false', zh: 'true = read.fetch 在 Jina 与直连都没拿到正文时可用 DeepSeek Fetch API(按请求计费:每 1000 次成功请求 $0.75),mode=deepseek 可用 | false。风险:会花钱。默认 false' },
|
|
31
|
+
searxngUrl: { en: 'Your own SearXNG instance (JSON format enabled), http(s) URL; the searxng source exists only when this is set. Default: empty', zh: '你自己的 SearXNG 实例(需开启 JSON 格式),http(s) URL;设置后才有 searxng 来源。默认 空' },
|
|
32
|
+
openalexMailto: { en: 'Contact e-mail put in the User-Agent of OpenAlex requests (etiquette, optional). Default: empty', zh: '写进 OpenAlex 请求 User-Agent 的联系邮箱(礼貌性,可留空)。默认 空' },
|
|
33
|
+
enableCliBackends: { en: 'true = allow local CLI backends (bili, yt-dlp, OpenCLI, Agent Reach, ...) | false. Default: true', zh: 'true = 允许本机 CLI 后端(bili、yt-dlp、OpenCLI、Agent Reach 等)| false。默认 true' },
|
|
34
|
+
opencliEnabled: { en: 'true = allow site adapters through the connected Chrome Browser Bridge | false. Default: true', zh: 'true = 允许经 Chrome Browser Bridge 使用站点适配器 | false。默认 true' },
|
|
35
|
+
agentReachEnabled: { en: 'true = allow Agent Reach compatible backends | false. Default: true', zh: 'true = 允许兼容 Agent Reach 的后端 | false。默认 true' },
|
|
36
|
+
providerId: { en: 'Id the plugin registers as the ctx.web provider; referenced by searchProvider / fetchProvider or DSH_WEB_SEARCH_PROVIDER. Default: web-search-pro', zh: '本插件注册为 ctx.web provider 的 id;被 searchProvider / fetchProvider 或 DSH_WEB_SEARCH_PROVIDER 引用。默认 web-search-pro' },
|
|
37
|
+
registerProvider: { en: 'true = register as the ctx.web provider so the built-in web_search / web_fetch can route through this plugin (takes effect at start-up; the host also needs the profile patch shown in the card) | false. Default: false', zh: 'true = 注册为 ctx.web provider,让内置 web_search / web_fetch 可经本插件(启动时生效;宿主还需要卡片里给出的 profile patch)| false。默认 false' },
|
|
38
|
+
toolSurface: { en: 'Tools the model sees: indexed = web_index + web_call only (default, least resident text) | flat = one tool per action, for comparison and debugging. Read at start-up. Default: indexed', zh: '模型看到的工具形态:indexed = 只有 web_index + web_call(默认,常驻文本最少)| flat = 每个动作一个工具,仅用于对比与调试。启动时读取。默认 indexed' },
|
|
39
|
+
playwright: { en: 'JSON object {"enabled": true|false, "snapshotDir": "<absolute path>"}: the browser-render fallback of read.fetch and the screenshot directory. Default: {"enabled": true}', zh: 'JSON 对象 {"enabled": true|false, "snapshotDir": "<绝对路径>"}:read.fetch 的浏览器渲染回退与截图目录。默认 {"enabled": true}' },
|
|
40
|
+
ttlSeconds: { en: 'Seconds a cached search or page stays fresh; 0 = always stale. Default: 3600', zh: '缓存的搜索与页面保持新鲜的秒数;0 = 总是过期。默认 3600' },
|
|
41
|
+
memoryCacheEntries: { en: 'Capacity of the in-process LRU cache, at least 1. Default: 128', zh: '进程内 LRU 缓存容量,至少 1。默认 128' },
|
|
42
|
+
rrfConstant: { en: 'Smoothing constant k of the rank fusion 1/(k + rank), at least 1. Default: 60', zh: '排名融合 1/(k + 名次) 的平滑常数 k,至少 1。默认 60' },
|
|
43
|
+
freshnessBoost: { en: 'Bonus for recent results as a fraction of one rank step, 0-1; each URL gets it once. Default: 0.2', zh: '近期结果的加分,占一个排名名次的比例,0–1;每个 URL 只加一次。默认 0.2' },
|
|
44
|
+
freshnessDays: { en: 'Days over which the freshness bonus decays to zero, at least 1. Default: 30', zh: '新鲜度加分衰减到 0 的天数,至少 1。默认 30' },
|
|
45
|
+
authorityBoost: { en: 'Bonus for authority hosts as a fraction of one rank step, 0-1. Default: 0.25', zh: '权威域名的加分,占一个排名名次的比例,0–1。默认 0.25' },
|
|
46
|
+
authorityDomains: { en: 'Extra authority domains, comma separated, no scheme or path (github.com, wikipedia.org, .edu, .gov, .org already count). Default: empty', zh: '额外的权威域名,逗号分隔,不带协议和路径(github.com、wikipedia.org、.edu、.gov、.org 已内置)。默认 空' },
|
|
47
|
+
dbPath: { en: 'SQLite file of the cache and history; empty = the plugin default path. Default: empty', zh: '缓存与历史的 SQLite 文件;留空 = 插件默认路径。默认 空' },
|
|
48
|
+
allowProxyFakeIp: { en: 'true = trust DNS answers in the proxy fake-IP ranges (198.18.0.0/15, fdfe:dcba:9876::/64, 2001:2::/48) | false. Turn it on only when Clash/TUN makes searches fail with "resolved to proxy fake-IP". Literal fake-IP URLs, localhost and other private addresses stay blocked. Default: false', zh: 'true = 信任代理 fake-IP 网段(198.18.0.0/15、fdfe:dcba:9876::/64、2001:2::/48)里的 DNS 结果 | false。仅在 Clash/TUN 让搜索报 “resolved to proxy fake-IP” 时打开。字面 fake-IP URL、localhost 与其他私网地址仍被拒绝。默认 false' },
|
|
49
|
+
platformRules: { en: 'JSON object: per platform the selectors {item, title, link, text?} used by the browser search page. Default: empty', zh: 'JSON 对象:按平台给出浏览器搜索页用的选择器 {item, title, link, text?}。默认 空' },
|
|
50
|
+
customPlatforms: { en: 'JSON object: your own platforms, each {name, url template, item, title, link, text?}; a key may not reuse a built-in source id. Logins go through browserBindings, not here. Default: empty', zh: 'JSON 对象:你自己的平台,每个 {name, url 模板, item, title, link, text?};键不能和内置来源重名。登录态通过 browserBindings 引用,不写在这里。默认 空' },
|
|
51
|
+
browserBindings: { en: 'JSON object: bind a platform to a dsh-browser login profile and rule pack. Default: empty', zh: 'JSON 对象:把平台绑定到 dsh-browser 的登录 profile 与规则包。默认 空' },
|
|
52
|
+
platformBackends: { en: 'JSON object: per platform the ordered backends to try, e.g. {"xiaohongshu": ["xhs", "opencli", "browser-opencli"]}. A backend that is missing or not logged in is skipped with its reason. Default: empty (built-in chains)', zh: 'JSON 对象:按平台给出依次尝试的后端,如 {"xiaohongshu": ["xhs", "opencli", "browser-opencli"]}。缺失或未登录的后端会被跳过并说明原因。默认 空(用内置链)' },
|
|
53
|
+
cliAdapters: { en: 'JSON object: your own read-only CLI adapter specs by id (argv array, output fields, probe contract, allowedSubcommands). Write actions and cookie-reading flags are refused. Default: empty', zh: 'JSON 对象:按 id 定义你自己的只读 CLI 适配规格(argv 数组、输出字段、探测契约、allowedSubcommands)。写操作与读取 Cookie 的参数会被拒绝。默认 空' },
|
|
54
|
+
verbose: { en: 'true = write a load marker and more run diagnostics | false. Default: false', zh: 'true = 写入加载标记并输出更多运行诊断 | false。默认 false' },
|
|
55
|
+
'evidence.autoProviders': { en: 'true = ready sources strong in the task language (Bocha, Exa, DeepSeek, ...) go ahead of the profile table | false = the table and engines as they are. Default: true', zh: 'true = 就绪且擅长任务语言的来源(博查、Exa、DeepSeek 等)排到 profile 表之前 | false = 完全按表与 engines。默认 true' },
|
|
56
|
+
'evidence.sourcePolicy': { en: 'default = the usual order | anonymous-only = automatic planning never uses a source that needs a key, account or login, even a configured one (a source named in the call still runs). Default: default', zh: 'default = 通常顺序 | anonymous-only = 自动规划绝不使用需要 Key、账号或登录的来源(即使已配置;调用里明确指定的仍可用)。默认 default' },
|
|
57
|
+
'evidence.maxRounds': { en: 'Search rounds per task, at least 1; 1 = no follow-up search. Default: 2', zh: '每个任务的检索轮数,至少 1;1 = 不补搜。默认 2' },
|
|
58
|
+
'evidence.maxQueries': { en: 'Search requests per task over all rounds, at least 1. Default: 4', zh: '每个任务所有轮次的搜索请求数上限,至少 1。默认 4' },
|
|
59
|
+
'evidence.judge.mode': { en: 'Model scoring: off | shadow (record only) | control (the model decides) | hybrid (rules first, the model re-scores cross-language pairs). Writes the legacy keys jevMode / scorer too. Calls a paid model: check the key and the usage caps first. Default: off', zh: '模型评分:off | shadow(只记录对照)| control(由模型决定)| hybrid(规则为主,模型复评跨语言对)。同时写旧键 jevMode / scorer。会调用付费模型:开启前先确认 Key 与用量上限。默认 off' },
|
|
60
|
+
'evidence.hybridBorderline': { en: 'true = hybrid also hands rule-borderline pairs (grade 1) to the model; roughly doubles the cost | false. Default: false', zh: 'true = hybrid 也把规则评分为 1 的边界对交给模型;成本约翻倍 | false。默认 false' },
|
|
61
|
+
'evidence.judge.provider': { en: 'Scoring provider id: a preset (bocha-jev, typesafe-jev, laya-local, jina-rerank, cohere-rerank) or one you define; empty = bocha-jev. Default: empty', zh: '评分 provider 的 id:内置预设(bocha-jev、typesafe-jev、laya-local、jina-rerank、cohere-rerank)或你定义的;留空 = bocha-jev。默认 空' },
|
|
62
|
+
'evidence.maxJevQuestions': { en: 'Most (need, block) pairs asked of the model per search, at least 1. Default: 64', zh: '每次搜索向模型提的(需求, 文本块)对的上限,至少 1。默认 64' },
|
|
63
|
+
'evidence.judge.allowLlm': { en: 'true = providers that speak the llm protocol may be used | false. Risk: general LLM calls cost tokens. Default: false', zh: 'true = 允许使用 llm 协议的 provider | false。风险:通用 LLM 调用消耗 token。默认 false' },
|
|
64
|
+
'evidence.judge.providers': { en: 'JSON object: scoring providers by id {protocol, baseUrl, model, keyRef, ...}; a preset id overrides its fields. keyRef is only the NAME of the key: never put a key value here. Default: empty', zh: 'JSON 对象:按 id 定义评分 provider {protocol, baseUrl, model, keyRef, …};与预设同名则覆盖字段。keyRef 只是 Key 的名字:切勿在这里写 Key 的值。默认 空' },
|
|
65
|
+
'evidence.coverage.mode': { en: 'Coverage judge: off | shadow (record the probability) | control (weak support becomes a gap). Not switched on by the scoring mode. Default: off', zh: '覆盖判定:off | shadow(记录概率)| control(弱支持降级为缺口)。不随评分模式自动开启。默认 off' },
|
|
66
|
+
'evidence.coverage.provider': { en: 'Coverage provider id; must speak the systemone protocol; empty = the scoring provider. Default: empty', zh: '覆盖判定的 provider id;必须是 systemone 协议;留空 = 同评分 provider。默认 空' },
|
|
67
|
+
'evidence.coverage.thresholds.weak': { en: 'Probability below which a need counts as weak, 0-1; set together with the covered threshold (weak <= covered). Empty = the calibrated value shipped for bocha-jev + cover.sufficient v1', zh: '概率低于它判为弱,0–1;与覆盖阈值同时填写(弱 ≤ 覆盖)。留空 = 随插件发布的、仅对 bocha-jev + cover.sufficient v1 校准过的值' },
|
|
68
|
+
'evidence.coverage.thresholds.covered': { en: 'Probability from which a need counts as covered, 0-1. Empty = the calibrated value', zh: '概率不低于它判为覆盖,0–1。留空 = 校准值' },
|
|
69
|
+
'evidence.budget.perSearchInputTokens': { en: 'Most model input tokens one search may use; beyond it the search falls back to rule scoring; 0 = no model call. Default: 60000', zh: '一次搜索最多使用的模型输入 token;超限则回退规则评分;0 = 不调用模型。默认 60000' },
|
|
70
|
+
'evidence.budget.dailyInputTokens': { en: 'Most model input tokens per day, counted by the time zone below. Default: 1000000', zh: '每日最多使用的模型输入 token,按下面的时区按日统计。默认 1000000' },
|
|
71
|
+
'evidence.budget.timezone': { en: 'IANA time zone of the day boundary (Asia/Shanghai); empty = the system time zone. Default: empty', zh: '日界线所用的 IANA 时区(如 Asia/Shanghai);留空 = 系统时区。默认 空' },
|
|
72
|
+
'evidence.budget.providers': { en: 'JSON object: caps per provider, e.g. {"bocha-jev": {"dailyInputTokens": 200000}}; the stricter of this and the global cap applies. Default: empty', zh: 'JSON 对象:按 provider 的上限,如 {"bocha-jev": {"dailyInputTokens": 200000}};与全局上限取更严者。默认 空' },
|
|
73
|
+
'provider.evidence': { en: 'What the built-in web_search returns once routed through this plugin: auto = an evidence pack (a plain list on failure or timeout) | off = the source list only. Default: auto', zh: '内置 web_search 经本插件后返回什么:auto = 证据包(失败或超时退回普通列表)| off = 只返回来源列表。默认 auto' },
|
|
74
|
+
'provider.deadlineMs': { en: 'Deadline of the evidence run inside one built-in web_search in milliseconds, at least 100; at the deadline the partial result returns. Default: 25000', zh: '一次内置 web_search 内证据管线的期限(毫秒),至少 100;到点返回已有结果。默认 25000' },
|
|
75
|
+
'sources.priority': { en: 'Source ids ranked first in this order (only ready sources that fit the task language and profile); an engines list in the call still wins. Default: empty', zh: '按此顺序排最前的来源 id(仅限就绪且适合任务语言与 profile 的来源);调用里的 engines 仍然最优先。默认 空' },
|
|
76
|
+
'sources.disabled': { en: 'Source ids never used by automatic planning or the engines list (a source named in the call still runs). Put deepseek here to opt out of the billed DeepSeek default. Default: empty', zh: '自动规划与 engines 列表都不再使用的来源 id(调用里明确指定的仍可用)。想关掉按量计费的 DeepSeek 默认就把 deepseek 写在这里。默认 空' },
|
|
77
|
+
};
|
|
78
|
+
/** Doc of one `keyedSources.<id>.<key>` / `sources.budget.<id>.<axis>` / `evidence.rubrics.<id>` field. */
|
|
79
|
+
function family(field) {
|
|
80
|
+
let m = /^keyedSources\.(.+)\.apiKeyEnv$/.exec(field);
|
|
81
|
+
if (m) {
|
|
82
|
+
const name = SOURCE_NAME[m[1]] ?? m[1];
|
|
83
|
+
return { en: `Name of the credential / environment variable holding the ${name} key (the key itself is never stored here); empty = the default name.`, zh: `保存 ${name} Key 的凭据 / 环境变量名(Key 本身从不写在这里);留空 = 默认名。` };
|
|
84
|
+
}
|
|
85
|
+
m = /^keyedSources\.(.+)\.baseUrl$/.exec(field);
|
|
86
|
+
if (m) {
|
|
87
|
+
const name = SOURCE_NAME[m[1]] ?? m[1];
|
|
88
|
+
return { en: `Endpoint base of ${name} (an http(s) URL); override only for a proxy or private gateway. Empty = the built-in endpoint.`, zh: `${name} 的接口地址(http(s) URL);仅在使用代理或私有网关时覆盖。留空 = 内置地址。` };
|
|
89
|
+
}
|
|
90
|
+
m = /^sources\.budget\.(.+)\.(total|daily)$/.exec(field);
|
|
91
|
+
if (m) {
|
|
92
|
+
const name = SOURCE_NAME[m[1]] ?? m[1];
|
|
93
|
+
return m[2] === 'total'
|
|
94
|
+
? { en: `Most requests ever sent to ${name} (counted in the usage ledger, kept across restarts); a used-up source is skipped and the plan falls back, never an error. Empty = no cap.`, zh: `${name} 累计最多请求次数(计入用量账本,重启后仍有效);用完被跳过并回退到其他来源,不是错误。留空 = 不限。` }
|
|
95
|
+
: { en: `Most requests per calendar day to ${name} (the day boundary follows the budget time zone). Empty = no cap.`, zh: `${name} 每个自然日最多请求次数(日界线取评分用量上限里的时区)。留空 = 不限。` };
|
|
96
|
+
}
|
|
97
|
+
m = /^sources\.confidence\.(.+)$/.exec(field);
|
|
98
|
+
if (m)
|
|
99
|
+
return { en: `Confidence of ${m[1]} (a source or a platform backend), 0-1: it weighs a little less in the rank fusion of several sources and is printed with its results; 1 changes nothing. Empty = 1 for a built-in source, the \`confidence\` of its spec (default 0.5) for a custom CLI.`, zh: `${m[1]}(来源或平台后端)的置信度,0–1:多个来源融合排名时权重略低,并随结果显示;1 不改变任何东西。留空 = 内置来源为 1,自定义 CLI 取其规格里的 \`confidence\`(默认 0.5)。` };
|
|
100
|
+
m = /^evidence\.rubrics\.(.+)$/.exec(field);
|
|
101
|
+
if (m)
|
|
102
|
+
return { en: `JSON object overriding the built-in judge rubric ${m[1]} {version, instructions, criteria?, maxStateChars, maxCandidateChars}; the version must differ from the built-in one, an invalid override is ignored. Default: empty (the built-in rubric)`, zh: `JSON 对象,覆盖内置评分 rubric ${m[1]}:{version, instructions, criteria?, maxStateChars, maxCandidateChars};版本号必须不同于内置,无效的覆盖会被忽略。默认 空(用内置)` };
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
/** The doc of a config field in a language; undefined only for a field the card does not know. */
|
|
106
|
+
export function fieldDoc(field, lang = 'en') {
|
|
107
|
+
const doc = DOCS[field] ?? family(field);
|
|
108
|
+
return doc ? (lang === 'zh' ? doc.zh : doc.en) : undefined;
|
|
109
|
+
}
|
|
110
|
+
/** The docs of the groups of keys and the header of the text view. */
|
|
111
|
+
export function textViewDocs(lang = 'en') {
|
|
112
|
+
return lang === 'zh'
|
|
113
|
+
? {
|
|
114
|
+
header: [
|
|
115
|
+
'Web Search Pro 的设置,写在 settings.yaml 的 web-search-pro: 段(也是 profile 的 cordis.patch.yml 里 web-search-pro 条目的 config)。',
|
|
116
|
+
'`键: 值` 表示覆盖默认值;以 # 开头的行是注释,被读取时忽略;每个键上面的注释说明用途、取值、默认值与风险。',
|
|
117
|
+
'被注释的 `# 键: 值` 行是未覆盖的键(显示当前生效的值);密钥从不出现在这里,只有保存密钥的凭据引用名。这份文本是面板里控件的只读视图:修改请用控件。',
|
|
118
|
+
],
|
|
119
|
+
group: CONFIG_GROUP_TITLES.zh,
|
|
120
|
+
}
|
|
121
|
+
: {
|
|
122
|
+
header: [
|
|
123
|
+
'Web Search Pro settings, as written in the web-search-pro: section of settings.yaml (the config of the web-search-pro entry in a profile\'s cordis.patch.yml).',
|
|
124
|
+
'`key: value` overrides the default. A line starting with # is a comment and is ignored when read; the comment above each key says what it is for, the allowed values, the default and any risk.',
|
|
125
|
+
'A commented `# key: value` line is a key you have not overridden (it shows the value in force). Secrets never appear here, only the names of the credentials that hold them. This text is a read-only view of the controls in the panel: edit the controls.',
|
|
126
|
+
],
|
|
127
|
+
group: CONFIG_GROUP_TITLES.en,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=field-docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-docs.js","sourceRoot":"","sources":["../../src/client/field-docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which dictionary entry names a field, which fields carry a `?` text of their own, and the facts about the sources the
|
|
3
|
+
* card lists. Pure data (no imports): the rows, the text view and the tests all read it.
|
|
4
|
+
* @module web-search-pro/client/field-keys
|
|
5
|
+
*/
|
|
6
|
+
import { groupOf } from "../config-groups.js";
|
|
7
|
+
import { KEYED_SOURCE_ENVS } from "../providers/keyed-meta.js";
|
|
8
|
+
/** Dictionary key of the label of a field; the hint is `<key>Hint` and the `?` text `<key>Help`. */
|
|
9
|
+
const EXPLICIT = {
|
|
10
|
+
'evidence.autoProviders': 'evAutoProviders', 'evidence.sourcePolicy': 'sourcePolicy', 'evidence.maxRounds': 'evMaxRounds', 'evidence.maxQueries': 'evMaxQueries',
|
|
11
|
+
'evidence.judge.mode': 'judgeMode', 'evidence.hybridBorderline': 'hybridBorderline', 'evidence.judge.provider': 'judgeProvider', 'evidence.maxJevQuestions': 'maxJevQuestions',
|
|
12
|
+
'evidence.judge.allowLlm': 'allowLlm', 'evidence.judge.providers': 'judgeProviders', 'evidence.coverage.mode': 'coverageMode', 'evidence.coverage.provider': 'coverageProvider',
|
|
13
|
+
'evidence.coverage.thresholds.weak': 'thresholdWeak', 'evidence.coverage.thresholds.covered': 'thresholdCovered',
|
|
14
|
+
'evidence.budget.perSearchInputTokens': 'budgetPerSearch', 'evidence.budget.dailyInputTokens': 'budgetDaily', 'evidence.budget.timezone': 'budgetTimezone', 'evidence.budget.providers': 'budgetProviders',
|
|
15
|
+
'provider.evidence': 'providerEvidence', 'provider.deadlineMs': 'providerDeadlineMs', 'sources.priority': 'srcPriority', 'sources.disabled': 'srcDisabled',
|
|
16
|
+
};
|
|
17
|
+
export function labelKey(field) {
|
|
18
|
+
const named = EXPLICIT[field];
|
|
19
|
+
if (named)
|
|
20
|
+
return named;
|
|
21
|
+
if (/^keyedSources\..+\.apiKeyEnv$/.test(field))
|
|
22
|
+
return 'keyedEnv';
|
|
23
|
+
if (/^keyedSources\..+\.baseUrl$/.test(field))
|
|
24
|
+
return 'keyedBaseUrl';
|
|
25
|
+
if (/^sources\.budget\..+\.total$/.test(field))
|
|
26
|
+
return 'reqTotal';
|
|
27
|
+
if (/^sources\.budget\..+\.daily$/.test(field))
|
|
28
|
+
return 'reqDaily';
|
|
29
|
+
if (/^sources\.confidence\..+$/.test(field))
|
|
30
|
+
return 'srcConfidence';
|
|
31
|
+
return field;
|
|
32
|
+
}
|
|
33
|
+
/** The fields whose dictionary has a `<key>Help` text (a longer explanation behind the `?`). */
|
|
34
|
+
export const WITH_HELP = new Set([
|
|
35
|
+
'engines', 'toolSurface', 'allowProxyFakeIp', 'deepseekFetch', 'registerProvider', 'evidence.sourcePolicy', 'sources.priority', 'sources.disabled', 'evidence.judge.mode', 'evidence.hybridBorderline',
|
|
36
|
+
'evidence.judge.allowLlm', 'evidence.coverage.mode', 'evidence.coverage.thresholds.weak', 'rrfConstant', 'freshnessBoost', 'authorityBoost', 'enableCliBackends', 'opencliEnabled', 'agentReachEnabled',
|
|
37
|
+
'evidence.autoProviders', 'timeoutMs', 'ttlSeconds', 'sources.budget.total', 'sources.budget.daily', 'bochaSummary',
|
|
38
|
+
]);
|
|
39
|
+
/** `?` text applies to the generic budget keys too. */
|
|
40
|
+
export const hasHelp = (field) => WITH_HELP.has(field) || WITH_HELP.has(field.replace(/^sources\.budget\..+\.(total|daily)$/, 'sources.budget.$1'));
|
|
41
|
+
/** Dictionary key of the sentence saying why a start-up-only field needs a plugin restart (restart.ts lists the fields). */
|
|
42
|
+
export function restartWhyKey(field) {
|
|
43
|
+
const named = { toolSurface: 'restartWhyToolSurface', 'playwright.snapshotDir': 'restartWhyPlaywright', providerId: 'restartWhyProviderId', registerProvider: 'restartWhyRegisterProvider', timeoutMs: 'restartWhyTimeoutMs', memoryCacheEntries: 'restartWhyMemoryCacheEntries', dbPath: 'restartWhyDbPath', verbose: 'restartWhyVerbose' };
|
|
44
|
+
return named[field] ?? 'restartBadge';
|
|
45
|
+
}
|
|
46
|
+
const keyed = (id, name, tier, extra = {}) => ({
|
|
47
|
+
id, name, tier, credential: `keyed:${id}`, envField: `keyedSources.${id}.apiKeyEnv`, defaultEnv: KEYED_SOURCE_ENVS[id][0], baseUrlField: `keyedSources.${id}.baseUrl`, budget: true, ...extra,
|
|
48
|
+
});
|
|
49
|
+
export const SOURCE_DEFS = [
|
|
50
|
+
keyed('deepseek', 'DeepSeek Search / Fetch', 'paid', { common: true }),
|
|
51
|
+
{ id: 'bocha', name: '博查 Bocha', tier: 'paid', credential: 'bocha', envField: 'bochaApiKeyEnv', defaultEnv: 'BOCHA_SEARCH_API_KEY', baseUrlField: 'bochaBaseUrl', extra: ['bochaSummary'], budget: true },
|
|
52
|
+
keyed('tavily', 'Tavily', 'free-quota'),
|
|
53
|
+
keyed('brave', 'Brave Search', 'free-quota'),
|
|
54
|
+
keyed('linkup', 'Linkup', 'free-quota'),
|
|
55
|
+
keyed('serper', 'Serper (Google)', 'free-quota'),
|
|
56
|
+
keyed('metaso', '秘塔 Metaso', 'paid'),
|
|
57
|
+
keyed('zhipu', '智谱 Zhipu', 'paid'),
|
|
58
|
+
keyed('baidu-qianfan', '百度千帆 Baidu Qianfan', 'free-quota'),
|
|
59
|
+
{ id: 'exa', name: 'Exa', tier: 'free-quota', credential: 'exa', envField: 'exaApiKeyEnv', defaultEnv: 'EXA_API_KEY' },
|
|
60
|
+
{ id: 'jina', name: 'Jina AI', tier: 'free-quota', credential: 'jina', envField: 'jinaApiKeyEnv', defaultEnv: 'JINA_API_KEY' },
|
|
61
|
+
{ id: 'github', name: 'GitHub', tier: 'anonymous', credential: 'github', envField: 'githubTokenEnv', defaultEnv: 'GITHUB_TOKEN' },
|
|
62
|
+
{ id: 'searxng', name: 'SearXNG', tier: 'anonymous', extra: ['searxngUrl'] },
|
|
63
|
+
];
|
|
64
|
+
/** Fields of a source dialog in display order (the key itself is a credential, not a field). */
|
|
65
|
+
export function sourceFields(def) {
|
|
66
|
+
return [
|
|
67
|
+
...def.envField ? [def.envField] : [], ...def.baseUrlField ? [def.baseUrlField] : [], ...def.extra ?? [],
|
|
68
|
+
...def.budget ? [`sources.budget.${def.id}.total`, `sources.budget.${def.id}.daily`] : [],
|
|
69
|
+
];
|
|
70
|
+
}
|
|
71
|
+
/** Fields shown as JSON objects, each in its own dialog: the field, the group it sits in. */
|
|
72
|
+
export const JSON_FIELDS = [
|
|
73
|
+
{ field: 'evidence.judge.providers', group: 'judge' }, { field: 'evidence.budget.providers', group: 'judge' },
|
|
74
|
+
{ field: 'playwright', group: 'runtime' }, { field: 'platformBackends', group: 'advanced' }, { field: 'cliAdapters', group: 'advanced' },
|
|
75
|
+
{ field: 'customPlatforms', group: 'platform' }, { field: 'platformRules', group: 'platform' }, { field: 'browserBindings', group: 'platform' },
|
|
76
|
+
];
|
|
77
|
+
/** Group of the text view of any field: the group of its top-level key (see config-groups.ts, the one list of the layout). */
|
|
78
|
+
export function textGroupOf(field) {
|
|
79
|
+
return groupOf(field) ?? 'common';
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=field-keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-keys.js","sourceRoot":"","sources":["../../src/client/field-keys.ts"],"names":[],"mappings":"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"}
|