@squadrules/mcp 5.0.0-beta.1 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/README.md +23 -20
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/config/embedding-fastembed.d.ts +9 -0
  4. package/dist/config/embedding-fastembed.d.ts.map +1 -0
  5. package/dist/config/embedding-fastembed.js +20 -0
  6. package/dist/config/embedding-fastembed.js.map +1 -0
  7. package/dist/config.d.ts +8 -4
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +10 -4
  10. package/dist/config.js.map +1 -1
  11. package/dist/embed-docs/mem/adapter-migration.md +1 -1
  12. package/dist/embed-docs/mem/bulk-insert-adapters-via-cli.md +1 -1
  13. package/dist/embed-docs/mem/challenge-type-guide.md +1 -1
  14. package/dist/embed-docs/mem/create-new-protocol.md +1 -1
  15. package/dist/embed-docs/mem/phase-critic-guide.md +1 -1
  16. package/dist/embed-docs/mem/phase-critic.md +1 -1
  17. package/dist/embed-docs/mem/protocol-linking-guide.md +1 -1
  18. package/dist/embed-docs/mem/refine-search.md +1 -1
  19. package/dist/embed-docs/mem/skill-format-guide.md +1 -1
  20. package/dist/http/http-api-snapshot.d.ts.map +1 -1
  21. package/dist/http/http-api-snapshot.js +13 -1
  22. package/dist/http/http-api-snapshot.js.map +1 -1
  23. package/dist/http/http-health-routes.d.ts.map +1 -1
  24. package/dist/http/http-health-routes.js +6 -3
  25. package/dist/http/http-health-routes.js.map +1 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +15 -5
  28. package/dist/index.js.map +1 -1
  29. package/dist/resources/embedded-mcp-resources.js +9 -9
  30. package/dist/resources/embedded-mcp-resources.js.map +1 -1
  31. package/dist/resources/mem-resources-boot.d.ts.map +1 -1
  32. package/dist/resources/mem-resources-boot.js +2 -28
  33. package/dist/resources/mem-resources-boot.js.map +1 -1
  34. package/dist/resources/mem-uuid-mapper.d.ts.map +1 -1
  35. package/dist/resources/mem-uuid-mapper.js +8 -23
  36. package/dist/resources/mem-uuid-mapper.js.map +1 -1
  37. package/dist/server.d.ts.map +1 -1
  38. package/dist/server.js +9 -7
  39. package/dist/server.js.map +1 -1
  40. package/dist/services/embedding/fastembed-provider.d.ts +2 -0
  41. package/dist/services/embedding/fastembed-provider.d.ts.map +1 -0
  42. package/dist/services/embedding/fastembed-provider.js +78 -0
  43. package/dist/services/embedding/fastembed-provider.js.map +1 -0
  44. package/dist/services/embedding/health.d.ts.map +1 -1
  45. package/dist/services/embedding/health.js +99 -96
  46. package/dist/services/embedding/health.js.map +1 -1
  47. package/dist/services/embedding/provider-audit.d.ts +15 -0
  48. package/dist/services/embedding/provider-audit.d.ts.map +1 -0
  49. package/dist/services/embedding/provider-audit.js +28 -0
  50. package/dist/services/embedding/provider-audit.js.map +1 -0
  51. package/dist/services/embedding/providers.d.ts +2 -1
  52. package/dist/services/embedding/providers.d.ts.map +1 -1
  53. package/dist/services/embedding/providers.js +21 -23
  54. package/dist/services/embedding/providers.js.map +1 -1
  55. package/dist/services/embedding/service.d.ts +2 -2
  56. package/dist/services/embedding/service.d.ts.map +1 -1
  57. package/dist/services/embedding/service.js +13 -16
  58. package/dist/services/embedding/service.js.map +1 -1
  59. package/dist/services/execution-trace-store.d.ts +5 -29
  60. package/dist/services/execution-trace-store.d.ts.map +1 -1
  61. package/dist/services/execution-trace-store.js +10 -2
  62. package/dist/services/execution-trace-store.js.map +1 -1
  63. package/dist/services/memory/store.d.ts +23 -0
  64. package/dist/services/memory/store.d.ts.map +1 -1
  65. package/dist/services/memory/store.js +110 -3
  66. package/dist/services/memory/store.js.map +1 -1
  67. package/dist/services/memory-store.d.ts +5 -0
  68. package/dist/services/memory-store.d.ts.map +1 -1
  69. package/dist/services/memory-store.js +5 -0
  70. package/dist/services/memory-store.js.map +1 -1
  71. package/dist/services/qdrant/service.d.ts.map +1 -1
  72. package/dist/services/qdrant/service.js +11 -2
  73. package/dist/services/qdrant/service.js.map +1 -1
  74. package/dist/services/vector-store/IExecutionTraceStore.d.ts +25 -0
  75. package/dist/services/vector-store/IExecutionTraceStore.d.ts.map +1 -0
  76. package/dist/services/vector-store/IExecutionTraceStore.js +2 -0
  77. package/dist/services/vector-store/IExecutionTraceStore.js.map +1 -0
  78. package/dist/services/vector-store/IVectorRecordStore.d.ts +58 -0
  79. package/dist/services/vector-store/IVectorRecordStore.d.ts.map +1 -0
  80. package/dist/services/vector-store/IVectorRecordStore.js +2 -0
  81. package/dist/services/vector-store/IVectorRecordStore.js.map +1 -0
  82. package/dist/services/vector-store/commit-retry.d.ts +21 -0
  83. package/dist/services/vector-store/commit-retry.d.ts.map +1 -0
  84. package/dist/services/vector-store/commit-retry.js +58 -0
  85. package/dist/services/vector-store/commit-retry.js.map +1 -0
  86. package/dist/services/vector-store/embedded-store-singleton.d.ts +12 -0
  87. package/dist/services/vector-store/embedded-store-singleton.d.ts.map +1 -0
  88. package/dist/services/vector-store/embedded-store-singleton.js +17 -0
  89. package/dist/services/vector-store/embedded-store-singleton.js.map +1 -0
  90. package/dist/services/vector-store/lancedb/LanceExecutionTraceStore.d.ts +28 -0
  91. package/dist/services/vector-store/lancedb/LanceExecutionTraceStore.d.ts.map +1 -0
  92. package/dist/services/vector-store/lancedb/LanceExecutionTraceStore.js +222 -0
  93. package/dist/services/vector-store/lancedb/LanceExecutionTraceStore.js.map +1 -0
  94. package/dist/services/vector-store/lancedb/LanceVectorRecordStore.d.ts +77 -0
  95. package/dist/services/vector-store/lancedb/LanceVectorRecordStore.d.ts.map +1 -0
  96. package/dist/services/vector-store/lancedb/LanceVectorRecordStore.js +136 -0
  97. package/dist/services/vector-store/lancedb/LanceVectorRecordStore.js.map +1 -0
  98. package/dist/services/vector-store/lancedb/lance-records-engine.d.ts +41 -0
  99. package/dist/services/vector-store/lancedb/lance-records-engine.d.ts.map +1 -0
  100. package/dist/services/vector-store/lancedb/lance-records-engine.js +102 -0
  101. package/dist/services/vector-store/lancedb/lance-records-engine.js.map +1 -0
  102. package/dist/services/vector-store/lancedb/lance-records-mutations.d.ts +22 -0
  103. package/dist/services/vector-store/lancedb/lance-records-mutations.d.ts.map +1 -0
  104. package/dist/services/vector-store/lancedb/lance-records-mutations.js +211 -0
  105. package/dist/services/vector-store/lancedb/lance-records-mutations.js.map +1 -0
  106. package/dist/services/vector-store/lancedb/lance-records-reads.d.ts +64 -0
  107. package/dist/services/vector-store/lancedb/lance-records-reads.d.ts.map +1 -0
  108. package/dist/services/vector-store/lancedb/lance-records-reads.js +237 -0
  109. package/dist/services/vector-store/lancedb/lance-records-reads.js.map +1 -0
  110. package/dist/services/vector-store/lancedb/lance-records-schema.d.ts +48 -0
  111. package/dist/services/vector-store/lancedb/lance-records-schema.d.ts.map +1 -0
  112. package/dist/services/vector-store/lancedb/lance-records-schema.js +159 -0
  113. package/dist/services/vector-store/lancedb/lance-records-schema.js.map +1 -0
  114. package/dist/services/vector-store/lancedb/lance-records-search.d.ts +30 -0
  115. package/dist/services/vector-store/lancedb/lance-records-search.d.ts.map +1 -0
  116. package/dist/services/vector-store/lancedb/lance-records-search.js +112 -0
  117. package/dist/services/vector-store/lancedb/lance-records-search.js.map +1 -0
  118. package/dist/services/vector-store/lancedb/lance-records-write-artifact.d.ts +11 -0
  119. package/dist/services/vector-store/lancedb/lance-records-write-artifact.d.ts.map +1 -0
  120. package/dist/services/vector-store/lancedb/lance-records-write-artifact.js +121 -0
  121. package/dist/services/vector-store/lancedb/lance-records-write-artifact.js.map +1 -0
  122. package/dist/services/vector-store/lancedb/lance-records-write-helpers.d.ts +52 -0
  123. package/dist/services/vector-store/lancedb/lance-records-write-helpers.d.ts.map +1 -0
  124. package/dist/services/vector-store/lancedb/lance-records-write-helpers.js +216 -0
  125. package/dist/services/vector-store/lancedb/lance-records-write-helpers.js.map +1 -0
  126. package/dist/services/vector-store/lancedb/lance-records-writes.d.ts +21 -0
  127. package/dist/services/vector-store/lancedb/lance-records-writes.d.ts.map +1 -0
  128. package/dist/services/vector-store/lancedb/lance-records-writes.js +294 -0
  129. package/dist/services/vector-store/lancedb/lance-records-writes.js.map +1 -0
  130. package/dist/services/vector-store/lancedb-connection.d.ts +12 -0
  131. package/dist/services/vector-store/lancedb-connection.d.ts.map +1 -0
  132. package/dist/services/vector-store/lancedb-connection.js +28 -0
  133. package/dist/services/vector-store/lancedb-connection.js.map +1 -0
  134. package/dist/services/vector-store/types.d.ts +85 -0
  135. package/dist/services/vector-store/types.d.ts.map +1 -0
  136. package/dist/services/vector-store/types.js +2 -0
  137. package/dist/services/vector-store/types.js.map +1 -0
  138. package/dist/tools/artifact-catalog.d.ts.map +1 -1
  139. package/dist/tools/artifact-catalog.js +6 -33
  140. package/dist/tools/artifact-catalog.js.map +1 -1
  141. package/dist/tools/search.d.ts.map +1 -1
  142. package/dist/tools/search.js +6 -20
  143. package/dist/tools/search.js.map +1 -1
  144. package/dist/tools/search_schema.d.ts +1 -1
  145. package/dist/tools/skill-export/enumerate-space-adapters.d.ts +1 -1
  146. package/dist/tools/skill-export/enumerate-space-adapters.d.ts.map +1 -1
  147. package/dist/tools/skill-export/enumerate-space-adapters.js +11 -27
  148. package/dist/tools/skill-export/enumerate-space-adapters.js.map +1 -1
  149. package/dist/tools/spaces.d.ts.map +1 -1
  150. package/dist/tools/spaces.js +2 -15
  151. package/dist/tools/spaces.js.map +1 -1
  152. package/dist/ui/assets/{AccountPage-B0ali9jz.js → AccountPage-Cbsp2hcC.js} +1 -1
  153. package/dist/ui/assets/{ProtocolEditPage-DIySo-F_.js → ProtocolEditPage-mChBe3JY.js} +1 -1
  154. package/dist/ui/assets/{RichTextEditor-uun0UIVc.js → RichTextEditor-Bj6JxHM5.js} +1 -1
  155. package/dist/ui/assets/{SkillBundlePage-DtOlpupj.js → SkillBundlePage-D1OPKJzA.js} +1 -1
  156. package/dist/ui/assets/{index-BlCipoHI.js → index-DL3-JTk4.js} +2 -2
  157. package/dist/ui/index.html +1 -1
  158. package/dist/utils/squadrules-user-dirs.d.ts +10 -0
  159. package/dist/utils/squadrules-user-dirs.d.ts.map +1 -1
  160. package/dist/utils/squadrules-user-dirs.js +12 -0
  161. package/dist/utils/squadrules-user-dirs.js.map +1 -1
  162. package/package.json +18 -11
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Embedded LanceDB record store.
3
+ *
4
+ * Satisfies the `IVectorRecordStore` port and the read/admin surface the tools
5
+ * reach through `qdrantService`, so a single instance can back both injected
6
+ * slots on the embedded path (selected by `isQdrantConfigured`). Reads,
7
+ * read-modify-write mutations, semantic search (JS cosine) and the markdown-to-
8
+ * points writers (`storeAdapter` / `storeArtifact`) are all implemented, reusing
9
+ * the backend-neutral parse/build helpers so the store matches the Qdrant path's
10
+ * contract. Search-ranking and train parity are validated against the Qdrant
11
+ * integration suite when the store is wired and exercised end-to-end.
12
+ */
13
+ import type { Memory } from '../../../types/memory.js';
14
+ import type { IVectorRecordStore } from '../IVectorRecordStore.js';
15
+ import type { ArtifactResolveOutcome, GetMemoryOptions, LayerRecord, MemorySearchResult, SlugResolveOutcome, StoreAdapterOptions } from '../types.js';
16
+ import type { StoreArtifactOptions } from '../../memory/store-adapter.js';
17
+ export declare class LanceVectorRecordStore implements IVectorRecordStore {
18
+ private readonly engine;
19
+ private readonly reader;
20
+ private readonly mutator;
21
+ private readonly search;
22
+ private readonly writer;
23
+ private connectionPromise;
24
+ private connection;
25
+ init(): Promise<void>;
26
+ checkHealth(_timeoutMs?: number): Promise<boolean>;
27
+ getMemory(memoryUuid: string, _options?: GetMemoryOptions): Promise<Memory | null>;
28
+ getAdapterLayers(adapterId: string, extraSpaceIds?: string[]): Promise<LayerRecord[]>;
29
+ findFirstStepMemoryUuidBySlug(slug: string): Promise<SlugResolveOutcome>;
30
+ findArtifactMemoryUuidBySlug(slug: string): Promise<ArtifactResolveOutcome>;
31
+ scrollSpace(spaceId: string, options?: {
32
+ paginate?: boolean;
33
+ limit?: number;
34
+ }): Promise<LayerRecord[]>;
35
+ listAdapterArtifacts(adapterId: string): Promise<LayerRecord[]>;
36
+ findProtocolFooterLayers(refineSlug: string, createSlug: string): Promise<LayerRecord[]>;
37
+ getStoredAdapterVersion(slug: string): Promise<string | undefined>;
38
+ updateMemory(memoryUuid: string, patch: Record<string, unknown>): Promise<void>;
39
+ deleteMemory(memoryUuid: string): Promise<void>;
40
+ setPayloadOnLayers(layerIds: string[], patch: Record<string, unknown>): Promise<void>;
41
+ deleteAppSpaceBySlug(slug: string): Promise<void>;
42
+ deleteAppSpaceByAdapterId(adapterId: string): Promise<void>;
43
+ retrieveById(uuid: string): Promise<{
44
+ uuid: string;
45
+ payload: any;
46
+ } | null>;
47
+ getMemoryByUUID(uuid: string): Promise<any | null>;
48
+ findProtocolSteps(protocolId: string): Promise<Array<{
49
+ uuid: string;
50
+ protocol: unknown;
51
+ payload: Record<string, unknown>;
52
+ }>>;
53
+ findProtocolStep(domain: string, type: string, task: string, step: number): Promise<{
54
+ uuid: string;
55
+ payload: Record<string, unknown>;
56
+ } | null>;
57
+ updateQualityMetrics(id: string, metrics: any): Promise<void>;
58
+ updateQualityMetadata(id: string, qualityMetadata: {
59
+ step_quality_score: number;
60
+ step_quality: 'excellent' | 'high' | 'standard' | 'basic';
61
+ }): Promise<void>;
62
+ propagateRewardToAdapterHead(stepPointId: string, metricsUpdate: Record<string, unknown>): Promise<string | null>;
63
+ initialize(): Promise<void>;
64
+ createOrUpdateAlias(): Promise<void>;
65
+ getCollections(): Promise<Array<{
66
+ name?: string;
67
+ }>>;
68
+ dropCollection(): Promise<void>;
69
+ get collectionName(): string;
70
+ get qdrantUrl(): string;
71
+ get apiKey(): string | undefined;
72
+ searchMemories(query: string, limit: number, _collapse?: boolean): Promise<MemorySearchResult>;
73
+ searchAdapterTitlesBySimilarity(query: string, limit: number): Promise<MemorySearchResult>;
74
+ storeAdapter(docs: string[], llmModelId: string, options?: StoreAdapterOptions): Promise<Memory[]>;
75
+ storeArtifact(content: string, options: StoreArtifactOptions): Promise<Memory[]>;
76
+ }
77
+ //# sourceMappingURL=LanceVectorRecordStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LanceVectorRecordStore.d.ts","sourceRoot":"","sources":["../../../../src/services/vector-store/lancedb/LanceVectorRecordStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAIvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EACV,sBAAsB,EACtB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAS1E,qBAAa,sBAAuB,YAAW,kBAAkB;IAC/D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAC7D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAC/D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmD;IAC1E,OAAO,CAAC,iBAAiB,CAAyC;IAElE,OAAO,CAAC,UAAU;IAMZ,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrB,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWlD,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIlF,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAIrF,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIxE,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAI3E,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAItG,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAI/D,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAIxF,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAIlE,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/E,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrF,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,GAAG,IAAI,CAAC;IAI1E,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAIlD,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IAI5H,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IAI9I,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE;QAAE,kBAAkB,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5J,4BAA4B,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKjH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC,cAAc,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAInD,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrC,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,CAE/B;IAGK,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAI9F,+BAA+B,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAK1F,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAIlG,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAGvF"}
@@ -0,0 +1,136 @@
1
+ import { getQdrantCollection } from '../../../config.js';
2
+ import { logger } from '../../../utils/structured-logger.js';
3
+ import { openLanceConnection } from '../lancedb-connection.js';
4
+ import { LanceRecordEngine } from './lance-records-engine.js';
5
+ import { LanceRecordReader } from './lance-records-reads.js';
6
+ import { LanceRecordMutator } from './lance-records-mutations.js';
7
+ import { LanceRecordSearch } from './lance-records-search.js';
8
+ import { LanceRecordWriter } from './lance-records-writes.js';
9
+ const COLLECTION_LABEL = getQdrantCollection('squadrules');
10
+ export class LanceVectorRecordStore {
11
+ engine = new LanceRecordEngine();
12
+ reader = new LanceRecordReader(this.engine);
13
+ mutator = new LanceRecordMutator(this.engine);
14
+ search = new LanceRecordSearch(this.engine);
15
+ writer = new LanceRecordWriter(this.engine, this.search);
16
+ connectionPromise = null;
17
+ connection() {
18
+ if (!this.connectionPromise)
19
+ this.connectionPromise = openLanceConnection();
20
+ return this.connectionPromise;
21
+ }
22
+ // --- lifecycle ---
23
+ async init() {
24
+ await this.connection();
25
+ logger.info('[LanceVectorRecordStore] Embedded LanceDB record store ready');
26
+ }
27
+ async checkHealth(_timeoutMs) {
28
+ try {
29
+ await this.connection();
30
+ return true;
31
+ }
32
+ catch (error) {
33
+ logger.warn(`[LanceVectorRecordStore] health check failed: ${error instanceof Error ? error.message : String(error)}`);
34
+ return false;
35
+ }
36
+ }
37
+ // --- reads (delegate) ---
38
+ async getMemory(memoryUuid, _options) {
39
+ return this.reader.getMemory(memoryUuid);
40
+ }
41
+ async getAdapterLayers(adapterId, extraSpaceIds) {
42
+ return this.reader.getAdapterLayers(adapterId, extraSpaceIds);
43
+ }
44
+ async findFirstStepMemoryUuidBySlug(slug) {
45
+ return this.reader.findFirstStepMemoryUuidBySlug(slug);
46
+ }
47
+ async findArtifactMemoryUuidBySlug(slug) {
48
+ return this.reader.findArtifactMemoryUuidBySlug(slug);
49
+ }
50
+ async scrollSpace(spaceId, options) {
51
+ return this.reader.scrollSpace(spaceId, options);
52
+ }
53
+ async listAdapterArtifacts(adapterId) {
54
+ return this.reader.listAdapterArtifacts(adapterId);
55
+ }
56
+ async findProtocolFooterLayers(refineSlug, createSlug) {
57
+ return this.reader.findProtocolFooterLayers(refineSlug, createSlug);
58
+ }
59
+ async getStoredAdapterVersion(slug) {
60
+ return this.reader.getStoredAdapterVersion(slug);
61
+ }
62
+ async updateMemory(memoryUuid, patch) {
63
+ return this.mutator.updateMemory(memoryUuid, patch);
64
+ }
65
+ async deleteMemory(memoryUuid) {
66
+ return this.mutator.deleteMemory(memoryUuid);
67
+ }
68
+ async setPayloadOnLayers(layerIds, patch) {
69
+ return this.mutator.setPayloadOnLayers(layerIds, patch);
70
+ }
71
+ async deleteAppSpaceBySlug(slug) {
72
+ return this.mutator.deleteAppSpaceBySlug(slug);
73
+ }
74
+ async deleteAppSpaceByAdapterId(adapterId) {
75
+ return this.mutator.deleteAppSpaceByAdapterId(adapterId);
76
+ }
77
+ // --- qdrantService read surface (delegate) ---
78
+ async retrieveById(uuid) {
79
+ return this.reader.retrieveById(uuid);
80
+ }
81
+ async getMemoryByUUID(uuid) {
82
+ return this.reader.getMemoryByUUID(uuid);
83
+ }
84
+ async findProtocolSteps(protocolId) {
85
+ return this.reader.findProtocolSteps(protocolId);
86
+ }
87
+ async findProtocolStep(domain, type, task, step) {
88
+ return this.reader.findProtocolStep(domain, type, task, step);
89
+ }
90
+ async updateQualityMetrics(id, metrics) {
91
+ return this.mutator.updateQualityMetrics(id, metrics);
92
+ }
93
+ async updateQualityMetadata(id, qualityMetadata) {
94
+ return this.mutator.updateQualityMetadata(id, qualityMetadata);
95
+ }
96
+ async propagateRewardToAdapterHead(stepPointId, metricsUpdate) {
97
+ return this.mutator.propagateRewardToAdapterHead(stepPointId, metricsUpdate);
98
+ }
99
+ // --- admin (embedded store has no aliases / server collections) ---
100
+ async initialize() {
101
+ await this.init();
102
+ }
103
+ async createOrUpdateAlias() {
104
+ logger.debug('[LanceVectorRecordStore] createOrUpdateAlias is a no-op on the embedded store');
105
+ }
106
+ async getCollections() {
107
+ return [];
108
+ }
109
+ async dropCollection() {
110
+ logger.debug('[LanceVectorRecordStore] dropCollection is a no-op on the embedded store');
111
+ }
112
+ get collectionName() {
113
+ return COLLECTION_LABEL;
114
+ }
115
+ get qdrantUrl() {
116
+ return 'embedded:lancedb';
117
+ }
118
+ get apiKey() {
119
+ return undefined;
120
+ }
121
+ // --- search (JS cosine) ---
122
+ async searchMemories(query, limit, _collapse) {
123
+ return this.search.searchMemories(query, limit);
124
+ }
125
+ async searchAdapterTitlesBySimilarity(query, limit) {
126
+ return this.search.searchAdapterTitlesBySimilarity(query, limit);
127
+ }
128
+ // --- writers (delegate) ---
129
+ async storeAdapter(docs, llmModelId, options) {
130
+ return this.writer.storeAdapter(docs, llmModelId, options);
131
+ }
132
+ async storeArtifact(content, options) {
133
+ return this.writer.storeArtifact(content, options);
134
+ }
135
+ }
136
+ //# sourceMappingURL=LanceVectorRecordStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LanceVectorRecordStore.js","sourceRoot":"","sources":["../../../../src/services/vector-store/lancedb/LanceVectorRecordStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Lance table engine for memory records.
3
+ *
4
+ * Owns the connection and the one `memory_records` table, exposing the small set
5
+ * of primitives the read/query/mutation layers are built on: open-or-create,
6
+ * atomic upsert of Qdrant-shaped points, filtered scans, retrieve-by-id (with
7
+ * vectors preserved for read-modify-write) and delete-by-filter. Reads before any
8
+ * write treat the absent table as empty (never create it), so a cold start does
9
+ * not touch disk for a read. Writes serialize on Lance MVCC via `withCommitRetry`.
10
+ */
11
+ import type { LanceTable } from '../lancedb-connection.js';
12
+ import { type LanceRecordRow, type QdrantPointLike } from './lance-records-schema.js';
13
+ export declare class LanceRecordEngine {
14
+ private connectionPromise;
15
+ private getConnection;
16
+ /** Open the records table, or return null when nothing has been written yet. */
17
+ openTableIfPresent(): Promise<LanceTable | null>;
18
+ /** Open-or-create the records table, inferring the schema from a first row. */
19
+ ensureTableForWrite(firstRow: LanceRecordRow): Promise<LanceTable>;
20
+ /** Atomic upsert of Qdrant-shaped points (keyed by id) with commit retry. */
21
+ putPoints(points: QdrantPointLike[]): Promise<number>;
22
+ /** Replace rows wholesale for a set of ids after building new points. */
23
+ putRows(rows: LanceRecordRow[]): Promise<void>;
24
+ /** Scan rows matching a Qdrant-style filter, optionally capped. */
25
+ scroll(filter: {
26
+ must?: Array<Record<string, unknown>>;
27
+ must_not?: Array<Record<string, unknown>>;
28
+ }, limit?: number): Promise<LanceRecordRow[]>;
29
+ /** Retrieve a single raw row by id (carries vector columns for read-modify-write). */
30
+ retrieveRaw(id: string): Promise<LanceRecordRow | null>;
31
+ /** Delete rows matching a Qdrant-style filter. */
32
+ deleteByFilter(filter: {
33
+ must?: Array<Record<string, unknown>>;
34
+ must_not?: Array<Record<string, unknown>>;
35
+ }): Promise<void>;
36
+ /** Delete one row by id. */
37
+ deleteById(id: string): Promise<void>;
38
+ /** Rebuild and persist a row from a mutated Qdrant-shaped point. */
39
+ upsertPoint(point: QdrantPointLike): Promise<void>;
40
+ }
41
+ //# sourceMappingURL=lance-records-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lance-records-engine.d.ts","sourceRoot":"","sources":["../../../../src/services/vector-store/lancedb/lance-records-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAmB,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAG5E,OAAO,EAAiC,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAMrH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,iBAAiB,CAAyC;IAElE,OAAO,CAAC,aAAa;IAOrB,gFAAgF;IAC1E,kBAAkB,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAOtD,+EAA+E;IACzE,mBAAmB,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;IASxE,6EAA6E;IACvE,SAAS,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAgB3D,yEAAyE;IACnE,OAAO,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpD,mEAAmE;IAC7D,MAAM,CACV,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;KAAE,EAC5F,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,cAAc,EAAE,CAAC;IAU5B,sFAAsF;IAChF,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAW7D,kDAAkD;IAC5C,cAAc,CAClB,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;KAAE,GAC3F,OAAO,CAAC,IAAI,CAAC;IAQhB,4BAA4B;IACtB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3C,oEAAoE;IAC9D,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAGzD"}
@@ -0,0 +1,102 @@
1
+ import { openLanceConnection } from '../lancedb-connection.js';
2
+ import { withCommitRetry } from '../commit-retry.js';
3
+ import { toRow, buildWhere, sqlLiteral } from './lance-records-schema.js';
4
+ const RECORDS_TABLE = 'memory_records';
5
+ /** Full scans use a generous limit; record counts per space are small. */
6
+ const SCAN_LIMIT = 100_000;
7
+ export class LanceRecordEngine {
8
+ connectionPromise = null;
9
+ getConnection() {
10
+ if (!this.connectionPromise) {
11
+ this.connectionPromise = openLanceConnection();
12
+ }
13
+ return this.connectionPromise;
14
+ }
15
+ /** Open the records table, or return null when nothing has been written yet. */
16
+ async openTableIfPresent() {
17
+ const connection = await this.getConnection();
18
+ const names = await connection.tableNames();
19
+ if (!names.includes(RECORDS_TABLE))
20
+ return null;
21
+ return connection.openTable(RECORDS_TABLE);
22
+ }
23
+ /** Open-or-create the records table, inferring the schema from a first row. */
24
+ async ensureTableForWrite(firstRow) {
25
+ const connection = await this.getConnection();
26
+ const names = await connection.tableNames();
27
+ if (names.includes(RECORDS_TABLE)) {
28
+ return connection.openTable(RECORDS_TABLE);
29
+ }
30
+ return connection.createTable(RECORDS_TABLE, [firstRow], { mode: 'create' });
31
+ }
32
+ /** Atomic upsert of Qdrant-shaped points (keyed by id) with commit retry. */
33
+ async putPoints(points) {
34
+ if (points.length === 0)
35
+ return 0;
36
+ const rows = points.map(toRow);
37
+ const table = await this.ensureTableForWrite(rows[0]);
38
+ await withCommitRetry(() => table
39
+ .mergeInsert('id')
40
+ .whenMatchedUpdateAll()
41
+ .whenNotMatchedInsertAll()
42
+ .execute(rows), `records-upsert:${rows.length}`);
43
+ return rows.length;
44
+ }
45
+ /** Replace rows wholesale for a set of ids after building new points. */
46
+ async putRows(rows) {
47
+ if (rows.length === 0)
48
+ return;
49
+ const table = await this.ensureTableForWrite(rows[0]);
50
+ await withCommitRetry(() => table
51
+ .mergeInsert('id')
52
+ .whenMatchedUpdateAll()
53
+ .whenNotMatchedInsertAll()
54
+ .execute(rows), `records-put:${rows.length}`);
55
+ }
56
+ /** Scan rows matching a Qdrant-style filter, optionally capped. */
57
+ async scroll(filter, limit) {
58
+ const table = await this.openTableIfPresent();
59
+ if (!table)
60
+ return [];
61
+ const where = buildWhere(filter);
62
+ const query = table.query();
63
+ if (where)
64
+ query.where(where);
65
+ const rows = (await query.limit(limit ?? SCAN_LIMIT).toArray());
66
+ return rows;
67
+ }
68
+ /** Retrieve a single raw row by id (carries vector columns for read-modify-write). */
69
+ async retrieveRaw(id) {
70
+ const table = await this.openTableIfPresent();
71
+ if (!table)
72
+ return null;
73
+ const rows = (await table
74
+ .query()
75
+ .where(`id = ${sqlLiteral(id)}`)
76
+ .limit(1)
77
+ .toArray());
78
+ return rows[0] ?? null;
79
+ }
80
+ /** Delete rows matching a Qdrant-style filter. */
81
+ async deleteByFilter(filter) {
82
+ const table = await this.openTableIfPresent();
83
+ if (!table)
84
+ return;
85
+ const where = buildWhere(filter);
86
+ if (!where)
87
+ return;
88
+ await withCommitRetry(() => table.delete(where), 'records-delete');
89
+ }
90
+ /** Delete one row by id. */
91
+ async deleteById(id) {
92
+ const table = await this.openTableIfPresent();
93
+ if (!table)
94
+ return;
95
+ await withCommitRetry(() => table.delete(`id = ${sqlLiteral(id)}`), `records-delete:${id}`);
96
+ }
97
+ /** Rebuild and persist a row from a mutated Qdrant-shaped point. */
98
+ async upsertPoint(point) {
99
+ await this.putPoints([point]);
100
+ }
101
+ }
102
+ //# sourceMappingURL=lance-records-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lance-records-engine.js","sourceRoot":"","sources":["../../../../src/services/vector-store/lancedb/lance-records-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { LanceRecordEngine } from './lance-records-engine.js';
2
+ export declare class LanceRecordMutator {
3
+ private readonly engine;
4
+ constructor(engine: LanceRecordEngine);
5
+ private loadAccessibleRow;
6
+ updateMemory(id: string, updates: any): Promise<void>;
7
+ deleteMemory(id: string): Promise<void>;
8
+ updateQualityMetrics(id: string, metrics: any): Promise<void>;
9
+ updateQualityMetadata(id: string, qualityMetadata: {
10
+ step_quality_score: number;
11
+ step_quality: 'excellent' | 'high' | 'standard' | 'basic';
12
+ }): Promise<void>;
13
+ /** Resolve a completion layer's adapter head and propagate reward to it. */
14
+ propagateRewardToAdapterHead(stepPointId: string, metricsUpdate: Record<string, unknown>): Promise<string | null>;
15
+ /** Attach a payload patch (e.g. content hash) to a set of layer points. */
16
+ setPayloadOnLayers(layerIds: string[], patch: Record<string, unknown>): Promise<void>;
17
+ /** Delete app-space points matching a slug. */
18
+ deleteAppSpaceBySlug(slug: string): Promise<void>;
19
+ /** Delete app-space points matching an adapter id. */
20
+ deleteAppSpaceByAdapterId(adapterId: string): Promise<void>;
21
+ }
22
+ //# sourceMappingURL=lance-records-mutations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lance-records-mutations.d.ts","sourceRoot":"","sources":["../../../../src/services/vector-store/lancedb/lance-records-mutations.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAsCnE,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,iBAAiB;YAExC,iBAAiB;IASzB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAiDrD,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvC,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB7D,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE;QAAE,kBAAkB,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IASlK,4EAA4E;IACtE,4BAA4B,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA4BvH,2EAA2E;IACrE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3F,+CAA+C;IACzC,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASvD,sDAAsD;IAChD,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQlE"}
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Lance mutation layer for memory records.
3
+ *
4
+ * Read-modify-write operations mirror their Qdrant counterparts (`memory-updates.ts`,
5
+ * `quality.ts`, `reward-propagation.ts` and the `store.ts` bulk payload/delete
6
+ * helpers) field for field: the same accessible-space gate, the same payload merge
7
+ * and retired-alias drop, the same `quality_metrics` accumulation and `attest_boost`
8
+ * formula, the same text-change → re-embed rule, and the same cache invalidation
9
+ * calls. Named vectors are preserved across the round-trip so an update never
10
+ * silently drops an embedding column.
11
+ */
12
+ import { SQUADRULES_APP_SPACE_ID, MIN_ATTEST_RUNS, RUNS_FULL_CONFIDENCE, ATTEST_BOOST_MAX } from '../../../config.js';
13
+ import { getSpaceContext, getTenantId } from '../../../utils/tenant-context.js';
14
+ import { buildSpaceFilter } from '../../../utils/space-filter.js';
15
+ import { SquadrulesError } from '../../../types/index.js';
16
+ import { logger } from '../../../utils/structured-logger.js';
17
+ import { embeddingService } from '../../embedding/service.js';
18
+ import { redisCacheService } from '../../redis-cache.js';
19
+ import { validateAndConvertId } from '../../qdrant/utils.js';
20
+ import { toNumberArray } from './lance-records-schema.js';
21
+ function payloadOf(row) {
22
+ return JSON.parse(row.payload);
23
+ }
24
+ function isAccessible(row) {
25
+ const spaceId = String(payloadOf(row)['space_id'] ?? SQUADRULES_APP_SPACE_ID);
26
+ const allowed = getSpaceContext().allowedSpaceIds;
27
+ return allowed.includes(spaceId) || spaceId === SQUADRULES_APP_SPACE_ID;
28
+ }
29
+ /** Pull the named dense vectors (+ bm25) out of a row so an update preserves them. */
30
+ function vectorsFromRow(row) {
31
+ const vector = {};
32
+ for (const [key, value] of Object.entries(row)) {
33
+ const numbers = toNumberArray(value);
34
+ if (numbers)
35
+ vector[key] = numbers;
36
+ }
37
+ if (row.bm25_json) {
38
+ try {
39
+ vector['bm25'] = JSON.parse(row.bm25_json);
40
+ }
41
+ catch {
42
+ /* ignore malformed sparse blob */
43
+ }
44
+ }
45
+ return vector;
46
+ }
47
+ function computeAttestBoost(successCount, failureCount) {
48
+ const runs = successCount + failureCount;
49
+ if (runs < MIN_ATTEST_RUNS)
50
+ return 0;
51
+ const successRatio = runs > 0 ? successCount / runs : 0;
52
+ const confidence = Math.min(runs / RUNS_FULL_CONFIDENCE, 1);
53
+ return Math.min(ATTEST_BOOST_MAX * successRatio * confidence, ATTEST_BOOST_MAX);
54
+ }
55
+ export class LanceRecordMutator {
56
+ engine;
57
+ constructor(engine) {
58
+ this.engine = engine;
59
+ }
60
+ async loadAccessibleRow(id, notFoundMessage) {
61
+ const validated = validateAndConvertId(id);
62
+ const row = await this.engine.retrieveRaw(validated);
63
+ if (!row || !isAccessible(row)) {
64
+ throw new SquadrulesError(notFoundMessage, 'MEMORY_NOT_FOUND', 404);
65
+ }
66
+ return row;
67
+ }
68
+ async updateMemory(id, updates) {
69
+ const tenantId = getTenantId();
70
+ const row = await this.loadAccessibleRow(id, `Memory with ID ${id} not found`);
71
+ const existingPayload = payloadOf(row);
72
+ let newQualityMetadata = existingPayload.quality_metadata;
73
+ const shouldRecalculate = updates.label || updates.text || updates.domain || updates.task || updates.type || updates.tags;
74
+ if (shouldRecalculate) {
75
+ const { modelStats } = await import('../../stats/model-stats.js');
76
+ const qualityMetadata = modelStats.calculateStepQualityMetadata(updates.label || existingPayload.label || '', updates.domain || existingPayload.domain || 'general', updates.task || existingPayload.task || 'general-task', updates.type || existingPayload.type || 'context', updates.tags || existingPayload.tags || []);
77
+ newQualityMetadata = { step_quality_score: qualityMetadata.step_quality_score, step_quality: qualityMetadata.step_quality };
78
+ }
79
+ const { description_short: _d, description_full: _f, ...safeUpdates } = updates ?? {};
80
+ const defaultSpaceId = getSpaceContext().defaultWriteSpaceId;
81
+ const updatedPayload = {
82
+ ...existingPayload,
83
+ space_id: existingPayload.space_id ?? defaultSpaceId,
84
+ ...safeUpdates,
85
+ updated_at: new Date().toISOString(),
86
+ modified_at: new Date().toISOString(),
87
+ modified_by: getSpaceContext().userId || 'system',
88
+ created_by: existingPayload.created_by ?? (getSpaceContext().userId || 'system'),
89
+ quality_metadata: newQualityMetadata
90
+ };
91
+ const vector = vectorsFromRow(row);
92
+ const textChanged = typeof updates?.text === 'string' && updates.text !== existingPayload.text;
93
+ if (textChanged) {
94
+ const embeddingResult = await embeddingService.generateEmbedding(updates.text);
95
+ const primaryName = `vs${embeddingResult.embedding.length}`;
96
+ for (const key of Object.keys(vector)) {
97
+ if (key.startsWith('vs'))
98
+ delete vector[key];
99
+ }
100
+ vector[primaryName] = embeddingResult.embedding;
101
+ }
102
+ await this.engine.upsertPoint({ id: row.id, payload: updatedPayload, vector });
103
+ await redisCacheService.invalidateMemoryCacheStrict(row.id);
104
+ await redisCacheService.invalidateAfterUpdate();
105
+ logger.debug(`[LanceRecordMutator] updateMemory ${row.id} tenant=${tenantId}`);
106
+ }
107
+ async deleteMemory(id) {
108
+ const validated = validateAndConvertId(id);
109
+ const row = await this.engine.retrieveRaw(validated);
110
+ if (!row || !isAccessible(row)) {
111
+ throw new SquadrulesError(`Memory with ID ${id} not found`, 'MEMORY_NOT_FOUND', 404);
112
+ }
113
+ await this.engine.deleteById(validated);
114
+ await redisCacheService.invalidateMemoryCacheStrict(validated);
115
+ await redisCacheService.invalidateAfterUpdate();
116
+ }
117
+ async updateQualityMetrics(id, metrics) {
118
+ const row = await this.loadAccessibleRow(id, `Memory with ID ${id} not found for quality update`);
119
+ const existingPayload = payloadOf(row);
120
+ const currentMetrics = existingPayload.quality_metrics || {
121
+ retrievalCount: 0, successCount: 0, partialCount: 0, failureCount: 0,
122
+ lastRated: null, lastRater: null, qualityBonus: 0, usageContext: null,
123
+ implementation_stats: { total_attempts: 0, success_attempts: 0, model_success_rates: {}, confidence_level: 0, last_implementation_attempt: null },
124
+ healer_contributions: { total_healers: 0, total_improvements: 0, healer_bonus_distributed: 0, last_healed: null, healer_models: {} },
125
+ step_success_rates: {}
126
+ };
127
+ const updatedMetrics = {
128
+ ...currentMetrics,
129
+ ...metrics,
130
+ retrievalCount: currentMetrics.retrievalCount + (metrics.retrievalCount || 0),
131
+ successCount: currentMetrics.successCount + (metrics.successCount || 0),
132
+ partialCount: currentMetrics.partialCount + (metrics.partialCount || 0),
133
+ failureCount: currentMetrics.failureCount + (metrics.failureCount || 0),
134
+ qualityBonus: currentMetrics.qualityBonus + (metrics.qualityBonus || 0)
135
+ };
136
+ const attest_boost = computeAttestBoost(updatedMetrics.successCount ?? 0, updatedMetrics.failureCount ?? 0);
137
+ const spaceId = existingPayload.space_id ?? getSpaceContext().defaultWriteSpaceId;
138
+ const updatedPayload = { ...existingPayload, space_id: spaceId, quality_metrics: updatedMetrics, attest_boost, updated_at: new Date().toISOString() };
139
+ await this.engine.upsertPoint({ id: row.id, payload: updatedPayload, vector: vectorsFromRow(row) });
140
+ }
141
+ async updateQualityMetadata(id, qualityMetadata) {
142
+ const row = await this.loadAccessibleRow(id, `Memory with ID ${id} not found for quality metadata update`);
143
+ const existingPayload = payloadOf(row);
144
+ const updatedQualityMetadata = { ...(existingPayload.quality_metadata || {}), ...qualityMetadata };
145
+ const spaceId = existingPayload.space_id ?? getSpaceContext().defaultWriteSpaceId;
146
+ const updatedPayload = { ...existingPayload, space_id: spaceId, quality_metadata: updatedQualityMetadata, updated_at: new Date().toISOString() };
147
+ await this.engine.upsertPoint({ id: row.id, payload: updatedPayload, vector: vectorsFromRow(row) });
148
+ }
149
+ /** Resolve a completion layer's adapter head and propagate reward to it. */
150
+ async propagateRewardToAdapterHead(stepPointId, metricsUpdate) {
151
+ const stepRow = await this.engine.retrieveRaw(validateAndConvertId(stepPointId));
152
+ if (!stepRow || !isAccessible(stepRow))
153
+ return null;
154
+ const payload = payloadOf(stepRow);
155
+ const adapterId = payload['adapter']?.id;
156
+ if (!adapterId || typeof adapterId !== 'string')
157
+ return null;
158
+ const layerIndex = payload['adapter']?.layer_index;
159
+ if (layerIndex === 1)
160
+ return null;
161
+ const heads = await this.engine.scroll(buildSpaceFilter(getSpaceContext().allowedSpaceIds, {
162
+ must: [
163
+ { key: 'adapter.id', match: { value: adapterId } },
164
+ { key: 'adapter.layer_index', match: { value: 1 } }
165
+ ]
166
+ }), 1);
167
+ if (heads.length === 0) {
168
+ logger.warn(`[reward-propagation] Adapter head not found for adapter ${adapterId}, skip propagation`);
169
+ return null;
170
+ }
171
+ const adapterHeadId = heads[0].id;
172
+ await this.updateQualityMetrics(adapterHeadId, metricsUpdate);
173
+ try {
174
+ await redisCacheService.invalidateBeginCache();
175
+ }
176
+ catch (cacheErr) {
177
+ logger.warn(`[reward-propagation] Cache invalidation failed after adapter head update (adapterHeadId=${adapterHeadId}): ${cacheErr instanceof Error ? cacheErr.message : String(cacheErr)}`);
178
+ }
179
+ return adapterHeadId;
180
+ }
181
+ /** Attach a payload patch (e.g. content hash) to a set of layer points. */
182
+ async setPayloadOnLayers(layerIds, patch) {
183
+ const points = [];
184
+ for (const rawId of layerIds) {
185
+ const row = await this.engine.retrieveRaw(validateAndConvertId(rawId));
186
+ if (!row)
187
+ continue;
188
+ points.push({ id: row.id, payload: { ...payloadOf(row), ...patch }, vector: vectorsFromRow(row) });
189
+ }
190
+ await this.engine.putPoints(points);
191
+ }
192
+ /** Delete app-space points matching a slug. */
193
+ async deleteAppSpaceBySlug(slug) {
194
+ await this.engine.deleteByFilter({
195
+ must: [
196
+ { key: 'slug', match: { value: slug } },
197
+ { key: 'space_id', match: { value: SQUADRULES_APP_SPACE_ID } }
198
+ ]
199
+ });
200
+ }
201
+ /** Delete app-space points matching an adapter id. */
202
+ async deleteAppSpaceByAdapterId(adapterId) {
203
+ await this.engine.deleteByFilter({
204
+ must: [
205
+ { key: 'adapter.id', match: { value: adapterId } },
206
+ { key: 'space_id', match: { value: SQUADRULES_APP_SPACE_ID } }
207
+ ]
208
+ });
209
+ }
210
+ }
211
+ //# sourceMappingURL=lance-records-mutations.js.map