@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
@@ -12,7 +12,7 @@ import {
12
12
  isSafePath,
13
13
  isSafePathOrRoot,
14
14
  } from '@lota-sdk/shared'
15
- import { Effect } from 'effect'
15
+ import { Effect, Schema } from 'effect'
16
16
 
17
17
  import type { RecordIdInput } from '../../db/record-id'
18
18
  import { ensureRecordId } from '../../db/record-id'
@@ -25,10 +25,11 @@ import { isExecutableConditionExpression, readPathValue } from './plan-helpers'
25
25
  const SUCCESSFUL_TERMINAL_NODE_STATUSES = new Set(['completed', 'partial', 'skipped', 'scheduled', 'monitoring'])
26
26
  const HUMAN_NODE_TYPE_SET = new Set<string>(HUMAN_NODE_TYPE_VALUES)
27
27
  const STRUCTURAL_NODE_TYPE_SET = new Set<string>(STRUCTURAL_NODE_TYPE_VALUES)
28
+ const decodeJsonLiteralEffect = Schema.decodeUnknownEffect(Schema.UnknownFromJsonString)
28
29
 
29
30
  function parseLiteralValue(raw: string): Effect.Effect<unknown> {
30
31
  const trimmed = raw.trim()
31
- if (!trimmed.length) return Effect.succeed(undefined)
32
+ if (!trimmed.length) return Effect.void
32
33
  if (trimmed === 'true') return Effect.succeed(true)
33
34
  if (trimmed === 'false') return Effect.succeed(false)
34
35
  if (trimmed === 'null') return Effect.succeed(null)
@@ -41,9 +42,7 @@ function parseLiteralValue(raw: string): Effect.Effect<unknown> {
41
42
  return Effect.succeed(trimmed.slice(1, -1))
42
43
  }
43
44
 
44
- return Effect.try({ try: (): unknown => JSON.parse(trimmed), catch: (cause) => cause }).pipe(
45
- Effect.catch(() => Effect.succeed(trimmed)),
46
- )
45
+ return decodeJsonLiteralEffect(trimmed).pipe(Effect.catch(() => Effect.succeed(trimmed)))
47
46
  }
48
47
 
49
48
  function buildArtifactContext(artifacts: Array<{ name: string; kind: string; payload?: unknown }>) {
@@ -149,7 +148,53 @@ type PlanNodeRunUpdate = Omit<
149
148
  completedAt?: string | Date | null
150
149
  }
151
150
 
151
+ function patchField<K extends string, V>(
152
+ key: K,
153
+ patch: V | null | undefined,
154
+ existing: V | undefined,
155
+ ): Partial<Record<K, V>> {
156
+ if (patch === null) return {}
157
+ if (patch !== undefined) return { [key]: patch } as Partial<Record<K, V>>
158
+ if (existing !== undefined) return { [key]: existing } as Partial<Record<K, V>>
159
+ return {}
160
+ }
161
+
152
162
  export function toNodeRunData(nodeRun: PlanNodeRunRecord, patch: PlanNodeRunUpdate) {
163
+ const patchedAttemptId =
164
+ patch.latestAttemptId === null
165
+ ? null
166
+ : patch.latestAttemptId !== undefined
167
+ ? ensureRecordId(patch.latestAttemptId, TABLES.PLAN_NODE_ATTEMPT)
168
+ : undefined
169
+ const existingAttemptId =
170
+ nodeRun.latestAttemptId !== undefined
171
+ ? ensureRecordId(nodeRun.latestAttemptId, TABLES.PLAN_NODE_ATTEMPT)
172
+ : undefined
173
+
174
+ const patchedScheduledAt =
175
+ patch.scheduledAt === null
176
+ ? null
177
+ : patch.scheduledAt !== undefined
178
+ ? toDatabaseDateTime(patch.scheduledAt)
179
+ : undefined
180
+ const existingScheduledAt = nodeRun.scheduledAt !== undefined ? toDatabaseDateTime(nodeRun.scheduledAt) : undefined
181
+
182
+ const patchedReadyAt =
183
+ patch.readyAt === null ? null : patch.readyAt !== undefined ? toDatabaseDateTime(patch.readyAt) : undefined
184
+ const existingReadyAt = nodeRun.readyAt !== undefined ? toDatabaseDateTime(nodeRun.readyAt) : undefined
185
+
186
+ const patchedStartedAt =
187
+ patch.startedAt === null ? null : patch.startedAt !== undefined ? toDatabaseDateTime(patch.startedAt) : undefined
188
+ const existingStartedAt = nodeRun.startedAt !== undefined ? toDatabaseDateTime(nodeRun.startedAt) : undefined
189
+
190
+ const patchedCompletedAt =
191
+ patch.completedAt === null
192
+ ? null
193
+ : patch.completedAt !== undefined
194
+ ? toDatabaseDateTime(patch.completedAt)
195
+ : undefined
196
+ const existingCompletedAt = nodeRun.completedAt !== undefined ? toDatabaseDateTime(nodeRun.completedAt) : undefined
197
+
153
198
  return {
154
199
  runId: ensureRecordId(nodeRun.runId, TABLES.PLAN_RUN),
155
200
  planSpecId: ensureRecordId(nodeRun.planSpecId, TABLES.PLAN_SPEC),
@@ -157,76 +202,16 @@ export function toNodeRunData(nodeRun: PlanNodeRunRecord, patch: PlanNodeRunUpda
157
202
  status: patch.status ?? nodeRun.status,
158
203
  attemptCount: patch.attemptCount ?? nodeRun.attemptCount,
159
204
  retryCount: patch.retryCount ?? nodeRun.retryCount,
160
- ...(patch.resolvedInput === null
161
- ? {}
162
- : patch.resolvedInput !== undefined
163
- ? { resolvedInput: patch.resolvedInput }
164
- : nodeRun.resolvedInput
165
- ? { resolvedInput: nodeRun.resolvedInput }
166
- : {}),
167
- ...(patch.latestStructuredOutput === null
168
- ? {}
169
- : patch.latestStructuredOutput !== undefined
170
- ? { latestStructuredOutput: patch.latestStructuredOutput }
171
- : nodeRun.latestStructuredOutput
172
- ? { latestStructuredOutput: nodeRun.latestStructuredOutput }
173
- : {}),
174
- ...(patch.latestNotes === null
175
- ? {}
176
- : patch.latestNotes !== undefined
177
- ? { latestNotes: patch.latestNotes }
178
- : nodeRun.latestNotes
179
- ? { latestNotes: nodeRun.latestNotes }
180
- : {}),
181
- ...(patch.latestAttemptId === null
182
- ? {}
183
- : patch.latestAttemptId !== undefined
184
- ? { latestAttemptId: ensureRecordId(patch.latestAttemptId, TABLES.PLAN_NODE_ATTEMPT) }
185
- : nodeRun.latestAttemptId
186
- ? { latestAttemptId: ensureRecordId(nodeRun.latestAttemptId, TABLES.PLAN_NODE_ATTEMPT) }
187
- : {}),
188
- ...(patch.blockedReason === null
189
- ? {}
190
- : patch.blockedReason !== undefined
191
- ? { blockedReason: patch.blockedReason }
192
- : nodeRun.blockedReason
193
- ? { blockedReason: nodeRun.blockedReason }
194
- : {}),
195
- ...(patch.failureClass === null
196
- ? {}
197
- : patch.failureClass !== undefined
198
- ? { failureClass: patch.failureClass }
199
- : nodeRun.failureClass
200
- ? { failureClass: nodeRun.failureClass }
201
- : {}),
202
- ...(patch.scheduledAt === null
203
- ? {}
204
- : patch.scheduledAt !== undefined
205
- ? { scheduledAt: toDatabaseDateTime(patch.scheduledAt) }
206
- : nodeRun.scheduledAt
207
- ? { scheduledAt: toDatabaseDateTime(nodeRun.scheduledAt) }
208
- : {}),
209
- ...(patch.readyAt === null
210
- ? {}
211
- : patch.readyAt !== undefined
212
- ? { readyAt: toDatabaseDateTime(patch.readyAt) }
213
- : nodeRun.readyAt
214
- ? { readyAt: toDatabaseDateTime(nodeRun.readyAt) }
215
- : {}),
216
- ...(patch.startedAt === null
217
- ? {}
218
- : patch.startedAt !== undefined
219
- ? { startedAt: toDatabaseDateTime(patch.startedAt) }
220
- : nodeRun.startedAt
221
- ? { startedAt: toDatabaseDateTime(nodeRun.startedAt) }
222
- : {}),
223
- ...(patch.completedAt === null
224
- ? {}
225
- : patch.completedAt !== undefined
226
- ? { completedAt: toDatabaseDateTime(patch.completedAt) }
227
- : nodeRun.completedAt
228
- ? { completedAt: toDatabaseDateTime(nodeRun.completedAt) }
229
- : {}),
205
+ ...patchField('resolvedInput', patch.resolvedInput, nodeRun.resolvedInput ?? undefined),
206
+ ...patchField('latestStructuredOutput', patch.latestStructuredOutput, nodeRun.latestStructuredOutput ?? undefined),
207
+ ...patchField('latestNotes', patch.latestNotes, nodeRun.latestNotes ?? undefined),
208
+ ...patchField('latestAttemptId', patchedAttemptId, existingAttemptId),
209
+ ...patchField('blockedReason', patch.blockedReason, nodeRun.blockedReason ?? undefined),
210
+ ...patchField('failureClass', patch.failureClass, nodeRun.failureClass ?? undefined),
211
+ ...patchField('scheduledAt', patchedScheduledAt, existingScheduledAt),
212
+ ...patchField('readyAt', patchedReadyAt, existingReadyAt),
213
+ ...patchField('startedAt', patchedStartedAt, existingStartedAt),
214
+ ...patchField('completedAt', patchedCompletedAt, existingCompletedAt),
230
215
  }
231
216
  }
232
217