docorbit 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (405) hide show
  1. package/README.md +29 -15
  2. package/bin/docorbit.js +2 -2
  3. package/dist/apps/cli/src/commands/add.d.ts +7 -0
  4. package/dist/apps/cli/src/commands/add.js +35 -0
  5. package/dist/apps/cli/src/commands/api.d.ts +2 -0
  6. package/dist/apps/cli/src/commands/api.js +35 -0
  7. package/dist/apps/cli/src/commands/context.d.ts +10 -0
  8. package/dist/apps/cli/src/commands/context.js +36 -0
  9. package/dist/apps/cli/src/commands/dashboard.d.ts +8 -0
  10. package/dist/apps/cli/src/commands/dashboard.js +43 -0
  11. package/dist/apps/cli/src/commands/diff.d.ts +2 -0
  12. package/dist/apps/cli/src/commands/diff.js +29 -0
  13. package/dist/apps/cli/src/commands/evaluate.d.ts +11 -0
  14. package/dist/apps/cli/src/commands/evaluate.js +101 -0
  15. package/dist/apps/cli/src/commands/examples.d.ts +2 -0
  16. package/dist/apps/cli/src/commands/examples.js +36 -0
  17. package/dist/apps/cli/src/commands/export.d.ts +11 -0
  18. package/dist/apps/cli/src/commands/export.js +72 -0
  19. package/dist/apps/cli/src/commands/impact.d.ts +2 -0
  20. package/dist/apps/cli/src/commands/impact.js +30 -0
  21. package/dist/apps/cli/src/commands/init.d.ts +5 -0
  22. package/dist/apps/cli/src/commands/init.js +52 -0
  23. package/dist/apps/cli/src/commands/inspect.d.ts +5 -0
  24. package/dist/apps/cli/src/commands/inspect.js +24 -0
  25. package/dist/apps/cli/src/commands/mcp.d.ts +8 -0
  26. package/dist/apps/cli/src/commands/mcp.js +49 -0
  27. package/dist/apps/cli/src/commands/pitfalls.d.ts +2 -0
  28. package/dist/apps/cli/src/commands/pitfalls.js +35 -0
  29. package/dist/apps/cli/src/commands/recipes.d.ts +2 -0
  30. package/dist/apps/cli/src/commands/recipes.js +33 -0
  31. package/dist/apps/cli/src/commands/search.d.ts +11 -0
  32. package/dist/apps/cli/src/commands/search.js +36 -0
  33. package/dist/apps/cli/src/commands/update.d.ts +6 -0
  34. package/dist/apps/cli/src/commands/update.js +53 -0
  35. package/dist/apps/cli/src/commands/verify.d.ts +2 -0
  36. package/dist/apps/cli/src/commands/verify.js +44 -0
  37. package/dist/apps/cli/src/formatters/colors.d.ts +21 -0
  38. package/dist/apps/cli/src/formatters/colors.js +22 -0
  39. package/dist/apps/cli/src/formatters/inspection.d.ts +3 -0
  40. package/dist/apps/cli/src/formatters/inspection.js +88 -0
  41. package/dist/apps/cli/src/formatters/knowledge.d.ts +5 -0
  42. package/dist/apps/cli/src/formatters/knowledge.js +229 -0
  43. package/dist/apps/cli/src/formatters/retrieval.d.ts +3 -0
  44. package/dist/apps/cli/src/formatters/retrieval.js +61 -0
  45. package/{apps/cli/src/formatters/terminal.ts → dist/apps/cli/src/formatters/terminal.d.ts} +0 -1
  46. package/dist/apps/cli/src/formatters/terminal.js +5 -0
  47. package/dist/apps/cli/src/formatters/verification.d.ts +4 -0
  48. package/dist/apps/cli/src/formatters/verification.js +102 -0
  49. package/dist/apps/cli/src/index.d.ts +1 -0
  50. package/dist/apps/cli/src/index.js +376 -0
  51. package/dist/packages/core/src/dashboard/server.d.ts +33 -0
  52. package/dist/packages/core/src/dashboard/server.js +267 -0
  53. package/dist/packages/core/src/dashboard/ui.d.ts +5 -0
  54. package/{packages/core/src/dashboard/ui.ts → dist/packages/core/src/dashboard/ui.js} +2 -2
  55. package/dist/packages/core/src/implementation-service.d.ts +73 -0
  56. package/dist/packages/core/src/implementation-service.js +325 -0
  57. package/{packages/core/src/index.ts → dist/packages/core/src/index.d.ts} +0 -1
  58. package/dist/packages/core/src/index.js +6 -0
  59. package/dist/packages/core/src/inspector.d.ts +22 -0
  60. package/dist/packages/core/src/inspector.js +38 -0
  61. package/dist/packages/core/src/pipeline.d.ts +45 -0
  62. package/dist/packages/core/src/pipeline.js +246 -0
  63. package/dist/packages/crawler/src/config.d.ts +2 -0
  64. package/dist/packages/crawler/src/config.js +10 -0
  65. package/dist/packages/crawler/src/fetcher.d.ts +31 -0
  66. package/dist/packages/crawler/src/fetcher.js +139 -0
  67. package/dist/packages/crawler/src/index.js +2 -0
  68. package/dist/packages/discovery/src/index.d.ts +11 -0
  69. package/dist/packages/discovery/src/index.js +29 -0
  70. package/dist/packages/discovery/src/provider.d.ts +12 -0
  71. package/dist/packages/discovery/src/provider.js +30 -0
  72. package/dist/packages/discovery/src/providers/generic.d.ts +7 -0
  73. package/dist/packages/discovery/src/providers/generic.js +94 -0
  74. package/dist/packages/discovery/src/providers/github.d.ts +7 -0
  75. package/dist/packages/discovery/src/providers/github.js +52 -0
  76. package/dist/packages/discovery/src/providers/llms-txt.d.ts +7 -0
  77. package/dist/packages/discovery/src/providers/llms-txt.js +60 -0
  78. package/dist/packages/discovery/src/providers/markdown.d.ts +7 -0
  79. package/dist/packages/discovery/src/providers/markdown.js +38 -0
  80. package/dist/packages/discovery/src/providers/openapi.d.ts +7 -0
  81. package/dist/packages/discovery/src/providers/openapi.js +77 -0
  82. package/dist/packages/discovery/src/providers/sitemap.d.ts +7 -0
  83. package/dist/packages/discovery/src/providers/sitemap.js +53 -0
  84. package/dist/packages/discovery/src/providers/skill.d.ts +7 -0
  85. package/dist/packages/discovery/src/providers/skill.js +46 -0
  86. package/dist/packages/discovery/src/ranker.d.ts +6 -0
  87. package/dist/packages/discovery/src/ranker.js +107 -0
  88. package/dist/packages/evaluation/src/dataset.d.ts +2 -0
  89. package/dist/packages/evaluation/src/dataset.js +944 -0
  90. package/dist/packages/evaluation/src/index.js +8 -0
  91. package/dist/packages/evaluation/src/runner.d.ts +7 -0
  92. package/dist/packages/evaluation/src/runner.js +196 -0
  93. package/dist/packages/evaluation/src/strategies/context7-runner.d.ts +24 -0
  94. package/dist/packages/evaluation/src/strategies/context7-runner.js +229 -0
  95. package/dist/packages/evaluation/src/strategies/docorbit-runner.d.ts +5 -0
  96. package/dist/packages/evaluation/src/strategies/docorbit-runner.js +210 -0
  97. package/dist/packages/evaluation/src/strategies/firecrawl-runner.d.ts +24 -0
  98. package/dist/packages/evaluation/src/strategies/firecrawl-runner.js +151 -0
  99. package/dist/packages/evaluation/src/strategies/web-search-runner.d.ts +32 -0
  100. package/dist/packages/evaluation/src/strategies/web-search-runner.js +161 -0
  101. package/dist/packages/evaluation/src/types.d.ts +15 -0
  102. package/dist/packages/evaluation/src/types.js +1 -0
  103. package/dist/packages/evaluation/src/version-matcher.d.ts +11 -0
  104. package/dist/packages/evaluation/src/version-matcher.js +61 -0
  105. package/dist/packages/export/src/agents-md.d.ts +19 -0
  106. package/dist/packages/export/src/agents-md.js +170 -0
  107. package/dist/packages/export/src/claude-md.d.ts +17 -0
  108. package/dist/packages/export/src/claude-md.js +118 -0
  109. package/dist/packages/export/src/docs-map.d.ts +14 -0
  110. package/dist/packages/export/src/docs-map.js +118 -0
  111. package/dist/packages/export/src/index.js +6 -0
  112. package/dist/packages/export/src/llms-txt.d.ts +15 -0
  113. package/dist/packages/export/src/llms-txt.js +73 -0
  114. package/dist/packages/export/src/service.d.ts +23 -0
  115. package/dist/packages/export/src/service.js +210 -0
  116. package/dist/packages/export/src/skill-md.d.ts +14 -0
  117. package/dist/packages/export/src/skill-md.js +107 -0
  118. package/{packages/mcp/src/index.ts → dist/packages/mcp/src/index.d.ts} +2 -35
  119. package/dist/packages/mcp/src/index.js +6 -0
  120. package/dist/packages/mcp/src/resources/index.d.ts +12 -0
  121. package/dist/packages/mcp/src/resources/index.js +165 -0
  122. package/dist/packages/mcp/src/server.d.ts +30 -0
  123. package/dist/packages/mcp/src/server.js +243 -0
  124. package/dist/packages/mcp/src/tools/analyze-impact.d.ts +6 -0
  125. package/dist/packages/mcp/src/tools/analyze-impact.js +64 -0
  126. package/dist/packages/mcp/src/tools/check-api.d.ts +6 -0
  127. package/dist/packages/mcp/src/tools/check-api.js +74 -0
  128. package/dist/packages/mcp/src/tools/diff-docs.d.ts +6 -0
  129. package/dist/packages/mcp/src/tools/diff-docs.js +58 -0
  130. package/dist/packages/mcp/src/tools/export-context.d.ts +6 -0
  131. package/dist/packages/mcp/src/tools/export-context.js +61 -0
  132. package/dist/packages/mcp/src/tools/find-api.d.ts +6 -0
  133. package/dist/packages/mcp/src/tools/find-api.js +91 -0
  134. package/dist/packages/mcp/src/tools/find-example.d.ts +6 -0
  135. package/dist/packages/mcp/src/tools/find-example.js +92 -0
  136. package/dist/packages/mcp/src/tools/find-pitfall.d.ts +6 -0
  137. package/dist/packages/mcp/src/tools/find-pitfall.js +85 -0
  138. package/dist/packages/mcp/src/tools/find-recipe.d.ts +6 -0
  139. package/dist/packages/mcp/src/tools/find-recipe.js +89 -0
  140. package/dist/packages/mcp/src/tools/get-doc.d.ts +6 -0
  141. package/dist/packages/mcp/src/tools/get-doc.js +118 -0
  142. package/dist/packages/mcp/src/tools/get-docs-map.d.ts +6 -0
  143. package/dist/packages/mcp/src/tools/get-docs-map.js +54 -0
  144. package/dist/packages/mcp/src/tools/get-version.d.ts +6 -0
  145. package/dist/packages/mcp/src/tools/get-version.js +104 -0
  146. package/dist/packages/mcp/src/tools/implementation-context.d.ts +6 -0
  147. package/dist/packages/mcp/src/tools/implementation-context.js +102 -0
  148. package/dist/packages/mcp/src/tools/index.d.ts +19 -0
  149. package/dist/packages/mcp/src/tools/index.js +41 -0
  150. package/dist/packages/mcp/src/tools/ingest-doc.d.ts +6 -0
  151. package/dist/packages/mcp/src/tools/ingest-doc.js +264 -0
  152. package/dist/packages/mcp/src/tools/list-sources.d.ts +6 -0
  153. package/dist/packages/mcp/src/tools/list-sources.js +76 -0
  154. package/dist/packages/mcp/src/tools/search-docs.d.ts +6 -0
  155. package/dist/packages/mcp/src/tools/search-docs.js +113 -0
  156. package/dist/packages/mcp/src/tools/types.d.ts +22 -0
  157. package/dist/packages/mcp/src/tools/types.js +1 -0
  158. package/dist/packages/mcp/src/transports/http.d.ts +31 -0
  159. package/dist/packages/mcp/src/transports/http.js +215 -0
  160. package/dist/packages/mcp/src/transports/stdio.d.ts +22 -0
  161. package/dist/packages/mcp/src/transports/stdio.js +86 -0
  162. package/{packages/mcp/src/transports/types.ts → dist/packages/mcp/src/transports/types.d.ts} +2 -3
  163. package/dist/packages/mcp/src/transports/types.js +1 -0
  164. package/dist/packages/mcp/src/types.d.ts +89 -0
  165. package/dist/packages/mcp/src/types.js +7 -0
  166. package/dist/packages/normalizer/src/example-indexer.d.ts +5 -0
  167. package/dist/packages/normalizer/src/example-indexer.js +200 -0
  168. package/dist/packages/normalizer/src/html.d.ts +13 -0
  169. package/dist/packages/normalizer/src/html.js +221 -0
  170. package/{packages/normalizer/src/index.ts → dist/packages/normalizer/src/index.d.ts} +0 -1
  171. package/dist/packages/normalizer/src/index.js +7 -0
  172. package/dist/packages/normalizer/src/llms.d.ts +3 -0
  173. package/dist/packages/normalizer/src/llms.js +71 -0
  174. package/dist/packages/normalizer/src/openapi/endpoint-parser.d.ts +11 -0
  175. package/dist/packages/normalizer/src/openapi/endpoint-parser.js +357 -0
  176. package/dist/packages/normalizer/src/openapi/schema-resolver.d.ts +10 -0
  177. package/dist/packages/normalizer/src/openapi/schema-resolver.js +82 -0
  178. package/dist/packages/normalizer/src/openapi.js +2 -0
  179. package/dist/packages/normalizer/src/page.d.ts +13 -0
  180. package/dist/packages/normalizer/src/page.js +150 -0
  181. package/dist/packages/normalizer/src/pitfall-extractor.d.ts +6 -0
  182. package/dist/packages/normalizer/src/pitfall-extractor.js +153 -0
  183. package/dist/packages/normalizer/src/slicer.d.ts +30 -0
  184. package/dist/packages/normalizer/src/slicer.js +360 -0
  185. package/dist/packages/retrieval/src/engine.d.ts +17 -0
  186. package/dist/packages/retrieval/src/engine.js +93 -0
  187. package/{packages/retrieval/src/index.ts → dist/packages/retrieval/src/index.d.ts} +0 -1
  188. package/dist/packages/retrieval/src/index.js +6 -0
  189. package/dist/packages/retrieval/src/intent.d.ts +6 -0
  190. package/dist/packages/retrieval/src/intent.js +39 -0
  191. package/dist/packages/retrieval/src/packer.d.ts +2 -0
  192. package/dist/packages/retrieval/src/packer.js +108 -0
  193. package/dist/packages/retrieval/src/recipe-engine.d.ts +18 -0
  194. package/dist/packages/retrieval/src/recipe-engine.js +265 -0
  195. package/dist/packages/retrieval/src/scorer.d.ts +13 -0
  196. package/dist/packages/retrieval/src/scorer.js +110 -0
  197. package/dist/packages/retrieval/src/weights.d.ts +3 -0
  198. package/dist/packages/retrieval/src/weights.js +28 -0
  199. package/dist/packages/security/src/annotations.d.ts +10 -0
  200. package/dist/packages/security/src/annotations.js +100 -0
  201. package/dist/packages/security/src/index.js +2 -0
  202. package/dist/packages/security/src/ssrf.d.ts +17 -0
  203. package/dist/packages/security/src/ssrf.js +132 -0
  204. package/dist/packages/shared/src/errors.d.ts +22 -0
  205. package/dist/packages/shared/src/errors.js +44 -0
  206. package/dist/packages/shared/src/hashing.d.ts +3 -0
  207. package/dist/packages/shared/src/hashing.js +21 -0
  208. package/dist/packages/shared/src/index.js +3 -0
  209. package/dist/packages/shared/src/types.d.ts +715 -0
  210. package/dist/packages/shared/src/types.js +1 -0
  211. package/dist/packages/storage/src/db.d.ts +11 -0
  212. package/dist/packages/storage/src/db.js +128 -0
  213. package/dist/packages/storage/src/index.js +10 -0
  214. package/dist/packages/storage/src/interfaces.d.ts +83 -0
  215. package/dist/packages/storage/src/interfaces.js +1 -0
  216. package/dist/packages/storage/src/repositories/api-repository.d.ts +16 -0
  217. package/dist/packages/storage/src/repositories/api-repository.js +169 -0
  218. package/dist/packages/storage/src/repositories/chunk-repository.d.ts +32 -0
  219. package/dist/packages/storage/src/repositories/chunk-repository.js +250 -0
  220. package/dist/packages/storage/src/repositories/example-repository.d.ts +16 -0
  221. package/dist/packages/storage/src/repositories/example-repository.js +158 -0
  222. package/dist/packages/storage/src/repositories/page-repository.d.ts +16 -0
  223. package/dist/packages/storage/src/repositories/page-repository.js +161 -0
  224. package/dist/packages/storage/src/repositories/pitfall-repository.d.ts +15 -0
  225. package/dist/packages/storage/src/repositories/pitfall-repository.js +144 -0
  226. package/dist/packages/storage/src/repositories/source-repository.d.ts +33 -0
  227. package/dist/packages/storage/src/repositories/source-repository.js +153 -0
  228. package/dist/packages/storage/src/repository.d.ts +92 -0
  229. package/dist/packages/storage/src/repository.js +157 -0
  230. package/dist/packages/storage/src/schema.d.ts +2 -0
  231. package/{packages/storage/src/schema.ts → dist/packages/storage/src/schema.js} +0 -3
  232. package/dist/packages/storage/src/search-tokens.d.ts +6 -0
  233. package/dist/packages/storage/src/search-tokens.js +26 -0
  234. package/dist/packages/verification/src/diff-engine.d.ts +18 -0
  235. package/dist/packages/verification/src/diff-engine.js +218 -0
  236. package/dist/packages/verification/src/extractor.d.ts +29 -0
  237. package/dist/packages/verification/src/extractor.js +302 -0
  238. package/dist/packages/verification/src/impact-scanner.d.ts +9 -0
  239. package/dist/packages/verification/src/impact-scanner.js +181 -0
  240. package/dist/packages/verification/src/index.js +5 -0
  241. package/dist/packages/verification/src/services.d.ts +55 -0
  242. package/dist/packages/verification/src/services.js +189 -0
  243. package/dist/packages/verification/src/verifier.d.ts +15 -0
  244. package/dist/packages/verification/src/verifier.js +315 -0
  245. package/dist/packages/workspace/src/detector.d.ts +7 -0
  246. package/dist/packages/workspace/src/detector.js +117 -0
  247. package/dist/packages/workspace/src/ecosystems/cargo.d.ts +10 -0
  248. package/dist/packages/workspace/src/ecosystems/cargo.js +69 -0
  249. package/dist/packages/workspace/src/ecosystems/composer.d.ts +7 -0
  250. package/dist/packages/workspace/src/ecosystems/composer.js +40 -0
  251. package/dist/packages/workspace/src/ecosystems/go.d.ts +7 -0
  252. package/dist/packages/workspace/src/ecosystems/go.js +49 -0
  253. package/{packages/workspace/src/ecosystems/index.ts → dist/packages/workspace/src/ecosystems/index.d.ts} +2 -24
  254. package/dist/packages/workspace/src/ecosystems/index.js +21 -0
  255. package/dist/packages/workspace/src/ecosystems/maven.d.ts +7 -0
  256. package/dist/packages/workspace/src/ecosystems/maven.js +28 -0
  257. package/dist/packages/workspace/src/ecosystems/npm.d.ts +10 -0
  258. package/dist/packages/workspace/src/ecosystems/npm.js +73 -0
  259. package/dist/packages/workspace/src/ecosystems/pub.d.ts +7 -0
  260. package/dist/packages/workspace/src/ecosystems/pub.js +34 -0
  261. package/dist/packages/workspace/src/ecosystems/pypi.d.ts +9 -0
  262. package/dist/packages/workspace/src/ecosystems/pypi.js +94 -0
  263. package/dist/packages/workspace/src/ecosystems/rubygems.d.ts +7 -0
  264. package/dist/packages/workspace/src/ecosystems/rubygems.js +25 -0
  265. package/dist/packages/workspace/src/ecosystems/types.d.ts +9 -0
  266. package/dist/packages/workspace/src/ecosystems/types.js +1 -0
  267. package/dist/packages/workspace/src/index.js +5 -0
  268. package/dist/packages/workspace/src/lockfile.d.ts +21 -0
  269. package/dist/packages/workspace/src/lockfile.js +153 -0
  270. package/dist/packages/workspace/src/resolver.d.ts +39 -0
  271. package/dist/packages/workspace/src/resolver.js +164 -0
  272. package/dist/packages/workspace/src/semver.d.ts +33 -0
  273. package/dist/packages/workspace/src/semver.js +235 -0
  274. package/package.json +13 -9
  275. package/apps/cli/bin/docorbit.js +0 -8
  276. package/apps/cli/src/commands/add.ts +0 -44
  277. package/apps/cli/src/commands/api.ts +0 -38
  278. package/apps/cli/src/commands/context.ts +0 -47
  279. package/apps/cli/src/commands/dashboard.ts +0 -55
  280. package/apps/cli/src/commands/diff.ts +0 -30
  281. package/apps/cli/src/commands/evaluate.ts +0 -133
  282. package/apps/cli/src/commands/examples.ts +0 -39
  283. package/apps/cli/src/commands/export.ts +0 -89
  284. package/apps/cli/src/commands/impact.ts +0 -31
  285. package/apps/cli/src/commands/init.ts +0 -69
  286. package/apps/cli/src/commands/inspect.ts +0 -30
  287. package/apps/cli/src/commands/mcp.ts +0 -72
  288. package/apps/cli/src/commands/pitfalls.ts +0 -38
  289. package/apps/cli/src/commands/recipes.ts +0 -35
  290. package/apps/cli/src/commands/search.ts +0 -48
  291. package/apps/cli/src/commands/update.ts +0 -73
  292. package/apps/cli/src/commands/verify.ts +0 -48
  293. package/apps/cli/src/formatters/colors.ts +0 -23
  294. package/apps/cli/src/formatters/inspection.ts +0 -102
  295. package/apps/cli/src/formatters/knowledge.ts +0 -272
  296. package/apps/cli/src/formatters/retrieval.ts +0 -74
  297. package/apps/cli/src/formatters/verification.ts +0 -126
  298. package/apps/cli/src/index.ts +0 -409
  299. package/packages/core/src/dashboard/server.ts +0 -314
  300. package/packages/core/src/implementation-service.ts +0 -451
  301. package/packages/core/src/inspector.ts +0 -71
  302. package/packages/core/src/pipeline.ts +0 -331
  303. package/packages/crawler/src/config.ts +0 -12
  304. package/packages/crawler/src/fetcher.ts +0 -185
  305. package/packages/discovery/src/index.ts +0 -31
  306. package/packages/discovery/src/provider.ts +0 -47
  307. package/packages/discovery/src/providers/generic.ts +0 -98
  308. package/packages/discovery/src/providers/github.ts +0 -61
  309. package/packages/discovery/src/providers/llms-txt.ts +0 -73
  310. package/packages/discovery/src/providers/markdown.ts +0 -48
  311. package/packages/discovery/src/providers/openapi.ts +0 -91
  312. package/packages/discovery/src/providers/sitemap.ts +0 -62
  313. package/packages/discovery/src/providers/skill.ts +0 -54
  314. package/packages/discovery/src/ranker.ts +0 -123
  315. package/packages/evaluation/src/dataset.ts +0 -963
  316. package/packages/evaluation/src/runner.ts +0 -241
  317. package/packages/evaluation/src/strategies/context7-runner.ts +0 -269
  318. package/packages/evaluation/src/strategies/docorbit-runner.ts +0 -228
  319. package/packages/evaluation/src/strategies/firecrawl-runner.ts +0 -172
  320. package/packages/evaluation/src/strategies/web-search-runner.ts +0 -194
  321. package/packages/evaluation/src/types.ts +0 -34
  322. package/packages/evaluation/src/version-matcher.ts +0 -73
  323. package/packages/export/src/agents-md.ts +0 -200
  324. package/packages/export/src/claude-md.ts +0 -141
  325. package/packages/export/src/docs-map.ts +0 -150
  326. package/packages/export/src/llms-txt.ts +0 -96
  327. package/packages/export/src/service.ts +0 -250
  328. package/packages/export/src/skill-md.ts +0 -128
  329. package/packages/mcp/src/resources/index.ts +0 -189
  330. package/packages/mcp/src/server.ts +0 -278
  331. package/packages/mcp/src/tools/analyze-impact.ts +0 -74
  332. package/packages/mcp/src/tools/check-api.ts +0 -86
  333. package/packages/mcp/src/tools/diff-docs.ts +0 -68
  334. package/packages/mcp/src/tools/export-context.ts +0 -73
  335. package/packages/mcp/src/tools/find-api.ts +0 -99
  336. package/packages/mcp/src/tools/find-example.ts +0 -100
  337. package/packages/mcp/src/tools/find-pitfall.ts +0 -94
  338. package/packages/mcp/src/tools/find-recipe.ts +0 -98
  339. package/packages/mcp/src/tools/get-doc.ts +0 -130
  340. package/packages/mcp/src/tools/get-docs-map.ts +0 -64
  341. package/packages/mcp/src/tools/get-version.ts +0 -118
  342. package/packages/mcp/src/tools/implementation-context.ts +0 -88
  343. package/packages/mcp/src/tools/index.ts +0 -59
  344. package/packages/mcp/src/tools/list-sources.ts +0 -85
  345. package/packages/mcp/src/tools/search-docs.ts +0 -123
  346. package/packages/mcp/src/tools/types.ts +0 -28
  347. package/packages/mcp/src/transports/http.ts +0 -256
  348. package/packages/mcp/src/transports/stdio.ts +0 -105
  349. package/packages/mcp/src/types.ts +0 -102
  350. package/packages/normalizer/src/example-indexer.ts +0 -240
  351. package/packages/normalizer/src/html.ts +0 -253
  352. package/packages/normalizer/src/llms.ts +0 -83
  353. package/packages/normalizer/src/openapi/endpoint-parser.ts +0 -406
  354. package/packages/normalizer/src/openapi/schema-resolver.ts +0 -111
  355. package/packages/normalizer/src/page.ts +0 -184
  356. package/packages/normalizer/src/pitfall-extractor.ts +0 -190
  357. package/packages/normalizer/src/slicer.ts +0 -455
  358. package/packages/retrieval/src/engine.ts +0 -120
  359. package/packages/retrieval/src/intent.ts +0 -43
  360. package/packages/retrieval/src/packer.ts +0 -145
  361. package/packages/retrieval/src/recipe-engine.ts +0 -313
  362. package/packages/retrieval/src/scorer.ts +0 -139
  363. package/packages/retrieval/src/weights.ts +0 -31
  364. package/packages/security/src/annotations.ts +0 -112
  365. package/packages/security/src/ssrf.ts +0 -153
  366. package/packages/shared/src/errors.ts +0 -53
  367. package/packages/shared/src/hashing.ts +0 -23
  368. package/packages/shared/src/types.ts +0 -881
  369. package/packages/storage/src/db.ts +0 -72
  370. package/packages/storage/src/interfaces.ts +0 -115
  371. package/packages/storage/src/repositories/api-repository.ts +0 -219
  372. package/packages/storage/src/repositories/chunk-repository.ts +0 -316
  373. package/packages/storage/src/repositories/example-repository.ts +0 -206
  374. package/packages/storage/src/repositories/page-repository.ts +0 -205
  375. package/packages/storage/src/repositories/pitfall-repository.ts +0 -188
  376. package/packages/storage/src/repositories/source-repository.ts +0 -205
  377. package/packages/storage/src/repository.ts +0 -256
  378. package/packages/storage/src/search-tokens.ts +0 -28
  379. package/packages/verification/src/diff-engine.ts +0 -258
  380. package/packages/verification/src/extractor.ts +0 -339
  381. package/packages/verification/src/impact-scanner.ts +0 -203
  382. package/packages/verification/src/services.ts +0 -238
  383. package/packages/verification/src/verifier.ts +0 -375
  384. package/packages/workspace/src/detector.ts +0 -143
  385. package/packages/workspace/src/ecosystems/cargo.ts +0 -84
  386. package/packages/workspace/src/ecosystems/composer.ts +0 -42
  387. package/packages/workspace/src/ecosystems/go.ts +0 -54
  388. package/packages/workspace/src/ecosystems/maven.ts +0 -34
  389. package/packages/workspace/src/ecosystems/npm.ts +0 -83
  390. package/packages/workspace/src/ecosystems/pub.ts +0 -40
  391. package/packages/workspace/src/ecosystems/pypi.ts +0 -100
  392. package/packages/workspace/src/ecosystems/rubygems.ts +0 -30
  393. package/packages/workspace/src/ecosystems/types.ts +0 -18
  394. package/packages/workspace/src/lockfile.ts +0 -194
  395. package/packages/workspace/src/resolver.ts +0 -234
  396. package/packages/workspace/src/semver.ts +0 -259
  397. /package/{packages/crawler/src/index.ts → dist/packages/crawler/src/index.d.ts} +0 -0
  398. /package/{packages/evaluation/src/index.ts → dist/packages/evaluation/src/index.d.ts} +0 -0
  399. /package/{packages/export/src/index.ts → dist/packages/export/src/index.d.ts} +0 -0
  400. /package/{packages/normalizer/src/openapi.ts → dist/packages/normalizer/src/openapi.d.ts} +0 -0
  401. /package/{packages/security/src/index.ts → dist/packages/security/src/index.d.ts} +0 -0
  402. /package/{packages/shared/src/index.ts → dist/packages/shared/src/index.d.ts} +0 -0
  403. /package/{packages/storage/src/index.ts → dist/packages/storage/src/index.d.ts} +0 -0
  404. /package/{packages/verification/src/index.ts → dist/packages/verification/src/index.d.ts} +0 -0
  405. /package/{packages/workspace/src/index.ts → dist/packages/workspace/src/index.d.ts} +0 -0
@@ -1,59 +0,0 @@
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
-
17
- export * from './types.ts';
18
- export {
19
- SearchDocsTool,
20
- GetDocTool,
21
- FindApiTool,
22
- FindExampleTool,
23
- FindPitfallTool,
24
- FindRecipeTool,
25
- GetVersionTool,
26
- ListSourcesTool,
27
- ImplementationContextTool,
28
- ImplementationContextTool as GetImplementationContextTool,
29
- CheckApiTool,
30
- DiffDocsTool,
31
- AnalyzeImpactTool,
32
- GetDocumentationMapTool,
33
- ExportAgentContextTool,
34
- };
35
-
36
- export function createDefaultTools(): Map<string, McpToolHandler> {
37
- const tools = new Map<string, McpToolHandler>();
38
- const list: McpToolHandler[] = [
39
- new SearchDocsTool(),
40
- new GetDocTool(),
41
- new FindApiTool(),
42
- new FindExampleTool(),
43
- new FindPitfallTool(),
44
- new FindRecipeTool(),
45
- new GetVersionTool(),
46
- new ListSourcesTool(),
47
- new ImplementationContextTool(),
48
- new CheckApiTool(),
49
- new DiffDocsTool(),
50
- new AnalyzeImpactTool(),
51
- new GetDocumentationMapTool(),
52
- new ExportAgentContextTool(),
53
- ];
54
- for (const tool of list) {
55
- tools.set(tool.definition.name, tool);
56
- }
57
- return tools;
58
- }
59
-
@@ -1,85 +0,0 @@
1
- import type { CallToolResult, McpTool } from '../types.ts';
2
- import type { McpContext, McpToolHandler } from './types.ts';
3
-
4
- export class ListSourcesTool implements McpToolHandler {
5
- readonly definition: McpTool = {
6
- name: 'list_sources',
7
- description: 'List all indexed documentation sources, snapshot records, doc versions, and machine-readability status.',
8
- inputSchema: {
9
- type: 'object',
10
- properties: {
11
- limit: {
12
- type: 'number',
13
- description: 'Maximum number of sources to list (default: 50).',
14
- },
15
- },
16
- },
17
- };
18
-
19
- async execute(args: Record<string, unknown>, ctx: McpContext): Promise<CallToolResult> {
20
- const limit = typeof args.limit === 'number' && args.limit > 0 ? args.limit : 50;
21
-
22
- const sources = ctx.repo.listSources().slice(0, limit);
23
- const snapshots = ctx.repo.listSnapshots();
24
-
25
- if (sources.length === 0) {
26
- return {
27
- content: [
28
- {
29
- type: 'text',
30
- text: JSON.stringify({
31
- markdown: '### Indexed Documentation Sources\n\nNo documentation sources have been added yet. Use `docorbit add <url>` to ingest documentation.',
32
- data: { count: 0, sources: [] },
33
- }, null, 2),
34
- },
35
- ],
36
- };
37
- }
38
-
39
- const formatted = sources.map(s => {
40
- const sourceSnaps = snapshots.filter(sn => sn.sourceId === s.id);
41
- return {
42
- id: s.id,
43
- url: s.url,
44
- type: s.type,
45
- status: s.status,
46
- authority: s.authority,
47
- confidence: s.confidence,
48
- machineReadable: s.machineReadable,
49
- snapshots: sourceSnaps.map(sn => ({
50
- id: sn.id,
51
- pageCount: sn.pageCount,
52
- docVersion: sn.docVersion,
53
- capturedAt: sn.capturedAt,
54
- })),
55
- };
56
- });
57
-
58
- const lines: string[] = [`### Indexed Documentation Sources (${sources.length} sources)\n`];
59
- for (const s of formatted) {
60
- const icon = s.status === 'valid' ? '✓' : '✗';
61
- lines.push(`- **${icon} [${s.type}]** ${s.url}`);
62
- lines.push(` *Authority*: ${s.authority} | *Confidence*: ${Math.round(s.confidence * 100)}% | *Machine-Readable*: ${s.machineReadable}`);
63
- if (s.snapshots.length > 0) {
64
- const snapInfo = s.snapshots.map(sn => `${sn.id}${sn.docVersion ? ` (${sn.docVersion})` : ''} [${sn.pageCount} pages]`).join(', ');
65
- lines.push(` *Snapshots*: ${snapInfo}`);
66
- }
67
- lines.push('');
68
- }
69
-
70
- return {
71
- content: [
72
- {
73
- type: 'text',
74
- text: JSON.stringify({
75
- markdown: lines.join('\n'),
76
- data: {
77
- count: formatted.length,
78
- sources: formatted,
79
- },
80
- }, null, 2),
81
- },
82
- ],
83
- };
84
- }
85
- }
@@ -1,123 +0,0 @@
1
- import { RetrievalEngine } from '../../../retrieval/src/index.ts';
2
- import type { CallToolResult, McpTool } from '../types.ts';
3
- import type { McpContext, McpToolHandler } from './types.ts';
4
-
5
- export class SearchDocsTool implements McpToolHandler {
6
- readonly definition: McpTool = {
7
- name: 'search_docs',
8
- description: 'Search documentation chunks using hybrid FTS5 ranking, symbol awareness, and optional version filtering.',
9
- inputSchema: {
10
- type: 'object',
11
- properties: {
12
- query: {
13
- type: 'string',
14
- description: 'The search query, code symbol, or concept to look for.',
15
- },
16
- library: {
17
- type: 'string',
18
- description: 'Optional library name to narrow search scope.',
19
- },
20
- version: {
21
- type: 'string',
22
- description: 'Target documentation version (e.g. "v14", "15.0").',
23
- },
24
- limit: {
25
- type: 'number',
26
- description: 'Maximum number of results to return (default: 10).',
27
- },
28
- },
29
- required: ['query'],
30
- },
31
- };
32
-
33
- async execute(args: Record<string, unknown>, ctx: McpContext): Promise<CallToolResult> {
34
- const query = typeof args.query === 'string' ? args.query.trim() : '';
35
- if (!query) {
36
- return {
37
- isError: true,
38
- content: [{ type: 'text', text: JSON.stringify({ error: 'Missing required parameter: query' }) }],
39
- };
40
- }
41
-
42
- const version = typeof args.docVersion === 'string'
43
- ? args.docVersion
44
- : (typeof args.version === 'string' ? args.version : undefined);
45
- const limit = typeof args.limit === 'number' && args.limit > 0 ? args.limit : 10;
46
-
47
- const engine = new RetrievalEngine(ctx.repo);
48
- const results = await engine.search(query, {
49
- docVersion: version,
50
- limit,
51
- projectDir: ctx.workspaceRoot,
52
- });
53
-
54
- if (results.length === 0) {
55
- const emptyPayload = {
56
- query,
57
- count: 0,
58
- results: [],
59
- message: `No documentation chunks found matching "${query}". Try refining terms or checking available sources.`,
60
- };
61
- return {
62
- content: [
63
- {
64
- type: 'text',
65
- text: JSON.stringify({
66
- markdown: `### Search Results for "${query}"\n\nNo matching documentation found.`,
67
- data: emptyPayload,
68
- }, null, 2),
69
- },
70
- ],
71
- };
72
- }
73
-
74
- const formattedChunks = results.map(r => ({
75
- id: r.chunk.id,
76
- chunk: r.chunk,
77
- title: r.chunk.title || 'Untitled Section',
78
- sectionPath: r.chunk.sectionPath,
79
- content: r.chunk.content,
80
- chunkType: r.chunk.chunkType,
81
- language: r.chunk.language,
82
- tokenEstimate: r.chunk.tokenEstimate,
83
- docVersion: r.chunk.docVersion,
84
- score: r.score,
85
- symbols: r.symbols.map(s => s.name),
86
- provenance: r.chunk.provenance ? {
87
- sourceUrl: r.chunk.provenance.sourceUrl,
88
- fetchedAt: r.chunk.provenance.fetchedAt,
89
- untrusted: true,
90
- } : undefined,
91
- }));
92
-
93
- const lines: string[] = [
94
- `### Search Results for "${query}" (${results.length} found)`,
95
- `> [!NOTE] External documentation content is untrusted.\n`,
96
- ];
97
-
98
- for (let i = 0; i < formattedChunks.length; i++) {
99
- const c = formattedChunks[i];
100
- const path = c.sectionPath.length > 0 ? c.sectionPath.join(' > ') : c.title;
101
- lines.push(`${i + 1}. **${path}** [${c.chunkType}] (score: ${c.score})`);
102
- lines.push(` *ID*: \`${c.id}\`${c.docVersion ? ` | *Version*: \`${c.docVersion}\`` : ''}`);
103
- if (c.symbols.length > 0) lines.push(` *Symbols*: ${c.symbols.join(', ')}`);
104
- lines.push(` \`\`\`\n ${c.content.split('\n').slice(0, 5).join('\n ')}\n \`\`\`\n`);
105
- }
106
-
107
- return {
108
- content: [
109
- {
110
- type: 'text',
111
- text: JSON.stringify({
112
- markdown: lines.join('\n'),
113
- data: {
114
- query,
115
- count: results.length,
116
- results: formattedChunks,
117
- },
118
- }, null, 2),
119
- },
120
- ],
121
- };
122
- }
123
- }
@@ -1,28 +0,0 @@
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 {
5
- VerificationService,
6
- DiffService,
7
- ImpactAnalysisService,
8
- } from '../../../verification/src/index.ts';
9
- import type { ExportService } from '../../../export/src/index.ts';
10
- import type { CallToolResult, McpTool } from '../types.ts';
11
-
12
- export interface McpContext {
13
- repo: DocOrbitRepository;
14
- implService: ImplementationContextService;
15
- implementationService: ImplementationContextService;
16
- workspaceRoot?: string;
17
- projectDir?: string;
18
- resolver?: WorkspaceResolver;
19
- verificationService?: VerificationService;
20
- diffService?: DiffService;
21
- impactService?: ImpactAnalysisService;
22
- exportService?: ExportService;
23
- }
24
-
25
- export interface McpToolHandler {
26
- readonly definition: McpTool;
27
- execute(args: Record<string, unknown>, ctx: McpContext): Promise<CallToolResult>;
28
- }
@@ -1,256 +0,0 @@
1
- import * as http from 'node:http';
2
- import type { McpServer } from '../server.ts';
3
- import type { McpTransport } from './types.ts';
4
- import { JSONRPC_ERRORS } from '../types.ts';
5
-
6
- export interface HttpTransportOptions {
7
- port?: number;
8
- host?: string;
9
- maxBodyBytes?: number;
10
- noListen?: boolean;
11
- }
12
-
13
- export class StreamableHttpTransport implements McpTransport {
14
- private port: number;
15
- private host: string;
16
- private maxBodyBytes: number;
17
- private noListen: boolean;
18
- private serverInstance: http.Server | null = null;
19
- private mcpServer: McpServer | null = null;
20
- private sseClients: Set<http.ServerResponse> = new Set();
21
- private heartbeatTimer: NodeJS.Timeout | null = null;
22
-
23
- constructor(options: HttpTransportOptions = {}) {
24
- this.port = options.port ?? 3000;
25
- this.host = options.host ?? '127.0.0.1';
26
- this.maxBodyBytes = options.maxBodyBytes ?? 10 * 1024 * 1024; // 10MB
27
- this.noListen = options.noListen ?? false;
28
- }
29
-
30
- getServerInstance(): http.Server | null {
31
- return this.serverInstance;
32
- }
33
-
34
- async dispatch(req: http.IncomingMessage, res: http.ServerResponse): Promise<void> {
35
- return this.handleHttpRequest(req, res);
36
- }
37
-
38
- getPort(): number {
39
- if (this.serverInstance) {
40
- const addr = this.serverInstance.address();
41
- if (addr && typeof addr === 'object') {
42
- return addr.port;
43
- }
44
- }
45
- return this.port;
46
- }
47
-
48
- async start(server: McpServer): Promise<void> {
49
- this.mcpServer = server;
50
-
51
- this.serverInstance = http.createServer((req, res) => {
52
- this.handleHttpRequest(req, res).catch(err => {
53
- if (!res.headersSent) {
54
- res.writeHead(500, { 'Content-Type': 'application/json' });
55
- res.end(JSON.stringify({ error: err instanceof Error ? err.message : String(err) }));
56
- }
57
- });
58
- });
59
-
60
- if (this.noListen) {
61
- return;
62
- }
63
-
64
- return new Promise((resolve, reject) => {
65
- this.serverInstance!.on('error', reject);
66
-
67
- this.serverInstance!.listen(this.port, this.host, () => {
68
- this.startHeartbeats();
69
- resolve();
70
- });
71
- });
72
- }
73
-
74
- private setCorsHeaders(res: http.ServerResponse): void {
75
- res.setHeader('Access-Control-Allow-Origin', '*');
76
- res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
77
- res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, Accept');
78
- }
79
-
80
- private async handleHttpRequest(req: http.IncomingMessage, res: http.ServerResponse): Promise<void> {
81
- this.setCorsHeaders(res);
82
-
83
- if (req.method === 'OPTIONS') {
84
- res.writeHead(204);
85
- res.end();
86
- return;
87
- }
88
-
89
- const url = new URL(req.url || '/', `http://${this.host}:${this.port}`);
90
- const pathname = url.pathname;
91
-
92
- if (req.method === 'GET' && (pathname === '/health' || pathname === '/')) {
93
- res.writeHead(200, { 'Content-Type': 'application/json' });
94
- res.end(JSON.stringify({
95
- status: 'ok',
96
- server: 'docorbit-mcp',
97
- version: '0.5.0',
98
- endpoints: {
99
- mcp: '/mcp',
100
- sse: '/sse',
101
- health: '/health',
102
- },
103
- }));
104
- return;
105
- }
106
-
107
- if (req.method === 'GET' && pathname === '/sse') {
108
- this.handleSseConnection(req, res);
109
- return;
110
- }
111
-
112
- if (req.method === 'POST' && pathname === '/mcp') {
113
- await this.handleMcpPost(req, res);
114
- return;
115
- }
116
-
117
- res.writeHead(404, { 'Content-Type': 'application/json' });
118
- res.end(JSON.stringify({ error: `Not found: ${req.method} ${pathname}` }));
119
- }
120
-
121
- private handleSseConnection(req: http.IncomingMessage, res: http.ServerResponse): void {
122
- res.writeHead(200, {
123
- 'Content-Type': 'text/event-stream',
124
- 'Cache-Control': 'no-cache',
125
- 'Connection': 'keep-alive',
126
- });
127
-
128
- // Send endpoint notification so client knows where to POST messages
129
- res.write('event: endpoint\ndata: /mcp\n\n');
130
-
131
- this.sseClients.add(res);
132
-
133
- req.on('close', () => {
134
- this.sseClients.delete(res);
135
- });
136
- }
137
-
138
- private async handleMcpPost(req: http.IncomingMessage, res: http.ServerResponse): Promise<void> {
139
- const rawBody = await this.readBody(req);
140
- let parsed: unknown;
141
- try {
142
- parsed = JSON.parse(rawBody);
143
- } catch {
144
- res.writeHead(400, { 'Content-Type': 'application/json' });
145
- res.end(JSON.stringify({
146
- jsonrpc: '2.0',
147
- id: null,
148
- error: {
149
- code: JSONRPC_ERRORS.PARSE_ERROR,
150
- message: 'Parse error: invalid JSON payload.',
151
- },
152
- }));
153
- return;
154
- }
155
-
156
- if (!this.mcpServer) {
157
- res.writeHead(503, { 'Content-Type': 'application/json' });
158
- res.end(JSON.stringify({ error: 'Server not initialized' }));
159
- return;
160
- }
161
-
162
- let responsePayload: unknown;
163
- if (Array.isArray(parsed)) {
164
- const responses = await Promise.all(parsed.map(item => this.mcpServer!.handleMessage(item)));
165
- responsePayload = responses.filter(r => r !== null);
166
- } else {
167
- responsePayload = await this.mcpServer.handleMessage(parsed);
168
- }
169
-
170
- const acceptHeader = req.headers['accept'] || '';
171
- const wantsSse = acceptHeader.includes('text/event-stream');
172
-
173
- if (wantsSse) {
174
- // Modern Streamable HTTP response over SSE chunk
175
- res.writeHead(200, {
176
- 'Content-Type': 'text/event-stream',
177
- 'Cache-Control': 'no-cache',
178
- 'Connection': 'keep-alive',
179
- });
180
- if (responsePayload !== null && responsePayload !== undefined) {
181
- res.write(`event: message\ndata: ${JSON.stringify(responsePayload)}\n\n`);
182
- }
183
- res.end();
184
- return;
185
- }
186
-
187
- // Standard JSON response
188
- if (responsePayload === null || responsePayload === undefined) {
189
- res.writeHead(204);
190
- res.end();
191
- return;
192
- }
193
-
194
- res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
195
- res.end(JSON.stringify(responsePayload));
196
- }
197
-
198
- private readBody(req: http.IncomingMessage): Promise<string> {
199
- return new Promise((resolve, reject) => {
200
- const chunks: Buffer[] = [];
201
- let totalLength = 0;
202
-
203
- req.on('data', chunk => {
204
- const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
205
- totalLength += buf.length;
206
- if (totalLength > this.maxBodyBytes) {
207
- req.destroy(new Error(`Payload exceeds maximum limit of ${this.maxBodyBytes} bytes`));
208
- return;
209
- }
210
- chunks.push(buf);
211
- });
212
-
213
- req.on('end', () => {
214
- resolve(Buffer.concat(chunks).toString('utf-8'));
215
- });
216
-
217
- req.on('error', reject);
218
- });
219
- }
220
-
221
- private startHeartbeats(): void {
222
- if (this.heartbeatTimer) clearInterval(this.heartbeatTimer);
223
- this.heartbeatTimer = setInterval(() => {
224
- for (const client of this.sseClients) {
225
- try {
226
- client.write(': ping\n\n');
227
- } catch {
228
- this.sseClients.delete(client);
229
- }
230
- }
231
- }, 15000);
232
- }
233
-
234
- async close(): Promise<void> {
235
- if (this.heartbeatTimer) {
236
- clearInterval(this.heartbeatTimer);
237
- this.heartbeatTimer = null;
238
- }
239
-
240
- for (const client of this.sseClients) {
241
- try {
242
- client.end();
243
- } catch {
244
- // Continue
245
- }
246
- }
247
- this.sseClients.clear();
248
-
249
- if (this.serverInstance) {
250
- await new Promise<void>((resolve) => {
251
- this.serverInstance!.close(() => resolve());
252
- });
253
- this.serverInstance = null;
254
- }
255
- }
256
- }
@@ -1,105 +0,0 @@
1
- import * as readline from 'node:readline';
2
- import type { Readable, Writable } from 'node:stream';
3
- import type { McpServer } from '../server.ts';
4
- import type { McpTransport } from './types.ts';
5
- import { JSONRPC_ERRORS } from '../types.ts';
6
-
7
- export interface StdioTransportOptions {
8
- input?: Readable;
9
- output?: Writable;
10
- errorOutput?: Writable;
11
- }
12
-
13
- export class StdioServerTransport implements McpTransport {
14
- private input: Readable;
15
- private output: Writable;
16
- private errorOutput: Writable;
17
- private rl: readline.Interface | null = null;
18
- private server: McpServer | null = null;
19
- private running: boolean = false;
20
-
21
- constructor(options: StdioTransportOptions = {}) {
22
- this.input = options.input || process.stdin;
23
- this.output = options.output || process.stdout;
24
- this.errorOutput = options.errorOutput || process.stderr;
25
- }
26
-
27
- async start(server: McpServer): Promise<void> {
28
- this.server = server;
29
- this.running = true;
30
-
31
- this.rl = readline.createInterface({
32
- input: this.input,
33
- terminal: false,
34
- });
35
-
36
- this.log('[DocOrbit MCP] Stdio transport started.');
37
-
38
- this.rl.on('line', async (line: string) => {
39
- try {
40
- await this.processLine(line);
41
- } catch (err) {
42
- this.log(`[DocOrbit MCP] Stdio error processing line: ${err instanceof Error ? err.message : String(err)}`);
43
- }
44
- });
45
-
46
- this.rl.on('close', () => {
47
- this.running = false;
48
- this.log('[DocOrbit MCP] Stdio transport stream closed.');
49
- });
50
- }
51
-
52
- private async processLine(line: string): Promise<void> {
53
- let parsed: unknown;
54
- try {
55
- parsed = JSON.parse(line);
56
- } catch {
57
- const parseError = {
58
- jsonrpc: '2.0',
59
- id: null,
60
- error: {
61
- code: JSONRPC_ERRORS.PARSE_ERROR,
62
- message: 'Parse error: invalid JSON payload.',
63
- },
64
- };
65
- this.send(parseError);
66
- return;
67
- }
68
-
69
- if (!this.server) return;
70
-
71
- if (Array.isArray(parsed)) {
72
- // JSON-RPC Batch
73
- const responses = await Promise.all(parsed.map(item => this.server!.handleMessage(item)));
74
- const filtered = responses.filter(r => r !== null);
75
- if (filtered.length > 0) {
76
- this.send(filtered);
77
- }
78
- return;
79
- }
80
-
81
- const response = await this.server.handleMessage(parsed);
82
- if (response !== null) {
83
- this.send(response);
84
- }
85
- }
86
-
87
- private send(payload: unknown): void {
88
- if (!this.running) return;
89
- const serialized = JSON.stringify(payload) + '\n';
90
- this.output.write(serialized);
91
- }
92
-
93
- private log(message: string): void {
94
- // Isolated to stderr to never corrupt stdout JSON-RPC stream
95
- this.errorOutput.write(`${message}\n`);
96
- }
97
-
98
- async close(): Promise<void> {
99
- this.running = false;
100
- if (this.rl) {
101
- this.rl.close();
102
- this.rl = null;
103
- }
104
- }
105
- }