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.
Files changed (266) hide show
  1. package/CHANGELOG.md +179 -0
  2. package/README.md +197 -32
  3. package/assets/skills/dsh-web-search-pro/SKILL.md +14 -13
  4. package/assets/skills/dsh-web-search-pro/references/config.md +36 -0
  5. package/assets/skills/dsh-web-search-pro/references/sources.md +19 -4
  6. package/assets/skills/dsh-web-search-pro/references/troubleshooting.md +3 -1
  7. package/catalog/sources.v1.json +22 -12
  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 +12 -6
  27. package/lib/actions/search.js.map +1 -1
  28. package/lib/actions/sources.js +116 -41
  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 +341 -0
  39. package/lib/cli/builtin-specs.js.map +1 -0
  40. package/lib/cli/chain.js +193 -0
  41. package/lib/cli/chain.js.map +1 -0
  42. package/lib/cli/chains-spec.js +118 -0
  43. package/lib/cli/chains-spec.js.map +1 -0
  44. package/lib/cli/engine.js +99 -0
  45. package/lib/cli/engine.js.map +1 -0
  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 +153 -0
  49. package/lib/cli/opencli.js.map +1 -0
  50. package/lib/cli/probe.js +128 -0
  51. package/lib/cli/probe.js.map +1 -0
  52. package/lib/cli/runner.js +564 -0
  53. package/lib/cli/runner.js.map +1 -0
  54. package/lib/cli/spec.js +496 -0
  55. package/lib/cli/spec.js.map +1 -0
  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 +15 -1
  77. package/lib/client/form-specs.js.map +1 -1
  78. package/lib/client/form.js +296 -27
  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 -215
  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 +22 -0
  116. package/lib/client/validators.js.map +1 -1
  117. package/lib/client.js +9151 -1987
  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 +87 -107
  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 +109 -102
  128. package/lib/deps.js.map +1 -1
  129. package/lib/engine-error.js +19 -0
  130. package/lib/engine-error.js.map +1 -0
  131. package/lib/engines.js +32 -115
  132. package/lib/engines.js.map +1 -1
  133. package/lib/fetch.js +23 -4
  134. package/lib/fetch.js.map +1 -1
  135. package/lib/index.js +30 -5
  136. package/lib/index.js.map +1 -1
  137. package/lib/overlay-types.js +88 -0
  138. package/lib/overlay-types.js.map +1 -0
  139. package/lib/overlay.js +683 -0
  140. package/lib/overlay.js.map +1 -0
  141. package/lib/pipeline/candidates.js +27 -1
  142. package/lib/pipeline/candidates.js.map +1 -1
  143. package/lib/pipeline/compile.js +63 -0
  144. package/lib/pipeline/compile.js.map +1 -1
  145. package/lib/pipeline/confidence.js +64 -0
  146. package/lib/pipeline/confidence.js.map +1 -0
  147. package/lib/pipeline/fusion.js +50 -3
  148. package/lib/pipeline/fusion.js.map +1 -1
  149. package/lib/pipeline/plan.js +2 -2
  150. package/lib/pipeline/plan.js.map +1 -1
  151. package/lib/pipeline/render.js +20 -2
  152. package/lib/pipeline/render.js.map +1 -1
  153. package/lib/pipeline/run.js +21 -7
  154. package/lib/pipeline/run.js.map +1 -1
  155. package/lib/pipeline/sources-spec.js +19 -3
  156. package/lib/pipeline/sources-spec.js.map +1 -1
  157. package/lib/providers/builtin.js +13 -14
  158. package/lib/providers/builtin.js.map +1 -1
  159. package/lib/providers/deepseek.js +348 -0
  160. package/lib/providers/deepseek.js.map +1 -0
  161. package/lib/providers/http.js.map +1 -1
  162. package/lib/providers/keyed-meta.js +7 -0
  163. package/lib/providers/keyed-meta.js.map +1 -1
  164. package/lib/providers/platforms.js +118 -58
  165. package/lib/providers/platforms.js.map +1 -1
  166. package/lib/providers/registry.js.map +1 -1
  167. package/lib/restart.js +47 -0
  168. package/lib/restart.js.map +1 -0
  169. package/lib/router.js +203 -27
  170. package/lib/router.js.map +1 -1
  171. package/lib/rpc-types.js +15 -0
  172. package/lib/rpc-types.js.map +1 -0
  173. package/lib/rpc.js +85 -0
  174. package/lib/rpc.js.map +1 -0
  175. package/lib/tools.js +10 -4
  176. package/lib/tools.js.map +1 -1
  177. package/lib/types/actions/approval.d.ts +11 -0
  178. package/lib/types/actions/config.d.ts +54 -0
  179. package/lib/types/actions/format.d.ts +9 -2
  180. package/lib/types/actions/run.d.ts +1 -0
  181. package/lib/types/actions/schema.d.ts +7 -1
  182. package/lib/types/actions/sources.d.ts +29 -3
  183. package/lib/types/actions/types.d.ts +28 -2
  184. package/lib/types/browser-access.d.ts +17 -0
  185. package/lib/types/catalog/recommend.d.ts +4 -0
  186. package/lib/types/catalog/schema.d.ts +2 -0
  187. package/lib/types/cli/builtin-specs.d.ts +38 -0
  188. package/lib/types/cli/chain.d.ts +83 -0
  189. package/lib/types/cli/chains-spec.d.ts +48 -0
  190. package/lib/types/cli/engine.d.ts +50 -0
  191. package/lib/types/cli/opencli-sites.d.ts +24 -0
  192. package/lib/types/cli/opencli.d.ts +77 -0
  193. package/lib/types/cli/probe.d.ts +53 -0
  194. package/lib/types/cli/runner.d.ts +126 -0
  195. package/lib/types/cli/spec.d.ts +269 -0
  196. package/lib/types/cli/time-text.d.ts +12 -0
  197. package/lib/types/cli/trial.d.ts +19 -0
  198. package/lib/types/client/SettingsCard.d.ts +17 -1
  199. package/lib/types/client/agent-mark.d.ts +22 -0
  200. package/lib/types/client/card-frame.d.ts +35 -0
  201. package/lib/types/client/cli-form.d.ts +97 -0
  202. package/lib/types/client/field-docs.d.ts +15 -0
  203. package/lib/types/client/field-keys.d.ts +41 -0
  204. package/lib/types/client/field-rows.d.ts +70 -0
  205. package/lib/types/client/fill.d.ts +2 -0
  206. package/lib/types/client/form-specs.d.ts +12 -3
  207. package/lib/types/client/form.d.ts +79 -1
  208. package/lib/types/client/group-advanced.d.ts +9 -0
  209. package/lib/types/client/group-agent.d.ts +20 -0
  210. package/lib/types/client/group-cli.d.ts +52 -0
  211. package/lib/types/client/group-common.d.ts +12 -0
  212. package/lib/types/client/group-judge.d.ts +17 -0
  213. package/lib/types/client/group-order.d.ts +26 -0
  214. package/lib/types/client/group-runtime.d.ts +15 -0
  215. package/lib/types/client/group-sources.d.ts +46 -0
  216. package/lib/types/client/groups-basic.d.ts +18 -0
  217. package/lib/types/client/index.d.ts +8 -0
  218. package/lib/types/client/json-list.d.ts +21 -0
  219. package/lib/types/client/locales.d.ts +1079 -196
  220. package/lib/types/client/order.d.ts +102 -0
  221. package/lib/types/client/overlay-ops.d.ts +37 -0
  222. package/lib/types/client/styles.d.ts +56 -41
  223. package/lib/types/client/text-view.d.ts +22 -0
  224. package/lib/types/client/ui-kit.d.ts +200 -0
  225. package/lib/types/client/validators.d.ts +6 -0
  226. package/lib/types/config-fillers.d.ts +9 -0
  227. package/lib/types/config-groups.d.ts +23 -0
  228. package/lib/types/config.d.ts +265 -216
  229. package/lib/types/default-chain.d.ts +63 -0
  230. package/lib/types/deps.d.ts +25 -23
  231. package/lib/types/engine-error.d.ts +12 -0
  232. package/lib/types/engines.d.ts +45 -10
  233. package/lib/types/fetch.d.ts +12 -3
  234. package/lib/types/index.d.ts +164 -146
  235. package/lib/types/overlay-types.d.ts +98 -0
  236. package/lib/types/overlay.d.ts +141 -0
  237. package/lib/types/pipeline/candidates.d.ts +19 -0
  238. package/lib/types/pipeline/compile.d.ts +11 -0
  239. package/lib/types/pipeline/confidence.d.ts +35 -0
  240. package/lib/types/pipeline/fusion.d.ts +23 -1
  241. package/lib/types/pipeline/render.d.ts +16 -0
  242. package/lib/types/pipeline/run.d.ts +3 -1
  243. package/lib/types/pipeline/sources-spec.d.ts +5 -2
  244. package/lib/types/pipeline/types.d.ts +37 -0
  245. package/lib/types/providers/deepseek.d.ts +130 -0
  246. package/lib/types/providers/http.d.ts +2 -1
  247. package/lib/types/providers/keyed-meta.d.ts +5 -0
  248. package/lib/types/providers/platforms.d.ts +15 -3
  249. package/lib/types/providers/registry.d.ts +10 -0
  250. package/lib/types/restart.d.ts +52 -0
  251. package/lib/types/router.d.ts +69 -9
  252. package/lib/types/rpc-types.d.ts +79 -0
  253. package/lib/types/rpc.d.ts +41 -0
  254. package/lib/types/tools.d.ts +6 -0
  255. package/lib/types/util.d.ts +16 -1
  256. package/lib/util.js +17 -4
  257. package/lib/util.js.map +1 -1
  258. package/package.json +51 -43
  259. package/scripts/check-client-bundle.mjs +1 -1
  260. package/scripts/cli-login-check.mjs +214 -0
  261. package/lib/client/RubricEditor.js +0 -47
  262. package/lib/client/RubricEditor.js.map +0 -1
  263. package/lib/client/fields.js +0 -31
  264. package/lib/client/fields.js.map +0 -1
  265. package/lib/types/client/RubricEditor.d.ts +0 -6
  266. package/lib/types/client/fields.d.ts +0 -65
@@ -0,0 +1,341 @@
1
+ /**
2
+ * The built-in CLI adapter specs (dev-plan M12). Every argv, flag and output field was derived from the tool's own
3
+ * `--help` (and, where the help does not show the output shape, from the installed package source or the upstream
4
+ * README), and `verification` records how far each was checked:
5
+ * - `live`: a real read-only search was run and its output parsed (bili, gh, omnireach, yt-dlp, wx-search-cli, xhs; the standalone
6
+ * opencli for the twitter and zhihu sites, see opencli-sites.ts; and Exa through mcporter, which is not a spec);
7
+ * - `contract-only`: help and version probed on a real install, output shape taken from the tool's own source,
8
+ * README or documented output option, because a search needs the user's login or reads browser cookies
9
+ * (zhihu, rdt, twitter, the other opencli sites);
10
+ * - `docs-only`: not installed here; derived from the upstream README (tanso).
11
+ * Fixtures for the contract-only and docs-only parsers are marked "constructed from help/docs" in test/fixtures/cli.
12
+ * @module web-search-pro/cli/builtin-specs
13
+ */
14
+ import { OPENCLI_SITE_OF, opencliSiteVerification } from "./opencli-sites.js";
15
+ import { validateCliAdapterSpec } from "./spec.js";
16
+ export const BILI_CLI_VERSION = '0.6.2';
17
+ export const BILI_CLI_REVISION = '489607468f967e0e11f3cdff6efc022d011e982a';
18
+ export const BILI_CLI_SOURCE = `git+https://github.com/public-clis/bilibili-cli@${BILI_CLI_REVISION}`;
19
+ export const BILI_CLI_INSTALLS = [
20
+ { installer: 'uv', command: `uv tool install --force ${BILI_CLI_SOURCE}` },
21
+ { installer: 'pipx', command: `pipx install --force ${BILI_CLI_SOURCE}` },
22
+ { installer: 'pip', command: `pip install --force-reinstall ${BILI_CLI_SOURCE}` },
23
+ ];
24
+ export const TWITTER_CLI_INSTALLS = [
25
+ { installer: 'uv', command: 'uv tool install twitter-cli' },
26
+ { installer: 'pipx', command: 'pipx install twitter-cli' },
27
+ { installer: 'pip', command: 'pip install twitter-cli' },
28
+ ];
29
+ /** The date of the checks recorded below. */
30
+ export const SPEC_CHECK_DATE = '2026-10-06';
31
+ const MB = 1024 * 1024;
32
+ /** The versioned `{ ok, schema_version, data }` envelope of the agent-friendly Python CLIs (bili, xhs, rdt). */
33
+ const ENVELOPE = [{ path: 'ok', equals: true }, { path: 'schema_version', equals: '1' }];
34
+ /** Why a login-needing CLI is gated on its saved login files: it reads the browser's cookies by itself when it has none. */
35
+ const NOT_LOGGED_IN = ['not authenticated', 'not_authenticated', 'not logged in', 'login required', 'please log in', "no 'a1' cookie", 'no cookies'];
36
+ const bili = {
37
+ id: 'bili',
38
+ bins: ['bili'],
39
+ packageNote: `bilibili-cli from public-clis/bilibili-cli ${BILI_CLI_VERSION} (the PyPI package of the same name has another contract; sources.deps shows the pinned install)`,
40
+ platforms: ['bilibili'],
41
+ probe: { versionArgs: ['--version'], minVersion: BILI_CLI_VERSION, helpArgs: ['search', '--help'], mustContain: ['--type', '--max', '--json'] },
42
+ allowedSubcommands: ['search'],
43
+ search: {
44
+ argv: ['search', '{query}', '--type', 'video', '--max', '{count}', '--json'],
45
+ maxCount: 10,
46
+ // About one entry in five is a course / series without a bvid or link and is skipped: ask for a few more so the count is met.
47
+ overfetch: 3,
48
+ output: {
49
+ format: 'json', itemsPath: 'data', expect: ENVELOPE, errorPaths: ['message', 'error'], stripTags: true, snippetMax: 300,
50
+ fields: {
51
+ // Entries without a bvid (courses, series) carry no link in the JSON: the item's own link field is used when the tool gives one, else it is skipped and reported.
52
+ url: [{ template: 'https://www.bilibili.com/video/{bvid}' }, 'url', 'link', 'arcurl'],
53
+ title: 'title',
54
+ snippet: { join: [{ path: 'author', prefix: 'UP: ' }, { path: 'play', prefix: '播放: ' }, 'duration'] },
55
+ },
56
+ },
57
+ },
58
+ env: {},
59
+ needsLogin: false,
60
+ timeoutMs: 30_000,
61
+ maxOutputBytes: 4 * MB,
62
+ verification: { status: 'live', version: BILI_CLI_VERSION, date: '2026-10-26', note: 'zh / en / special-character searches parsed (fixtures live-bili-*); about one entry in five is a course / series without a bvid and link, so the adapter asks for 3 more than the count (overfetch) and a count of 3 stays 3. `bili search` never reads credentials or browser cookies (checked in bili_cli/auth.py and commands/user_search.py)' },
63
+ };
64
+ const ytDlp = {
65
+ id: 'yt-dlp',
66
+ bins: ['yt-dlp'],
67
+ packageNote: 'yt-dlp (uv tool install yt-dlp)',
68
+ platforms: ['youtube'],
69
+ probe: { versionArgs: ['--version'], helpArgs: ['--help'], mustContain: ['--flat-playlist', '--print', '--skip-download'] },
70
+ allowedSubcommands: [],
71
+ search: {
72
+ argv: ['ytsearch{count}:{query}', '--flat-playlist', '--skip-download', '--no-warnings', '--print', '%(id)s\t%(title)s\t%(channel)s\t%(view_count)s\t%(duration>%H:%M:%S)s'],
73
+ maxCount: 10,
74
+ output: {
75
+ // A field yt-dlp does not have (a live stream has no view count or duration) prints as its NA placeholder; duration is H:M:S because
76
+ // duration_string prints bare seconds ("11") for short videos.
77
+ format: 'text', lines: { mode: 'tsv', columns: ['id', 'title', 'channel', 'view_count', 'duration'] }, emptyValues: ['NA', 'None'], requireTitle: true,
78
+ fields: {
79
+ url: { template: 'https://www.youtube.com/watch?v={id}' },
80
+ title: 'title',
81
+ snippet: { join: ['channel', { path: 'view_count', suffix: ' views' }, 'duration'] },
82
+ },
83
+ },
84
+ },
85
+ env: {},
86
+ needsLogin: false,
87
+ timeoutMs: 60_000,
88
+ maxOutputBytes: 4 * MB,
89
+ verification: { status: 'live', version: '2026.08.19', date: '2026-10-26', note: 'zh / en / special-character / empty / live-stream searches parsed (fixtures live-yt-dlp-*). Live streams have no view count or duration: yt-dlp prints NA for them (the 2026-10-11 spec listed only None, so snippets read "NA views | NA"); duration is now H:M:S (duration_string printed a bare "11" for an 11 s video). Stdout held only the records, the Python 3.10 deprecation notice went to stderr' },
90
+ };
91
+ const twitter = {
92
+ id: 'twitter',
93
+ bins: ['twitter'],
94
+ packageNote: 'twitter-cli (PyPI twitter-cli; the command is `twitter`; Agent-Reach alone does not provide it)',
95
+ platforms: ['twitter'],
96
+ // Without --json the tool prints YAML when stdout is not a terminal (twitter_cli/output.py), so the flag must exist.
97
+ probe: { versionArgs: ['--version'], helpArgs: ['search', '--help'], mustContain: ['--json', '--max'], contractHint: 'twitter-cli 0.8.5 is the oldest version known to offer --json on search' },
98
+ allowedSubcommands: ['search'],
99
+ search: {
100
+ argv: ['search', '{query}', '-n', '{count}', '--json'],
101
+ maxCount: 10,
102
+ output: {
103
+ // `{ ok, schema_version, data: [tweet] }`; a failure is `{ ok: false, error: { code, message } }`. A tweet has no permalink: it is built from the author and the id.
104
+ format: 'json', itemsPath: 'data', expect: ENVELOPE, errorPaths: ['error.message'], titleMax: 200,
105
+ fields: {
106
+ url: { template: 'https://x.com/{author.screenName}/status/{id}' },
107
+ title: ['text', { template: '{author.name} (@{author.screenName})' }],
108
+ snippet: { join: [{ template: '{author.name} (@{author.screenName})' }, { path: 'metrics.likes', prefix: 'likes ' }, { path: 'metrics.retweets', prefix: 'retweets ' }, { path: 'metrics.views', prefix: 'views ' }, 'createdAtISO'], sep: ' · ' },
109
+ publishedAt: 'createdAtISO',
110
+ },
111
+ },
112
+ // The tool's own error codes and messages (exceptions.py, auth.py): code not_authenticated, "No Twitter cookies found.", "Cookie expired or invalid (HTTP 401)".
113
+ notLoggedInPatterns: ['not_authenticated', 'not authenticated', 'no twitter cookies', 'cookie expired or invalid'],
114
+ },
115
+ env: { required: ['TWITTER_AUTH_TOKEN', 'TWITTER_CT0'] },
116
+ needsLogin: true,
117
+ timeoutMs: 45_000,
118
+ maxOutputBytes: 4 * MB,
119
+ verification: { status: 'contract-only', version: '0.8.5', date: '2026-10-11', note: 'contract from the installed twitter-cli 0.8.5 source (`--json` envelope, tweet_to_dict fields, error payload) plus the real output reported in issue #38; the plugin itself has not run a search (it needs your tokens). Before 0.2.2 the spec parsed the default output, which is YAML when piped (issue #38)' },
120
+ };
121
+ const xhs = {
122
+ id: 'xhs',
123
+ bins: ['xhs'],
124
+ packageNote: 'xiaohongshu-cli (PyPI xiaohongshu-cli; the command is `xhs`)',
125
+ platforms: ['xiaohongshu'],
126
+ probe: { versionArgs: ['--version'], helpArgs: ['search', '--help'], mustContain: ['keyword', '--json', '--sort'] },
127
+ allowedSubcommands: ['search'],
128
+ search: {
129
+ argv: ['search', '{query}', '--json'],
130
+ output: {
131
+ format: 'json', itemsPath: 'data.items', expect: ENVELOPE, errorPaths: ['error.message'],
132
+ // The result list also carries `hot_query` suggestion cards ("大家都在搜": an id and a token, but no note_card): not results. Excluded by what they are, so a note that lacks model_type still counts.
133
+ skipWhen: { path: 'model_type', equals: 'hot_query' },
134
+ fields: {
135
+ url: { template: 'https://www.xiaohongshu.com/explore/{id}?xsec_token={xsec_token}&xsec_source=pc_search' },
136
+ title: ['note_card.display_title', 'note_card.title'],
137
+ snippet: { join: [{ path: 'note_card.user.nickname', prefix: '作者: ' }, { path: 'note_card.interact_info.liked_count', prefix: '赞: ' }] },
138
+ // `corner_tag_info` holds `{ type: 'publish_time', text: '08-26' }` ('2025-12-01' for an older year); read conservatively, a text that is not a known format gives no time.
139
+ publishedAt: { time: 'note_card.corner_tag_info.type=publish_time.text' },
140
+ },
141
+ },
142
+ notLoggedInPatterns: NOT_LOGGED_IN,
143
+ },
144
+ env: {},
145
+ needsLogin: true,
146
+ login: { command: 'xhs login', savedCredentialPaths: ['~/.xiaohongshu-cli/cookies.json'], readsBrowserCookiesWithoutLogin: true },
147
+ timeoutMs: 45_000,
148
+ maxOutputBytes: 4 * MB,
149
+ verification: { status: 'live', version: '0.6.4', date: '2026-10-27', note: 'a real `xhs search --json` run with the user\'s own saved login and parsed (fixture live-xhs-search.json, synthetic content in the real shape): 22 items for a count of 3, two of the 22 are hot_query suggestion cards (skipped by model_type); the publish time is in note_card.corner_tag_info (MM-DD or YYYY-MM-DD). Without a saved login the tool reads browser cookies by itself, so the plugin never runs it then' },
150
+ };
151
+ const zhihu = {
152
+ id: 'zhihu',
153
+ bins: ['zhihu'],
154
+ packageNote: 'zhihu-cli (PyPI pyzhihu-cli, BAIGUANGMEI/zhihu-cli; the command is `zhihu`; not the Access-Secret "zhihu-cli" of dawnswwwww)',
155
+ platforms: ['zhihu'],
156
+ probe: { versionArgs: ['--version'], helpArgs: ['search', '--help'], mustContain: ['query', '--json', '--limit', '--type'] },
157
+ allowedSubcommands: ['search'],
158
+ search: {
159
+ argv: ['search', '{query}', '--limit', '{count}', '--answers', '0', '--json'],
160
+ maxCount: 20,
161
+ output: {
162
+ format: 'json', itemsPath: 'data', stripTags: true,
163
+ fields: {
164
+ url: [
165
+ { template: 'https://www.zhihu.com/question/{object.question.id}/answer/{object.id}', when: { path: 'object.type', equals: 'answer' } },
166
+ { template: 'https://zhuanlan.zhihu.com/p/{object.id}', when: { path: 'object.type', equals: 'article' } },
167
+ { template: 'https://www.zhihu.com/question/{object.id}', when: { path: 'object.type', equals: 'question' } },
168
+ ],
169
+ title: ['object.title', 'object.question.name', 'object.name'],
170
+ snippet: ['object.excerpt', 'object.content'],
171
+ publishedAt: { epoch: 'object.created_time' },
172
+ },
173
+ },
174
+ notLoggedInPatterns: ['not authenticated', 'zhihu login'],
175
+ },
176
+ env: {},
177
+ needsLogin: true,
178
+ login: { command: 'zhihu login', savedCredentialPaths: ['~/.zhihu-cli/cookies.json'] },
179
+ timeoutMs: 45_000,
180
+ maxOutputBytes: 4 * MB,
181
+ verification: { status: 'contract-only', version: '0.2.4', date: SPEC_CHECK_DATE, note: 'help probed; output shape (`data[].object`) from the installed package source; the tool never reads browser cookies itself; no search was run (needs your login)' },
182
+ };
183
+ const rdt = {
184
+ id: 'rdt',
185
+ bins: ['rdt'],
186
+ packageNote: 'rdt-cli (public-clis/rdt-cli; the command is `rdt`)',
187
+ platforms: ['reddit'],
188
+ probe: { versionArgs: ['--version'], helpArgs: ['search', '--help'], mustContain: ['query', '--json', '--compact', '--limit'] },
189
+ allowedSubcommands: ['search'],
190
+ search: {
191
+ argv: ['search', '{query}', '--limit', '{count}', '--compact', '--json'],
192
+ maxCount: 25,
193
+ output: {
194
+ format: 'json', itemsPath: 'data', expect: ENVELOPE, errorPaths: ['error.message'],
195
+ fields: {
196
+ url: { template: 'https://www.reddit.com{permalink}' },
197
+ title: 'title',
198
+ snippet: { join: [{ path: 'subreddit', prefix: 'r/' }, { path: 'score', prefix: 'score ' }, { path: 'num_comments', suffix: ' comments' }, 'selftext'] },
199
+ publishedAt: { epoch: 'created_utc' },
200
+ },
201
+ },
202
+ notLoggedInPatterns: NOT_LOGGED_IN,
203
+ },
204
+ env: {},
205
+ needsLogin: true,
206
+ login: { command: 'rdt login', savedCredentialPaths: ['~/.config/rdt-cli/credential.json'], readsBrowserCookiesWithoutLogin: true },
207
+ timeoutMs: 45_000,
208
+ maxOutputBytes: 4 * MB,
209
+ verification: { status: 'contract-only', version: '0.4.2', date: SPEC_CHECK_DATE, note: 'help probed; `--compact --json` output (post dicts in the `data` envelope) from the installed package source; no search was run: without a saved login it reads browser cookies' },
210
+ };
211
+ const OMNIREACH_OUTPUT = {
212
+ // The bilibili source writes a lone "-" when a video has no description.
213
+ format: 'json', itemsPath: 'results', errorPaths: ['errors.0.error'], stripTags: true, emptyValues: ['-'],
214
+ fields: { url: 'url', title: 'title', snippet: 'content', publishedAt: 'ts' },
215
+ };
216
+ /** The omnireach sources that need neither a key, a login nor a browser (the others are `heavy` / booster tiers or need a URL query). */
217
+ export const OMNIREACH_KEYLESS_SOURCES = 'hackernews,youtube,github,wechat,bilibili';
218
+ const omnireach = {
219
+ id: 'omnireach',
220
+ bins: ['omnireach'],
221
+ packageNote: 'omnireach (Python, Daily-AC/omnireach; uv tool install from its repository)',
222
+ platforms: ['omnireach', 'wechat'],
223
+ probe: { versionArgs: ['--version'], minVersion: '0.19.0', helpArgs: ['search', '--help'], mustContain: ['--on', '--limit', '--json'] },
224
+ allowedSubcommands: ['search'],
225
+ // The multi-source search. Never the tool's own automatic routing: with `opencli` on PATH (or its Chrome bridge set up) that adds
226
+ // browser-backed Google and Twitter/X sources, which drive the user's logged-in Chrome (observed live 2026-10-26). `--on` names the
227
+ // keyless HTTP / CLI sources explicitly, and explicit sources are never augmented.
228
+ search: { argv: ['search', '{query}', '--on', OMNIREACH_KEYLESS_SOURCES, '--limit', '{count}', '--json'], maxCount: 20, output: OMNIREACH_OUTPUT },
229
+ searches: {
230
+ // WeChat official accounts through Sogou: no key, no login, no browser (the tool prefers Exa when EXA_API_KEY is set, which this adapter never passes).
231
+ wechat: { argv: ['search', '{query}', '--on', 'wechat', '--limit', '{count}', '--json'], maxCount: 10, output: OMNIREACH_OUTPUT },
232
+ },
233
+ env: {},
234
+ needsLogin: false,
235
+ timeoutMs: 60_000,
236
+ maxOutputBytes: 8 * MB,
237
+ verification: { status: 'live', version: '0.19.0-alpha', date: '2026-10-26', note: '`--on wechat` (2026-10-06, fixture omnireach-wechat.json) and the multi-source command with an explicit `--on hackernews,youtube,github,wechat,bilibili` (fixtures live-omnireach-multi-*.json) parsed. Its automatic routing added browser-backed google / twitter sources through opencli (they drive the user\'s Chrome), so the adapter never uses it' },
238
+ };
239
+ const GH_REPO_FIELDS = 'fullName,description,url,stargazersCount,language,updatedAt,forksCount';
240
+ const gh = {
241
+ id: 'gh',
242
+ bins: ['gh'],
243
+ packageNote: 'GitHub CLI (https://cli.github.com; brew install gh / winget install GitHub.cli)',
244
+ platforms: ['github', 'github-issues', 'github-code'],
245
+ probe: { versionArgs: ['--version'], helpArgs: ['search', 'repos', '--help'], mustContain: ['--json', '--limit', 'stargazersCount'] },
246
+ allowedSubcommands: ['search', 'repos', 'issues', 'code'],
247
+ search: {
248
+ argv: ['search', 'repos', '--json', GH_REPO_FIELDS, '--limit', '{count}', '--sort', 'stars', '--order', 'desc', '--', '{terms}'],
249
+ maxCount: 15,
250
+ output: {
251
+ format: 'json', stripTags: false,
252
+ fields: {
253
+ url: 'url', title: 'fullName', publishedAt: { date: 'updatedAt' },
254
+ snippet: { join: ['description', { path: 'stargazersCount', prefix: '⭐' }, { path: 'language', prefix: '[', suffix: ']' }, { path: 'forksCount', prefix: 'forks ' }] },
255
+ },
256
+ },
257
+ notLoggedInPatterns: ['gh auth login', 'not logged in', 'authentication required'],
258
+ },
259
+ searches: {
260
+ 'github-issues': {
261
+ argv: ['search', 'issues', '--json', 'title,url,state,repository,commentsCount,updatedAt', '--limit', '{count}', '--sort', 'updated', '--order', 'desc', '--', '{terms}'],
262
+ maxCount: 15,
263
+ output: {
264
+ format: 'json',
265
+ fields: {
266
+ url: 'url', title: 'title', publishedAt: { date: 'updatedAt' },
267
+ snippet: { join: [{ path: 'state', prefix: '[', suffix: ']' }, 'repository.nameWithOwner', { path: 'commentsCount', suffix: ' comments' }], sep: ' · ' },
268
+ },
269
+ },
270
+ notLoggedInPatterns: ['gh auth login', 'not logged in', 'authentication required'],
271
+ },
272
+ 'github-code': {
273
+ argv: ['search', 'code', '--json', 'path,repository,url', '--limit', '{count}', '--', '{terms}'],
274
+ maxCount: 15,
275
+ output: { format: 'json', fields: { url: 'url', title: { template: '{repository.nameWithOwner} / {path}' }, snippet: { template: '仓库: {repository.nameWithOwner}' } } },
276
+ notLoggedInPatterns: ['gh auth login', 'not logged in', 'authentication required'],
277
+ },
278
+ },
279
+ env: { passthrough: ['GH_TOKEN', 'GITHUB_TOKEN', 'GH_HOST', 'GH_CONFIG_DIR'] },
280
+ needsLogin: true,
281
+ login: { command: 'gh auth login' },
282
+ timeoutMs: 30_000,
283
+ maxOutputBytes: 4 * MB,
284
+ verification: { status: 'live', version: '2.101.0', date: '2026-10-26', note: 'repos, issues and code searches run (zh / en / qualifier / empty) and parsed (fixtures live-gh-*); the query is passed as separate words ({terms}) because gh quotes a one-token query as an exact phrase (found nothing for four-word queries, broke `repo:x words`). Needs the user\'s own gh login (a token, never a browser cookie)' },
285
+ };
286
+ const wxSearchCli = {
287
+ id: 'wx-search-cli',
288
+ bins: ['wx-search-cli'],
289
+ packageNote: 'wx-search-cli (npm i -g wx-search-cli, tjx666/wx-search-cli; the command is `wx-search-cli`)',
290
+ platforms: ['wechat'],
291
+ probe: { versionArgs: ['--version'], helpArgs: ['--help'], mustContain: ['search <query>', 'sogou'] },
292
+ allowedSubcommands: ['search'],
293
+ search: {
294
+ argv: ['search', '{query}'],
295
+ // `real_url` is the resolved mp.weixin.qq.com link; it is empty when Sogou showed a captcha, and such items are dropped.
296
+ output: { format: 'json', fields: { url: 'real_url', title: 'title', publishedAt: 'publish_time' } },
297
+ },
298
+ env: {},
299
+ needsLogin: false,
300
+ timeoutMs: 45_000,
301
+ maxOutputBytes: 2 * MB,
302
+ verification: { status: 'live', version: '0.1.0', date: '2026-10-26', note: '`search` run for Chinese, English and special-character / nonsense queries and parsed (fixtures live-wx-search-cli-*): a JSON array of 10 { title, link, real_url, publish_time, page } per page, whatever the requested count (the adapter cuts it). Sogou anti-spider answers `[]` with exit 0 in this mode, indistinguishable from no hits' },
303
+ };
304
+ const tanso = {
305
+ id: 'tanso',
306
+ bins: ['tanso'],
307
+ packageNote: 'tanso (npm i -g @geekjourneyx/tanso, geekjourneyx/tanso; a Go binary; needs your Bocha / Zhihu keys in its own config)',
308
+ platforms: ['tanso'],
309
+ probe: { versionArgs: ['version'], helpArgs: ['--help'], mustContain: ['bocha', 'zhihu', '--json'] },
310
+ allowedSubcommands: ['version'],
311
+ search: {
312
+ // Only the two sources the README shows with --source; the Volcengine answer source (a paid model call) is never selected.
313
+ argv: ['{query}', '--json', '--source', 'bocha_web', '--source', 'zhihu_search'],
314
+ output: { format: 'json', itemsPath: 'results', errorPaths: ['errors.0.message', 'errors.0'], fields: { url: 'url', title: 'title', snippet: 'snippet' } },
315
+ notLoggedInPatterns: ['credential', 'api_key', 'access_secret', 'config error'],
316
+ },
317
+ env: { passthrough: ['BOCHA_API_KEY', 'ZHIHU_ACCESS_SECRET', 'ZHIHU_API_KEY', 'TANSO_CONFIG', 'XDG_CONFIG_HOME'] },
318
+ needsLogin: true,
319
+ login: { command: 'tanso config init' },
320
+ timeoutMs: 60_000,
321
+ maxOutputBytes: 2 * MB,
322
+ verification: { status: 'docs-only', version: '2.0.2', date: SPEC_CHECK_DATE, note: 'not installed here; from the upstream README (envelope with results[].{source,title,url,snippet}); --limit is not documented and not used' },
323
+ };
324
+ /** The `wechat` platform's two tools and the multi-source `omnireach` platform come from the same specs; ids are the backend ids. */
325
+ export const BUILTIN_CLI_SPECS = [bili, ytDlp, twitter, xhs, zhihu, rdt, omnireach, gh, wxSearchCli, tanso];
326
+ for (const spec of BUILTIN_CLI_SPECS) {
327
+ const result = validateCliAdapterSpec(spec, 'builtin');
328
+ if (!result.ok)
329
+ throw new Error('built-in CLI spec ' + spec.id + ' is invalid: ' + result.errors.join('; '));
330
+ }
331
+ /**
332
+ * How far the adapter of a command (by its first bin name) was verified: a built-in spec's own record, and for the standalone
333
+ * OpenCLI that of the site of `platform` (`live` for twitter and zhihu), else `contract-only`.
334
+ */
335
+ export function cliVerificationOf(bin, platform) {
336
+ if (bin === 'opencli')
337
+ return (platform && OPENCLI_SITE_OF[platform] ? opencliSiteVerification(OPENCLI_SITE_OF[platform]).status : undefined) ?? 'contract-only';
338
+ return BUILTIN_CLI_SPECS.find(spec => spec.bins[0] === bin)?.verification?.status;
339
+ }
340
+ export const builtinSpecById = (id) => BUILTIN_CLI_SPECS.find(spec => spec.id === id);
341
+ //# sourceMappingURL=builtin-specs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtin-specs.js","sourceRoot":"","sources":["../../src/cli/builtin-specs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Platform backend chains (dev-plan M12): every platform provider resolves an ORDERED chain of backends - a standalone CLI
3
+ * spec (xhs, rdt, zhihu, twitter, bili, yt-dlp, omnireach, gh, ...), the standalone OpenCLI (`opencli`), the dsh-browser
4
+ * OpenCLI bridge (`browser-opencli`), dsh-browser's rendered search page (`browser-search`), or the plugin's REST client
5
+ * (`rest`). The order is configurable (`platformBackends`). A backend that is missing, incompatible or not logged in is
6
+ * skipped with its reason; the provider is unavailable only when the whole chain is, and its error names what to install
7
+ * or run. Readiness is local: no search, no login.
8
+ * @module web-search-pro/cli/chain
9
+ */
10
+ import { githubCodeEngine, githubEngine, githubIssuesEngine, opencliEngine, playwrightPlatformEngine, } from "../engines.js";
11
+ import { browserGap } from "../browser-access.js";
12
+ import { BUILTIN_CLI_SPECS } from "./builtin-specs.js";
13
+ import { backendServes, CHAIN_PLATFORMS, DEFAULT_CHAINS, OPENCLI_SITE_OF } from "./chains-spec.js";
14
+ import { cliSpecEngine, disabledBySettings, probeError, specReadiness } from "./engine.js";
15
+ import { listOpencliSites, OPENCLI_PROBE, opencliSiteVerification, planOpencliSearch } from "./opencli.js";
16
+ import { cachedProbe, probeCli } from "./probe.js";
17
+ import { CliAdapterError, runCliSearchDetailed } from "./runner.js";
18
+ import { resolveCliAdapters, USER_DEFINED } from "./spec.js";
19
+ export { DEFAULT_CHAINS, CHAIN_PLATFORMS };
20
+ /** All specs a chain may use: the built-ins by id and the user's `cliAdapters` as `custom-cli:<id>`. */
21
+ export function allSpecs(config) {
22
+ const specs = new Map(BUILTIN_CLI_SPECS.map(spec => [spec.id, spec]));
23
+ const user = resolveCliAdapters(config.cliAdapters);
24
+ for (const [id, spec] of user.specs)
25
+ specs.set('custom-cli:' + id, spec);
26
+ return { specs, diagnostics: user.diagnostics };
27
+ }
28
+ const fromSpec = (r) => ({
29
+ ready: r.ready, installation: r.installation, ...r.version ? { version: r.version } : {}, ...r.credential ? { credential: r.credential } : {}, ...r.reason ? { reason: r.reason } : {},
30
+ ...r.code !== 'ok' ? { code: r.code } : {},
31
+ });
32
+ function specLeg(id, spec, platform, ctx) {
33
+ return {
34
+ id, kind: id.startsWith('custom-cli:') ? 'custom-cli' : 'cli', label: spec.bins[0],
35
+ engine: cliSpecEngine(spec, platform, ctx.deps, { id, label: spec.bins[0], ...id.startsWith('custom-cli:') ? { userDefined: true } : {} }),
36
+ readiness: async () => fromSpec(await specReadiness(spec, ctx.deps)),
37
+ verification: spec.verification?.status ?? (id.startsWith('custom-cli:') ? USER_DEFINED : 'unverified'),
38
+ };
39
+ }
40
+ function opencliLeg(platform, ctx) {
41
+ const site = OPENCLI_SITE_OF[platform];
42
+ const engine = {
43
+ id: 'opencli',
44
+ backend: 'opencli',
45
+ label: 'OpenCLI (standalone)',
46
+ available: () => !disabledBySettings({ id: 'opencli' }, ctx.deps) && (cachedProbe(OPENCLI_PROBE)?.state ?? 'detected') === 'detected',
47
+ unavailableReason: () => {
48
+ const probe = cachedProbe(OPENCLI_PROBE);
49
+ return disabledBySettings({ id: 'opencli' }, ctx.deps) ?? (probe && probe.state !== 'detected' ? probeError(OPENCLI_PROBE, probe)?.message : undefined);
50
+ },
51
+ async search(query, count, signal) {
52
+ const off = disabledBySettings({ id: 'opencli' }, ctx.deps);
53
+ if (off)
54
+ throw new CliAdapterError(off, 'CLI_NOT_FOUND');
55
+ const probe = await probeCli(OPENCLI_PROBE);
56
+ const failure = probe.state === 'detected' ? undefined : probeError(OPENCLI_PROBE, probe);
57
+ if (failure)
58
+ throw failure;
59
+ const plan = await planOpencliSearch(platform, site);
60
+ if (!plan.spec)
61
+ throw new CliAdapterError(plan.problem ?? 'opencli site ' + site + ' cannot be used by this adapter', 'CLI_CONTRACT_MISMATCH', plan.hint);
62
+ const spec = plan.spec;
63
+ const { sources, skipped } = await runCliSearchDetailed(spec, { query, count, signal }, { platform, bin: probe.path ?? 'opencli' });
64
+ return { sources, via: 'opencli', backend: 'opencli', ...skipped ? { notes: [skipped + ' result' + (skipped === 1 ? '' : 's') + ' without a link skipped'] } : {} };
65
+ },
66
+ };
67
+ return {
68
+ id: 'opencli', kind: 'opencli', label: 'OpenCLI (standalone)', engine, verification: opencliSiteVerification(site).status,
69
+ async readiness() {
70
+ const off = disabledBySettings({ id: 'opencli' }, ctx.deps);
71
+ if (off)
72
+ return { ready: false, installation: 'missing', reason: 'opencli: ' + off, code: 'disabled' };
73
+ const probe = await probeCli(OPENCLI_PROBE);
74
+ if (probe.state !== 'detected')
75
+ return { ready: false, installation: probe.state, ...probe.version ? { version: probe.version } : {}, reason: 'opencli: ' + (probe.reason ?? 'not installed') + (probe.state === 'missing' ? '' : ''), code: probe.state === 'missing' ? 'cli_missing' : 'cli_incompatible' };
76
+ const listed = await listOpencliSites();
77
+ const entry = listed.sites?.get(site);
78
+ if (!entry)
79
+ return { ready: false, installation: 'detected', ...probe.version ? { version: probe.version } : {}, reason: 'opencli: ' + (listed.problem ?? 'no read `search` command for the site ' + site + ' in `opencli list`'), code: 'unsupported' };
80
+ return { ready: true, installation: 'detected', ...probe.version ? { version: probe.version } : {}, ...entry.strategy === 'public' ? { credential: 'not_required' } : {} };
81
+ },
82
+ };
83
+ }
84
+ function browserOpencliLeg(platform, ctx) {
85
+ const engine = { ...opencliEngine(platform, ctx.deps), backend: 'browser-opencli' };
86
+ return {
87
+ id: 'browser-opencli', kind: 'browser-opencli', label: 'dsh-browser OpenCLI', engine, verification: 'unverified',
88
+ async readiness() {
89
+ const gap = browserGap(ctx.deps.browser, 'opencli', 'platform ' + platform);
90
+ const off = !ctx.deps.enableCli ? 'CLI backends are disabled in settings (enableCliBackends)' : !ctx.deps.opencliEnabled ? 'the OpenCLI backend is disabled in settings (opencliEnabled)' : undefined;
91
+ const reason = gap ?? off;
92
+ const installation = !ctx.deps.browser ? 'missing' : gap ? 'incompatible' : 'detected';
93
+ return reason ? { ready: false, installation, reason: 'browser-opencli: ' + reason, code: gap ? 'browser_missing' : 'disabled' } : { ready: true, installation };
94
+ },
95
+ };
96
+ }
97
+ function browserSearchLeg(platform, ctx) {
98
+ const engine = { ...playwrightPlatformEngine(platform, ctx.deps), backend: 'browser-search' };
99
+ return {
100
+ id: 'browser-search', kind: 'browser-search', label: 'dsh-browser search page', engine, verification: 'unverified',
101
+ async readiness() {
102
+ const gap = browserGap(ctx.deps.browser, 'searchResults', 'platform ' + platform);
103
+ const bound = ctx.config.browserBindings?.[platform]?.authProfile;
104
+ return gap
105
+ ? { ready: false, installation: !ctx.deps.browser ? 'missing' : 'incompatible', ...bound ? { credential: 'configured' } : {}, reason: 'browser-search: ' + gap, code: 'browser_missing' }
106
+ : { ready: true, installation: 'detected', ...bound ? { credential: 'configured' } : {} };
107
+ },
108
+ };
109
+ }
110
+ const REST_ENGINES = { github: githubEngine, 'github-issues': githubIssuesEngine, 'github-code': githubCodeEngine };
111
+ function restLeg(platform, ctx) {
112
+ const engine = { ...REST_ENGINES[platform](ctx.deps), backend: 'rest' };
113
+ return {
114
+ id: 'rest', kind: 'rest', label: 'GitHub REST API', engine, verification: 'live',
115
+ async readiness() {
116
+ const ready = engine.available();
117
+ return ready
118
+ ? { ready, installation: 'not_required', credential: (ctx.deps.githubToken?.length ?? 0) > 0 ? 'configured' : 'not_required' }
119
+ : { ready, installation: 'not_required', credential: 'missing', reason: 'rest: GitHub code search requires authentication: set $GITHUB_TOKEN (or config githubToken)', code: 'not_logged_in' };
120
+ },
121
+ };
122
+ }
123
+ /** The chain of one platform: the configured (`platformBackends`) or default order, each id turned into a leg or into a diagnostic. */
124
+ export function resolveChain(platform, ctx) {
125
+ const { specs } = allSpecs(ctx.config);
126
+ const configured = ctx.config.platformBackends?.[platform];
127
+ const ids = configured ?? DEFAULT_CHAINS[platform] ?? (platform.startsWith('custom-cli:') ? [platform] : []);
128
+ const legs = [];
129
+ const diagnostics = [];
130
+ const skip = (id, why) => { diagnostics.push('platformBackends.' + platform + ': "' + id + '" ' + why); };
131
+ const serving = new Map([...specs].map(([id, spec]) => [id, spec.platforms]));
132
+ for (const id of ids) {
133
+ if (legs.some(leg => leg.id === id))
134
+ continue;
135
+ const served = backendServes(id, platform, serving);
136
+ if (!served.ok) {
137
+ skip(id, served.why ?? 'cannot serve this platform');
138
+ continue;
139
+ }
140
+ if (id === 'opencli')
141
+ legs.push(opencliLeg(platform, ctx));
142
+ else if (id === 'browser-opencli')
143
+ legs.push(browserOpencliLeg(platform, ctx));
144
+ else if (id === 'browser-search')
145
+ legs.push(browserSearchLeg(platform, ctx));
146
+ else if (id === 'rest')
147
+ legs.push(restLeg(platform, ctx));
148
+ else
149
+ legs.push(specLeg(id, specs.get(id), platform, ctx));
150
+ }
151
+ return { legs, diagnostics };
152
+ }
153
+ /** The credential state a chain reports: its first ready leg's; else `configured` when any leg has one (a binding counts), else `missing` when a leg lacks one. */
154
+ function credentialOf(ready, all) {
155
+ if (ready)
156
+ return ready;
157
+ return all.includes('configured') ? 'configured' : all.includes('missing') ? 'missing' : undefined;
158
+ }
159
+ /** Local readiness of a whole chain (one probe per leg, cached). */
160
+ export async function chainReport(platform, ctx) {
161
+ const { legs, diagnostics } = resolveChain(platform, ctx);
162
+ const checked = await Promise.all(legs.map(async (leg) => ({ leg, r: await leg.readiness().catch((error) => ({ ready: false, installation: 'missing', reason: leg.id + ': ' + (error instanceof Error ? error.message : String(error)), code: 'unsupported' })) })));
163
+ const entries = checked.map(({ leg, r }, index) => ({
164
+ id: leg.id, kind: leg.kind, label: leg.label, order: index + 1, state: r.ready ? 'ready' : 'skipped', installation: r.installation,
165
+ ...r.version ? { version: r.version } : {}, ...r.credential ? { credential: r.credential } : {}, ...r.reason ? { reason: r.reason } : {}, verification: leg.verification,
166
+ }));
167
+ const firstReady = checked.find(c => c.r.ready);
168
+ const rank = { detected: 3, incompatible: 2, not_required: 3, missing: 1 };
169
+ const best = checked.map(c => c.r).sort((a, b) => rank[b.installation] - rank[a.installation])[0];
170
+ const credentials = checked.map(c => c.r.credential);
171
+ const skipped = checked.filter(c => !c.r.ready);
172
+ const confirmed = checked.find(c => c.r.ready && (c.r.credential === 'configured' || c.r.credential === 'not_required'));
173
+ const state = confirmed ? 'ready' : firstReady ? 'login_unverified' : skipped.some(c => c.r.credential === 'missing') ? 'needs_login' : 'unavailable';
174
+ const unverified = checked.filter(c => c.r.ready && c.r.credential === undefined);
175
+ return {
176
+ entries,
177
+ available: !!firstReady,
178
+ state,
179
+ installation: firstReady ? firstReady.r.installation : best?.installation ?? 'missing',
180
+ ...credentialOf(firstReady?.r.credential, credentials) ? { credential: credentialOf(firstReady?.r.credential, credentials) } : {},
181
+ ...!firstReady ? {
182
+ reason: legs.length
183
+ ? 'no usable backend: ' + skipped.map(c => c.r.reason ?? c.leg.id + ' unavailable').join('; ')
184
+ : 'no usable backend: ' + (diagnostics.join('; ') || 'the chain is empty'),
185
+ diagnosticCode: skipped[0]?.r.code ?? 'no_backend',
186
+ } : {
187
+ ...state === 'login_unverified' ? { reason: 'login not verified: ' + unverified.map(c => c.leg.id).join(', ') + ' will use your own session, which cannot be checked locally' + (skipped.length ? '; skipped: ' + skipped.map(c => c.r.reason ?? c.leg.id + ' unavailable').join('; ') : '') } : {},
188
+ diagnosticCode: ['browser-opencli', 'browser-search', 'opencli'].includes(firstReady.leg.kind) || (firstReady.r.credential === undefined && firstReady.leg.kind !== 'rest') ? 'login_unverified' : 'ok',
189
+ },
190
+ diagnostics,
191
+ };
192
+ }
193
+ //# sourceMappingURL=chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.js","sourceRoot":"","sources":["../../src/cli/chain.ts"],"names":[],"mappings":"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"}