@staticn0va/wigolo 0.1.0 → 0.1.2

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 (1003) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +146 -227
  3. package/SKILL.md +382 -0
  4. package/assets/blocks/claude-code/CLAUDE.md.block +20 -0
  5. package/assets/blocks/claude-code/wigolo-command.md +40 -0
  6. package/assets/blocks/cursor/wigolo.mdc +46 -0
  7. package/assets/blocks/gemini-cli/GEMINI.md.block +18 -0
  8. package/assets/blocks/vscode/copilot-instructions.md.block +18 -0
  9. package/assets/skills/wigolo/SKILL.md +50 -0
  10. package/assets/skills/wigolo/rules/cache-first.md +30 -0
  11. package/assets/skills/wigolo/rules/synthesis.md +43 -0
  12. package/assets/skills/wigolo-agent/SKILL.md +73 -0
  13. package/assets/skills/wigolo-crawl/SKILL.md +60 -0
  14. package/assets/skills/wigolo-extract/SKILL.md +59 -0
  15. package/assets/skills/wigolo-fetch/SKILL.md +65 -0
  16. package/assets/skills/wigolo-find-similar/SKILL.md +72 -0
  17. package/assets/skills/wigolo-research/SKILL.md +77 -0
  18. package/assets/skills/wigolo-search/SKILL.md +78 -0
  19. package/dist/agent/executor.d.ts +33 -0
  20. package/dist/agent/executor.d.ts.map +1 -0
  21. package/dist/agent/executor.js +233 -0
  22. package/dist/agent/executor.js.map +1 -0
  23. package/dist/agent/pipeline.d.ts +5 -0
  24. package/dist/agent/pipeline.d.ts.map +1 -0
  25. package/dist/agent/pipeline.js +238 -0
  26. package/dist/agent/pipeline.js.map +1 -0
  27. package/dist/agent/planner.d.ts +13 -0
  28. package/dist/agent/planner.d.ts.map +1 -0
  29. package/dist/agent/planner.js +271 -0
  30. package/dist/agent/planner.js.map +1 -0
  31. package/dist/agent/relevance.d.ts +15 -0
  32. package/dist/agent/relevance.d.ts.map +1 -0
  33. package/dist/agent/relevance.js +60 -0
  34. package/dist/agent/relevance.js.map +1 -0
  35. package/dist/cache/backfill-embeddings.d.ts +23 -0
  36. package/dist/cache/backfill-embeddings.d.ts.map +1 -0
  37. package/dist/cache/backfill-embeddings.js +105 -0
  38. package/dist/cache/backfill-embeddings.js.map +1 -0
  39. package/dist/cache/change-detector.d.ts +7 -0
  40. package/dist/cache/change-detector.d.ts.map +1 -0
  41. package/dist/cache/change-detector.js +43 -0
  42. package/dist/cache/change-detector.js.map +1 -0
  43. package/dist/cache/db.d.ts +1 -0
  44. package/dist/cache/db.d.ts.map +1 -1
  45. package/dist/cache/db.js +94 -22
  46. package/dist/cache/db.js.map +1 -1
  47. package/dist/cache/diff-summary.d.ts +2 -0
  48. package/dist/cache/diff-summary.d.ts.map +1 -0
  49. package/dist/cache/diff-summary.js +82 -0
  50. package/dist/cache/diff-summary.js.map +1 -0
  51. package/dist/cache/migrations/runner.d.ts +29 -0
  52. package/dist/cache/migrations/runner.d.ts.map +1 -0
  53. package/dist/cache/migrations/runner.js +147 -0
  54. package/dist/cache/migrations/runner.js.map +1 -0
  55. package/dist/cache/sqlite-vec-store.d.ts +42 -0
  56. package/dist/cache/sqlite-vec-store.d.ts.map +1 -0
  57. package/dist/cache/sqlite-vec-store.js +176 -0
  58. package/dist/cache/sqlite-vec-store.js.map +1 -0
  59. package/dist/cache/store.d.ts +47 -1
  60. package/dist/cache/store.d.ts.map +1 -1
  61. package/dist/cache/store.js +364 -168
  62. package/dist/cache/store.js.map +1 -1
  63. package/dist/cli/agents/antigravity.d.ts +20 -0
  64. package/dist/cli/agents/antigravity.d.ts.map +1 -0
  65. package/dist/cli/agents/antigravity.js +49 -0
  66. package/dist/cli/agents/antigravity.js.map +1 -0
  67. package/dist/cli/agents/claude-code.d.ts +25 -0
  68. package/dist/cli/agents/claude-code.d.ts.map +1 -0
  69. package/dist/cli/agents/claude-code.js +111 -0
  70. package/dist/cli/agents/claude-code.js.map +1 -0
  71. package/dist/cli/agents/cursor.d.ts +21 -0
  72. package/dist/cli/agents/cursor.d.ts.map +1 -0
  73. package/dist/cli/agents/cursor.js +58 -0
  74. package/dist/cli/agents/cursor.js.map +1 -0
  75. package/dist/cli/agents/gemini-cli.d.ts +21 -0
  76. package/dist/cli/agents/gemini-cli.d.ts.map +1 -0
  77. package/dist/cli/agents/gemini-cli.js +55 -0
  78. package/dist/cli/agents/gemini-cli.js.map +1 -0
  79. package/dist/cli/agents/registry.d.ts +21 -0
  80. package/dist/cli/agents/registry.d.ts.map +1 -0
  81. package/dist/cli/agents/registry.js +27 -0
  82. package/dist/cli/agents/registry.js.map +1 -0
  83. package/dist/cli/agents/utils.d.ts +26 -0
  84. package/dist/cli/agents/utils.d.ts.map +1 -0
  85. package/dist/cli/agents/utils.js +136 -0
  86. package/dist/cli/agents/utils.js.map +1 -0
  87. package/dist/cli/agents/vscode.d.ts +21 -0
  88. package/dist/cli/agents/vscode.d.ts.map +1 -0
  89. package/dist/cli/agents/vscode.js +62 -0
  90. package/dist/cli/agents/vscode.js.map +1 -0
  91. package/dist/cli/auth.d.ts +2 -0
  92. package/dist/cli/auth.d.ts.map +1 -0
  93. package/dist/cli/auth.js +94 -0
  94. package/dist/cli/auth.js.map +1 -0
  95. package/dist/cli/backfill.d.ts +2 -0
  96. package/dist/cli/backfill.d.ts.map +1 -0
  97. package/dist/cli/backfill.js +58 -0
  98. package/dist/cli/backfill.js.map +1 -0
  99. package/dist/cli/daemon.d.ts +6 -1
  100. package/dist/cli/daemon.d.ts.map +1 -1
  101. package/dist/cli/daemon.js +61 -3
  102. package/dist/cli/daemon.js.map +1 -1
  103. package/dist/cli/doctor.d.ts +8 -0
  104. package/dist/cli/doctor.d.ts.map +1 -0
  105. package/dist/cli/doctor.js +344 -0
  106. package/dist/cli/doctor.js.map +1 -0
  107. package/dist/cli/health.d.ts +1 -1
  108. package/dist/cli/health.d.ts.map +1 -1
  109. package/dist/cli/health.js +42 -3
  110. package/dist/cli/health.js.map +1 -1
  111. package/dist/cli/help.d.ts +6 -0
  112. package/dist/cli/help.d.ts.map +1 -0
  113. package/dist/cli/help.js +63 -0
  114. package/dist/cli/help.js.map +1 -0
  115. package/dist/cli/index.d.ts +1 -1
  116. package/dist/cli/index.d.ts.map +1 -1
  117. package/dist/cli/index.js +35 -7
  118. package/dist/cli/index.js.map +1 -1
  119. package/dist/cli/init.d.ts +2 -0
  120. package/dist/cli/init.d.ts.map +1 -0
  121. package/dist/cli/init.js +201 -0
  122. package/dist/cli/init.js.map +1 -0
  123. package/dist/cli/plugin.d.ts +5 -0
  124. package/dist/cli/plugin.d.ts.map +1 -0
  125. package/dist/cli/plugin.js +185 -0
  126. package/dist/cli/plugin.js.map +1 -0
  127. package/dist/cli/setup-mcp.d.ts +2 -0
  128. package/dist/cli/setup-mcp.d.ts.map +1 -0
  129. package/dist/cli/setup-mcp.js +114 -0
  130. package/dist/cli/setup-mcp.js.map +1 -0
  131. package/dist/cli/shell.d.ts +2 -0
  132. package/dist/cli/shell.d.ts.map +1 -0
  133. package/dist/cli/shell.js +86 -0
  134. package/dist/cli/shell.js.map +1 -0
  135. package/dist/cli/shutdown.d.ts +2 -0
  136. package/dist/cli/shutdown.d.ts.map +1 -0
  137. package/dist/cli/shutdown.js +26 -0
  138. package/dist/cli/shutdown.js.map +1 -0
  139. package/dist/cli/status.d.ts +2 -0
  140. package/dist/cli/status.d.ts.map +1 -0
  141. package/dist/cli/status.js +31 -0
  142. package/dist/cli/status.js.map +1 -0
  143. package/dist/cli/telemetry.d.ts +10 -0
  144. package/dist/cli/telemetry.d.ts.map +1 -0
  145. package/dist/cli/telemetry.js +56 -0
  146. package/dist/cli/telemetry.js.map +1 -0
  147. package/dist/cli/tui/agents-types.d.ts +28 -0
  148. package/dist/cli/tui/agents-types.d.ts.map +1 -0
  149. package/dist/cli/tui/agents-types.js +1 -0
  150. package/dist/cli/tui/agents-types.js.map +1 -0
  151. package/dist/cli/tui/agents.d.ts +11 -0
  152. package/dist/cli/tui/agents.d.ts.map +1 -0
  153. package/dist/cli/tui/agents.js +93 -0
  154. package/dist/cli/tui/agents.js.map +1 -0
  155. package/dist/cli/tui/banner.d.ts +3 -0
  156. package/dist/cli/tui/banner.d.ts.map +1 -0
  157. package/dist/cli/tui/banner.js +30 -0
  158. package/dist/cli/tui/banner.js.map +1 -0
  159. package/dist/cli/tui/components/AgentSelect.d.ts +13 -0
  160. package/dist/cli/tui/components/AgentSelect.d.ts.map +1 -0
  161. package/dist/cli/tui/components/AgentSelect.js +116 -0
  162. package/dist/cli/tui/components/AgentSelect.js.map +1 -0
  163. package/dist/cli/tui/components/Banner.d.ts +6 -0
  164. package/dist/cli/tui/components/Banner.d.ts.map +1 -0
  165. package/dist/cli/tui/components/Banner.js +25 -0
  166. package/dist/cli/tui/components/Banner.js.map +1 -0
  167. package/dist/cli/tui/components/BrowserSelect.d.ts +7 -0
  168. package/dist/cli/tui/components/BrowserSelect.d.ts.map +1 -0
  169. package/dist/cli/tui/components/BrowserSelect.js +19 -0
  170. package/dist/cli/tui/components/BrowserSelect.js.map +1 -0
  171. package/dist/cli/tui/components/InstallProgress.d.ts +9 -0
  172. package/dist/cli/tui/components/InstallProgress.d.ts.map +1 -0
  173. package/dist/cli/tui/components/InstallProgress.js +67 -0
  174. package/dist/cli/tui/components/InstallProgress.js.map +1 -0
  175. package/dist/cli/tui/components/SkillInstall.d.ts +14 -0
  176. package/dist/cli/tui/components/SkillInstall.d.ts.map +1 -0
  177. package/dist/cli/tui/components/SkillInstall.js +94 -0
  178. package/dist/cli/tui/components/SkillInstall.js.map +1 -0
  179. package/dist/cli/tui/components/Summary.d.ts +22 -0
  180. package/dist/cli/tui/components/Summary.d.ts.map +1 -0
  181. package/dist/cli/tui/components/Summary.js +135 -0
  182. package/dist/cli/tui/components/Summary.js.map +1 -0
  183. package/dist/cli/tui/components/SystemCheck.d.ts +8 -0
  184. package/dist/cli/tui/components/SystemCheck.d.ts.map +1 -0
  185. package/dist/cli/tui/components/SystemCheck.js +71 -0
  186. package/dist/cli/tui/components/SystemCheck.js.map +1 -0
  187. package/dist/cli/tui/components/Verification.d.ts +8 -0
  188. package/dist/cli/tui/components/Verification.d.ts.map +1 -0
  189. package/dist/cli/tui/components/Verification.js +63 -0
  190. package/dist/cli/tui/components/Verification.js.map +1 -0
  191. package/dist/cli/tui/config-writer-cli.d.ts +12 -0
  192. package/dist/cli/tui/config-writer-cli.d.ts.map +1 -0
  193. package/dist/cli/tui/config-writer-cli.js +39 -0
  194. package/dist/cli/tui/config-writer-cli.js.map +1 -0
  195. package/dist/cli/tui/config-writer-json.d.ts +16 -0
  196. package/dist/cli/tui/config-writer-json.d.ts.map +1 -0
  197. package/dist/cli/tui/config-writer-json.js +86 -0
  198. package/dist/cli/tui/config-writer-json.js.map +1 -0
  199. package/dist/cli/tui/config-writer-toml.d.ts +16 -0
  200. package/dist/cli/tui/config-writer-toml.d.ts.map +1 -0
  201. package/dist/cli/tui/config-writer-toml.js +83 -0
  202. package/dist/cli/tui/config-writer-toml.js.map +1 -0
  203. package/dist/cli/tui/config-writer.d.ts +25 -0
  204. package/dist/cli/tui/config-writer.d.ts.map +1 -0
  205. package/dist/cli/tui/config-writer.js +101 -0
  206. package/dist/cli/tui/config-writer.js.map +1 -0
  207. package/dist/cli/tui/detect-helpers.d.ts +6 -0
  208. package/dist/cli/tui/detect-helpers.d.ts.map +1 -0
  209. package/dist/cli/tui/detect-helpers.js +45 -0
  210. package/dist/cli/tui/detect-helpers.js.map +1 -0
  211. package/dist/cli/tui/extras-prompt.d.ts +7 -0
  212. package/dist/cli/tui/extras-prompt.d.ts.map +1 -0
  213. package/dist/cli/tui/extras-prompt.js +42 -0
  214. package/dist/cli/tui/extras-prompt.js.map +1 -0
  215. package/dist/cli/tui/flags-types.d.ts +19 -0
  216. package/dist/cli/tui/flags-types.d.ts.map +1 -0
  217. package/dist/cli/tui/flags-types.js +23 -0
  218. package/dist/cli/tui/flags-types.js.map +1 -0
  219. package/dist/cli/tui/flags.d.ts +5 -0
  220. package/dist/cli/tui/flags.d.ts.map +1 -0
  221. package/dist/cli/tui/flags.js +132 -0
  222. package/dist/cli/tui/flags.js.map +1 -0
  223. package/dist/cli/tui/format.d.ts +14 -0
  224. package/dist/cli/tui/format.d.ts.map +1 -0
  225. package/dist/cli/tui/format.js +37 -0
  226. package/dist/cli/tui/format.js.map +1 -0
  227. package/dist/cli/tui/hooks/useAgentDetect.d.ts +6 -0
  228. package/dist/cli/tui/hooks/useAgentDetect.d.ts.map +1 -0
  229. package/dist/cli/tui/hooks/useAgentDetect.js +19 -0
  230. package/dist/cli/tui/hooks/useAgentDetect.js.map +1 -0
  231. package/dist/cli/tui/hooks/useInstall.d.ts +14 -0
  232. package/dist/cli/tui/hooks/useInstall.d.ts.map +1 -0
  233. package/dist/cli/tui/hooks/useInstall.js +90 -0
  234. package/dist/cli/tui/hooks/useInstall.js.map +1 -0
  235. package/dist/cli/tui/hooks/useSystemCheck.d.ts +13 -0
  236. package/dist/cli/tui/hooks/useSystemCheck.d.ts.map +1 -0
  237. package/dist/cli/tui/hooks/useSystemCheck.js +95 -0
  238. package/dist/cli/tui/hooks/useSystemCheck.js.map +1 -0
  239. package/dist/cli/tui/hooks/useVerify.d.ts +14 -0
  240. package/dist/cli/tui/hooks/useVerify.d.ts.map +1 -0
  241. package/dist/cli/tui/hooks/useVerify.js +71 -0
  242. package/dist/cli/tui/hooks/useVerify.js.map +1 -0
  243. package/dist/cli/tui/ink-init.d.ts +2 -0
  244. package/dist/cli/tui/ink-init.d.ts.map +1 -0
  245. package/dist/cli/tui/ink-init.js +198 -0
  246. package/dist/cli/tui/ink-init.js.map +1 -0
  247. package/dist/cli/tui/reporter-auto.d.ts +7 -0
  248. package/dist/cli/tui/reporter-auto.d.ts.map +1 -0
  249. package/dist/cli/tui/reporter-auto.js +15 -0
  250. package/dist/cli/tui/reporter-auto.js.map +1 -0
  251. package/dist/cli/tui/reporter.d.ts +26 -0
  252. package/dist/cli/tui/reporter.d.ts.map +1 -0
  253. package/dist/cli/tui/reporter.js +32 -0
  254. package/dist/cli/tui/reporter.js.map +1 -0
  255. package/dist/cli/tui/run-command.d.ts +14 -0
  256. package/dist/cli/tui/run-command.d.ts.map +1 -0
  257. package/dist/cli/tui/run-command.js +72 -0
  258. package/dist/cli/tui/run-command.js.map +1 -0
  259. package/dist/cli/tui/select-agents.d.ts +6 -0
  260. package/dist/cli/tui/select-agents.d.ts.map +1 -0
  261. package/dist/cli/tui/select-agents.js +32 -0
  262. package/dist/cli/tui/select-agents.js.map +1 -0
  263. package/dist/cli/tui/status-agents.d.ts +11 -0
  264. package/dist/cli/tui/status-agents.d.ts.map +1 -0
  265. package/dist/cli/tui/status-agents.js +53 -0
  266. package/dist/cli/tui/status-agents.js.map +1 -0
  267. package/dist/cli/tui/status-cache.d.ts +6 -0
  268. package/dist/cli/tui/status-cache.d.ts.map +1 -0
  269. package/dist/cli/tui/status-cache.js +39 -0
  270. package/dist/cli/tui/status-cache.js.map +1 -0
  271. package/dist/cli/tui/status-format.d.ts +14 -0
  272. package/dist/cli/tui/status-format.d.ts.map +1 -0
  273. package/dist/cli/tui/status-format.js +41 -0
  274. package/dist/cli/tui/status-format.js.map +1 -0
  275. package/dist/cli/tui/status-python.d.ts +6 -0
  276. package/dist/cli/tui/status-python.d.ts.map +1 -0
  277. package/dist/cli/tui/status-python.js +30 -0
  278. package/dist/cli/tui/status-python.js.map +1 -0
  279. package/dist/cli/tui/system-check.d.ts +24 -0
  280. package/dist/cli/tui/system-check.d.ts.map +1 -0
  281. package/dist/cli/tui/system-check.js +103 -0
  282. package/dist/cli/tui/system-check.js.map +1 -0
  283. package/dist/cli/tui/tui-reporter.d.ts +19 -0
  284. package/dist/cli/tui/tui-reporter.d.ts.map +1 -0
  285. package/dist/cli/tui/tui-reporter.js +95 -0
  286. package/dist/cli/tui/tui-reporter.js.map +1 -0
  287. package/dist/cli/tui/utils/config-writer.d.ts +3 -0
  288. package/dist/cli/tui/utils/config-writer.d.ts.map +1 -0
  289. package/dist/cli/tui/utils/config-writer.js +22 -0
  290. package/dist/cli/tui/utils/config-writer.js.map +1 -0
  291. package/dist/cli/tui/utils/suppress-logs.d.ts +3 -0
  292. package/dist/cli/tui/utils/suppress-logs.d.ts.map +1 -0
  293. package/dist/cli/tui/utils/suppress-logs.js +11 -0
  294. package/dist/cli/tui/utils/suppress-logs.js.map +1 -0
  295. package/dist/cli/tui/verify-suggestions.d.ts +5 -0
  296. package/dist/cli/tui/verify-suggestions.d.ts.map +1 -0
  297. package/dist/cli/tui/verify-suggestions.js +20 -0
  298. package/dist/cli/tui/verify-suggestions.js.map +1 -0
  299. package/dist/cli/tui/verify.d.ts +14 -0
  300. package/dist/cli/tui/verify.d.ts.map +1 -0
  301. package/dist/cli/tui/verify.js +101 -0
  302. package/dist/cli/tui/verify.js.map +1 -0
  303. package/dist/cli/tui/version.d.ts +2 -0
  304. package/dist/cli/tui/version.d.ts.map +1 -0
  305. package/dist/cli/tui/version.js +14 -0
  306. package/dist/cli/tui/version.js.map +1 -0
  307. package/dist/cli/uninstall.d.ts +2 -0
  308. package/dist/cli/uninstall.d.ts.map +1 -0
  309. package/dist/cli/uninstall.js +57 -0
  310. package/dist/cli/uninstall.js.map +1 -0
  311. package/dist/cli/warmup.d.ts +10 -2
  312. package/dist/cli/warmup.d.ts.map +1 -1
  313. package/dist/cli/warmup.js +226 -93
  314. package/dist/cli/warmup.js.map +1 -1
  315. package/dist/config.d.ts +28 -2
  316. package/dist/config.d.ts.map +1 -1
  317. package/dist/config.js +106 -56
  318. package/dist/config.js.map +1 -1
  319. package/dist/crawl/crawler.d.ts +6 -0
  320. package/dist/crawl/crawler.d.ts.map +1 -1
  321. package/dist/crawl/crawler.js +210 -209
  322. package/dist/crawl/crawler.js.map +1 -1
  323. package/dist/crawl/dedup.d.ts +1 -0
  324. package/dist/crawl/dedup.d.ts.map +1 -1
  325. package/dist/crawl/dedup.js +124 -81
  326. package/dist/crawl/dedup.js.map +1 -1
  327. package/dist/crawl/etag-incremental.d.ts +43 -0
  328. package/dist/crawl/etag-incremental.d.ts.map +1 -0
  329. package/dist/crawl/etag-incremental.js +94 -0
  330. package/dist/crawl/etag-incremental.js.map +1 -0
  331. package/dist/crawl/index-to-vec.d.ts +10 -0
  332. package/dist/crawl/index-to-vec.d.ts.map +1 -0
  333. package/dist/crawl/index-to-vec.js +44 -0
  334. package/dist/crawl/index-to-vec.js.map +1 -0
  335. package/dist/crawl/mapper.js +136 -164
  336. package/dist/crawl/mapper.js.map +1 -1
  337. package/dist/crawl/rate-limiter.js +63 -66
  338. package/dist/crawl/rate-limiter.js.map +1 -1
  339. package/dist/crawl/robots.js +58 -57
  340. package/dist/crawl/robots.js.map +1 -1
  341. package/dist/crawl/sitemap-first.d.ts +12 -0
  342. package/dist/crawl/sitemap-first.d.ts.map +1 -0
  343. package/dist/crawl/sitemap-first.js +47 -0
  344. package/dist/crawl/sitemap-first.js.map +1 -0
  345. package/dist/crawl/sitemap.js +33 -32
  346. package/dist/crawl/sitemap.js.map +1 -1
  347. package/dist/crawl/url-utils.d.ts +1 -0
  348. package/dist/crawl/url-utils.d.ts.map +1 -1
  349. package/dist/crawl/url-utils.js +49 -37
  350. package/dist/crawl/url-utils.js.map +1 -1
  351. package/dist/daemon/health-check.d.ts +16 -0
  352. package/dist/daemon/health-check.d.ts.map +1 -0
  353. package/dist/daemon/health-check.js +33 -0
  354. package/dist/daemon/health-check.js.map +1 -0
  355. package/dist/daemon/http-server.d.ts +26 -0
  356. package/dist/daemon/http-server.d.ts.map +1 -0
  357. package/dist/daemon/http-server.js +275 -0
  358. package/dist/daemon/http-server.js.map +1 -0
  359. package/dist/daemon/proxy.d.ts +10 -0
  360. package/dist/daemon/proxy.d.ts.map +1 -0
  361. package/dist/daemon/proxy.js +93 -0
  362. package/dist/daemon/proxy.js.map +1 -0
  363. package/dist/embedding/embed.d.ts +59 -0
  364. package/dist/embedding/embed.d.ts.map +1 -0
  365. package/dist/embedding/embed.js +233 -0
  366. package/dist/embedding/embed.js.map +1 -0
  367. package/dist/embedding/fastembed-provider.d.ts +19 -0
  368. package/dist/embedding/fastembed-provider.d.ts.map +1 -0
  369. package/dist/embedding/fastembed-provider.js +51 -0
  370. package/dist/embedding/fastembed-provider.js.map +1 -0
  371. package/dist/embedding/key-terms.d.ts +12 -0
  372. package/dist/embedding/key-terms.d.ts.map +1 -0
  373. package/dist/embedding/key-terms.js +234 -0
  374. package/dist/embedding/key-terms.js.map +1 -0
  375. package/dist/extraction/boilerplate.d.ts +15 -0
  376. package/dist/extraction/boilerplate.d.ts.map +1 -0
  377. package/dist/extraction/boilerplate.js +52 -0
  378. package/dist/extraction/boilerplate.js.map +1 -0
  379. package/dist/extraction/defuddle.d.ts.map +1 -1
  380. package/dist/extraction/defuddle.js +27 -23
  381. package/dist/extraction/defuddle.js.map +1 -1
  382. package/dist/extraction/extract.d.ts.map +1 -1
  383. package/dist/extraction/extract.js +76 -76
  384. package/dist/extraction/extract.js.map +1 -1
  385. package/dist/extraction/jsonld.js +50 -54
  386. package/dist/extraction/jsonld.js.map +1 -1
  387. package/dist/extraction/lang-hints.d.ts +2 -0
  388. package/dist/extraction/lang-hints.d.ts.map +1 -0
  389. package/dist/extraction/lang-hints.js +30 -0
  390. package/dist/extraction/lang-hints.js.map +1 -0
  391. package/dist/extraction/llm-fallback.d.ts +17 -0
  392. package/dist/extraction/llm-fallback.d.ts.map +1 -0
  393. package/dist/extraction/llm-fallback.js +130 -0
  394. package/dist/extraction/llm-fallback.js.map +1 -0
  395. package/dist/extraction/markdown-sanitize.d.ts +2 -0
  396. package/dist/extraction/markdown-sanitize.d.ts.map +1 -0
  397. package/dist/extraction/markdown-sanitize.js +151 -0
  398. package/dist/extraction/markdown-sanitize.js.map +1 -0
  399. package/dist/extraction/markdown.d.ts +11 -0
  400. package/dist/extraction/markdown.d.ts.map +1 -1
  401. package/dist/extraction/markdown.js +195 -91
  402. package/dist/extraction/markdown.js.map +1 -1
  403. package/dist/extraction/pipeline.d.ts +8 -0
  404. package/dist/extraction/pipeline.d.ts.map +1 -1
  405. package/dist/extraction/pipeline.js +57 -91
  406. package/dist/extraction/pipeline.js.map +1 -1
  407. package/dist/extraction/readability.d.ts +1 -1
  408. package/dist/extraction/readability.d.ts.map +1 -1
  409. package/dist/extraction/readability.js +28 -29
  410. package/dist/extraction/readability.js.map +1 -1
  411. package/dist/extraction/schema.d.ts +12 -0
  412. package/dist/extraction/schema.d.ts.map +1 -1
  413. package/dist/extraction/schema.js +135 -72
  414. package/dist/extraction/schema.js.map +1 -1
  415. package/dist/extraction/site-extractors/docs-generic.d.ts.map +1 -1
  416. package/dist/extraction/site-extractors/docs-generic.js +81 -91
  417. package/dist/extraction/site-extractors/docs-generic.js.map +1 -1
  418. package/dist/extraction/site-extractors/github.d.ts.map +1 -1
  419. package/dist/extraction/site-extractors/github.js +87 -95
  420. package/dist/extraction/site-extractors/github.js.map +1 -1
  421. package/dist/extraction/site-extractors/mdn.d.ts.map +1 -1
  422. package/dist/extraction/site-extractors/mdn.js +46 -54
  423. package/dist/extraction/site-extractors/mdn.js.map +1 -1
  424. package/dist/extraction/site-extractors/stackoverflow.d.ts.map +1 -1
  425. package/dist/extraction/site-extractors/stackoverflow.js +71 -80
  426. package/dist/extraction/site-extractors/stackoverflow.js.map +1 -1
  427. package/dist/extraction/structured-data.d.ts +4 -0
  428. package/dist/extraction/structured-data.d.ts.map +1 -0
  429. package/dist/extraction/structured-data.js +173 -0
  430. package/dist/extraction/structured-data.js.map +1 -0
  431. package/dist/extraction/structured.d.ts +4 -0
  432. package/dist/extraction/structured.d.ts.map +1 -0
  433. package/dist/extraction/structured.js +163 -0
  434. package/dist/extraction/structured.js.map +1 -0
  435. package/dist/extraction/v1/classifier.d.ts +3 -0
  436. package/dist/extraction/v1/classifier.d.ts.map +1 -0
  437. package/dist/extraction/v1/classifier.js +110 -0
  438. package/dist/extraction/v1/classifier.js.map +1 -0
  439. package/dist/extraction/v1/extract-provider.d.ts +16 -0
  440. package/dist/extraction/v1/extract-provider.d.ts.map +1 -0
  441. package/dist/extraction/v1/extract-provider.js +43 -0
  442. package/dist/extraction/v1/extract-provider.js.map +1 -0
  443. package/dist/extraction/v1/local-llm.d.ts +8 -0
  444. package/dist/extraction/v1/local-llm.d.ts.map +1 -0
  445. package/dist/extraction/v1/local-llm.js +34 -0
  446. package/dist/extraction/v1/local-llm.js.map +1 -0
  447. package/dist/extraction/v1/news.d.ts +3 -0
  448. package/dist/extraction/v1/news.d.ts.map +1 -0
  449. package/dist/extraction/v1/news.js +61 -0
  450. package/dist/extraction/v1/news.js.map +1 -0
  451. package/dist/extraction/v1/product.d.ts +3 -0
  452. package/dist/extraction/v1/product.d.ts.map +1 -0
  453. package/dist/extraction/v1/product.js +166 -0
  454. package/dist/extraction/v1/product.js.map +1 -0
  455. package/dist/extraction/v1/recipe.d.ts +3 -0
  456. package/dist/extraction/v1/recipe.d.ts.map +1 -0
  457. package/dist/extraction/v1/recipe.js +136 -0
  458. package/dist/extraction/v1/recipe.js.map +1 -0
  459. package/dist/extraction/v1/routed.d.ts +17 -0
  460. package/dist/extraction/v1/routed.d.ts.map +1 -0
  461. package/dist/extraction/v1/routed.js +68 -0
  462. package/dist/extraction/v1/routed.js.map +1 -0
  463. package/dist/extraction/v1/schemas/Article.d.ts +11 -0
  464. package/dist/extraction/v1/schemas/Article.d.ts.map +1 -0
  465. package/dist/extraction/v1/schemas/Article.js +23 -0
  466. package/dist/extraction/v1/schemas/Article.js.map +1 -0
  467. package/dist/extraction/v1/schemas/CodeSnippet.d.ts +9 -0
  468. package/dist/extraction/v1/schemas/CodeSnippet.d.ts.map +1 -0
  469. package/dist/extraction/v1/schemas/CodeSnippet.js +90 -0
  470. package/dist/extraction/v1/schemas/CodeSnippet.js.map +1 -0
  471. package/dist/extraction/v1/schemas/EventListing.d.ts +10 -0
  472. package/dist/extraction/v1/schemas/EventListing.d.ts.map +1 -0
  473. package/dist/extraction/v1/schemas/EventListing.js +122 -0
  474. package/dist/extraction/v1/schemas/EventListing.js.map +1 -0
  475. package/dist/extraction/v1/schemas/Paper.d.ts +10 -0
  476. package/dist/extraction/v1/schemas/Paper.d.ts.map +1 -0
  477. package/dist/extraction/v1/schemas/Paper.js +156 -0
  478. package/dist/extraction/v1/schemas/Paper.js.map +1 -0
  479. package/dist/extraction/v1/schemas/Product.d.ts +17 -0
  480. package/dist/extraction/v1/schemas/Product.d.ts.map +1 -0
  481. package/dist/extraction/v1/schemas/Product.js +149 -0
  482. package/dist/extraction/v1/schemas/Product.js.map +1 -0
  483. package/dist/extraction/v1/schemas/Recipe.d.ts +14 -0
  484. package/dist/extraction/v1/schemas/Recipe.d.ts.map +1 -0
  485. package/dist/extraction/v1/schemas/Recipe.js +160 -0
  486. package/dist/extraction/v1/schemas/Recipe.js.map +1 -0
  487. package/dist/extraction/v1/schemas/index.d.ts +13 -0
  488. package/dist/extraction/v1/schemas/index.d.ts.map +1 -0
  489. package/dist/extraction/v1/schemas/index.js +44 -0
  490. package/dist/extraction/v1/schemas/index.js.map +1 -0
  491. package/dist/extraction/v1/site-extractors.d.ts +5 -0
  492. package/dist/extraction/v1/site-extractors.d.ts.map +1 -0
  493. package/dist/extraction/v1/site-extractors.js +31 -0
  494. package/dist/extraction/v1/site-extractors.js.map +1 -0
  495. package/dist/fetch/action-executor.d.ts +28 -0
  496. package/dist/fetch/action-executor.d.ts.map +1 -0
  497. package/dist/fetch/action-executor.js +88 -0
  498. package/dist/fetch/action-executor.js.map +1 -0
  499. package/dist/fetch/auth.d.ts +2 -1
  500. package/dist/fetch/auth.d.ts.map +1 -1
  501. package/dist/fetch/auth.js +56 -26
  502. package/dist/fetch/auth.js.map +1 -1
  503. package/dist/fetch/browser-pool.d.ts +30 -11
  504. package/dist/fetch/browser-pool.d.ts.map +1 -1
  505. package/dist/fetch/browser-pool.js +303 -127
  506. package/dist/fetch/browser-pool.js.map +1 -1
  507. package/dist/fetch/browser-selector.d.ts +17 -0
  508. package/dist/fetch/browser-selector.d.ts.map +1 -0
  509. package/dist/fetch/browser-selector.js +72 -0
  510. package/dist/fetch/browser-selector.js.map +1 -0
  511. package/dist/fetch/browser-types.d.ts +3 -0
  512. package/dist/fetch/browser-types.d.ts.map +1 -0
  513. package/dist/fetch/browser-types.js +45 -0
  514. package/dist/fetch/browser-types.js.map +1 -0
  515. package/dist/fetch/cdp-client.d.ts +9 -0
  516. package/dist/fetch/cdp-client.d.ts.map +1 -0
  517. package/dist/fetch/cdp-client.js +89 -0
  518. package/dist/fetch/cdp-client.js.map +1 -0
  519. package/dist/fetch/content-check.js +39 -46
  520. package/dist/fetch/content-check.js.map +1 -1
  521. package/dist/fetch/error-describe.d.ts +7 -0
  522. package/dist/fetch/error-describe.d.ts.map +1 -0
  523. package/dist/fetch/error-describe.js +37 -0
  524. package/dist/fetch/error-describe.js.map +1 -0
  525. package/dist/fetch/http-client.d.ts +4 -0
  526. package/dist/fetch/http-client.d.ts.map +1 -1
  527. package/dist/fetch/http-client.js +147 -128
  528. package/dist/fetch/http-client.js.map +1 -1
  529. package/dist/fetch/lightpanda.d.ts +28 -0
  530. package/dist/fetch/lightpanda.d.ts.map +1 -0
  531. package/dist/fetch/lightpanda.js +174 -0
  532. package/dist/fetch/lightpanda.js.map +1 -0
  533. package/dist/fetch/playwright-tier.d.ts +19 -0
  534. package/dist/fetch/playwright-tier.d.ts.map +1 -0
  535. package/dist/fetch/playwright-tier.js +76 -0
  536. package/dist/fetch/playwright-tier.js.map +1 -0
  537. package/dist/fetch/router.d.ts +49 -3
  538. package/dist/fetch/router.d.ts.map +1 -1
  539. package/dist/fetch/router.js +187 -81
  540. package/dist/fetch/router.js.map +1 -1
  541. package/dist/index.js +102 -17
  542. package/dist/index.js.map +1 -1
  543. package/dist/instructions.d.ts +31 -0
  544. package/dist/instructions.d.ts.map +1 -0
  545. package/dist/instructions.js +245 -0
  546. package/dist/instructions.js.map +1 -0
  547. package/dist/integrations/cloud/llm/anthropic.d.ts +3 -0
  548. package/dist/integrations/cloud/llm/anthropic.d.ts.map +1 -0
  549. package/dist/integrations/cloud/llm/anthropic.js +41 -0
  550. package/dist/integrations/cloud/llm/anthropic.js.map +1 -0
  551. package/dist/integrations/cloud/llm/cache.d.ts +5 -0
  552. package/dist/integrations/cloud/llm/cache.d.ts.map +1 -0
  553. package/dist/integrations/cloud/llm/cache.js +49 -0
  554. package/dist/integrations/cloud/llm/cache.js.map +1 -0
  555. package/dist/integrations/cloud/llm/gemini.d.ts +3 -0
  556. package/dist/integrations/cloud/llm/gemini.d.ts.map +1 -0
  557. package/dist/integrations/cloud/llm/gemini.js +37 -0
  558. package/dist/integrations/cloud/llm/gemini.js.map +1 -0
  559. package/dist/integrations/cloud/llm/groq.d.ts +3 -0
  560. package/dist/integrations/cloud/llm/groq.d.ts.map +1 -0
  561. package/dist/integrations/cloud/llm/groq.js +74 -0
  562. package/dist/integrations/cloud/llm/groq.js.map +1 -0
  563. package/dist/integrations/cloud/llm/hash.d.ts +3 -0
  564. package/dist/integrations/cloud/llm/hash.d.ts.map +1 -0
  565. package/dist/integrations/cloud/llm/hash.js +26 -0
  566. package/dist/integrations/cloud/llm/hash.js.map +1 -0
  567. package/dist/integrations/cloud/llm/model-select.d.ts +5 -0
  568. package/dist/integrations/cloud/llm/model-select.d.ts.map +1 -0
  569. package/dist/integrations/cloud/llm/model-select.js +32 -0
  570. package/dist/integrations/cloud/llm/model-select.js.map +1 -0
  571. package/dist/integrations/cloud/llm/openai.d.ts +3 -0
  572. package/dist/integrations/cloud/llm/openai.d.ts.map +1 -0
  573. package/dist/integrations/cloud/llm/openai.js +43 -0
  574. package/dist/integrations/cloud/llm/openai.js.map +1 -0
  575. package/dist/integrations/cloud/llm/run.d.ts +27 -0
  576. package/dist/integrations/cloud/llm/run.d.ts.map +1 -0
  577. package/dist/integrations/cloud/llm/run.js +99 -0
  578. package/dist/integrations/cloud/llm/run.js.map +1 -0
  579. package/dist/integrations/cloud/llm/select.d.ts +5 -0
  580. package/dist/integrations/cloud/llm/select.d.ts.map +1 -0
  581. package/dist/integrations/cloud/llm/select.js +30 -0
  582. package/dist/integrations/cloud/llm/select.js.map +1 -0
  583. package/dist/integrations/cloud/llm/text-adapters.d.ts +19 -0
  584. package/dist/integrations/cloud/llm/text-adapters.d.ts.map +1 -0
  585. package/dist/integrations/cloud/llm/text-adapters.js +103 -0
  586. package/dist/integrations/cloud/llm/text-adapters.js.map +1 -0
  587. package/dist/integrations/cloud/llm/types.d.ts +24 -0
  588. package/dist/integrations/cloud/llm/types.d.ts.map +1 -0
  589. package/dist/integrations/cloud/llm/types.js +1 -0
  590. package/dist/integrations/cloud/llm/types.js.map +1 -0
  591. package/dist/integrations/cloud/llm/validate.d.ts +6 -0
  592. package/dist/integrations/cloud/llm/validate.d.ts.map +1 -0
  593. package/dist/integrations/cloud/llm/validate.js +63 -0
  594. package/dist/integrations/cloud/llm/validate.js.map +1 -0
  595. package/dist/logger.d.ts +4 -1
  596. package/dist/logger.d.ts.map +1 -1
  597. package/dist/logger.js +71 -30
  598. package/dist/logger.js.map +1 -1
  599. package/dist/pdf-parse.d.js +1 -0
  600. package/dist/pdf-parse.d.js.map +1 -0
  601. package/dist/plugins/loader.d.ts +20 -0
  602. package/dist/plugins/loader.d.ts.map +1 -0
  603. package/dist/plugins/loader.js +157 -0
  604. package/dist/plugins/loader.js.map +1 -0
  605. package/dist/plugins/registry.d.ts +26 -0
  606. package/dist/plugins/registry.d.ts.map +1 -0
  607. package/dist/plugins/registry.js +71 -0
  608. package/dist/plugins/registry.js.map +1 -0
  609. package/dist/plugins/validate.d.ts +9 -0
  610. package/dist/plugins/validate.d.ts.map +1 -0
  611. package/dist/plugins/validate.js +79 -0
  612. package/dist/plugins/validate.js.map +1 -0
  613. package/dist/providers/embed-provider.d.ts +11 -0
  614. package/dist/providers/embed-provider.d.ts.map +1 -0
  615. package/dist/providers/embed-provider.js +24 -0
  616. package/dist/providers/embed-provider.js.map +1 -0
  617. package/dist/providers/extract-provider.d.ts +23 -0
  618. package/dist/providers/extract-provider.d.ts.map +1 -0
  619. package/dist/providers/extract-provider.js +25 -0
  620. package/dist/providers/extract-provider.js.map +1 -0
  621. package/dist/providers/rerank-provider.d.ts +17 -0
  622. package/dist/providers/rerank-provider.d.ts.map +1 -0
  623. package/dist/providers/rerank-provider.js +41 -0
  624. package/dist/providers/rerank-provider.js.map +1 -0
  625. package/dist/providers/search-provider.d.ts +25 -0
  626. package/dist/providers/search-provider.d.ts.map +1 -0
  627. package/dist/providers/search-provider.js +44 -0
  628. package/dist/providers/search-provider.js.map +1 -0
  629. package/dist/providers/vector-store.d.ts +27 -0
  630. package/dist/providers/vector-store.d.ts.map +1 -0
  631. package/dist/providers/vector-store.js +27 -0
  632. package/dist/providers/vector-store.js.map +1 -0
  633. package/dist/python-env.d.ts +9 -0
  634. package/dist/python-env.d.ts.map +1 -0
  635. package/dist/python-env.js +13 -0
  636. package/dist/python-env.js.map +1 -0
  637. package/dist/repl/commands/agent.d.ts +5 -0
  638. package/dist/repl/commands/agent.d.ts.map +1 -0
  639. package/dist/repl/commands/agent.js +62 -0
  640. package/dist/repl/commands/agent.js.map +1 -0
  641. package/dist/repl/commands/cache.d.ts +4 -0
  642. package/dist/repl/commands/cache.d.ts.map +1 -0
  643. package/dist/repl/commands/cache.js +43 -0
  644. package/dist/repl/commands/cache.js.map +1 -0
  645. package/dist/repl/commands/crawl.d.ts +7 -0
  646. package/dist/repl/commands/crawl.d.ts.map +1 -0
  647. package/dist/repl/commands/crawl.js +44 -0
  648. package/dist/repl/commands/crawl.js.map +1 -0
  649. package/dist/repl/commands/extract.d.ts +5 -0
  650. package/dist/repl/commands/extract.d.ts.map +1 -0
  651. package/dist/repl/commands/extract.js +47 -0
  652. package/dist/repl/commands/extract.js.map +1 -0
  653. package/dist/repl/commands/fetch.d.ts +5 -0
  654. package/dist/repl/commands/fetch.d.ts.map +1 -0
  655. package/dist/repl/commands/fetch.js +67 -0
  656. package/dist/repl/commands/fetch.js.map +1 -0
  657. package/dist/repl/commands/find-similar.d.ts +5 -0
  658. package/dist/repl/commands/find-similar.d.ts.map +1 -0
  659. package/dist/repl/commands/find-similar.js +74 -0
  660. package/dist/repl/commands/find-similar.js.map +1 -0
  661. package/dist/repl/commands/research.d.ts +5 -0
  662. package/dist/repl/commands/research.d.ts.map +1 -0
  663. package/dist/repl/commands/research.js +65 -0
  664. package/dist/repl/commands/research.js.map +1 -0
  665. package/dist/repl/commands/search.d.ts +5 -0
  666. package/dist/repl/commands/search.d.ts.map +1 -0
  667. package/dist/repl/commands/search.js +74 -0
  668. package/dist/repl/commands/search.js.map +1 -0
  669. package/dist/repl/commands/types.d.ts +9 -0
  670. package/dist/repl/commands/types.d.ts.map +1 -0
  671. package/dist/repl/commands/types.js +1 -0
  672. package/dist/repl/commands/types.js.map +1 -0
  673. package/dist/repl/formatters.d.ts +13 -0
  674. package/dist/repl/formatters.d.ts.map +1 -0
  675. package/dist/repl/formatters.js +283 -0
  676. package/dist/repl/formatters.js.map +1 -0
  677. package/dist/repl/parser.d.ts +9 -0
  678. package/dist/repl/parser.d.ts.map +1 -0
  679. package/dist/repl/parser.js +86 -0
  680. package/dist/repl/parser.js.map +1 -0
  681. package/dist/repl/shell.d.ts +8 -0
  682. package/dist/repl/shell.d.ts.map +1 -0
  683. package/dist/repl/shell.js +184 -0
  684. package/dist/repl/shell.js.map +1 -0
  685. package/dist/research/branch-exploration.d.ts +14 -0
  686. package/dist/research/branch-exploration.d.ts.map +1 -0
  687. package/dist/research/branch-exploration.js +100 -0
  688. package/dist/research/branch-exploration.js.map +1 -0
  689. package/dist/research/brief.d.ts +6 -0
  690. package/dist/research/brief.d.ts.map +1 -0
  691. package/dist/research/brief.js +246 -0
  692. package/dist/research/brief.js.map +1 -0
  693. package/dist/research/citation-graph.d.ts +9 -0
  694. package/dist/research/citation-graph.d.ts.map +1 -0
  695. package/dist/research/citation-graph.js +114 -0
  696. package/dist/research/citation-graph.js.map +1 -0
  697. package/dist/research/decompose.d.ts +14 -0
  698. package/dist/research/decompose.d.ts.map +1 -0
  699. package/dist/research/decompose.js +439 -0
  700. package/dist/research/decompose.js.map +1 -0
  701. package/dist/research/pipeline.d.ts +5 -0
  702. package/dist/research/pipeline.d.ts.map +1 -0
  703. package/dist/research/pipeline.js +269 -0
  704. package/dist/research/pipeline.js.map +1 -0
  705. package/dist/research/synthesis-local.d.ts +19 -0
  706. package/dist/research/synthesis-local.d.ts.map +1 -0
  707. package/dist/research/synthesis-local.js +62 -0
  708. package/dist/research/synthesis-local.js.map +1 -0
  709. package/dist/research/synthesize.d.ts +10 -0
  710. package/dist/research/synthesize.d.ts.map +1 -0
  711. package/dist/research/synthesize.js +137 -0
  712. package/dist/research/synthesize.js.map +1 -0
  713. package/dist/search/answer-synthesis.d.ts +33 -0
  714. package/dist/search/answer-synthesis.d.ts.map +1 -0
  715. package/dist/search/answer-synthesis.js +244 -0
  716. package/dist/search/answer-synthesis.js.map +1 -0
  717. package/dist/search/context-formatter.d.ts +3 -0
  718. package/dist/search/context-formatter.d.ts.map +1 -0
  719. package/dist/search/context-formatter.js +56 -0
  720. package/dist/search/context-formatter.js.map +1 -0
  721. package/dist/search/dedup.d.ts +1 -0
  722. package/dist/search/dedup.d.ts.map +1 -1
  723. package/dist/search/dedup.js +40 -32
  724. package/dist/search/dedup.js.map +1 -1
  725. package/dist/search/engines/arxiv.d.ts +7 -0
  726. package/dist/search/engines/arxiv.d.ts.map +1 -0
  727. package/dist/search/engines/arxiv.js +70 -0
  728. package/dist/search/engines/arxiv.js.map +1 -0
  729. package/dist/search/engines/bing-news.d.ts +7 -0
  730. package/dist/search/engines/bing-news.d.ts.map +1 -0
  731. package/dist/search/engines/bing-news.js +97 -0
  732. package/dist/search/engines/bing-news.js.map +1 -0
  733. package/dist/search/engines/bing.d.ts +1 -0
  734. package/dist/search/engines/bing.d.ts.map +1 -1
  735. package/dist/search/engines/bing.js +100 -44
  736. package/dist/search/engines/bing.js.map +1 -1
  737. package/dist/search/engines/devdocs.d.ts +6 -0
  738. package/dist/search/engines/devdocs.d.ts.map +1 -0
  739. package/dist/search/engines/devdocs.js +56 -0
  740. package/dist/search/engines/devdocs.js.map +1 -0
  741. package/dist/search/engines/duckduckgo.d.ts.map +1 -1
  742. package/dist/search/engines/duckduckgo.js +56 -44
  743. package/dist/search/engines/duckduckgo.js.map +1 -1
  744. package/dist/search/engines/github-code.d.ts +7 -0
  745. package/dist/search/engines/github-code.d.ts.map +1 -0
  746. package/dist/search/engines/github-code.js +55 -0
  747. package/dist/search/engines/github-code.js.map +1 -0
  748. package/dist/search/engines/hn-algolia.d.ts +7 -0
  749. package/dist/search/engines/hn-algolia.d.ts.map +1 -0
  750. package/dist/search/engines/hn-algolia.js +76 -0
  751. package/dist/search/engines/hn-algolia.js.map +1 -0
  752. package/dist/search/engines/lobsters.d.ts +7 -0
  753. package/dist/search/engines/lobsters.d.ts.map +1 -0
  754. package/dist/search/engines/lobsters.js +83 -0
  755. package/dist/search/engines/lobsters.js.map +1 -0
  756. package/dist/search/engines/mdn.d.ts +7 -0
  757. package/dist/search/engines/mdn.d.ts.map +1 -0
  758. package/dist/search/engines/mdn.js +48 -0
  759. package/dist/search/engines/mdn.js.map +1 -0
  760. package/dist/search/engines/semantic-scholar.d.ts +7 -0
  761. package/dist/search/engines/semantic-scholar.d.ts.map +1 -0
  762. package/dist/search/engines/semantic-scholar.js +69 -0
  763. package/dist/search/engines/semantic-scholar.js.map +1 -0
  764. package/dist/search/engines/stackoverflow.d.ts +7 -0
  765. package/dist/search/engines/stackoverflow.d.ts.map +1 -0
  766. package/dist/search/engines/stackoverflow.js +73 -0
  767. package/dist/search/engines/stackoverflow.js.map +1 -0
  768. package/dist/search/engines/startpage.d.ts.map +1 -1
  769. package/dist/search/engines/startpage.js +65 -46
  770. package/dist/search/engines/startpage.js.map +1 -1
  771. package/dist/search/evidence.d.ts +25 -0
  772. package/dist/search/evidence.d.ts.map +1 -0
  773. package/dist/search/evidence.js +220 -0
  774. package/dist/search/evidence.js.map +1 -0
  775. package/dist/search/filters.d.ts.map +1 -1
  776. package/dist/search/filters.js +58 -54
  777. package/dist/search/filters.js.map +1 -1
  778. package/dist/search/find-similar/crawl-rank.d.ts +9 -0
  779. package/dist/search/find-similar/crawl-rank.d.ts.map +1 -0
  780. package/dist/search/find-similar/crawl-rank.js +272 -0
  781. package/dist/search/find-similar/crawl-rank.js.map +1 -0
  782. package/dist/search/find-similar/mode.d.ts +4 -0
  783. package/dist/search/find-similar/mode.d.ts.map +1 -0
  784. package/dist/search/find-similar/mode.js +12 -0
  785. package/dist/search/find-similar/mode.js.map +1 -0
  786. package/dist/search/find-similar.d.ts +5 -0
  787. package/dist/search/find-similar.d.ts.map +1 -0
  788. package/dist/search/find-similar.js +509 -0
  789. package/dist/search/find-similar.js.map +1 -0
  790. package/dist/search/highlights.d.ts +19 -0
  791. package/dist/search/highlights.d.ts.map +1 -0
  792. package/dist/search/highlights.js +167 -0
  793. package/dist/search/highlights.js.map +1 -0
  794. package/dist/search/language-filter.d.ts +29 -0
  795. package/dist/search/language-filter.d.ts.map +1 -0
  796. package/dist/search/language-filter.js +126 -0
  797. package/dist/search/language-filter.js.map +1 -0
  798. package/dist/search/legacy/searxng-orchestrator.d.ts +4 -0
  799. package/dist/search/legacy/searxng-orchestrator.d.ts.map +1 -0
  800. package/dist/search/legacy/searxng-orchestrator.js +501 -0
  801. package/dist/search/legacy/searxng-orchestrator.js.map +1 -0
  802. package/dist/search/legacy/searxng-provider.d.ts +7 -0
  803. package/dist/search/legacy/searxng-provider.d.ts.map +1 -0
  804. package/dist/search/legacy/searxng-provider.js +11 -0
  805. package/dist/search/legacy/searxng-provider.js.map +1 -0
  806. package/dist/search/multi-query.d.ts +25 -0
  807. package/dist/search/multi-query.d.ts.map +1 -0
  808. package/dist/search/multi-query.js +228 -0
  809. package/dist/search/multi-query.js.map +1 -0
  810. package/dist/search/query.js +32 -34
  811. package/dist/search/query.js.map +1 -1
  812. package/dist/search/rerank.d.ts +3 -1
  813. package/dist/search/rerank.d.ts.map +1 -1
  814. package/dist/search/rerank.js +44 -35
  815. package/dist/search/rerank.js.map +1 -1
  816. package/dist/search/reranker/authority-boost.d.ts +3 -0
  817. package/dist/search/reranker/authority-boost.d.ts.map +1 -0
  818. package/dist/search/reranker/authority-boost.js +179 -0
  819. package/dist/search/reranker/authority-boost.js.map +1 -0
  820. package/dist/search/reranker/consensus-boost.d.ts +3 -0
  821. package/dist/search/reranker/consensus-boost.d.ts.map +1 -0
  822. package/dist/search/reranker/consensus-boost.js +27 -0
  823. package/dist/search/reranker/consensus-boost.js.map +1 -0
  824. package/dist/search/reranker/recency-boost.d.ts +3 -0
  825. package/dist/search/reranker/recency-boost.d.ts.map +1 -0
  826. package/dist/search/reranker/recency-boost.js +13 -0
  827. package/dist/search/reranker/recency-boost.js.map +1 -0
  828. package/dist/search/reranker/recency.d.ts +3 -0
  829. package/dist/search/reranker/recency.d.ts.map +1 -0
  830. package/dist/search/reranker/recency.js +23 -0
  831. package/dist/search/reranker/recency.js.map +1 -0
  832. package/dist/search/reranker/transformers-rerank-provider.d.ts +13 -0
  833. package/dist/search/reranker/transformers-rerank-provider.d.ts.map +1 -0
  834. package/dist/search/reranker/transformers-rerank-provider.js +94 -0
  835. package/dist/search/reranker/transformers-rerank-provider.js.map +1 -0
  836. package/dist/search/rrf.d.ts +17 -0
  837. package/dist/search/rrf.d.ts.map +1 -0
  838. package/dist/search/rrf.js +39 -0
  839. package/dist/search/rrf.js.map +1 -0
  840. package/dist/search/sampling.d.ts +25 -0
  841. package/dist/search/sampling.d.ts.map +1 -0
  842. package/dist/search/sampling.js +52 -0
  843. package/dist/search/sampling.js.map +1 -0
  844. package/dist/search/searxng.d.ts.map +1 -1
  845. package/dist/search/searxng.js +69 -79
  846. package/dist/search/searxng.js.map +1 -1
  847. package/dist/search/tokens.d.ts +3 -0
  848. package/dist/search/tokens.d.ts.map +1 -0
  849. package/dist/search/tokens.js +39 -0
  850. package/dist/search/tokens.js.map +1 -0
  851. package/dist/search/truncate.d.ts +6 -0
  852. package/dist/search/truncate.d.ts.map +1 -0
  853. package/dist/search/truncate.js +26 -0
  854. package/dist/search/truncate.js.map +1 -0
  855. package/dist/search/url-unwrap.d.ts +3 -0
  856. package/dist/search/url-unwrap.d.ts.map +1 -0
  857. package/dist/search/url-unwrap.js +43 -0
  858. package/dist/search/url-unwrap.js.map +1 -0
  859. package/dist/search/v1/context-rank.d.ts +13 -0
  860. package/dist/search/v1/context-rank.d.ts.map +1 -0
  861. package/dist/search/v1/context-rank.js +74 -0
  862. package/dist/search/v1/context-rank.js.map +1 -0
  863. package/dist/search/v1/engine-base.d.ts +27 -0
  864. package/dist/search/v1/engine-base.d.ts.map +1 -0
  865. package/dist/search/v1/engine-base.js +110 -0
  866. package/dist/search/v1/engine-base.js.map +1 -0
  867. package/dist/search/v1/intent-router.d.ts +22 -0
  868. package/dist/search/v1/intent-router.d.ts.map +1 -0
  869. package/dist/search/v1/intent-router.js +138 -0
  870. package/dist/search/v1/intent-router.js.map +1 -0
  871. package/dist/search/v1/orchestrator.d.ts +24 -0
  872. package/dist/search/v1/orchestrator.d.ts.map +1 -0
  873. package/dist/search/v1/orchestrator.js +163 -0
  874. package/dist/search/v1/orchestrator.js.map +1 -0
  875. package/dist/search/v1/recency-boost.d.ts +9 -0
  876. package/dist/search/v1/recency-boost.d.ts.map +1 -0
  877. package/dist/search/v1/recency-boost.js +37 -0
  878. package/dist/search/v1/recency-boost.js.map +1 -0
  879. package/dist/search/v1/recent-cache-dedup.d.ts +6 -0
  880. package/dist/search/v1/recent-cache-dedup.d.ts.map +1 -0
  881. package/dist/search/v1/recent-cache-dedup.js +85 -0
  882. package/dist/search/v1/recent-cache-dedup.js.map +1 -0
  883. package/dist/search/v1/rss/feed-config.d.ts +21 -0
  884. package/dist/search/v1/rss/feed-config.d.ts.map +1 -0
  885. package/dist/search/v1/rss/feed-config.js +90 -0
  886. package/dist/search/v1/rss/feed-config.js.map +1 -0
  887. package/dist/search/v1/rss/feed-parser.d.ts +14 -0
  888. package/dist/search/v1/rss/feed-parser.d.ts.map +1 -0
  889. package/dist/search/v1/rss/feed-parser.js +104 -0
  890. package/dist/search/v1/rss/feed-parser.js.map +1 -0
  891. package/dist/search/v1/rss/feed-poller.d.ts +22 -0
  892. package/dist/search/v1/rss/feed-poller.d.ts.map +1 -0
  893. package/dist/search/v1/rss/feed-poller.js +102 -0
  894. package/dist/search/v1/rss/feed-poller.js.map +1 -0
  895. package/dist/search/v1/rss/feed-store.d.ts +30 -0
  896. package/dist/search/v1/rss/feed-store.d.ts.map +1 -0
  897. package/dist/search/v1/rss/feed-store.js +134 -0
  898. package/dist/search/v1/rss/feed-store.js.map +1 -0
  899. package/dist/search/v1/rss/rss-engine.d.ts +6 -0
  900. package/dist/search/v1/rss/rss-engine.d.ts.map +1 -0
  901. package/dist/search/v1/rss/rss-engine.js +28 -0
  902. package/dist/search/v1/rss/rss-engine.js.map +1 -0
  903. package/dist/search/v1/v1-provider.d.ts +7 -0
  904. package/dist/search/v1/v1-provider.d.ts.map +1 -0
  905. package/dist/search/v1/v1-provider.js +68 -0
  906. package/dist/search/v1/v1-provider.js.map +1 -0
  907. package/dist/search/v1/verticals/code.d.ts +4 -0
  908. package/dist/search/v1/verticals/code.d.ts.map +1 -0
  909. package/dist/search/v1/verticals/code.js +20 -0
  910. package/dist/search/v1/verticals/code.js.map +1 -0
  911. package/dist/search/v1/verticals/docs.d.ts +4 -0
  912. package/dist/search/v1/verticals/docs.d.ts.map +1 -0
  913. package/dist/search/v1/verticals/docs.js +20 -0
  914. package/dist/search/v1/verticals/docs.js.map +1 -0
  915. package/dist/search/v1/verticals/general.d.ts +4 -0
  916. package/dist/search/v1/verticals/general.d.ts.map +1 -0
  917. package/dist/search/v1/verticals/general.js +22 -0
  918. package/dist/search/v1/verticals/general.js.map +1 -0
  919. package/dist/search/v1/verticals/news.d.ts +10 -0
  920. package/dist/search/v1/verticals/news.d.ts.map +1 -0
  921. package/dist/search/v1/verticals/news.js +52 -0
  922. package/dist/search/v1/verticals/news.js.map +1 -0
  923. package/dist/search/v1/verticals/papers.d.ts +4 -0
  924. package/dist/search/v1/verticals/papers.d.ts.map +1 -0
  925. package/dist/search/v1/verticals/papers.js +23 -0
  926. package/dist/search/v1/verticals/papers.js.map +1 -0
  927. package/dist/search/validator.js +31 -31
  928. package/dist/search/validator.js.map +1 -1
  929. package/dist/searxng/bootstrap.d.ts +30 -0
  930. package/dist/searxng/bootstrap.d.ts.map +1 -1
  931. package/dist/searxng/bootstrap.js +223 -85
  932. package/dist/searxng/bootstrap.js.map +1 -1
  933. package/dist/searxng/docker.d.ts.map +1 -1
  934. package/dist/searxng/docker.js +69 -60
  935. package/dist/searxng/docker.js.map +1 -1
  936. package/dist/searxng/process.d.ts +13 -1
  937. package/dist/searxng/process.d.ts.map +1 -1
  938. package/dist/searxng/process.js +231 -164
  939. package/dist/searxng/process.js.map +1 -1
  940. package/dist/server/backend-status.d.ts +13 -0
  941. package/dist/server/backend-status.d.ts.map +1 -0
  942. package/dist/server/backend-status.js +40 -0
  943. package/dist/server/backend-status.js.map +1 -0
  944. package/dist/server/tool-schemas.d.ts +549 -0
  945. package/dist/server/tool-schemas.d.ts.map +1 -0
  946. package/dist/server/tool-schemas.js +464 -0
  947. package/dist/server/tool-schemas.js.map +1 -0
  948. package/dist/server/warmup-on-start.d.ts +9 -0
  949. package/dist/server/warmup-on-start.d.ts.map +1 -0
  950. package/dist/server/warmup-on-start.js +55 -0
  951. package/dist/server/warmup-on-start.js.map +1 -0
  952. package/dist/server.d.ts +17 -0
  953. package/dist/server.d.ts.map +1 -1
  954. package/dist/server.js +454 -297
  955. package/dist/server.js.map +1 -1
  956. package/dist/tools/agent.d.ts +5 -0
  957. package/dist/tools/agent.d.ts.map +1 -0
  958. package/dist/tools/agent.js +128 -0
  959. package/dist/tools/agent.js.map +1 -0
  960. package/dist/tools/cache.d.ts +2 -1
  961. package/dist/tools/cache.d.ts.map +1 -1
  962. package/dist/tools/cache.js +177 -44
  963. package/dist/tools/cache.js.map +1 -1
  964. package/dist/tools/crawl.d.ts.map +1 -1
  965. package/dist/tools/crawl.js +171 -88
  966. package/dist/tools/crawl.js.map +1 -1
  967. package/dist/tools/extract.d.ts +2 -2
  968. package/dist/tools/extract.d.ts.map +1 -1
  969. package/dist/tools/extract.js +175 -59
  970. package/dist/tools/extract.js.map +1 -1
  971. package/dist/tools/fetch.d.ts +2 -2
  972. package/dist/tools/fetch.d.ts.map +1 -1
  973. package/dist/tools/fetch.js +174 -68
  974. package/dist/tools/fetch.js.map +1 -1
  975. package/dist/tools/find-similar.d.ts +5 -0
  976. package/dist/tools/find-similar.d.ts.map +1 -0
  977. package/dist/tools/find-similar.js +127 -0
  978. package/dist/tools/find-similar.js.map +1 -0
  979. package/dist/tools/research.d.ts +5 -0
  980. package/dist/tools/research.d.ts.map +1 -0
  981. package/dist/tools/research.js +107 -0
  982. package/dist/tools/research.js.map +1 -0
  983. package/dist/tools/search.d.ts +10 -2
  984. package/dist/tools/search.d.ts.map +1 -1
  985. package/dist/tools/search.js +13 -158
  986. package/dist/tools/search.js.map +1 -1
  987. package/dist/types.d.ts +350 -7
  988. package/dist/types.d.ts.map +1 -1
  989. package/dist/types.js +6 -1
  990. package/dist/types.js.map +1 -1
  991. package/dist/util/mode.d.ts +4 -0
  992. package/dist/util/mode.d.ts.map +1 -0
  993. package/dist/util/mode.js +34 -0
  994. package/dist/util/mode.js.map +1 -0
  995. package/package.json +78 -8
  996. package/dist/extraction/trafilatura.d.ts +0 -6
  997. package/dist/extraction/trafilatura.d.ts.map +0 -1
  998. package/dist/extraction/trafilatura.js +0 -105
  999. package/dist/extraction/trafilatura.js.map +0 -1
  1000. package/dist/search/flashrank.d.ts +0 -12
  1001. package/dist/search/flashrank.d.ts.map +0 -1
  1002. package/dist/search/flashrank.js +0 -63
  1003. package/dist/search/flashrank.js.map +0 -1
package/dist/cache/db.js CHANGED
@@ -1,15 +1,43 @@
1
- import Database from 'better-sqlite3';
1
+ import Database from "better-sqlite3";
2
+ import * as sv from "sqlite-vec";
3
+ import { createLogger } from "../logger.js";
4
+ import { applyMigrations } from "./migrations/runner.js";
5
+ const log = createLogger("cache");
2
6
  let instance = null;
3
- export function initDatabase(dbPath) {
4
- if (instance) {
5
- instance.close();
6
- instance = null;
7
+ let vecLoaded = false;
8
+ let exitHookRegistered = false;
9
+ function isVecExtensionLoaded() {
10
+ return vecLoaded;
11
+ }
12
+ function ensureExitHookRegistered() {
13
+ if (exitHookRegistered) return;
14
+ exitHookRegistered = true;
15
+ process.on("exit", () => {
16
+ try {
17
+ closeDatabase();
18
+ } catch {
7
19
  }
8
- const db = new Database(dbPath);
9
- db.pragma('journal_mode = WAL');
10
- db.pragma('synchronous = NORMAL');
11
- db.pragma('foreign_keys = ON');
12
- db.exec(`
20
+ });
21
+ }
22
+ function initDatabase(dbPath) {
23
+ if (instance) {
24
+ instance.close();
25
+ instance = null;
26
+ }
27
+ const db = new Database(dbPath);
28
+ db.pragma("journal_mode = WAL");
29
+ db.pragma("synchronous = NORMAL");
30
+ db.pragma("foreign_keys = ON");
31
+ try {
32
+ sv.load(db);
33
+ vecLoaded = true;
34
+ } catch (err) {
35
+ vecLoaded = false;
36
+ log.warn("sqlite-vec extension failed to load \u2014 vector search disabled", {
37
+ error: err instanceof Error ? err.message : String(err)
38
+ });
39
+ }
40
+ db.exec(`
13
41
  CREATE TABLE IF NOT EXISTS url_cache (
14
42
  id INTEGER PRIMARY KEY AUTOINCREMENT,
15
43
  url TEXT UNIQUE NOT NULL,
@@ -54,6 +82,11 @@ export function initDatabase(dbPath) {
54
82
  VALUES ('delete', old.id, old.title, old.markdown, old.url);
55
83
  END;
56
84
 
85
+ CREATE TRIGGER IF NOT EXISTS url_cache_au_after AFTER UPDATE ON url_cache BEGIN
86
+ INSERT INTO url_cache_fts(rowid, title, markdown, url)
87
+ VALUES (new.id, new.title, new.markdown, new.url);
88
+ END;
89
+
57
90
  CREATE TABLE IF NOT EXISTS search_cache (
58
91
  id INTEGER PRIMARY KEY AUTOINCREMENT,
59
92
  query TEXT NOT NULL,
@@ -71,6 +104,16 @@ export function initDatabase(dbPath) {
71
104
  last_updated TEXT
72
105
  );
73
106
 
107
+ CREATE TABLE IF NOT EXISTS lightpanda_routing (
108
+ domain TEXT PRIMARY KEY,
109
+ success_count INTEGER DEFAULT 0,
110
+ failure_count INTEGER DEFAULT 0,
111
+ prefer_chromium INTEGER DEFAULT 0,
112
+ last_success TEXT,
113
+ last_failure TEXT,
114
+ last_updated TEXT NOT NULL DEFAULT (datetime('now'))
115
+ );
116
+
74
117
  CREATE TABLE IF NOT EXISTS domain_boilerplate (
75
118
  domain TEXT NOT NULL,
76
119
  block_hash TEXT NOT NULL,
@@ -79,19 +122,48 @@ export function initDatabase(dbPath) {
79
122
  PRIMARY KEY (domain, block_hash)
80
123
  );
81
124
  `);
82
- instance = db;
83
- return db;
84
- }
85
- export function getDatabase() {
86
- if (!instance) {
87
- throw new Error('Database not initialized. Call initDatabase() first.');
125
+ try {
126
+ const columns = db.pragma("table_info(url_cache)");
127
+ const columnNames = new Set(columns.map((c) => c.name));
128
+ if (!columnNames.has("embedding")) {
129
+ db.exec("ALTER TABLE url_cache ADD COLUMN embedding BLOB");
88
130
  }
89
- return instance;
90
- }
91
- export function closeDatabase() {
92
- if (instance) {
93
- instance.close();
94
- instance = null;
131
+ if (!columnNames.has("embedding_model")) {
132
+ db.exec("ALTER TABLE url_cache ADD COLUMN embedding_model TEXT");
95
133
  }
134
+ if (!columnNames.has("embedding_dims")) {
135
+ db.exec("ALTER TABLE url_cache ADD COLUMN embedding_dims INTEGER");
136
+ }
137
+ } catch {
138
+ }
139
+ try {
140
+ applyMigrations(db, { vecLoaded });
141
+ } catch (err) {
142
+ log.error("migration runner failed \u2014 some schema may be missing", {
143
+ error: err instanceof Error ? err.message : String(err)
144
+ });
145
+ }
146
+ instance = db;
147
+ ensureExitHookRegistered();
148
+ return db;
149
+ }
150
+ function getDatabase() {
151
+ if (!instance) {
152
+ throw new Error("Database not initialized. Call initDatabase() first.");
153
+ }
154
+ return instance;
155
+ }
156
+ function closeDatabase() {
157
+ if (instance) {
158
+ instance.close();
159
+ instance = null;
160
+ vecLoaded = false;
161
+ }
96
162
  }
163
+ export {
164
+ closeDatabase,
165
+ getDatabase,
166
+ initDatabase,
167
+ isVecExtensionLoaded
168
+ };
97
169
  //# sourceMappingURL=db.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/cache/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,IAAI,QAAQ,GAA6B,IAAI,CAAC;AAE9C,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEhC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAClC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEP,CAAC,CAAC;IAEH,QAAQ,GAAG,EAAE,CAAC;IACd,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;AACH,CAAC"}
1
+ {"version":3,"sources":["../../src/cache/db.ts"],"sourcesContent":["import Database from 'better-sqlite3';\nimport * as sv from 'sqlite-vec';\nimport { createLogger } from '../logger.js';\nimport { applyMigrations } from './migrations/runner.js';\n\nconst log = createLogger('cache');\n\nlet instance: Database.Database | null = null;\nlet vecLoaded = false;\nlet exitHookRegistered = false;\n\nexport function isVecExtensionLoaded(): boolean {\n return vecLoaded;\n}\n\n// Register a process-exit guard so any CLI command that opens the DB\n// closes it before native teardown — prevents the better-sqlite3 +\n// sqlite-vec destructor race that surfaces as\n// `mutex lock failed: Invalid argument` on doctor/warmup exit.\nfunction ensureExitHookRegistered(): void {\n if (exitHookRegistered) return;\n exitHookRegistered = true;\n process.on('exit', () => {\n try {\n closeDatabase();\n } catch {\n // swallow — process is exiting, nothing useful to do\n }\n });\n}\n\nexport function initDatabase(dbPath: string): Database.Database {\n if (instance) {\n instance.close();\n instance = null;\n }\n\n const db = new Database(dbPath);\n\n db.pragma('journal_mode = WAL');\n db.pragma('synchronous = NORMAL');\n db.pragma('foreign_keys = ON');\n\n // sqlite-vec extension. Required for vector search; soft-fails on\n // unsupported platforms (musl/alpine) so cache.db init still works for\n // FTS5-only flows. Vector code paths check `isVecExtensionLoaded()` or\n // gracefully degrade.\n try {\n sv.load(db);\n vecLoaded = true;\n } catch (err) {\n vecLoaded = false;\n log.warn('sqlite-vec extension failed to load — vector search disabled', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n\n db.exec(`\n CREATE TABLE IF NOT EXISTS url_cache (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n url TEXT UNIQUE NOT NULL,\n normalized_url TEXT NOT NULL,\n title TEXT,\n markdown TEXT,\n raw_html TEXT,\n metadata TEXT,\n links TEXT,\n images TEXT,\n fetch_method TEXT,\n extractor_used TEXT,\n content_hash TEXT,\n fetched_at TEXT NOT NULL,\n expires_at TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n\n CREATE UNIQUE INDEX IF NOT EXISTS idx_url_cache_normalized ON url_cache(normalized_url);\n\n CREATE VIRTUAL TABLE IF NOT EXISTS url_cache_fts USING fts5(\n title,\n markdown,\n url,\n content='url_cache',\n content_rowid='id'\n );\n\n CREATE TRIGGER IF NOT EXISTS url_cache_ai AFTER INSERT ON url_cache BEGIN\n INSERT INTO url_cache_fts(rowid, title, markdown, url)\n VALUES (new.id, new.title, new.markdown, new.url);\n END;\n\n CREATE TRIGGER IF NOT EXISTS url_cache_ad BEFORE DELETE ON url_cache BEGIN\n INSERT INTO url_cache_fts(url_cache_fts, rowid, title, markdown, url)\n VALUES ('delete', old.id, old.title, old.markdown, old.url);\n END;\n\n CREATE TRIGGER IF NOT EXISTS url_cache_au BEFORE UPDATE ON url_cache BEGIN\n INSERT INTO url_cache_fts(url_cache_fts, rowid, title, markdown, url)\n VALUES ('delete', old.id, old.title, old.markdown, old.url);\n END;\n\n CREATE TRIGGER IF NOT EXISTS url_cache_au_after AFTER UPDATE ON url_cache BEGIN\n INSERT INTO url_cache_fts(rowid, title, markdown, url)\n VALUES (new.id, new.title, new.markdown, new.url);\n END;\n\n CREATE TABLE IF NOT EXISTS search_cache (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n query TEXT NOT NULL,\n query_hash TEXT UNIQUE NOT NULL,\n results TEXT NOT NULL,\n engines_used TEXT,\n searched_at TEXT NOT NULL DEFAULT (datetime('now')),\n expires_at TEXT\n );\n\n CREATE TABLE IF NOT EXISTS domain_routing (\n domain TEXT PRIMARY KEY,\n prefer_playwright INTEGER DEFAULT 0,\n http_failures INTEGER DEFAULT 0,\n last_updated TEXT\n );\n\n CREATE TABLE IF NOT EXISTS lightpanda_routing (\n domain TEXT PRIMARY KEY,\n success_count INTEGER DEFAULT 0,\n failure_count INTEGER DEFAULT 0,\n prefer_chromium INTEGER DEFAULT 0,\n last_success TEXT,\n last_failure TEXT,\n last_updated TEXT NOT NULL DEFAULT (datetime('now'))\n );\n\n CREATE TABLE IF NOT EXISTS domain_boilerplate (\n domain TEXT NOT NULL,\n block_hash TEXT NOT NULL,\n sample_text TEXT,\n discovered_at TEXT NOT NULL DEFAULT (datetime('now')),\n PRIMARY KEY (domain, block_hash)\n );\n `);\n\n // Embedding columns migration (Slice 22)\n try {\n const columns = db.pragma('table_info(url_cache)') as Array<{ name: string }>;\n const columnNames = new Set(columns.map(c => c.name));\n\n if (!columnNames.has('embedding')) {\n db.exec('ALTER TABLE url_cache ADD COLUMN embedding BLOB');\n }\n if (!columnNames.has('embedding_model')) {\n db.exec('ALTER TABLE url_cache ADD COLUMN embedding_model TEXT');\n }\n if (!columnNames.has('embedding_dims')) {\n db.exec('ALTER TABLE url_cache ADD COLUMN embedding_dims INTEGER');\n }\n } catch {\n // Migration already applied or column already exists\n }\n\n // Apply registered migrations after the inline schema is in place so\n // migrations can build on the legacy tables (url_cache, etc.). Migrations\n // that depend on the sqlite-vec extension declare `requiresVec: true` and\n // are skipped when the extension is unavailable; FTS5-only migrations\n // (e.g. feed_items) still run.\n try {\n applyMigrations(db, { vecLoaded });\n } catch (err) {\n log.error('migration runner failed — some schema may be missing', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n\n instance = db;\n ensureExitHookRegistered();\n return db;\n}\n\nexport function getDatabase(): Database.Database {\n if (!instance) {\n throw new Error('Database not initialized. Call initDatabase() first.');\n }\n return instance;\n}\n\nexport function closeDatabase(): void {\n if (instance) {\n instance.close();\n instance = null;\n vecLoaded = false;\n }\n}\n"],"mappings":"AAAA,OAAO,cAAc;AACrB,YAAY,QAAQ;AACpB,SAAS,oBAAoB;AAC7B,SAAS,uBAAuB;AAEhC,MAAM,MAAM,aAAa,OAAO;AAEhC,IAAI,WAAqC;AACzC,IAAI,YAAY;AAChB,IAAI,qBAAqB;AAElB,SAAS,uBAAgC;AAC9C,SAAO;AACT;AAMA,SAAS,2BAAiC;AACxC,MAAI,mBAAoB;AACxB,uBAAqB;AACrB,UAAQ,GAAG,QAAQ,MAAM;AACvB,QAAI;AACF,oBAAc;AAAA,IAChB,QAAQ;AAAA,IAER;AAAA,EACF,CAAC;AACH;AAEO,SAAS,aAAa,QAAmC;AAC9D,MAAI,UAAU;AACZ,aAAS,MAAM;AACf,eAAW;AAAA,EACb;AAEA,QAAM,KAAK,IAAI,SAAS,MAAM;AAE9B,KAAG,OAAO,oBAAoB;AAC9B,KAAG,OAAO,sBAAsB;AAChC,KAAG,OAAO,mBAAmB;AAM7B,MAAI;AACF,OAAG,KAAK,EAAE;AACV,gBAAY;AAAA,EACd,SAAS,KAAK;AACZ,gBAAY;AACZ,QAAI,KAAK,qEAAgE;AAAA,MACvE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IACxD,CAAC;AAAA,EACH;AAEA,KAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAoFP;AAGD,MAAI;AACF,UAAM,UAAU,GAAG,OAAO,uBAAuB;AACjD,UAAM,cAAc,IAAI,IAAI,QAAQ,IAAI,OAAK,EAAE,IAAI,CAAC;AAEpD,QAAI,CAAC,YAAY,IAAI,WAAW,GAAG;AACjC,SAAG,KAAK,iDAAiD;AAAA,IAC3D;AACA,QAAI,CAAC,YAAY,IAAI,iBAAiB,GAAG;AACvC,SAAG,KAAK,uDAAuD;AAAA,IACjE;AACA,QAAI,CAAC,YAAY,IAAI,gBAAgB,GAAG;AACtC,SAAG,KAAK,yDAAyD;AAAA,IACnE;AAAA,EACF,QAAQ;AAAA,EAER;AAOA,MAAI;AACF,oBAAgB,IAAI,EAAE,UAAU,CAAC;AAAA,EACnC,SAAS,KAAK;AACZ,QAAI,MAAM,6DAAwD;AAAA,MAChE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IACxD,CAAC;AAAA,EACH;AAEA,aAAW;AACX,2BAAyB;AACzB,SAAO;AACT;AAEO,SAAS,cAAiC;AAC/C,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AACA,SAAO;AACT;AAEO,SAAS,gBAAsB;AACpC,MAAI,UAAU;AACZ,aAAS,MAAM;AACf,eAAW;AACX,gBAAY;AAAA,EACd;AACF;","names":[]}
@@ -0,0 +1,2 @@
1
+ export declare function computeDiffSummary(oldMarkdown: string, newMarkdown: string): string;
2
+ //# sourceMappingURL=diff-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-summary.d.ts","sourceRoot":"","sources":["../../src/cache/diff-summary.ts"],"names":[],"mappings":"AA4EA,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CA+BnF"}
@@ -0,0 +1,82 @@
1
+ import { createLogger } from "../logger.js";
2
+ const log = createLogger("cache");
3
+ function normalizeLineEndings(text) {
4
+ return text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
5
+ }
6
+ function splitLines(text) {
7
+ if (text === "") return [];
8
+ const normalized = normalizeLineEndings(text);
9
+ const lines = normalized.split("\n");
10
+ if (lines.length > 0 && lines[lines.length - 1] === "") {
11
+ lines.pop();
12
+ }
13
+ return lines;
14
+ }
15
+ function computeLCS(oldLines, newLines) {
16
+ const m = oldLines.length;
17
+ const n = newLines.length;
18
+ const dp = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
19
+ for (let i = 1; i <= m; i++) {
20
+ for (let j = 1; j <= n; j++) {
21
+ if (oldLines[i - 1] === newLines[j - 1]) {
22
+ dp[i][j] = dp[i - 1][j - 1] + 1;
23
+ } else {
24
+ dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
25
+ }
26
+ }
27
+ }
28
+ return dp;
29
+ }
30
+ function computeDiffCounts(oldLines, newLines) {
31
+ const m = oldLines.length;
32
+ const n = newLines.length;
33
+ if (m === 0 && n === 0) return { added: 0, removed: 0, modified: 0 };
34
+ if (m === 0) return { added: n, removed: 0, modified: 0 };
35
+ if (n === 0) return { added: 0, removed: m, modified: 0 };
36
+ const dp = computeLCS(oldLines, newLines);
37
+ const lcsLength = dp[m][n];
38
+ const removed = m - lcsLength;
39
+ const added = n - lcsLength;
40
+ let modified = 0;
41
+ const pairable = Math.min(removed, added);
42
+ if (pairable > 0) {
43
+ modified = pairable;
44
+ }
45
+ return {
46
+ added: added - modified,
47
+ removed: removed - modified,
48
+ modified
49
+ };
50
+ }
51
+ function pluralize(count, singular) {
52
+ return count === 1 ? `${count} ${singular}` : `${count} ${singular}s`;
53
+ }
54
+ const MAX_DIFF_LINES = 5e3;
55
+ function computeDiffSummary(oldMarkdown, newMarkdown) {
56
+ try {
57
+ const oldLines = splitLines(oldMarkdown);
58
+ const newLines = splitLines(newMarkdown);
59
+ if (oldLines.length > MAX_DIFF_LINES || newLines.length > MAX_DIFF_LINES) {
60
+ log.debug("content too large for LCS diff, returning approximate summary", {
61
+ oldLineCount: oldLines.length,
62
+ newLineCount: newLines.length
63
+ });
64
+ return `Content changed significantly (${oldLines.length} -> ${newLines.length} lines)`;
65
+ }
66
+ const counts = computeDiffCounts(oldLines, newLines);
67
+ const summary = `${pluralize(counts.added, "line")} added, ${pluralize(counts.removed, "line")} removed, ${pluralize(counts.modified, "line")} modified`;
68
+ log.debug("diff summary computed", {
69
+ oldLineCount: oldLines.length,
70
+ newLineCount: newLines.length,
71
+ ...counts
72
+ });
73
+ return summary;
74
+ } catch (err) {
75
+ log.warn("diff summary computation failed", { error: err instanceof Error ? err.message : String(err) });
76
+ return "Unable to compute diff summary";
77
+ }
78
+ }
79
+ export {
80
+ computeDiffSummary
81
+ };
82
+ //# sourceMappingURL=diff-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cache/diff-summary.ts"],"sourcesContent":["import { createLogger } from '../logger.js';\n\nconst log = createLogger('cache');\n\nfunction normalizeLineEndings(text: string): string {\n return text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n}\n\nfunction splitLines(text: string): string[] {\n if (text === '') return [];\n const normalized = normalizeLineEndings(text);\n const lines = normalized.split('\\n');\n if (lines.length > 0 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n return lines;\n}\n\nfunction computeLCS(oldLines: string[], newLines: string[]): number[][] {\n const m = oldLines.length;\n const n = newLines.length;\n\n const dp: number[][] = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n if (oldLines[i - 1] === newLines[j - 1]) {\n dp[i][j] = dp[i - 1][j - 1] + 1;\n } else {\n dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n }\n\n return dp;\n}\n\ninterface DiffCounts {\n added: number;\n removed: number;\n modified: number;\n}\n\nfunction computeDiffCounts(oldLines: string[], newLines: string[]): DiffCounts {\n const m = oldLines.length;\n const n = newLines.length;\n\n if (m === 0 && n === 0) return { added: 0, removed: 0, modified: 0 };\n if (m === 0) return { added: n, removed: 0, modified: 0 };\n if (n === 0) return { added: 0, removed: m, modified: 0 };\n\n const dp = computeLCS(oldLines, newLines);\n const lcsLength = dp[m][n];\n\n const removed = m - lcsLength;\n const added = n - lcsLength;\n\n let modified = 0;\n const pairable = Math.min(removed, added);\n if (pairable > 0) {\n modified = pairable;\n }\n\n return {\n added: added - modified,\n removed: removed - modified,\n modified,\n };\n}\n\nfunction pluralize(count: number, singular: string): string {\n return count === 1 ? `${count} ${singular}` : `${count} ${singular}s`;\n}\n\nconst MAX_DIFF_LINES = 5000;\n\nexport function computeDiffSummary(oldMarkdown: string, newMarkdown: string): string {\n try {\n const oldLines = splitLines(oldMarkdown);\n const newLines = splitLines(newMarkdown);\n\n if (oldLines.length > MAX_DIFF_LINES || newLines.length > MAX_DIFF_LINES) {\n log.debug('content too large for LCS diff, returning approximate summary', {\n oldLineCount: oldLines.length,\n newLineCount: newLines.length,\n });\n return `Content changed significantly (${oldLines.length} -> ${newLines.length} lines)`;\n }\n\n const counts = computeDiffCounts(oldLines, newLines);\n\n const summary =\n `${pluralize(counts.added, 'line')} added, ` +\n `${pluralize(counts.removed, 'line')} removed, ` +\n `${pluralize(counts.modified, 'line')} modified`;\n\n log.debug('diff summary computed', {\n oldLineCount: oldLines.length,\n newLineCount: newLines.length,\n ...counts,\n });\n\n return summary;\n } catch (err) {\n log.warn('diff summary computation failed', { error: err instanceof Error ? err.message : String(err) });\n return 'Unable to compute diff summary';\n }\n}\n"],"mappings":"AAAA,SAAS,oBAAoB;AAE7B,MAAM,MAAM,aAAa,OAAO;AAEhC,SAAS,qBAAqB,MAAsB;AAClD,SAAO,KAAK,QAAQ,SAAS,IAAI,EAAE,QAAQ,OAAO,IAAI;AACxD;AAEA,SAAS,WAAW,MAAwB;AAC1C,MAAI,SAAS,GAAI,QAAO,CAAC;AACzB,QAAM,aAAa,qBAAqB,IAAI;AAC5C,QAAM,QAAQ,WAAW,MAAM,IAAI;AACnC,MAAI,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,CAAC,MAAM,IAAI;AACtD,UAAM,IAAI;AAAA,EACZ;AACA,SAAO;AACT;AAEA,SAAS,WAAW,UAAoB,UAAgC;AACtE,QAAM,IAAI,SAAS;AACnB,QAAM,IAAI,SAAS;AAEnB,QAAM,KAAiB,MAAM,KAAK,EAAE,QAAQ,IAAI,EAAE,GAAG,MAAM,IAAI,MAAM,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AAEnF,WAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,aAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,UAAI,SAAS,IAAI,CAAC,MAAM,SAAS,IAAI,CAAC,GAAG;AACvC,WAAG,CAAC,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI;AAAA,MAChC,OAAO;AACL,WAAG,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAQA,SAAS,kBAAkB,UAAoB,UAAgC;AAC7E,QAAM,IAAI,SAAS;AACnB,QAAM,IAAI,SAAS;AAEnB,MAAI,MAAM,KAAK,MAAM,EAAG,QAAO,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,EAAE;AACnE,MAAI,MAAM,EAAG,QAAO,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,EAAE;AACxD,MAAI,MAAM,EAAG,QAAO,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,EAAE;AAExD,QAAM,KAAK,WAAW,UAAU,QAAQ;AACxC,QAAM,YAAY,GAAG,CAAC,EAAE,CAAC;AAEzB,QAAM,UAAU,IAAI;AACpB,QAAM,QAAQ,IAAI;AAElB,MAAI,WAAW;AACf,QAAM,WAAW,KAAK,IAAI,SAAS,KAAK;AACxC,MAAI,WAAW,GAAG;AAChB,eAAW;AAAA,EACb;AAEA,SAAO;AAAA,IACL,OAAO,QAAQ;AAAA,IACf,SAAS,UAAU;AAAA,IACnB;AAAA,EACF;AACF;AAEA,SAAS,UAAU,OAAe,UAA0B;AAC1D,SAAO,UAAU,IAAI,GAAG,KAAK,IAAI,QAAQ,KAAK,GAAG,KAAK,IAAI,QAAQ;AACpE;AAEA,MAAM,iBAAiB;AAEhB,SAAS,mBAAmB,aAAqB,aAA6B;AACnF,MAAI;AACF,UAAM,WAAW,WAAW,WAAW;AACvC,UAAM,WAAW,WAAW,WAAW;AAEvC,QAAI,SAAS,SAAS,kBAAkB,SAAS,SAAS,gBAAgB;AACxE,UAAI,MAAM,iEAAiE;AAAA,QACzE,cAAc,SAAS;AAAA,QACvB,cAAc,SAAS;AAAA,MACzB,CAAC;AACD,aAAO,kCAAkC,SAAS,MAAM,OAAO,SAAS,MAAM;AAAA,IAChF;AAEA,UAAM,SAAS,kBAAkB,UAAU,QAAQ;AAEnD,UAAM,UACJ,GAAG,UAAU,OAAO,OAAO,MAAM,CAAC,WAC/B,UAAU,OAAO,SAAS,MAAM,CAAC,aACjC,UAAU,OAAO,UAAU,MAAM,CAAC;AAEvC,QAAI,MAAM,yBAAyB;AAAA,MACjC,cAAc,SAAS;AAAA,MACvB,cAAc,SAAS;AAAA,MACvB,GAAG;AAAA,IACL,CAAC;AAED,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,QAAI,KAAK,mCAAmC,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AACvG,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -0,0 +1,29 @@
1
+ import type Database from 'better-sqlite3';
2
+ /**
3
+ * Migration registry. Entries are TS constants (not file reads) so the
4
+ * built dist/ tree has no runtime filesystem dependency. Each migration's
5
+ * `sql` string is also mirrored in src/cache/migrations/NNN-*.sql for
6
+ * grep-ability and review.
7
+ */
8
+ export interface Migration {
9
+ /** Unique stable name. Must never be renamed after release. */
10
+ name: string;
11
+ sql: string;
12
+ /** True if the migration depends on sqlite-vec being loaded. */
13
+ requiresVec?: boolean;
14
+ }
15
+ export declare const MIGRATIONS: Migration[];
16
+ /** Test-only: reset the module-level read-only guard between cases. */
17
+ export declare function _resetMigrationGuard(): void;
18
+ /**
19
+ * Apply pending migrations in order. Idempotent — already-applied migrations
20
+ * are skipped via the schema_migrations table. Migrations marked
21
+ * `requiresVec: true` are skipped when the sqlite-vec extension is absent so
22
+ * FTS5-only flows still work on platforms without the native extension.
23
+ * On a read-only database, logs a single warning and stops; subsequent
24
+ * calls in the same process are no-ops.
25
+ */
26
+ export declare function applyMigrations(db: Database.Database, opts?: {
27
+ vecLoaded: boolean;
28
+ }): void;
29
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/cache/migrations/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAK3C;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA2ED,eAAO,MAAM,UAAU,EAAE,SAAS,EAIjC,CAAC;AAgBF,uEAAuE;AACvE,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,GAAE;IAAE,SAAS,EAAE,OAAO,CAAA;CAAwB,GAAG,IAAI,CAwD/G"}
@@ -0,0 +1,147 @@
1
+ import { createLogger } from "../../logger.js";
2
+ const log = createLogger("cache");
3
+ const MIGRATION_001_SQLITE_VEC = `
4
+ CREATE VIRTUAL TABLE IF NOT EXISTS vec_documents USING vec0(
5
+ embedding float[384]
6
+ );
7
+
8
+ CREATE TABLE IF NOT EXISTS vec_id_map (
9
+ rowid INTEGER PRIMARY KEY AUTOINCREMENT,
10
+ external_id TEXT NOT NULL UNIQUE
11
+ );
12
+
13
+ CREATE TABLE IF NOT EXISTS vec_metadata (
14
+ rowid INTEGER PRIMARY KEY REFERENCES vec_id_map(rowid) ON DELETE CASCADE,
15
+ url TEXT NOT NULL,
16
+ content_hash TEXT NOT NULL,
17
+ model_id TEXT NOT NULL,
18
+ created_at INTEGER NOT NULL,
19
+ extra_json TEXT
20
+ );
21
+
22
+ CREATE INDEX IF NOT EXISTS idx_vec_metadata_url ON vec_metadata(url);
23
+ CREATE INDEX IF NOT EXISTS idx_vec_metadata_hash ON vec_metadata(content_hash);
24
+ CREATE INDEX IF NOT EXISTS idx_vec_metadata_model ON vec_metadata(model_id);
25
+ `;
26
+ const MIGRATION_002_FEED_ITEMS = `
27
+ CREATE TABLE IF NOT EXISTS feed_items (
28
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
29
+ feed_url TEXT NOT NULL,
30
+ guid TEXT NOT NULL,
31
+ title TEXT NOT NULL,
32
+ link TEXT NOT NULL,
33
+ summary TEXT NOT NULL,
34
+ published_date TEXT,
35
+ category TEXT NOT NULL DEFAULT 'news',
36
+ fetched_at TEXT NOT NULL,
37
+ UNIQUE(feed_url, guid)
38
+ );
39
+
40
+ CREATE INDEX IF NOT EXISTS idx_feed_items_published ON feed_items(published_date);
41
+ CREATE INDEX IF NOT EXISTS idx_feed_items_feed_url ON feed_items(feed_url);
42
+
43
+ CREATE VIRTUAL TABLE IF NOT EXISTS feed_items_fts USING fts5(
44
+ title, summary, link UNINDEXED,
45
+ content='feed_items',
46
+ content_rowid='id'
47
+ );
48
+
49
+ CREATE TRIGGER IF NOT EXISTS feed_items_ai AFTER INSERT ON feed_items BEGIN
50
+ INSERT INTO feed_items_fts(rowid, title, summary, link) VALUES (new.id, new.title, new.summary, new.link);
51
+ END;
52
+
53
+ CREATE TRIGGER IF NOT EXISTS feed_items_ad AFTER DELETE ON feed_items BEGIN
54
+ INSERT INTO feed_items_fts(feed_items_fts, rowid, title, summary, link) VALUES('delete', old.id, old.title, old.summary, old.link);
55
+ END;
56
+
57
+ CREATE TRIGGER IF NOT EXISTS feed_items_au AFTER UPDATE ON feed_items BEGIN
58
+ INSERT INTO feed_items_fts(feed_items_fts, rowid, title, summary, link) VALUES('delete', old.id, old.title, old.summary, old.link);
59
+ INSERT INTO feed_items_fts(feed_items_fts, rowid, title, summary, link) VALUES (new.id, new.title, new.summary, new.link);
60
+ END;
61
+ `;
62
+ const MIGRATION_003_CRAWL_ETAGS = `
63
+ CREATE TABLE IF NOT EXISTS crawl_etags (
64
+ url TEXT PRIMARY KEY,
65
+ origin TEXT NOT NULL,
66
+ etag TEXT,
67
+ last_modified TEXT,
68
+ fetched_at TEXT NOT NULL
69
+ );
70
+
71
+ CREATE INDEX IF NOT EXISTS idx_crawl_etags_origin ON crawl_etags(origin);
72
+ `;
73
+ const MIGRATIONS = [
74
+ { name: "001-sqlite-vec", sql: MIGRATION_001_SQLITE_VEC, requiresVec: true },
75
+ { name: "002-feed-items", sql: MIGRATION_002_FEED_ITEMS },
76
+ { name: "003-crawl-etags", sql: MIGRATION_003_CRAWL_ETAGS }
77
+ ];
78
+ function isReadOnlyError(err) {
79
+ if (!err) return false;
80
+ const code = err.code;
81
+ if (code === "SQLITE_READONLY" || code === "SQLITE_READONLY_DBMOVED") return true;
82
+ const msg = err instanceof Error ? err.message : String(err);
83
+ return /SQLITE_READONLY|attempt to write a readonly|readonly database/i.test(msg);
84
+ }
85
+ let readOnlyWarned = false;
86
+ function _resetMigrationGuard() {
87
+ readOnlyWarned = false;
88
+ }
89
+ function applyMigrations(db, opts = { vecLoaded: true }) {
90
+ if (readOnlyWarned) {
91
+ return;
92
+ }
93
+ try {
94
+ db.exec(`
95
+ CREATE TABLE IF NOT EXISTS schema_migrations (
96
+ name TEXT PRIMARY KEY,
97
+ applied_at INTEGER NOT NULL
98
+ )
99
+ `);
100
+ } catch (err) {
101
+ if (isReadOnlyError(err)) {
102
+ readOnlyWarned = true;
103
+ log.warn("database is read-only \u2014 skipping migrations for this process", {
104
+ cause: err instanceof Error ? err.message : String(err)
105
+ });
106
+ return;
107
+ }
108
+ throw err;
109
+ }
110
+ const appliedRows = db.prepare("SELECT name FROM schema_migrations").all();
111
+ const applied = new Set(appliedRows.map((r) => r.name));
112
+ const recordStmt = db.prepare("INSERT INTO schema_migrations (name, applied_at) VALUES (?, ?)");
113
+ for (const migration of MIGRATIONS) {
114
+ if (applied.has(migration.name)) continue;
115
+ if (migration.requiresVec && !opts.vecLoaded) {
116
+ log.warn("migration skipped \u2014 sqlite-vec not loaded", { name: migration.name });
117
+ continue;
118
+ }
119
+ try {
120
+ db.transaction(() => {
121
+ db.exec(migration.sql);
122
+ recordStmt.run(migration.name, Date.now());
123
+ })();
124
+ log.info("migration applied", { name: migration.name });
125
+ } catch (err) {
126
+ if (isReadOnlyError(err)) {
127
+ readOnlyWarned = true;
128
+ log.warn("database is read-only \u2014 skipping remaining migrations for this process", {
129
+ name: migration.name,
130
+ cause: err instanceof Error ? err.message : String(err)
131
+ });
132
+ return;
133
+ }
134
+ log.error("migration failed", {
135
+ name: migration.name,
136
+ error: err instanceof Error ? err.message : String(err)
137
+ });
138
+ throw err;
139
+ }
140
+ }
141
+ }
142
+ export {
143
+ MIGRATIONS,
144
+ _resetMigrationGuard,
145
+ applyMigrations
146
+ };
147
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cache/migrations/runner.ts"],"sourcesContent":["import type Database from 'better-sqlite3';\nimport { createLogger } from '../../logger.js';\n\nconst log = createLogger('cache');\n\n/**\n * Migration registry. Entries are TS constants (not file reads) so the\n * built dist/ tree has no runtime filesystem dependency. Each migration's\n * `sql` string is also mirrored in src/cache/migrations/NNN-*.sql for\n * grep-ability and review.\n */\nexport interface Migration {\n /** Unique stable name. Must never be renamed after release. */\n name: string;\n sql: string;\n /** True if the migration depends on sqlite-vec being loaded. */\n requiresVec?: boolean;\n}\n\nconst MIGRATION_001_SQLITE_VEC = `\nCREATE VIRTUAL TABLE IF NOT EXISTS vec_documents USING vec0(\n embedding float[384]\n);\n\nCREATE TABLE IF NOT EXISTS vec_id_map (\n rowid INTEGER PRIMARY KEY AUTOINCREMENT,\n external_id TEXT NOT NULL UNIQUE\n);\n\nCREATE TABLE IF NOT EXISTS vec_metadata (\n rowid INTEGER PRIMARY KEY REFERENCES vec_id_map(rowid) ON DELETE CASCADE,\n url TEXT NOT NULL,\n content_hash TEXT NOT NULL,\n model_id TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n extra_json TEXT\n);\n\nCREATE INDEX IF NOT EXISTS idx_vec_metadata_url ON vec_metadata(url);\nCREATE INDEX IF NOT EXISTS idx_vec_metadata_hash ON vec_metadata(content_hash);\nCREATE INDEX IF NOT EXISTS idx_vec_metadata_model ON vec_metadata(model_id);\n`;\n\nconst MIGRATION_002_FEED_ITEMS = `\nCREATE TABLE IF NOT EXISTS feed_items (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n feed_url TEXT NOT NULL,\n guid TEXT NOT NULL,\n title TEXT NOT NULL,\n link TEXT NOT NULL,\n summary TEXT NOT NULL,\n published_date TEXT,\n category TEXT NOT NULL DEFAULT 'news',\n fetched_at TEXT NOT NULL,\n UNIQUE(feed_url, guid)\n);\n\nCREATE INDEX IF NOT EXISTS idx_feed_items_published ON feed_items(published_date);\nCREATE INDEX IF NOT EXISTS idx_feed_items_feed_url ON feed_items(feed_url);\n\nCREATE VIRTUAL TABLE IF NOT EXISTS feed_items_fts USING fts5(\n title, summary, link UNINDEXED,\n content='feed_items',\n content_rowid='id'\n);\n\nCREATE TRIGGER IF NOT EXISTS feed_items_ai AFTER INSERT ON feed_items BEGIN\n INSERT INTO feed_items_fts(rowid, title, summary, link) VALUES (new.id, new.title, new.summary, new.link);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS feed_items_ad AFTER DELETE ON feed_items BEGIN\n INSERT INTO feed_items_fts(feed_items_fts, rowid, title, summary, link) VALUES('delete', old.id, old.title, old.summary, old.link);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS feed_items_au AFTER UPDATE ON feed_items BEGIN\n INSERT INTO feed_items_fts(feed_items_fts, rowid, title, summary, link) VALUES('delete', old.id, old.title, old.summary, old.link);\n INSERT INTO feed_items_fts(feed_items_fts, rowid, title, summary, link) VALUES (new.id, new.title, new.summary, new.link);\nEND;\n`;\n\nconst MIGRATION_003_CRAWL_ETAGS = `\nCREATE TABLE IF NOT EXISTS crawl_etags (\n url TEXT PRIMARY KEY,\n origin TEXT NOT NULL,\n etag TEXT,\n last_modified TEXT,\n fetched_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_crawl_etags_origin ON crawl_etags(origin);\n`;\n\nexport const MIGRATIONS: Migration[] = [\n { name: '001-sqlite-vec', sql: MIGRATION_001_SQLITE_VEC, requiresVec: true },\n { name: '002-feed-items', sql: MIGRATION_002_FEED_ITEMS },\n { name: '003-crawl-etags', sql: MIGRATION_003_CRAWL_ETAGS },\n];\n\nfunction isReadOnlyError(err: unknown): boolean {\n if (!err) return false;\n const code = (err as { code?: string }).code;\n if (code === 'SQLITE_READONLY' || code === 'SQLITE_READONLY_DBMOVED') return true;\n const msg = err instanceof Error ? err.message : String(err);\n return /SQLITE_READONLY|attempt to write a readonly|readonly database/i.test(msg);\n}\n\n// Process-lifetime guard: once we have seen a read-only DB we stop retrying\n// migrations for the rest of the process. Without this, each\n// initDatabase() in a single CLI invocation (eg. doctor's two checks) would\n// re-attempt every pending migration and emit the same error twice.\nlet readOnlyWarned = false;\n\n/** Test-only: reset the module-level read-only guard between cases. */\nexport function _resetMigrationGuard(): void {\n readOnlyWarned = false;\n}\n\n/**\n * Apply pending migrations in order. Idempotent — already-applied migrations\n * are skipped via the schema_migrations table. Migrations marked\n * `requiresVec: true` are skipped when the sqlite-vec extension is absent so\n * FTS5-only flows still work on platforms without the native extension.\n * On a read-only database, logs a single warning and stops; subsequent\n * calls in the same process are no-ops.\n */\nexport function applyMigrations(db: Database.Database, opts: { vecLoaded: boolean } = { vecLoaded: true }): void {\n if (readOnlyWarned) {\n return;\n }\n\n try {\n db.exec(`\n CREATE TABLE IF NOT EXISTS schema_migrations (\n name TEXT PRIMARY KEY,\n applied_at INTEGER NOT NULL\n )\n `);\n } catch (err) {\n if (isReadOnlyError(err)) {\n readOnlyWarned = true;\n log.warn('database is read-only — skipping migrations for this process', {\n cause: err instanceof Error ? err.message : String(err),\n });\n return;\n }\n throw err;\n }\n\n const appliedRows = db.prepare('SELECT name FROM schema_migrations').all() as Array<{ name: string }>;\n const applied = new Set(appliedRows.map(r => r.name));\n\n const recordStmt = db.prepare('INSERT INTO schema_migrations (name, applied_at) VALUES (?, ?)');\n\n for (const migration of MIGRATIONS) {\n if (applied.has(migration.name)) continue;\n if (migration.requiresVec && !opts.vecLoaded) {\n log.warn('migration skipped — sqlite-vec not loaded', { name: migration.name });\n continue;\n }\n try {\n db.transaction(() => {\n db.exec(migration.sql);\n recordStmt.run(migration.name, Date.now());\n })();\n log.info('migration applied', { name: migration.name });\n } catch (err) {\n if (isReadOnlyError(err)) {\n readOnlyWarned = true;\n log.warn('database is read-only — skipping remaining migrations for this process', {\n name: migration.name,\n cause: err instanceof Error ? err.message : String(err),\n });\n return;\n }\n log.error('migration failed', {\n name: migration.name,\n error: err instanceof Error ? err.message : String(err),\n });\n throw err;\n }\n }\n}\n"],"mappings":"AACA,SAAS,oBAAoB;AAE7B,MAAM,MAAM,aAAa,OAAO;AAgBhC,MAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBjC,MAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqCjC,MAAM,4BAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAY3B,MAAM,aAA0B;AAAA,EACrC,EAAE,MAAM,kBAAkB,KAAK,0BAA0B,aAAa,KAAK;AAAA,EAC3E,EAAE,MAAM,kBAAkB,KAAK,yBAAyB;AAAA,EACxD,EAAE,MAAM,mBAAmB,KAAK,0BAA0B;AAC5D;AAEA,SAAS,gBAAgB,KAAuB;AAC9C,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,OAAQ,IAA0B;AACxC,MAAI,SAAS,qBAAqB,SAAS,0BAA2B,QAAO;AAC7E,QAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,SAAO,iEAAiE,KAAK,GAAG;AAClF;AAMA,IAAI,iBAAiB;AAGd,SAAS,uBAA6B;AAC3C,mBAAiB;AACnB;AAUO,SAAS,gBAAgB,IAAuB,OAA+B,EAAE,WAAW,KAAK,GAAS;AAC/G,MAAI,gBAAgB;AAClB;AAAA,EACF;AAEA,MAAI;AACF,OAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,KAKP;AAAA,EACH,SAAS,KAAK;AACZ,QAAI,gBAAgB,GAAG,GAAG;AACxB,uBAAiB;AACjB,UAAI,KAAK,qEAAgE;AAAA,QACvE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACxD,CAAC;AACD;AAAA,IACF;AACA,UAAM;AAAA,EACR;AAEA,QAAM,cAAc,GAAG,QAAQ,oCAAoC,EAAE,IAAI;AACzE,QAAM,UAAU,IAAI,IAAI,YAAY,IAAI,OAAK,EAAE,IAAI,CAAC;AAEpD,QAAM,aAAa,GAAG,QAAQ,gEAAgE;AAE9F,aAAW,aAAa,YAAY;AAClC,QAAI,QAAQ,IAAI,UAAU,IAAI,EAAG;AACjC,QAAI,UAAU,eAAe,CAAC,KAAK,WAAW;AAC5C,UAAI,KAAK,kDAA6C,EAAE,MAAM,UAAU,KAAK,CAAC;AAC9E;AAAA,IACF;AACA,QAAI;AACF,SAAG,YAAY,MAAM;AACnB,WAAG,KAAK,UAAU,GAAG;AACrB,mBAAW,IAAI,UAAU,MAAM,KAAK,IAAI,CAAC;AAAA,MAC3C,CAAC,EAAE;AACH,UAAI,KAAK,qBAAqB,EAAE,MAAM,UAAU,KAAK,CAAC;AAAA,IACxD,SAAS,KAAK;AACZ,UAAI,gBAAgB,GAAG,GAAG;AACxB,yBAAiB;AACjB,YAAI,KAAK,+EAA0E;AAAA,UACjF,MAAM,UAAU;AAAA,UAChB,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACxD,CAAC;AACD;AAAA,MACF;AACA,UAAI,MAAM,oBAAoB;AAAA,QAC5B,MAAM,UAAU;AAAA,QAChB,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACxD,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,42 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { VectorStore, VectorRecord, VectorSearchResult, VectorMetadata } from '../providers/vector-store.js';
3
+ /**
4
+ * VectorStore backed by the sqlite-vec extension loaded into the shared
5
+ * better-sqlite3 cache database.
6
+ *
7
+ * Storage layout (see src/cache/migrations/001-sqlite-vec.sql):
8
+ * - vec_documents (virtual, vec0) integer rowid -> float[384] embedding
9
+ * - vec_id_map integer rowid -> external string id
10
+ * - vec_metadata integer rowid -> full VectorMetadata
11
+ *
12
+ * vec0 only accepts integer rowid values, so external string ids (URLs in
13
+ * the legacy world) are mapped to AUTOINCREMENT rowids via vec_id_map.
14
+ *
15
+ * vec0 rejects `INSERT OR REPLACE`, so upsert deletes any existing vector
16
+ * row for an id before inserting the new one (within a single transaction).
17
+ *
18
+ * Search returns sqlite-vec's native L2 distance converted to a similarity
19
+ * score as `1 / (1 + distance)`. Higher score = closer match.
20
+ *
21
+ * Filter semantics match VectorStore: when `filter` is provided we
22
+ * over-fetch from the KNN side (oversample = limit * 5) then post-filter
23
+ * against vec_metadata before truncating to `limit`. Filters never relax
24
+ * — every populated filter field must match.
25
+ */
26
+ export declare class SqliteVecStore implements VectorStore {
27
+ private db;
28
+ private upsertSelectStmt;
29
+ private upsertInsertIdMapStmt;
30
+ private upsertDeleteDocStmt;
31
+ private upsertInsertDocStmt;
32
+ private upsertUpsertMetadataStmt;
33
+ private deleteIdMapStmt;
34
+ private deleteDocStmt;
35
+ private sizeStmt;
36
+ constructor(db: Database.Database);
37
+ upsert(records: VectorRecord[]): Promise<void>;
38
+ search(queryVector: Float32Array, limit: number, filter?: Partial<VectorMetadata>): Promise<VectorSearchResult[]>;
39
+ delete(ids: string[]): Promise<void>;
40
+ size(): Promise<number>;
41
+ }
42
+ //# sourceMappingURL=sqlite-vec-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-vec-store.d.ts","sourceRoot":"","sources":["../../src/cache/sqlite-vec-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACf,MAAM,8BAA8B,CAAC;AAKtC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,cAAe,YAAW,WAAW;IAUpC,OAAO,CAAC,EAAE;IATtB,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,qBAAqB,CAAqB;IAClD,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,wBAAwB,CAAqB;IACrD,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAqB;gBAEjB,EAAE,EAAE,QAAQ,CAAC,QAAQ;IA4BnC,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA4C9C,MAAM,CACV,WAAW,EAAE,YAAY,EACzB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,OAAO,CAAC,kBAAkB,EAAE,CAAC;IA0F1B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBpC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;CAI9B"}