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,18 @@
1
+ import type { McpToolHandler } from './types.ts';
2
+ import { SearchDocsTool } from './search-docs.ts';
3
+ import { GetDocTool } from './get-doc.ts';
4
+ import { FindApiTool } from './find-api.ts';
5
+ import { FindExampleTool } from './find-example.ts';
6
+ import { FindPitfallTool } from './find-pitfall.ts';
7
+ import { FindRecipeTool } from './find-recipe.ts';
8
+ import { GetVersionTool } from './get-version.ts';
9
+ import { ListSourcesTool } from './list-sources.ts';
10
+ import { ImplementationContextTool } from './implementation-context.ts';
11
+ import { CheckApiTool } from './check-api.ts';
12
+ import { DiffDocsTool } from './diff-docs.ts';
13
+ import { AnalyzeImpactTool } from './analyze-impact.ts';
14
+ import { GetDocumentationMapTool } from './get-docs-map.ts';
15
+ import { ExportAgentContextTool } from './export-context.ts';
16
+ export * from './types.ts';
17
+ export { SearchDocsTool, GetDocTool, FindApiTool, FindExampleTool, FindPitfallTool, FindRecipeTool, GetVersionTool, ListSourcesTool, ImplementationContextTool, ImplementationContextTool as GetImplementationContextTool, CheckApiTool, DiffDocsTool, AnalyzeImpactTool, GetDocumentationMapTool, ExportAgentContextTool, };
18
+ export declare function createDefaultTools(): Map<string, McpToolHandler>;
@@ -0,0 +1,39 @@
1
+ import { SearchDocsTool } from "./search-docs.js";
2
+ import { GetDocTool } from "./get-doc.js";
3
+ import { FindApiTool } from "./find-api.js";
4
+ import { FindExampleTool } from "./find-example.js";
5
+ import { FindPitfallTool } from "./find-pitfall.js";
6
+ import { FindRecipeTool } from "./find-recipe.js";
7
+ import { GetVersionTool } from "./get-version.js";
8
+ import { ListSourcesTool } from "./list-sources.js";
9
+ import { ImplementationContextTool } from "./implementation-context.js";
10
+ import { CheckApiTool } from "./check-api.js";
11
+ import { DiffDocsTool } from "./diff-docs.js";
12
+ import { AnalyzeImpactTool } from "./analyze-impact.js";
13
+ import { GetDocumentationMapTool } from "./get-docs-map.js";
14
+ import { ExportAgentContextTool } from "./export-context.js";
15
+ export * from "./types.js";
16
+ export { SearchDocsTool, GetDocTool, FindApiTool, FindExampleTool, FindPitfallTool, FindRecipeTool, GetVersionTool, ListSourcesTool, ImplementationContextTool, ImplementationContextTool as GetImplementationContextTool, CheckApiTool, DiffDocsTool, AnalyzeImpactTool, GetDocumentationMapTool, ExportAgentContextTool, };
17
+ export function createDefaultTools() {
18
+ const tools = new Map();
19
+ const list = [
20
+ new SearchDocsTool(),
21
+ new GetDocTool(),
22
+ new FindApiTool(),
23
+ new FindExampleTool(),
24
+ new FindPitfallTool(),
25
+ new FindRecipeTool(),
26
+ new GetVersionTool(),
27
+ new ListSourcesTool(),
28
+ new ImplementationContextTool(),
29
+ new CheckApiTool(),
30
+ new DiffDocsTool(),
31
+ new AnalyzeImpactTool(),
32
+ new GetDocumentationMapTool(),
33
+ new ExportAgentContextTool(),
34
+ ];
35
+ for (const tool of list) {
36
+ tools.set(tool.definition.name, tool);
37
+ }
38
+ return tools;
39
+ }
@@ -0,0 +1,6 @@
1
+ import type { CallToolResult, McpTool } from '../types.ts';
2
+ import type { McpContext, McpToolHandler } from './types.ts';
3
+ export declare class ListSourcesTool implements McpToolHandler {
4
+ readonly definition: McpTool;
5
+ execute(args: Record<string, unknown>, ctx: McpContext): Promise<CallToolResult>;
6
+ }
@@ -0,0 +1,76 @@
1
+ export class ListSourcesTool {
2
+ definition = {
3
+ name: 'list_sources',
4
+ description: 'List all indexed documentation sources, snapshot records, doc versions, and machine-readability status.',
5
+ inputSchema: {
6
+ type: 'object',
7
+ properties: {
8
+ limit: {
9
+ type: 'number',
10
+ description: 'Maximum number of sources to list (default: 50).',
11
+ },
12
+ },
13
+ },
14
+ };
15
+ async execute(args, ctx) {
16
+ const limit = typeof args.limit === 'number' && args.limit > 0 ? args.limit : 50;
17
+ const sources = ctx.repo.listSources().slice(0, limit);
18
+ const snapshots = ctx.repo.listSnapshots();
19
+ if (sources.length === 0) {
20
+ return {
21
+ content: [
22
+ {
23
+ type: 'text',
24
+ text: JSON.stringify({
25
+ markdown: '### Indexed Documentation Sources\n\nNo documentation sources have been added yet. Use `docorbit add <url>` to ingest documentation.',
26
+ data: { count: 0, sources: [] },
27
+ }, null, 2),
28
+ },
29
+ ],
30
+ };
31
+ }
32
+ const formatted = sources.map(s => {
33
+ const sourceSnaps = snapshots.filter(sn => sn.sourceId === s.id);
34
+ return {
35
+ id: s.id,
36
+ url: s.url,
37
+ type: s.type,
38
+ status: s.status,
39
+ authority: s.authority,
40
+ confidence: s.confidence,
41
+ machineReadable: s.machineReadable,
42
+ snapshots: sourceSnaps.map(sn => ({
43
+ id: sn.id,
44
+ pageCount: sn.pageCount,
45
+ docVersion: sn.docVersion,
46
+ capturedAt: sn.capturedAt,
47
+ })),
48
+ };
49
+ });
50
+ const lines = [`### Indexed Documentation Sources (${sources.length} sources)\n`];
51
+ for (const s of formatted) {
52
+ const icon = s.status === 'valid' ? '✓' : '✗';
53
+ lines.push(`- **${icon} [${s.type}]** ${s.url}`);
54
+ lines.push(` *Authority*: ${s.authority} | *Confidence*: ${Math.round(s.confidence * 100)}% | *Machine-Readable*: ${s.machineReadable}`);
55
+ if (s.snapshots.length > 0) {
56
+ const snapInfo = s.snapshots.map(sn => `${sn.id}${sn.docVersion ? ` (${sn.docVersion})` : ''} [${sn.pageCount} pages]`).join(', ');
57
+ lines.push(` *Snapshots*: ${snapInfo}`);
58
+ }
59
+ lines.push('');
60
+ }
61
+ return {
62
+ content: [
63
+ {
64
+ type: 'text',
65
+ text: JSON.stringify({
66
+ markdown: lines.join('\n'),
67
+ data: {
68
+ count: formatted.length,
69
+ sources: formatted,
70
+ },
71
+ }, null, 2),
72
+ },
73
+ ],
74
+ };
75
+ }
76
+ }
@@ -0,0 +1,6 @@
1
+ import type { CallToolResult, McpTool } from '../types.ts';
2
+ import type { McpContext, McpToolHandler } from './types.ts';
3
+ export declare class SearchDocsTool implements McpToolHandler {
4
+ readonly definition: McpTool;
5
+ execute(args: Record<string, unknown>, ctx: McpContext): Promise<CallToolResult>;
6
+ }
@@ -0,0 +1,113 @@
1
+ import { RetrievalEngine } from "../../../retrieval/src/index.js";
2
+ export class SearchDocsTool {
3
+ definition = {
4
+ name: 'search_docs',
5
+ description: 'Search documentation chunks using hybrid FTS5 ranking, symbol awareness, and optional version filtering.',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {
9
+ query: {
10
+ type: 'string',
11
+ description: 'The search query, code symbol, or concept to look for.',
12
+ },
13
+ library: {
14
+ type: 'string',
15
+ description: 'Optional library name to narrow search scope.',
16
+ },
17
+ version: {
18
+ type: 'string',
19
+ description: 'Target documentation version (e.g. "v14", "15.0").',
20
+ },
21
+ limit: {
22
+ type: 'number',
23
+ description: 'Maximum number of results to return (default: 10).',
24
+ },
25
+ },
26
+ required: ['query'],
27
+ },
28
+ };
29
+ async execute(args, ctx) {
30
+ const query = typeof args.query === 'string' ? args.query.trim() : '';
31
+ if (!query) {
32
+ return {
33
+ isError: true,
34
+ content: [{ type: 'text', text: JSON.stringify({ error: 'Missing required parameter: query' }) }],
35
+ };
36
+ }
37
+ const version = typeof args.docVersion === 'string'
38
+ ? args.docVersion
39
+ : (typeof args.version === 'string' ? args.version : undefined);
40
+ const limit = typeof args.limit === 'number' && args.limit > 0 ? args.limit : 10;
41
+ const engine = new RetrievalEngine(ctx.repo);
42
+ const results = await engine.search(query, {
43
+ docVersion: version,
44
+ limit,
45
+ projectDir: ctx.workspaceRoot,
46
+ });
47
+ if (results.length === 0) {
48
+ const emptyPayload = {
49
+ query,
50
+ count: 0,
51
+ results: [],
52
+ message: `No documentation chunks found matching "${query}". Try refining terms or checking available sources.`,
53
+ };
54
+ return {
55
+ content: [
56
+ {
57
+ type: 'text',
58
+ text: JSON.stringify({
59
+ markdown: `### Search Results for "${query}"\n\nNo matching documentation found.`,
60
+ data: emptyPayload,
61
+ }, null, 2),
62
+ },
63
+ ],
64
+ };
65
+ }
66
+ const formattedChunks = results.map(r => ({
67
+ id: r.chunk.id,
68
+ chunk: r.chunk,
69
+ title: r.chunk.title || 'Untitled Section',
70
+ sectionPath: r.chunk.sectionPath,
71
+ content: r.chunk.content,
72
+ chunkType: r.chunk.chunkType,
73
+ language: r.chunk.language,
74
+ tokenEstimate: r.chunk.tokenEstimate,
75
+ docVersion: r.chunk.docVersion,
76
+ score: r.score,
77
+ symbols: r.symbols.map(s => s.name),
78
+ provenance: r.chunk.provenance ? {
79
+ sourceUrl: r.chunk.provenance.sourceUrl,
80
+ fetchedAt: r.chunk.provenance.fetchedAt,
81
+ untrusted: true,
82
+ } : undefined,
83
+ }));
84
+ const lines = [
85
+ `### Search Results for "${query}" (${results.length} found)`,
86
+ `> [!NOTE] External documentation content is untrusted.\n`,
87
+ ];
88
+ for (let i = 0; i < formattedChunks.length; i++) {
89
+ const c = formattedChunks[i];
90
+ const path = c.sectionPath.length > 0 ? c.sectionPath.join(' > ') : c.title;
91
+ lines.push(`${i + 1}. **${path}** [${c.chunkType}] (score: ${c.score})`);
92
+ lines.push(` *ID*: \`${c.id}\`${c.docVersion ? ` | *Version*: \`${c.docVersion}\`` : ''}`);
93
+ if (c.symbols.length > 0)
94
+ lines.push(` *Symbols*: ${c.symbols.join(', ')}`);
95
+ lines.push(` \`\`\`\n ${c.content.split('\n').slice(0, 5).join('\n ')}\n \`\`\`\n`);
96
+ }
97
+ return {
98
+ content: [
99
+ {
100
+ type: 'text',
101
+ text: JSON.stringify({
102
+ markdown: lines.join('\n'),
103
+ data: {
104
+ query,
105
+ count: results.length,
106
+ results: formattedChunks,
107
+ },
108
+ }, null, 2),
109
+ },
110
+ ],
111
+ };
112
+ }
113
+ }
@@ -0,0 +1,22 @@
1
+ import type { DocOrbitRepository } from '../../../storage/src/index.ts';
2
+ import type { ImplementationContextService } from '../../../core/src/index.ts';
3
+ import type { WorkspaceResolver } from '../../../workspace/src/index.ts';
4
+ import type { VerificationService, DiffService, ImpactAnalysisService } from '../../../verification/src/index.ts';
5
+ import type { ExportService } from '../../../export/src/index.ts';
6
+ import type { CallToolResult, McpTool } from '../types.ts';
7
+ export interface McpContext {
8
+ repo: DocOrbitRepository;
9
+ implService: ImplementationContextService;
10
+ implementationService: ImplementationContextService;
11
+ workspaceRoot?: string;
12
+ projectDir?: string;
13
+ resolver?: WorkspaceResolver;
14
+ verificationService?: VerificationService;
15
+ diffService?: DiffService;
16
+ impactService?: ImpactAnalysisService;
17
+ exportService?: ExportService;
18
+ }
19
+ export interface McpToolHandler {
20
+ readonly definition: McpTool;
21
+ execute(args: Record<string, unknown>, ctx: McpContext): Promise<CallToolResult>;
22
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,31 @@
1
+ import * as http from 'node:http';
2
+ import type { McpServer } from '../server.ts';
3
+ import type { McpTransport } from './types.ts';
4
+ export interface HttpTransportOptions {
5
+ port?: number;
6
+ host?: string;
7
+ maxBodyBytes?: number;
8
+ noListen?: boolean;
9
+ }
10
+ export declare class StreamableHttpTransport implements McpTransport {
11
+ private port;
12
+ private host;
13
+ private maxBodyBytes;
14
+ private noListen;
15
+ private serverInstance;
16
+ private mcpServer;
17
+ private sseClients;
18
+ private heartbeatTimer;
19
+ constructor(options?: HttpTransportOptions);
20
+ getServerInstance(): http.Server | null;
21
+ dispatch(req: http.IncomingMessage, res: http.ServerResponse): Promise<void>;
22
+ getPort(): number;
23
+ start(server: McpServer): Promise<void>;
24
+ private setCorsHeaders;
25
+ private handleHttpRequest;
26
+ private handleSseConnection;
27
+ private handleMcpPost;
28
+ private readBody;
29
+ private startHeartbeats;
30
+ close(): Promise<void>;
31
+ }
@@ -0,0 +1,215 @@
1
+ import * as http from 'node:http';
2
+ import { JSONRPC_ERRORS } from "../types.js";
3
+ export class StreamableHttpTransport {
4
+ port;
5
+ host;
6
+ maxBodyBytes;
7
+ noListen;
8
+ serverInstance = null;
9
+ mcpServer = null;
10
+ sseClients = new Set();
11
+ heartbeatTimer = null;
12
+ constructor(options = {}) {
13
+ this.port = options.port ?? 3000;
14
+ this.host = options.host ?? '127.0.0.1';
15
+ this.maxBodyBytes = options.maxBodyBytes ?? 10 * 1024 * 1024; // 10MB
16
+ this.noListen = options.noListen ?? false;
17
+ }
18
+ getServerInstance() {
19
+ return this.serverInstance;
20
+ }
21
+ async dispatch(req, res) {
22
+ return this.handleHttpRequest(req, res);
23
+ }
24
+ getPort() {
25
+ if (this.serverInstance) {
26
+ const addr = this.serverInstance.address();
27
+ if (addr && typeof addr === 'object') {
28
+ return addr.port;
29
+ }
30
+ }
31
+ return this.port;
32
+ }
33
+ async start(server) {
34
+ this.mcpServer = server;
35
+ this.serverInstance = http.createServer((req, res) => {
36
+ this.handleHttpRequest(req, res).catch(err => {
37
+ if (!res.headersSent) {
38
+ res.writeHead(500, { 'Content-Type': 'application/json' });
39
+ res.end(JSON.stringify({ error: err instanceof Error ? err.message : String(err) }));
40
+ }
41
+ });
42
+ });
43
+ if (this.noListen) {
44
+ return;
45
+ }
46
+ return new Promise((resolve, reject) => {
47
+ this.serverInstance.on('error', reject);
48
+ this.serverInstance.listen(this.port, this.host, () => {
49
+ this.startHeartbeats();
50
+ resolve();
51
+ });
52
+ });
53
+ }
54
+ setCorsHeaders(res) {
55
+ res.setHeader('Access-Control-Allow-Origin', '*');
56
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
57
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, Accept');
58
+ }
59
+ async handleHttpRequest(req, res) {
60
+ this.setCorsHeaders(res);
61
+ if (req.method === 'OPTIONS') {
62
+ res.writeHead(204);
63
+ res.end();
64
+ return;
65
+ }
66
+ const url = new URL(req.url || '/', `http://${this.host}:${this.port}`);
67
+ const pathname = url.pathname;
68
+ if (req.method === 'GET' && (pathname === '/health' || pathname === '/')) {
69
+ res.writeHead(200, { 'Content-Type': 'application/json' });
70
+ res.end(JSON.stringify({
71
+ status: 'ok',
72
+ server: 'docorbit-mcp',
73
+ version: '0.5.0',
74
+ endpoints: {
75
+ mcp: '/mcp',
76
+ sse: '/sse',
77
+ health: '/health',
78
+ },
79
+ }));
80
+ return;
81
+ }
82
+ if (req.method === 'GET' && pathname === '/sse') {
83
+ this.handleSseConnection(req, res);
84
+ return;
85
+ }
86
+ if (req.method === 'POST' && pathname === '/mcp') {
87
+ await this.handleMcpPost(req, res);
88
+ return;
89
+ }
90
+ res.writeHead(404, { 'Content-Type': 'application/json' });
91
+ res.end(JSON.stringify({ error: `Not found: ${req.method} ${pathname}` }));
92
+ }
93
+ handleSseConnection(req, res) {
94
+ res.writeHead(200, {
95
+ 'Content-Type': 'text/event-stream',
96
+ 'Cache-Control': 'no-cache',
97
+ 'Connection': 'keep-alive',
98
+ });
99
+ // Send endpoint notification so client knows where to POST messages
100
+ res.write('event: endpoint\ndata: /mcp\n\n');
101
+ this.sseClients.add(res);
102
+ req.on('close', () => {
103
+ this.sseClients.delete(res);
104
+ });
105
+ }
106
+ async handleMcpPost(req, res) {
107
+ const rawBody = await this.readBody(req);
108
+ let parsed;
109
+ try {
110
+ parsed = JSON.parse(rawBody);
111
+ }
112
+ catch {
113
+ res.writeHead(400, { 'Content-Type': 'application/json' });
114
+ res.end(JSON.stringify({
115
+ jsonrpc: '2.0',
116
+ id: null,
117
+ error: {
118
+ code: JSONRPC_ERRORS.PARSE_ERROR,
119
+ message: 'Parse error: invalid JSON payload.',
120
+ },
121
+ }));
122
+ return;
123
+ }
124
+ if (!this.mcpServer) {
125
+ res.writeHead(503, { 'Content-Type': 'application/json' });
126
+ res.end(JSON.stringify({ error: 'Server not initialized' }));
127
+ return;
128
+ }
129
+ let responsePayload;
130
+ if (Array.isArray(parsed)) {
131
+ const responses = await Promise.all(parsed.map(item => this.mcpServer.handleMessage(item)));
132
+ responsePayload = responses.filter(r => r !== null);
133
+ }
134
+ else {
135
+ responsePayload = await this.mcpServer.handleMessage(parsed);
136
+ }
137
+ const acceptHeader = req.headers['accept'] || '';
138
+ const wantsSse = acceptHeader.includes('text/event-stream');
139
+ if (wantsSse) {
140
+ // Modern Streamable HTTP response over SSE chunk
141
+ res.writeHead(200, {
142
+ 'Content-Type': 'text/event-stream',
143
+ 'Cache-Control': 'no-cache',
144
+ 'Connection': 'keep-alive',
145
+ });
146
+ if (responsePayload !== null && responsePayload !== undefined) {
147
+ res.write(`event: message\ndata: ${JSON.stringify(responsePayload)}\n\n`);
148
+ }
149
+ res.end();
150
+ return;
151
+ }
152
+ // Standard JSON response
153
+ if (responsePayload === null || responsePayload === undefined) {
154
+ res.writeHead(204);
155
+ res.end();
156
+ return;
157
+ }
158
+ res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
159
+ res.end(JSON.stringify(responsePayload));
160
+ }
161
+ readBody(req) {
162
+ return new Promise((resolve, reject) => {
163
+ const chunks = [];
164
+ let totalLength = 0;
165
+ req.on('data', chunk => {
166
+ const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
167
+ totalLength += buf.length;
168
+ if (totalLength > this.maxBodyBytes) {
169
+ req.destroy(new Error(`Payload exceeds maximum limit of ${this.maxBodyBytes} bytes`));
170
+ return;
171
+ }
172
+ chunks.push(buf);
173
+ });
174
+ req.on('end', () => {
175
+ resolve(Buffer.concat(chunks).toString('utf-8'));
176
+ });
177
+ req.on('error', reject);
178
+ });
179
+ }
180
+ startHeartbeats() {
181
+ if (this.heartbeatTimer)
182
+ clearInterval(this.heartbeatTimer);
183
+ this.heartbeatTimer = setInterval(() => {
184
+ for (const client of this.sseClients) {
185
+ try {
186
+ client.write(': ping\n\n');
187
+ }
188
+ catch {
189
+ this.sseClients.delete(client);
190
+ }
191
+ }
192
+ }, 15000);
193
+ }
194
+ async close() {
195
+ if (this.heartbeatTimer) {
196
+ clearInterval(this.heartbeatTimer);
197
+ this.heartbeatTimer = null;
198
+ }
199
+ for (const client of this.sseClients) {
200
+ try {
201
+ client.end();
202
+ }
203
+ catch {
204
+ // Continue
205
+ }
206
+ }
207
+ this.sseClients.clear();
208
+ if (this.serverInstance) {
209
+ await new Promise((resolve) => {
210
+ this.serverInstance.close(() => resolve());
211
+ });
212
+ this.serverInstance = null;
213
+ }
214
+ }
215
+ }
@@ -0,0 +1,22 @@
1
+ import type { Readable, Writable } from 'node:stream';
2
+ import type { McpServer } from '../server.ts';
3
+ import type { McpTransport } from './types.ts';
4
+ export interface StdioTransportOptions {
5
+ input?: Readable;
6
+ output?: Writable;
7
+ errorOutput?: Writable;
8
+ }
9
+ export declare class StdioServerTransport implements McpTransport {
10
+ private input;
11
+ private output;
12
+ private errorOutput;
13
+ private rl;
14
+ private server;
15
+ private running;
16
+ constructor(options?: StdioTransportOptions);
17
+ start(server: McpServer): Promise<void>;
18
+ private processLine;
19
+ private send;
20
+ private log;
21
+ close(): Promise<void>;
22
+ }
@@ -0,0 +1,86 @@
1
+ import * as readline from 'node:readline';
2
+ import { JSONRPC_ERRORS } from "../types.js";
3
+ export class StdioServerTransport {
4
+ input;
5
+ output;
6
+ errorOutput;
7
+ rl = null;
8
+ server = null;
9
+ running = false;
10
+ constructor(options = {}) {
11
+ this.input = options.input || process.stdin;
12
+ this.output = options.output || process.stdout;
13
+ this.errorOutput = options.errorOutput || process.stderr;
14
+ }
15
+ async start(server) {
16
+ this.server = server;
17
+ this.running = true;
18
+ this.rl = readline.createInterface({
19
+ input: this.input,
20
+ terminal: false,
21
+ });
22
+ this.log('[DocOrbit MCP] Stdio transport started.');
23
+ this.rl.on('line', async (line) => {
24
+ try {
25
+ await this.processLine(line);
26
+ }
27
+ catch (err) {
28
+ this.log(`[DocOrbit MCP] Stdio error processing line: ${err instanceof Error ? err.message : String(err)}`);
29
+ }
30
+ });
31
+ this.rl.on('close', () => {
32
+ this.running = false;
33
+ this.log('[DocOrbit MCP] Stdio transport stream closed.');
34
+ });
35
+ }
36
+ async processLine(line) {
37
+ let parsed;
38
+ try {
39
+ parsed = JSON.parse(line);
40
+ }
41
+ catch {
42
+ const parseError = {
43
+ jsonrpc: '2.0',
44
+ id: null,
45
+ error: {
46
+ code: JSONRPC_ERRORS.PARSE_ERROR,
47
+ message: 'Parse error: invalid JSON payload.',
48
+ },
49
+ };
50
+ this.send(parseError);
51
+ return;
52
+ }
53
+ if (!this.server)
54
+ return;
55
+ if (Array.isArray(parsed)) {
56
+ // JSON-RPC Batch
57
+ const responses = await Promise.all(parsed.map(item => this.server.handleMessage(item)));
58
+ const filtered = responses.filter(r => r !== null);
59
+ if (filtered.length > 0) {
60
+ this.send(filtered);
61
+ }
62
+ return;
63
+ }
64
+ const response = await this.server.handleMessage(parsed);
65
+ if (response !== null) {
66
+ this.send(response);
67
+ }
68
+ }
69
+ send(payload) {
70
+ if (!this.running)
71
+ return;
72
+ const serialized = JSON.stringify(payload) + '\n';
73
+ this.output.write(serialized);
74
+ }
75
+ log(message) {
76
+ // Isolated to stderr to never corrupt stdout JSON-RPC stream
77
+ this.errorOutput.write(`${message}\n`);
78
+ }
79
+ async close() {
80
+ this.running = false;
81
+ if (this.rl) {
82
+ this.rl.close();
83
+ this.rl = null;
84
+ }
85
+ }
86
+ }
@@ -1,6 +1,5 @@
1
1
  import type { McpServer } from '../server.ts';
2
-
3
2
  export interface McpTransport {
4
- start(server: McpServer): Promise<void>;
5
- close(): Promise<void>;
3
+ start(server: McpServer): Promise<void>;
4
+ close(): Promise<void>;
6
5
  }
@@ -0,0 +1 @@
1
+ export {};