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,357 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { resolveJsonPointer, normalizeSchema } from "./schema-resolver.js";
3
+ /**
4
+ * Detects if a document content is an OpenAPI or Swagger specification.
5
+ */
6
+ export function detectOpenApiSpec(content, sourceUrl) {
7
+ if (!content || typeof content !== 'string')
8
+ return null;
9
+ let parsed;
10
+ try {
11
+ parsed = JSON.parse(content);
12
+ }
13
+ catch {
14
+ return null;
15
+ }
16
+ if (typeof parsed !== 'object' || parsed === null)
17
+ return null;
18
+ const openapiVer = typeof parsed.openapi === 'string' ? parsed.openapi : undefined;
19
+ const swaggerVer = typeof parsed.swagger === 'string' ? parsed.swagger : undefined;
20
+ const specVersion = openapiVer || swaggerVer;
21
+ if (!specVersion)
22
+ return null;
23
+ const info = (typeof parsed.info === 'object' && parsed.info !== null)
24
+ ? parsed.info
25
+ : {};
26
+ const title = typeof info.title === 'string' ? info.title : 'Untitled API';
27
+ const description = typeof info.description === 'string' ? info.description : undefined;
28
+ const servers = [];
29
+ if (Array.isArray(parsed.servers)) {
30
+ for (const server of parsed.servers) {
31
+ if (server && typeof server === 'object' && typeof server.url === 'string') {
32
+ servers.push(server.url);
33
+ }
34
+ }
35
+ }
36
+ else if (typeof parsed.host === 'string') {
37
+ const basePath = typeof parsed.basePath === 'string' ? parsed.basePath : '';
38
+ const schemes = Array.isArray(parsed.schemes) ? parsed.schemes : ['https'];
39
+ servers.push(`${schemes[0]}://${parsed.host}${basePath}`);
40
+ }
41
+ let pathCount = 0;
42
+ if (typeof parsed.paths === 'object' && parsed.paths !== null) {
43
+ pathCount = Object.keys(parsed.paths).length;
44
+ }
45
+ return {
46
+ specVersion,
47
+ title,
48
+ description,
49
+ servers,
50
+ pathCount,
51
+ sourceUrl,
52
+ rawJson: parsed,
53
+ };
54
+ }
55
+ /**
56
+ * Parses all API endpoints from an OpenAPI 3.x or Swagger 2.0 specification.
57
+ * Fully deterministic with internal $ref resolution, schema normalization,
58
+ * pagination heuristics, and error detection.
59
+ */
60
+ export function parseOpenApiEndpoints(rawSpec, pageId, snapshotId, sourceUrl, docVersion) {
61
+ let root;
62
+ if (typeof rawSpec === 'string') {
63
+ try {
64
+ root = JSON.parse(rawSpec);
65
+ }
66
+ catch {
67
+ return [];
68
+ }
69
+ }
70
+ else {
71
+ root = rawSpec;
72
+ }
73
+ if (!root || typeof root !== 'object')
74
+ return [];
75
+ const isOpenApi3 = typeof root.openapi === 'string';
76
+ const isSwagger2 = typeof root.swagger === 'string';
77
+ if (!isOpenApi3 && !isSwagger2)
78
+ return [];
79
+ const paths = (typeof root.paths === 'object' && root.paths !== null)
80
+ ? root.paths
81
+ : {};
82
+ const endpoints = [];
83
+ const supportedMethods = new Set(['get', 'post', 'put', 'delete', 'patch', 'head', 'options']);
84
+ // Extract root-level security schemes
85
+ const securitySchemesMap = new Map();
86
+ if (isOpenApi3 && root.components && typeof root.components === 'object') {
87
+ const comps = root.components;
88
+ if (typeof comps.securitySchemes === 'object' && comps.securitySchemes !== null) {
89
+ for (const [name, schemeRaw] of Object.entries(comps.securitySchemes)) {
90
+ if (typeof schemeRaw === 'object' && schemeRaw !== null) {
91
+ const s = schemeRaw;
92
+ securitySchemesMap.set(name, {
93
+ type: s.type || 'http',
94
+ name: typeof s.name === 'string' ? s.name : name,
95
+ in: s.in,
96
+ scheme: typeof s.scheme === 'string' ? s.scheme : undefined,
97
+ bearerFormat: typeof s.bearerFormat === 'string' ? s.bearerFormat : undefined,
98
+ description: typeof s.description === 'string' ? s.description : undefined,
99
+ });
100
+ }
101
+ }
102
+ }
103
+ }
104
+ else if (isSwagger2 && typeof root.securityDefinitions === 'object' && root.securityDefinitions !== null) {
105
+ for (const [name, schemeRaw] of Object.entries(root.securityDefinitions)) {
106
+ if (typeof schemeRaw === 'object' && schemeRaw !== null) {
107
+ const s = schemeRaw;
108
+ const rawType = typeof s.type === 'string' ? s.type : 'apiKey';
109
+ let mappedType = 'apiKey';
110
+ let mappedScheme = undefined;
111
+ if (rawType === 'basic') {
112
+ mappedType = 'http';
113
+ mappedScheme = 'basic';
114
+ }
115
+ else if (rawType === 'oauth2') {
116
+ mappedType = 'oauth2';
117
+ }
118
+ securitySchemesMap.set(name, {
119
+ type: mappedType,
120
+ name: typeof s.name === 'string' ? s.name : name,
121
+ in: s.in,
122
+ scheme: mappedScheme,
123
+ description: typeof s.description === 'string' ? s.description : undefined,
124
+ });
125
+ }
126
+ }
127
+ }
128
+ // Root security fallback
129
+ const rootSecurityReqs = Array.isArray(root.security)
130
+ ? root.security
131
+ : [];
132
+ const nowIso = new Date().toISOString();
133
+ for (const [pathStr, pathItemRaw] of Object.entries(paths)) {
134
+ if (!pathItemRaw || typeof pathItemRaw !== 'object')
135
+ continue;
136
+ const pathItem = pathItemRaw;
137
+ // Common path-level parameters
138
+ const pathCommonParams = Array.isArray(pathItem.parameters) ? pathItem.parameters : [];
139
+ for (const [methodKey, operationRaw] of Object.entries(pathItem)) {
140
+ const method = methodKey.toLowerCase();
141
+ if (!supportedMethods.has(method))
142
+ continue;
143
+ if (!operationRaw || typeof operationRaw !== 'object')
144
+ continue;
145
+ const op = operationRaw;
146
+ // Summary & Description
147
+ const summary = typeof op.summary === 'string' ? op.summary : undefined;
148
+ const description = typeof op.description === 'string' ? op.description : undefined;
149
+ const operationId = typeof op.operationId === 'string' ? op.operationId : undefined;
150
+ const deprecated = Boolean(op.deprecated || pathItem.deprecated);
151
+ // Parameters
152
+ const rawParams = [...pathCommonParams, ...(Array.isArray(op.parameters) ? op.parameters : [])];
153
+ const parameters = [];
154
+ let swaggerBodySchema = undefined;
155
+ for (const pRaw of rawParams) {
156
+ let p = pRaw;
157
+ if (typeof p.$ref === 'string') {
158
+ const resolved = resolveJsonPointer(root, p.$ref);
159
+ if (typeof resolved === 'object' && resolved !== null) {
160
+ p = resolved;
161
+ }
162
+ }
163
+ if (isSwagger2 && p.in === 'body') {
164
+ swaggerBodySchema = p.schema;
165
+ continue;
166
+ }
167
+ const name = typeof p.name === 'string' ? p.name : '';
168
+ const paramIn = (typeof p.in === 'string' ? p.in : 'query');
169
+ const required = paramIn === 'path' ? true : Boolean(p.required);
170
+ const pDesc = typeof p.description === 'string' ? p.description : undefined;
171
+ const pDefault = p.default !== undefined ? p.default : (p.schema && typeof p.schema === 'object' ? p.schema.default : undefined);
172
+ const pExample = p.example !== undefined ? p.example : (p.schema && typeof p.schema === 'object' ? p.schema.example : undefined);
173
+ let pType = typeof p.type === 'string' ? p.type : undefined;
174
+ let pSchema = undefined;
175
+ if (p.schema && typeof p.schema === 'object') {
176
+ pSchema = p.schema;
177
+ if (!pType && typeof pSchema.type === 'string') {
178
+ pType = pSchema.type;
179
+ }
180
+ }
181
+ parameters.push({
182
+ name,
183
+ in: paramIn,
184
+ required,
185
+ type: pType,
186
+ description: pDesc,
187
+ default: pDefault,
188
+ schema: pSchema,
189
+ example: pExample,
190
+ });
191
+ }
192
+ // Request Body
193
+ let requestSchema = undefined;
194
+ if (isOpenApi3 && op.requestBody && typeof op.requestBody === 'object') {
195
+ let rb = op.requestBody;
196
+ if (typeof rb.$ref === 'string') {
197
+ const resolved = resolveJsonPointer(root, rb.$ref);
198
+ if (typeof resolved === 'object' && resolved !== null) {
199
+ rb = resolved;
200
+ }
201
+ }
202
+ if (typeof rb.content === 'object' && rb.content !== null) {
203
+ const content = rb.content;
204
+ // Prefer application/json, fallback to first media type
205
+ const mediaTypeObj = (content['application/json'] || Object.values(content)[0]);
206
+ if (mediaTypeObj && mediaTypeObj.schema) {
207
+ requestSchema = normalizeSchema(mediaTypeObj.schema, root);
208
+ }
209
+ }
210
+ }
211
+ else if (isSwagger2 && swaggerBodySchema) {
212
+ requestSchema = normalizeSchema(swaggerBodySchema, root);
213
+ }
214
+ // Responses & Errors
215
+ const responseSchema = {};
216
+ const errors = [];
217
+ if (typeof op.responses === 'object' && op.responses !== null) {
218
+ for (const [statusCode, resRaw] of Object.entries(op.responses)) {
219
+ let res = resRaw;
220
+ if (typeof res.$ref === 'string') {
221
+ const resolved = resolveJsonPointer(root, res.$ref);
222
+ if (typeof resolved === 'object' && resolved !== null) {
223
+ res = resolved;
224
+ }
225
+ }
226
+ const resDesc = typeof res.description === 'string' ? res.description : '';
227
+ let contentType = undefined;
228
+ let resSchemaObj = undefined;
229
+ let resExample = undefined;
230
+ if (isOpenApi3 && typeof res.content === 'object' && res.content !== null) {
231
+ const content = res.content;
232
+ const ctKey = content['application/json'] ? 'application/json' : Object.keys(content)[0];
233
+ contentType = ctKey;
234
+ const mediaObj = content[ctKey];
235
+ if (mediaObj) {
236
+ resSchemaObj = mediaObj.schema;
237
+ resExample = mediaObj.example || (mediaObj.examples ? Object.values(mediaObj.examples)[0] : undefined);
238
+ }
239
+ }
240
+ else if (isSwagger2) {
241
+ resSchemaObj = res.schema;
242
+ contentType = 'application/json';
243
+ resExample = res.examples ? Object.values(res.examples)[0] : undefined;
244
+ }
245
+ const normalizedResSchema = normalizeSchema(resSchemaObj, root);
246
+ const apiResponse = {
247
+ statusCode,
248
+ description: resDesc,
249
+ contentType,
250
+ schema: normalizedResSchema,
251
+ example: resExample,
252
+ };
253
+ responseSchema[statusCode] = apiResponse;
254
+ // Detect errors
255
+ const isErrorCode = statusCode.startsWith('4') || statusCode.startsWith('5') || statusCode === 'default';
256
+ if (isErrorCode) {
257
+ errors.push({
258
+ statusCode,
259
+ description: resDesc,
260
+ schema: normalizedResSchema,
261
+ example: resExample,
262
+ });
263
+ }
264
+ }
265
+ }
266
+ // Authentication Schemes
267
+ const auth = [];
268
+ const opSecurityReqs = Array.isArray(op.security)
269
+ ? op.security
270
+ : rootSecurityReqs;
271
+ for (const req of opSecurityReqs) {
272
+ if (typeof req !== 'object' || req === null)
273
+ continue;
274
+ for (const schemeName of Object.keys(req)) {
275
+ const found = securitySchemesMap.get(schemeName);
276
+ if (found) {
277
+ // Avoid duplicate schemes
278
+ if (!auth.some(a => a.name === found.name && a.type === found.type)) {
279
+ auth.push(found);
280
+ }
281
+ }
282
+ else {
283
+ auth.push({
284
+ type: 'apiKey',
285
+ name: schemeName,
286
+ });
287
+ }
288
+ }
289
+ }
290
+ // Pagination Heuristics
291
+ let pagination = undefined;
292
+ const paramNames = parameters.map(p => p.name.toLowerCase());
293
+ const cursorParams = paramNames.filter(n => ['starting_after', 'ending_before', 'cursor', 'next_cursor', 'after', 'before'].includes(n));
294
+ const offsetParams = paramNames.filter(n => ['offset', 'skip', 'start'].includes(n));
295
+ const pageParams = paramNames.filter(n => ['page', 'page_number', 'pagenumber'].includes(n));
296
+ const limitParams = paramNames.filter(n => ['limit', 'per_page', 'page_size', 'pagesize', 'count', 'max'].includes(n));
297
+ // Inspect response properties for pagination clues
298
+ const okResponse = responseSchema['200'] || responseSchema['201'];
299
+ const responseProps = okResponse?.schema?.properties ? Object.keys(okResponse.schema.properties) : [];
300
+ const detectedResponseFields = responseProps.filter(prop => ['has_more', 'next_cursor', 'cursor', 'next_page', 'page_info', 'total_count', 'data', 'items', 'results'].includes(prop.toLowerCase()));
301
+ if (cursorParams.length > 0) {
302
+ pagination = {
303
+ type: 'cursor',
304
+ parameters: [...cursorParams, ...limitParams],
305
+ responseFields: detectedResponseFields,
306
+ };
307
+ }
308
+ else if (offsetParams.length > 0) {
309
+ pagination = {
310
+ type: 'offset',
311
+ parameters: [...offsetParams, ...limitParams],
312
+ responseFields: detectedResponseFields,
313
+ };
314
+ }
315
+ else if (pageParams.length > 0) {
316
+ pagination = {
317
+ type: 'page',
318
+ parameters: [...pageParams, ...limitParams],
319
+ responseFields: detectedResponseFields,
320
+ };
321
+ }
322
+ // Deterministic Endpoint ID
323
+ const endpointId = createHash('sha256')
324
+ .update(`${pageId}:${method}:${pathStr}`)
325
+ .digest('hex')
326
+ .substring(0, 16);
327
+ const provenance = sourceUrl
328
+ ? {
329
+ sourceUrl,
330
+ retrievedAt: nowIso,
331
+ sourceAuthority: 'official',
332
+ }
333
+ : undefined;
334
+ endpoints.push({
335
+ id: endpointId,
336
+ pageId,
337
+ snapshotId,
338
+ method: method,
339
+ path: pathStr,
340
+ summary,
341
+ description,
342
+ operationId,
343
+ parameters,
344
+ requestSchema,
345
+ responseSchema,
346
+ auth,
347
+ errors,
348
+ pagination,
349
+ deprecated,
350
+ docVersion,
351
+ provenance,
352
+ createdAt: nowIso,
353
+ });
354
+ }
355
+ }
356
+ return endpoints;
357
+ }
@@ -0,0 +1,10 @@
1
+ import type { ApiSchema } from '../../../shared/src/index.ts';
2
+ /**
3
+ * Resolves a JSON Pointer (e.g. `#/components/schemas/Pet` or `#/definitions/Pet`)
4
+ * within the root document. Handles circular references safely.
5
+ */
6
+ export declare function resolveJsonPointer(root: Record<string, unknown>, pointer: string, visited?: Set<string>): unknown;
7
+ /**
8
+ * Normalizes an OpenAPI / JSON schema object into an ApiSchema model.
9
+ */
10
+ export declare function normalizeSchema(rawSchema: unknown, root: Record<string, unknown>, visited?: Set<string>): ApiSchema | undefined;
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Resolves a JSON Pointer (e.g. `#/components/schemas/Pet` or `#/definitions/Pet`)
3
+ * within the root document. Handles circular references safely.
4
+ */
5
+ export function resolveJsonPointer(root, pointer, visited = new Set()) {
6
+ if (visited.has(pointer)) {
7
+ return { $ref: pointer, description: '[Circular Reference]' };
8
+ }
9
+ visited.add(pointer);
10
+ if (!pointer.startsWith('#/')) {
11
+ return { $ref: pointer, description: '[External Reference]' };
12
+ }
13
+ const parts = pointer.slice(2).split('/').map((part) => part.replace(/~1/g, '/').replace(/~0/g, '~'));
14
+ let current = root;
15
+ for (const part of parts) {
16
+ if (typeof current !== 'object' || current === null) {
17
+ return undefined;
18
+ }
19
+ current = current[part];
20
+ }
21
+ // If the resolved object itself is a reference, resolve further
22
+ if (typeof current === 'object' &&
23
+ current !== null &&
24
+ typeof current.$ref === 'string') {
25
+ return resolveJsonPointer(root, current.$ref, visited);
26
+ }
27
+ return current;
28
+ }
29
+ /**
30
+ * Normalizes an OpenAPI / JSON schema object into an ApiSchema model.
31
+ */
32
+ export function normalizeSchema(rawSchema, root, visited = new Set()) {
33
+ if (!rawSchema || typeof rawSchema !== 'object')
34
+ return undefined;
35
+ let schemaObj = rawSchema;
36
+ if (typeof schemaObj.$ref === 'string') {
37
+ const resolved = resolveJsonPointer(root, schemaObj.$ref, visited);
38
+ if (typeof resolved === 'object' && resolved !== null) {
39
+ schemaObj = resolved;
40
+ }
41
+ }
42
+ const type = typeof schemaObj.type === 'string'
43
+ ? schemaObj.type
44
+ : (Array.isArray(schemaObj.type) ? schemaObj.type.join(' | ') : undefined);
45
+ const description = typeof schemaObj.description === 'string'
46
+ ? schemaObj.description
47
+ : undefined;
48
+ const required = Array.isArray(schemaObj.required)
49
+ ? schemaObj.required.filter((r) => typeof r === 'string')
50
+ : undefined;
51
+ let properties;
52
+ if (typeof schemaObj.properties === 'object' && schemaObj.properties !== null) {
53
+ properties = {};
54
+ for (const [k, v] of Object.entries(schemaObj.properties)) {
55
+ if (typeof v === 'object' && v !== null && typeof v.$ref === 'string') {
56
+ const refResolved = resolveJsonPointer(root, v.$ref, new Set(visited));
57
+ properties[k] = refResolved || v;
58
+ }
59
+ else {
60
+ properties[k] = v;
61
+ }
62
+ }
63
+ }
64
+ let items;
65
+ if (typeof schemaObj.items === 'object' && schemaObj.items !== null) {
66
+ if (typeof schemaObj.items.$ref === 'string') {
67
+ const refResolved = resolveJsonPointer(root, schemaObj.items.$ref, new Set(visited));
68
+ items = refResolved || schemaObj.items;
69
+ }
70
+ else {
71
+ items = schemaObj.items;
72
+ }
73
+ }
74
+ return {
75
+ type,
76
+ properties,
77
+ required,
78
+ description,
79
+ items,
80
+ raw: schemaObj,
81
+ };
82
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./openapi/schema-resolver.js";
2
+ export * from "./openapi/endpoint-parser.js";
@@ -0,0 +1,13 @@
1
+ import type { NormalizedPage } from '../../shared/src/index.ts';
2
+ export interface BuildNormalizedPageInput {
3
+ sourceId: string;
4
+ url: string;
5
+ rawContent: string;
6
+ contentType?: string;
7
+ sourceUrl?: string;
8
+ targetUrl?: string;
9
+ discoveredBy?: string;
10
+ fetchedAt?: string;
11
+ snapshotId?: string;
12
+ }
13
+ export declare function buildNormalizedPage(input: BuildNormalizedPageInput): NormalizedPage;
@@ -0,0 +1,150 @@
1
+ import { computeContentHash, estimateTokenCount, } from "../../shared/src/index.js";
2
+ import { detectSecurityAnnotations } from "../../security/src/index.js";
3
+ import { normalizeHtmlToMarkdown } from "./html.js";
4
+ import { parseLlmsTxt, isValidLlmsTxt } from "./llms.js";
5
+ import { detectOpenApiSpec } from "./openapi.js";
6
+ function extractMarkdownHeadings(content) {
7
+ const headings = [];
8
+ const lines = content.split('\n');
9
+ for (const line of lines) {
10
+ const match = line.match(/^(#{1,6})\s+(.+)$/);
11
+ if (match) {
12
+ const level = match[1].length;
13
+ const text = match[2].trim();
14
+ const anchor = text.toLowerCase().replace(/[^\w\s-]/g, '').replace(/\s+/g, '-');
15
+ headings.push({ level, text, anchor });
16
+ }
17
+ }
18
+ return headings;
19
+ }
20
+ function extractMarkdownCodeBlocks(content) {
21
+ const examples = [];
22
+ const regex = /```([a-zA-Z0-9_-]*)\n([\s\S]*?)```/g;
23
+ let match;
24
+ let idx = 1;
25
+ while ((match = regex.exec(content)) !== null) {
26
+ const lang = match[1].trim() || 'text';
27
+ const code = match[2].trim();
28
+ if (code) {
29
+ examples.push({
30
+ id: `code_${idx++}`,
31
+ language: lang,
32
+ code,
33
+ });
34
+ }
35
+ }
36
+ return examples;
37
+ }
38
+ function extractMarkdownLinks(content, baseUrl) {
39
+ const links = [];
40
+ const regex = /\[([^\]]+)\]\(([^)]+)\)/g;
41
+ let match;
42
+ while ((match = regex.exec(content)) !== null) {
43
+ const text = match[1].trim();
44
+ const href = match[2].trim();
45
+ if (href.startsWith('#') || href.startsWith('javascript:'))
46
+ continue;
47
+ let absoluteUrl = href;
48
+ let isExternal = false;
49
+ try {
50
+ const resolved = new URL(href, baseUrl);
51
+ absoluteUrl = resolved.href;
52
+ const baseHost = new URL(baseUrl).hostname;
53
+ isExternal = resolved.hostname !== baseHost;
54
+ }
55
+ catch {
56
+ // Keep raw href
57
+ }
58
+ links.push({ text, url: absoluteUrl, isExternal });
59
+ }
60
+ return links;
61
+ }
62
+ export function buildNormalizedPage(input) {
63
+ const { sourceId, url, rawContent, contentType = '' } = input;
64
+ const rawBytes = Buffer.byteLength(rawContent, 'utf-8');
65
+ let title = 'Documentation';
66
+ let cleanMarkdown = '';
67
+ let headings = [];
68
+ let links = [];
69
+ let codeExamples = [];
70
+ const isHtml = contentType.includes('text/html') || /^\s*<(!DOCTYPE|html)/i.test(rawContent);
71
+ const isOpenApi = contentType.includes('application/json') || url.endsWith('.json') || url.endsWith('.yaml');
72
+ if (isOpenApi) {
73
+ const apiSummary = detectOpenApiSpec(rawContent, url);
74
+ if (apiSummary) {
75
+ title = `${apiSummary.title} (OpenAPI ${apiSummary.specVersion})`;
76
+ cleanMarkdown = `# ${title}\n\n${apiSummary.description || ''}\n\n` +
77
+ `**Servers**: ${apiSummary.servers.join(', ') || 'None specified'}\n\n` +
78
+ `**Endpoints Count**: ${apiSummary.pathCount}\n\n` +
79
+ `\`\`\`json\n${JSON.stringify(apiSummary.rawJson, null, 2)}\n\`\`\``;
80
+ headings = [
81
+ { level: 1, text: title, anchor: 'title' },
82
+ { level: 2, text: 'API Overview', anchor: 'api-overview' },
83
+ ];
84
+ codeExamples = [
85
+ {
86
+ id: 'spec_1',
87
+ language: 'json',
88
+ code: JSON.stringify(apiSummary.rawJson, null, 2),
89
+ caption: 'OpenAPI Specification',
90
+ },
91
+ ];
92
+ }
93
+ }
94
+ if (!cleanMarkdown && isHtml) {
95
+ const extracted = normalizeHtmlToMarkdown(rawContent, url);
96
+ title = extracted.title;
97
+ cleanMarkdown = extracted.markdown;
98
+ headings = extracted.headings;
99
+ links = extracted.links;
100
+ codeExamples = extracted.codeExamples;
101
+ }
102
+ if (!cleanMarkdown) {
103
+ if (isValidLlmsTxt(rawContent)) {
104
+ const llmsDoc = parseLlmsTxt(rawContent, url);
105
+ title = llmsDoc.title || 'llms.txt Index';
106
+ cleanMarkdown = rawContent;
107
+ headings = extractMarkdownHeadings(rawContent);
108
+ links = extractMarkdownLinks(rawContent, url);
109
+ codeExamples = extractMarkdownCodeBlocks(rawContent);
110
+ }
111
+ else {
112
+ cleanMarkdown = rawContent.trim();
113
+ headings = extractMarkdownHeadings(cleanMarkdown);
114
+ links = extractMarkdownLinks(cleanMarkdown, url);
115
+ codeExamples = extractMarkdownCodeBlocks(cleanMarkdown);
116
+ if (headings.length > 0 && headings[0].level === 1) {
117
+ title = headings[0].text;
118
+ }
119
+ }
120
+ }
121
+ const contentHash = computeContentHash(cleanMarkdown);
122
+ const estimatedTokens = estimateTokenCount(cleanMarkdown);
123
+ const securityAnnotations = detectSecurityAnnotations(cleanMarkdown);
124
+ const id = `page_${computeContentHash(`${sourceId}:${url}`).slice(0, 16)}`;
125
+ const fetchedAt = input.fetchedAt || new Date().toISOString();
126
+ const provenance = {
127
+ sourceUrl: input.sourceUrl || url,
128
+ targetUrl: input.targetUrl || url,
129
+ fetchedAt,
130
+ discoveredBy: input.discoveredBy || 'direct',
131
+ contentHash,
132
+ snapshotId: input.snapshotId,
133
+ };
134
+ return {
135
+ id,
136
+ sourceId,
137
+ title,
138
+ url,
139
+ content: cleanMarkdown,
140
+ headings,
141
+ links,
142
+ codeExamples,
143
+ contentHash,
144
+ fetchedAt,
145
+ rawBytes,
146
+ estimatedTokens,
147
+ securityAnnotations,
148
+ provenance,
149
+ };
150
+ }
@@ -0,0 +1,6 @@
1
+ import type { NormalizedPage, DocumentChunk, Pitfall } from '../../shared/src/index.ts';
2
+ /**
3
+ * Extracts explicit, non-inferential pitfalls, deprecations, breaking changes,
4
+ * and security requirements from documentation pages and chunks.
5
+ */
6
+ export declare function extractPitfalls(page: NormalizedPage, chunks: DocumentChunk[], docVersion?: string, snapshotId?: string): Pitfall[];