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,6 @@
1
+ export * from "./inspector.js";
2
+ export * from "./pipeline.js";
3
+ export * from "./implementation-service.js";
4
+ export * from "../../verification/src/index.js";
5
+ export * from "../../export/src/index.js";
6
+ export * from "./dashboard/server.js";
@@ -0,0 +1,22 @@
1
+ import type { DiscoveredSource, SourcePurpose, SourceRankResult, Target } from '../../shared/src/index.ts';
2
+ import { SecureFetcher } from '../../crawler/src/index.ts';
3
+ export interface InspectionReport {
4
+ targetUrl: string;
5
+ target?: Target;
6
+ sourcesDiscovered: DiscoveredSource[];
7
+ recommendations: Record<SourcePurpose, SourceRankResult>;
8
+ summary: {
9
+ totalFound: number;
10
+ machineReadableCount: number;
11
+ officialCount: number;
12
+ hasOpenApi: boolean;
13
+ hasLlmsTxt: boolean;
14
+ hasLlmsFullTxt: boolean;
15
+ hasSkill: boolean;
16
+ hasSitemap: boolean;
17
+ };
18
+ }
19
+ export declare function inspectDocumentation(targetUrl: string, options?: {
20
+ allowLocalhostForTesting?: boolean;
21
+ fetcher?: SecureFetcher;
22
+ }): Promise<InspectionReport>;
@@ -0,0 +1,38 @@
1
+ import { validateTargetUrl } from "../../security/src/index.js";
2
+ import { SecureFetcher } from "../../crawler/src/index.js";
3
+ import { createDefaultDiscoveryCoordinator, rankSources } from "../../discovery/src/index.js";
4
+ export async function inspectDocumentation(targetUrl, options = {}) {
5
+ // Validate target URL against SSRF and illegal protocols before probing
6
+ await validateTargetUrl(targetUrl, {
7
+ allowLocalhostForTesting: options.allowLocalhostForTesting,
8
+ });
9
+ const fetcher = options.fetcher || new SecureFetcher({ allowLocalhostForTesting: options.allowLocalhostForTesting });
10
+ const coordinator = createDefaultDiscoveryCoordinator();
11
+ const discovered = await coordinator.discoverAll(targetUrl, fetcher);
12
+ const purposes = ['navigation', 'conceptual', 'api', 'examples', 'implementation'];
13
+ const recommendations = {};
14
+ for (const p of purposes) {
15
+ recommendations[p] = rankSources(discovered, p);
16
+ }
17
+ const validSources = discovered.filter(s => s.status === 'valid');
18
+ return {
19
+ targetUrl,
20
+ target: {
21
+ type: 'url',
22
+ value: targetUrl,
23
+ normalizedUrl: targetUrl,
24
+ },
25
+ sourcesDiscovered: discovered,
26
+ recommendations: recommendations,
27
+ summary: {
28
+ totalFound: discovered.length,
29
+ machineReadableCount: validSources.filter(s => s.machineReadable).length,
30
+ officialCount: validSources.filter(s => s.authority === 'official').length,
31
+ hasOpenApi: validSources.some(s => s.type === 'openapi'),
32
+ hasLlmsTxt: validSources.some(s => s.type === 'llms_txt'),
33
+ hasLlmsFullTxt: validSources.some(s => s.type === 'llms_full_txt'),
34
+ hasSkill: validSources.some(s => s.type === 'skill'),
35
+ hasSitemap: validSources.some(s => s.type === 'sitemap'),
36
+ },
37
+ };
38
+ }
@@ -0,0 +1,45 @@
1
+ import type { DiscoveredSource, NormalizedPage, CrawlerConfig, CrawlPolicy, Target, SourcePurpose } from '../../shared/src/index.ts';
2
+ import { DocOrbitRepository } from '../../storage/src/index.ts';
3
+ export interface IngestionOptions {
4
+ crawlerConfig?: Partial<CrawlerConfig>;
5
+ crawlPolicy?: Partial<CrawlPolicy>;
6
+ allowLocalhostForTesting?: boolean;
7
+ }
8
+ export interface IngestionResult {
9
+ targetUrl: string;
10
+ target?: Target;
11
+ primarySourceId: string;
12
+ sourcesDiscovered: DiscoveredSource[];
13
+ selectedSources: Array<{
14
+ purpose: SourcePurpose;
15
+ sourceId: string;
16
+ }>;
17
+ pages: NormalizedPage[];
18
+ pagesDiscovered: number;
19
+ pagesFetched: number;
20
+ pagesStored: number;
21
+ snapshotId: string;
22
+ warnings: string[];
23
+ errors: Array<{
24
+ url: string;
25
+ error: string;
26
+ }>;
27
+ durationMs: number;
28
+ stats: {
29
+ totalPages: number;
30
+ totalBytes: number;
31
+ totalEstimatedTokens: number;
32
+ totalCodeExamples: number;
33
+ machineReadableSources: number;
34
+ totalChunks: number;
35
+ };
36
+ }
37
+ export declare class IngestionPipeline {
38
+ private repository;
39
+ private fetcher;
40
+ private config;
41
+ private policy;
42
+ private allowLocalhostForTesting;
43
+ constructor(repository: DocOrbitRepository, options?: IngestionOptions);
44
+ ingest(targetUrl: string): Promise<IngestionResult>;
45
+ }
@@ -0,0 +1,246 @@
1
+ import { validateTargetUrl } from "../../security/src/index.js";
2
+ import { SecureFetcher, DEFAULT_CRAWLER_CONFIG } from "../../crawler/src/index.js";
3
+ import { createDefaultDiscoveryCoordinator, rankSources } from "../../discovery/src/index.js";
4
+ import { buildNormalizedPage, parseLlmsTxt, isValidLlmsTxt, slicePageIntoChunks, parseOpenApiEndpoints, detectOpenApiSpec, extractIndexedExamples, extractPitfalls, } from "../../normalizer/src/index.js";
5
+ export class IngestionPipeline {
6
+ repository;
7
+ fetcher;
8
+ config;
9
+ policy;
10
+ allowLocalhostForTesting;
11
+ constructor(repository, options = {}) {
12
+ this.repository = repository;
13
+ this.config = {
14
+ ...DEFAULT_CRAWLER_CONFIG,
15
+ ...options.crawlerConfig,
16
+ };
17
+ this.allowLocalhostForTesting = options.allowLocalhostForTesting ?? false;
18
+ this.policy = {
19
+ purpose: 'conceptual',
20
+ maxPages: this.config.maxPages,
21
+ maxDepth: this.config.maxDepth || 2,
22
+ followLlmsReferences: true,
23
+ followExternalDomains: false,
24
+ ...options.crawlPolicy,
25
+ };
26
+ this.fetcher = new SecureFetcher({
27
+ timeoutMs: this.config.timeoutMs,
28
+ maxBytes: this.config.maxBytesPerResponse,
29
+ maxRedirects: this.config.maxRedirects,
30
+ userAgent: this.config.userAgent,
31
+ allowLocalhostForTesting: this.allowLocalhostForTesting,
32
+ });
33
+ }
34
+ async ingest(targetUrl) {
35
+ const startTime = Date.now();
36
+ // 1. SSRF & Protocol validation before making any discovery probes
37
+ await validateTargetUrl(targetUrl, {
38
+ allowLocalhostForTesting: this.allowLocalhostForTesting,
39
+ });
40
+ const coordinator = createDefaultDiscoveryCoordinator();
41
+ const discovered = await coordinator.discoverAll(targetUrl, this.fetcher);
42
+ const sourceIds = {};
43
+ for (const s of discovered) {
44
+ const id = this.repository.saveSource(s);
45
+ sourceIds[s.url] = id;
46
+ }
47
+ const conceptualRank = rankSources(discovered, 'conceptual');
48
+ const apiRank = rankSources(discovered, 'api');
49
+ const primarySource = conceptualRank.recommended || discovered[0];
50
+ const primarySourceId = primarySource
51
+ ? (sourceIds[primarySource.url] || this.repository.saveSource(primarySource))
52
+ : this.repository.saveSource({
53
+ url: targetUrl,
54
+ type: 'web',
55
+ discoveredBy: 'direct',
56
+ status: 'valid',
57
+ confidence: 1.0,
58
+ authority: 'official',
59
+ machineReadable: false,
60
+ });
61
+ const purposes = ['navigation', 'conceptual', 'api', 'examples', 'implementation'];
62
+ const selectedSources = purposes.map(p => {
63
+ const ranked = rankSources(discovered, p);
64
+ return {
65
+ purpose: p,
66
+ sourceId: ranked.recommended ? (sourceIds[ranked.recommended.url] || primarySourceId) : primarySourceId,
67
+ };
68
+ });
69
+ const queue = [];
70
+ const visited = new Set();
71
+ const ingestedPages = [];
72
+ const warnings = [];
73
+ const errors = [];
74
+ let pagesDiscovered = 0;
75
+ const enqueue = (url, depth) => {
76
+ try {
77
+ const parsed = new URL(url);
78
+ const normalized = `${parsed.origin}${parsed.pathname}`;
79
+ pagesDiscovered++;
80
+ if (depth > this.policy.maxDepth)
81
+ return;
82
+ if (!visited.has(normalized) && queue.length < this.policy.maxPages) {
83
+ queue.push({ url: normalized, depth });
84
+ }
85
+ }
86
+ catch {
87
+ // Ignore
88
+ }
89
+ };
90
+ // 1. Prioritize targetUrl as the primary entry point (depth: 0)
91
+ enqueue(targetUrl, 0);
92
+ // 2. If an OpenAPI spec is available, enqueue it (depth: 0)
93
+ if (apiRank.recommended && apiRank.recommended.type === 'openapi' && apiRank.recommended.url !== targetUrl) {
94
+ enqueue(apiRank.recommended.url, 0);
95
+ }
96
+ // 3. If llms.txt or llms-full.txt is available, enqueue it (depth: 0)
97
+ const llmsFull = discovered.find(s => s.type === 'llms_full_txt' && s.status === 'valid');
98
+ const llms = discovered.find(s => s.type === 'llms_txt' && s.status === 'valid');
99
+ if (llmsFull && llmsFull.url !== targetUrl) {
100
+ enqueue(llmsFull.url, 0);
101
+ }
102
+ else if (llms && llms.url !== targetUrl) {
103
+ enqueue(llms.url, 0);
104
+ }
105
+ if (primarySource && primarySource.url !== targetUrl) {
106
+ enqueue(primarySource.url, 0);
107
+ }
108
+ const targetOrigin = new URL(targetUrl).origin;
109
+ while (queue.length > 0 && ingestedPages.length < this.policy.maxPages) {
110
+ const item = queue.shift();
111
+ const currentUrl = item.url;
112
+ const currentDepth = item.depth;
113
+ if (visited.has(currentUrl))
114
+ continue;
115
+ visited.add(currentUrl);
116
+ try {
117
+ const res = await this.fetcher.fetch(currentUrl);
118
+ if (res.status < 200 || res.status >= 300) {
119
+ errors.push({ url: currentUrl, error: `HTTP status ${res.status}` });
120
+ continue;
121
+ }
122
+ const page = buildNormalizedPage({
123
+ sourceId: primarySourceId,
124
+ url: res.finalUrl || currentUrl,
125
+ rawContent: res.body,
126
+ contentType: res.contentType,
127
+ sourceUrl: primarySource?.url || targetUrl,
128
+ targetUrl,
129
+ discoveredBy: primarySource?.discoveredBy || 'direct',
130
+ fetchedAt: new Date().toISOString(),
131
+ });
132
+ this.repository.savePage(page);
133
+ ingestedPages.push(page);
134
+ // Subpage link discovery
135
+ if (isValidLlmsTxt(res.body)) {
136
+ if (this.policy.followLlmsReferences && currentDepth < this.policy.maxDepth) {
137
+ const llmsDoc = parseLlmsTxt(res.body, currentUrl);
138
+ for (const sec of llmsDoc.sections) {
139
+ for (const lnk of sec.links) {
140
+ if (ingestedPages.length + queue.length < this.policy.maxPages) {
141
+ try {
142
+ const parsedLnk = new URL(lnk.url);
143
+ if (this.policy.followExternalDomains || parsedLnk.origin === targetOrigin) {
144
+ enqueue(lnk.url, currentDepth + 1);
145
+ }
146
+ }
147
+ catch {
148
+ // Ignore
149
+ }
150
+ }
151
+ }
152
+ }
153
+ }
154
+ }
155
+ else {
156
+ if (currentDepth < this.policy.maxDepth) {
157
+ for (const lnk of page.links) {
158
+ if (ingestedPages.length + queue.length < this.policy.maxPages) {
159
+ try {
160
+ const linkUrl = new URL(lnk.url);
161
+ if (this.policy.followExternalDomains || linkUrl.origin === targetOrigin) {
162
+ enqueue(lnk.url, currentDepth + 1);
163
+ }
164
+ }
165
+ catch {
166
+ // Ignore
167
+ }
168
+ }
169
+ }
170
+ }
171
+ }
172
+ }
173
+ catch (err) {
174
+ errors.push({ url: currentUrl, error: err instanceof Error ? err.message : String(err) });
175
+ }
176
+ }
177
+ const snapshotId = this.repository.createSnapshot(primarySourceId, {
178
+ targetUrl,
179
+ pageCount: ingestedPages.length,
180
+ ingestedAt: new Date().toISOString(),
181
+ });
182
+ // Milestone 2: Semantic slicing of pages into standalone DocumentChunks
183
+ let totalChunks = 0;
184
+ for (const p of ingestedPages) {
185
+ const slicingResult = slicePageIntoChunks(p, snapshotId);
186
+ this.repository.saveChunks(slicingResult.chunks, slicingResult.relationships, slicingResult.codeSnippets, slicingResult.symbols);
187
+ totalChunks += slicingResult.chunks.length;
188
+ // Milestone 4: API Endpoints
189
+ if (p.openApiSummary || detectOpenApiSpec(p.content, p.url)) {
190
+ const endpoints = parseOpenApiEndpoints(p.content, p.id, snapshotId, p.url, p.docVersion);
191
+ if (endpoints.length > 0) {
192
+ this.repository.saveApiEndpoints(endpoints);
193
+ }
194
+ }
195
+ // Milestone 4: Indexed Examples
196
+ const examples = extractIndexedExamples(p, slicingResult.chunks, primarySource?.authority || 'official', p.docVersion, snapshotId);
197
+ if (examples.length > 0) {
198
+ this.repository.saveIndexedExamples(examples);
199
+ }
200
+ // Milestone 4: Pitfalls
201
+ const pitfalls = extractPitfalls(p, slicingResult.chunks, p.docVersion, snapshotId);
202
+ if (pitfalls.length > 0) {
203
+ this.repository.savePitfalls(pitfalls);
204
+ }
205
+ }
206
+ const durationMs = Date.now() - startTime;
207
+ let totalBytes = 0;
208
+ let totalEstimatedTokens = 0;
209
+ let totalCodeExamples = 0;
210
+ for (const p of ingestedPages) {
211
+ totalBytes += p.rawBytes;
212
+ totalEstimatedTokens += p.estimatedTokens;
213
+ totalCodeExamples += p.codeExamples.length;
214
+ if (p.securityAnnotations.length > 0) {
215
+ warnings.push(`Page "${p.url}" generated ${p.securityAnnotations.length} security alert(s).`);
216
+ }
217
+ }
218
+ return {
219
+ targetUrl,
220
+ target: {
221
+ type: 'url',
222
+ value: targetUrl,
223
+ normalizedUrl: targetUrl,
224
+ },
225
+ primarySourceId,
226
+ sourcesDiscovered: discovered,
227
+ selectedSources,
228
+ pages: ingestedPages,
229
+ pagesDiscovered,
230
+ pagesFetched: visited.size,
231
+ pagesStored: ingestedPages.length,
232
+ snapshotId,
233
+ warnings,
234
+ errors,
235
+ durationMs,
236
+ stats: {
237
+ totalPages: ingestedPages.length,
238
+ totalBytes,
239
+ totalEstimatedTokens,
240
+ totalCodeExamples,
241
+ machineReadableSources: discovered.filter(s => s.status === 'valid' && s.machineReadable).length,
242
+ totalChunks,
243
+ },
244
+ };
245
+ }
246
+ }
@@ -0,0 +1,2 @@
1
+ import type { CrawlerConfig } from '../../shared/src/index.ts';
2
+ export declare const DEFAULT_CRAWLER_CONFIG: CrawlerConfig;
@@ -0,0 +1,10 @@
1
+ export const DEFAULT_CRAWLER_CONFIG = {
2
+ maxPages: 50,
3
+ maxDepth: 3,
4
+ maxBytesPerResponse: 10 * 1024 * 1024, // 10MB
5
+ timeoutMs: 10000, // 10 seconds
6
+ maxRedirects: 5,
7
+ concurrency: 5,
8
+ allowedProtocols: ['http:', 'https:'],
9
+ userAgent: 'DocOrbit/1.0 (+https://github.com/docorbit/docorbit)',
10
+ };
@@ -0,0 +1,31 @@
1
+ import type { SsrfValidationOptions } from '../../security/src/index.ts';
2
+ export interface FetchResult {
3
+ url: string;
4
+ finalUrl: string;
5
+ status: number;
6
+ statusText: string;
7
+ headers: Record<string, string>;
8
+ body: string;
9
+ contentType: string;
10
+ bytesRead: number;
11
+ }
12
+ export interface FetchOptions extends SsrfValidationOptions {
13
+ timeoutMs?: number;
14
+ maxBytes?: number;
15
+ maxRedirects?: number;
16
+ userAgent?: string;
17
+ headers?: Record<string, string>;
18
+ method?: string;
19
+ fetchFn?: typeof fetch;
20
+ allowCrossDomainRedirects?: boolean;
21
+ }
22
+ export declare class SecureFetcher {
23
+ private timeoutMs;
24
+ private maxBytes;
25
+ private maxRedirects;
26
+ private userAgent;
27
+ private allowLocalhostForTesting;
28
+ private fetchFn;
29
+ constructor(defaults?: Partial<FetchOptions>);
30
+ fetch(urlStr: string, options?: FetchOptions): Promise<FetchResult>;
31
+ }
@@ -0,0 +1,139 @@
1
+ import { FetchTimeoutError, PayloadTooLargeError, DocOrbitError, } from "../../shared/src/index.js";
2
+ import { validateTargetUrl } from "../../security/src/index.js";
3
+ import { DEFAULT_CRAWLER_CONFIG } from "./config.js";
4
+ export class SecureFetcher {
5
+ timeoutMs;
6
+ maxBytes;
7
+ maxRedirects;
8
+ userAgent;
9
+ allowLocalhostForTesting;
10
+ fetchFn;
11
+ constructor(defaults = {}) {
12
+ this.timeoutMs = defaults.timeoutMs ?? DEFAULT_CRAWLER_CONFIG.timeoutMs;
13
+ this.maxBytes = defaults.maxBytes ?? DEFAULT_CRAWLER_CONFIG.maxBytesPerResponse;
14
+ this.maxRedirects = defaults.maxRedirects ?? DEFAULT_CRAWLER_CONFIG.maxRedirects;
15
+ this.userAgent = defaults.userAgent ?? DEFAULT_CRAWLER_CONFIG.userAgent;
16
+ this.allowLocalhostForTesting = defaults.allowLocalhostForTesting ?? false;
17
+ this.fetchFn = defaults.fetchFn ?? globalThis.fetch;
18
+ }
19
+ async fetch(urlStr, options = {}) {
20
+ const timeoutMs = options.timeoutMs ?? this.timeoutMs;
21
+ const maxBytes = options.maxBytes ?? this.maxBytes;
22
+ const maxRedirects = options.maxRedirects ?? this.maxRedirects;
23
+ const userAgent = options.userAgent ?? this.userAgent;
24
+ const method = options.method ?? 'GET';
25
+ const allowLocalhost = options.allowLocalhostForTesting ?? this.allowLocalhostForTesting;
26
+ const activeFetch = options.fetchFn ?? this.fetchFn;
27
+ let currentUrl = urlStr;
28
+ let redirectCount = 0;
29
+ const seenRedirects = new Set();
30
+ seenRedirects.add(currentUrl);
31
+ while (redirectCount <= maxRedirects) {
32
+ // 1. SSRF & Protocol validation before making the hop
33
+ await validateTargetUrl(currentUrl, {
34
+ allowLocalhostForTesting: allowLocalhost,
35
+ });
36
+ const controller = new AbortController();
37
+ const timeoutId = setTimeout(() => {
38
+ controller.abort(new FetchTimeoutError(`Request timed out after ${timeoutMs}ms`, timeoutMs));
39
+ }, timeoutMs);
40
+ try {
41
+ const reqHeaders = {
42
+ 'User-Agent': userAgent,
43
+ Accept: 'text/html,application/xhtml+xml,text/plain,text/markdown,application/json,*/*',
44
+ ...options.headers,
45
+ };
46
+ const res = await activeFetch(currentUrl, {
47
+ method,
48
+ headers: reqHeaders,
49
+ redirect: 'manual',
50
+ signal: controller.signal,
51
+ });
52
+ // 2. Handle HTTP redirects (301, 302, 303, 307, 308)
53
+ if ([301, 302, 303, 307, 308].includes(res.status)) {
54
+ const location = res.headers.get('location');
55
+ if (!location) {
56
+ throw new DocOrbitError(`Redirect response (${res.status}) missing Location header.`);
57
+ }
58
+ redirectCount++;
59
+ if (redirectCount > maxRedirects) {
60
+ throw new DocOrbitError(`Exceeded maximum allowed redirects (${maxRedirects}).`);
61
+ }
62
+ const nextUrl = new URL(location, currentUrl).href;
63
+ // Check for redirect loop
64
+ if (seenRedirects.has(nextUrl)) {
65
+ throw new DocOrbitError(`Redirect loop detected: "${nextUrl}" already visited in redirect chain.`);
66
+ }
67
+ seenRedirects.add(nextUrl);
68
+ // Enforce domain/origin policy
69
+ if (options.allowCrossDomainRedirects === false) {
70
+ const origOrigin = new URL(urlStr).origin;
71
+ const nextOrigin = new URL(nextUrl).origin;
72
+ if (origOrigin !== nextOrigin) {
73
+ throw new DocOrbitError(`Cross-origin redirect from "${origOrigin}" to "${nextOrigin}" prohibited by policy.`);
74
+ }
75
+ }
76
+ currentUrl = nextUrl;
77
+ continue;
78
+ }
79
+ // 3. Extract response headers
80
+ const headers = {};
81
+ res.headers.forEach((val, key) => {
82
+ headers[key.toLowerCase()] = val;
83
+ });
84
+ const contentType = headers['content-type'] || 'application/octet-stream';
85
+ // 4. Stream response body with byte counting
86
+ let bytesRead = 0;
87
+ const chunks = [];
88
+ if (res.body) {
89
+ const reader = res.body.getReader();
90
+ try {
91
+ while (true) {
92
+ const { done, value } = await reader.read();
93
+ if (done)
94
+ break;
95
+ if (value) {
96
+ bytesRead += value.length;
97
+ if (bytesRead > maxBytes) {
98
+ controller.abort();
99
+ throw new PayloadTooLargeError(`Response exceeded maximum allowed size of ${maxBytes} bytes (read ${bytesRead} bytes).`, bytesRead, maxBytes);
100
+ }
101
+ chunks.push(value);
102
+ }
103
+ }
104
+ }
105
+ finally {
106
+ reader.releaseLock();
107
+ }
108
+ }
109
+ const totalBuffer = Buffer.concat(chunks);
110
+ const bodyText = totalBuffer.toString('utf-8');
111
+ return {
112
+ url: urlStr,
113
+ finalUrl: currentUrl,
114
+ status: res.status,
115
+ statusText: res.statusText,
116
+ headers,
117
+ body: bodyText,
118
+ contentType,
119
+ bytesRead,
120
+ };
121
+ }
122
+ catch (err) {
123
+ if (err instanceof DocOrbitError)
124
+ throw err;
125
+ if (controller.signal.aborted) {
126
+ const reason = controller.signal.reason;
127
+ if (reason instanceof DocOrbitError)
128
+ throw reason;
129
+ throw new FetchTimeoutError(`Request timed out after ${timeoutMs}ms`, timeoutMs);
130
+ }
131
+ throw new DocOrbitError(`Fetch failure for "${currentUrl}": ${err instanceof Error ? err.message : String(err)}`);
132
+ }
133
+ finally {
134
+ clearTimeout(timeoutId);
135
+ }
136
+ }
137
+ throw new DocOrbitError(`Exceeded maximum allowed redirects (${maxRedirects}).`);
138
+ }
139
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./config.js";
2
+ export * from "./fetcher.js";
@@ -0,0 +1,11 @@
1
+ import { DiscoveryCoordinator } from './provider.ts';
2
+ export * from './provider.ts';
3
+ export * from './ranker.ts';
4
+ export * from './providers/llms-txt.ts';
5
+ export * from './providers/openapi.ts';
6
+ export * from './providers/markdown.ts';
7
+ export * from './providers/sitemap.ts';
8
+ export * from './providers/github.ts';
9
+ export * from './providers/skill.ts';
10
+ export * from './providers/generic.ts';
11
+ export declare function createDefaultDiscoveryCoordinator(): DiscoveryCoordinator;
@@ -0,0 +1,29 @@
1
+ import { DiscoveryCoordinator } from "./provider.js";
2
+ import { LlmsTxtProvider } from "./providers/llms-txt.js";
3
+ import { OpenApiProvider } from "./providers/openapi.js";
4
+ import { MarkdownProvider } from "./providers/markdown.js";
5
+ import { SitemapProvider } from "./providers/sitemap.js";
6
+ import { GithubProvider } from "./providers/github.js";
7
+ import { SkillProvider } from "./providers/skill.js";
8
+ import { GenericWebProvider } from "./providers/generic.js";
9
+ export * from "./provider.js";
10
+ export * from "./ranker.js";
11
+ export * from "./providers/llms-txt.js";
12
+ export * from "./providers/openapi.js";
13
+ export * from "./providers/markdown.js";
14
+ export * from "./providers/sitemap.js";
15
+ export * from "./providers/github.js";
16
+ export * from "./providers/skill.js";
17
+ export * from "./providers/generic.js";
18
+ export function createDefaultDiscoveryCoordinator() {
19
+ const coordinator = new DiscoveryCoordinator();
20
+ coordinator
21
+ .register(new LlmsTxtProvider())
22
+ .register(new OpenApiProvider())
23
+ .register(new MarkdownProvider())
24
+ .register(new SitemapProvider())
25
+ .register(new SkillProvider())
26
+ .register(new GithubProvider())
27
+ .register(new GenericWebProvider());
28
+ return coordinator;
29
+ }
@@ -0,0 +1,12 @@
1
+ import type { DiscoveredSource } from '../../shared/src/index.ts';
2
+ import { SecureFetcher } from '../../crawler/src/index.ts';
3
+ export interface DiscoveryProvider {
4
+ name: string;
5
+ discover(targetUrl: string, fetcher: SecureFetcher): Promise<DiscoveredSource[]>;
6
+ }
7
+ export declare class DiscoveryCoordinator {
8
+ private providers;
9
+ register(provider: DiscoveryProvider): this;
10
+ getProviders(): DiscoveryProvider[];
11
+ discoverAll(targetUrl: string, fetcher: SecureFetcher): Promise<DiscoveredSource[]>;
12
+ }
@@ -0,0 +1,30 @@
1
+ export class DiscoveryCoordinator {
2
+ providers = [];
3
+ register(provider) {
4
+ this.providers.push(provider);
5
+ return this;
6
+ }
7
+ getProviders() {
8
+ return [...this.providers];
9
+ }
10
+ async discoverAll(targetUrl, fetcher) {
11
+ const results = await Promise.allSettled(this.providers.map(p => p.discover(targetUrl, fetcher)));
12
+ const allSources = [];
13
+ for (const res of results) {
14
+ if (res.status === 'fulfilled') {
15
+ allSources.push(...res.value);
16
+ }
17
+ }
18
+ // Deduplicate sources by normalized URL
19
+ const seen = new Set();
20
+ const deduped = [];
21
+ for (const s of allSources) {
22
+ const normalizedUrl = s.url.replace(/\/$/, '').toLowerCase();
23
+ if (!seen.has(normalizedUrl)) {
24
+ seen.add(normalizedUrl);
25
+ deduped.push(s);
26
+ }
27
+ }
28
+ return deduped;
29
+ }
30
+ }
@@ -0,0 +1,7 @@
1
+ import type { DiscoveredSource } from '../../../shared/src/index.ts';
2
+ import { SecureFetcher } from '../../../crawler/src/index.ts';
3
+ import type { DiscoveryProvider } from '../provider.ts';
4
+ export declare class GenericWebProvider implements DiscoveryProvider {
5
+ name: string;
6
+ discover(targetUrl: string, fetcher: SecureFetcher): Promise<DiscoveredSource[]>;
7
+ }