purecontext-mcp 1.0.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 (542) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +207 -0
  3. package/dist/adapters/actix-web.d.ts +28 -0
  4. package/dist/adapters/actix-web.d.ts.map +1 -0
  5. package/dist/adapters/actix-web.js +362 -0
  6. package/dist/adapters/actix-web.js.map +1 -0
  7. package/dist/adapters/adapter-registry.d.ts +34 -0
  8. package/dist/adapters/adapter-registry.d.ts.map +1 -0
  9. package/dist/adapters/adapter-registry.js +92 -0
  10. package/dist/adapters/adapter-registry.js.map +1 -0
  11. package/dist/adapters/angular.d.ts +13 -0
  12. package/dist/adapters/angular.d.ts.map +1 -0
  13. package/dist/adapters/angular.js +348 -0
  14. package/dist/adapters/angular.js.map +1 -0
  15. package/dist/adapters/axum.d.ts +16 -0
  16. package/dist/adapters/axum.d.ts.map +1 -0
  17. package/dist/adapters/axum.js +299 -0
  18. package/dist/adapters/axum.js.map +1 -0
  19. package/dist/adapters/django-orm.d.ts +28 -0
  20. package/dist/adapters/django-orm.d.ts.map +1 -0
  21. package/dist/adapters/django-orm.js +464 -0
  22. package/dist/adapters/django-orm.js.map +1 -0
  23. package/dist/adapters/django.d.ts +16 -0
  24. package/dist/adapters/django.d.ts.map +1 -0
  25. package/dist/adapters/django.js +257 -0
  26. package/dist/adapters/django.js.map +1 -0
  27. package/dist/adapters/echo.d.ts +15 -0
  28. package/dist/adapters/echo.d.ts.map +1 -0
  29. package/dist/adapters/echo.js +142 -0
  30. package/dist/adapters/echo.js.map +1 -0
  31. package/dist/adapters/express.d.ts +15 -0
  32. package/dist/adapters/express.d.ts.map +1 -0
  33. package/dist/adapters/express.js +126 -0
  34. package/dist/adapters/express.js.map +1 -0
  35. package/dist/adapters/fastapi.d.ts +16 -0
  36. package/dist/adapters/fastapi.d.ts.map +1 -0
  37. package/dist/adapters/fastapi.js +113 -0
  38. package/dist/adapters/fastapi.js.map +1 -0
  39. package/dist/adapters/fastify.d.ts +14 -0
  40. package/dist/adapters/fastify.d.ts.map +1 -0
  41. package/dist/adapters/fastify.js +124 -0
  42. package/dist/adapters/fastify.js.map +1 -0
  43. package/dist/adapters/fiber.d.ts +15 -0
  44. package/dist/adapters/fiber.d.ts.map +1 -0
  45. package/dist/adapters/fiber.js +147 -0
  46. package/dist/adapters/fiber.js.map +1 -0
  47. package/dist/adapters/flask.d.ts +18 -0
  48. package/dist/adapters/flask.d.ts.map +1 -0
  49. package/dist/adapters/flask.js +175 -0
  50. package/dist/adapters/flask.js.map +1 -0
  51. package/dist/adapters/flutter.d.ts +19 -0
  52. package/dist/adapters/flutter.d.ts.map +1 -0
  53. package/dist/adapters/flutter.js +251 -0
  54. package/dist/adapters/flutter.js.map +1 -0
  55. package/dist/adapters/gin.d.ts +16 -0
  56. package/dist/adapters/gin.d.ts.map +1 -0
  57. package/dist/adapters/gin.js +159 -0
  58. package/dist/adapters/gin.js.map +1 -0
  59. package/dist/adapters/hibernate.d.ts +24 -0
  60. package/dist/adapters/hibernate.d.ts.map +1 -0
  61. package/dist/adapters/hibernate.js +448 -0
  62. package/dist/adapters/hibernate.js.map +1 -0
  63. package/dist/adapters/ktor.d.ts +18 -0
  64. package/dist/adapters/ktor.d.ts.map +1 -0
  65. package/dist/adapters/ktor.js +219 -0
  66. package/dist/adapters/ktor.js.map +1 -0
  67. package/dist/adapters/laravel.d.ts +19 -0
  68. package/dist/adapters/laravel.d.ts.map +1 -0
  69. package/dist/adapters/laravel.js +370 -0
  70. package/dist/adapters/laravel.js.map +1 -0
  71. package/dist/adapters/micronaut.d.ts +21 -0
  72. package/dist/adapters/micronaut.d.ts.map +1 -0
  73. package/dist/adapters/micronaut.js +435 -0
  74. package/dist/adapters/micronaut.js.map +1 -0
  75. package/dist/adapters/nestjs.d.ts +12 -0
  76. package/dist/adapters/nestjs.d.ts.map +1 -0
  77. package/dist/adapters/nestjs.js +401 -0
  78. package/dist/adapters/nestjs.js.map +1 -0
  79. package/dist/adapters/nextjs.d.ts +49 -0
  80. package/dist/adapters/nextjs.d.ts.map +1 -0
  81. package/dist/adapters/nextjs.js +412 -0
  82. package/dist/adapters/nextjs.js.map +1 -0
  83. package/dist/adapters/nuxt.d.ts +44 -0
  84. package/dist/adapters/nuxt.d.ts.map +1 -0
  85. package/dist/adapters/nuxt.js +243 -0
  86. package/dist/adapters/nuxt.js.map +1 -0
  87. package/dist/adapters/quarkus.d.ts +21 -0
  88. package/dist/adapters/quarkus.d.ts.map +1 -0
  89. package/dist/adapters/quarkus.js +395 -0
  90. package/dist/adapters/quarkus.js.map +1 -0
  91. package/dist/adapters/rails.d.ts +18 -0
  92. package/dist/adapters/rails.d.ts.map +1 -0
  93. package/dist/adapters/rails.js +363 -0
  94. package/dist/adapters/rails.js.map +1 -0
  95. package/dist/adapters/react.d.ts +18 -0
  96. package/dist/adapters/react.d.ts.map +1 -0
  97. package/dist/adapters/react.js +95 -0
  98. package/dist/adapters/react.js.map +1 -0
  99. package/dist/adapters/rocket.d.ts +19 -0
  100. package/dist/adapters/rocket.d.ts.map +1 -0
  101. package/dist/adapters/rocket.js +271 -0
  102. package/dist/adapters/rocket.js.map +1 -0
  103. package/dist/adapters/sinatra.d.ts +16 -0
  104. package/dist/adapters/sinatra.d.ts.map +1 -0
  105. package/dist/adapters/sinatra.js +114 -0
  106. package/dist/adapters/sinatra.js.map +1 -0
  107. package/dist/adapters/spring-boot.d.ts +24 -0
  108. package/dist/adapters/spring-boot.d.ts.map +1 -0
  109. package/dist/adapters/spring-boot.js +399 -0
  110. package/dist/adapters/spring-boot.js.map +1 -0
  111. package/dist/adapters/spring-kotlin.d.ts +19 -0
  112. package/dist/adapters/spring-kotlin.d.ts.map +1 -0
  113. package/dist/adapters/spring-kotlin.js +297 -0
  114. package/dist/adapters/spring-kotlin.js.map +1 -0
  115. package/dist/adapters/sqlalchemy.d.ts +28 -0
  116. package/dist/adapters/sqlalchemy.d.ts.map +1 -0
  117. package/dist/adapters/sqlalchemy.js +435 -0
  118. package/dist/adapters/sqlalchemy.js.map +1 -0
  119. package/dist/adapters/symfony.d.ts +16 -0
  120. package/dist/adapters/symfony.d.ts.map +1 -0
  121. package/dist/adapters/symfony.js +242 -0
  122. package/dist/adapters/symfony.js.map +1 -0
  123. package/dist/adapters/vapor.d.ts +21 -0
  124. package/dist/adapters/vapor.d.ts.map +1 -0
  125. package/dist/adapters/vapor.js +269 -0
  126. package/dist/adapters/vapor.js.map +1 -0
  127. package/dist/adapters/vue-preprocessor.d.ts +26 -0
  128. package/dist/adapters/vue-preprocessor.d.ts.map +1 -0
  129. package/dist/adapters/vue-preprocessor.js +82 -0
  130. package/dist/adapters/vue-preprocessor.js.map +1 -0
  131. package/dist/adapters/vue.d.ts +13 -0
  132. package/dist/adapters/vue.d.ts.map +1 -0
  133. package/dist/adapters/vue.js +134 -0
  134. package/dist/adapters/vue.js.map +1 -0
  135. package/dist/config/cli.d.ts +26 -0
  136. package/dist/config/cli.d.ts.map +1 -0
  137. package/dist/config/cli.js +291 -0
  138. package/dist/config/cli.js.map +1 -0
  139. package/dist/config/config-loader.d.ts +26 -0
  140. package/dist/config/config-loader.d.ts.map +1 -0
  141. package/dist/config/config-loader.js +168 -0
  142. package/dist/config/config-loader.js.map +1 -0
  143. package/dist/config/config-schema.d.ts +228 -0
  144. package/dist/config/config-schema.d.ts.map +1 -0
  145. package/dist/config/config-schema.js +400 -0
  146. package/dist/config/config-schema.js.map +1 -0
  147. package/dist/config/keys-cli.d.ts +37 -0
  148. package/dist/config/keys-cli.d.ts.map +1 -0
  149. package/dist/config/keys-cli.js +179 -0
  150. package/dist/config/keys-cli.js.map +1 -0
  151. package/dist/config/workspaces-cli.d.ts +2 -0
  152. package/dist/config/workspaces-cli.d.ts.map +1 -0
  153. package/dist/config/workspaces-cli.js +84 -0
  154. package/dist/config/workspaces-cli.js.map +1 -0
  155. package/dist/core/db/api-keys.d.ts +95 -0
  156. package/dist/core/db/api-keys.d.ts.map +1 -0
  157. package/dist/core/db/api-keys.js +293 -0
  158. package/dist/core/db/api-keys.js.map +1 -0
  159. package/dist/core/db/dep-store.d.ts +18 -0
  160. package/dist/core/db/dep-store.d.ts.map +1 -0
  161. package/dist/core/db/dep-store.js +155 -0
  162. package/dist/core/db/dep-store.js.map +1 -0
  163. package/dist/core/db/embedding-store.d.ts +40 -0
  164. package/dist/core/db/embedding-store.d.ts.map +1 -0
  165. package/dist/core/db/embedding-store.js +120 -0
  166. package/dist/core/db/embedding-store.js.map +1 -0
  167. package/dist/core/db/file-store.d.ts +27 -0
  168. package/dist/core/db/file-store.d.ts.map +1 -0
  169. package/dist/core/db/file-store.js +101 -0
  170. package/dist/core/db/file-store.js.map +1 -0
  171. package/dist/core/db/request-log.d.ts +40 -0
  172. package/dist/core/db/request-log.d.ts.map +1 -0
  173. package/dist/core/db/request-log.js +90 -0
  174. package/dist/core/db/request-log.js.map +1 -0
  175. package/dist/core/db/savings-store.d.ts +9 -0
  176. package/dist/core/db/savings-store.d.ts.map +1 -0
  177. package/dist/core/db/savings-store.js +64 -0
  178. package/dist/core/db/savings-store.js.map +1 -0
  179. package/dist/core/db/schema.d.ts +14 -0
  180. package/dist/core/db/schema.d.ts.map +1 -0
  181. package/dist/core/db/schema.js +235 -0
  182. package/dist/core/db/schema.js.map +1 -0
  183. package/dist/core/db/symbol-store.d.ts +64 -0
  184. package/dist/core/db/symbol-store.d.ts.map +1 -0
  185. package/dist/core/db/symbol-store.js +243 -0
  186. package/dist/core/db/symbol-store.js.map +1 -0
  187. package/dist/core/db/tenants.d.ts +91 -0
  188. package/dist/core/db/tenants.d.ts.map +1 -0
  189. package/dist/core/db/tenants.js +219 -0
  190. package/dist/core/db/tenants.js.map +1 -0
  191. package/dist/core/errors.d.ts +72 -0
  192. package/dist/core/errors.d.ts.map +1 -0
  193. package/dist/core/errors.js +140 -0
  194. package/dist/core/errors.js.map +1 -0
  195. package/dist/core/file-discovery.d.ts +17 -0
  196. package/dist/core/file-discovery.d.ts.map +1 -0
  197. package/dist/core/file-discovery.js +136 -0
  198. package/dist/core/file-discovery.js.map +1 -0
  199. package/dist/core/file-processor.d.ts +21 -0
  200. package/dist/core/file-processor.d.ts.map +1 -0
  201. package/dist/core/file-processor.js +110 -0
  202. package/dist/core/file-processor.js.map +1 -0
  203. package/dist/core/hash-cache.d.ts +18 -0
  204. package/dist/core/hash-cache.d.ts.map +1 -0
  205. package/dist/core/hash-cache.js +35 -0
  206. package/dist/core/hash-cache.js.map +1 -0
  207. package/dist/core/index-manager.d.ts +18 -0
  208. package/dist/core/index-manager.d.ts.map +1 -0
  209. package/dist/core/index-manager.js +461 -0
  210. package/dist/core/index-manager.js.map +1 -0
  211. package/dist/core/indexing-worker.d.ts +60 -0
  212. package/dist/core/indexing-worker.d.ts.map +1 -0
  213. package/dist/core/indexing-worker.js +128 -0
  214. package/dist/core/indexing-worker.js.map +1 -0
  215. package/dist/core/logger.d.ts +10 -0
  216. package/dist/core/logger.d.ts.map +1 -0
  217. package/dist/core/logger.js +40 -0
  218. package/dist/core/logger.js.map +1 -0
  219. package/dist/core/parse-dispatcher.d.ts +18 -0
  220. package/dist/core/parse-dispatcher.d.ts.map +1 -0
  221. package/dist/core/parse-dispatcher.js +74 -0
  222. package/dist/core/parse-dispatcher.js.map +1 -0
  223. package/dist/core/search/query-preprocessor.d.ts +22 -0
  224. package/dist/core/search/query-preprocessor.d.ts.map +1 -0
  225. package/dist/core/search/query-preprocessor.js +77 -0
  226. package/dist/core/search/query-preprocessor.js.map +1 -0
  227. package/dist/core/search/relevance-ranker.d.ts +34 -0
  228. package/dist/core/search/relevance-ranker.d.ts.map +1 -0
  229. package/dist/core/search/relevance-ranker.js +132 -0
  230. package/dist/core/search/relevance-ranker.js.map +1 -0
  231. package/dist/core/security.d.ts +40 -0
  232. package/dist/core/security.d.ts.map +1 -0
  233. package/dist/core/security.js +133 -0
  234. package/dist/core/security.js.map +1 -0
  235. package/dist/core/telemetry.d.ts +19 -0
  236. package/dist/core/telemetry.d.ts.map +1 -0
  237. package/dist/core/telemetry.js +101 -0
  238. package/dist/core/telemetry.js.map +1 -0
  239. package/dist/core/tenant-context.d.ts +22 -0
  240. package/dist/core/tenant-context.d.ts.map +1 -0
  241. package/dist/core/tenant-context.js +16 -0
  242. package/dist/core/tenant-context.js.map +1 -0
  243. package/dist/core/token-tracker.d.ts +39 -0
  244. package/dist/core/token-tracker.d.ts.map +1 -0
  245. package/dist/core/token-tracker.js +153 -0
  246. package/dist/core/token-tracker.js.map +1 -0
  247. package/dist/core/types.d.ts +145 -0
  248. package/dist/core/types.d.ts.map +1 -0
  249. package/dist/core/types.js +2 -0
  250. package/dist/core/types.js.map +1 -0
  251. package/dist/core/watcher/file-watcher.d.ts +18 -0
  252. package/dist/core/watcher/file-watcher.d.ts.map +1 -0
  253. package/dist/core/watcher/file-watcher.js +123 -0
  254. package/dist/core/watcher/file-watcher.js.map +1 -0
  255. package/dist/core/worker-pool.d.ts +24 -0
  256. package/dist/core/worker-pool.d.ts.map +1 -0
  257. package/dist/core/worker-pool.js +92 -0
  258. package/dist/core/worker-pool.js.map +1 -0
  259. package/dist/graph/graph-builder.d.ts +16 -0
  260. package/dist/graph/graph-builder.d.ts.map +1 -0
  261. package/dist/graph/graph-builder.js +51 -0
  262. package/dist/graph/graph-builder.js.map +1 -0
  263. package/dist/graph/graph-traversal.d.ts +57 -0
  264. package/dist/graph/graph-traversal.d.ts.map +1 -0
  265. package/dist/graph/graph-traversal.js +144 -0
  266. package/dist/graph/graph-traversal.js.map +1 -0
  267. package/dist/graph/path-resolver.d.ts +13 -0
  268. package/dist/graph/path-resolver.d.ts.map +1 -0
  269. package/dist/graph/path-resolver.js +161 -0
  270. package/dist/graph/path-resolver.js.map +1 -0
  271. package/dist/handlers/c.d.ts +3 -0
  272. package/dist/handlers/c.d.ts.map +1 -0
  273. package/dist/handlers/c.js +473 -0
  274. package/dist/handlers/c.js.map +1 -0
  275. package/dist/handlers/cpp.d.ts +3 -0
  276. package/dist/handlers/cpp.d.ts.map +1 -0
  277. package/dist/handlers/cpp.js +682 -0
  278. package/dist/handlers/cpp.js.map +1 -0
  279. package/dist/handlers/csharp.d.ts +3 -0
  280. package/dist/handlers/csharp.d.ts.map +1 -0
  281. package/dist/handlers/csharp.js +369 -0
  282. package/dist/handlers/csharp.js.map +1 -0
  283. package/dist/handlers/dart.d.ts +3 -0
  284. package/dist/handlers/dart.d.ts.map +1 -0
  285. package/dist/handlers/dart.js +596 -0
  286. package/dist/handlers/dart.js.map +1 -0
  287. package/dist/handlers/elixir.d.ts +8 -0
  288. package/dist/handlers/elixir.d.ts.map +1 -0
  289. package/dist/handlers/elixir.js +412 -0
  290. package/dist/handlers/elixir.js.map +1 -0
  291. package/dist/handlers/go.d.ts +3 -0
  292. package/dist/handlers/go.d.ts.map +1 -0
  293. package/dist/handlers/go.js +262 -0
  294. package/dist/handlers/go.js.map +1 -0
  295. package/dist/handlers/handler-registry.d.ts +20 -0
  296. package/dist/handlers/handler-registry.d.ts.map +1 -0
  297. package/dist/handlers/handler-registry.js +69 -0
  298. package/dist/handlers/handler-registry.js.map +1 -0
  299. package/dist/handlers/haskell.d.ts +17 -0
  300. package/dist/handlers/haskell.d.ts.map +1 -0
  301. package/dist/handlers/haskell.js +356 -0
  302. package/dist/handlers/haskell.js.map +1 -0
  303. package/dist/handlers/java.d.ts +3 -0
  304. package/dist/handlers/java.d.ts.map +1 -0
  305. package/dist/handlers/java.js +350 -0
  306. package/dist/handlers/java.js.map +1 -0
  307. package/dist/handlers/javascript.d.ts +3 -0
  308. package/dist/handlers/javascript.d.ts.map +1 -0
  309. package/dist/handlers/javascript.js +232 -0
  310. package/dist/handlers/javascript.js.map +1 -0
  311. package/dist/handlers/kotlin.d.ts +3 -0
  312. package/dist/handlers/kotlin.d.ts.map +1 -0
  313. package/dist/handlers/kotlin.js +317 -0
  314. package/dist/handlers/kotlin.js.map +1 -0
  315. package/dist/handlers/lua.d.ts +3 -0
  316. package/dist/handlers/lua.d.ts.map +1 -0
  317. package/dist/handlers/lua.js +328 -0
  318. package/dist/handlers/lua.js.map +1 -0
  319. package/dist/handlers/php.d.ts +3 -0
  320. package/dist/handlers/php.d.ts.map +1 -0
  321. package/dist/handlers/php.js +343 -0
  322. package/dist/handlers/php.js.map +1 -0
  323. package/dist/handlers/python.d.ts +3 -0
  324. package/dist/handlers/python.d.ts.map +1 -0
  325. package/dist/handlers/python.js +343 -0
  326. package/dist/handlers/python.js.map +1 -0
  327. package/dist/handlers/r.d.ts +9 -0
  328. package/dist/handlers/r.d.ts.map +1 -0
  329. package/dist/handlers/r.js +452 -0
  330. package/dist/handlers/r.js.map +1 -0
  331. package/dist/handlers/ruby.d.ts +8 -0
  332. package/dist/handlers/ruby.d.ts.map +1 -0
  333. package/dist/handlers/ruby.js +271 -0
  334. package/dist/handlers/ruby.js.map +1 -0
  335. package/dist/handlers/rust.d.ts +3 -0
  336. package/dist/handlers/rust.d.ts.map +1 -0
  337. package/dist/handlers/rust.js +420 -0
  338. package/dist/handlers/rust.js.map +1 -0
  339. package/dist/handlers/scala.d.ts +9 -0
  340. package/dist/handlers/scala.d.ts.map +1 -0
  341. package/dist/handlers/scala.js +480 -0
  342. package/dist/handlers/scala.js.map +1 -0
  343. package/dist/handlers/swift.d.ts +3 -0
  344. package/dist/handlers/swift.d.ts.map +1 -0
  345. package/dist/handlers/swift.js +553 -0
  346. package/dist/handlers/swift.js.map +1 -0
  347. package/dist/handlers/typescript.d.ts +4 -0
  348. package/dist/handlers/typescript.d.ts.map +1 -0
  349. package/dist/handlers/typescript.js +325 -0
  350. package/dist/handlers/typescript.js.map +1 -0
  351. package/dist/index.d.ts +44 -0
  352. package/dist/index.d.ts.map +1 -0
  353. package/dist/index.js +266 -0
  354. package/dist/index.js.map +1 -0
  355. package/dist/semantic/embedding-provider.d.ts +66 -0
  356. package/dist/semantic/embedding-provider.d.ts.map +1 -0
  357. package/dist/semantic/embedding-provider.js +176 -0
  358. package/dist/semantic/embedding-provider.js.map +1 -0
  359. package/dist/semantic/hnsw-index.d.ts +96 -0
  360. package/dist/semantic/hnsw-index.d.ts.map +1 -0
  361. package/dist/semantic/hnsw-index.js +364 -0
  362. package/dist/semantic/hnsw-index.js.map +1 -0
  363. package/dist/semantic/hybrid-search.d.ts +46 -0
  364. package/dist/semantic/hybrid-search.d.ts.map +1 -0
  365. package/dist/semantic/hybrid-search.js +164 -0
  366. package/dist/semantic/hybrid-search.js.map +1 -0
  367. package/dist/semantic/query-expansion.d.ts +25 -0
  368. package/dist/semantic/query-expansion.d.ts.map +1 -0
  369. package/dist/semantic/query-expansion.js +150 -0
  370. package/dist/semantic/query-expansion.js.map +1 -0
  371. package/dist/semantic/semantic-indexer.d.ts +64 -0
  372. package/dist/semantic/semantic-indexer.d.ts.map +1 -0
  373. package/dist/semantic/semantic-indexer.js +162 -0
  374. package/dist/semantic/semantic-indexer.js.map +1 -0
  375. package/dist/semantic/text-preparation.d.ts +23 -0
  376. package/dist/semantic/text-preparation.d.ts.map +1 -0
  377. package/dist/semantic/text-preparation.js +56 -0
  378. package/dist/semantic/text-preparation.js.map +1 -0
  379. package/dist/semantic/vector-store.d.ts +81 -0
  380. package/dist/semantic/vector-store.d.ts.map +1 -0
  381. package/dist/semantic/vector-store.js +157 -0
  382. package/dist/semantic/vector-store.js.map +1 -0
  383. package/dist/server/admin-api.d.ts +88 -0
  384. package/dist/server/admin-api.d.ts.map +1 -0
  385. package/dist/server/admin-api.js +661 -0
  386. package/dist/server/admin-api.js.map +1 -0
  387. package/dist/server/auth/api-key.d.ts +105 -0
  388. package/dist/server/auth/api-key.d.ts.map +1 -0
  389. package/dist/server/auth/api-key.js +276 -0
  390. package/dist/server/auth/api-key.js.map +1 -0
  391. package/dist/server/http-server.d.ts +100 -0
  392. package/dist/server/http-server.d.ts.map +1 -0
  393. package/dist/server/http-server.js +823 -0
  394. package/dist/server/http-server.js.map +1 -0
  395. package/dist/server/mcp-server.d.ts +23 -0
  396. package/dist/server/mcp-server.d.ts.map +1 -0
  397. package/dist/server/mcp-server.js +214 -0
  398. package/dist/server/mcp-server.js.map +1 -0
  399. package/dist/server/rate-limit-store.d.ts +25 -0
  400. package/dist/server/rate-limit-store.d.ts.map +1 -0
  401. package/dist/server/rate-limit-store.js +46 -0
  402. package/dist/server/rate-limit-store.js.map +1 -0
  403. package/dist/server/rate-limiter.d.ts +59 -0
  404. package/dist/server/rate-limiter.d.ts.map +1 -0
  405. package/dist/server/rate-limiter.js +85 -0
  406. package/dist/server/rate-limiter.js.map +1 -0
  407. package/dist/server/tools/_meta.d.ts +24 -0
  408. package/dist/server/tools/_meta.d.ts.map +1 -0
  409. package/dist/server/tools/_meta.js +35 -0
  410. package/dist/server/tools/_meta.js.map +1 -0
  411. package/dist/server/tools/find-dead-code.d.ts +11 -0
  412. package/dist/server/tools/find-dead-code.d.ts.map +1 -0
  413. package/dist/server/tools/find-dead-code.js +45 -0
  414. package/dist/server/tools/find-dead-code.js.map +1 -0
  415. package/dist/server/tools/find-importers.d.ts +13 -0
  416. package/dist/server/tools/find-importers.d.ts.map +1 -0
  417. package/dist/server/tools/find-importers.js +46 -0
  418. package/dist/server/tools/find-importers.js.map +1 -0
  419. package/dist/server/tools/get-blast-radius.d.ts +15 -0
  420. package/dist/server/tools/get-blast-radius.d.ts.map +1 -0
  421. package/dist/server/tools/get-blast-radius.js +51 -0
  422. package/dist/server/tools/get-blast-radius.js.map +1 -0
  423. package/dist/server/tools/get-context-bundle.d.ts +15 -0
  424. package/dist/server/tools/get-context-bundle.d.ts.map +1 -0
  425. package/dist/server/tools/get-context-bundle.js +53 -0
  426. package/dist/server/tools/get-context-bundle.js.map +1 -0
  427. package/dist/server/tools/get-file-outline.d.ts +13 -0
  428. package/dist/server/tools/get-file-outline.d.ts.map +1 -0
  429. package/dist/server/tools/get-file-outline.js +42 -0
  430. package/dist/server/tools/get-file-outline.js.map +1 -0
  431. package/dist/server/tools/get-file-tree.d.ts +11 -0
  432. package/dist/server/tools/get-file-tree.d.ts.map +1 -0
  433. package/dist/server/tools/get-file-tree.js +63 -0
  434. package/dist/server/tools/get-file-tree.js.map +1 -0
  435. package/dist/server/tools/get-graph.d.ts +46 -0
  436. package/dist/server/tools/get-graph.d.ts.map +1 -0
  437. package/dist/server/tools/get-graph.js +168 -0
  438. package/dist/server/tools/get-graph.js.map +1 -0
  439. package/dist/server/tools/get-layer-violations.d.ts +37 -0
  440. package/dist/server/tools/get-layer-violations.d.ts.map +1 -0
  441. package/dist/server/tools/get-layer-violations.js +138 -0
  442. package/dist/server/tools/get-layer-violations.js.map +1 -0
  443. package/dist/server/tools/get-repo-outline.d.ts +13 -0
  444. package/dist/server/tools/get-repo-outline.d.ts.map +1 -0
  445. package/dist/server/tools/get-repo-outline.js +72 -0
  446. package/dist/server/tools/get-repo-outline.js.map +1 -0
  447. package/dist/server/tools/get-savings-stats.d.ts +11 -0
  448. package/dist/server/tools/get-savings-stats.d.ts.map +1 -0
  449. package/dist/server/tools/get-savings-stats.js +56 -0
  450. package/dist/server/tools/get-savings-stats.js.map +1 -0
  451. package/dist/server/tools/get-symbol-source.d.ts +13 -0
  452. package/dist/server/tools/get-symbol-source.d.ts.map +1 -0
  453. package/dist/server/tools/get-symbol-source.js +93 -0
  454. package/dist/server/tools/get-symbol-source.js.map +1 -0
  455. package/dist/server/tools/index-folder.d.ts +15 -0
  456. package/dist/server/tools/index-folder.d.ts.map +1 -0
  457. package/dist/server/tools/index-folder.js +45 -0
  458. package/dist/server/tools/index-folder.js.map +1 -0
  459. package/dist/server/tools/index-repo.d.ts +26 -0
  460. package/dist/server/tools/index-repo.d.ts.map +1 -0
  461. package/dist/server/tools/index-repo.js +164 -0
  462. package/dist/server/tools/index-repo.js.map +1 -0
  463. package/dist/server/tools/list-repos.d.ts +11 -0
  464. package/dist/server/tools/list-repos.d.ts.map +1 -0
  465. package/dist/server/tools/list-repos.js +60 -0
  466. package/dist/server/tools/list-repos.js.map +1 -0
  467. package/dist/server/tools/resolve-repo.d.ts +11 -0
  468. package/dist/server/tools/resolve-repo.d.ts.map +1 -0
  469. package/dist/server/tools/resolve-repo.js +44 -0
  470. package/dist/server/tools/resolve-repo.js.map +1 -0
  471. package/dist/server/tools/search-semantic.d.ts +56 -0
  472. package/dist/server/tools/search-semantic.d.ts.map +1 -0
  473. package/dist/server/tools/search-semantic.js +187 -0
  474. package/dist/server/tools/search-semantic.js.map +1 -0
  475. package/dist/server/tools/search-symbols.d.ts +43 -0
  476. package/dist/server/tools/search-symbols.d.ts.map +1 -0
  477. package/dist/server/tools/search-symbols.js +197 -0
  478. package/dist/server/tools/search-symbols.js.map +1 -0
  479. package/dist/server/tools/search-text.d.ts +21 -0
  480. package/dist/server/tools/search-text.d.ts.map +1 -0
  481. package/dist/server/tools/search-text.js +131 -0
  482. package/dist/server/tools/search-text.js.map +1 -0
  483. package/dist/server/transport.d.ts +59 -0
  484. package/dist/server/transport.d.ts.map +1 -0
  485. package/dist/server/transport.js +92 -0
  486. package/dist/server/transport.js.map +1 -0
  487. package/dist/summarizer/ai-summarizer.d.ts +71 -0
  488. package/dist/summarizer/ai-summarizer.d.ts.map +1 -0
  489. package/dist/summarizer/ai-summarizer.js +228 -0
  490. package/dist/summarizer/ai-summarizer.js.map +1 -0
  491. package/dist/summarizer/docstring-extractor.d.ts +9 -0
  492. package/dist/summarizer/docstring-extractor.d.ts.map +1 -0
  493. package/dist/summarizer/docstring-extractor.js +89 -0
  494. package/dist/summarizer/docstring-extractor.js.map +1 -0
  495. package/dist/summarizer/embeddings.d.ts +29 -0
  496. package/dist/summarizer/embeddings.d.ts.map +1 -0
  497. package/dist/summarizer/embeddings.js +133 -0
  498. package/dist/summarizer/embeddings.js.map +1 -0
  499. package/dist/summarizer/summarizer.d.ts +22 -0
  500. package/dist/summarizer/summarizer.d.ts.map +1 -0
  501. package/dist/summarizer/summarizer.js +86 -0
  502. package/dist/summarizer/summarizer.js.map +1 -0
  503. package/dist/ui/assets/BlastRadius-ccQ3ktbv.js +1 -0
  504. package/dist/ui/assets/DependencyGraph-BZV40eAE.css +1 -0
  505. package/dist/ui/assets/DependencyGraph-Ca84q89b.js +27 -0
  506. package/dist/ui/assets/NotFound-C1wVKP-6.js +1 -0
  507. package/dist/ui/assets/RepoDetail-B_8qid2Y.js +1 -0
  508. package/dist/ui/assets/RepoList-BuPu-ODM.js +1 -0
  509. package/dist/ui/assets/Search-BzZ9Og8E.js +1 -0
  510. package/dist/ui/assets/SymbolView-FdpKlzql.js +14 -0
  511. package/dist/ui/assets/client-BANW_tIp.js +1 -0
  512. package/dist/ui/assets/index-CnwwQi_S.js +61 -0
  513. package/dist/ui/assets/index-SS2IXr8I.css +1 -0
  514. package/dist/ui/assets/repoStore-SbGR6YI6.js +1 -0
  515. package/dist/ui/assets/useSearch-DHyve22h.js +1 -0
  516. package/dist/ui/index.html +13 -0
  517. package/dist/version.d.ts +2 -0
  518. package/dist/version.d.ts.map +1 -0
  519. package/dist/version.js +2 -0
  520. package/dist/version.js.map +1 -0
  521. package/grammars/tree-sitter-c.wasm +0 -0
  522. package/grammars/tree-sitter-cpp.wasm +0 -0
  523. package/grammars/tree-sitter-csharp.wasm +0 -0
  524. package/grammars/tree-sitter-dart.wasm +0 -0
  525. package/grammars/tree-sitter-elixir.wasm +0 -0
  526. package/grammars/tree-sitter-go.wasm +0 -0
  527. package/grammars/tree-sitter-haskell.wasm +0 -0
  528. package/grammars/tree-sitter-java.wasm +0 -0
  529. package/grammars/tree-sitter-javascript.wasm +0 -0
  530. package/grammars/tree-sitter-kotlin.wasm +0 -0
  531. package/grammars/tree-sitter-lua.wasm +0 -0
  532. package/grammars/tree-sitter-php.wasm +0 -0
  533. package/grammars/tree-sitter-python.wasm +0 -0
  534. package/grammars/tree-sitter-r.wasm +0 -0
  535. package/grammars/tree-sitter-ruby.wasm +0 -0
  536. package/grammars/tree-sitter-rust.wasm +0 -0
  537. package/grammars/tree-sitter-scala.wasm +0 -0
  538. package/grammars/tree-sitter-swift.wasm +0 -0
  539. package/grammars/tree-sitter-tsx.wasm +0 -0
  540. package/grammars/tree-sitter-typescript.wasm +0 -0
  541. package/package.json +104 -0
  542. package/scripts/check-sqlite.js +41 -0
@@ -0,0 +1,59 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ /**
4
+ * Which MCP transport(s) to start.
5
+ * 'stdio' — stdin/stdout (default; required for Claude Code integration)
6
+ * 'http' — HTTP + Streamable HTTP (for web clients and remote dev environments)
7
+ * 'both' — stdio AND HTTP simultaneously (useful for development)
8
+ */
9
+ export type TransportMode = 'stdio' | 'http' | 'both';
10
+ /** Options passed through to the HTTP server when mode is 'http' or 'both'. */
11
+ export interface TransportOptions {
12
+ port?: number;
13
+ host?: string;
14
+ corsOrigins?: string[];
15
+ }
16
+ /**
17
+ * Manages stateful MCP-over-HTTP+SSE sessions for a shared server.
18
+ *
19
+ * Each agent session is an independent `StreamableHTTPServerTransport` +
20
+ * `McpServer` pair, keyed by the `mcp-session-id` assigned during initialization.
21
+ * Multiple agents can connect concurrently; their sessions are fully isolated.
22
+ *
23
+ * Protocol (Streamable HTTP):
24
+ * POST /mcp/sse (no session ID) → initialize → creates session, returns mcp-session-id
25
+ * POST /mcp/sse (with session ID) → tool call → routes to the correct session
26
+ * GET /mcp/sse (with session ID) → SSE stream → server-initiated notifications
27
+ * DELETE /mcp/sse (with session ID) → close session
28
+ *
29
+ * Connect Claude Code:
30
+ * claude mcp add purecontext-remote \
31
+ * --transport http \
32
+ * --url https://your-server/mcp/sse \
33
+ * --header "Authorization: Bearer pctx_yourkey"
34
+ */
35
+ export declare class HttpSseTransport {
36
+ private readonly serverFactory;
37
+ private readonly sessions;
38
+ constructor(serverFactory: () => McpServer);
39
+ /**
40
+ * No-op: sessions are created on demand during initialization requests.
41
+ * Call this once before the first handleRequest for API symmetry.
42
+ */
43
+ init(): Promise<void>;
44
+ /**
45
+ * Route an HTTP request to the appropriate MCP session.
46
+ *
47
+ * - No `mcp-session-id` header (first request): create a new session.
48
+ * - With `mcp-session-id` header: look up the existing session.
49
+ *
50
+ * Handles GET (SSE open), POST (tool calls), DELETE (close session).
51
+ * Auth must be validated by the caller before this method is invoked.
52
+ *
53
+ * @param parsedBody Pre-parsed JSON body for POST requests; omit for GET/DELETE.
54
+ */
55
+ handleRequest(req: IncomingMessage, res: ServerResponse, parsedBody?: unknown): Promise<void>;
56
+ /** Close all active sessions and their underlying transports. */
57
+ close(): Promise<void>;
58
+ }
59
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/server/transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAEtD,+EAA+E;AAC/E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AASD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkB;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;gBAElD,aAAa,EAAE,MAAM,SAAS;IAI1C;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;;;;;;;;;OAUG;IACG,aAAa,CACjB,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,UAAU,CAAC,EAAE,OAAO,GACnB,OAAO,CAAC,IAAI,CAAC;IA6ChB,iEAAiE;IAC3D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ7B"}
@@ -0,0 +1,92 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
3
+ /**
4
+ * Manages stateful MCP-over-HTTP+SSE sessions for a shared server.
5
+ *
6
+ * Each agent session is an independent `StreamableHTTPServerTransport` +
7
+ * `McpServer` pair, keyed by the `mcp-session-id` assigned during initialization.
8
+ * Multiple agents can connect concurrently; their sessions are fully isolated.
9
+ *
10
+ * Protocol (Streamable HTTP):
11
+ * POST /mcp/sse (no session ID) → initialize → creates session, returns mcp-session-id
12
+ * POST /mcp/sse (with session ID) → tool call → routes to the correct session
13
+ * GET /mcp/sse (with session ID) → SSE stream → server-initiated notifications
14
+ * DELETE /mcp/sse (with session ID) → close session
15
+ *
16
+ * Connect Claude Code:
17
+ * claude mcp add purecontext-remote \
18
+ * --transport http \
19
+ * --url https://your-server/mcp/sse \
20
+ * --header "Authorization: Bearer pctx_yourkey"
21
+ */
22
+ export class HttpSseTransport {
23
+ serverFactory;
24
+ sessions = new Map();
25
+ constructor(serverFactory) {
26
+ this.serverFactory = serverFactory;
27
+ }
28
+ /**
29
+ * No-op: sessions are created on demand during initialization requests.
30
+ * Call this once before the first handleRequest for API symmetry.
31
+ */
32
+ async init() {
33
+ // Sessions are created on demand.
34
+ }
35
+ /**
36
+ * Route an HTTP request to the appropriate MCP session.
37
+ *
38
+ * - No `mcp-session-id` header (first request): create a new session.
39
+ * - With `mcp-session-id` header: look up the existing session.
40
+ *
41
+ * Handles GET (SSE open), POST (tool calls), DELETE (close session).
42
+ * Auth must be validated by the caller before this method is invoked.
43
+ *
44
+ * @param parsedBody Pre-parsed JSON body for POST requests; omit for GET/DELETE.
45
+ */
46
+ async handleRequest(req, res, parsedBody) {
47
+ const sessionId = req.headers['mcp-session-id'];
48
+ if (sessionId) {
49
+ // Route to existing session
50
+ const session = this.sessions.get(sessionId);
51
+ if (!session) {
52
+ res.writeHead(404, { 'Content-Type': 'application/json' });
53
+ res.end(JSON.stringify({
54
+ jsonrpc: '2.0',
55
+ error: { code: -32001, message: 'Session not found' },
56
+ id: null,
57
+ }));
58
+ return;
59
+ }
60
+ await session.transport.handleRequest(req, res, parsedBody);
61
+ }
62
+ else {
63
+ // New session — create a fresh transport + McpServer pair.
64
+ // onsessioninitialized fires during handleRequest once the session ID is assigned.
65
+ const transport = new StreamableHTTPServerTransport({
66
+ sessionIdGenerator: () => randomUUID(),
67
+ onsessioninitialized: (sid) => {
68
+ // Store immediately so subsequent requests can find this session.
69
+ // mcpServer is already assigned (it's a const in the enclosing block).
70
+ this.sessions.set(sid, { transport, mcpServer }); // eslint-disable-line @typescript-eslint/no-use-before-define
71
+ },
72
+ onsessionclosed: (sid) => {
73
+ if (sid)
74
+ this.sessions.delete(sid);
75
+ },
76
+ });
77
+ const mcpServer = this.serverFactory();
78
+ await mcpServer.connect(transport);
79
+ await transport.handleRequest(req, res, parsedBody);
80
+ }
81
+ }
82
+ /** Close all active sessions and their underlying transports. */
83
+ async close() {
84
+ const closings = Array.from(this.sessions.values()).map(async (s) => {
85
+ await s.transport.close().catch(() => { });
86
+ await s.mcpServer.close().catch(() => { });
87
+ });
88
+ await Promise.all(closings);
89
+ this.sessions.clear();
90
+ }
91
+ }
92
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/server/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AA0BnG;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,gBAAgB;IACV,aAAa,CAAkB;IAC/B,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IAE9D,YAAY,aAA8B;QACxC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI;QACR,kCAAkC;IACpC,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,aAAa,CACjB,GAAoB,EACpB,GAAmB,EACnB,UAAoB;QAEpB,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;QAEtE,IAAI,SAAS,EAAE,CAAC;YACd,4BAA4B;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;oBACrB,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE;oBACrD,EAAE,EAAE,IAAI;iBACT,CAAC,CAAC,CAAC;gBACJ,OAAO;YACT,CAAC;YACD,MAAM,OAAO,CAAC,SAAS,CAAC,aAAa,CACnC,GAAG,EACH,GAAG,EACH,UAAiD,CAClD,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,2DAA2D;YAC3D,mFAAmF;YACnF,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;gBAClD,kBAAkB,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE;gBACtC,oBAAoB,EAAE,CAAC,GAAG,EAAE,EAAE;oBAC5B,kEAAkE;oBAClE,uEAAuE;oBACvE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,8DAA8D;gBAClH,CAAC;gBACD,eAAe,EAAE,CAAC,GAAG,EAAE,EAAE;oBACvB,IAAI,GAAG;wBAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACrC,CAAC;aACF,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACnC,MAAM,SAAS,CAAC,aAAa,CAC3B,GAAG,EACH,GAAG,EACH,UAAiD,CAClD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,iEAAiE;IACjE,KAAK,CAAC,KAAK;QACT,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YAClE,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * AI-powered batch summarizer (Stage 3 of the summary pipeline).
3
+ *
4
+ * Supports two providers:
5
+ * 'anthropic' — Anthropic Messages API (https.request)
6
+ * 'openai-compatible' — Any /v1/chat/completions endpoint (fetch)
7
+ *
8
+ * Error handling: any failure (network, API error, parse failure) logs a
9
+ * warning and returns an empty Map so the caller can continue with Stage 4
10
+ * (signature fallback) for the affected symbols.
11
+ */
12
+ import { request as httpsRequest } from 'https';
13
+ import type { SymbolRecord } from '../core/types.js';
14
+ export interface AISummarizerConfig {
15
+ /** Enable AI summarization. */
16
+ enabled: boolean;
17
+ /** Provider. Defaults to 'anthropic'. */
18
+ provider?: 'anthropic' | 'openai-compatible';
19
+ /** Model to use. Provider-specific defaults apply when omitted. */
20
+ model?: string;
21
+ /** Resolved API key (after env-var expansion). */
22
+ apiKey?: string;
23
+ /**
24
+ * Base URL for the OpenAI-compatible endpoint (e.g. 'http://localhost:11434').
25
+ * Required when provider is 'openai-compatible'.
26
+ */
27
+ endpoint?: string | null;
28
+ /** Max symbols per batch. Defaults to 50. */
29
+ batchSize?: number;
30
+ }
31
+ export interface AISummarizer {
32
+ /**
33
+ * Generate summaries for a batch of symbols.
34
+ * Returns a Map of symbol.id → summary string.
35
+ * Symbols not covered (error, missing) are absent from the Map.
36
+ */
37
+ summarizeBatch(symbols: SymbolRecord[]): Promise<Map<string, string>>;
38
+ }
39
+ /** Injectable type for Node's https.request (Anthropic path). */
40
+ export type HttpRequestFn = typeof httpsRequest;
41
+ /** Injectable type for fetch (OpenAI-compatible path). */
42
+ export type FetchFn = typeof fetch;
43
+ /**
44
+ * Build the full prompt including file path context and signature.
45
+ * Response format: `id: summary` per line.
46
+ */
47
+ export declare function buildPrompt(symbols: SymbolRecord[]): string;
48
+ /**
49
+ * Simplified prompt used on retry — signatures only, no extra context.
50
+ */
51
+ export declare function buildSimplePrompt(symbols: SymbolRecord[]): string;
52
+ /**
53
+ * Parse lines of the form `<id>: <summary>` from the model response.
54
+ * Lines that don't match the pattern are silently skipped.
55
+ */
56
+ export declare function parseResponse(text: string, expectedIds: Set<string>): Map<string, string>;
57
+ /**
58
+ * Send one batch of symbols to the model, retrying once with a simpler prompt
59
+ * if the first response parses to 0 results.
60
+ */
61
+ export declare function summarizeBatchWithRetry(symbols: SymbolRecord[], sendPrompt: (prompt: string) => Promise<string>): Promise<Map<string, string>>;
62
+ /**
63
+ * Create an AISummarizer if AI summarization is enabled and an API key is
64
+ * available. Returns null if either condition is not met.
65
+ *
66
+ * @param config Summarizer configuration.
67
+ * @param httpClient Injectable Anthropic HTTP client (defaults to https.request).
68
+ * @param fetchFn Injectable fetch function for OpenAI-compatible path.
69
+ */
70
+ export declare function createAISummarizer(config: AISummarizerConfig, httpClient?: HttpRequestFn, fetchFn?: FetchFn): AISummarizer | null;
71
+ //# sourceMappingURL=ai-summarizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-summarizer.d.ts","sourceRoot":"","sources":["../../src/summarizer/ai-summarizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAKrD,MAAM,WAAW,kBAAkB;IACjC,+BAA+B;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,WAAW,GAAG,mBAAmB,CAAC;IAC7C,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACvE;AAmBD,iEAAiE;AACjE,MAAM,MAAM,aAAa,GAAG,OAAO,YAAY,CAAC;AAEhD,0DAA0D;AAC1D,MAAM,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC;AAInC;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAyB3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAUjE;AAID;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAYzF;AAqFD;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,YAAY,EAAE,EACvB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAC9C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAY9B;AAID;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,kBAAkB,EAC1B,UAAU,GAAE,aAA4B,EACxC,OAAO,GAAE,OAA0B,GAClC,YAAY,GAAG,IAAI,CAoFrB"}
@@ -0,0 +1,228 @@
1
+ /**
2
+ * AI-powered batch summarizer (Stage 3 of the summary pipeline).
3
+ *
4
+ * Supports two providers:
5
+ * 'anthropic' — Anthropic Messages API (https.request)
6
+ * 'openai-compatible' — Any /v1/chat/completions endpoint (fetch)
7
+ *
8
+ * Error handling: any failure (network, API error, parse failure) logs a
9
+ * warning and returns an empty Map so the caller can continue with Stage 4
10
+ * (signature fallback) for the affected symbols.
11
+ */
12
+ import { request as httpsRequest } from 'https';
13
+ import { logger } from '../core/logger.js';
14
+ // ─── Prompt builder ───────────────────────────────────────────────────────────
15
+ /**
16
+ * Build the full prompt including file path context and signature.
17
+ * Response format: `id: summary` per line.
18
+ */
19
+ export function buildPrompt(symbols) {
20
+ const items = symbols
21
+ .map((s) => {
22
+ const parentHint = s.kind === 'method' && s.name.includes('.')
23
+ ? ` parent=${s.name.slice(0, s.name.lastIndexOf('.'))}`
24
+ : '';
25
+ return (`id=${s.id} kind=${s.kind} name=${s.name} file=${s.filePath}${parentHint}\n` +
26
+ s.signature);
27
+ })
28
+ .join('\n\n');
29
+ return ('For each symbol below, write exactly one line in the format:\n' +
30
+ 'id: <one-line summary>\n\n' +
31
+ 'Rules:\n' +
32
+ '- Summary must be ≤ 80 characters\n' +
33
+ '- Use plain English, active voice\n' +
34
+ '- Do not include the id or name in the summary\n' +
35
+ '- Output ONLY the id: summary lines, nothing else\n\n' +
36
+ 'Symbols:\n' +
37
+ items);
38
+ }
39
+ /**
40
+ * Simplified prompt used on retry — signatures only, no extra context.
41
+ */
42
+ export function buildSimplePrompt(symbols) {
43
+ const items = symbols
44
+ .map((s) => `id=${s.id}\n${s.signature}`)
45
+ .join('\n\n');
46
+ return ('For each symbol below, write exactly one line: id: <one-line summary ≤ 80 chars>.\n' +
47
+ 'Output ONLY the id: summary lines.\n\n' +
48
+ items);
49
+ }
50
+ // ─── Response parser ──────────────────────────────────────────────────────────
51
+ /**
52
+ * Parse lines of the form `<id>: <summary>` from the model response.
53
+ * Lines that don't match the pattern are silently skipped.
54
+ */
55
+ export function parseResponse(text, expectedIds) {
56
+ const result = new Map();
57
+ for (const line of text.split('\n')) {
58
+ const colon = line.indexOf(':');
59
+ if (colon === -1)
60
+ continue;
61
+ const id = line.slice(0, colon).trim();
62
+ const summary = line.slice(colon + 1).trim();
63
+ if (id && summary && expectedIds.has(id)) {
64
+ result.set(id, summary);
65
+ }
66
+ }
67
+ return result;
68
+ }
69
+ // ─── Anthropic HTTP call ──────────────────────────────────────────────────────
70
+ function callAnthropic(apiKey, model, messages, httpClient) {
71
+ return new Promise((resolve, reject) => {
72
+ const body = JSON.stringify({ model, max_tokens: 1024, messages });
73
+ const req = httpClient({
74
+ hostname: 'api.anthropic.com',
75
+ path: '/v1/messages',
76
+ method: 'POST',
77
+ headers: {
78
+ 'Content-Type': 'application/json',
79
+ 'x-api-key': apiKey,
80
+ 'anthropic-version': '2023-06-01',
81
+ 'Content-Length': Buffer.byteLength(body),
82
+ },
83
+ }, (res) => {
84
+ const chunks = [];
85
+ res.on('data', (chunk) => chunks.push(chunk));
86
+ res.on('end', () => {
87
+ const raw = Buffer.concat(chunks).toString('utf8');
88
+ if (res.statusCode && res.statusCode >= 400) {
89
+ reject(new Error(`Anthropic API error ${res.statusCode}: ${raw}`));
90
+ return;
91
+ }
92
+ try {
93
+ resolve(JSON.parse(raw));
94
+ }
95
+ catch {
96
+ reject(new Error(`Failed to parse Anthropic response: ${raw}`));
97
+ }
98
+ });
99
+ res.on('error', reject);
100
+ });
101
+ req.on('error', reject);
102
+ req.write(body);
103
+ req.end();
104
+ });
105
+ }
106
+ // ─── OpenAI-compatible HTTP call ──────────────────────────────────────────────
107
+ async function callOpenAICompatible(endpoint, apiKey, model, prompt, fetchFn) {
108
+ const url = `${endpoint.replace(/\/$/, '')}/v1/chat/completions`;
109
+ const body = JSON.stringify({
110
+ model,
111
+ max_tokens: 1024,
112
+ messages: [{ role: 'user', content: prompt }],
113
+ });
114
+ const response = await fetchFn(url, {
115
+ method: 'POST',
116
+ headers: {
117
+ 'Content-Type': 'application/json',
118
+ ...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}),
119
+ },
120
+ body,
121
+ });
122
+ if (!response.ok) {
123
+ const text = await response.text();
124
+ throw new Error(`OpenAI-compatible API error ${response.status}: ${text}`);
125
+ }
126
+ return response.json();
127
+ }
128
+ // ─── Batch with retry ─────────────────────────────────────────────────────────
129
+ /**
130
+ * Send one batch of symbols to the model, retrying once with a simpler prompt
131
+ * if the first response parses to 0 results.
132
+ */
133
+ export async function summarizeBatchWithRetry(symbols, sendPrompt) {
134
+ const expectedIds = new Set(symbols.map((s) => s.id));
135
+ // First attempt — full prompt with file path context
136
+ const text1 = await sendPrompt(buildPrompt(symbols));
137
+ const results1 = parseResponse(text1, expectedIds);
138
+ if (results1.size > 0)
139
+ return results1;
140
+ // Retry with simpler prompt
141
+ logger.debug('AI batch returned 0 results — retrying with simpler prompt');
142
+ const text2 = await sendPrompt(buildSimplePrompt(symbols));
143
+ return parseResponse(text2, expectedIds);
144
+ }
145
+ // ─── Public factory ───────────────────────────────────────────────────────────
146
+ /**
147
+ * Create an AISummarizer if AI summarization is enabled and an API key is
148
+ * available. Returns null if either condition is not met.
149
+ *
150
+ * @param config Summarizer configuration.
151
+ * @param httpClient Injectable Anthropic HTTP client (defaults to https.request).
152
+ * @param fetchFn Injectable fetch function for OpenAI-compatible path.
153
+ */
154
+ export function createAISummarizer(config, httpClient = httpsRequest, fetchFn = globalThis.fetch) {
155
+ if (!config.enabled)
156
+ return null;
157
+ const provider = config.provider ?? 'anthropic';
158
+ const batchSize = config.batchSize ?? 50;
159
+ // ── Anthropic ───────────────────────────────────────────────────────────────
160
+ if (provider === 'anthropic') {
161
+ const apiKey = config.apiKey || process.env['ANTHROPIC_API_KEY'] || '';
162
+ if (!apiKey) {
163
+ logger.warn('AI summarization enabled but no API key available — skipping Stage 3');
164
+ return null;
165
+ }
166
+ const model = config.model ?? 'claude-haiku-4-5-20251001';
167
+ return {
168
+ async summarizeBatch(symbols) {
169
+ if (symbols.length === 0)
170
+ return new Map();
171
+ const allResults = new Map();
172
+ for (let i = 0; i < symbols.length; i += batchSize) {
173
+ const batch = symbols.slice(i, i + batchSize);
174
+ try {
175
+ const results = await summarizeBatchWithRetry(batch, async (prompt) => {
176
+ const response = await callAnthropic(apiKey, model, [
177
+ { role: 'user', content: prompt },
178
+ ], httpClient);
179
+ return response.content.filter((c) => c.type === 'text').map((c) => c.text).join('');
180
+ });
181
+ for (const [id, summary] of results)
182
+ allResults.set(id, summary);
183
+ logger.debug(`AI summarized ${results.size}/${batch.length} symbols (batch ${Math.floor(i / batchSize) + 1})`);
184
+ }
185
+ catch (err) {
186
+ logger.warn(`AI summarization batch failed: ${err} — falling back to Stage 4`);
187
+ }
188
+ }
189
+ return allResults;
190
+ },
191
+ };
192
+ }
193
+ // ── OpenAI-compatible ───────────────────────────────────────────────────────
194
+ if (provider === 'openai-compatible') {
195
+ const endpoint = config.endpoint;
196
+ if (!endpoint) {
197
+ logger.warn('ai.provider is openai-compatible but ai.endpoint is not set — skipping Stage 3');
198
+ return null;
199
+ }
200
+ const apiKey = config.apiKey || '';
201
+ const model = config.model ?? 'gpt-4o-mini';
202
+ return {
203
+ async summarizeBatch(symbols) {
204
+ if (symbols.length === 0)
205
+ return new Map();
206
+ const allResults = new Map();
207
+ for (let i = 0; i < symbols.length; i += batchSize) {
208
+ const batch = symbols.slice(i, i + batchSize);
209
+ try {
210
+ const results = await summarizeBatchWithRetry(batch, async (prompt) => {
211
+ const response = await callOpenAICompatible(endpoint, apiKey, model, prompt, fetchFn);
212
+ return response.choices[0]?.message?.content ?? '';
213
+ });
214
+ for (const [id, summary] of results)
215
+ allResults.set(id, summary);
216
+ logger.debug(`AI summarized ${results.size}/${batch.length} symbols (batch ${Math.floor(i / batchSize) + 1})`);
217
+ }
218
+ catch (err) {
219
+ logger.warn(`AI summarization batch failed: ${err} — falling back to Stage 4`);
220
+ }
221
+ }
222
+ return allResults;
223
+ },
224
+ };
225
+ }
226
+ return null;
227
+ }
228
+ //# sourceMappingURL=ai-summarizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-summarizer.js","sourceRoot":"","sources":["../../src/summarizer/ai-summarizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Parse JSDoc / TSDoc comment text and extract a clean one-line description.
3
+ *
4
+ * Accepts both:
5
+ * - raw comment text including delimiters (`/** ... *\/`)
6
+ * - already-stripped text (no delimiters)
7
+ */
8
+ export declare function extractSummaryFromDocstring(raw: string): string | null;
9
+ //# sourceMappingURL=docstring-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docstring-extractor.d.ts","sourceRoot":"","sources":["../../src/summarizer/docstring-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmDtE"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Parse JSDoc / TSDoc comment text and extract a clean one-line description.
3
+ *
4
+ * Accepts both:
5
+ * - raw comment text including delimiters (`/** ... *\/`)
6
+ * - already-stripped text (no delimiters)
7
+ */
8
+ export function extractSummaryFromDocstring(raw) {
9
+ if (!raw.trim())
10
+ return null;
11
+ // ── 1. Strip /** ... */ delimiters if present ─────────────────────────────
12
+ let body = raw.trim();
13
+ if (body.startsWith('/**')) {
14
+ body = body.slice(2);
15
+ if (body.endsWith('*/'))
16
+ body = body.slice(0, -2);
17
+ }
18
+ else if (body.startsWith('/*')) {
19
+ body = body.slice(2);
20
+ if (body.endsWith('*/'))
21
+ body = body.slice(0, -2);
22
+ }
23
+ else if (body.startsWith('//')) {
24
+ body = body.replace(/^\/\/\s?/, '').trim();
25
+ return cleanText(body) || null;
26
+ }
27
+ // ── 2. Strip leading * from each line ────────────────────────────────────
28
+ const lines = body
29
+ .split('\n')
30
+ .map((l) => l.replace(/^\s*\*\s?/, '').trim());
31
+ // ── 3. Check for @description tag ────────────────────────────────────────
32
+ const descIdx = lines.findIndex((l) => /^@description\b/i.test(l));
33
+ if (descIdx >= 0) {
34
+ // Collect content after @description (possibly multi-line, until next @tag)
35
+ const descLine = lines[descIdx].replace(/^@description\s*/i, '');
36
+ const continuation = descLine ? [descLine] : [];
37
+ for (let i = descIdx + 1; i < lines.length; i++) {
38
+ if (lines[i].startsWith('@'))
39
+ break;
40
+ if (lines[i])
41
+ continuation.push(lines[i]);
42
+ }
43
+ const descText = continuation.join(' ');
44
+ if (descText)
45
+ return firstSentence(cleanText(descText));
46
+ }
47
+ // ── 4. First paragraph: lines before the first @tag or blank+@tag ────────
48
+ const paragraphLines = [];
49
+ for (const line of lines) {
50
+ if (line.startsWith('@'))
51
+ break; // reached a tag
52
+ paragraphLines.push(line);
53
+ }
54
+ // Collapse runs of blank lines to one, then use the first non-empty block
55
+ const paragraphText = paragraphLines
56
+ .join(' ')
57
+ .replace(/\s{2,}/g, ' ')
58
+ .trim();
59
+ if (!paragraphText)
60
+ return null;
61
+ return firstSentence(cleanText(paragraphText)) || null;
62
+ }
63
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
64
+ /**
65
+ * Strip inline markdown formatting:
66
+ * `code`, **bold**, *italic*, _italic_, ~~strikethrough~~, [text](url)
67
+ */
68
+ function cleanText(text) {
69
+ return text
70
+ .replace(/`[^`]*`/g, (m) => m.slice(1, -1)) // `code` → code
71
+ .replace(/\*\*([^*]+)\*\*/g, '$1') // **bold** → bold
72
+ .replace(/\*([^*]+)\*/g, '$1') // *italic* → italic
73
+ .replace(/_([^_]+)_/g, '$1') // _italic_ → italic
74
+ .replace(/~~([^~]+)~~/g, '$1') // ~~strike~~ → strike
75
+ .replace(/\[([^\]]+)\]\([^)]*\)/g, '$1') // [text](url) → text
76
+ .replace(/\s{2,}/g, ' ')
77
+ .trim();
78
+ }
79
+ /**
80
+ * Return text up to (and including) the first sentence-ending punctuation,
81
+ * or the full text if none found, capped at 120 chars.
82
+ */
83
+ function firstSentence(text) {
84
+ const match = text.match(/^(.{1,120}?[.!?])(?:\s|$)/);
85
+ if (match)
86
+ return match[1].trim();
87
+ return text.slice(0, 120).trim();
88
+ }
89
+ //# sourceMappingURL=docstring-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docstring-extractor.js","sourceRoot":"","sources":["../../src/summarizer/docstring-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CAAC,GAAW;IACrD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAE7B,6EAA6E;IAC7E,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACtB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;SAAM,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;SAAM,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IACjC,CAAC;IAED,4EAA4E;IAC5E,MAAM,KAAK,GAAG,IAAI;SACf,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAEjD,4EAA4E;IAC5E,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,4EAA4E;QAC5E,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACjE,MAAM,YAAY,GAAa,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,KAAK,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,MAAM;YACpC,IAAI,KAAK,CAAC,CAAC,CAAC;gBAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,QAAQ;YAAE,OAAO,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,4EAA4E;IAC5E,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,MAAM,CAAG,gBAAgB;QACnD,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,0EAA0E;IAC1E,MAAM,aAAa,GAAG,cAAc;SACjC,IAAI,CAAC,GAAG,CAAC;SACT,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,IAAI,EAAE,CAAC;IAEV,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAEhC,OAAO,aAAa,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,IAAI,IAAI,CAAC;AACzD,CAAC;AAED,iFAAiF;AAEjF;;;GAGG;AACH,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI;SACR,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAG,gBAAgB;SAC7D,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAc,kBAAkB;SACjE,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAkB,oBAAoB;SACnE,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAoB,oBAAoB;SACnE,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAkB,sBAAsB;SACrE,OAAO,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAQ,qBAAqB;SACpE,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACtD,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Embedding provider abstraction for semantic search.
3
+ *
4
+ * Supports:
5
+ * voyage — Voyage AI (voyage-code-2; recommended for code)
6
+ * openai-compatible — any /v1/embeddings endpoint (Ollama, OpenAI, etc.)
7
+ *
8
+ * Returns null when no provider is configured.
9
+ */
10
+ import type { PureContextConfig } from '../config/config-schema.js';
11
+ export interface EmbeddingProvider {
12
+ /** Embed one or more texts. Returns one float array per input text. */
13
+ embed(texts: string[]): Promise<number[][]>;
14
+ }
15
+ /**
16
+ * Compute cosine similarity between two float vectors.
17
+ * Both vectors must have the same length. Returns a value in [-1, 1].
18
+ */
19
+ export declare function cosineSimilarity(a: number[], b: number[]): number;
20
+ /** Serialize a number[] to a Buffer of 32-bit floats (little-endian). */
21
+ export declare function packEmbedding(vec: number[]): Buffer;
22
+ /** Deserialize a Buffer of 32-bit floats back to number[]. */
23
+ export declare function unpackEmbedding(buf: Buffer): number[];
24
+ /**
25
+ * Create an embedding provider from the active config, or return null
26
+ * if no embedding provider is configured.
27
+ */
28
+ export declare function createEmbeddingProvider(config: PureContextConfig): EmbeddingProvider | null;
29
+ //# sourceMappingURL=embeddings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/summarizer/embeddings.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAIpE,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;CAC7C;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAYjE;AAID,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,CAGnD;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAGrD;AAuED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,GAAG,IAAI,CA4B3F"}