@lota-sdk/core 0.4.13 → 0.4.14

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 (138) hide show
  1. package/package.json +4 -4
  2. package/src/ai/embedding-cache.ts +17 -11
  3. package/src/ai-gateway/ai-gateway.ts +164 -94
  4. package/src/ai-gateway/index.ts +4 -1
  5. package/src/config/agent-defaults.ts +2 -2
  6. package/src/config/agent-types.ts +1 -1
  7. package/src/create-runtime.ts +259 -200
  8. package/src/db/cursor-pagination.ts +2 -9
  9. package/src/db/memory-store.ts +194 -175
  10. package/src/db/memory.ts +125 -71
  11. package/src/db/schema-fingerprint.ts +5 -4
  12. package/src/db/service-normalization.ts +4 -3
  13. package/src/db/service.ts +3 -2
  14. package/src/db/startup.ts +15 -16
  15. package/src/effect/errors.ts +161 -21
  16. package/src/effect/index.ts +0 -1
  17. package/src/embeddings/provider.ts +15 -7
  18. package/src/queues/autonomous-job.queue.ts +10 -22
  19. package/src/queues/delayed-node-promotion.queue.ts +8 -14
  20. package/src/queues/document-processor.queue.ts +13 -4
  21. package/src/queues/memory-consolidation.queue.ts +26 -14
  22. package/src/queues/plan-agent-heartbeat.queue.ts +10 -9
  23. package/src/queues/plan-scheduler.queue.ts +37 -15
  24. package/src/queues/queue-factory.ts +59 -35
  25. package/src/queues/standalone-worker.ts +3 -2
  26. package/src/redis/connection.ts +10 -3
  27. package/src/redis/org-memory-lock.ts +1 -1
  28. package/src/redis/redis-lease-lock.ts +5 -5
  29. package/src/redis/stream-context.ts +1 -1
  30. package/src/runtime/chat-message.ts +64 -1
  31. package/src/runtime/chat-run-orchestration.ts +33 -20
  32. package/src/runtime/context-compaction/context-compaction-runtime.ts +14 -7
  33. package/src/runtime/context-compaction/context-compaction.ts +78 -66
  34. package/src/runtime/domain-layer.ts +13 -7
  35. package/src/runtime/execution-plan.ts +7 -3
  36. package/src/runtime/memory/memory-block.ts +3 -9
  37. package/src/runtime/memory/memory-scope.ts +3 -1
  38. package/src/runtime/plugin-resolution.ts +2 -1
  39. package/src/runtime/post-turn-side-effects.ts +6 -5
  40. package/src/runtime/retrieval-adapters.ts +8 -20
  41. package/src/runtime/runtime-config.ts +3 -9
  42. package/src/runtime/runtime-extensions.ts +2 -4
  43. package/src/runtime/runtime-lifecycle.ts +56 -16
  44. package/src/runtime/runtime-services.ts +180 -102
  45. package/src/runtime/runtime-worker-registry.ts +3 -1
  46. package/src/runtime/social-chat/social-chat-agent-runner.ts +1 -1
  47. package/src/runtime/social-chat/social-chat-history.ts +21 -18
  48. package/src/runtime/social-chat/social-chat.ts +356 -223
  49. package/src/runtime/specialist-runner.ts +3 -1
  50. package/src/runtime/team-consultation/team-consultation-orchestrator.ts +3 -2
  51. package/src/runtime/thread-turn-context.ts +142 -102
  52. package/src/runtime/turn-lifecycle.ts +15 -46
  53. package/src/services/agent-activity.service.ts +1 -1
  54. package/src/services/agent-executor.service.ts +107 -77
  55. package/src/services/autonomous-job.service.ts +354 -293
  56. package/src/services/background-work.service.ts +3 -3
  57. package/src/services/context-compaction.service.ts +7 -2
  58. package/src/services/document-chunk.service.ts +50 -32
  59. package/src/services/execution-plan/execution-plan-schedule.ts +5 -3
  60. package/src/services/execution-plan/execution-plan.service.ts +162 -179
  61. package/src/services/feedback-loop.service.ts +5 -4
  62. package/src/services/graph-full-routing.ts +37 -36
  63. package/src/services/institutional-memory.service.ts +28 -30
  64. package/src/services/learned-skill.service.ts +107 -72
  65. package/src/services/memory/memory-errors.ts +4 -23
  66. package/src/services/memory/memory-org-memory.ts +10 -5
  67. package/src/services/memory/memory-rerank.ts +18 -6
  68. package/src/services/memory/memory.service.ts +170 -111
  69. package/src/services/memory/rerank.service.ts +29 -20
  70. package/src/services/organization-member.service.ts +1 -1
  71. package/src/services/organization.service.ts +69 -75
  72. package/src/services/ownership-dispatcher.service.ts +40 -39
  73. package/src/services/plan/plan-agent-heartbeat.service.ts +26 -23
  74. package/src/services/plan/plan-agent-query.service.ts +39 -31
  75. package/src/services/plan/plan-completion-side-effects.ts +13 -17
  76. package/src/services/plan/plan-coordination.service.ts +2 -1
  77. package/src/services/plan/plan-cycle.service.ts +6 -5
  78. package/src/services/plan/plan-deadline.service.ts +57 -54
  79. package/src/services/plan/plan-event-delivery.service.ts +5 -4
  80. package/src/services/plan/plan-executor-graph.ts +18 -15
  81. package/src/services/plan/plan-executor.service.ts +235 -262
  82. package/src/services/plan/plan-run.service.ts +169 -93
  83. package/src/services/plan/plan-scheduler.service.ts +192 -202
  84. package/src/services/plan/plan-template.service.ts +1 -1
  85. package/src/services/plan/plan-transaction-events.ts +1 -1
  86. package/src/services/plan/plan-workspace.service.ts +23 -14
  87. package/src/services/plugin-executor.service.ts +5 -9
  88. package/src/services/queue-job.service.ts +117 -59
  89. package/src/services/recent-activity-title.service.ts +13 -12
  90. package/src/services/recent-activity.service.ts +6 -1
  91. package/src/services/social-chat-history.service.ts +29 -25
  92. package/src/services/system-executor.service.ts +5 -9
  93. package/src/services/thread/thread-active-run.ts +2 -2
  94. package/src/services/thread/thread-listing.ts +61 -57
  95. package/src/services/thread/thread-memory-block.ts +73 -48
  96. package/src/services/thread/thread-message.service.ts +76 -65
  97. package/src/services/thread/thread-record-store.ts +8 -8
  98. package/src/services/thread/thread-title.service.ts +10 -4
  99. package/src/services/thread/thread-turn-execution.ts +43 -45
  100. package/src/services/thread/thread-turn-preparation.service.ts +257 -135
  101. package/src/services/thread/thread-turn-streaming.ts +82 -85
  102. package/src/services/thread/thread-turn.ts +8 -8
  103. package/src/services/thread/thread.service.ts +135 -100
  104. package/src/services/user.service.ts +45 -48
  105. package/src/storage/attachment-parser.ts +6 -2
  106. package/src/storage/attachment-storage.service.ts +5 -6
  107. package/src/storage/generated-document-storage.service.ts +1 -1
  108. package/src/system-agents/context-compaction.agent.ts +10 -9
  109. package/src/system-agents/delegated-agent-factory.ts +30 -6
  110. package/src/system-agents/memory-reranker.agent.ts +10 -9
  111. package/src/system-agents/memory.agent.ts +10 -9
  112. package/src/system-agents/recent-activity-title-refiner.agent.ts +13 -15
  113. package/src/system-agents/regular-chat-memory-digest.agent.ts +13 -12
  114. package/src/system-agents/skill-extractor.agent.ts +13 -12
  115. package/src/system-agents/skill-manager.agent.ts +13 -12
  116. package/src/system-agents/thread-router.agent.ts +10 -5
  117. package/src/system-agents/title-generator.agent.ts +13 -12
  118. package/src/tools/fetch-webpage.tool.ts +13 -13
  119. package/src/tools/memory-block.tool.ts +3 -1
  120. package/src/tools/plan-approval.tool.ts +4 -2
  121. package/src/tools/read-file-parts.tool.ts +10 -4
  122. package/src/tools/remember-memory.tool.ts +3 -1
  123. package/src/tools/research-topic.tool.ts +9 -5
  124. package/src/tools/search-web.tool.ts +16 -16
  125. package/src/tools/search.tool.ts +20 -5
  126. package/src/tools/team-think.tool.ts +61 -38
  127. package/src/utils/async.ts +5 -5
  128. package/src/utils/errors.ts +19 -18
  129. package/src/utils/sse-keepalive.ts +28 -25
  130. package/src/workers/bootstrap.ts +75 -11
  131. package/src/workers/memory-consolidation.worker.ts +82 -91
  132. package/src/workers/organization-learning.worker.ts +14 -4
  133. package/src/workers/regular-chat-memory-digest.runner.ts +105 -67
  134. package/src/workers/skill-extraction.runner.ts +97 -61
  135. package/src/workers/utils/repo-structure-extractor.ts +13 -8
  136. package/src/workers/utils/thread-message-query.ts +24 -24
  137. package/src/workers/worker-utils.ts +23 -4
  138. package/src/effect/helpers.ts +0 -123
@@ -14,6 +14,7 @@ import type { RecordIdInput } from '../../db/record-id'
14
14
  import { ensureRecordId, recordIdToString } from '../../db/record-id'
15
15
  import type { SurrealDBService } from '../../db/service'
16
16
  import { TABLES } from '../../db/tables'
17
+ import { ERROR_TAGS } from '../../effect/errors'
17
18
  import { DatabaseServiceTag } from '../../effect/services'
18
19
  import { nowDate, nowEpochMillis, unsafeDateFrom } from '../../utils/date-time'
19
20
  import type { makePlanSchedulerService } from './plan-scheduler.service'
@@ -23,13 +24,13 @@ import { PlanTemplateServiceTag } from './plan-template.service'
23
24
 
24
25
  const TERMINAL_RUN_STATUSES: ReadonlySet<PlanRunStatus> = new Set(['completed', 'failed', 'aborted'])
25
26
 
26
- class PlanCycleNotFoundError extends Schema.TaggedErrorClass<PlanCycleNotFoundError>()('PlanCycleNotFoundError', {
27
- cycleId: Schema.String,
28
- message: Schema.String,
29
- }) {}
27
+ class PlanCycleNotFoundError extends Schema.TaggedErrorClass<PlanCycleNotFoundError>()(
28
+ ERROR_TAGS.PlanCycleNotFoundError,
29
+ { cycleId: Schema.String, message: Schema.String },
30
+ ) {}
30
31
 
31
32
  class PlanTemplateNotFoundForCycleError extends Schema.TaggedErrorClass<PlanTemplateNotFoundForCycleError>()(
32
- 'PlanTemplateNotFoundForCycleError',
33
+ '@lota-sdk/core/PlanTemplateNotFoundForCycleError',
33
34
  { templateId: Schema.String, message: Schema.String },
34
35
  ) {}
35
36
 
@@ -15,7 +15,7 @@ import type { RecordIdInput } from '../../db/record-id'
15
15
  import { ensureRecordId, recordIdToString } from '../../db/record-id'
16
16
  import type { SurrealDBService } from '../../db/service'
17
17
  import { TABLES } from '../../db/tables'
18
- import { makeEffectTryPromiseWithMessage } from '../../effect/helpers'
18
+ import { ERROR_TAGS } from '../../effect/errors'
19
19
  import { DatabaseServiceTag } from '../../effect/services'
20
20
  import type { PlanSchedulerQueueRuntime } from '../../queues/plan-scheduler.queue'
21
21
  import { LotaQueuesServiceTag } from '../../queues/queues.service'
@@ -91,16 +91,17 @@ interface PlanDeadlineDeps {
91
91
  planSchedulerQueue: PlanSchedulerQueueRuntime
92
92
  }
93
93
 
94
- class PlanDeadlineError extends Schema.TaggedErrorClass<PlanDeadlineError>()('PlanDeadlineError', {
94
+ class PlanDeadlineError extends Schema.TaggedErrorClass<PlanDeadlineError>()(ERROR_TAGS.PlanDeadlineError, {
95
95
  message: Schema.String,
96
96
  cause: Schema.optional(Schema.Defect),
97
97
  }) {}
98
98
 
99
+ function toPlanDeadlineError(message: string, cause: unknown): PlanDeadlineError {
100
+ return new PlanDeadlineError({ message, cause })
101
+ }
102
+
99
103
  export function makePlanDeadlineService(deps: PlanDeadlineDeps) {
100
104
  const { db, planEventDeliveryService, planExecutorService, planRunService, planSchedulerQueue } = deps
101
- const effectTryPromise = makeEffectTryPromiseWithMessage(
102
- (message, cause) => new PlanDeadlineError({ message, cause }),
103
- )
104
105
  const loadPlanSchedulerQueue = (): Effect.Effect<PlanSchedulerQueueRuntime, PlanDeadlineError> =>
105
106
  Effect.succeed(planSchedulerQueue)
106
107
 
@@ -115,16 +116,19 @@ export function makePlanDeadlineService(deps: PlanDeadlineDeps) {
115
116
  }
116
117
 
117
118
  const collectDeadlineSweepEffect = Effect.fn('PlanDeadline.collectDeadlineSweep')(function* (now: Date) {
118
- const activeNodeRuns = yield* effectTryPromise(
119
- () =>
120
- db.queryMany(
121
- new BoundQuery(`SELECT * FROM ${TABLES.PLAN_NODE_RUN} WHERE status IN $statuses`, {
122
- statuses: ['running', 'awaiting-human'],
123
- }),
124
- PlanNodeRunSchema,
119
+ const activeNodeRuns = yield* db
120
+ .queryMany(
121
+ new BoundQuery(`SELECT * FROM ${TABLES.PLAN_NODE_RUN} WHERE status IN $statuses`, {
122
+ statuses: ['running', 'awaiting-human'],
123
+ }),
124
+ PlanNodeRunSchema,
125
+ )
126
+ .pipe(
127
+ Effect.mapError((cause) =>
128
+ toPlanDeadlineError('Failed to load active plan node runs for deadline sweep.', cause),
125
129
  ),
126
- 'Failed to load active plan node runs for deadline sweep.',
127
- ).pipe(Effect.withSpan('PlanDeadline.loadActiveNodeRuns'))
130
+ Effect.withSpan('PlanDeadline.loadActiveNodeRuns'),
131
+ )
128
132
  const results = yield* Effect.forEach(
129
133
  activeNodeRuns,
130
134
  (nodeRun) =>
@@ -171,27 +175,25 @@ export function makePlanDeadlineService(deps: PlanDeadlineDeps) {
171
175
  const existing =
172
176
  dedupeKey === null
173
177
  ? []
174
- : yield* effectTryPromise(
175
- () =>
176
- db.queryMany(
177
- new BoundQuery(
178
- `SELECT * FROM ${TABLES.PLAN_EVENT}
178
+ : yield* db
179
+ .queryMany(
180
+ new BoundQuery(
181
+ `SELECT * FROM ${TABLES.PLAN_EVENT}
179
182
  WHERE runId = $runId
180
183
  AND nodeId = $nodeId
181
184
  AND eventType = $eventType
182
185
  AND detail.dedupeKey = $dedupeKey
183
186
  LIMIT 1`,
184
- {
185
- runId: ensureRecordId(params.run.id, TABLES.PLAN_RUN),
186
- nodeId: params.nodeRun.nodeId,
187
- eventType: params.eventType,
188
- dedupeKey,
189
- },
190
- ),
191
- PlanEventSchema,
187
+ {
188
+ runId: ensureRecordId(params.run.id, TABLES.PLAN_RUN),
189
+ nodeId: params.nodeRun.nodeId,
190
+ eventType: params.eventType,
191
+ dedupeKey,
192
+ },
192
193
  ),
193
- 'Failed to load existing deadline event.',
194
- )
194
+ PlanEventSchema,
195
+ )
196
+ .pipe(Effect.mapError((cause) => toPlanDeadlineError('Failed to load existing deadline event.', cause)))
195
197
  if (existing.length > 0) {
196
198
  return
197
199
  }
@@ -203,24 +205,22 @@ export function makePlanDeadlineService(deps: PlanDeadlineDeps) {
203
205
  (cause) => new PlanDeadlineError({ message: 'Failed to load plan spec for deadline event.', cause }),
204
206
  ),
205
207
  )
206
- const event = yield* effectTryPromise(
207
- () =>
208
- db.create(
209
- TABLES.PLAN_EVENT,
210
- {
211
- id: new RecordId(TABLES.PLAN_EVENT, Bun.randomUUIDv7()),
212
- planSpecId: ensureRecordId(spec.id, TABLES.PLAN_SPEC),
213
- runId: ensureRecordId(params.run.id, TABLES.PLAN_RUN),
214
- nodeId: params.nodeRun.nodeId,
215
- eventType: params.eventType,
216
- message: params.message,
217
- emittedBy: params.emittedBy,
218
- detail: params.detail,
219
- },
220
- PlanEventSchema,
221
- ),
222
- 'Failed to create deadline event.',
223
- )
208
+ const event = yield* db
209
+ .create(
210
+ TABLES.PLAN_EVENT,
211
+ {
212
+ id: new RecordId(TABLES.PLAN_EVENT, Bun.randomUUIDv7()),
213
+ planSpecId: ensureRecordId(spec.id, TABLES.PLAN_SPEC),
214
+ runId: ensureRecordId(params.run.id, TABLES.PLAN_RUN),
215
+ nodeId: params.nodeRun.nodeId,
216
+ eventType: params.eventType,
217
+ message: params.message,
218
+ emittedBy: params.emittedBy,
219
+ detail: params.detail,
220
+ },
221
+ PlanEventSchema,
222
+ )
223
+ .pipe(Effect.mapError((cause) => toPlanDeadlineError('Failed to create deadline event.', cause)))
224
224
  yield* planEventDeliveryService
225
225
  .dispatchEvent(PlanEventSchema.parse(event))
226
226
  .pipe(
@@ -378,8 +378,11 @@ export function makePlanDeadlineService(deps: PlanDeadlineDeps) {
378
378
  )
379
379
 
380
380
  const enqueueDeadlineCheckEffect = Effect.fn('PlanDeadline.enqueueDeadlineCheck')(function* (scheduledFor: Date) {
381
- const { enqueueDeadlineCheck } = yield* loadPlanSchedulerQueue()
382
- yield* effectTryPromise(() => enqueueDeadlineCheck(scheduledFor), 'Failed to enqueue deadline check.')
381
+ const queue = yield* loadPlanSchedulerQueue()
382
+ yield* Effect.tryPromise({
383
+ try: () => queue.enqueueDeadlineCheck(scheduledFor),
384
+ catch: (cause) => toPlanDeadlineError('Failed to enqueue deadline check.', cause),
385
+ })
383
386
  })
384
387
 
385
388
  const checkDeadlinesEffect = Effect.fn('PlanDeadline.checkDeadlines')(function* (now?: Date) {
@@ -403,11 +406,11 @@ export function makePlanDeadlineService(deps: PlanDeadlineDeps) {
403
406
  const cachedRun = runCache.get(runIdStr)
404
407
  const run =
405
408
  cachedRun ??
406
- (yield* effectTryPromise(
407
- () =>
408
- db.findOne(TABLES.PLAN_RUN, { id: ensureRecordId(entry.nodeRun.runId, TABLES.PLAN_RUN) }, PlanRunSchema),
409
- 'Failed to load plan run during deadline check.',
410
- ))
409
+ (yield* db
410
+ .findOne(TABLES.PLAN_RUN, { id: ensureRecordId(entry.nodeRun.runId, TABLES.PLAN_RUN) }, PlanRunSchema)
411
+ .pipe(
412
+ Effect.mapError((cause) => toPlanDeadlineError('Failed to load plan run during deadline check.', cause)),
413
+ ))
411
414
  if (!run) {
412
415
  return
413
416
  }
@@ -5,6 +5,7 @@ import type { ResolvedAgentConfig } from '../../config/agent-defaults'
5
5
  import { ensureRecordId, recordIdToString } from '../../db/record-id'
6
6
  import type { SurrealDBService } from '../../db/service'
7
7
  import { TABLES } from '../../db/tables'
8
+ import { ERROR_TAGS } from '../../effect/errors'
8
9
  import {
9
10
  AgentConfigServiceTag,
10
11
  DatabaseServiceTag,
@@ -25,10 +26,10 @@ import { PlanRunServiceTag } from './plan-run.service'
25
26
 
26
27
  const PLAN_EVENT_DELIVERED_TTL_MS = 7 * 24 * 60 * 60 * 1000
27
28
 
28
- class PlanEventDeliveryError extends Schema.TaggedErrorClass<PlanEventDeliveryError>()('PlanEventDeliveryError', {
29
- message: Schema.String,
30
- cause: Schema.optional(Schema.Defect),
31
- }) {}
29
+ class PlanEventDeliveryError extends Schema.TaggedErrorClass<PlanEventDeliveryError>()(
30
+ ERROR_TAGS.PlanEventDeliveryError,
31
+ { message: Schema.String, cause: Schema.optional(Schema.Defect) },
32
+ ) {}
32
33
 
33
34
  function buildDeliveredKey(eventId: string): string {
34
35
  return `plan-event:delivered:${eventId}`
@@ -13,7 +13,7 @@ import type { RecordIdInput } from '../../db/record-id'
13
13
  import { ensureRecordId, recordIdToString } from '../../db/record-id'
14
14
  import type { DatabaseTransaction } from '../../db/service'
15
15
  import { TABLES } from '../../db/tables'
16
- import { NotFoundError } from '../../effect/errors'
16
+ import { ERROR_TAGS, NotFoundError } from '../../effect/errors'
17
17
  import { nowDate } from '../../utils/date-time'
18
18
  import type { PlanExecutorContext } from './plan-executor-context'
19
19
  import {
@@ -27,10 +27,10 @@ import {
27
27
  } from './plan-executor-helpers'
28
28
  import { emitEvent, replaceRun } from './plan-executor-persistence'
29
29
 
30
- class PlanExecutorGraphError extends Schema.TaggedErrorClass<PlanExecutorGraphError>()('PlanExecutorGraphError', {
31
- message: Schema.String,
32
- cause: Schema.optional(Schema.Defect),
33
- }) {}
30
+ class PlanExecutorGraphError extends Schema.TaggedErrorClass<PlanExecutorGraphError>()(
31
+ ERROR_TAGS.PlanExecutorGraphError,
32
+ { message: Schema.String, cause: Schema.optional(Schema.Defect) },
33
+ ) {}
34
34
 
35
35
  function parseRowOrFail<T>(
36
36
  schema: z.ZodType<T>,
@@ -220,16 +220,19 @@ export function syncRunGraph(
220
220
  })
221
221
  const scheduledNodeRun = yield* parseRowOrFail(PlanNodeRunSchema, scheduledNodeRunRow, 'plan node run')
222
222
  replaceNodeRun(scheduledNodeRun)
223
- yield* Effect.tryPromise(() =>
224
- delayedNodePromotionQueue.enqueueDelayedNodePromotion(
225
- {
226
- runId: recordIdToString(currentRun.id, TABLES.PLAN_RUN),
227
- nodeId: nodeSpec.nodeId,
228
- emittedBy: params.emittedBy,
229
- },
230
- delayAfterPredecessorMs,
231
- ),
232
- )
223
+ yield* Effect.tryPromise({
224
+ try: () =>
225
+ delayedNodePromotionQueue.enqueueDelayedNodePromotion(
226
+ {
227
+ runId: recordIdToString(currentRun.id, TABLES.PLAN_RUN),
228
+ nodeId: nodeSpec.nodeId,
229
+ emittedBy: params.emittedBy,
230
+ },
231
+ delayAfterPredecessorMs,
232
+ ),
233
+ catch: (cause) =>
234
+ new PlanExecutorGraphError({ message: 'Failed to enqueue delayed node promotion.', cause }),
235
+ })
233
236
  yield* emitEvent({
234
237
  tx: params.tx,
235
238
  run: currentRun,