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(
186 Layer.mergeAll(layerEventSink, ProjectionStore.layer, layerProviderSessionManagerProvided),
187 ),
188);
189const layerRuntimeRequestServiceProvided = RuntimeRequestService.layer.pipe(
190 Layer.provide(Layer.merge(ProjectionStore.layer, layerProviderSessionManagerProvided)),
191);
192const layerCheckpointRollbackServiceProvided = CheckpointRollbackService.layer.pipe(
193 Layer.provide(
194 Layer.mergeAll(
195 ProjectStore.layer,
196 layerCheckpointServiceProvided,
197 layerEventSink,
198 IdAllocator.layer,
199 ProjectionStore.layer,
200 layerProviderSessionManagerProvided,
201 ThreadCommandExecutor.layer,
202 layerRuntimePolicyProvided,
203 ),
204 ),
205);
206const layerCheckpointCaptureServiceProvided = CheckpointCaptureService.layer.pipe(
207 Layer.provide(
208 Layer.mergeAll(
209 layerCheckpointServiceProvided,
210 layerEventSink,
211 IdAllocator.layer,
212 ProjectionStore.layer,
213 ),
214 ),
215);
216const layerRunFinalizationServiceProvided = RunFinalizationService.layer.pipe(
217 Layer.provide(Layer.merge(layerCheckpointCaptureServiceProvided, ProjectionStore.layer)),
218);
219
220const layerOrchestratorProvided = Orchestrator.layer.pipe(
221 Layer.provide(
222 Layer.mergeAll(
223 layerCheckpointServiceProvided,
224 CommandPolicy.layer,
225 layerStores,
226 layerEventSink,
227 layerCommandReceiptStoreProvided,
228 layerContextHandoffServiceProvided,
229 IdAllocator.layer,
230 ProjectStore.layer,
231 ProviderAdapterRegistry.layerFromProviderInstanceRegistry,
232 // Reuse the continuation worker's layer reference so memoization shares one request queue.
233 ProviderContinuationRequests.layer,
234 layerProviderEventIngestorProvided,
235 layerRuntimePolicyProvided,
236 layerProviderSessionManagerProvided,
237 layerProviderSwitchServiceProvided,
238 layerRunExecutionServiceProvided,
239 ThreadForkService.layer,
240 ),
241 ),
242);
243
244// One scanner serves the wizard's scan and imports, so imports can reuse its candidates.
245const layerAgentSessionScannerProvided = AgentSessionScanner.layer.pipe(
246 Layer.provide(ProviderSessionRuntime.layer),
247);
248const layerAgentSessionImporterProvided = AgentSessionImporter.layer.pipe(
249 Layer.provide(
250 Layer.mergeAll(
251 layerAgentSessionScannerProvided,
252 layerProjectService,
253 layerOrchestratorProvided,
254 layerEventSink,
255 IdAllocator.layer,
256 ProviderSessionRuntime.layer,
257 ProviderAdapterRegistry.layerFromProviderInstanceRegistry,
258 ThreadCommandExecutor.layer,
259 ),
260 ),
261);
262
263const layerThreadManagementProvided = ThreadManagementService.layerWithLegacyImporter.pipe(
264 Layer.provide(
265 Layer.mergeAll(
266 layerOrchestratorProvided,
267 layerLegacyV1ThreadImporterProvided,
268 layerCommandReceiptStoreProvided,
269 layerProviderSessionManagerProvided,
270 ),
271 ),
272);
273export const layerProjectSetupScriptRunner = ProjectSetupScriptRunner.layer.pipe(
274 Layer.provide(layerProjectService),
275 // Whether a thread came from a linked environment, which skips setup.
276 Layer.provide(ProjectionStore.layer),
277);
278const layerManagedProjectFoldersProvided = ManagedProjectFolders.layer.pipe(
279 Layer.provide(layerProjectService),
280);
281const layerThreadLaunchProvided = ThreadLaunchService.layer.pipe(
282 Layer.provide(
283 Layer.mergeAll(
284 layerProjectService,
285 layerProjectSetupScriptRunner,
286 layerManagedProjectFoldersProvided,
287 layerThreadManagementProvided,
288 layerCommandReceiptStoreProvided,
289 layerEventSink,
290 IdAllocator.layer,
291 ),
292 ),
293);
294const layerSecretRequestsProvided = SecretRequests.layer.pipe(
295 Layer.provide(layerThreadManagementProvided),
296);
297const layerScheduledTaskProvided = ScheduledTaskService.layer.pipe(
298 Layer.provide(
299 Layer.mergeAll(
300 layerThreadLaunchProvided,
301 layerThreadManagementProvided,
302 layerManagedProjectFoldersProvided,
303 layerSecretRequestsProvided,
304 ),
305 ),
306);
307const layerScratchThreadPromotionProvided = ScratchThreadPromotion.layer.pipe(
308 Layer.provide(
309 Layer.mergeAll(
310 layerProjectService,
311 layerManagedProjectFoldersProvided,
312 layerThreadManagementProvided,
313 layerScheduledTaskProvided,
314 ),
315 ),
316);
317const layerProviderContinuationWorkerProvided = ProviderContinuationService.layer.pipe(
318 Layer.provide(
319 Layer.mergeAll(
320 ProviderContinuationRequests.layer,
321 layerThreadManagementProvided,
322 IdAllocator.layer,
323 ),
324 ),
325);
326const layerThreadTitleRegenerationProvided = ThreadTitleRegenerationService.layer.pipe(
327 Layer.provide(
328 Layer.mergeAll(
329 layerThreadManagementProvided,
330 ProjectStore.layer,
331 TextGeneration.layer.pipe(Layer.provide(ProviderInstallationGate.layer)),
332 ),
333 ),
334);
335const layerEffectExecutorProvided = EffectWorker.layerExecutor.pipe(
336 Layer.provide(
337 Layer.mergeAll(
338 layerRunFinalizationServiceProvided,
339 layerCheckpointRollbackServiceProvided,
340 layerProviderSessionManagerProvided,
341 layerProviderTurnControlServiceProvided,
342 layerProviderTurnStartServiceProvided,
343 layerRuntimeRequestServiceProvided,
344 layerThreadTitleRegenerationProvided,
345 layerThreadManagementProvided,
346 ),
347 ),
348);
349const layerEffectWorkerProvided = EffectWorker.layer.pipe(
350 Layer.provide(Layer.merge(layerStores, layerEffectExecutorProvided)),
351);
352const layerProviderRuntimeRecoveryProvided = ProviderRuntimeRecoveryService.layer.pipe(
353 Layer.provide(
354 Layer.mergeAll(
355 layerEffectWorkerProvided,
356 layerStores,
357 layerEventSink,
358 IdAllocator.layer,
359 ProjectionStore.layer,
360 ),
361 ),
362);
363
364const layerMcpAppRequestsProvided = McpAppRequests.layer.pipe(
365 Layer.provide(
366 Layer.mergeAll(
367 McpAppModelContext.layer,
368 layerOrchestratorProvided,
369 layerThreadManagementProvided,
370 layerProviderSessionManagerProvided,
371 ),
372 ),
373);
374
375export const layer = Layer.mergeAll(
376 layerCommandOutputHubProvided,
377 layerOrchestratorProvided,
378 layerMcpAppRequestsProvided,
379 layerThreadManagementProvided,
380 layerEffectWorkerProvided,
381 layerProviderSessionManagerProvided,
382 layerProviderAuthServiceProvided,
383 layerProviderRuntimeRecoveryProvided,
384 layerProjectionMaintenanceProvided,
385 layerLegacyV1ThreadImporterProvided,
386);
387
388export const layerProduction = Layer.mergeAll(
389 WorktreeBranchSync.layer.pipe(
390 Layer.provide(Layer.merge(layerThreadManagementProvided, ProjectionStore.layer)),
391 ),
392 layer.pipe(Layer.provide(layerProjectService)),
393 layerProjectService,
394 layerManagedProjectFoldersProvided,
395 layerThreadLaunchProvided,
396 layerScheduledTaskProvided,
397 layerScratchThreadPromotionProvided,
398 layerSecretRequestsProvided,
399 GuestShareService.layer.pipe(
400 Layer.provide(Layer.merge(layerOrchestratorProvided, layerCommandOutputHubProvided)),
401 ),
402 UsageLimitRecoveryWorker.layer.pipe(
403 Layer.provide(
404 Layer.mergeAll(
405 ProjectionStore.layer,
406 layerThreadManagementProvided,
407 layerOrchestratorProvided,
408 ),
409 ),
410 ),
411 layerProviderContinuationWorkerProvided,
412 layerAgentSessionScannerProvided,
413 layerAgentSessionImporterProvided,
414 EffectOutbox.layerPruneWorker.pipe(Layer.provide(EffectOutbox.layer)),
415).pipe(
416 Layer.provide(ResourceCleanupService.layer.pipe(Layer.provide(layerScheduledTaskProvided))),
417 Layer.provide(Scheduler.layer),
418 Layer.provideMerge(layerEventInfrastructure),
419);