docorbit 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 (405) hide show
  1. package/README.md +29 -15
  2. package/bin/docorbit.js +2 -2
  3. package/dist/apps/cli/src/commands/add.d.ts +7 -0
  4. package/dist/apps/cli/src/commands/add.js +35 -0
  5. package/dist/apps/cli/src/commands/api.d.ts +2 -0
  6. package/dist/apps/cli/src/commands/api.js +35 -0
  7. package/dist/apps/cli/src/commands/context.d.ts +10 -0
  8. package/dist/apps/cli/src/commands/context.js +36 -0
  9. package/dist/apps/cli/src/commands/dashboard.d.ts +8 -0
  10. package/dist/apps/cli/src/commands/dashboard.js +43 -0
  11. package/dist/apps/cli/src/commands/diff.d.ts +2 -0
  12. package/dist/apps/cli/src/commands/diff.js +29 -0
  13. package/dist/apps/cli/src/commands/evaluate.d.ts +11 -0
  14. package/dist/apps/cli/src/commands/evaluate.js +101 -0
  15. package/dist/apps/cli/src/commands/examples.d.ts +2 -0
  16. package/dist/apps/cli/src/commands/examples.js +36 -0
  17. package/dist/apps/cli/src/commands/export.d.ts +11 -0
  18. package/dist/apps/cli/src/commands/export.js +72 -0
  19. package/dist/apps/cli/src/commands/impact.d.ts +2 -0
  20. package/dist/apps/cli/src/commands/impact.js +30 -0
  21. package/dist/apps/cli/src/commands/init.d.ts +5 -0
  22. package/dist/apps/cli/src/commands/init.js +52 -0
  23. package/dist/apps/cli/src/commands/inspect.d.ts +5 -0
  24. package/dist/apps/cli/src/commands/inspect.js +24 -0
  25. package/dist/apps/cli/src/commands/mcp.d.ts +8 -0
  26. package/dist/apps/cli/src/commands/mcp.js +49 -0
  27. package/dist/apps/cli/src/commands/pitfalls.d.ts +2 -0
  28. package/dist/apps/cli/src/commands/pitfalls.js +35 -0
  29. package/dist/apps/cli/src/commands/recipes.d.ts +2 -0
  30. package/dist/apps/cli/src/commands/recipes.js +33 -0
  31. package/dist/apps/cli/src/commands/search.d.ts +11 -0
  32. package/dist/apps/cli/src/commands/search.js +36 -0
  33. package/dist/apps/cli/src/commands/update.d.ts +6 -0
  34. package/dist/apps/cli/src/commands/update.js +53 -0
  35. package/dist/apps/cli/src/commands/verify.d.ts +2 -0
  36. package/dist/apps/cli/src/commands/verify.js +44 -0
  37. package/dist/apps/cli/src/formatters/colors.d.ts +21 -0
  38. package/dist/apps/cli/src/formatters/colors.js +22 -0
  39. package/dist/apps/cli/src/formatters/inspection.d.ts +3 -0
  40. package/dist/apps/cli/src/formatters/inspection.js +88 -0
  41. package/dist/apps/cli/src/formatters/knowledge.d.ts +5 -0
  42. package/dist/apps/cli/src/formatters/knowledge.js +229 -0
  43. package/dist/apps/cli/src/formatters/retrieval.d.ts +3 -0
  44. package/dist/apps/cli/src/formatters/retrieval.js +61 -0
  45. package/{apps/cli/src/formatters/terminal.ts → dist/apps/cli/src/formatters/terminal.d.ts} +0 -1
  46. package/dist/apps/cli/src/formatters/terminal.js +5 -0
  47. package/dist/apps/cli/src/formatters/verification.d.ts +4 -0
  48. package/dist/apps/cli/src/formatters/verification.js +102 -0
  49. package/dist/apps/cli/src/index.d.ts +1 -0
  50. package/dist/apps/cli/src/index.js +376 -0
  51. package/dist/packages/core/src/dashboard/server.d.ts +33 -0
  52. package/dist/packages/core/src/dashboard/server.js +267 -0
  53. package/dist/packages/core/src/dashboard/ui.d.ts +5 -0
  54. package/{packages/core/src/dashboard/ui.ts → dist/packages/core/src/dashboard/ui.js} +2 -2
  55. package/dist/packages/core/src/implementation-service.d.ts +73 -0
  56. package/dist/packages/core/src/implementation-service.js +325 -0
  57. package/{packages/core/src/index.ts → dist/packages/core/src/index.d.ts} +0 -1
  58. package/dist/packages/core/src/index.js +6 -0
  59. package/dist/packages/core/src/inspector.d.ts +22 -0
  60. package/dist/packages/core/src/inspector.js +38 -0
  61. package/dist/packages/core/src/pipeline.d.ts +45 -0
  62. package/dist/packages/core/src/pipeline.js +246 -0
  63. package/dist/packages/crawler/src/config.d.ts +2 -0
  64. package/dist/packages/crawler/src/config.js +10 -0
  65. package/dist/packages/crawler/src/fetcher.d.ts +31 -0
  66. package/dist/packages/crawler/src/fetcher.js +139 -0
  67. package/dist/packages/crawler/src/index.js +2 -0
  68. package/dist/packages/discovery/src/index.d.ts +11 -0
  69. package/dist/packages/discovery/src/index.js +29 -0
  70. package/dist/packages/discovery/src/provider.d.ts +12 -0
  71. package/dist/packages/discovery/src/provider.js +30 -0
  72. package/dist/packages/discovery/src/providers/generic.d.ts +7 -0
  73. package/dist/packages/discovery/src/providers/generic.js +94 -0
  74. package/dist/packages/discovery/src/providers/github.d.ts +7 -0
  75. package/dist/packages/discovery/src/providers/github.js +52 -0
  76. package/dist/packages/discovery/src/providers/llms-txt.d.ts +7 -0
  77. package/dist/packages/discovery/src/providers/llms-txt.js +60 -0
  78. package/dist/packages/discovery/src/providers/markdown.d.ts +7 -0
  79. package/dist/packages/discovery/src/providers/markdown.js +38 -0
  80. package/dist/packages/discovery/src/providers/openapi.d.ts +7 -0
  81. package/dist/packages/discovery/src/providers/openapi.js +77 -0
  82. package/dist/packages/discovery/src/providers/sitemap.d.ts +7 -0
  83. package/dist/packages/discovery/src/providers/sitemap.js +53 -0
  84. package/dist/packages/discovery/src/providers/skill.d.ts +7 -0
  85. package/dist/packages/discovery/src/providers/skill.js +46 -0
  86. package/dist/packages/discovery/src/ranker.d.ts +6 -0
  87. package/dist/packages/discovery/src/ranker.js +107 -0
  88. package/dist/packages/evaluation/src/dataset.d.ts +2 -0
  89. package/dist/packages/evaluation/src/dataset.js +944 -0
  90. package/dist/packages/evaluation/src/index.js +8 -0
  91. package/dist/packages/evaluation/src/runner.d.ts +7 -0
  92. package/dist/packages/evaluation/src/runner.js +196 -0
  93. package/dist/packages/evaluation/src/strategies/context7-runner.d.ts +24 -0
  94. package/dist/packages/evaluation/src/strategies/context7-runner.js +229 -0
  95. package/dist/packages/evaluation/src/strategies/docorbit-runner.d.ts +5 -0
  96. package/dist/packages/evaluation/src/strategies/docorbit-runner.js +210 -0
  97. package/dist/packages/evaluation/src/strategies/firecrawl-runner.d.ts +24 -0
  98. package/dist/packages/evaluation/src/strategies/firecrawl-runner.js +151 -0
  99. package/dist/packages/evaluation/src/strategies/web-search-runner.d.ts +32 -0
  100. package/dist/packages/evaluation/src/strategies/web-search-runner.js +161 -0
  101. package/dist/packages/evaluation/src/types.d.ts +15 -0
  102. package/dist/packages/evaluation/src/types.js +1 -0
  103. package/dist/packages/evaluation/src/version-matcher.d.ts +11 -0
  104. package/dist/packages/evaluation/src/version-matcher.js +61 -0
  105. package/dist/packages/export/src/agents-md.d.ts +19 -0
  106. package/dist/packages/export/src/agents-md.js +170 -0
  107. package/dist/packages/export/src/claude-md.d.ts +17 -0
  108. package/dist/packages/export/src/claude-md.js +118 -0
  109. package/dist/packages/export/src/docs-map.d.ts +14 -0
  110. package/dist/packages/export/src/docs-map.js +118 -0
  111. package/dist/packages/export/src/index.js +6 -0
  112. package/dist/packages/export/src/llms-txt.d.ts +15 -0
  113. package/dist/packages/export/src/llms-txt.js +73 -0
  114. package/dist/packages/export/src/service.d.ts +23 -0
  115. package/dist/packages/export/src/service.js +210 -0
  116. package/dist/packages/export/src/skill-md.d.ts +14 -0
  117. package/dist/packages/export/src/skill-md.js +107 -0
  118. package/{packages/mcp/src/index.ts → dist/packages/mcp/src/index.d.ts} +2 -35
  119. package/dist/packages/mcp/src/index.js +6 -0
  120. package/dist/packages/mcp/src/resources/index.d.ts +12 -0
  121. package/dist/packages/mcp/src/resources/index.js +165 -0
  122. package/dist/packages/mcp/src/server.d.ts +30 -0
  123. package/dist/packages/mcp/src/server.js +243 -0
  124. package/dist/packages/mcp/src/tools/analyze-impact.d.ts +6 -0
  125. package/dist/packages/mcp/src/tools/analyze-impact.js +64 -0
  126. package/dist/packages/mcp/src/tools/check-api.d.ts +6 -0
  127. package/dist/packages/mcp/src/tools/check-api.js +74 -0
  128. package/dist/packages/mcp/src/tools/diff-docs.d.ts +6 -0
  129. package/dist/packages/mcp/src/tools/diff-docs.js +58 -0
  130. package/dist/packages/mcp/src/tools/export-context.d.ts +6 -0
  131. package/dist/packages/mcp/src/tools/export-context.js +61 -0
  132. package/dist/packages/mcp/src/tools/find-api.d.ts +6 -0
  133. package/dist/packages/mcp/src/tools/find-api.js +91 -0
  134. package/dist/packages/mcp/src/tools/find-example.d.ts +6 -0
  135. package/dist/packages/mcp/src/tools/find-example.js +92 -0
  136. package/dist/packages/mcp/src/tools/find-pitfall.d.ts +6 -0
  137. package/dist/packages/mcp/src/tools/find-pitfall.js +85 -0
  138. package/dist/packages/mcp/src/tools/find-recipe.d.ts +6 -0
  139. package/dist/packages/mcp/src/tools/find-recipe.js +89 -0
  140. package/dist/packages/mcp/src/tools/get-doc.d.ts +6 -0
  141. package/dist/packages/mcp/src/tools/get-doc.js +118 -0
  142. package/dist/packages/mcp/src/tools/get-docs-map.d.ts +6 -0
  143. package/dist/packages/mcp/src/tools/get-docs-map.js +54 -0
  144. package/dist/packages/mcp/src/tools/get-version.d.ts +6 -0
  145. package/dist/packages/mcp/src/tools/get-version.js +104 -0
  146. package/dist/packages/mcp/src/tools/implementation-context.d.ts +6 -0
  147. package/dist/packages/mcp/src/tools/implementation-context.js +102 -0
  148. package/dist/packages/mcp/src/tools/index.d.ts +19 -0
  149. package/dist/packages/mcp/src/tools/index.js +41 -0
  150. package/dist/packages/mcp/src/tools/ingest-doc.d.ts +6 -0
  151. package/dist/packages/mcp/src/tools/ingest-doc.js +264 -0
  152. package/dist/packages/mcp/src/tools/list-sources.d.ts +6 -0
  153. package/dist/packages/mcp/src/tools/list-sources.js +76 -0
  154. package/dist/packages/mcp/src/tools/search-docs.d.ts +6 -0
  155. package/dist/packages/mcp/src/tools/search-docs.js +113 -0
  156. package/dist/packages/mcp/src/tools/types.d.ts +22 -0
  157. package/dist/packages/mcp/src/tools/types.js +1 -0
  158. package/dist/packages/mcp/src/transports/http.d.ts +31 -0
  159. package/dist/packages/mcp/src/transports/http.js +215 -0
  160. package/dist/packages/mcp/src/transports/stdio.d.ts +22 -0
  161. package/dist/packages/mcp/src/transports/stdio.js +86 -0
  162. package/{packages/mcp/src/transports/types.ts → dist/packages/mcp/src/transports/types.d.ts} +2 -3
  163. package/dist/packages/mcp/src/transports/types.js +1 -0
  164. package/dist/packages/mcp/src/types.d.ts +89 -0
  165. package/dist/packages/mcp/src/types.js +7 -0
  166. package/dist/packages/normalizer/src/example-indexer.d.ts +5 -0
  167. package/dist/packages/normalizer/src/example-indexer.js +200 -0
  168. package/dist/packages/normalizer/src/html.d.ts +13 -0
  169. package/dist/packages/normalizer/src/html.js +221 -0
  170. package/{packages/normalizer/src/index.ts → dist/packages/normalizer/src/index.d.ts} +0 -1
  171. package/dist/packages/normalizer/src/index.js +7 -0
  172. package/dist/packages/normalizer/src/llms.d.ts +3 -0
  173. package/dist/packages/normalizer/src/llms.js +71 -0
  174. package/dist/packages/normalizer/src/openapi/endpoint-parser.d.ts +11 -0
  175. package/dist/packages/normalizer/src/openapi/endpoint-parser.js +357 -0
  176. package/dist/packages/normalizer/src/openapi/schema-resolver.d.ts +10 -0
  177. package/dist/packages/normalizer/src/openapi/schema-resolver.js +82 -0
  178. package/dist/packages/normalizer/src/openapi.js +2 -0
  179. package/dist/packages/normalizer/src/page.d.ts +13 -0
  180. package/dist/packages/normalizer/src/page.js +150 -0
  181. package/dist/packages/normalizer/src/pitfall-extractor.d.ts +6 -0
  182. package/dist/packages/normalizer/src/pitfall-extractor.js +153 -0
  183. package/dist/packages/normalizer/src/slicer.d.ts +30 -0
  184. package/dist/packages/normalizer/src/slicer.js +360 -0
  185. package/dist/packages/retrieval/src/engine.d.ts +17 -0
  186. package/dist/packages/retrieval/src/engine.js +93 -0
  187. package/{packages/retrieval/src/index.ts → dist/packages/retrieval/src/index.d.ts} +0 -1
  188. package/dist/packages/retrieval/src/index.js +6 -0
  189. package/dist/packages/retrieval/src/intent.d.ts +6 -0
  190. package/dist/packages/retrieval/src/intent.js +39 -0
  191. package/dist/packages/retrieval/src/packer.d.ts +2 -0
  192. package/dist/packages/retrieval/src/packer.js +108 -0
  193. package/dist/packages/retrieval/src/recipe-engine.d.ts +18 -0
  194. package/dist/packages/retrieval/src/recipe-engine.js +265 -0
  195. package/dist/packages/retrieval/src/scorer.d.ts +13 -0
  196. package/dist/packages/retrieval/src/scorer.js +110 -0
  197. package/dist/packages/retrieval/src/weights.d.ts +3 -0
  198. package/dist/packages/retrieval/src/weights.js +28 -0
  199. package/dist/packages/security/src/annotations.d.ts +10 -0
  200. package/dist/packages/security/src/annotations.js +100 -0
  201. package/dist/packages/security/src/index.js +2 -0
  202. package/dist/packages/security/src/ssrf.d.ts +17 -0
  203. package/dist/packages/security/src/ssrf.js +132 -0
  204. package/dist/packages/shared/src/errors.d.ts +22 -0
  205. package/dist/packages/shared/src/errors.js +44 -0
  206. package/dist/packages/shared/src/hashing.d.ts +3 -0
  207. package/dist/packages/shared/src/hashing.js +21 -0
  208. package/dist/packages/shared/src/index.js +3 -0
  209. package/dist/packages/shared/src/types.d.ts +715 -0
  210. package/dist/packages/shared/src/types.js +1 -0
  211. package/dist/packages/storage/src/db.d.ts +11 -0
  212. package/dist/packages/storage/src/db.js +128 -0
  213. package/dist/packages/storage/src/index.js +10 -0
  214. package/dist/packages/storage/src/interfaces.d.ts +83 -0
  215. package/dist/packages/storage/src/interfaces.js +1 -0
  216. package/dist/packages/storage/src/repositories/api-repository.d.ts +16 -0
  217. package/dist/packages/storage/src/repositories/api-repository.js +169 -0
  218. package/dist/packages/storage/src/repositories/chunk-repository.d.ts +32 -0
  219. package/dist/packages/storage/src/repositories/chunk-repository.js +250 -0
  220. package/dist/packages/storage/src/repositories/example-repository.d.ts +16 -0
  221. package/dist/packages/storage/src/repositories/example-repository.js +158 -0
  222. package/dist/packages/storage/src/repositories/page-repository.d.ts +16 -0
  223. package/dist/packages/storage/src/repositories/page-repository.js +161 -0
  224. package/dist/packages/storage/src/repositories/pitfall-repository.d.ts +15 -0
  225. package/dist/packages/storage/src/repositories/pitfall-repository.js +144 -0
  226. package/dist/packages/storage/src/repositories/source-repository.d.ts +33 -0
  227. package/dist/packages/storage/src/repositories/source-repository.js +153 -0
  228. package/dist/packages/storage/src/repository.d.ts +92 -0
  229. package/dist/packages/storage/src/repository.js +157 -0
  230. package/dist/packages/storage/src/schema.d.ts +2 -0
  231. package/{packages/storage/src/schema.ts → dist/packages/storage/src/schema.js} +0 -3
  232. package/dist/packages/storage/src/search-tokens.d.ts +6 -0
  233. package/dist/packages/storage/src/search-tokens.js +26 -0
  234. package/dist/packages/verification/src/diff-engine.d.ts +18 -0
  235. package/dist/packages/verification/src/diff-engine.js +218 -0
  236. package/dist/packages/verification/src/extractor.d.ts +29 -0
  237. package/dist/packages/verification/src/extractor.js +302 -0
  238. package/dist/packages/verification/src/impact-scanner.d.ts +9 -0
  239. package/dist/packages/verification/src/impact-scanner.js +181 -0
  240. package/dist/packages/verification/src/index.js +5 -0
  241. package/dist/packages/verification/src/services.d.ts +55 -0
  242. package/dist/packages/verification/src/services.js +189 -0
  243. package/dist/packages/verification/src/verifier.d.ts +15 -0
  244. package/dist/packages/verification/src/verifier.js +315 -0
  245. package/dist/packages/workspace/src/detector.d.ts +7 -0
  246. package/dist/packages/workspace/src/detector.js +117 -0
  247. package/dist/packages/workspace/src/ecosystems/cargo.d.ts +10 -0
  248. package/dist/packages/workspace/src/ecosystems/cargo.js +69 -0
  249. package/dist/packages/workspace/src/ecosystems/composer.d.ts +7 -0
  250. package/dist/packages/workspace/src/ecosystems/composer.js +40 -0
  251. package/dist/packages/workspace/src/ecosystems/go.d.ts +7 -0
  252. package/dist/packages/workspace/src/ecosystems/go.js +49 -0
  253. package/{packages/workspace/src/ecosystems/index.ts → dist/packages/workspace/src/ecosystems/index.d.ts} +2 -24
  254. package/dist/packages/workspace/src/ecosystems/index.js +21 -0
  255. package/dist/packages/workspace/src/ecosystems/maven.d.ts +7 -0
  256. package/dist/packages/workspace/src/ecosystems/maven.js +28 -0
  257. package/dist/packages/workspace/src/ecosystems/npm.d.ts +10 -0
  258. package/dist/packages/workspace/src/ecosystems/npm.js +73 -0
  259. package/dist/packages/workspace/src/ecosystems/pub.d.ts +7 -0
  260. package/dist/packages/workspace/src/ecosystems/pub.js +34 -0
  261. package/dist/packages/workspace/src/ecosystems/pypi.d.ts +9 -0
  262. package/dist/packages/workspace/src/ecosystems/pypi.js +94 -0
  263. package/dist/packages/workspace/src/ecosystems/rubygems.d.ts +7 -0
  264. package/dist/packages/workspace/src/ecosystems/rubygems.js +25 -0
  265. package/dist/packages/workspace/src/ecosystems/types.d.ts +9 -0
  266. package/dist/packages/workspace/src/ecosystems/types.js +1 -0
  267. package/dist/packages/workspace/src/index.js +5 -0
  268. package/dist/packages/workspace/src/lockfile.d.ts +21 -0
  269. package/dist/packages/workspace/src/lockfile.js +153 -0
  270. package/dist/packages/workspace/src/resolver.d.ts +39 -0
  271. package/dist/packages/workspace/src/resolver.js +164 -0
  272. package/dist/packages/workspace/src/semver.d.ts +33 -0
  273. package/dist/packages/workspace/src/semver.js +235 -0
  274. package/package.json +13 -9
  275. package/apps/cli/bin/docorbit.js +0 -8
  276. package/apps/cli/src/commands/add.ts +0 -44
  277. package/apps/cli/src/commands/api.ts +0 -38
  278. package/apps/cli/src/commands/context.ts +0 -47
  279. package/apps/cli/src/commands/dashboard.ts +0 -55
  280. package/apps/cli/src/commands/diff.ts +0 -30
  281. package/apps/cli/src/commands/evaluate.ts +0 -133
  282. package/apps/cli/src/commands/examples.ts +0 -39
  283. package/apps/cli/src/commands/export.ts +0 -89
  284. package/apps/cli/src/commands/impact.ts +0 -31
  285. package/apps/cli/src/commands/init.ts +0 -69
  286. package/apps/cli/src/commands/inspect.ts +0 -30
  287. package/apps/cli/src/commands/mcp.ts +0 -72
  288. package/apps/cli/src/commands/pitfalls.ts +0 -38
  289. package/apps/cli/src/commands/recipes.ts +0 -35
  290. package/apps/cli/src/commands/search.ts +0 -48
  291. package/apps/cli/src/commands/update.ts +0 -73
  292. package/apps/cli/src/commands/verify.ts +0 -48
  293. package/apps/cli/src/formatters/colors.ts +0 -23
  294. package/apps/cli/src/formatters/inspection.ts +0 -102
  295. package/apps/cli/src/formatters/knowledge.ts +0 -272
  296. package/apps/cli/src/formatters/retrieval.ts +0 -74
  297. package/apps/cli/src/formatters/verification.ts +0 -126
  298. package/apps/cli/src/index.ts +0 -409
  299. package/packages/core/src/dashboard/server.ts +0 -314
  300. package/packages/core/src/implementation-service.ts +0 -451
  301. package/packages/core/src/inspector.ts +0 -71
  302. package/packages/core/src/pipeline.ts +0 -331
  303. package/packages/crawler/src/config.ts +0 -12
  304. package/packages/crawler/src/fetcher.ts +0 -185
  305. package/packages/discovery/src/index.ts +0 -31
  306. package/packages/discovery/src/provider.ts +0 -47
  307. package/packages/discovery/src/providers/generic.ts +0 -98
  308. package/packages/discovery/src/providers/github.ts +0 -61
  309. package/packages/discovery/src/providers/llms-txt.ts +0 -73
  310. package/packages/discovery/src/providers/markdown.ts +0 -48
  311. package/packages/discovery/src/providers/openapi.ts +0 -91
  312. package/packages/discovery/src/providers/sitemap.ts +0 -62
  313. package/packages/discovery/src/providers/skill.ts +0 -54
  314. package/packages/discovery/src/ranker.ts +0 -123
  315. package/packages/evaluation/src/dataset.ts +0 -963
  316. package/packages/evaluation/src/runner.ts +0 -241
  317. package/packages/evaluation/src/strategies/context7-runner.ts +0 -269
  318. package/packages/evaluation/src/strategies/docorbit-runner.ts +0 -228
  319. package/packages/evaluation/src/strategies/firecrawl-runner.ts +0 -172
  320. package/packages/evaluation/src/strategies/web-search-runner.ts +0 -194
  321. package/packages/evaluation/src/types.ts +0 -34
  322. package/packages/evaluation/src/version-matcher.ts +0 -73
  323. package/packages/export/src/agents-md.ts +0 -200
  324. package/packages/export/src/claude-md.ts +0 -141
  325. package/packages/export/src/docs-map.ts +0 -150
  326. package/packages/export/src/llms-txt.ts +0 -96
  327. package/packages/export/src/service.ts +0 -250
  328. package/packages/export/src/skill-md.ts +0 -128
  329. package/packages/mcp/src/resources/index.ts +0 -189
  330. package/packages/mcp/src/server.ts +0 -278
  331. package/packages/mcp/src/tools/analyze-impact.ts +0 -74
  332. package/packages/mcp/src/tools/check-api.ts +0 -86
  333. package/packages/mcp/src/tools/diff-docs.ts +0 -68
  334. package/packages/mcp/src/tools/export-context.ts +0 -73
  335. package/packages/mcp/src/tools/find-api.ts +0 -99
  336. package/packages/mcp/src/tools/find-example.ts +0 -100
  337. package/packages/mcp/src/tools/find-pitfall.ts +0 -94
  338. package/packages/mcp/src/tools/find-recipe.ts +0 -98
  339. package/packages/mcp/src/tools/get-doc.ts +0 -130
  340. package/packages/mcp/src/tools/get-docs-map.ts +0 -64
  341. package/packages/mcp/src/tools/get-version.ts +0 -118
  342. package/packages/mcp/src/tools/implementation-context.ts +0 -88
  343. package/packages/mcp/src/tools/index.ts +0 -59
  344. package/packages/mcp/src/tools/list-sources.ts +0 -85
  345. package/packages/mcp/src/tools/search-docs.ts +0 -123
  346. package/packages/mcp/src/tools/types.ts +0 -28
  347. package/packages/mcp/src/transports/http.ts +0 -256
  348. package/packages/mcp/src/transports/stdio.ts +0 -105
  349. package/packages/mcp/src/types.ts +0 -102
  350. package/packages/normalizer/src/example-indexer.ts +0 -240
  351. package/packages/normalizer/src/html.ts +0 -253
  352. package/packages/normalizer/src/llms.ts +0 -83
  353. package/packages/normalizer/src/openapi/endpoint-parser.ts +0 -406
  354. package/packages/normalizer/src/openapi/schema-resolver.ts +0 -111
  355. package/packages/normalizer/src/page.ts +0 -184
  356. package/packages/normalizer/src/pitfall-extractor.ts +0 -190
  357. package/packages/normalizer/src/slicer.ts +0 -455
  358. package/packages/retrieval/src/engine.ts +0 -120
  359. package/packages/retrieval/src/intent.ts +0 -43
  360. package/packages/retrieval/src/packer.ts +0 -145
  361. package/packages/retrieval/src/recipe-engine.ts +0 -313
  362. package/packages/retrieval/src/scorer.ts +0 -139
  363. package/packages/retrieval/src/weights.ts +0 -31
  364. package/packages/security/src/annotations.ts +0 -112
  365. package/packages/security/src/ssrf.ts +0 -153
  366. package/packages/shared/src/errors.ts +0 -53
  367. package/packages/shared/src/hashing.ts +0 -23
  368. package/packages/shared/src/types.ts +0 -881
  369. package/packages/storage/src/db.ts +0 -72
  370. package/packages/storage/src/interfaces.ts +0 -115
  371. package/packages/storage/src/repositories/api-repository.ts +0 -219
  372. package/packages/storage/src/repositories/chunk-repository.ts +0 -316
  373. package/packages/storage/src/repositories/example-repository.ts +0 -206
  374. package/packages/storage/src/repositories/page-repository.ts +0 -205
  375. package/packages/storage/src/repositories/pitfall-repository.ts +0 -188
  376. package/packages/storage/src/repositories/source-repository.ts +0 -205
  377. package/packages/storage/src/repository.ts +0 -256
  378. package/packages/storage/src/search-tokens.ts +0 -28
  379. package/packages/verification/src/diff-engine.ts +0 -258
  380. package/packages/verification/src/extractor.ts +0 -339
  381. package/packages/verification/src/impact-scanner.ts +0 -203
  382. package/packages/verification/src/services.ts +0 -238
  383. package/packages/verification/src/verifier.ts +0 -375
  384. package/packages/workspace/src/detector.ts +0 -143
  385. package/packages/workspace/src/ecosystems/cargo.ts +0 -84
  386. package/packages/workspace/src/ecosystems/composer.ts +0 -42
  387. package/packages/workspace/src/ecosystems/go.ts +0 -54
  388. package/packages/workspace/src/ecosystems/maven.ts +0 -34
  389. package/packages/workspace/src/ecosystems/npm.ts +0 -83
  390. package/packages/workspace/src/ecosystems/pub.ts +0 -40
  391. package/packages/workspace/src/ecosystems/pypi.ts +0 -100
  392. package/packages/workspace/src/ecosystems/rubygems.ts +0 -30
  393. package/packages/workspace/src/ecosystems/types.ts +0 -18
  394. package/packages/workspace/src/lockfile.ts +0 -194
  395. package/packages/workspace/src/resolver.ts +0 -234
  396. package/packages/workspace/src/semver.ts +0 -259
  397. /package/{packages/crawler/src/index.ts → dist/packages/crawler/src/index.d.ts} +0 -0
  398. /package/{packages/evaluation/src/index.ts → dist/packages/evaluation/src/index.d.ts} +0 -0
  399. /package/{packages/export/src/index.ts → dist/packages/export/src/index.d.ts} +0 -0
  400. /package/{packages/normalizer/src/openapi.ts → dist/packages/normalizer/src/openapi.d.ts} +0 -0
  401. /package/{packages/security/src/index.ts → dist/packages/security/src/index.d.ts} +0 -0
  402. /package/{packages/shared/src/index.ts → dist/packages/shared/src/index.d.ts} +0 -0
  403. /package/{packages/storage/src/index.ts → dist/packages/storage/src/index.d.ts} +0 -0
  404. /package/{packages/verification/src/index.ts → dist/packages/verification/src/index.d.ts} +0 -0
  405. /package/{packages/workspace/src/index.ts → dist/packages/workspace/src/index.d.ts} +0 -0
@@ -0,0 +1,250 @@
1
+ export class ChunkRepository {
2
+ db;
3
+ constructor(db) {
4
+ this.db = db;
5
+ }
6
+ /**
7
+ * Saves chunks, code snippets, symbols, and relationships in a single atomic transaction.
8
+ * Transactionally synchronizes the FTS5 chunks_fts table with chunks.
9
+ */
10
+ saveChunks(chunks, relationships = [], codeSnippets = [], symbols = []) {
11
+ if (chunks.length === 0)
12
+ return;
13
+ const raw = this.db.getRawDb();
14
+ const createdAt = new Date().toISOString();
15
+ // Group symbols by chunkId for fast indexing into chunks_fts
16
+ const symbolsByChunk = new Map();
17
+ for (const s of symbols) {
18
+ const list = symbolsByChunk.get(s.chunkId) || [];
19
+ list.push(s.name);
20
+ symbolsByChunk.set(s.chunkId, list);
21
+ }
22
+ raw.exec('BEGIN IMMEDIATE TRANSACTION;');
23
+ try {
24
+ const chunkStmt = raw.prepare(`
25
+ INSERT INTO chunks (
26
+ id, page_id, snapshot_id, title, section_path_json, content,
27
+ chunk_type, language, token_estimate, ordinal, content_hash,
28
+ doc_version, provenance_json, created_at
29
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
30
+ ON CONFLICT(id) DO UPDATE SET
31
+ title = excluded.title,
32
+ section_path_json = excluded.section_path_json,
33
+ content = excluded.content,
34
+ chunk_type = excluded.chunk_type,
35
+ language = excluded.language,
36
+ token_estimate = excluded.token_estimate,
37
+ ordinal = excluded.ordinal,
38
+ content_hash = excluded.content_hash,
39
+ doc_version = excluded.doc_version,
40
+ provenance_json = excluded.provenance_json
41
+ `);
42
+ const ftsDelStmt = this.db.isFtsAvailable()
43
+ ? raw.prepare('DELETE FROM chunks_fts WHERE chunk_id = ?')
44
+ : null;
45
+ const ftsInsStmt = this.db.isFtsAvailable()
46
+ ? raw.prepare(`
47
+ INSERT INTO chunks_fts (chunk_id, title, section_path, content, symbols)
48
+ VALUES (?, ?, ?, ?, ?)
49
+ `)
50
+ : null;
51
+ for (const chunk of chunks) {
52
+ const sectionPath = Array.isArray(chunk.sectionPath)
53
+ ? chunk.sectionPath
54
+ : (Array.isArray(chunk.headingPath) ? chunk.headingPath : []);
55
+ const chunkType = chunk.chunkType || chunk.type || 'prose';
56
+ const tokenEstimate = chunk.tokenEstimate ?? chunk.tokenCount ?? 0;
57
+ const ordinal = chunk.ordinal ?? chunk.orderIndex ?? 0;
58
+ const provenance = chunk.provenance ? JSON.stringify(chunk.provenance) : null;
59
+ chunkStmt.run(chunk.id, chunk.pageId || null, chunk.snapshotId || 'default', chunk.title || null, JSON.stringify(sectionPath), chunk.content, chunkType, chunk.language || null, tokenEstimate, ordinal, chunk.contentHash, chunk.docVersion || null, provenance, createdAt);
60
+ if (ftsDelStmt && ftsInsStmt) {
61
+ ftsDelStmt.run(chunk.id);
62
+ const chunkSymbols = symbolsByChunk.get(chunk.id)?.join(' ') || '';
63
+ const sectionPathStr = sectionPath.join(' > ');
64
+ ftsInsStmt.run(chunk.id, chunk.title || '', sectionPathStr, chunk.content, chunkSymbols);
65
+ }
66
+ }
67
+ // Save code snippets
68
+ if (codeSnippets.length > 0) {
69
+ const codeStmt = raw.prepare(`
70
+ INSERT OR REPLACE INTO chunk_code (id, chunk_id, language, code)
71
+ VALUES (?, ?, ?, ?)
72
+ `);
73
+ for (const cs of codeSnippets) {
74
+ codeStmt.run(cs.id, cs.chunkId, cs.language || null, cs.code);
75
+ }
76
+ }
77
+ // Save symbols
78
+ if (symbols.length > 0) {
79
+ const symStmt = raw.prepare(`
80
+ INSERT OR REPLACE INTO symbol_references (id, chunk_id, name, kind)
81
+ VALUES (?, ?, ?, ?)
82
+ `);
83
+ for (const s of symbols) {
84
+ symStmt.run(s.id, s.chunkId, s.name, s.kind);
85
+ }
86
+ }
87
+ // Save relationships
88
+ if (relationships.length > 0) {
89
+ const relStmt = raw.prepare(`
90
+ INSERT OR REPLACE INTO chunk_relationships (source_chunk_id, target_chunk_id, type)
91
+ VALUES (?, ?, ?)
92
+ `);
93
+ for (const r of relationships) {
94
+ relStmt.run(r.sourceChunkId, r.targetChunkId, r.type);
95
+ }
96
+ }
97
+ raw.exec('COMMIT;');
98
+ }
99
+ catch (err) {
100
+ raw.exec('ROLLBACK;');
101
+ throw err;
102
+ }
103
+ }
104
+ getChunk(id) {
105
+ const raw = this.db.getRawDb();
106
+ const row = raw.prepare('SELECT * FROM chunks WHERE id = ?').get(id);
107
+ if (!row)
108
+ return null;
109
+ return this.hydrateChunk(row);
110
+ }
111
+ getChunksByPage(pageId) {
112
+ const raw = this.db.getRawDb();
113
+ const rows = raw.prepare('SELECT * FROM chunks WHERE page_id = ? ORDER BY ordinal ASC').all(pageId);
114
+ return rows.map(r => this.hydrateChunk(r));
115
+ }
116
+ getChunksBySnapshot(snapshotId) {
117
+ const raw = this.db.getRawDb();
118
+ const rows = raw.prepare('SELECT * FROM chunks WHERE snapshot_id = ? ORDER BY page_id ASC, ordinal ASC').all(snapshotId);
119
+ return rows.map(r => this.hydrateChunk(r));
120
+ }
121
+ getChunksByVersion(docVersion) {
122
+ const raw = this.db.getRawDb();
123
+ const rows = raw.prepare('SELECT * FROM chunks WHERE doc_version = ? ORDER BY page_id ASC, ordinal ASC').all(docVersion);
124
+ return rows.map(r => this.hydrateChunk(r));
125
+ }
126
+ getChunkCode(chunkId) {
127
+ const raw = this.db.getRawDb();
128
+ const rows = raw.prepare('SELECT id, chunk_id, language, code FROM chunk_code WHERE chunk_id = ?').all(chunkId);
129
+ return rows.map(r => ({
130
+ id: String(r.id),
131
+ chunkId: String(r.chunk_id),
132
+ language: r.language ? String(r.language) : undefined,
133
+ code: String(r.code),
134
+ }));
135
+ }
136
+ getChunkSymbols(chunkId) {
137
+ const raw = this.db.getRawDb();
138
+ const rows = raw.prepare('SELECT id, chunk_id, name, kind FROM symbol_references WHERE chunk_id = ?').all(chunkId);
139
+ return rows.map(r => ({
140
+ id: String(r.id),
141
+ chunkId: String(r.chunk_id),
142
+ name: String(r.name),
143
+ kind: r.kind,
144
+ }));
145
+ }
146
+ getChunkRelationships(chunkId) {
147
+ const raw = this.db.getRawDb();
148
+ const rows = raw.prepare(`
149
+ SELECT source_chunk_id, target_chunk_id, type
150
+ FROM chunk_relationships
151
+ WHERE source_chunk_id = ? OR target_chunk_id = ?
152
+ `).all(chunkId, chunkId);
153
+ return rows.map(r => ({
154
+ sourceChunkId: String(r.source_chunk_id),
155
+ targetChunkId: String(r.target_chunk_id),
156
+ type: r.type,
157
+ }));
158
+ }
159
+ countChunks(snapshotId) {
160
+ const raw = this.db.getRawDb();
161
+ if (snapshotId) {
162
+ const row = raw.prepare('SELECT COUNT(*) as count FROM chunks WHERE snapshot_id = ?').get(snapshotId);
163
+ return row?.count || 0;
164
+ }
165
+ const row = raw.prepare('SELECT COUNT(*) as count FROM chunks').get();
166
+ return row?.count || 0;
167
+ }
168
+ searchChunksFts(query, options = {}) {
169
+ if (!this.db.isFtsAvailable()) {
170
+ return [];
171
+ }
172
+ const raw = this.db.getRawDb();
173
+ const limit = options.limit || 20;
174
+ // Sanitize query for FTS5: strip dangerous punctuation, quote bare words or phrases
175
+ const cleanTokens = query
176
+ .replace(/[^\w\s-]/g, ' ')
177
+ .trim()
178
+ .split(/\s+/)
179
+ .filter(t => t.length > 0);
180
+ if (cleanTokens.length === 0) {
181
+ return [];
182
+ }
183
+ // Use OR-joined quoted tokens or phrase search
184
+ const sanitizedFtsQuery = cleanTokens.map(t => `"${t.replace(/"/g, '""')}"`).join(' OR ');
185
+ try {
186
+ let sql = `
187
+ SELECT c.*, fts.rank as fts_rank
188
+ FROM chunks c
189
+ JOIN chunks_fts fts ON c.id = fts.chunk_id
190
+ WHERE chunks_fts MATCH ?
191
+ `;
192
+ const params = [sanitizedFtsQuery];
193
+ if (options.snapshotId) {
194
+ sql += ' AND c.snapshot_id = ?';
195
+ params.push(options.snapshotId);
196
+ }
197
+ if (options.chunkType) {
198
+ sql += ' AND c.chunk_type = ?';
199
+ params.push(options.chunkType);
200
+ }
201
+ if (options.docVersion) {
202
+ sql += ' AND c.doc_version = ?';
203
+ params.push(options.docVersion);
204
+ }
205
+ sql += ' ORDER BY fts.rank LIMIT ?';
206
+ params.push(limit);
207
+ const rows = raw.prepare(sql).all(...params);
208
+ return rows.map(r => {
209
+ const chunk = this.hydrateChunk(r);
210
+ return {
211
+ chunk,
212
+ ftsRank: Number(r.fts_rank),
213
+ symbols: this.getChunkSymbols(chunk.id),
214
+ codeSnippets: this.getChunkCode(chunk.id),
215
+ };
216
+ });
217
+ }
218
+ catch {
219
+ return [];
220
+ }
221
+ }
222
+ hydrateChunk(row) {
223
+ const sectionPath = row.section_path_json ? JSON.parse(String(row.section_path_json)) : [];
224
+ const provenance = row.provenance_json
225
+ ? JSON.parse(String(row.provenance_json))
226
+ : {
227
+ sourceUrl: '',
228
+ targetUrl: '',
229
+ fetchedAt: String(row.created_at || ''),
230
+ discoveredBy: 'direct',
231
+ contentHash: String(row.content_hash || ''),
232
+ snapshotId: String(row.snapshot_id || ''),
233
+ };
234
+ return {
235
+ id: String(row.id),
236
+ pageId: String(row.page_id),
237
+ snapshotId: String(row.snapshot_id),
238
+ title: row.title ? String(row.title) : undefined,
239
+ sectionPath,
240
+ content: String(row.content),
241
+ chunkType: row.chunk_type,
242
+ language: row.language ? String(row.language) : undefined,
243
+ tokenEstimate: Number(row.token_estimate),
244
+ ordinal: Number(row.ordinal),
245
+ contentHash: String(row.content_hash),
246
+ docVersion: row.doc_version ? String(row.doc_version) : undefined,
247
+ provenance,
248
+ };
249
+ }
250
+ }
@@ -0,0 +1,16 @@
1
+ import type { IndexedExample } from '../../../shared/src/index.ts';
2
+ import type { DocOrbitDb } from '../db.ts';
3
+ import type { IExampleRepository } from '../interfaces.ts';
4
+ export declare class ExampleRepository implements IExampleRepository {
5
+ private db;
6
+ constructor(db: DocOrbitDb);
7
+ saveIndexedExamples(examples: IndexedExample[]): void;
8
+ getIndexedExamplesBySnapshot(snapshotId: string): IndexedExample[];
9
+ searchIndexedExamples(query: string, options?: {
10
+ language?: string;
11
+ framework?: string;
12
+ docVersion?: string;
13
+ limit?: number;
14
+ }): IndexedExample[];
15
+ private hydrateIndexedExample;
16
+ }
@@ -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
+ }