@lota-sdk/core 0.4.9 → 0.4.11

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 (182) hide show
  1. package/package.json +2 -2
  2. package/src/ai/embedding-cache.ts +3 -1
  3. package/src/ai-gateway/ai-gateway.ts +164 -82
  4. package/src/ai-gateway/index.ts +16 -1
  5. package/src/config/agent-defaults.ts +4 -107
  6. package/src/config/agent-types.ts +1 -1
  7. package/src/config/background-processing.ts +1 -1
  8. package/src/config/index.ts +0 -1
  9. package/src/config/logger.ts +22 -25
  10. package/src/config/thread-defaults.ts +1 -10
  11. package/src/create-runtime.ts +145 -670
  12. package/src/db/base.service.ts +30 -38
  13. package/src/db/memory-query-builder.ts +2 -1
  14. package/src/db/memory-store.ts +29 -20
  15. package/src/db/memory.ts +188 -195
  16. package/src/db/service-normalization.ts +97 -64
  17. package/src/db/service.ts +496 -384
  18. package/src/db/startup.ts +30 -19
  19. package/src/effect/helpers.ts +30 -5
  20. package/src/effect/index.ts +7 -7
  21. package/src/effect/layers.ts +75 -72
  22. package/src/effect/services.ts +15 -11
  23. package/src/embeddings/provider.ts +65 -71
  24. package/src/index.ts +13 -12
  25. package/src/queues/autonomous-job.queue.ts +177 -143
  26. package/src/queues/context-compaction.queue.ts +41 -39
  27. package/src/queues/delayed-node-promotion.queue.ts +61 -42
  28. package/src/queues/document-processor.queue.ts +5 -3
  29. package/src/queues/index.ts +1 -0
  30. package/src/queues/memory-consolidation.queue.ts +79 -53
  31. package/src/queues/organization-learning.queue.ts +70 -33
  32. package/src/queues/plan-agent-heartbeat.queue.ts +111 -83
  33. package/src/queues/plan-scheduler.queue.ts +101 -97
  34. package/src/queues/post-chat-memory.queue.ts +56 -46
  35. package/src/queues/queue-factory.ts +146 -69
  36. package/src/queues/queues.service.ts +61 -0
  37. package/src/queues/title-generation.queue.ts +44 -44
  38. package/src/redis/connection.ts +181 -164
  39. package/src/redis/org-memory-lock.ts +24 -9
  40. package/src/redis/redis-lease-lock.ts +8 -1
  41. package/src/redis/stream-context.ts +17 -9
  42. package/src/runtime/agent-identity-overrides.ts +7 -3
  43. package/src/runtime/agent-runtime-policy.ts +10 -5
  44. package/src/runtime/agent-stream-helpers.ts +24 -15
  45. package/src/runtime/chat-run-orchestration.ts +1 -1
  46. package/src/runtime/context-compaction/context-compaction-runtime.ts +28 -32
  47. package/src/runtime/context-compaction/context-compaction.ts +131 -85
  48. package/src/runtime/domain-layer.ts +203 -0
  49. package/src/runtime/execution-plan-visibility.ts +5 -2
  50. package/src/runtime/graph-designer.ts +0 -14
  51. package/src/runtime/helper-model.ts +8 -4
  52. package/src/runtime/index.ts +1 -1
  53. package/src/runtime/indexed-repositories-policy.ts +2 -6
  54. package/src/runtime/memory/memory-block.ts +19 -9
  55. package/src/runtime/memory/memory-pipeline.ts +53 -66
  56. package/src/runtime/memory/memory-scope.ts +33 -29
  57. package/src/runtime/plugin-resolution.ts +58 -62
  58. package/src/runtime/post-turn-side-effects.ts +139 -161
  59. package/src/runtime/retrieval-adapters.ts +4 -4
  60. package/src/runtime/runtime-config.ts +3 -9
  61. package/src/runtime/runtime-extensions.ts +0 -43
  62. package/src/runtime/runtime-lifecycle.ts +124 -0
  63. package/src/runtime/runtime-services.ts +455 -0
  64. package/src/runtime/runtime-worker-registry.ts +113 -30
  65. package/src/runtime/social-chat/social-chat-agent-runner.ts +13 -8
  66. package/src/runtime/social-chat/social-chat-history.ts +24 -13
  67. package/src/runtime/social-chat/social-chat.ts +420 -369
  68. package/src/runtime/team-consultation/team-consultation-orchestrator.ts +64 -57
  69. package/src/runtime/team-consultation/team-consultation-prompts.ts +11 -6
  70. package/src/runtime/thread-chat-helpers.ts +18 -9
  71. package/src/runtime/thread-turn-context.ts +28 -74
  72. package/src/runtime/turn-lifecycle.ts +6 -14
  73. package/src/services/agent-activity.service.ts +169 -176
  74. package/src/services/agent-executor.service.ts +207 -196
  75. package/src/services/artifact.service.ts +10 -5
  76. package/src/services/attachment.service.ts +16 -48
  77. package/src/services/autonomous-job.service.ts +81 -87
  78. package/src/services/background-work.service.ts +54 -0
  79. package/src/services/chat-run-registry.service.ts +3 -1
  80. package/src/services/context-compaction.service.ts +8 -10
  81. package/src/services/document-chunk.service.ts +8 -17
  82. package/src/services/execution-plan/execution-plan-graph.ts +122 -109
  83. package/src/services/execution-plan/execution-plan-schedule.ts +1 -15
  84. package/src/services/execution-plan/execution-plan.service.ts +68 -51
  85. package/src/services/feedback-loop.service.ts +1 -1
  86. package/src/services/global-orchestrator.service.ts +49 -15
  87. package/src/services/graph-full-routing.ts +49 -37
  88. package/src/services/index.ts +1 -0
  89. package/src/services/institutional-memory.service.ts +8 -17
  90. package/src/services/learned-skill.service.ts +38 -35
  91. package/src/services/memory/memory-conversation.ts +10 -5
  92. package/src/services/memory/memory-errors.ts +27 -0
  93. package/src/services/memory/memory-org-memory.ts +14 -3
  94. package/src/services/memory/memory-preseeded.ts +10 -4
  95. package/src/services/memory/memory-utils.ts +2 -1
  96. package/src/services/memory/memory.service.ts +37 -52
  97. package/src/services/memory/rerank.service.ts +3 -11
  98. package/src/services/monitoring-window.service.ts +1 -1
  99. package/src/services/mutating-approval.service.ts +1 -1
  100. package/src/services/node-workspace.service.ts +2 -2
  101. package/src/services/notification.service.ts +16 -4
  102. package/src/services/organization-member.service.ts +1 -1
  103. package/src/services/organization.service.ts +34 -51
  104. package/src/services/ownership-dispatcher.service.ts +148 -95
  105. package/src/services/plan/plan-agent-heartbeat.service.ts +30 -16
  106. package/src/services/plan/plan-agent-query.service.ts +13 -9
  107. package/src/services/plan/plan-approval.service.ts +52 -48
  108. package/src/services/plan/plan-artifact.service.ts +2 -2
  109. package/src/services/plan/plan-builder.service.ts +2 -2
  110. package/src/services/plan/plan-checkpoint.service.ts +1 -1
  111. package/src/services/plan/plan-compiler.service.ts +1 -1
  112. package/src/services/plan/plan-completion-side-effects.ts +99 -113
  113. package/src/services/plan/plan-coordination.service.ts +1 -1
  114. package/src/services/plan/plan-cycle.service.ts +171 -202
  115. package/src/services/plan/plan-deadline.service.ts +304 -307
  116. package/src/services/plan/plan-event-delivery.service.ts +84 -72
  117. package/src/services/plan/plan-executor-context.ts +2 -0
  118. package/src/services/plan/plan-executor-graph.ts +375 -353
  119. package/src/services/plan/plan-executor-helpers.ts +60 -75
  120. package/src/services/plan/plan-executor.service.ts +494 -489
  121. package/src/services/plan/plan-run.service.ts +12 -19
  122. package/src/services/plan/plan-scheduler.service.ts +89 -82
  123. package/src/services/plan/plan-template.service.ts +1 -1
  124. package/src/services/plan/plan-transaction-events.ts +8 -5
  125. package/src/services/plan/plan-validator.service.ts +1 -1
  126. package/src/services/plan/plan-workspace.service.ts +17 -11
  127. package/src/services/plugin-executor.service.ts +26 -21
  128. package/src/services/quality-metrics.service.ts +1 -1
  129. package/src/services/queue-job.service.ts +8 -17
  130. package/src/services/recent-activity-title.service.ts +22 -10
  131. package/src/services/recent-activity.service.ts +1 -1
  132. package/src/services/skill-resolver.service.ts +1 -1
  133. package/src/services/social-chat-history.service.ts +37 -20
  134. package/src/services/system-executor.service.ts +25 -20
  135. package/src/services/thread/thread-bootstrap.ts +37 -19
  136. package/src/services/thread/thread-listing.ts +2 -1
  137. package/src/services/thread/thread-memory-block.ts +18 -5
  138. package/src/services/thread/thread-message.service.ts +30 -13
  139. package/src/services/thread/thread-title.service.ts +1 -1
  140. package/src/services/thread/thread-turn-execution.ts +87 -83
  141. package/src/services/thread/thread-turn-preparation.service.ts +65 -40
  142. package/src/services/thread/thread-turn-streaming.ts +32 -36
  143. package/src/services/thread/thread-turn.ts +43 -29
  144. package/src/services/thread/thread.service.ts +32 -8
  145. package/src/services/user.service.ts +1 -1
  146. package/src/services/write-intent-validator.service.ts +1 -1
  147. package/src/storage/attachment-storage.service.ts +7 -4
  148. package/src/storage/generated-document-storage.service.ts +1 -1
  149. package/src/system-agents/context-compaction.agent.ts +1 -1
  150. package/src/system-agents/helper-agent-options.ts +1 -1
  151. package/src/system-agents/memory-reranker.agent.ts +1 -1
  152. package/src/system-agents/memory.agent.ts +1 -1
  153. package/src/system-agents/recent-activity-title-refiner.agent.ts +9 -6
  154. package/src/system-agents/regular-chat-memory-digest.agent.ts +1 -1
  155. package/src/system-agents/skill-extractor.agent.ts +1 -1
  156. package/src/system-agents/skill-manager.agent.ts +1 -1
  157. package/src/system-agents/thread-router.agent.ts +23 -20
  158. package/src/system-agents/title-generator.agent.ts +1 -1
  159. package/src/tools/execution-plan.tool.ts +36 -20
  160. package/src/tools/fetch-webpage.tool.ts +30 -22
  161. package/src/tools/firecrawl-client.ts +1 -6
  162. package/src/tools/plan-approval.tool.ts +9 -1
  163. package/src/tools/remember-memory.tool.ts +3 -6
  164. package/src/tools/research-topic.tool.ts +12 -3
  165. package/src/tools/search-web.tool.ts +26 -18
  166. package/src/tools/search.tool.ts +4 -5
  167. package/src/tools/team-think.tool.ts +139 -121
  168. package/src/utils/async.ts +15 -6
  169. package/src/utils/errors.ts +27 -15
  170. package/src/workers/bootstrap.ts +34 -58
  171. package/src/workers/memory-consolidation.worker.ts +4 -1
  172. package/src/workers/organization-learning.worker.ts +16 -3
  173. package/src/workers/regular-chat-memory-digest.helpers.ts +3 -4
  174. package/src/workers/regular-chat-memory-digest.runner.ts +46 -29
  175. package/src/workers/skill-extraction.runner.ts +13 -15
  176. package/src/workers/worker-utils.ts +14 -8
  177. package/src/config/search.ts +0 -3
  178. package/src/effect/awaitable-effect.ts +0 -87
  179. package/src/effect/runtime-ref.ts +0 -25
  180. package/src/effect/runtime.ts +0 -31
  181. package/src/redis/runtime-connection.ts +0 -10
  182. package/src/runtime/agent-types.ts +0 -1
@@ -1,8 +1,6 @@
1
1
  import { Effect } from 'effect'
2
2
  import type { z } from 'zod'
3
3
 
4
- import type { AwaitableEffect } from '../effect/awaitable-effect'
5
- import { toAwaitableEffect } from '../effect/awaitable-effect'
6
4
  import { NotFoundError } from '../effect/errors'
7
5
  import { ensureRecordId } from './record-id'
8
6
  import type { SurrealDBService } from './service'
@@ -16,7 +14,7 @@ export abstract class BaseService<T extends z.ZodType> {
16
14
  protected readonly databaseService: SurrealDBService,
17
15
  ) {}
18
16
 
19
- findById(id: unknown): AwaitableEffect<z.infer<T> | null, SurrealDBError> {
17
+ findById(id: unknown): Effect.Effect<z.infer<T> | null, SurrealDBError, never> {
20
18
  return this.databaseService.findOne(
21
19
  this.table,
22
20
  { id: ensureRecordId(id as Parameters<typeof ensureRecordId>[0], this.table) },
@@ -24,61 +22,55 @@ export abstract class BaseService<T extends z.ZodType> {
24
22
  )
25
23
  }
26
24
 
27
- getById(id: unknown): AwaitableEffect<z.infer<T>, SurrealDBError | NotFoundError> {
25
+ getById(id: unknown): Effect.Effect<z.infer<T>, SurrealDBError | NotFoundError, never> {
28
26
  const { table, databaseService, schema } = this
29
- return toAwaitableEffect(
30
- Effect.gen(function* () {
31
- const record = yield* databaseService.findOne(
32
- table,
33
- { id: ensureRecordId(id as Parameters<typeof ensureRecordId>[0], table) },
34
- schema,
35
- )
27
+ return Effect.gen(function* () {
28
+ const record = yield* databaseService.findOne(
29
+ table,
30
+ { id: ensureRecordId(id as Parameters<typeof ensureRecordId>[0], table) },
31
+ schema,
32
+ )
36
33
 
37
- if (!record) {
38
- return yield* new NotFoundError({ resource: table, message: `${table} record not found` })
39
- }
34
+ if (!record) {
35
+ return yield* new NotFoundError({ resource: table, message: `${table} record not found` })
36
+ }
40
37
 
41
- return record
42
- }),
43
- )
38
+ return record
39
+ })
44
40
  }
45
41
 
46
42
  findAll(
47
43
  filter: Record<string, unknown> = {},
48
44
  options?: { limit?: number; offset?: number; orderBy?: keyof z.infer<T> & string; orderDir?: 'ASC' | 'DESC' },
49
- ): AwaitableEffect<z.infer<T>[], SurrealDBError> {
45
+ ): Effect.Effect<z.infer<T>[], SurrealDBError, never> {
50
46
  return this.databaseService.findMany(this.table, filter, this.schema, options)
51
47
  }
52
48
 
53
- create(data: Record<string, unknown>): AwaitableEffect<z.infer<T>, SurrealDBError> {
49
+ create(data: Record<string, unknown>): Effect.Effect<z.infer<T>, SurrealDBError, never> {
54
50
  return this.databaseService.create(this.table, data, this.schema)
55
51
  }
56
52
 
57
- update(id: unknown, data: Record<string, unknown>): AwaitableEffect<z.infer<T>, SurrealDBError | NotFoundError> {
53
+ update(id: unknown, data: Record<string, unknown>): Effect.Effect<z.infer<T>, SurrealDBError | NotFoundError, never> {
58
54
  const { table, databaseService, schema } = this
59
- return toAwaitableEffect(
60
- Effect.gen(function* () {
61
- const updated = yield* databaseService.update(table, id, data, schema)
55
+ return Effect.gen(function* () {
56
+ const updated = yield* databaseService.update(table, id, data, schema)
62
57
 
63
- if (!updated) {
64
- return yield* new NotFoundError({ resource: table, message: `${table} record not found` })
65
- }
58
+ if (!updated) {
59
+ return yield* new NotFoundError({ resource: table, message: `${table} record not found` })
60
+ }
66
61
 
67
- return updated
68
- }),
69
- )
62
+ return updated
63
+ })
70
64
  }
71
65
 
72
- delete(id: unknown): AwaitableEffect<void, SurrealDBError | NotFoundError> {
66
+ delete(id: unknown): Effect.Effect<void, SurrealDBError | NotFoundError, never> {
73
67
  const { table, databaseService } = this
74
- return toAwaitableEffect(
75
- Effect.gen(function* () {
76
- const deleted = yield* databaseService.deleteById(table, id)
68
+ return Effect.gen(function* () {
69
+ const deleted = yield* databaseService.deleteById(table, id)
77
70
 
78
- if (!deleted) {
79
- return yield* new NotFoundError({ resource: table, message: `${table} record not found` })
80
- }
81
- }),
82
- )
71
+ if (!deleted) {
72
+ return yield* new NotFoundError({ resource: table, message: `${table} record not found` })
73
+ }
74
+ })
83
75
  }
84
76
  }
@@ -3,8 +3,9 @@
3
3
  * Builds type-safe SQL queries with proper parameterization
4
4
  */
5
5
 
6
+ import { VECTOR_SEARCH_OVERFETCH_MULTIPLIER } from '@lota-sdk/shared'
7
+
6
8
  import { validateKnnLimit } from '../config/constants'
7
- import { VECTOR_SEARCH_OVERFETCH_MULTIPLIER } from '../config/search'
8
9
  import { TABLES } from './tables'
9
10
 
10
11
  const MEMORY_TABLE = TABLES.MEMORY
@@ -1,9 +1,10 @@
1
+ import type { Context } from 'effect'
1
2
  import { Schema, Duration, Effect, Metric, Schedule } from 'effect'
2
3
  import { BoundQuery, eq, inside } from 'surrealdb'
3
4
 
4
5
  import { aiLogger } from '../config/logger'
5
- import { DEFAULT_MEMORY_SEARCH_LIMIT } from '../config/search'
6
6
  import { ProviderEmbeddings } from '../embeddings/provider'
7
+ import type { BackgroundWorkService } from '../services/background-work.service'
7
8
  import { clampImportance, truncateText } from '../utils/string'
8
9
  import { memoryQueryBuilder } from './memory-query-builder'
9
10
  import type { RelationCounts } from './memory-store.helpers'
@@ -24,9 +25,12 @@ import type { SurrealDBError } from './service-normalization'
24
25
  import { TABLES } from './tables'
25
26
  import { isRetriableTransactionConflict } from './transaction-conflict'
26
27
 
28
+ type BackgroundWorker = Context.Service.Shape<typeof BackgroundWorkService>
29
+
27
30
  const MEMORY_TABLE = TABLES.MEMORY
28
31
  const MEMORY_HISTORY_TABLE = TABLES.MEMORY_HISTORY
29
32
  const MEMORY_RELATION_TABLE = TABLES.MEMORY_RELATION
33
+ const DEFAULT_MEMORY_SEARCH_LIMIT = 10
30
34
  const MIN_RELEVANCE_SCORE = 0.25
31
35
  const STRONG_GRAPH_BOOSTS = { support: 0.1, contradict: 0.2 } as const
32
36
  const WEAK_GRAPH_BOOSTS = { support: 0.05, contradict: 0.1 } as const
@@ -46,13 +50,9 @@ class MemoryStoreError extends Schema.TaggedErrorClass<MemoryStoreError>()('Memo
46
50
  cause: Schema.Defect,
47
51
  }) {}
48
52
 
49
- function recordMemorySearchDuration(elapsed: number): void {
50
- void Effect.runFork(Metric.update(memorySearchDuration, elapsed))
51
- }
52
-
53
- function tryMemoryStorePromise<A, R = never>(
53
+ function tryMemoryStorePromise<A, E, R = never>(
54
54
  message: string,
55
- thunk: () => PromiseLike<A> | Effect.Effect<A, unknown, R>,
55
+ thunk: () => PromiseLike<A> | Effect.Effect<A, E, R>,
56
56
  ): Effect.Effect<A, MemoryStoreError, R> {
57
57
  return Effect.suspend(() => {
58
58
  try {
@@ -75,9 +75,15 @@ interface EmbeddingClient {
75
75
  export class SurrealMemoryStore {
76
76
  private db: SurrealDBService
77
77
  private embeddings: EmbeddingClient
78
- constructor(db: SurrealDBService, embeddings: EmbeddingClient) {
78
+ private background: BackgroundWorker
79
+ constructor(db: SurrealDBService, embeddings: EmbeddingClient, background: BackgroundWorker) {
79
80
  this.db = db
80
81
  this.embeddings = embeddings
82
+ this.background = background
83
+ }
84
+
85
+ private recordMemorySearchDuration(elapsed: number): Effect.Effect<void> {
86
+ return this.background.runForget(Metric.update(memorySearchDuration, elapsed), 'memory-store.recordSearchDuration')
81
87
  }
82
88
 
83
89
  private toMetadataFieldPathEffect(key: string): Effect.Effect<string, MemoryStoreError> {
@@ -214,7 +220,7 @@ export class SurrealMemoryStore {
214
220
  MIN_RELEVANCE_SCORE,
215
221
  )
216
222
 
217
- this.touchMemories(processed.map((row) => row.id))
223
+ yield* this.touchMemories(processed.map((row) => row.id))
218
224
  return processed
219
225
  }.bind(this),
220
226
  )
@@ -295,8 +301,8 @@ export class SurrealMemoryStore {
295
301
  )
296
302
  }
297
303
 
298
- private touchMemories(memoryIds: string[]): void {
299
- if (memoryIds.length === 0) return
304
+ private touchMemories(memoryIds: string[]): Effect.Effect<void> {
305
+ if (memoryIds.length === 0) return Effect.void
300
306
  const uniqueIds = [...new Set(memoryIds)]
301
307
  const memoryRefs = uniqueIds.map((id) => ensureRecordId(id, TABLES.MEMORY))
302
308
  const sql = `
@@ -306,7 +312,7 @@ export class SurrealMemoryStore {
306
312
  `
307
313
  const query = new BoundQuery(sql, { memoryIds: memoryRefs })
308
314
 
309
- void Effect.runFork(this.runTouchMemoriesWithRetry(query))
315
+ return this.background.runForget(this.runTouchMemoriesWithRetry(query), 'memory-store.touchMemories')
310
316
  }
311
317
 
312
318
  private runTouchMemoriesWithRetry(query: BoundQuery): Effect.Effect<void, never, never> {
@@ -387,7 +393,7 @@ export class SurrealMemoryStore {
387
393
  MIN_RELEVANCE_SCORE,
388
394
  )
389
395
 
390
- this.touchMemories(processed.map((row) => row.id))
396
+ yield* this.touchMemories(processed.map((row) => row.id))
391
397
  return processed
392
398
  }.bind(this),
393
399
  )
@@ -569,7 +575,7 @@ export class SurrealMemoryStore {
569
575
  )
570
576
 
571
577
  aiLogger.debug`Memory store search final results: ${processed.length} memories after filtering`
572
- this.touchMemories(processed.map((row) => row.id))
578
+ yield* this.touchMemories(processed.map((row) => row.id))
573
579
  return processed
574
580
  }.bind(this),
575
581
  )
@@ -614,7 +620,7 @@ export class SurrealMemoryStore {
614
620
  MIN_RELEVANCE_SCORE,
615
621
  )
616
622
 
617
- this.touchMemories(processed.map((row) => row.id))
623
+ yield* this.touchMemories(processed.map((row) => row.id))
618
624
  return processed
619
625
  }.bind(this),
620
626
  )
@@ -676,12 +682,13 @@ export class SurrealMemoryStore {
676
682
 
677
683
  type LinearRow = BasicSearchRow & { linearScore: number }
678
684
 
685
+ const recordSearchDuration = this.recordMemorySearchDuration.bind(this)
679
686
  const linearResults = yield* this.queryFinalStatementEffect<LinearRow>(sql, bindVars).pipe(
680
687
  Effect.timeout(Duration.millis(SurrealMemoryStore.HYBRID_SEARCH_TIMEOUT_MS)),
681
688
  Effect.catchTag('TimeoutError', () =>
682
- Effect.sync(() => {
689
+ Effect.gen(function* () {
683
690
  const elapsed = performance.now() - searchStart
684
- recordMemorySearchDuration(elapsed)
691
+ yield* recordSearchDuration(elapsed)
685
692
  aiLogger.warn`Hybrid search timed out after ${elapsed.toFixed(0)}ms (scopeId: ${options.scopeId}). Falling back to vector-only.`
686
693
  return null
687
694
  }),
@@ -737,9 +744,9 @@ export class SurrealMemoryStore {
737
744
  }
738
745
 
739
746
  const elapsed = performance.now() - searchStart
740
- recordMemorySearchDuration(elapsed)
741
- aiLogger.info`[SUCCESS_WEIGHTED_SEARCH] Weighted hybrid search succeeded (scopeId: ${options.scopeId}, rawResults: ${linearResults.length}, returned: ${processed.length}, weights: ${weights.join(',')}, normalization: ${normalization}, latencyMs: ${elapsed.toFixed(0)})`
742
- this.touchMemories(processed.map((row) => row.id))
747
+ yield* this.recordMemorySearchDuration(elapsed)
748
+ aiLogger.debug`[SUCCESS_WEIGHTED_SEARCH] Weighted hybrid search succeeded (scopeId: ${options.scopeId}, rawResults: ${linearResults.length}, returned: ${processed.length}, weights: ${weights.join(',')}, normalization: ${normalization}, latencyMs: ${elapsed.toFixed(0)})`
749
+ yield* this.touchMemories(processed.map((row) => row.id))
743
750
  return processed
744
751
  }.bind(this),
745
752
  )
@@ -1247,9 +1254,11 @@ export class SurrealMemoryStore {
1247
1254
  export function createMemoryStore(
1248
1255
  db: SurrealDBService,
1249
1256
  options: { embeddingModel: string; openRouterApiKey?: string },
1257
+ background: BackgroundWorker,
1250
1258
  ): SurrealMemoryStore {
1251
1259
  return new SurrealMemoryStore(
1252
1260
  db,
1253
1261
  new ProviderEmbeddings({ modelId: options.embeddingModel, openRouterApiKey: options.openRouterApiKey }),
1262
+ background,
1254
1263
  )
1255
1264
  }