docorbit 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (405) hide show
  1. package/README.md +29 -15
  2. package/bin/docorbit.js +2 -2
  3. package/dist/apps/cli/src/commands/add.d.ts +7 -0
  4. package/dist/apps/cli/src/commands/add.js +35 -0
  5. package/dist/apps/cli/src/commands/api.d.ts +2 -0
  6. package/dist/apps/cli/src/commands/api.js +35 -0
  7. package/dist/apps/cli/src/commands/context.d.ts +10 -0
  8. package/dist/apps/cli/src/commands/context.js +36 -0
  9. package/dist/apps/cli/src/commands/dashboard.d.ts +8 -0
  10. package/dist/apps/cli/src/commands/dashboard.js +43 -0
  11. package/dist/apps/cli/src/commands/diff.d.ts +2 -0
  12. package/dist/apps/cli/src/commands/diff.js +29 -0
  13. package/dist/apps/cli/src/commands/evaluate.d.ts +11 -0
  14. package/dist/apps/cli/src/commands/evaluate.js +101 -0
  15. package/dist/apps/cli/src/commands/examples.d.ts +2 -0
  16. package/dist/apps/cli/src/commands/examples.js +36 -0
  17. package/dist/apps/cli/src/commands/export.d.ts +11 -0
  18. package/dist/apps/cli/src/commands/export.js +72 -0
  19. package/dist/apps/cli/src/commands/impact.d.ts +2 -0
  20. package/dist/apps/cli/src/commands/impact.js +30 -0
  21. package/dist/apps/cli/src/commands/init.d.ts +5 -0
  22. package/dist/apps/cli/src/commands/init.js +52 -0
  23. package/dist/apps/cli/src/commands/inspect.d.ts +5 -0
  24. package/dist/apps/cli/src/commands/inspect.js +24 -0
  25. package/dist/apps/cli/src/commands/mcp.d.ts +8 -0
  26. package/dist/apps/cli/src/commands/mcp.js +49 -0
  27. package/dist/apps/cli/src/commands/pitfalls.d.ts +2 -0
  28. package/dist/apps/cli/src/commands/pitfalls.js +35 -0
  29. package/dist/apps/cli/src/commands/recipes.d.ts +2 -0
  30. package/dist/apps/cli/src/commands/recipes.js +33 -0
  31. package/dist/apps/cli/src/commands/search.d.ts +11 -0
  32. package/dist/apps/cli/src/commands/search.js +36 -0
  33. package/dist/apps/cli/src/commands/update.d.ts +6 -0
  34. package/dist/apps/cli/src/commands/update.js +53 -0
  35. package/dist/apps/cli/src/commands/verify.d.ts +2 -0
  36. package/dist/apps/cli/src/commands/verify.js +44 -0
  37. package/dist/apps/cli/src/formatters/colors.d.ts +21 -0
  38. package/dist/apps/cli/src/formatters/colors.js +22 -0
  39. package/dist/apps/cli/src/formatters/inspection.d.ts +3 -0
  40. package/dist/apps/cli/src/formatters/inspection.js +88 -0
  41. package/dist/apps/cli/src/formatters/knowledge.d.ts +5 -0
  42. package/dist/apps/cli/src/formatters/knowledge.js +229 -0
  43. package/dist/apps/cli/src/formatters/retrieval.d.ts +3 -0
  44. package/dist/apps/cli/src/formatters/retrieval.js +61 -0
  45. package/{apps/cli/src/formatters/terminal.ts → dist/apps/cli/src/formatters/terminal.d.ts} +0 -1
  46. package/dist/apps/cli/src/formatters/terminal.js +5 -0
  47. package/dist/apps/cli/src/formatters/verification.d.ts +4 -0
  48. package/dist/apps/cli/src/formatters/verification.js +102 -0
  49. package/dist/apps/cli/src/index.d.ts +1 -0
  50. package/dist/apps/cli/src/index.js +376 -0
  51. package/dist/packages/core/src/dashboard/server.d.ts +33 -0
  52. package/dist/packages/core/src/dashboard/server.js +267 -0
  53. package/dist/packages/core/src/dashboard/ui.d.ts +5 -0
  54. package/{packages/core/src/dashboard/ui.ts → dist/packages/core/src/dashboard/ui.js} +2 -2
  55. package/dist/packages/core/src/implementation-service.d.ts +73 -0
  56. package/dist/packages/core/src/implementation-service.js +325 -0
  57. package/{packages/core/src/index.ts → dist/packages/core/src/index.d.ts} +0 -1
  58. package/dist/packages/core/src/index.js +6 -0
  59. package/dist/packages/core/src/inspector.d.ts +22 -0
  60. package/dist/packages/core/src/inspector.js +38 -0
  61. package/dist/packages/core/src/pipeline.d.ts +45 -0
  62. package/dist/packages/core/src/pipeline.js +246 -0
  63. package/dist/packages/crawler/src/config.d.ts +2 -0
  64. package/dist/packages/crawler/src/config.js +10 -0
  65. package/dist/packages/crawler/src/fetcher.d.ts +31 -0
  66. package/dist/packages/crawler/src/fetcher.js +139 -0
  67. package/dist/packages/crawler/src/index.js +2 -0
  68. package/dist/packages/discovery/src/index.d.ts +11 -0
  69. package/dist/packages/discovery/src/index.js +29 -0
  70. package/dist/packages/discovery/src/provider.d.ts +12 -0
  71. package/dist/packages/discovery/src/provider.js +30 -0
  72. package/dist/packages/discovery/src/providers/generic.d.ts +7 -0
  73. package/dist/packages/discovery/src/providers/generic.js +94 -0
  74. package/dist/packages/discovery/src/providers/github.d.ts +7 -0
  75. package/dist/packages/discovery/src/providers/github.js +52 -0
  76. package/dist/packages/discovery/src/providers/llms-txt.d.ts +7 -0
  77. package/dist/packages/discovery/src/providers/llms-txt.js +60 -0
  78. package/dist/packages/discovery/src/providers/markdown.d.ts +7 -0
  79. package/dist/packages/discovery/src/providers/markdown.js +38 -0
  80. package/dist/packages/discovery/src/providers/openapi.d.ts +7 -0
  81. package/dist/packages/discovery/src/providers/openapi.js +77 -0
  82. package/dist/packages/discovery/src/providers/sitemap.d.ts +7 -0
  83. package/dist/packages/discovery/src/providers/sitemap.js +53 -0
  84. package/dist/packages/discovery/src/providers/skill.d.ts +7 -0
  85. package/dist/packages/discovery/src/providers/skill.js +46 -0
  86. package/dist/packages/discovery/src/ranker.d.ts +6 -0
  87. package/dist/packages/discovery/src/ranker.js +107 -0
  88. package/dist/packages/evaluation/src/dataset.d.ts +2 -0
  89. package/dist/packages/evaluation/src/dataset.js +944 -0
  90. package/dist/packages/evaluation/src/index.js +8 -0
  91. package/dist/packages/evaluation/src/runner.d.ts +7 -0
  92. package/dist/packages/evaluation/src/runner.js +196 -0
  93. package/dist/packages/evaluation/src/strategies/context7-runner.d.ts +24 -0
  94. package/dist/packages/evaluation/src/strategies/context7-runner.js +229 -0
  95. package/dist/packages/evaluation/src/strategies/docorbit-runner.d.ts +5 -0
  96. package/dist/packages/evaluation/src/strategies/docorbit-runner.js +210 -0
  97. package/dist/packages/evaluation/src/strategies/firecrawl-runner.d.ts +24 -0
  98. package/dist/packages/evaluation/src/strategies/firecrawl-runner.js +151 -0
  99. package/dist/packages/evaluation/src/strategies/web-search-runner.d.ts +32 -0
  100. package/dist/packages/evaluation/src/strategies/web-search-runner.js +161 -0
  101. package/dist/packages/evaluation/src/types.d.ts +15 -0
  102. package/dist/packages/evaluation/src/types.js +1 -0
  103. package/dist/packages/evaluation/src/version-matcher.d.ts +11 -0
  104. package/dist/packages/evaluation/src/version-matcher.js +61 -0
  105. package/dist/packages/export/src/agents-md.d.ts +19 -0
  106. package/dist/packages/export/src/agents-md.js +170 -0
  107. package/dist/packages/export/src/claude-md.d.ts +17 -0
  108. package/dist/packages/export/src/claude-md.js +118 -0
  109. package/dist/packages/export/src/docs-map.d.ts +14 -0
  110. package/dist/packages/export/src/docs-map.js +118 -0
  111. package/dist/packages/export/src/index.js +6 -0
  112. package/dist/packages/export/src/llms-txt.d.ts +15 -0
  113. package/dist/packages/export/src/llms-txt.js +73 -0
  114. package/dist/packages/export/src/service.d.ts +23 -0
  115. package/dist/packages/export/src/service.js +210 -0
  116. package/dist/packages/export/src/skill-md.d.ts +14 -0
  117. package/dist/packages/export/src/skill-md.js +107 -0
  118. package/{packages/mcp/src/index.ts → dist/packages/mcp/src/index.d.ts} +2 -35
  119. package/dist/packages/mcp/src/index.js +6 -0
  120. package/dist/packages/mcp/src/resources/index.d.ts +12 -0
  121. package/dist/packages/mcp/src/resources/index.js +165 -0
  122. package/dist/packages/mcp/src/server.d.ts +30 -0
  123. package/dist/packages/mcp/src/server.js +243 -0
  124. package/dist/packages/mcp/src/tools/analyze-impact.d.ts +6 -0
  125. package/dist/packages/mcp/src/tools/analyze-impact.js +64 -0
  126. package/dist/packages/mcp/src/tools/check-api.d.ts +6 -0
  127. package/dist/packages/mcp/src/tools/check-api.js +74 -0
  128. package/dist/packages/mcp/src/tools/diff-docs.d.ts +6 -0
  129. package/dist/packages/mcp/src/tools/diff-docs.js +58 -0
  130. package/dist/packages/mcp/src/tools/export-context.d.ts +6 -0
  131. package/dist/packages/mcp/src/tools/export-context.js +61 -0
  132. package/dist/packages/mcp/src/tools/find-api.d.ts +6 -0
  133. package/dist/packages/mcp/src/tools/find-api.js +91 -0
  134. package/dist/packages/mcp/src/tools/find-example.d.ts +6 -0
  135. package/dist/packages/mcp/src/tools/find-example.js +92 -0
  136. package/dist/packages/mcp/src/tools/find-pitfall.d.ts +6 -0
  137. package/dist/packages/mcp/src/tools/find-pitfall.js +85 -0
  138. package/dist/packages/mcp/src/tools/find-recipe.d.ts +6 -0
  139. package/dist/packages/mcp/src/tools/find-recipe.js +89 -0
  140. package/dist/packages/mcp/src/tools/get-doc.d.ts +6 -0
  141. package/dist/packages/mcp/src/tools/get-doc.js +118 -0
  142. package/dist/packages/mcp/src/tools/get-docs-map.d.ts +6 -0
  143. package/dist/packages/mcp/src/tools/get-docs-map.js +54 -0
  144. package/dist/packages/mcp/src/tools/get-version.d.ts +6 -0
  145. package/dist/packages/mcp/src/tools/get-version.js +104 -0
  146. package/dist/packages/mcp/src/tools/implementation-context.d.ts +6 -0
  147. package/dist/packages/mcp/src/tools/implementation-context.js +102 -0
  148. package/dist/packages/mcp/src/tools/index.d.ts +19 -0
  149. package/dist/packages/mcp/src/tools/index.js +41 -0
  150. package/dist/packages/mcp/src/tools/ingest-doc.d.ts +6 -0
  151. package/dist/packages/mcp/src/tools/ingest-doc.js +264 -0
  152. package/dist/packages/mcp/src/tools/list-sources.d.ts +6 -0
  153. package/dist/packages/mcp/src/tools/list-sources.js +76 -0
  154. package/dist/packages/mcp/src/tools/search-docs.d.ts +6 -0
  155. package/dist/packages/mcp/src/tools/search-docs.js +113 -0
  156. package/dist/packages/mcp/src/tools/types.d.ts +22 -0
  157. package/dist/packages/mcp/src/tools/types.js +1 -0
  158. package/dist/packages/mcp/src/transports/http.d.ts +31 -0
  159. package/dist/packages/mcp/src/transports/http.js +215 -0
  160. package/dist/packages/mcp/src/transports/stdio.d.ts +22 -0
  161. package/dist/packages/mcp/src/transports/stdio.js +86 -0
  162. package/{packages/mcp/src/transports/types.ts → dist/packages/mcp/src/transports/types.d.ts} +2 -3
  163. package/dist/packages/mcp/src/transports/types.js +1 -0
  164. package/dist/packages/mcp/src/types.d.ts +89 -0
  165. package/dist/packages/mcp/src/types.js +7 -0
  166. package/dist/packages/normalizer/src/example-indexer.d.ts +5 -0
  167. package/dist/packages/normalizer/src/example-indexer.js +200 -0
  168. package/dist/packages/normalizer/src/html.d.ts +13 -0
  169. package/dist/packages/normalizer/src/html.js +221 -0
  170. package/{packages/normalizer/src/index.ts → dist/packages/normalizer/src/index.d.ts} +0 -1
  171. package/dist/packages/normalizer/src/index.js +7 -0
  172. package/dist/packages/normalizer/src/llms.d.ts +3 -0
  173. package/dist/packages/normalizer/src/llms.js +71 -0
  174. package/dist/packages/normalizer/src/openapi/endpoint-parser.d.ts +11 -0
  175. package/dist/packages/normalizer/src/openapi/endpoint-parser.js +357 -0
  176. package/dist/packages/normalizer/src/openapi/schema-resolver.d.ts +10 -0
  177. package/dist/packages/normalizer/src/openapi/schema-resolver.js +82 -0
  178. package/dist/packages/normalizer/src/openapi.js +2 -0
  179. package/dist/packages/normalizer/src/page.d.ts +13 -0
  180. package/dist/packages/normalizer/src/page.js +150 -0
  181. package/dist/packages/normalizer/src/pitfall-extractor.d.ts +6 -0
  182. package/dist/packages/normalizer/src/pitfall-extractor.js +153 -0
  183. package/dist/packages/normalizer/src/slicer.d.ts +30 -0
  184. package/dist/packages/normalizer/src/slicer.js +360 -0
  185. package/dist/packages/retrieval/src/engine.d.ts +17 -0
  186. package/dist/packages/retrieval/src/engine.js +93 -0
  187. package/{packages/retrieval/src/index.ts → dist/packages/retrieval/src/index.d.ts} +0 -1
  188. package/dist/packages/retrieval/src/index.js +6 -0
  189. package/dist/packages/retrieval/src/intent.d.ts +6 -0
  190. package/dist/packages/retrieval/src/intent.js +39 -0
  191. package/dist/packages/retrieval/src/packer.d.ts +2 -0
  192. package/dist/packages/retrieval/src/packer.js +108 -0
  193. package/dist/packages/retrieval/src/recipe-engine.d.ts +18 -0
  194. package/dist/packages/retrieval/src/recipe-engine.js +265 -0
  195. package/dist/packages/retrieval/src/scorer.d.ts +13 -0
  196. package/dist/packages/retrieval/src/scorer.js +110 -0
  197. package/dist/packages/retrieval/src/weights.d.ts +3 -0
  198. package/dist/packages/retrieval/src/weights.js +28 -0
  199. package/dist/packages/security/src/annotations.d.ts +10 -0
  200. package/dist/packages/security/src/annotations.js +100 -0
  201. package/dist/packages/security/src/index.js +2 -0
  202. package/dist/packages/security/src/ssrf.d.ts +17 -0
  203. package/dist/packages/security/src/ssrf.js +132 -0
  204. package/dist/packages/shared/src/errors.d.ts +22 -0
  205. package/dist/packages/shared/src/errors.js +44 -0
  206. package/dist/packages/shared/src/hashing.d.ts +3 -0
  207. package/dist/packages/shared/src/hashing.js +21 -0
  208. package/dist/packages/shared/src/index.js +3 -0
  209. package/dist/packages/shared/src/types.d.ts +715 -0
  210. package/dist/packages/shared/src/types.js +1 -0
  211. package/dist/packages/storage/src/db.d.ts +11 -0
  212. package/dist/packages/storage/src/db.js +128 -0
  213. package/dist/packages/storage/src/index.js +10 -0
  214. package/dist/packages/storage/src/interfaces.d.ts +83 -0
  215. package/dist/packages/storage/src/interfaces.js +1 -0
  216. package/dist/packages/storage/src/repositories/api-repository.d.ts +16 -0
  217. package/dist/packages/storage/src/repositories/api-repository.js +169 -0
  218. package/dist/packages/storage/src/repositories/chunk-repository.d.ts +32 -0
  219. package/dist/packages/storage/src/repositories/chunk-repository.js +250 -0
  220. package/dist/packages/storage/src/repositories/example-repository.d.ts +16 -0
  221. package/dist/packages/storage/src/repositories/example-repository.js +158 -0
  222. package/dist/packages/storage/src/repositories/page-repository.d.ts +16 -0
  223. package/dist/packages/storage/src/repositories/page-repository.js +161 -0
  224. package/dist/packages/storage/src/repositories/pitfall-repository.d.ts +15 -0
  225. package/dist/packages/storage/src/repositories/pitfall-repository.js +144 -0
  226. package/dist/packages/storage/src/repositories/source-repository.d.ts +33 -0
  227. package/dist/packages/storage/src/repositories/source-repository.js +153 -0
  228. package/dist/packages/storage/src/repository.d.ts +92 -0
  229. package/dist/packages/storage/src/repository.js +157 -0
  230. package/dist/packages/storage/src/schema.d.ts +2 -0
  231. package/{packages/storage/src/schema.ts → dist/packages/storage/src/schema.js} +0 -3
  232. package/dist/packages/storage/src/search-tokens.d.ts +6 -0
  233. package/dist/packages/storage/src/search-tokens.js +26 -0
  234. package/dist/packages/verification/src/diff-engine.d.ts +18 -0
  235. package/dist/packages/verification/src/diff-engine.js +218 -0
  236. package/dist/packages/verification/src/extractor.d.ts +29 -0
  237. package/dist/packages/verification/src/extractor.js +302 -0
  238. package/dist/packages/verification/src/impact-scanner.d.ts +9 -0
  239. package/dist/packages/verification/src/impact-scanner.js +181 -0
  240. package/dist/packages/verification/src/index.js +5 -0
  241. package/dist/packages/verification/src/services.d.ts +55 -0
  242. package/dist/packages/verification/src/services.js +189 -0
  243. package/dist/packages/verification/src/verifier.d.ts +15 -0
  244. package/dist/packages/verification/src/verifier.js +315 -0
  245. package/dist/packages/workspace/src/detector.d.ts +7 -0
  246. package/dist/packages/workspace/src/detector.js +117 -0
  247. package/dist/packages/workspace/src/ecosystems/cargo.d.ts +10 -0
  248. package/dist/packages/workspace/src/ecosystems/cargo.js +69 -0
  249. package/dist/packages/workspace/src/ecosystems/composer.d.ts +7 -0
  250. package/dist/packages/workspace/src/ecosystems/composer.js +40 -0
  251. package/dist/packages/workspace/src/ecosystems/go.d.ts +7 -0
  252. package/dist/packages/workspace/src/ecosystems/go.js +49 -0
  253. package/{packages/workspace/src/ecosystems/index.ts → dist/packages/workspace/src/ecosystems/index.d.ts} +2 -24
  254. package/dist/packages/workspace/src/ecosystems/index.js +21 -0
  255. package/dist/packages/workspace/src/ecosystems/maven.d.ts +7 -0
  256. package/dist/packages/workspace/src/ecosystems/maven.js +28 -0
  257. package/dist/packages/workspace/src/ecosystems/npm.d.ts +10 -0
  258. package/dist/packages/workspace/src/ecosystems/npm.js +73 -0
  259. package/dist/packages/workspace/src/ecosystems/pub.d.ts +7 -0
  260. package/dist/packages/workspace/src/ecosystems/pub.js +34 -0
  261. package/dist/packages/workspace/src/ecosystems/pypi.d.ts +9 -0
  262. package/dist/packages/workspace/src/ecosystems/pypi.js +94 -0
  263. package/dist/packages/workspace/src/ecosystems/rubygems.d.ts +7 -0
  264. package/dist/packages/workspace/src/ecosystems/rubygems.js +25 -0
  265. package/dist/packages/workspace/src/ecosystems/types.d.ts +9 -0
  266. package/dist/packages/workspace/src/ecosystems/types.js +1 -0
  267. package/dist/packages/workspace/src/index.js +5 -0
  268. package/dist/packages/workspace/src/lockfile.d.ts +21 -0
  269. package/dist/packages/workspace/src/lockfile.js +153 -0
  270. package/dist/packages/workspace/src/resolver.d.ts +39 -0
  271. package/dist/packages/workspace/src/resolver.js +164 -0
  272. package/dist/packages/workspace/src/semver.d.ts +33 -0
  273. package/dist/packages/workspace/src/semver.js +235 -0
  274. package/package.json +13 -9
  275. package/apps/cli/bin/docorbit.js +0 -8
  276. package/apps/cli/src/commands/add.ts +0 -44
  277. package/apps/cli/src/commands/api.ts +0 -38
  278. package/apps/cli/src/commands/context.ts +0 -47
  279. package/apps/cli/src/commands/dashboard.ts +0 -55
  280. package/apps/cli/src/commands/diff.ts +0 -30
  281. package/apps/cli/src/commands/evaluate.ts +0 -133
  282. package/apps/cli/src/commands/examples.ts +0 -39
  283. package/apps/cli/src/commands/export.ts +0 -89
  284. package/apps/cli/src/commands/impact.ts +0 -31
  285. package/apps/cli/src/commands/init.ts +0 -69
  286. package/apps/cli/src/commands/inspect.ts +0 -30
  287. package/apps/cli/src/commands/mcp.ts +0 -72
  288. package/apps/cli/src/commands/pitfalls.ts +0 -38
  289. package/apps/cli/src/commands/recipes.ts +0 -35
  290. package/apps/cli/src/commands/search.ts +0 -48
  291. package/apps/cli/src/commands/update.ts +0 -73
  292. package/apps/cli/src/commands/verify.ts +0 -48
  293. package/apps/cli/src/formatters/colors.ts +0 -23
  294. package/apps/cli/src/formatters/inspection.ts +0 -102
  295. package/apps/cli/src/formatters/knowledge.ts +0 -272
  296. package/apps/cli/src/formatters/retrieval.ts +0 -74
  297. package/apps/cli/src/formatters/verification.ts +0 -126
  298. package/apps/cli/src/index.ts +0 -409
  299. package/packages/core/src/dashboard/server.ts +0 -314
  300. package/packages/core/src/implementation-service.ts +0 -451
  301. package/packages/core/src/inspector.ts +0 -71
  302. package/packages/core/src/pipeline.ts +0 -331
  303. package/packages/crawler/src/config.ts +0 -12
  304. package/packages/crawler/src/fetcher.ts +0 -185
  305. package/packages/discovery/src/index.ts +0 -31
  306. package/packages/discovery/src/provider.ts +0 -47
  307. package/packages/discovery/src/providers/generic.ts +0 -98
  308. package/packages/discovery/src/providers/github.ts +0 -61
  309. package/packages/discovery/src/providers/llms-txt.ts +0 -73
  310. package/packages/discovery/src/providers/markdown.ts +0 -48
  311. package/packages/discovery/src/providers/openapi.ts +0 -91
  312. package/packages/discovery/src/providers/sitemap.ts +0 -62
  313. package/packages/discovery/src/providers/skill.ts +0 -54
  314. package/packages/discovery/src/ranker.ts +0 -123
  315. package/packages/evaluation/src/dataset.ts +0 -963
  316. package/packages/evaluation/src/runner.ts +0 -241
  317. package/packages/evaluation/src/strategies/context7-runner.ts +0 -269
  318. package/packages/evaluation/src/strategies/docorbit-runner.ts +0 -228
  319. package/packages/evaluation/src/strategies/firecrawl-runner.ts +0 -172
  320. package/packages/evaluation/src/strategies/web-search-runner.ts +0 -194
  321. package/packages/evaluation/src/types.ts +0 -34
  322. package/packages/evaluation/src/version-matcher.ts +0 -73
  323. package/packages/export/src/agents-md.ts +0 -200
  324. package/packages/export/src/claude-md.ts +0 -141
  325. package/packages/export/src/docs-map.ts +0 -150
  326. package/packages/export/src/llms-txt.ts +0 -96
  327. package/packages/export/src/service.ts +0 -250
  328. package/packages/export/src/skill-md.ts +0 -128
  329. package/packages/mcp/src/resources/index.ts +0 -189
  330. package/packages/mcp/src/server.ts +0 -278
  331. package/packages/mcp/src/tools/analyze-impact.ts +0 -74
  332. package/packages/mcp/src/tools/check-api.ts +0 -86
  333. package/packages/mcp/src/tools/diff-docs.ts +0 -68
  334. package/packages/mcp/src/tools/export-context.ts +0 -73
  335. package/packages/mcp/src/tools/find-api.ts +0 -99
  336. package/packages/mcp/src/tools/find-example.ts +0 -100
  337. package/packages/mcp/src/tools/find-pitfall.ts +0 -94
  338. package/packages/mcp/src/tools/find-recipe.ts +0 -98
  339. package/packages/mcp/src/tools/get-doc.ts +0 -130
  340. package/packages/mcp/src/tools/get-docs-map.ts +0 -64
  341. package/packages/mcp/src/tools/get-version.ts +0 -118
  342. package/packages/mcp/src/tools/implementation-context.ts +0 -88
  343. package/packages/mcp/src/tools/index.ts +0 -59
  344. package/packages/mcp/src/tools/list-sources.ts +0 -85
  345. package/packages/mcp/src/tools/search-docs.ts +0 -123
  346. package/packages/mcp/src/tools/types.ts +0 -28
  347. package/packages/mcp/src/transports/http.ts +0 -256
  348. package/packages/mcp/src/transports/stdio.ts +0 -105
  349. package/packages/mcp/src/types.ts +0 -102
  350. package/packages/normalizer/src/example-indexer.ts +0 -240
  351. package/packages/normalizer/src/html.ts +0 -253
  352. package/packages/normalizer/src/llms.ts +0 -83
  353. package/packages/normalizer/src/openapi/endpoint-parser.ts +0 -406
  354. package/packages/normalizer/src/openapi/schema-resolver.ts +0 -111
  355. package/packages/normalizer/src/page.ts +0 -184
  356. package/packages/normalizer/src/pitfall-extractor.ts +0 -190
  357. package/packages/normalizer/src/slicer.ts +0 -455
  358. package/packages/retrieval/src/engine.ts +0 -120
  359. package/packages/retrieval/src/intent.ts +0 -43
  360. package/packages/retrieval/src/packer.ts +0 -145
  361. package/packages/retrieval/src/recipe-engine.ts +0 -313
  362. package/packages/retrieval/src/scorer.ts +0 -139
  363. package/packages/retrieval/src/weights.ts +0 -31
  364. package/packages/security/src/annotations.ts +0 -112
  365. package/packages/security/src/ssrf.ts +0 -153
  366. package/packages/shared/src/errors.ts +0 -53
  367. package/packages/shared/src/hashing.ts +0 -23
  368. package/packages/shared/src/types.ts +0 -881
  369. package/packages/storage/src/db.ts +0 -72
  370. package/packages/storage/src/interfaces.ts +0 -115
  371. package/packages/storage/src/repositories/api-repository.ts +0 -219
  372. package/packages/storage/src/repositories/chunk-repository.ts +0 -316
  373. package/packages/storage/src/repositories/example-repository.ts +0 -206
  374. package/packages/storage/src/repositories/page-repository.ts +0 -205
  375. package/packages/storage/src/repositories/pitfall-repository.ts +0 -188
  376. package/packages/storage/src/repositories/source-repository.ts +0 -205
  377. package/packages/storage/src/repository.ts +0 -256
  378. package/packages/storage/src/search-tokens.ts +0 -28
  379. package/packages/verification/src/diff-engine.ts +0 -258
  380. package/packages/verification/src/extractor.ts +0 -339
  381. package/packages/verification/src/impact-scanner.ts +0 -203
  382. package/packages/verification/src/services.ts +0 -238
  383. package/packages/verification/src/verifier.ts +0 -375
  384. package/packages/workspace/src/detector.ts +0 -143
  385. package/packages/workspace/src/ecosystems/cargo.ts +0 -84
  386. package/packages/workspace/src/ecosystems/composer.ts +0 -42
  387. package/packages/workspace/src/ecosystems/go.ts +0 -54
  388. package/packages/workspace/src/ecosystems/maven.ts +0 -34
  389. package/packages/workspace/src/ecosystems/npm.ts +0 -83
  390. package/packages/workspace/src/ecosystems/pub.ts +0 -40
  391. package/packages/workspace/src/ecosystems/pypi.ts +0 -100
  392. package/packages/workspace/src/ecosystems/rubygems.ts +0 -30
  393. package/packages/workspace/src/ecosystems/types.ts +0 -18
  394. package/packages/workspace/src/lockfile.ts +0 -194
  395. package/packages/workspace/src/resolver.ts +0 -234
  396. package/packages/workspace/src/semver.ts +0 -259
  397. /package/{packages/crawler/src/index.ts → dist/packages/crawler/src/index.d.ts} +0 -0
  398. /package/{packages/evaluation/src/index.ts → dist/packages/evaluation/src/index.d.ts} +0 -0
  399. /package/{packages/export/src/index.ts → dist/packages/export/src/index.d.ts} +0 -0
  400. /package/{packages/normalizer/src/openapi.ts → dist/packages/normalizer/src/openapi.d.ts} +0 -0
  401. /package/{packages/security/src/index.ts → dist/packages/security/src/index.d.ts} +0 -0
  402. /package/{packages/shared/src/index.ts → dist/packages/shared/src/index.d.ts} +0 -0
  403. /package/{packages/storage/src/index.ts → dist/packages/storage/src/index.d.ts} +0 -0
  404. /package/{packages/verification/src/index.ts → dist/packages/verification/src/index.d.ts} +0 -0
  405. /package/{packages/workspace/src/index.ts → dist/packages/workspace/src/index.d.ts} +0 -0
@@ -0,0 +1,31 @@
1
+ import * as http from 'node:http';
2
+ import type { McpServer } from '../server.ts';
3
+ import type { McpTransport } from './types.ts';
4
+ export interface HttpTransportOptions {
5
+ port?: number;
6
+ host?: string;
7
+ maxBodyBytes?: number;
8
+ noListen?: boolean;
9
+ }
10
+ export declare class StreamableHttpTransport implements McpTransport {
11
+ private port;
12
+ private host;
13
+ private maxBodyBytes;
14
+ private noListen;
15
+ private serverInstance;
16
+ private mcpServer;
17
+ private sseClients;
18
+ private heartbeatTimer;
19
+ constructor(options?: HttpTransportOptions);
20
+ getServerInstance(): http.Server | null;
21
+ dispatch(req: http.IncomingMessage, res: http.ServerResponse): Promise<void>;
22
+ getPort(): number;
23
+ start(server: McpServer): Promise<void>;
24
+ private setCorsHeaders;
25
+ private handleHttpRequest;
26
+ private handleSseConnection;
27
+ private handleMcpPost;
28
+ private readBody;
29
+ private startHeartbeats;
30
+ close(): Promise<void>;
31
+ }
@@ -0,0 +1,215 @@
1
+ import * as http from 'node:http';
2
+ import { JSONRPC_ERRORS } from "../types.js";
3
+ export class StreamableHttpTransport {
4
+ port;
5
+ host;
6
+ maxBodyBytes;
7
+ noListen;
8
+ serverInstance = null;
9
+ mcpServer = null;
10
+ sseClients = new Set();
11
+ heartbeatTimer = null;
12
+ constructor(options = {}) {
13
+ this.port = options.port ?? 3000;
14
+ this.host = options.host ?? '127.0.0.1';
15
+ this.maxBodyBytes = options.maxBodyBytes ?? 10 * 1024 * 1024; // 10MB
16
+ this.noListen = options.noListen ?? false;
17
+ }
18
+ getServerInstance() {
19
+ return this.serverInstance;
20
+ }
21
+ async dispatch(req, res) {
22
+ return this.handleHttpRequest(req, res);
23
+ }
24
+ getPort() {
25
+ if (this.serverInstance) {
26
+ const addr = this.serverInstance.address();
27
+ if (addr && typeof addr === 'object') {
28
+ return addr.port;
29
+ }
30
+ }
31
+ return this.port;
32
+ }
33
+ async start(server) {
34
+ this.mcpServer = server;
35
+ this.serverInstance = http.createServer((req, res) => {
36
+ this.handleHttpRequest(req, res).catch(err => {
37
+ if (!res.headersSent) {
38
+ res.writeHead(500, { 'Content-Type': 'application/json' });
39
+ res.end(JSON.stringify({ error: err instanceof Error ? err.message : String(err) }));
40
+ }
41
+ });
42
+ });
43
+ if (this.noListen) {
44
+ return;
45
+ }
46
+ return new Promise((resolve, reject) => {
47
+ this.serverInstance.on('error', reject);
48
+ this.serverInstance.listen(this.port, this.host, () => {
49
+ this.startHeartbeats();
50
+ resolve();
51
+ });
52
+ });
53
+ }
54
+ setCorsHeaders(res) {
55
+ res.setHeader('Access-Control-Allow-Origin', '*');
56
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
57
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, Accept');
58
+ }
59
+ async handleHttpRequest(req, res) {
60
+ this.setCorsHeaders(res);
61
+ if (req.method === 'OPTIONS') {
62
+ res.writeHead(204);
63
+ res.end();
64
+ return;
65
+ }
66
+ const url = new URL(req.url || '/', `http://${this.host}:${this.port}`);
67
+ const pathname = url.pathname;
68
+ if (req.method === 'GET' && (pathname === '/health' || pathname === '/')) {
69
+ res.writeHead(200, { 'Content-Type': 'application/json' });
70
+ res.end(JSON.stringify({
71
+ status: 'ok',
72
+ server: 'docorbit-mcp',
73
+ version: '0.5.0',
74
+ endpoints: {
75
+ mcp: '/mcp',
76
+ sse: '/sse',
77
+ health: '/health',
78
+ },
79
+ }));
80
+ return;
81
+ }
82
+ if (req.method === 'GET' && pathname === '/sse') {
83
+ this.handleSseConnection(req, res);
84
+ return;
85
+ }
86
+ if (req.method === 'POST' && pathname === '/mcp') {
87
+ await this.handleMcpPost(req, res);
88
+ return;
89
+ }
90
+ res.writeHead(404, { 'Content-Type': 'application/json' });
91
+ res.end(JSON.stringify({ error: `Not found: ${req.method} ${pathname}` }));
92
+ }
93
+ handleSseConnection(req, res) {
94
+ res.writeHead(200, {
95
+ 'Content-Type': 'text/event-stream',
96
+ 'Cache-Control': 'no-cache',
97
+ 'Connection': 'keep-alive',
98
+ });
99
+ // Send endpoint notification so client knows where to POST messages
100
+ res.write('event: endpoint\ndata: /mcp\n\n');
101
+ this.sseClients.add(res);
102
+ req.on('close', () => {
103
+ this.sseClients.delete(res);
104
+ });
105
+ }
106
+ async handleMcpPost(req, res) {
107
+ const rawBody = await this.readBody(req);
108
+ let parsed;
109
+ try {
110
+ parsed = JSON.parse(rawBody);
111
+ }
112
+ catch {
113
+ res.writeHead(400, { 'Content-Type': 'application/json' });
114
+ res.end(JSON.stringify({
115
+ jsonrpc: '2.0',
116
+ id: null,
117
+ error: {
118
+ code: JSONRPC_ERRORS.PARSE_ERROR,
119
+ message: 'Parse error: invalid JSON payload.',
120
+ },
121
+ }));
122
+ return;
123
+ }
124
+ if (!this.mcpServer) {
125
+ res.writeHead(503, { 'Content-Type': 'application/json' });
126
+ res.end(JSON.stringify({ error: 'Server not initialized' }));
127
+ return;
128
+ }
129
+ let responsePayload;
130
+ if (Array.isArray(parsed)) {
131
+ const responses = await Promise.all(parsed.map(item => this.mcpServer.handleMessage(item)));
132
+ responsePayload = responses.filter(r => r !== null);
133
+ }
134
+ else {
135
+ responsePayload = await this.mcpServer.handleMessage(parsed);
136
+ }
137
+ const acceptHeader = req.headers['accept'] || '';
138
+ const wantsSse = acceptHeader.includes('text/event-stream');
139
+ if (wantsSse) {
140
+ // Modern Streamable HTTP response over SSE chunk
141
+ res.writeHead(200, {
142
+ 'Content-Type': 'text/event-stream',
143
+ 'Cache-Control': 'no-cache',
144
+ 'Connection': 'keep-alive',
145
+ });
146
+ if (responsePayload !== null && responsePayload !== undefined) {
147
+ res.write(`event: message\ndata: ${JSON.stringify(responsePayload)}\n\n`);
148
+ }
149
+ res.end();
150
+ return;
151
+ }
152
+ // Standard JSON response
153
+ if (responsePayload === null || responsePayload === undefined) {
154
+ res.writeHead(204);
155
+ res.end();
156
+ return;
157
+ }
158
+ res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
159
+ res.end(JSON.stringify(responsePayload));
160
+ }
161
+ readBody(req) {
162
+ return new Promise((resolve, reject) => {
163
+ const chunks = [];
164
+ let totalLength = 0;
165
+ req.on('data', chunk => {
166
+ const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
167
+ totalLength += buf.length;
168
+ if (totalLength > this.maxBodyBytes) {
169
+ req.destroy(new Error(`Payload exceeds maximum limit of ${this.maxBodyBytes} bytes`));
170
+ return;
171
+ }
172
+ chunks.push(buf);
173
+ });
174
+ req.on('end', () => {
175
+ resolve(Buffer.concat(chunks).toString('utf-8'));
176
+ });
177
+ req.on('error', reject);
178
+ });
179
+ }
180
+ startHeartbeats() {
181
+ if (this.heartbeatTimer)
182
+ clearInterval(this.heartbeatTimer);
183
+ this.heartbeatTimer = setInterval(() => {
184
+ for (const client of this.sseClients) {
185
+ try {
186
+ client.write(': ping\n\n');
187
+ }
188
+ catch {
189
+ this.sseClients.delete(client);
190
+ }
191
+ }
192
+ }, 15000);
193
+ }
194
+ async close() {
195
+ if (this.heartbeatTimer) {
196
+ clearInterval(this.heartbeatTimer);
197
+ this.heartbeatTimer = null;
198
+ }
199
+ for (const client of this.sseClients) {
200
+ try {
201
+ client.end();
202
+ }
203
+ catch {
204
+ // Continue
205
+ }
206
+ }
207
+ this.sseClients.clear();
208
+ if (this.serverInstance) {
209
+ await new Promise((resolve) => {
210
+ this.serverInstance.close(() => resolve());
211
+ });
212
+ this.serverInstance = null;
213
+ }
214
+ }
215
+ }
@@ -0,0 +1,22 @@
1
+ import type { Readable, Writable } from 'node:stream';
2
+ import type { McpServer } from '../server.ts';
3
+ import type { McpTransport } from './types.ts';
4
+ export interface StdioTransportOptions {
5
+ input?: Readable;
6
+ output?: Writable;
7
+ errorOutput?: Writable;
8
+ }
9
+ export declare class StdioServerTransport implements McpTransport {
10
+ private input;
11
+ private output;
12
+ private errorOutput;
13
+ private rl;
14
+ private server;
15
+ private running;
16
+ constructor(options?: StdioTransportOptions);
17
+ start(server: McpServer): Promise<void>;
18
+ private processLine;
19
+ private send;
20
+ private log;
21
+ close(): Promise<void>;
22
+ }
@@ -0,0 +1,86 @@
1
+ import * as readline from 'node:readline';
2
+ import { JSONRPC_ERRORS } from "../types.js";
3
+ export class StdioServerTransport {
4
+ input;
5
+ output;
6
+ errorOutput;
7
+ rl = null;
8
+ server = null;
9
+ running = false;
10
+ constructor(options = {}) {
11
+ this.input = options.input || process.stdin;
12
+ this.output = options.output || process.stdout;
13
+ this.errorOutput = options.errorOutput || process.stderr;
14
+ }
15
+ async start(server) {
16
+ this.server = server;
17
+ this.running = true;
18
+ this.rl = readline.createInterface({
19
+ input: this.input,
20
+ terminal: false,
21
+ });
22
+ this.log('[DocOrbit MCP] Stdio transport started.');
23
+ this.rl.on('line', async (line) => {
24
+ try {
25
+ await this.processLine(line);
26
+ }
27
+ catch (err) {
28
+ this.log(`[DocOrbit MCP] Stdio error processing line: ${err instanceof Error ? err.message : String(err)}`);
29
+ }
30
+ });
31
+ this.rl.on('close', () => {
32
+ this.running = false;
33
+ this.log('[DocOrbit MCP] Stdio transport stream closed.');
34
+ });
35
+ }
36
+ async processLine(line) {
37
+ let parsed;
38
+ try {
39
+ parsed = JSON.parse(line);
40
+ }
41
+ catch {
42
+ const parseError = {
43
+ jsonrpc: '2.0',
44
+ id: null,
45
+ error: {
46
+ code: JSONRPC_ERRORS.PARSE_ERROR,
47
+ message: 'Parse error: invalid JSON payload.',
48
+ },
49
+ };
50
+ this.send(parseError);
51
+ return;
52
+ }
53
+ if (!this.server)
54
+ return;
55
+ if (Array.isArray(parsed)) {
56
+ // JSON-RPC Batch
57
+ const responses = await Promise.all(parsed.map(item => this.server.handleMessage(item)));
58
+ const filtered = responses.filter(r => r !== null);
59
+ if (filtered.length > 0) {
60
+ this.send(filtered);
61
+ }
62
+ return;
63
+ }
64
+ const response = await this.server.handleMessage(parsed);
65
+ if (response !== null) {
66
+ this.send(response);
67
+ }
68
+ }
69
+ send(payload) {
70
+ if (!this.running)
71
+ return;
72
+ const serialized = JSON.stringify(payload) + '\n';
73
+ this.output.write(serialized);
74
+ }
75
+ log(message) {
76
+ // Isolated to stderr to never corrupt stdout JSON-RPC stream
77
+ this.errorOutput.write(`${message}\n`);
78
+ }
79
+ async close() {
80
+ this.running = false;
81
+ if (this.rl) {
82
+ this.rl.close();
83
+ this.rl = null;
84
+ }
85
+ }
86
+ }
@@ -1,6 +1,5 @@
1
1
  import type { McpServer } from '../server.ts';
2
-
3
2
  export interface McpTransport {
4
- start(server: McpServer): Promise<void>;
5
- close(): Promise<void>;
3
+ start(server: McpServer): Promise<void>;
4
+ close(): Promise<void>;
6
5
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -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;