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