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,221 @@
1
+ function unescapeHtml(text) {
2
+ return text
3
+ .replace(/&/g, '&')
4
+ .replace(/&lt;/g, '<')
5
+ .replace(/&gt;/g, '>')
6
+ .replace(/&quot;/g, '"')
7
+ .replace(/&#39;/g, "'")
8
+ .replace(/&apos;/g, "'")
9
+ .replace(/&nbsp;/g, ' ')
10
+ .replace(/&#(\d+);/g, (_, code) => String.fromCharCode(Number(code)))
11
+ .replace(/&#x([0-9a-fA-F]+);/g, (_, code) => String.fromCharCode(parseInt(code, 16)));
12
+ }
13
+ function slugify(text) {
14
+ return text
15
+ .toLowerCase()
16
+ .trim()
17
+ .replace(/[^\w\s-]/g, '')
18
+ .replace(/[\s_-]+/g, '-')
19
+ .replace(/^-+|-+$/g, '');
20
+ }
21
+ /**
22
+ * Deterministically normalizes HTML documentation into clean Markdown,
23
+ * preserving code fences, language tags, headings, tables, callouts, and links.
24
+ */
25
+ export function normalizeHtmlToMarkdown(html, baseUrl) {
26
+ const headings = [];
27
+ const links = [];
28
+ const codeExamples = [];
29
+ let title = '';
30
+ // 1. Extract title from <title> tag if present
31
+ const titleMatch = html.match(/<title[^>]*>([\s\S]*?)<\/title>/i);
32
+ if (titleMatch) {
33
+ title = unescapeHtml(titleMatch[1]).replace(/\s+/g, ' ').trim();
34
+ title = title.split(/\s+[|–—-]\s+/)[0].trim();
35
+ }
36
+ // 2. Remove non-content / boilerplate tags
37
+ let cleaned = html
38
+ .replace(/<!--[\s\S]*?-->/g, '')
39
+ .replace(/<script\b[^>]*>[\s\S]*?<\/script>/gi, '')
40
+ .replace(/<style\b[^>]*>[\s\S]*?<\/style>/gi, '')
41
+ .replace(/<noscript\b[^>]*>[\s\S]*?<\/noscript>/gi, '')
42
+ .replace(/<svg\b[^>]*>[\s\S]*?<\/svg>/gi, '')
43
+ .replace(/<iframe\b[^>]*>[\s\S]*?<\/iframe>/gi, '')
44
+ .replace(/<nav\b[^>]*>[\s\S]*?<\/nav>/gi, '')
45
+ .replace(/<header\b[^>]*>[\s\S]*?<\/header>/gi, '')
46
+ .replace(/<footer\b[^>]*>[\s\S]*?<\/footer>/gi, '')
47
+ .replace(/<div\b[^>]*(?:class|id)=["'][^"']*\b(?:sidebar|nav|menu|navbar|footer|cookie-banner|breadcrumbs)\b[^"']*["'][^>]*>[\s\S]*?<\/div>/gi, '');
48
+ // 3. Extract and preserve code blocks
49
+ const codeBlockPlaceholders = [];
50
+ cleaned = cleaned.replace(/<pre\b[^>]*>(?:<code\b([^>]*)>)?([\s\S]*?)(?:<\/code>)?<\/pre>/gi, (_, codeAttrs, codeBody) => {
51
+ let lang = '';
52
+ if (codeAttrs) {
53
+ const langMatch = codeAttrs.match(/\b(?:class|data-language)=["'][^"']*\b(?:language-|lang-)?([a-zA-Z0-9_-]+)\b[^"']*["']/i);
54
+ if (langMatch && !['hljs', 'code'].includes(langMatch[1].toLowerCase())) {
55
+ lang = langMatch[1].toLowerCase();
56
+ }
57
+ }
58
+ const rawCode = unescapeHtml(codeBody.replace(/<[^>]+>/g, '')).trim();
59
+ if (!rawCode)
60
+ return '';
61
+ const exampleId = `code_${codeExamples.length + 1}`;
62
+ codeExamples.push({
63
+ id: exampleId,
64
+ language: lang || 'text',
65
+ code: rawCode,
66
+ });
67
+ const placeholder = `__DOCORBIT_CODE_BLOCK_${codeBlockPlaceholders.length}__`;
68
+ codeBlockPlaceholders.push(`\n\`\`\`${lang}\n${rawCode}\n\`\`\`\n`);
69
+ return placeholder;
70
+ });
71
+ // 4. Extract Headings and build anchors
72
+ cleaned = cleaned.replace(/<h([1-6])\b([^>]*)>([\s\S]*?)<\/h\1>/gi, (_, levelStr, attrs, innerText) => {
73
+ const level = parseInt(levelStr, 10);
74
+ const plainText = unescapeHtml(innerText.replace(/<[^>]+>/g, '')).replace(/\s+/g, ' ').trim();
75
+ if (!plainText)
76
+ return '';
77
+ let anchor = '';
78
+ const idMatch = attrs.match(/\bid=["']([^"']+)["']/i);
79
+ if (idMatch) {
80
+ anchor = idMatch[1];
81
+ }
82
+ else {
83
+ anchor = slugify(plainText);
84
+ }
85
+ headings.push({ level, text: plainText, anchor });
86
+ const hashes = '#'.repeat(level);
87
+ return `\n\n${hashes} ${plainText}\n\n`;
88
+ });
89
+ // Prefer first H1 as title, otherwise fallback to HTML title, then first heading
90
+ const h1 = headings.find(h => h.level === 1);
91
+ if (h1) {
92
+ title = h1.text;
93
+ }
94
+ else if (!title && headings.length > 0) {
95
+ title = headings[0].text;
96
+ }
97
+ if (!title) {
98
+ title = 'Documentation Page';
99
+ }
100
+ // 5. Extract and normalize Links
101
+ cleaned = cleaned.replace(/<a\b[^>]*\bhref=["']([^"']+)["'][^>]*>([\s\S]*?)<\/a>/gi, (_, href, linkText) => {
102
+ const text = unescapeHtml(linkText.replace(/<[^>]+>/g, '')).replace(/\s+/g, ' ').trim();
103
+ if (!text || href.startsWith('#') || href.startsWith('javascript:'))
104
+ return text;
105
+ let absoluteUrl = href;
106
+ let isExternal = false;
107
+ try {
108
+ const resolved = new URL(href, baseUrl);
109
+ absoluteUrl = resolved.href;
110
+ const baseHost = new URL(baseUrl).hostname;
111
+ isExternal = resolved.hostname !== baseHost;
112
+ }
113
+ catch {
114
+ // Keep raw href
115
+ }
116
+ links.push({
117
+ text,
118
+ url: absoluteUrl,
119
+ isExternal,
120
+ });
121
+ return `[${text}](${absoluteUrl})`;
122
+ });
123
+ // 6. Handle Callouts & Blockquotes
124
+ cleaned = cleaned.replace(/<blockquote\b[^>]*>([\s\S]*?)<\/blockquote>/gi, (_, inner) => {
125
+ const blockText = inner
126
+ .replace(/<p\b[^>]*>/gi, '')
127
+ .replace(/<\/p>/gi, '\n')
128
+ .replace(/<br\s*\/?>/gi, '\n')
129
+ .replace(/<[^>]+>/g, '');
130
+ const cleanLines = unescapeHtml(blockText)
131
+ .split('\n')
132
+ .map(l => l.trim())
133
+ .filter(Boolean)
134
+ .map(l => `> ${l}`)
135
+ .join('\n');
136
+ return `\n\n${cleanLines}\n\n`;
137
+ });
138
+ cleaned = cleaned.replace(/<div\b[^>]*\bclass=["'][^"']*\b(?:alert|callout|admonition|tip|warning|note|info)\b[^"']*["'][^>]*>([\s\S]*?)<\/div>/gi, (_, inner) => {
139
+ const alertText = unescapeHtml(inner.replace(/<[^>]+>/g, ' ')).replace(/\s+/g, ' ').trim();
140
+ if (!alertText)
141
+ return '';
142
+ return `\n\n> [!NOTE]\n> ${alertText}\n\n`;
143
+ });
144
+ // 7. Handle Tables
145
+ cleaned = cleaned.replace(/<table\b[^>]*>([\s\S]*?)<\/table>/gi, (_, tableContent) => {
146
+ const rows = [];
147
+ const rowMatches = tableContent.matchAll(/<tr\b[^>]*>([\s\S]*?)<\/tr>/gi);
148
+ for (const rMatch of rowMatches) {
149
+ const rowContent = rMatch[1];
150
+ const cells = [];
151
+ const cellMatches = rowContent.matchAll(/<t[hd]\b[^>]*>([\s\S]*?)<\/t[hd]>/gi);
152
+ for (const cMatch of cellMatches) {
153
+ const cellText = unescapeHtml(cMatch[1].replace(/<[^>]+>/g, '')).replace(/\s+/g, ' ').trim();
154
+ cells.push(cellText);
155
+ }
156
+ if (cells.length > 0) {
157
+ rows.push(cells);
158
+ }
159
+ }
160
+ if (rows.length === 0)
161
+ return '';
162
+ const colCount = Math.max(...rows.map(r => r.length));
163
+ const headerRow = rows[0].map(c => c || '-');
164
+ while (headerRow.length < colCount)
165
+ headerRow.push('-');
166
+ const delimiterRow = Array(colCount).fill('---');
167
+ const tableLines = [
168
+ `| ${headerRow.join(' | ')} |`,
169
+ `| ${delimiterRow.join(' | ')} |`,
170
+ ];
171
+ for (let i = 1; i < rows.length; i++) {
172
+ const dataRow = rows[i].map(c => c || '');
173
+ while (dataRow.length < colCount)
174
+ dataRow.push('');
175
+ tableLines.push(`| ${dataRow.join(' | ')} |`);
176
+ }
177
+ return `\n\n${tableLines.join('\n')}\n\n`;
178
+ });
179
+ // 8. Handle Lists
180
+ cleaned = cleaned
181
+ .replace(/<li\b[^>]*>([\s\S]*?)<\/li>/gi, (_, inner) => {
182
+ const text = unescapeHtml(inner.replace(/<[^>]+>/g, '')).replace(/\s+/g, ' ').trim();
183
+ return `\n- ${text}`;
184
+ })
185
+ .replace(/<\/?(?:ul|ol)\b[^>]*>/gi, '\n');
186
+ // 9. Handle Inline elements
187
+ cleaned = cleaned
188
+ .replace(/<code\b[^>]*>([\s\S]*?)<\/code>/gi, (_, inner) => {
189
+ const text = unescapeHtml(inner.replace(/<[^>]+>/g, '')).trim();
190
+ return text ? `\`${text}\`` : '';
191
+ })
192
+ .replace(/<(?:strong|b)\b[^>]*>([\s\S]*?)<\/(?:strong|b)>/gi, (_, inner) => {
193
+ const text = inner.trim();
194
+ return text ? `**${text}**` : '';
195
+ })
196
+ .replace(/<(?:em|i)\b[^>]*>([\s\S]*?)<\/(?:em|i)>/gi, (_, inner) => {
197
+ const text = inner.trim();
198
+ return text ? `*${text}*` : '';
199
+ })
200
+ .replace(/<br\s*\/?>/gi, '\n')
201
+ .replace(/<\/?(?:p|div|section|article|main)\b[^>]*>/gi, '\n\n');
202
+ // 10. Strip all remaining HTML tags
203
+ cleaned = cleaned.replace(/<[^>]+>/g, '');
204
+ // 11. Restore preserved code blocks
205
+ for (let i = 0; i < codeBlockPlaceholders.length; i++) {
206
+ cleaned = cleaned.replace(`__DOCORBIT_CODE_BLOCK_${i}__`, codeBlockPlaceholders[i]);
207
+ }
208
+ // 12. Normalize whitespace
209
+ cleaned = unescapeHtml(cleaned)
210
+ .replace(/[ \t]+/g, ' ')
211
+ .replace(/\n\s+\n/g, '\n\n')
212
+ .replace(/\n{3,}/g, '\n\n')
213
+ .trim();
214
+ return {
215
+ title,
216
+ markdown: cleaned,
217
+ headings,
218
+ links,
219
+ codeExamples,
220
+ };
221
+ }
@@ -5,4 +5,3 @@ export * from './page.ts';
5
5
  export * from './slicer.ts';
6
6
  export * from './example-indexer.ts';
7
7
  export * from './pitfall-extractor.ts';
8
-
@@ -0,0 +1,7 @@
1
+ export * from "./html.js";
2
+ export * from "./llms.js";
3
+ export * from "./openapi.js";
4
+ export * from "./page.js";
5
+ export * from "./slicer.js";
6
+ export * from "./example-indexer.js";
7
+ export * from "./pitfall-extractor.js";
@@ -0,0 +1,3 @@
1
+ import type { LlmsDocument } from '../../shared/src/index.ts';
2
+ export declare function parseLlmsTxt(content: string, baseUrl: string): LlmsDocument;
3
+ export declare function isValidLlmsTxt(content: string): boolean;
@@ -0,0 +1,71 @@
1
+ export function parseLlmsTxt(content, baseUrl) {
2
+ const lines = content.split('\n');
3
+ let title;
4
+ let summary;
5
+ const sections = [];
6
+ let currentSection = { name: 'Overview', links: [] };
7
+ const summaryLines = [];
8
+ for (let i = 0; i < lines.length; i++) {
9
+ const rawLine = lines[i];
10
+ const line = rawLine.trim();
11
+ if (!line)
12
+ continue;
13
+ if (line.startsWith('# ') && !title) {
14
+ title = line.slice(2).trim();
15
+ continue;
16
+ }
17
+ if (line.startsWith('>')) {
18
+ const text = line.replace(/^>\s*/, '').trim();
19
+ if (text)
20
+ summaryLines.push(text);
21
+ continue;
22
+ }
23
+ if (line.startsWith('## ')) {
24
+ if (currentSection.links.length > 0 || currentSection.name !== 'Overview') {
25
+ sections.push(currentSection);
26
+ }
27
+ currentSection = {
28
+ name: line.slice(3).trim(),
29
+ links: [],
30
+ };
31
+ continue;
32
+ }
33
+ const linkMatch = line.match(/^[-*]\s+\[([^\]]+)\]\(([^)]+)\)(?::\s*(.*))?$/);
34
+ if (linkMatch) {
35
+ const linkTitle = linkMatch[1].trim();
36
+ let rawHref = linkMatch[2].trim();
37
+ const description = linkMatch[3] ? linkMatch[3].trim() : undefined;
38
+ try {
39
+ rawHref = new URL(rawHref, baseUrl).href;
40
+ }
41
+ catch {
42
+ // Keep raw
43
+ }
44
+ const linkItem = {
45
+ title: linkTitle,
46
+ url: rawHref,
47
+ ...(description ? { description } : {}),
48
+ };
49
+ currentSection.links.push(linkItem);
50
+ }
51
+ }
52
+ if (currentSection.links.length > 0 || sections.length === 0) {
53
+ sections.push(currentSection);
54
+ }
55
+ if (summaryLines.length > 0) {
56
+ summary = summaryLines.join(' ');
57
+ }
58
+ return {
59
+ title,
60
+ summary,
61
+ sections,
62
+ rawContent: content,
63
+ };
64
+ }
65
+ export function isValidLlmsTxt(content) {
66
+ if (!content || typeof content !== 'string')
67
+ return false;
68
+ const hasH1 = /^#\s+.+/m.test(content);
69
+ const hasLink = /^[-*]\s+\[.+\]\(.+\)/m.test(content);
70
+ return hasH1 && hasLink;
71
+ }
@@ -0,0 +1,11 @@
1
+ import type { OpenApiSummary, ApiEndpoint } from '../../../shared/src/index.ts';
2
+ /**
3
+ * Detects if a document content is an OpenAPI or Swagger specification.
4
+ */
5
+ export declare function detectOpenApiSpec(content: string, sourceUrl: string): OpenApiSummary | null;
6
+ /**
7
+ * Parses all API endpoints from an OpenAPI 3.x or Swagger 2.0 specification.
8
+ * Fully deterministic with internal $ref resolution, schema normalization,
9
+ * pagination heuristics, and error detection.
10
+ */
11
+ export declare function parseOpenApiEndpoints(rawSpec: string | Record<string, unknown>, pageId: string, snapshotId: string, sourceUrl?: string, docVersion?: string): ApiEndpoint[];
@@ -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
+ }