@massa-ai/core 1.57.0 → 1.58.0

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 (50) hide show
  1. package/dist/data/symbol/symbol-repo-workspace.d.ts +17 -0
  2. package/dist/data/symbol/symbol-repo-workspace.d.ts.map +1 -1
  3. package/dist/data/symbol/symbol-repo-workspace.js +29 -0
  4. package/dist/data/symbol/symbol-repo-workspace.js.map +1 -1
  5. package/dist/generated/prisma/edge.js +5 -4
  6. package/dist/generated/prisma/index-browser.js +1 -0
  7. package/dist/generated/prisma/index.d.ts +71 -1
  8. package/dist/generated/prisma/index.js +5 -4
  9. package/dist/generated/prisma/package.json +1 -1
  10. package/dist/generated/prisma/schema.prisma +3 -0
  11. package/dist/kernel/inference-probe.d.ts +18 -0
  12. package/dist/kernel/inference-probe.d.ts.map +1 -0
  13. package/dist/kernel/inference-probe.js +34 -0
  14. package/dist/kernel/inference-probe.js.map +1 -0
  15. package/dist/services/embeddings/config.d.ts +11 -0
  16. package/dist/services/embeddings/config.d.ts.map +1 -1
  17. package/dist/services/embeddings/config.js +63 -10
  18. package/dist/services/embeddings/config.js.map +1 -1
  19. package/dist/services/embeddings/index.d.ts +10 -2
  20. package/dist/services/embeddings/index.d.ts.map +1 -1
  21. package/dist/services/embeddings/index.js.map +1 -1
  22. package/dist/services/etl/pipeline.d.ts.map +1 -1
  23. package/dist/services/etl/pipeline.js +37 -0
  24. package/dist/services/etl/pipeline.js.map +1 -1
  25. package/dist/services/health/local-health-checker.d.ts +32 -1
  26. package/dist/services/health/local-health-checker.d.ts.map +1 -1
  27. package/dist/services/health/local-health-checker.js +88 -16
  28. package/dist/services/health/local-health-checker.js.map +1 -1
  29. package/dist/services/memory/llm-client.d.ts +13 -0
  30. package/dist/services/memory/llm-client.d.ts.map +1 -1
  31. package/dist/services/memory/llm-client.js +76 -3
  32. package/dist/services/memory/llm-client.js.map +1 -1
  33. package/dist/services/search/embedding-freshness.d.ts +94 -0
  34. package/dist/services/search/embedding-freshness.d.ts.map +1 -0
  35. package/dist/services/search/embedding-freshness.js +114 -0
  36. package/dist/services/search/embedding-freshness.js.map +1 -0
  37. package/dist/services/search/ignore-patterns.d.ts +7 -0
  38. package/dist/services/search/ignore-patterns.d.ts.map +1 -1
  39. package/dist/services/search/ignore-patterns.js +9 -0
  40. package/dist/services/search/ignore-patterns.js.map +1 -1
  41. package/dist/services/search/project-indexer.d.ts +15 -1
  42. package/dist/services/search/project-indexer.d.ts.map +1 -1
  43. package/dist/services/search/project-indexer.js +40 -6
  44. package/dist/services/search/project-indexer.js.map +1 -1
  45. package/dist/services/search/search-controller.d.ts.map +1 -1
  46. package/dist/services/search/search-controller.js +31 -1
  47. package/dist/services/search/search-controller.js.map +1 -1
  48. package/package.json +2 -2
  49. package/prisma/migrations/20260919120000_add_embedding_fingerprint/migration.sql +11 -0
  50. package/prisma/schema.prisma +3 -0
@@ -1,39 +1,111 @@
1
1
  /** PostgreSQL/pgvector health checks used by local system status endpoints. */
2
2
  import { config } from "@massa-ai/shared";
3
- import { requirePostgresDatabaseUrl } from "@massa-ai/shared/config";
3
+ import { requirePostgresDatabaseUrl, loadConfigSafe } from "@massa-ai/shared/config";
4
+ import { INFERENCE_PROVIDERS, } from "@massa-ai/shared/inference-providers";
5
+ import { probeProvider } from "../../kernel/inference-probe.js";
4
6
  import { getPgPool } from "../../kernel/db-connection.js";
5
7
  import fs from "fs/promises";
6
8
  import { existsSync } from "fs";
7
9
  import path from "path";
8
10
  import { getSearchDiagnostics, } from "../../kernel/search-diagnostics.js";
9
11
  export class LocalHealthChecker {
10
- ollamaBaseUrl = process.env.OLLAMA_BASE_URL || "http://localhost:11434";
11
12
  dataDir = config.get("dataDir");
13
+ /**
14
+ * `config.json`'s `embedding` block, mirroring `embeddings/config.ts`'s own
15
+ * `fileEmbedding` read — `config.get()`/`config.getAll()` (the `@massa-ai/shared`
16
+ * default export) is a *different* runtime-defaults object (`ServerConfig`)
17
+ * with no `embedding` key at all, so reading the provider from there would
18
+ * always silently resolve `undefined` rather than throw. Read defensively:
19
+ * an unconfigured install has no file, and this must fall back to `ollama`
20
+ * rather than crash the health check.
21
+ */
22
+ fileEmbedding() {
23
+ try {
24
+ return loadConfigSafe().embedding;
25
+ }
26
+ catch {
27
+ return undefined;
28
+ }
29
+ }
30
+ /** Which local-inference provider is configured: `EMBEDDING_PROVIDER` env >
31
+ * `config.json`'s `embedding.provider` > `ollama` (mirrors
32
+ * `embeddings/config.ts`'s `selectedProvider` precedence). */
33
+ resolveProviderId() {
34
+ const provider = process.env.EMBEDDING_PROVIDER || this.fileEmbedding()?.provider;
35
+ return provider === "lmstudio" ? "lmstudio" : "ollama";
36
+ }
37
+ resolveProviderBaseUrl(id) {
38
+ const spec = INFERENCE_PROVIDERS[id];
39
+ const envUrl = process.env[spec.envNames.baseUrl];
40
+ if (envUrl)
41
+ return envUrl;
42
+ const embedding = this.fileEmbedding();
43
+ if (embedding?.provider === id && embedding?.baseURL)
44
+ return embedding.baseURL;
45
+ return spec.defaultEmbeddingBaseUrl;
46
+ }
47
+ resolveConfiguredEmbeddingModel(envName) {
48
+ const envModel = process.env[envName];
49
+ if (envModel)
50
+ return envModel;
51
+ const fileModel = this.fileEmbedding()?.model;
52
+ if (fileModel)
53
+ return fileModel;
54
+ return "nomic-embed-text:latest";
55
+ }
12
56
  async checkAll() {
13
57
  const [ollama, dataDirectory, database] = await Promise.all([this.checkOllama(), this.checkDataDirectory(), this.checkPostgres()]);
14
- const services = { ollama, dataDirectory, vectorStore: database, keywordSearch: database, cache: database, embeddingCache: database };
58
+ const services = { ollama, inference: ollama, dataDirectory, vectorStore: database, keywordSearch: database, cache: database, embeddingCache: database };
15
59
  const unique = [ollama, dataDirectory, database];
16
60
  const healthy = unique.filter((status) => status.available).length;
17
61
  const failed = unique.length - healthy;
18
62
  const status = failed === 0 ? "healthy" : healthy > failed ? "degraded" : "unhealthy";
19
63
  return { status, mode: "postgresql", timestamp: new Date().toISOString(), services, diagnostics: { search: getSearchDiagnostics() }, summary: { total: unique.length, healthy, degraded: 0, failed }, recommendations: this.generateRecommendations(services) };
20
64
  }
65
+ /**
66
+ * Provider-aware reachability + model-listing check, kept under the
67
+ * `ollama` name for compatibility (LIP-10: `services.ollama` and
68
+ * `GET /api/v1/system/ollama` are public surfaces, never renamed in
69
+ * place). Discriminates by response body shape via `probeProvider`
70
+ * (kernel/inference-probe.ts) rather than trusting `response.ok` — LM
71
+ * Studio answers HTTP 200 with `{"error": "..."}` for an Ollama-shaped
72
+ * endpoint, so a status-code check alone reports "Ollama healthy" against
73
+ * a server that is not Ollama.
74
+ */
21
75
  async checkOllama() {
22
76
  const start = Date.now();
23
- try {
24
- const controller = new AbortController();
25
- const timeout = setTimeout(() => controller.abort(), 3_000);
26
- const response = await fetch(`${this.ollamaBaseUrl}/api/tags`, { signal: controller.signal });
27
- clearTimeout(timeout);
28
- if (!response.ok)
29
- return { available: false, latency: Date.now() - start, error: `Ollama responded with HTTP ${response.status}` };
30
- const models = (await response.json()).models || [];
31
- const embeddingModel = process.env.OLLAMA_EMBEDDING_MODEL || config.getAll()?.embedding?.model || "nomic-embed-text:latest";
32
- return { available: true, latency: Date.now() - start, details: { url: this.ollamaBaseUrl, modelsAvailable: models.length, models: models.map((model) => model.name), embeddingModel, hasEmbeddingModel: models.some((model) => model.name === embeddingModel || model.name.startsWith(embeddingModel.split(":")[0])) } };
33
- }
34
- catch (error) {
35
- return { available: false, latency: Date.now() - start, error: `Ollama unreachable: ${error.message}` };
77
+ const providerId = this.resolveProviderId();
78
+ const spec = INFERENCE_PROVIDERS[providerId];
79
+ const baseUrl = this.resolveProviderBaseUrl(providerId);
80
+ const result = await probeProvider(spec, baseUrl);
81
+ const latency = Date.now() - start;
82
+ if (!result.reachable) {
83
+ return {
84
+ available: false,
85
+ latency,
86
+ error: `${spec.id} ${result.reason} at ${baseUrl}`,
87
+ };
36
88
  }
89
+ const embeddingModel = this.resolveConfiguredEmbeddingModel(spec.envNames.model);
90
+ return {
91
+ available: true,
92
+ latency,
93
+ details: {
94
+ provider: spec.id,
95
+ url: baseUrl,
96
+ modelsAvailable: result.models.length,
97
+ models: result.models,
98
+ embeddingModel,
99
+ hasEmbeddingModel: result.models.some((name) => name === embeddingModel || name.startsWith(embeddingModel.split(":")[0])),
100
+ },
101
+ };
102
+ }
103
+ /**
104
+ * Neutral alias for `checkOllama` (LIP-10) — identical provider-aware
105
+ * probe, added beside the Ollama-branded name rather than replacing it.
106
+ */
107
+ async checkInference() {
108
+ return this.checkOllama();
37
109
  }
38
110
  async checkDataDirectory() {
39
111
  const start = Date.now();
@@ -1 +1 @@
1
- {"version":3,"file":"local-health-checker.js","sourceRoot":"","sources":["../../../src/services/health/local-health-checker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-health-checker.js","sourceRoot":"","sources":["../../../src/services/health/local-health-checker.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,7 @@
14
14
  * bootstrap; Phase 5: auto-improve; Phase 7: compression) MUST treat a
15
15
  * `{ ok: false }` result as "fall through to the non-LLM path".
16
16
  */
17
+ import { type InferenceProviderSpec } from "@massa-ai/shared/inference-providers";
17
18
  import { z } from "zod";
18
19
  /**
19
20
  * Which model role a call targets. `"instruct"` (default) selects the
@@ -55,6 +56,18 @@ export declare function _setJsonSchemaSupportedForTesting(flag: boolean | null):
55
56
  /** Whether the LLM is enabled at the current config. Cheap, side-effect-free. */
56
57
  export declare function isLlmEnabled(): boolean;
57
58
  export declare function _setLlmEnabledForTesting(flag: boolean | null): void;
59
+ export declare function _setLlmBaseUrlForTesting(url: string | null): void;
60
+ /**
61
+ * Resolve which local-inference provider `llm.baseUrl` targets (design.md
62
+ * §4, LIP-07): the two Ollama-only behaviours below must not fire against
63
+ * LM Studio. Primary signal is a host:port match against each provider's
64
+ * `defaultLlmBaseUrl`; a baseUrl that matches none of them (custom host, or
65
+ * a provider's default port overridden) falls back to `embedding.provider`
66
+ * when it names a local-inference id, then to `ollama` — today's only
67
+ * behaviour, so an unresolvable baseUrl regresses to nothing.
68
+ * @internal
69
+ */
70
+ export declare function resolveInferenceSpec(baseUrl: string): InferenceProviderSpec;
58
71
  /**
59
72
  * Best-effort `think:false` injection. Ollama's OpenAI-compat layer honors a
60
73
  * top-level `think` field for qwen3. Wrapped fetch keeps the SDK contract
@@ -1 +1 @@
1
- {"version":3,"file":"llm-client.d.ts","sourceRoot":"","sources":["../../../src/services/memory/llm-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,MAAM,CAAC;AAE/C,MAAM,WAAW,kBAAkB;IACjC,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,SAAS,CAAC,EAAE,YAAY,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;CAE3D;AAED,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,MAAM;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAWD;;;;;;GAMG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC,CAiChE;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,CAE5E;AAID,iFAAiF;AACjF,wBAAgB,YAAY,IAAI,OAAO,CAOtC;AAQD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,CAEnE;AA2CD;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,OAAO,UAAU,CAAC,KAAK,GACjC,OAAO,UAAU,CAAC,KAAK,CAgBzB;AAaD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAgCpD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAmCpE;AAOD;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAS5D;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CA0C5B;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EACtB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAuGvB;AAED;;;GAGG;AACH,eAAO,MAAM,GAAG;;;;CAIf,CAAC"}
1
+ {"version":3,"file":"llm-client.d.ts","sourceRoot":"","sources":["../../../src/services/memory/llm-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,EAKL,KAAK,qBAAqB,EAC3B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,MAAM,CAAC;AAE/C,MAAM,WAAW,kBAAkB;IACjC,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,SAAS,CAAC,EAAE,YAAY,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;CAE3D;AAED,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,MAAM;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAWD;;;;;;GAMG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC,CA4ChE;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,CAE5E;AAID,iFAAiF;AACjF,wBAAgB,YAAY,IAAI,OAAO,CAOtC;AAQD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,CAEnE;AA+BD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAEjE;AAiCD;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,CAoB3E;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,OAAO,UAAU,CAAC,KAAK,GACjC,OAAO,UAAU,CAAC,KAAK,CAgBzB;AAoBD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAgCpD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAmCpE;AAOD;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAS5D;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CA0C5B;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EACtB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAuGvB;AAED;;;GAGG;AACH,eAAO,MAAM,GAAG;;;;CAIf,CAAC"}
@@ -17,6 +17,8 @@
17
17
  import { generateText, generateObject } from "ai";
18
18
  import { createOpenAI } from "@ai-sdk/openai";
19
19
  import { config, logger, DEFAULT_LLM_MODEL } from "@massa-ai/shared";
20
+ import { loadConfigSafe } from "@massa-ai/shared/config";
21
+ import { INFERENCE_PROVIDERS, LOCAL_INFERENCE_IDS, inferenceProviderList, } from "@massa-ai/shared/inference-providers";
20
22
  // ── json_schema constrained decoding (W7-07) ─────────────────────────────
21
23
  /**
22
24
  * Cached Ollama json_schema support flag. `null` = not yet checked.
@@ -36,6 +38,17 @@ export async function _checkJsonSchemaSupport() {
36
38
  return _jsonSchemaSupported;
37
39
  try {
38
40
  const llm = getLlmConfig();
41
+ const spec = resolveInferenceSpec(llm.baseUrl);
42
+ if (!spec.supportsOllamaVersionProbe) {
43
+ // LM Studio (and any other non-Ollama local provider) implements the
44
+ // OpenAI-native response_format:{type:"json_schema"} path directly —
45
+ // no version handshake exists to probe, and none is needed (LIP-07).
46
+ _jsonSchemaSupported = true;
47
+ logger.info("json_schema: native support assumed (non-Ollama provider)", {
48
+ provider: spec.id,
49
+ });
50
+ return true;
51
+ }
39
52
  // Ollama's version endpoint is at /api/version (no /v1 prefix).
40
53
  const versionUrl = llm.baseUrl.replace(/\/v1\/?$/, "") + "/api/version";
41
54
  const res = await fetch(versionUrl, { signal: AbortSignal.timeout(5000) });
@@ -115,6 +128,18 @@ export function _setLlmEnabledForTesting(flag) {
115
128
  * Config: `MASSA_AI_LLM_DISABLE_THINK` (default `"1"`). When disabled, behavior
116
129
  * regresses to today's (content-only) path exactly.
117
130
  */
131
+ /**
132
+ * Test seam: force the resolved `llm.baseUrl` without touching config or
133
+ * mocking `@massa-ai/shared` (this file's own test suite deliberately avoids
134
+ * that mock — see llm-client.test.ts's docblock — since bun's mock.module is
135
+ * process-wide and would collide with sibling test files). Pass `null` to
136
+ * clear.
137
+ * @internal
138
+ */
139
+ let testBaseUrlOverride = null;
140
+ export function _setLlmBaseUrlForTesting(url) {
141
+ testBaseUrlOverride = url;
142
+ }
118
143
  /** Read the llm config block with safe defaults (defensive against partial/missing config). */
119
144
  function getLlmConfig(opts) {
120
145
  const cfg = config.get("llm");
@@ -125,7 +150,7 @@ function getLlmConfig(opts) {
125
150
  ? cfg?.codeModel ?? cfg?.model ?? DEFAULT_LLM_MODEL
126
151
  : cfg?.model ?? DEFAULT_LLM_MODEL;
127
152
  return {
128
- baseUrl: cfg?.baseUrl ?? "http://localhost:11434/v1",
153
+ baseUrl: testBaseUrlOverride ?? cfg?.baseUrl ?? "http://localhost:11434/v1",
129
154
  apiKey: cfg?.apiKey ?? "ollama",
130
155
  model,
131
156
  temperature: cfg?.temperature ?? 0.2,
@@ -134,6 +159,47 @@ function getLlmConfig(opts) {
134
159
  disableThink: cfg?.disableThink ?? true,
135
160
  };
136
161
  }
162
+ /** host:port for a URL, or `null` when it doesn't parse. */
163
+ function hostPort(url) {
164
+ try {
165
+ const u = new URL(url);
166
+ return `${u.hostname}:${u.port || (u.protocol === "https:" ? "443" : "80")}`;
167
+ }
168
+ catch {
169
+ return null;
170
+ }
171
+ }
172
+ /**
173
+ * Resolve which local-inference provider `llm.baseUrl` targets (design.md
174
+ * §4, LIP-07): the two Ollama-only behaviours below must not fire against
175
+ * LM Studio. Primary signal is a host:port match against each provider's
176
+ * `defaultLlmBaseUrl`; a baseUrl that matches none of them (custom host, or
177
+ * a provider's default port overridden) falls back to `embedding.provider`
178
+ * when it names a local-inference id, then to `ollama` — today's only
179
+ * behaviour, so an unresolvable baseUrl regresses to nothing.
180
+ * @internal
181
+ */
182
+ export function resolveInferenceSpec(baseUrl) {
183
+ const target = hostPort(baseUrl);
184
+ if (target) {
185
+ const match = inferenceProviderList().find((spec) => hostPort(spec.defaultLlmBaseUrl) === target);
186
+ if (match)
187
+ return match;
188
+ }
189
+ let embeddingProvider = process.env.EMBEDDING_PROVIDER;
190
+ if (!embeddingProvider) {
191
+ try {
192
+ embeddingProvider = loadConfigSafe().embedding?.provider;
193
+ }
194
+ catch {
195
+ embeddingProvider = undefined;
196
+ }
197
+ }
198
+ if (embeddingProvider && LOCAL_INFERENCE_IDS.includes(embeddingProvider)) {
199
+ return INFERENCE_PROVIDERS[embeddingProvider];
200
+ }
201
+ return INFERENCE_PROVIDERS.ollama;
202
+ }
137
203
  /**
138
204
  * Best-effort `think:false` injection. Ollama's OpenAI-compat layer honors a
139
205
  * top-level `think` field for qwen3. Wrapped fetch keeps the SDK contract
@@ -165,12 +231,19 @@ export function _wrapFetchDisableThink(baseFetch) {
165
231
  function buildProvider(llm) {
166
232
  // Ollama exposes an OpenAI-compatible API at /v1; createOpenAI over baseURL
167
233
  // is sufficient (no special compatibility flag in @ai-sdk/openai v3).
234
+ const spec = resolveInferenceSpec(llm.baseUrl);
168
235
  const openai = createOpenAI({
169
236
  baseURL: llm.baseUrl,
170
237
  apiKey: llm.apiKey,
171
- ...(llm.disableThink ? { fetch: _wrapFetchDisableThink(globalThis.fetch) } : {}),
238
+ ...(llm.disableThink && spec.injectsDisableThink
239
+ ? { fetch: _wrapFetchDisableThink(globalThis.fetch) }
240
+ : {}),
172
241
  });
173
- return openai(llm.model);
242
+ // The default callable resolves to the Responses API, which LM Studio serves
243
+ // while dropping `text.format` — gating json_schema on correctly still yields
244
+ // prose there. `.chat()` is the endpoint that honours it. See
245
+ // `requiresChatCompletionsApi`.
246
+ return spec.requiresChatCompletionsApi ? openai.chat(llm.model) : openai(llm.model);
174
247
  }
175
248
  /**
176
249
  * Normalize the reasoning channel exposed by the AI SDK (v5+) into a single
@@ -1 +1 @@
1
- {"version":3,"file":"llm-client.js","sourceRoot":"","sources":["../../../src/services/memory/llm-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"llm-client.js","sourceRoot":"","sources":["../../../src/services/memory/llm-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,GAGtB,MAAM,sCAAsC,CAAC;AA+B9C,4EAA4E;AAE5E;;;;GAIG;AACH,IAAI,oBAAoB,GAAmB,IAAI,CAAC;AAEhD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,IAAI,oBAAoB,KAAK,IAAI;QAAE,OAAO,oBAAoB,CAAC;IAC/D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC;YACrC,qEAAqE;YACrE,qEAAqE;YACrE,qEAAqE;YACrE,oBAAoB,GAAG,IAAI,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,2DAA2D,EAAE;gBACvE,QAAQ,EAAE,IAAI,CAAC,EAAE;aAClB,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QACD,gEAAgE;QAChE,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,cAAc,CAAC;QACxE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,oBAAoB,GAAG,KAAK,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAChF,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyB,CAAC;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,oBAAoB,GAAG,KAAK,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,6CAA6C,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YACxE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,SAAS,GAAG,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;QAC3D,oBAAoB,GAAG,SAAS,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5E,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,oBAAoB,GAAG,KAAK,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,gEAAgE,EAAE;YAC5E,KAAK,EAAG,CAAW,CAAC,OAAO;SAC5B,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iCAAiC,CAAC,IAAoB;IACpE,oBAAoB,GAAG,IAAI,CAAC;AAC9B,CAAC;AAED,4EAA4E;AAE5E,iFAAiF;AACjF,MAAM,UAAU,YAAY;IAC1B,IAAI,mBAAmB,KAAK,IAAI;QAAE,OAAO,mBAAmB,CAAC;IAC7D,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,IAAI,mBAAmB,GAAmB,IAAI,CAAC;AAC/C,MAAM,UAAU,wBAAwB,CAAC,IAAoB;IAC3D,mBAAmB,GAAG,IAAI,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;;;;GAOG;AACH,IAAI,mBAAmB,GAAkB,IAAI,CAAC;AAC9C,MAAM,UAAU,wBAAwB,CAAC,GAAkB;IACzD,mBAAmB,GAAG,GAAG,CAAC;AAC5B,CAAC;AAED,+FAA+F;AAC/F,SAAS,YAAY,CAAC,IAAmC;IACvD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,EAAE,SAAS,IAAI,UAAU,CAAC;IAC3C,0EAA0E;IAC1E,kFAAkF;IAClF,MAAM,KAAK,GACT,IAAI,KAAK,MAAM;QACb,CAAC,CAAC,GAAG,EAAE,SAAS,IAAI,GAAG,EAAE,KAAK,IAAI,iBAAiB;QACnD,CAAC,CAAC,GAAG,EAAE,KAAK,IAAI,iBAAiB,CAAC;IACtC,OAAO;QACL,OAAO,EAAE,mBAAmB,IAAI,GAAG,EAAE,OAAO,IAAI,2BAA2B;QAC3E,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,QAAQ;QAC/B,KAAK;QACL,WAAW,EAAE,GAAG,EAAE,WAAW,IAAI,GAAG;QACpC,eAAe,EAAE,GAAG,EAAE,eAAe,IAAI,IAAI;QAC7C,SAAS,EAAE,GAAG,EAAE,SAAS,IAAI,KAAK;QAClC,YAAY,EAAE,GAAG,EAAE,YAAY,IAAI,IAAI;KACxC,CAAC;AACJ,CAAC;AAED,4DAA4D;AAC5D,SAAS,QAAQ,CAAC,GAAW;IAC3B,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IAC/E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,qBAAqB,EAAE,CAAC,IAAI,CACxC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,MAAM,CACtD,CAAC;QACF,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,IAAI,iBAAiB,GAAuB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC3E,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,iBAAiB,GAAG,cAAc,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB,GAAG,SAAS,CAAC;QAChC,CAAC;IACH,CAAC;IACD,IAAI,iBAAiB,IAAK,mBAAyC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAChG,OAAO,mBAAmB,CAAC,iBAAwC,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,mBAAmB,CAAC,MAAM,CAAC;AACpC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CACpC,SAAkC;IAElC,MAAM,OAAO,GAAG,KAAK,EAAE,KAAU,EAAE,IAAU,EAAqB,EAAE;QAClE,IAAI,CAAC;YACH,IAAI,IAAI,EAAE,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrC,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,EAAE,CAAC;oBACjE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;oBACrB,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yDAAyD;QAC3D,CAAC;QACD,OAAO,SAAS,CAAC,KAAY,EAAE,IAAW,CAAC,CAAC;IAC9C,CAAC,CAAC;IACF,OAAO,OAA6C,CAAC;AACvD,CAAC;AAED,SAAS,aAAa,CAAC,GAAoC;IACzD,4EAA4E;IAC5E,sEAAsE;IACtE,MAAM,IAAI,GAAG,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,YAAY,CAAC;QAC1B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,mBAAmB;YAC9C,CAAC,CAAC,EAAE,KAAK,EAAE,sBAAsB,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YACrD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;IACH,6EAA6E;IAC7E,8EAA8E;IAC9E,8DAA8D;IAC9D,gCAAgC;IAChC,OAAO,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACtF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAW;IAC1C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC;IAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG;aACP,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aAChE,IAAI,CAAC,IAAI,CAAC;aACV,IAAI,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;IAC/C,MAAM,EAAE,GAAG,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAC3C,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,aAAa,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAC/E,wEAAwE;IACxE,0EAA0E;IAC1E,MAAM,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC;IAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,SAAS;YAChD,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7D,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBAC7B,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;wBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBAC7B,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;wBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACpB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACvD,IAAI,KAAK;QAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAChC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACf,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,GAAG;gBAAE,GAAG,GAAG,KAAK,CAAC;iBAChB,IAAI,CAAC,KAAK,IAAI;gBAAE,GAAG,GAAG,IAAI,CAAC;iBAC3B,IAAI,CAAC,KAAK,GAAG;gBAAE,KAAK,GAAG,KAAK,CAAC;QACpC,CAAC;aAAM,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACrB,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;aAAM,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACrB,KAAK,EAAE,CAAC;QACV,CAAC;aAAM,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACrB,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,GAAG,GAAG,CAAC,CAAC;gBACR,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,SAAiB;IACtC,4DAA4D;IAC5D,OAAO,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAY;IACjD,IAAI,GAAG,GAAQ,GAAG,CAAC;IACnB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,GAAG,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,YAAY;YAAE,OAAO,IAAI,CAAC;QAClE,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,IAAI,kCAAkC,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAc,EACd,OAA2B,EAAE;IAE7B,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACpB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAC9C,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAChC,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC;YACzB,MAAM;YACN,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,WAAW,EAAE,aAAa,CAAC,SAAS,CAAC;SACtC,CAAC,CAAC;QACH,MAAM,IAAI,GAAI,MAAc,CAAC,IAAI,IAAI,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACtD,6DAA6D;QAC7D,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;YACrB,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,+DAA+D,EAAE;oBAC3E,YAAY,EAAE,SAAS,CAAC,MAAM;iBAC/B,CAAC,CAAC;gBACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YACxC,CAAC;YACD,4EAA4E;YAC5E,2EAA2E;YAC3E,6EAA6E;YAC7E,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;gBAC1C,YAAY,EAAE,KAAK;gBACnB,YAAY,EAAG,MAAc,EAAE,YAAY,IAAI,IAAI;aACpD,CAAC,CAAC;QACL,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,yDAAyD,EAAE,EAAE,CAAC,CAAC;QAC3E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC;IAChE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,gDAAgD,EAAE;YAC5D,KAAK,EAAG,CAAW,CAAC,OAAO;SAC5B,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC;IACpD,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,MAAc,EACd,MAAsB,EACtB,OAAyB,EAAE;IAE3B,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACpB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAC9C,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC;IAClD,IAAI,MAAM,GAAQ,IAAI,CAAC;IACvB,IAAI,CAAC;QACH,kEAAkE;QAClE,oEAAoE;QACpE,yEAAyE;QACzE,sEAAsE;QACtE,mEAAmE;QACnE,MAAM,aAAa,GAAG,GAAG,CAAC,YAAY,IAAI,CAAC,MAAM,uBAAuB,EAAE,CAAC,CAAC;QAE5E,IAAI,aAAa,EAAE,CAAC;YAClB,2EAA2E;YAC3E,0EAA0E;YAC1E,MAAM,GAAG,MAAM,cAAc,CAAC;gBAC5B,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC;gBACzB,MAAM;gBACN,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM;gBACN,UAAU,EAAE,UAAU;gBACtB,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,eAAe,EAAE,GAAG,CAAC,eAAe;gBACpC,WAAW,EAAE,aAAa,CAAC,SAAS,CAAC;aACtC,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,EAAE,CAAC,CAAC;YAC1D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QAC5C,CAAC;QAED,2EAA2E;QAC3E,yEAAyE;QACzE,qEAAqE;QACrE,MAAM,GAAG,MAAM,cAAc,CAAC;YAC5B,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC;YACzB,MAAM;YACN,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,WAAW;YACnB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,WAAW,EAAE,aAAa,CAAC,SAAS,CAAC;SACtC,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,kDAAkD,EAAE,EAAE,CAAC,CAAC;YACpE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;QAC7C,CAAC;QACD,8EAA8E;QAC9E,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;YACrB,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBAC7C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;oBAC3C,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;wBACtB,MAAM,CAAC,IAAI,CAAC,oEAAoE,EAAE;4BAChF,YAAY,EAAE,SAAS,CAAC,MAAM;yBAC/B,CAAC,CAAC;wBACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;oBAC7C,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE;YACnD,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SAClE,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,0CAA0C,EAAE,CAAC;IAC1E,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,6EAA6E;QAC7E,0EAA0E;QAC1E,4EAA4E;QAC5E,0EAA0E;QAC1E,yEAAyE;QACzE,6DAA6D;QAC7D,IAAI,GAAG,CAAC,YAAY,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,MAAM,SAAS,GACb,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;YACvF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBAC7C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;oBAC3C,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;wBACtB,MAAM,CAAC,IAAI,CAAC,oDAAoD,EAAE;4BAChE,YAAY,EAAE,SAAS,CAAC,MAAM;yBAC/B,CAAC,CAAC;wBACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;oBAC7C,CAAC;gBACH,CAAC;YACH,CAAC;YACD,sEAAsE;YACtE,gFAAgF;YAChF,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;gBAC1C,YAAY,EAAE,KAAK;gBACnB,YAAY,EAAG,CAAS,EAAE,YAAY,IAAI,IAAI;aAC/C,CAAC,CAAC;QACL,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,8CAA8C,EAAE;YAC1D,KAAK,EAAG,CAAW,CAAC,OAAO;SAC5B,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC;IACpD,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,QAAQ,EAAE,WAAW;IACrB,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,YAAY;CACxB,CAAC"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * LIP-15 — the embedding-fingerprint vocabulary, extracted from
3
+ * `project-indexer.ts`.
4
+ *
5
+ * A workspace is indexed under one `${provider}:${model}:${dimensions}`
6
+ * triple. Querying or appending to it under a different one mixes two vector
7
+ * spaces in one table, which degrades silently rather than failing — so both
8
+ * the read gate (`checkSearchAdmission`) and the write gate
9
+ * (`ensureFreshIndex`'s `needsFullReindex`) compare the stored fingerprint
10
+ * against the live one.
11
+ *
12
+ * It lives here rather than in `project-indexer.ts` for two reasons, and the
13
+ * first is the one that forced it: adding this gate took that file from 640 to
14
+ * 761 LOC, past the 700-LOC hub ceiling `scripts/search-hub-metric.ts`
15
+ * enforces (G-HUB) — caught by CI, not locally, because that gate runs only
16
+ * from `ci.yml` and is not wired into `bun run test:scripts`.
17
+ *
18
+ * **`project-indexer.ts` now sits at exactly 700, with zero headroom.** The
19
+ * next line added to it reddens G-HUB. That is the gate working as intended —
20
+ * it wants the hub decomposed further, and the honest reading is that this
21
+ * extraction paid the immediate debt without finishing the job. Take the next
22
+ * cohesive unit out (the result types, or `indexProjectInternal`) rather than
23
+ * shaving comments to buy a line. The second is that both gates were restating the same
24
+ * three-clause predicate independently, which is exactly the drift this
25
+ * module's `embeddingFingerprintMismatch` now makes impossible.
26
+ *
27
+ * `project-indexer.ts` re-exports `EmbeddingIndexStaleError` and
28
+ * `currentEmbeddingFingerprint` so no importer had to change.
29
+ *
30
+ * ## Which gate actually runs in production (post-review, 2026-09-19)
31
+ *
32
+ * `ensureFreshIndex`'s `needsFullReindex` branch — not just its fingerprint
33
+ * arm — has **zero production callers**. Its only caller is
34
+ * `SearchController.handleAutoReindex`, which hardcodes
35
+ * `allowFullReindex: false`, so every `needsFullReindex === true` outcome is
36
+ * deferred and never reaches `deps.indexProject` or the stamp beside it.
37
+ *
38
+ * The reachable production recovery for a stale fingerprint is `index_project`
39
+ * with `forceReindex: true`, which runs `EtlPipeline.run()`
40
+ * (`services/etl/pipeline.ts`) — a separate full-reindex mechanism that never
41
+ * calls `ensureFreshIndex`, and where the fingerprint is actually stamped.
42
+ * Both sites use the same `stampEmbeddingFingerprint` /
43
+ * `currentEmbeddingFingerprint` pair, so they cannot disagree on the *value*,
44
+ * only on whether they currently run.
45
+ *
46
+ * That branch is kept, tested and correct for the day a caller passes
47
+ * `allowFullReindex: true` — deleting documented, correct behaviour to chase
48
+ * "no dead code" would be the wrong trade — but it must not be read as *the*
49
+ * write gate. See `search-controller.ts`'s Tier 1b comment for why the read
50
+ * gate stays unconditional instead of giving this branch a reachable caller.
51
+ */
52
+ /**
53
+ * Raised by the search entry path when the workspace's stored embedding
54
+ * fingerprint (`${provider}:${model}:${dimensions}`, stamped by the last full
55
+ * reindex) disagrees with the currently configured embedding. Search must
56
+ * never fall through to a table holding two mixed embedding spaces — the
57
+ * caller throws this instead of returning rows.
58
+ */
59
+ export declare class EmbeddingIndexStaleError extends Error {
60
+ readonly projectId: string;
61
+ readonly storedFingerprint: string;
62
+ readonly currentFingerprint: string;
63
+ constructor(projectId: string, storedFingerprint: string, currentFingerprint: string);
64
+ }
65
+ /**
66
+ * The live embedding fingerprint (design.md §5): `${provider}:${model}:${dimensions}`
67
+ * for the currently *selected* provider — `getProvidersByPriority()[0]`, the
68
+ * priority-1 entry `services/embeddings/config.ts` resolves synchronously
69
+ * from env + config.json at module load (no network probe, no fallback
70
+ * chain walk — that is `createEmbeddingProvider`'s job, not this gate's).
71
+ * `null` when any component is not resolvable — every caller here treats
72
+ * "unknown" the same as "no mismatch": warn or skip, never block on a value
73
+ * we can't compute.
74
+ */
75
+ export declare function currentEmbeddingFingerprint(): string | null;
76
+ /**
77
+ * The mismatch pair, or `null` when there is nothing to act on.
78
+ *
79
+ * The three clauses are the whole gate, and the two `null` cases are
80
+ * deliberate rather than defensive: a stored `null` is a legacy or
81
+ * never-stamped workspace (the next full reindex stamps it), and a live
82
+ * `null` means the configured embedding is not resolvable. Neither is
83
+ * evidence of a *disagreement*, so neither blocks — only a stored value that
84
+ * actively contradicts a resolvable live one does.
85
+ *
86
+ * Both gates previously spelled this out separately, in the two shapes the
87
+ * call sites happened to want (a boolean, and an object). One predicate, two
88
+ * readings of its result, so they cannot drift into two different rules.
89
+ */
90
+ export declare function embeddingFingerprintMismatch(storedFingerprint: string | null, liveFingerprint?: string | null): {
91
+ stored: string;
92
+ current: string;
93
+ } | null;
94
+ //# sourceMappingURL=embedding-freshness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-freshness.d.ts","sourceRoot":"","sources":["../../../src/services/search/embedding-freshness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAIH;;;;;;GAMG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;IAE/C,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,MAAM;IAClC,QAAQ,CAAC,kBAAkB,EAAE,MAAM;gBAF1B,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,EACzB,kBAAkB,EAAE,MAAM;CAUtC;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,GAAG,IAAI,CAM3D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,4BAA4B,CAC1C,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAChC,eAAe,GAAE,MAAM,GAAG,IAAoC,GAC7D;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAS5C"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * LIP-15 — the embedding-fingerprint vocabulary, extracted from
3
+ * `project-indexer.ts`.
4
+ *
5
+ * A workspace is indexed under one `${provider}:${model}:${dimensions}`
6
+ * triple. Querying or appending to it under a different one mixes two vector
7
+ * spaces in one table, which degrades silently rather than failing — so both
8
+ * the read gate (`checkSearchAdmission`) and the write gate
9
+ * (`ensureFreshIndex`'s `needsFullReindex`) compare the stored fingerprint
10
+ * against the live one.
11
+ *
12
+ * It lives here rather than in `project-indexer.ts` for two reasons, and the
13
+ * first is the one that forced it: adding this gate took that file from 640 to
14
+ * 761 LOC, past the 700-LOC hub ceiling `scripts/search-hub-metric.ts`
15
+ * enforces (G-HUB) — caught by CI, not locally, because that gate runs only
16
+ * from `ci.yml` and is not wired into `bun run test:scripts`.
17
+ *
18
+ * **`project-indexer.ts` now sits at exactly 700, with zero headroom.** The
19
+ * next line added to it reddens G-HUB. That is the gate working as intended —
20
+ * it wants the hub decomposed further, and the honest reading is that this
21
+ * extraction paid the immediate debt without finishing the job. Take the next
22
+ * cohesive unit out (the result types, or `indexProjectInternal`) rather than
23
+ * shaving comments to buy a line. The second is that both gates were restating the same
24
+ * three-clause predicate independently, which is exactly the drift this
25
+ * module's `embeddingFingerprintMismatch` now makes impossible.
26
+ *
27
+ * `project-indexer.ts` re-exports `EmbeddingIndexStaleError` and
28
+ * `currentEmbeddingFingerprint` so no importer had to change.
29
+ *
30
+ * ## Which gate actually runs in production (post-review, 2026-09-19)
31
+ *
32
+ * `ensureFreshIndex`'s `needsFullReindex` branch — not just its fingerprint
33
+ * arm — has **zero production callers**. Its only caller is
34
+ * `SearchController.handleAutoReindex`, which hardcodes
35
+ * `allowFullReindex: false`, so every `needsFullReindex === true` outcome is
36
+ * deferred and never reaches `deps.indexProject` or the stamp beside it.
37
+ *
38
+ * The reachable production recovery for a stale fingerprint is `index_project`
39
+ * with `forceReindex: true`, which runs `EtlPipeline.run()`
40
+ * (`services/etl/pipeline.ts`) — a separate full-reindex mechanism that never
41
+ * calls `ensureFreshIndex`, and where the fingerprint is actually stamped.
42
+ * Both sites use the same `stampEmbeddingFingerprint` /
43
+ * `currentEmbeddingFingerprint` pair, so they cannot disagree on the *value*,
44
+ * only on whether they currently run.
45
+ *
46
+ * That branch is kept, tested and correct for the day a caller passes
47
+ * `allowFullReindex: true` — deleting documented, correct behaviour to chase
48
+ * "no dead code" would be the wrong trade — but it must not be read as *the*
49
+ * write gate. See `search-controller.ts`'s Tier 1b comment for why the read
50
+ * gate stays unconditional instead of giving this branch a reachable caller.
51
+ */
52
+ import { getProvidersByPriority } from "../embeddings/config.js";
53
+ /**
54
+ * Raised by the search entry path when the workspace's stored embedding
55
+ * fingerprint (`${provider}:${model}:${dimensions}`, stamped by the last full
56
+ * reindex) disagrees with the currently configured embedding. Search must
57
+ * never fall through to a table holding two mixed embedding spaces — the
58
+ * caller throws this instead of returning rows.
59
+ */
60
+ export class EmbeddingIndexStaleError extends Error {
61
+ projectId;
62
+ storedFingerprint;
63
+ currentFingerprint;
64
+ constructor(projectId, storedFingerprint, currentFingerprint) {
65
+ super(`Project '${projectId}' was indexed with embedding fingerprint ` +
66
+ `'${storedFingerprint}', but the configured embedding is now ` +
67
+ `'${currentFingerprint}'. Run index_project with forceReindex: true ` +
68
+ `to rebuild the index for the new embedding.`);
69
+ this.projectId = projectId;
70
+ this.storedFingerprint = storedFingerprint;
71
+ this.currentFingerprint = currentFingerprint;
72
+ this.name = "EmbeddingIndexStaleError";
73
+ }
74
+ }
75
+ /**
76
+ * The live embedding fingerprint (design.md §5): `${provider}:${model}:${dimensions}`
77
+ * for the currently *selected* provider — `getProvidersByPriority()[0]`, the
78
+ * priority-1 entry `services/embeddings/config.ts` resolves synchronously
79
+ * from env + config.json at module load (no network probe, no fallback
80
+ * chain walk — that is `createEmbeddingProvider`'s job, not this gate's).
81
+ * `null` when any component is not resolvable — every caller here treats
82
+ * "unknown" the same as "no mismatch": warn or skip, never block on a value
83
+ * we can't compute.
84
+ */
85
+ export function currentEmbeddingFingerprint() {
86
+ const [, active] = getProvidersByPriority()[0] ?? [];
87
+ if (!active?.provider || !active?.model || active.dimensions === undefined) {
88
+ return null;
89
+ }
90
+ return `${active.provider}:${active.model}:${active.dimensions}`;
91
+ }
92
+ /**
93
+ * The mismatch pair, or `null` when there is nothing to act on.
94
+ *
95
+ * The three clauses are the whole gate, and the two `null` cases are
96
+ * deliberate rather than defensive: a stored `null` is a legacy or
97
+ * never-stamped workspace (the next full reindex stamps it), and a live
98
+ * `null` means the configured embedding is not resolvable. Neither is
99
+ * evidence of a *disagreement*, so neither blocks — only a stored value that
100
+ * actively contradicts a resolvable live one does.
101
+ *
102
+ * Both gates previously spelled this out separately, in the two shapes the
103
+ * call sites happened to want (a boolean, and an object). One predicate, two
104
+ * readings of its result, so they cannot drift into two different rules.
105
+ */
106
+ export function embeddingFingerprintMismatch(storedFingerprint, liveFingerprint = currentEmbeddingFingerprint()) {
107
+ if (storedFingerprint === null ||
108
+ liveFingerprint === null ||
109
+ storedFingerprint === liveFingerprint) {
110
+ return null;
111
+ }
112
+ return { stored: storedFingerprint, current: liveFingerprint };
113
+ }
114
+ //# sourceMappingURL=embedding-freshness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-freshness.js","sourceRoot":"","sources":["../../../src/services/search/embedding-freshness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEjE;;;;;;GAMG;AACH,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IAEtC;IACA;IACA;IAHX,YACW,SAAiB,EACjB,iBAAyB,EACzB,kBAA0B;QAEnC,KAAK,CACH,YAAY,SAAS,2CAA2C;YAC9D,IAAI,iBAAiB,yCAAyC;YAC9D,IAAI,kBAAkB,+CAA+C;YACrE,6CAA6C,CAChD,CAAC;QATO,cAAS,GAAT,SAAS,CAAQ;QACjB,sBAAiB,GAAjB,iBAAiB,CAAQ;QACzB,uBAAkB,GAAlB,kBAAkB,CAAQ;QAQnC,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,2BAA2B;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,sBAAsB,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACrD,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;AACnE,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,4BAA4B,CAC1C,iBAAgC,EAChC,kBAAiC,2BAA2B,EAAE;IAE9D,IACE,iBAAiB,KAAK,IAAI;QAC1B,eAAe,KAAK,IAAI;QACxB,iBAAiB,KAAK,eAAe,EACrC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;AACjE,CAAC"}
@@ -65,4 +65,11 @@ export declare function getActiveCapturePolicy(): Policy;
65
65
  * compose: a path is indexed iff `!ig.ignores(path) && applyCapturePolicy(path) !== 'Drop'`.
66
66
  */
67
67
  export declare function loadProjectIgnore(projectPath: string): Promise<Ignore>;
68
+ /**
69
+ * Historical alias for {@link loadProjectIgnore}, kept because
70
+ * `contextual-search-rlm.ts` and two test suites reach for this name. It lived
71
+ * in `project-indexer.ts` purely as a re-export; gitignore loading is this
72
+ * module's concern, not the indexer's.
73
+ */
74
+ export declare function loadGitignore(projectPath: string): Promise<Ignore>;
68
75
  //# sourceMappingURL=ignore-patterns.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ignore-patterns.d.ts","sourceRoot":"","sources":["../../../src/services/search/ignore-patterns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAqB,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAI1E,eAAO,MAAM,kBAAkB,UAAgE,CAAC;AAEhG;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAE1E;AAED,eAAO,MAAM,eAAe,UAmC3B,CAAC;AAyBF,oEAAoE;AACpE,wBAAgB,kCAAkC,IAAI,IAAI,CAEzD;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAEhE;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB5E"}
1
+ {"version":3,"file":"ignore-patterns.d.ts","sourceRoot":"","sources":["../../../src/services/search/ignore-patterns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAqB,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAI1E,eAAO,MAAM,kBAAkB,UAAgE,CAAC;AAEhG;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAE1E;AAED,eAAO,MAAM,eAAe,UAmC3B,CAAC;AAyBF,oEAAoE;AACpE,wBAAgB,kCAAkC,IAAI,IAAI,CAEzD;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAEhE;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB5E;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,mBAEhD"}
@@ -155,4 +155,13 @@ export async function loadProjectIgnore(projectPath) {
155
155
  }
156
156
  return ig;
157
157
  }
158
+ /**
159
+ * Historical alias for {@link loadProjectIgnore}, kept because
160
+ * `contextual-search-rlm.ts` and two test suites reach for this name. It lived
161
+ * in `project-indexer.ts` purely as a re-export; gitignore loading is this
162
+ * module's concern, not the indexer's.
163
+ */
164
+ export function loadGitignore(projectPath) {
165
+ return loadProjectIgnore(projectPath);
166
+ }
158
167
  //# sourceMappingURL=ignore-patterns.js.map