1import * as UsageLimitRecoveryWorker from "./UsageLimitRecoveryWorker.ts";
2import * as Scheduler from "../scheduling/Scheduler.ts";
3import * as Layer from "effect/Layer";
4import * as OrchestrationCommandReceipts from "../persistence/OrchestrationCommandReceipts.ts";
5import * as OrchestrationEventStore from "../persistence/OrchestrationEventStore.ts";
6import * as McpAppModelContext from "../mcpApps/McpAppModelContext.ts";
7import * as McpAppRequests from "../mcpApps/McpAppRequests.ts";
8import * as ProviderSessionRuntime from "../persistence/ProviderSessionRuntime.ts";
9import * as TextGeneration from "../textGeneration/TextGeneration.ts";
10import * as ProviderAuthService from "../provider/ProviderAuthService.ts";
11import * as AgentSessionImporter from "../project/AgentSessionImporter.ts";
12import * as AgentSessionScanner from "../project/AgentSessionScanner.ts";
13import * as ProjectService from "../project/ProjectService.ts";
14import * as ProjectSetupScriptRunner from "../project/ProjectSetupScriptRunner.ts";
15import * as ManagedProjectFolders from "../project/ManagedProjectFolders.ts";
16import * as CheckpointCaptureService from "./CheckpointCaptureService.ts";
17import * as CheckpointService from "./CheckpointService.ts";
18import * as CheckpointRollbackService from "./CheckpointRollbackService.ts";
19import * as CommandPolicy from "./CommandPolicy.ts";
20import * as CommandReceiptStore from "./CommandReceiptStore.ts";
21import * as ContextHandoffService from "./ContextHandoffService.ts";
22import * as EffectOutbox from "./EffectOutbox.ts";
23import * as EffectWorker from "./EffectWorker.ts";
24import * as EventSink from "./EventSink.ts";
25import * as EventStore from "./EventStore.ts";
26import * as IdAllocator from "@t3tools/provider-core/server/IdAllocator";
27import * as LegacyV1ThreadImporter from "./legacy/LegacyV1ThreadImporter.ts";
28import * as Orchestrator from "./Orchestrator.ts";
29import * as ProjectionStore from "./ProjectionStore.ts";
30import * as ArchivedProjectionStore from "../archive/ArchivedProjectionStore.ts";
31import * as ProjectionMaintenance from "./ProjectionMaintenance.ts";
32import * as ProjectStore from "./ProjectStore.ts";
33import * as ProviderAdapterRegistry from "./ProviderAdapterRegistry.ts";
34import * as ProviderContinuationRequests from "@t3tools/provider-core/server/ProviderContinuationRequests";
35import * as ProviderContinuationService from "./ProviderContinuationService.ts";
36import * as ThreadTitleRegenerationService from "./ThreadTitleRegenerationService.ts";
37import * as ProviderEventIngestor from "./ProviderEventIngestor.ts";
38import * as ThreadCommandExecutor from "./ThreadCommandExecutor.ts";
39import * as ProviderSessionManager from "./ProviderSessionManager.ts";
40import * as ProviderRuntimeRecoveryService from "./ProviderRuntimeRecoveryService.ts";
41import * as ProviderSwitchService from "./ProviderSwitchService.ts";
42import * as ProviderTurnControlService from "./ProviderTurnControlService.ts";
43import * as ProviderTurnStartService from "./ProviderTurnStartService.ts";
44import * as RunExecutionService from "./RunExecutionService.ts";
45import * as RunFinalizationService from "./RunFinalizationService.ts";
46import * as RuntimePolicy from "./RuntimePolicy.ts";
47import * as RuntimeRequestService from "./RuntimeRequestService.ts";
48import * as ThreadManagementService from "./ThreadManagementService.ts";
49import * as ThreadLaunchService from "./ThreadLaunchService.ts";
50import * as ThreadLifecycleService from "./ThreadLifecycleService.ts";
51import * as ThreadForkService from "./ThreadForkService.ts";
52import * as TurnItemPositionStore from "./TurnItemPositionStore.ts";
53import * as ScheduledTaskService from "../scheduledTasks/ScheduledTaskService.ts";
54import * as SecretRequests from "../secrets/SecretRequests.ts";
55
56/** The shared application event log and its command receipts. */
57export const layerEventInfrastructure = Layer.mergeAll(
58 OrchestrationEventStore.layer,
59 OrchestrationCommandReceipts.layer,
60);
61
62const layerRuntimePolicyProvided = RuntimePolicy.layerFromProjectStore.pipe(
63 Layer.provide(ProjectStore.layer),
64);
65
66const layerEventStoreProvided = EventStore.layerFromOrchestrationEventStore.pipe(
67 Layer.provide(layerEventInfrastructure),
68);
69const layerCommandReceiptStoreProvided = CommandReceiptStore.layerFromApplicationReceipts.pipe(
70 Layer.provide(layerEventInfrastructure),
71);
72
73const layerStores = Layer.mergeAll(
74 layerEventInfrastructure,
75 layerEventStoreProvided,
76 ArchivedProjectionStore.layer,
77 ProjectStore.layer,
78 layerCommandReceiptStoreProvided,
79 EffectOutbox.layer,
80 TurnItemPositionStore.layer,
81);
82
83export const layerEventSink = EventSink.layerFromStores.pipe(Layer.provide(layerStores));
84const layerEventSinkProvided = layerEventSink;
85const layerProjectionMaintenanceProvided = ProjectionMaintenance.layer.pipe(
86 Layer.provide(ProjectionStore.layer),
87 Layer.provide(layerStores),
88);
89const layerLegacyV1ThreadImporterProvided = LegacyV1ThreadImporter.layer.pipe(
90 Layer.provide(layerEventSinkProvided),
91);
92
93export const layerProjectService = ProjectService.layer.pipe(
94 Layer.provide(
95 Layer.mergeAll(
96 ProjectStore.layer,
97 ArchivedProjectionStore.layer,
98 layerEventSinkProvided,
99 IdAllocator.layer,
100 layerLegacyV1ThreadImporterProvided,
101 ),
102 ),
103);
104
105const layerProviderEventIngestorProvided = ProviderEventIngestor.layer.pipe(
106 Layer.provide(
107 Layer.mergeAll(
108 layerEventSinkProvided,
109 IdAllocator.layer,
110 ArchivedProjectionStore.layer,
111 ThreadCommandExecutor.layer,
112 ),
113 ),
114);
115
116const layerCheckpointServiceProvided = CheckpointService.layer.pipe(
117 Layer.provide(IdAllocator.layer),
118);
119const layerContextHandoffServiceProvided = ContextHandoffService.layer.pipe(
120 Layer.provide(IdAllocator.layer),
121);
122
123const layerProviderAdapterRegistryProvided =
124 ProviderAdapterRegistry.layerFromProviderInstanceRegistry;
125const layerProviderSwitchServiceProvided = ProviderSwitchService.layer.pipe(
126 Layer.provide(layerProviderAdapterRegistryProvided),
127);
128
129const layerProviderSessionManagerProvided = ProviderSessionManager.layer.pipe(
130 Layer.provide(
131 Layer.mergeAll(
132 layerProviderAdapterRegistryProvided,
133 layerEventSinkProvided,
134 IdAllocator.layer,
135 layerProviderEventIngestorProvided,
136 ArchivedProjectionStore.layer,
137 ),
138 ),
139);
140
141const layerProviderAuthServiceProvided = ProviderAuthService.layer.pipe(
142 Layer.provide(Layer.merge(ArchivedProjectionStore.layer, layerProviderSessionManagerProvided)),
143);
144
145const layerRunExecutionServiceProvided = RunExecutionService.layer.pipe(
146 Layer.provide(
147 Layer.mergeAll(
148 McpAppModelContext.layer,
149 layerCheckpointServiceProvided,
150 layerEventSinkProvided,
151 IdAllocator.layer,
152 layerProviderEventIngestorProvided,
153 ),
154 ),
155);
156
157const layerProviderTurnStartServiceProvided = ProviderTurnStartService.layer.pipe(
158 Layer.provide(
159 Layer.mergeAll(
160 layerContextHandoffServiceProvided,
161 layerEventSinkProvided,
162 IdAllocator.layer,
163 ArchivedProjectionStore.layer,
164 layerProviderSessionManagerProvided,
165 layerProviderAuthServiceProvided,
166 layerRunExecutionServiceProvided,
167 layerRuntimePolicyProvided,
168 ),
169 ),
170);
171
172const layerProviderTurnControlServiceProvided = ProviderTurnControlService.layer.pipe(
173 Layer.provide(Layer.merge(ArchivedProjectionStore.layer, layerProviderSessionManagerProvided)),
174);
175const layerRuntimeRequestServiceProvided = RuntimeRequestService.layer.pipe(
176 Layer.provide(Layer.merge(ArchivedProjectionStore.layer, layerProviderSessionManagerProvided)),
177);
178const layerCheckpointRollbackServiceProvided = CheckpointRollbackService.layer.pipe(
179 Layer.provide(
180 Layer.mergeAll(
181 ProjectStore.layer,
182 layerCheckpointServiceProvided,
183 layerEventSinkProvided,
184 IdAllocator.layer,
185 ArchivedProjectionStore.layer,
186 layerProviderSessionManagerProvided,
187 ThreadCommandExecutor.layer,
188 layerRuntimePolicyProvided,
189 ),
190 ),
191);
192const layerCheckpointCaptureServiceProvided = CheckpointCaptureService.layer.pipe(
193 Layer.provide(
194 Layer.mergeAll(
195 layerCheckpointServiceProvided,
196 layerEventSinkProvided,
197 IdAllocator.layer,
198 ArchivedProjectionStore.layer,
199 ),
200 ),
201);
202const layerRunFinalizationServiceProvided = RunFinalizationService.layer.pipe(
203 Layer.provide(Layer.merge(layerCheckpointCaptureServiceProvided, ArchivedProjectionStore.layer)),
204);
205
206const layerOrchestratorProvided = Orchestrator.layer.pipe(
207 Layer.provide(
208 Layer.mergeAll(
209 layerCheckpointServiceProvided,
210 CommandPolicy.layer,
211 layerStores,
212 layerEventSinkProvided,
213 layerCommandReceiptStoreProvided,
214 layerContextHandoffServiceProvided,
215 IdAllocator.layer,
216 ProjectStore.layer,
217 layerProviderAdapterRegistryProvided,
218 // Same layer reference as the continuation worker and the adapter
219 // infrastructure so layer memoization yields one shared request queue.
220 ProviderContinuationRequests.layer,
221 layerProviderEventIngestorProvided,
222 layerRuntimePolicyProvided,
223 layerProviderSessionManagerProvided,
224 layerProviderSwitchServiceProvided,
225 layerRunExecutionServiceProvided,
226 ThreadForkService.layer,
227 ),
228 ),
229);
230
231const layerAgentSessionImporterProvided = AgentSessionImporter.layer.pipe(
232 Layer.provide(
233 Layer.mergeAll(
234 AgentSessionScanner.layer,
235 layerProjectService,
236 layerOrchestratorProvided,
237 layerEventSinkProvided,
238 IdAllocator.layer,
239 ProviderSessionRuntime.layer,
240 ),
241 ),
242);
243
244const layerThreadManagementProvided = ThreadManagementService.layerWithLegacyImporter.pipe(
245 Layer.provide(
246 Layer.mergeAll(
247 layerOrchestratorProvided,
248 layerLegacyV1ThreadImporterProvided,
249 layerCommandReceiptStoreProvided,
250 layerProviderSessionManagerProvided,
251 ),
252 ),
253);
254export const layerProjectSetupScriptRunner = ProjectSetupScriptRunner.layer.pipe(
255 Layer.provide(layerProjectService),
256);
257const layerManagedProjectFoldersProvided = ManagedProjectFolders.layer.pipe(
258 Layer.provide(layerProjectService),
259);
260const layerThreadLaunchProvided = ThreadLaunchService.layer.pipe(
261 Layer.provide(
262 Layer.mergeAll(
263 layerProjectService,
264 layerProjectSetupScriptRunner,
265 layerManagedProjectFoldersProvided,
266 layerThreadManagementProvided,
267 layerCommandReceiptStoreProvided,
268 IdAllocator.layer,
269 ),
270 ),
271);
272const layerThreadLifecycleProvided = ThreadLifecycleService.layer.pipe(
273 Layer.provide(layerThreadManagementProvided),
274);
275const layerSecretRequestsProvided = SecretRequests.layer.pipe(
276 Layer.provide(layerThreadManagementProvided),
277);
278const layerScheduledTaskProvided = ScheduledTaskService.layer.pipe(
279 Layer.provide(
280 Layer.mergeAll(
281 layerThreadLaunchProvided,
282 layerThreadManagementProvided,
283 layerSecretRequestsProvided,
284 ),
285 ),
286);
287const layerProviderContinuationWorkerProvided = ProviderContinuationService.layer.pipe(
288 Layer.provide(
289 Layer.mergeAll(
290 ProviderContinuationRequests.layer,
291 layerThreadManagementProvided,
292 IdAllocator.layer,
293 ),
294 ),
295);
296const layerThreadTitleRegenerationProvided = ThreadTitleRegenerationService.layer.pipe(
297 Layer.provide(
298 Layer.mergeAll(layerThreadManagementProvided, ProjectStore.layer, TextGeneration.layer),
299 ),
300);
301const layerEffectExecutorProvided = EffectWorker.layerExecutor.pipe(
302 Layer.provide(
303 Layer.mergeAll(
304 layerRunFinalizationServiceProvided,
305 layerCheckpointRollbackServiceProvided,
306 layerProviderSessionManagerProvided,
307 layerProviderTurnControlServiceProvided,
308 layerProviderTurnStartServiceProvided,
309 layerRuntimeRequestServiceProvided,
310 layerThreadTitleRegenerationProvided,
311 layerThreadManagementProvided,
312 ),
313 ),
314);
315const layerEffectWorkerProvided = EffectWorker.layer.pipe(
316 Layer.provide(Layer.merge(layerStores, layerEffectExecutorProvided)),
317);
318const layerProviderRuntimeRecoveryProvided = ProviderRuntimeRecoveryService.layer.pipe(
319 Layer.provide(
320 Layer.mergeAll(
321 layerEffectWorkerProvided,
322 layerStores,
323 layerEventSinkProvided,
324 IdAllocator.layer,
325 ArchivedProjectionStore.layer,
326 ),
327 ),
328);
329
330const layerMcpAppRequestsProvided = McpAppRequests.layer.pipe(
331 Layer.provide(
332 Layer.mergeAll(
333 McpAppModelContext.layer,
334 layerOrchestratorProvided,
335 layerThreadManagementProvided,
336 layerProviderSessionManagerProvided,
337 ),
338 ),
339);
340
341export const layer = Layer.mergeAll(
342 layerOrchestratorProvided,
343 layerMcpAppRequestsProvided,
344 layerThreadManagementProvided,
345 layerEffectWorkerProvided,
346 layerProviderSessionManagerProvided,
347 layerProviderAuthServiceProvided,
348 layerProviderRuntimeRecoveryProvided,
349 layerProjectionMaintenanceProvided,
350 layerLegacyV1ThreadImporterProvided,
351);
352
353export const layerProduction = Layer.mergeAll(
354 layer.pipe(Layer.provide(layerProjectService)),
355 layerProjectService,
356 layerManagedProjectFoldersProvided,
357 layerThreadLaunchProvided,
358 layerThreadLifecycleProvided,
359 layerScheduledTaskProvided,
360 layerSecretRequestsProvided,
361 UsageLimitRecoveryWorker.layer.pipe(
362 Layer.provide(Layer.mergeAll(ArchivedProjectionStore.layer, layerThreadManagementProvided)),
363 ),
364 layerProviderContinuationWorkerProvided,
365 layerAgentSessionImporterProvided,
366 EffectOutbox.layerPruneWorker.pipe(Layer.provide(EffectOutbox.layer)),
367).pipe(Layer.provide(Scheduler.layer), Layer.provideMerge(layerEventInfrastructure));