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