dsh-web-search-pro 0.2.1 → 0.2.4

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 (264) hide show
  1. package/CHANGELOG.md +227 -0
  2. package/README.en.md +117 -0
  3. package/README.md +72 -578
  4. package/assets/skills/dsh-web-search-pro/SKILL.md +13 -12
  5. package/assets/skills/dsh-web-search-pro/references/config.md +36 -0
  6. package/assets/skills/dsh-web-search-pro/references/sources.md +13 -7
  7. package/assets/skills/dsh-web-search-pro/references/troubleshooting.md +3 -1
  8. package/catalog/sources.v1.json +16 -14
  9. package/lib/actions/approval.js +50 -1
  10. package/lib/actions/approval.js.map +1 -1
  11. package/lib/actions/config.js +274 -0
  12. package/lib/actions/config.js.map +1 -0
  13. package/lib/actions/errors.js +8 -1
  14. package/lib/actions/errors.js.map +1 -1
  15. package/lib/actions/format.js +10 -0
  16. package/lib/actions/format.js.map +1 -1
  17. package/lib/actions/index-view.js +2 -2
  18. package/lib/actions/index-view.js.map +1 -1
  19. package/lib/actions/read.js +7 -3
  20. package/lib/actions/read.js.map +1 -1
  21. package/lib/actions/registry.js +3 -1
  22. package/lib/actions/registry.js.map +1 -1
  23. package/lib/actions/run.js +2 -2
  24. package/lib/actions/run.js.map +1 -1
  25. package/lib/actions/schema.js +18 -0
  26. package/lib/actions/schema.js.map +1 -1
  27. package/lib/actions/search.js +7 -2
  28. package/lib/actions/search.js.map +1 -1
  29. package/lib/actions/sources.js +76 -18
  30. package/lib/actions/sources.js.map +1 -1
  31. package/lib/actions/types.js +19 -1
  32. package/lib/actions/types.js.map +1 -1
  33. package/lib/browser-access.js +25 -0
  34. package/lib/browser-access.js.map +1 -1
  35. package/lib/catalog/recommend.js +11 -3
  36. package/lib/catalog/recommend.js.map +1 -1
  37. package/lib/catalog/schema.js +3 -1
  38. package/lib/catalog/schema.js.map +1 -1
  39. package/lib/cli/builtin-specs.js +57 -22
  40. package/lib/cli/builtin-specs.js.map +1 -1
  41. package/lib/cli/chain.js +13 -12
  42. package/lib/cli/chain.js.map +1 -1
  43. package/lib/cli/chains-spec.js +31 -11
  44. package/lib/cli/chains-spec.js.map +1 -1
  45. package/lib/cli/engine.js +19 -3
  46. package/lib/cli/engine.js.map +1 -1
  47. package/lib/cli/opencli-sites.js +83 -0
  48. package/lib/cli/opencli-sites.js.map +1 -0
  49. package/lib/cli/opencli.js +65 -17
  50. package/lib/cli/opencli.js.map +1 -1
  51. package/lib/cli/probe.js +1 -1
  52. package/lib/cli/probe.js.map +1 -1
  53. package/lib/cli/runner.js +217 -27
  54. package/lib/cli/runner.js.map +1 -1
  55. package/lib/cli/spec.js +100 -20
  56. package/lib/cli/spec.js.map +1 -1
  57. package/lib/cli/time-text.js +79 -0
  58. package/lib/cli/time-text.js.map +1 -0
  59. package/lib/cli/trial.js +57 -0
  60. package/lib/cli/trial.js.map +1 -0
  61. package/lib/client/SettingsCard.js +14 -32
  62. package/lib/client/SettingsCard.js.map +1 -1
  63. package/lib/client/agent-mark.js +27 -0
  64. package/lib/client/agent-mark.js.map +1 -0
  65. package/lib/client/card-frame.js +118 -0
  66. package/lib/client/card-frame.js.map +1 -0
  67. package/lib/client/cli-form.js +257 -0
  68. package/lib/client/cli-form.js.map +1 -0
  69. package/lib/client/field-docs.js +130 -0
  70. package/lib/client/field-docs.js.map +1 -0
  71. package/lib/client/field-keys.js +81 -0
  72. package/lib/client/field-keys.js.map +1 -0
  73. package/lib/client/field-rows.js +71 -0
  74. package/lib/client/field-rows.js.map +1 -0
  75. package/lib/client/fill.js +3 -0
  76. package/lib/client/fill.js.map +1 -0
  77. package/lib/client/form-specs.js +13 -1
  78. package/lib/client/form-specs.js.map +1 -1
  79. package/lib/client/form.js +282 -24
  80. package/lib/client/form.js.map +1 -1
  81. package/lib/client/group-advanced.js +23 -0
  82. package/lib/client/group-advanced.js.map +1 -0
  83. package/lib/client/group-agent.js +28 -0
  84. package/lib/client/group-agent.js.map +1 -0
  85. package/lib/client/group-cli.js +136 -0
  86. package/lib/client/group-cli.js.map +1 -0
  87. package/lib/client/group-common.js +29 -0
  88. package/lib/client/group-common.js.map +1 -0
  89. package/lib/client/group-judge.js +67 -0
  90. package/lib/client/group-judge.js.map +1 -0
  91. package/lib/client/group-order.js +201 -0
  92. package/lib/client/group-order.js.map +1 -0
  93. package/lib/client/group-runtime.js +33 -0
  94. package/lib/client/group-runtime.js.map +1 -0
  95. package/lib/client/group-sources.js +83 -0
  96. package/lib/client/group-sources.js.map +1 -0
  97. package/lib/client/groups-basic.js +36 -0
  98. package/lib/client/groups-basic.js.map +1 -0
  99. package/lib/client/index.js.map +1 -1
  100. package/lib/client/json-list.js +50 -0
  101. package/lib/client/json-list.js.map +1 -0
  102. package/lib/client/locales.js +666 -219
  103. package/lib/client/locales.js.map +1 -1
  104. package/lib/client/order.js +192 -0
  105. package/lib/client/order.js.map +1 -0
  106. package/lib/client/overlay-ops.js +46 -0
  107. package/lib/client/overlay-ops.js.map +1 -0
  108. package/lib/client/sources-table.js +1 -0
  109. package/lib/client/sources-table.js.map +1 -1
  110. package/lib/client/styles.js +74 -47
  111. package/lib/client/styles.js.map +1 -1
  112. package/lib/client/text-view.js +98 -0
  113. package/lib/client/text-view.js.map +1 -0
  114. package/lib/client/ui-kit.js +120 -0
  115. package/lib/client/ui-kit.js.map +1 -0
  116. package/lib/client/validators.js +8 -1
  117. package/lib/client/validators.js.map +1 -1
  118. package/lib/client.js +7313 -1571
  119. package/lib/client.js.map +1 -1
  120. package/lib/config-fillers.js +53 -0
  121. package/lib/config-fillers.js.map +1 -0
  122. package/lib/config-groups.js +49 -0
  123. package/lib/config-groups.js.map +1 -0
  124. package/lib/config.js +84 -108
  125. package/lib/config.js.map +1 -1
  126. package/lib/default-chain.js +66 -0
  127. package/lib/default-chain.js.map +1 -0
  128. package/lib/deps.js +1 -1
  129. package/lib/deps.js.map +1 -1
  130. package/lib/engines.js +3 -3
  131. package/lib/engines.js.map +1 -1
  132. package/lib/fetch.js +23 -4
  133. package/lib/fetch.js.map +1 -1
  134. package/lib/fiber-config.js +5 -0
  135. package/lib/fiber-config.js.map +1 -0
  136. package/lib/index.js +36 -7
  137. package/lib/index.js.map +1 -1
  138. package/lib/overlay-types.js +88 -0
  139. package/lib/overlay-types.js.map +1 -0
  140. package/lib/overlay.js +683 -0
  141. package/lib/overlay.js.map +1 -0
  142. package/lib/pipeline/candidates.js +27 -1
  143. package/lib/pipeline/candidates.js.map +1 -1
  144. package/lib/pipeline/compile.js +63 -0
  145. package/lib/pipeline/compile.js.map +1 -1
  146. package/lib/pipeline/confidence.js +64 -0
  147. package/lib/pipeline/confidence.js.map +1 -0
  148. package/lib/pipeline/fusion.js +50 -3
  149. package/lib/pipeline/fusion.js.map +1 -1
  150. package/lib/pipeline/plan.js +2 -2
  151. package/lib/pipeline/plan.js.map +1 -1
  152. package/lib/pipeline/render.js +20 -2
  153. package/lib/pipeline/render.js.map +1 -1
  154. package/lib/pipeline/run.js +17 -5
  155. package/lib/pipeline/run.js.map +1 -1
  156. package/lib/pipeline/sources-spec.js +19 -3
  157. package/lib/pipeline/sources-spec.js.map +1 -1
  158. package/lib/providers/builtin.js +3 -0
  159. package/lib/providers/builtin.js.map +1 -1
  160. package/lib/providers/deepseek.js +348 -0
  161. package/lib/providers/deepseek.js.map +1 -0
  162. package/lib/providers/http.js.map +1 -1
  163. package/lib/providers/keyed-meta.js +7 -0
  164. package/lib/providers/keyed-meta.js.map +1 -1
  165. package/lib/providers/platforms.js +18 -17
  166. package/lib/providers/platforms.js.map +1 -1
  167. package/lib/providers/registry.js.map +1 -1
  168. package/lib/restart.js +47 -0
  169. package/lib/restart.js.map +1 -0
  170. package/lib/router.js +145 -26
  171. package/lib/router.js.map +1 -1
  172. package/lib/rpc-types.js +15 -0
  173. package/lib/rpc-types.js.map +1 -0
  174. package/lib/rpc.js +118 -0
  175. package/lib/rpc.js.map +1 -0
  176. package/lib/tools.js +10 -4
  177. package/lib/tools.js.map +1 -1
  178. package/lib/types/actions/approval.d.ts +11 -0
  179. package/lib/types/actions/config.d.ts +54 -0
  180. package/lib/types/actions/format.d.ts +9 -2
  181. package/lib/types/actions/run.d.ts +1 -0
  182. package/lib/types/actions/schema.d.ts +7 -1
  183. package/lib/types/actions/sources.d.ts +29 -3
  184. package/lib/types/actions/types.d.ts +28 -2
  185. package/lib/types/browser-access.d.ts +17 -0
  186. package/lib/types/catalog/recommend.d.ts +4 -0
  187. package/lib/types/catalog/schema.d.ts +2 -0
  188. package/lib/types/cli/builtin-specs.d.ts +11 -3
  189. package/lib/types/cli/chains-spec.d.ts +12 -3
  190. package/lib/types/cli/engine.d.ts +10 -3
  191. package/lib/types/cli/opencli-sites.d.ts +24 -0
  192. package/lib/types/cli/opencli.d.ts +42 -3
  193. package/lib/types/cli/runner.d.ts +47 -8
  194. package/lib/types/cli/spec.d.ts +101 -8
  195. package/lib/types/cli/time-text.d.ts +12 -0
  196. package/lib/types/cli/trial.d.ts +19 -0
  197. package/lib/types/client/SettingsCard.d.ts +17 -1
  198. package/lib/types/client/agent-mark.d.ts +22 -0
  199. package/lib/types/client/card-frame.d.ts +35 -0
  200. package/lib/types/client/cli-form.d.ts +97 -0
  201. package/lib/types/client/field-docs.d.ts +15 -0
  202. package/lib/types/client/field-keys.d.ts +41 -0
  203. package/lib/types/client/field-rows.d.ts +70 -0
  204. package/lib/types/client/fill.d.ts +2 -0
  205. package/lib/types/client/form-specs.d.ts +12 -3
  206. package/lib/types/client/form.d.ts +79 -1
  207. package/lib/types/client/group-advanced.d.ts +9 -0
  208. package/lib/types/client/group-agent.d.ts +20 -0
  209. package/lib/types/client/group-cli.d.ts +52 -0
  210. package/lib/types/client/group-common.d.ts +12 -0
  211. package/lib/types/client/group-judge.d.ts +17 -0
  212. package/lib/types/client/group-order.d.ts +26 -0
  213. package/lib/types/client/group-runtime.d.ts +15 -0
  214. package/lib/types/client/group-sources.d.ts +46 -0
  215. package/lib/types/client/groups-basic.d.ts +18 -0
  216. package/lib/types/client/index.d.ts +8 -0
  217. package/lib/types/client/json-list.d.ts +21 -0
  218. package/lib/types/client/locales.d.ts +1079 -200
  219. package/lib/types/client/order.d.ts +102 -0
  220. package/lib/types/client/overlay-ops.d.ts +37 -0
  221. package/lib/types/client/styles.d.ts +56 -41
  222. package/lib/types/client/text-view.d.ts +22 -0
  223. package/lib/types/client/ui-kit.d.ts +200 -0
  224. package/lib/types/config-fillers.d.ts +9 -0
  225. package/lib/types/config-groups.d.ts +23 -0
  226. package/lib/types/config.d.ts +263 -225
  227. package/lib/types/default-chain.d.ts +63 -0
  228. package/lib/types/engines.d.ts +29 -1
  229. package/lib/types/fetch.d.ts +12 -3
  230. package/lib/types/fiber-config.d.ts +18 -0
  231. package/lib/types/index.d.ts +164 -150
  232. package/lib/types/overlay-types.d.ts +98 -0
  233. package/lib/types/overlay.d.ts +141 -0
  234. package/lib/types/pipeline/candidates.d.ts +17 -0
  235. package/lib/types/pipeline/compile.d.ts +11 -0
  236. package/lib/types/pipeline/confidence.d.ts +35 -0
  237. package/lib/types/pipeline/fusion.d.ts +23 -1
  238. package/lib/types/pipeline/render.d.ts +16 -0
  239. package/lib/types/pipeline/run.d.ts +2 -1
  240. package/lib/types/pipeline/sources-spec.d.ts +5 -2
  241. package/lib/types/pipeline/types.d.ts +37 -0
  242. package/lib/types/providers/deepseek.d.ts +130 -0
  243. package/lib/types/providers/http.d.ts +2 -1
  244. package/lib/types/providers/keyed-meta.d.ts +5 -0
  245. package/lib/types/providers/registry.d.ts +7 -0
  246. package/lib/types/restart.d.ts +52 -0
  247. package/lib/types/router.d.ts +57 -10
  248. package/lib/types/rpc-types.d.ts +79 -0
  249. package/lib/types/rpc.d.ts +74 -0
  250. package/lib/types/tools.d.ts +6 -0
  251. package/lib/types/util.d.ts +10 -0
  252. package/lib/util.js +10 -1
  253. package/lib/util.js.map +1 -1
  254. package/package.json +53 -44
  255. package/scripts/check-client-bundle.mjs +1 -1
  256. package/scripts/check-docs-links.mjs +107 -0
  257. package/scripts/cli-login-check.mjs +214 -0
  258. package/LOGIN.md +0 -161
  259. package/lib/client/RubricEditor.js +0 -47
  260. package/lib/client/RubricEditor.js.map +0 -1
  261. package/lib/client/fields.js +0 -31
  262. package/lib/client/fields.js.map +0 -1
  263. package/lib/types/client/RubricEditor.d.ts +0 -6
  264. package/lib/types/client/fields.d.ts +0 -65
@@ -104,6 +104,12 @@ export interface SourcesConfig {
104
104
  priority?: string[];
105
105
  /** Source ids the automatic plan and the configured `engines` list never use (an explicit `engines` / `platform` in a call still can). */
106
106
  disabled?: string[];
107
+ /**
108
+ * Confidence (0..1) per source id, including the platform backends of a chain (`xhs`, `browser-search`, `custom-cli:<id>`).
109
+ * Built-in sources have 1; a custom CLI has the `confidence` of its spec (default 0.5) unless it is set here. It scales the
110
+ * source's weight in rank fusion a little (pipeline/confidence.ts) and is printed with its results; 1 changes nothing.
111
+ */
112
+ confidence?: Record<string, number>;
107
113
  /**
108
114
  * Optional request caps per source id, counted in the usage ledger (persistent, atomic): `total` over all time, `daily` per
109
115
  * calendar day (time zone of `evidence.budget`). No source has a cap unless it is set here. An exhausted source is skipped
@@ -113,50 +119,38 @@ export interface SourcesConfig {
113
119
  budget?: Record<string, SourceBudgetInput>;
114
120
  }
115
121
  export interface Config {
116
- /** SQLite database path; defaults to $DSH_HOME/data/web-search-pro/store.db */
117
- dbPath?: string;
118
- /** Cache freshness window in seconds. */
119
- ttlSeconds: number;
120
- /** In-process LRU entry cap (hot queries resolve without touching SQLite). */
121
- memoryCacheEntries: number;
122
- /** Reciprocal Rank Fusion constant for multi-engine merging. */
123
- rrfConstant: number;
124
- /**
125
- * Recency bonus, as a fraction (0..1) of ONE TOP-RANK STEP on the normalised
126
- * fusion scale (pipeline/fusion.ts): added once per URL, so even at 1 a fresh
127
- * result gains about one rank position, and at the default it is a tie-breaker.
128
- */
129
- freshnessBoost: number;
130
- /** Days over which the recency bonus decays to zero. */
131
- freshnessDays: number;
132
- /**
133
- * Authority-domain bonus, same scale and once-per-URL rule as `freshnessBoost`:
134
- * it cannot lift a rank-10 result over a rank-1 result of the same engine.
135
- */
136
- authorityBoost: number;
137
- /** Extra authority domains (beyond the built-in .edu/.gov/.org and the curated list). */
138
- authorityDomains: string[];
139
122
  /** Default cap on returned sources per search. */
140
123
  searchMaxResults: number;
141
- /**
142
- * Default output cap (characters) of one `read.fetch` call. Longer pages are cut here and
143
- * continued with `offset`; the ctx.web fetch provider (which cannot be told a size) uses twice this.
144
- */
145
- fetchDefaultChars: number;
146
- /** `read.contents`: output cap per URL (characters). */
147
- exaContentsPerUrlChars: number;
148
- /** `read.contents`: output cap over all URLs of one call (characters); shared fairly between them. */
149
- exaContentsTotalChars: number;
124
+ /** Query all requested engines in parallel and merge. */
125
+ parallelEngines: boolean;
150
126
  /** Tool surface: `indexed` (default) keeps only web_index / web_call in context; `flat` registers one tool per action. Applied at startup. */
151
127
  toolSurface?: ToolSurface;
152
- /** Cooperative per-call timeout budget in ms. */
153
- timeoutMs: number;
154
128
  /** Trust Clash/TUN fake-IP DNS answers (198.18/15, fdfe:dcba:9876::/64, 2001:2::/48) while retaining all other SSRF checks. */
155
129
  allowProxyFakeIp: boolean;
130
+ /**
131
+ * Let `read.fetch` use the DeepSeek Fetch API ($0.75 per 1,000 successful requests) as a backend, after the free ones and before the
132
+ * browser, in `mode: auto`, and accept `mode: deepseek`. Uses the same key as DeepSeek Search (`keyedSources.deepseek`). Off by default: it spends money.
133
+ */
134
+ deepseekFetch: boolean;
156
135
  /** Ordered engine list for search.run. */
157
136
  engines: string[];
158
- /** Query all requested engines in parallel and merge. */
159
- parallelEngines: boolean;
137
+ /** Source preferences and request budgets (dev-plan M11a). */
138
+ sources?: SourcesConfig;
139
+ /**
140
+ * Ordered backend chain per platform (dev-plan M12): backend ids such as `xhs`, `opencli` (standalone OpenCLI), `browser-opencli`
141
+ * (dsh-browser), `browser-search`, `rest`, `gh`, `custom-cli:<id>`. A platform not listed uses its default chain.
142
+ */
143
+ platformBackends?: Record<string, string[]>;
144
+ /**
145
+ * Keyed search sources by route id (`tavily`, `brave`, `linkup`, `serper`, `metaso`, `zhipu`, `baidu-qianfan`): the key literal,
146
+ * the credentials ref / environment variable name (default e.g. TAVILY_API_KEY), and an optional endpoint base override.
147
+ * A source without a key is `credential: missing` and not executable.
148
+ */
149
+ keyedSources?: Record<string, {
150
+ apiKey?: string;
151
+ apiKeyEnv?: string;
152
+ baseUrl?: string;
153
+ }>;
160
154
  /** Exa API key (falls back to $EXA_API_KEY / credentials ref). */
161
155
  exaApiKey?: string;
162
156
  /** Credential/env reference for the Exa key; defaults to EXA_API_KEY. */
@@ -173,36 +167,50 @@ export interface Config {
173
167
  bochaBaseUrl?: string;
174
168
  /** Ask Bocha for its longer per-page summary (default true). */
175
169
  bochaSummary?: boolean;
170
+ /** GitHub API token for the REST search engines (falls back to $GITHUB_TOKEN / $GH_TOKEN / credentials ref). */
171
+ githubToken?: string;
172
+ /** Credential/env reference for the GitHub token; defaults to GITHUB_TOKEN. */
173
+ githubTokenEnv?: string;
176
174
  /** Self-hosted SearXNG instance URL (JSON format enabled); the `searxng` engine is available only when set. No public instance is built in. */
177
175
  searxngUrl?: string;
178
176
  /** Contact address put in the User-Agent of OpenAlex requests (etiquette; optional). */
179
177
  openalexMailto?: string;
178
+ /** User-defined CLI adapter specs by id (validated like the built-in ones; invalid entries are ignored with a diagnostic in sources.status). */
179
+ cliAdapters?: Record<string, Record<string, unknown>>;
180
+ /** Evidence pipeline (S6 scoring). */
181
+ evidence?: Partial<EvidenceConfig>;
180
182
  /**
181
- * Keyed search sources by route id (`tavily`, `brave`, `linkup`, `serper`, `metaso`, `zhipu`, `baidu-qianfan`): the key literal,
182
- * the credentials ref / environment variable name (default e.g. TAVILY_API_KEY), and an optional endpoint base override.
183
- * A source without a key is `credential: missing` and not executable.
183
+ * Default output cap (characters) of one `read.fetch` call. Longer pages are cut here and
184
+ * continued with `offset`; the ctx.web fetch provider (which cannot be told a size) uses twice this.
184
185
  */
185
- keyedSources?: Record<string, {
186
- apiKey?: string;
187
- apiKeyEnv?: string;
188
- baseUrl?: string;
189
- }>;
190
- /** GitHub API token for the REST search engines (falls back to $GITHUB_TOKEN / $GH_TOKEN / credentials ref). */
191
- githubToken?: string;
192
- /** Credential/env reference for the GitHub token; defaults to GITHUB_TOKEN. */
193
- githubTokenEnv?: string;
186
+ fetchDefaultChars: number;
187
+ /** `read.contents`: output cap per URL (characters). */
188
+ exaContentsPerUrlChars: number;
189
+ /** `read.contents`: output cap over all URLs of one call (characters); shared fairly between them. */
190
+ exaContentsTotalChars: number;
194
191
  /** Allow CLI backends (bili / yt-dlp / opencli / agent-reach). */
195
192
  enableCliBackends: boolean;
196
193
  /** Allow opencli browser-session backends. */
197
194
  opencliEnabled: boolean;
198
195
  /** Allow agent-reach backends. */
199
196
  agentReachEnabled: boolean;
200
- /** Provider id registered into ctx.web for the built-in web_search tool. */
201
- providerId: string;
202
- /** Register the ctx.web provider (set DSH_WEB_SEARCH_PROVIDER to use it). */
203
- registerProvider: boolean;
204
- /** ctx.web provider route: evidence pack inside the built-in web_search (only when this plugin is the selected provider). */
205
- provider?: Partial<ProviderSettings>;
197
+ /** twitter-cli `auth_token` cookie (falls back to the credentials ref / $TWITTER_AUTH_TOKEN). Handed to the twitter command only through its environment. */
198
+ twitterAuthToken?: string;
199
+ /** Credential/env reference for the twitter auth token; defaults to TWITTER_AUTH_TOKEN. */
200
+ twitterAuthTokenEnv?: string;
201
+ /** twitter-cli `ct0` cookie (falls back to the credentials ref / $TWITTER_CT0). */
202
+ twitterCt0?: string;
203
+ /** Credential/env reference for the twitter ct0 cookie; defaults to TWITTER_CT0. */
204
+ twitterCt0Env?: string;
205
+ /** Snapshot options. The browser runtime itself (channel/headless/storageStatePath) is provided by the dsh-browser plugin via the `browser` service. */
206
+ playwright: {
207
+ /** Gate the playwright fallback backend in read.fetch. */
208
+ enabled: boolean;
209
+ /** Directory for read.snapshot artifacts; defaults to <dbDir>/snapshots. */
210
+ snapshotDir?: string;
211
+ };
212
+ /** User-defined custom platform search: url template + selectors + optional cookie. */
213
+ customPlatforms?: Record<string, CustomPlatformSpec>;
206
214
  /** Per-platform search-page selector overrides (item/title/link/text). Overrides built-in specs. */
207
215
  platformRules?: Record<string, {
208
216
  item: string;
@@ -210,128 +218,54 @@ export interface Config {
210
218
  link: string;
211
219
  text?: string;
212
220
  }>;
213
- /** User-defined custom platform search: url template + selectors + optional cookie. */
214
- customPlatforms?: Record<string, CustomPlatformSpec>;
215
221
  /** Per-platform binding to domain-scoped dsh-browser auth/rule profiles. */
216
222
  browserBindings?: Record<string, BrowserBinding>;
223
+ /** Provider id registered into ctx.web for the built-in web_search tool. */
224
+ providerId: string;
225
+ /** Register the ctx.web provider (set DSH_WEB_SEARCH_PROVIDER to use it). */
226
+ registerProvider: boolean;
227
+ /** ctx.web provider route: evidence pack inside the built-in web_search (only when this plugin is the selected provider). */
228
+ provider?: Partial<ProviderSettings>;
229
+ /** Cooperative per-call timeout budget in ms. */
230
+ timeoutMs: number;
231
+ /** Cache freshness window in seconds. */
232
+ ttlSeconds: number;
233
+ /** In-process LRU entry cap (hot queries resolve without touching SQLite). */
234
+ memoryCacheEntries: number;
235
+ /** Reciprocal Rank Fusion constant for multi-engine merging. */
236
+ rrfConstant: number;
217
237
  /**
218
- * Ordered backend chain per platform (dev-plan M12): backend ids such as `xhs`, `opencli` (standalone OpenCLI), `browser-opencli`
219
- * (dsh-browser), `browser-search`, `rest`, `gh`, `custom-cli:<id>`. A platform not listed uses its default chain.
238
+ * Recency bonus, as a fraction (0..1) of ONE TOP-RANK STEP on the normalised
239
+ * fusion scale (pipeline/fusion.ts): added once per URL, so even at 1 a fresh
240
+ * result gains about one rank position, and at the default it is a tie-breaker.
220
241
  */
221
- platformBackends?: Record<string, string[]>;
222
- /** User-defined CLI adapter specs by id (validated like the built-in ones; invalid entries are ignored with a diagnostic in sources.status). */
223
- cliAdapters?: Record<string, Record<string, unknown>>;
224
- /** Snapshot options. The browser runtime itself (channel/headless/storageStatePath) is provided by the dsh-browser plugin via the `browser` service. */
225
- playwright: {
226
- /** Gate the playwright fallback backend in read.fetch. */
227
- enabled: boolean;
228
- /** Directory for read.snapshot artifacts; defaults to <dbDir>/snapshots. */
229
- snapshotDir?: string;
230
- };
231
- /** Source preferences and request budgets (dev-plan M11a). */
232
- sources?: SourcesConfig;
233
- /** Evidence pipeline (S6 scoring). */
234
- evidence?: Partial<EvidenceConfig>;
242
+ freshnessBoost: number;
243
+ /** Days over which the recency bonus decays to zero. */
244
+ freshnessDays: number;
245
+ /**
246
+ * Authority-domain bonus, same scale and once-per-URL rule as `freshnessBoost`:
247
+ * it cannot lift a rank-10 result over a rank-1 result of the same engine.
248
+ */
249
+ authorityBoost: number;
250
+ /** Extra authority domains (beyond the built-in .edu/.gov/.org and the curated list). */
251
+ authorityDomains: string[];
252
+ /** SQLite database path; defaults to $DSH_HOME/data/web-search-pro/store.db */
253
+ dbPath?: string;
235
254
  verbose: boolean;
236
255
  }
256
+ export { DEFAULT_ENGINES };
257
+ import { DEFAULT_ENGINES } from './default-chain.ts';
237
258
  export declare const Config: z<Schemastery.ObjectS<NoInfer<{
238
- dbPath: z<string, string, "volatile">;
239
- toolSurface: z<string, string, "volatile-defined">;
240
- ttlSeconds: z<number, number, "volatile-defined">;
241
- memoryCacheEntries: z<number, number, "volatile-defined">;
242
- rrfConstant: z<number, number, "volatile-defined">;
243
- freshnessBoost: z<number, number, "volatile-defined">;
244
- freshnessDays: z<number, number, "volatile-defined">;
245
- authorityBoost: z<number, number, "volatile-defined">;
246
- authorityDomains: z<NoInfer<string[]>, NoInfer<string[]>, "volatile-defined">;
247
259
  searchMaxResults: z<number, number, "volatile-defined">;
248
- fetchDefaultChars: z<number, number, "volatile-defined">;
249
- exaContentsPerUrlChars: z<number, number, "volatile-defined">;
250
- exaContentsTotalChars: z<number, number, "volatile-defined">;
251
- timeoutMs: z<number, number, "volatile-defined">;
260
+ parallelEngines: z<boolean, boolean, "volatile-defined">;
261
+ toolSurface: z<string, string, "volatile-defined">;
252
262
  allowProxyFakeIp: z<boolean, boolean, "volatile-defined">;
263
+ deepseekFetch: z<boolean, boolean, "volatile-defined">;
253
264
  engines: z<NoInfer<string[]>, NoInfer<string[]>, "volatile-defined">;
254
- parallelEngines: z<boolean, boolean, "volatile-defined">;
255
- exaApiKey: z<string, string, "volatile">;
256
- exaApiKeyEnv: z<string, string, "volatile-defined">;
257
- jinaApiKey: z<string, string, "volatile">;
258
- jinaApiKeyEnv: z<string, string, "volatile-defined">;
259
- bochaApiKey: z<string, string, "volatile">;
260
- bochaApiKeyEnv: z<string, string, "volatile-defined">;
261
- bochaBaseUrl: z<string, string, "volatile-defined">;
262
- bochaSummary: z<boolean, boolean, "volatile-defined">;
263
- searxngUrl: z<string, string, "volatile">;
264
- openalexMailto: z<string, string, "volatile">;
265
- keyedSources: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<{
266
- apiKey?: string | null | undefined;
267
- apiKeyEnv?: string | null | undefined;
268
- baseUrl?: string | null | undefined;
269
- } & import("@deepseek-ai/cosmokit").Dict, string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<Schemastery.ObjectT<NoInfer<{
270
- apiKey: z<string, string, "plain">;
271
- apiKeyEnv: z<string, string, "plain">;
272
- baseUrl: z<string, string, "plain">;
273
- }>>, string>>, "volatile">;
274
- githubToken: z<string, string, "volatile">;
275
- githubTokenEnv: z<string, string, "volatile-defined">;
276
- enableCliBackends: z<boolean, boolean, "volatile-defined">;
277
- opencliEnabled: z<boolean, boolean, "volatile-defined">;
278
- agentReachEnabled: z<boolean, boolean, "volatile-defined">;
279
- providerId: z<string, string, "volatile-defined">;
280
- registerProvider: z<boolean, boolean, "volatile-defined">;
281
- provider: z<Schemastery.ObjectS<NoInfer<{
282
- evidence: z<string, string, "volatile-defined">;
283
- deadlineMs: z<number, number, "volatile-defined">;
284
- }>>, Schemastery.ObjectT<NoInfer<{
285
- evidence: z<string, string, "volatile-defined">;
286
- deadlineMs: z<number, number, "volatile-defined">;
287
- }>>, "plain">;
288
- platformRules: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<{
289
- item?: string | null | undefined;
290
- title?: string | null | undefined;
291
- link?: string | null | undefined;
292
- text?: string | null | undefined;
293
- } & import("@deepseek-ai/cosmokit").Dict, string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<Schemastery.ObjectT<NoInfer<{
294
- item: z<string, string, "plain">;
295
- title: z<string, string, "plain">;
296
- link: z<string, string, "plain">;
297
- text: z<string, string, "plain">;
298
- }>>, string>>, "volatile">;
299
- customPlatforms: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<{
300
- name?: string | null | undefined;
301
- url?: string | null | undefined;
302
- item?: string | null | undefined;
303
- title?: string | null | undefined;
304
- link?: string | null | undefined;
305
- text?: string | null | undefined;
306
- cookie?: string | null | undefined;
307
- } & import("@deepseek-ai/cosmokit").Dict, string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<Schemastery.ObjectT<NoInfer<{
308
- name: z<string, string, "plain">;
309
- url: z<string, string, "plain">;
310
- item: z<string, string, "plain">;
311
- title: z<string, string, "plain">;
312
- link: z<string, string, "plain">;
313
- text: z<string, string, "plain">;
314
- cookie: z<string, string, "plain">;
315
- }>>, string>>, "volatile">;
316
- browserBindings: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<{
317
- authProfile?: string | null | undefined;
318
- rulePack?: string | null | undefined;
319
- } & import("@deepseek-ai/cosmokit").Dict, string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<Schemastery.ObjectT<NoInfer<{
320
- authProfile: z<string, string, "plain">;
321
- rulePack: z<string, string, "plain">;
322
- }>>, string>>, "volatile">;
323
- platformBackends: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<string[], string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<string[], string>>, "volatile">;
324
- cliAdapters: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<import("@deepseek-ai/cosmokit").Dict<any, string>, string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<import("@deepseek-ai/cosmokit").Dict<any, string>, string>>, "volatile">;
325
- playwright: z<Schemastery.ObjectS<NoInfer<{
326
- enabled: z<boolean, boolean, "volatile-defined">;
327
- snapshotDir: z<string, string, "plain">;
328
- }>>, Schemastery.ObjectT<NoInfer<{
329
- enabled: z<boolean, boolean, "volatile-defined">;
330
- snapshotDir: z<string, string, "plain">;
331
- }>>, "plain">;
332
265
  sources: z<Schemastery.ObjectS<NoInfer<{
333
266
  priority: z<NoInfer<string[]>, NoInfer<string[]>, "volatile">;
334
267
  disabled: z<NoInfer<string[]>, NoInfer<string[]>, "volatile">;
268
+ confidence: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<number, string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<number, string>>, "volatile">;
335
269
  budget: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<{
336
270
  total?: number | null | undefined;
337
271
  daily?: number | null | undefined;
@@ -342,6 +276,7 @@ export declare const Config: z<Schemastery.ObjectS<NoInfer<{
342
276
  }>>, Schemastery.ObjectT<NoInfer<{
343
277
  priority: z<NoInfer<string[]>, NoInfer<string[]>, "volatile">;
344
278
  disabled: z<NoInfer<string[]>, NoInfer<string[]>, "volatile">;
279
+ confidence: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<number, string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<number, string>>, "volatile">;
345
280
  budget: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<{
346
281
  total?: number | null | undefined;
347
282
  daily?: number | null | undefined;
@@ -350,6 +285,29 @@ export declare const Config: z<Schemastery.ObjectS<NoInfer<{
350
285
  daily: z<number, number, "plain">;
351
286
  }>>, string>>, "volatile">;
352
287
  }>>, "plain">;
288
+ platformBackends: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<string[], string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<string[], string>>, "volatile">;
289
+ keyedSources: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<{
290
+ apiKey?: string | null | undefined;
291
+ apiKeyEnv?: string | null | undefined;
292
+ baseUrl?: string | null | undefined;
293
+ } & import("@deepseek-ai/cosmokit").Dict, string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<Schemastery.ObjectT<NoInfer<{
294
+ apiKey: z<string, string, "plain">;
295
+ apiKeyEnv: z<string, string, "plain">;
296
+ baseUrl: z<string, string, "plain">;
297
+ }>>, string>>, "volatile">;
298
+ exaApiKey: z<string, string, "volatile">;
299
+ exaApiKeyEnv: z<string, string, "volatile-defined">;
300
+ jinaApiKey: z<string, string, "volatile">;
301
+ jinaApiKeyEnv: z<string, string, "volatile-defined">;
302
+ bochaApiKey: z<string, string, "volatile">;
303
+ bochaApiKeyEnv: z<string, string, "volatile-defined">;
304
+ bochaBaseUrl: z<string, string, "volatile-defined">;
305
+ bochaSummary: z<boolean, boolean, "volatile-defined">;
306
+ githubToken: z<string, string, "volatile">;
307
+ githubTokenEnv: z<string, string, "volatile-defined">;
308
+ searxngUrl: z<string, string, "volatile">;
309
+ openalexMailto: z<string, string, "volatile">;
310
+ cliAdapters: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<import("@deepseek-ai/cosmokit").Dict<any, string>, string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<import("@deepseek-ai/cosmokit").Dict<any, string>, string>>, "volatile">;
353
311
  evidence: z<Schemastery.ObjectS<NoInfer<{
354
312
  scorer: z<"jev" | "rule", "jev" | "rule", "volatile-defined">;
355
313
  jevMode: z<"off" | "shadow" | "control" | "hybrid", "off" | "shadow" | "control" | "hybrid", "volatile-defined">;
@@ -693,85 +651,50 @@ export declare const Config: z<Schemastery.ObjectS<NoInfer<{
693
651
  }>>, string>, "plain">;
694
652
  }>>>, "volatile">;
695
653
  }>>, "plain">;
696
- verbose: z<boolean, boolean, "volatile-defined">;
697
- }>>, Schemastery.ObjectT<NoInfer<{
698
- dbPath: z<string, string, "volatile">;
699
- toolSurface: z<string, string, "volatile-defined">;
700
- ttlSeconds: z<number, number, "volatile-defined">;
701
- memoryCacheEntries: z<number, number, "volatile-defined">;
702
- rrfConstant: z<number, number, "volatile-defined">;
703
- freshnessBoost: z<number, number, "volatile-defined">;
704
- freshnessDays: z<number, number, "volatile-defined">;
705
- authorityBoost: z<number, number, "volatile-defined">;
706
- authorityDomains: z<NoInfer<string[]>, NoInfer<string[]>, "volatile-defined">;
707
- searchMaxResults: z<number, number, "volatile-defined">;
708
654
  fetchDefaultChars: z<number, number, "volatile-defined">;
709
655
  exaContentsPerUrlChars: z<number, number, "volatile-defined">;
710
656
  exaContentsTotalChars: z<number, number, "volatile-defined">;
711
- timeoutMs: z<number, number, "volatile-defined">;
712
- allowProxyFakeIp: z<boolean, boolean, "volatile-defined">;
713
- engines: z<NoInfer<string[]>, NoInfer<string[]>, "volatile-defined">;
714
- parallelEngines: z<boolean, boolean, "volatile-defined">;
715
- exaApiKey: z<string, string, "volatile">;
716
- exaApiKeyEnv: z<string, string, "volatile-defined">;
717
- jinaApiKey: z<string, string, "volatile">;
718
- jinaApiKeyEnv: z<string, string, "volatile-defined">;
719
- bochaApiKey: z<string, string, "volatile">;
720
- bochaApiKeyEnv: z<string, string, "volatile-defined">;
721
- bochaBaseUrl: z<string, string, "volatile-defined">;
722
- bochaSummary: z<boolean, boolean, "volatile-defined">;
723
- searxngUrl: z<string, string, "volatile">;
724
- openalexMailto: z<string, string, "volatile">;
725
- keyedSources: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<{
726
- apiKey?: string | null | undefined;
727
- apiKeyEnv?: string | null | undefined;
728
- baseUrl?: string | null | undefined;
729
- } & import("@deepseek-ai/cosmokit").Dict, string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<Schemastery.ObjectT<NoInfer<{
730
- apiKey: z<string, string, "plain">;
731
- apiKeyEnv: z<string, string, "plain">;
732
- baseUrl: z<string, string, "plain">;
733
- }>>, string>>, "volatile">;
734
- githubToken: z<string, string, "volatile">;
735
- githubTokenEnv: z<string, string, "volatile-defined">;
736
657
  enableCliBackends: z<boolean, boolean, "volatile-defined">;
737
658
  opencliEnabled: z<boolean, boolean, "volatile-defined">;
738
659
  agentReachEnabled: z<boolean, boolean, "volatile-defined">;
739
- providerId: z<string, string, "volatile-defined">;
740
- registerProvider: z<boolean, boolean, "volatile-defined">;
741
- provider: z<Schemastery.ObjectS<NoInfer<{
742
- evidence: z<string, string, "volatile-defined">;
743
- deadlineMs: z<number, number, "volatile-defined">;
660
+ twitterAuthToken: z<string, string, "volatile">;
661
+ twitterAuthTokenEnv: z<string, string, "volatile-defined">;
662
+ twitterCt0: z<string, string, "volatile">;
663
+ twitterCt0Env: z<string, string, "volatile-defined">;
664
+ playwright: z<Schemastery.ObjectS<NoInfer<{
665
+ enabled: z<boolean, boolean, "volatile-defined">;
666
+ snapshotDir: z<string, string, "volatile">;
744
667
  }>>, Schemastery.ObjectT<NoInfer<{
745
- evidence: z<string, string, "volatile-defined">;
746
- deadlineMs: z<number, number, "volatile-defined">;
668
+ enabled: z<boolean, boolean, "volatile-defined">;
669
+ snapshotDir: z<string, string, "volatile">;
747
670
  }>>, "plain">;
748
- platformRules: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<{
671
+ customPlatforms: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<{
672
+ name?: string | null | undefined;
673
+ url?: string | null | undefined;
749
674
  item?: string | null | undefined;
750
675
  title?: string | null | undefined;
751
676
  link?: string | null | undefined;
752
677
  text?: string | null | undefined;
678
+ cookie?: string | null | undefined;
753
679
  } & import("@deepseek-ai/cosmokit").Dict, string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<Schemastery.ObjectT<NoInfer<{
680
+ name: z<string, string, "plain">;
681
+ url: z<string, string, "plain">;
754
682
  item: z<string, string, "plain">;
755
683
  title: z<string, string, "plain">;
756
684
  link: z<string, string, "plain">;
757
685
  text: z<string, string, "plain">;
686
+ cookie: z<string, string, "plain">;
758
687
  }>>, string>>, "volatile">;
759
- customPlatforms: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<{
760
- name?: string | null | undefined;
761
- url?: string | null | undefined;
688
+ platformRules: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<{
762
689
  item?: string | null | undefined;
763
690
  title?: string | null | undefined;
764
691
  link?: string | null | undefined;
765
692
  text?: string | null | undefined;
766
- cookie?: string | null | undefined;
767
693
  } & import("@deepseek-ai/cosmokit").Dict, string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<Schemastery.ObjectT<NoInfer<{
768
- name: z<string, string, "plain">;
769
- url: z<string, string, "plain">;
770
694
  item: z<string, string, "plain">;
771
695
  title: z<string, string, "plain">;
772
696
  link: z<string, string, "plain">;
773
697
  text: z<string, string, "plain">;
774
- cookie: z<string, string, "plain">;
775
698
  }>>, string>>, "volatile">;
776
699
  browserBindings: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<{
777
700
  authProfile?: string | null | undefined;
@@ -780,18 +703,36 @@ export declare const Config: z<Schemastery.ObjectS<NoInfer<{
780
703
  authProfile: z<string, string, "plain">;
781
704
  rulePack: z<string, string, "plain">;
782
705
  }>>, string>>, "volatile">;
783
- platformBackends: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<string[], string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<string[], string>>, "volatile">;
784
- cliAdapters: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<import("@deepseek-ai/cosmokit").Dict<any, string>, string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<import("@deepseek-ai/cosmokit").Dict<any, string>, string>>, "volatile">;
785
- playwright: z<Schemastery.ObjectS<NoInfer<{
786
- enabled: z<boolean, boolean, "volatile-defined">;
787
- snapshotDir: z<string, string, "plain">;
706
+ providerId: z<string, string, "volatile-defined">;
707
+ registerProvider: z<boolean, boolean, "volatile-defined">;
708
+ provider: z<Schemastery.ObjectS<NoInfer<{
709
+ evidence: z<string, string, "volatile-defined">;
710
+ deadlineMs: z<number, number, "volatile-defined">;
788
711
  }>>, Schemastery.ObjectT<NoInfer<{
789
- enabled: z<boolean, boolean, "volatile-defined">;
790
- snapshotDir: z<string, string, "plain">;
712
+ evidence: z<string, string, "volatile-defined">;
713
+ deadlineMs: z<number, number, "volatile-defined">;
791
714
  }>>, "plain">;
715
+ timeoutMs: z<number, number, "volatile-defined">;
716
+ ttlSeconds: z<number, number, "volatile-defined">;
717
+ memoryCacheEntries: z<number, number, "volatile-defined">;
718
+ rrfConstant: z<number, number, "volatile-defined">;
719
+ freshnessBoost: z<number, number, "volatile-defined">;
720
+ freshnessDays: z<number, number, "volatile-defined">;
721
+ authorityBoost: z<number, number, "volatile-defined">;
722
+ authorityDomains: z<NoInfer<string[]>, NoInfer<string[]>, "volatile-defined">;
723
+ dbPath: z<string, string, "volatile">;
724
+ verbose: z<boolean, boolean, "volatile-defined">;
725
+ }>>, Schemastery.ObjectT<NoInfer<{
726
+ searchMaxResults: z<number, number, "volatile-defined">;
727
+ parallelEngines: z<boolean, boolean, "volatile-defined">;
728
+ toolSurface: z<string, string, "volatile-defined">;
729
+ allowProxyFakeIp: z<boolean, boolean, "volatile-defined">;
730
+ deepseekFetch: z<boolean, boolean, "volatile-defined">;
731
+ engines: z<NoInfer<string[]>, NoInfer<string[]>, "volatile-defined">;
792
732
  sources: z<Schemastery.ObjectS<NoInfer<{
793
733
  priority: z<NoInfer<string[]>, NoInfer<string[]>, "volatile">;
794
734
  disabled: z<NoInfer<string[]>, NoInfer<string[]>, "volatile">;
735
+ confidence: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<number, string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<number, string>>, "volatile">;
795
736
  budget: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<{
796
737
  total?: number | null | undefined;
797
738
  daily?: number | null | undefined;
@@ -802,6 +743,7 @@ export declare const Config: z<Schemastery.ObjectS<NoInfer<{
802
743
  }>>, Schemastery.ObjectT<NoInfer<{
803
744
  priority: z<NoInfer<string[]>, NoInfer<string[]>, "volatile">;
804
745
  disabled: z<NoInfer<string[]>, NoInfer<string[]>, "volatile">;
746
+ confidence: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<number, string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<number, string>>, "volatile">;
805
747
  budget: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<{
806
748
  total?: number | null | undefined;
807
749
  daily?: number | null | undefined;
@@ -810,6 +752,29 @@ export declare const Config: z<Schemastery.ObjectS<NoInfer<{
810
752
  daily: z<number, number, "plain">;
811
753
  }>>, string>>, "volatile">;
812
754
  }>>, "plain">;
755
+ platformBackends: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<string[], string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<string[], string>>, "volatile">;
756
+ keyedSources: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<{
757
+ apiKey?: string | null | undefined;
758
+ apiKeyEnv?: string | null | undefined;
759
+ baseUrl?: string | null | undefined;
760
+ } & import("@deepseek-ai/cosmokit").Dict, string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<Schemastery.ObjectT<NoInfer<{
761
+ apiKey: z<string, string, "plain">;
762
+ apiKeyEnv: z<string, string, "plain">;
763
+ baseUrl: z<string, string, "plain">;
764
+ }>>, string>>, "volatile">;
765
+ exaApiKey: z<string, string, "volatile">;
766
+ exaApiKeyEnv: z<string, string, "volatile-defined">;
767
+ jinaApiKey: z<string, string, "volatile">;
768
+ jinaApiKeyEnv: z<string, string, "volatile-defined">;
769
+ bochaApiKey: z<string, string, "volatile">;
770
+ bochaApiKeyEnv: z<string, string, "volatile-defined">;
771
+ bochaBaseUrl: z<string, string, "volatile-defined">;
772
+ bochaSummary: z<boolean, boolean, "volatile-defined">;
773
+ githubToken: z<string, string, "volatile">;
774
+ githubTokenEnv: z<string, string, "volatile-defined">;
775
+ searxngUrl: z<string, string, "volatile">;
776
+ openalexMailto: z<string, string, "volatile">;
777
+ cliAdapters: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<import("@deepseek-ai/cosmokit").Dict<any, string>, string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<import("@deepseek-ai/cosmokit").Dict<any, string>, string>>, "volatile">;
813
778
  evidence: z<Schemastery.ObjectS<NoInfer<{
814
779
  scorer: z<"jev" | "rule", "jev" | "rule", "volatile-defined">;
815
780
  jevMode: z<"off" | "shadow" | "control" | "hybrid", "off" | "shadow" | "control" | "hybrid", "volatile-defined">;
@@ -1153,6 +1118,76 @@ export declare const Config: z<Schemastery.ObjectS<NoInfer<{
1153
1118
  }>>, string>, "plain">;
1154
1119
  }>>>, "volatile">;
1155
1120
  }>>, "plain">;
1121
+ fetchDefaultChars: z<number, number, "volatile-defined">;
1122
+ exaContentsPerUrlChars: z<number, number, "volatile-defined">;
1123
+ exaContentsTotalChars: z<number, number, "volatile-defined">;
1124
+ enableCliBackends: z<boolean, boolean, "volatile-defined">;
1125
+ opencliEnabled: z<boolean, boolean, "volatile-defined">;
1126
+ agentReachEnabled: z<boolean, boolean, "volatile-defined">;
1127
+ twitterAuthToken: z<string, string, "volatile">;
1128
+ twitterAuthTokenEnv: z<string, string, "volatile-defined">;
1129
+ twitterCt0: z<string, string, "volatile">;
1130
+ twitterCt0Env: z<string, string, "volatile-defined">;
1131
+ playwright: z<Schemastery.ObjectS<NoInfer<{
1132
+ enabled: z<boolean, boolean, "volatile-defined">;
1133
+ snapshotDir: z<string, string, "volatile">;
1134
+ }>>, Schemastery.ObjectT<NoInfer<{
1135
+ enabled: z<boolean, boolean, "volatile-defined">;
1136
+ snapshotDir: z<string, string, "volatile">;
1137
+ }>>, "plain">;
1138
+ customPlatforms: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<{
1139
+ name?: string | null | undefined;
1140
+ url?: string | null | undefined;
1141
+ item?: string | null | undefined;
1142
+ title?: string | null | undefined;
1143
+ link?: string | null | undefined;
1144
+ text?: string | null | undefined;
1145
+ cookie?: string | null | undefined;
1146
+ } & import("@deepseek-ai/cosmokit").Dict, string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<Schemastery.ObjectT<NoInfer<{
1147
+ name: z<string, string, "plain">;
1148
+ url: z<string, string, "plain">;
1149
+ item: z<string, string, "plain">;
1150
+ title: z<string, string, "plain">;
1151
+ link: z<string, string, "plain">;
1152
+ text: z<string, string, "plain">;
1153
+ cookie: z<string, string, "plain">;
1154
+ }>>, string>>, "volatile">;
1155
+ platformRules: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<{
1156
+ item?: string | null | undefined;
1157
+ title?: string | null | undefined;
1158
+ link?: string | null | undefined;
1159
+ text?: string | null | undefined;
1160
+ } & import("@deepseek-ai/cosmokit").Dict, string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<Schemastery.ObjectT<NoInfer<{
1161
+ item: z<string, string, "plain">;
1162
+ title: z<string, string, "plain">;
1163
+ link: z<string, string, "plain">;
1164
+ text: z<string, string, "plain">;
1165
+ }>>, string>>, "volatile">;
1166
+ browserBindings: z<NoInfer<import("@deepseek-ai/cosmokit").Dict<{
1167
+ authProfile?: string | null | undefined;
1168
+ rulePack?: string | null | undefined;
1169
+ } & import("@deepseek-ai/cosmokit").Dict, string>>, NoInfer<import("@deepseek-ai/cosmokit").Dict<Schemastery.ObjectT<NoInfer<{
1170
+ authProfile: z<string, string, "plain">;
1171
+ rulePack: z<string, string, "plain">;
1172
+ }>>, string>>, "volatile">;
1173
+ providerId: z<string, string, "volatile-defined">;
1174
+ registerProvider: z<boolean, boolean, "volatile-defined">;
1175
+ provider: z<Schemastery.ObjectS<NoInfer<{
1176
+ evidence: z<string, string, "volatile-defined">;
1177
+ deadlineMs: z<number, number, "volatile-defined">;
1178
+ }>>, Schemastery.ObjectT<NoInfer<{
1179
+ evidence: z<string, string, "volatile-defined">;
1180
+ deadlineMs: z<number, number, "volatile-defined">;
1181
+ }>>, "plain">;
1182
+ timeoutMs: z<number, number, "volatile-defined">;
1183
+ ttlSeconds: z<number, number, "volatile-defined">;
1184
+ memoryCacheEntries: z<number, number, "volatile-defined">;
1185
+ rrfConstant: z<number, number, "volatile-defined">;
1186
+ freshnessBoost: z<number, number, "volatile-defined">;
1187
+ freshnessDays: z<number, number, "volatile-defined">;
1188
+ authorityBoost: z<number, number, "volatile-defined">;
1189
+ authorityDomains: z<NoInfer<string[]>, NoInfer<string[]>, "volatile-defined">;
1190
+ dbPath: z<string, string, "volatile">;
1156
1191
  verbose: z<boolean, boolean, "volatile-defined">;
1157
1192
  }>>, "plain">;
1158
1193
  export interface ResolvedConfig extends Config {
@@ -1163,10 +1198,15 @@ export interface ResolvedConfig extends Config {
1163
1198
  jinaApiKey?: string;
1164
1199
  jinaApiKeyEnv: string;
1165
1200
  githubTokenEnv: string;
1201
+ twitterAuthToken?: string;
1202
+ twitterAuthTokenEnv: string;
1203
+ twitterCt0?: string;
1204
+ twitterCt0Env: string;
1166
1205
  bochaApiKey?: string;
1167
1206
  bochaApiKeyEnv: string;
1168
1207
  bochaBaseUrl: string;
1169
1208
  bochaSummary: boolean;
1209
+ deepseekFetch: boolean;
1170
1210
  searxngUrl?: string;
1171
1211
  openalexMailto?: string;
1172
1212
  keyedSources?: Config['keyedSources'];
@@ -1177,8 +1217,6 @@ export interface ResolvedConfig extends Config {
1177
1217
  }
1178
1218
  /** Default database path under the harness home. */
1179
1219
  export declare function defaultDbPath(): string;
1180
- export declare function normalizeJudge<T>(judge: T): T;
1181
- export declare function normalizeRubrics<T>(rubrics: T): T;
1182
- export declare function normalizeCoverage<T>(coverage: T): T;
1220
+ export { normalizeJudge, normalizeRubrics, normalizeCoverage } from './config-fillers.ts';
1183
1221
  /** Resolve a fully-defaulted config from user input. Unwraps volatile fields (schemastery `Volatile<T>`) into plain values so consumers never see the wrapper. */
1184
1222
  export declare function resolveConfig(config: Config): ResolvedConfig;