docorbit 0.1.0 → 0.1.1

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 (402) hide show
  1. package/bin/docorbit.js +2 -2
  2. package/dist/apps/cli/src/commands/add.d.ts +7 -0
  3. package/dist/apps/cli/src/commands/add.js +35 -0
  4. package/dist/apps/cli/src/commands/api.d.ts +2 -0
  5. package/dist/apps/cli/src/commands/api.js +35 -0
  6. package/dist/apps/cli/src/commands/context.d.ts +10 -0
  7. package/dist/apps/cli/src/commands/context.js +36 -0
  8. package/dist/apps/cli/src/commands/dashboard.d.ts +8 -0
  9. package/dist/apps/cli/src/commands/dashboard.js +43 -0
  10. package/dist/apps/cli/src/commands/diff.d.ts +2 -0
  11. package/dist/apps/cli/src/commands/diff.js +29 -0
  12. package/dist/apps/cli/src/commands/evaluate.d.ts +11 -0
  13. package/dist/apps/cli/src/commands/evaluate.js +101 -0
  14. package/dist/apps/cli/src/commands/examples.d.ts +2 -0
  15. package/dist/apps/cli/src/commands/examples.js +36 -0
  16. package/dist/apps/cli/src/commands/export.d.ts +11 -0
  17. package/dist/apps/cli/src/commands/export.js +72 -0
  18. package/dist/apps/cli/src/commands/impact.d.ts +2 -0
  19. package/dist/apps/cli/src/commands/impact.js +30 -0
  20. package/dist/apps/cli/src/commands/init.d.ts +5 -0
  21. package/dist/apps/cli/src/commands/init.js +52 -0
  22. package/dist/apps/cli/src/commands/inspect.d.ts +5 -0
  23. package/dist/apps/cli/src/commands/inspect.js +24 -0
  24. package/dist/apps/cli/src/commands/mcp.d.ts +8 -0
  25. package/dist/apps/cli/src/commands/mcp.js +49 -0
  26. package/dist/apps/cli/src/commands/pitfalls.d.ts +2 -0
  27. package/dist/apps/cli/src/commands/pitfalls.js +35 -0
  28. package/dist/apps/cli/src/commands/recipes.d.ts +2 -0
  29. package/dist/apps/cli/src/commands/recipes.js +33 -0
  30. package/dist/apps/cli/src/commands/search.d.ts +11 -0
  31. package/dist/apps/cli/src/commands/search.js +36 -0
  32. package/dist/apps/cli/src/commands/update.d.ts +6 -0
  33. package/dist/apps/cli/src/commands/update.js +53 -0
  34. package/dist/apps/cli/src/commands/verify.d.ts +2 -0
  35. package/dist/apps/cli/src/commands/verify.js +44 -0
  36. package/dist/apps/cli/src/formatters/colors.d.ts +21 -0
  37. package/dist/apps/cli/src/formatters/colors.js +22 -0
  38. package/dist/apps/cli/src/formatters/inspection.d.ts +3 -0
  39. package/dist/apps/cli/src/formatters/inspection.js +88 -0
  40. package/dist/apps/cli/src/formatters/knowledge.d.ts +5 -0
  41. package/dist/apps/cli/src/formatters/knowledge.js +229 -0
  42. package/dist/apps/cli/src/formatters/retrieval.d.ts +3 -0
  43. package/dist/apps/cli/src/formatters/retrieval.js +61 -0
  44. package/{apps/cli/src/formatters/terminal.ts → dist/apps/cli/src/formatters/terminal.d.ts} +0 -1
  45. package/dist/apps/cli/src/formatters/terminal.js +5 -0
  46. package/dist/apps/cli/src/formatters/verification.d.ts +4 -0
  47. package/dist/apps/cli/src/formatters/verification.js +102 -0
  48. package/dist/apps/cli/src/index.d.ts +1 -0
  49. package/dist/apps/cli/src/index.js +376 -0
  50. package/dist/packages/core/src/dashboard/server.d.ts +33 -0
  51. package/dist/packages/core/src/dashboard/server.js +267 -0
  52. package/dist/packages/core/src/dashboard/ui.d.ts +5 -0
  53. package/{packages/core/src/dashboard/ui.ts → dist/packages/core/src/dashboard/ui.js} +2 -2
  54. package/dist/packages/core/src/implementation-service.d.ts +73 -0
  55. package/dist/packages/core/src/implementation-service.js +325 -0
  56. package/{packages/core/src/index.ts → dist/packages/core/src/index.d.ts} +0 -1
  57. package/dist/packages/core/src/index.js +6 -0
  58. package/dist/packages/core/src/inspector.d.ts +22 -0
  59. package/dist/packages/core/src/inspector.js +38 -0
  60. package/dist/packages/core/src/pipeline.d.ts +45 -0
  61. package/dist/packages/core/src/pipeline.js +246 -0
  62. package/dist/packages/crawler/src/config.d.ts +2 -0
  63. package/dist/packages/crawler/src/config.js +10 -0
  64. package/dist/packages/crawler/src/fetcher.d.ts +31 -0
  65. package/dist/packages/crawler/src/fetcher.js +139 -0
  66. package/dist/packages/crawler/src/index.js +2 -0
  67. package/dist/packages/discovery/src/index.d.ts +11 -0
  68. package/dist/packages/discovery/src/index.js +29 -0
  69. package/dist/packages/discovery/src/provider.d.ts +12 -0
  70. package/dist/packages/discovery/src/provider.js +30 -0
  71. package/dist/packages/discovery/src/providers/generic.d.ts +7 -0
  72. package/dist/packages/discovery/src/providers/generic.js +94 -0
  73. package/dist/packages/discovery/src/providers/github.d.ts +7 -0
  74. package/dist/packages/discovery/src/providers/github.js +52 -0
  75. package/dist/packages/discovery/src/providers/llms-txt.d.ts +7 -0
  76. package/dist/packages/discovery/src/providers/llms-txt.js +60 -0
  77. package/dist/packages/discovery/src/providers/markdown.d.ts +7 -0
  78. package/dist/packages/discovery/src/providers/markdown.js +38 -0
  79. package/dist/packages/discovery/src/providers/openapi.d.ts +7 -0
  80. package/dist/packages/discovery/src/providers/openapi.js +77 -0
  81. package/dist/packages/discovery/src/providers/sitemap.d.ts +7 -0
  82. package/dist/packages/discovery/src/providers/sitemap.js +53 -0
  83. package/dist/packages/discovery/src/providers/skill.d.ts +7 -0
  84. package/dist/packages/discovery/src/providers/skill.js +46 -0
  85. package/dist/packages/discovery/src/ranker.d.ts +6 -0
  86. package/dist/packages/discovery/src/ranker.js +107 -0
  87. package/dist/packages/evaluation/src/dataset.d.ts +2 -0
  88. package/dist/packages/evaluation/src/dataset.js +944 -0
  89. package/dist/packages/evaluation/src/index.js +8 -0
  90. package/dist/packages/evaluation/src/runner.d.ts +7 -0
  91. package/dist/packages/evaluation/src/runner.js +196 -0
  92. package/dist/packages/evaluation/src/strategies/context7-runner.d.ts +24 -0
  93. package/dist/packages/evaluation/src/strategies/context7-runner.js +229 -0
  94. package/dist/packages/evaluation/src/strategies/docorbit-runner.d.ts +5 -0
  95. package/dist/packages/evaluation/src/strategies/docorbit-runner.js +210 -0
  96. package/dist/packages/evaluation/src/strategies/firecrawl-runner.d.ts +24 -0
  97. package/dist/packages/evaluation/src/strategies/firecrawl-runner.js +151 -0
  98. package/dist/packages/evaluation/src/strategies/web-search-runner.d.ts +32 -0
  99. package/dist/packages/evaluation/src/strategies/web-search-runner.js +161 -0
  100. package/dist/packages/evaluation/src/types.d.ts +15 -0
  101. package/dist/packages/evaluation/src/types.js +1 -0
  102. package/dist/packages/evaluation/src/version-matcher.d.ts +11 -0
  103. package/dist/packages/evaluation/src/version-matcher.js +61 -0
  104. package/dist/packages/export/src/agents-md.d.ts +19 -0
  105. package/dist/packages/export/src/agents-md.js +170 -0
  106. package/dist/packages/export/src/claude-md.d.ts +17 -0
  107. package/dist/packages/export/src/claude-md.js +118 -0
  108. package/dist/packages/export/src/docs-map.d.ts +14 -0
  109. package/dist/packages/export/src/docs-map.js +118 -0
  110. package/dist/packages/export/src/index.js +6 -0
  111. package/dist/packages/export/src/llms-txt.d.ts +15 -0
  112. package/dist/packages/export/src/llms-txt.js +73 -0
  113. package/dist/packages/export/src/service.d.ts +23 -0
  114. package/dist/packages/export/src/service.js +210 -0
  115. package/dist/packages/export/src/skill-md.d.ts +14 -0
  116. package/dist/packages/export/src/skill-md.js +107 -0
  117. package/{packages/mcp/src/index.ts → dist/packages/mcp/src/index.d.ts} +2 -35
  118. package/dist/packages/mcp/src/index.js +6 -0
  119. package/dist/packages/mcp/src/resources/index.d.ts +12 -0
  120. package/dist/packages/mcp/src/resources/index.js +165 -0
  121. package/dist/packages/mcp/src/server.d.ts +30 -0
  122. package/dist/packages/mcp/src/server.js +243 -0
  123. package/dist/packages/mcp/src/tools/analyze-impact.d.ts +6 -0
  124. package/dist/packages/mcp/src/tools/analyze-impact.js +64 -0
  125. package/dist/packages/mcp/src/tools/check-api.d.ts +6 -0
  126. package/dist/packages/mcp/src/tools/check-api.js +74 -0
  127. package/dist/packages/mcp/src/tools/diff-docs.d.ts +6 -0
  128. package/dist/packages/mcp/src/tools/diff-docs.js +58 -0
  129. package/dist/packages/mcp/src/tools/export-context.d.ts +6 -0
  130. package/dist/packages/mcp/src/tools/export-context.js +61 -0
  131. package/dist/packages/mcp/src/tools/find-api.d.ts +6 -0
  132. package/dist/packages/mcp/src/tools/find-api.js +91 -0
  133. package/dist/packages/mcp/src/tools/find-example.d.ts +6 -0
  134. package/dist/packages/mcp/src/tools/find-example.js +92 -0
  135. package/dist/packages/mcp/src/tools/find-pitfall.d.ts +6 -0
  136. package/dist/packages/mcp/src/tools/find-pitfall.js +85 -0
  137. package/dist/packages/mcp/src/tools/find-recipe.d.ts +6 -0
  138. package/dist/packages/mcp/src/tools/find-recipe.js +89 -0
  139. package/dist/packages/mcp/src/tools/get-doc.d.ts +6 -0
  140. package/dist/packages/mcp/src/tools/get-doc.js +118 -0
  141. package/dist/packages/mcp/src/tools/get-docs-map.d.ts +6 -0
  142. package/dist/packages/mcp/src/tools/get-docs-map.js +54 -0
  143. package/dist/packages/mcp/src/tools/get-version.d.ts +6 -0
  144. package/dist/packages/mcp/src/tools/get-version.js +104 -0
  145. package/dist/packages/mcp/src/tools/implementation-context.d.ts +6 -0
  146. package/dist/packages/mcp/src/tools/implementation-context.js +82 -0
  147. package/dist/packages/mcp/src/tools/index.d.ts +18 -0
  148. package/dist/packages/mcp/src/tools/index.js +39 -0
  149. package/dist/packages/mcp/src/tools/list-sources.d.ts +6 -0
  150. package/dist/packages/mcp/src/tools/list-sources.js +76 -0
  151. package/dist/packages/mcp/src/tools/search-docs.d.ts +6 -0
  152. package/dist/packages/mcp/src/tools/search-docs.js +113 -0
  153. package/dist/packages/mcp/src/tools/types.d.ts +22 -0
  154. package/dist/packages/mcp/src/tools/types.js +1 -0
  155. package/dist/packages/mcp/src/transports/http.d.ts +31 -0
  156. package/dist/packages/mcp/src/transports/http.js +215 -0
  157. package/dist/packages/mcp/src/transports/stdio.d.ts +22 -0
  158. package/dist/packages/mcp/src/transports/stdio.js +86 -0
  159. package/{packages/mcp/src/transports/types.ts → dist/packages/mcp/src/transports/types.d.ts} +2 -3
  160. package/dist/packages/mcp/src/transports/types.js +1 -0
  161. package/dist/packages/mcp/src/types.d.ts +89 -0
  162. package/dist/packages/mcp/src/types.js +7 -0
  163. package/dist/packages/normalizer/src/example-indexer.d.ts +5 -0
  164. package/dist/packages/normalizer/src/example-indexer.js +200 -0
  165. package/dist/packages/normalizer/src/html.d.ts +13 -0
  166. package/dist/packages/normalizer/src/html.js +221 -0
  167. package/{packages/normalizer/src/index.ts → dist/packages/normalizer/src/index.d.ts} +0 -1
  168. package/dist/packages/normalizer/src/index.js +7 -0
  169. package/dist/packages/normalizer/src/llms.d.ts +3 -0
  170. package/dist/packages/normalizer/src/llms.js +71 -0
  171. package/dist/packages/normalizer/src/openapi/endpoint-parser.d.ts +11 -0
  172. package/dist/packages/normalizer/src/openapi/endpoint-parser.js +357 -0
  173. package/dist/packages/normalizer/src/openapi/schema-resolver.d.ts +10 -0
  174. package/dist/packages/normalizer/src/openapi/schema-resolver.js +82 -0
  175. package/dist/packages/normalizer/src/openapi.js +2 -0
  176. package/dist/packages/normalizer/src/page.d.ts +13 -0
  177. package/dist/packages/normalizer/src/page.js +150 -0
  178. package/dist/packages/normalizer/src/pitfall-extractor.d.ts +6 -0
  179. package/dist/packages/normalizer/src/pitfall-extractor.js +153 -0
  180. package/dist/packages/normalizer/src/slicer.d.ts +30 -0
  181. package/dist/packages/normalizer/src/slicer.js +360 -0
  182. package/dist/packages/retrieval/src/engine.d.ts +17 -0
  183. package/dist/packages/retrieval/src/engine.js +93 -0
  184. package/{packages/retrieval/src/index.ts → dist/packages/retrieval/src/index.d.ts} +0 -1
  185. package/dist/packages/retrieval/src/index.js +6 -0
  186. package/dist/packages/retrieval/src/intent.d.ts +6 -0
  187. package/dist/packages/retrieval/src/intent.js +39 -0
  188. package/dist/packages/retrieval/src/packer.d.ts +2 -0
  189. package/dist/packages/retrieval/src/packer.js +108 -0
  190. package/dist/packages/retrieval/src/recipe-engine.d.ts +18 -0
  191. package/dist/packages/retrieval/src/recipe-engine.js +265 -0
  192. package/dist/packages/retrieval/src/scorer.d.ts +13 -0
  193. package/dist/packages/retrieval/src/scorer.js +110 -0
  194. package/dist/packages/retrieval/src/weights.d.ts +3 -0
  195. package/dist/packages/retrieval/src/weights.js +28 -0
  196. package/dist/packages/security/src/annotations.d.ts +10 -0
  197. package/dist/packages/security/src/annotations.js +100 -0
  198. package/dist/packages/security/src/index.js +2 -0
  199. package/dist/packages/security/src/ssrf.d.ts +17 -0
  200. package/dist/packages/security/src/ssrf.js +132 -0
  201. package/dist/packages/shared/src/errors.d.ts +22 -0
  202. package/dist/packages/shared/src/errors.js +44 -0
  203. package/dist/packages/shared/src/hashing.d.ts +3 -0
  204. package/dist/packages/shared/src/hashing.js +21 -0
  205. package/dist/packages/shared/src/index.js +3 -0
  206. package/dist/packages/shared/src/types.d.ts +715 -0
  207. package/dist/packages/shared/src/types.js +1 -0
  208. package/dist/packages/storage/src/db.d.ts +10 -0
  209. package/dist/packages/storage/src/db.js +61 -0
  210. package/dist/packages/storage/src/index.js +10 -0
  211. package/dist/packages/storage/src/interfaces.d.ts +83 -0
  212. package/dist/packages/storage/src/interfaces.js +1 -0
  213. package/dist/packages/storage/src/repositories/api-repository.d.ts +16 -0
  214. package/dist/packages/storage/src/repositories/api-repository.js +169 -0
  215. package/dist/packages/storage/src/repositories/chunk-repository.d.ts +32 -0
  216. package/dist/packages/storage/src/repositories/chunk-repository.js +250 -0
  217. package/dist/packages/storage/src/repositories/example-repository.d.ts +16 -0
  218. package/dist/packages/storage/src/repositories/example-repository.js +158 -0
  219. package/dist/packages/storage/src/repositories/page-repository.d.ts +16 -0
  220. package/dist/packages/storage/src/repositories/page-repository.js +161 -0
  221. package/dist/packages/storage/src/repositories/pitfall-repository.d.ts +15 -0
  222. package/dist/packages/storage/src/repositories/pitfall-repository.js +144 -0
  223. package/dist/packages/storage/src/repositories/source-repository.d.ts +33 -0
  224. package/dist/packages/storage/src/repositories/source-repository.js +153 -0
  225. package/dist/packages/storage/src/repository.d.ts +92 -0
  226. package/dist/packages/storage/src/repository.js +157 -0
  227. package/dist/packages/storage/src/schema.d.ts +2 -0
  228. package/{packages/storage/src/schema.ts → dist/packages/storage/src/schema.js} +0 -3
  229. package/dist/packages/storage/src/search-tokens.d.ts +6 -0
  230. package/dist/packages/storage/src/search-tokens.js +26 -0
  231. package/dist/packages/verification/src/diff-engine.d.ts +18 -0
  232. package/dist/packages/verification/src/diff-engine.js +218 -0
  233. package/dist/packages/verification/src/extractor.d.ts +29 -0
  234. package/dist/packages/verification/src/extractor.js +302 -0
  235. package/dist/packages/verification/src/impact-scanner.d.ts +9 -0
  236. package/dist/packages/verification/src/impact-scanner.js +181 -0
  237. package/dist/packages/verification/src/index.js +5 -0
  238. package/dist/packages/verification/src/services.d.ts +55 -0
  239. package/dist/packages/verification/src/services.js +189 -0
  240. package/dist/packages/verification/src/verifier.d.ts +15 -0
  241. package/dist/packages/verification/src/verifier.js +315 -0
  242. package/dist/packages/workspace/src/detector.d.ts +7 -0
  243. package/dist/packages/workspace/src/detector.js +117 -0
  244. package/dist/packages/workspace/src/ecosystems/cargo.d.ts +10 -0
  245. package/dist/packages/workspace/src/ecosystems/cargo.js +69 -0
  246. package/dist/packages/workspace/src/ecosystems/composer.d.ts +7 -0
  247. package/dist/packages/workspace/src/ecosystems/composer.js +40 -0
  248. package/dist/packages/workspace/src/ecosystems/go.d.ts +7 -0
  249. package/dist/packages/workspace/src/ecosystems/go.js +49 -0
  250. package/{packages/workspace/src/ecosystems/index.ts → dist/packages/workspace/src/ecosystems/index.d.ts} +2 -24
  251. package/dist/packages/workspace/src/ecosystems/index.js +21 -0
  252. package/dist/packages/workspace/src/ecosystems/maven.d.ts +7 -0
  253. package/dist/packages/workspace/src/ecosystems/maven.js +28 -0
  254. package/dist/packages/workspace/src/ecosystems/npm.d.ts +10 -0
  255. package/dist/packages/workspace/src/ecosystems/npm.js +73 -0
  256. package/dist/packages/workspace/src/ecosystems/pub.d.ts +7 -0
  257. package/dist/packages/workspace/src/ecosystems/pub.js +34 -0
  258. package/dist/packages/workspace/src/ecosystems/pypi.d.ts +9 -0
  259. package/dist/packages/workspace/src/ecosystems/pypi.js +94 -0
  260. package/dist/packages/workspace/src/ecosystems/rubygems.d.ts +7 -0
  261. package/dist/packages/workspace/src/ecosystems/rubygems.js +25 -0
  262. package/dist/packages/workspace/src/ecosystems/types.d.ts +9 -0
  263. package/dist/packages/workspace/src/ecosystems/types.js +1 -0
  264. package/dist/packages/workspace/src/index.js +5 -0
  265. package/dist/packages/workspace/src/lockfile.d.ts +21 -0
  266. package/dist/packages/workspace/src/lockfile.js +153 -0
  267. package/dist/packages/workspace/src/resolver.d.ts +39 -0
  268. package/dist/packages/workspace/src/resolver.js +164 -0
  269. package/dist/packages/workspace/src/semver.d.ts +33 -0
  270. package/dist/packages/workspace/src/semver.js +235 -0
  271. package/package.json +8 -7
  272. package/apps/cli/bin/docorbit.js +0 -8
  273. package/apps/cli/src/commands/add.ts +0 -44
  274. package/apps/cli/src/commands/api.ts +0 -38
  275. package/apps/cli/src/commands/context.ts +0 -47
  276. package/apps/cli/src/commands/dashboard.ts +0 -55
  277. package/apps/cli/src/commands/diff.ts +0 -30
  278. package/apps/cli/src/commands/evaluate.ts +0 -133
  279. package/apps/cli/src/commands/examples.ts +0 -39
  280. package/apps/cli/src/commands/export.ts +0 -89
  281. package/apps/cli/src/commands/impact.ts +0 -31
  282. package/apps/cli/src/commands/init.ts +0 -69
  283. package/apps/cli/src/commands/inspect.ts +0 -30
  284. package/apps/cli/src/commands/mcp.ts +0 -72
  285. package/apps/cli/src/commands/pitfalls.ts +0 -38
  286. package/apps/cli/src/commands/recipes.ts +0 -35
  287. package/apps/cli/src/commands/search.ts +0 -48
  288. package/apps/cli/src/commands/update.ts +0 -73
  289. package/apps/cli/src/commands/verify.ts +0 -48
  290. package/apps/cli/src/formatters/colors.ts +0 -23
  291. package/apps/cli/src/formatters/inspection.ts +0 -102
  292. package/apps/cli/src/formatters/knowledge.ts +0 -272
  293. package/apps/cli/src/formatters/retrieval.ts +0 -74
  294. package/apps/cli/src/formatters/verification.ts +0 -126
  295. package/apps/cli/src/index.ts +0 -409
  296. package/packages/core/src/dashboard/server.ts +0 -314
  297. package/packages/core/src/implementation-service.ts +0 -451
  298. package/packages/core/src/inspector.ts +0 -71
  299. package/packages/core/src/pipeline.ts +0 -331
  300. package/packages/crawler/src/config.ts +0 -12
  301. package/packages/crawler/src/fetcher.ts +0 -185
  302. package/packages/discovery/src/index.ts +0 -31
  303. package/packages/discovery/src/provider.ts +0 -47
  304. package/packages/discovery/src/providers/generic.ts +0 -98
  305. package/packages/discovery/src/providers/github.ts +0 -61
  306. package/packages/discovery/src/providers/llms-txt.ts +0 -73
  307. package/packages/discovery/src/providers/markdown.ts +0 -48
  308. package/packages/discovery/src/providers/openapi.ts +0 -91
  309. package/packages/discovery/src/providers/sitemap.ts +0 -62
  310. package/packages/discovery/src/providers/skill.ts +0 -54
  311. package/packages/discovery/src/ranker.ts +0 -123
  312. package/packages/evaluation/src/dataset.ts +0 -963
  313. package/packages/evaluation/src/runner.ts +0 -241
  314. package/packages/evaluation/src/strategies/context7-runner.ts +0 -269
  315. package/packages/evaluation/src/strategies/docorbit-runner.ts +0 -228
  316. package/packages/evaluation/src/strategies/firecrawl-runner.ts +0 -172
  317. package/packages/evaluation/src/strategies/web-search-runner.ts +0 -194
  318. package/packages/evaluation/src/types.ts +0 -34
  319. package/packages/evaluation/src/version-matcher.ts +0 -73
  320. package/packages/export/src/agents-md.ts +0 -200
  321. package/packages/export/src/claude-md.ts +0 -141
  322. package/packages/export/src/docs-map.ts +0 -150
  323. package/packages/export/src/llms-txt.ts +0 -96
  324. package/packages/export/src/service.ts +0 -250
  325. package/packages/export/src/skill-md.ts +0 -128
  326. package/packages/mcp/src/resources/index.ts +0 -189
  327. package/packages/mcp/src/server.ts +0 -278
  328. package/packages/mcp/src/tools/analyze-impact.ts +0 -74
  329. package/packages/mcp/src/tools/check-api.ts +0 -86
  330. package/packages/mcp/src/tools/diff-docs.ts +0 -68
  331. package/packages/mcp/src/tools/export-context.ts +0 -73
  332. package/packages/mcp/src/tools/find-api.ts +0 -99
  333. package/packages/mcp/src/tools/find-example.ts +0 -100
  334. package/packages/mcp/src/tools/find-pitfall.ts +0 -94
  335. package/packages/mcp/src/tools/find-recipe.ts +0 -98
  336. package/packages/mcp/src/tools/get-doc.ts +0 -130
  337. package/packages/mcp/src/tools/get-docs-map.ts +0 -64
  338. package/packages/mcp/src/tools/get-version.ts +0 -118
  339. package/packages/mcp/src/tools/implementation-context.ts +0 -88
  340. package/packages/mcp/src/tools/index.ts +0 -59
  341. package/packages/mcp/src/tools/list-sources.ts +0 -85
  342. package/packages/mcp/src/tools/search-docs.ts +0 -123
  343. package/packages/mcp/src/tools/types.ts +0 -28
  344. package/packages/mcp/src/transports/http.ts +0 -256
  345. package/packages/mcp/src/transports/stdio.ts +0 -105
  346. package/packages/mcp/src/types.ts +0 -102
  347. package/packages/normalizer/src/example-indexer.ts +0 -240
  348. package/packages/normalizer/src/html.ts +0 -253
  349. package/packages/normalizer/src/llms.ts +0 -83
  350. package/packages/normalizer/src/openapi/endpoint-parser.ts +0 -406
  351. package/packages/normalizer/src/openapi/schema-resolver.ts +0 -111
  352. package/packages/normalizer/src/page.ts +0 -184
  353. package/packages/normalizer/src/pitfall-extractor.ts +0 -190
  354. package/packages/normalizer/src/slicer.ts +0 -455
  355. package/packages/retrieval/src/engine.ts +0 -120
  356. package/packages/retrieval/src/intent.ts +0 -43
  357. package/packages/retrieval/src/packer.ts +0 -145
  358. package/packages/retrieval/src/recipe-engine.ts +0 -313
  359. package/packages/retrieval/src/scorer.ts +0 -139
  360. package/packages/retrieval/src/weights.ts +0 -31
  361. package/packages/security/src/annotations.ts +0 -112
  362. package/packages/security/src/ssrf.ts +0 -153
  363. package/packages/shared/src/errors.ts +0 -53
  364. package/packages/shared/src/hashing.ts +0 -23
  365. package/packages/shared/src/types.ts +0 -881
  366. package/packages/storage/src/db.ts +0 -72
  367. package/packages/storage/src/interfaces.ts +0 -115
  368. package/packages/storage/src/repositories/api-repository.ts +0 -219
  369. package/packages/storage/src/repositories/chunk-repository.ts +0 -316
  370. package/packages/storage/src/repositories/example-repository.ts +0 -206
  371. package/packages/storage/src/repositories/page-repository.ts +0 -205
  372. package/packages/storage/src/repositories/pitfall-repository.ts +0 -188
  373. package/packages/storage/src/repositories/source-repository.ts +0 -205
  374. package/packages/storage/src/repository.ts +0 -256
  375. package/packages/storage/src/search-tokens.ts +0 -28
  376. package/packages/verification/src/diff-engine.ts +0 -258
  377. package/packages/verification/src/extractor.ts +0 -339
  378. package/packages/verification/src/impact-scanner.ts +0 -203
  379. package/packages/verification/src/services.ts +0 -238
  380. package/packages/verification/src/verifier.ts +0 -375
  381. package/packages/workspace/src/detector.ts +0 -143
  382. package/packages/workspace/src/ecosystems/cargo.ts +0 -84
  383. package/packages/workspace/src/ecosystems/composer.ts +0 -42
  384. package/packages/workspace/src/ecosystems/go.ts +0 -54
  385. package/packages/workspace/src/ecosystems/maven.ts +0 -34
  386. package/packages/workspace/src/ecosystems/npm.ts +0 -83
  387. package/packages/workspace/src/ecosystems/pub.ts +0 -40
  388. package/packages/workspace/src/ecosystems/pypi.ts +0 -100
  389. package/packages/workspace/src/ecosystems/rubygems.ts +0 -30
  390. package/packages/workspace/src/ecosystems/types.ts +0 -18
  391. package/packages/workspace/src/lockfile.ts +0 -194
  392. package/packages/workspace/src/resolver.ts +0 -234
  393. package/packages/workspace/src/semver.ts +0 -259
  394. /package/{packages/crawler/src/index.ts → dist/packages/crawler/src/index.d.ts} +0 -0
  395. /package/{packages/evaluation/src/index.ts → dist/packages/evaluation/src/index.d.ts} +0 -0
  396. /package/{packages/export/src/index.ts → dist/packages/export/src/index.d.ts} +0 -0
  397. /package/{packages/normalizer/src/openapi.ts → dist/packages/normalizer/src/openapi.d.ts} +0 -0
  398. /package/{packages/security/src/index.ts → dist/packages/security/src/index.d.ts} +0 -0
  399. /package/{packages/shared/src/index.ts → dist/packages/shared/src/index.d.ts} +0 -0
  400. /package/{packages/storage/src/index.ts → dist/packages/storage/src/index.d.ts} +0 -0
  401. /package/{packages/verification/src/index.ts → dist/packages/verification/src/index.d.ts} +0 -0
  402. /package/{packages/workspace/src/index.ts → dist/packages/workspace/src/index.d.ts} +0 -0
@@ -0,0 +1,158 @@
1
+ import { extractSearchTokens } from "../search-tokens.js";
2
+ export class ExampleRepository {
3
+ db;
4
+ constructor(db) {
5
+ this.db = db;
6
+ }
7
+ saveIndexedExamples(examples) {
8
+ if (examples.length === 0)
9
+ return;
10
+ const raw = this.db.getRawDb();
11
+ const insertEx = raw.prepare(`
12
+ INSERT INTO indexed_examples (
13
+ id, chunk_id, page_id, snapshot_id, language, framework,
14
+ task, code, source_url, source_authority, related_api,
15
+ related_symbol, doc_version, provenance_json, created_at
16
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
17
+ ON CONFLICT(id) DO UPDATE SET
18
+ chunk_id = excluded.chunk_id,
19
+ language = excluded.language,
20
+ framework = excluded.framework,
21
+ task = excluded.task,
22
+ code = excluded.code,
23
+ source_url = excluded.source_url,
24
+ source_authority = excluded.source_authority,
25
+ related_api = excluded.related_api,
26
+ related_symbol = excluded.related_symbol,
27
+ doc_version = excluded.doc_version,
28
+ provenance_json = excluded.provenance_json
29
+ `);
30
+ const insertFts = this.db.isFtsAvailable()
31
+ ? raw.prepare(`
32
+ INSERT INTO indexed_examples_fts (example_id, task, language, framework, code, related_api, related_symbol)
33
+ VALUES (?, ?, ?, ?, ?, ?, ?)
34
+ `)
35
+ : null;
36
+ const deleteFts = this.db.isFtsAvailable()
37
+ ? raw.prepare('DELETE FROM indexed_examples_fts WHERE example_id = ?')
38
+ : null;
39
+ raw.exec('BEGIN TRANSACTION;');
40
+ try {
41
+ for (const ex of examples) {
42
+ insertEx.run(ex.id, ex.chunkId || null, ex.pageId, ex.snapshotId || 'snap_default', ex.language, ex.framework || null, ex.task, ex.code, ex.sourceUrl, ex.sourceAuthority, ex.relatedApi || null, ex.relatedSymbol || null, ex.docVersion || null, ex.provenance ? JSON.stringify(ex.provenance) : null, ex.createdAt || new Date().toISOString());
43
+ if (insertFts && deleteFts) {
44
+ deleteFts.run(ex.id);
45
+ insertFts.run(ex.id, ex.task, ex.language, ex.framework || '', ex.code, ex.relatedApi || '', ex.relatedSymbol || '');
46
+ }
47
+ }
48
+ raw.exec('COMMIT;');
49
+ }
50
+ catch (err) {
51
+ raw.exec('ROLLBACK;');
52
+ throw err;
53
+ }
54
+ }
55
+ getIndexedExamplesBySnapshot(snapshotId) {
56
+ const raw = this.db.getRawDb();
57
+ const rows = raw.prepare('SELECT * FROM indexed_examples WHERE snapshot_id = ?').all(snapshotId);
58
+ return rows.map(r => this.hydrateIndexedExample(r));
59
+ }
60
+ searchIndexedExamples(query, options = {}) {
61
+ const raw = this.db.getRawDb();
62
+ const limit = options.limit || 10;
63
+ const term = query.trim();
64
+ let results = [];
65
+ // FTS attempt
66
+ if (this.db.isFtsAvailable() && term.length > 0) {
67
+ const cleanTokens = extractSearchTokens(term);
68
+ if (cleanTokens.length > 0) {
69
+ const sanitizedFts = cleanTokens
70
+ .map(t => t.length >= 4 ? `"${t.replace(/"/g, '""')}"*` : `"${t.replace(/"/g, '""')}"`)
71
+ .join(' OR ');
72
+ try {
73
+ let sql = `
74
+ SELECT ex.*, fts.rank as fts_rank
75
+ FROM indexed_examples ex
76
+ JOIN indexed_examples_fts fts ON ex.id = fts.example_id
77
+ WHERE indexed_examples_fts MATCH ?
78
+ `;
79
+ const params = [sanitizedFts];
80
+ if (options.language) {
81
+ sql += ' AND lower(ex.language) = ?';
82
+ params.push(options.language.toLowerCase());
83
+ }
84
+ if (options.framework) {
85
+ sql += ' AND lower(ex.framework) = ?';
86
+ params.push(options.framework.toLowerCase());
87
+ }
88
+ if (options.docVersion) {
89
+ sql += ' AND (ex.doc_version = ? OR ex.doc_version IS NULL)';
90
+ params.push(options.docVersion);
91
+ }
92
+ sql += " ORDER BY CASE WHEN ex.source_authority = 'official' THEN 0 ELSE 1 END, fts.rank LIMIT ?";
93
+ params.push(limit);
94
+ const rows = raw.prepare(sql).all(...params);
95
+ results = rows.map(r => this.hydrateIndexedExample(r));
96
+ }
97
+ catch {
98
+ // Fall through to LIKE
99
+ }
100
+ }
101
+ }
102
+ if (results.length === 0) {
103
+ // LIKE fallback
104
+ let sql = 'SELECT * FROM indexed_examples WHERE 1=1';
105
+ const params = [];
106
+ if (options.language) {
107
+ sql += ' AND lower(language) = ?';
108
+ params.push(options.language.toLowerCase());
109
+ }
110
+ if (options.framework) {
111
+ sql += ' AND lower(framework) = ?';
112
+ params.push(options.framework.toLowerCase());
113
+ }
114
+ if (options.docVersion) {
115
+ sql += ' AND (doc_version = ? OR doc_version IS NULL)';
116
+ params.push(options.docVersion);
117
+ }
118
+ if (term.length > 0) {
119
+ const tokens = extractSearchTokens(term);
120
+ if (tokens.length > 0) {
121
+ const tokenClauses = tokens.map(() => '(task LIKE ? OR code LIKE ? OR related_api LIKE ? OR related_symbol LIKE ?)');
122
+ sql += ` AND (${tokenClauses.join(' OR ')})`;
123
+ for (const t of tokens) {
124
+ const lp = `%${t}%`;
125
+ params.push(lp, lp, lp, lp);
126
+ }
127
+ }
128
+ else {
129
+ return [];
130
+ }
131
+ }
132
+ sql += " ORDER BY CASE WHEN source_authority = 'official' THEN 0 ELSE 1 END LIMIT ?";
133
+ params.push(limit);
134
+ const rows = raw.prepare(sql).all(...params);
135
+ results = rows.map(r => this.hydrateIndexedExample(r));
136
+ }
137
+ return results;
138
+ }
139
+ hydrateIndexedExample(row) {
140
+ return {
141
+ id: String(row.id),
142
+ chunkId: row.chunk_id ? String(row.chunk_id) : undefined,
143
+ pageId: String(row.page_id),
144
+ snapshotId: String(row.snapshot_id),
145
+ language: String(row.language),
146
+ framework: row.framework ? String(row.framework) : undefined,
147
+ task: String(row.task),
148
+ code: String(row.code),
149
+ sourceUrl: String(row.source_url),
150
+ sourceAuthority: String(row.source_authority),
151
+ relatedApi: row.related_api ? String(row.related_api) : undefined,
152
+ relatedSymbol: row.related_symbol ? String(row.related_symbol) : undefined,
153
+ docVersion: row.doc_version ? String(row.doc_version) : undefined,
154
+ provenance: row.provenance_json ? JSON.parse(String(row.provenance_json)) : undefined,
155
+ createdAt: String(row.created_at),
156
+ };
157
+ }
158
+ }
@@ -0,0 +1,16 @@
1
+ import type { NormalizedPage } from '../../../shared/src/index.ts';
2
+ import type { DocOrbitDb } from '../db.ts';
3
+ export declare class PageRepository {
4
+ private db;
5
+ constructor(db: DocOrbitDb);
6
+ savePage(page: NormalizedPage): void;
7
+ getPage(id: string): NormalizedPage | null;
8
+ getPageByUrl(url: string): NormalizedPage | null;
9
+ getPagesBySource(sourceId: string): NormalizedPage[];
10
+ listPages(limit?: number, offset?: number): NormalizedPage[];
11
+ countPages(sourceId?: string): number;
12
+ searchPagesFts(query: string, limit?: number): NormalizedPage[];
13
+ getPageLinks(pageId: string): string[];
14
+ savePageLinks(pageId: string, targetUrls: string[]): void;
15
+ hydratePage(row: Record<string, unknown>): NormalizedPage;
16
+ }
@@ -0,0 +1,161 @@
1
+ export class PageRepository {
2
+ db;
3
+ constructor(db) {
4
+ this.db = db;
5
+ }
6
+ savePage(page) {
7
+ const raw = this.db.getRawDb();
8
+ const pageStmt = raw.prepare(`
9
+ INSERT INTO pages (
10
+ id, source_id, title, url, content, content_hash,
11
+ fetched_at, raw_bytes, estimated_tokens,
12
+ headings_json, security_annotations_json, provenance_json
13
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
14
+ ON CONFLICT(url) DO UPDATE SET
15
+ title = excluded.title,
16
+ content = excluded.content,
17
+ content_hash = excluded.content_hash,
18
+ fetched_at = excluded.fetched_at,
19
+ raw_bytes = excluded.raw_bytes,
20
+ estimated_tokens = excluded.estimated_tokens,
21
+ headings_json = excluded.headings_json,
22
+ security_annotations_json = excluded.security_annotations_json,
23
+ provenance_json = excluded.provenance_json
24
+ `);
25
+ pageStmt.run(page.id, page.sourceId || null, page.title, page.url, page.content, page.contentHash, page.fetchedAt, page.rawBytes, page.estimatedTokens, JSON.stringify(page.headings), JSON.stringify(page.securityAnnotations), page.provenance ? JSON.stringify(page.provenance) : null);
26
+ raw.prepare('DELETE FROM links WHERE page_id = ?').run(page.id);
27
+ const linkStmt = raw.prepare(`
28
+ INSERT INTO links (id, page_id, text, url, is_external)
29
+ VALUES (?, ?, ?, ?, ?)
30
+ `);
31
+ for (let i = 0; i < page.links.length; i++) {
32
+ const link = page.links[i];
33
+ const linkId = `${page.id}_link_${i}`;
34
+ linkStmt.run(linkId, page.id, link.text, link.url, link.isExternal ? 1 : 0);
35
+ }
36
+ raw.prepare('DELETE FROM code_examples WHERE page_id = ?').run(page.id);
37
+ const codeStmt = raw.prepare(`
38
+ INSERT INTO code_examples (id, page_id, language, code, caption)
39
+ VALUES (?, ?, ?, ?, ?)
40
+ `);
41
+ for (let i = 0; i < page.codeExamples.length; i++) {
42
+ const example = page.codeExamples[i];
43
+ const exampleId = `${page.id}_code_${i}`;
44
+ codeStmt.run(exampleId, page.id, example.language, example.code, example.caption || null);
45
+ }
46
+ if (this.db.isFtsAvailable()) {
47
+ try {
48
+ raw.prepare('DELETE FROM pages_fts WHERE page_id = ?').run(page.id);
49
+ raw.prepare(`
50
+ INSERT INTO pages_fts (page_id, title, content)
51
+ VALUES (?, ?, ?)
52
+ `).run(page.id, page.title, page.content);
53
+ }
54
+ catch {
55
+ // Continue
56
+ }
57
+ }
58
+ }
59
+ getPage(id) {
60
+ const raw = this.db.getRawDb();
61
+ const row = raw.prepare('SELECT * FROM pages WHERE id = ?').get(id);
62
+ if (!row)
63
+ return null;
64
+ return this.hydratePage(row);
65
+ }
66
+ getPageByUrl(url) {
67
+ const raw = this.db.getRawDb();
68
+ const row = raw.prepare('SELECT * FROM pages WHERE url = ?').get(url);
69
+ if (!row)
70
+ return null;
71
+ return this.hydratePage(row);
72
+ }
73
+ getPagesBySource(sourceId) {
74
+ const raw = this.db.getRawDb();
75
+ const rows = raw.prepare('SELECT * FROM pages WHERE source_id = ? ORDER BY fetched_at ASC').all(sourceId);
76
+ return rows.map(r => this.hydratePage(r));
77
+ }
78
+ listPages(limit = 50, offset = 0) {
79
+ const raw = this.db.getRawDb();
80
+ const rows = raw.prepare('SELECT * FROM pages ORDER BY fetched_at DESC LIMIT ? OFFSET ?').all(limit, offset);
81
+ return rows.map(r => this.hydratePage(r));
82
+ }
83
+ countPages(sourceId) {
84
+ const raw = this.db.getRawDb();
85
+ if (sourceId) {
86
+ const row = raw.prepare('SELECT COUNT(*) as count FROM pages WHERE source_id = ?').get(sourceId);
87
+ return row?.count || 0;
88
+ }
89
+ const row = raw.prepare('SELECT COUNT(*) as count FROM pages').get();
90
+ return row?.count || 0;
91
+ }
92
+ searchPagesFts(query, limit = 10) {
93
+ if (!this.db.isFtsAvailable()) {
94
+ return [];
95
+ }
96
+ const raw = this.db.getRawDb();
97
+ const sanitizedQuery = `"${query.replace(/"/g, '""')}"`;
98
+ try {
99
+ const rows = raw.prepare(`
100
+ SELECT p.* FROM pages p
101
+ JOIN pages_fts fts ON p.id = fts.page_id
102
+ WHERE pages_fts MATCH ?
103
+ ORDER BY rank
104
+ LIMIT ?
105
+ `).all(sanitizedQuery, limit);
106
+ return rows.map(r => this.hydratePage(r));
107
+ }
108
+ catch {
109
+ return [];
110
+ }
111
+ }
112
+ getPageLinks(pageId) {
113
+ const raw = this.db.getRawDb();
114
+ const rows = raw.prepare('SELECT url FROM links WHERE page_id = ?').all(pageId);
115
+ return rows.map(r => String(r.url));
116
+ }
117
+ savePageLinks(pageId, targetUrls) {
118
+ const raw = this.db.getRawDb();
119
+ raw.prepare('DELETE FROM links WHERE page_id = ?').run(pageId);
120
+ const stmt = raw.prepare('INSERT OR IGNORE INTO links (id, page_id, text, url, is_external) VALUES (?, ?, ?, ?, ?)');
121
+ for (let i = 0; i < targetUrls.length; i++) {
122
+ stmt.run(`${pageId}_link_${i}`, pageId, '', targetUrls[i], 0);
123
+ }
124
+ }
125
+ hydratePage(row) {
126
+ const raw = this.db.getRawDb();
127
+ const pageId = String(row.id);
128
+ const linkRows = raw.prepare('SELECT text, url, is_external FROM links WHERE page_id = ?').all(pageId);
129
+ const links = linkRows.map(lr => ({
130
+ text: String(lr.text),
131
+ url: String(lr.url),
132
+ isExternal: Number(lr.is_external) === 1,
133
+ }));
134
+ const codeRows = raw.prepare('SELECT id, language, code, caption FROM code_examples WHERE page_id = ?').all(pageId);
135
+ const codeExamples = codeRows.map(cr => ({
136
+ id: String(cr.id),
137
+ language: String(cr.language),
138
+ code: String(cr.code),
139
+ caption: cr.caption ? String(cr.caption) : undefined,
140
+ }));
141
+ const headings = row.headings_json ? JSON.parse(String(row.headings_json)) : [];
142
+ const securityAnnotations = row.security_annotations_json ? JSON.parse(String(row.security_annotations_json)) : [];
143
+ const provenance = row.provenance_json ? JSON.parse(String(row.provenance_json)) : undefined;
144
+ return {
145
+ id: pageId,
146
+ sourceId: String(row.source_id),
147
+ title: String(row.title),
148
+ url: String(row.url),
149
+ content: String(row.content),
150
+ headings,
151
+ links,
152
+ codeExamples,
153
+ contentHash: String(row.content_hash),
154
+ fetchedAt: String(row.fetched_at),
155
+ rawBytes: Number(row.raw_bytes),
156
+ estimatedTokens: Number(row.estimated_tokens),
157
+ securityAnnotations,
158
+ provenance,
159
+ };
160
+ }
161
+ }
@@ -0,0 +1,15 @@
1
+ import type { Pitfall, PitfallKind } from '../../../shared/src/index.ts';
2
+ import type { DocOrbitDb } from '../db.ts';
3
+ import type { IPitfallRepository } from '../interfaces.ts';
4
+ export declare class PitfallRepository implements IPitfallRepository {
5
+ private db;
6
+ constructor(db: DocOrbitDb);
7
+ savePitfalls(pitfalls: Pitfall[]): void;
8
+ getPitfallsBySnapshot(snapshotId: string): Pitfall[];
9
+ searchPitfalls(query: string, options?: {
10
+ kind?: PitfallKind;
11
+ docVersion?: string;
12
+ limit?: number;
13
+ }): Pitfall[];
14
+ private hydratePitfall;
15
+ }
@@ -0,0 +1,144 @@
1
+ import { extractSearchTokens } from "../search-tokens.js";
2
+ export class PitfallRepository {
3
+ db;
4
+ constructor(db) {
5
+ this.db = db;
6
+ }
7
+ savePitfalls(pitfalls) {
8
+ if (pitfalls.length === 0)
9
+ return;
10
+ const raw = this.db.getRawDb();
11
+ const insertPf = raw.prepare(`
12
+ INSERT INTO pitfalls (
13
+ id, chunk_id, page_id, snapshot_id, kind, title,
14
+ content, related_api, related_symbol, doc_version,
15
+ provenance_json, created_at
16
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
17
+ ON CONFLICT(id) DO UPDATE SET
18
+ chunk_id = excluded.chunk_id,
19
+ kind = excluded.kind,
20
+ title = excluded.title,
21
+ content = excluded.content,
22
+ related_api = excluded.related_api,
23
+ related_symbol = excluded.related_symbol,
24
+ doc_version = excluded.doc_version,
25
+ provenance_json = excluded.provenance_json
26
+ `);
27
+ const insertFts = this.db.isFtsAvailable()
28
+ ? raw.prepare(`
29
+ INSERT INTO pitfalls_fts (pitfall_id, kind, title, content, related_api, related_symbol)
30
+ VALUES (?, ?, ?, ?, ?, ?)
31
+ `)
32
+ : null;
33
+ const deleteFts = this.db.isFtsAvailable()
34
+ ? raw.prepare('DELETE FROM pitfalls_fts WHERE pitfall_id = ?')
35
+ : null;
36
+ raw.exec('BEGIN TRANSACTION;');
37
+ try {
38
+ for (const pf of pitfalls) {
39
+ insertPf.run(pf.id, pf.chunkId || null, pf.pageId, pf.snapshotId || 'snap_default', pf.kind, pf.title, pf.content || pf.message || '', pf.relatedApi || null, pf.relatedSymbol || null, pf.docVersion || null, pf.provenance ? JSON.stringify(pf.provenance) : null, pf.createdAt || new Date().toISOString());
40
+ if (insertFts && deleteFts) {
41
+ deleteFts.run(pf.id);
42
+ insertFts.run(pf.id, pf.kind, pf.title, pf.content || pf.message || '', pf.relatedApi || '', pf.relatedSymbol || '');
43
+ }
44
+ }
45
+ raw.exec('COMMIT;');
46
+ }
47
+ catch (err) {
48
+ raw.exec('ROLLBACK;');
49
+ throw err;
50
+ }
51
+ }
52
+ getPitfallsBySnapshot(snapshotId) {
53
+ const raw = this.db.getRawDb();
54
+ const rows = raw.prepare('SELECT * FROM pitfalls WHERE snapshot_id = ?').all(snapshotId);
55
+ return rows.map(r => this.hydratePitfall(r));
56
+ }
57
+ searchPitfalls(query, options = {}) {
58
+ const raw = this.db.getRawDb();
59
+ const limit = options.limit || 10;
60
+ const term = query.trim();
61
+ let results = [];
62
+ // FTS attempt
63
+ if (this.db.isFtsAvailable() && term.length > 0) {
64
+ const cleanTokens = extractSearchTokens(term);
65
+ if (cleanTokens.length > 0) {
66
+ const sanitizedFts = cleanTokens
67
+ .map(t => t.length >= 4 ? `"${t.replace(/"/g, '""')}"*` : `"${t.replace(/"/g, '""')}"`)
68
+ .join(' OR ');
69
+ try {
70
+ let sql = `
71
+ SELECT pf.*, fts.rank as fts_rank
72
+ FROM pitfalls pf
73
+ JOIN pitfalls_fts fts ON pf.id = fts.pitfall_id
74
+ WHERE pitfalls_fts MATCH ?
75
+ `;
76
+ const params = [sanitizedFts];
77
+ if (options.kind) {
78
+ sql += ' AND pf.kind = ?';
79
+ params.push(options.kind);
80
+ }
81
+ if (options.docVersion) {
82
+ sql += ' AND (pf.doc_version = ? OR pf.doc_version IS NULL)';
83
+ params.push(options.docVersion);
84
+ }
85
+ sql += ' ORDER BY fts.rank LIMIT ?';
86
+ params.push(limit);
87
+ const rows = raw.prepare(sql).all(...params);
88
+ results = rows.map(r => this.hydratePitfall(r));
89
+ }
90
+ catch {
91
+ // Fall through to LIKE
92
+ }
93
+ }
94
+ }
95
+ if (results.length === 0) {
96
+ // LIKE fallback
97
+ let sql = 'SELECT * FROM pitfalls WHERE 1=1';
98
+ const params = [];
99
+ if (options.kind) {
100
+ sql += ' AND kind = ?';
101
+ params.push(options.kind);
102
+ }
103
+ if (options.docVersion) {
104
+ sql += ' AND (doc_version = ? OR doc_version IS NULL)';
105
+ params.push(options.docVersion);
106
+ }
107
+ if (term.length > 0) {
108
+ const tokens = extractSearchTokens(term);
109
+ if (tokens.length > 0) {
110
+ const tokenClauses = tokens.map(() => '(title LIKE ? OR content LIKE ? OR related_api LIKE ? OR related_symbol LIKE ?)');
111
+ sql += ` AND (${tokenClauses.join(' OR ')})`;
112
+ for (const t of tokens) {
113
+ const lp = `%${t}%`;
114
+ params.push(lp, lp, lp, lp);
115
+ }
116
+ }
117
+ else {
118
+ return [];
119
+ }
120
+ }
121
+ sql += ' ORDER BY kind LIMIT ?';
122
+ params.push(limit);
123
+ const rows = raw.prepare(sql).all(...params);
124
+ results = rows.map(r => this.hydratePitfall(r));
125
+ }
126
+ return results;
127
+ }
128
+ hydratePitfall(row) {
129
+ return {
130
+ id: String(row.id),
131
+ chunkId: row.chunk_id ? String(row.chunk_id) : undefined,
132
+ pageId: String(row.page_id),
133
+ snapshotId: String(row.snapshot_id),
134
+ kind: String(row.kind),
135
+ title: String(row.title),
136
+ content: String(row.content),
137
+ relatedApi: row.related_api ? String(row.related_api) : undefined,
138
+ relatedSymbol: row.related_symbol ? String(row.related_symbol) : undefined,
139
+ docVersion: row.doc_version ? String(row.doc_version) : undefined,
140
+ provenance: row.provenance_json ? JSON.parse(String(row.provenance_json)) : undefined,
141
+ createdAt: String(row.created_at),
142
+ };
143
+ }
144
+ }
@@ -0,0 +1,33 @@
1
+ import type { DiscoveredSource, NormalizedPage } from '../../../shared/src/index.ts';
2
+ import type { DocOrbitDb } from '../db.ts';
3
+ export interface SnapshotRecord {
4
+ id: string;
5
+ sourceId: string;
6
+ snapshotHash: string;
7
+ pageCount: number;
8
+ capturedAt: string;
9
+ docVersion?: string;
10
+ metadata?: Record<string, unknown>;
11
+ }
12
+ export declare class SourceRepository {
13
+ private db;
14
+ private hydratePageFn?;
15
+ constructor(db: DocOrbitDb, hydratePageFn?: (row: Record<string, unknown>) => NormalizedPage);
16
+ saveSource(source: DiscoveredSource): string;
17
+ getSource(id: string): (DiscoveredSource & {
18
+ id: string;
19
+ }) | null;
20
+ getSourceByUrl(url: string): (DiscoveredSource & {
21
+ id: string;
22
+ }) | null;
23
+ listSources(): Array<DiscoveredSource & {
24
+ id: string;
25
+ createdAt: string;
26
+ }>;
27
+ createSnapshot(sourceId: string, metadata?: Record<string, unknown>, docVersion?: string): string;
28
+ linkSnapshotPages(snapshotId: string, pageIds: string[]): void;
29
+ getSnapshot(snapshotId: string): SnapshotRecord | null;
30
+ listSnapshots(sourceId?: string): SnapshotRecord[];
31
+ getSnapshotPages(snapshotId: string): NormalizedPage[];
32
+ private mapSourceRow;
33
+ }
@@ -0,0 +1,153 @@
1
+ import { computeSha256 } from "../../../shared/src/index.js";
2
+ export class SourceRepository {
3
+ db;
4
+ hydratePageFn;
5
+ constructor(db, hydratePageFn) {
6
+ this.db = db;
7
+ this.hydratePageFn = hydratePageFn;
8
+ }
9
+ saveSource(source) {
10
+ const raw = this.db.getRawDb();
11
+ const id = `src_${computeSha256(source.url).slice(0, 16)}`;
12
+ const createdAt = new Date().toISOString();
13
+ const stmt = raw.prepare(`
14
+ INSERT INTO sources (
15
+ id, url, type, discovered_by, status, content_type,
16
+ confidence, authority, machine_readable, metadata, created_at
17
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
18
+ ON CONFLICT(url) DO UPDATE SET
19
+ type = excluded.type,
20
+ discovered_by = excluded.discovered_by,
21
+ status = excluded.status,
22
+ content_type = excluded.content_type,
23
+ confidence = excluded.confidence,
24
+ authority = excluded.authority,
25
+ machine_readable = excluded.machine_readable,
26
+ metadata = excluded.metadata
27
+ `);
28
+ stmt.run(id, source.url, source.type, source.discoveredBy || 'manual', source.status, source.contentType || null, source.confidence, source.authority, source.machineReadable ? 1 : 0, source.metadata ? JSON.stringify(source.metadata) : null, createdAt);
29
+ const row = raw.prepare('SELECT id FROM sources WHERE url = ?').get(source.url);
30
+ return row?.id || id;
31
+ }
32
+ getSource(id) {
33
+ const raw = this.db.getRawDb();
34
+ const row = raw.prepare('SELECT * FROM sources WHERE id = ?').get(id);
35
+ if (!row)
36
+ return null;
37
+ return this.mapSourceRow(row);
38
+ }
39
+ getSourceByUrl(url) {
40
+ const raw = this.db.getRawDb();
41
+ const row = raw.prepare('SELECT * FROM sources WHERE url = ?').get(url);
42
+ if (!row)
43
+ return null;
44
+ return this.mapSourceRow(row);
45
+ }
46
+ listSources() {
47
+ const raw = this.db.getRawDb();
48
+ const rows = raw.prepare('SELECT * FROM sources ORDER BY created_at DESC').all();
49
+ return rows.map(r => ({
50
+ ...this.mapSourceRow(r),
51
+ createdAt: String(r.created_at),
52
+ }));
53
+ }
54
+ createSnapshot(sourceId, metadata, docVersion) {
55
+ const raw = this.db.getRawDb();
56
+ const pages = raw.prepare('SELECT id, content_hash FROM pages WHERE source_id = ? ORDER BY id ASC').all(sourceId);
57
+ const combinedHash = computeSha256(pages.map(p => p.content_hash).join(':'));
58
+ const snapshotId = `snap_${combinedHash.slice(0, 16)}`;
59
+ const now = new Date().toISOString();
60
+ const version = docVersion || metadata?.docVersion || null;
61
+ const stmt = raw.prepare(`
62
+ INSERT INTO snapshots (id, source_id, snapshot_hash, page_count, captured_at, doc_version, metadata)
63
+ VALUES (?, ?, ?, ?, ?, ?, ?)
64
+ ON CONFLICT(id) DO UPDATE SET
65
+ captured_at = excluded.captured_at,
66
+ page_count = excluded.page_count,
67
+ doc_version = COALESCE(excluded.doc_version, snapshots.doc_version),
68
+ metadata = excluded.metadata
69
+ `);
70
+ stmt.run(snapshotId, sourceId, combinedHash, pages.length, now, version, metadata ? JSON.stringify(metadata) : null);
71
+ // Link snapshot to page membership in snapshot_pages
72
+ const linkStmt = raw.prepare(`
73
+ INSERT OR REPLACE INTO snapshot_pages (snapshot_id, page_id, content_hash)
74
+ VALUES (?, ?, ?)
75
+ `);
76
+ for (const p of pages) {
77
+ linkStmt.run(snapshotId, p.id, p.content_hash);
78
+ }
79
+ return snapshotId;
80
+ }
81
+ linkSnapshotPages(snapshotId, pageIds) {
82
+ const raw = this.db.getRawDb();
83
+ const linkStmt = raw.prepare(`
84
+ INSERT OR REPLACE INTO snapshot_pages (snapshot_id, page_id, content_hash)
85
+ VALUES (?, ?, COALESCE((SELECT content_hash FROM pages WHERE id = ?), 'hash_default'))
86
+ `);
87
+ for (const pageId of pageIds) {
88
+ linkStmt.run(snapshotId, pageId, pageId);
89
+ }
90
+ }
91
+ getSnapshot(snapshotId) {
92
+ const raw = this.db.getRawDb();
93
+ const row = raw.prepare('SELECT * FROM snapshots WHERE id = ?').get(snapshotId);
94
+ if (!row)
95
+ return null;
96
+ return {
97
+ id: String(row.id),
98
+ sourceId: String(row.source_id),
99
+ snapshotHash: String(row.snapshot_hash),
100
+ pageCount: Number(row.page_count),
101
+ capturedAt: String(row.captured_at),
102
+ docVersion: row.doc_version ? String(row.doc_version) : undefined,
103
+ metadata: row.metadata ? JSON.parse(String(row.metadata)) : undefined,
104
+ };
105
+ }
106
+ listSnapshots(sourceId) {
107
+ const raw = this.db.getRawDb();
108
+ let sql = 'SELECT * FROM snapshots';
109
+ const params = [];
110
+ if (sourceId) {
111
+ sql += ' WHERE source_id = ?';
112
+ params.push(sourceId);
113
+ }
114
+ sql += ' ORDER BY captured_at DESC';
115
+ const rows = raw.prepare(sql).all(...params);
116
+ return rows.map(row => ({
117
+ id: String(row.id),
118
+ sourceId: String(row.source_id),
119
+ snapshotHash: String(row.snapshot_hash),
120
+ pageCount: Number(row.page_count),
121
+ capturedAt: String(row.captured_at),
122
+ docVersion: row.doc_version ? String(row.doc_version) : undefined,
123
+ metadata: row.metadata ? JSON.parse(String(row.metadata)) : undefined,
124
+ }));
125
+ }
126
+ getSnapshotPages(snapshotId) {
127
+ const raw = this.db.getRawDb();
128
+ const rows = raw.prepare(`
129
+ SELECT p.* FROM pages p
130
+ JOIN snapshot_pages sp ON p.id = sp.page_id
131
+ WHERE sp.snapshot_id = ?
132
+ ORDER BY p.id ASC
133
+ `).all(snapshotId);
134
+ if (this.hydratePageFn) {
135
+ return rows.map(r => this.hydratePageFn(r));
136
+ }
137
+ return [];
138
+ }
139
+ mapSourceRow(row) {
140
+ return {
141
+ id: String(row.id),
142
+ url: String(row.url),
143
+ type: row.type,
144
+ discoveredBy: String(row.discovered_by),
145
+ status: row.status,
146
+ contentType: row.content_type ? String(row.content_type) : undefined,
147
+ confidence: Number(row.confidence),
148
+ authority: row.authority,
149
+ machineReadable: Number(row.machine_readable) === 1,
150
+ metadata: row.metadata ? JSON.parse(String(row.metadata)) : undefined,
151
+ };
152
+ }
153
+ }