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
@@ -1,139 +0,0 @@
1
- import type {
2
- DocumentChunk,
3
- SymbolReference,
4
- ChunkCode,
5
- ScoringWeights,
6
- QueryIntent,
7
- SourceAuthority,
8
- SearchResult,
9
- } from '../../shared/src/index.ts';
10
-
11
- export interface ScoreCandidateInput {
12
- chunk: DocumentChunk;
13
- ftsRank: number;
14
- symbols: SymbolReference[];
15
- codeSnippets: ChunkCode[];
16
- query: string;
17
- intent: QueryIntent;
18
- authority?: SourceAuthority;
19
- targetDocVersion?: string;
20
- weights: ScoringWeights;
21
- }
22
-
23
- export function scoreChunkCandidate(input: ScoreCandidateInput): SearchResult {
24
- const { chunk, ftsRank, symbols, codeSnippets, query, intent, authority = 'official', targetDocVersion, weights } = input;
25
-
26
- const matchReasons: string[] = [];
27
- const queryLower = query.toLowerCase().trim();
28
- const queryTokens = queryLower
29
- .replace(/[^\w\s-]/g, ' ')
30
- .split(/\s+/)
31
- .filter(t => t.length > 2);
32
-
33
- // 1. Base BM25 score from FTS5 (FTS5 rank is negative where smaller = more relevant)
34
- const normalizedBm25 = Math.max(0.1, -ftsRank);
35
- let totalScore = normalizedBm25 * weights.bm25Weight;
36
- matchReasons.push(`BM25 base (${normalizedBm25.toFixed(2)})`);
37
-
38
- // 2. Exact phrase match in content
39
- if (chunk.content.toLowerCase().includes(queryLower)) {
40
- totalScore += weights.exactPhraseBonus;
41
- matchReasons.push(`Exact phrase match (+${weights.exactPhraseBonus})`);
42
- }
43
-
44
- // 3. Title match
45
- const titleLower = (chunk.title || '').toLowerCase();
46
- const titleMatches = queryTokens.filter(t => titleLower.includes(t));
47
- if (titleMatches.length > 0) {
48
- const boost = weights.titleBonus * (titleMatches.length / queryTokens.length);
49
- totalScore += boost;
50
- matchReasons.push(`Title match [${titleMatches.join(', ')}] (+${boost.toFixed(1)})`);
51
- }
52
-
53
- // 4. Section path match
54
- const pathString = chunk.sectionPath.join(' ').toLowerCase();
55
- const pathMatches = queryTokens.filter(t => pathString.includes(t));
56
- if (pathMatches.length > 0) {
57
- const boost = weights.sectionPathBonus * (pathMatches.length / queryTokens.length);
58
- totalScore += boost;
59
- matchReasons.push(`Section breadcrumbs match [${pathMatches.join(', ')}] (+${boost.toFixed(1)})`);
60
- }
61
-
62
- // 5. Symbol match (shallow deterministic regex symbols)
63
- const matchedSymbols = symbols.filter(s => {
64
- const symLower = s.name.toLowerCase();
65
- return queryLower.includes(symLower) || symLower.includes(queryLower);
66
- });
67
- if (matchedSymbols.length > 0) {
68
- totalScore += weights.symbolMatchBonus;
69
- matchReasons.push(`Symbol match [${matchedSymbols.map(s => s.name).join(', ')}] (+${weights.symbolMatchBonus})`);
70
- }
71
-
72
- // 6. Query intent alignment
73
- let intentBoost = 0;
74
- if (intent === 'api' && chunk.chunkType === 'api') {
75
- intentBoost = weights.intentTypeBonus;
76
- } else if (intent === 'examples' && (chunk.chunkType === 'example' || chunk.chunkType === 'code')) {
77
- intentBoost = weights.intentTypeBonus;
78
- } else if (intent === 'troubleshooting' && (chunk.chunkType === 'warning' || /error|exception|fail|status|code/i.test(chunk.content))) {
79
- intentBoost = weights.intentTypeBonus;
80
- } else if (intent === 'implementation' && (chunk.chunkType === 'mixed' || chunk.chunkType === 'example')) {
81
- intentBoost = weights.intentTypeBonus;
82
- } else if (intent === 'conceptual' && chunk.chunkType === 'prose') {
83
- intentBoost = weights.intentTypeBonus;
84
- } else if (intent === 'configuration' && (symbols.some(s => s.kind === 'config') || chunk.chunkType === 'prose')) {
85
- intentBoost = weights.intentTypeBonus;
86
- }
87
-
88
- if (intentBoost > 0) {
89
- totalScore += intentBoost;
90
- matchReasons.push(`Intent alignment '${intent}' for chunkType '${chunk.chunkType}' (+${intentBoost})`);
91
- }
92
-
93
- // 7. Documentation version boosting & nuance
94
- if (targetDocVersion && chunk.docVersion) {
95
- const chunkVerClean = chunk.docVersion.replace(/^[v=]/, '');
96
- const targetVerClean = targetDocVersion.replace(/^[v=]/, '');
97
-
98
- const chunkMajor = chunkVerClean.split('.')[0];
99
- const targetMajor = targetVerClean.split('.')[0];
100
-
101
- if (chunkVerClean === targetVerClean || chunk.docVersion === targetDocVersion) {
102
- // Exact version match
103
- totalScore += weights.versionBonus;
104
- matchReasons.push(`Target doc version exact match [${chunk.docVersion}] (+${weights.versionBonus})`);
105
- } else if (chunkMajor === targetMajor) {
106
- // Same major version (e.g. target 14.2.3, chunk v14 or 14.1)
107
- const majorBoost = weights.versionBonus * 0.85;
108
- totalScore += majorBoost;
109
- matchReasons.push(`Target doc major match [${chunk.docVersion}] (+${majorBoost.toFixed(1)})`);
110
- } else if (
111
- chunk.docVersion === 'latest' ||
112
- chunk.docVersion === 'stable' ||
113
- chunk.docVersion === 'current'
114
- ) {
115
- // Unversioned / latest documentation: neutral supplemental context
116
- matchReasons.push(`Supplemental unversioned/latest documentation [${chunk.docVersion}]`);
117
- } else {
118
- // Evidence of major version incompatibility (e.g. target v14 vs chunk v16)
119
- const penalty = weights.versionBonus * 0.5;
120
- totalScore -= penalty;
121
- matchReasons.push(`Version major discrepancy [chunk ${chunk.docVersion} vs target ${targetDocVersion}] (-${penalty.toFixed(1)})`);
122
- }
123
- }
124
-
125
- // 8. Authority weighting
126
- const authMultiplier = weights.authorityWeights[authority] ?? 1.0;
127
- totalScore *= authMultiplier;
128
- if (authMultiplier !== 1.0) {
129
- matchReasons.push(`Authority weighting: x${authMultiplier}`);
130
- }
131
-
132
- return {
133
- chunk,
134
- score: parseFloat(totalScore.toFixed(3)),
135
- matchReasons,
136
- symbols,
137
- codeSnippets,
138
- };
139
- }
@@ -1,31 +0,0 @@
1
- import type { ScoringWeights } from '../../shared/src/index.ts';
2
-
3
- export const DEFAULT_SCORING_WEIGHTS_V1: ScoringWeights = {
4
- version: '1.0.0',
5
- bm25Weight: 1.0,
6
- exactPhraseBonus: 5.0,
7
- titleBonus: 8.0,
8
- sectionPathBonus: 4.0,
9
- symbolMatchBonus: 10.0,
10
- intentTypeBonus: 6.0,
11
- versionBonus: 12.0,
12
- authorityWeights: {
13
- official: 1.0,
14
- community: 0.8,
15
- third_party: 0.6,
16
- },
17
- };
18
-
19
- export function resolveScoringWeights(overrides?: Partial<ScoringWeights>): ScoringWeights {
20
- if (!overrides) {
21
- return { ...DEFAULT_SCORING_WEIGHTS_V1 };
22
- }
23
- return {
24
- ...DEFAULT_SCORING_WEIGHTS_V1,
25
- ...overrides,
26
- authorityWeights: {
27
- ...DEFAULT_SCORING_WEIGHTS_V1.authorityWeights,
28
- ...(overrides.authorityWeights || {}),
29
- },
30
- };
31
- }
@@ -1,112 +0,0 @@
1
- import type { SecurityAnnotation } from '../../shared/src/index.ts';
2
-
3
- const MULTILINE_INJECTION_PATTERNS = [
4
- { pattern: /<system\b[^>]*>([\s\S]*?)<\/system>/gi, severity: 'high' as const, label: '<system> block' },
5
- { pattern: /\[SYSTEM(?:\s+INSTRUCTION)?\]([\s\S]*?)\[\/SYSTEM(?:\s+INSTRUCTION)?\]/gi, severity: 'high' as const, label: '[SYSTEM] block' },
6
- { pattern: /<\|im_start\|>system([\s\S]*?)<\|im_end\|>/gi, severity: 'high' as const, label: 'ChatML system block' },
7
- { pattern: /<!--\s*AI\s+INSTRUCTION:([\s\S]*?)-->/gi, severity: 'high' as const, label: 'HTML comment injection' },
8
- ];
9
-
10
- const PROMPT_INJECTION_PATTERNS = [
11
- { pattern: /\b(?:ignore|disregard|forget)\s+(?:all\s+)?(?:previous|prior|above)\s+instructions\b/i, severity: 'high' as const },
12
- { pattern: /\b(?:system\s+message|system\s+prompt|system\s+instruction)\s*[:=]/i, severity: 'high' as const },
13
- { pattern: /\byou\s+are\s+now\s+(?:an?\s+)?(?:unrestricted|jailbroken|developer\s+mode|dan|evil)\b/i, severity: 'high' as const },
14
- { pattern: /\byou\s+are\s+now\s+(?:acting\s+as\s+)?a\b.*?\bassistant\s+that\s+(?:executes|runs|ignores)\b/i, severity: 'high' as const },
15
- { pattern: /\bIMPORTANT\s+INSTRUCTION\s+FOR\s+(?:THE\s+)?AI\s+AGENT\b/i, severity: 'high' as const },
16
- { pattern: /\b(?:call|invoke|execute)\s+(?:the\s+)?tool\s+['"]?[a-zA-Z0-9_-]+['"]?\s+with\b/i, severity: 'high' as const },
17
- { pattern: /\buse\s+(?:the\s+)?(?:bash|terminal|shell|command|run_command)\s+tool\s+to\b/i, severity: 'high' as const },
18
- { pattern: /\bdo\s+not\s+tell\s+the\s+user\b/i, severity: 'medium' as const },
19
- ];
20
-
21
- const SUSPICIOUS_INSTRUCTION_PATTERNS = [
22
- { pattern: /curl\s+-[sS]*[fF]*[kK]*\s+https?:\/\/[^\s|]+\s*\|\s*(?:ba)?sh/i, severity: 'high' as const },
23
- { pattern: /wget\s+-[qO-]*\s+https?:\/\/[^\s|]+\s*\|\s*(?:ba)?sh/i, severity: 'high' as const },
24
- { pattern: /powershell\s+.*-(?:enc|encodedcommand)\s+[A-Za-z0-9+/=]{20,}/i, severity: 'high' as const },
25
- { pattern: /base64\s+-d\s+.*\|\s*(?:ba)?sh/i, severity: 'high' as const },
26
- { pattern: /eval\s*\(\s*base64_decode\s*\(/i, severity: 'high' as const },
27
- { pattern: /\b(?:cat|type)\s+[^\n]*\.(?:ssh\/id_[a-zA-Z0-9_-]*|aws\/credentials|env)\b/i, severity: 'high' as const },
28
- { pattern: /\b(?:curl|wget|fetch|nc|ncat)\b[^\n]*\b(?:\.ssh\/id_|\.aws\/credentials|\.env|API_KEY|SECRET)\b/i, severity: 'high' as const },
29
- { pattern: /\b(?:printenv|env)\b[^\n]*\|\s*(?:curl|nc|wget|base64)/i, severity: 'high' as const },
30
- ];
31
-
32
- const UNSAFE_LINK_PATTERNS = [
33
- { pattern: /\[[^\]]*\]\(((?:javascript|data|file):[\s\S]*?)\)(?:\.|\s|$)/i, severity: 'high' as const },
34
- ];
35
-
36
- /**
37
- * Scans documentation content for security hazards (prompt injection,
38
- * malicious execution snippets, unsafe links, credential harvesting) and returns
39
- * non-destructive annotations.
40
- *
41
- * Principle: External documentation is treated as untrusted data and structurally
42
- * separated from agent instructions. Original documentation text is never altered.
43
- */
44
- export function detectSecurityAnnotations(content: string): SecurityAnnotation[] {
45
- const annotations: SecurityAnnotation[] = [];
46
- if (!content) return annotations;
47
-
48
- // 1. Multiline patterns across whole content
49
- for (const rule of MULTILINE_INJECTION_PATTERNS) {
50
- let match: RegExpExecArray | null;
51
- const regex = new RegExp(rule.pattern.source, rule.pattern.flags);
52
- while ((match = regex.exec(content)) !== null) {
53
- const matchStart = match.index;
54
- const lineNumber = content.slice(0, matchStart).split('\n').length;
55
- annotations.push({
56
- type: 'prompt_injection_suspected',
57
- location: `Line ${lineNumber} (${rule.label})`,
58
- evidence: match[0].slice(0, 150).trim(),
59
- severity: rule.severity,
60
- });
61
- }
62
- }
63
-
64
- // 2. Line-by-line checks
65
- const lines = content.split('\n');
66
-
67
- for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {
68
- const line = lines[lineIdx];
69
- const loc = `Line ${lineIdx + 1}`;
70
-
71
- // Prompt injection checks
72
- for (const rule of PROMPT_INJECTION_PATTERNS) {
73
- const match = line.match(rule.pattern);
74
- if (match) {
75
- annotations.push({
76
- type: 'prompt_injection_suspected',
77
- location: loc,
78
- evidence: match[0].trim(),
79
- severity: rule.severity,
80
- });
81
- }
82
- }
83
-
84
- // Suspicious shell execution / credential theft checks
85
- for (const rule of SUSPICIOUS_INSTRUCTION_PATTERNS) {
86
- const match = line.match(rule.pattern);
87
- if (match) {
88
- annotations.push({
89
- type: 'suspicious_instruction',
90
- location: loc,
91
- evidence: match[0].trim(),
92
- severity: rule.severity,
93
- });
94
- }
95
- }
96
-
97
- // Unsafe link protocols check
98
- for (const rule of UNSAFE_LINK_PATTERNS) {
99
- const match = line.match(rule.pattern);
100
- if (match) {
101
- annotations.push({
102
- type: 'unsafe_link',
103
- location: loc,
104
- evidence: match[1] || match[0],
105
- severity: rule.severity,
106
- });
107
- }
108
- }
109
- }
110
-
111
- return annotations;
112
- }
@@ -1,153 +0,0 @@
1
- import { lookup } from 'node:dns/promises';
2
- import { isIP } from 'node:net';
3
- import { SsrfError } from '../../shared/src/index.ts';
4
-
5
- /**
6
- * Checks whether an IPv4 or IPv6 address is in a private, link-local, loopback,
7
- * or cloud provider metadata range.
8
- */
9
- export function isPrivateOrBlockedIp(ip: string): boolean {
10
- // IPv4 check
11
- if (isIP(ip) === 4) {
12
- const parts = ip.split('.').map(Number);
13
- if (parts.length !== 4 || parts.some(isNaN)) return true;
14
-
15
- const [b0, b1, b2, b3] = parts;
16
-
17
- // 0.0.0.0/8 (Current network)
18
- if (b0 === 0) return true;
19
-
20
- // 127.0.0.0/8 (Loopback)
21
- if (b0 === 127) return true;
22
-
23
- // 10.0.0.0/8 (RFC 1918 Private)
24
- if (b0 === 10) return true;
25
-
26
- // 172.16.0.0/12 (RFC 1918 Private: 172.16.0.0 - 172.31.255.255)
27
- if (b0 === 172 && b1 >= 16 && b1 <= 31) return true;
28
-
29
- // 192.168.0.0/16 (RFC 1918 Private)
30
- if (b0 === 192 && b1 === 168) return true;
31
-
32
- // 169.254.0.0/16 (Link-local & AWS/GCP/Azure instance metadata 169.254.169.254)
33
- if (b0 === 169 && b1 === 254) return true;
34
-
35
- // 100.64.0.0/10 (Carrier-grade NAT)
36
- if (b0 === 100 && b1 >= 64 && b1 <= 127) return true;
37
-
38
- // 192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24 (TEST-NET-1, 2, 3)
39
- if (b0 === 192 && b1 === 0 && b2 === 2) return true;
40
- if (b0 === 198 && b1 === 51 && b2 === 100) return true;
41
- if (b0 === 203 && b1 === 0 && b2 === 113) return true;
42
-
43
- // 224.0.0.0/4 (Multicast) & 240.0.0.0/4 (Reserved)
44
- if (b0 >= 224) return true;
45
-
46
- return false;
47
- }
48
-
49
- // IPv6 check
50
- if (isIP(ip) === 6) {
51
- const normalized = ip.toLowerCase();
52
-
53
- // ::1 (Loopback)
54
- if (normalized === '::1' || normalized === '0:0:0:0:0:0:0:1') return true;
55
-
56
- // :: (Unspecified)
57
- if (normalized === '::' || normalized === '0:0:0:0:0:0:0:0') return true;
58
-
59
- // fc00::/7 (Unique local addresses / private)
60
- if (normalized.startsWith('fc') || normalized.startsWith('fd')) return true;
61
-
62
- // fe80::/10 (Link-local unicast)
63
- if (normalized.startsWith('fe8') || normalized.startsWith('fe9') || normalized.startsWith('fea') || normalized.startsWith('feb')) {
64
- return true;
65
- }
66
-
67
- // IPv4-mapped IPv6 addresses (::ffff:x.x.x.x)
68
- if (normalized.startsWith('::ffff:')) {
69
- const ipv4Part = normalized.slice(7);
70
- return isPrivateOrBlockedIp(ipv4Part);
71
- }
72
-
73
- return false;
74
- }
75
-
76
- return true; // Not a recognized IP, block by default
77
- }
78
-
79
- export interface SsrfValidationOptions {
80
- allowLocalhostForTesting?: boolean;
81
- }
82
-
83
- /**
84
- * Validates a target URL against SSRF threats:
85
- * - Ensures valid HTTP/HTTPS protocol
86
- * - Validates hostname does not resolve to private or loopback IP
87
- */
88
- export async function validateTargetUrl(
89
- urlStr: string,
90
- options: SsrfValidationOptions = {}
91
- ): Promise<{ url: URL; resolvedIp: string }> {
92
- let url: URL;
93
- try {
94
- url = new URL(urlStr);
95
- } catch {
96
- throw new SsrfError(`Malformed target URL: "${urlStr}"`);
97
- }
98
-
99
- // Protocol check
100
- if (url.protocol !== 'http:' && url.protocol !== 'https:') {
101
- throw new SsrfError(`Disallowed protocol "${url.protocol}". Only http: and https: are allowed.`);
102
- }
103
-
104
- const hostname = url.hostname.toLowerCase();
105
- const cleanHost = (hostname.startsWith('[') && hostname.endsWith(']'))
106
- ? hostname.slice(1, -1)
107
- : hostname;
108
-
109
- // Handle explicit localhost / loopback strings
110
- if (cleanHost === 'localhost' || cleanHost === '127.0.0.1' || cleanHost === '::1') {
111
- if (options.allowLocalhostForTesting) {
112
- return { url, resolvedIp: cleanHost === 'localhost' ? '127.0.0.1' : cleanHost };
113
- }
114
- throw new SsrfError(`Access to localhost is prohibited for security.`, '127.0.0.1', cleanHost);
115
- }
116
-
117
- // If the hostname itself is a literal IP address (IPv4 or IPv6)
118
- if (isIP(cleanHost)) {
119
- if (isPrivateOrBlockedIp(cleanHost)) {
120
- if (options.allowLocalhostForTesting && (cleanHost === '127.0.0.1' || cleanHost === '::1')) {
121
- return { url, resolvedIp: cleanHost };
122
- }
123
- throw new SsrfError(`Access to private/blocked IP address "${cleanHost}" is prohibited.`, cleanHost, cleanHost);
124
- }
125
- return { url, resolvedIp: cleanHost };
126
- }
127
-
128
- // Resolve hostname via DNS
129
- try {
130
- const res = await lookup(cleanHost, { all: true });
131
- if (!res || res.length === 0) {
132
- throw new SsrfError(`Hostname "${cleanHost}" could not be resolved via DNS.`);
133
- }
134
-
135
- for (const record of res) {
136
- if (isPrivateOrBlockedIp(record.address)) {
137
- if (options.allowLocalhostForTesting && (record.address === '127.0.0.1' || record.address === '::1')) {
138
- continue;
139
- }
140
- throw new SsrfError(
141
- `Hostname "${cleanHost}" resolved to blocked/private IP address "${record.address}".`,
142
- record.address,
143
- cleanHost
144
- );
145
- }
146
- }
147
-
148
- return { url, resolvedIp: res[0].address };
149
- } catch (err: unknown) {
150
- if (err instanceof SsrfError) throw err;
151
- throw new SsrfError(`DNS resolution failure for host "${cleanHost}": ${err instanceof Error ? err.message : String(err)}`);
152
- }
153
- }
@@ -1,53 +0,0 @@
1
- export class DocOrbitError extends Error {
2
- code: string;
3
-
4
- constructor(message: string, code: string = 'DOCORBIT_ERROR') {
5
- super(message);
6
- this.name = 'DocOrbitError';
7
- this.code = code;
8
- }
9
- }
10
-
11
- export class SsrfError extends DocOrbitError {
12
- ip?: string;
13
- host?: string;
14
-
15
- constructor(message: string, ip?: string, host?: string) {
16
- super(message, 'SSRF_BLOCKED');
17
- this.name = 'SsrfError';
18
- this.ip = ip;
19
- this.host = host;
20
- }
21
- }
22
-
23
- export class FetchTimeoutError extends DocOrbitError {
24
- timeoutMs?: number;
25
-
26
- constructor(message: string, timeoutMs?: number) {
27
- super(message, 'FETCH_TIMEOUT');
28
- this.name = 'FetchTimeoutError';
29
- this.timeoutMs = timeoutMs;
30
- }
31
- }
32
-
33
- export class PayloadTooLargeError extends DocOrbitError {
34
- byteCount?: number;
35
- maxBytes?: number;
36
-
37
- constructor(message: string, byteCount?: number, maxBytes?: number) {
38
- super(message, 'PAYLOAD_TOO_LARGE');
39
- this.name = 'PayloadTooLargeError';
40
- this.byteCount = byteCount;
41
- this.maxBytes = maxBytes;
42
- }
43
- }
44
-
45
- export class ValidationError extends DocOrbitError {
46
- validationDetails?: unknown;
47
-
48
- constructor(message: string, validationDetails?: unknown) {
49
- super(message, 'VALIDATION_FAILED');
50
- this.name = 'ValidationError';
51
- this.validationDetails = validationDetails;
52
- }
53
- }
@@ -1,23 +0,0 @@
1
- import { createHash } from 'node:crypto';
2
-
3
- export function computeSha256(content: string | Buffer): string {
4
- return createHash('sha256').update(content).digest('hex');
5
- }
6
-
7
- export function computeContentHash(content: string): string {
8
- // Normalize line endings and line-by-line trailing whitespace for canonical stability
9
- const normalized = content
10
- .replace(/\r\n/g, '\n')
11
- .replace(/\r/g, '\n')
12
- .split('\n')
13
- .map(line => line.trimEnd())
14
- .join('\n')
15
- .trim();
16
- return computeSha256(normalized);
17
- }
18
-
19
- export function estimateTokenCount(text: string): number {
20
- // Heuristic: roughly ~4 characters per token for English and Markdown/code
21
- if (!text) return 0;
22
- return Math.ceil(text.length / 4);
23
- }