docorbit 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/bin/docorbit.js +2 -2
  2. package/dist/apps/cli/src/commands/add.d.ts +7 -0
  3. package/dist/apps/cli/src/commands/add.js +35 -0
  4. package/dist/apps/cli/src/commands/api.d.ts +2 -0
  5. package/dist/apps/cli/src/commands/api.js +35 -0
  6. package/dist/apps/cli/src/commands/context.d.ts +10 -0
  7. package/dist/apps/cli/src/commands/context.js +36 -0
  8. package/dist/apps/cli/src/commands/dashboard.d.ts +8 -0
  9. package/dist/apps/cli/src/commands/dashboard.js +43 -0
  10. package/dist/apps/cli/src/commands/diff.d.ts +2 -0
  11. package/dist/apps/cli/src/commands/diff.js +29 -0
  12. package/dist/apps/cli/src/commands/evaluate.d.ts +11 -0
  13. package/dist/apps/cli/src/commands/evaluate.js +101 -0
  14. package/dist/apps/cli/src/commands/examples.d.ts +2 -0
  15. package/dist/apps/cli/src/commands/examples.js +36 -0
  16. package/dist/apps/cli/src/commands/export.d.ts +11 -0
  17. package/dist/apps/cli/src/commands/export.js +72 -0
  18. package/dist/apps/cli/src/commands/impact.d.ts +2 -0
  19. package/dist/apps/cli/src/commands/impact.js +30 -0
  20. package/dist/apps/cli/src/commands/init.d.ts +5 -0
  21. package/dist/apps/cli/src/commands/init.js +52 -0
  22. package/dist/apps/cli/src/commands/inspect.d.ts +5 -0
  23. package/dist/apps/cli/src/commands/inspect.js +24 -0
  24. package/dist/apps/cli/src/commands/mcp.d.ts +8 -0
  25. package/dist/apps/cli/src/commands/mcp.js +49 -0
  26. package/dist/apps/cli/src/commands/pitfalls.d.ts +2 -0
  27. package/dist/apps/cli/src/commands/pitfalls.js +35 -0
  28. package/dist/apps/cli/src/commands/recipes.d.ts +2 -0
  29. package/dist/apps/cli/src/commands/recipes.js +33 -0
  30. package/dist/apps/cli/src/commands/search.d.ts +11 -0
  31. package/dist/apps/cli/src/commands/search.js +36 -0
  32. package/dist/apps/cli/src/commands/update.d.ts +6 -0
  33. package/dist/apps/cli/src/commands/update.js +53 -0
  34. package/dist/apps/cli/src/commands/verify.d.ts +2 -0
  35. package/dist/apps/cli/src/commands/verify.js +44 -0
  36. package/dist/apps/cli/src/formatters/colors.d.ts +21 -0
  37. package/dist/apps/cli/src/formatters/colors.js +22 -0
  38. package/dist/apps/cli/src/formatters/inspection.d.ts +3 -0
  39. package/dist/apps/cli/src/formatters/inspection.js +88 -0
  40. package/dist/apps/cli/src/formatters/knowledge.d.ts +5 -0
  41. package/dist/apps/cli/src/formatters/knowledge.js +229 -0
  42. package/dist/apps/cli/src/formatters/retrieval.d.ts +3 -0
  43. package/dist/apps/cli/src/formatters/retrieval.js +61 -0
  44. package/{apps/cli/src/formatters/terminal.ts → dist/apps/cli/src/formatters/terminal.d.ts} +0 -1
  45. package/dist/apps/cli/src/formatters/terminal.js +5 -0
  46. package/dist/apps/cli/src/formatters/verification.d.ts +4 -0
  47. package/dist/apps/cli/src/formatters/verification.js +102 -0
  48. package/dist/apps/cli/src/index.d.ts +1 -0
  49. package/dist/apps/cli/src/index.js +376 -0
  50. package/dist/packages/core/src/dashboard/server.d.ts +33 -0
  51. package/dist/packages/core/src/dashboard/server.js +267 -0
  52. package/dist/packages/core/src/dashboard/ui.d.ts +5 -0
  53. package/{packages/core/src/dashboard/ui.ts → dist/packages/core/src/dashboard/ui.js} +2 -2
  54. package/dist/packages/core/src/implementation-service.d.ts +73 -0
  55. package/dist/packages/core/src/implementation-service.js +325 -0
  56. package/{packages/core/src/index.ts → dist/packages/core/src/index.d.ts} +0 -1
  57. package/dist/packages/core/src/index.js +6 -0
  58. package/dist/packages/core/src/inspector.d.ts +22 -0
  59. package/dist/packages/core/src/inspector.js +38 -0
  60. package/dist/packages/core/src/pipeline.d.ts +45 -0
  61. package/dist/packages/core/src/pipeline.js +246 -0
  62. package/dist/packages/crawler/src/config.d.ts +2 -0
  63. package/dist/packages/crawler/src/config.js +10 -0
  64. package/dist/packages/crawler/src/fetcher.d.ts +31 -0
  65. package/dist/packages/crawler/src/fetcher.js +139 -0
  66. package/dist/packages/crawler/src/index.js +2 -0
  67. package/dist/packages/discovery/src/index.d.ts +11 -0
  68. package/dist/packages/discovery/src/index.js +29 -0
  69. package/dist/packages/discovery/src/provider.d.ts +12 -0
  70. package/dist/packages/discovery/src/provider.js +30 -0
  71. package/dist/packages/discovery/src/providers/generic.d.ts +7 -0
  72. package/dist/packages/discovery/src/providers/generic.js +94 -0
  73. package/dist/packages/discovery/src/providers/github.d.ts +7 -0
  74. package/dist/packages/discovery/src/providers/github.js +52 -0
  75. package/dist/packages/discovery/src/providers/llms-txt.d.ts +7 -0
  76. package/dist/packages/discovery/src/providers/llms-txt.js +60 -0
  77. package/dist/packages/discovery/src/providers/markdown.d.ts +7 -0
  78. package/dist/packages/discovery/src/providers/markdown.js +38 -0
  79. package/dist/packages/discovery/src/providers/openapi.d.ts +7 -0
  80. package/dist/packages/discovery/src/providers/openapi.js +77 -0
  81. package/dist/packages/discovery/src/providers/sitemap.d.ts +7 -0
  82. package/dist/packages/discovery/src/providers/sitemap.js +53 -0
  83. package/dist/packages/discovery/src/providers/skill.d.ts +7 -0
  84. package/dist/packages/discovery/src/providers/skill.js +46 -0
  85. package/dist/packages/discovery/src/ranker.d.ts +6 -0
  86. package/dist/packages/discovery/src/ranker.js +107 -0
  87. package/dist/packages/evaluation/src/dataset.d.ts +2 -0
  88. package/dist/packages/evaluation/src/dataset.js +944 -0
  89. package/dist/packages/evaluation/src/index.js +8 -0
  90. package/dist/packages/evaluation/src/runner.d.ts +7 -0
  91. package/dist/packages/evaluation/src/runner.js +196 -0
  92. package/dist/packages/evaluation/src/strategies/context7-runner.d.ts +24 -0
  93. package/dist/packages/evaluation/src/strategies/context7-runner.js +229 -0
  94. package/dist/packages/evaluation/src/strategies/docorbit-runner.d.ts +5 -0
  95. package/dist/packages/evaluation/src/strategies/docorbit-runner.js +210 -0
  96. package/dist/packages/evaluation/src/strategies/firecrawl-runner.d.ts +24 -0
  97. package/dist/packages/evaluation/src/strategies/firecrawl-runner.js +151 -0
  98. package/dist/packages/evaluation/src/strategies/web-search-runner.d.ts +32 -0
  99. package/dist/packages/evaluation/src/strategies/web-search-runner.js +161 -0
  100. package/dist/packages/evaluation/src/types.d.ts +15 -0
  101. package/dist/packages/evaluation/src/types.js +1 -0
  102. package/dist/packages/evaluation/src/version-matcher.d.ts +11 -0
  103. package/dist/packages/evaluation/src/version-matcher.js +61 -0
  104. package/dist/packages/export/src/agents-md.d.ts +19 -0
  105. package/dist/packages/export/src/agents-md.js +170 -0
  106. package/dist/packages/export/src/claude-md.d.ts +17 -0
  107. package/dist/packages/export/src/claude-md.js +118 -0
  108. package/dist/packages/export/src/docs-map.d.ts +14 -0
  109. package/dist/packages/export/src/docs-map.js +118 -0
  110. package/dist/packages/export/src/index.js +6 -0
  111. package/dist/packages/export/src/llms-txt.d.ts +15 -0
  112. package/dist/packages/export/src/llms-txt.js +73 -0
  113. package/dist/packages/export/src/service.d.ts +23 -0
  114. package/dist/packages/export/src/service.js +210 -0
  115. package/dist/packages/export/src/skill-md.d.ts +14 -0
  116. package/dist/packages/export/src/skill-md.js +107 -0
  117. package/{packages/mcp/src/index.ts → dist/packages/mcp/src/index.d.ts} +2 -35
  118. package/dist/packages/mcp/src/index.js +6 -0
  119. package/dist/packages/mcp/src/resources/index.d.ts +12 -0
  120. package/dist/packages/mcp/src/resources/index.js +165 -0
  121. package/dist/packages/mcp/src/server.d.ts +30 -0
  122. package/dist/packages/mcp/src/server.js +243 -0
  123. package/dist/packages/mcp/src/tools/analyze-impact.d.ts +6 -0
  124. package/dist/packages/mcp/src/tools/analyze-impact.js +64 -0
  125. package/dist/packages/mcp/src/tools/check-api.d.ts +6 -0
  126. package/dist/packages/mcp/src/tools/check-api.js +74 -0
  127. package/dist/packages/mcp/src/tools/diff-docs.d.ts +6 -0
  128. package/dist/packages/mcp/src/tools/diff-docs.js +58 -0
  129. package/dist/packages/mcp/src/tools/export-context.d.ts +6 -0
  130. package/dist/packages/mcp/src/tools/export-context.js +61 -0
  131. package/dist/packages/mcp/src/tools/find-api.d.ts +6 -0
  132. package/dist/packages/mcp/src/tools/find-api.js +91 -0
  133. package/dist/packages/mcp/src/tools/find-example.d.ts +6 -0
  134. package/dist/packages/mcp/src/tools/find-example.js +92 -0
  135. package/dist/packages/mcp/src/tools/find-pitfall.d.ts +6 -0
  136. package/dist/packages/mcp/src/tools/find-pitfall.js +85 -0
  137. package/dist/packages/mcp/src/tools/find-recipe.d.ts +6 -0
  138. package/dist/packages/mcp/src/tools/find-recipe.js +89 -0
  139. package/dist/packages/mcp/src/tools/get-doc.d.ts +6 -0
  140. package/dist/packages/mcp/src/tools/get-doc.js +118 -0
  141. package/dist/packages/mcp/src/tools/get-docs-map.d.ts +6 -0
  142. package/dist/packages/mcp/src/tools/get-docs-map.js +54 -0
  143. package/dist/packages/mcp/src/tools/get-version.d.ts +6 -0
  144. package/dist/packages/mcp/src/tools/get-version.js +104 -0
  145. package/dist/packages/mcp/src/tools/implementation-context.d.ts +6 -0
  146. package/dist/packages/mcp/src/tools/implementation-context.js +82 -0
  147. package/dist/packages/mcp/src/tools/index.d.ts +18 -0
  148. package/dist/packages/mcp/src/tools/index.js +39 -0
  149. package/dist/packages/mcp/src/tools/list-sources.d.ts +6 -0
  150. package/dist/packages/mcp/src/tools/list-sources.js +76 -0
  151. package/dist/packages/mcp/src/tools/search-docs.d.ts +6 -0
  152. package/dist/packages/mcp/src/tools/search-docs.js +113 -0
  153. package/dist/packages/mcp/src/tools/types.d.ts +22 -0
  154. package/dist/packages/mcp/src/tools/types.js +1 -0
  155. package/dist/packages/mcp/src/transports/http.d.ts +31 -0
  156. package/dist/packages/mcp/src/transports/http.js +215 -0
  157. package/dist/packages/mcp/src/transports/stdio.d.ts +22 -0
  158. package/dist/packages/mcp/src/transports/stdio.js +86 -0
  159. package/{packages/mcp/src/transports/types.ts → dist/packages/mcp/src/transports/types.d.ts} +2 -3
  160. package/dist/packages/mcp/src/transports/types.js +1 -0
  161. package/dist/packages/mcp/src/types.d.ts +89 -0
  162. package/dist/packages/mcp/src/types.js +7 -0
  163. package/dist/packages/normalizer/src/example-indexer.d.ts +5 -0
  164. package/dist/packages/normalizer/src/example-indexer.js +200 -0
  165. package/dist/packages/normalizer/src/html.d.ts +13 -0
  166. package/dist/packages/normalizer/src/html.js +221 -0
  167. package/{packages/normalizer/src/index.ts → dist/packages/normalizer/src/index.d.ts} +0 -1
  168. package/dist/packages/normalizer/src/index.js +7 -0
  169. package/dist/packages/normalizer/src/llms.d.ts +3 -0
  170. package/dist/packages/normalizer/src/llms.js +71 -0
  171. package/dist/packages/normalizer/src/openapi/endpoint-parser.d.ts +11 -0
  172. package/dist/packages/normalizer/src/openapi/endpoint-parser.js +357 -0
  173. package/dist/packages/normalizer/src/openapi/schema-resolver.d.ts +10 -0
  174. package/dist/packages/normalizer/src/openapi/schema-resolver.js +82 -0
  175. package/dist/packages/normalizer/src/openapi.js +2 -0
  176. package/dist/packages/normalizer/src/page.d.ts +13 -0
  177. package/dist/packages/normalizer/src/page.js +150 -0
  178. package/dist/packages/normalizer/src/pitfall-extractor.d.ts +6 -0
  179. package/dist/packages/normalizer/src/pitfall-extractor.js +153 -0
  180. package/dist/packages/normalizer/src/slicer.d.ts +30 -0
  181. package/dist/packages/normalizer/src/slicer.js +360 -0
  182. package/dist/packages/retrieval/src/engine.d.ts +17 -0
  183. package/dist/packages/retrieval/src/engine.js +93 -0
  184. package/{packages/retrieval/src/index.ts → dist/packages/retrieval/src/index.d.ts} +0 -1
  185. package/dist/packages/retrieval/src/index.js +6 -0
  186. package/dist/packages/retrieval/src/intent.d.ts +6 -0
  187. package/dist/packages/retrieval/src/intent.js +39 -0
  188. package/dist/packages/retrieval/src/packer.d.ts +2 -0
  189. package/dist/packages/retrieval/src/packer.js +108 -0
  190. package/dist/packages/retrieval/src/recipe-engine.d.ts +18 -0
  191. package/dist/packages/retrieval/src/recipe-engine.js +265 -0
  192. package/dist/packages/retrieval/src/scorer.d.ts +13 -0
  193. package/dist/packages/retrieval/src/scorer.js +110 -0
  194. package/dist/packages/retrieval/src/weights.d.ts +3 -0
  195. package/dist/packages/retrieval/src/weights.js +28 -0
  196. package/dist/packages/security/src/annotations.d.ts +10 -0
  197. package/dist/packages/security/src/annotations.js +100 -0
  198. package/dist/packages/security/src/index.js +2 -0
  199. package/dist/packages/security/src/ssrf.d.ts +17 -0
  200. package/dist/packages/security/src/ssrf.js +132 -0
  201. package/dist/packages/shared/src/errors.d.ts +22 -0
  202. package/dist/packages/shared/src/errors.js +44 -0
  203. package/dist/packages/shared/src/hashing.d.ts +3 -0
  204. package/dist/packages/shared/src/hashing.js +21 -0
  205. package/dist/packages/shared/src/index.js +3 -0
  206. package/dist/packages/shared/src/types.d.ts +715 -0
  207. package/dist/packages/shared/src/types.js +1 -0
  208. package/dist/packages/storage/src/db.d.ts +10 -0
  209. package/dist/packages/storage/src/db.js +61 -0
  210. package/dist/packages/storage/src/index.js +10 -0
  211. package/dist/packages/storage/src/interfaces.d.ts +83 -0
  212. package/dist/packages/storage/src/interfaces.js +1 -0
  213. package/dist/packages/storage/src/repositories/api-repository.d.ts +16 -0
  214. package/dist/packages/storage/src/repositories/api-repository.js +169 -0
  215. package/dist/packages/storage/src/repositories/chunk-repository.d.ts +32 -0
  216. package/dist/packages/storage/src/repositories/chunk-repository.js +250 -0
  217. package/dist/packages/storage/src/repositories/example-repository.d.ts +16 -0
  218. package/dist/packages/storage/src/repositories/example-repository.js +158 -0
  219. package/dist/packages/storage/src/repositories/page-repository.d.ts +16 -0
  220. package/dist/packages/storage/src/repositories/page-repository.js +161 -0
  221. package/dist/packages/storage/src/repositories/pitfall-repository.d.ts +15 -0
  222. package/dist/packages/storage/src/repositories/pitfall-repository.js +144 -0
  223. package/dist/packages/storage/src/repositories/source-repository.d.ts +33 -0
  224. package/dist/packages/storage/src/repositories/source-repository.js +153 -0
  225. package/dist/packages/storage/src/repository.d.ts +92 -0
  226. package/dist/packages/storage/src/repository.js +157 -0
  227. package/dist/packages/storage/src/schema.d.ts +2 -0
  228. package/{packages/storage/src/schema.ts → dist/packages/storage/src/schema.js} +0 -3
  229. package/dist/packages/storage/src/search-tokens.d.ts +6 -0
  230. package/dist/packages/storage/src/search-tokens.js +26 -0
  231. package/dist/packages/verification/src/diff-engine.d.ts +18 -0
  232. package/dist/packages/verification/src/diff-engine.js +218 -0
  233. package/dist/packages/verification/src/extractor.d.ts +29 -0
  234. package/dist/packages/verification/src/extractor.js +302 -0
  235. package/dist/packages/verification/src/impact-scanner.d.ts +9 -0
  236. package/dist/packages/verification/src/impact-scanner.js +181 -0
  237. package/dist/packages/verification/src/index.js +5 -0
  238. package/dist/packages/verification/src/services.d.ts +55 -0
  239. package/dist/packages/verification/src/services.js +189 -0
  240. package/dist/packages/verification/src/verifier.d.ts +15 -0
  241. package/dist/packages/verification/src/verifier.js +315 -0
  242. package/dist/packages/workspace/src/detector.d.ts +7 -0
  243. package/dist/packages/workspace/src/detector.js +117 -0
  244. package/dist/packages/workspace/src/ecosystems/cargo.d.ts +10 -0
  245. package/dist/packages/workspace/src/ecosystems/cargo.js +69 -0
  246. package/dist/packages/workspace/src/ecosystems/composer.d.ts +7 -0
  247. package/dist/packages/workspace/src/ecosystems/composer.js +40 -0
  248. package/dist/packages/workspace/src/ecosystems/go.d.ts +7 -0
  249. package/dist/packages/workspace/src/ecosystems/go.js +49 -0
  250. package/{packages/workspace/src/ecosystems/index.ts → dist/packages/workspace/src/ecosystems/index.d.ts} +2 -24
  251. package/dist/packages/workspace/src/ecosystems/index.js +21 -0
  252. package/dist/packages/workspace/src/ecosystems/maven.d.ts +7 -0
  253. package/dist/packages/workspace/src/ecosystems/maven.js +28 -0
  254. package/dist/packages/workspace/src/ecosystems/npm.d.ts +10 -0
  255. package/dist/packages/workspace/src/ecosystems/npm.js +73 -0
  256. package/dist/packages/workspace/src/ecosystems/pub.d.ts +7 -0
  257. package/dist/packages/workspace/src/ecosystems/pub.js +34 -0
  258. package/dist/packages/workspace/src/ecosystems/pypi.d.ts +9 -0
  259. package/dist/packages/workspace/src/ecosystems/pypi.js +94 -0
  260. package/dist/packages/workspace/src/ecosystems/rubygems.d.ts +7 -0
  261. package/dist/packages/workspace/src/ecosystems/rubygems.js +25 -0
  262. package/dist/packages/workspace/src/ecosystems/types.d.ts +9 -0
  263. package/dist/packages/workspace/src/ecosystems/types.js +1 -0
  264. package/dist/packages/workspace/src/index.js +5 -0
  265. package/dist/packages/workspace/src/lockfile.d.ts +21 -0
  266. package/dist/packages/workspace/src/lockfile.js +153 -0
  267. package/dist/packages/workspace/src/resolver.d.ts +39 -0
  268. package/dist/packages/workspace/src/resolver.js +164 -0
  269. package/dist/packages/workspace/src/semver.d.ts +33 -0
  270. package/dist/packages/workspace/src/semver.js +235 -0
  271. package/package.json +8 -7
  272. package/apps/cli/bin/docorbit.js +0 -8
  273. package/apps/cli/src/commands/add.ts +0 -44
  274. package/apps/cli/src/commands/api.ts +0 -38
  275. package/apps/cli/src/commands/context.ts +0 -47
  276. package/apps/cli/src/commands/dashboard.ts +0 -55
  277. package/apps/cli/src/commands/diff.ts +0 -30
  278. package/apps/cli/src/commands/evaluate.ts +0 -133
  279. package/apps/cli/src/commands/examples.ts +0 -39
  280. package/apps/cli/src/commands/export.ts +0 -89
  281. package/apps/cli/src/commands/impact.ts +0 -31
  282. package/apps/cli/src/commands/init.ts +0 -69
  283. package/apps/cli/src/commands/inspect.ts +0 -30
  284. package/apps/cli/src/commands/mcp.ts +0 -72
  285. package/apps/cli/src/commands/pitfalls.ts +0 -38
  286. package/apps/cli/src/commands/recipes.ts +0 -35
  287. package/apps/cli/src/commands/search.ts +0 -48
  288. package/apps/cli/src/commands/update.ts +0 -73
  289. package/apps/cli/src/commands/verify.ts +0 -48
  290. package/apps/cli/src/formatters/colors.ts +0 -23
  291. package/apps/cli/src/formatters/inspection.ts +0 -102
  292. package/apps/cli/src/formatters/knowledge.ts +0 -272
  293. package/apps/cli/src/formatters/retrieval.ts +0 -74
  294. package/apps/cli/src/formatters/verification.ts +0 -126
  295. package/apps/cli/src/index.ts +0 -409
  296. package/packages/core/src/dashboard/server.ts +0 -314
  297. package/packages/core/src/implementation-service.ts +0 -451
  298. package/packages/core/src/inspector.ts +0 -71
  299. package/packages/core/src/pipeline.ts +0 -331
  300. package/packages/crawler/src/config.ts +0 -12
  301. package/packages/crawler/src/fetcher.ts +0 -185
  302. package/packages/discovery/src/index.ts +0 -31
  303. package/packages/discovery/src/provider.ts +0 -47
  304. package/packages/discovery/src/providers/generic.ts +0 -98
  305. package/packages/discovery/src/providers/github.ts +0 -61
  306. package/packages/discovery/src/providers/llms-txt.ts +0 -73
  307. package/packages/discovery/src/providers/markdown.ts +0 -48
  308. package/packages/discovery/src/providers/openapi.ts +0 -91
  309. package/packages/discovery/src/providers/sitemap.ts +0 -62
  310. package/packages/discovery/src/providers/skill.ts +0 -54
  311. package/packages/discovery/src/ranker.ts +0 -123
  312. package/packages/evaluation/src/dataset.ts +0 -963
  313. package/packages/evaluation/src/runner.ts +0 -241
  314. package/packages/evaluation/src/strategies/context7-runner.ts +0 -269
  315. package/packages/evaluation/src/strategies/docorbit-runner.ts +0 -228
  316. package/packages/evaluation/src/strategies/firecrawl-runner.ts +0 -172
  317. package/packages/evaluation/src/strategies/web-search-runner.ts +0 -194
  318. package/packages/evaluation/src/types.ts +0 -34
  319. package/packages/evaluation/src/version-matcher.ts +0 -73
  320. package/packages/export/src/agents-md.ts +0 -200
  321. package/packages/export/src/claude-md.ts +0 -141
  322. package/packages/export/src/docs-map.ts +0 -150
  323. package/packages/export/src/llms-txt.ts +0 -96
  324. package/packages/export/src/service.ts +0 -250
  325. package/packages/export/src/skill-md.ts +0 -128
  326. package/packages/mcp/src/resources/index.ts +0 -189
  327. package/packages/mcp/src/server.ts +0 -278
  328. package/packages/mcp/src/tools/analyze-impact.ts +0 -74
  329. package/packages/mcp/src/tools/check-api.ts +0 -86
  330. package/packages/mcp/src/tools/diff-docs.ts +0 -68
  331. package/packages/mcp/src/tools/export-context.ts +0 -73
  332. package/packages/mcp/src/tools/find-api.ts +0 -99
  333. package/packages/mcp/src/tools/find-example.ts +0 -100
  334. package/packages/mcp/src/tools/find-pitfall.ts +0 -94
  335. package/packages/mcp/src/tools/find-recipe.ts +0 -98
  336. package/packages/mcp/src/tools/get-doc.ts +0 -130
  337. package/packages/mcp/src/tools/get-docs-map.ts +0 -64
  338. package/packages/mcp/src/tools/get-version.ts +0 -118
  339. package/packages/mcp/src/tools/implementation-context.ts +0 -88
  340. package/packages/mcp/src/tools/index.ts +0 -59
  341. package/packages/mcp/src/tools/list-sources.ts +0 -85
  342. package/packages/mcp/src/tools/search-docs.ts +0 -123
  343. package/packages/mcp/src/tools/types.ts +0 -28
  344. package/packages/mcp/src/transports/http.ts +0 -256
  345. package/packages/mcp/src/transports/stdio.ts +0 -105
  346. package/packages/mcp/src/types.ts +0 -102
  347. package/packages/normalizer/src/example-indexer.ts +0 -240
  348. package/packages/normalizer/src/html.ts +0 -253
  349. package/packages/normalizer/src/llms.ts +0 -83
  350. package/packages/normalizer/src/openapi/endpoint-parser.ts +0 -406
  351. package/packages/normalizer/src/openapi/schema-resolver.ts +0 -111
  352. package/packages/normalizer/src/page.ts +0 -184
  353. package/packages/normalizer/src/pitfall-extractor.ts +0 -190
  354. package/packages/normalizer/src/slicer.ts +0 -455
  355. package/packages/retrieval/src/engine.ts +0 -120
  356. package/packages/retrieval/src/intent.ts +0 -43
  357. package/packages/retrieval/src/packer.ts +0 -145
  358. package/packages/retrieval/src/recipe-engine.ts +0 -313
  359. package/packages/retrieval/src/scorer.ts +0 -139
  360. package/packages/retrieval/src/weights.ts +0 -31
  361. package/packages/security/src/annotations.ts +0 -112
  362. package/packages/security/src/ssrf.ts +0 -153
  363. package/packages/shared/src/errors.ts +0 -53
  364. package/packages/shared/src/hashing.ts +0 -23
  365. package/packages/shared/src/types.ts +0 -881
  366. package/packages/storage/src/db.ts +0 -72
  367. package/packages/storage/src/interfaces.ts +0 -115
  368. package/packages/storage/src/repositories/api-repository.ts +0 -219
  369. package/packages/storage/src/repositories/chunk-repository.ts +0 -316
  370. package/packages/storage/src/repositories/example-repository.ts +0 -206
  371. package/packages/storage/src/repositories/page-repository.ts +0 -205
  372. package/packages/storage/src/repositories/pitfall-repository.ts +0 -188
  373. package/packages/storage/src/repositories/source-repository.ts +0 -205
  374. package/packages/storage/src/repository.ts +0 -256
  375. package/packages/storage/src/search-tokens.ts +0 -28
  376. package/packages/verification/src/diff-engine.ts +0 -258
  377. package/packages/verification/src/extractor.ts +0 -339
  378. package/packages/verification/src/impact-scanner.ts +0 -203
  379. package/packages/verification/src/services.ts +0 -238
  380. package/packages/verification/src/verifier.ts +0 -375
  381. package/packages/workspace/src/detector.ts +0 -143
  382. package/packages/workspace/src/ecosystems/cargo.ts +0 -84
  383. package/packages/workspace/src/ecosystems/composer.ts +0 -42
  384. package/packages/workspace/src/ecosystems/go.ts +0 -54
  385. package/packages/workspace/src/ecosystems/maven.ts +0 -34
  386. package/packages/workspace/src/ecosystems/npm.ts +0 -83
  387. package/packages/workspace/src/ecosystems/pub.ts +0 -40
  388. package/packages/workspace/src/ecosystems/pypi.ts +0 -100
  389. package/packages/workspace/src/ecosystems/rubygems.ts +0 -30
  390. package/packages/workspace/src/ecosystems/types.ts +0 -18
  391. package/packages/workspace/src/lockfile.ts +0 -194
  392. package/packages/workspace/src/resolver.ts +0 -234
  393. package/packages/workspace/src/semver.ts +0 -259
  394. /package/{packages/crawler/src/index.ts → dist/packages/crawler/src/index.d.ts} +0 -0
  395. /package/{packages/evaluation/src/index.ts → dist/packages/evaluation/src/index.d.ts} +0 -0
  396. /package/{packages/export/src/index.ts → dist/packages/export/src/index.d.ts} +0 -0
  397. /package/{packages/normalizer/src/openapi.ts → dist/packages/normalizer/src/openapi.d.ts} +0 -0
  398. /package/{packages/security/src/index.ts → dist/packages/security/src/index.d.ts} +0 -0
  399. /package/{packages/shared/src/index.ts → dist/packages/shared/src/index.d.ts} +0 -0
  400. /package/{packages/storage/src/index.ts → dist/packages/storage/src/index.d.ts} +0 -0
  401. /package/{packages/verification/src/index.ts → dist/packages/verification/src/index.d.ts} +0 -0
  402. /package/{packages/workspace/src/index.ts → dist/packages/workspace/src/index.d.ts} +0 -0
@@ -0,0 +1,39 @@
1
+ const INTENT_PATTERNS = [
2
+ {
3
+ intent: 'troubleshooting',
4
+ regex: /\b(error|failed|failure|exception|crash|fix|debug|issue|cannot|unable|why does|broken|invalid|429|401|403|404|500)\b/i,
5
+ },
6
+ {
7
+ intent: 'examples',
8
+ regex: /\b(example|examples|sample|samples|snippet|snippets|tutorial|how to|quickstart)\b/i,
9
+ },
10
+ {
11
+ intent: 'configuration',
12
+ regex: /\b(config|configuration|settings|setup|env|\.env|environment|options|flags?|port|credentials|apikey|api_key)\b/i,
13
+ },
14
+ {
15
+ intent: 'api',
16
+ regex: /\b(api|endpoint|endpoints|parameters?|request|response|headers?|payload|schema|rest|graphql|status code)\b/i,
17
+ },
18
+ {
19
+ intent: 'implementation',
20
+ regex: /\b(implement|implementation|build|create|integrate|integration|workflow|handler|webhook|callback|oauth|pipeline)\b/i,
21
+ },
22
+ {
23
+ intent: 'conceptual',
24
+ regex: /\b(architecture|overview|what is|concept|concepts|design|lifecycle|philosophy|background|understand)\b/i,
25
+ },
26
+ ];
27
+ /**
28
+ * Deterministically detects query intent from task or query text.
29
+ * Falls back to 'conceptual' when no specific pattern matches.
30
+ */
31
+ export function detectQueryIntent(query) {
32
+ const normalized = query.toLowerCase();
33
+ for (const { intent, regex } of INTENT_PATTERNS) {
34
+ if (regex.test(normalized)) {
35
+ return intent;
36
+ }
37
+ }
38
+ return 'conceptual';
39
+ }
@@ -0,0 +1,2 @@
1
+ import type { SearchResult, ContextPackage, ContextOptions, QueryIntent } from '../../shared/src/index.ts';
2
+ export declare function packContext(task: string, candidates: SearchResult[], detectedIntent: QueryIntent, options?: ContextOptions): ContextPackage;
@@ -0,0 +1,108 @@
1
+ export function packContext(task, candidates, detectedIntent, options = {}) {
2
+ const tokenBudget = options.tokenBudget || 3000;
3
+ const maxChunks = options.maxChunks || 15;
4
+ const redundancyPenalty = options.redundancyPenalty ?? 0.35;
5
+ const selectedChunks = [];
6
+ const selectedChunkIds = new Set();
7
+ const selectedSectionCounts = new Map();
8
+ const selectedPages = new Set();
9
+ const sourcesSet = new Set();
10
+ const warnings = [];
11
+ let totalEstimatedTokens = 0;
12
+ const remainingCandidates = [...candidates];
13
+ while (remainingCandidates.length > 0 && selectedChunks.length < maxChunks) {
14
+ let bestIdx = -1;
15
+ let bestUtility = -Infinity;
16
+ for (let i = 0; i < remainingCandidates.length; i++) {
17
+ const candidate = remainingCandidates[i];
18
+ const chunk = candidate.chunk;
19
+ // Check if it strictly fits within the remaining token budget
20
+ if (totalEstimatedTokens + chunk.tokenEstimate > tokenBudget) {
21
+ continue;
22
+ }
23
+ const sectionKey = `${chunk.pageId}:${chunk.sectionPath.join(' > ')}`;
24
+ const sectionOverlap = selectedSectionCounts.get(sectionKey) || 0;
25
+ // Penalize multiple chunks from the exact same section to encourage diversity/coverage
26
+ const redundancyFactor = Math.pow(1 - redundancyPenalty, sectionOverlap);
27
+ // Reward discovering new pages / sections (coverage bonus)
28
+ const coverageMultiplier = selectedPages.has(chunk.pageId) ? 1.0 : 1.25;
29
+ const utility = candidate.score * redundancyFactor * coverageMultiplier;
30
+ if (utility > bestUtility) {
31
+ bestUtility = utility;
32
+ bestIdx = i;
33
+ }
34
+ }
35
+ if (bestIdx === -1) {
36
+ // No remaining candidate fits within the remaining token budget
37
+ break;
38
+ }
39
+ const chosen = remainingCandidates.splice(bestIdx, 1)[0];
40
+ const chunk = chosen.chunk;
41
+ selectedChunks.push(chunk);
42
+ selectedChunkIds.add(chunk.id);
43
+ const sectionKey = `${chunk.pageId}:${chunk.sectionPath.join(' > ')}`;
44
+ selectedSectionCounts.set(sectionKey, (selectedSectionCounts.get(sectionKey) || 0) + 1);
45
+ selectedPages.add(chunk.pageId);
46
+ if (chunk.provenance?.targetUrl) {
47
+ sourcesSet.add(chunk.provenance.targetUrl);
48
+ }
49
+ else if (chunk.provenance?.sourceUrl) {
50
+ sourcesSet.add(chunk.provenance.sourceUrl);
51
+ }
52
+ totalEstimatedTokens += chunk.tokenEstimate;
53
+ // If chunk is a warning, register it in top-level warnings
54
+ if (chunk.chunkType === 'warning') {
55
+ warnings.push(`[${chunk.sectionPath.join(' > ')}]: ${chunk.content.slice(0, 150)}...`);
56
+ }
57
+ }
58
+ // Group chunks by page in order of page first appearance in selectedChunks (most relevant page first)
59
+ const pageOrder = new Map();
60
+ for (let i = 0; i < selectedChunks.length; i++) {
61
+ const pId = selectedChunks[i].pageId;
62
+ if (!pageOrder.has(pId)) {
63
+ pageOrder.set(pId, pageOrder.size);
64
+ }
65
+ }
66
+ const sortedChunks = [...selectedChunks].sort((a, b) => {
67
+ const pOrderA = pageOrder.get(a.pageId) ?? 0;
68
+ const pOrderB = pageOrder.get(b.pageId) ?? 0;
69
+ if (pOrderA !== pOrderB)
70
+ return pOrderA - pOrderB;
71
+ return a.ordinal - b.ordinal;
72
+ });
73
+ // Build agent-facing Markdown package
74
+ const lines = [];
75
+ lines.push(`# Context Package: ${task}`);
76
+ lines.push(`- **Detected Intent**: \`${detectedIntent}\``);
77
+ lines.push(`- **Estimated Tokens**: ~${totalEstimatedTokens} / ${tokenBudget} tokens (heuristic estimate)`);
78
+ lines.push(`- **Sources Included**: ${sourcesSet.size > 0 ? Array.from(sourcesSet).map(s => `[${s}](${s})`).join(', ') : 'Local documentation'}`);
79
+ if (warnings.length > 0) {
80
+ lines.push('\n> [!WARNING]');
81
+ lines.push('> **Relevant Advisories & Caveats**:');
82
+ for (const w of warnings) {
83
+ lines.push(`> - ${w}`);
84
+ }
85
+ }
86
+ lines.push('\n---\n');
87
+ for (const chunk of sortedChunks) {
88
+ const breadcrumb = chunk.sectionPath.length > 0 ? chunk.sectionPath.join(' > ') : (chunk.title || 'General');
89
+ lines.push(`### ${breadcrumb}`);
90
+ lines.push(`*Type: \`${chunk.chunkType}\` | Est. Tokens: ~${chunk.tokenEstimate}*`);
91
+ lines.push('\n' + chunk.content.trim() + '\n');
92
+ if (chunk.provenance?.sourceUrl) {
93
+ lines.push(`*Source: ${chunk.provenance.sourceUrl}*\n`);
94
+ }
95
+ lines.push('---\n');
96
+ }
97
+ const markdown = lines.join('\n');
98
+ return {
99
+ task,
100
+ detectedIntent,
101
+ totalEstimatedTokens,
102
+ tokenBudget,
103
+ chunks: sortedChunks,
104
+ markdown,
105
+ sources: Array.from(sourcesSet),
106
+ warnings,
107
+ };
108
+ }
@@ -0,0 +1,18 @@
1
+ import type { Recipe } from '../../shared/src/index.ts';
2
+ import { DocOrbitRepository } from '../../storage/src/index.ts';
3
+ import { RetrievalEngine } from './engine.ts';
4
+ export interface RecipeOptions {
5
+ docVersion?: string;
6
+ projectDir?: string;
7
+ }
8
+ export declare class RecipeEngine {
9
+ private repository;
10
+ private retrievalEngine;
11
+ constructor(repository: DocOrbitRepository, retrievalEngine?: RetrievalEngine);
12
+ /**
13
+ * Deterministically compiles an implementation recipe grounded strictly in indexed evidence.
14
+ * Distinguishes documented facts, inferred relationships, and missing information.
15
+ * Never invents APIs, steps, prerequisites, or validation steps.
16
+ */
17
+ assembleRecipe(goal: string, options?: RecipeOptions): Promise<Recipe>;
18
+ }
@@ -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[];