@remnic/core 9.3.727 → 9.3.728

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 (77) hide show
  1. package/dist/access-boundary.js +6 -6
  2. package/dist/access-cli.js +11 -11
  3. package/dist/access-http.js +10 -10
  4. package/dist/access-mcp.js +9 -9
  5. package/dist/access-operations-batch.js +7 -7
  6. package/dist/access-operations.d.ts +1 -1
  7. package/dist/access-operations.js +8 -8
  8. package/dist/access-schema.d.ts +4 -4
  9. package/dist/access-service.js +5 -5
  10. package/dist/capabilities.d.ts +43 -1
  11. package/dist/capabilities.js +5 -3
  12. package/dist/{chunk-DVRHLN2O.js → chunk-3RCBIOOJ.js} +18 -2
  13. package/dist/{chunk-DVRHLN2O.js.map → chunk-3RCBIOOJ.js.map} +1 -1
  14. package/dist/{chunk-R7IYU5DZ.js → chunk-4ESAR77N.js} +2 -2
  15. package/dist/{chunk-SNKPUJHR.js → chunk-76NHR6ZL.js} +3 -3
  16. package/dist/{chunk-6PY5YJAV.js → chunk-BQCHEV7O.js} +8 -3
  17. package/dist/{chunk-6PY5YJAV.js.map → chunk-BQCHEV7O.js.map} +1 -1
  18. package/dist/{chunk-ZA2S2VLL.js → chunk-C2PG7IEH.js} +5 -2
  19. package/dist/chunk-C2PG7IEH.js.map +1 -0
  20. package/dist/{chunk-MJIHJ7OG.js → chunk-H5BWGCRZ.js} +11 -10
  21. package/dist/chunk-H5BWGCRZ.js.map +1 -0
  22. package/dist/{chunk-N3VNUM4Z.js → chunk-HGNOCPZX.js} +4 -4
  23. package/dist/{chunk-CSRXQ6NB.js → chunk-I5REUWLH.js} +10 -4
  24. package/dist/chunk-I5REUWLH.js.map +1 -0
  25. package/dist/{chunk-NSA5ZRUL.js → chunk-M4AYVEWS.js} +3 -3
  26. package/dist/{chunk-OEEW4KJA.js → chunk-O6YH5F47.js} +3 -3
  27. package/dist/{chunk-XPHVAOBT.js → chunk-QNEUZIAH.js} +45 -36
  28. package/dist/chunk-QNEUZIAH.js.map +1 -0
  29. package/dist/{chunk-27QQC7ZX.js → chunk-UM5AWJNQ.js} +6 -5
  30. package/dist/chunk-UM5AWJNQ.js.map +1 -0
  31. package/dist/{chunk-2KAYTPPT.js → chunk-UTHQPSRC.js} +2 -2
  32. package/dist/{chunk-CTOQEZSN.js → chunk-V4GNSDFH.js} +2 -2
  33. package/dist/{chunk-EHISUJFN.js → chunk-WAS3NV46.js} +6 -3
  34. package/dist/chunk-WAS3NV46.js.map +1 -0
  35. package/dist/{chunk-DKJCRGWM.js → chunk-YGIQORJ3.js} +2 -2
  36. package/dist/cli.js +13 -13
  37. package/dist/embedding-fallback.js +2 -1
  38. package/dist/extraction.js +2 -1
  39. package/dist/{first-start-migration-PG5HBC3K.js → first-start-migration-22LPFHD5.js} +6 -2
  40. package/dist/first-start-migration-22LPFHD5.js.map +1 -0
  41. package/dist/index.js +16 -16
  42. package/dist/namespaces/migrate.js +5 -4
  43. package/dist/namespaces/search.js +4 -3
  44. package/dist/operator-toolkit.js +6 -6
  45. package/dist/orchestrator.js +7 -7
  46. package/dist/schemas.d.ts +22 -22
  47. package/dist/search/embed-helper.js +2 -1
  48. package/dist/search/factory.js +3 -2
  49. package/dist/search/index.js +3 -2
  50. package/dist/transfer/types.d.ts +12 -12
  51. package/package.json +2 -2
  52. package/src/access-service.ts +2 -1
  53. package/src/capabilities.test.ts +155 -0
  54. package/src/capabilities.ts +91 -0
  55. package/src/chat/chat-engine.test.ts +39 -1
  56. package/src/chat/chat-session.ts +25 -2
  57. package/src/cli.ts +3 -2
  58. package/src/embedding-fallback.ts +2 -1
  59. package/src/extraction.ts +7 -3
  60. package/src/maintenance/first-start-migration.ts +3 -1
  61. package/src/orchestrator.ts +38 -26
  62. package/src/search/embed-helper.ts +3 -2
  63. package/dist/chunk-27QQC7ZX.js.map +0 -1
  64. package/dist/chunk-CSRXQ6NB.js.map +0 -1
  65. package/dist/chunk-EHISUJFN.js.map +0 -1
  66. package/dist/chunk-MJIHJ7OG.js.map +0 -1
  67. package/dist/chunk-XPHVAOBT.js.map +0 -1
  68. package/dist/chunk-ZA2S2VLL.js.map +0 -1
  69. package/dist/first-start-migration-PG5HBC3K.js.map +0 -1
  70. /package/dist/{chunk-R7IYU5DZ.js.map → chunk-4ESAR77N.js.map} +0 -0
  71. /package/dist/{chunk-SNKPUJHR.js.map → chunk-76NHR6ZL.js.map} +0 -0
  72. /package/dist/{chunk-N3VNUM4Z.js.map → chunk-HGNOCPZX.js.map} +0 -0
  73. /package/dist/{chunk-NSA5ZRUL.js.map → chunk-M4AYVEWS.js.map} +0 -0
  74. /package/dist/{chunk-OEEW4KJA.js.map → chunk-O6YH5F47.js.map} +0 -0
  75. /package/dist/{chunk-2KAYTPPT.js.map → chunk-UTHQPSRC.js.map} +0 -0
  76. /package/dist/{chunk-CTOQEZSN.js.map → chunk-V4GNSDFH.js.map} +0 -0
  77. /package/dist/{chunk-DKJCRGWM.js.map → chunk-YGIQORJ3.js.map} +0 -0
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-SANZHXY2.js";
13
13
  import {
14
14
  EmbedHelper
15
- } from "./chunk-EHISUJFN.js";
15
+ } from "./chunk-WAS3NV46.js";
16
16
  import {
17
17
  LanceDbBackend
18
18
  } from "./chunk-5CEJH5ZN.js";
@@ -170,4 +170,4 @@ export {
170
170
  createConversationSearchBackend,
171
171
  createConversationIndexRuntime
172
172
  };
173
- //# sourceMappingURL=chunk-2KAYTPPT.js.map
173
+ //# sourceMappingURL=chunk-UTHQPSRC.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createSearchBackend
3
- } from "./chunk-2KAYTPPT.js";
3
+ } from "./chunk-UTHQPSRC.js";
4
4
  import {
5
5
  namespaceIdentityToken,
6
6
  normalizeNamespaceIdentity
@@ -401,4 +401,4 @@ export {
401
401
  namespaceCollectionName,
402
402
  NamespaceSearchRouter
403
403
  };
404
- //# sourceMappingURL=chunk-CTOQEZSN.js.map
404
+ //# sourceMappingURL=chunk-V4GNSDFH.js.map
@@ -5,6 +5,9 @@ import {
5
5
  getHostEmbeddingProvider,
6
6
  normalizeHostEmbeddingVector
7
7
  } from "./chunk-3ONXXHQO.js";
8
+ import {
9
+ resolveMemoryLifecycleCapabilities
10
+ } from "./chunk-3RCBIOOJ.js";
8
11
  import {
9
12
  log
10
13
  } from "./chunk-NU3CSQ4H.js";
@@ -129,7 +132,7 @@ var EmbedHelper = class {
129
132
  return this.cachedProvider;
130
133
  }
131
134
  resolveProvider(options = {}) {
132
- if (!this.config.embeddingFallbackEnabled) return null;
135
+ if (!resolveMemoryLifecycleCapabilities(this.config).embeddingFallback) return null;
133
136
  if (options.includeHost !== false && this.config.hostEmbeddingProviderEnabled !== false) {
134
137
  const hostProvider = this.resolveHostEmbeddingProvider();
135
138
  if (hostProvider) {
@@ -155,7 +158,7 @@ var EmbedHelper = class {
155
158
  return null;
156
159
  }
157
160
  resolveFallbackProviderForIdentity(identity) {
158
- if (!this.config.embeddingFallbackEnabled) return null;
161
+ if (!resolveMemoryLifecycleCapabilities(this.config).embeddingFallback) return null;
159
162
  const separator = identity.indexOf(":");
160
163
  if (separator <= 0 || separator === identity.length - 1) return null;
161
164
  const type = identity.slice(0, separator);
@@ -305,4 +308,4 @@ function normalizeHttpEmbeddingVector(vector) {
305
308
  export {
306
309
  EmbedHelper
307
310
  };
308
- //# sourceMappingURL=chunk-EHISUJFN.js.map
311
+ //# sourceMappingURL=chunk-WAS3NV46.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/search/embed-helper.ts"],"sourcesContent":["import { log } from \"../logger.js\";\nimport { resolveMemoryLifecycleCapabilities } from \"../capabilities.js\";\nimport type { PluginConfig } from \"../types.js\";\nimport { isAbortError } from \"../abort-error.js\";\nimport { withTimeoutSignal } from \"./abort.js\";\nimport {\n getHostEmbeddingProvider,\n type HostEmbeddingProvider,\n type HostEmbeddingInputType,\n normalizeHostEmbeddingVector,\n} from \"../host-embedding-provider.js\";\n\ntype ProviderConfig = {\n type: \"openai\" | \"local\" | \"host\";\n model: string;\n endpoint?: string;\n headers?: Record<string, string>;\n hostProvider?: HostEmbeddingProvider;\n};\n\ntype HostEmbeddingScopeConfig = PluginConfig & {\n /**\n * Internal namespace-router metadata. Host adapters register providers at\n * the root memoryDir while namespace backends operate under scoped dirs.\n */\n hostEmbeddingProviderScope?: string;\n};\n\ntype EmbedHelperOptions = {\n /** Backend-local vector schema dimension for host-provider validation. */\n hostEmbeddingExpectedDimension?: number;\n};\n\nexport type EmbedProviderIdentity = `${ProviderConfig[\"type\"]}:${string}`;\n\nexport type EmbedWithProviderResult = {\n vector: number[];\n providerIdentity: EmbedProviderIdentity;\n};\n\nexport type EmbedBatchWithProviderResult = {\n vectors: (number[] | null)[];\n providerIdentity: EmbedProviderIdentity;\n};\n\nconst DEFAULT_OPENAI_MODEL = \"text-embedding-3-small\";\nconst DEFAULT_PROVIDER_CACHE_TTL_MS = 250;\n\n/**\n * Standalone embedding helper for search backend adapters.\n *\n * NOTE: This intentionally duplicates provider resolution from EmbeddingFallback.\n * EmbeddingFallback is tightly integrated with the plugin lifecycle (telemetry,\n * rate-limit backoff, provider rotation). This class is a lightweight standalone\n * utility used by LanceDB/Orama backends which operate outside plugin context.\n * Merging them would break the port/adapter separation between search and plugin layers.\n */\nexport class EmbedHelper {\n private cachedProvider: ProviderConfig | null | undefined;\n private cachedProviderAt = 0;\n private providerCacheTtlMs = DEFAULT_PROVIDER_CACHE_TTL_MS;\n\n constructor(\n private readonly config: PluginConfig,\n private readonly options: EmbedHelperOptions = {},\n ) {}\n\n /**\n * Whether an embedding provider is available.\n * Re-resolves periodically so late host-provider registration is visible\n * without repeatedly probing provider state on every hot-path call.\n */\n isAvailable(): boolean {\n return this.getProvider() !== null;\n }\n\n /**\n * Embed a single text string. Returns null if no provider is available.\n */\n async embed(text: string, options: { signal?: AbortSignal } = {}): Promise<number[] | null> {\n return (await this.embedWithProvider(text, options))?.vector ?? null;\n }\n\n async embedWithProvider(\n text: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<EmbedWithProviderResult | null> {\n const provider = this.getProvider();\n if (!provider) return null;\n const result = await this.callEmbed(text, provider, options.signal, \"query\");\n if (result) {\n return {\n vector: result,\n providerIdentity: providerIdentity(provider),\n };\n }\n if (provider.type !== \"host\") return null;\n const fallbackProvider = this.resolveProvider({ includeHost: false });\n if (!fallbackProvider) return null;\n const fallbackResult = await this.callEmbed(text, fallbackProvider, options.signal, \"query\");\n return fallbackResult\n ? {\n vector: fallbackResult,\n providerIdentity: providerIdentity(fallbackProvider),\n }\n : null;\n }\n\n async embedWithFallbackProviderIdentity(\n text: string,\n identity: EmbedProviderIdentity,\n options: { signal?: AbortSignal } = {},\n ): Promise<EmbedWithProviderResult | null> {\n const provider = this.resolveFallbackProviderForIdentity(identity);\n if (!provider) return null;\n const result = await this.callEmbed(text, provider, options.signal, \"query\");\n return result\n ? {\n vector: result,\n providerIdentity: providerIdentity(provider),\n }\n : null;\n }\n\n /**\n * Embed a batch of texts. Returns an array parallel to input; entries are null on failure.\n */\n async embedBatch(\n texts: string[],\n batchSize = 32,\n options: { signal?: AbortSignal } = {},\n ): Promise<(number[] | null)[]> {\n return (await this.embedBatchWithProvider(texts, batchSize, options))?.vectors ?? texts.map(() => null);\n }\n\n async embedBatchWithProvider(\n texts: string[],\n batchSize = 32,\n options: { signal?: AbortSignal } = {},\n ): Promise<EmbedBatchWithProviderResult | null> {\n const provider = this.getProvider();\n if (!provider) return null;\n\n if (provider.type === \"host\") {\n const hostResults = await this.embedAllWithProvider(texts, batchSize, provider, options);\n if (!hostResults.some((result) => result === null)) {\n return {\n vectors: hostResults,\n providerIdentity: providerIdentity(provider),\n };\n }\n const fallbackProvider = this.resolveProvider({ includeHost: false });\n if (!fallbackProvider) {\n return {\n vectors: hostResults,\n providerIdentity: providerIdentity(provider),\n };\n }\n const fallbackResults = await this.embedAllWithProvider(texts, batchSize, fallbackProvider, options);\n return {\n vectors: fallbackResults,\n providerIdentity: providerIdentity(fallbackProvider),\n };\n }\n\n return {\n vectors: await this.embedAllWithProvider(texts, batchSize, provider, options),\n providerIdentity: providerIdentity(provider),\n };\n }\n\n getProviderIdentity(): EmbedProviderIdentity | null {\n const provider = this.getProvider();\n return provider ? providerIdentity(provider) : null;\n }\n\n private async embedAllWithProvider(\n texts: string[],\n batchSize: number,\n provider: ProviderConfig,\n options: { signal?: AbortSignal } = {},\n ): Promise<(number[] | null)[]> {\n const results: (number[] | null)[] = new Array(texts.length).fill(null);\n for (let i = 0; i < texts.length; i += batchSize) {\n const batch = texts.slice(i, i + batchSize);\n const batchResults =\n provider.type === \"host\" && provider.hostProvider?.embedBatch\n ? await this.callHostEmbedBatch(batch, provider.hostProvider, options.signal)\n : await Promise.all(\n batch.map((t) => this.callEmbed(t, provider, options.signal, \"document\")),\n );\n for (let j = 0; j < batchResults.length; j++) {\n results[i + j] = batchResults[j];\n }\n }\n return results;\n }\n\n private getProvider(): ProviderConfig | null {\n const now = Date.now();\n if (\n this.cachedProvider !== undefined &&\n now - this.cachedProviderAt < this.providerCacheTtlMs\n ) {\n return this.cachedProvider;\n }\n this.cachedProvider = this.resolveProvider();\n this.cachedProviderAt = now;\n return this.cachedProvider;\n }\n\n private resolveProvider(options: { includeHost?: boolean } = {}): ProviderConfig | null {\n if (!resolveMemoryLifecycleCapabilities(this.config).embeddingFallback) return null;\n\n if (\n options.includeHost !== false &&\n this.config.hostEmbeddingProviderEnabled !== false\n ) {\n const hostProvider = this.resolveHostEmbeddingProvider();\n if (hostProvider) {\n return {\n type: \"host\",\n model: hostProvider.model || hostProvider.id,\n hostProvider,\n };\n }\n }\n\n const preferred = this.config.embeddingFallbackProvider;\n const providers = preferred === \"auto\" ? [\"openai\", \"local\"] : [preferred];\n\n for (const p of providers) {\n if (p === \"openai\") {\n const provider = this.createOpenAiProvider();\n if (provider) return provider;\n }\n\n if (p === \"local\") {\n const provider = this.createLocalProvider();\n if (provider) return provider;\n }\n }\n\n return null;\n }\n\n private resolveFallbackProviderForIdentity(identity: EmbedProviderIdentity): ProviderConfig | null {\n if (!resolveMemoryLifecycleCapabilities(this.config).embeddingFallback) return null;\n const separator = identity.indexOf(\":\");\n if (separator <= 0 || separator === identity.length - 1) return null;\n const type = identity.slice(0, separator);\n const model = identity.slice(separator + 1);\n\n if (type === \"openai\") {\n const provider = this.createOpenAiProvider();\n return provider && provider.model === model ? provider : null;\n }\n if (type === \"local\") {\n const provider = this.createLocalProvider();\n return provider && provider.model === model ? provider : null;\n }\n return null;\n }\n\n private createOpenAiProvider(): ProviderConfig | null {\n if (!this.config.openaiApiKey) return null;\n const baseUrl = this.config.openaiBaseUrl ?? \"https://api.openai.com/v1\";\n return {\n type: \"openai\",\n model: DEFAULT_OPENAI_MODEL,\n endpoint: `${baseUrl.replace(/\\/$/, \"\")}/embeddings`,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.openaiApiKey}`,\n },\n };\n }\n\n private createLocalProvider(): ProviderConfig | null {\n if (!this.config.localLlmEnabled || !this.config.localLlmUrl) return null;\n const base = this.config.localLlmUrl.replace(/\\/$/, \"\");\n const endpoint = /\\/v1$/i.test(base) ? `${base}/embeddings` : `${base}/v1/embeddings`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(this.config.localLlmHeaders ?? {}),\n };\n if (this.config.localLlmApiKey && this.config.localLlmAuthHeader !== false) {\n headers.Authorization = `Bearer ${this.config.localLlmApiKey}`;\n }\n return {\n type: \"local\",\n model:\n this.config.embeddingFallbackModel ||\n this.config.localLlmModel ||\n DEFAULT_OPENAI_MODEL,\n endpoint,\n headers,\n };\n }\n\n private resolveHostEmbeddingProvider(): HostEmbeddingProvider | undefined {\n const scopedConfig = this.config as HostEmbeddingScopeConfig;\n const scopes = [\n scopedConfig.memoryDir,\n scopedConfig.hostEmbeddingProviderScope,\n ].filter((scope): scope is string => typeof scope === \"string\" && scope.trim().length > 0);\n\n for (const scope of new Set(scopes)) {\n const provider = getHostEmbeddingProvider(scope);\n if (provider) return provider;\n }\n return undefined;\n }\n\n private async callEmbed(\n input: string,\n provider: ProviderConfig,\n signal?: AbortSignal,\n inputType: HostEmbeddingInputType = \"document\",\n ): Promise<number[] | null> {\n if (provider.type === \"host\") {\n return this.callHostEmbed(input, provider.hostProvider, signal, inputType);\n }\n if (!provider.endpoint || !provider.headers) return null;\n try {\n const res = await fetch(provider.endpoint, {\n method: \"POST\",\n headers: provider.headers,\n body: JSON.stringify({\n model: provider.model,\n input: input.slice(0, 8000),\n encoding_format: \"float\",\n }),\n signal: withTimeoutSignal(signal, 30_000),\n });\n if (!res.ok) {\n log.debug(`EmbedHelper request failed: ${provider.type} ${res.status}`);\n return null;\n }\n const payload = (await res.json()) as any;\n const vector = payload?.data?.[0]?.embedding;\n return normalizeHttpEmbeddingVector(vector);\n } catch (err) {\n if (isAbortError(err)) throw err;\n log.debug(`EmbedHelper error: ${err}`);\n return null;\n }\n }\n\n private async callHostEmbed(\n input: string,\n provider: HostEmbeddingProvider | undefined,\n signal?: AbortSignal,\n inputType: HostEmbeddingInputType = \"document\",\n ): Promise<number[] | null> {\n if (!provider) return null;\n try {\n const vector = await provider.embed(input.slice(0, 8000), {\n signal: withTimeoutSignal(signal, 30_000),\n inputType,\n });\n return this.normalizeHostEmbeddingVector(vector);\n } catch (err) {\n if (isAbortError(err)) throw err;\n log.debug(`EmbedHelper host provider error: ${err}`);\n return null;\n }\n }\n\n private async callHostEmbedBatch(\n inputs: string[],\n provider: HostEmbeddingProvider,\n signal?: AbortSignal,\n ): Promise<(number[] | null)[]> {\n try {\n const vectors = await provider.embedBatch?.(\n inputs.map((input) => input.slice(0, 8000)),\n {\n signal: withTimeoutSignal(signal, 30_000),\n inputType: \"document\",\n },\n );\n if (!Array.isArray(vectors)) return inputs.map(() => null);\n return inputs.map((_, index) => this.normalizeHostEmbeddingVector(vectors[index]));\n } catch (err) {\n if (isAbortError(err)) throw err;\n log.debug(`EmbedHelper host provider batch error: ${err}`);\n return inputs.map(() => null);\n }\n }\n\n private normalizeHostEmbeddingVector(value: unknown): number[] | null {\n const vector = normalizeHostEmbeddingVector(value);\n if (!vector) return null;\n const expectedDimension = this.resolveHostEmbeddingExpectedDimension();\n if (expectedDimension !== null && vector.length !== expectedDimension) {\n return null;\n }\n return vector;\n }\n\n private resolveHostEmbeddingExpectedDimension(): number | null {\n const value = this.options.hostEmbeddingExpectedDimension;\n return typeof value === \"number\" && Number.isInteger(value) && value > 0\n ? value\n : null;\n }\n}\n\nfunction providerIdentity(provider: ProviderConfig): EmbedProviderIdentity {\n return `${provider.type}:${provider.model}`;\n}\n\nfunction normalizeHttpEmbeddingVector(vector: unknown): number[] | null {\n if (!Array.isArray(vector)) return null;\n const normalized: number[] = [];\n for (const component of vector) {\n if (typeof component !== \"number\" || !Number.isFinite(component)) {\n return null;\n }\n normalized.push(component);\n }\n return normalized;\n}\n"],"mappings":"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","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-3TSTGI6F.js";
4
4
  import {
5
5
  namespaceCollectionName
6
- } from "./chunk-CTOQEZSN.js";
6
+ } from "./chunk-V4GNSDFH.js";
7
7
  import {
8
8
  namespaceIdentityFromToken,
9
9
  namespaceIdentityToken
@@ -204,4 +204,4 @@ export {
204
204
  verifyNamespaces,
205
205
  runNamespaceMigration
206
206
  };
207
- //# sourceMappingURL=chunk-DKJCRGWM.js.map
207
+ //# sourceMappingURL=chunk-YGIQORJ3.js.map
package/dist/cli.js CHANGED
@@ -90,7 +90,7 @@ import {
90
90
  runWorkProductStatusCliCommand,
91
91
  runWorkProjectCliCommand,
92
92
  runWorkTaskCliCommand
93
- } from "./chunk-MJIHJ7OG.js";
93
+ } from "./chunk-H5BWGCRZ.js";
94
94
  import "./chunk-MC4FJXPA.js";
95
95
  import "./chunk-LQHDIS7L.js";
96
96
  import "./chunk-7F7Z6MOS.js";
@@ -123,8 +123,8 @@ import "./chunk-HOHVIVDR.js";
123
123
  import "./chunk-TGQ2NTWH.js";
124
124
  import "./chunk-CKFLLAIS.js";
125
125
  import "./chunk-3T74IZB3.js";
126
- import "./chunk-NSA5ZRUL.js";
127
- import "./chunk-DKJCRGWM.js";
126
+ import "./chunk-M4AYVEWS.js";
127
+ import "./chunk-YGIQORJ3.js";
128
128
  import "./chunk-HL4DB7TO.js";
129
129
  import "./chunk-7XH7VJN4.js";
130
130
  import "./chunk-EZ25VE3G.js";
@@ -169,7 +169,7 @@ import "./chunk-G6NKALRN.js";
169
169
  import "./chunk-OO42R444.js";
170
170
  import "./chunk-K6MV3TRQ.js";
171
171
  import "./chunk-OADWQ5CR.js";
172
- import "./chunk-N3VNUM4Z.js";
172
+ import "./chunk-HGNOCPZX.js";
173
173
  import "./chunk-SEDEKFYQ.js";
174
174
  import "./chunk-JBPKEARU.js";
175
175
  import "./chunk-TMSXWOBZ.js";
@@ -178,10 +178,10 @@ import "./chunk-RSUYKGGZ.js";
178
178
  import "./chunk-42NQ7AVG.js";
179
179
  import "./chunk-7RXCMVFQ.js";
180
180
  import "./chunk-7WV3F5DQ.js";
181
- import "./chunk-6PY5YJAV.js";
181
+ import "./chunk-BQCHEV7O.js";
182
182
  import "./chunk-D24OXEPB.js";
183
- import "./chunk-SNKPUJHR.js";
184
- import "./chunk-OEEW4KJA.js";
183
+ import "./chunk-76NHR6ZL.js";
184
+ import "./chunk-O6YH5F47.js";
185
185
  import "./chunk-ZQNCHPTZ.js";
186
186
  import "./chunk-YF6FMLBT.js";
187
187
  import "./chunk-R6OVFAX6.js";
@@ -189,8 +189,8 @@ import "./chunk-PLBIPT6I.js";
189
189
  import "./chunk-35NN3ZFA.js";
190
190
  import "./chunk-T4WDJPEZ.js";
191
191
  import "./chunk-FVZ2ISIX.js";
192
- import "./chunk-R7IYU5DZ.js";
193
- import "./chunk-27QQC7ZX.js";
192
+ import "./chunk-4ESAR77N.js";
193
+ import "./chunk-UM5AWJNQ.js";
194
194
  import "./chunk-GDASG7NC.js";
195
195
  import "./chunk-GDB4J2H3.js";
196
196
  import "./chunk-ARV3AUOM.js";
@@ -212,13 +212,13 @@ import "./chunk-DRUDC2UX.js";
212
212
  import "./chunk-AQEJKOKI.js";
213
213
  import "./chunk-6HMYUWXR.js";
214
214
  import "./chunk-J6BH2OBA.js";
215
- import "./chunk-CTOQEZSN.js";
216
- import "./chunk-2KAYTPPT.js";
215
+ import "./chunk-V4GNSDFH.js";
216
+ import "./chunk-UTHQPSRC.js";
217
217
  import "./chunk-WRFKZEO6.js";
218
218
  import "./chunk-CYEPCZN5.js";
219
219
  import "./chunk-LQ6JI4VH.js";
220
220
  import "./chunk-SANZHXY2.js";
221
- import "./chunk-EHISUJFN.js";
221
+ import "./chunk-WAS3NV46.js";
222
222
  import "./chunk-5CEJH5ZN.js";
223
223
  import "./chunk-AER6MT24.js";
224
224
  import "./chunk-CINZGPSJ.js";
@@ -238,7 +238,7 @@ import "./chunk-QDW3E4RD.js";
238
238
  import "./chunk-EH5ED3C6.js";
239
239
  import "./chunk-3ONXXHQO.js";
240
240
  import "./chunk-ODPLEWB6.js";
241
- import "./chunk-DVRHLN2O.js";
241
+ import "./chunk-3RCBIOOJ.js";
242
242
  import "./chunk-ZY2MNJR6.js";
243
243
  import "./chunk-SQNED75R.js";
244
244
  import "./chunk-EHQ5HO5T.js";
@@ -2,8 +2,9 @@ import {
2
2
  EmbeddingFallback,
3
3
  EmbeddingProviderUnavailableError,
4
4
  EmbeddingTimeoutError
5
- } from "./chunk-ZA2S2VLL.js";
5
+ } from "./chunk-C2PG7IEH.js";
6
6
  import "./chunk-3ONXXHQO.js";
7
+ import "./chunk-3RCBIOOJ.js";
7
8
  import "./chunk-JUC24CTX.js";
8
9
  import "./chunk-NU3CSQ4H.js";
9
10
  import "./chunk-PZ5AY32C.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ExtractionEngine
3
- } from "./chunk-CSRXQ6NB.js";
3
+ } from "./chunk-I5REUWLH.js";
4
4
  import "./chunk-4RA3C3EV.js";
5
5
  import "./chunk-5GSUBCZM.js";
6
6
  import "./chunk-54V4BZWP.js";
@@ -13,6 +13,7 @@ import "./chunk-EI6V5UXY.js";
13
13
  import "./chunk-PNLCEFE4.js";
14
14
  import "./chunk-O75CRYGF.js";
15
15
  import "./chunk-QDW3E4RD.js";
16
+ import "./chunk-3RCBIOOJ.js";
16
17
  import "./chunk-VUA4S7P6.js";
17
18
  import "./chunk-IQVQJJL7.js";
18
19
  import "./chunk-L2EXJQJP.js";
@@ -10,6 +10,9 @@ import {
10
10
  } from "./chunk-S75M5ZRK.js";
11
11
  import "./chunk-2F6NP3NT.js";
12
12
  import "./chunk-TERNBNJB.js";
13
+ import {
14
+ resolveMemoryLifecycleCapabilities
15
+ } from "./chunk-3RCBIOOJ.js";
13
16
  import "./chunk-TBBDFYXW.js";
14
17
  import "./chunk-A2IYSXDQ.js";
15
18
  import "./chunk-LPSF4OQH.js";
@@ -100,6 +103,7 @@ async function runFirstStartMigration(options) {
100
103
  signal
101
104
  } = options;
102
105
  const now = (options.now ?? (() => /* @__PURE__ */ new Date()))();
106
+ const lifecycleCaps = resolveMemoryLifecycleCapabilities(config);
103
107
  const abortedResult = (candidateCount2 = 0, demotedCount2 = 0, failureCount2 = 0) => ({
104
108
  skipped: candidateCount2 === 0 && demotedCount2 === 0 && failureCount2 === 0,
105
109
  skipReason: candidateCount2 === 0 && demotedCount2 === 0 && failureCount2 === 0 ? "aborted" : void 0,
@@ -112,7 +116,7 @@ async function runFirstStartMigration(options) {
112
116
  if (signal?.aborted) {
113
117
  return abortedResult();
114
118
  }
115
- if (!config.lifecyclePolicyEnabled) {
119
+ if (!lifecycleCaps.lifecyclePolicy) {
116
120
  return {
117
121
  skipped: true,
118
122
  skipReason: "lifecyclePolicyEnabled is false",
@@ -260,4 +264,4 @@ export {
260
264
  LIFECYCLE_INIT_DONE_MARKER,
261
265
  runFirstStartMigration
262
266
  };
263
- //# sourceMappingURL=first-start-migration-PG5HBC3K.js.map
267
+ //# sourceMappingURL=first-start-migration-22LPFHD5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/maintenance/first-start-migration.ts"],"sourcesContent":["/**\n * First-start lifecycle migration (issue #686 retention-completion).\n *\n * When `lifecyclePolicyEnabled` is true but the memoryDir has never been\n * touched by the lifecycle policy (i.e. the state marker\n * `.lifecycle-init-done` does not exist), run a one-time, rate-limited\n * demotion sweep so the hot tier isn't flooded on the first real cron pass.\n *\n * Design constraints:\n * - Capped at `FIRST_START_DEMOTION_CAP` (default 50) demotions per run\n * so a large pre-existing corpus doesn't stall startup.\n * - Resumable: subsequent invocations see the marker and skip.\n * - The marker is written AFTER all mutations succeed so a crash during\n * migration doesn't leave a false \"done\" marker (CLAUDE.md rule #12).\n * - Dry-run mode reports candidates without mutating anything or writing\n * the marker (safe to call from tests).\n */\n\nimport path from \"node:path\";\nimport { access, mkdir, readFile, unlink, writeFile } from \"node:fs/promises\";\nimport { resolveMemoryLifecycleCapabilities } from \"../capabilities.js\";\nimport type { StorageManager } from \"../storage.js\";\nimport type { PluginConfig } from \"../types.js\";\nimport {\n decideTierTransition,\n type TierRoutingPolicy,\n} from \"../tier-routing.js\";\nimport { TierMigrationExecutor } from \"../tier-migration.js\";\nimport type { SearchBackend } from \"../search/port.js\";\nimport {\n applyUtilityPromotionRuntimePolicy,\n loadUtilityRuntimeValues,\n} from \"../utility-runtime.js\";\n\nexport const FIRST_START_DEMOTION_CAP = 50;\nexport const LIFECYCLE_INIT_DONE_MARKER = \".lifecycle-init-done\";\nconst LIFECYCLE_QMD_REFRESH_PENDING_MARKER = \".lifecycle-qmd-refresh-pending\";\n\ntype QmdRefreshPendingMarker = {\n createdAt: string;\n collection: string;\n};\n\nexport interface FirstStartMigrationOptions {\n storage: StorageManager;\n config: PluginConfig;\n /** Override the per-run demotion cap (default: FIRST_START_DEMOTION_CAP). */\n demotionCap?: number;\n /** When true, report candidates but do not mutate or write the marker. */\n dryRun?: boolean;\n /** Optional QMD backend used to journal demotions and refresh tier collections. */\n qmd?: SearchBackend;\n /** Hot-tier QMD collection name. Defaults to config.qmdCollection. */\n hotCollection?: string;\n /** Cold-tier QMD collection name. Defaults to config.qmdColdCollection. */\n coldCollection?: string;\n /** Optional shutdown signal. When aborted, the migration stops without writing the done marker. */\n signal?: AbortSignal;\n /** Override clock for tests. */\n now?: () => Date;\n}\n\nexport interface FirstStartMigrationResult {\n skipped: boolean;\n skipReason?: string;\n dryRun: boolean;\n candidateCount: number;\n demotedCount: number;\n /** Number of individual demotion failures. When > 0, the init-done marker is\n * NOT written so the next start can retry the failed demotions. */\n failureCount: number;\n cappedAt: number;\n}\n\nfunction markerPath(memoryDir: string): string {\n return path.join(memoryDir, \"state\", LIFECYCLE_INIT_DONE_MARKER);\n}\n\nfunction qmdRefreshPendingPath(memoryDir: string): string {\n return path.join(memoryDir, \"state\", LIFECYCLE_QMD_REFRESH_PENDING_MARKER);\n}\n\nasync function markerExists(memoryDir: string): Promise<boolean> {\n try {\n await access(markerPath(memoryDir));\n return true;\n } catch {\n return false;\n }\n}\n\nasync function writeMarker(memoryDir: string, now: Date): Promise<void> {\n const p = markerPath(memoryDir);\n await mkdir(path.dirname(p), { recursive: true });\n await writeFile(p, JSON.stringify({ createdAt: now.toISOString() }), \"utf-8\");\n}\n\nasync function readQmdRefreshPending(memoryDir: string): Promise<QmdRefreshPendingMarker | null> {\n try {\n const raw = await readFile(qmdRefreshPendingPath(memoryDir), \"utf-8\");\n const parsed = JSON.parse(raw) as unknown;\n if (\n parsed &&\n typeof parsed === \"object\" &&\n typeof (parsed as { createdAt?: unknown }).createdAt === \"string\" &&\n typeof (parsed as { collection?: unknown }).collection === \"string\" &&\n (parsed as { collection: string }).collection.length > 0\n ) {\n return parsed as QmdRefreshPendingMarker;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nasync function pathExists(p: string): Promise<boolean> {\n try {\n await access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function writeQmdRefreshPending(memoryDir: string, now: Date, collection: string): Promise<void> {\n const p = qmdRefreshPendingPath(memoryDir);\n await mkdir(path.dirname(p), { recursive: true });\n await writeFile(p, JSON.stringify({ createdAt: now.toISOString(), collection }), \"utf-8\");\n}\n\nasync function clearQmdRefreshPending(memoryDir: string): Promise<void> {\n await unlink(qmdRefreshPendingPath(memoryDir)).catch(() => {});\n}\n\nasync function buildTierRoutingPolicy(config: PluginConfig): Promise<TierRoutingPolicy> {\n const basePolicy: TierRoutingPolicy = {\n enabled: config.qmdTierMigrationEnabled,\n demotionMinAgeDays: config.qmdTierDemotionMinAgeDays,\n demotionValueThreshold: config.qmdTierDemotionValueThreshold,\n promotionValueThreshold: config.qmdTierPromotionValueThreshold,\n };\n const runtime = await loadUtilityRuntimeValues({\n memoryDir: config.memoryDir,\n memoryUtilityLearningEnabled: config.memoryUtilityLearningEnabled,\n promotionByOutcomeEnabled: config.promotionByOutcomeEnabled,\n });\n return applyUtilityPromotionRuntimePolicy(basePolicy, runtime);\n}\n\nasync function refreshQmdCollection(\n qmd: SearchBackend,\n collection: string,\n signal?: AbortSignal,\n): Promise<void> {\n if (typeof qmd.updateCollectionStrict === \"function\") {\n await qmd.updateCollectionStrict(collection, { signal });\n return;\n }\n await qmd.updateCollection(collection, { signal });\n}\n\n/**\n * Run the first-start migration sweep. No-ops when:\n * - `lifecyclePolicyEnabled` is false, or\n * - `qmdTierMigrationEnabled` is false (no tier migration configured), or\n * - the state marker already exists (already ran).\n *\n * Returns a structured result describing what happened.\n */\nexport async function runFirstStartMigration(\n options: FirstStartMigrationOptions,\n): Promise<FirstStartMigrationResult> {\n const {\n storage,\n config,\n demotionCap = FIRST_START_DEMOTION_CAP,\n dryRun = false,\n qmd,\n signal,\n } = options;\n const now = (options.now ?? (() => new Date()))();\n const lifecycleCaps = resolveMemoryLifecycleCapabilities(config);\n const abortedResult = (candidateCount = 0, demotedCount = 0, failureCount = 0): FirstStartMigrationResult => ({\n skipped: candidateCount === 0 && demotedCount === 0 && failureCount === 0,\n skipReason: candidateCount === 0 && demotedCount === 0 && failureCount === 0 ? \"aborted\" : undefined,\n dryRun,\n candidateCount,\n demotedCount,\n failureCount,\n cappedAt: demotionCap,\n });\n\n if (signal?.aborted) {\n return abortedResult();\n }\n\n if (!lifecycleCaps.lifecyclePolicy) {\n return {\n skipped: true,\n skipReason: \"lifecyclePolicyEnabled is false\",\n dryRun,\n candidateCount: 0,\n demotedCount: 0,\n failureCount: 0,\n cappedAt: demotionCap,\n };\n }\n\n if (!config.qmdTierMigrationEnabled) {\n return {\n skipped: true,\n skipReason: \"qmdTierMigrationEnabled is false\",\n dryRun,\n candidateCount: 0,\n demotedCount: 0,\n failureCount: 0,\n cappedAt: demotionCap,\n };\n }\n\n if (await markerExists(config.memoryDir)) {\n return {\n skipped: true,\n skipReason: \"lifecycle-init-done marker already present\",\n dryRun,\n candidateCount: 0,\n demotedCount: 0,\n failureCount: 0,\n cappedAt: demotionCap,\n };\n }\n\n if (signal?.aborted) {\n return abortedResult();\n }\n\n const policy = await buildTierRoutingPolicy(config);\n if (signal?.aborted) {\n return abortedResult();\n }\n\n const hotMemories = await storage.readAllMemories();\n if (signal?.aborted) {\n return abortedResult();\n }\n\n // Find hot memories that should be demoted to cold\n const demotionCandidates = hotMemories.filter((m) => {\n const decision = decideTierTransition(m, \"hot\", policy, now);\n return decision.changed && decision.nextTier === \"cold\";\n });\n\n const candidateCount = demotionCandidates.length;\n // Apply cap\n const batch = demotionCandidates.slice(0, demotionCap);\n\n if (dryRun) {\n return {\n skipped: false,\n dryRun: true,\n candidateCount,\n demotedCount: 0,\n failureCount: 0,\n cappedAt: demotionCap,\n };\n }\n\n let demotedCount = 0;\n let failureCount = 0;\n let qmdRefreshPendingForRun = false;\n const executor = qmd\n ? new TierMigrationExecutor({\n storage,\n qmd,\n hotCollection: options.hotCollection ?? config.qmdCollection ?? \"openclaw-engram\",\n coldCollection: options.coldCollection ?? config.qmdColdCollection ?? \"openclaw-engram-cold\",\n })\n : null;\n const coldCollection = options.coldCollection ?? config.qmdColdCollection ?? \"openclaw-engram-cold\";\n\n for (const memory of batch) {\n if (signal?.aborted) {\n return abortedResult(candidateCount, demotedCount, failureCount);\n }\n try {\n if (executor) {\n await executor.migrateMemory({\n memory,\n fromTier: \"hot\",\n toTier: \"cold\",\n reason: \"first-start-lifecycle-migration\",\n });\n } else {\n await storage.migrateMemoryToTier(memory, \"cold\");\n }\n demotedCount += 1;\n } catch {\n const targetPath = storage.buildTierMemoryPath(memory, \"cold\");\n const [targetExists, sourceExists] = await Promise.all([\n pathExists(targetPath),\n pathExists(memory.path),\n ]);\n const movedToCold = targetExists && !sourceExists;\n if (movedToCold) {\n if (!qmd) {\n demotedCount += 1;\n continue;\n }\n try {\n await refreshQmdCollection(qmd, coldCollection, signal);\n demotedCount += 1;\n continue;\n } catch {\n qmdRefreshPendingForRun = true;\n try {\n await writeQmdRefreshPending(config.memoryDir, now, coldCollection);\n } catch {\n // The end-of-run retry below still gets a chance to repair the QMD\n // state before we decide whether the init marker is safe to write.\n }\n demotedCount += 1;\n continue;\n }\n }\n // Non-fatal — individual migration failures are counted but do not abort\n // the sweep. We track them so the marker is only written when ALL\n // attempted demotions succeeded (CLAUDE.md rule #12: don't write a\n // success marker after a partial failure).\n failureCount += 1;\n }\n }\n\n // Write marker AFTER all mutations succeed (CLAUDE.md rule #12).\n // If any demotion failed, skip the marker so the next start retries.\n if (signal?.aborted) {\n return abortedResult(candidateCount, demotedCount, failureCount);\n }\n const persistedQmdRefreshPending = qmd ? await readQmdRefreshPending(config.memoryDir) : null;\n const hasPersistedQmdRefreshPending = persistedQmdRefreshPending?.collection === coldCollection;\n if (qmd && persistedQmdRefreshPending && persistedQmdRefreshPending.collection !== coldCollection) {\n failureCount += 1;\n }\n if (qmd && (qmdRefreshPendingForRun || hasPersistedQmdRefreshPending)) {\n try {\n await refreshQmdCollection(qmd, coldCollection, signal);\n await clearQmdRefreshPending(config.memoryDir);\n } catch {\n failureCount += 1;\n }\n }\n if (failureCount === 0) {\n await writeMarker(config.memoryDir, now);\n }\n\n return {\n skipped: false,\n dryRun: false,\n candidateCount,\n demotedCount,\n failureCount,\n cappedAt: demotionCap,\n };\n}\n"],"mappings":"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","names":["candidateCount","demotedCount","failureCount"]}
package/dist/index.js CHANGED
@@ -76,7 +76,7 @@ import {
76
76
  registerTrainingExportAdapter,
77
77
  runBulkImportCliCommand,
78
78
  runWearablesCliCommand
79
- } from "./chunk-MJIHJ7OG.js";
79
+ } from "./chunk-H5BWGCRZ.js";
80
80
  import "./chunk-MC4FJXPA.js";
81
81
  import "./chunk-LQHDIS7L.js";
82
82
  import "./chunk-7F7Z6MOS.js";
@@ -131,8 +131,8 @@ import {
131
131
  import {
132
132
  parseStrictCliDate
133
133
  } from "./chunk-3T74IZB3.js";
134
- import "./chunk-NSA5ZRUL.js";
135
- import "./chunk-DKJCRGWM.js";
134
+ import "./chunk-M4AYVEWS.js";
135
+ import "./chunk-YGIQORJ3.js";
136
136
  import "./chunk-HL4DB7TO.js";
137
137
  import "./chunk-7XH7VJN4.js";
138
138
  import "./chunk-EZ25VE3G.js";
@@ -171,7 +171,7 @@ import {
171
171
  saveTaxonomy,
172
172
  validateSlug,
173
173
  validateTaxonomy
174
- } from "./chunk-XPHVAOBT.js";
174
+ } from "./chunk-QNEUZIAH.js";
175
175
  import {
176
176
  WEARABLE_SOURCE_PREFIX,
177
177
  buildExtractionTurns,
@@ -293,7 +293,7 @@ import {
293
293
  import "./chunk-LTHVM4XN.js";
294
294
  import {
295
295
  ExtractionEngine
296
- } from "./chunk-CSRXQ6NB.js";
296
+ } from "./chunk-I5REUWLH.js";
297
297
  import "./chunk-4RA3C3EV.js";
298
298
  import "./chunk-5GSUBCZM.js";
299
299
  import "./chunk-54V4BZWP.js";
@@ -339,7 +339,7 @@ import {
339
339
  FILTER_LABELS,
340
340
  isDirectAnswerEligible
341
341
  } from "./chunk-6HEM6HTQ.js";
342
- import "./chunk-ZA2S2VLL.js";
342
+ import "./chunk-C2PG7IEH.js";
343
343
  import {
344
344
  buildEntityRecallSection
345
345
  } from "./chunk-YOLZS7NY.js";
@@ -468,7 +468,7 @@ import "./chunk-K6MV3TRQ.js";
468
468
  import "./chunk-OADWQ5CR.js";
469
469
  import {
470
470
  EngramAccessHttpServer
471
- } from "./chunk-N3VNUM4Z.js";
471
+ } from "./chunk-HGNOCPZX.js";
472
472
  import "./chunk-SEDEKFYQ.js";
473
473
  import "./chunk-JBPKEARU.js";
474
474
  import "./chunk-TMSXWOBZ.js";
@@ -482,15 +482,15 @@ import {
482
482
  } from "./chunk-7WV3F5DQ.js";
483
483
  import {
484
484
  EngramMcpServer
485
- } from "./chunk-6PY5YJAV.js";
485
+ } from "./chunk-BQCHEV7O.js";
486
486
  import {
487
487
  buildCitationGuidance,
488
488
  formatOaiMemCitation,
489
489
  parseOaiMemCitation,
490
490
  sanitizeNoteForCitation
491
491
  } from "./chunk-D24OXEPB.js";
492
- import "./chunk-SNKPUJHR.js";
493
- import "./chunk-OEEW4KJA.js";
492
+ import "./chunk-76NHR6ZL.js";
493
+ import "./chunk-O6YH5F47.js";
494
494
  import "./chunk-ZQNCHPTZ.js";
495
495
  import "./chunk-YF6FMLBT.js";
496
496
  import {
@@ -528,13 +528,13 @@ import {
528
528
  suggestionSubmitRequestSchema,
529
529
  validateRequest
530
530
  } from "./chunk-FVZ2ISIX.js";
531
- import "./chunk-R7IYU5DZ.js";
531
+ import "./chunk-4ESAR77N.js";
532
532
  import {
533
533
  EngramAccessInputError,
534
534
  EngramAccessService,
535
535
  computeProcedureStats,
536
536
  formatProcedureStatsText
537
- } from "./chunk-27QQC7ZX.js";
537
+ } from "./chunk-UM5AWJNQ.js";
538
538
  import "./chunk-GDASG7NC.js";
539
539
  import "./chunk-GDB4J2H3.js";
540
540
  import {
@@ -594,8 +594,8 @@ import {
594
594
  resolveGitContext,
595
595
  stableHash
596
596
  } from "./chunk-J6BH2OBA.js";
597
- import "./chunk-CTOQEZSN.js";
598
- import "./chunk-2KAYTPPT.js";
597
+ import "./chunk-V4GNSDFH.js";
598
+ import "./chunk-UTHQPSRC.js";
599
599
  import {
600
600
  MeilisearchBackend
601
601
  } from "./chunk-WRFKZEO6.js";
@@ -604,7 +604,7 @@ import {
604
604
  OramaBackend
605
605
  } from "./chunk-LQ6JI4VH.js";
606
606
  import "./chunk-SANZHXY2.js";
607
- import "./chunk-EHISUJFN.js";
607
+ import "./chunk-WAS3NV46.js";
608
608
  import {
609
609
  LanceDbBackend
610
610
  } from "./chunk-5CEJH5ZN.js";
@@ -641,7 +641,7 @@ import {
641
641
  CrossNamespaceBudget,
642
642
  DEFAULT_CROSS_NAMESPACE_BUDGET
643
643
  } from "./chunk-ODPLEWB6.js";
644
- import "./chunk-DVRHLN2O.js";
644
+ import "./chunk-3RCBIOOJ.js";
645
645
  import "./chunk-ZY2MNJR6.js";
646
646
  import "./chunk-SQNED75R.js";
647
647
  import "./chunk-EHQ5HO5T.js";
@@ -2,15 +2,15 @@ import {
2
2
  listNamespaces,
3
3
  runNamespaceMigration,
4
4
  verifyNamespaces
5
- } from "../chunk-DKJCRGWM.js";
5
+ } from "../chunk-YGIQORJ3.js";
6
6
  import "../chunk-3TSTGI6F.js";
7
- import "../chunk-CTOQEZSN.js";
8
- import "../chunk-2KAYTPPT.js";
7
+ import "../chunk-V4GNSDFH.js";
8
+ import "../chunk-UTHQPSRC.js";
9
9
  import "../chunk-WRFKZEO6.js";
10
10
  import "../chunk-CYEPCZN5.js";
11
11
  import "../chunk-LQ6JI4VH.js";
12
12
  import "../chunk-SANZHXY2.js";
13
- import "../chunk-EHISUJFN.js";
13
+ import "../chunk-WAS3NV46.js";
14
14
  import "../chunk-5CEJH5ZN.js";
15
15
  import "../chunk-AER6MT24.js";
16
16
  import "../chunk-CINZGPSJ.js";
@@ -23,6 +23,7 @@ import "../chunk-K43PI6DQ.js";
23
23
  import "../chunk-YNQ6DFSV.js";
24
24
  import "../chunk-O75CRYGF.js";
25
25
  import "../chunk-3ONXXHQO.js";
26
+ import "../chunk-3RCBIOOJ.js";
26
27
  import "../chunk-7RLCCNHU.js";
27
28
  import "../chunk-L2B3EE7B.js";
28
29
  import "../chunk-M7XQSUBB.js";
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  NamespaceSearchRouter,
3
3
  namespaceCollectionName
4
- } from "../chunk-CTOQEZSN.js";
5
- import "../chunk-2KAYTPPT.js";
4
+ } from "../chunk-V4GNSDFH.js";
5
+ import "../chunk-UTHQPSRC.js";
6
6
  import "../chunk-WRFKZEO6.js";
7
7
  import "../chunk-CYEPCZN5.js";
8
8
  import "../chunk-LQ6JI4VH.js";
9
9
  import "../chunk-SANZHXY2.js";
10
- import "../chunk-EHISUJFN.js";
10
+ import "../chunk-WAS3NV46.js";
11
11
  import "../chunk-5CEJH5ZN.js";
12
12
  import "../chunk-AER6MT24.js";
13
13
  import "../chunk-CINZGPSJ.js";
@@ -20,6 +20,7 @@ import "../chunk-K43PI6DQ.js";
20
20
  import "../chunk-YNQ6DFSV.js";
21
21
  import "../chunk-O75CRYGF.js";
22
22
  import "../chunk-3ONXXHQO.js";
23
+ import "../chunk-3RCBIOOJ.js";
23
24
  import "../chunk-5GPPACXK.js";
24
25
  import "../chunk-AWJ2FHCF.js";
25
26
  import "../chunk-42JKGUFJ.js";
@@ -13,8 +13,8 @@ import {
13
13
  summarizeProvenanceCoverage,
14
14
  summarizeTierDistribution,
15
15
  summarizeTombstoneStatus
16
- } from "./chunk-NSA5ZRUL.js";
17
- import "./chunk-DKJCRGWM.js";
16
+ } from "./chunk-M4AYVEWS.js";
17
+ import "./chunk-YGIQORJ3.js";
18
18
  import "./chunk-7XH7VJN4.js";
19
19
  import "./chunk-YBPYIAA5.js";
20
20
  import "./chunk-CMTINOFS.js";
@@ -33,13 +33,13 @@ import "./chunk-OO42R444.js";
33
33
  import "./chunk-K6MV3TRQ.js";
34
34
  import "./chunk-4NOI577P.js";
35
35
  import "./chunk-J6BH2OBA.js";
36
- import "./chunk-CTOQEZSN.js";
37
- import "./chunk-2KAYTPPT.js";
36
+ import "./chunk-V4GNSDFH.js";
37
+ import "./chunk-UTHQPSRC.js";
38
38
  import "./chunk-WRFKZEO6.js";
39
39
  import "./chunk-CYEPCZN5.js";
40
40
  import "./chunk-LQ6JI4VH.js";
41
41
  import "./chunk-SANZHXY2.js";
42
- import "./chunk-EHISUJFN.js";
42
+ import "./chunk-WAS3NV46.js";
43
43
  import "./chunk-5CEJH5ZN.js";
44
44
  import "./chunk-AER6MT24.js";
45
45
  import "./chunk-CINZGPSJ.js";
@@ -52,7 +52,7 @@ import "./chunk-K43PI6DQ.js";
52
52
  import "./chunk-YNQ6DFSV.js";
53
53
  import "./chunk-O75CRYGF.js";
54
54
  import "./chunk-3ONXXHQO.js";
55
- import "./chunk-DVRHLN2O.js";
55
+ import "./chunk-3RCBIOOJ.js";
56
56
  import "./chunk-EHQ5HO5T.js";
57
57
  import "./chunk-2LSZVONP.js";
58
58
  import "./chunk-DEUNUKTD.js";
@@ -28,7 +28,7 @@ import {
28
28
  sanitizeSessionKeyForFilename,
29
29
  shouldFilterLifecycleRecallCandidate,
30
30
  summarizeGraphShadowComparison
31
- } from "./chunk-XPHVAOBT.js";
31
+ } from "./chunk-QNEUZIAH.js";
32
32
  import "./chunk-4T3BMHKD.js";
33
33
  import "./chunk-MLKWJOAJ.js";
34
34
  import "./chunk-7HYPN2GC.js";
@@ -79,7 +79,7 @@ import "./chunk-PD6O7AXF.js";
79
79
  import "./chunk-XHYGJVXL.js";
80
80
  import "./chunk-3NN73CM7.js";
81
81
  import "./chunk-LTHVM4XN.js";
82
- import "./chunk-CSRXQ6NB.js";
82
+ import "./chunk-I5REUWLH.js";
83
83
  import "./chunk-4RA3C3EV.js";
84
84
  import "./chunk-5GSUBCZM.js";
85
85
  import "./chunk-54V4BZWP.js";
@@ -96,7 +96,7 @@ import "./chunk-EO5QWINU.js";
96
96
  import "./chunk-VEWZZM3H.js";
97
97
  import "./chunk-Q6IP2ARR.js";
98
98
  import "./chunk-6HEM6HTQ.js";
99
- import "./chunk-ZA2S2VLL.js";
99
+ import "./chunk-C2PG7IEH.js";
100
100
  import "./chunk-YOLZS7NY.js";
101
101
  import "./chunk-2PRQG7PV.js";
102
102
  import "./chunk-WIWPSQYU.js";
@@ -150,13 +150,13 @@ import "./chunk-DRUDC2UX.js";
150
150
  import "./chunk-AQEJKOKI.js";
151
151
  import "./chunk-6HMYUWXR.js";
152
152
  import "./chunk-J6BH2OBA.js";
153
- import "./chunk-CTOQEZSN.js";
154
- import "./chunk-2KAYTPPT.js";
153
+ import "./chunk-V4GNSDFH.js";
154
+ import "./chunk-UTHQPSRC.js";
155
155
  import "./chunk-WRFKZEO6.js";
156
156
  import "./chunk-CYEPCZN5.js";
157
157
  import "./chunk-LQ6JI4VH.js";
158
158
  import "./chunk-SANZHXY2.js";
159
- import "./chunk-EHISUJFN.js";
159
+ import "./chunk-WAS3NV46.js";
160
160
  import "./chunk-5CEJH5ZN.js";
161
161
  import "./chunk-AER6MT24.js";
162
162
  import "./chunk-CINZGPSJ.js";
@@ -173,7 +173,7 @@ import "./chunk-O75CRYGF.js";
173
173
  import "./chunk-QDW3E4RD.js";
174
174
  import "./chunk-EH5ED3C6.js";
175
175
  import "./chunk-3ONXXHQO.js";
176
- import "./chunk-DVRHLN2O.js";
176
+ import "./chunk-3RCBIOOJ.js";
177
177
  import "./chunk-SQNED75R.js";
178
178
  import "./chunk-EHQ5HO5T.js";
179
179
  import "./chunk-2LSZVONP.js";