@@ -22,12 +22,14 @@ import type {
2222 * - Execute runs when alarm fires
2323 * - User controls the full lifecycle via schedule/clear
2424 *
25+ * Note: All handler functions must return Effect with R = never.
26+ * If your effect requires services, provide them via .pipe(Effect.provide(layer)).
27+ *
2528 * @typeParam S - State type (inferred from stateSchema)
2629 * @typeParam E - Event type (inferred from eventSchema)
2730 * @typeParam Err - Error type (inferred from handlers)
28- * @typeParam R - Effect requirements (inferred from handlers)
2931 */
30- export interface TaskMakeConfig < S , E , Err , R > {
32+ export interface TaskMakeConfig < S , E , Err > {
3133 /**
3234 * Schema for validating and serializing state.
3335 * State is persisted durably and survives restarts.
@@ -42,6 +44,7 @@ export interface TaskMakeConfig<S, E, Err, R> {
4244
4345 /**
4446 * Handler called for each incoming event.
47+ * Must return Effect<void, Err, never> - all service requirements must be satisfied.
4548 *
4649 * The event is passed as the first parameter (not on ctx) to make it
4750 * clear that it's a direct value, not an Effect that needs yielding.
@@ -76,10 +79,11 @@ export interface TaskMakeConfig<S, E, Err, R> {
7679 * })
7780 * ```
7881 */
79- onEvent ( event : E , ctx : TaskEventContext < S > ) : Effect . Effect < void , Err , R > ;
82+ onEvent ( event : E , ctx : TaskEventContext < S > ) : Effect . Effect < void , Err , never > ;
8083
8184 /**
8285 * Handler called when the scheduled alarm fires.
86+ * Must return Effect<void, Err, never> - all service requirements must be satisfied.
8387 *
8488 * Responsibilities:
8589 * - Process the current state
@@ -100,11 +104,12 @@ export interface TaskMakeConfig<S, E, Err, R> {
100104 * })
101105 * ```
102106 */
103- execute ( ctx : TaskExecuteContext < S > ) : Effect . Effect < void , Err , R > ;
107+ execute ( ctx : TaskExecuteContext < S > ) : Effect . Effect < void , Err , never > ;
104108
105109 /**
106110 * Optional handler called when either `onEvent` or `execute` completes
107111 * and no alarm is scheduled.
112+ * Must return Effect<void, never, never> - all service requirements must be satisfied.
108113 *
109114 * Use this to:
110115 * - Schedule delayed cleanup
@@ -119,10 +124,11 @@ export interface TaskMakeConfig<S, E, Err, R> {
119124 * })
120125 * ```
121126 */
122- readonly onIdle ?: ( ctx : TaskIdleContext < S > ) => Effect . Effect < void , never , R > ;
127+ readonly onIdle ?: ( ctx : TaskIdleContext < S > ) => Effect . Effect < void , never , never > ;
123128
124129 /**
125130 * Optional error handler for onEvent/execute failures.
131+ * Must return Effect<void, never, never> - all service requirements must be satisfied.
126132 *
127133 * Use this to:
128134 * - Log errors
@@ -151,7 +157,7 @@ export interface TaskMakeConfig<S, E, Err, R> {
151157 readonly onError ?: (
152158 error : Err ,
153159 ctx : TaskErrorContext < S >
154- ) => Effect . Effect < void , never , R > ;
160+ ) => Effect . Effect < void , never , never > ;
155161
156162 /**
157163 * Control logging for this job.
@@ -269,9 +275,9 @@ export const Task = {
269275 * @param config - Configuration for the task
270276 * @returns An UnregisteredTaskDefinition that can be registered
271277 */
272- make : < S , E , Err = never , R = never > (
273- config : TaskMakeConfig < S , E , Err , R >
274- ) : UnregisteredTaskDefinition < S , E , Err , R > => ( {
278+ make : < S , E , Err = never > (
279+ config : TaskMakeConfig < S , E , Err >
280+ ) : UnregisteredTaskDefinition < S , E , Err > => ( {
275281 _tag : "TaskDefinition" ,
276282 stateSchema : config . stateSchema ,
277283 eventSchema : config . eventSchema ,
0 commit comments