tea-rags 1.24.0 → 1.25.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 (244) hide show
  1. package/README.md +26 -0
  2. package/build/bootstrap/factory.d.ts.map +1 -1
  3. package/build/bootstrap/factory.js +15 -0
  4. package/build/bootstrap/factory.js.map +1 -1
  5. package/build/cli/commands/doctor.d.ts +39 -0
  6. package/build/cli/commands/doctor.d.ts.map +1 -0
  7. package/build/cli/commands/doctor.js +136 -0
  8. package/build/cli/commands/doctor.js.map +1 -0
  9. package/build/cli/commands/prime.d.ts +2 -1
  10. package/build/cli/commands/prime.d.ts.map +1 -1
  11. package/build/cli/commands/prime.js +9 -5
  12. package/build/cli/commands/prime.js.map +1 -1
  13. package/build/cli/commands/projects.d.ts +48 -0
  14. package/build/cli/commands/projects.d.ts.map +1 -0
  15. package/build/cli/commands/projects.js +216 -0
  16. package/build/cli/commands/projects.js.map +1 -0
  17. package/build/cli/commands/tune.d.ts +1 -0
  18. package/build/cli/commands/tune.d.ts.map +1 -1
  19. package/build/cli/commands/tune.js +32 -10
  20. package/build/cli/commands/tune.js.map +1 -1
  21. package/build/cli/completion.d.ts +23 -0
  22. package/build/cli/completion.d.ts.map +1 -0
  23. package/build/cli/completion.js +75 -0
  24. package/build/cli/completion.js.map +1 -0
  25. package/build/cli/create-cli.d.ts.map +1 -1
  26. package/build/cli/create-cli.js +26 -1
  27. package/build/cli/create-cli.js.map +1 -1
  28. package/build/cli/prime/format.js +6 -0
  29. package/build/cli/prime/format.js.map +1 -1
  30. package/build/cli/prime/run-prime.d.ts +9 -1
  31. package/build/cli/prime/run-prime.d.ts.map +1 -1
  32. package/build/cli/prime/run-prime.js +43 -2
  33. package/build/cli/prime/run-prime.js.map +1 -1
  34. package/build/cli/prime/types.d.ts +2 -0
  35. package/build/cli/prime/types.d.ts.map +1 -1
  36. package/build/cli/qdrant-url-resolver.d.ts +31 -0
  37. package/build/cli/qdrant-url-resolver.d.ts.map +1 -0
  38. package/build/cli/qdrant-url-resolver.js +29 -0
  39. package/build/cli/qdrant-url-resolver.js.map +1 -0
  40. package/build/cli/registry-resolver.d.ts +24 -0
  41. package/build/cli/registry-resolver.d.ts.map +1 -0
  42. package/build/cli/registry-resolver.js +46 -0
  43. package/build/cli/registry-resolver.js.map +1 -0
  44. package/build/core/adapters/registry/errors.d.ts +59 -0
  45. package/build/core/adapters/registry/errors.d.ts.map +1 -0
  46. package/build/core/adapters/registry/errors.js +88 -0
  47. package/build/core/adapters/registry/errors.js.map +1 -0
  48. package/build/core/api/errors.d.ts +36 -0
  49. package/build/core/api/errors.d.ts.map +1 -1
  50. package/build/core/api/errors.js +77 -0
  51. package/build/core/api/errors.js.map +1 -1
  52. package/build/core/api/index.d.ts +2 -0
  53. package/build/core/api/index.d.ts.map +1 -1
  54. package/build/core/api/index.js +1 -0
  55. package/build/core/api/index.js.map +1 -1
  56. package/build/core/api/internal/composition.d.ts.map +1 -1
  57. package/build/core/api/internal/composition.js +7 -0
  58. package/build/core/api/internal/composition.js.map +1 -1
  59. package/build/core/api/internal/facades/explore-facade.d.ts +2 -0
  60. package/build/core/api/internal/facades/explore-facade.d.ts.map +1 -1
  61. package/build/core/api/internal/facades/explore-facade.js +1 -0
  62. package/build/core/api/internal/facades/explore-facade.js.map +1 -1
  63. package/build/core/api/internal/facades/ingest-facade.d.ts +3 -0
  64. package/build/core/api/internal/facades/ingest-facade.d.ts.map +1 -1
  65. package/build/core/api/internal/facades/ingest-facade.js +6 -2
  66. package/build/core/api/internal/facades/ingest-facade.js.map +1 -1
  67. package/build/core/api/internal/infra/schema-builder.d.ts +17 -0
  68. package/build/core/api/internal/infra/schema-builder.d.ts.map +1 -1
  69. package/build/core/api/internal/infra/schema-builder.js +27 -0
  70. package/build/core/api/internal/infra/schema-builder.js.map +1 -1
  71. package/build/core/api/internal/ops/explore-ops.d.ts +4 -0
  72. package/build/core/api/internal/ops/explore-ops.d.ts.map +1 -1
  73. package/build/core/api/internal/ops/explore-ops.js +25 -11
  74. package/build/core/api/internal/ops/explore-ops.js.map +1 -1
  75. package/build/core/api/internal/ops/project-registry-ops.d.ts +40 -0
  76. package/build/core/api/internal/ops/project-registry-ops.d.ts.map +1 -0
  77. package/build/core/api/internal/ops/project-registry-ops.js +217 -0
  78. package/build/core/api/internal/ops/project-registry-ops.js.map +1 -0
  79. package/build/core/api/public/app.d.ts +18 -0
  80. package/build/core/api/public/app.d.ts.map +1 -1
  81. package/build/core/api/public/app.js +4 -0
  82. package/build/core/api/public/app.js.map +1 -1
  83. package/build/core/api/public/dto/common.d.ts +13 -0
  84. package/build/core/api/public/dto/common.d.ts.map +1 -0
  85. package/build/core/api/public/dto/common.js +5 -0
  86. package/build/core/api/public/dto/common.js.map +1 -0
  87. package/build/core/api/public/dto/explore.d.ts +8 -6
  88. package/build/core/api/public/dto/explore.d.ts.map +1 -1
  89. package/build/core/api/public/dto/index.d.ts +2 -1
  90. package/build/core/api/public/dto/index.d.ts.map +1 -1
  91. package/build/core/api/public/dto/index.js.map +1 -1
  92. package/build/core/api/public/dto/ingest.d.ts +8 -0
  93. package/build/core/api/public/dto/ingest.d.ts.map +1 -1
  94. package/build/core/contracts/errors.d.ts +1 -1
  95. package/build/core/contracts/errors.d.ts.map +1 -1
  96. package/build/core/contracts/types/reranker.d.ts +7 -3
  97. package/build/core/contracts/types/reranker.d.ts.map +1 -1
  98. package/build/core/contracts/types/trajectory.d.ts +90 -10
  99. package/build/core/contracts/types/trajectory.d.ts.map +1 -1
  100. package/build/core/domains/explore/label-resolver.d.ts +21 -1
  101. package/build/core/domains/explore/label-resolver.d.ts.map +1 -1
  102. package/build/core/domains/explore/label-resolver.js +36 -2
  103. package/build/core/domains/explore/label-resolver.js.map +1 -1
  104. package/build/core/domains/explore/post-process.d.ts +1 -1
  105. package/build/core/domains/explore/post-process.d.ts.map +1 -1
  106. package/build/core/domains/explore/post-process.js +2 -2
  107. package/build/core/domains/explore/post-process.js.map +1 -1
  108. package/build/core/domains/explore/rank-module.js +1 -1
  109. package/build/core/domains/explore/rank-module.js.map +1 -1
  110. package/build/core/domains/explore/reranker.d.ts +77 -6
  111. package/build/core/domains/explore/reranker.d.ts.map +1 -1
  112. package/build/core/domains/explore/reranker.js +166 -12
  113. package/build/core/domains/explore/reranker.js.map +1 -1
  114. package/build/core/domains/explore/stats-recompute.d.ts +66 -0
  115. package/build/core/domains/explore/stats-recompute.d.ts.map +1 -0
  116. package/build/core/domains/explore/stats-recompute.js +241 -0
  117. package/build/core/domains/explore/stats-recompute.js.map +1 -0
  118. package/build/core/domains/explore/strategies/base.d.ts +1 -1
  119. package/build/core/domains/explore/strategies/base.d.ts.map +1 -1
  120. package/build/core/domains/explore/strategies/base.js +3 -3
  121. package/build/core/domains/explore/strategies/base.js.map +1 -1
  122. package/build/core/domains/explore/strategies/file-outline.d.ts +1 -1
  123. package/build/core/domains/explore/strategies/file-outline.d.ts.map +1 -1
  124. package/build/core/domains/explore/strategies/file-outline.js +2 -2
  125. package/build/core/domains/explore/strategies/file-outline.js.map +1 -1
  126. package/build/core/domains/explore/strategies/scroll-rank.d.ts +1 -1
  127. package/build/core/domains/explore/strategies/scroll-rank.d.ts.map +1 -1
  128. package/build/core/domains/explore/strategies/scroll-rank.js +1 -1
  129. package/build/core/domains/explore/strategies/scroll-rank.js.map +1 -1
  130. package/build/core/domains/explore/strategies/symbol.d.ts +1 -1
  131. package/build/core/domains/explore/strategies/symbol.d.ts.map +1 -1
  132. package/build/core/domains/explore/strategies/symbol.js +2 -2
  133. package/build/core/domains/explore/strategies/symbol.js.map +1 -1
  134. package/build/core/domains/ingest/collection-stats.d.ts +11 -0
  135. package/build/core/domains/ingest/collection-stats.d.ts.map +1 -1
  136. package/build/core/domains/ingest/collection-stats.js +79 -0
  137. package/build/core/domains/ingest/collection-stats.js.map +1 -1
  138. package/build/core/domains/ingest/indexing.d.ts.map +1 -1
  139. package/build/core/domains/ingest/indexing.js +2 -1
  140. package/build/core/domains/ingest/indexing.js.map +1 -1
  141. package/build/core/domains/ingest/pipeline/base.d.ts +18 -1
  142. package/build/core/domains/ingest/pipeline/base.d.ts.map +1 -1
  143. package/build/core/domains/ingest/pipeline/base.js +33 -1
  144. package/build/core/domains/ingest/pipeline/base.js.map +1 -1
  145. package/build/core/domains/ingest/pipeline/indexing-marker.d.ts +6 -1
  146. package/build/core/domains/ingest/pipeline/indexing-marker.d.ts.map +1 -1
  147. package/build/core/domains/ingest/pipeline/indexing-marker.js +14 -3
  148. package/build/core/domains/ingest/pipeline/indexing-marker.js.map +1 -1
  149. package/build/core/domains/ingest/reindexing.d.ts +2 -2
  150. package/build/core/domains/ingest/reindexing.d.ts.map +1 -1
  151. package/build/core/domains/ingest/reindexing.js +4 -3
  152. package/build/core/domains/ingest/reindexing.js.map +1 -1
  153. package/build/core/domains/trajectory/git/payload-signals.d.ts.map +1 -1
  154. package/build/core/domains/trajectory/git/payload-signals.js +39 -4
  155. package/build/core/domains/trajectory/git/payload-signals.js.map +1 -1
  156. package/build/core/domains/trajectory/git/rerank/derived-signals/bug-fix.d.ts +13 -4
  157. package/build/core/domains/trajectory/git/rerank/derived-signals/bug-fix.d.ts.map +1 -1
  158. package/build/core/domains/trajectory/git/rerank/derived-signals/bug-fix.js +21 -7
  159. package/build/core/domains/trajectory/git/rerank/derived-signals/bug-fix.js.map +1 -1
  160. package/build/core/domains/trajectory/git/rerank/derived-signals/density.d.ts +1 -2
  161. package/build/core/domains/trajectory/git/rerank/derived-signals/density.d.ts.map +1 -1
  162. package/build/core/domains/trajectory/git/rerank/derived-signals/density.js +5 -5
  163. package/build/core/domains/trajectory/git/rerank/derived-signals/density.js.map +1 -1
  164. package/build/core/domains/trajectory/git/rerank/derived-signals/helpers.d.ts +0 -1
  165. package/build/core/domains/trajectory/git/rerank/derived-signals/helpers.d.ts.map +1 -1
  166. package/build/core/domains/trajectory/git/rerank/derived-signals/helpers.js +0 -2
  167. package/build/core/domains/trajectory/git/rerank/derived-signals/helpers.js.map +1 -1
  168. package/build/core/domains/trajectory/git/rerank/derived-signals/knowledge-silo.d.ts +1 -2
  169. package/build/core/domains/trajectory/git/rerank/derived-signals/knowledge-silo.d.ts.map +1 -1
  170. package/build/core/domains/trajectory/git/rerank/derived-signals/knowledge-silo.js +5 -5
  171. package/build/core/domains/trajectory/git/rerank/derived-signals/knowledge-silo.js.map +1 -1
  172. package/build/core/domains/trajectory/git/rerank/derived-signals/ownership.d.ts +1 -2
  173. package/build/core/domains/trajectory/git/rerank/derived-signals/ownership.d.ts.map +1 -1
  174. package/build/core/domains/trajectory/git/rerank/derived-signals/ownership.js +5 -5
  175. package/build/core/domains/trajectory/git/rerank/derived-signals/ownership.js.map +1 -1
  176. package/build/core/domains/trajectory/git/rerank/derived-signals/recent-activity-concentration.d.ts +1 -2
  177. package/build/core/domains/trajectory/git/rerank/derived-signals/recent-activity-concentration.d.ts.map +1 -1
  178. package/build/core/domains/trajectory/git/rerank/derived-signals/recent-activity-concentration.js +5 -5
  179. package/build/core/domains/trajectory/git/rerank/derived-signals/recent-activity-concentration.js.map +1 -1
  180. package/build/core/domains/trajectory/git/rerank/derived-signals/relative-churn-norm.d.ts +1 -2
  181. package/build/core/domains/trajectory/git/rerank/derived-signals/relative-churn-norm.d.ts.map +1 -1
  182. package/build/core/domains/trajectory/git/rerank/derived-signals/relative-churn-norm.js +5 -5
  183. package/build/core/domains/trajectory/git/rerank/derived-signals/relative-churn-norm.js.map +1 -1
  184. package/build/core/domains/trajectory/git/rerank/derived-signals/volatility.d.ts +1 -2
  185. package/build/core/domains/trajectory/git/rerank/derived-signals/volatility.d.ts.map +1 -1
  186. package/build/core/domains/trajectory/git/rerank/derived-signals/volatility.js +5 -5
  187. package/build/core/domains/trajectory/git/rerank/derived-signals/volatility.js.map +1 -1
  188. package/build/core/domains/trajectory/git/rerank/presets/hotspots.d.ts +17 -9
  189. package/build/core/domains/trajectory/git/rerank/presets/hotspots.d.ts.map +1 -1
  190. package/build/core/domains/trajectory/git/rerank/presets/hotspots.js +17 -9
  191. package/build/core/domains/trajectory/git/rerank/presets/hotspots.js.map +1 -1
  192. package/build/core/infra/collection-name.d.ts +17 -4
  193. package/build/core/infra/collection-name.d.ts.map +1 -1
  194. package/build/core/infra/collection-name.js +28 -9
  195. package/build/core/infra/collection-name.js.map +1 -1
  196. package/build/core/infra/registry/collection-registry.d.ts +30 -0
  197. package/build/core/infra/registry/collection-registry.d.ts.map +1 -0
  198. package/build/core/infra/registry/collection-registry.js +139 -0
  199. package/build/core/infra/registry/collection-registry.js.map +1 -0
  200. package/build/core/infra/registry/constants.d.ts +24 -0
  201. package/build/core/infra/registry/constants.d.ts.map +1 -0
  202. package/build/core/infra/registry/constants.js +24 -0
  203. package/build/core/infra/registry/constants.js.map +1 -0
  204. package/build/core/infra/registry/index.d.ts +11 -0
  205. package/build/core/infra/registry/index.d.ts.map +1 -0
  206. package/build/core/infra/registry/index.js +10 -0
  207. package/build/core/infra/registry/index.js.map +1 -0
  208. package/build/core/infra/registry/registry-file.d.ts +37 -0
  209. package/build/core/infra/registry/registry-file.d.ts.map +1 -0
  210. package/build/core/infra/registry/registry-file.js +169 -0
  211. package/build/core/infra/registry/registry-file.js.map +1 -0
  212. package/build/core/infra/registry/types.d.ts +28 -0
  213. package/build/core/infra/registry/types.d.ts.map +1 -0
  214. package/build/core/infra/registry/types.js +7 -0
  215. package/build/core/infra/registry/types.js.map +1 -0
  216. package/build/mcp/tools/code.d.ts.map +1 -1
  217. package/build/mcp/tools/code.js +30 -4
  218. package/build/mcp/tools/code.js.map +1 -1
  219. package/build/mcp/tools/index.d.ts.map +1 -1
  220. package/build/mcp/tools/index.js +6 -0
  221. package/build/mcp/tools/index.js.map +1 -1
  222. package/build/mcp/tools/list-projects.d.ts +14 -0
  223. package/build/mcp/tools/list-projects.d.ts.map +1 -0
  224. package/build/mcp/tools/list-projects.js +21 -0
  225. package/build/mcp/tools/list-projects.js.map +1 -0
  226. package/build/mcp/tools/register-project.d.ts +15 -0
  227. package/build/mcp/tools/register-project.d.ts.map +1 -0
  228. package/build/mcp/tools/register-project.js +33 -0
  229. package/build/mcp/tools/register-project.js.map +1 -0
  230. package/build/mcp/tools/schemas.d.ts +15 -4
  231. package/build/mcp/tools/schemas.d.ts.map +1 -1
  232. package/build/mcp/tools/schemas.js +53 -7
  233. package/build/mcp/tools/schemas.js.map +1 -1
  234. package/build/mcp/tools/unregister-project.d.ts +19 -0
  235. package/build/mcp/tools/unregister-project.d.ts.map +1 -0
  236. package/build/mcp/tools/unregister-project.js +25 -0
  237. package/build/mcp/tools/unregister-project.js.map +1 -0
  238. package/package.json +2 -1
  239. package/scripts/install-fish-completion.js +111 -0
  240. package/scripts/postinstall.js +13 -6
  241. package/build/core/domains/trajectory/git/rerank/constants.d.ts +0 -10
  242. package/build/core/domains/trajectory/git/rerank/constants.d.ts.map +0 -1
  243. package/build/core/domains/trajectory/git/rerank/constants.js +0 -9
  244. package/build/core/domains/trajectory/git/rerank/constants.js.map +0 -1
package/README.md CHANGED
@@ -205,6 +205,32 @@ For other MCP clients, CI, or air-gapped setups, see the
205
205
  [manual install](https://artk0de.github.io/TeaRAGs-MCP/quickstart/installation#option-b--manual-install)
206
206
  (Node + `npm install -g tea-rags` + Ollama/ONNX/OpenAI/Cohere/Voyage).
207
207
 
208
+ ## 🗂️ Project Registry
209
+
210
+ TeaRAGs maintains a per-machine registry at `~/.tea-rags/registry.json` (or
211
+ `$TEA_RAGS_DATA_DIR/registry.json`) that records collection metadata and lets
212
+ you address indexed projects by a short name instead of an absolute path or
213
+ opaque collection id.
214
+
215
+ **CLI:**
216
+
217
+ ```bash
218
+ tea-rags register-project --path ./my-repo --name myrepo
219
+ tea-rags list-projects
220
+ tea-rags list-projects --json
221
+ tea-rags tune --project myrepo
222
+ tea-rags unregister-project --name myrepo
223
+ ```
224
+
225
+ **MCP tools:** `register_project`, `list_projects`, `unregister_project`.
226
+
227
+ Every project-aware tool and command also accepts an optional `project`
228
+ parameter alongside `path` and `collection`. Resolution priority is
229
+ `collection > project > path`. The registry is auto-populated at the end of each
230
+ indexing / reindexing run with the embedding model, embedding dimensions, Qdrant
231
+ URL, `indexedAt` timestamp, tea-rags version, and chunk count — no manual
232
+ `register-project` call is required for collections you index through tea-rags.
233
+
208
234
  ## 📚 Documentation
209
235
 
210
236
  **[artk0de.github.io/TeaRAGs-MCP](https://artk0de.github.io/TeaRAGs-MCP/)**
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/bootstrap/factory.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,OAAO,EAKL,aAAa,EACb,KAAK,GAAG,EACT,MAAM,sBAAsB,CAAC;AAO9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAKhF,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAIhF,QAAA,MAAM,GAAG,EAA+E;IACtF,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,OAAO,EAAE,GAAG,EAAE,CAAC;AAEf,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,GAAG,CAAC;IACT,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAsGD,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CA2F7E;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,IAAI,CAUnE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,CAetG"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/bootstrap/factory.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,OAAO,EAKL,aAAa,EACb,KAAK,GAAG,EACT,MAAM,sBAAsB,CAAC;AAS9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAKhF,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAIhF,QAAA,MAAM,GAAG,EAA+E;IACtF,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,OAAO,EAAE,GAAG,EAAE,CAAC;AAEf,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,GAAG,CAAC;IACT,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAsGD,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAwG7E;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,IAAI,CAUnE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,CAetG"}
@@ -8,10 +8,12 @@ import { OllamaEmbeddings } from "../core/adapters/embeddings/ollama.js";
8
8
  import { QdrantManager } from "../core/adapters/qdrant/client.js";
9
9
  import { resolveQdrantUrl } from "../core/adapters/qdrant/embedded/daemon.js";
10
10
  import { createApp, createComposition, ExploreFacade, IngestFacade, SchemaBuilder, } from "../core/api/index.js";
11
+ import { ProjectRegistryOps } from "../core/api/internal/ops/project-registry-ops.js";
11
12
  import { initDebugLogger, pipelineLog } from "../core/domains/ingest/pipeline/infra/debug-logger.js";
12
13
  import { setDebug } from "../core/domains/ingest/pipeline/infra/runtime.js";
13
14
  import { buildPipelineConfig } from "../core/domains/ingest/pipeline/types.js";
14
15
  import { EmbeddingModelGuard } from "../core/infra/embedding-model-guard.js";
16
+ import { CollectionRegistry } from "../core/infra/registry/index.js";
15
17
  import { SchemaDriftMonitor } from "../core/infra/schema-drift-monitor.js";
16
18
  import { StatsCache } from "../core/infra/stats-cache.js";
17
19
  import { loadPromptsConfig } from "../mcp/prompts/index.js";
@@ -106,6 +108,8 @@ export async function createAppContext(config) {
106
108
  concurrency: zodConfig.ingest.tune.pipelineConcurrency,
107
109
  ioConcurrency: zodConfig.ingest.tune.ioConcurrency,
108
110
  };
111
+ const collectionRegistry = new CollectionRegistry(config.paths.appData);
112
+ const registryWatchStop = collectionRegistry.startWatching();
109
113
  const ingest = new IngestFacade({
110
114
  qdrant: infra.qdrant,
111
115
  embeddings: infra.embeddings,
@@ -120,17 +124,26 @@ export async function createAppContext(config) {
120
124
  syncTuning,
121
125
  snapshotDir: config.paths.snapshots,
122
126
  modelGuard: infra.modelGuard,
127
+ collectionRegistry,
128
+ teaRagsVersion: pkg.version,
123
129
  });
124
130
  const essentialTrajectoryFields = composition.registry.getEssentialPayloadKeys();
125
131
  const schemaDriftMonitor = new SchemaDriftMonitor(statsCache, [
126
132
  ...composition.allPayloadSignalDescriptors.map((d) => d.key),
127
133
  "navigation",
128
134
  ]);
135
+ const projectRegistryOps = new ProjectRegistryOps({
136
+ registry: collectionRegistry,
137
+ qdrant: infra.qdrant,
138
+ embeddings: infra.embeddings,
139
+ snapshotDir: config.paths.snapshots,
140
+ });
129
141
  const explore = new ExploreFacade({
130
142
  qdrant: infra.qdrant,
131
143
  embeddings: infra.embeddings,
132
144
  reranker: composition.reranker,
133
145
  registry: composition.registry,
146
+ collectionRegistry,
134
147
  statsCache,
135
148
  schemaDriftMonitor,
136
149
  payloadSignals: composition.allPayloadSignalDescriptors,
@@ -144,10 +157,12 @@ export async function createAppContext(config) {
144
157
  explore,
145
158
  reranker: composition.reranker,
146
159
  schemaDriftMonitor,
160
+ projectRegistryOps,
147
161
  quantizationScalar: zodConfig.qdrantTune.quantizationScalar,
148
162
  modelGuard: infra.modelGuard,
149
163
  });
150
164
  const cleanup = () => {
165
+ registryWatchStop();
151
166
  if ("terminate" in infra.embeddings && typeof infra.embeddings.terminate === "function") {
152
167
  void infra.embeddings.terminate();
153
168
  }
@@ -1 +1 @@
1
- {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/bootstrap/factory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/bootstrap/factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { CommandModule } from "yargs";
2
+ import type { EmbeddingProvider } from "../../core/adapters/embeddings/base.js";
3
+ import { QdrantManager } from "../../core/adapters/qdrant/client.js";
4
+ interface DoctorArgs {
5
+ json?: boolean;
6
+ recoverRegistry?: boolean;
7
+ }
8
+ /**
9
+ * Narrow surfaces of QdrantManager + EmbeddingProvider that runDoctor needs.
10
+ * The `Pick` types make it trivial for tests to pass plain object mocks.
11
+ */
12
+ interface DoctorDeps {
13
+ qdrant: Pick<QdrantManager, "url" | "checkHealth" | "listCollections" | "getCollectionInfo" | "countPoints" | "scrollFiltered"> & {
14
+ /**
15
+ * Optional — older Qdrant servers or partial mocks may omit it.
16
+ * Used to exclude physical collections that back an alias from the orphan
17
+ * count (mirrors FixB in src/cli/commands/projects.ts:runOrphans).
18
+ */
19
+ aliases?: Pick<QdrantManager["aliases"], "listAliases">;
20
+ };
21
+ embeddings: Pick<EmbeddingProvider, "checkHealth" | "getProviderName" | "getBaseUrl">;
22
+ }
23
+ /**
24
+ * `tea-rags doctor` — read-only infrastructure + registry health summary.
25
+ * When `--recover-registry` is set, delegates to
26
+ * `ProjectRegistryOps.recoverFromQdrant` to repopulate registry stubs for
27
+ * every Qdrant collection not yet known to the registry (audit #6, #7).
28
+ *
29
+ * `deps` is an injection point for tests; production constructs Qdrant +
30
+ * embeddings via the same bootstrap path the server uses.
31
+ */
32
+ export declare function runDoctor(args: DoctorArgs, deps?: DoctorDeps): Promise<void>;
33
+ /**
34
+ * `tea-rags doctor` yargs subcommand. `--recover-registry` delegates to
35
+ * `ProjectRegistryOps.recoverFromQdrant` via `runDoctor`.
36
+ */
37
+ export declare const doctorCommand: CommandModule<unknown, DoctorArgs>;
38
+ export {};
39
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAQ,aAAa,EAAE,MAAM,OAAO,CAAC;AAEjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAIrE,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;GAGG;AACH,UAAU,UAAU;IAClB,MAAM,EAAE,IAAI,CACV,aAAa,EACb,KAAK,GAAG,aAAa,GAAG,iBAAiB,GAAG,mBAAmB,GAAG,aAAa,GAAG,gBAAgB,CACnG,GAAG;QACF;;;;WAIG;QACH,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC,CAAC;KACzD,CAAC;IACF,UAAU,EAAE,IAAI,CAAC,iBAAiB,EAAE,aAAa,GAAG,iBAAiB,GAAG,YAAY,CAAC,CAAC;CACvF;AAmBD;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAyElF;AAyBD;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,OAAO,EAAE,UAAU,CAqB5D,CAAC"}
@@ -0,0 +1,136 @@
1
+ import { homedir } from "node:os";
2
+ import { join } from "node:path";
3
+ import { QdrantManager } from "../../core/adapters/qdrant/client.js";
4
+ import { ProjectRegistryOps } from "../../core/api/internal/ops/project-registry-ops.js";
5
+ import { CollectionRegistry } from "../../core/infra/registry/collection-registry.js";
6
+ function resolveDataDir() {
7
+ return process.env.TEA_RAGS_DATA_DIR ?? join(homedir(), ".tea-rags");
8
+ }
9
+ function statusPrefix(ok, warn = false) {
10
+ if (warn)
11
+ return "[WARN]";
12
+ return ok ? "[OK] " : "[FAIL]";
13
+ }
14
+ async function safe(fn, fallback) {
15
+ try {
16
+ return await fn();
17
+ }
18
+ catch {
19
+ return fallback;
20
+ }
21
+ }
22
+ /**
23
+ * `tea-rags doctor` — read-only infrastructure + registry health summary.
24
+ * When `--recover-registry` is set, delegates to
25
+ * `ProjectRegistryOps.recoverFromQdrant` to repopulate registry stubs for
26
+ * every Qdrant collection not yet known to the registry (audit #6, #7).
27
+ *
28
+ * `deps` is an injection point for tests; production constructs Qdrant +
29
+ * embeddings via the same bootstrap path the server uses.
30
+ */
31
+ export async function runDoctor(args, deps) {
32
+ const { qdrant, embeddings } = deps ?? (await defaultDeps());
33
+ const registry = new CollectionRegistry(resolveDataDir());
34
+ const qdrantOk = await safe(async () => qdrant.checkHealth(), false);
35
+ const embeddingsOk = await safe(async () => embeddings.checkHealth(), false);
36
+ const collections = await safe(async () => qdrant.listCollections(), []);
37
+ const registeredBefore = new Set(registry.list().map((e) => e.collectionName));
38
+ // Aliased-to physical collections must NOT count as orphans — they back a
39
+ // registered (or unregistered) alias and removing them destroys live data.
40
+ // Mirrors FixB in src/cli/commands/projects.ts:runOrphans so `tea-rags doctor`
41
+ // and `tea-rags projects orphans` report consistent counts.
42
+ const aliasedTargets = await safe(async () => {
43
+ if (typeof qdrant.aliases?.listAliases !== "function")
44
+ return new Set();
45
+ const aliases = await qdrant.aliases.listAliases();
46
+ return new Set(aliases.map((a) => a.collectionName));
47
+ }, new Set());
48
+ const orphanCount = collections.filter((c) => !registeredBefore.has(c) && !aliasedTargets.has(c)).length;
49
+ const embeddingUrl = typeof embeddings.getBaseUrl === "function" ? embeddings.getBaseUrl() : undefined;
50
+ let recovery;
51
+ if (args.recoverRegistry) {
52
+ const before = registeredBefore.size;
53
+ const ops = new ProjectRegistryOps({
54
+ registry,
55
+ // ProjectRegistryOps expects full QdrantManager; the mock + real
56
+ // QdrantManager both satisfy the subset of methods recoverFromQdrant
57
+ // actually calls (listCollections, getCollectionInfo, countPoints,
58
+ // scrollFiltered, url).
59
+ qdrant: qdrant,
60
+ });
61
+ await ops.recoverFromQdrant();
62
+ const after = registry.list().length;
63
+ recovery = { recovered: after - before };
64
+ }
65
+ const projectCount = registry.list().length;
66
+ const remainingOrphanCount = args.recoverRegistry ? 0 : orphanCount;
67
+ if (args.json) {
68
+ process.stdout.write(`${JSON.stringify({
69
+ qdrant: { url: qdrant.url, reachable: qdrantOk },
70
+ embeddings: {
71
+ provider: embeddings.getProviderName(),
72
+ url: embeddingUrl,
73
+ reachable: embeddingsOk,
74
+ },
75
+ registry: { projectCount, orphanCount: remainingOrphanCount },
76
+ ...(recovery ? { recovery } : {}),
77
+ }, null, 2)}\n`);
78
+ return;
79
+ }
80
+ process.stdout.write(`${statusPrefix(qdrantOk)} Qdrant: ${qdrant.url}\n`);
81
+ process.stdout.write(`${statusPrefix(embeddingsOk)} Embeddings (${embeddings.getProviderName()})${embeddingUrl ? `: ${embeddingUrl}` : ""}\n`);
82
+ process.stdout.write(`${statusPrefix(true)} Registry: ${projectCount} project(s)\n`);
83
+ if (recovery) {
84
+ process.stdout.write(`${statusPrefix(true)} Recovered ${recovery.recovered} entry/entries from Qdrant; paths are empty — re-register them with 'tea-rags projects register --path <dir> --name <alias>' to enable alias resolution.\n`);
85
+ }
86
+ else if (orphanCount > 0) {
87
+ process.stdout.write(`${statusPrefix(true, true)} Registry: ${orphanCount} orphan collection(s) — run 'tea-rags doctor --recover-registry' or 'tea-rags projects orphans' to inspect\n`);
88
+ }
89
+ }
90
+ /**
91
+ * Build the same QdrantManager + EmbeddingProvider the MCP server would use.
92
+ * Mirrors the construction path in src/bootstrap/factory.ts:resolveInfrastructure,
93
+ * but skips embedded-daemon spawn (doctor is read-only — connection refused is
94
+ * a legitimate [FAIL] report).
95
+ */
96
+ async function defaultDeps() {
97
+ const { parseAppConfig, getZodConfig } = await import("../../bootstrap/config/index.js");
98
+ const { resolveQdrantUrl } = await import("../../core/adapters/qdrant/embedded/daemon.js");
99
+ const { EmbeddingProviderFactory } = await import("../../core/adapters/embeddings/factory.js");
100
+ const config = parseAppConfig();
101
+ const zodConfig = getZodConfig();
102
+ const resolution = await resolveQdrantUrl(config.qdrantUrl, config.paths.appData);
103
+ const qdrant = new QdrantManager(resolution.url, config.qdrantApiKey);
104
+ const embeddings = EmbeddingProviderFactory.create(zodConfig.embedding, {
105
+ models: config.paths.models,
106
+ daemonSocket: config.paths.daemonSocket,
107
+ daemonPid: config.paths.daemonPid,
108
+ });
109
+ return { qdrant, embeddings };
110
+ }
111
+ /**
112
+ * `tea-rags doctor` yargs subcommand. `--recover-registry` delegates to
113
+ * `ProjectRegistryOps.recoverFromQdrant` via `runDoctor`.
114
+ */
115
+ export const doctorCommand = {
116
+ command: "doctor",
117
+ describe: "Print infrastructure + registry health summary",
118
+ builder: (yargs) => yargs
119
+ .option("json", {
120
+ type: "boolean",
121
+ default: false,
122
+ describe: "Output as JSON",
123
+ })
124
+ .option("recover-registry", {
125
+ type: "boolean",
126
+ default: false,
127
+ describe: "Repopulate the project registry from live Qdrant state",
128
+ }),
129
+ handler: async (argv) => {
130
+ await runDoctor({
131
+ json: argv.json,
132
+ recoverRegistry: Boolean(argv["recover-registry"]),
133
+ });
134
+ },
135
+ };
136
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import type { CommandModule } from "yargs";
2
2
  interface PrimeArgs {
3
- path: string;
3
+ path?: string;
4
+ project?: string;
4
5
  }
5
6
  export declare const primeCommand: CommandModule<object, PrimeArgs>;
6
7
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"prime.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/prime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAI3C,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,MAAM,EAAE,SAAS,CAYzD,CAAC"}
1
+ {"version":3,"file":"prime.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/prime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAI3C,UAAU,SAAS;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,MAAM,EAAE,SAAS,CAiBzD,CAAC"}
@@ -1,14 +1,18 @@
1
1
  import { runPrime } from "../prime/run-prime.js";
2
2
  export const primeCommand = {
3
- command: "prime <path>",
3
+ command: "prime [path]",
4
4
  describe: "Emit a markdown digest of index state for SessionStart context.",
5
- builder: (yargs) => yargs.positional("path", {
5
+ builder: (yargs) => yargs
6
+ .positional("path", {
6
7
  type: "string",
7
- describe: "Project path (typically $CLAUDE_PROJECT_DIR from a hook)",
8
- demandOption: true,
8
+ describe: "Project path (typically $CLAUDE_PROJECT_DIR from a hook). Optional if --project is given.",
9
+ })
10
+ .option("project", {
11
+ type: "string",
12
+ describe: "Project alias from registry. Resolves --path / --qdrant-url from the registered entry; heuristic discovery only used as fallback.",
9
13
  }),
10
14
  handler: async (argv) => {
11
- await runPrime(argv.path);
15
+ await runPrime({ path: argv.path, project: argv.project });
12
16
  },
13
17
  };
14
18
  //# sourceMappingURL=prime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prime.js","sourceRoot":"","sources":["../../../src/cli/commands/prime.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAMjD,MAAM,CAAC,MAAM,YAAY,GAAqC;IAC5D,OAAO,EAAE,cAAc;IACvB,QAAQ,EAAE,iEAAiE;IAC3E,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE;QACvB,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,0DAA0D;QACpE,YAAY,EAAE,IAAI;KACnB,CAAC;IACJ,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"prime.js","sourceRoot":"","sources":["../../../src/cli/commands/prime.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAOjD,MAAM,CAAC,MAAM,YAAY,GAAqC;IAC5D,OAAO,EAAE,cAAc;IACvB,QAAQ,EAAE,iEAAiE;IAC3E,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,UAAU,CAAC,MAAM,EAAE;QAClB,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,2FAA2F;KACtG,CAAC;SACD,MAAM,CAAC,SAAS,EAAE;QACjB,IAAI,EAAE,QAAQ;QACd,QAAQ,EACN,mIAAmI;KACtI,CAAC;IACN,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,MAAM,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7D,CAAC;CACF,CAAC"}
@@ -0,0 +1,48 @@
1
+ import type { CommandModule } from "yargs";
2
+ import { QdrantManager } from "../../core/adapters/qdrant/client.js";
3
+ interface RegisterArgs {
4
+ path: string;
5
+ name: string;
6
+ }
7
+ interface UnregisterArgs {
8
+ name: string;
9
+ purge?: boolean;
10
+ }
11
+ interface ListArgs {
12
+ json?: boolean;
13
+ }
14
+ interface InfoArgs {
15
+ name: string;
16
+ json?: boolean;
17
+ }
18
+ interface OrphansArgs {
19
+ json?: boolean;
20
+ }
21
+ /** Narrow surface of QdrantManager that runOrphans needs (allows test injection). */
22
+ type QdrantSurface = Pick<QdrantManager, "listCollections" | "countPoints"> & {
23
+ /**
24
+ * Optional — older Qdrant servers or partial mocks may omit it.
25
+ * Used to exclude physical collections that back an alias from the orphan list.
26
+ */
27
+ aliases?: Pick<QdrantManager["aliases"], "listAliases">;
28
+ };
29
+ export declare function runRegister(args: RegisterArgs): Promise<void>;
30
+ export declare function runUnregister(args: UnregisterArgs, qdrant?: Pick<QdrantManager, "deleteCollection" | "countPoints">): Promise<void>;
31
+ export declare function runList(args: ListArgs): void;
32
+ export declare function runInfo(args: InfoArgs): void;
33
+ /**
34
+ * List Qdrant collections that are not represented in the project registry.
35
+ * Read-only — does not mutate either side. Audit #8 listing half.
36
+ *
37
+ * `qdrant` is an injection point: production code constructs a real
38
+ * QdrantManager via parseAppConfig + resolveQdrantUrl; tests pass a mock.
39
+ */
40
+ export declare function runOrphans(args: OrphansArgs, qdrant?: QdrantSurface): Promise<void>;
41
+ /**
42
+ * `tea-rags projects [register|list|unregister|info|orphans]` — grouped subcommands
43
+ * for project registry management. `list` is the default when no subcommand
44
+ * is given.
45
+ */
46
+ export declare const projectsCommand: CommandModule;
47
+ export {};
48
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/projects.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAQ,aAAa,EAAE,MAAM,OAAO,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAMrE,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AACD,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AACD,UAAU,QAAQ;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AACD,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AACD,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,qFAAqF;AACrF,KAAK,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,iBAAiB,GAAG,aAAa,CAAC,GAAG;IAC5E;;;OAGG;IACH,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC,CAAC;CACzD,CAAC;AAWF,wBAAsB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAWnE;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,cAAc,EACpB,MAAM,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,kBAAkB,GAAG,aAAa,CAAC,GAC/D,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAc5C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CA2C5C;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CzF;AAsBD;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,aAyE7B,CAAC"}
@@ -0,0 +1,216 @@
1
+ import { realpathSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { QdrantManager } from "../../core/adapters/qdrant/client.js";
5
+ import { ProjectRegistryOps } from "../../core/api/internal/ops/project-registry-ops.js";
6
+ import { CollectionRegistry } from "../../core/infra/registry/collection-registry.js";
7
+ import { PROJECT_NAME_RE } from "../../core/infra/registry/index.js";
8
+ function resolveDataDir() {
9
+ return process.env.TEA_RAGS_DATA_DIR ?? join(homedir(), ".tea-rags");
10
+ }
11
+ function newOps() {
12
+ const registry = new CollectionRegistry(resolveDataDir());
13
+ return { registry, ops: new ProjectRegistryOps({ registry }) };
14
+ }
15
+ export async function runRegister(args) {
16
+ const { ops } = newOps();
17
+ try {
18
+ const out = await ops.register({ path: args.path, name: args.name });
19
+ process.stdout.write(`Registered '${args.name}' -> ${out.collectionName}${out.alreadyIndexed ? " (already indexed)" : ""}\n`);
20
+ }
21
+ catch (err) {
22
+ process.stderr.write(`projects register failed: ${err.message}\n`);
23
+ process.exit(1);
24
+ }
25
+ }
26
+ export async function runUnregister(args, qdrant) {
27
+ const { registry, ops } = newOps();
28
+ // Capture the collectionName before the entry is removed so we can purge it.
29
+ const entry = registry.findByName(args.name);
30
+ const out = await ops.unregister({ name: args.name });
31
+ if (!out.removed) {
32
+ process.stdout.write(`'${args.name}' was not registered\n`);
33
+ return;
34
+ }
35
+ const collectionName = entry?.collectionName ?? "(unknown)";
36
+ if (args.purge) {
37
+ const client = qdrant ?? (await defaultQdrant());
38
+ const chunkCount = await safeCount(client, collectionName);
39
+ try {
40
+ await client.deleteCollection(collectionName);
41
+ process.stdout.write(`Removed '${args.name}' from registry; deleted Qdrant collection '${collectionName}' (${chunkCount} chunks)\n`);
42
+ }
43
+ catch (err) {
44
+ process.stdout.write(`Removed '${args.name}' from registry; failed to delete Qdrant collection '${collectionName}': ${err.message}\n`);
45
+ }
46
+ return;
47
+ }
48
+ process.stdout.write(`Removed '${args.name}' from registry. Note: Qdrant collection '${collectionName}' is still present. Run 'tea-rags projects unregister --name ${args.name} --purge' to remove it.\n`);
49
+ }
50
+ export function runList(args) {
51
+ const { registry } = newOps();
52
+ const list = registry.list();
53
+ if (args.json) {
54
+ process.stdout.write(`${JSON.stringify(list, null, 2)}\n`);
55
+ return;
56
+ }
57
+ if (list.length === 0) {
58
+ process.stdout.write("(no projects registered)\n");
59
+ return;
60
+ }
61
+ for (const e of list) {
62
+ process.stdout.write(`${e.name ?? "(no name)"}\t${e.collectionName}\t${e.path}\n`);
63
+ }
64
+ }
65
+ export function runInfo(args) {
66
+ const { registry } = newOps();
67
+ const entry = registry.findByName(args.name);
68
+ if (!entry) {
69
+ process.stderr.write(`'${args.name}' was not registered\n`);
70
+ process.exit(1);
71
+ return;
72
+ }
73
+ // Compute live realpath. Missing on disk → null sentinel rendered as
74
+ // "(missing on disk)" in text mode and omitted from JSON. Audit #13.
75
+ let realpath;
76
+ try {
77
+ realpath = realpathSync(entry.path);
78
+ }
79
+ catch {
80
+ realpath = null;
81
+ }
82
+ const realpathDiffers = realpath !== null && realpath !== entry.path;
83
+ if (args.json) {
84
+ const payload = { ...entry };
85
+ if (realpathDiffers) {
86
+ payload.realpath = realpath;
87
+ }
88
+ process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
89
+ return;
90
+ }
91
+ process.stdout.write(`name: ${entry.name ?? "(no name)"}\n`);
92
+ process.stdout.write(`collectionName: ${entry.collectionName}\n`);
93
+ process.stdout.write(`path: ${entry.path}\n`);
94
+ if (realpath === null) {
95
+ process.stdout.write(`realpath: (missing on disk)\n`);
96
+ }
97
+ else if (realpathDiffers) {
98
+ process.stdout.write(`realpath: ${realpath}\n`);
99
+ process.stdout.write(` (symlink or moved mount — re-register to refresh)\n`);
100
+ }
101
+ process.stdout.write(`qdrantUrl: ${entry.qdrantUrl || "(none)"}\n`);
102
+ process.stdout.write(`embeddingModel: ${entry.embeddingModel || "(none)"}\n`);
103
+ process.stdout.write(`embeddingDimensions: ${entry.embeddingDimensions || 0}\n`);
104
+ process.stdout.write(`chunksCount: ${entry.chunksCount}\n`);
105
+ process.stdout.write(`indexedAt: ${entry.indexedAt || "(never)"}\n`);
106
+ process.stdout.write(`teaRagsVersion: ${entry.teaRagsVersion || "(unknown)"}\n`);
107
+ }
108
+ /**
109
+ * List Qdrant collections that are not represented in the project registry.
110
+ * Read-only — does not mutate either side. Audit #8 listing half.
111
+ *
112
+ * `qdrant` is an injection point: production code constructs a real
113
+ * QdrantManager via parseAppConfig + resolveQdrantUrl; tests pass a mock.
114
+ */
115
+ export async function runOrphans(args, qdrant) {
116
+ const { registry } = newOps();
117
+ const client = qdrant ?? (await defaultQdrant());
118
+ const registered = new Set(registry.list().map((e) => e.collectionName));
119
+ // Aliased-to physical collections must NOT appear as orphans — they back a
120
+ // registered (or unregistered) alias and removing them destroys live data.
121
+ // Qdrant's listCollections returns physical names (e.g. `code_8b243ffe_v2`);
122
+ // the registry stores alias names (e.g. `code_8b243ffe`). Subtract the alias
123
+ // targets so the user is never told a live backing collection is "orphaned".
124
+ let aliasedTargets = new Set();
125
+ try {
126
+ const aliases = (await client.aliases?.listAliases()) ?? [];
127
+ aliasedTargets = new Set(aliases.map((a) => a.collectionName));
128
+ }
129
+ catch {
130
+ // Best-effort fallback — older Qdrant servers without alias support fall
131
+ // back to pre-fix behaviour (all physical names visible).
132
+ }
133
+ const collections = await client.listCollections();
134
+ const orphans = collections.filter((c) => !registered.has(c) && !aliasedTargets.has(c));
135
+ if (args.json) {
136
+ const rows = await Promise.all(orphans.map(async (collectionName) => ({
137
+ collectionName,
138
+ chunksCount: await safeCount(client, collectionName),
139
+ })));
140
+ process.stdout.write(`${JSON.stringify(rows, null, 2)}\n`);
141
+ return;
142
+ }
143
+ if (orphans.length === 0) {
144
+ process.stdout.write("(no orphan collections)\n");
145
+ return;
146
+ }
147
+ for (const collectionName of orphans) {
148
+ const count = await safeCount(client, collectionName);
149
+ process.stdout.write(`${collectionName}\t${count}\n`);
150
+ }
151
+ }
152
+ async function safeCount(client, collectionName) {
153
+ try {
154
+ return await client.countPoints(collectionName);
155
+ }
156
+ catch {
157
+ return 0;
158
+ }
159
+ }
160
+ /**
161
+ * Build a QdrantManager pointed at the same URL the MCP server would use.
162
+ * Resolves via parseAppConfig + resolveQdrantUrl so embedded mode is honored.
163
+ */
164
+ async function defaultQdrant() {
165
+ const { parseAppConfig } = await import("../../bootstrap/config/index.js");
166
+ const { resolveQdrantUrl } = await import("../../core/adapters/qdrant/embedded/daemon.js");
167
+ const config = parseAppConfig();
168
+ const resolution = await resolveQdrantUrl(config.qdrantUrl, config.paths.appData);
169
+ return new QdrantManager(resolution.url, config.qdrantApiKey);
170
+ }
171
+ /**
172
+ * `tea-rags projects [register|list|unregister|info|orphans]` — grouped subcommands
173
+ * for project registry management. `list` is the default when no subcommand
174
+ * is given.
175
+ */
176
+ export const projectsCommand = {
177
+ command: "projects",
178
+ describe: "Manage registered projects (register | list | unregister | info | orphans). Defaults to list.",
179
+ builder: (yargs) => yargs
180
+ .command("register", "Register a project path under an alias name", (y) => y
181
+ .option("path", {
182
+ type: "string",
183
+ demandOption: true,
184
+ describe: "Absolute path to the project root",
185
+ })
186
+ .option("name", {
187
+ type: "string",
188
+ demandOption: true,
189
+ describe: `Short name to register (regex ${PROJECT_NAME_RE.source})`,
190
+ }), async (argv) => runRegister({ path: argv.path, name: argv.name }))
191
+ .command("unregister", "Remove a registered project by name (optionally also delete the Qdrant collection)", (y) => y.option("name", { type: "string", demandOption: true, describe: "Project name to remove" }).option("purge", {
192
+ type: "boolean",
193
+ default: false,
194
+ describe: "Also delete the underlying Qdrant collection",
195
+ }), async (argv) => runUnregister({ name: argv.name, purge: argv.purge }))
196
+ .command("orphans", "List Qdrant collections without a registry entry", (y) => y.option("json", { type: "boolean", default: false, describe: "Output as JSON" }), async (argv) => {
197
+ await runOrphans({ json: argv.json });
198
+ })
199
+ .command("list", "List all registered projects", (y) => y.option("json", { type: "boolean", default: false, describe: "Output as JSON" }), (argv) => {
200
+ runList({ json: argv.json });
201
+ })
202
+ .command("info", "Show full info for one registered project", (y) => y
203
+ .option("name", { type: "string", demandOption: true, describe: "Project name" })
204
+ .option("json", { type: "boolean", default: false, describe: "Output as JSON" }), (argv) => {
205
+ runInfo({ name: argv.name, json: argv.json });
206
+ })
207
+ .command("$0", "List all registered projects (default subcommand)", (y) => y.option("json", { type: "boolean", default: false, describe: "Output as JSON" }), (argv) => {
208
+ runList({ json: argv.json });
209
+ })
210
+ .demandCommand(0)
211
+ .strict(),
212
+ handler: () => {
213
+ // never reached — yargs delegates to subcommands
214
+ },
215
+ };
216
+ //# sourceMappingURL=projects.js.map