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
@@ -1,102 +0,0 @@
1
- export interface JsonRpcRequest {
2
- jsonrpc: '2.0';
3
- id?: string | number | null;
4
- method: string;
5
- params?: Record<string, unknown>;
6
- }
7
-
8
- export interface JsonRpcResponse {
9
- jsonrpc: '2.0';
10
- id: string | number | null;
11
- result?: unknown;
12
- error?: JsonRpcErrorObject;
13
- }
14
-
15
- export interface JsonRpcNotification {
16
- jsonrpc: '2.0';
17
- method: string;
18
- params?: Record<string, unknown>;
19
- }
20
-
21
- export interface JsonRpcErrorObject {
22
- code: number;
23
- message: string;
24
- data?: unknown;
25
- }
26
-
27
- export const JSONRPC_ERRORS = {
28
- PARSE_ERROR: -32700,
29
- INVALID_REQUEST: -32600,
30
- METHOD_NOT_FOUND: -32601,
31
- INVALID_PARAMS: -32602,
32
- INTERNAL_ERROR: -32603,
33
- } as const;
34
-
35
- export interface ToolInputSchema {
36
- type: 'object';
37
- properties: Record<string, {
38
- type: string;
39
- description: string;
40
- items?: Record<string, unknown>;
41
- enum?: string[];
42
- default?: unknown;
43
- }>;
44
- required?: string[];
45
- }
46
-
47
- export interface McpTool {
48
- name: string;
49
- description: string;
50
- inputSchema: ToolInputSchema;
51
- }
52
-
53
- export interface ToolContentItem {
54
- type: 'text';
55
- text: string;
56
- }
57
-
58
- export interface CallToolResult {
59
- content: ToolContentItem[];
60
- isError?: boolean;
61
- }
62
-
63
- export interface McpResource {
64
- uri: string;
65
- name: string;
66
- description?: string;
67
- mimeType?: string;
68
- }
69
-
70
- export interface ResourceContent {
71
- uri: string;
72
- mimeType?: string;
73
- text?: string;
74
- blob?: string;
75
- }
76
-
77
- export interface ReadResourceResult {
78
- contents: ResourceContent[];
79
- }
80
-
81
- export interface ServerCapabilities {
82
- tools?: {
83
- listChanged?: boolean;
84
- };
85
- resources?: {
86
- subscribe?: boolean;
87
- listChanged?: boolean;
88
- };
89
- prompts?: {
90
- listChanged?: boolean;
91
- };
92
- logging?: Record<string, unknown>;
93
- }
94
-
95
- export interface InitializeResult {
96
- protocolVersion: string;
97
- serverInfo: {
98
- name: string;
99
- version: string;
100
- };
101
- capabilities: ServerCapabilities;
102
- }
@@ -1,240 +0,0 @@
1
- import { createHash } from 'node:crypto';
2
- import type {
3
- NormalizedPage,
4
- DocumentChunk,
5
- IndexedExample,
6
- SourceAuthority,
7
- Provenance,
8
- } from '../../shared/src/index.ts';
9
-
10
- const FRAMEWORK_PATTERNS: Array<{ framework: string; pattern: RegExp }> = [
11
- { framework: 'next', pattern: /(?:from\s+['"]next(?:\/.*)?['"]|require\(['"]next(?:\/.*)?['"]\)|'use client'|'use server')/i },
12
- { framework: 'react', pattern: /(?:from\s+['"]react['"]|require\(['"]react['"]\)|useState|useEffect|useMemo|useCallback)/ },
13
- { framework: 'express', pattern: /(?:from\s+['"]express['"]|require\(['"]express['"]\)|express\(\))/i },
14
- { framework: 'fastify', pattern: /(?:from\s+['"]fastify['"]|require\(['"]fastify['"]\))/i },
15
- { framework: 'hono', pattern: /(?:from\s+['"]hono['"]|require\(['"]hono['"]\))/i },
16
- { framework: 'vue', pattern: /(?:from\s+['"]vue['"]|createApp\(|defineComponent)/i },
17
- { framework: 'svelte', pattern: /(?:from\s+['"]svelte['"]|<script.*lang=["']ts["']>)/i },
18
- { framework: 'fastapi', pattern: /(?:from\s+fastapi\s+import|FastAPI\()/i },
19
- { framework: 'flask', pattern: /(?:from\s+flask\s+import|Flask\(__name__\))/i },
20
- { framework: 'django', pattern: /(?:from\s+django|django\.)/i },
21
- { framework: 'spring', pattern: /(?:@SpringBootApplication|@RestController|@GetMapping|@PostMapping)/i },
22
- { framework: 'gin', pattern: /(?:github\.com\/gin-gonic\/gin|gin\.Default\(\))/i },
23
- ];
24
-
25
- const API_METHOD_PATH_REGEX = /\b(GET|POST|PUT|DELETE|PATCH)\s+([/\w\-_{}]+)/i;
26
-
27
- /**
28
- * Detects framework from code snippet content.
29
- */
30
- function detectFramework(code: string): string | undefined {
31
- for (const { framework, pattern } of FRAMEWORK_PATTERNS) {
32
- if (pattern.test(code)) {
33
- return framework;
34
- }
35
- }
36
- return undefined;
37
- }
38
-
39
- /**
40
- * Detects an API endpoint reference from code or task context.
41
- */
42
- function detectRelatedApi(code: string, context: string): string | undefined {
43
- // Check context first (e.g. "POST /v1/webhook_endpoints")
44
- const contextMatch = context.match(API_METHOD_PATH_REGEX);
45
- if (contextMatch) {
46
- return `${contextMatch[1].toUpperCase()} ${contextMatch[2]}`;
47
- }
48
-
49
- // Check code
50
- const codeMatch = code.match(API_METHOD_PATH_REGEX);
51
- if (codeMatch) {
52
- return `${codeMatch[1].toUpperCase()} ${codeMatch[2]}`;
53
- }
54
-
55
- // Common client library calls (e.g. fetch('/api/v1/foo', { method: 'POST' }))
56
- const fetchMatch = code.match(/fetch\(\s*['"`]([/\w\-_{}]+)['"`](?:,\s*\{[^}]*method:\s*['"](\w+)['"])?/i);
57
- if (fetchMatch) {
58
- const method = (fetchMatch[2] || 'GET').toUpperCase();
59
- return `${method} ${fetchMatch[1]}`;
60
- }
61
-
62
- // Framework router calls: app.post('/api/webhook', ...) or router.get('/users', ...) or @app.post('/webhook')
63
- const routeMatch = code.match(/(?:app|router)\.(get|post|put|delete|patch)\(\s*['"`]([/\w\-_{}]+)['"`]/i);
64
- if (routeMatch) {
65
- return `${routeMatch[1].toUpperCase()} ${routeMatch[2]}`;
66
- }
67
-
68
- // Python decorators: @app.post("/webhook")
69
- const pyRouteMatch = code.match(/@(?:app|router)\.(get|post|put|delete|patch)\(\s*['"`]([/\w\-_{}]+)['"`]/i);
70
- if (pyRouteMatch) {
71
- return `${pyRouteMatch[1].toUpperCase()} ${pyRouteMatch[2]}`;
72
- }
73
-
74
- return undefined;
75
- }
76
-
77
- /**
78
- * Detects a primary symbol or function call from code.
79
- */
80
- function detectRelatedSymbol(code: string): string | undefined {
81
- // Check function declarations
82
- const funcMatch = code.match(/(?:function\s+([a-zA-Z0-9_$]+)|const\s+([a-zA-Z0-9_$]+)\s*=\s*(?:async\s*)?\()/);
83
- if (funcMatch) {
84
- return funcMatch[1] || funcMatch[2];
85
- }
86
-
87
- // Check class declarations
88
- const classMatch = code.match(/class\s+([a-zA-Z0-9_$]+)/);
89
- if (classMatch) {
90
- return classMatch[1];
91
- }
92
-
93
- // Check prominent method invocations, ignoring routing boilerplate like app.post or res.json
94
- const boilerplateCalls = new Set([
95
- 'app.get', 'app.post', 'app.put', 'app.delete', 'app.use',
96
- 'router.get', 'router.post', 'router.use',
97
- 'express.raw', 'express.json', 'express.urlencoded',
98
- 'res.json', 'res.send', 'res.status', 'console.log', 'console.error',
99
- ]);
100
- const allCalls = Array.from(code.matchAll(/([a-zA-Z0-9_$]+(?:\.[a-zA-Z0-9_$]+)+)\s*\(/g));
101
- for (const match of allCalls) {
102
- if (!boilerplateCalls.has(match[1])) {
103
- return match[1];
104
- }
105
- }
106
- if (allCalls.length > 0) {
107
- return allCalls[0][1];
108
- }
109
-
110
- return undefined;
111
- }
112
-
113
- /**
114
- * Extracts and indexes first-class code examples from normalized pages and chunks.
115
- */
116
- export function extractIndexedExamples(
117
- page: NormalizedPage,
118
- chunks: DocumentChunk[],
119
- authority: SourceAuthority,
120
- docVersion?: string,
121
- snapshotId?: string
122
- ): IndexedExample[] {
123
- const examples: IndexedExample[] = [];
124
- const seenCodeHashes = new Set<string>();
125
- const nowIso = new Date().toISOString();
126
-
127
- // Map each code example in the page to its enclosing chunk
128
- for (const codeExample of page.codeExamples) {
129
- const rawCode = codeExample.code.trim();
130
- if (!rawCode || rawCode.length < 15) continue; // Skip trivial snippets
131
-
132
- const codeHash = createHash('sha256').update(rawCode).digest('hex');
133
- if (seenCodeHashes.has(codeHash)) continue;
134
- seenCodeHashes.add(codeHash);
135
-
136
- // Find the chunk that contains this code snippet
137
- const matchingChunk = chunks.find(c =>
138
- c.chunkType === 'code' && c.content.includes(rawCode)
139
- ) || chunks.find(c => c.content.includes(rawCode));
140
-
141
- // Determine task context from breadcrumbs or headings
142
- let task = '';
143
- if (matchingChunk && matchingChunk.sectionPath.length > 0) {
144
- task = matchingChunk.sectionPath.join(' > ');
145
- } else if (matchingChunk && matchingChunk.title) {
146
- task = matchingChunk.title;
147
- } else {
148
- task = page.title;
149
- }
150
-
151
- const language = (codeExample.language || (matchingChunk?.language) || 'typescript').toLowerCase();
152
- const framework = detectFramework(rawCode);
153
- const relatedApi = detectRelatedApi(rawCode, task);
154
- const relatedSymbol = detectRelatedSymbol(rawCode);
155
-
156
- const exampleId = createHash('sha256')
157
- .update(`${page.id}:${codeHash}`)
158
- .digest('hex')
159
- .substring(0, 16);
160
-
161
- const provenance: Provenance = {
162
- sourceUrl: page.url,
163
- retrievedAt: page.metadata?.extractedAt || nowIso,
164
- sourceAuthority: authority,
165
- };
166
-
167
- const effectiveSnapshotId = snapshotId || matchingChunk?.snapshotId || (page as any).snapshotId || 'snap_default';
168
-
169
- examples.push({
170
- id: exampleId,
171
- chunkId: matchingChunk?.id,
172
- pageId: page.id,
173
- snapshotId: effectiveSnapshotId,
174
- language,
175
- framework,
176
- task,
177
- code: rawCode,
178
- sourceUrl: page.url,
179
- sourceAuthority: authority,
180
- relatedApi,
181
- relatedSymbol,
182
- docVersion: docVersion || page.docVersion,
183
- provenance,
184
- createdAt: nowIso,
185
- });
186
- }
187
-
188
- // Also check chunks of type 'code' that might not have been caught in page.codeExamples
189
- for (const chunk of chunks) {
190
- if (chunk.chunkType !== 'code') continue;
191
- const rawCode = chunk.content.trim();
192
- if (!rawCode || rawCode.length < 15) continue;
193
-
194
- const codeHash = createHash('sha256').update(rawCode).digest('hex');
195
- if (seenCodeHashes.has(codeHash)) continue;
196
- seenCodeHashes.add(codeHash);
197
-
198
- const task = chunk.sectionPath.length > 0
199
- ? chunk.sectionPath.join(' > ')
200
- : (chunk.title || page.title);
201
-
202
- const language = (chunk.language || 'typescript').toLowerCase();
203
- const framework = detectFramework(rawCode);
204
- const relatedApi = detectRelatedApi(rawCode, task);
205
- const relatedSymbol = detectRelatedSymbol(rawCode);
206
-
207
- const exampleId = createHash('sha256')
208
- .update(`${page.id}:${codeHash}`)
209
- .digest('hex')
210
- .substring(0, 16);
211
-
212
- const provenance: Provenance = {
213
- sourceUrl: page.url,
214
- retrievedAt: page.metadata?.extractedAt || nowIso,
215
- sourceAuthority: authority,
216
- };
217
-
218
- const effectiveSnapshotId = snapshotId || chunk.snapshotId || (page as any).snapshotId || 'snap_default';
219
-
220
- examples.push({
221
- id: exampleId,
222
- chunkId: chunk.id,
223
- pageId: page.id,
224
- snapshotId: effectiveSnapshotId,
225
- language,
226
- framework,
227
- task,
228
- code: rawCode,
229
- sourceUrl: page.url,
230
- sourceAuthority: authority,
231
- relatedApi,
232
- relatedSymbol,
233
- docVersion: docVersion || chunk.docVersion || page.docVersion,
234
- provenance,
235
- createdAt: nowIso,
236
- });
237
- }
238
-
239
- return examples;
240
- }
@@ -1,253 +0,0 @@
1
- import type { Heading, Link, CodeExample } from '../../shared/src/index.ts';
2
-
3
- export interface ExtractedHtmlDoc {
4
- title: string;
5
- markdown: string;
6
- headings: Heading[];
7
- links: Link[];
8
- codeExamples: CodeExample[];
9
- }
10
-
11
- function unescapeHtml(text: string): string {
12
- return text
13
- .replace(/&amp;/g, '&')
14
- .replace(/&lt;/g, '<')
15
- .replace(/&gt;/g, '>')
16
- .replace(/&quot;/g, '"')
17
- .replace(/&#39;/g, "'")
18
- .replace(/&apos;/g, "'")
19
- .replace(/&nbsp;/g, ' ')
20
- .replace(/&#(\d+);/g, (_, code) => String.fromCharCode(Number(code)))
21
- .replace(/&#x([0-9a-fA-F]+);/g, (_, code) => String.fromCharCode(parseInt(code, 16)));
22
- }
23
-
24
- function slugify(text: string): string {
25
- return text
26
- .toLowerCase()
27
- .trim()
28
- .replace(/[^\w\s-]/g, '')
29
- .replace(/[\s_-]+/g, '-')
30
- .replace(/^-+|-+$/g, '');
31
- }
32
-
33
- /**
34
- * Deterministically normalizes HTML documentation into clean Markdown,
35
- * preserving code fences, language tags, headings, tables, callouts, and links.
36
- */
37
- export function normalizeHtmlToMarkdown(html: string, baseUrl: string): ExtractedHtmlDoc {
38
- const headings: Heading[] = [];
39
- const links: Link[] = [];
40
- const codeExamples: CodeExample[] = [];
41
-
42
- let title = '';
43
-
44
- // 1. Extract title from <title> tag if present
45
- const titleMatch = html.match(/<title[^>]*>([\s\S]*?)<\/title>/i);
46
- if (titleMatch) {
47
- title = unescapeHtml(titleMatch[1]).replace(/\s+/g, ' ').trim();
48
- title = title.split(/\s+[|–—-]\s+/)[0].trim();
49
- }
50
-
51
- // 2. Remove non-content / boilerplate tags
52
- let cleaned = html
53
- .replace(/<!--[\s\S]*?-->/g, '')
54
- .replace(/<script\b[^>]*>[\s\S]*?<\/script>/gi, '')
55
- .replace(/<style\b[^>]*>[\s\S]*?<\/style>/gi, '')
56
- .replace(/<noscript\b[^>]*>[\s\S]*?<\/noscript>/gi, '')
57
- .replace(/<svg\b[^>]*>[\s\S]*?<\/svg>/gi, '')
58
- .replace(/<iframe\b[^>]*>[\s\S]*?<\/iframe>/gi, '')
59
- .replace(/<nav\b[^>]*>[\s\S]*?<\/nav>/gi, '')
60
- .replace(/<header\b[^>]*>[\s\S]*?<\/header>/gi, '')
61
- .replace(/<footer\b[^>]*>[\s\S]*?<\/footer>/gi, '')
62
- .replace(/<div\b[^>]*(?:class|id)=["'][^"']*\b(?:sidebar|nav|menu|navbar|footer|cookie-banner|breadcrumbs)\b[^"']*["'][^>]*>[\s\S]*?<\/div>/gi, '');
63
-
64
- // 3. Extract and preserve code blocks
65
- const codeBlockPlaceholders: string[] = [];
66
- cleaned = cleaned.replace(/<pre\b[^>]*>(?:<code\b([^>]*)>)?([\s\S]*?)(?:<\/code>)?<\/pre>/gi, (_, codeAttrs, codeBody) => {
67
- let lang = '';
68
- if (codeAttrs) {
69
- const langMatch = codeAttrs.match(/\b(?:class|data-language)=["'][^"']*\b(?:language-|lang-)?([a-zA-Z0-9_-]+)\b[^"']*["']/i);
70
- if (langMatch && !['hljs', 'code'].includes(langMatch[1].toLowerCase())) {
71
- lang = langMatch[1].toLowerCase();
72
- }
73
- }
74
-
75
- const rawCode = unescapeHtml(codeBody.replace(/<[^>]+>/g, '')).trim();
76
- if (!rawCode) return '';
77
-
78
- const exampleId = `code_${codeExamples.length + 1}`;
79
- codeExamples.push({
80
- id: exampleId,
81
- language: lang || 'text',
82
- code: rawCode,
83
- });
84
-
85
- const placeholder = `__DOCORBIT_CODE_BLOCK_${codeBlockPlaceholders.length}__`;
86
- codeBlockPlaceholders.push(`\n\`\`\`${lang}\n${rawCode}\n\`\`\`\n`);
87
- return placeholder;
88
- });
89
-
90
- // 4. Extract Headings and build anchors
91
- cleaned = cleaned.replace(/<h([1-6])\b([^>]*)>([\s\S]*?)<\/h\1>/gi, (_, levelStr, attrs, innerText) => {
92
- const level = parseInt(levelStr, 10);
93
- const plainText = unescapeHtml(innerText.replace(/<[^>]+>/g, '')).replace(/\s+/g, ' ').trim();
94
- if (!plainText) return '';
95
-
96
- let anchor = '';
97
- const idMatch = attrs.match(/\bid=["']([^"']+)["']/i);
98
- if (idMatch) {
99
- anchor = idMatch[1];
100
- } else {
101
- anchor = slugify(plainText);
102
- }
103
-
104
- headings.push({ level, text: plainText, anchor });
105
- const hashes = '#'.repeat(level);
106
- return `\n\n${hashes} ${plainText}\n\n`;
107
- });
108
-
109
- // Prefer first H1 as title, otherwise fallback to HTML title, then first heading
110
- const h1 = headings.find(h => h.level === 1);
111
- if (h1) {
112
- title = h1.text;
113
- } else if (!title && headings.length > 0) {
114
- title = headings[0].text;
115
- }
116
- if (!title) {
117
- title = 'Documentation Page';
118
- }
119
-
120
- // 5. Extract and normalize Links
121
- cleaned = cleaned.replace(/<a\b[^>]*\bhref=["']([^"']+)["'][^>]*>([\s\S]*?)<\/a>/gi, (_, href, linkText) => {
122
- const text = unescapeHtml(linkText.replace(/<[^>]+>/g, '')).replace(/\s+/g, ' ').trim();
123
- if (!text || href.startsWith('#') || href.startsWith('javascript:')) return text;
124
-
125
- let absoluteUrl = href;
126
- let isExternal = false;
127
- try {
128
- const resolved = new URL(href, baseUrl);
129
- absoluteUrl = resolved.href;
130
- const baseHost = new URL(baseUrl).hostname;
131
- isExternal = resolved.hostname !== baseHost;
132
- } catch {
133
- // Keep raw href
134
- }
135
-
136
- links.push({
137
- text,
138
- url: absoluteUrl,
139
- isExternal,
140
- });
141
-
142
- return `[${text}](${absoluteUrl})`;
143
- });
144
-
145
- // 6. Handle Callouts & Blockquotes
146
- cleaned = cleaned.replace(/<blockquote\b[^>]*>([\s\S]*?)<\/blockquote>/gi, (_, inner) => {
147
- const blockText = inner
148
- .replace(/<p\b[^>]*>/gi, '')
149
- .replace(/<\/p>/gi, '\n')
150
- .replace(/<br\s*\/?>/gi, '\n')
151
- .replace(/<[^>]+>/g, '');
152
- const cleanLines = unescapeHtml(blockText)
153
- .split('\n')
154
- .map(l => l.trim())
155
- .filter(Boolean)
156
- .map(l => `> ${l}`)
157
- .join('\n');
158
- return `\n\n${cleanLines}\n\n`;
159
- });
160
-
161
- cleaned = cleaned.replace(/<div\b[^>]*\bclass=["'][^"']*\b(?:alert|callout|admonition|tip|warning|note|info)\b[^"']*["'][^>]*>([\s\S]*?)<\/div>/gi, (_, inner) => {
162
- const alertText = unescapeHtml(inner.replace(/<[^>]+>/g, ' ')).replace(/\s+/g, ' ').trim();
163
- if (!alertText) return '';
164
- return `\n\n> [!NOTE]\n> ${alertText}\n\n`;
165
- });
166
-
167
- // 7. Handle Tables
168
- cleaned = cleaned.replace(/<table\b[^>]*>([\s\S]*?)<\/table>/gi, (_, tableContent) => {
169
- const rows: string[][] = [];
170
- const rowMatches = tableContent.matchAll(/<tr\b[^>]*>([\s\S]*?)<\/tr>/gi);
171
-
172
- for (const rMatch of rowMatches) {
173
- const rowContent = rMatch[1];
174
- const cells: string[] = [];
175
- const cellMatches = rowContent.matchAll(/<t[hd]\b[^>]*>([\s\S]*?)<\/t[hd]>/gi);
176
- for (const cMatch of cellMatches) {
177
- const cellText = unescapeHtml(cMatch[1].replace(/<[^>]+>/g, '')).replace(/\s+/g, ' ').trim();
178
- cells.push(cellText);
179
- }
180
- if (cells.length > 0) {
181
- rows.push(cells);
182
- }
183
- }
184
-
185
- if (rows.length === 0) return '';
186
-
187
- const colCount = Math.max(...rows.map(r => r.length));
188
- const headerRow = rows[0].map(c => c || '-');
189
- while (headerRow.length < colCount) headerRow.push('-');
190
-
191
- const delimiterRow = Array(colCount).fill('---');
192
- const tableLines = [
193
- `| ${headerRow.join(' | ')} |`,
194
- `| ${delimiterRow.join(' | ')} |`,
195
- ];
196
-
197
- for (let i = 1; i < rows.length; i++) {
198
- const dataRow = rows[i].map(c => c || '');
199
- while (dataRow.length < colCount) dataRow.push('');
200
- tableLines.push(`| ${dataRow.join(' | ')} |`);
201
- }
202
-
203
- return `\n\n${tableLines.join('\n')}\n\n`;
204
- });
205
-
206
- // 8. Handle Lists
207
- cleaned = cleaned
208
- .replace(/<li\b[^>]*>([\s\S]*?)<\/li>/gi, (_, inner) => {
209
- const text = unescapeHtml(inner.replace(/<[^>]+>/g, '')).replace(/\s+/g, ' ').trim();
210
- return `\n- ${text}`;
211
- })
212
- .replace(/<\/?(?:ul|ol)\b[^>]*>/gi, '\n');
213
-
214
- // 9. Handle Inline elements
215
- cleaned = cleaned
216
- .replace(/<code\b[^>]*>([\s\S]*?)<\/code>/gi, (_, inner) => {
217
- const text = unescapeHtml(inner.replace(/<[^>]+>/g, '')).trim();
218
- return text ? `\`${text}\`` : '';
219
- })
220
- .replace(/<(?:strong|b)\b[^>]*>([\s\S]*?)<\/(?:strong|b)>/gi, (_, inner) => {
221
- const text = inner.trim();
222
- return text ? `**${text}**` : '';
223
- })
224
- .replace(/<(?:em|i)\b[^>]*>([\s\S]*?)<\/(?:em|i)>/gi, (_, inner) => {
225
- const text = inner.trim();
226
- return text ? `*${text}*` : '';
227
- })
228
- .replace(/<br\s*\/?>/gi, '\n')
229
- .replace(/<\/?(?:p|div|section|article|main)\b[^>]*>/gi, '\n\n');
230
-
231
- // 10. Strip all remaining HTML tags
232
- cleaned = cleaned.replace(/<[^>]+>/g, '');
233
-
234
- // 11. Restore preserved code blocks
235
- for (let i = 0; i < codeBlockPlaceholders.length; i++) {
236
- cleaned = cleaned.replace(`__DOCORBIT_CODE_BLOCK_${i}__`, codeBlockPlaceholders[i]);
237
- }
238
-
239
- // 12. Normalize whitespace
240
- cleaned = unescapeHtml(cleaned)
241
- .replace(/[ \t]+/g, ' ')
242
- .replace(/\n\s+\n/g, '\n\n')
243
- .replace(/\n{3,}/g, '\n\n')
244
- .trim();
245
-
246
- return {
247
- title,
248
- markdown: cleaned,
249
- headings,
250
- links,
251
- codeExamples,
252
- };
253
- }
@@ -1,83 +0,0 @@
1
- import type { LlmsDocument, LlmsSection, LlmsLink } from '../../shared/src/index.ts';
2
-
3
- export function parseLlmsTxt(content: string, baseUrl: string): LlmsDocument {
4
- const lines = content.split('\n');
5
- let title: string | undefined;
6
- let summary: string | undefined;
7
- const sections: LlmsSection[] = [];
8
- let currentSection: LlmsSection = { name: 'Overview', links: [] };
9
-
10
- const summaryLines: string[] = [];
11
-
12
- for (let i = 0; i < lines.length; i++) {
13
- const rawLine = lines[i];
14
- const line = rawLine.trim();
15
-
16
- if (!line) continue;
17
-
18
- if (line.startsWith('# ') && !title) {
19
- title = line.slice(2).trim();
20
- continue;
21
- }
22
-
23
- if (line.startsWith('>')) {
24
- const text = line.replace(/^>\s*/, '').trim();
25
- if (text) summaryLines.push(text);
26
- continue;
27
- }
28
-
29
- if (line.startsWith('## ')) {
30
- if (currentSection.links.length > 0 || currentSection.name !== 'Overview') {
31
- sections.push(currentSection);
32
- }
33
- currentSection = {
34
- name: line.slice(3).trim(),
35
- links: [],
36
- };
37
- continue;
38
- }
39
-
40
- const linkMatch = line.match(/^[-*]\s+\[([^\]]+)\]\(([^)]+)\)(?::\s*(.*))?$/);
41
- if (linkMatch) {
42
- const linkTitle = linkMatch[1].trim();
43
- let rawHref = linkMatch[2].trim();
44
- const description = linkMatch[3] ? linkMatch[3].trim() : undefined;
45
-
46
- try {
47
- rawHref = new URL(rawHref, baseUrl).href;
48
- } catch {
49
- // Keep raw
50
- }
51
-
52
- const linkItem: LlmsLink = {
53
- title: linkTitle,
54
- url: rawHref,
55
- ...(description ? { description } : {}),
56
- };
57
-
58
- currentSection.links.push(linkItem);
59
- }
60
- }
61
-
62
- if (currentSection.links.length > 0 || sections.length === 0) {
63
- sections.push(currentSection);
64
- }
65
-
66
- if (summaryLines.length > 0) {
67
- summary = summaryLines.join(' ');
68
- }
69
-
70
- return {
71
- title,
72
- summary,
73
- sections,
74
- rawContent: content,
75
- };
76
- }
77
-
78
- export function isValidLlmsTxt(content: string): boolean {
79
- if (!content || typeof content !== 'string') return false;
80
- const hasH1 = /^#\s+.+/m.test(content);
81
- const hasLink = /^[-*]\s+\[.+\]\(.+\)/m.test(content);
82
- return hasH1 && hasLink;
83
- }