@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.
- package/package.json +2 -2
- package/src/ai/embedding-cache.ts +3 -1
- package/src/ai-gateway/ai-gateway.ts +164 -82
- package/src/ai-gateway/index.ts +16 -1
- package/src/config/agent-defaults.ts +4 -107
- package/src/config/agent-types.ts +1 -1
- package/src/config/background-processing.ts +1 -1
- package/src/config/index.ts +0 -1
- package/src/config/logger.ts +22 -25
- package/src/config/thread-defaults.ts +1 -10
- package/src/create-runtime.ts +145 -670
- package/src/db/base.service.ts +30 -38
- package/src/db/memory-query-builder.ts +2 -1
- package/src/db/memory-store.ts +29 -20
- package/src/db/memory.ts +188 -195
- package/src/db/service-normalization.ts +97 -64
- package/src/db/service.ts +496 -384
- package/src/db/startup.ts +30 -19
- package/src/effect/helpers.ts +30 -5
- package/src/effect/index.ts +7 -7
- package/src/effect/layers.ts +75 -72
- package/src/effect/services.ts +15 -11
- package/src/embeddings/provider.ts +65 -71
- package/src/index.ts +13 -12
- package/src/queues/autonomous-job.queue.ts +177 -143
- package/src/queues/context-compaction.queue.ts +41 -39
- package/src/queues/delayed-node-promotion.queue.ts +61 -42
- package/src/queues/document-processor.queue.ts +5 -3
- package/src/queues/index.ts +1 -0
- package/src/queues/memory-consolidation.queue.ts +79 -53
- package/src/queues/organization-learning.queue.ts +70 -33
- package/src/queues/plan-agent-heartbeat.queue.ts +111 -83
- package/src/queues/plan-scheduler.queue.ts +101 -97
- package/src/queues/post-chat-memory.queue.ts +56 -46
- package/src/queues/queue-factory.ts +146 -69
- package/src/queues/queues.service.ts +61 -0
- package/src/queues/title-generation.queue.ts +44 -44
- package/src/redis/connection.ts +181 -164
- package/src/redis/org-memory-lock.ts +24 -9
- package/src/redis/redis-lease-lock.ts +8 -1
- package/src/redis/stream-context.ts +17 -9
- package/src/runtime/agent-identity-overrides.ts +7 -3
- package/src/runtime/agent-runtime-policy.ts +10 -5
- package/src/runtime/agent-stream-helpers.ts +24 -15
- package/src/runtime/chat-run-orchestration.ts +1 -1
- package/src/runtime/context-compaction/context-compaction-runtime.ts +28 -32
- package/src/runtime/context-compaction/context-compaction.ts +131 -85
- package/src/runtime/domain-layer.ts +203 -0
- package/src/runtime/execution-plan-visibility.ts +5 -2
- package/src/runtime/graph-designer.ts +0 -14
- package/src/runtime/helper-model.ts +8 -4
- package/src/runtime/index.ts +1 -1
- package/src/runtime/indexed-repositories-policy.ts +2 -6
- package/src/runtime/memory/memory-block.ts +19 -9
- package/src/runtime/memory/memory-pipeline.ts +53 -66
- package/src/runtime/memory/memory-scope.ts +33 -29
- package/src/runtime/plugin-resolution.ts +58 -62
- package/src/runtime/post-turn-side-effects.ts +139 -161
- package/src/runtime/retrieval-adapters.ts +4 -4
- package/src/runtime/runtime-config.ts +3 -9
- package/src/runtime/runtime-extensions.ts +0 -43
- package/src/runtime/runtime-lifecycle.ts +124 -0
- package/src/runtime/runtime-services.ts +455 -0
- package/src/runtime/runtime-worker-registry.ts +113 -30
- package/src/runtime/social-chat/social-chat-agent-runner.ts +13 -8
- package/src/runtime/social-chat/social-chat-history.ts +24 -13
- package/src/runtime/social-chat/social-chat.ts +420 -369
- package/src/runtime/team-consultation/team-consultation-orchestrator.ts +64 -57
- package/src/runtime/team-consultation/team-consultation-prompts.ts +11 -6
- package/src/runtime/thread-chat-helpers.ts +18 -9
- package/src/runtime/thread-turn-context.ts +28 -74
- package/src/runtime/turn-lifecycle.ts +6 -14
- package/src/services/agent-activity.service.ts +169 -176
- package/src/services/agent-executor.service.ts +207 -196
- package/src/services/artifact.service.ts +10 -5
- package/src/services/attachment.service.ts +16 -48
- package/src/services/autonomous-job.service.ts +81 -87
- package/src/services/background-work.service.ts +54 -0
- package/src/services/chat-run-registry.service.ts +3 -1
- package/src/services/context-compaction.service.ts +8 -10
- package/src/services/document-chunk.service.ts +8 -17
- package/src/services/execution-plan/execution-plan-graph.ts +122 -109
- package/src/services/execution-plan/execution-plan-schedule.ts +1 -15
- package/src/services/execution-plan/execution-plan.service.ts +68 -51
- package/src/services/feedback-loop.service.ts +1 -1
- package/src/services/global-orchestrator.service.ts +49 -15
- package/src/services/graph-full-routing.ts +49 -37
- package/src/services/index.ts +1 -0
- package/src/services/institutional-memory.service.ts +8 -17
- package/src/services/learned-skill.service.ts +38 -35
- package/src/services/memory/memory-conversation.ts +10 -5
- package/src/services/memory/memory-errors.ts +27 -0
- package/src/services/memory/memory-org-memory.ts +14 -3
- package/src/services/memory/memory-preseeded.ts +10 -4
- package/src/services/memory/memory-utils.ts +2 -1
- package/src/services/memory/memory.service.ts +37 -52
- package/src/services/memory/rerank.service.ts +3 -11
- package/src/services/monitoring-window.service.ts +1 -1
- package/src/services/mutating-approval.service.ts +1 -1
- package/src/services/node-workspace.service.ts +2 -2
- package/src/services/notification.service.ts +16 -4
- package/src/services/organization-member.service.ts +1 -1
- package/src/services/organization.service.ts +34 -51
- package/src/services/ownership-dispatcher.service.ts +148 -95
- package/src/services/plan/plan-agent-heartbeat.service.ts +30 -16
- package/src/services/plan/plan-agent-query.service.ts +13 -9
- package/src/services/plan/plan-approval.service.ts +52 -48
- package/src/services/plan/plan-artifact.service.ts +2 -2
- package/src/services/plan/plan-builder.service.ts +2 -2
- package/src/services/plan/plan-checkpoint.service.ts +1 -1
- package/src/services/plan/plan-compiler.service.ts +1 -1
- package/src/services/plan/plan-completion-side-effects.ts +99 -113
- package/src/services/plan/plan-coordination.service.ts +1 -1
- package/src/services/plan/plan-cycle.service.ts +171 -202
- package/src/services/plan/plan-deadline.service.ts +304 -307
- package/src/services/plan/plan-event-delivery.service.ts +84 -72
- package/src/services/plan/plan-executor-context.ts +2 -0
- package/src/services/plan/plan-executor-graph.ts +375 -353
- package/src/services/plan/plan-executor-helpers.ts +60 -75
- package/src/services/plan/plan-executor.service.ts +494 -489
- package/src/services/plan/plan-run.service.ts +12 -19
- package/src/services/plan/plan-scheduler.service.ts +89 -82
- package/src/services/plan/plan-template.service.ts +1 -1
- package/src/services/plan/plan-transaction-events.ts +8 -5
- package/src/services/plan/plan-validator.service.ts +1 -1
- package/src/services/plan/plan-workspace.service.ts +17 -11
- package/src/services/plugin-executor.service.ts +26 -21
- package/src/services/quality-metrics.service.ts +1 -1
- package/src/services/queue-job.service.ts +8 -17
- package/src/services/recent-activity-title.service.ts +22 -10
- package/src/services/recent-activity.service.ts +1 -1
- package/src/services/skill-resolver.service.ts +1 -1
- package/src/services/social-chat-history.service.ts +37 -20
- package/src/services/system-executor.service.ts +25 -20
- package/src/services/thread/thread-bootstrap.ts +37 -19
- package/src/services/thread/thread-listing.ts +2 -1
- package/src/services/thread/thread-memory-block.ts +18 -5
- package/src/services/thread/thread-message.service.ts +30 -13
- package/src/services/thread/thread-title.service.ts +1 -1
- package/src/services/thread/thread-turn-execution.ts +87 -83
- package/src/services/thread/thread-turn-preparation.service.ts +65 -40
- package/src/services/thread/thread-turn-streaming.ts +32 -36
- package/src/services/thread/thread-turn.ts +43 -29
- package/src/services/thread/thread.service.ts +32 -8
- package/src/services/user.service.ts +1 -1
- package/src/services/write-intent-validator.service.ts +1 -1
- package/src/storage/attachment-storage.service.ts +7 -4
- package/src/storage/generated-document-storage.service.ts +1 -1
- package/src/system-agents/context-compaction.agent.ts +1 -1
- package/src/system-agents/helper-agent-options.ts +1 -1
- package/src/system-agents/memory-reranker.agent.ts +1 -1
- package/src/system-agents/memory.agent.ts +1 -1
- package/src/system-agents/recent-activity-title-refiner.agent.ts +9 -6
- package/src/system-agents/regular-chat-memory-digest.agent.ts +1 -1
- package/src/system-agents/skill-extractor.agent.ts +1 -1
- package/src/system-agents/skill-manager.agent.ts +1 -1
- package/src/system-agents/thread-router.agent.ts +23 -20
- package/src/system-agents/title-generator.agent.ts +1 -1
- package/src/tools/execution-plan.tool.ts +36 -20
- package/src/tools/fetch-webpage.tool.ts +30 -22
- package/src/tools/firecrawl-client.ts +1 -6
- package/src/tools/plan-approval.tool.ts +9 -1
- package/src/tools/remember-memory.tool.ts +3 -6
- package/src/tools/research-topic.tool.ts +12 -3
- package/src/tools/search-web.tool.ts +26 -18
- package/src/tools/search.tool.ts +4 -5
- package/src/tools/team-think.tool.ts +139 -121
- package/src/utils/async.ts +15 -6
- package/src/utils/errors.ts +27 -15
- package/src/workers/bootstrap.ts +34 -58
- package/src/workers/memory-consolidation.worker.ts +4 -1
- package/src/workers/organization-learning.worker.ts +16 -3
- package/src/workers/regular-chat-memory-digest.helpers.ts +3 -4
- package/src/workers/regular-chat-memory-digest.runner.ts +46 -29
- package/src/workers/skill-extraction.runner.ts +13 -15
- package/src/workers/worker-utils.ts +14 -8
- package/src/config/search.ts +0 -3
- package/src/effect/awaitable-effect.ts +0 -87
- package/src/effect/runtime-ref.ts +0 -25
- package/src/effect/runtime.ts +0 -31
- package/src/redis/runtime-connection.ts +0 -10
- package/src/runtime/agent-types.ts +0 -1
package/src/db/base.service.ts
CHANGED
|
@@ -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):
|
|
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):
|
|
25
|
+
getById(id: unknown): Effect.Effect<z.infer<T>, SurrealDBError | NotFoundError, never> {
|
|
28
26
|
const { table, databaseService, schema } = this
|
|
29
|
-
return
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
34
|
+
if (!record) {
|
|
35
|
+
return yield* new NotFoundError({ resource: table, message: `${table} record not found` })
|
|
36
|
+
}
|
|
40
37
|
|
|
41
|
-
|
|
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
|
-
):
|
|
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>):
|
|
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>):
|
|
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
|
|
60
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
58
|
+
if (!updated) {
|
|
59
|
+
return yield* new NotFoundError({ resource: table, message: `${table} record not found` })
|
|
60
|
+
}
|
|
66
61
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
)
|
|
62
|
+
return updated
|
|
63
|
+
})
|
|
70
64
|
}
|
|
71
65
|
|
|
72
|
-
delete(id: unknown):
|
|
66
|
+
delete(id: unknown): Effect.Effect<void, SurrealDBError | NotFoundError, never> {
|
|
73
67
|
const { table, databaseService } = this
|
|
74
|
-
return
|
|
75
|
-
|
|
76
|
-
const deleted = yield* databaseService.deleteById(table, id)
|
|
68
|
+
return Effect.gen(function* () {
|
|
69
|
+
const deleted = yield* databaseService.deleteById(table, id)
|
|
77
70
|
|
|
78
|
-
|
|
79
|
-
|
|
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
|
package/src/db/memory-store.ts
CHANGED
|
@@ -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
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
689
|
+
Effect.gen(function* () {
|
|
683
690
|
const elapsed = performance.now() - searchStart
|
|
684
|
-
|
|
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.
|
|
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
|
}
|