dsh-web-search-pro 0.2.1 → 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.
Files changed (258) hide show
  1. package/CHANGELOG.md +164 -0
  2. package/README.md +154 -58
  3. package/assets/skills/dsh-web-search-pro/SKILL.md +13 -12
  4. package/assets/skills/dsh-web-search-pro/references/config.md +36 -0
  5. package/assets/skills/dsh-web-search-pro/references/sources.md +13 -7
  6. package/assets/skills/dsh-web-search-pro/references/troubleshooting.md +3 -1
  7. package/catalog/sources.v1.json +16 -14
  8. package/lib/actions/approval.js +50 -1
  9. package/lib/actions/approval.js.map +1 -1
  10. package/lib/actions/config.js +274 -0
  11. package/lib/actions/config.js.map +1 -0
  12. package/lib/actions/errors.js +8 -1
  13. package/lib/actions/errors.js.map +1 -1
  14. package/lib/actions/format.js +10 -0
  15. package/lib/actions/format.js.map +1 -1
  16. package/lib/actions/index-view.js +2 -2
  17. package/lib/actions/index-view.js.map +1 -1
  18. package/lib/actions/read.js +7 -3
  19. package/lib/actions/read.js.map +1 -1
  20. package/lib/actions/registry.js +3 -1
  21. package/lib/actions/registry.js.map +1 -1
  22. package/lib/actions/run.js +2 -2
  23. package/lib/actions/run.js.map +1 -1
  24. package/lib/actions/schema.js +18 -0
  25. package/lib/actions/schema.js.map +1 -1
  26. package/lib/actions/search.js +7 -2
  27. package/lib/actions/search.js.map +1 -1
  28. package/lib/actions/sources.js +76 -18
  29. package/lib/actions/sources.js.map +1 -1
  30. package/lib/actions/types.js +19 -1
  31. package/lib/actions/types.js.map +1 -1
  32. package/lib/browser-access.js +25 -0
  33. package/lib/browser-access.js.map +1 -1
  34. package/lib/catalog/recommend.js +11 -3
  35. package/lib/catalog/recommend.js.map +1 -1
  36. package/lib/catalog/schema.js +3 -1
  37. package/lib/catalog/schema.js.map +1 -1
  38. package/lib/cli/builtin-specs.js +57 -22
  39. package/lib/cli/builtin-specs.js.map +1 -1
  40. package/lib/cli/chain.js +13 -12
  41. package/lib/cli/chain.js.map +1 -1
  42. package/lib/cli/chains-spec.js +31 -11
  43. package/lib/cli/chains-spec.js.map +1 -1
  44. package/lib/cli/engine.js +19 -3
  45. package/lib/cli/engine.js.map +1 -1
  46. package/lib/cli/opencli-sites.js +83 -0
  47. package/lib/cli/opencli-sites.js.map +1 -0
  48. package/lib/cli/opencli.js +65 -17
  49. package/lib/cli/opencli.js.map +1 -1
  50. package/lib/cli/probe.js +1 -1
  51. package/lib/cli/probe.js.map +1 -1
  52. package/lib/cli/runner.js +217 -27
  53. package/lib/cli/runner.js.map +1 -1
  54. package/lib/cli/spec.js +100 -20
  55. package/lib/cli/spec.js.map +1 -1
  56. package/lib/cli/time-text.js +79 -0
  57. package/lib/cli/time-text.js.map +1 -0
  58. package/lib/cli/trial.js +57 -0
  59. package/lib/cli/trial.js.map +1 -0
  60. package/lib/client/SettingsCard.js +14 -32
  61. package/lib/client/SettingsCard.js.map +1 -1
  62. package/lib/client/agent-mark.js +27 -0
  63. package/lib/client/agent-mark.js.map +1 -0
  64. package/lib/client/card-frame.js +118 -0
  65. package/lib/client/card-frame.js.map +1 -0
  66. package/lib/client/cli-form.js +257 -0
  67. package/lib/client/cli-form.js.map +1 -0
  68. package/lib/client/field-docs.js +130 -0
  69. package/lib/client/field-docs.js.map +1 -0
  70. package/lib/client/field-keys.js +81 -0
  71. package/lib/client/field-keys.js.map +1 -0
  72. package/lib/client/field-rows.js +71 -0
  73. package/lib/client/field-rows.js.map +1 -0
  74. package/lib/client/fill.js +3 -0
  75. package/lib/client/fill.js.map +1 -0
  76. package/lib/client/form-specs.js +13 -1
  77. package/lib/client/form-specs.js.map +1 -1
  78. package/lib/client/form.js +282 -24
  79. package/lib/client/form.js.map +1 -1
  80. package/lib/client/group-advanced.js +23 -0
  81. package/lib/client/group-advanced.js.map +1 -0
  82. package/lib/client/group-agent.js +28 -0
  83. package/lib/client/group-agent.js.map +1 -0
  84. package/lib/client/group-cli.js +136 -0
  85. package/lib/client/group-cli.js.map +1 -0
  86. package/lib/client/group-common.js +29 -0
  87. package/lib/client/group-common.js.map +1 -0
  88. package/lib/client/group-judge.js +67 -0
  89. package/lib/client/group-judge.js.map +1 -0
  90. package/lib/client/group-order.js +201 -0
  91. package/lib/client/group-order.js.map +1 -0
  92. package/lib/client/group-runtime.js +33 -0
  93. package/lib/client/group-runtime.js.map +1 -0
  94. package/lib/client/group-sources.js +83 -0
  95. package/lib/client/group-sources.js.map +1 -0
  96. package/lib/client/groups-basic.js +36 -0
  97. package/lib/client/groups-basic.js.map +1 -0
  98. package/lib/client/index.js.map +1 -1
  99. package/lib/client/json-list.js +50 -0
  100. package/lib/client/json-list.js.map +1 -0
  101. package/lib/client/locales.js +666 -219
  102. package/lib/client/locales.js.map +1 -1
  103. package/lib/client/order.js +192 -0
  104. package/lib/client/order.js.map +1 -0
  105. package/lib/client/overlay-ops.js +46 -0
  106. package/lib/client/overlay-ops.js.map +1 -0
  107. package/lib/client/sources-table.js +1 -0
  108. package/lib/client/sources-table.js.map +1 -1
  109. package/lib/client/styles.js +74 -47
  110. package/lib/client/styles.js.map +1 -1
  111. package/lib/client/text-view.js +98 -0
  112. package/lib/client/text-view.js.map +1 -0
  113. package/lib/client/ui-kit.js +120 -0
  114. package/lib/client/ui-kit.js.map +1 -0
  115. package/lib/client/validators.js +8 -1
  116. package/lib/client/validators.js.map +1 -1
  117. package/lib/client.js +7313 -1571
  118. package/lib/client.js.map +1 -1
  119. package/lib/config-fillers.js +53 -0
  120. package/lib/config-fillers.js.map +1 -0
  121. package/lib/config-groups.js +49 -0
  122. package/lib/config-groups.js.map +1 -0
  123. package/lib/config.js +84 -108
  124. package/lib/config.js.map +1 -1
  125. package/lib/default-chain.js +66 -0
  126. package/lib/default-chain.js.map +1 -0
  127. package/lib/deps.js +1 -1
  128. package/lib/deps.js.map +1 -1
  129. package/lib/engines.js +3 -3
  130. package/lib/engines.js.map +1 -1
  131. package/lib/fetch.js +23 -4
  132. package/lib/fetch.js.map +1 -1
  133. package/lib/index.js +30 -5
  134. package/lib/index.js.map +1 -1
  135. package/lib/overlay-types.js +88 -0
  136. package/lib/overlay-types.js.map +1 -0
  137. package/lib/overlay.js +683 -0
  138. package/lib/overlay.js.map +1 -0
  139. package/lib/pipeline/candidates.js +27 -1
  140. package/lib/pipeline/candidates.js.map +1 -1
  141. package/lib/pipeline/compile.js +63 -0
  142. package/lib/pipeline/compile.js.map +1 -1
  143. package/lib/pipeline/confidence.js +64 -0
  144. package/lib/pipeline/confidence.js.map +1 -0
  145. package/lib/pipeline/fusion.js +50 -3
  146. package/lib/pipeline/fusion.js.map +1 -1
  147. package/lib/pipeline/plan.js +2 -2
  148. package/lib/pipeline/plan.js.map +1 -1
  149. package/lib/pipeline/render.js +20 -2
  150. package/lib/pipeline/render.js.map +1 -1
  151. package/lib/pipeline/run.js +17 -5
  152. package/lib/pipeline/run.js.map +1 -1
  153. package/lib/pipeline/sources-spec.js +19 -3
  154. package/lib/pipeline/sources-spec.js.map +1 -1
  155. package/lib/providers/builtin.js +3 -0
  156. package/lib/providers/builtin.js.map +1 -1
  157. package/lib/providers/deepseek.js +348 -0
  158. package/lib/providers/deepseek.js.map +1 -0
  159. package/lib/providers/http.js.map +1 -1
  160. package/lib/providers/keyed-meta.js +7 -0
  161. package/lib/providers/keyed-meta.js.map +1 -1
  162. package/lib/providers/platforms.js +18 -17
  163. package/lib/providers/platforms.js.map +1 -1
  164. package/lib/providers/registry.js.map +1 -1
  165. package/lib/restart.js +47 -0
  166. package/lib/restart.js.map +1 -0
  167. package/lib/router.js +145 -26
  168. package/lib/router.js.map +1 -1
  169. package/lib/rpc-types.js +15 -0
  170. package/lib/rpc-types.js.map +1 -0
  171. package/lib/rpc.js +85 -0
  172. package/lib/rpc.js.map +1 -0
  173. package/lib/tools.js +10 -4
  174. package/lib/tools.js.map +1 -1
  175. package/lib/types/actions/approval.d.ts +11 -0
  176. package/lib/types/actions/config.d.ts +54 -0
  177. package/lib/types/actions/format.d.ts +9 -2
  178. package/lib/types/actions/run.d.ts +1 -0
  179. package/lib/types/actions/schema.d.ts +7 -1
  180. package/lib/types/actions/sources.d.ts +29 -3
  181. package/lib/types/actions/types.d.ts +28 -2
  182. package/lib/types/browser-access.d.ts +17 -0
  183. package/lib/types/catalog/recommend.d.ts +4 -0
  184. package/lib/types/catalog/schema.d.ts +2 -0
  185. package/lib/types/cli/builtin-specs.d.ts +11 -3
  186. package/lib/types/cli/chains-spec.d.ts +12 -3
  187. package/lib/types/cli/engine.d.ts +10 -3
  188. package/lib/types/cli/opencli-sites.d.ts +24 -0
  189. package/lib/types/cli/opencli.d.ts +42 -3
  190. package/lib/types/cli/runner.d.ts +47 -8
  191. package/lib/types/cli/spec.d.ts +101 -8
  192. package/lib/types/cli/time-text.d.ts +12 -0
  193. package/lib/types/cli/trial.d.ts +19 -0
  194. package/lib/types/client/SettingsCard.d.ts +17 -1
  195. package/lib/types/client/agent-mark.d.ts +22 -0
  196. package/lib/types/client/card-frame.d.ts +35 -0
  197. package/lib/types/client/cli-form.d.ts +97 -0
  198. package/lib/types/client/field-docs.d.ts +15 -0
  199. package/lib/types/client/field-keys.d.ts +41 -0
  200. package/lib/types/client/field-rows.d.ts +70 -0
  201. package/lib/types/client/fill.d.ts +2 -0
  202. package/lib/types/client/form-specs.d.ts +12 -3
  203. package/lib/types/client/form.d.ts +79 -1
  204. package/lib/types/client/group-advanced.d.ts +9 -0
  205. package/lib/types/client/group-agent.d.ts +20 -0
  206. package/lib/types/client/group-cli.d.ts +52 -0
  207. package/lib/types/client/group-common.d.ts +12 -0
  208. package/lib/types/client/group-judge.d.ts +17 -0
  209. package/lib/types/client/group-order.d.ts +26 -0
  210. package/lib/types/client/group-runtime.d.ts +15 -0
  211. package/lib/types/client/group-sources.d.ts +46 -0
  212. package/lib/types/client/groups-basic.d.ts +18 -0
  213. package/lib/types/client/index.d.ts +8 -0
  214. package/lib/types/client/json-list.d.ts +21 -0
  215. package/lib/types/client/locales.d.ts +1079 -200
  216. package/lib/types/client/order.d.ts +102 -0
  217. package/lib/types/client/overlay-ops.d.ts +37 -0
  218. package/lib/types/client/styles.d.ts +56 -41
  219. package/lib/types/client/text-view.d.ts +22 -0
  220. package/lib/types/client/ui-kit.d.ts +200 -0
  221. package/lib/types/config-fillers.d.ts +9 -0
  222. package/lib/types/config-groups.d.ts +23 -0
  223. package/lib/types/config.d.ts +263 -225
  224. package/lib/types/default-chain.d.ts +63 -0
  225. package/lib/types/engines.d.ts +29 -1
  226. package/lib/types/fetch.d.ts +12 -3
  227. package/lib/types/index.d.ts +164 -150
  228. package/lib/types/overlay-types.d.ts +98 -0
  229. package/lib/types/overlay.d.ts +141 -0
  230. package/lib/types/pipeline/candidates.d.ts +17 -0
  231. package/lib/types/pipeline/compile.d.ts +11 -0
  232. package/lib/types/pipeline/confidence.d.ts +35 -0
  233. package/lib/types/pipeline/fusion.d.ts +23 -1
  234. package/lib/types/pipeline/render.d.ts +16 -0
  235. package/lib/types/pipeline/run.d.ts +2 -1
  236. package/lib/types/pipeline/sources-spec.d.ts +5 -2
  237. package/lib/types/pipeline/types.d.ts +37 -0
  238. package/lib/types/providers/deepseek.d.ts +130 -0
  239. package/lib/types/providers/http.d.ts +2 -1
  240. package/lib/types/providers/keyed-meta.d.ts +5 -0
  241. package/lib/types/providers/registry.d.ts +7 -0
  242. package/lib/types/restart.d.ts +52 -0
  243. package/lib/types/router.d.ts +57 -10
  244. package/lib/types/rpc-types.d.ts +79 -0
  245. package/lib/types/rpc.d.ts +41 -0
  246. package/lib/types/tools.d.ts +6 -0
  247. package/lib/types/util.d.ts +10 -0
  248. package/lib/util.js +10 -1
  249. package/lib/util.js.map +1 -1
  250. package/package.json +50 -42
  251. package/scripts/check-client-bundle.mjs +1 -1
  252. package/scripts/cli-login-check.mjs +214 -0
  253. package/lib/client/RubricEditor.js +0 -47
  254. package/lib/client/RubricEditor.js.map +0 -1
  255. package/lib/client/fields.js +0 -31
  256. package/lib/client/fields.js.map +0 -1
  257. package/lib/types/client/RubricEditor.d.ts +0 -6
  258. package/lib/types/client/fields.d.ts +0 -65
@@ -0,0 +1,136 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * "Custom CLI": the command-line tools the user adds, as a list (id, command, purpose, confidence, whether the spec is valid) and one
4
+ * edit dialog per tool. The dialog is a form over the same spec the JSON box holds ("View JSON" at the bottom): editing either side
5
+ * rewrites the other, every problem is the server's own message shown by the control it is about, "Done" puts the spec into the
6
+ * draft (only when it is valid), and "Try it" runs the draft once through the plugin. The entries live inside `cliAdapters`.
7
+ * @module web-search-pro/client/group-cli
8
+ */
9
+ import { useState } from 'react';
10
+ import { WHOLE_OUTPUT_DEFAULT_CHARS, OUTPUT_FORMATS, DEFAULT_CUSTOM_CONFIDENCE } from "../cli/spec.js";
11
+ import { adaptersOf, checkSpec, derivedSubcommands, echoSpec, FIELD_KEYS, formToSpec, freeId, LINE_MODES, newSpec, parseSpecText, specText, specToForm, withAdapter, } from "./cli-form.js";
12
+ import { fill, rowLabels, useOverriddenCount } from "./field-rows.js";
13
+ import { AgentMark } from "./agent-mark.js";
14
+ import { customEntries, customRows, ORDER_PLATFORMS } from "./order.js";
15
+ import { styles as css } from "./styles.js";
16
+ import { Badge, Btn, Chips, Dialog, Fold, Group, Item, Row, Select, SubHead, TextInput, Toggle, UnitInput } from "./ui-kit.js";
17
+ export function draftOf(mode, id, spec) {
18
+ return { mode, id, spec, form: specToForm(id, spec), jsonText: specText(spec), query: '' };
19
+ }
20
+ /** The draft after a form edit: the spec is rebuilt from the fields on top of the spec as it was, the JSON text follows. */
21
+ export function editForm(draft, patch) {
22
+ const form = { ...draft.form, ...patch };
23
+ const spec = formToSpec(form, draft.spec);
24
+ return { ...draft, form, spec, jsonText: specText(spec), jsonError: undefined };
25
+ }
26
+ /** A new entry's id; an existing one cannot be renamed (copy it instead). */
27
+ export function editId(draft, id) {
28
+ return draft.mode === 'new' ? { ...draft, id, form: { ...draft.form, id } } : draft;
29
+ }
30
+ /** The draft after the JSON box changed: a text that parses becomes the spec and the form is read from it; one that does not leaves both alone. */
31
+ export function editJson(draft, text) {
32
+ const parsed = parseSpecText(text);
33
+ if ('error' in parsed)
34
+ return { ...draft, jsonText: text, jsonError: parsed.error };
35
+ const spec = parsed.spec;
36
+ return { ...draft, spec, form: specToForm(draft.id, spec), jsonText: text };
37
+ }
38
+ // ── the pieces of the form ───────────────────────────────────────────────────────────────────────────────────────────────────
39
+ const FIELD_LABELS = {
40
+ url: { label: 'cliFieldUrl', hint: 'cliFieldUrlHint' }, title: { label: 'cliFieldTitle', hint: 'cliFieldTitleHint' },
41
+ snippet: { label: 'cliFieldSnippet', hint: 'cliFieldSnippetHint' }, publishedAt: { label: 'cliFieldPublishedAt', hint: 'cliFieldPublishedAtHint' },
42
+ };
43
+ /** One setting of the dialog: the card's own row with the control, and the server's messages for it in place of the hint. */
44
+ function FormRow(props) {
45
+ const { card } = props;
46
+ const bad = (props.errors?.length ?? 0) > 0;
47
+ return _jsx(Row, { field: props.field, id: props.id, label: props.label, hint: props.hint, invalid: bad, problem: props.errors?.join('\n'), labels: rowLabels(card.t), wide: props.wide, inline: props.inline, children: props.children });
48
+ }
49
+ /** The argument template: one box per token, buttons to add one, to add a placeholder, and to drop one. */
50
+ function Tokens({ card, tokens, onChange, disabled, invalid }) {
51
+ const { t } = card;
52
+ const edit = (index, value) => onChange(tokens.map((token, i) => (i === index ? value : token)));
53
+ return _jsxs("div", { className: css.tokens, "data-wsp-tokens": true, children: [tokens.map((token, index) => _jsxs("div", { className: css.tokenRow, children: [_jsx("span", { className: "wsp-token-no", children: index + 1 }), _jsx(TextInput, { code: true, value: token, invalid: invalid && token === '', disabled: disabled, ariaLabel: fill(t('cliArgvToken'), { n: index + 1 }), onChange: value => edit(index, value) }), _jsx(Btn, { ariaLabel: t('cliArgvRemove'), title: t('cliArgvRemove'), danger: true, disabled: disabled, onClick: () => onChange(tokens.filter((_, i) => i !== index)), data: "token-remove", children: "\u00D7" })] }, index)), _jsxs("div", { className: css.actions, children: [_jsxs(Btn, { disabled: disabled, onClick: () => onChange([...tokens, '']), data: "token-add", children: ["\uFF0B ", t('cliArgvAdd')] }), _jsx(Btn, { disabled: disabled || tokens.includes('{query}'), onClick: () => onChange([...tokens, '{query}']), data: "token-query", children: '{query}' }), _jsx(Btn, { disabled: disabled, onClick: () => onChange([...tokens, '{count}']), data: "token-count", children: '{count}' })] })] });
54
+ }
55
+ /** What the form of one custom CLI shows and edits; presentational (the dialog and the render test both mount it). */
56
+ export function CliBody({ card, draft, check, disabled, onForm, onId, onJson, onQuery, onTrial }) {
57
+ const { t } = card;
58
+ const { form } = draft;
59
+ const errors = (field) => check.byField[field] ?? [];
60
+ const allowed = derivedSubcommands(draft.spec);
61
+ const server = card.useWebSearchPro(snapshot => snapshot.server);
62
+ const trial = server.trial.id === draft.id ? server.trial : { state: 'idle' };
63
+ const format = form.format;
64
+ const pathFormat = format === 'json' || format === 'yaml';
65
+ const platformCheck = (value) => (ORDER_PLATFORMS.includes(value) ? undefined : t('cliPlatformUnknown') + ': ' + ORDER_PLATFORMS.join(', '));
66
+ return _jsxs("div", { className: css.stack, "data-wsp-cli-form": draft.id, children: [_jsx("p", { className: css.rowHint, children: t('cliDialogNote') }), errors('general').length ? _jsx("p", { className: `${css.rowHint} wsp-bad`, role: "alert", children: errors('general').join('\n') }) : null, _jsx(FormRow, { card: card, id: "web-search-pro-cli-id", label: t('cliId'), hint: t('cliIdHint'), errors: errors('id'), children: _jsx(TextInput, { id: "web-search-pro-cli-id", code: true, value: draft.id, disabled: disabled || draft.mode === 'edit', invalid: errors('id').length > 0, onChange: onId }) }), _jsx(FormRow, { card: card, id: "web-search-pro-cli-bin", label: t('cliBin'), hint: t('cliBinHint'), errors: errors('bin'), children: _jsx(TextInput, { id: "web-search-pro-cli-bin", code: true, value: form.bin, disabled: disabled, placeholder: "mytool", invalid: errors('bin').length > 0, onChange: bin => onForm({ bin }) }) }), _jsxs(FormRow, { card: card, label: t('cliArgv'), hint: t('cliArgvHint'), errors: errors('argv'), wide: true, children: [_jsx(Tokens, { card: card, tokens: form.argv, disabled: disabled, invalid: errors('argv').length > 0, onChange: argv => onForm({ argv }) }), _jsx("p", { className: css.rowHint, children: t('cliArgvNote') })] }), _jsx(FormRow, { card: card, label: t('cliAllowed'), hint: t('cliAllowedHint'), errors: errors('probe'), children: _jsx("span", { className: "wsp-allowed", "data-wsp-allowed": true, children: allowed.length ? allowed.map(word => _jsxs("code", { children: [word, " "] }, word)) : _jsx("span", { className: css.muted, children: t('cliAllowedNone') }) }) }), _jsx(SubHead, { children: t('cliOutput') }), _jsx(FormRow, { card: card, id: "web-search-pro-cli-format", label: t('cliFormat'), hint: t('cliFormatHint'), errors: errors('format'), children: _jsx(Select, { id: "web-search-pro-cli-format", value: format, disabled: disabled, options: OUTPUT_FORMATS.map(value => ({ value, label: value })), onChange: value => onForm({ format: value }) }) }), format === 'text' ? _jsx(FormRow, { card: card, label: t('cliWhole'), hint: t('cliWholeHint'), inline: true, children: _jsx(Toggle, { label: t('cliWhole'), checked: form.whole, disabled: disabled, onChange: whole => onForm({ whole }) }) }) : null, format === 'text' && form.whole ? _jsxs(_Fragment, { children: [_jsx(FormRow, { card: card, id: "web-search-pro-cli-whole-max", label: t('cliWholeMax'), hint: t('cliWholeMaxHint'), errors: errors('lines'), children: _jsx(UnitInput, { id: "web-search-pro-cli-whole-max", value: form.wholeMax, unit: t('unitChars'), placeholder: String(WHOLE_OUTPUT_DEFAULT_CHARS), disabled: disabled, invalid: errors('lines').length > 0, onChange: wholeMax => onForm({ wholeMax }) }) }), _jsx("p", { className: css.rowHint, "data-wsp-whole-note": true, children: t('cliWholeNote') })] }) : null, format === 'text' && !form.whole ? _jsxs(_Fragment, { children: [_jsx(FormRow, { card: card, id: "web-search-pro-cli-lines", label: t('cliLinesMode'), hint: t('cliLinesModeHint'), errors: form.linesMode === 'tsv' ? [] : errors('lines'), children: _jsx(Select, { id: "web-search-pro-cli-lines", value: form.linesMode, disabled: disabled, options: LINE_MODES.map(value => ({ value, label: value === 'tsv' ? t('cliOptTsv') : t('cliOptUrlLines') })), onChange: value => onForm({ linesMode: value }) }) }), form.linesMode === 'tsv' ? _jsx(FormRow, { card: card, id: "web-search-pro-cli-columns", label: t('cliColumns'), hint: t('cliColumnsHint'), errors: errors('lines'), children: _jsx(TextInput, { id: "web-search-pro-cli-columns", code: true, value: form.columns, disabled: disabled, placeholder: "id, title, link", invalid: errors('lines').length > 0, onChange: columns => onForm({ columns }) }) }) : null] }) : null, pathFormat ? _jsx(FormRow, { card: card, id: "web-search-pro-cli-items", label: t('cliItemsPath'), hint: t('cliItemsPathHint'), errors: errors('itemsPath'), children: _jsx(TextInput, { id: "web-search-pro-cli-items", code: true, value: form.itemsPath, disabled: disabled, placeholder: "data.items", invalid: errors('itemsPath').length > 0, onChange: itemsPath => onForm({ itemsPath }) }) }) : null, !(format === 'text' && form.whole) ? _jsxs(_Fragment, { children: [_jsx("p", { className: css.rowHint, children: t('cliFieldsNote') }), errors('fields').length ? _jsx("p", { className: `${css.rowHint} wsp-bad`, role: "alert", children: errors('fields').join('\n') }) : null, FIELD_KEYS.map(key => _jsx(FormRow, { card: card, id: `web-search-pro-cli-field-${key}`, label: t(FIELD_LABELS[key].label), hint: form.complex.includes(key) ? t('cliFieldComplex') : t(FIELD_LABELS[key].hint), errors: errors(key), children: _jsx(TextInput, { id: `web-search-pro-cli-field-${key}`, code: true, value: form.fields[key], disabled: disabled || form.complex.includes(key), placeholder: form.complex.includes(key) ? '{…}' : key === 'url' ? 'link' : key === 'title' ? 'title' : key === 'snippet' ? 'summary' : 'published_at', invalid: errors(key).length > 0, onChange: value => onForm({ fields: { ...form.fields, [key]: value } }) }) }, key))] }) : null, _jsx(FormRow, { card: card, id: "web-search-pro-cli-timeout", label: t('cliTimeout'), hint: t('cliTimeoutHint'), errors: errors('timeoutMs'), children: _jsx(UnitInput, { id: "web-search-pro-cli-timeout", value: form.timeoutMs, unit: t('unitMs'), disabled: disabled, invalid: errors('timeoutMs').length > 0, onChange: timeoutMs => onForm({ timeoutMs }) }) }), _jsx(SubHead, { children: t('cliPurpose') }), _jsx(FormRow, { card: card, label: t('cliEngine'), hint: t('cliEngineHint'), errors: errors('engine'), inline: true, children: _jsx(Toggle, { label: t('cliEngine'), checked: form.engine, disabled: disabled, onChange: engine => onForm({ engine }) }) }), _jsx(FormRow, { card: card, id: "web-search-pro-cli-platforms", label: t('cliPlatforms'), hint: t('cliPlatformsHint'), errors: errors('platforms'), wide: true, children: _jsx(Chips, { id: "web-search-pro-cli-platforms", values: form.platforms, disabled: disabled, placeholder: t('cliPlatformsAdd'), removeLabel: t('chipRemove'), addLabel: t('cliPlatforms'), check: platformCheck, onChange: platforms => onForm({ platforms }) }) }), _jsx(FormRow, { card: card, id: "web-search-pro-cli-confidence", label: t('cliConfidenceLabel'), hint: t('cliConfidenceHint'), errors: errors('confidence'), children: _jsx(TextInput, { id: "web-search-pro-cli-confidence", numeric: true, value: form.confidence, disabled: disabled, placeholder: String(DEFAULT_CUSTOM_CONFIDENCE), invalid: errors('confidence').length > 0, onChange: confidence => onForm({ confidence }) }) }), _jsx("p", { className: css.rowHint, children: t('cliConfidenceNote') }), _jsxs(Fold, { id: "cli-advanced", title: t('cliAdvanced'), children: [_jsx(FormRow, { card: card, id: "web-search-pro-cli-package", label: t('cliPackageNote'), hint: t('cliPackageNoteHint'), errors: errors('packageNote'), children: _jsx(TextInput, { id: "web-search-pro-cli-package", value: form.packageNote, disabled: disabled, placeholder: form.bin ? form.bin + ' (installed by you)' : '', invalid: errors('packageNote').length > 0, onChange: packageNote => onForm({ packageNote }) }) }), _jsx(FormRow, { card: card, id: "web-search-pro-cli-help", label: t('cliHelpArgs'), hint: t('cliHelpArgsHint'), errors: errors('probe'), children: _jsx(TextInput, { id: "web-search-pro-cli-help", code: true, value: form.helpArgs, disabled: disabled, placeholder: "--help", onChange: helpArgs => onForm({ helpArgs }) }) }), _jsx(FormRow, { card: card, id: "web-search-pro-cli-must", label: t('cliMustContain'), hint: t('cliMustContainHint'), wide: true, children: _jsx(Chips, { id: "web-search-pro-cli-must", values: form.mustContain, disabled: disabled, removeLabel: t('chipRemove'), addLabel: t('cliMustContain'), onChange: mustContain => onForm({ mustContain }) }) }), _jsx(FormRow, { card: card, id: "web-search-pro-cli-max", label: t('cliMaxOutput'), hint: t('cliMaxOutputHint'), errors: errors('maxOutputBytes'), children: _jsx(UnitInput, { id: "web-search-pro-cli-max", value: form.maxOutputBytes, unit: t('unitBytes'), disabled: disabled, invalid: errors('maxOutputBytes').length > 0, onChange: maxOutputBytes => onForm({ maxOutputBytes }) }) })] }), _jsx(Fold, { id: "cli-trial", title: t('cliTrial'), children: _jsxs("div", { className: css.stack, "data-wsp-trial": true, children: [_jsx("p", { className: css.rowHint, children: t('cliTrialNote') }), server.available ? _jsxs(_Fragment, { children: [_jsxs("div", { className: css.trialBar, children: [_jsx(TextInput, { value: draft.query, placeholder: t('cliTrialQueryDefault'), ariaLabel: t('cliTrialQuery'), disabled: disabled, onChange: onQuery }), _jsx(Btn, { disabled: disabled || !check.ok || trial.state === 'running', onClick: onTrial, data: "trial-run", children: trial.state === 'running' ? t('cliTrialRunning') : t('cliTrialRun') })] }), !check.ok ? _jsx("p", { className: css.rowHint, children: t('cliTrialInvalid') }) : null, _jsx(TrialOutput, { card: card, trial: trial })] }) : _jsx("p", { className: css.notice, role: "note", "data-wsp-trial-unavailable": true, children: t('cliTrialUnavailable') })] }) }), _jsx(Fold, { id: "cli-json", title: t('cliJson'), children: _jsxs("div", { className: css.stack, "data-wsp-json-view": true, children: [_jsx("p", { className: css.rowHint, children: t('cliJsonNote') }), _jsx("textarea", { className: `${css.input} ${css.textarea} ${css.code} ${draft.jsonError ? css.invalidInput : ''}`, rows: 14, spellCheck: false, value: draft.jsonText, disabled: disabled, "aria-label": t('cliJson'), "aria-invalid": draft.jsonError ? true : undefined, onChange: event => onJson(event.currentTarget.value) }), draft.jsonError ? _jsx("p", { className: `${css.rowHint} wsp-bad`, role: "alert", children: fill(t('cliJsonBad'), { why: draft.jsonError }) }) : null] }) }), _jsx("p", { className: check.ok ? css.rowHint : `${css.rowHint} wsp-bad`, role: check.ok ? 'status' : 'alert', "data-wsp-cli-check": check.ok ? 'ok' : 'bad', children: check.ok ? t('cliValid') : t('cliProblems') + ': ' + check.errors.length })] });
67
+ }
68
+ /** What a trial run found: the first results and the tool's own words, or where it stopped and why. */
69
+ function TrialOutput({ card, trial }) {
70
+ const { t } = card;
71
+ if (trial.state === 'failed')
72
+ return _jsx("p", { className: `${css.rowHint} wsp-bad`, role: "alert", children: fill(t('cliTrialRpcFailed'), { why: trial.error ?? '' }) });
73
+ const result = trial.result;
74
+ if (trial.state !== 'done' || !result)
75
+ return null;
76
+ const stages = { disabled: t('cliTrialStageDisabled'), validate: t('cliTrialStageValidate'), probe: t('cliTrialStageProbe'), search: t('cliTrialStageSearch') };
77
+ if (!result.ok) {
78
+ return _jsxs("div", { className: css.trialOut, "data-wsp-trial-result": "failed", children: [_jsx("strong", { className: "wsp-bad", children: fill(t('cliTrialFailed'), { stage: stages[result.stage] }) }), _jsx("span", { children: result.message }), result.errors?.length ? _jsx("ul", { children: result.errors.map((error, index) => _jsx("li", { children: error }, index)) }) : null, result.hint ? _jsx("span", { className: css.rowHint, children: fill(t('cliTrialHint'), { hint: result.hint }) }) : null, result.raw ? _jsxs(_Fragment, { children: [_jsx("strong", { children: t('cliTrialRaw') }), _jsx("pre", { className: css.codeBlock, children: result.raw })] }) : null] });
79
+ }
80
+ return _jsxs("div", { className: css.trialOut, "data-wsp-trial-result": "ok", children: [_jsx("strong", { children: fill(t('cliTrialOk'), { n: result.total, m: result.sources.length, ms: result.elapsedMs }) }), _jsx(Badge, { tone: "outline", children: t('cliTrialLabel') }), _jsx("span", { className: css.rowHint, children: t('cliTrialResults') }), _jsx("ul", { children: result.sources.map((source, index) => _jsxs("li", { children: [_jsx("strong", { children: source.title ?? source.url }), " ", _jsx("code", { children: source.url }), source.snippet ? _jsxs(_Fragment, { children: [" \u2014 ", source.snippet] }) : null, source.publishedAt ? _jsxs(_Fragment, { children: [" (", source.publishedAt, ")"] }) : null] }, index)) }), _jsx("strong", { children: t('cliTrialRaw') }), _jsx("pre", { className: css.codeBlock, children: result.raw })] });
81
+ }
82
+ // ── the dialog ───────────────────────────────────────────────────────────────────────────────────────────────────────────────
83
+ export function CliDialog({ card, initial, taken, onClose }) {
84
+ const { t } = card;
85
+ const [draft, setDraft] = useState(initial);
86
+ const text = card.useWebSearchPro(snapshot => snapshot.fields.cliAdapters.text);
87
+ const disabled = card.useWebSearchPro(snapshot => !snapshot.writable || snapshot.saving);
88
+ const check = checkSpec(draft.id, draft.spec, draft.mode === 'new' ? taken : []);
89
+ const apply = () => {
90
+ const next = withAdapter(text, draft.id, draft.spec);
91
+ if (next === undefined)
92
+ return;
93
+ card.edit('cliAdapters', next);
94
+ card.clearTrial();
95
+ onClose();
96
+ };
97
+ const close = () => { card.clearTrial(); onClose(); };
98
+ return _jsx(Dialog, { open: true, wide: true, title: draft.mode === 'new' ? t('cliDialogNew') : fill(t('cliDialogEdit'), { id: draft.id }), closeLabel: t('close'), onClose: close, footer: _jsxs(_Fragment, { children: [_jsx(Btn, { onClick: close, data: "cli-cancel", children: t('cliCancel') }), _jsx(Btn, { primary: true, disabled: disabled || !check.ok || adaptersOf(text) === undefined, title: check.ok ? undefined : t('cliApplyBlocked'), onClick: apply, data: "cli-apply", children: t('cliApply') })] }), children: _jsx(CliBody, { card: card, draft: draft, check: check, disabled: disabled, onForm: patch => setDraft(current => editForm(current, patch)), onId: id => setDraft(current => editId(current, id)), onJson: value => setDraft(current => editJson(current, value)), onQuery: query => setDraft(current => ({ ...current, query })), onTrial: () => card.runTrial({ id: draft.id, spec: draft.spec, query: draft.query.trim() || t('cliTrialQueryDefault') }) }) });
99
+ }
100
+ // ── the list ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
101
+ export function CliList({ card }) {
102
+ const { t } = card;
103
+ const text = card.useWebSearchPro(snapshot => snapshot.fields.cliAdapters.text);
104
+ const disabled = card.useWebSearchPro(snapshot => !snapshot.writable);
105
+ const [editing, setEditing] = useState();
106
+ const adapters = adaptersOf(text);
107
+ const rows = customRows(adapters);
108
+ const taken = rows.map(row => row.id);
109
+ const open = (mode, id, spec) => setEditing(draftOf(mode, id, spec));
110
+ const entry = (id) => customEntries(adapters).find(([key]) => key === id)?.[1] ?? {};
111
+ const remove = (id) => { const next = withAdapter(text, id, undefined); if (next !== undefined)
112
+ card.edit('cliAdapters', next); };
113
+ return _jsxs(_Fragment, { children: [adapters === undefined ? _jsx("p", { className: `${css.rowHint} wsp-bad`, role: "alert", children: t('platformChainBad').replace('platformBackends', 'cliAdapters') }) : null, _jsx("div", { className: css.list, "data-wsp-cli-list": true, children: rows.length === 0 ? _jsx("p", { className: css.empty, children: t('cliEmpty') }) : rows.map(row => _jsx(Item, { data: row.id, title: _jsx("code", { children: row.id }), badges: _jsxs(_Fragment, { children: [row.engine ? _jsx(Badge, { tone: "info", children: t('cliPurposeEngine') }) : null, row.platforms.length ? _jsx(Badge, { tone: "neutral", children: fill(t('cliPurposePlatforms'), { list: row.platforms.join(', ') }) }) : null, !row.engine && !row.platforms.length ? _jsx(Badge, { tone: "warning", children: t('cliPurposeNone') }) : null, _jsx(Badge, { tone: "neutral", children: fill(t('orderConfidenceBadge'), { c: row.confidence }) }), _jsx(Badge, { tone: row.problems.length ? 'danger' : 'success', children: row.problems.length ? t('stateSpecBad') + ' · ' + row.problems.length : t('stateSpecOk') }), _jsx(AgentMark, { card: card, itemKey: 'cliAdapters.' + row.id, compact: true })] }), meta: row.problems.length ? row.problems[0] : row.bin + ' ' + argvPreview(entry(row.id)), actions: _jsxs(_Fragment, { children: [_jsx(Btn, { disabled: disabled, onClick: () => open('edit', row.id, entry(row.id)), data: "cli-edit", children: t('edit') }), _jsx(Btn, { disabled: disabled, onClick: () => open('new', freeId(row.id + '-copy', taken), structuredClone(entry(row.id))), data: "cli-copy", children: t('cliCopy') }), _jsx(Btn, { danger: true, disabled: disabled, title: t('cliDeleteNote'), onClick: () => remove(row.id), data: "cli-delete", children: t('cliDelete') })] }) }, row.id)) }), _jsxs("div", { className: css.actions, children: [_jsxs(Btn, { disabled: disabled || adapters === undefined, onClick: () => open('new', freeId('mycli', taken), newSpec()), data: "cli-add", children: ["\uFF0B ", t('cliAdd')] }), _jsx(Btn, { disabled: disabled || adapters === undefined, onClick: () => open('new', freeId('echo', taken), echoSpec()), data: "cli-add-example", children: t('cliAddExample') })] }), _jsx(AgentClis, { card: card, baseline: taken }), editing ? _jsx(CliDialog, { card: card, initial: editing, taken: taken, onClose: () => setEditing(undefined) }, editing.mode + editing.id) : null] });
114
+ }
115
+ /**
116
+ * The custom CLIs an agent added with `config.upsert_cli` that the configuration does not hold: they live only in the overlay, so the list
117
+ * above (which is the configuration) cannot show them. Each carries the same two buttons as in "Agent changes".
118
+ */
119
+ function AgentClis({ card, baseline }) {
120
+ const { t } = card;
121
+ const items = card.useWebSearchPro(snapshot => (snapshot.server.overlay.view?.items ?? []).filter(item => item.kind === 'cli' && item.target !== undefined && !baseline.includes(item.target)));
122
+ if (items.length === 0)
123
+ return null;
124
+ return _jsxs("div", { "data-wsp-agent-clis": true, children: [_jsx(SubHead, { children: t('agentCliTitle') }), _jsx("p", { className: css.rowHint, children: t('agentCliNote') }), _jsx("div", { className: css.list, children: items.map(item => _jsx("div", { className: "wsp-agent-row", children: _jsx(Item, { data: item.target, title: _jsx("code", { children: item.target }), badges: _jsx(AgentMark, { card: card, itemKey: item.key, compact: true }), meta: _jsxs(_Fragment, { children: [_jsx("div", { children: _jsx("code", { children: item.summary }) }), item.reason ? _jsxs("div", { className: css.muted, children: ["\u201C", item.reason, "\u201D"] }) : null] }), actions: _jsxs(_Fragment, { children: [_jsx(Btn, { onClick: () => card.adoptOverlay(item.key), data: "agent-adopt", children: t('agentAdopt') }), _jsx(Btn, { danger: true, onClick: () => card.revokeOverlay([item.key]), data: "agent-revoke", children: t('agentRevoke') })] }) }) }, item.key)) })] });
125
+ }
126
+ /** The argument template as one line, for the list's meta text. */
127
+ function argvPreview(spec) {
128
+ const search = spec.search;
129
+ return Array.isArray(search?.argv) ? search.argv.filter((token) => typeof token === 'string').join(' ') : '';
130
+ }
131
+ export function CliGroup({ card }) {
132
+ const { t } = card;
133
+ const n = useOverriddenCount(card, ['cliAdapters']);
134
+ return _jsxs(Group, { id: "cli", title: t('groupCli'), summary: t('groupCliSub'), badges: n ? _jsx(Badge, { tone: "info", children: fill(t('overriddenCount'), { n }) }) : null, children: [_jsx("p", { className: css.rowHint, children: t('cliIntroNote') }), _jsx(CliList, { card: card })] });
135
+ }
136
+ //# sourceMappingURL=group-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-cli.js","sourceRoot":"","sources":["../../src/client/group-cli.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * "Common": what nearly everyone touches, open by default (every other group starts closed): the default engine chain with the
4
+ * order a search would really try, the result count, parallel fusion, the tool surface, the proxy fake-IP switch, and the
5
+ * DeepSeek Search source (常用) with its page-reading switch.
6
+ * @module web-search-pro/client/group-common
7
+ */
8
+ import { chainOf } from "./card-frame.js";
9
+ import { fill, NumberRow, SelectRow, SwitchRow, useOverriddenCount } from "./field-rows.js";
10
+ import { SourceList } from "./group-sources.js";
11
+ import { styles as css } from "./styles.js";
12
+ import { Badge, Group, SubHead } from "./ui-kit.js";
13
+ /** The names of the common group's fields, in order. */
14
+ export const COMMON_FIELDS = ['searchMaxResults', 'parallelEngines', 'toolSurface', 'allowProxyFakeIp', 'deepseekFetch'];
15
+ /** The chain a plain search would try, computed from the staged settings by the router's own function. */
16
+ function ChainLine({ card }) {
17
+ const { t } = card;
18
+ const chain = card.useWebSearchPro(snapshot => chainOf(snapshot)?.join(' › ') ?? '');
19
+ return _jsxs("p", { className: css.chain, role: "status", "data-wsp-chain": true, children: [_jsx("span", { children: t('chainNow') }), chain ? chain.split(' › ').map((id, index) => _jsxs("span", { children: [index ? '› ' : '', _jsx("code", { children: id })] }, id + index)) : _jsx("span", { children: t('chainEmpty') }), _jsx("button", { type: "button", className: css.link, onClick: () => { const node = document.querySelector('[data-wsp-group="order"]'); if (node) {
20
+ node.open = true;
21
+ node.scrollIntoView?.({ block: 'start', behavior: 'smooth' });
22
+ } }, "data-wsp-open-order": true, children: t('chainEdit') })] });
23
+ }
24
+ export function CommonGroup({ card }) {
25
+ const { t } = card;
26
+ const count = useOverriddenCount(card, COMMON_FIELDS);
27
+ return _jsxs(Group, { id: "common", title: t('groupCommon'), summary: t('groupCommonSub'), defaultOpen: true, badges: count ? _jsx(Badge, { tone: "info", children: fill(t('overriddenCount'), { n: count }) }) : null, children: [_jsx(ChainLine, { card: card }), _jsx(NumberRow, { card: card, field: "searchMaxResults", unit: "count" }), _jsx(SwitchRow, { card: card, field: "parallelEngines" }), _jsx(SelectRow, { card: card, field: "toolSurface", options: [{ value: 'indexed', label: t('optIndexed') }, { value: 'flat', label: t('optFlat') }] }), _jsx(SwitchRow, { card: card, field: "allowProxyFakeIp", risk: t('riskNetwork') }), _jsx(SubHead, { children: t('commonDeepseekTitle') }), _jsx(SourceList, { card: card, only: ['deepseek'] }), _jsx(SwitchRow, { card: card, field: "deepseekFetch", risk: t('riskBilled') })] });
28
+ }
29
+ //# sourceMappingURL=group-common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-common.js","sourceRoot":"","sources":["../../src/client/group-common.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * "Scoring model": the optional model judge (mode, provider, coverage judge, usage caps), its custom providers as a JSON list,
4
+ * and the judge prompts (rubrics) as a list: a row each (name, active version, default or overridden) and an edit dialog that
5
+ * puts the built-in text beside your override. The dialog edits the same staged entry the rest of the card writes on save.
6
+ * @module web-search-pro/client/group-judge
7
+ */
8
+ import { useState } from 'react';
9
+ import { BUILTIN_RUBRIC_IDS } from "../pipeline/rubrics-spec.js";
10
+ import { fill, NumberRow, SelectRow, SwitchRow, TextRow, useOverriddenCount } from "./field-rows.js";
11
+ import { JsonList, jsonFieldsOf } from "./json-list.js";
12
+ import { styles as css } from "./styles.js";
13
+ import { Badge, Btn, Dialog, Fold, Group, Item, SubHead, TextInput } from "./ui-kit.js";
14
+ const MODE_FIELDS = ['evidence.judge.mode', 'evidence.judge.provider', 'evidence.hybridBorderline', 'evidence.maxJevQuestions', 'evidence.judge.allowLlm',
15
+ 'evidence.coverage.mode', 'evidence.coverage.provider', 'evidence.coverage.thresholds.weak', 'evidence.coverage.thresholds.covered',
16
+ 'evidence.budget.perSearchInputTokens', 'evidence.budget.dailyInputTokens', 'evidence.budget.timezone', 'evidence.judge.providers', 'evidence.budget.providers'];
17
+ const CONTROLS = [
18
+ { key: 'version', label: 'rubricVersion', hint: 'rubricVersionHint', kind: 'line' },
19
+ { key: 'instructions', label: 'rubricInstructions', hint: 'rubricInstructionsHint', kind: 'area' },
20
+ { key: 'criteria', label: 'rubricCriteria', hint: 'rubricCriteriaHint', kind: 'area' },
21
+ { key: 'maxStateChars', label: 'rubricMaxState', hint: 'rubricMaxStateHint', kind: 'number' },
22
+ { key: 'maxCandidateChars', label: 'rubricMaxCandidate', hint: 'rubricMaxCandidateHint', kind: 'number' },
23
+ ];
24
+ /** The built-in value of a control. */
25
+ function builtinText(rubric, key) {
26
+ switch (key) {
27
+ case 'version': return rubric.builtin.version;
28
+ case 'instructions': return rubric.builtin.instructions;
29
+ case 'criteria': return rubric.builtin.criteria.join('\n');
30
+ case 'maxStateChars': return String(rubric.builtin.maxStateChars);
31
+ case 'maxCandidateChars': return String(rubric.builtin.maxCandidateChars);
32
+ }
33
+ }
34
+ /** The controls of one rubric override: each is a view of the one staged entry; the built-in text sits beside it. */
35
+ export function RubricForm({ card, id }) {
36
+ const { t } = card;
37
+ const rubric = card.useWebSearchPro(snapshot => snapshot.rubrics.find(entry => entry.id === id));
38
+ const disabled = card.useWebSearchPro(snapshot => !snapshot.writable || snapshot.saving);
39
+ return _jsxs("div", { className: css.stack, "data-wsp-field": `evidence.rubrics.${id}`, "data-wsp-rubric": id, children: [_jsx("p", { className: css.rowHint, children: rubric.description }), !rubric.editing
40
+ ? _jsxs(_Fragment, { children: [_jsxs("div", { className: css.compareCol, children: [_jsx("strong", { children: t('promptDefaultCol') }), _jsx("pre", { className: css.preview, children: rubric.builtin.instructions })] }), _jsx("div", { children: _jsx(Btn, { disabled: disabled, onClick: () => card.startRubric(id), data: "rubric-start", children: t('rubricCreate') }) })] })
41
+ : _jsxs(_Fragment, { children: [CONTROLS.filter(control => control.key !== 'criteria' || rubric.kind === 'score').map(control => {
42
+ const inputId = `web-search-pro-rubric-${id}-${control.key}`;
43
+ const value = rubric.entry[control.key];
44
+ const invalid = rubric.invalid;
45
+ return _jsxs("div", { className: css.compare, children: [_jsxs("div", { className: css.compareCol, children: [_jsxs("strong", { children: [t(control.label), " \u00B7 ", t('promptDefaultCol')] }), _jsx("pre", { className: css.preview, children: builtinText(rubric, control.key) })] }), _jsxs("div", { className: css.compareCol, children: [_jsxs("label", { htmlFor: inputId, children: [t(control.label), " \u00B7 ", t('promptMineCol')] }), control.kind === 'area'
46
+ ? _jsx("textarea", { id: inputId, className: `${css.input} ${css.textarea} ${css.code} ${invalid ? css.invalidInput : ''}`, rows: control.key === 'criteria' ? 5 : 10, spellCheck: false, value: value, disabled: disabled, placeholder: t('promptEmptyIsDefault'), "aria-invalid": invalid || undefined, onChange: event => card.editRubric(id, control.key, event.currentTarget.value) })
47
+ : _jsx(TextInput, { id: inputId, value: value, code: true, disabled: disabled, invalid: invalid, numeric: control.kind === 'number', placeholder: t('promptEmptyIsDefault'), onChange: text => card.editRubric(id, control.key, text) }), _jsx("p", { className: css.rowHint, children: t(control.hint) })] })] }, control.key);
48
+ }), _jsx("div", { children: _jsx("button", { type: "button", className: css.link, disabled: disabled, onClick: () => card.restoreRubric(id), "data-wsp-reset": `evidence.rubrics.${id}`, children: t('rubricRestore') }) })] }), rubric.problems.length ? _jsx("ul", { className: rubric.invalid ? 'wsp-bad' : css.rowHint, role: "alert", "data-wsp-rubric-problems": true, children: rubric.problems.map((problem, index) => _jsx("li", { children: problem }, index)) }) : null] });
49
+ }
50
+ function RubricList({ card }) {
51
+ const { t } = card;
52
+ const rubrics = card.useWebSearchPro(snapshot => snapshot.rubrics);
53
+ const unknown = card.useWebSearchPro(snapshot => snapshot.unknownRubrics);
54
+ const disabled = card.useWebSearchPro(snapshot => !snapshot.writable || snapshot.saving);
55
+ const [editing, setEditing] = useState();
56
+ return _jsxs(_Fragment, { children: [_jsx(SubHead, { children: t('rubricsTitle') }), _jsx("p", { className: css.rowHint, children: t('rubricNotes') }), _jsx("div", { className: css.list, "data-wsp-rubrics": true, children: rubrics.map(rubric => _jsx(Item, { data: rubric.id, title: _jsx("code", { children: rubric.id }), badges: _jsxs(_Fragment, { children: [_jsxs(Badge, { tone: "neutral", children: [t('rubricActive'), " ", rubric.activeVersion] }), _jsx(Badge, { tone: rubric.invalid ? 'danger' : rubric.editing ? 'info' : 'outline', children: rubric.invalid ? t('invalid') : rubric.editing ? t('rubricOverrideOn') : t('promptStateDefault') })] }), meta: rubric.description, actions: _jsxs(_Fragment, { children: [rubric.editing ? _jsx("button", { type: "button", className: css.link, disabled: disabled, onClick: () => card.restoreRubric(rubric.id), children: t('rubricRestore') }) : null, _jsx(Btn, { disabled: disabled, onClick: () => setEditing(rubric.id), data: "rubric-edit", children: t('edit') })] }) }, rubric.id)) }), unknown.length ? _jsxs("p", { className: css.rowHint, role: "note", children: [t('rubricUnknown'), " ", unknown.join(', ')] }) : null, editing ? _jsx(Dialog, { open: true, wide: true, title: fill(t('rubricDialogTitle'), { name: editing }), closeLabel: t('close'), description: t('dialogStagesNote'), onClose: () => setEditing(undefined), footer: _jsx(Btn, { primary: true, onClick: () => setEditing(undefined), data: "rubric-done", children: t('done') }), children: _jsx(RubricForm, { card: card, id: editing }) }) : null] });
57
+ }
58
+ export { BUILTIN_RUBRIC_IDS };
59
+ export function JudgeGroup({ card }) {
60
+ const { t } = card;
61
+ const count = useOverriddenCount(card, [...MODE_FIELDS, ...BUILTIN_RUBRIC_IDS.map(id => `evidence.rubrics.${id}`)]);
62
+ const providers = card.useWebSearchPro(snapshot => snapshot.providerChoices);
63
+ const options = [{ value: '', label: t('emptyDefault') }, ...providers.map(id => ({ value: id, label: id }))];
64
+ const off = { value: 'off', label: t('optionOff') };
65
+ return _jsxs(Group, { id: "judge", title: t('groupJudge'), summary: t('groupJudgeSub'), badges: count ? _jsx(Badge, { tone: "info", children: fill(t('overriddenCount'), { n: count }) }) : null, children: [_jsx(SelectRow, { card: card, field: "evidence.judge.mode", risk: t('riskModel'), options: [off, { value: 'shadow', label: t('optShadow') }, { value: 'control', label: t('optControl') }, { value: 'hybrid', label: t('optHybrid') }] }), _jsx(SelectRow, { card: card, field: "evidence.judge.provider", options: options }), _jsx(SwitchRow, { card: card, field: "evidence.hybridBorderline" }), _jsx(NumberRow, { card: card, field: "evidence.maxJevQuestions", unit: "count" }), _jsx(SwitchRow, { card: card, field: "evidence.judge.allowLlm", risk: t('riskModel') }), _jsxs(Fold, { id: "judge-coverage", title: t('judgeGroupCoverage'), hint: t('judgeGroupCoverageHint'), children: [_jsx(SelectRow, { card: card, field: "evidence.coverage.mode", options: [off, { value: 'shadow', label: t('optShadow') }, { value: 'control', label: t('optControl') }] }), _jsx(SelectRow, { card: card, field: "evidence.coverage.provider", options: options }), _jsx(NumberRow, { card: card, field: "evidence.coverage.thresholds.weak" }), _jsx(NumberRow, { card: card, field: "evidence.coverage.thresholds.covered" })] }), _jsxs(Fold, { id: "judge-budget", title: t('judgeGroupBudget'), hint: t('judgeGroupBudgetHint'), children: [_jsx(NumberRow, { card: card, field: "evidence.budget.perSearchInputTokens", unit: "tokens" }), _jsx(NumberRow, { card: card, field: "evidence.budget.dailyInputTokens", unit: "tokens" }), _jsx(TextRow, { card: card, field: "evidence.budget.timezone", placeholder: "Asia/Shanghai" })] }), _jsx(SubHead, { children: t('judgeGroupProviders') }), _jsx(JsonList, { card: card, fields: jsonFieldsOf('judge') }), _jsx(RubricList, { card: card })] });
66
+ }
67
+ //# sourceMappingURL=group-judge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-judge.js","sourceRoot":"","sources":["../../src/client/group-judge.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,201 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * "Search order": the order a plain search tries its engines, and the order each platform tries its backends, as lists one
4
+ * moves, adds to and removes from (not as a comma text). Below the engine list sits the order a search would really use, with a
5
+ * sentence on why it differs from the list; the platforms are rows with a dialog. Everything stages into the same draft the sticky
6
+ * save bar writes: `engines` and `platformBackends` as they are, `sources.confidence.<id>` for the confidence box of a row.
7
+ * @module web-search-pro/client/group-order
8
+ */
9
+ import { useState } from 'react';
10
+ import { explainChain } from "../default-chain.js";
11
+ import { adaptersOf } from "./cli-form.js";
12
+ import { agentChainOf, chainInputOf } from "./card-frame.js";
13
+ import { fill, rowLabels, useField, useOverriddenCount } from "./field-rows.js";
14
+ import { hasHelp, labelKey } from "./field-keys.js";
15
+ import { confidenceField, CONFIDENCE_PREFIX } from "./form-specs.js";
16
+ import { AgentMark } from "./agent-mark.js";
17
+ import { addId, backendChoices, backendName, chainsOf, confidenceView, customEntries, customRows, defaultChainOf, engineChoices, filterPlatforms, idsOf, isCustomId, moveId, ORDER_PLATFORMS, PLATFORM_NAMES, removeId, sourceInfo, splitPlatforms, textOf, withChain, } from "./order.js";
18
+ import { styles as css } from "./styles.js";
19
+ import { Badge, Btn, Dialog, Fold, Group, Help, Item, Row, Select, SubHead, TextInput } from "./ui-kit.js";
20
+ import { DEFAULT_CUSTOM_CONFIDENCE } from "../cli/spec.js";
21
+ /** The fields of this group, for its "N overridden" badge (the confidence entries are counted by their prefix). */
22
+ const ORDER_FIELDS = ['engines', 'platformBackends'];
23
+ /** Whether the card can tell a source runs: its key, its address, its spec, or (when the plugin answers) the plugin's own probe. */
24
+ function sourceState(snapshot, info, t) {
25
+ const live = snapshot.server.status?.sources[info.id];
26
+ if (info.kind === 'keyed' && info.def) {
27
+ const def = info.def;
28
+ if (def.credential) {
29
+ const cred = snapshot.credentials[def.credential];
30
+ return cred.loading ? { tone: 'neutral', label: t('credentialChecking') } : cred.configured ? { tone: 'success', label: t('stateReady') } : { tone: 'warning', label: t('stateNoKey') };
31
+ }
32
+ return (snapshot.fields.searxngUrl?.text ?? '') !== '' ? { tone: 'success', label: t('stateReady') } : { tone: 'warning', label: t('stateNoUrl') };
33
+ }
34
+ if (info.kind === 'custom') {
35
+ const problems = customRows(adaptersOf(snapshot.fields.cliAdapters.text)).find(row => row.id === info.id.slice('custom-cli:'.length))?.problems ?? [];
36
+ if (problems.length)
37
+ return { tone: 'danger', label: t('stateSpecBad'), reason: problems[0] };
38
+ // A saved CLI is probed by the plugin: installed or not. One that is only in the draft is just a valid spec so far.
39
+ if (live)
40
+ return live.available ? { tone: 'success', label: t('stateReady') } : { tone: 'warning', label: t('stateNotReady'), ...live.reason ? { reason: live.reason } : {} };
41
+ return { tone: 'neutral', label: t('stateSpecOk') };
42
+ }
43
+ if (info.kind === 'unknown')
44
+ return info.id.startsWith('custom-cli:') ? { tone: 'danger', label: t('stateNoSpec') } : { tone: 'warning', label: t('stateUnknown') };
45
+ if (live && !live.available)
46
+ return { tone: 'warning', label: t('stateNotReady'), ...live.reason ? { reason: live.reason } : {} };
47
+ return { tone: 'success', label: t('stateReady') };
48
+ }
49
+ /** Confidence a source has when nothing is set for it. */
50
+ const defaultConfidence = (info, adapters) => {
51
+ if (info.kind !== 'custom')
52
+ return 1;
53
+ const raw = customEntries(adapters).find(([key]) => key === info.id.slice('custom-cli:'.length))?.[1];
54
+ return typeof raw?.confidence === 'number' ? raw.confidence : DEFAULT_CUSTOM_CONFIDENCE;
55
+ };
56
+ /**
57
+ * The confidence of a source, as a labelled box. While it is 1 (the built-in default, which changes nothing) it is only a quiet
58
+ * "Confidence · default 1" that opens into the box on a click; any other value, or a wrong one, keeps the box open and picked out.
59
+ */
60
+ function ConfidenceBox({ card, info, adapters, fallback }) {
61
+ const { t } = card;
62
+ const [open, setOpen] = useState(false);
63
+ const field = confidenceField(info.id);
64
+ const text = card.useWebSearchPro(snapshot => snapshot.fields[field]?.text ?? '');
65
+ const invalid = card.useWebSearchPro(snapshot => snapshot.fields[field]?.invalid ?? false);
66
+ const disabled = card.useWebSearchPro(snapshot => !snapshot.writable || snapshot.saving);
67
+ const dflt = fallback ?? defaultConfidence(info, adapters);
68
+ const view = confidenceView(text, dflt);
69
+ const name = fill(t('orderConfidenceOf'), { name: info.name });
70
+ const help = _jsx(Help, { label: t('helpLabel'), text: t('orderConfidenceHelp') });
71
+ if (view.quiet && !open && !invalid) {
72
+ return _jsxs("span", { className: "wsp-conf", "data-wsp-confidence": "quiet", children: [_jsxs("button", { type: "button", className: "wsp-conf-quiet", disabled: disabled, "aria-label": name, title: t('orderConfidenceEdit'), onClick: () => setOpen(true), children: [t('orderConfidenceLabel'), " ", _jsx("span", { children: view.typed ? view.effective : fill(t('orderConfidenceDefault'), { c: view.effective }) })] }), help, _jsx(AgentMark, { card: card, itemKey: 'sources.confidence.' + info.id, compact: true })] });
73
+ }
74
+ return _jsxs("span", { className: view.quiet && !invalid ? 'wsp-conf' : 'wsp-conf wsp-conf-on', "data-wsp-confidence": "set", children: [_jsx("label", { className: "wsp-conf-label", htmlFor: 'wsp-conf-' + info.id, children: t('orderConfidenceLabel') }), _jsx(TextInput, { id: 'wsp-conf-' + info.id, small: true, numeric: true, value: text, placeholder: String(dflt), invalid: invalid || view.invalid, disabled: disabled, ariaLabel: name, autoFocus: open, onBlur: () => setOpen(false), onChange: value => card.edit(field, value) }), help, _jsx(AgentMark, { card: card, itemKey: 'sources.confidence.' + info.id, compact: true })] });
75
+ }
76
+ /** One row of an ordered list: its place, name, readiness and confidence, and the buttons that move it. */
77
+ function OrderItem(props) {
78
+ const { card, info, index, count, state } = props;
79
+ const { t } = card;
80
+ return _jsx("div", { className: props.muted ? 'wsp-order-row wsp-order-default' : 'wsp-order-row', "data-wsp-order-item": info.id, children: _jsx(Item, { data: info.id, title: _jsxs(_Fragment, { children: [_jsx("span", { className: "wsp-order-no", children: index + 1 }), _jsx("strong", { children: info.name }), info.name !== info.id ? _jsx("code", { children: info.id }) : null] }), badges: _jsxs(_Fragment, { children: [info.kind === 'custom' ? _jsx(Badge, { tone: "outline", children: t('kindCustom') }) : null, _jsx(Badge, { tone: state.tone, children: state.label })] }), meta: state.reason, actions: _jsxs(_Fragment, { children: [_jsx(ConfidenceBox, { card: card, info: info, adapters: props.adapters, fallback: props.fallback }), _jsx(Btn, { ariaLabel: t('orderUp'), title: t('orderUp'), disabled: props.disabled || index === 0, onClick: () => props.onMove(-1), data: "order-up", children: "\u2191" }), _jsx(Btn, { ariaLabel: t('orderDown'), title: t('orderDown'), disabled: props.disabled || index === count - 1, onClick: () => props.onMove(1), data: "order-down", children: "\u2193" }), _jsx(Btn, { ariaLabel: t('orderRemove'), title: t('orderRemove'), danger: true, disabled: props.disabled, onClick: props.onRemove, data: "order-remove", children: "\u00D7" })] }) }) });
81
+ }
82
+ /** A closed drop-down that adds the source picked (it snaps back to its title). */
83
+ function AddSelect({ label, title, choices, onAdd, disabled, name }) {
84
+ return _jsx("span", { "data-wsp-add": name, children: _jsx(Select, { ariaLabel: label, value: "", options: [{ value: '', label: title }, ...choices], disabled: disabled || choices.length === 0, onChange: value => { if (value)
85
+ onAdd(value); } }) });
86
+ }
87
+ // ── the order a search would really use ─────────────────────────────────────────────────────────────────────────────────
88
+ function whyText(t, reasons) {
89
+ if (!reasons.length)
90
+ return t('orderWhySame');
91
+ const text = (reason) => {
92
+ const ids = reason.ids.join(', ');
93
+ switch (reason.kind) {
94
+ case 'common': return fill(t('orderWhyCommon'), { ids });
95
+ case 'disabled': return fill(t('orderWhyDisabled'), { ids });
96
+ case 'priority': return fill(t('orderWhyPriority'), { ids });
97
+ case 'anonymous-only': return fill(t('orderWhyAnonymous'), { ids });
98
+ case 'own-list': return fill(t('orderWhyOwn'), { ids });
99
+ }
100
+ };
101
+ return reasons.map(text).join(' ');
102
+ }
103
+ /** The chain a plain search would try, from the draft, and one sentence on why it is not the list as written. */
104
+ export function EffectiveChain({ card }) {
105
+ const { t } = card;
106
+ const view = card.useWebSearchPro(snapshot => explainChain(chainInputOf(snapshot)));
107
+ const agent = card.useWebSearchPro(snapshot => agentChainOf(snapshot));
108
+ return _jsxs("div", { "data-wsp-effective": true, children: [_jsxs("p", { className: css.chain, role: "status", "data-wsp-chain": true, children: [_jsx("span", { children: t('chainNow') }), view.chain?.length ? view.chain.map((id, index) => _jsxs("span", { children: [index ? '› ' : '', _jsx("code", { children: id })] }, id + index)) : _jsx("span", { children: t('chainEmpty') })] }), _jsxs("p", { className: css.why, "data-wsp-why": true, children: [_jsx("strong", { children: t('orderWhy') }), " ", view.chain ? whyText(t, view.reasons) : t('orderWhyNone')] }), agent ? _jsxs("p", { className: css.why, "data-wsp-effective-agent": true, children: [_jsx("strong", { children: t('orderAgentChain') }), " ", agent.length ? agent.map((id, index) => _jsxs("span", { children: [index ? '› ' : '', _jsx("code", { children: id }), " "] }, id + index)) : t('orderAgentChainNone')] }) : null] });
109
+ }
110
+ // ── the general engine list ────────────────────────────────────────────────────────────────────────────────────────────────
111
+ export function EngineOrder({ card }) {
112
+ const { t } = card;
113
+ const field = useField(card, 'engines');
114
+ const adapters = card.useWebSearchPro(snapshot => snapshot.fields.cliAdapters.text);
115
+ const adaptersValue = adaptersOf(adapters);
116
+ const ids = idsOf(field.state.text);
117
+ const st = field.state;
118
+ const set = (next) => field.edit(textOf(next));
119
+ const choices = engineChoices(ids, adaptersValue).map(id => ({ value: id, label: sourceInfo(id, adaptersValue).name + (sourceInfo(id, adaptersValue).name !== id ? ' (' + id + ')' : '') }));
120
+ return _jsx(Row, { field: "engines", label: t('engines'), hint: t('enginesHint'), help: hasHelp('engines') ? t(`${labelKey('engines')}Help`) : undefined, overridden: st.overridden, invalid: st.invalid || !!st.message, problem: st.message ?? t('invalid'), warning: st.warning, disabled: field.disabled, labels: rowLabels(t), wide: true, mark: _jsx(AgentMark, { card: card, itemKey: "engines" }), children: _jsxs("div", { className: css.stack, "data-wsp-order": "engines", children: [_jsx("div", { className: css.list, role: "list", "aria-label": t('orderListLabel'), children: ids.length === 0 ? _jsx("p", { className: css.empty, children: t('orderEmpty') }) : ids.map((id, index) => _jsx(EngineRow, { card: card, id: id, index: index, ids: ids, adapters: adaptersValue, disabled: field.disabled, onChange: set }, id)) }), _jsxs("div", { className: css.orderBar, children: [_jsx(AddSelect, { name: "engine", label: t('orderAddLabel'), title: t('orderAdd'), choices: choices, disabled: field.disabled, onAdd: id => set(addId(ids, id)) }), _jsx(Btn, { disabled: field.disabled || !st.overridden, onClick: field.reset, data: "order-restore", children: t('orderRestore') })] }), _jsx(EffectiveChain, { card: card })] }) });
121
+ }
122
+ function EngineRow({ card, id, index, ids, adapters, disabled, onChange }) {
123
+ const { t } = card;
124
+ const info = sourceInfo(id, adapters);
125
+ const state = card.useWebSearchPro(snapshot => sourceState(snapshot, info, t));
126
+ return _jsx(OrderItem, { card: card, info: info, index: index, count: ids.length, adapters: adapters, state: state, disabled: disabled, onMove: delta => onChange(moveId(ids, id, delta)), onRemove: () => onChange(removeId(ids, id)) });
127
+ }
128
+ // ── platforms ────────────────────────────────────────────────────────────────────────────────────────────────────────────────
129
+ /** The chain a platform uses now: the override when there is one, else the built-in default. */
130
+ function chainFor(text, platform) {
131
+ const chains = chainsOf(text);
132
+ if (!chains)
133
+ return { ids: [...defaultChainOf(platform)], overridden: false, valid: false };
134
+ const own = chains[platform];
135
+ return own ? { ids: own, overridden: true, valid: true } : { ids: [...defaultChainOf(platform)], overridden: false, valid: true };
136
+ }
137
+ function PlatformItem({ card, platform, onEdit }) {
138
+ const { t } = card;
139
+ const text = card.useWebSearchPro(snapshot => snapshot.fields.platformBackends.text);
140
+ const disabled = card.useWebSearchPro(snapshot => !snapshot.writable);
141
+ const chain = chainFor(text, platform);
142
+ return _jsx(Item, { data: platform, title: _jsx("strong", { children: PLATFORM_NAMES[platform] ?? platform }), badges: _jsxs(_Fragment, { children: [platform in PLATFORM_NAMES && PLATFORM_NAMES[platform] !== platform ? _jsx("code", { children: platform }) : null, _jsx(Badge, { tone: chain.overridden ? 'info' : 'outline', children: chain.overridden ? t('overridden') : t('orderDefaultBadge') }), _jsx(AgentMark, { card: card, itemKey: 'platformBackends.' + platform, compact: true })] }), meta: _jsx("span", { className: chain.overridden ? undefined : css.muted, children: chain.ids.map(backendName).join(' › ') || t('platformEmpty') }), actions: _jsx(Btn, { disabled: disabled, onClick: onEdit, data: "platform-edit", children: t('edit') }) });
143
+ }
144
+ /** The body of the platform dialog: the chain as a list with its buttons, the backends that can still be added, and "Restore default". */
145
+ export function PlatformForm({ card, platform }) {
146
+ const { t } = card;
147
+ const field = useField(card, 'platformBackends');
148
+ const adapters = card.useWebSearchPro(snapshot => snapshot.fields.cliAdapters.text);
149
+ const adaptersValue = adaptersOf(adapters);
150
+ const chain = chainFor(field.state.text, platform);
151
+ const write = (ids) => {
152
+ const next = withChain(field.state.text, platform, ids);
153
+ if (next !== undefined)
154
+ field.edit(next);
155
+ };
156
+ if (!chain.valid)
157
+ return _jsx("p", { className: `${css.rowHint} wsp-bad`, role: "alert", children: t('platformChainBad') });
158
+ const choices = backendChoices(platform, chain.ids, adaptersValue).map(id => ({ value: id, label: backendName(id) + (backendName(id) !== id ? ' (' + id + ')' : '') }));
159
+ return _jsxs("div", { className: css.stack, "data-wsp-order": 'platform:' + platform, children: [_jsx("div", { className: css.list, role: "list", "aria-label": t('orderListLabel'), children: chain.ids.length === 0 ? _jsx("p", { className: css.empty, children: t('platformEmpty') }) : chain.ids.map((id, index) => _jsx(BackendRow, { card: card, platform: platform, id: id, index: index, ids: chain.ids, muted: !chain.overridden, adapters: adaptersValue, disabled: field.disabled, onChange: write }, id)) }), _jsxs("div", { className: css.orderBar, children: [_jsx(AddSelect, { name: "backend", label: t('orderAddLabel'), title: choices.length ? t('orderAdd') : t('platformAddNone'), choices: choices, disabled: field.disabled, onAdd: id => write(addId(chain.ids, id)) }), _jsx(Btn, { disabled: field.disabled || !chain.overridden, onClick: () => write(undefined), data: "platform-restore", children: t('orderRestore') }), !chain.overridden ? _jsx(Badge, { tone: "outline", children: t('orderDefaultBadge') }) : null] })] });
160
+ }
161
+ function BackendRow({ card, platform, id, index, ids, muted, adapters, disabled, onChange }) {
162
+ const { t } = card;
163
+ const custom = isCustomId(id);
164
+ const base = custom ? sourceInfo(id, adapters) : { id, name: backendName(id), kind: 'unknown' };
165
+ const info = custom ? base : { ...base, kind: 'anonymous' };
166
+ const leg = card.useWebSearchPro(snapshot => snapshot.server.status?.legs[platform + '/' + id]);
167
+ const state = card.useWebSearchPro((snapshot) => {
168
+ if (custom)
169
+ return sourceState(snapshot, info, t);
170
+ return leg ? (leg.ready ? { tone: 'success', label: t('stateReady') } : { tone: 'warning', label: t('stateNotReady'), ...leg.reason ? { reason: leg.reason } : {} }) : { tone: 'neutral', label: t('backendUnknown') };
171
+ });
172
+ return _jsx(OrderItem, { card: card, info: info, index: index, count: ids.length, adapters: adapters, state: state, fallback: leg?.confidence, muted: muted, disabled: disabled, onMove: delta => onChange(moveId(ids, id, delta)), onRemove: () => onChange(removeId(ids, id)) });
173
+ }
174
+ export function PlatformList({ card }) {
175
+ const { t } = card;
176
+ const [editing, setEditing] = useState();
177
+ const [query, setQuery] = useState('');
178
+ const split = card.useWebSearchPro(snapshot => splitPlatforms(ORDER_PLATFORMS, snapshot.fields.platformBackends.text, adaptersOf(snapshot.fields.cliAdapters.text)));
179
+ const row = (platform) => _jsx(PlatformItem, { card: card, platform: platform, onEdit: () => setEditing(platform) }, platform);
180
+ const filtering = query.trim() !== '';
181
+ const found = filterPlatforms(ORDER_PLATFORMS, query);
182
+ return _jsxs(_Fragment, { children: [_jsxs("div", { className: "wsp-filter", "data-wsp-platform-filter": true, children: [_jsx(TextInput, { value: query, onChange: setQuery, placeholder: t('orderPlatformFilter'), ariaLabel: t('orderPlatformFilterLabel') }), filtering ? _jsx("span", { className: css.rowHint, children: fill(t('orderPlatformFound'), { n: found.length, total: ORDER_PLATFORMS.length }) }) : null] }), filtering
183
+ ? _jsx("div", { className: css.list, "data-wsp-platform-list": true, children: found.length ? found.map(row) : _jsx("p", { className: css.empty, children: t('orderPlatformNone') }) })
184
+ : _jsxs(_Fragment, { children: [_jsx("div", { className: css.list, "data-wsp-platform-list": true, children: split.shown.map(row) }), split.rest.length ? _jsx(Fold, { id: "platforms-more", title: fill(t('orderPlatformsMore'), { n: split.rest.length }), hint: t('orderPlatformsMoreHint'), children: _jsx("div", { className: css.list, "data-wsp-platform-rest": true, children: split.rest.map(row) }) }) : null] }), editing ? _jsxs(Dialog, { open: true, title: fill(t('platformDialogTitle'), { name: PLATFORM_NAMES[editing] ?? editing }), closeLabel: t('close'), description: t('platformDialogNote'), onClose: () => setEditing(undefined), footer: _jsx(Btn, { primary: true, onClick: () => setEditing(undefined), data: "platform-done", children: t('done') }), children: [_jsx("p", { className: css.rowHint, children: t('dialogStagesNote') }), _jsx(PlatformForm, { card: card, platform: editing })] }) : null] });
185
+ }
186
+ // ── the group ────────────────────────────────────────────────────────────────────────────────────────────────────────────────
187
+ /** Open another group of the card (the "Sources" group holds `sources.priority` / `sources.disabled`) and scroll to it. */
188
+ function openGroup(id) {
189
+ const node = document.querySelector(`[data-wsp-group="${id}"]`);
190
+ if (!node)
191
+ return;
192
+ node.open = true;
193
+ node.scrollIntoView?.({ block: 'start', behavior: 'smooth' });
194
+ }
195
+ export function OrderGroup({ card }) {
196
+ const { t } = card;
197
+ const count = useOverriddenCount(card, ORDER_FIELDS) + card.useWebSearchPro(snapshot => Object.keys(snapshot.fields).filter(field => field.startsWith(CONFIDENCE_PREFIX) && snapshot.fields[field]?.overridden).length);
198
+ const rules = card.useWebSearchPro(snapshot => ({ priority: (snapshot.fields['sources.priority']?.text ?? '').trim(), disabled: (snapshot.fields['sources.disabled']?.text ?? '').trim() }));
199
+ return _jsxs(Group, { id: "order", title: t('groupOrder'), summary: t('groupOrderSub'), badges: count ? _jsx(Badge, { tone: "info", children: fill(t('overriddenCount'), { n: count }) }) : null, children: [_jsx(SubHead, { children: t('orderEnginesTitle') }), _jsx(EngineOrder, { card: card }), _jsxs("p", { className: css.rowHint, "data-wsp-order-rules": true, children: [_jsxs("strong", { children: [t('orderRulesTitle'), "."] }), " ", t('orderRulesNote'), " ", fill(t('orderPriorityNow'), { ids: rules.priority || t('orderNone') }), " \u00B7 ", fill(t('orderDisabledNow'), { ids: rules.disabled || t('orderNone') }), " \u00B7 ", _jsx("button", { type: "button", className: css.link, onClick: () => openGroup('sources'), "data-wsp-open-sources": true, children: t('orderRulesLink') })] }), _jsx(SubHead, { children: t('orderPlatformsTitle') }), _jsx("p", { className: css.rowHint, children: t('orderPlatformsNote') }), _jsx(PlatformList, { card: card })] });
200
+ }
201
+ //# sourceMappingURL=group-order.js.map