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.
- package/README.md +26 -0
- package/build/bootstrap/factory.d.ts.map +1 -1
- package/build/bootstrap/factory.js +15 -0
- package/build/bootstrap/factory.js.map +1 -1
- package/build/cli/commands/doctor.d.ts +39 -0
- package/build/cli/commands/doctor.d.ts.map +1 -0
- package/build/cli/commands/doctor.js +136 -0
- package/build/cli/commands/doctor.js.map +1 -0
- package/build/cli/commands/prime.d.ts +2 -1
- package/build/cli/commands/prime.d.ts.map +1 -1
- package/build/cli/commands/prime.js +9 -5
- package/build/cli/commands/prime.js.map +1 -1
- package/build/cli/commands/projects.d.ts +48 -0
- package/build/cli/commands/projects.d.ts.map +1 -0
- package/build/cli/commands/projects.js +216 -0
- package/build/cli/commands/projects.js.map +1 -0
- package/build/cli/commands/tune.d.ts +1 -0
- package/build/cli/commands/tune.d.ts.map +1 -1
- package/build/cli/commands/tune.js +32 -10
- package/build/cli/commands/tune.js.map +1 -1
- package/build/cli/completion.d.ts +23 -0
- package/build/cli/completion.d.ts.map +1 -0
- package/build/cli/completion.js +75 -0
- package/build/cli/completion.js.map +1 -0
- package/build/cli/create-cli.d.ts.map +1 -1
- package/build/cli/create-cli.js +26 -1
- package/build/cli/create-cli.js.map +1 -1
- package/build/cli/prime/format.js +6 -0
- package/build/cli/prime/format.js.map +1 -1
- package/build/cli/prime/run-prime.d.ts +9 -1
- package/build/cli/prime/run-prime.d.ts.map +1 -1
- package/build/cli/prime/run-prime.js +43 -2
- package/build/cli/prime/run-prime.js.map +1 -1
- package/build/cli/prime/types.d.ts +2 -0
- package/build/cli/prime/types.d.ts.map +1 -1
- package/build/cli/qdrant-url-resolver.d.ts +31 -0
- package/build/cli/qdrant-url-resolver.d.ts.map +1 -0
- package/build/cli/qdrant-url-resolver.js +29 -0
- package/build/cli/qdrant-url-resolver.js.map +1 -0
- package/build/cli/registry-resolver.d.ts +24 -0
- package/build/cli/registry-resolver.d.ts.map +1 -0
- package/build/cli/registry-resolver.js +46 -0
- package/build/cli/registry-resolver.js.map +1 -0
- package/build/core/adapters/registry/errors.d.ts +59 -0
- package/build/core/adapters/registry/errors.d.ts.map +1 -0
- package/build/core/adapters/registry/errors.js +88 -0
- package/build/core/adapters/registry/errors.js.map +1 -0
- package/build/core/api/errors.d.ts +36 -0
- package/build/core/api/errors.d.ts.map +1 -1
- package/build/core/api/errors.js +77 -0
- package/build/core/api/errors.js.map +1 -1
- package/build/core/api/index.d.ts +2 -0
- package/build/core/api/index.d.ts.map +1 -1
- package/build/core/api/index.js +1 -0
- package/build/core/api/index.js.map +1 -1
- package/build/core/api/internal/composition.d.ts.map +1 -1
- package/build/core/api/internal/composition.js +7 -0
- package/build/core/api/internal/composition.js.map +1 -1
- package/build/core/api/internal/facades/explore-facade.d.ts +2 -0
- package/build/core/api/internal/facades/explore-facade.d.ts.map +1 -1
- package/build/core/api/internal/facades/explore-facade.js +1 -0
- package/build/core/api/internal/facades/explore-facade.js.map +1 -1
- package/build/core/api/internal/facades/ingest-facade.d.ts +3 -0
- package/build/core/api/internal/facades/ingest-facade.d.ts.map +1 -1
- package/build/core/api/internal/facades/ingest-facade.js +6 -2
- package/build/core/api/internal/facades/ingest-facade.js.map +1 -1
- package/build/core/api/internal/infra/schema-builder.d.ts +17 -0
- package/build/core/api/internal/infra/schema-builder.d.ts.map +1 -1
- package/build/core/api/internal/infra/schema-builder.js +27 -0
- package/build/core/api/internal/infra/schema-builder.js.map +1 -1
- package/build/core/api/internal/ops/explore-ops.d.ts +4 -0
- package/build/core/api/internal/ops/explore-ops.d.ts.map +1 -1
- package/build/core/api/internal/ops/explore-ops.js +25 -11
- package/build/core/api/internal/ops/explore-ops.js.map +1 -1
- package/build/core/api/internal/ops/project-registry-ops.d.ts +40 -0
- package/build/core/api/internal/ops/project-registry-ops.d.ts.map +1 -0
- package/build/core/api/internal/ops/project-registry-ops.js +217 -0
- package/build/core/api/internal/ops/project-registry-ops.js.map +1 -0
- package/build/core/api/public/app.d.ts +18 -0
- package/build/core/api/public/app.d.ts.map +1 -1
- package/build/core/api/public/app.js +4 -0
- package/build/core/api/public/app.js.map +1 -1
- package/build/core/api/public/dto/common.d.ts +13 -0
- package/build/core/api/public/dto/common.d.ts.map +1 -0
- package/build/core/api/public/dto/common.js +5 -0
- package/build/core/api/public/dto/common.js.map +1 -0
- package/build/core/api/public/dto/explore.d.ts +8 -6
- package/build/core/api/public/dto/explore.d.ts.map +1 -1
- package/build/core/api/public/dto/index.d.ts +2 -1
- package/build/core/api/public/dto/index.d.ts.map +1 -1
- package/build/core/api/public/dto/index.js.map +1 -1
- package/build/core/api/public/dto/ingest.d.ts +8 -0
- package/build/core/api/public/dto/ingest.d.ts.map +1 -1
- package/build/core/contracts/errors.d.ts +1 -1
- package/build/core/contracts/errors.d.ts.map +1 -1
- package/build/core/contracts/types/reranker.d.ts +7 -3
- package/build/core/contracts/types/reranker.d.ts.map +1 -1
- package/build/core/contracts/types/trajectory.d.ts +90 -10
- package/build/core/contracts/types/trajectory.d.ts.map +1 -1
- package/build/core/domains/explore/label-resolver.d.ts +21 -1
- package/build/core/domains/explore/label-resolver.d.ts.map +1 -1
- package/build/core/domains/explore/label-resolver.js +36 -2
- package/build/core/domains/explore/label-resolver.js.map +1 -1
- package/build/core/domains/explore/post-process.d.ts +1 -1
- package/build/core/domains/explore/post-process.d.ts.map +1 -1
- package/build/core/domains/explore/post-process.js +2 -2
- package/build/core/domains/explore/post-process.js.map +1 -1
- package/build/core/domains/explore/rank-module.js +1 -1
- package/build/core/domains/explore/rank-module.js.map +1 -1
- package/build/core/domains/explore/reranker.d.ts +77 -6
- package/build/core/domains/explore/reranker.d.ts.map +1 -1
- package/build/core/domains/explore/reranker.js +166 -12
- package/build/core/domains/explore/reranker.js.map +1 -1
- package/build/core/domains/explore/stats-recompute.d.ts +66 -0
- package/build/core/domains/explore/stats-recompute.d.ts.map +1 -0
- package/build/core/domains/explore/stats-recompute.js +241 -0
- package/build/core/domains/explore/stats-recompute.js.map +1 -0
- package/build/core/domains/explore/strategies/base.d.ts +1 -1
- package/build/core/domains/explore/strategies/base.d.ts.map +1 -1
- package/build/core/domains/explore/strategies/base.js +3 -3
- package/build/core/domains/explore/strategies/base.js.map +1 -1
- package/build/core/domains/explore/strategies/file-outline.d.ts +1 -1
- package/build/core/domains/explore/strategies/file-outline.d.ts.map +1 -1
- package/build/core/domains/explore/strategies/file-outline.js +2 -2
- package/build/core/domains/explore/strategies/file-outline.js.map +1 -1
- package/build/core/domains/explore/strategies/scroll-rank.d.ts +1 -1
- package/build/core/domains/explore/strategies/scroll-rank.d.ts.map +1 -1
- package/build/core/domains/explore/strategies/scroll-rank.js +1 -1
- package/build/core/domains/explore/strategies/scroll-rank.js.map +1 -1
- package/build/core/domains/explore/strategies/symbol.d.ts +1 -1
- package/build/core/domains/explore/strategies/symbol.d.ts.map +1 -1
- package/build/core/domains/explore/strategies/symbol.js +2 -2
- package/build/core/domains/explore/strategies/symbol.js.map +1 -1
- package/build/core/domains/ingest/collection-stats.d.ts +11 -0
- package/build/core/domains/ingest/collection-stats.d.ts.map +1 -1
- package/build/core/domains/ingest/collection-stats.js +79 -0
- package/build/core/domains/ingest/collection-stats.js.map +1 -1
- package/build/core/domains/ingest/indexing.d.ts.map +1 -1
- package/build/core/domains/ingest/indexing.js +2 -1
- package/build/core/domains/ingest/indexing.js.map +1 -1
- package/build/core/domains/ingest/pipeline/base.d.ts +18 -1
- package/build/core/domains/ingest/pipeline/base.d.ts.map +1 -1
- package/build/core/domains/ingest/pipeline/base.js +33 -1
- package/build/core/domains/ingest/pipeline/base.js.map +1 -1
- package/build/core/domains/ingest/pipeline/indexing-marker.d.ts +6 -1
- package/build/core/domains/ingest/pipeline/indexing-marker.d.ts.map +1 -1
- package/build/core/domains/ingest/pipeline/indexing-marker.js +14 -3
- package/build/core/domains/ingest/pipeline/indexing-marker.js.map +1 -1
- package/build/core/domains/ingest/reindexing.d.ts +2 -2
- package/build/core/domains/ingest/reindexing.d.ts.map +1 -1
- package/build/core/domains/ingest/reindexing.js +4 -3
- package/build/core/domains/ingest/reindexing.js.map +1 -1
- package/build/core/domains/trajectory/git/payload-signals.d.ts.map +1 -1
- package/build/core/domains/trajectory/git/payload-signals.js +39 -4
- package/build/core/domains/trajectory/git/payload-signals.js.map +1 -1
- package/build/core/domains/trajectory/git/rerank/derived-signals/bug-fix.d.ts +13 -4
- package/build/core/domains/trajectory/git/rerank/derived-signals/bug-fix.d.ts.map +1 -1
- package/build/core/domains/trajectory/git/rerank/derived-signals/bug-fix.js +21 -7
- package/build/core/domains/trajectory/git/rerank/derived-signals/bug-fix.js.map +1 -1
- package/build/core/domains/trajectory/git/rerank/derived-signals/density.d.ts +1 -2
- package/build/core/domains/trajectory/git/rerank/derived-signals/density.d.ts.map +1 -1
- package/build/core/domains/trajectory/git/rerank/derived-signals/density.js +5 -5
- package/build/core/domains/trajectory/git/rerank/derived-signals/density.js.map +1 -1
- package/build/core/domains/trajectory/git/rerank/derived-signals/helpers.d.ts +0 -1
- package/build/core/domains/trajectory/git/rerank/derived-signals/helpers.d.ts.map +1 -1
- package/build/core/domains/trajectory/git/rerank/derived-signals/helpers.js +0 -2
- package/build/core/domains/trajectory/git/rerank/derived-signals/helpers.js.map +1 -1
- package/build/core/domains/trajectory/git/rerank/derived-signals/knowledge-silo.d.ts +1 -2
- package/build/core/domains/trajectory/git/rerank/derived-signals/knowledge-silo.d.ts.map +1 -1
- package/build/core/domains/trajectory/git/rerank/derived-signals/knowledge-silo.js +5 -5
- package/build/core/domains/trajectory/git/rerank/derived-signals/knowledge-silo.js.map +1 -1
- package/build/core/domains/trajectory/git/rerank/derived-signals/ownership.d.ts +1 -2
- package/build/core/domains/trajectory/git/rerank/derived-signals/ownership.d.ts.map +1 -1
- package/build/core/domains/trajectory/git/rerank/derived-signals/ownership.js +5 -5
- package/build/core/domains/trajectory/git/rerank/derived-signals/ownership.js.map +1 -1
- package/build/core/domains/trajectory/git/rerank/derived-signals/recent-activity-concentration.d.ts +1 -2
- package/build/core/domains/trajectory/git/rerank/derived-signals/recent-activity-concentration.d.ts.map +1 -1
- package/build/core/domains/trajectory/git/rerank/derived-signals/recent-activity-concentration.js +5 -5
- package/build/core/domains/trajectory/git/rerank/derived-signals/recent-activity-concentration.js.map +1 -1
- package/build/core/domains/trajectory/git/rerank/derived-signals/relative-churn-norm.d.ts +1 -2
- package/build/core/domains/trajectory/git/rerank/derived-signals/relative-churn-norm.d.ts.map +1 -1
- package/build/core/domains/trajectory/git/rerank/derived-signals/relative-churn-norm.js +5 -5
- package/build/core/domains/trajectory/git/rerank/derived-signals/relative-churn-norm.js.map +1 -1
- package/build/core/domains/trajectory/git/rerank/derived-signals/volatility.d.ts +1 -2
- package/build/core/domains/trajectory/git/rerank/derived-signals/volatility.d.ts.map +1 -1
- package/build/core/domains/trajectory/git/rerank/derived-signals/volatility.js +5 -5
- package/build/core/domains/trajectory/git/rerank/derived-signals/volatility.js.map +1 -1
- package/build/core/domains/trajectory/git/rerank/presets/hotspots.d.ts +17 -9
- package/build/core/domains/trajectory/git/rerank/presets/hotspots.d.ts.map +1 -1
- package/build/core/domains/trajectory/git/rerank/presets/hotspots.js +17 -9
- package/build/core/domains/trajectory/git/rerank/presets/hotspots.js.map +1 -1
- package/build/core/infra/collection-name.d.ts +17 -4
- package/build/core/infra/collection-name.d.ts.map +1 -1
- package/build/core/infra/collection-name.js +28 -9
- package/build/core/infra/collection-name.js.map +1 -1
- package/build/core/infra/registry/collection-registry.d.ts +30 -0
- package/build/core/infra/registry/collection-registry.d.ts.map +1 -0
- package/build/core/infra/registry/collection-registry.js +139 -0
- package/build/core/infra/registry/collection-registry.js.map +1 -0
- package/build/core/infra/registry/constants.d.ts +24 -0
- package/build/core/infra/registry/constants.d.ts.map +1 -0
- package/build/core/infra/registry/constants.js +24 -0
- package/build/core/infra/registry/constants.js.map +1 -0
- package/build/core/infra/registry/index.d.ts +11 -0
- package/build/core/infra/registry/index.d.ts.map +1 -0
- package/build/core/infra/registry/index.js +10 -0
- package/build/core/infra/registry/index.js.map +1 -0
- package/build/core/infra/registry/registry-file.d.ts +37 -0
- package/build/core/infra/registry/registry-file.d.ts.map +1 -0
- package/build/core/infra/registry/registry-file.js +169 -0
- package/build/core/infra/registry/registry-file.js.map +1 -0
- package/build/core/infra/registry/types.d.ts +28 -0
- package/build/core/infra/registry/types.d.ts.map +1 -0
- package/build/core/infra/registry/types.js +7 -0
- package/build/core/infra/registry/types.js.map +1 -0
- package/build/mcp/tools/code.d.ts.map +1 -1
- package/build/mcp/tools/code.js +30 -4
- package/build/mcp/tools/code.js.map +1 -1
- package/build/mcp/tools/index.d.ts.map +1 -1
- package/build/mcp/tools/index.js +6 -0
- package/build/mcp/tools/index.js.map +1 -1
- package/build/mcp/tools/list-projects.d.ts +14 -0
- package/build/mcp/tools/list-projects.d.ts.map +1 -0
- package/build/mcp/tools/list-projects.js +21 -0
- package/build/mcp/tools/list-projects.js.map +1 -0
- package/build/mcp/tools/register-project.d.ts +15 -0
- package/build/mcp/tools/register-project.d.ts.map +1 -0
- package/build/mcp/tools/register-project.js +33 -0
- package/build/mcp/tools/register-project.js.map +1 -0
- package/build/mcp/tools/schemas.d.ts +15 -4
- package/build/mcp/tools/schemas.d.ts.map +1 -1
- package/build/mcp/tools/schemas.js +53 -7
- package/build/mcp/tools/schemas.js.map +1 -1
- package/build/mcp/tools/unregister-project.d.ts +19 -0
- package/build/mcp/tools/unregister-project.d.ts.map +1 -0
- package/build/mcp/tools/unregister-project.js +25 -0
- package/build/mcp/tools/unregister-project.js.map +1 -0
- package/package.json +2 -1
- package/scripts/install-fish-completion.js +111 -0
- package/scripts/postinstall.js +13 -6
- package/build/core/domains/trajectory/git/rerank/constants.d.ts +0 -10
- package/build/core/domains/trajectory/git/rerank/constants.d.ts.map +0 -1
- package/build/core/domains/trajectory/git/rerank/constants.js +0 -9
- 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;
|
|
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 +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;
|
|
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
|
|
3
|
+
command: "prime [path]",
|
|
4
4
|
describe: "Emit a markdown digest of index state for SessionStart context.",
|
|
5
|
-
builder: (yargs) => yargs
|
|
5
|
+
builder: (yargs) => yargs
|
|
6
|
+
.positional("path", {
|
|
6
7
|
type: "string",
|
|
7
|
-
describe: "Project path (typically $CLAUDE_PROJECT_DIR from a hook)",
|
|
8
|
-
|
|
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;
|
|
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
|