@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,192 @@
1
+ /**
2
+ * Builds the domain-service Layer tree for `createLotaRuntime`.
3
+ *
4
+ * The services form a 9-tier dependency graph on top of the infrastructure
5
+ * layer (config, logging, database, redis, agents, threads, extensions).
6
+ * Each tier is provided with the accumulated context of earlier tiers so
7
+ * every service resolves cleanly when the ManagedRuntime eagerly loads them.
8
+ */
9
+
10
+ import type { Layer as LayerType } from 'effect'
11
+ import { Layer } from 'effect'
12
+
13
+ import { AiGatewayLive } from '../ai-gateway/ai-gateway'
14
+ import { EmbeddingCacheLive } from '../ai/embedding-cache'
15
+ import type { buildInfrastructureLayer } from '../effect/layers'
16
+ import { SharedThreadStreamSubscriberLive } from '../redis/stream-context'
17
+ import { AgentActivityServiceLive } from '../services/agent-activity.service'
18
+ import { AgentExecutorServiceLive } from '../services/agent-executor.service'
19
+ import { ArtifactServiceLive } from '../services/artifact.service'
20
+ import { AttachmentServiceLive } from '../services/attachment.service'
21
+ import { AutonomousJobServiceLive } from '../services/autonomous-job.service'
22
+ import { BackgroundWorkServiceLive } from '../services/background-work.service'
23
+ import { ChatRunRegistryLive } from '../services/chat-run-registry.service'
24
+ import { ContextCompactionServiceLive } from '../services/context-compaction.service'
25
+ import { DocumentChunkServiceLive } from '../services/document-chunk.service'
26
+ import { ExecutionPlanServiceLive } from '../services/execution-plan/execution-plan.service'
27
+ import { FeedbackLoopServiceLive } from '../services/feedback-loop.service'
28
+ import { GlobalOrchestratorServiceLive } from '../services/global-orchestrator.service'
29
+ import { InstitutionalMemoryServiceLive } from '../services/institutional-memory.service'
30
+ import { LearnedSkillServiceLive } from '../services/learned-skill.service'
31
+ import { MemoryServiceLive } from '../services/memory/memory.service'
32
+ import { RerankServiceLive } from '../services/memory/rerank.service'
33
+ import { MonitoringWindowServiceLive } from '../services/monitoring-window.service'
34
+ import { MutatingApprovalServiceLive } from '../services/mutating-approval.service'
35
+ import { NodeWorkspaceServiceLive } from '../services/node-workspace.service'
36
+ import { NotificationServiceLive } from '../services/notification.service'
37
+ import { OrganizationMemberServiceLive } from '../services/organization-member.service'
38
+ import { OrganizationServiceLive } from '../services/organization.service'
39
+ import { OwnershipDispatcherServiceLive } from '../services/ownership-dispatcher.service'
40
+ import { PlanAgentHeartbeatServiceLive } from '../services/plan/plan-agent-heartbeat.service'
41
+ import { PlanAgentQueryServiceLive } from '../services/plan/plan-agent-query.service'
42
+ import { PlanApprovalServiceLive } from '../services/plan/plan-approval.service'
43
+ import { PlanArtifactServiceLive } from '../services/plan/plan-artifact.service'
44
+ import { PlanBuilderServiceLive } from '../services/plan/plan-builder.service'
45
+ import { PlanCheckpointServiceLive } from '../services/plan/plan-checkpoint.service'
46
+ import { PlanCompilerServiceLive } from '../services/plan/plan-compiler.service'
47
+ import { PlanCoordinationServiceLive } from '../services/plan/plan-coordination.service'
48
+ import { PlanCycleServiceLive } from '../services/plan/plan-cycle.service'
49
+ import { PlanDeadlineServiceLive } from '../services/plan/plan-deadline.service'
50
+ import { PlanEventDeliveryServiceLive } from '../services/plan/plan-event-delivery.service'
51
+ import { PlanExecutorServiceLive } from '../services/plan/plan-executor.service'
52
+ import { PlanRunServiceLive } from '../services/plan/plan-run.service'
53
+ import { PlanSchedulerServiceLive } from '../services/plan/plan-scheduler.service'
54
+ import { PlanTemplateServiceLive } from '../services/plan/plan-template.service'
55
+ import { PlanValidatorServiceLive } from '../services/plan/plan-validator.service'
56
+ import { PlanWorkspaceServiceLive } from '../services/plan/plan-workspace.service'
57
+ import { PluginExecutorServiceLive } from '../services/plugin-executor.service'
58
+ import { QualityMetricsServiceLive } from '../services/quality-metrics.service'
59
+ import { QueueJobServiceLive } from '../services/queue-job.service'
60
+ import { RecentActivityTitleServiceLive } from '../services/recent-activity-title.service'
61
+ import { RecentActivityServiceLive } from '../services/recent-activity.service'
62
+ import { SkillResolverServiceLive } from '../services/skill-resolver.service'
63
+ import { SocialChatHistoryServiceLive } from '../services/social-chat-history.service'
64
+ import { SystemExecutorServiceLive } from '../services/system-executor.service'
65
+ import { ThreadMessageServiceLive } from '../services/thread/thread-message.service'
66
+ import { ThreadTitleServiceLive } from '../services/thread/thread-title.service'
67
+ import { ThreadTurnServiceLive } from '../services/thread/thread-turn'
68
+ import { ThreadTurnPreparationServiceLive } from '../services/thread/thread-turn-preparation.service'
69
+ import { ThreadServiceLive } from '../services/thread/thread.service'
70
+ import { UserServiceLive } from '../services/user.service'
71
+ import { WriteIntentValidatorServiceLive } from '../services/write-intent-validator.service'
72
+ import { AttachmentStorageServiceLive } from '../storage/attachment-storage.service'
73
+ import { GeneratedDocumentStorageServiceLive } from '../storage/generated-document-storage.service'
74
+ import { FirecrawlLive } from '../tools/firecrawl-client'
75
+ import { CompactionCoordinationLive } from './chat-run-orchestration'
76
+ import { HelperModelLive } from './helper-model'
77
+
78
+ function provide<A, E, R extends RCtx, RCtx, E2>(
79
+ layer: LayerType.Layer<A, E, R>,
80
+ ctx: LayerType.Layer<RCtx, E2, never>,
81
+ ): LayerType.Layer<A, E | E2, never> {
82
+ return Layer.provideMerge(ctx)(layer)
83
+ }
84
+
85
+ type InfrastructureLayer = ReturnType<typeof buildInfrastructureLayer>
86
+
87
+ /**
88
+ * Compose the domain service layer tree on top of the supplied infrastructure
89
+ * layer. The returned layer has no remaining requirements and can be fed
90
+ * straight into `ManagedRuntime.make`.
91
+ */
92
+ export function buildDomainServiceLayer(infrastructureLayer: InfrastructureLayer) {
93
+ const tier0 = provide(
94
+ Layer.mergeAll(
95
+ BackgroundWorkServiceLive,
96
+ ChatRunRegistryLive,
97
+ CompactionCoordinationLive,
98
+ DocumentChunkServiceLive,
99
+ NodeWorkspaceServiceLive,
100
+ NotificationServiceLive,
101
+ PlanArtifactServiceLive,
102
+ PlanBuilderServiceLive,
103
+ WriteIntentValidatorServiceLive,
104
+ ),
105
+ infrastructureLayer,
106
+ )
107
+ const ctx0 = Layer.mergeAll(
108
+ infrastructureLayer,
109
+ provide(Layer.mergeAll(AiGatewayLive, EmbeddingCacheLive, FirecrawlLive, HelperModelLive), infrastructureLayer),
110
+ tier0,
111
+ )
112
+
113
+ const tier1 = provide(
114
+ Layer.mergeAll(
115
+ SharedThreadStreamSubscriberLive,
116
+ AgentExecutorServiceLive,
117
+ AttachmentStorageServiceLive,
118
+ GeneratedDocumentStorageServiceLive,
119
+ LearnedSkillServiceLive,
120
+ OrganizationServiceLive,
121
+ OrganizationMemberServiceLive,
122
+ PlanApprovalServiceLive,
123
+ PlanRunServiceLive,
124
+ PlanSchedulerServiceLive,
125
+ PlanWorkspaceServiceLive,
126
+ PluginExecutorServiceLive,
127
+ QualityMetricsServiceLive,
128
+ QueueJobServiceLive,
129
+ RecentActivityServiceLive,
130
+ RerankServiceLive,
131
+ SocialChatHistoryServiceLive,
132
+ SystemExecutorServiceLive,
133
+ ThreadMessageServiceLive,
134
+ UserServiceLive,
135
+ ),
136
+ ctx0,
137
+ )
138
+ const ctx1 = Layer.mergeAll(ctx0, tier1)
139
+
140
+ const tier2 = provide(
141
+ Layer.mergeAll(
142
+ ArtifactServiceLive,
143
+ AttachmentServiceLive,
144
+ ContextCompactionServiceLive,
145
+ FeedbackLoopServiceLive,
146
+ InstitutionalMemoryServiceLive,
147
+ MemoryServiceLive,
148
+ MonitoringWindowServiceLive,
149
+ MutatingApprovalServiceLive,
150
+ PlanAgentQueryServiceLive,
151
+ PlanCheckpointServiceLive,
152
+ PlanCoordinationServiceLive,
153
+ PlanEventDeliveryServiceLive,
154
+ SkillResolverServiceLive,
155
+ RecentActivityTitleServiceLive,
156
+ ),
157
+ ctx1,
158
+ )
159
+ const ctx2 = Layer.mergeAll(ctx1, tier2)
160
+
161
+ const tier3 = provide(Layer.mergeAll(PlanValidatorServiceLive, ThreadServiceLive), ctx2)
162
+ const ctx3 = Layer.mergeAll(ctx2, tier3)
163
+
164
+ const tier4 = provide(Layer.mergeAll(PlanCompilerServiceLive, ThreadTitleServiceLive), ctx3)
165
+ const ctx4 = Layer.mergeAll(ctx3, tier4)
166
+
167
+ const tier5 = provide(PlanExecutorServiceLive, ctx4)
168
+ const ctx5 = Layer.mergeAll(ctx4, tier5)
169
+
170
+ const tier6 = provide(
171
+ Layer.mergeAll(OwnershipDispatcherServiceLive, PlanAgentHeartbeatServiceLive, PlanDeadlineServiceLive),
172
+ ctx5,
173
+ )
174
+ const ctx6 = Layer.mergeAll(ctx5, tier6)
175
+
176
+ const tier7 = provide(Layer.mergeAll(ExecutionPlanServiceLive, GlobalOrchestratorServiceLive), ctx6)
177
+ const ctx7 = Layer.mergeAll(ctx6, tier7)
178
+
179
+ const tier8 = provide(
180
+ Layer.mergeAll(
181
+ PlanTemplateServiceLive,
182
+ AutonomousJobServiceLive,
183
+ AgentActivityServiceLive,
184
+ ThreadTurnPreparationServiceLive,
185
+ ),
186
+ ctx7,
187
+ )
188
+ const ctx8 = Layer.mergeAll(ctx7, tier8)
189
+
190
+ const tier9 = provide(Layer.mergeAll(PlanCycleServiceLive, ThreadTurnServiceLive), ctx8)
191
+ return Layer.mergeAll(ctx8, tier9)
192
+ }
@@ -1,6 +1,6 @@
1
1
  import type { PlanExecutionVisibility, PlanNodeSpecRecord, PlanSpecRecord } from '@lota-sdk/shared'
2
2
 
3
- import { agentRoster } from '../config/agent-defaults'
3
+ import { isAgentName } from '../config/agent-defaults'
4
4
 
5
5
  export function resolvePlanNodeExecutionVisibility(
6
6
  plan: Pick<PlanSpecRecord, 'defaultExecutionVisibility'>,
@@ -12,7 +12,7 @@ export function resolvePlanNodeExecutionVisibility(
12
12
  return configuredVisibility
13
13
  }
14
14
 
15
- return node.owner.executorType === 'agent' && agentRoster.includes(node.owner.ref) ? 'visible' : 'silent'
15
+ return node.owner.executorType === 'agent' && isAgentName(node.owner.ref) ? 'visible' : 'silent'
16
16
  }
17
17
 
18
18
  export function shouldPlanNodeUseVisibleTurn(
@@ -1,4 +1,5 @@
1
1
  import type { SerializableExecutionPlan } from '@lota-sdk/shared'
2
+ import { Schema, Duration, Effect } from 'effect'
2
3
 
3
4
  type ExecutionPlanPromptSummary = Pick<SerializableExecutionPlan, 'runId' | 'title'>
4
5
 
@@ -24,6 +25,15 @@ function formatExecutionPlansForPrompt(plans: SerializableExecutionPlan[]): stri
24
25
  return ['<execution-plan-state>', JSON.stringify(payload, null, 2), '</execution-plan-state>'].join('\n')
25
26
  }
26
27
 
28
+ export class ExecutionPlanCacheError extends Schema.TaggedErrorClass<ExecutionPlanCacheError>()(
29
+ 'ExecutionPlanCacheError',
30
+ { message: Schema.String, cause: Schema.Defect },
31
+ ) {}
32
+
33
+ export function toExecutionPlanCacheError(cause: unknown): ExecutionPlanCacheError {
34
+ return new ExecutionPlanCacheError({ message: cause instanceof Error ? cause.message : String(cause), cause })
35
+ }
36
+
27
37
  export function buildExecutionPlanInstructionSections(plans: SerializableExecutionPlan[] | null | undefined): string[] {
28
38
  const normalized = plans ?? []
29
39
  return [EXECUTION_PLAN_AGENT_PROTOCOL_PROMPT, formatExecutionPlansForPrompt(normalized)]
@@ -31,27 +41,44 @@ export function buildExecutionPlanInstructionSections(plans: SerializableExecuti
31
41
 
32
42
  export function createExecutionPlanInstructionSectionCache(params: {
33
43
  disabled?: boolean
34
- loadPlans: () => Promise<SerializableExecutionPlan[]>
44
+ loadPlansEffect: () => Effect.Effect<SerializableExecutionPlan[], ExecutionPlanCacheError>
35
45
  }) {
36
- let plansPromise: Promise<SerializableExecutionPlan[]> | null = null
37
- let sectionsPromise: Promise<string[] | undefined> | null = null
46
+ const [getPlansCachedEffect, invalidatePlansEffect] = Effect.runSync(
47
+ Effect.cachedInvalidateWithTTL(
48
+ Effect.suspend(() => (params.disabled ? Effect.succeed([]) : params.loadPlansEffect())),
49
+ Duration.infinity,
50
+ ),
51
+ )
52
+ const [getSectionsCachedEffect, invalidateSectionsEffect] = Effect.runSync(
53
+ Effect.cachedInvalidateWithTTL(
54
+ Effect.gen(function* () {
55
+ if (params.disabled) {
56
+ return undefined
57
+ }
58
+
59
+ const plans = yield* getPlansCachedEffect
60
+ return buildExecutionPlanInstructionSections(plans)
61
+ }),
62
+ Duration.infinity,
63
+ ),
64
+ )
65
+
66
+ const getPlansEffect = (): Effect.Effect<SerializableExecutionPlan[], ExecutionPlanCacheError> => getPlansCachedEffect
67
+
68
+ const getSectionsEffect = (): Effect.Effect<string[] | undefined, ExecutionPlanCacheError> => getSectionsCachedEffect
38
69
 
39
70
  return {
40
71
  invalidate() {
41
- plansPromise = null
42
- sectionsPromise = null
72
+ Effect.runSync(invalidatePlansEffect)
73
+ Effect.runSync(invalidateSectionsEffect)
43
74
  },
44
- async getPlans(): Promise<SerializableExecutionPlan[]> {
45
- if (params.disabled) return []
46
-
47
- plansPromise ??= params.loadPlans()
48
- return plansPromise
75
+ getPlansEffect,
76
+ getSectionsEffect,
77
+ getPlans() {
78
+ return Effect.runPromise(getPlansEffect())
49
79
  },
50
- async getSections(): Promise<string[] | undefined> {
51
- if (params.disabled) return undefined
52
-
53
- sectionsPromise ??= this.getPlans().then((plans) => buildExecutionPlanInstructionSections(plans))
54
- return sectionsPromise
80
+ getSections() {
81
+ return Effect.runPromise(getSectionsEffect())
55
82
  },
56
83
  }
57
84
  }
@@ -1,15 +1,27 @@
1
1
  import type { GraphDesignRequest, GraphDesignResponse } from '@lota-sdk/shared'
2
2
 
3
+ import { resolveOptionalLotaService } from '../effect/runtime'
4
+ import { RuntimeConfigServiceTag } from '../effect/services'
5
+
3
6
  export interface GraphDesigner {
4
7
  designGraph(request: GraphDesignRequest): Promise<GraphDesignResponse>
5
8
  }
6
9
 
7
- let _graphDesigner: GraphDesigner | null = null
10
+ let currentGraphDesigner: GraphDesigner | null = null
11
+
12
+ export function configureGraphDesigner(graphDesigner: GraphDesigner | null | undefined): void {
13
+ currentGraphDesigner = graphDesigner ?? null
14
+ }
8
15
 
9
- export function configureGraphDesigner(designer: GraphDesigner): void {
10
- _graphDesigner = designer
16
+ export function clearGraphDesigner(): void {
17
+ currentGraphDesigner = null
11
18
  }
12
19
 
13
20
  export function getGraphDesigner(): GraphDesigner | null {
14
- return _graphDesigner
21
+ if (currentGraphDesigner) {
22
+ return currentGraphDesigner
23
+ }
24
+
25
+ const runtimeConfig = resolveOptionalLotaService(RuntimeConfigServiceTag)
26
+ return runtimeConfig?.graphDesigner ?? null
15
27
  }
@@ -5,8 +5,13 @@ import type {
5
5
  ToolLoopAgentOnStepFinishCallback,
6
6
  ToolSet,
7
7
  } from 'ai'
8
+ import { Context, Duration, Effect, Layer, Metric } from 'effect'
8
9
  import type { ZodSchema } from 'zod'
9
10
 
11
+ import type { ValidationError } from '../effect/errors'
12
+ import { AiGenerationError, BadRequestError } from '../effect/errors'
13
+ import { summarizeZodIssues, toValidationError } from '../effect/zod'
14
+ import { nowEpochMillis } from '../utils/date-time'
10
15
  import { isRecord, stringifyUnknown } from '../utils/string'
11
16
 
12
17
  export interface HelperToolLoopAgentOptions {
@@ -70,7 +75,7 @@ function isRateLimitError(error: unknown): boolean {
70
75
  return getErrorStatus(error) === 429
71
76
  }
72
77
 
73
- function formatError(tag: string, error: unknown): Error {
78
+ function formatGenerationError(tag: string, error: unknown): AiGenerationError {
74
79
  const status = getErrorStatus(error)
75
80
  const rateLimited = isRateLimitError(error)
76
81
  const message = error instanceof Error ? error.message : String(error)
@@ -87,7 +92,73 @@ function formatError(tag: string, error: unknown): Error {
87
92
  if (responseBody) parts.push(`response_body=${responseBody}`)
88
93
  if (requestUrl) parts.push(`url=${requestUrl}`)
89
94
 
90
- return new Error(parts.join(' '))
95
+ return new AiGenerationError({
96
+ source: tag,
97
+ message: parts.join(' '),
98
+ ...(status !== null ? { status } : {}),
99
+ ...(rateLimited ? { rateLimited: true } : {}),
100
+ ...(responseData ? { providerData: responseData } : {}),
101
+ ...(responseBody ? { responseBody } : {}),
102
+ ...(requestUrl ? { url: requestUrl } : {}),
103
+ })
104
+ }
105
+
106
+ function emptyHelperMessagesError(tag: string): BadRequestError {
107
+ return new BadRequestError({ message: `[${tag}] Empty helper messages` })
108
+ }
109
+
110
+ function parseStructuredRootCandidate<T>(params: {
111
+ tag: string
112
+ schema: ZodSchema<T>
113
+ candidate: unknown
114
+ }): { data: T } | { error: ValidationError } {
115
+ const directParsed = params.schema.safeParse(params.candidate)
116
+ if (directParsed.success) {
117
+ return { data: directParsed.data }
118
+ }
119
+
120
+ return {
121
+ error: toValidationError(
122
+ directParsed.error,
123
+ `[${params.tag}] Structured output failed schema validation: ${summarizeZodIssues(directParsed.error.issues)}`,
124
+ ),
125
+ }
126
+ }
127
+
128
+ function createHelperAgent(params: {
129
+ tag: string
130
+ createAgent: CreateHelperAgentFn
131
+ systemPrompt?: string
132
+ temperature?: number
133
+ maxOutputTokens?: number
134
+ output?: Output.Output
135
+ }): Effect.Effect<HelperAgent, AiGenerationError> {
136
+ return Effect.try({
137
+ try: () =>
138
+ params.createAgent({
139
+ ...(params.systemPrompt ? { instructions: params.systemPrompt } : {}),
140
+ ...(params.output ? { output: params.output } : {}),
141
+ ...(typeof params.temperature === 'number' ? { temperature: params.temperature } : {}),
142
+ ...(typeof params.maxOutputTokens === 'number' ? { maxOutputTokens: params.maxOutputTokens } : {}),
143
+ maxRetries: 2,
144
+ }),
145
+ catch: (error) => formatGenerationError(params.tag, error),
146
+ })
147
+ }
148
+
149
+ function generateWithHelperAgent(
150
+ tag: string,
151
+ agent: HelperAgent,
152
+ params: { messages: HelperMessage[]; timeoutMs?: number },
153
+ ): Effect.Effect<{ text?: unknown; output?: unknown }, AiGenerationError> {
154
+ return Effect.tryPromise({
155
+ try: () =>
156
+ agent.generate({
157
+ messages: toModelMessages(params.messages),
158
+ ...(typeof params.timeoutMs === 'number' ? { timeout: params.timeoutMs } : {}),
159
+ }),
160
+ catch: (error) => formatGenerationError(tag, error),
161
+ })
91
162
  }
92
163
 
93
164
  function toModelMessages(messages: HelperMessage[]): Array<{ role: 'user' | 'assistant'; content: string }> {
@@ -118,13 +189,6 @@ function resolveStructuredSystemPrompt(systemPrompt?: string): string {
118
189
  return parts.join('\n\n')
119
190
  }
120
191
 
121
- function formatSchemaIssueSummary(issues: Array<{ path: PropertyKey[]; message: string }>): string {
122
- return issues
123
- .slice(0, 5)
124
- .map((issue) => `${issue.path.map((segment) => String(segment)).join('.') || 'root'}: ${issue.message}`)
125
- .join('; ')
126
- }
127
-
128
192
  function parseStructuredCandidate<T>(params: {
129
193
  schema: ZodSchema<T>
130
194
  candidate: unknown
@@ -147,40 +211,54 @@ function parseStructuredCandidate<T>(params: {
147
211
  return null
148
212
  }
149
213
 
214
+ const helperModelDuration = Metric.timer('helper_model_duration')
215
+
216
+ function recordHelperModelDuration(tag: string, startedAt: number): Effect.Effect<void, never, never> {
217
+ return Metric.update(
218
+ Metric.withAttributes(helperModelDuration, { tag }),
219
+ Duration.millis(Math.max(0, nowEpochMillis() - startedAt)),
220
+ )
221
+ }
222
+
150
223
  export function createHelperModelRuntime() {
151
- async function generateHelperText(params: GenerateHelperTextParams): Promise<string> {
224
+ function generateHelperTextEffect(
225
+ params: GenerateHelperTextParams,
226
+ ): Effect.Effect<string, AiGenerationError | BadRequestError | ValidationError> {
152
227
  const systemPrompt = resolveSystemPrompt({
153
228
  explicitSystemPrompt: params.systemPrompt,
154
229
  defaultSystemPrompt: params.defaultSystemPrompt,
155
230
  })
156
231
 
157
232
  if (!systemPrompt && params.messages.length === 0) {
158
- throw new Error(`[${params.tag}] Empty helper messages`)
233
+ return Effect.fail(emptyHelperMessagesError(params.tag))
159
234
  }
160
235
 
161
- try {
162
- const agent = params.createAgent({
163
- ...(systemPrompt ? { instructions: systemPrompt } : {}),
164
- ...(typeof params.temperature === 'number' ? { temperature: params.temperature } : {}),
165
- ...(typeof params.maxOutputTokens === 'number' ? { maxOutputTokens: params.maxOutputTokens } : {}),
166
- maxRetries: 2,
167
- })
236
+ const startedAt = nowEpochMillis()
168
237
 
169
- const result = await agent.generate({
170
- messages: toModelMessages(params.messages),
171
- ...(typeof params.timeoutMs === 'number' ? { timeout: params.timeoutMs } : {}),
238
+ return Effect.gen(function* () {
239
+ const agent = yield* createHelperAgent({
240
+ tag: params.tag,
241
+ createAgent: params.createAgent,
242
+ systemPrompt,
243
+ temperature: params.temperature,
244
+ maxOutputTokens: params.maxOutputTokens,
172
245
  })
246
+ const result = yield* generateWithHelperAgent(params.tag, agent, params)
173
247
  const text = typeof result.text === 'string' ? result.text.trim() : ''
174
248
  if (!text) {
175
- throw new Error('Empty helper model output')
249
+ return yield* formatGenerationError(params.tag, new Error('Empty helper model output'))
176
250
  }
177
251
  return text
178
- } catch (error) {
179
- throw formatError(params.tag, error)
180
- }
252
+ }).pipe(Effect.ensuring(recordHelperModelDuration(params.tag, startedAt)))
181
253
  }
182
254
 
183
- async function generateHelperStructured<T>(params: GenerateHelperStructuredParams<T>): Promise<T> {
255
+ function generateHelperText(params: GenerateHelperTextParams): Promise<string> {
256
+ return Effect.runPromise(generateHelperTextEffect(params).pipe(Effect.withSpan('HelperModel.generateHelperText')))
257
+ }
258
+
259
+ function generateHelperStructuredEffect<T>(
260
+ params: GenerateHelperStructuredParams<T>,
261
+ ): Effect.Effect<T, AiGenerationError | BadRequestError | ValidationError> {
184
262
  const baseSystemPrompt = resolveSystemPrompt({
185
263
  explicitSystemPrompt: params.systemPrompt,
186
264
  defaultSystemPrompt: params.defaultSystemPrompt,
@@ -188,39 +266,52 @@ export function createHelperModelRuntime() {
188
266
  const systemPrompt = resolveStructuredSystemPrompt(baseSystemPrompt)
189
267
 
190
268
  if (!baseSystemPrompt && params.messages.length === 0) {
191
- throw new Error(`[${params.tag}] Empty helper messages`)
269
+ return Effect.fail(emptyHelperMessagesError(params.tag))
192
270
  }
193
271
 
194
- try {
195
- const agent = params.createAgent({
196
- output: Output.object({ schema: params.schema }),
197
- ...(systemPrompt ? { instructions: systemPrompt } : {}),
198
- ...(typeof params.temperature === 'number' ? { temperature: params.temperature } : {}),
199
- ...(typeof params.maxOutputTokens === 'number' ? { maxOutputTokens: params.maxOutputTokens } : {}),
200
- maxRetries: 2,
201
- })
272
+ const startedAt = nowEpochMillis()
202
273
 
203
- const result = await agent.generate({
204
- messages: toModelMessages(params.messages),
205
- ...(typeof params.timeoutMs === 'number' ? { timeout: params.timeoutMs } : {}),
274
+ return Effect.gen(function* () {
275
+ const agent = yield* createHelperAgent({
276
+ tag: params.tag,
277
+ createAgent: params.createAgent,
278
+ systemPrompt,
279
+ temperature: params.temperature,
280
+ maxOutputTokens: params.maxOutputTokens,
281
+ output: Output.object({ schema: params.schema }),
206
282
  })
283
+ const result = yield* generateWithHelperAgent(params.tag, agent, params)
207
284
  const parsed = parseStructuredCandidate({ schema: params.schema, candidate: result.output })
208
285
  if (parsed) {
209
286
  return parsed.data
210
287
  }
211
288
 
212
- const directParsed = params.schema.safeParse(result.output)
213
- if (!directParsed.success) {
214
- throw new Error(
215
- `Structured output failed schema validation: ${formatSchemaIssueSummary(directParsed.error.issues)}`,
216
- )
289
+ const validated = parseStructuredRootCandidate({
290
+ tag: params.tag,
291
+ schema: params.schema,
292
+ candidate: result.output,
293
+ })
294
+ if ('error' in validated) {
295
+ return yield* validated.error
217
296
  }
218
297
 
219
- return directParsed.data
220
- } catch (error) {
221
- throw formatError(params.tag, error)
222
- }
298
+ return validated.data
299
+ }).pipe(Effect.ensuring(recordHelperModelDuration(params.tag, startedAt)))
300
+ }
301
+
302
+ function generateHelperStructured<T>(params: GenerateHelperStructuredParams<T>): Promise<T> {
303
+ return Effect.runPromise(
304
+ generateHelperStructuredEffect(params).pipe(Effect.withSpan('HelperModel.generateHelperStructured')),
305
+ )
223
306
  }
224
307
 
225
- return { generateHelperText, generateHelperStructured }
308
+ return { generateHelperTextEffect, generateHelperText, generateHelperStructuredEffect, generateHelperStructured }
226
309
  }
310
+
311
+ export type HelperModelRuntime = ReturnType<typeof createHelperModelRuntime>
312
+
313
+ export class HelperModelTag extends Context.Service<HelperModelTag, HelperModelRuntime>()(
314
+ '@lota-sdk/core/HelperModel',
315
+ ) {}
316
+
317
+ export const HelperModelLive = Layer.sync(HelperModelTag, () => createHelperModelRuntime())
@@ -1,18 +1,17 @@
1
1
  export * from './approval-continuation'
2
2
  export * from './agent-runtime-policy'
3
3
  export * from './agent-stream-helpers'
4
- export * from './agent-types'
5
4
  export * from './chat-request-routing'
6
5
  export * from './chat-run-registry'
7
- export * from './context-compaction'
6
+ export * from './context-compaction/context-compaction'
8
7
  export * from './execution-plan'
9
8
  export * from './graph-designer'
10
9
  export * from './helper-model'
11
10
  export * from './indexed-repositories-policy'
12
11
  export * from './instruction-sections'
13
- export * from './memory-block'
14
- export * from './memory-digest-policy'
15
- export * from './memory-scope'
12
+ export * from './memory/memory-block'
13
+ export * from './memory/memory-digest-policy'
14
+ export * from './memory/memory-scope'
16
15
  export * from './llm-content'
17
16
  export * from './plugin-resolution'
18
17
  export * from './plugin-types'
@@ -20,8 +19,8 @@ export * from './runtime-config'
20
19
  export * from './runtime-extensions'
21
20
  export * from './runtime-worker-registry'
22
21
  export * from './skill-extraction-policy'
23
- export * from './social-chat'
24
- export * from './team-consultation-orchestrator'
25
- export * from './team-consultation-prompts'
22
+ export * from './social-chat/social-chat'
23
+ export * from './team-consultation/team-consultation-orchestrator'
24
+ export * from './team-consultation/team-consultation-prompts'
26
25
  export * from './turn-lifecycle'
27
26
  export * from './thread-chat-helpers'
@@ -1,4 +1,4 @@
1
- import { agentRoster } from '../config/agent-defaults'
1
+ import { getAgentRoster } from '../config/agent-defaults'
2
2
 
3
3
  export type IndexedRepoAgentName = string
4
4
 
@@ -16,13 +16,13 @@ export type RepoSectionName = (typeof REPO_SECTION_NAMES)[number]
16
16
  const ALL_REPO_SECTIONS: RepoSectionName[] = [...REPO_SECTION_NAMES]
17
17
 
18
18
  export function buildDefaultRepoSectionsByAgent(
19
- roster: readonly IndexedRepoAgentName[] = agentRoster,
19
+ roster: readonly IndexedRepoAgentName[] = getAgentRoster(),
20
20
  ): Record<IndexedRepoAgentName, RepoSectionName[]> {
21
21
  return Object.fromEntries(roster.map((agentId) => [agentId, [...ALL_REPO_SECTIONS]]))
22
22
  }
23
23
 
24
24
  export function emptyAgentContextMap(
25
- roster: readonly IndexedRepoAgentName[] = agentRoster,
25
+ roster: readonly IndexedRepoAgentName[] = getAgentRoster(),
26
26
  ): Record<IndexedRepoAgentName, string> {
27
27
  return Object.fromEntries(roster.map((agentId) => [agentId, '']))
28
28
  }