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,64 @@
1
+ import { readFileSync, writeFileSync, renameSync, mkdirSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { randomUUID } from 'node:crypto';
5
+ import { StorageError } from '../errors.js';
6
+ // ─── Path override (for testing) ─────────────────────────────────────────────
7
+ let _pathOverride = null;
8
+ let _dirInitialized = false;
9
+ export function _setSavingsPathForTesting(path) {
10
+ _pathOverride = path;
11
+ _dirInitialized = false; // reset so the new dir is created on next save
12
+ }
13
+ function getSavingsPath() {
14
+ if (_pathOverride !== null)
15
+ return _pathOverride;
16
+ return join(homedir(), '.purecontext', '_savings.json');
17
+ }
18
+ function getSavingsDir() {
19
+ if (_pathOverride !== null)
20
+ return join(_pathOverride, '..');
21
+ return join(homedir(), '.purecontext');
22
+ }
23
+ function ensureDir() {
24
+ if (_dirInitialized)
25
+ return;
26
+ mkdirSync(getSavingsDir(), { recursive: true });
27
+ _dirInitialized = true;
28
+ }
29
+ // ─── Public API ───────────────────────────────────────────────────────────────
30
+ export function loadSavings() {
31
+ const path = getSavingsPath();
32
+ if (!existsSync(path)) {
33
+ return {
34
+ total_tokens_saved: 0,
35
+ anon_id: randomUUID(),
36
+ last_updated: new Date().toISOString(),
37
+ };
38
+ }
39
+ try {
40
+ const raw = readFileSync(path, 'utf-8');
41
+ const parsed = JSON.parse(raw);
42
+ return {
43
+ total_tokens_saved: typeof parsed.total_tokens_saved === 'number' ? parsed.total_tokens_saved : 0,
44
+ anon_id: parsed.anon_id ?? randomUUID(),
45
+ last_updated: parsed.last_updated ?? new Date().toISOString(),
46
+ };
47
+ }
48
+ catch (err) {
49
+ throw new StorageError('Failed to load savings data', 'loadSavings', err);
50
+ }
51
+ }
52
+ export function saveSavings(data) {
53
+ const path = getSavingsPath();
54
+ const tmpPath = `${path}.tmp`;
55
+ try {
56
+ ensureDir();
57
+ writeFileSync(tmpPath, JSON.stringify(data, null, 2), 'utf-8');
58
+ renameSync(tmpPath, path);
59
+ }
60
+ catch (err) {
61
+ throw new StorageError('Failed to save savings data', 'saveSavings', err);
62
+ }
63
+ }
64
+ //# sourceMappingURL=savings-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"savings-store.js","sourceRoot":"","sources":["../../../src/core/db/savings-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAU5C,gFAAgF;AAEhF,IAAI,aAAa,GAAkB,IAAI,CAAC;AACxC,IAAI,eAAe,GAAG,KAAK,CAAC;AAE5B,MAAM,UAAU,yBAAyB,CAAC,IAAmB;IAC3D,aAAa,GAAG,IAAI,CAAC;IACrB,eAAe,GAAG,KAAK,CAAC,CAAC,+CAA+C;AAC1E,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,aAAa,KAAK,IAAI;QAAE,OAAO,aAAa,CAAC;IACjD,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,aAAa;IACpB,IAAI,aAAa,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,SAAS;IAChB,IAAI,eAAe;QAAE,OAAO;IAC5B,SAAS,CAAC,aAAa,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,eAAe,GAAG,IAAI,CAAC;AACzB,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,WAAW;IACzB,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAE9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,kBAAkB,EAAE,CAAC;YACrB,OAAO,EAAE,UAAU,EAAE;YACrB,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACvC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QACvD,OAAO;YACL,kBAAkB,EAAE,OAAO,MAAM,CAAC,kBAAkB,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACjG,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,UAAU,EAAE;YACvC,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAC9D,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,YAAY,CAAC,6BAA6B,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAiB;IAC3C,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,GAAG,IAAI,MAAM,CAAC;IAE9B,IAAI,CAAC;QACH,SAAS,EAAE,CAAC;QACZ,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/D,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,YAAY,CAAC,6BAA6B,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { RepoMetadata } from '../types.js';
2
+ import type _BetterSqlite3 from 'better-sqlite3';
3
+ type DatabaseConstructor = typeof _BetterSqlite3;
4
+ export declare const SCHEMA_VERSION = 3;
5
+ export declare function computeRepoId(absolutePath: string): string;
6
+ export declare function getIndexDir(): string;
7
+ export declare function openDatabase(repoId: string, indexDir?: string): InstanceType<DatabaseConstructor>;
8
+ export declare function openInMemoryDatabase(): InstanceType<DatabaseConstructor>;
9
+ export declare function initializeDatabase(db: InstanceType<DatabaseConstructor>): void;
10
+ export declare function upsertRepo(db: InstanceType<DatabaseConstructor>, meta: RepoMetadata): void;
11
+ export declare function getRepo(db: InstanceType<DatabaseConstructor>, repoId: string): RepoMetadata | null;
12
+ export declare function listRepos(db: InstanceType<DatabaseConstructor>): RepoMetadata[];
13
+ export {};
14
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/core/db/schema.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAahD,OAAO,KAAK,cAAc,MAAM,gBAAgB,CAAC;AACjD,KAAK,mBAAmB,GAAG,OAAO,cAAc,CAAC;AAoBjD,eAAO,MAAM,cAAc,IAAI,CAAC;AA4EhC,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,WAAW,IAAI,MAAM,CAIpC;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAOjG;AAED,wBAAgB,oBAAoB,IAAI,YAAY,CAAC,mBAAmB,CAAC,CAKxE;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,YAAY,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAI9E;AAuED,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAwB1F;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAKlG;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,YAAY,CAAC,mBAAmB,CAAC,GAAG,YAAY,EAAE,CAE/E"}
@@ -0,0 +1,235 @@
1
+ import { createRequire } from 'module';
2
+ import { createHash } from 'crypto';
3
+ import { mkdirSync } from 'fs';
4
+ import { homedir } from 'os';
5
+ import { join } from 'path';
6
+ import { EMBEDDINGS_DDL } from './embedding-store.js';
7
+ import { NativeDependencyError } from '../errors.js';
8
+ // ─── Lazy-load better-sqlite3 ─────────────────────────────────────────────────
9
+ // We defer the native-addon load so any binary mismatch throws a
10
+ // NativeDependencyError (with an actionable user message) rather than an
11
+ // opaque module-load crash.
12
+ const _require = createRequire(import.meta.url);
13
+ let _Database = null;
14
+ let _dbLoadError = null;
15
+ let _dbLoaded = false;
16
+ function getDatabase() {
17
+ if (!_dbLoaded) {
18
+ try {
19
+ _Database = _require('better-sqlite3');
20
+ }
21
+ catch (err) {
22
+ _dbLoadError = err;
23
+ }
24
+ _dbLoaded = true;
25
+ }
26
+ if (_dbLoadError !== null || _Database === null) {
27
+ throw new NativeDependencyError(_dbLoadError);
28
+ }
29
+ return _Database;
30
+ }
31
+ export const SCHEMA_VERSION = 3;
32
+ const DDL = `
33
+ PRAGMA journal_mode = WAL;
34
+ PRAGMA foreign_keys = ON;
35
+
36
+ CREATE TABLE IF NOT EXISTS repos (
37
+ id TEXT PRIMARY KEY,
38
+ root_path TEXT NOT NULL UNIQUE,
39
+ symbol_count INTEGER NOT NULL DEFAULT 0,
40
+ file_count INTEGER NOT NULL DEFAULT 0,
41
+ languages TEXT NOT NULL DEFAULT '[]',
42
+ indexed_at INTEGER NOT NULL,
43
+ schema_version INTEGER NOT NULL,
44
+ tenant_id TEXT NOT NULL DEFAULT 'local'
45
+ );
46
+
47
+ CREATE TABLE IF NOT EXISTS files (
48
+ repo_id TEXT NOT NULL,
49
+ path TEXT NOT NULL,
50
+ content_hash TEXT NOT NULL,
51
+ raw_content BLOB,
52
+ indexed_at INTEGER NOT NULL,
53
+ tenant_id TEXT NOT NULL DEFAULT 'local',
54
+ PRIMARY KEY (repo_id, path),
55
+ FOREIGN KEY (repo_id) REFERENCES repos(id) ON DELETE CASCADE
56
+ );
57
+
58
+ CREATE TABLE IF NOT EXISTS symbols (
59
+ id TEXT NOT NULL,
60
+ repo_id TEXT NOT NULL,
61
+ name TEXT NOT NULL,
62
+ kind TEXT NOT NULL,
63
+ file_path TEXT NOT NULL,
64
+ start_byte INTEGER NOT NULL,
65
+ end_byte INTEGER NOT NULL,
66
+ signature TEXT NOT NULL DEFAULT '',
67
+ summary TEXT NOT NULL DEFAULT '',
68
+ framework_meta TEXT,
69
+ indexed_at INTEGER NOT NULL,
70
+ tenant_id TEXT NOT NULL DEFAULT 'local',
71
+ PRIMARY KEY (id, repo_id),
72
+ FOREIGN KEY (repo_id) REFERENCES repos(id) ON DELETE CASCADE
73
+ );
74
+
75
+ CREATE TABLE IF NOT EXISTS dep_edges (
76
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
77
+ repo_id TEXT NOT NULL,
78
+ source_file TEXT NOT NULL,
79
+ source_symbol_id TEXT,
80
+ target_file TEXT NOT NULL,
81
+ target_symbol_id TEXT,
82
+ edge_type TEXT NOT NULL,
83
+ specifier TEXT NOT NULL,
84
+ tenant_id TEXT NOT NULL DEFAULT 'local',
85
+ FOREIGN KEY (repo_id) REFERENCES repos(id) ON DELETE CASCADE
86
+ );
87
+
88
+ CREATE INDEX IF NOT EXISTS idx_symbols_repo_name ON symbols(repo_id, name);
89
+ CREATE INDEX IF NOT EXISTS idx_symbols_repo_file ON symbols(repo_id, file_path);
90
+ CREATE INDEX IF NOT EXISTS idx_symbols_repo_kind ON symbols(repo_id, kind);
91
+ CREATE INDEX IF NOT EXISTS idx_dep_edges_source ON dep_edges(repo_id, source_file);
92
+ CREATE INDEX IF NOT EXISTS idx_dep_edges_target ON dep_edges(repo_id, target_file);
93
+ CREATE INDEX IF NOT EXISTS idx_dep_edges_target_sym ON dep_edges(repo_id, target_symbol_id)
94
+ WHERE target_symbol_id IS NOT NULL;
95
+
96
+ CREATE VIRTUAL TABLE IF NOT EXISTS fts_symbols USING fts5(
97
+ symbol_id UNINDEXED,
98
+ repo_id UNINDEXED,
99
+ content,
100
+ tokenize = 'porter ascii'
101
+ );
102
+ `;
103
+ // ─── Database factory ─────────────────────────────────────────────────────────
104
+ export function computeRepoId(absolutePath) {
105
+ return createHash('sha256').update(absolutePath).digest('hex').slice(0, 16);
106
+ }
107
+ export function getIndexDir() {
108
+ const dataDir = process.env['PCTX_DATA_DIR'];
109
+ if (dataDir)
110
+ return join(dataDir, 'indexes');
111
+ return join(homedir(), '.purecontext', 'indexes');
112
+ }
113
+ export function openDatabase(repoId, indexDir) {
114
+ const DB = getDatabase();
115
+ const dir = indexDir ?? getIndexDir();
116
+ mkdirSync(dir, { recursive: true });
117
+ const db = new DB(join(dir, `${repoId}.db`));
118
+ initializeDatabase(db);
119
+ return db;
120
+ }
121
+ export function openInMemoryDatabase() {
122
+ const DB = getDatabase();
123
+ const db = new DB(':memory:');
124
+ initializeDatabase(db);
125
+ return db;
126
+ }
127
+ export function initializeDatabase(db) {
128
+ db.exec(DDL);
129
+ db.exec(EMBEDDINGS_DDL);
130
+ runMigrations(db);
131
+ }
132
+ // ─── Migrations ───────────────────────────────────────────────────────────────
133
+ function runMigrations(db) {
134
+ // Read the highest schema_version present in repos (if any rows exist).
135
+ // If the table is empty or new, no migration needed — rows are written at
136
+ // SCHEMA_VERSION by callers.
137
+ const row = db.prepare('SELECT MAX(schema_version) AS v FROM repos').get();
138
+ const dbVersion = row?.v ?? 0;
139
+ // Migration v1 → v2: add clone_path column to repos table.
140
+ if (dbVersion < 2) {
141
+ // SQLite doesn't support IF NOT EXISTS for ADD COLUMN — check first.
142
+ const repoCols = db.prepare("PRAGMA table_info(repos)").all();
143
+ if (!repoCols.some((c) => c.name === 'clone_path')) {
144
+ db.exec('ALTER TABLE repos ADD COLUMN clone_path TEXT');
145
+ }
146
+ // Add embedding column to symbols table.
147
+ const symCols = db.prepare("PRAGMA table_info(symbols)").all();
148
+ if (!symCols.some((c) => c.name === 'embedding')) {
149
+ db.exec('ALTER TABLE symbols ADD COLUMN embedding BLOB');
150
+ }
151
+ // The fts_symbols virtual table is created by the DDL above (IF NOT EXISTS).
152
+ }
153
+ // Migration v2 → v3: add tenant_id to all data tables.
154
+ // Existing rows migrate to the default 'local' tenant.
155
+ if (dbVersion < 3) {
156
+ const repoCols = db.prepare("PRAGMA table_info(repos)").all();
157
+ if (!repoCols.some((c) => c.name === 'tenant_id')) {
158
+ db.exec("ALTER TABLE repos ADD COLUMN tenant_id TEXT NOT NULL DEFAULT 'local'");
159
+ }
160
+ const fileCols = db.prepare("PRAGMA table_info(files)").all();
161
+ if (!fileCols.some((c) => c.name === 'tenant_id')) {
162
+ db.exec("ALTER TABLE files ADD COLUMN tenant_id TEXT NOT NULL DEFAULT 'local'");
163
+ }
164
+ const symCols = db.prepare("PRAGMA table_info(symbols)").all();
165
+ if (!symCols.some((c) => c.name === 'tenant_id')) {
166
+ db.exec("ALTER TABLE symbols ADD COLUMN tenant_id TEXT NOT NULL DEFAULT 'local'");
167
+ }
168
+ const edgeCols = db.prepare("PRAGMA table_info(dep_edges)").all();
169
+ if (!edgeCols.some((c) => c.name === 'tenant_id')) {
170
+ db.exec("ALTER TABLE dep_edges ADD COLUMN tenant_id TEXT NOT NULL DEFAULT 'local'");
171
+ }
172
+ // Add tenant_id to embeddings table (created by EMBEDDINGS_DDL, not DDL above).
173
+ const embCols = db.prepare("PRAGMA table_info(embeddings)").all();
174
+ if (embCols.length > 0 && !embCols.some((c) => c.name === 'tenant_id')) {
175
+ db.exec("ALTER TABLE embeddings ADD COLUMN tenant_id TEXT NOT NULL DEFAULT 'local'");
176
+ }
177
+ // Add tenant index on symbols (may already exist on fresh DBs from DDL).
178
+ try {
179
+ db.exec('CREATE INDEX IF NOT EXISTS idx_symbols_tenant ON symbols(tenant_id, repo_id)');
180
+ db.exec('CREATE INDEX IF NOT EXISTS idx_files_tenant ON files(tenant_id, repo_id)');
181
+ db.exec('CREATE INDEX IF NOT EXISTS idx_dep_edges_tenant ON dep_edges(tenant_id, repo_id)');
182
+ db.exec('CREATE INDEX IF NOT EXISTS idx_embeddings_tenant ON embeddings(tenant_id, repo_id)');
183
+ }
184
+ catch {
185
+ // Indexes already exist — ignore
186
+ }
187
+ }
188
+ }
189
+ // ─── Repo operations ──────────────────────────────────────────────────────────
190
+ export function upsertRepo(db, meta) {
191
+ db.prepare(`
192
+ INSERT INTO repos (id, root_path, symbol_count, file_count, languages, indexed_at, schema_version, clone_path, tenant_id)
193
+ VALUES (@id, @rootPath, @symbolCount, @fileCount, @languages, @indexedAt, @schemaVersion, @clonePath, @tenantId)
194
+ ON CONFLICT(id) DO UPDATE SET
195
+ root_path = excluded.root_path,
196
+ symbol_count = excluded.symbol_count,
197
+ file_count = excluded.file_count,
198
+ languages = excluded.languages,
199
+ indexed_at = excluded.indexed_at,
200
+ schema_version = excluded.schema_version,
201
+ clone_path = excluded.clone_path,
202
+ tenant_id = excluded.tenant_id
203
+ `).run({
204
+ id: meta.id,
205
+ rootPath: meta.rootPath,
206
+ symbolCount: meta.symbolCount,
207
+ fileCount: meta.fileCount,
208
+ languages: JSON.stringify(meta.languages),
209
+ indexedAt: meta.indexedAt,
210
+ schemaVersion: meta.schemaVersion,
211
+ clonePath: meta.clonePath ?? null,
212
+ tenantId: meta.tenantId ?? 'local',
213
+ });
214
+ }
215
+ export function getRepo(db, repoId) {
216
+ const row = db.prepare('SELECT * FROM repos WHERE id = ?').get(repoId);
217
+ return row ? rowToRepo(row) : null;
218
+ }
219
+ export function listRepos(db) {
220
+ return db.prepare('SELECT * FROM repos ORDER BY indexed_at DESC').all().map(rowToRepo);
221
+ }
222
+ function rowToRepo(row) {
223
+ return {
224
+ id: row.id,
225
+ rootPath: row.root_path,
226
+ symbolCount: row.symbol_count,
227
+ fileCount: row.file_count,
228
+ languages: JSON.parse(row.languages),
229
+ indexedAt: row.indexed_at,
230
+ schemaVersion: row.schema_version,
231
+ clonePath: row.clone_path ?? null,
232
+ tenantId: row.tenant_id ?? 'local',
233
+ };
234
+ }
235
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/core/db/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { SymbolRecord, SymbolKind } from '../types.js';
3
+ export interface SearchOptions {
4
+ kind?: SymbolKind;
5
+ filePath?: string;
6
+ limit?: number;
7
+ /** When provided, results are filtered to this tenant only. */
8
+ tenantId?: string;
9
+ }
10
+ export declare function insertSymbols(db: Database.Database, repoId: string, symbols: SymbolRecord[], tenantId?: string): void;
11
+ export declare function searchSymbols(db: Database.Database, repoId: string, query: string, options?: SearchOptions): SymbolRecord[];
12
+ export declare function getSymbolById(db: Database.Database, repoId: string, id: string, tenantId?: string): SymbolRecord | null;
13
+ export declare function getSymbolsByFile(db: Database.Database, repoId: string, filePath: string, tenantId?: string): SymbolRecord[];
14
+ export declare function getSymbolsByRepo(db: Database.Database, repoId: string, limit?: number, tenantId?: string): SymbolRecord[];
15
+ export declare function deleteByFile(db: Database.Database, repoId: string, filePath: string): void;
16
+ /**
17
+ * Store packed embedding bytes for a symbol.
18
+ * Embeddings are stored as raw Float32Array bytes (4 bytes per dimension).
19
+ */
20
+ export declare function upsertEmbedding(db: Database.Database, repoId: string, symbolId: string, embedding: Buffer): void;
21
+ /**
22
+ * Load all symbols that have stored embeddings for a repo.
23
+ * Returns { symbol, embedding } pairs.
24
+ */
25
+ export declare function getSymbolsWithEmbeddings(db: Database.Database, repoId: string): Array<{
26
+ symbol: SymbolRecord;
27
+ embedding: Buffer;
28
+ }>;
29
+ /**
30
+ * Insert/replace a symbol into the FTS5 full-text search index.
31
+ * Content = name + signature + summary (space-joined for broad matching).
32
+ */
33
+ export declare function upsertFtsSymbol(db: Database.Database, repoId: string, symbol: SymbolRecord): void;
34
+ /**
35
+ * Bulk-insert symbols into the FTS5 index. Replaces any existing entries.
36
+ */
37
+ export declare function bulkUpsertFtsSymbols(db: Database.Database, repoId: string, symbols: SymbolRecord[]): void;
38
+ export interface FtsSearchOptions {
39
+ kind?: SymbolKind;
40
+ filePath?: string;
41
+ limit?: number;
42
+ tenantId?: string;
43
+ }
44
+ /**
45
+ * Search symbols using FTS5 full-text search.
46
+ * Returns matching SymbolRecords sorted by BM25 relevance (most relevant first).
47
+ */
48
+ export declare function ftsSearchSymbols(db: Database.Database, repoId: string, query: string, options?: FtsSearchOptions): SymbolRecord[];
49
+ /**
50
+ * Returns true if the FTS5 index has been populated for this repo.
51
+ * Used to decide whether to use FTS or fall back to LIKE search.
52
+ */
53
+ export declare function hasFtsIndex(db: Database.Database, repoId: string): boolean;
54
+ /**
55
+ * Delete FTS5 entries for all symbols in a file (called when a file is reindexed).
56
+ */
57
+ export declare function deleteFtsByFile(db: Database.Database, repoId: string, filePath: string): void;
58
+ /**
59
+ * Bulk-update the summary field for a set of symbols identified by id.
60
+ * Used by the AI summarizer (Stage 3) to apply generated summaries after
61
+ * indexing completes. Skips ids not present in the database.
62
+ */
63
+ export declare function updateSymbolSummaries(db: Database.Database, repoId: string, summaries: Map<string, string>): void;
64
+ //# sourceMappingURL=symbol-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-store.d.ts","sourceRoot":"","sources":["../../../src/core/db/symbol-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,243 @@
1
+ import { StorageError } from '../errors.js';
2
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
3
+ /** Extract the file stem (basename without extension) from a relative file path. */
4
+ function getFileStem(filePath) {
5
+ const base = filePath.replace(/\\/g, '/').split('/').pop() ?? filePath;
6
+ const dot = base.lastIndexOf('.');
7
+ return dot > 0 ? base.slice(0, dot) : base;
8
+ }
9
+ function rowToSymbol(row) {
10
+ return {
11
+ id: row.id,
12
+ name: row.name,
13
+ kind: row.kind,
14
+ filePath: row.file_path,
15
+ startByte: row.start_byte,
16
+ endByte: row.end_byte,
17
+ signature: row.signature,
18
+ summary: row.summary,
19
+ frameworkMeta: row.framework_meta
20
+ ? JSON.parse(row.framework_meta)
21
+ : undefined,
22
+ };
23
+ }
24
+ // ─── Operations ───────────────────────────────────────────────────────────────
25
+ export function insertSymbols(db, repoId, symbols, tenantId = 'local') {
26
+ if (symbols.length === 0)
27
+ return;
28
+ const stmt = db.prepare(`
29
+ INSERT OR REPLACE INTO symbols
30
+ (id, repo_id, name, kind, file_path, start_byte, end_byte, signature, summary, framework_meta, indexed_at, tenant_id)
31
+ VALUES
32
+ (@id, @repoId, @name, @kind, @filePath, @startByte, @endByte, @signature, @summary, @frameworkMeta, @indexedAt, @tenantId)
33
+ `);
34
+ const now = Date.now();
35
+ const delFts = db.prepare('DELETE FROM fts_symbols WHERE symbol_id = ? AND repo_id = ?');
36
+ const insFts = db.prepare('INSERT INTO fts_symbols (symbol_id, repo_id, content) VALUES (?, ?, ?)');
37
+ const insert = db.transaction((rows) => {
38
+ for (const s of rows) {
39
+ try {
40
+ stmt.run({
41
+ id: s.id,
42
+ repoId,
43
+ name: s.name,
44
+ kind: s.kind,
45
+ filePath: s.filePath,
46
+ startByte: s.startByte,
47
+ endByte: s.endByte,
48
+ signature: s.signature,
49
+ summary: s.summary,
50
+ frameworkMeta: s.frameworkMeta ? JSON.stringify(s.frameworkMeta) : null,
51
+ indexedAt: now,
52
+ tenantId,
53
+ });
54
+ // Keep FTS5 index in sync
55
+ delFts.run(s.id, repoId);
56
+ insFts.run(s.id, repoId, `${s.name} ${getFileStem(s.filePath)} ${s.signature} ${s.summary}`);
57
+ }
58
+ catch (err) {
59
+ throw new StorageError(`Failed to insert symbol "${s.name}"`, 'insertSymbols', err);
60
+ }
61
+ }
62
+ });
63
+ insert(symbols);
64
+ }
65
+ export function searchSymbols(db, repoId, query, options = {}) {
66
+ const { kind, filePath, limit = 50, tenantId } = options;
67
+ const parts = ['repo_id = ?'];
68
+ const params = [repoId];
69
+ parts.push('name LIKE ?');
70
+ params.push(`%${query}%`);
71
+ if (kind) {
72
+ parts.push('kind = ?');
73
+ params.push(kind);
74
+ }
75
+ if (filePath) {
76
+ parts.push('file_path = ?');
77
+ params.push(filePath);
78
+ }
79
+ if (tenantId !== undefined) {
80
+ parts.push('tenant_id = ?');
81
+ params.push(tenantId);
82
+ }
83
+ const sql = `SELECT * FROM symbols WHERE ${parts.join(' AND ')} ORDER BY name LIMIT ?`;
84
+ params.push(limit);
85
+ return db.prepare(sql).all(...params).map(rowToSymbol);
86
+ }
87
+ export function getSymbolById(db, repoId, id, tenantId) {
88
+ if (tenantId !== undefined) {
89
+ const row = db.prepare('SELECT * FROM symbols WHERE repo_id = ? AND id = ? AND tenant_id = ?').get(repoId, id, tenantId);
90
+ return row ? rowToSymbol(row) : null;
91
+ }
92
+ const row = db.prepare('SELECT * FROM symbols WHERE repo_id = ? AND id = ?').get(repoId, id);
93
+ return row ? rowToSymbol(row) : null;
94
+ }
95
+ export function getSymbolsByFile(db, repoId, filePath, tenantId) {
96
+ if (tenantId !== undefined) {
97
+ return db
98
+ .prepare('SELECT * FROM symbols WHERE repo_id = ? AND file_path = ? AND tenant_id = ? ORDER BY start_byte')
99
+ .all(repoId, filePath, tenantId)
100
+ .map(rowToSymbol);
101
+ }
102
+ return db
103
+ .prepare('SELECT * FROM symbols WHERE repo_id = ? AND file_path = ? ORDER BY start_byte')
104
+ .all(repoId, filePath)
105
+ .map(rowToSymbol);
106
+ }
107
+ export function getSymbolsByRepo(db, repoId, limit = 1000, tenantId) {
108
+ if (tenantId !== undefined) {
109
+ return db
110
+ .prepare('SELECT * FROM symbols WHERE repo_id = ? AND tenant_id = ? ORDER BY file_path, start_byte LIMIT ?')
111
+ .all(repoId, tenantId, limit)
112
+ .map(rowToSymbol);
113
+ }
114
+ return db
115
+ .prepare('SELECT * FROM symbols WHERE repo_id = ? ORDER BY file_path, start_byte LIMIT ?')
116
+ .all(repoId, limit)
117
+ .map(rowToSymbol);
118
+ }
119
+ export function deleteByFile(db, repoId, filePath) {
120
+ // Remove from FTS first (needs symbol IDs which exist before main delete)
121
+ deleteFtsByFile(db, repoId, filePath);
122
+ db.prepare('DELETE FROM symbols WHERE repo_id = ? AND file_path = ?').run(repoId, filePath);
123
+ }
124
+ /**
125
+ * Store packed embedding bytes for a symbol.
126
+ * Embeddings are stored as raw Float32Array bytes (4 bytes per dimension).
127
+ */
128
+ export function upsertEmbedding(db, repoId, symbolId, embedding) {
129
+ db.prepare('UPDATE symbols SET embedding = ? WHERE repo_id = ? AND id = ?').run(embedding, repoId, symbolId);
130
+ }
131
+ /**
132
+ * Load all symbols that have stored embeddings for a repo.
133
+ * Returns { symbol, embedding } pairs.
134
+ */
135
+ export function getSymbolsWithEmbeddings(db, repoId) {
136
+ const rows = db
137
+ .prepare('SELECT * FROM symbols WHERE repo_id = ? AND embedding IS NOT NULL')
138
+ .all(repoId);
139
+ return rows
140
+ .filter((r) => r.embedding !== null)
141
+ .map((r) => ({ symbol: rowToSymbol(r), embedding: r.embedding }));
142
+ }
143
+ // ─── FTS5 operations ──────────────────────────────────────────────────────────
144
+ /**
145
+ * Insert/replace a symbol into the FTS5 full-text search index.
146
+ * Content = name + signature + summary (space-joined for broad matching).
147
+ */
148
+ export function upsertFtsSymbol(db, repoId, symbol) {
149
+ // Delete any existing entry first (FTS5 doesn't support UPSERT).
150
+ db.prepare('DELETE FROM fts_symbols WHERE symbol_id = ? AND repo_id = ?').run(symbol.id, repoId);
151
+ db.prepare('INSERT INTO fts_symbols (symbol_id, repo_id, content) VALUES (?, ?, ?)').run(symbol.id, repoId, `${symbol.name} ${getFileStem(symbol.filePath)} ${symbol.signature} ${symbol.summary}`);
152
+ }
153
+ /**
154
+ * Bulk-insert symbols into the FTS5 index. Replaces any existing entries.
155
+ */
156
+ export function bulkUpsertFtsSymbols(db, repoId, symbols) {
157
+ if (symbols.length === 0)
158
+ return;
159
+ const del = db.prepare('DELETE FROM fts_symbols WHERE symbol_id = ? AND repo_id = ?');
160
+ const ins = db.prepare('INSERT INTO fts_symbols (symbol_id, repo_id, content) VALUES (?, ?, ?)');
161
+ const upsert = db.transaction((rows) => {
162
+ for (const s of rows) {
163
+ del.run(s.id, repoId);
164
+ ins.run(s.id, repoId, `${s.name} ${getFileStem(s.filePath)} ${s.signature} ${s.summary}`);
165
+ }
166
+ });
167
+ upsert(symbols);
168
+ }
169
+ /**
170
+ * Search symbols using FTS5 full-text search.
171
+ * Returns matching SymbolRecords sorted by BM25 relevance (most relevant first).
172
+ */
173
+ export function ftsSearchSymbols(db, repoId, query, options = {}) {
174
+ const { kind, filePath, limit = 20, tenantId } = options;
175
+ const parts = ['f.repo_id = ?', 'fts_symbols MATCH ?'];
176
+ const params = [repoId, query];
177
+ if (tenantId !== undefined) {
178
+ parts.push('s.tenant_id = ?');
179
+ params.push(tenantId);
180
+ }
181
+ if (kind) {
182
+ parts.push('s.kind = ?');
183
+ params.push(kind);
184
+ }
185
+ if (filePath) {
186
+ parts.push('s.file_path LIKE ?');
187
+ params.push(filePath);
188
+ }
189
+ params.push(limit);
190
+ const sql = `
191
+ SELECT s.*
192
+ FROM symbols s
193
+ JOIN fts_symbols f ON f.symbol_id = s.id AND f.repo_id = s.repo_id
194
+ WHERE ${parts.join(' AND ')}
195
+ ORDER BY bm25(fts_symbols)
196
+ LIMIT ?
197
+ `;
198
+ return db.prepare(sql).all(...params).map(rowToSymbol);
199
+ }
200
+ /**
201
+ * Returns true if the FTS5 index has been populated for this repo.
202
+ * Used to decide whether to use FTS or fall back to LIKE search.
203
+ */
204
+ export function hasFtsIndex(db, repoId) {
205
+ const row = db
206
+ .prepare('SELECT COUNT(*) AS c FROM fts_symbols WHERE repo_id = ?')
207
+ .get(repoId);
208
+ return (row?.c ?? 0) > 0;
209
+ }
210
+ /**
211
+ * Delete FTS5 entries for all symbols in a file (called when a file is reindexed).
212
+ */
213
+ export function deleteFtsByFile(db, repoId, filePath) {
214
+ // Look up symbol IDs for this file, then delete from FTS.
215
+ const ids = db
216
+ .prepare('SELECT id FROM symbols WHERE repo_id = ? AND file_path = ?')
217
+ .all(repoId, filePath)
218
+ .map((r) => r.id);
219
+ const del = db.prepare('DELETE FROM fts_symbols WHERE symbol_id = ? AND repo_id = ?');
220
+ const cleanup = db.transaction((idList) => {
221
+ for (const id of idList) {
222
+ del.run(id, repoId);
223
+ }
224
+ });
225
+ cleanup(ids);
226
+ }
227
+ /**
228
+ * Bulk-update the summary field for a set of symbols identified by id.
229
+ * Used by the AI summarizer (Stage 3) to apply generated summaries after
230
+ * indexing completes. Skips ids not present in the database.
231
+ */
232
+ export function updateSymbolSummaries(db, repoId, summaries) {
233
+ if (summaries.size === 0)
234
+ return;
235
+ const stmt = db.prepare('UPDATE symbols SET summary = ? WHERE repo_id = ? AND id = ?');
236
+ const update = db.transaction((entries) => {
237
+ for (const [id, summary] of entries) {
238
+ stmt.run(summary, repoId, id);
239
+ }
240
+ });
241
+ update([...summaries.entries()]);
242
+ }
243
+ //# sourceMappingURL=symbol-store.js.map