scoutline 0.22.0 → 0.24.0

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 (325) hide show
  1. package/README.md +108 -26
  2. package/dist/capabilities/investigation.d.ts +134 -0
  3. package/dist/capabilities/investigation.d.ts.map +1 -0
  4. package/dist/capabilities/investigation.js +278 -0
  5. package/dist/capabilities/investigation.js.map +1 -0
  6. package/dist/capabilities/search.d.ts +18 -4
  7. package/dist/capabilities/search.d.ts.map +1 -1
  8. package/dist/commands/config.d.ts.map +1 -1
  9. package/dist/commands/config.js +14 -5
  10. package/dist/commands/config.js.map +1 -1
  11. package/dist/commands/crawl.d.ts.map +1 -1
  12. package/dist/commands/crawl.js +2 -1
  13. package/dist/commands/crawl.js.map +1 -1
  14. package/dist/commands/doctor.d.ts.map +1 -1
  15. package/dist/commands/doctor.js +2 -1
  16. package/dist/commands/doctor.js.map +1 -1
  17. package/dist/commands/init.d.ts +42 -1
  18. package/dist/commands/init.d.ts.map +1 -1
  19. package/dist/commands/init.js +42 -5
  20. package/dist/commands/init.js.map +1 -1
  21. package/dist/commands/investigate.d.ts +232 -0
  22. package/dist/commands/investigate.d.ts.map +1 -0
  23. package/dist/commands/investigate.js +838 -0
  24. package/dist/commands/investigate.js.map +1 -0
  25. package/dist/commands/map.d.ts.map +1 -1
  26. package/dist/commands/map.js +2 -1
  27. package/dist/commands/map.js.map +1 -1
  28. package/dist/commands/quota.d.ts.map +1 -1
  29. package/dist/commands/quota.js +2 -2
  30. package/dist/commands/quota.js.map +1 -1
  31. package/dist/commands/read.d.ts.map +1 -1
  32. package/dist/commands/read.js +2 -1
  33. package/dist/commands/read.js.map +1 -1
  34. package/dist/commands/repo.js +1 -1
  35. package/dist/commands/research.d.ts.map +1 -1
  36. package/dist/commands/research.js +2 -1
  37. package/dist/commands/research.js.map +1 -1
  38. package/dist/commands/search.d.ts +54 -6
  39. package/dist/commands/search.d.ts.map +1 -1
  40. package/dist/commands/search.js +273 -25
  41. package/dist/commands/search.js.map +1 -1
  42. package/dist/commands/vision.d.ts.map +1 -1
  43. package/dist/commands/vision.js +15 -2
  44. package/dist/commands/vision.js.map +1 -1
  45. package/dist/index.d.ts +93 -1
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +737 -14
  48. package/dist/index.js.map +1 -1
  49. package/dist/lib/code-mode.d.ts +12 -0
  50. package/dist/lib/code-mode.d.ts.map +1 -1
  51. package/dist/lib/code-mode.js +18 -10
  52. package/dist/lib/code-mode.js.map +1 -1
  53. package/dist/lib/config-store.d.ts +45 -1
  54. package/dist/lib/config-store.d.ts.map +1 -1
  55. package/dist/lib/config-store.js +70 -1
  56. package/dist/lib/config-store.js.map +1 -1
  57. package/dist/lib/config.d.ts.map +1 -1
  58. package/dist/lib/config.js +5 -1
  59. package/dist/lib/config.js.map +1 -1
  60. package/dist/lib/errors.d.ts +7 -1
  61. package/dist/lib/errors.d.ts.map +1 -1
  62. package/dist/lib/errors.js +8 -2
  63. package/dist/lib/errors.js.map +1 -1
  64. package/dist/lib/execution.d.ts +14 -5
  65. package/dist/lib/execution.d.ts.map +1 -1
  66. package/dist/lib/execution.js +25 -6
  67. package/dist/lib/execution.js.map +1 -1
  68. package/dist/lib/investigate-claims.d.ts +90 -0
  69. package/dist/lib/investigate-claims.d.ts.map +1 -0
  70. package/dist/lib/investigate-claims.js +188 -0
  71. package/dist/lib/investigate-claims.js.map +1 -0
  72. package/dist/lib/investigate-extract.d.ts +35 -0
  73. package/dist/lib/investigate-extract.d.ts.map +1 -0
  74. package/dist/lib/investigate-extract.js +101 -0
  75. package/dist/lib/investigate-extract.js.map +1 -0
  76. package/dist/lib/investigate-planner.d.ts +58 -0
  77. package/dist/lib/investigate-planner.d.ts.map +1 -0
  78. package/dist/lib/investigate-planner.js +141 -0
  79. package/dist/lib/investigate-planner.js.map +1 -0
  80. package/dist/lib/mcp-client.d.ts +7 -0
  81. package/dist/lib/mcp-client.d.ts.map +1 -1
  82. package/dist/lib/mcp-client.js +11 -1
  83. package/dist/lib/mcp-client.js.map +1 -1
  84. package/dist/lib/parse-zoned-instant.d.ts +13 -0
  85. package/dist/lib/parse-zoned-instant.d.ts.map +1 -0
  86. package/dist/lib/parse-zoned-instant.js +17 -0
  87. package/dist/lib/parse-zoned-instant.js.map +1 -0
  88. package/dist/lib/quota-mapping.d.ts +4 -2
  89. package/dist/lib/quota-mapping.d.ts.map +1 -1
  90. package/dist/lib/quota-mapping.js +25 -2
  91. package/dist/lib/quota-mapping.js.map +1 -1
  92. package/dist/lib/redact.d.ts +3 -2
  93. package/dist/lib/redact.d.ts.map +1 -1
  94. package/dist/lib/redact.js +90 -24
  95. package/dist/lib/redact.js.map +1 -1
  96. package/dist/lib/timeout.d.ts +28 -0
  97. package/dist/lib/timeout.d.ts.map +1 -0
  98. package/dist/lib/timeout.js +30 -0
  99. package/dist/lib/timeout.js.map +1 -0
  100. package/dist/lib/url.d.ts +10 -4
  101. package/dist/lib/url.d.ts.map +1 -1
  102. package/dist/lib/url.js +21 -6
  103. package/dist/lib/url.js.map +1 -1
  104. package/dist/providers/arxiv/client.d.ts +4 -1
  105. package/dist/providers/arxiv/client.d.ts.map +1 -1
  106. package/dist/providers/arxiv/client.js +11 -3
  107. package/dist/providers/arxiv/client.js.map +1 -1
  108. package/dist/providers/bocha/adapter.d.ts +43 -0
  109. package/dist/providers/bocha/adapter.d.ts.map +1 -0
  110. package/dist/providers/bocha/adapter.js +197 -0
  111. package/dist/providers/bocha/adapter.js.map +1 -0
  112. package/dist/providers/bocha/client.d.ts +51 -0
  113. package/dist/providers/bocha/client.d.ts.map +1 -0
  114. package/dist/providers/bocha/client.js +104 -0
  115. package/dist/providers/bocha/client.js.map +1 -0
  116. package/dist/providers/bocha/credentials.d.ts +12 -0
  117. package/dist/providers/bocha/credentials.d.ts.map +1 -0
  118. package/dist/providers/bocha/credentials.js +29 -0
  119. package/dist/providers/bocha/credentials.js.map +1 -0
  120. package/dist/providers/bocha/diagnostics.d.ts +17 -0
  121. package/dist/providers/bocha/diagnostics.d.ts.map +1 -0
  122. package/dist/providers/bocha/diagnostics.js +33 -0
  123. package/dist/providers/bocha/diagnostics.js.map +1 -0
  124. package/dist/providers/brave/adapter.d.ts.map +1 -1
  125. package/dist/providers/brave/adapter.js +4 -3
  126. package/dist/providers/brave/adapter.js.map +1 -1
  127. package/dist/providers/brave/client.d.ts +1 -0
  128. package/dist/providers/brave/client.d.ts.map +1 -1
  129. package/dist/providers/brave/client.js +4 -6
  130. package/dist/providers/brave/client.js.map +1 -1
  131. package/dist/providers/brave/credentials.d.ts +2 -0
  132. package/dist/providers/brave/credentials.d.ts.map +1 -1
  133. package/dist/providers/brave/credentials.js +2 -0
  134. package/dist/providers/brave/credentials.js.map +1 -1
  135. package/dist/providers/catalog.d.ts +34 -0
  136. package/dist/providers/catalog.d.ts.map +1 -0
  137. package/dist/providers/catalog.js +57 -0
  138. package/dist/providers/catalog.js.map +1 -0
  139. package/dist/providers/crossref/adapter.js +2 -2
  140. package/dist/providers/crossref/adapter.js.map +1 -1
  141. package/dist/providers/crossref/client.d.ts +4 -1
  142. package/dist/providers/crossref/client.d.ts.map +1 -1
  143. package/dist/providers/crossref/client.js +11 -3
  144. package/dist/providers/crossref/client.js.map +1 -1
  145. package/dist/providers/crossref/diagnostics.d.ts +1 -1
  146. package/dist/providers/crossref/diagnostics.js +1 -1
  147. package/dist/providers/crossref/diagnostics.js.map +1 -1
  148. package/dist/providers/europepmc/adapter.js +2 -2
  149. package/dist/providers/europepmc/adapter.js.map +1 -1
  150. package/dist/providers/europepmc/client.d.ts +4 -1
  151. package/dist/providers/europepmc/client.d.ts.map +1 -1
  152. package/dist/providers/europepmc/client.js +11 -3
  153. package/dist/providers/europepmc/client.js.map +1 -1
  154. package/dist/providers/exa/client.d.ts +1 -0
  155. package/dist/providers/exa/client.d.ts.map +1 -1
  156. package/dist/providers/exa/client.js +3 -2
  157. package/dist/providers/exa/client.js.map +1 -1
  158. package/dist/providers/exa/credentials.d.ts +2 -0
  159. package/dist/providers/exa/credentials.d.ts.map +1 -1
  160. package/dist/providers/exa/credentials.js +2 -0
  161. package/dist/providers/exa/credentials.js.map +1 -1
  162. package/dist/providers/firecrawl/adapter.d.ts.map +1 -1
  163. package/dist/providers/firecrawl/adapter.js +2 -1
  164. package/dist/providers/firecrawl/adapter.js.map +1 -1
  165. package/dist/providers/firecrawl/client.d.ts +1 -0
  166. package/dist/providers/firecrawl/client.d.ts.map +1 -1
  167. package/dist/providers/firecrawl/client.js +3 -2
  168. package/dist/providers/firecrawl/client.js.map +1 -1
  169. package/dist/providers/firecrawl/credentials.d.ts +2 -0
  170. package/dist/providers/firecrawl/credentials.d.ts.map +1 -1
  171. package/dist/providers/firecrawl/credentials.js +2 -0
  172. package/dist/providers/firecrawl/credentials.js.map +1 -1
  173. package/dist/providers/firecrawl/quota.d.ts.map +1 -1
  174. package/dist/providers/firecrawl/quota.js +5 -2
  175. package/dist/providers/firecrawl/quota.js.map +1 -1
  176. package/dist/providers/jina/adapter.d.ts.map +1 -1
  177. package/dist/providers/jina/adapter.js +6 -4
  178. package/dist/providers/jina/adapter.js.map +1 -1
  179. package/dist/providers/jina/client.d.ts +2 -0
  180. package/dist/providers/jina/client.d.ts.map +1 -1
  181. package/dist/providers/jina/client.js +6 -5
  182. package/dist/providers/jina/client.js.map +1 -1
  183. package/dist/providers/jina/credentials.d.ts +2 -0
  184. package/dist/providers/jina/credentials.d.ts.map +1 -1
  185. package/dist/providers/jina/credentials.js +2 -0
  186. package/dist/providers/jina/credentials.js.map +1 -1
  187. package/dist/providers/kagi/adapter.d.ts +44 -0
  188. package/dist/providers/kagi/adapter.d.ts.map +1 -0
  189. package/dist/providers/kagi/adapter.js +188 -0
  190. package/dist/providers/kagi/adapter.js.map +1 -0
  191. package/dist/providers/kagi/client.d.ts +41 -0
  192. package/dist/providers/kagi/client.d.ts.map +1 -0
  193. package/dist/providers/kagi/client.js +100 -0
  194. package/dist/providers/kagi/client.js.map +1 -0
  195. package/dist/providers/kagi/credentials.d.ts +15 -0
  196. package/dist/providers/kagi/credentials.d.ts.map +1 -0
  197. package/dist/providers/kagi/credentials.js +35 -0
  198. package/dist/providers/kagi/credentials.js.map +1 -0
  199. package/dist/providers/kagi/diagnostics.d.ts +17 -0
  200. package/dist/providers/kagi/diagnostics.d.ts.map +1 -0
  201. package/dist/providers/kagi/diagnostics.js +33 -0
  202. package/dist/providers/kagi/diagnostics.js.map +1 -0
  203. package/dist/providers/linkup/client.d.ts +1 -0
  204. package/dist/providers/linkup/client.d.ts.map +1 -1
  205. package/dist/providers/linkup/client.js +3 -2
  206. package/dist/providers/linkup/client.js.map +1 -1
  207. package/dist/providers/linkup/credentials.d.ts +2 -0
  208. package/dist/providers/linkup/credentials.d.ts.map +1 -1
  209. package/dist/providers/linkup/credentials.js +2 -0
  210. package/dist/providers/linkup/credentials.js.map +1 -1
  211. package/dist/providers/minimax/adapter.d.ts.map +1 -1
  212. package/dist/providers/minimax/adapter.js +2 -2
  213. package/dist/providers/minimax/adapter.js.map +1 -1
  214. package/dist/providers/minimax/coding-plan-client.d.ts +1 -0
  215. package/dist/providers/minimax/coding-plan-client.d.ts.map +1 -1
  216. package/dist/providers/minimax/coding-plan-client.js +3 -2
  217. package/dist/providers/minimax/coding-plan-client.js.map +1 -1
  218. package/dist/providers/minimax/quota-client.d.ts +1 -0
  219. package/dist/providers/minimax/quota-client.d.ts.map +1 -1
  220. package/dist/providers/minimax/quota-client.js +3 -2
  221. package/dist/providers/minimax/quota-client.js.map +1 -1
  222. package/dist/providers/openalex/client.d.ts +2 -0
  223. package/dist/providers/openalex/client.d.ts.map +1 -1
  224. package/dist/providers/openalex/client.js +10 -3
  225. package/dist/providers/openalex/client.js.map +1 -1
  226. package/dist/providers/openalex/diagnostics.d.ts +1 -1
  227. package/dist/providers/openalex/diagnostics.js +1 -1
  228. package/dist/providers/openalex/diagnostics.js.map +1 -1
  229. package/dist/providers/parallel/client.d.ts +1 -0
  230. package/dist/providers/parallel/client.d.ts.map +1 -1
  231. package/dist/providers/parallel/client.js +3 -2
  232. package/dist/providers/parallel/client.js.map +1 -1
  233. package/dist/providers/parallel/credentials.d.ts +2 -0
  234. package/dist/providers/parallel/credentials.d.ts.map +1 -1
  235. package/dist/providers/parallel/credentials.js +2 -0
  236. package/dist/providers/parallel/credentials.js.map +1 -1
  237. package/dist/providers/perplexity/client.d.ts +2 -0
  238. package/dist/providers/perplexity/client.d.ts.map +1 -1
  239. package/dist/providers/perplexity/client.js +5 -4
  240. package/dist/providers/perplexity/client.js.map +1 -1
  241. package/dist/providers/perplexity/credentials.d.ts +2 -0
  242. package/dist/providers/perplexity/credentials.d.ts.map +1 -1
  243. package/dist/providers/perplexity/credentials.js +2 -0
  244. package/dist/providers/perplexity/credentials.js.map +1 -1
  245. package/dist/providers/pubmed/client.d.ts +2 -0
  246. package/dist/providers/pubmed/client.d.ts.map +1 -1
  247. package/dist/providers/pubmed/client.js +10 -3
  248. package/dist/providers/pubmed/client.js.map +1 -1
  249. package/dist/providers/registry.d.ts.map +1 -1
  250. package/dist/providers/registry.js +10 -1
  251. package/dist/providers/registry.js.map +1 -1
  252. package/dist/providers/searchapi/adapter.d.ts +54 -0
  253. package/dist/providers/searchapi/adapter.d.ts.map +1 -0
  254. package/dist/providers/searchapi/adapter.js +310 -0
  255. package/dist/providers/searchapi/adapter.js.map +1 -0
  256. package/dist/providers/searchapi/client.d.ts +73 -0
  257. package/dist/providers/searchapi/client.d.ts.map +1 -0
  258. package/dist/providers/searchapi/client.js +196 -0
  259. package/dist/providers/searchapi/client.js.map +1 -0
  260. package/dist/providers/searchapi/credentials.d.ts +46 -0
  261. package/dist/providers/searchapi/credentials.d.ts.map +1 -0
  262. package/dist/providers/searchapi/credentials.js +71 -0
  263. package/dist/providers/searchapi/credentials.js.map +1 -0
  264. package/dist/providers/searchapi/diagnostics.d.ts +48 -0
  265. package/dist/providers/searchapi/diagnostics.d.ts.map +1 -0
  266. package/dist/providers/searchapi/diagnostics.js +70 -0
  267. package/dist/providers/searchapi/diagnostics.js.map +1 -0
  268. package/dist/providers/searchapi/quota.d.ts +60 -0
  269. package/dist/providers/searchapi/quota.d.ts.map +1 -0
  270. package/dist/providers/searchapi/quota.js +125 -0
  271. package/dist/providers/searchapi/quota.js.map +1 -0
  272. package/dist/providers/spider/client.d.ts +2 -0
  273. package/dist/providers/spider/client.d.ts.map +1 -1
  274. package/dist/providers/spider/client.js +16 -6
  275. package/dist/providers/spider/client.js.map +1 -1
  276. package/dist/providers/spider/credentials.d.ts +2 -0
  277. package/dist/providers/spider/credentials.d.ts.map +1 -1
  278. package/dist/providers/spider/credentials.js +2 -0
  279. package/dist/providers/spider/credentials.js.map +1 -1
  280. package/dist/providers/tavily/client.d.ts +1 -0
  281. package/dist/providers/tavily/client.d.ts.map +1 -1
  282. package/dist/providers/tavily/client.js +3 -2
  283. package/dist/providers/tavily/client.js.map +1 -1
  284. package/dist/providers/tavily/credentials.d.ts +2 -0
  285. package/dist/providers/tavily/credentials.d.ts.map +1 -1
  286. package/dist/providers/tavily/credentials.js +2 -0
  287. package/dist/providers/tavily/credentials.js.map +1 -1
  288. package/dist/providers/types.d.ts +31 -2
  289. package/dist/providers/types.d.ts.map +1 -1
  290. package/dist/providers/types.js +3 -0
  291. package/dist/providers/types.js.map +1 -1
  292. package/dist/providers/you/client.d.ts +4 -0
  293. package/dist/providers/you/client.d.ts.map +1 -1
  294. package/dist/providers/you/client.js +4 -5
  295. package/dist/providers/you/client.js.map +1 -1
  296. package/dist/providers/you/credentials.d.ts +2 -0
  297. package/dist/providers/you/credentials.d.ts.map +1 -1
  298. package/dist/providers/you/credentials.js +3 -3
  299. package/dist/providers/you/credentials.js.map +1 -1
  300. package/dist/providers/zai/adapter.d.ts.map +1 -1
  301. package/dist/providers/zai/adapter.js +219 -4
  302. package/dist/providers/zai/adapter.js.map +1 -1
  303. package/dist/providers/zai/credentials.d.ts +2 -0
  304. package/dist/providers/zai/credentials.d.ts.map +1 -1
  305. package/dist/providers/zai/credentials.js +2 -0
  306. package/dist/providers/zai/credentials.js.map +1 -1
  307. package/dist/providers/zai/layout-parsing.d.ts +76 -0
  308. package/dist/providers/zai/layout-parsing.d.ts.map +1 -0
  309. package/dist/providers/zai/layout-parsing.js +151 -0
  310. package/dist/providers/zai/layout-parsing.js.map +1 -0
  311. package/dist/providers/zai/media.d.ts +19 -0
  312. package/dist/providers/zai/media.d.ts.map +1 -1
  313. package/dist/providers/zai/media.js +61 -0
  314. package/dist/providers/zai/media.js.map +1 -1
  315. package/dist/providers/zai/monitor-client.d.ts +1 -0
  316. package/dist/providers/zai/monitor-client.d.ts.map +1 -1
  317. package/dist/providers/zai/monitor-client.js +3 -2
  318. package/dist/providers/zai/monitor-client.js.map +1 -1
  319. package/dist/providers/zai/quota.d.ts +4 -0
  320. package/dist/providers/zai/quota.d.ts.map +1 -1
  321. package/dist/providers/zai/quota.js +16 -1
  322. package/dist/providers/zai/quota.js.map +1 -1
  323. package/package.json +1 -1
  324. package/skills/scoutline/SKILL.md +163 -45
  325. package/skills/scoutline/references/advanced.md +12 -10
@@ -2,20 +2,20 @@
2
2
  name: scoutline
3
3
  description: |
4
4
  Z.AI, MiniMax, Tavily, Exa, Brave, Firecrawl, Parallel AI, Perplexity, Jina AI, You.com,
5
- Linkup, and Spider.cloud CLI for: web search (multi-provider, domain/recency/topic
6
- filters), reading pages to markdown, evidentiary HTTP fetch with MD5/SHA-256 digests,
7
- Wayback archive lookups and snapshot-vs-live diffing, keyless page monitoring,
8
- image/video vision analysis, multi-page site crawls, URL-set mapping, deep research
9
- with citations, GitHub repo exploration, and raw MCP tool calls. Select per command
10
- with --provider <zai|minimax|tavily|exa|brave|firecrawl|parallel|perplexity|jina|
11
- you|linkup|spider>; always-on provider fallback reroutes to the next configured
12
- supplier when one is unavailable.
5
+ Linkup, Spider.cloud, Bocha AI, SearchApi, and Kagi CLI for: web search (multi-provider,
6
+ domain/recency/topic filters), reading pages to markdown, evidentiary HTTP fetch with
7
+ MD5/SHA-256 digests, Wayback archive lookups and snapshot-vs-live diffing, keyless page
8
+ monitoring, image/video vision analysis, multi-page site crawls, URL-set mapping, deep
9
+ research with citations, GitHub repo exploration, and raw MCP tool calls. Select per
10
+ command with --provider <zai|minimax|tavily|exa|brave|firecrawl|parallel|perplexity|
11
+ jina|you|linkup|spider|bocha|searchapi|kagi>; always-on provider fallback reroutes to
12
+ the next configured supplier when one is unavailable.
13
13
  ---
14
14
 
15
15
  # Scoutline
16
16
 
17
17
  Access Z.AI, MiniMax, Tavily, Exa, Brave, Firecrawl, Parallel AI, Perplexity, Jina AI, You.com,
18
- Linkup, and Spider.cloud capabilities via `scoutline`. The
18
+ Linkup, Spider.cloud, Bocha AI, SearchApi, and Kagi capabilities via `scoutline`. The
19
19
  CLI is self-documenting — use `--help` at any level.
20
20
 
21
21
  ## Setup
@@ -56,6 +56,15 @@ export LINKUP_API_KEY="your-linkup-key"
56
56
 
57
57
  # OR Spider.cloud (Search, Reader, Crawl, Map)
58
58
  export SPIDER_API_KEY="your-spider-key"
59
+
60
+ # OR Bocha AI (Search)
61
+ export BOCHA_API_KEY="your-bocha-key"
62
+
63
+ # OR SearchApi (Search, Quota)
64
+ export SEARCHAPI_API_KEY="your-searchapi-key"
65
+
66
+ # OR Kagi (Search)
67
+ export KAGI_API_KEY="your-kagi-key"
59
68
  ```
60
69
 
61
70
  Get a Z.AI key at: https://z.ai/manage-apikey/apikey-list
@@ -70,6 +79,9 @@ Get a Jina AI key at: https://jina.ai
70
79
  Get a You.com key at: https://you.com/api
71
80
  Get a Linkup key at: https://app.linkup.so
72
81
  Get a Spider.cloud key at: https://spider.cloud
82
+ Get a Bocha AI key at: https://open.bochaai.com
83
+ Get a SearchApi key at: https://www.searchapi.io
84
+ Get a Kagi key at: https://kagi.com/settings/api
73
85
 
74
86
  ### Interactive onboarding (`scoutline init`)
75
87
 
@@ -101,7 +113,7 @@ or env vars; API keys never belong in command arguments.
101
113
 
102
114
  Shared commands (`search`, `vision analyze`, `quota`, `doctor`),
103
115
  **`repo`**, **`read`**, **`crawl`**, **`map`**, and **`research`**
104
- accept the global `--provider <zai|minimax|tavily|exa|brave|firecrawl|parallel|perplexity|jina|you|linkup|spider>` flag. Precedence
116
+ accept the global `--provider <zai|minimax|tavily|exa|brave|firecrawl|parallel|perplexity|jina|you|linkup|spider|bocha|searchapi|kagi>` flag. Precedence
105
117
  is the flag, then the `SCOUTLINE_PROVIDER` environment variable, then
106
118
  the default `zai`. Provider selection is never inferred from
107
119
  credentials. Unknown values fail fast with `VALIDATION_ERROR`.
@@ -110,12 +122,13 @@ credentials. Unknown values fail fast with `VALIDATION_ERROR`.
110
122
  remain Z.AI-only.
111
123
 
112
124
  Capability coverage at launch (generated from the production registry
113
- in registry order `[zai, minimax, tavily, exa, brave, firecrawl, parallel, perplexity, jina, you, linkup, spider]`):
125
+ in registry order `[zai, minimax, tavily, exa, brave, firecrawl, parallel, perplexity, jina, you, linkup, spider, bocha, searchapi, kagi]`):
114
126
 
115
127
  - `search` — Z.AI, MiniMax, Tavily, Exa, Brave, Firecrawl, Parallel AI,
116
- Perplexity, Jina AI, You.com, Linkup, and Spider.cloud. The only search
117
- control honored by every Provider
118
- is `--topic <general|news|finance>`.
128
+ Perplexity, Jina AI, You.com, Linkup, Spider.cloud, Bocha AI, SearchApi,
129
+ and Kagi. The only search control honored by every Provider
130
+ is `--topic <general|news|finance>` (Firecrawl rejects the `finance`
131
+ value, so option-level fallback retries it on the next candidate).
119
132
  Brave is the only Provider that accepts `--type video`; every other
120
133
  Provider rejects `controls.type` as `UnsupportedOptionError` so
121
134
  option-level fallback continues to Brave.
@@ -123,15 +136,25 @@ in registry order `[zai, minimax, tavily, exa, brave, firecrawl, parallel, perpl
123
136
  (`ui-artifact`, `extract-text`, `diagnose-error`, `diagram`, `chart`)
124
137
  follow the same registry and are mediated by MiniMax's compiled
125
138
  conformance registry.
139
+ - `vision.extract-text` on Z.AI routes to the GLM-OCR specialist
140
+ (`layout_parsing`, PAYG balance-gated): verbatim markdown extraction,
141
+ PDF input accepted (≤50 MB; images ≤10 MB), content-hash cached for
142
+ 24 h (disable for a run with `SCOUTLINE_CACHE=0`). On exhaustion (error 1113) it prints one
143
+ stderr notice and falls back to the plan-covered vision model with
144
+ identical invocation semantics. `--language` and a custom `[prompt]`
145
+ are warn-and-strip on the OCR arm (stderr notice) and honored
146
+ verbatim on the fallback arm and on MiniMax.
126
147
  - `quota` — Z.AI, MiniMax, Tavily, Firecrawl (credits), Brave
127
148
  (rate-limit window), Jina AI (rate-limit telemetry), Linkup and
128
- Spider.cloud (credit balance, limit unknown). Exa, Parallel AI,
129
- Perplexity, and You.com do not advertise quota.
149
+ Spider.cloud (credit balance, limit unknown), and SearchApi (credits).
150
+ Exa, Parallel AI, Perplexity, You.com, Bocha AI, and Kagi do not
151
+ advertise quota.
130
152
  - `diagnostics` — every built-in Provider (Z.AI, MiniMax, Tavily, Exa,
131
153
  Brave, Firecrawl, Parallel AI, Perplexity, Jina AI, You.com, Linkup,
132
- Spider.cloud).
154
+ Spider.cloud, Bocha AI, SearchApi, and Kagi).
133
155
  - `read` — Z.AI, Tavily, Exa, Firecrawl, Parallel AI, Jina AI, You.com,
134
- Linkup, and Spider.cloud (MiniMax, Brave, and Perplexity do not
156
+ Linkup, and Spider.cloud (MiniMax, Brave, Perplexity, Bocha AI,
157
+ SearchApi, and Kagi do not
135
158
  advertise it; Tavily/Exa/Firecrawl/Parallel reject Z.AI-only reader
136
159
  options: `--with-links`, `--no-gfm`, `--keep-img-data-url`,
137
160
  `--with-images-summary`; Jina maps them natively; You.com mirrors the
@@ -156,17 +179,19 @@ Vision by Z.AI and MiniMax only. **Provider
156
179
  fallback is always-on by default**
157
180
  (0.11.0+): selecting a non-supplier emits a stderr notice and silently
158
181
  reroutes to the next eligible configured Provider in registry order
159
- `[zai, minimax, tavily, exa, brave, firecrawl, parallel, perplexity, jina, you, linkup, spider]`. Pass
182
+ `[zai, minimax, tavily, exa, brave, firecrawl, parallel, perplexity, jina, you, linkup, spider, bocha, searchapi, kagi]`. Pass
160
183
  `--no-fallback` (or set `SCOUTLINE_NO_FALLBACK=1`) to restore the
161
184
  previous strict `UNSUPPORTED_CAPABILITY` behavior — the preflight
162
185
  still runs capability metadata → configuration → adapter handle in
163
186
  order on the effective Provider only.
164
187
 
165
- ### Search fan-out (multi-provider search, ADR-0004)
188
+ ### Search fan-out (multi-provider search, ADR-0012)
166
189
 
167
190
  `search` alone can run one query across several providers in parallel
168
- and merge the results (dedupe by canonical URL identity, occurrence
169
- ranking, additive `mergedFrom` provenance per result; arms are pinned —
191
+ and merge the results (dedupe by canonical URL identity with
192
+ near-duplicate title clustering, fusion ranking — `rrf` by default,
193
+ `config set fusion occurrence` restores the legacy ordering — and
194
+ additive `mergedFrom` provenance per result; arms are pinned —
170
195
  no per-arm fallback, and an arm that rejects a control drops with a
171
196
  stderr notice instead of failing the invocation). Activation tiers:
172
197
 
@@ -184,6 +209,17 @@ stderr notice instead of failing the invocation). Activation tiers:
184
209
  billable calls.** Use it when recall across providers matters more than
185
210
  spend; use a single `--provider` pin when it does not.
186
211
 
212
+ ### Fusion ranking (merged search)
213
+
214
+ Merged lists (fan-out and `--merge`) rank by `fusion` (config key;
215
+ `SCOUTLINE_FUSION` env wins; no `--fusion` flag): `rrf` (default) scores
216
+ Σ 1/(60 + rank) over every arm × sub-query occurrence and emits a fixed
217
+ 3-decimal `fusionScore` on every row; `occurrence` restores the legacy
218
+ ordering byte-for-byte. Near-dup clustering (3-word title shingles,
219
+ Jaccard ≥ 0.8, ≥ 4 shingles) runs in both modes — absorbed urls travel
220
+ verbatim on the representative's `clusterUrls`; `www`/apex hosts
221
+ collapse to one identity.
222
+
187
223
  ### Local context (`--context` / `--context-stdin`)
188
224
 
189
225
  `research` and `search` accept a local notes file (markdown headings +
@@ -246,27 +282,29 @@ scoutline search "x" --no-journal # skip this one call
246
282
 
247
283
  ## Capability Matrix
248
284
 
249
- | Capability | Z.AI | MiniMax | Tavily | Exa | Brave | Firecrawl | Parallel | Perplexity | Jina AI | You.com | Linkup | Spider.cloud | arXiv | OpenAlex | Crossref | PubMed | Europe PMC | Command |
250
- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
251
- | Search | Yes | Yes (no domain/recency/content-size/location) | Yes (no location) | Yes (no location) | Yes (web/news/video; `--content-size high` → LLM Context) | Yes (no location; `--content-size high` = markdown, +1 credit/result) | Yes (domain, recency, location, content-size via `advanced_settings`; topic via keyword) | Yes (domain, recency, content-size; topic via keyword) | Yes (domain, location; rejects recency/content-size; topic via keyword) | Yes | Yes | Yes | No | No | No | No | No | `scoutline search` |
252
- | General single-image interpretation | Yes | Yes (JPG/JPEG/PNG/WebP ≤50 MiB) | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | `scoutline vision analyze` |
253
- | Specialized Vision (UI-to-code, OCR, error diagnosis, diagram) | Yes | Available (live-attested; conformance-gated) | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | `scoutline vision ui-to-code`, `vision extract-text`, `vision diagnose-error`, `vision diagram` |
254
- | Specialized Vision (chart) | Yes | Pending (implemented; fixture image defect blocks live conformance) | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | `scoutline vision chart` |
255
- | Two-image diff, video | Yes | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | `scoutline vision diff`, `vision video` |
256
- | Quota (normalized) | Yes | Yes | Yes | **No** (deferred) | Yes (rate-limit window, not spend) | Yes (credits) | **No** | **No** | Yes (rate-limit telemetry, not spend) | **No** | Yes (credit balance, not spend) | Yes (credit balance, not spend) | No | No | No | No | No | `scoutline quota [--all-providers]` |
257
- | Diagnostics | Yes | Yes | Yes | Yes | Yes | Yes (single-scrape probe) | Yes | Yes | Yes | Yes | Yes | Yes | Yes (keyless probe) | Yes (keyless probe) | Yes (keyless probe) | Yes (keyless probe) | Yes (keyless probe) | `scoutline doctor [--no-tools] [--available]`; every row carries `availability` (`ok`/`exhausted`/`error`/`unconfigured`), rows sort healthy-first, and `availableProviders` lists the `ok` providers in registry order |
258
- | Reader | Yes | **No** (UNSUPPORTED_CAPABILITY) | Yes (rejects Z.AI-only options) | Yes (rejects Z.AI-only options) | **No** (UNSUPPORTED_CAPABILITY) | Yes (returns page titles) | Yes | **No** (UNSUPPORTED_CAPABILITY) | Yes | Yes (rejects Z.AI-only options plus `--format text`) | Yes (renders JavaScript; rejects `--format text` and `--no-images`) | Yes (rejects Z.AI-only options) | No | No | No | No | No | `scoutline read` |
259
- | Repository exploration (search/read/tree/brief) | Yes | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | No | No | No | No | No | `scoutline repo ...` |
260
- | Crawl | **No** | **No** | Yes | **No** | **No** | Yes (async; resumable after Ctrl-C) | **No** | **No** | **No** | **No** | **No** | Yes (sync) | No | No | No | No | No | `scoutline crawl` |
261
- | Map | **No** | **No** | Yes | **No** | **No** | Yes | **No** | **No** | **No** | **No** | **No** | Yes | No | No | No | No | No | `scoutline map` |
262
- | Research (4-250 credits) | **No** | **No** | Yes | Yes | **No** | **No** (`/deep-research` deprecated) | Yes | Yes | Yes | Yes | Yes | **No** | No | No | No | No | No | `scoutline research` |
263
- | Science (scholarly search/get) | No | No | No | No | No | No | No | No | No | No | No | No | Yes | Yes | Yes | Yes | Yes | `scoutline science search <query>` / `scoutline science get <identifier>`; keyless — no API key required; controls `--author`/`--year`/`--venue`/`--type` consumed only where the supplier wire supports them |
264
- | Raw tools | Yes | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | `scoutline tools`, `tool`, `call` |
265
- | Code Mode | Yes | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | `scoutline code ...` |
285
+ | Capability | Z.AI | MiniMax | Tavily | Exa | Brave | Firecrawl | Parallel | Perplexity | Jina AI | You.com | Linkup | Spider.cloud | Bocha AI | SearchApi | Kagi | arXiv | OpenAlex | Crossref | PubMed | Europe PMC | Command |
286
+ | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
287
+ | Search | Yes | Yes (no domain/recency/content-size/location) | Yes (no location) | Yes (no location) | Yes (web/news/video; `--content-size high` → LLM Context) | Yes (no location; `--content-size high` = markdown, +1 credit/result) | Yes (domain, recency, location, content-size via `advanced_settings`; topic via keyword) | Yes (domain, recency, content-size; topic via keyword) | Yes (domain, location; rejects recency/content-size; topic via keyword) | Yes | Yes | Yes | Yes (no location/type; domain via `site:` prefix) | Yes (no content-size/type; domain via `site:` prefix) | Yes (no location/recency/content-size/type; domain via `site:` prefix; `--topic news` → `/api/v0/enrich/news`) | No | No | No | No | No | `scoutline search` |
288
+ | General single-image interpretation | Yes | Yes (JPG/JPEG/PNG/WebP ≤50 MiB) | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | `scoutline vision analyze` |
289
+ | Specialized Vision (UI-to-code, OCR, error diagnosis, diagram) | Yes (extract-text = glm-ocr engine with exhaustion fallback; PDF ≤50 MB accepted) | Available (live-attested; conformance-gated) | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | `scoutline vision ui-to-code`, `vision extract-text`, `vision diagnose-error`, `vision diagram` |
290
+ | Specialized Vision (chart) | Yes | Pending (implemented; fixture image defect blocks live conformance) | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | `scoutline vision chart` |
291
+ | Two-image diff, video | Yes | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | `scoutline vision diff`, `vision video` |
292
+ | Quota (normalized) | Yes | Yes | Yes | **No** (deferred) | Yes (rate-limit window, not spend) | Yes (credits) | **No** | **No** | Yes (rate-limit telemetry, not spend) | **No** | Yes (credit balance, not spend) | Yes (credit balance, not spend) | No | Yes | No | No | No | No | No | No | `scoutline quota [--all-providers]` |
293
+ | Diagnostics | Yes | Yes | Yes | Yes | Yes | Yes (single-scrape probe) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes (keyless probe) | Yes (keyless probe) | Yes (keyless probe) | Yes (keyless probe) | Yes (keyless probe) | `scoutline doctor [--no-tools] [--available]`; every row carries `availability` (`ok`/`exhausted`/`error`/`unconfigured`), rows sort healthy-first, and `availableProviders` lists the `ok` providers in registry order |
294
+ | Reader | Yes | **No** (UNSUPPORTED_CAPABILITY) | Yes (rejects Z.AI-only options) | Yes (rejects Z.AI-only options) | **No** (UNSUPPORTED_CAPABILITY) | Yes (returns page titles) | Yes | **No** (UNSUPPORTED_CAPABILITY) | Yes | Yes (rejects Z.AI-only options plus `--format text`) | Yes (renders JavaScript; rejects `--format text` and `--no-images`) | Yes (rejects Z.AI-only options) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | No | No | No | No | No | `scoutline read` |
295
+ | Repository exploration (search/read/tree/brief) | Yes | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | **No** (UNSUPPORTED_CAPABILITY) | No | No | No | No | No | `scoutline repo ...` |
296
+ | Crawl | **No** | **No** | Yes | **No** | **No** | Yes (async; resumable after Ctrl-C) | **No** | **No** | **No** | **No** | **No** | Yes (sync) | **No** | **No** | **No** | No | No | No | No | No | `scoutline crawl` |
297
+ | Map | **No** | **No** | Yes | **No** | **No** | Yes | **No** | **No** | **No** | **No** | **No** | Yes | **No** | **No** | **No** | No | No | No | No | No | `scoutline map` |
298
+ | Research (4-250 credits) | **No** | **No** | Yes | Yes | **No** | **No** (`/deep-research` deprecated) | Yes | Yes | Yes | Yes | Yes | **No** | **No** | **No** | **No** | No | No | No | No | No | `scoutline research` |
299
+ | Science (scholarly search/get) | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | Yes | Yes | Yes | Yes | Yes | `scoutline science search <query>` / `scoutline science get <identifier>`; keyless — no API key required; controls `--author`/`--year`/`--venue`/`--type` consumed only where the supplier wire supports them |
300
+ | Raw tools | Yes | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | `scoutline tools`, `tool`, `call` |
301
+ | Code Mode | Yes | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | `scoutline code ...` |
266
302
 
267
303
  Vision results are never cached. Z.AI image limits are JPG/JPEG/PNG ≤5 MiB.
268
- Search result count is applied locally after normalization and is never sent
269
- to the active Provider.
304
+ Search result count is applied locally after normalization; for every
305
+ Provider except Bocha it is never sent to the active Provider. Bocha's
306
+ wire request carries a native count parameter, so its Adapter forwards
307
+ the requested count (default 10) and partitions its cache entries by it.
270
308
 
271
309
  ## Science
272
310
 
@@ -325,6 +363,67 @@ per-op `output` writes captured stdout (temp + rename); `vision batch` adds
325
363
  per-input files plus `out/summary.json` (`--out` required for more than one
326
364
  input).
327
365
 
366
+ ## Investigation (`investigate`, ADR-0013)
367
+
368
+ A local, transparent, cache-resumable pipeline: plans sub-queries, fans
369
+ out search, merges by Fusion, reads the top sources, and extracts
370
+ deterministic passages into an EvidencePack. No provider-side job runs —
371
+ distinct from Research, an opaque billed provider job. Agent-synthesis is
372
+ the default: the pack is data, not prose (text output modes fall back to
373
+ JSON), and the calling agent writes the brief. `--synthesize` is the
374
+ additive-only escape hatch: an optional `brief` attaches to the pack
375
+ through Z.AI chat (Z.AI-only; it ignores `--provider`), never replaces
376
+ it — absent by default.
377
+
378
+ ```bash
379
+ scoutline investigate "rust async runtime benchmarks"
380
+ scoutline investigate "rust async | rust tokio" # explicit pipes split sub-queries
381
+ scoutline investigate "topic" --provider tavily,exa --sources 8
382
+ scoutline investigate "topic" --synthesize # attach a Z.AI brief (additive)
383
+ ```
384
+
385
+ Sub-query planning precedence: explicit pipes (the `--merge` grammar,
386
+ escape a literal pipe with `\|`) > `--context <path>` (local notes file,
387
+ never leaves the machine) > deterministic templates of the question
388
+ (original, key terms, overview/evidence/criticism; deduped, capped 5).
389
+ Cost is pinned before any billable work: N sub-queries × M arms
390
+ billable searches + up to K reads (default `--sources` 5).
391
+
392
+ Sources surfaced but unread land in `coverage.unread` with a reason code
393
+ (`no-reader-supplier`, `reader-failed:<code>`) — never silently dropped.
394
+ `--max-chars` is the output budget: passages trim first, late sources
395
+ drop; the full untrimmed pack is saved and recoverable via
396
+ `scoutline history show <ref>` (the `compaction {budget, ref}` stamp
397
+ names it). `--depth`, `--arms`, and `--budget-tokens` are rejected
398
+ with `VALIDATION_ERROR` by design (no depth axis; the arm set IS the
399
+ provider pin; `--max-chars` is the budget).
400
+
401
+ ### Claim verification (`investigate --verify`, ADR-0013 follow-up)
402
+
403
+ `--verify` turns the positional into a STATEMENT: sentence-claims
404
+ (the extract grammar's terminators; `|` is literal text) capped at 8
405
+ — a 9th sentence fails loud with VALIDATION_ERROR naming the cap,
406
+ never silent truncation. Each claim is searched verbatim (no
407
+ per-claim controls; `--context` + `--verify` is a mode-conflict
408
+ VALIDATION_ERROR — verify owns planning), then deterministically
409
+ matched to the extracted passages. The pack gains an additive
410
+ `verify` block: per claim, a verdict, evidence pointers
411
+ `{sourceIndex, passageIndex}`, and a negation-cue count.
412
+
413
+ ```bash
414
+ scoutline investigate "X is fast. Y lags." --verify
415
+ scoutline investigate "claim one. claim two." --verify --max-chars 4000
416
+ ```
417
+
418
+ Verdicts: `corroborated` (matching passages, zero cues) /
419
+ `contradicted` (a term-matching passage carries a negation cue from
420
+ a fixed, versioned cue list) / `unresolved` (no matching passages).
421
+ **Hint-grade disclosure**: `contradicted` is a cue heuristic, NOT
422
+ semantic contradiction — semantic judgment stays with you; the
423
+ per-claim `negationCues` count exists for exactly that re-judgment.
424
+ `--max-chars` never cuts claim text or verdicts (evidence pointers
425
+ drop last, whole); cost notices state "N claims × M arms".
426
+
328
427
  ## Commands
329
428
 
330
429
  | Command | Purpose | Help |
@@ -340,6 +439,7 @@ input).
340
439
  | crawl | Multi-page website traversal (Tavily, Firecrawl, or Spider.cloud) | `--help` for depth/breadth/filters |
341
440
  | map | URL-set discovery without fetching pages (Tavily, Firecrawl, or Spider.cloud) | `--help` for depth/breadth/filters |
342
441
  | research | Deep research with citations (seven providers; 4-250 credits) | `--help` for model/citation/timeout and local context |
442
+ | investigate | Local investigation pipeline returning an EvidencePack (ADR-0013); `--verify` adds claim verdicts (cue-heuristic, hint-grade) | `--help` for planner tiers, controls, and cost |
343
443
  | repo | GitHub code search and reading (Z.AI) | `--help` for tree/search/read/brief |
344
444
  | quota | Provider-normalized plan usage dashboard | `--help` for `--all-providers` |
345
445
  | tools | List available MCP tools (Z.AI) | |
@@ -445,6 +545,19 @@ scoutline --provider spider crawl https://docs.example.com --depth 2
445
545
  scoutline --provider spider map https://docs.example.com
446
546
  scoutline --provider spider quota # credit balance
447
547
 
548
+ # Bocha AI (Search)
549
+ scoutline --provider bocha search "AI policy news" --topic news
550
+ scoutline doctor --provider bocha
551
+
552
+ # SearchApi (Search, Quota)
553
+ scoutline --provider searchapi search "AI policy news" --topic news
554
+ scoutline --provider searchapi quota
555
+ scoutline doctor --provider searchapi
556
+
557
+ # Kagi (Search)
558
+ scoutline --provider kagi search "AI policy news" --topic news
559
+ scoutline doctor --provider kagi
560
+
448
561
  # All-Provider quota
449
562
  scoutline quota --all-providers
450
563
 
@@ -477,6 +590,9 @@ scoutline config get routing
477
590
  | You.com | Search/reader/research; no quota endpoint. |
478
591
  | Linkup | Research priced by reasoning depth ($0.25-$2.50/query); quota reports the prepaid USD balance. |
479
592
  | Spider.cloud | Crawl/map (sync) plus search/reader; credit-based. |
593
+ | Bocha AI | Web search with `--domain` as a `site:` prefix, `--recency` freshness, and `--content-size high` summaries; search + diagnostics only. Key: `BOCHA_API_KEY` — https://open.bochaai.com. |
594
+ | SearchApi | Exact Google-SERP search (`--topic news` routes to the google_news engine) plus credit quota via `quota`; search + quota + diagnostics only. Key: `SEARCHAPI_API_KEY` — https://www.searchapi.io. |
595
+ | Kagi | Search (and `--topic news` via the enrich/news endpoint) with a diagnostics probe; no reader/research/crawl/map/vision/quota. Key: `KAGI_API_KEY` — https://kagi.com/settings/api. |
480
596
  | arXiv, OpenAlex, Crossref, PubMed, Europe PMC | `scoutline science search` / `science get` only — keyless scholarly lookups (five suppliers, DOI-deduped merge; `--provider` pins one). |
481
597
 
482
598
  ## Repository Exploration
@@ -584,10 +700,12 @@ legacy-key construction — ambient `process.env` is never reread.
584
700
  ## Reader
585
701
 
586
702
  `scoutline read` participates in Provider selection. Z.AI, Tavily, Exa,
587
- and Firecrawl advertise `reader`; Z.AI supplies it through the Z.AI
703
+ Firecrawl, Parallel AI, Jina AI, You.com, Linkup, and Spider.cloud
704
+ advertise `reader`; Z.AI supplies it through the Z.AI
588
705
  Reader Adapter, Tavily through the Tavily `/extract` endpoint, Exa
589
- through `/contents`, and Firecrawl through `/v2/scrape`. MiniMax and
590
- Brave do not, so by default (0.11.0+) selecting either emits a stderr
706
+ through `/contents`, and Firecrawl through `/v2/scrape`. MiniMax,
707
+ Brave, Perplexity, Bocha AI, SearchApi, and Kagi do not, so by default
708
+ (0.11.0+) selecting any of them emits a stderr
591
709
  notice and Provider fallback auto-reroutes to the next eligible
592
710
  configured supplier; under `--no-fallback` (or
593
711
  `SCOUTLINE_NO_FALLBACK=1`) the preflight surfaces
@@ -718,7 +836,7 @@ additive optional fields to both schemas
718
836
  { source: "snapshot" | "live", observedAt, authoritative }`, the
719
837
  `providers` union may include a `{ status: "none", reason:
720
838
  "no-capability" }` row for a configured provider without quota (Exa,
721
- Parallel, Perplexity, You.com),
839
+ Parallel, Perplexity, You.com, Bocha AI, and Kagi),
722
840
  and each `doctor` provider entry may carry `quota: { source:
723
841
  "snapshot" | "none", observedAt?, authoritative }` plus `verification:
724
842
  { status, checkedAt, reason? }`. Each `quota` requests category may
@@ -8,9 +8,9 @@ gate.
8
8
 
9
9
  Shared commands (`search`, `vision analyze`, `quota`, `doctor`),
10
10
  **`repo`**, **`read`**, **`crawl`**, **`map`**, and **`research`** accept
11
- the global `--provider <zai|minimax|tavily|exa|brave|firecrawl|parallel|perplexity|jina|you|linkup|spider>` flag. Precedence:
11
+ the global `--provider <zai|minimax|tavily|exa|brave|firecrawl|parallel|perplexity|jina|you|linkup|spider|bocha|searchapi|kagi>` flag. Precedence:
12
12
 
13
- 1. `--provider <zai|minimax|tavily|exa|brave|firecrawl|parallel|perplexity|jina|you|linkup|spider>` on the command line
13
+ 1. `--provider <zai|minimax|tavily|exa|brave|firecrawl|parallel|perplexity|jina|you|linkup|spider|bocha|searchapi|kagi>` on the command line
14
14
  2. `SCOUTLINE_PROVIDER` environment variable
15
15
  3. Default `zai`
16
16
 
@@ -19,11 +19,12 @@ invocation. Provider selection is never inferred from credentials.
19
19
 
20
20
  `tools`, `tool`, `call`, and `code` accept the flag but ignore it; they
21
21
  remain Z.AI-only and do not validate the supplied value. `repo` and `read`
22
- participate in selection: Z.AI, Tavily, Exa, Firecrawl, Parallel, and
23
- Jina supply `reader`; only Z.AI supplies `repository-exploration`.
24
- `crawl` and `map` participate in selection and are supplied by Tavily
25
- and Firecrawl. `research` is supplied by Tavily, Exa, Parallel,
26
- Perplexity, and Jina. By default (0.11.0+) Provider
22
+ participate in selection: Z.AI, Tavily, Exa, Firecrawl, Parallel, Jina,
23
+ You.com, Linkup, and Spider.cloud supply `reader`; only Z.AI supplies
24
+ `repository-exploration`. `crawl` and `map` participate in selection and
25
+ are supplied by Tavily, Firecrawl, and Spider.cloud. `research` is
26
+ supplied by Tavily, Exa, Parallel, Perplexity, Jina, You.com, and
27
+ Linkup. By default (0.11.0+) Provider
27
28
  fallback is always-on: selecting a non-supplier emits a stderr notice
28
29
  and silently reroutes to the next eligible configured supplier in
29
30
  registry order. Under `--no-fallback` (or `SCOUTLINE_NO_FALLBACK=1`)
@@ -342,9 +343,10 @@ each advertised capability, exactly which built-in Providers supply it.
342
343
  `sharedCapabilities` and `zaiOnlyCapabilities` are gone; their two-array
343
344
  derivation silently hid capabilities supplied by a subset of providers.
344
345
  The matrix replaces them. `repository-exploration` is reported under
345
- Z.AI alone; `reader` under Z.AI, Tavily, Exa, Firecrawl, Parallel, and
346
- Jina; `crawl` and `map` under Tavily and Firecrawl; `research` under
347
- Tavily, Exa, Parallel, Perplexity, and Jina. Doctor help derives its
346
+ Z.AI alone; `reader` under Z.AI, Tavily, Exa, Firecrawl, Parallel, Jina,
347
+ You.com, Linkup, and Spider.cloud; `crawl` and `map` under Tavily,
348
+ Firecrawl, and Spider.cloud; `research` under Tavily, Exa, Parallel,
349
+ Perplexity, Jina, You.com, and Linkup. Doctor help derives its
348
350
  unsupported lists from the same descriptor metadata for every other
349
351
  Provider.
350
352