docorbit 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (405) hide show
  1. package/README.md +29 -15
  2. package/bin/docorbit.js +2 -2
  3. package/dist/apps/cli/src/commands/add.d.ts +7 -0
  4. package/dist/apps/cli/src/commands/add.js +35 -0
  5. package/dist/apps/cli/src/commands/api.d.ts +2 -0
  6. package/dist/apps/cli/src/commands/api.js +35 -0
  7. package/dist/apps/cli/src/commands/context.d.ts +10 -0
  8. package/dist/apps/cli/src/commands/context.js +36 -0
  9. package/dist/apps/cli/src/commands/dashboard.d.ts +8 -0
  10. package/dist/apps/cli/src/commands/dashboard.js +43 -0
  11. package/dist/apps/cli/src/commands/diff.d.ts +2 -0
  12. package/dist/apps/cli/src/commands/diff.js +29 -0
  13. package/dist/apps/cli/src/commands/evaluate.d.ts +11 -0
  14. package/dist/apps/cli/src/commands/evaluate.js +101 -0
  15. package/dist/apps/cli/src/commands/examples.d.ts +2 -0
  16. package/dist/apps/cli/src/commands/examples.js +36 -0
  17. package/dist/apps/cli/src/commands/export.d.ts +11 -0
  18. package/dist/apps/cli/src/commands/export.js +72 -0
  19. package/dist/apps/cli/src/commands/impact.d.ts +2 -0
  20. package/dist/apps/cli/src/commands/impact.js +30 -0
  21. package/dist/apps/cli/src/commands/init.d.ts +5 -0
  22. package/dist/apps/cli/src/commands/init.js +52 -0
  23. package/dist/apps/cli/src/commands/inspect.d.ts +5 -0
  24. package/dist/apps/cli/src/commands/inspect.js +24 -0
  25. package/dist/apps/cli/src/commands/mcp.d.ts +8 -0
  26. package/dist/apps/cli/src/commands/mcp.js +49 -0
  27. package/dist/apps/cli/src/commands/pitfalls.d.ts +2 -0
  28. package/dist/apps/cli/src/commands/pitfalls.js +35 -0
  29. package/dist/apps/cli/src/commands/recipes.d.ts +2 -0
  30. package/dist/apps/cli/src/commands/recipes.js +33 -0
  31. package/dist/apps/cli/src/commands/search.d.ts +11 -0
  32. package/dist/apps/cli/src/commands/search.js +36 -0
  33. package/dist/apps/cli/src/commands/update.d.ts +6 -0
  34. package/dist/apps/cli/src/commands/update.js +53 -0
  35. package/dist/apps/cli/src/commands/verify.d.ts +2 -0
  36. package/dist/apps/cli/src/commands/verify.js +44 -0
  37. package/dist/apps/cli/src/formatters/colors.d.ts +21 -0
  38. package/dist/apps/cli/src/formatters/colors.js +22 -0
  39. package/dist/apps/cli/src/formatters/inspection.d.ts +3 -0
  40. package/dist/apps/cli/src/formatters/inspection.js +88 -0
  41. package/dist/apps/cli/src/formatters/knowledge.d.ts +5 -0
  42. package/dist/apps/cli/src/formatters/knowledge.js +229 -0
  43. package/dist/apps/cli/src/formatters/retrieval.d.ts +3 -0
  44. package/dist/apps/cli/src/formatters/retrieval.js +61 -0
  45. package/{apps/cli/src/formatters/terminal.ts → dist/apps/cli/src/formatters/terminal.d.ts} +0 -1
  46. package/dist/apps/cli/src/formatters/terminal.js +5 -0
  47. package/dist/apps/cli/src/formatters/verification.d.ts +4 -0
  48. package/dist/apps/cli/src/formatters/verification.js +102 -0
  49. package/dist/apps/cli/src/index.d.ts +1 -0
  50. package/dist/apps/cli/src/index.js +376 -0
  51. package/dist/packages/core/src/dashboard/server.d.ts +33 -0
  52. package/dist/packages/core/src/dashboard/server.js +267 -0
  53. package/dist/packages/core/src/dashboard/ui.d.ts +5 -0
  54. package/{packages/core/src/dashboard/ui.ts → dist/packages/core/src/dashboard/ui.js} +2 -2
  55. package/dist/packages/core/src/implementation-service.d.ts +73 -0
  56. package/dist/packages/core/src/implementation-service.js +325 -0
  57. package/{packages/core/src/index.ts → dist/packages/core/src/index.d.ts} +0 -1
  58. package/dist/packages/core/src/index.js +6 -0
  59. package/dist/packages/core/src/inspector.d.ts +22 -0
  60. package/dist/packages/core/src/inspector.js +38 -0
  61. package/dist/packages/core/src/pipeline.d.ts +45 -0
  62. package/dist/packages/core/src/pipeline.js +246 -0
  63. package/dist/packages/crawler/src/config.d.ts +2 -0
  64. package/dist/packages/crawler/src/config.js +10 -0
  65. package/dist/packages/crawler/src/fetcher.d.ts +31 -0
  66. package/dist/packages/crawler/src/fetcher.js +139 -0
  67. package/dist/packages/crawler/src/index.js +2 -0
  68. package/dist/packages/discovery/src/index.d.ts +11 -0
  69. package/dist/packages/discovery/src/index.js +29 -0
  70. package/dist/packages/discovery/src/provider.d.ts +12 -0
  71. package/dist/packages/discovery/src/provider.js +30 -0
  72. package/dist/packages/discovery/src/providers/generic.d.ts +7 -0
  73. package/dist/packages/discovery/src/providers/generic.js +94 -0
  74. package/dist/packages/discovery/src/providers/github.d.ts +7 -0
  75. package/dist/packages/discovery/src/providers/github.js +52 -0
  76. package/dist/packages/discovery/src/providers/llms-txt.d.ts +7 -0
  77. package/dist/packages/discovery/src/providers/llms-txt.js +60 -0
  78. package/dist/packages/discovery/src/providers/markdown.d.ts +7 -0
  79. package/dist/packages/discovery/src/providers/markdown.js +38 -0
  80. package/dist/packages/discovery/src/providers/openapi.d.ts +7 -0
  81. package/dist/packages/discovery/src/providers/openapi.js +77 -0
  82. package/dist/packages/discovery/src/providers/sitemap.d.ts +7 -0
  83. package/dist/packages/discovery/src/providers/sitemap.js +53 -0
  84. package/dist/packages/discovery/src/providers/skill.d.ts +7 -0
  85. package/dist/packages/discovery/src/providers/skill.js +46 -0
  86. package/dist/packages/discovery/src/ranker.d.ts +6 -0
  87. package/dist/packages/discovery/src/ranker.js +107 -0
  88. package/dist/packages/evaluation/src/dataset.d.ts +2 -0
  89. package/dist/packages/evaluation/src/dataset.js +944 -0
  90. package/dist/packages/evaluation/src/index.js +8 -0
  91. package/dist/packages/evaluation/src/runner.d.ts +7 -0
  92. package/dist/packages/evaluation/src/runner.js +196 -0
  93. package/dist/packages/evaluation/src/strategies/context7-runner.d.ts +24 -0
  94. package/dist/packages/evaluation/src/strategies/context7-runner.js +229 -0
  95. package/dist/packages/evaluation/src/strategies/docorbit-runner.d.ts +5 -0
  96. package/dist/packages/evaluation/src/strategies/docorbit-runner.js +210 -0
  97. package/dist/packages/evaluation/src/strategies/firecrawl-runner.d.ts +24 -0
  98. package/dist/packages/evaluation/src/strategies/firecrawl-runner.js +151 -0
  99. package/dist/packages/evaluation/src/strategies/web-search-runner.d.ts +32 -0
  100. package/dist/packages/evaluation/src/strategies/web-search-runner.js +161 -0
  101. package/dist/packages/evaluation/src/types.d.ts +15 -0
  102. package/dist/packages/evaluation/src/types.js +1 -0
  103. package/dist/packages/evaluation/src/version-matcher.d.ts +11 -0
  104. package/dist/packages/evaluation/src/version-matcher.js +61 -0
  105. package/dist/packages/export/src/agents-md.d.ts +19 -0
  106. package/dist/packages/export/src/agents-md.js +170 -0
  107. package/dist/packages/export/src/claude-md.d.ts +17 -0
  108. package/dist/packages/export/src/claude-md.js +118 -0
  109. package/dist/packages/export/src/docs-map.d.ts +14 -0
  110. package/dist/packages/export/src/docs-map.js +118 -0
  111. package/dist/packages/export/src/index.js +6 -0
  112. package/dist/packages/export/src/llms-txt.d.ts +15 -0
  113. package/dist/packages/export/src/llms-txt.js +73 -0
  114. package/dist/packages/export/src/service.d.ts +23 -0
  115. package/dist/packages/export/src/service.js +210 -0
  116. package/dist/packages/export/src/skill-md.d.ts +14 -0
  117. package/dist/packages/export/src/skill-md.js +107 -0
  118. package/{packages/mcp/src/index.ts → dist/packages/mcp/src/index.d.ts} +2 -35
  119. package/dist/packages/mcp/src/index.js +6 -0
  120. package/dist/packages/mcp/src/resources/index.d.ts +12 -0
  121. package/dist/packages/mcp/src/resources/index.js +165 -0
  122. package/dist/packages/mcp/src/server.d.ts +30 -0
  123. package/dist/packages/mcp/src/server.js +243 -0
  124. package/dist/packages/mcp/src/tools/analyze-impact.d.ts +6 -0
  125. package/dist/packages/mcp/src/tools/analyze-impact.js +64 -0
  126. package/dist/packages/mcp/src/tools/check-api.d.ts +6 -0
  127. package/dist/packages/mcp/src/tools/check-api.js +74 -0
  128. package/dist/packages/mcp/src/tools/diff-docs.d.ts +6 -0
  129. package/dist/packages/mcp/src/tools/diff-docs.js +58 -0
  130. package/dist/packages/mcp/src/tools/export-context.d.ts +6 -0
  131. package/dist/packages/mcp/src/tools/export-context.js +61 -0
  132. package/dist/packages/mcp/src/tools/find-api.d.ts +6 -0
  133. package/dist/packages/mcp/src/tools/find-api.js +91 -0
  134. package/dist/packages/mcp/src/tools/find-example.d.ts +6 -0
  135. package/dist/packages/mcp/src/tools/find-example.js +92 -0
  136. package/dist/packages/mcp/src/tools/find-pitfall.d.ts +6 -0
  137. package/dist/packages/mcp/src/tools/find-pitfall.js +85 -0
  138. package/dist/packages/mcp/src/tools/find-recipe.d.ts +6 -0
  139. package/dist/packages/mcp/src/tools/find-recipe.js +89 -0
  140. package/dist/packages/mcp/src/tools/get-doc.d.ts +6 -0
  141. package/dist/packages/mcp/src/tools/get-doc.js +118 -0
  142. package/dist/packages/mcp/src/tools/get-docs-map.d.ts +6 -0
  143. package/dist/packages/mcp/src/tools/get-docs-map.js +54 -0
  144. package/dist/packages/mcp/src/tools/get-version.d.ts +6 -0
  145. package/dist/packages/mcp/src/tools/get-version.js +104 -0
  146. package/dist/packages/mcp/src/tools/implementation-context.d.ts +6 -0
  147. package/dist/packages/mcp/src/tools/implementation-context.js +102 -0
  148. package/dist/packages/mcp/src/tools/index.d.ts +19 -0
  149. package/dist/packages/mcp/src/tools/index.js +41 -0
  150. package/dist/packages/mcp/src/tools/ingest-doc.d.ts +6 -0
  151. package/dist/packages/mcp/src/tools/ingest-doc.js +264 -0
  152. package/dist/packages/mcp/src/tools/list-sources.d.ts +6 -0
  153. package/dist/packages/mcp/src/tools/list-sources.js +76 -0
  154. package/dist/packages/mcp/src/tools/search-docs.d.ts +6 -0
  155. package/dist/packages/mcp/src/tools/search-docs.js +113 -0
  156. package/dist/packages/mcp/src/tools/types.d.ts +22 -0
  157. package/dist/packages/mcp/src/tools/types.js +1 -0
  158. package/dist/packages/mcp/src/transports/http.d.ts +31 -0
  159. package/dist/packages/mcp/src/transports/http.js +215 -0
  160. package/dist/packages/mcp/src/transports/stdio.d.ts +22 -0
  161. package/dist/packages/mcp/src/transports/stdio.js +86 -0
  162. package/{packages/mcp/src/transports/types.ts → dist/packages/mcp/src/transports/types.d.ts} +2 -3
  163. package/dist/packages/mcp/src/transports/types.js +1 -0
  164. package/dist/packages/mcp/src/types.d.ts +89 -0
  165. package/dist/packages/mcp/src/types.js +7 -0
  166. package/dist/packages/normalizer/src/example-indexer.d.ts +5 -0
  167. package/dist/packages/normalizer/src/example-indexer.js +200 -0
  168. package/dist/packages/normalizer/src/html.d.ts +13 -0
  169. package/dist/packages/normalizer/src/html.js +221 -0
  170. package/{packages/normalizer/src/index.ts → dist/packages/normalizer/src/index.d.ts} +0 -1
  171. package/dist/packages/normalizer/src/index.js +7 -0
  172. package/dist/packages/normalizer/src/llms.d.ts +3 -0
  173. package/dist/packages/normalizer/src/llms.js +71 -0
  174. package/dist/packages/normalizer/src/openapi/endpoint-parser.d.ts +11 -0
  175. package/dist/packages/normalizer/src/openapi/endpoint-parser.js +357 -0
  176. package/dist/packages/normalizer/src/openapi/schema-resolver.d.ts +10 -0
  177. package/dist/packages/normalizer/src/openapi/schema-resolver.js +82 -0
  178. package/dist/packages/normalizer/src/openapi.js +2 -0
  179. package/dist/packages/normalizer/src/page.d.ts +13 -0
  180. package/dist/packages/normalizer/src/page.js +150 -0
  181. package/dist/packages/normalizer/src/pitfall-extractor.d.ts +6 -0
  182. package/dist/packages/normalizer/src/pitfall-extractor.js +153 -0
  183. package/dist/packages/normalizer/src/slicer.d.ts +30 -0
  184. package/dist/packages/normalizer/src/slicer.js +360 -0
  185. package/dist/packages/retrieval/src/engine.d.ts +17 -0
  186. package/dist/packages/retrieval/src/engine.js +93 -0
  187. package/{packages/retrieval/src/index.ts → dist/packages/retrieval/src/index.d.ts} +0 -1
  188. package/dist/packages/retrieval/src/index.js +6 -0
  189. package/dist/packages/retrieval/src/intent.d.ts +6 -0
  190. package/dist/packages/retrieval/src/intent.js +39 -0
  191. package/dist/packages/retrieval/src/packer.d.ts +2 -0
  192. package/dist/packages/retrieval/src/packer.js +108 -0
  193. package/dist/packages/retrieval/src/recipe-engine.d.ts +18 -0
  194. package/dist/packages/retrieval/src/recipe-engine.js +265 -0
  195. package/dist/packages/retrieval/src/scorer.d.ts +13 -0
  196. package/dist/packages/retrieval/src/scorer.js +110 -0
  197. package/dist/packages/retrieval/src/weights.d.ts +3 -0
  198. package/dist/packages/retrieval/src/weights.js +28 -0
  199. package/dist/packages/security/src/annotations.d.ts +10 -0
  200. package/dist/packages/security/src/annotations.js +100 -0
  201. package/dist/packages/security/src/index.js +2 -0
  202. package/dist/packages/security/src/ssrf.d.ts +17 -0
  203. package/dist/packages/security/src/ssrf.js +132 -0
  204. package/dist/packages/shared/src/errors.d.ts +22 -0
  205. package/dist/packages/shared/src/errors.js +44 -0
  206. package/dist/packages/shared/src/hashing.d.ts +3 -0
  207. package/dist/packages/shared/src/hashing.js +21 -0
  208. package/dist/packages/shared/src/index.js +3 -0
  209. package/dist/packages/shared/src/types.d.ts +715 -0
  210. package/dist/packages/shared/src/types.js +1 -0
  211. package/dist/packages/storage/src/db.d.ts +11 -0
  212. package/dist/packages/storage/src/db.js +128 -0
  213. package/dist/packages/storage/src/index.js +10 -0
  214. package/dist/packages/storage/src/interfaces.d.ts +83 -0
  215. package/dist/packages/storage/src/interfaces.js +1 -0
  216. package/dist/packages/storage/src/repositories/api-repository.d.ts +16 -0
  217. package/dist/packages/storage/src/repositories/api-repository.js +169 -0
  218. package/dist/packages/storage/src/repositories/chunk-repository.d.ts +32 -0
  219. package/dist/packages/storage/src/repositories/chunk-repository.js +250 -0
  220. package/dist/packages/storage/src/repositories/example-repository.d.ts +16 -0
  221. package/dist/packages/storage/src/repositories/example-repository.js +158 -0
  222. package/dist/packages/storage/src/repositories/page-repository.d.ts +16 -0
  223. package/dist/packages/storage/src/repositories/page-repository.js +161 -0
  224. package/dist/packages/storage/src/repositories/pitfall-repository.d.ts +15 -0
  225. package/dist/packages/storage/src/repositories/pitfall-repository.js +144 -0
  226. package/dist/packages/storage/src/repositories/source-repository.d.ts +33 -0
  227. package/dist/packages/storage/src/repositories/source-repository.js +153 -0
  228. package/dist/packages/storage/src/repository.d.ts +92 -0
  229. package/dist/packages/storage/src/repository.js +157 -0
  230. package/dist/packages/storage/src/schema.d.ts +2 -0
  231. package/{packages/storage/src/schema.ts → dist/packages/storage/src/schema.js} +0 -3
  232. package/dist/packages/storage/src/search-tokens.d.ts +6 -0
  233. package/dist/packages/storage/src/search-tokens.js +26 -0
  234. package/dist/packages/verification/src/diff-engine.d.ts +18 -0
  235. package/dist/packages/verification/src/diff-engine.js +218 -0
  236. package/dist/packages/verification/src/extractor.d.ts +29 -0
  237. package/dist/packages/verification/src/extractor.js +302 -0
  238. package/dist/packages/verification/src/impact-scanner.d.ts +9 -0
  239. package/dist/packages/verification/src/impact-scanner.js +181 -0
  240. package/dist/packages/verification/src/index.js +5 -0
  241. package/dist/packages/verification/src/services.d.ts +55 -0
  242. package/dist/packages/verification/src/services.js +189 -0
  243. package/dist/packages/verification/src/verifier.d.ts +15 -0
  244. package/dist/packages/verification/src/verifier.js +315 -0
  245. package/dist/packages/workspace/src/detector.d.ts +7 -0
  246. package/dist/packages/workspace/src/detector.js +117 -0
  247. package/dist/packages/workspace/src/ecosystems/cargo.d.ts +10 -0
  248. package/dist/packages/workspace/src/ecosystems/cargo.js +69 -0
  249. package/dist/packages/workspace/src/ecosystems/composer.d.ts +7 -0
  250. package/dist/packages/workspace/src/ecosystems/composer.js +40 -0
  251. package/dist/packages/workspace/src/ecosystems/go.d.ts +7 -0
  252. package/dist/packages/workspace/src/ecosystems/go.js +49 -0
  253. package/{packages/workspace/src/ecosystems/index.ts → dist/packages/workspace/src/ecosystems/index.d.ts} +2 -24
  254. package/dist/packages/workspace/src/ecosystems/index.js +21 -0
  255. package/dist/packages/workspace/src/ecosystems/maven.d.ts +7 -0
  256. package/dist/packages/workspace/src/ecosystems/maven.js +28 -0
  257. package/dist/packages/workspace/src/ecosystems/npm.d.ts +10 -0
  258. package/dist/packages/workspace/src/ecosystems/npm.js +73 -0
  259. package/dist/packages/workspace/src/ecosystems/pub.d.ts +7 -0
  260. package/dist/packages/workspace/src/ecosystems/pub.js +34 -0
  261. package/dist/packages/workspace/src/ecosystems/pypi.d.ts +9 -0
  262. package/dist/packages/workspace/src/ecosystems/pypi.js +94 -0
  263. package/dist/packages/workspace/src/ecosystems/rubygems.d.ts +7 -0
  264. package/dist/packages/workspace/src/ecosystems/rubygems.js +25 -0
  265. package/dist/packages/workspace/src/ecosystems/types.d.ts +9 -0
  266. package/dist/packages/workspace/src/ecosystems/types.js +1 -0
  267. package/dist/packages/workspace/src/index.js +5 -0
  268. package/dist/packages/workspace/src/lockfile.d.ts +21 -0
  269. package/dist/packages/workspace/src/lockfile.js +153 -0
  270. package/dist/packages/workspace/src/resolver.d.ts +39 -0
  271. package/dist/packages/workspace/src/resolver.js +164 -0
  272. package/dist/packages/workspace/src/semver.d.ts +33 -0
  273. package/dist/packages/workspace/src/semver.js +235 -0
  274. package/package.json +13 -9
  275. package/apps/cli/bin/docorbit.js +0 -8
  276. package/apps/cli/src/commands/add.ts +0 -44
  277. package/apps/cli/src/commands/api.ts +0 -38
  278. package/apps/cli/src/commands/context.ts +0 -47
  279. package/apps/cli/src/commands/dashboard.ts +0 -55
  280. package/apps/cli/src/commands/diff.ts +0 -30
  281. package/apps/cli/src/commands/evaluate.ts +0 -133
  282. package/apps/cli/src/commands/examples.ts +0 -39
  283. package/apps/cli/src/commands/export.ts +0 -89
  284. package/apps/cli/src/commands/impact.ts +0 -31
  285. package/apps/cli/src/commands/init.ts +0 -69
  286. package/apps/cli/src/commands/inspect.ts +0 -30
  287. package/apps/cli/src/commands/mcp.ts +0 -72
  288. package/apps/cli/src/commands/pitfalls.ts +0 -38
  289. package/apps/cli/src/commands/recipes.ts +0 -35
  290. package/apps/cli/src/commands/search.ts +0 -48
  291. package/apps/cli/src/commands/update.ts +0 -73
  292. package/apps/cli/src/commands/verify.ts +0 -48
  293. package/apps/cli/src/formatters/colors.ts +0 -23
  294. package/apps/cli/src/formatters/inspection.ts +0 -102
  295. package/apps/cli/src/formatters/knowledge.ts +0 -272
  296. package/apps/cli/src/formatters/retrieval.ts +0 -74
  297. package/apps/cli/src/formatters/verification.ts +0 -126
  298. package/apps/cli/src/index.ts +0 -409
  299. package/packages/core/src/dashboard/server.ts +0 -314
  300. package/packages/core/src/implementation-service.ts +0 -451
  301. package/packages/core/src/inspector.ts +0 -71
  302. package/packages/core/src/pipeline.ts +0 -331
  303. package/packages/crawler/src/config.ts +0 -12
  304. package/packages/crawler/src/fetcher.ts +0 -185
  305. package/packages/discovery/src/index.ts +0 -31
  306. package/packages/discovery/src/provider.ts +0 -47
  307. package/packages/discovery/src/providers/generic.ts +0 -98
  308. package/packages/discovery/src/providers/github.ts +0 -61
  309. package/packages/discovery/src/providers/llms-txt.ts +0 -73
  310. package/packages/discovery/src/providers/markdown.ts +0 -48
  311. package/packages/discovery/src/providers/openapi.ts +0 -91
  312. package/packages/discovery/src/providers/sitemap.ts +0 -62
  313. package/packages/discovery/src/providers/skill.ts +0 -54
  314. package/packages/discovery/src/ranker.ts +0 -123
  315. package/packages/evaluation/src/dataset.ts +0 -963
  316. package/packages/evaluation/src/runner.ts +0 -241
  317. package/packages/evaluation/src/strategies/context7-runner.ts +0 -269
  318. package/packages/evaluation/src/strategies/docorbit-runner.ts +0 -228
  319. package/packages/evaluation/src/strategies/firecrawl-runner.ts +0 -172
  320. package/packages/evaluation/src/strategies/web-search-runner.ts +0 -194
  321. package/packages/evaluation/src/types.ts +0 -34
  322. package/packages/evaluation/src/version-matcher.ts +0 -73
  323. package/packages/export/src/agents-md.ts +0 -200
  324. package/packages/export/src/claude-md.ts +0 -141
  325. package/packages/export/src/docs-map.ts +0 -150
  326. package/packages/export/src/llms-txt.ts +0 -96
  327. package/packages/export/src/service.ts +0 -250
  328. package/packages/export/src/skill-md.ts +0 -128
  329. package/packages/mcp/src/resources/index.ts +0 -189
  330. package/packages/mcp/src/server.ts +0 -278
  331. package/packages/mcp/src/tools/analyze-impact.ts +0 -74
  332. package/packages/mcp/src/tools/check-api.ts +0 -86
  333. package/packages/mcp/src/tools/diff-docs.ts +0 -68
  334. package/packages/mcp/src/tools/export-context.ts +0 -73
  335. package/packages/mcp/src/tools/find-api.ts +0 -99
  336. package/packages/mcp/src/tools/find-example.ts +0 -100
  337. package/packages/mcp/src/tools/find-pitfall.ts +0 -94
  338. package/packages/mcp/src/tools/find-recipe.ts +0 -98
  339. package/packages/mcp/src/tools/get-doc.ts +0 -130
  340. package/packages/mcp/src/tools/get-docs-map.ts +0 -64
  341. package/packages/mcp/src/tools/get-version.ts +0 -118
  342. package/packages/mcp/src/tools/implementation-context.ts +0 -88
  343. package/packages/mcp/src/tools/index.ts +0 -59
  344. package/packages/mcp/src/tools/list-sources.ts +0 -85
  345. package/packages/mcp/src/tools/search-docs.ts +0 -123
  346. package/packages/mcp/src/tools/types.ts +0 -28
  347. package/packages/mcp/src/transports/http.ts +0 -256
  348. package/packages/mcp/src/transports/stdio.ts +0 -105
  349. package/packages/mcp/src/types.ts +0 -102
  350. package/packages/normalizer/src/example-indexer.ts +0 -240
  351. package/packages/normalizer/src/html.ts +0 -253
  352. package/packages/normalizer/src/llms.ts +0 -83
  353. package/packages/normalizer/src/openapi/endpoint-parser.ts +0 -406
  354. package/packages/normalizer/src/openapi/schema-resolver.ts +0 -111
  355. package/packages/normalizer/src/page.ts +0 -184
  356. package/packages/normalizer/src/pitfall-extractor.ts +0 -190
  357. package/packages/normalizer/src/slicer.ts +0 -455
  358. package/packages/retrieval/src/engine.ts +0 -120
  359. package/packages/retrieval/src/intent.ts +0 -43
  360. package/packages/retrieval/src/packer.ts +0 -145
  361. package/packages/retrieval/src/recipe-engine.ts +0 -313
  362. package/packages/retrieval/src/scorer.ts +0 -139
  363. package/packages/retrieval/src/weights.ts +0 -31
  364. package/packages/security/src/annotations.ts +0 -112
  365. package/packages/security/src/ssrf.ts +0 -153
  366. package/packages/shared/src/errors.ts +0 -53
  367. package/packages/shared/src/hashing.ts +0 -23
  368. package/packages/shared/src/types.ts +0 -881
  369. package/packages/storage/src/db.ts +0 -72
  370. package/packages/storage/src/interfaces.ts +0 -115
  371. package/packages/storage/src/repositories/api-repository.ts +0 -219
  372. package/packages/storage/src/repositories/chunk-repository.ts +0 -316
  373. package/packages/storage/src/repositories/example-repository.ts +0 -206
  374. package/packages/storage/src/repositories/page-repository.ts +0 -205
  375. package/packages/storage/src/repositories/pitfall-repository.ts +0 -188
  376. package/packages/storage/src/repositories/source-repository.ts +0 -205
  377. package/packages/storage/src/repository.ts +0 -256
  378. package/packages/storage/src/search-tokens.ts +0 -28
  379. package/packages/verification/src/diff-engine.ts +0 -258
  380. package/packages/verification/src/extractor.ts +0 -339
  381. package/packages/verification/src/impact-scanner.ts +0 -203
  382. package/packages/verification/src/services.ts +0 -238
  383. package/packages/verification/src/verifier.ts +0 -375
  384. package/packages/workspace/src/detector.ts +0 -143
  385. package/packages/workspace/src/ecosystems/cargo.ts +0 -84
  386. package/packages/workspace/src/ecosystems/composer.ts +0 -42
  387. package/packages/workspace/src/ecosystems/go.ts +0 -54
  388. package/packages/workspace/src/ecosystems/maven.ts +0 -34
  389. package/packages/workspace/src/ecosystems/npm.ts +0 -83
  390. package/packages/workspace/src/ecosystems/pub.ts +0 -40
  391. package/packages/workspace/src/ecosystems/pypi.ts +0 -100
  392. package/packages/workspace/src/ecosystems/rubygems.ts +0 -30
  393. package/packages/workspace/src/ecosystems/types.ts +0 -18
  394. package/packages/workspace/src/lockfile.ts +0 -194
  395. package/packages/workspace/src/resolver.ts +0 -234
  396. package/packages/workspace/src/semver.ts +0 -259
  397. /package/{packages/crawler/src/index.ts → dist/packages/crawler/src/index.d.ts} +0 -0
  398. /package/{packages/evaluation/src/index.ts → dist/packages/evaluation/src/index.d.ts} +0 -0
  399. /package/{packages/export/src/index.ts → dist/packages/export/src/index.d.ts} +0 -0
  400. /package/{packages/normalizer/src/openapi.ts → dist/packages/normalizer/src/openapi.d.ts} +0 -0
  401. /package/{packages/security/src/index.ts → dist/packages/security/src/index.d.ts} +0 -0
  402. /package/{packages/shared/src/index.ts → dist/packages/shared/src/index.d.ts} +0 -0
  403. /package/{packages/storage/src/index.ts → dist/packages/storage/src/index.d.ts} +0 -0
  404. /package/{packages/verification/src/index.ts → dist/packages/verification/src/index.d.ts} +0 -0
  405. /package/{packages/workspace/src/index.ts → dist/packages/workspace/src/index.d.ts} +0 -0
@@ -0,0 +1,265 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { RetrievalEngine } from "./engine.js";
3
+ import { resolveProjectContext } from "../../workspace/src/index.js";
4
+ export class RecipeEngine {
5
+ repository;
6
+ retrievalEngine;
7
+ constructor(repository, retrievalEngine) {
8
+ this.repository = repository;
9
+ this.retrievalEngine = retrievalEngine || new RetrievalEngine(repository);
10
+ }
11
+ /**
12
+ * Deterministically compiles an implementation recipe grounded strictly in indexed evidence.
13
+ * Distinguishes documented facts, inferred relationships, and missing information.
14
+ * Never invents APIs, steps, prerequisites, or validation steps.
15
+ */
16
+ async assembleRecipe(goal, options = {}) {
17
+ const cleanGoal = goal.trim();
18
+ let effectiveDocVersion = options.docVersion;
19
+ // Resolve project and version context if projectDir is provided
20
+ if (options.projectDir) {
21
+ const projContext = resolveProjectContext(options.projectDir, cleanGoal, this.repository);
22
+ if (projContext.matchedDependency && !effectiveDocVersion) {
23
+ effectiveDocVersion = projContext.matchedDependency.targetDocVersion;
24
+ }
25
+ }
26
+ // 1. Query candidate API endpoints, examples, pitfalls, and search chunks
27
+ const endpoints = this.repository.searchApiEndpoints(cleanGoal, {
28
+ docVersion: effectiveDocVersion,
29
+ limit: 10,
30
+ });
31
+ const examples = this.repository.searchIndexedExamples(cleanGoal, {
32
+ docVersion: effectiveDocVersion,
33
+ limit: 10,
34
+ });
35
+ const pitfalls = this.repository.searchPitfalls(cleanGoal, {
36
+ docVersion: effectiveDocVersion,
37
+ limit: 10,
38
+ });
39
+ const searchResults = await this.retrievalEngine.search(cleanGoal, {
40
+ docVersion: effectiveDocVersion,
41
+ limit: 10,
42
+ });
43
+ // 2. Collect unique source URLs
44
+ const sourcesSet = new Set();
45
+ for (const ep of endpoints) {
46
+ if (ep.provenance?.sourceUrl)
47
+ sourcesSet.add(ep.provenance.sourceUrl);
48
+ }
49
+ for (const ex of examples) {
50
+ if (ex.sourceUrl)
51
+ sourcesSet.add(ex.sourceUrl);
52
+ }
53
+ for (const pf of pitfalls) {
54
+ if (pf.provenance?.sourceUrl)
55
+ sourcesSet.add(pf.provenance.sourceUrl);
56
+ }
57
+ for (const sr of searchResults) {
58
+ if (sr.chunk.provenance?.sourceUrl)
59
+ sourcesSet.add(sr.chunk.provenance.sourceUrl);
60
+ }
61
+ const sources = Array.from(sourcesSet);
62
+ // 3. Assemble Prerequisites strictly from documented requirements
63
+ const prerequisites = [];
64
+ // Check required_config or permission pitfalls
65
+ for (const pf of pitfalls) {
66
+ if (pf.kind === 'required_config' || pf.kind === 'permission') {
67
+ prerequisites.push({
68
+ text: `${pf.title}: ${pf.content}`,
69
+ evidenceLevel: 'documented_fact',
70
+ sourceUrl: pf.provenance?.sourceUrl,
71
+ });
72
+ }
73
+ }
74
+ // Check chunks with prerequisite/setup headings (only relevant chunks with score >= 5.0)
75
+ for (const sr of searchResults.filter(s => s.score >= 5.0)) {
76
+ const headingText = (sr.chunk.title || sr.chunk.sectionPath.join(' ')).toLowerCase();
77
+ if (headingText.includes('prerequisite') || headingText.includes('before you begin') || headingText.includes('requirements')) {
78
+ const textSnippet = sr.chunk.content.split('\n')[0].trim();
79
+ if (textSnippet && !prerequisites.some(p => p.text === textSnippet)) {
80
+ prerequisites.push({
81
+ text: textSnippet,
82
+ evidenceLevel: 'documented_fact',
83
+ sourceUrl: sr.chunk.provenance?.sourceUrl,
84
+ });
85
+ }
86
+ }
87
+ }
88
+ // 4. Assemble Ordered Steps
89
+ const orderedSteps = [];
90
+ const usedApis = new Set();
91
+ const usedExamples = new Set();
92
+ const usedPitfalls = new Set();
93
+ let stepNumber = 1;
94
+ // A. Setup / Client Initialization Step (if documented in examples)
95
+ const initExample = examples.find(ex => /(?:new\s+\w+|initialize|config(?:ure)?|createClient|express\(\)|FastAPI\()/i.test(ex.code));
96
+ if (initExample) {
97
+ orderedSteps.push({
98
+ step: stepNumber++,
99
+ title: `Initialize Client / Service (${initExample.framework || initExample.language})`,
100
+ description: `Configure and initialize client instance as documented in ${initExample.task}`,
101
+ evidenceLevel: 'documented_fact',
102
+ exampleCode: initExample.code,
103
+ sourceUrl: initExample.sourceUrl,
104
+ sourceChunkIds: initExample.chunkId ? [initExample.chunkId] : undefined,
105
+ });
106
+ usedExamples.add(initExample.id);
107
+ }
108
+ // B. Primary API Actions (Documented Fact)
109
+ for (const ep of endpoints) {
110
+ const apiStr = `${ep.method.toUpperCase()} ${ep.path}`;
111
+ if (usedApis.has(apiStr))
112
+ continue;
113
+ usedApis.add(apiStr);
114
+ // Find matching code example for this API
115
+ const matchingEx = examples.find(ex => !usedExamples.has(ex.id) &&
116
+ (ex.relatedApi === apiStr || ex.code.includes(ep.path) || (ep.operationId && ex.code.includes(ep.operationId))));
117
+ if (matchingEx)
118
+ usedExamples.add(matchingEx.id);
119
+ // Find matching pitfalls for this API
120
+ const matchingPfs = pitfalls.filter(pf => pf.relatedApi === apiStr ||
121
+ (ep.deprecated && pf.kind === 'deprecated') ||
122
+ (pf.kind === 'rate_limit') ||
123
+ (pf.kind === 'breaking_change'));
124
+ const stepPitfalls = [];
125
+ for (const p of matchingPfs) {
126
+ const pfStr = `[${p.kind}] ${p.title}: ${p.content}`;
127
+ stepPitfalls.push(pfStr);
128
+ usedPitfalls.add(pfStr);
129
+ }
130
+ // If the endpoint is deprecated, explicitly highlight it in step title/description
131
+ const depWarning = ep.deprecated ? ' [DEPRECATED]' : '';
132
+ orderedSteps.push({
133
+ step: stepNumber++,
134
+ title: `${apiStr}${depWarning}${ep.summary ? ` - ${ep.summary}` : ''}`,
135
+ description: ep.description || ep.summary || `Execute documented ${apiStr} request with parameters: ${ep.parameters.map(p => `${p.name}${p.required ? ' (required)' : ''}`).join(', ')}`,
136
+ evidenceLevel: 'documented_fact',
137
+ apiEndpoint: apiStr,
138
+ exampleCode: matchingEx?.code,
139
+ pitfalls: stepPitfalls.length > 0 ? stepPitfalls : undefined,
140
+ sourceUrl: ep.provenance?.sourceUrl || matchingEx?.sourceUrl,
141
+ sourceChunkIds: matchingEx?.chunkId ? [matchingEx.chunkId] : undefined,
142
+ });
143
+ }
144
+ // C. Remaining Code Examples as implementation steps
145
+ for (const ex of examples) {
146
+ if (usedExamples.has(ex.id))
147
+ continue;
148
+ usedExamples.add(ex.id);
149
+ const matchingPfs = pitfalls.filter(pf => (ex.relatedApi && pf.relatedApi === ex.relatedApi) ||
150
+ (ex.relatedSymbol && pf.relatedSymbol === ex.relatedSymbol));
151
+ const stepPitfalls = matchingPfs.map(p => `[${p.kind}] ${p.title}: ${p.content}`);
152
+ stepPitfalls.forEach(p => usedPitfalls.add(p));
153
+ orderedSteps.push({
154
+ step: stepNumber++,
155
+ title: ex.task,
156
+ description: `Implement documented code example for ${ex.task} (${ex.language}${ex.framework ? ` / ${ex.framework}` : ''})`,
157
+ evidenceLevel: 'documented_fact',
158
+ apiEndpoint: ex.relatedApi,
159
+ exampleCode: ex.code,
160
+ pitfalls: stepPitfalls.length > 0 ? stepPitfalls : undefined,
161
+ sourceUrl: ex.sourceUrl,
162
+ sourceChunkIds: ex.chunkId ? [ex.chunkId] : undefined,
163
+ });
164
+ if (ex.relatedApi)
165
+ usedApis.add(ex.relatedApi);
166
+ }
167
+ // D. If neither endpoints nor examples existed, check procedural chunks with strong relevance
168
+ if (orderedSteps.length === 0) {
169
+ for (const sr of searchResults.filter(s => s.score >= 5.0).slice(0, 3)) {
170
+ orderedSteps.push({
171
+ step: stepNumber++,
172
+ title: sr.chunk.title || sr.chunk.sectionPath.join(' > ') || 'Documented Procedure',
173
+ description: sr.chunk.content.substring(0, 300),
174
+ evidenceLevel: 'inferred_relationship',
175
+ sourceUrl: sr.chunk.provenance?.sourceUrl,
176
+ sourceChunkIds: [sr.chunk.id],
177
+ });
178
+ }
179
+ }
180
+ // E. If documentation contains no relevant implementation steps, mark missing_information
181
+ if (orderedSteps.length === 0) {
182
+ orderedSteps.push({
183
+ step: stepNumber++,
184
+ title: 'Missing Implementation Knowledge',
185
+ description: `The indexed documentation does not contain documented API endpoints, code examples, or procedures for: "${cleanGoal}".`,
186
+ evidenceLevel: 'missing_information',
187
+ });
188
+ }
189
+ // 5. Assemble Evidence-Based Validation Steps
190
+ const validationSteps = [];
191
+ let valStepNumber = 1;
192
+ // Validation from API response schemas
193
+ for (const ep of endpoints) {
194
+ const okResponse = ep.responseSchema?.['200'] || ep.responseSchema?.['201'];
195
+ if (okResponse && okResponse.schema) {
196
+ const props = okResponse.schema.properties ? Object.keys(okResponse.schema.properties) : [];
197
+ const propsDesc = props.length > 0 ? ` Expected properties: [${props.slice(0, 6).join(', ')}]` : '';
198
+ const exampleStr = okResponse.example ? JSON.stringify(okResponse.example, null, 2) : undefined;
199
+ validationSteps.push({
200
+ step: valStepNumber++,
201
+ description: `Verify ${ep.method.toUpperCase()} ${ep.path} returns HTTP ${okResponse.statusCode}.${propsDesc}`,
202
+ evidenceLevel: 'documented_fact',
203
+ expectedResponse: exampleStr || (props.length > 0 ? JSON.stringify(props) : undefined),
204
+ sourceUrl: ep.provenance?.sourceUrl,
205
+ });
206
+ }
207
+ }
208
+ // Validation from code examples containing verification/assertion patterns
209
+ for (const ex of examples) {
210
+ if (/(?:constructEvent|verifySignature|assert|expect|validate|signature)/i.test(ex.code)) {
211
+ validationSteps.push({
212
+ step: valStepNumber++,
213
+ description: `Validate event/data integrity using documented pattern from ${ex.task}`,
214
+ evidenceLevel: 'documented_fact',
215
+ testPattern: ex.code,
216
+ sourceUrl: ex.sourceUrl,
217
+ });
218
+ }
219
+ }
220
+ // If no validation steps can be derived from evidence, do NOT invent any!
221
+ if (validationSteps.length === 0) {
222
+ validationSteps.push({
223
+ step: 1,
224
+ description: 'No response schemas, test instructions, or verification assertions are documented for this task.',
225
+ evidenceLevel: 'missing_information',
226
+ });
227
+ }
228
+ // Collect all pitfalls
229
+ for (const pf of pitfalls) {
230
+ const pfStr = `[${pf.kind}] ${pf.title}: ${pf.content}`;
231
+ usedPitfalls.add(pfStr);
232
+ }
233
+ // Calculate confidence score strictly based on evidence
234
+ let confidence = 0.0;
235
+ const factSteps = orderedSteps.filter(s => s.evidenceLevel === 'documented_fact').length;
236
+ const totalSteps = orderedSteps.length;
237
+ if (totalSteps > 0 && factSteps > 0) {
238
+ confidence += 0.4 * (factSteps / totalSteps);
239
+ if (endpoints.length > 0)
240
+ confidence += 0.3;
241
+ if (examples.length > 0)
242
+ confidence += 0.2;
243
+ if (validationSteps.some(v => v.evidenceLevel === 'documented_fact'))
244
+ confidence += 0.1;
245
+ }
246
+ confidence = Math.min(1.0, Math.round(confidence * 100) / 100);
247
+ const recipeId = createHash('sha256')
248
+ .update(`${cleanGoal}:${effectiveDocVersion || 'default'}:${orderedSteps.length}`)
249
+ .digest('hex')
250
+ .substring(0, 16);
251
+ return {
252
+ id: recipeId,
253
+ goal: cleanGoal,
254
+ prerequisites,
255
+ orderedSteps,
256
+ requiredApis: Array.from(usedApis),
257
+ examples: Array.from(usedExamples),
258
+ pitfalls: Array.from(usedPitfalls),
259
+ validationSteps,
260
+ sources,
261
+ docVersion: effectiveDocVersion,
262
+ confidence,
263
+ };
264
+ }
265
+ }
@@ -0,0 +1,13 @@
1
+ import type { DocumentChunk, SymbolReference, ChunkCode, ScoringWeights, QueryIntent, SourceAuthority, SearchResult } from '../../shared/src/index.ts';
2
+ export interface ScoreCandidateInput {
3
+ chunk: DocumentChunk;
4
+ ftsRank: number;
5
+ symbols: SymbolReference[];
6
+ codeSnippets: ChunkCode[];
7
+ query: string;
8
+ intent: QueryIntent;
9
+ authority?: SourceAuthority;
10
+ targetDocVersion?: string;
11
+ weights: ScoringWeights;
12
+ }
13
+ export declare function scoreChunkCandidate(input: ScoreCandidateInput): SearchResult;
@@ -0,0 +1,110 @@
1
+ export function scoreChunkCandidate(input) {
2
+ const { chunk, ftsRank, symbols, codeSnippets, query, intent, authority = 'official', targetDocVersion, weights } = input;
3
+ const matchReasons = [];
4
+ const queryLower = query.toLowerCase().trim();
5
+ const queryTokens = queryLower
6
+ .replace(/[^\w\s-]/g, ' ')
7
+ .split(/\s+/)
8
+ .filter(t => t.length > 2);
9
+ // 1. Base BM25 score from FTS5 (FTS5 rank is negative where smaller = more relevant)
10
+ const normalizedBm25 = Math.max(0.1, -ftsRank);
11
+ let totalScore = normalizedBm25 * weights.bm25Weight;
12
+ matchReasons.push(`BM25 base (${normalizedBm25.toFixed(2)})`);
13
+ // 2. Exact phrase match in content
14
+ if (chunk.content.toLowerCase().includes(queryLower)) {
15
+ totalScore += weights.exactPhraseBonus;
16
+ matchReasons.push(`Exact phrase match (+${weights.exactPhraseBonus})`);
17
+ }
18
+ // 3. Title match
19
+ const titleLower = (chunk.title || '').toLowerCase();
20
+ const titleMatches = queryTokens.filter(t => titleLower.includes(t));
21
+ if (titleMatches.length > 0) {
22
+ const boost = weights.titleBonus * (titleMatches.length / queryTokens.length);
23
+ totalScore += boost;
24
+ matchReasons.push(`Title match [${titleMatches.join(', ')}] (+${boost.toFixed(1)})`);
25
+ }
26
+ // 4. Section path match
27
+ const pathString = chunk.sectionPath.join(' ').toLowerCase();
28
+ const pathMatches = queryTokens.filter(t => pathString.includes(t));
29
+ if (pathMatches.length > 0) {
30
+ const boost = weights.sectionPathBonus * (pathMatches.length / queryTokens.length);
31
+ totalScore += boost;
32
+ matchReasons.push(`Section breadcrumbs match [${pathMatches.join(', ')}] (+${boost.toFixed(1)})`);
33
+ }
34
+ // 5. Symbol match (shallow deterministic regex symbols)
35
+ const matchedSymbols = symbols.filter(s => {
36
+ const symLower = s.name.toLowerCase();
37
+ return queryLower.includes(symLower) || symLower.includes(queryLower);
38
+ });
39
+ if (matchedSymbols.length > 0) {
40
+ totalScore += weights.symbolMatchBonus;
41
+ matchReasons.push(`Symbol match [${matchedSymbols.map(s => s.name).join(', ')}] (+${weights.symbolMatchBonus})`);
42
+ }
43
+ // 6. Query intent alignment
44
+ let intentBoost = 0;
45
+ if (intent === 'api' && chunk.chunkType === 'api') {
46
+ intentBoost = weights.intentTypeBonus;
47
+ }
48
+ else if (intent === 'examples' && (chunk.chunkType === 'example' || chunk.chunkType === 'code')) {
49
+ intentBoost = weights.intentTypeBonus;
50
+ }
51
+ else if (intent === 'troubleshooting' && (chunk.chunkType === 'warning' || /error|exception|fail|status|code/i.test(chunk.content))) {
52
+ intentBoost = weights.intentTypeBonus;
53
+ }
54
+ else if (intent === 'implementation' && (chunk.chunkType === 'mixed' || chunk.chunkType === 'example')) {
55
+ intentBoost = weights.intentTypeBonus;
56
+ }
57
+ else if (intent === 'conceptual' && chunk.chunkType === 'prose') {
58
+ intentBoost = weights.intentTypeBonus;
59
+ }
60
+ else if (intent === 'configuration' && (symbols.some(s => s.kind === 'config') || chunk.chunkType === 'prose')) {
61
+ intentBoost = weights.intentTypeBonus;
62
+ }
63
+ if (intentBoost > 0) {
64
+ totalScore += intentBoost;
65
+ matchReasons.push(`Intent alignment '${intent}' for chunkType '${chunk.chunkType}' (+${intentBoost})`);
66
+ }
67
+ // 7. Documentation version boosting & nuance
68
+ if (targetDocVersion && chunk.docVersion) {
69
+ const chunkVerClean = chunk.docVersion.replace(/^[v=]/, '');
70
+ const targetVerClean = targetDocVersion.replace(/^[v=]/, '');
71
+ const chunkMajor = chunkVerClean.split('.')[0];
72
+ const targetMajor = targetVerClean.split('.')[0];
73
+ if (chunkVerClean === targetVerClean || chunk.docVersion === targetDocVersion) {
74
+ // Exact version match
75
+ totalScore += weights.versionBonus;
76
+ matchReasons.push(`Target doc version exact match [${chunk.docVersion}] (+${weights.versionBonus})`);
77
+ }
78
+ else if (chunkMajor === targetMajor) {
79
+ // Same major version (e.g. target 14.2.3, chunk v14 or 14.1)
80
+ const majorBoost = weights.versionBonus * 0.85;
81
+ totalScore += majorBoost;
82
+ matchReasons.push(`Target doc major match [${chunk.docVersion}] (+${majorBoost.toFixed(1)})`);
83
+ }
84
+ else if (chunk.docVersion === 'latest' ||
85
+ chunk.docVersion === 'stable' ||
86
+ chunk.docVersion === 'current') {
87
+ // Unversioned / latest documentation: neutral supplemental context
88
+ matchReasons.push(`Supplemental unversioned/latest documentation [${chunk.docVersion}]`);
89
+ }
90
+ else {
91
+ // Evidence of major version incompatibility (e.g. target v14 vs chunk v16)
92
+ const penalty = weights.versionBonus * 0.5;
93
+ totalScore -= penalty;
94
+ matchReasons.push(`Version major discrepancy [chunk ${chunk.docVersion} vs target ${targetDocVersion}] (-${penalty.toFixed(1)})`);
95
+ }
96
+ }
97
+ // 8. Authority weighting
98
+ const authMultiplier = weights.authorityWeights[authority] ?? 1.0;
99
+ totalScore *= authMultiplier;
100
+ if (authMultiplier !== 1.0) {
101
+ matchReasons.push(`Authority weighting: x${authMultiplier}`);
102
+ }
103
+ return {
104
+ chunk,
105
+ score: parseFloat(totalScore.toFixed(3)),
106
+ matchReasons,
107
+ symbols,
108
+ codeSnippets,
109
+ };
110
+ }
@@ -0,0 +1,3 @@
1
+ import type { ScoringWeights } from '../../shared/src/index.ts';
2
+ export declare const DEFAULT_SCORING_WEIGHTS_V1: ScoringWeights;
3
+ export declare function resolveScoringWeights(overrides?: Partial<ScoringWeights>): ScoringWeights;
@@ -0,0 +1,28 @@
1
+ export const DEFAULT_SCORING_WEIGHTS_V1 = {
2
+ version: '1.0.0',
3
+ bm25Weight: 1.0,
4
+ exactPhraseBonus: 5.0,
5
+ titleBonus: 8.0,
6
+ sectionPathBonus: 4.0,
7
+ symbolMatchBonus: 10.0,
8
+ intentTypeBonus: 6.0,
9
+ versionBonus: 12.0,
10
+ authorityWeights: {
11
+ official: 1.0,
12
+ community: 0.8,
13
+ third_party: 0.6,
14
+ },
15
+ };
16
+ export function resolveScoringWeights(overrides) {
17
+ if (!overrides) {
18
+ return { ...DEFAULT_SCORING_WEIGHTS_V1 };
19
+ }
20
+ return {
21
+ ...DEFAULT_SCORING_WEIGHTS_V1,
22
+ ...overrides,
23
+ authorityWeights: {
24
+ ...DEFAULT_SCORING_WEIGHTS_V1.authorityWeights,
25
+ ...(overrides.authorityWeights || {}),
26
+ },
27
+ };
28
+ }
@@ -0,0 +1,10 @@
1
+ import type { SecurityAnnotation } from '../../shared/src/index.ts';
2
+ /**
3
+ * Scans documentation content for security hazards (prompt injection,
4
+ * malicious execution snippets, unsafe links, credential harvesting) and returns
5
+ * non-destructive annotations.
6
+ *
7
+ * Principle: External documentation is treated as untrusted data and structurally
8
+ * separated from agent instructions. Original documentation text is never altered.
9
+ */
10
+ export declare function detectSecurityAnnotations(content: string): SecurityAnnotation[];
@@ -0,0 +1,100 @@
1
+ const MULTILINE_INJECTION_PATTERNS = [
2
+ { pattern: /<system\b[^>]*>([\s\S]*?)<\/system>/gi, severity: 'high', label: '<system> block' },
3
+ { pattern: /\[SYSTEM(?:\s+INSTRUCTION)?\]([\s\S]*?)\[\/SYSTEM(?:\s+INSTRUCTION)?\]/gi, severity: 'high', label: '[SYSTEM] block' },
4
+ { pattern: /<\|im_start\|>system([\s\S]*?)<\|im_end\|>/gi, severity: 'high', label: 'ChatML system block' },
5
+ { pattern: /<!--\s*AI\s+INSTRUCTION:([\s\S]*?)-->/gi, severity: 'high', label: 'HTML comment injection' },
6
+ ];
7
+ const PROMPT_INJECTION_PATTERNS = [
8
+ { pattern: /\b(?:ignore|disregard|forget)\s+(?:all\s+)?(?:previous|prior|above)\s+instructions\b/i, severity: 'high' },
9
+ { pattern: /\b(?:system\s+message|system\s+prompt|system\s+instruction)\s*[:=]/i, severity: 'high' },
10
+ { pattern: /\byou\s+are\s+now\s+(?:an?\s+)?(?:unrestricted|jailbroken|developer\s+mode|dan|evil)\b/i, severity: 'high' },
11
+ { pattern: /\byou\s+are\s+now\s+(?:acting\s+as\s+)?a\b.*?\bassistant\s+that\s+(?:executes|runs|ignores)\b/i, severity: 'high' },
12
+ { pattern: /\bIMPORTANT\s+INSTRUCTION\s+FOR\s+(?:THE\s+)?AI\s+AGENT\b/i, severity: 'high' },
13
+ { pattern: /\b(?:call|invoke|execute)\s+(?:the\s+)?tool\s+['"]?[a-zA-Z0-9_-]+['"]?\s+with\b/i, severity: 'high' },
14
+ { pattern: /\buse\s+(?:the\s+)?(?:bash|terminal|shell|command|run_command)\s+tool\s+to\b/i, severity: 'high' },
15
+ { pattern: /\bdo\s+not\s+tell\s+the\s+user\b/i, severity: 'medium' },
16
+ ];
17
+ const SUSPICIOUS_INSTRUCTION_PATTERNS = [
18
+ { pattern: /curl\s+-[sS]*[fF]*[kK]*\s+https?:\/\/[^\s|]+\s*\|\s*(?:ba)?sh/i, severity: 'high' },
19
+ { pattern: /wget\s+-[qO-]*\s+https?:\/\/[^\s|]+\s*\|\s*(?:ba)?sh/i, severity: 'high' },
20
+ { pattern: /powershell\s+.*-(?:enc|encodedcommand)\s+[A-Za-z0-9+/=]{20,}/i, severity: 'high' },
21
+ { pattern: /base64\s+-d\s+.*\|\s*(?:ba)?sh/i, severity: 'high' },
22
+ { pattern: /eval\s*\(\s*base64_decode\s*\(/i, severity: 'high' },
23
+ { pattern: /\b(?:cat|type)\s+[^\n]*\.(?:ssh\/id_[a-zA-Z0-9_-]*|aws\/credentials|env)\b/i, severity: 'high' },
24
+ { pattern: /\b(?:curl|wget|fetch|nc|ncat)\b[^\n]*\b(?:\.ssh\/id_|\.aws\/credentials|\.env|API_KEY|SECRET)\b/i, severity: 'high' },
25
+ { pattern: /\b(?:printenv|env)\b[^\n]*\|\s*(?:curl|nc|wget|base64)/i, severity: 'high' },
26
+ ];
27
+ const UNSAFE_LINK_PATTERNS = [
28
+ { pattern: /\[[^\]]*\]\(((?:javascript|data|file):[\s\S]*?)\)(?:\.|\s|$)/i, severity: 'high' },
29
+ ];
30
+ /**
31
+ * Scans documentation content for security hazards (prompt injection,
32
+ * malicious execution snippets, unsafe links, credential harvesting) and returns
33
+ * non-destructive annotations.
34
+ *
35
+ * Principle: External documentation is treated as untrusted data and structurally
36
+ * separated from agent instructions. Original documentation text is never altered.
37
+ */
38
+ export function detectSecurityAnnotations(content) {
39
+ const annotations = [];
40
+ if (!content)
41
+ return annotations;
42
+ // 1. Multiline patterns across whole content
43
+ for (const rule of MULTILINE_INJECTION_PATTERNS) {
44
+ let match;
45
+ const regex = new RegExp(rule.pattern.source, rule.pattern.flags);
46
+ while ((match = regex.exec(content)) !== null) {
47
+ const matchStart = match.index;
48
+ const lineNumber = content.slice(0, matchStart).split('\n').length;
49
+ annotations.push({
50
+ type: 'prompt_injection_suspected',
51
+ location: `Line ${lineNumber} (${rule.label})`,
52
+ evidence: match[0].slice(0, 150).trim(),
53
+ severity: rule.severity,
54
+ });
55
+ }
56
+ }
57
+ // 2. Line-by-line checks
58
+ const lines = content.split('\n');
59
+ for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {
60
+ const line = lines[lineIdx];
61
+ const loc = `Line ${lineIdx + 1}`;
62
+ // Prompt injection checks
63
+ for (const rule of PROMPT_INJECTION_PATTERNS) {
64
+ const match = line.match(rule.pattern);
65
+ if (match) {
66
+ annotations.push({
67
+ type: 'prompt_injection_suspected',
68
+ location: loc,
69
+ evidence: match[0].trim(),
70
+ severity: rule.severity,
71
+ });
72
+ }
73
+ }
74
+ // Suspicious shell execution / credential theft checks
75
+ for (const rule of SUSPICIOUS_INSTRUCTION_PATTERNS) {
76
+ const match = line.match(rule.pattern);
77
+ if (match) {
78
+ annotations.push({
79
+ type: 'suspicious_instruction',
80
+ location: loc,
81
+ evidence: match[0].trim(),
82
+ severity: rule.severity,
83
+ });
84
+ }
85
+ }
86
+ // Unsafe link protocols check
87
+ for (const rule of UNSAFE_LINK_PATTERNS) {
88
+ const match = line.match(rule.pattern);
89
+ if (match) {
90
+ annotations.push({
91
+ type: 'unsafe_link',
92
+ location: loc,
93
+ evidence: match[1] || match[0],
94
+ severity: rule.severity,
95
+ });
96
+ }
97
+ }
98
+ }
99
+ return annotations;
100
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./ssrf.js";
2
+ export * from "./annotations.js";
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Checks whether an IPv4 or IPv6 address is in a private, link-local, loopback,
3
+ * or cloud provider metadata range.
4
+ */
5
+ export declare function isPrivateOrBlockedIp(ip: string): boolean;
6
+ export interface SsrfValidationOptions {
7
+ allowLocalhostForTesting?: boolean;
8
+ }
9
+ /**
10
+ * Validates a target URL against SSRF threats:
11
+ * - Ensures valid HTTP/HTTPS protocol
12
+ * - Validates hostname does not resolve to private or loopback IP
13
+ */
14
+ export declare function validateTargetUrl(urlStr: string, options?: SsrfValidationOptions): Promise<{
15
+ url: URL;
16
+ resolvedIp: string;
17
+ }>;