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,10 @@
1
+ import { DatabaseSync } from 'node:sqlite';
2
+ export declare class DocOrbitDb {
3
+ private db;
4
+ private ftsAvailable;
5
+ constructor(dbPath?: string);
6
+ private migrate;
7
+ isFtsAvailable(): boolean;
8
+ getRawDb(): DatabaseSync;
9
+ close(): void;
10
+ }
@@ -0,0 +1,61 @@
1
+ import { DatabaseSync } from 'node:sqlite';
2
+ import { dirname } from 'node:path';
3
+ import { mkdirSync } from 'node:fs';
4
+ import { SCHEMA_SQL, FTS_SCHEMA_SQL } from "./schema.js";
5
+ export class DocOrbitDb {
6
+ db;
7
+ ftsAvailable = false;
8
+ constructor(dbPath = ':memory:') {
9
+ if (dbPath !== ':memory:') {
10
+ mkdirSync(dirname(dbPath), { recursive: true });
11
+ }
12
+ this.db = new DatabaseSync(dbPath);
13
+ // Enable foreign keys
14
+ this.db.exec('PRAGMA foreign_keys = ON;');
15
+ // Enable WAL mode for file-based database for concurrent reads
16
+ if (dbPath !== ':memory:') {
17
+ this.db.exec('PRAGMA journal_mode = WAL;');
18
+ }
19
+ this.migrate();
20
+ }
21
+ migrate() {
22
+ // Base relational tables
23
+ this.db.exec(SCHEMA_SQL);
24
+ // Schema evolution migrations
25
+ try {
26
+ this.db.exec('ALTER TABLE pages ADD COLUMN provenance_json TEXT;');
27
+ }
28
+ catch {
29
+ // Column already exists
30
+ }
31
+ try {
32
+ this.db.exec('ALTER TABLE snapshots ADD COLUMN doc_version TEXT;');
33
+ }
34
+ catch {
35
+ // Column already exists
36
+ }
37
+ try {
38
+ this.db.exec('ALTER TABLE chunks ADD COLUMN doc_version TEXT;');
39
+ }
40
+ catch {
41
+ // Column already exists
42
+ }
43
+ // Test and enable FTS5 virtual table
44
+ try {
45
+ this.db.exec(FTS_SCHEMA_SQL);
46
+ this.ftsAvailable = true;
47
+ }
48
+ catch {
49
+ this.ftsAvailable = false;
50
+ }
51
+ }
52
+ isFtsAvailable() {
53
+ return this.ftsAvailable;
54
+ }
55
+ getRawDb() {
56
+ return this.db;
57
+ }
58
+ close() {
59
+ this.db.close();
60
+ }
61
+ }
@@ -0,0 +1,10 @@
1
+ export * from "./db.js";
2
+ export * from "./schema.js";
3
+ export * from "./repository.js";
4
+ export * from "./search-tokens.js";
5
+ export * from "./repositories/source-repository.js";
6
+ export * from "./repositories/page-repository.js";
7
+ export * from "./repositories/chunk-repository.js";
8
+ export * from "./repositories/api-repository.js";
9
+ export * from "./repositories/example-repository.js";
10
+ export * from "./repositories/pitfall-repository.js";
@@ -0,0 +1,83 @@
1
+ import type { DiscoveredSource, NormalizedPage, DocumentChunk, ChunkCode, SymbolReference, ChunkRelationship, ChunkType, ApiEndpoint, IndexedExample, Pitfall, PitfallKind } from '../../shared/src/index.ts';
2
+ export interface Snapshot {
3
+ id: string;
4
+ sourceId: string;
5
+ hash: string;
6
+ pageCount: number;
7
+ docVersion?: string;
8
+ createdAt: string;
9
+ }
10
+ export interface ISourceRepository {
11
+ saveSource(source: DiscoveredSource): string;
12
+ getSource(id: string): DiscoveredSource | null;
13
+ getSourceByUrl(url: string): DiscoveredSource | null;
14
+ listSources(): DiscoveredSource[];
15
+ createSnapshot(sourceId: string, metadata?: Record<string, unknown>, docVersion?: string): string;
16
+ saveSnapshot(snapshot: Snapshot): void;
17
+ getSnapshot(id: string): Snapshot | null;
18
+ getLatestSnapshot(sourceId: string): Snapshot | null;
19
+ listSnapshots(sourceId: string): Snapshot[];
20
+ linkSnapshotPages(snapshotId: string, pageIds: string[]): void;
21
+ getSnapshotPages(snapshotId: string): NormalizedPage[];
22
+ }
23
+ export interface IPageRepository {
24
+ savePage(page: NormalizedPage): void;
25
+ getPage(id: string): NormalizedPage | null;
26
+ getPageByUrl(normalizedUrl: string): NormalizedPage | null;
27
+ listPages(limit?: number, offset?: number): NormalizedPage[];
28
+ countPages(sourceId?: string): number;
29
+ savePageLinks(pageId: string, targetUrls: string[]): void;
30
+ getPageLinks(pageId: string): string[];
31
+ searchPagesFts(query: string, limit?: number): NormalizedPage[];
32
+ }
33
+ export interface IChunkRepository {
34
+ saveChunks(chunks: DocumentChunk[], relationships?: ChunkRelationship[], codeSnippets?: ChunkCode[], symbols?: SymbolReference[]): void;
35
+ getChunk(id: string): DocumentChunk | null;
36
+ getChunksByPage(pageId: string): DocumentChunk[];
37
+ getChunksBySnapshot(snapshotId: string): DocumentChunk[];
38
+ getChunksByVersion(docVersion: string): DocumentChunk[];
39
+ getChunkCode(chunkId: string): ChunkCode[];
40
+ getChunkSymbols(chunkId: string): SymbolReference[];
41
+ getChunkRelationships(chunkId: string): ChunkRelationship[];
42
+ countChunks(snapshotId?: string): number;
43
+ searchChunksFts(query: string, options?: {
44
+ limit?: number;
45
+ snapshotId?: string;
46
+ chunkType?: ChunkType;
47
+ docVersion?: string;
48
+ }): Array<{
49
+ chunk: DocumentChunk;
50
+ ftsRank: number;
51
+ symbols: SymbolReference[];
52
+ codeSnippets: ChunkCode[];
53
+ }>;
54
+ }
55
+ export interface IApiRepository {
56
+ saveApiEndpoints(endpoints: ApiEndpoint[]): void;
57
+ getApiEndpoint(id: string): ApiEndpoint | null;
58
+ getApiEndpointsBySnapshot(snapshotId: string): ApiEndpoint[];
59
+ searchApiEndpoints(query: string, options?: {
60
+ method?: string;
61
+ docVersion?: string;
62
+ limit?: number;
63
+ }): ApiEndpoint[];
64
+ }
65
+ export interface IExampleRepository {
66
+ saveIndexedExamples(examples: IndexedExample[]): void;
67
+ getIndexedExamplesBySnapshot(snapshotId: string): IndexedExample[];
68
+ searchIndexedExamples(query: string, options?: {
69
+ language?: string;
70
+ framework?: string;
71
+ docVersion?: string;
72
+ limit?: number;
73
+ }): IndexedExample[];
74
+ }
75
+ export interface IPitfallRepository {
76
+ savePitfalls(pitfalls: Pitfall[]): void;
77
+ getPitfallsBySnapshot(snapshotId: string): Pitfall[];
78
+ searchPitfalls(query: string, options?: {
79
+ kind?: PitfallKind;
80
+ docVersion?: string;
81
+ limit?: number;
82
+ }): Pitfall[];
83
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,16 @@
1
+ import type { ApiEndpoint } from '../../../shared/src/index.ts';
2
+ import type { DocOrbitDb } from '../db.ts';
3
+ import type { IApiRepository } from '../interfaces.ts';
4
+ export declare class ApiRepository implements IApiRepository {
5
+ private db;
6
+ constructor(db: DocOrbitDb);
7
+ saveApiEndpoints(endpoints: ApiEndpoint[]): void;
8
+ getApiEndpoint(id: string): ApiEndpoint | null;
9
+ getApiEndpointsBySnapshot(snapshotId: string): ApiEndpoint[];
10
+ searchApiEndpoints(query: string, options?: {
11
+ method?: string;
12
+ docVersion?: string;
13
+ limit?: number;
14
+ }): ApiEndpoint[];
15
+ private hydrateApiEndpoint;
16
+ }
@@ -0,0 +1,169 @@
1
+ import { extractSearchTokens } from "../search-tokens.js";
2
+ export class ApiRepository {
3
+ db;
4
+ constructor(db) {
5
+ this.db = db;
6
+ }
7
+ saveApiEndpoints(endpoints) {
8
+ if (endpoints.length === 0)
9
+ return;
10
+ const raw = this.db.getRawDb();
11
+ const insertEp = raw.prepare(`
12
+ INSERT INTO api_endpoints (
13
+ id, page_id, snapshot_id, method, path, summary, description,
14
+ operation_id, parameters_json, request_schema_json, response_schema_json,
15
+ auth_json, errors_json, pagination_json, deprecated, doc_version,
16
+ provenance_json, created_at
17
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
18
+ ON CONFLICT(id) DO UPDATE SET
19
+ method = excluded.method,
20
+ path = excluded.path,
21
+ summary = excluded.summary,
22
+ description = excluded.description,
23
+ operation_id = excluded.operation_id,
24
+ parameters_json = excluded.parameters_json,
25
+ request_schema_json = excluded.request_schema_json,
26
+ response_schema_json = excluded.response_schema_json,
27
+ auth_json = excluded.auth_json,
28
+ errors_json = excluded.errors_json,
29
+ pagination_json = excluded.pagination_json,
30
+ deprecated = excluded.deprecated,
31
+ doc_version = excluded.doc_version,
32
+ provenance_json = excluded.provenance_json
33
+ `);
34
+ const insertFts = this.db.isFtsAvailable()
35
+ ? raw.prepare(`
36
+ INSERT INTO api_endpoints_fts (endpoint_id, method, path, summary, description, parameters)
37
+ VALUES (?, ?, ?, ?, ?, ?)
38
+ `)
39
+ : null;
40
+ const deleteFts = this.db.isFtsAvailable()
41
+ ? raw.prepare('DELETE FROM api_endpoints_fts WHERE endpoint_id = ?')
42
+ : null;
43
+ raw.exec('BEGIN TRANSACTION;');
44
+ try {
45
+ for (const ep of endpoints) {
46
+ insertEp.run(ep.id, ep.pageId, ep.snapshotId || 'snap_default', ep.method, ep.path, ep.summary || null, ep.description || null, ep.operationId || null, JSON.stringify(ep.parameters || []), ep.requestSchema ? JSON.stringify(ep.requestSchema) : null, ep.responseSchema ? JSON.stringify(ep.responseSchema) : null, ep.auth ? JSON.stringify(ep.auth) : '[]', ep.errors ? JSON.stringify(ep.errors) : '[]', ep.pagination ? JSON.stringify(ep.pagination) : null, ep.deprecated ? 1 : 0, ep.docVersion || null, ep.provenance ? JSON.stringify(ep.provenance) : null, ep.createdAt || new Date().toISOString());
47
+ if (insertFts && deleteFts) {
48
+ deleteFts.run(ep.id);
49
+ const paramNames = (ep.parameters || []).map(p => p.name).join(' ');
50
+ insertFts.run(ep.id, ep.method, ep.path, ep.summary || '', ep.description || '', paramNames);
51
+ }
52
+ }
53
+ raw.exec('COMMIT;');
54
+ }
55
+ catch (err) {
56
+ raw.exec('ROLLBACK;');
57
+ throw err;
58
+ }
59
+ }
60
+ getApiEndpoint(id) {
61
+ const raw = this.db.getRawDb();
62
+ const row = raw.prepare('SELECT * FROM api_endpoints WHERE id = ?').get(id);
63
+ return row ? this.hydrateApiEndpoint(row) : null;
64
+ }
65
+ getApiEndpointsBySnapshot(snapshotId) {
66
+ const raw = this.db.getRawDb();
67
+ const rows = raw.prepare('SELECT * FROM api_endpoints WHERE snapshot_id = ? ORDER BY path, method').all(snapshotId);
68
+ return rows.map(r => this.hydrateApiEndpoint(r));
69
+ }
70
+ searchApiEndpoints(query, options = {}) {
71
+ const raw = this.db.getRawDb();
72
+ const limit = options.limit || 20;
73
+ const cleanQuery = query.trim();
74
+ // Check if query specifies method at start (e.g. "POST /v1/...")
75
+ let effectiveMethod = options.method?.toLowerCase();
76
+ let term = cleanQuery;
77
+ const methodMatch = cleanQuery.match(/^(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\s+(.*)$/i);
78
+ if (methodMatch) {
79
+ effectiveMethod = methodMatch[1].toLowerCase();
80
+ term = methodMatch[2].trim();
81
+ }
82
+ // Try FTS if available and term exists
83
+ if (this.db.isFtsAvailable() && term.length > 0) {
84
+ const cleanTokens = extractSearchTokens(term);
85
+ if (cleanTokens.length > 0) {
86
+ const sanitizedFts = cleanTokens
87
+ .map(t => t.length >= 4 ? `"${t.replace(/"/g, '""')}"*` : `"${t.replace(/"/g, '""')}"`)
88
+ .join(' OR ');
89
+ try {
90
+ let sql = `
91
+ SELECT ep.*, fts.rank as fts_rank
92
+ FROM api_endpoints ep
93
+ JOIN api_endpoints_fts fts ON ep.id = fts.endpoint_id
94
+ WHERE api_endpoints_fts MATCH ?
95
+ `;
96
+ const params = [sanitizedFts];
97
+ if (effectiveMethod) {
98
+ sql += ' AND lower(ep.method) = ?';
99
+ params.push(effectiveMethod);
100
+ }
101
+ if (options.docVersion) {
102
+ sql += ' AND (ep.doc_version = ? OR ep.doc_version IS NULL)';
103
+ params.push(options.docVersion);
104
+ }
105
+ sql += ' ORDER BY fts.rank LIMIT ?';
106
+ params.push(limit);
107
+ const rows = raw.prepare(sql).all(...params);
108
+ if (rows.length > 0) {
109
+ return rows.map(r => this.hydrateApiEndpoint(r));
110
+ }
111
+ }
112
+ catch {
113
+ // Fall through to LIKE search
114
+ }
115
+ }
116
+ }
117
+ // LIKE fallback search
118
+ let sql = 'SELECT * FROM api_endpoints WHERE 1=1';
119
+ const params = [];
120
+ if (effectiveMethod) {
121
+ sql += ' AND lower(method) = ?';
122
+ params.push(effectiveMethod);
123
+ }
124
+ if (options.docVersion) {
125
+ sql += ' AND (doc_version = ? OR doc_version IS NULL)';
126
+ params.push(options.docVersion);
127
+ }
128
+ if (term.length > 0) {
129
+ const tokens = extractSearchTokens(term);
130
+ if (tokens.length > 0) {
131
+ const tokenClauses = tokens.map(() => '(path LIKE ? OR summary LIKE ? OR description LIKE ? OR parameters_json LIKE ?)');
132
+ sql += ` AND (${tokenClauses.join(' OR ')})`;
133
+ for (const t of tokens) {
134
+ const lp = `%${t}%`;
135
+ params.push(lp, lp, lp, lp);
136
+ }
137
+ }
138
+ else {
139
+ return [];
140
+ }
141
+ }
142
+ sql += ' ORDER BY path, method LIMIT ?';
143
+ params.push(limit);
144
+ const rows = raw.prepare(sql).all(...params);
145
+ return rows.map(r => this.hydrateApiEndpoint(r));
146
+ }
147
+ hydrateApiEndpoint(row) {
148
+ return {
149
+ id: String(row.id),
150
+ pageId: String(row.page_id),
151
+ snapshotId: String(row.snapshot_id),
152
+ method: String(row.method),
153
+ path: String(row.path),
154
+ summary: row.summary ? String(row.summary) : undefined,
155
+ description: row.description ? String(row.description) : undefined,
156
+ operationId: row.operation_id ? String(row.operation_id) : undefined,
157
+ parameters: row.parameters_json ? JSON.parse(String(row.parameters_json)) : [],
158
+ requestSchema: row.request_schema_json ? JSON.parse(String(row.request_schema_json)) : undefined,
159
+ responseSchema: row.response_schema_json ? JSON.parse(String(row.response_schema_json)) : undefined,
160
+ auth: row.auth_json ? JSON.parse(String(row.auth_json)) : [],
161
+ errors: row.errors_json ? JSON.parse(String(row.errors_json)) : [],
162
+ pagination: row.pagination_json ? JSON.parse(String(row.pagination_json)) : undefined,
163
+ deprecated: Number(row.deprecated) === 1,
164
+ docVersion: row.doc_version ? String(row.doc_version) : undefined,
165
+ provenance: row.provenance_json ? JSON.parse(String(row.provenance_json)) : undefined,
166
+ createdAt: String(row.created_at),
167
+ };
168
+ }
169
+ }
@@ -0,0 +1,32 @@
1
+ import type { DocumentChunk, ChunkRelationship, ChunkCode, SymbolReference, ChunkType } from '../../../shared/src/index.ts';
2
+ import type { DocOrbitDb } from '../db.ts';
3
+ import type { IChunkRepository } from '../interfaces.ts';
4
+ export declare class ChunkRepository implements IChunkRepository {
5
+ private db;
6
+ constructor(db: DocOrbitDb);
7
+ /**
8
+ * Saves chunks, code snippets, symbols, and relationships in a single atomic transaction.
9
+ * Transactionally synchronizes the FTS5 chunks_fts table with chunks.
10
+ */
11
+ saveChunks(chunks: DocumentChunk[], relationships?: ChunkRelationship[], codeSnippets?: ChunkCode[], symbols?: SymbolReference[]): void;
12
+ getChunk(id: string): DocumentChunk | null;
13
+ getChunksByPage(pageId: string): DocumentChunk[];
14
+ getChunksBySnapshot(snapshotId: string): DocumentChunk[];
15
+ getChunksByVersion(docVersion: string): DocumentChunk[];
16
+ getChunkCode(chunkId: string): ChunkCode[];
17
+ getChunkSymbols(chunkId: string): SymbolReference[];
18
+ getChunkRelationships(chunkId: string): ChunkRelationship[];
19
+ countChunks(snapshotId?: string): number;
20
+ searchChunksFts(query: string, options?: {
21
+ limit?: number;
22
+ snapshotId?: string;
23
+ chunkType?: ChunkType;
24
+ docVersion?: string;
25
+ }): Array<{
26
+ chunk: DocumentChunk;
27
+ ftsRank: number;
28
+ symbols: SymbolReference[];
29
+ codeSnippets: ChunkCode[];
30
+ }>;
31
+ private hydrateChunk;
32
+ }
@@ -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
+ }