@lota-sdk/core 0.4.8 → 0.4.10

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 (272) hide show
  1. package/package.json +11 -12
  2. package/src/ai/embedding-cache.ts +96 -22
  3. package/src/ai-gateway/ai-gateway.ts +766 -223
  4. package/src/config/agent-defaults.ts +189 -75
  5. package/src/config/agent-types.ts +54 -4
  6. package/src/config/background-processing.ts +1 -1
  7. package/src/config/constants.ts +8 -2
  8. package/src/config/index.ts +0 -1
  9. package/src/config/logger.ts +299 -19
  10. package/src/config/thread-defaults.ts +40 -20
  11. package/src/create-runtime.ts +200 -449
  12. package/src/db/base.service.ts +52 -28
  13. package/src/db/cursor-pagination.ts +71 -30
  14. package/src/db/memory-query-builder.ts +2 -1
  15. package/src/db/memory-store.helpers.ts +4 -7
  16. package/src/db/memory-store.ts +868 -601
  17. package/src/db/memory.ts +396 -280
  18. package/src/db/record-id.ts +32 -10
  19. package/src/db/schema-fingerprint.ts +30 -12
  20. package/src/db/service-normalization.ts +288 -0
  21. package/src/db/service.ts +912 -779
  22. package/src/db/startup.ts +153 -68
  23. package/src/db/transaction-conflict.ts +15 -0
  24. package/src/effect/awaitable-effect.ts +96 -0
  25. package/src/effect/errors.ts +121 -0
  26. package/src/effect/helpers.ts +123 -0
  27. package/src/effect/index.ts +24 -0
  28. package/src/effect/layers.ts +238 -0
  29. package/src/effect/runtime-ref.ts +25 -0
  30. package/src/effect/runtime.ts +46 -0
  31. package/src/effect/services.ts +61 -0
  32. package/src/effect/zod.ts +43 -0
  33. package/src/embeddings/provider.ts +128 -83
  34. package/src/index.ts +48 -1
  35. package/src/openrouter/direct-provider.ts +11 -35
  36. package/src/queues/autonomous-job.queue.ts +117 -73
  37. package/src/queues/context-compaction.queue.ts +50 -17
  38. package/src/queues/delayed-node-promotion.queue.ts +46 -17
  39. package/src/queues/document-processor.queue.ts +52 -77
  40. package/src/queues/memory-consolidation.queue.ts +47 -32
  41. package/src/queues/organization-learning.queue.ts +26 -4
  42. package/src/queues/plan-agent-heartbeat.queue.ts +71 -24
  43. package/src/queues/plan-scheduler.queue.ts +97 -33
  44. package/src/queues/post-chat-memory.queue.ts +56 -26
  45. package/src/queues/queue-factory.ts +227 -59
  46. package/src/queues/standalone-worker.ts +39 -0
  47. package/src/queues/title-generation.queue.ts +45 -11
  48. package/src/redis/connection.ts +182 -113
  49. package/src/redis/index.ts +6 -8
  50. package/src/redis/org-memory-lock.ts +60 -27
  51. package/src/redis/redis-lease-lock.ts +200 -121
  52. package/src/redis/runtime-connection.ts +20 -0
  53. package/src/redis/stream-context.ts +92 -46
  54. package/src/runtime/agent-identity-overrides.ts +2 -2
  55. package/src/runtime/agent-runtime-policy.ts +5 -2
  56. package/src/runtime/agent-stream-helpers.ts +24 -9
  57. package/src/runtime/chat-run-orchestration.ts +102 -19
  58. package/src/runtime/chat-run-registry.ts +36 -2
  59. package/src/runtime/context-compaction/context-compaction-runtime.ts +107 -0
  60. package/src/runtime/{context-compaction.ts → context-compaction/context-compaction.ts} +161 -94
  61. package/src/runtime/domain-layer.ts +192 -0
  62. package/src/runtime/execution-plan-visibility.ts +2 -2
  63. package/src/runtime/execution-plan.ts +42 -15
  64. package/src/runtime/graph-designer.ts +16 -4
  65. package/src/runtime/helper-model.ts +139 -48
  66. package/src/runtime/index.ts +7 -8
  67. package/src/runtime/indexed-repositories-policy.ts +3 -3
  68. package/src/runtime/{memory-block.ts → memory/memory-block.ts} +50 -36
  69. package/src/runtime/{memory-digest-policy.ts → memory/memory-digest-policy.ts} +1 -1
  70. package/src/runtime/{memory-pipeline.ts → memory/memory-pipeline.ts} +54 -67
  71. package/src/runtime/{memory-prompts-fact.ts → memory/memory-prompts-fact.ts} +2 -2
  72. package/src/runtime/memory/memory-scope.ts +53 -0
  73. package/src/runtime/plugin-resolution.ts +124 -25
  74. package/src/runtime/plugin-types.ts +9 -1
  75. package/src/runtime/post-turn-side-effects.ts +177 -130
  76. package/src/runtime/retrieval-adapters.ts +40 -6
  77. package/src/runtime/runtime-accessors.ts +92 -0
  78. package/src/runtime/runtime-config.ts +150 -61
  79. package/src/runtime/runtime-extensions.ts +23 -25
  80. package/src/runtime/runtime-lifecycle.ts +124 -0
  81. package/src/runtime/runtime-services.ts +386 -0
  82. package/src/runtime/runtime-token.ts +47 -0
  83. package/src/runtime/social-chat/social-chat-agent-runner.ts +159 -0
  84. package/src/runtime/{social-chat-history.ts → social-chat/social-chat-history.ts} +51 -20
  85. package/src/runtime/social-chat/social-chat.ts +630 -0
  86. package/src/runtime/specialist-runner.ts +36 -10
  87. package/src/runtime/team-consultation/team-consultation-orchestrator.ts +433 -0
  88. package/src/runtime/{team-consultation-prompts.ts → team-consultation/team-consultation-prompts.ts} +6 -2
  89. package/src/runtime/thread-chat-helpers.ts +2 -2
  90. package/src/runtime/thread-plan-turn.ts +2 -1
  91. package/src/runtime/thread-turn-context.ts +183 -111
  92. package/src/runtime/turn-lifecycle.ts +93 -27
  93. package/src/services/agent-activity.service.ts +287 -203
  94. package/src/services/agent-executor.service.ts +253 -149
  95. package/src/services/artifact.service.ts +231 -149
  96. package/src/services/attachment.service.ts +171 -115
  97. package/src/services/autonomous-job.service.ts +890 -491
  98. package/src/services/background-work.service.ts +54 -0
  99. package/src/services/chat-run-registry.service.ts +13 -1
  100. package/src/services/context-compaction.service.ts +136 -86
  101. package/src/services/document-chunk.service.ts +151 -88
  102. package/src/services/execution-plan/execution-plan-approval.ts +26 -0
  103. package/src/services/execution-plan/execution-plan-context.ts +29 -0
  104. package/src/services/execution-plan/execution-plan-graph.ts +278 -0
  105. package/src/services/execution-plan/execution-plan-schedule.ts +84 -0
  106. package/src/services/execution-plan/execution-plan-spec.ts +75 -0
  107. package/src/services/execution-plan/execution-plan.service.ts +1041 -0
  108. package/src/services/feedback-loop.service.ts +132 -76
  109. package/src/services/global-orchestrator.service.ts +101 -168
  110. package/src/services/graph-full-routing.ts +193 -0
  111. package/src/services/index.ts +19 -21
  112. package/src/services/institutional-memory.service.ts +213 -125
  113. package/src/services/learned-skill.service.ts +368 -260
  114. package/src/services/memory/memory-conversation.ts +95 -0
  115. package/src/services/memory/memory-errors.ts +27 -0
  116. package/src/services/memory/memory-org-memory.ts +50 -0
  117. package/src/services/memory/memory-preseeded.ts +86 -0
  118. package/src/services/memory/memory-rerank.ts +297 -0
  119. package/src/services/{memory-utils.ts → memory/memory-utils.ts} +6 -5
  120. package/src/services/memory/memory.service.ts +674 -0
  121. package/src/services/memory/rerank.service.ts +201 -0
  122. package/src/services/monitoring-window.service.ts +92 -70
  123. package/src/services/mutating-approval.service.ts +62 -53
  124. package/src/services/node-workspace.service.ts +141 -98
  125. package/src/services/notification.service.ts +29 -16
  126. package/src/services/organization-member.service.ts +120 -66
  127. package/src/services/organization.service.ts +153 -77
  128. package/src/services/ownership-dispatcher.service.ts +456 -263
  129. package/src/services/plan/plan-agent-heartbeat.service.ts +234 -0
  130. package/src/services/plan/plan-agent-query.service.ts +322 -0
  131. package/src/services/{plan-approval.service.ts → plan/plan-approval.service.ts} +45 -22
  132. package/src/services/plan/plan-artifact.service.ts +60 -0
  133. package/src/services/plan/plan-builder.service.ts +76 -0
  134. package/src/services/plan/plan-checkpoint.service.ts +103 -0
  135. package/src/services/{plan-compiler.service.ts → plan/plan-compiler.service.ts} +26 -9
  136. package/src/services/plan/plan-completion-side-effects.ts +169 -0
  137. package/src/services/plan/plan-coordination.service.ts +181 -0
  138. package/src/services/plan/plan-cycle.service.ts +405 -0
  139. package/src/services/plan/plan-deadline.service.ts +533 -0
  140. package/src/services/plan/plan-event-delivery.service.ts +266 -0
  141. package/src/services/plan/plan-executor-context.ts +35 -0
  142. package/src/services/plan/plan-executor-graph.ts +522 -0
  143. package/src/services/plan/plan-executor-helpers.ts +307 -0
  144. package/src/services/plan/plan-executor-persistence.ts +209 -0
  145. package/src/services/plan/plan-executor.service.ts +1737 -0
  146. package/src/services/{plan-helpers.ts → plan/plan-helpers.ts} +1 -1
  147. package/src/services/{plan-run-data.ts → plan/plan-run-data.ts} +4 -4
  148. package/src/services/plan/plan-run-serialization.ts +15 -0
  149. package/src/services/plan/plan-run.service.ts +637 -0
  150. package/src/services/plan/plan-scheduler.service.ts +379 -0
  151. package/src/services/plan/plan-template.service.ts +224 -0
  152. package/src/services/plan/plan-transaction-events.ts +36 -0
  153. package/src/services/plan/plan-validator.service.ts +907 -0
  154. package/src/services/plan/plan-workspace.service.ts +131 -0
  155. package/src/services/plugin-executor.service.ts +102 -68
  156. package/src/services/quality-metrics.service.ts +112 -94
  157. package/src/services/queue-job.service.ts +288 -231
  158. package/src/services/recent-activity-title.service.ts +73 -36
  159. package/src/services/recent-activity.service.ts +274 -259
  160. package/src/services/skill-resolver.service.ts +38 -12
  161. package/src/services/social-chat-history.service.ts +190 -122
  162. package/src/services/system-executor.service.ts +96 -61
  163. package/src/services/thread/thread-active-run.ts +203 -0
  164. package/src/services/thread/thread-bootstrap.ts +385 -0
  165. package/src/services/thread/thread-listing.ts +199 -0
  166. package/src/services/thread/thread-memory-block.ts +130 -0
  167. package/src/services/thread/thread-message.service.ts +379 -0
  168. package/src/services/thread/thread-record-store.ts +155 -0
  169. package/src/services/thread/thread-title.service.ts +74 -0
  170. package/src/services/thread/thread-turn-execution.ts +280 -0
  171. package/src/services/thread/thread-turn-message-context.ts +73 -0
  172. package/src/services/thread/thread-turn-preparation.service.ts +1148 -0
  173. package/src/services/thread/thread-turn-streaming.ts +403 -0
  174. package/src/services/thread/thread-turn-tracing.ts +35 -0
  175. package/src/services/thread/thread-turn.ts +376 -0
  176. package/src/services/thread/thread.service.ts +344 -0
  177. package/src/services/user.service.ts +82 -32
  178. package/src/services/write-intent-validator.service.ts +63 -51
  179. package/src/storage/attachment-parser.ts +69 -27
  180. package/src/storage/attachment-storage.service.ts +334 -275
  181. package/src/storage/generated-document-storage.service.ts +66 -34
  182. package/src/system-agents/agent-result.ts +3 -1
  183. package/src/system-agents/context-compaction.agent.ts +3 -3
  184. package/src/system-agents/delegated-agent-factory.ts +159 -90
  185. package/src/system-agents/helper-agent-options.ts +1 -1
  186. package/src/system-agents/memory-reranker.agent.ts +3 -3
  187. package/src/system-agents/memory.agent.ts +3 -3
  188. package/src/system-agents/recent-activity-title-refiner.agent.ts +3 -3
  189. package/src/system-agents/regular-chat-memory-digest.agent.ts +3 -3
  190. package/src/system-agents/skill-extractor.agent.ts +3 -3
  191. package/src/system-agents/skill-manager.agent.ts +3 -3
  192. package/src/system-agents/thread-router.agent.ts +157 -113
  193. package/src/system-agents/title-generator.agent.ts +3 -3
  194. package/src/tools/execution-plan.tool.ts +241 -171
  195. package/src/tools/fetch-webpage.tool.ts +29 -18
  196. package/src/tools/firecrawl-client.ts +26 -6
  197. package/src/tools/index.ts +1 -0
  198. package/src/tools/memory-block.tool.ts +14 -6
  199. package/src/tools/plan-approval.tool.ts +57 -47
  200. package/src/tools/read-file-parts.tool.ts +44 -33
  201. package/src/tools/remember-memory.tool.ts +65 -45
  202. package/src/tools/search-web.tool.ts +33 -22
  203. package/src/tools/search.tool.ts +41 -29
  204. package/src/tools/team-think.tool.ts +125 -84
  205. package/src/tools/user-questions.tool.ts +4 -3
  206. package/src/tools/web-tool-shared.ts +6 -0
  207. package/src/utils/async.ts +25 -22
  208. package/src/utils/crypto.ts +21 -0
  209. package/src/utils/date-time.ts +40 -1
  210. package/src/utils/errors.ts +111 -20
  211. package/src/utils/hono-error-handler.ts +24 -39
  212. package/src/utils/index.ts +2 -1
  213. package/src/utils/null-proto-record.ts +41 -0
  214. package/src/utils/sse-keepalive.ts +124 -21
  215. package/src/workers/bootstrap.ts +164 -52
  216. package/src/workers/memory-consolidation.worker.ts +325 -237
  217. package/src/workers/organization-learning.worker.ts +50 -16
  218. package/src/workers/regular-chat-memory-digest.helpers.ts +28 -27
  219. package/src/workers/regular-chat-memory-digest.runner.ts +185 -114
  220. package/src/workers/skill-extraction.runner.ts +176 -93
  221. package/src/workers/utils/file-section-chunker.ts +8 -10
  222. package/src/workers/utils/repo-structure-extractor.ts +349 -260
  223. package/src/workers/utils/repomix-file-sections.ts +2 -2
  224. package/src/workers/utils/thread-message-query.ts +97 -38
  225. package/src/workers/worker-utils.ts +74 -31
  226. package/src/config/debug-logger.ts +0 -47
  227. package/src/config/search.ts +0 -3
  228. package/src/redis/connection-accessor.ts +0 -26
  229. package/src/runtime/agent-types.ts +0 -1
  230. package/src/runtime/context-compaction-runtime.ts +0 -87
  231. package/src/runtime/memory-scope.ts +0 -43
  232. package/src/runtime/social-chat-agent-runner.ts +0 -118
  233. package/src/runtime/social-chat.ts +0 -516
  234. package/src/runtime/team-consultation-orchestrator.ts +0 -272
  235. package/src/services/adaptive-playbook.service.ts +0 -152
  236. package/src/services/artifact-provenance.service.ts +0 -172
  237. package/src/services/chat-attachments.service.ts +0 -17
  238. package/src/services/context-compaction-runtime.singleton.ts +0 -13
  239. package/src/services/execution-plan.service.ts +0 -1118
  240. package/src/services/memory.service.ts +0 -914
  241. package/src/services/plan-agent-heartbeat.service.ts +0 -136
  242. package/src/services/plan-agent-query.service.ts +0 -267
  243. package/src/services/plan-artifact.service.ts +0 -50
  244. package/src/services/plan-builder.service.ts +0 -67
  245. package/src/services/plan-checkpoint.service.ts +0 -81
  246. package/src/services/plan-completion-side-effects.ts +0 -80
  247. package/src/services/plan-coordination.service.ts +0 -157
  248. package/src/services/plan-cycle.service.ts +0 -284
  249. package/src/services/plan-deadline.service.ts +0 -430
  250. package/src/services/plan-event-delivery.service.ts +0 -166
  251. package/src/services/plan-executor.service.ts +0 -1950
  252. package/src/services/plan-run.service.ts +0 -515
  253. package/src/services/plan-scheduler.service.ts +0 -240
  254. package/src/services/plan-template.service.ts +0 -177
  255. package/src/services/plan-validator.service.ts +0 -818
  256. package/src/services/plan-workspace.service.ts +0 -83
  257. package/src/services/rerank.service.ts +0 -156
  258. package/src/services/thread-message.service.ts +0 -275
  259. package/src/services/thread-plan-registry.service.ts +0 -22
  260. package/src/services/thread-title.service.ts +0 -39
  261. package/src/services/thread-turn-preparation.service.ts +0 -1147
  262. package/src/services/thread-turn.ts +0 -172
  263. package/src/services/thread.service.ts +0 -869
  264. package/src/utils/env.ts +0 -8
  265. /package/src/runtime/{context-compaction-constants.ts → context-compaction/context-compaction-constants.ts} +0 -0
  266. /package/src/runtime/{memory-format.ts → memory/memory-format.ts} +0 -0
  267. /package/src/runtime/{memory-prompts-parse.ts → memory/memory-prompts-parse.ts} +0 -0
  268. /package/src/runtime/{memory-prompts-update.ts → memory/memory-prompts-update.ts} +0 -0
  269. /package/src/runtime/{social-chat-prompts.ts → social-chat/social-chat-prompts.ts} +0 -0
  270. /package/src/services/{plan-node-spec.ts → plan/plan-node-spec.ts} +0 -0
  271. /package/src/services/{thread-constants.ts → thread/thread-constants.ts} +0 -0
  272. /package/src/services/{thread.types.ts → thread/thread.types.ts} +0 -0
@@ -0,0 +1,238 @@
1
+ import type { ToolSet } from 'ai'
2
+ import { Effect, Layer, Logger, References } from 'effect'
3
+ import { DevTools } from 'effect/unstable/devtools'
4
+ import { FetchHttpClient } from 'effect/unstable/http'
5
+ import { Otlp } from 'effect/unstable/observability'
6
+
7
+ import type { CoreThreadProfile } from '../config/agent-defaults'
8
+ import { resolveAgentConfig, resolveAgentFactoryConfig } from '../config/agent-defaults'
9
+ import type { AgentFactory, AgentRuntimeConfigProvider, AgentToolBuilder } from '../config/agent-types'
10
+ import { configureLotaLogger, getLotaLoggers, toEffectLogLevel } from '../config/logger'
11
+ import type { LotaLogLevel } from '../config/logger'
12
+ import { resolveThreadConfig } from '../config/thread-defaults'
13
+ import type { LotaThreadConfig } from '../config/thread-defaults'
14
+ import { LOTA_SDK_DATABASE_NAME } from '../db/sdk-database'
15
+ import type { SurrealDatabaseConfig } from '../db/service'
16
+ import { SurrealDBService } from '../db/service'
17
+ import type { CreateRedisConnectionManagerOptions } from '../redis/connection'
18
+ import { makeRedisConnectionManager } from '../redis/connection'
19
+ import type { ResolvedLotaRuntimeConfig } from '../runtime/runtime-config'
20
+ import type { LotaRuntimeAdapters, LotaRuntimeTurnHooks } from '../runtime/runtime-extensions'
21
+ import type { LotaRuntimeWorkerExtensions } from '../runtime/runtime-worker-registry'
22
+ import { QueueJobServiceLive } from '../services/queue-job.service'
23
+ import { getErrorMessage } from '../utils/errors'
24
+ import { DatabaseError } from './errors'
25
+ import {
26
+ AppLoggerTag,
27
+ AgentConfigServiceTag,
28
+ AgentFactoryServiceTag,
29
+ DatabaseServiceTag,
30
+ RedisServiceTag,
31
+ RuntimeAdaptersServiceTag,
32
+ RuntimeConfigServiceTag,
33
+ RuntimeWorkerExtensionsServiceTag,
34
+ ThreadConfigServiceTag,
35
+ ToolProvidersServiceTag,
36
+ TurnHooksServiceTag,
37
+ } from './services'
38
+
39
+ const EMPTY_TOOLS = {} as ToolSet
40
+ const EMPTY_WORKERS: LotaRuntimeWorkerExtensions = {}
41
+
42
+ export function DatabaseLive(config: SurrealDatabaseConfig) {
43
+ return Layer.effect(
44
+ DatabaseServiceTag,
45
+ Effect.acquireRelease(
46
+ Effect.try({
47
+ try: () => new SurrealDBService(config),
48
+ catch: (error) =>
49
+ new DatabaseError({ message: `Failed to create database service: ${getErrorMessage(error)}`, cause: error }),
50
+ }),
51
+ (databaseService) =>
52
+ Effect.ignore(
53
+ databaseService
54
+ .disconnect()
55
+ .pipe(
56
+ Effect.tapError((error) =>
57
+ Effect.logWarning(`Failed to clean up database service: ${getErrorMessage(error)}`),
58
+ ),
59
+ ),
60
+ ),
61
+ ),
62
+ )
63
+ }
64
+
65
+ export function RedisLive(config: CreateRedisConnectionManagerOptions) {
66
+ return Layer.effect(RedisServiceTag, makeRedisConnectionManager(config))
67
+ }
68
+
69
+ export function AppLoggerLive(level: LotaLogLevel = 'info') {
70
+ // Sequence `configureLotaLogger(level)` before `getLotaLoggers()` inside a
71
+ // single Effect.sync so the log-level mutation is observed when the loggers
72
+ // are assembled. `Layer.mergeAll` builds in parallel, so splitting these
73
+ // across two sub-layers is an ordering hazard.
74
+ const AppLoggersLayer = Layer.effect(
75
+ AppLoggerTag,
76
+ Effect.sync(() => {
77
+ configureLotaLogger(level)
78
+ return getLotaLoggers()
79
+ }),
80
+ )
81
+ return Layer.mergeAll(
82
+ AppLoggersLayer,
83
+ Logger.layer([Logger.consolePretty()]),
84
+ Layer.succeed(References.MinimumLogLevel, toEffectLogLevel(level)),
85
+ )
86
+ }
87
+
88
+ export function RuntimeConfigLive(config: ResolvedLotaRuntimeConfig) {
89
+ return Layer.succeed(RuntimeConfigServiceTag, config)
90
+ }
91
+
92
+ export function AgentConfigLive(config: {
93
+ roster: readonly string[]
94
+ leadAgentId: string
95
+ displayNames: Record<string, string>
96
+ shortDisplayNames?: Record<string, string>
97
+ descriptions?: Record<string, string>
98
+ routerModelId?: string
99
+ teamConsultParticipants: readonly string[]
100
+ getCoreThreadProfile?: (coreType: string) => CoreThreadProfile
101
+ }) {
102
+ return Layer.succeed(AgentConfigServiceTag, resolveAgentConfig(config))
103
+ }
104
+
105
+ export function AgentFactoryLive(config: {
106
+ createAgent?: AgentFactory
107
+ buildAgentTools?: AgentToolBuilder
108
+ getAgentRuntimeConfig?: AgentRuntimeConfigProvider
109
+ pluginRuntime?: Record<string, unknown>
110
+ }) {
111
+ return Layer.succeed(AgentFactoryServiceTag, resolveAgentFactoryConfig(config))
112
+ }
113
+
114
+ export function ThreadConfigLive(params: { agentRoster: readonly string[]; config?: LotaThreadConfig }) {
115
+ return Layer.succeed(ThreadConfigServiceTag, resolveThreadConfig(params))
116
+ }
117
+
118
+ export function RuntimeExtensionsLive(params: {
119
+ adapters?: LotaRuntimeAdapters
120
+ turnHooks?: LotaRuntimeTurnHooks
121
+ toolProviders?: ToolSet
122
+ extraWorkers?: LotaRuntimeWorkerExtensions
123
+ }) {
124
+ return Layer.mergeAll(
125
+ Layer.succeed(RuntimeAdaptersServiceTag, params.adapters ?? {}),
126
+ Layer.succeed(TurnHooksServiceTag, params.turnHooks ?? {}),
127
+ Layer.succeed(ToolProvidersServiceTag, params.toolProviders ?? EMPTY_TOOLS),
128
+ Layer.succeed(RuntimeWorkerExtensionsServiceTag, params.extraWorkers ?? EMPTY_WORKERS),
129
+ )
130
+ }
131
+
132
+ // ── Shared Infrastructure Layer Builders ─────────────────────────────
133
+
134
+ /**
135
+ * Common config-to-Layer conversions shared by the runtime and sandboxed
136
+ * worker infrastructure builders. Covers logging, runtime config, agents,
137
+ * threads, database, and redis. Agent display names are overridable for
138
+ * the socialChat agent injection flow.
139
+ */
140
+ function buildBaseConfigLayers(
141
+ runtimeConfig: ResolvedLotaRuntimeConfig,
142
+ options: {
143
+ resolvedAgentDisplayNames?: Record<string, string>
144
+ runtimeExtensions: Parameters<typeof RuntimeExtensionsLive>[0]
145
+ },
146
+ ) {
147
+ return Layer.mergeAll(
148
+ AppLoggerLive(runtimeConfig.logging.level),
149
+ RuntimeConfigLive(runtimeConfig),
150
+ AgentConfigLive({
151
+ roster: runtimeConfig.agents.roster,
152
+ leadAgentId: runtimeConfig.agents.leadAgentId,
153
+ displayNames: options.resolvedAgentDisplayNames ?? runtimeConfig.agents.displayNames,
154
+ shortDisplayNames: runtimeConfig.agents.shortDisplayNames,
155
+ descriptions: runtimeConfig.agents.descriptions,
156
+ routerModelId: runtimeConfig.agents.routerModelId,
157
+ teamConsultParticipants: runtimeConfig.agents.teamConsultParticipants,
158
+ getCoreThreadProfile: runtimeConfig.agents.getCoreThreadProfile,
159
+ }),
160
+ AgentFactoryLive({
161
+ createAgent: runtimeConfig.agents.createAgent,
162
+ buildAgentTools: runtimeConfig.agents.buildAgentTools,
163
+ getAgentRuntimeConfig: runtimeConfig.agents.getAgentRuntimeConfig,
164
+ pluginRuntime: runtimeConfig.pluginRuntime,
165
+ }),
166
+ ThreadConfigLive({ agentRoster: runtimeConfig.agents.roster, config: runtimeConfig.threads }),
167
+ RuntimeExtensionsLive(options.runtimeExtensions),
168
+ DatabaseLive({
169
+ url: runtimeConfig.database.url,
170
+ namespace: runtimeConfig.database.namespace,
171
+ database: LOTA_SDK_DATABASE_NAME,
172
+ username: runtimeConfig.database.username,
173
+ password: runtimeConfig.database.password,
174
+ }),
175
+ RedisLive({ url: runtimeConfig.redis.url }),
176
+ )
177
+ }
178
+
179
+ /**
180
+ * Builds the observability layer (OTLP + DevTools) from a runtime config.
181
+ * Returns an empty layer when no observability endpoints are configured.
182
+ */
183
+ function buildObservabilityLayer(runtimeConfig: ResolvedLotaRuntimeConfig): Layer.Layer<never> {
184
+ let layer: Layer.Layer<never> = Layer.empty
185
+ const observability = runtimeConfig.observability
186
+
187
+ if (observability.otlpBaseUrl) {
188
+ layer = Layer.merge(
189
+ layer,
190
+ Otlp.layerJson({
191
+ baseUrl: observability.otlpBaseUrl,
192
+ resource: {
193
+ serviceName: observability.serviceName,
194
+ ...(observability.serviceVersion ? { serviceVersion: observability.serviceVersion } : {}),
195
+ },
196
+ ...(observability.otlpHeaders ? { headers: observability.otlpHeaders } : {}),
197
+ }).pipe(Layer.provide(FetchHttpClient.layer)),
198
+ )
199
+ }
200
+
201
+ if (observability.devToolsUrl && Bun.env.NODE_ENV !== 'production') {
202
+ layer = Layer.merge(layer, DevTools.layer(observability.devToolsUrl))
203
+ }
204
+
205
+ return layer
206
+ }
207
+
208
+ /**
209
+ * Builds the full infrastructure layer used by `createLotaRuntime`. Combines
210
+ * all config, database, redis, agent, thread, and extension layers with the
211
+ * observability layer computed from the runtime config.
212
+ */
213
+ export function buildInfrastructureLayer(
214
+ runtimeConfig: ResolvedLotaRuntimeConfig,
215
+ options: { resolvedAgentDisplayNames: Record<string, string> },
216
+ ) {
217
+ return Layer.mergeAll(
218
+ buildBaseConfigLayers(runtimeConfig, {
219
+ resolvedAgentDisplayNames: options.resolvedAgentDisplayNames,
220
+ runtimeExtensions: {
221
+ adapters: runtimeConfig.runtimeAdapters,
222
+ turnHooks: runtimeConfig.turnHooks,
223
+ toolProviders: runtimeConfig.toolProviders ?? {},
224
+ extraWorkers: runtimeConfig.extraWorkers,
225
+ },
226
+ }),
227
+ buildObservabilityLayer(runtimeConfig),
228
+ )
229
+ }
230
+
231
+ /**
232
+ * Builds the minimal infrastructure layer used by sandboxed workers.
233
+ * Omits observability and uses empty runtime extensions.
234
+ */
235
+ export function buildWorkerInfrastructureLayer(runtimeConfig: ResolvedLotaRuntimeConfig) {
236
+ const infrastructureLayer = buildBaseConfigLayers(runtimeConfig, { runtimeExtensions: {} })
237
+ return QueueJobServiceLive.pipe(Layer.provideMerge(infrastructureLayer))
238
+ }
@@ -0,0 +1,25 @@
1
+ import type { ManagedRuntime } from 'effect'
2
+
3
+ // eslint-disable-next-line typescript-eslint/no-explicit-any -- ManagedRuntime is contravariant in R; `any` is the only valid wildcard
4
+ type SdkManagedRuntime = ManagedRuntime.ManagedRuntime<any, any>
5
+
6
+ let currentRuntime: SdkManagedRuntime | null = null
7
+
8
+ export function setCurrentRuntime<R, E>(runtime: ManagedRuntime.ManagedRuntime<R, E>): void {
9
+ currentRuntime = runtime as SdkManagedRuntime
10
+ }
11
+
12
+ export function clearCurrentRuntime(): void {
13
+ currentRuntime = null
14
+ }
15
+
16
+ export function getCurrentRuntime(): SdkManagedRuntime {
17
+ if (!currentRuntime) {
18
+ throw new Error('Lota Effect runtime is not configured. Call createLotaRuntime() first.')
19
+ }
20
+ return currentRuntime
21
+ }
22
+
23
+ export function getOptionalCurrentRuntime(): SdkManagedRuntime | null {
24
+ return currentRuntime
25
+ }
@@ -0,0 +1,46 @@
1
+ import { Effect } from 'effect'
2
+ import type { Context, ManagedRuntime } from 'effect'
3
+
4
+ import { clearCurrentRuntime, getCurrentRuntime, getOptionalCurrentRuntime, setCurrentRuntime } from './runtime-ref'
5
+
6
+ export function setLotaSdkRuntime<R, E>(runtime: ManagedRuntime.ManagedRuntime<R, E>): void {
7
+ setCurrentRuntime(runtime)
8
+ }
9
+
10
+ export function clearLotaSdkRuntime(): void {
11
+ clearCurrentRuntime()
12
+ }
13
+
14
+ export function getOptionalLotaSdkRuntime() {
15
+ return getOptionalCurrentRuntime()
16
+ }
17
+
18
+ /** Returns the current managed runtime or throws. */
19
+ export function getLotaSdkRuntime() {
20
+ return getCurrentRuntime()
21
+ }
22
+
23
+ export function resolveLotaService<I, T>(tag: Context.Key<I, T>): T {
24
+ return getCurrentRuntime().runSync(Effect.service(tag))
25
+ }
26
+
27
+ export function resolveOptionalLotaService<I, T>(tag: Context.Key<I, T>): T | null {
28
+ const runtime = getOptionalCurrentRuntime()
29
+ return runtime ? runtime.runSync(Effect.service(tag)) : null
30
+ }
31
+
32
+ export function runPromiseWithOptionalLotaRuntime<A, E>(effect: Effect.Effect<A, E, never>): Promise<A> {
33
+ const runtime = getOptionalCurrentRuntime()
34
+ return runtime ? runtime.runPromise(effect) : Effect.runPromise(effect)
35
+ }
36
+
37
+ /**
38
+ * Run an effect as a Promise using the current managed runtime's context.
39
+ * The runtime must be initialized via `createLotaRuntime()` before any call.
40
+ */
41
+ export function runPromise<A, E, R>(
42
+ effect: Effect.Effect<A, E, R>,
43
+ options?: { readonly signal?: AbortSignal },
44
+ ): Promise<A> {
45
+ return getCurrentRuntime().runPromise(effect, options)
46
+ }
@@ -0,0 +1,61 @@
1
+ import type { ToolSet } from 'ai'
2
+ import { Context } from 'effect'
3
+
4
+ import type { ResolvedAgentConfig } from '../config/agent-defaults'
5
+ import type { AgentFactory, AgentRuntimeConfigProvider, AgentToolBuilder } from '../config/agent-types'
6
+ import type { LotaLoggerSet } from '../config/logger'
7
+ import type { ResolvedThreadBootstrapConfig } from '../config/thread-defaults'
8
+ import type { SurrealDBService } from '../db/service'
9
+ import type { RedisConnectionManager } from '../redis/connection'
10
+ import type { ResolvedLotaRuntimeConfig } from '../runtime/runtime-config'
11
+ import type { LotaRuntimeAdapters, LotaRuntimeTurnHooks } from '../runtime/runtime-extensions'
12
+ import type { LotaRuntimeWorkerExtensions } from '../runtime/runtime-worker-registry'
13
+
14
+ export class DatabaseServiceTag extends Context.Service<DatabaseServiceTag, SurrealDBService>()(
15
+ '@lota-sdk/core/DatabaseService',
16
+ ) {}
17
+
18
+ export class RedisServiceTag extends Context.Service<RedisServiceTag, RedisConnectionManager>()(
19
+ '@lota-sdk/core/RedisService',
20
+ ) {}
21
+
22
+ export class AppLoggerTag extends Context.Service<AppLoggerTag, LotaLoggerSet>()('@lota-sdk/core/AppLogger') {}
23
+
24
+ export class RuntimeConfigServiceTag extends Context.Service<RuntimeConfigServiceTag, ResolvedLotaRuntimeConfig>()(
25
+ '@lota-sdk/core/RuntimeConfigService',
26
+ ) {}
27
+
28
+ export class AgentConfigServiceTag extends Context.Service<AgentConfigServiceTag, ResolvedAgentConfig>()(
29
+ '@lota-sdk/core/AgentConfigService',
30
+ ) {}
31
+
32
+ export class AgentFactoryServiceTag extends Context.Service<
33
+ AgentFactoryServiceTag,
34
+ {
35
+ readonly createAgent: AgentFactory
36
+ readonly buildAgentTools: AgentToolBuilder
37
+ readonly getAgentRuntimeConfig: AgentRuntimeConfigProvider
38
+ readonly pluginRuntime?: Record<string, unknown>
39
+ }
40
+ >()('@lota-sdk/core/AgentFactoryService') {}
41
+
42
+ export class ThreadConfigServiceTag extends Context.Service<ThreadConfigServiceTag, ResolvedThreadBootstrapConfig>()(
43
+ '@lota-sdk/core/ThreadConfigService',
44
+ ) {}
45
+
46
+ export class RuntimeAdaptersServiceTag extends Context.Service<RuntimeAdaptersServiceTag, LotaRuntimeAdapters>()(
47
+ '@lota-sdk/core/RuntimeAdaptersService',
48
+ ) {}
49
+
50
+ export class TurnHooksServiceTag extends Context.Service<TurnHooksServiceTag, LotaRuntimeTurnHooks>()(
51
+ '@lota-sdk/core/TurnHooksService',
52
+ ) {}
53
+
54
+ export class ToolProvidersServiceTag extends Context.Service<ToolProvidersServiceTag, ToolSet>()(
55
+ '@lota-sdk/core/ToolProvidersService',
56
+ ) {}
57
+
58
+ export class RuntimeWorkerExtensionsServiceTag extends Context.Service<
59
+ RuntimeWorkerExtensionsServiceTag,
60
+ LotaRuntimeWorkerExtensions
61
+ >()('@lota-sdk/core/RuntimeWorkerExtensionsService') {}
@@ -0,0 +1,43 @@
1
+ import { Effect } from 'effect'
2
+ import { ZodError } from 'zod'
3
+ import type { z } from 'zod'
4
+
5
+ import { ValidationError } from './errors'
6
+ import type { ValidationIssue } from './errors'
7
+
8
+ type ZodIssueLike = { readonly path: ReadonlyArray<PropertyKey>; readonly message: string }
9
+
10
+ function toValidationIssuePath(path: ReadonlyArray<PropertyKey>): string {
11
+ return path.map((segment) => String(segment)).join('.') || 'root'
12
+ }
13
+
14
+ function getZodIssues(error: Pick<ZodError, 'issues'> | ReadonlyArray<ZodIssueLike>): ReadonlyArray<ZodIssueLike> {
15
+ return 'issues' in error ? error.issues : error
16
+ }
17
+
18
+ export function toValidationIssues(
19
+ error: Pick<ZodError, 'issues'> | ReadonlyArray<ZodIssueLike>,
20
+ ): ReadonlyArray<ValidationIssue> {
21
+ return getZodIssues(error).map((issue) => ({ path: toValidationIssuePath(issue.path), message: issue.message }))
22
+ }
23
+
24
+ export function summarizeZodIssues(issues: ReadonlyArray<ZodIssueLike>, maxIssues = 5): string {
25
+ return issues
26
+ .slice(0, maxIssues)
27
+ .map((issue) => `${toValidationIssuePath(issue.path)}: ${issue.message}`)
28
+ .join('; ')
29
+ }
30
+
31
+ export function toValidationError(error: unknown, message?: string): ValidationError {
32
+ return new ValidationError({
33
+ message: message ?? (error instanceof ZodError ? 'Schema validation failed' : 'Validation failed'),
34
+ issues: error instanceof ZodError ? toValidationIssues(error) : undefined,
35
+ })
36
+ }
37
+
38
+ export function zodParse<TSchema extends z.ZodTypeAny>(
39
+ schema: TSchema,
40
+ value: unknown,
41
+ ): Effect.Effect<z.infer<TSchema>, ValidationError> {
42
+ return Effect.try({ try: () => schema.parse(value), catch: toValidationError })
43
+ }