@yolk-sdk/vercel-workflows 0.1.0-canary.40 → 0.1.0-canary.41
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.
- package/README.md +6 -6
- package/dist/index.d.mts +2 -2
- package/dist/workflow-events.d.mts +3 -14
- package/dist/workflow-events.d.mts.map +1 -1
- package/dist/workflow-events.mjs +14 -27
- package/dist/workflow-events.mjs.map +1 -1
- package/dist/workflow.d.mts +2 -2
- package/package.json +1 -1
- package/src/index.ts +0 -1
- package/src/workflow-events.ts +21 -82
- package/src/workflow.ts +0 -1
package/README.md
CHANGED
|
@@ -150,10 +150,11 @@ active-run locking, stale-run guards, and cancellation behavior.
|
|
|
150
150
|
## Terminal barriers
|
|
151
151
|
|
|
152
152
|
For durable host streams, terminal events are commit barriers. Emit live/progress events first,
|
|
153
|
-
commit canonical host state, then write the terminal event
|
|
153
|
+
commit canonical host state, then write the terminal event. The surrounding workflow loop owns the
|
|
154
|
+
single final stream close:
|
|
154
155
|
|
|
155
156
|
```txt
|
|
156
|
-
live events -> host durable commit -> terminal event -> close
|
|
157
|
+
live events -> host durable commit -> terminal event -> workflow-owned close
|
|
157
158
|
```
|
|
158
159
|
|
|
159
160
|
This lets clients stop consuming at a protocol-terminal event and immediately revalidate or reconnect
|
|
@@ -169,14 +170,13 @@ const result = yield* commitThenWriteTerminalEvent({
|
|
|
169
170
|
commit: persistState,
|
|
170
171
|
write: event => writeDurableAgentEvent({ writer, event, streamId, turn, state }),
|
|
171
172
|
writeCommitError: error =>
|
|
172
|
-
writeDurableAgentEvent({ writer, event: commitErrorEvent(error), streamId, turn, state })
|
|
173
|
-
close: Effect.tryPromise({ try: () => writer.close(), catch: error => error })
|
|
173
|
+
writeDurableAgentEvent({ writer, event: commitErrorEvent(error), streamId, turn, state })
|
|
174
174
|
})
|
|
175
175
|
```
|
|
176
176
|
|
|
177
177
|
The helper never writes the success terminal before `commit` succeeds. If `commit` fails, it writes
|
|
178
|
-
the host-provided terminal error event instead.
|
|
179
|
-
|
|
178
|
+
the host-provided terminal error event instead. The helper does not close writers; close once in the
|
|
179
|
+
surrounding workflow loop or stream owner after terminal handling settles.
|
|
180
180
|
|
|
181
181
|
## Host responsibilities
|
|
182
182
|
|
package/dist/index.d.mts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { SerializableWorkflowState, VercelAgentWorkflowAwaitingInput, VercelAgentWorkflowInput, VercelAgentWorkflowLoopConfig, VercelAgentWorkflowModelStepInput, VercelAgentWorkflowModelStepResult, VercelAgentWorkflowRunResult, VercelAgentWorkflowStepRetryPolicy, VercelAgentWorkflowToolBatchStepInput, VercelAgentWorkflowToolBatchStepResult, WorkflowStepResult, defaultMaxWorkflowTurns, noWorkflowStepRetry, retryWorkflowStep, runVercelAgentWorkflow, settleWorkflowStep } from "./workflow-loop.mjs";
|
|
2
|
-
import { CommitThenWriteTerminalEventInput, CommitThenWriteTerminalEventResult, DurableAgentEvent, DurableAgentEventIdInput, DurableAgentEventSequencerState, SequenceDurableAgentEventInput, SequencedDurableAgentEvent,
|
|
3
|
-
export { type CommitThenWriteTerminalEventInput, type CommitThenWriteTerminalEventResult, type DurableAgentEvent, type DurableAgentEventIdInput, type DurableAgentEventSequencerState, type SequenceDurableAgentEventInput, type SequencedDurableAgentEvent, type SerializableWorkflowState, type
|
|
2
|
+
import { CommitThenWriteTerminalEventInput, CommitThenWriteTerminalEventResult, DurableAgentEvent, DurableAgentEventIdInput, DurableAgentEventSequencerState, SequenceDurableAgentEventInput, SequencedDurableAgentEvent, WriteDurableAgentEventInput, commitThenWriteTerminalEvent, durableAgentEventId, makeDurableAgentEventSequencerState, sequenceDurableAgentEvent, writeDurableAgentEvent } from "./workflow-events.mjs";
|
|
3
|
+
export { type CommitThenWriteTerminalEventInput, type CommitThenWriteTerminalEventResult, type DurableAgentEvent, type DurableAgentEventIdInput, type DurableAgentEventSequencerState, type SequenceDurableAgentEventInput, type SequencedDurableAgentEvent, type SerializableWorkflowState, type VercelAgentWorkflowAwaitingInput, type VercelAgentWorkflowInput, type VercelAgentWorkflowLoopConfig, type VercelAgentWorkflowModelStepInput, type VercelAgentWorkflowModelStepResult, type VercelAgentWorkflowRunResult, type VercelAgentWorkflowStepRetryPolicy, type VercelAgentWorkflowToolBatchStepInput, type VercelAgentWorkflowToolBatchStepResult, type WorkflowStepResult, type WriteDurableAgentEventInput, commitThenWriteTerminalEvent, defaultMaxWorkflowTurns, durableAgentEventId, makeDurableAgentEventSequencerState, noWorkflowStepRetry, retryWorkflowStep, runVercelAgentWorkflow, sequenceDurableAgentEvent, settleWorkflowStep, writeDurableAgentEvent };
|
|
@@ -36,43 +36,32 @@ type SequencedDurableAgentEvent<Event extends object = object> = {
|
|
|
36
36
|
type WriteDurableAgentEventInput<Event extends object = object> = SequenceDurableAgentEventInput<Event> & {
|
|
37
37
|
readonly writer: WritableStreamDefaultWriter<Uint8Array>;
|
|
38
38
|
};
|
|
39
|
-
type
|
|
40
|
-
readonly _tag: 'Closed';
|
|
41
|
-
} | {
|
|
42
|
-
readonly _tag: 'CloseFailed';
|
|
43
|
-
readonly error: unknown;
|
|
44
|
-
};
|
|
45
|
-
type CommitThenWriteTerminalEventInput<TerminalEvent extends object, TerminalWriteResult, CommitErrorWriteResult, CommitError, TerminalWriteError, CommitErrorWriteError, CloseError> = {
|
|
39
|
+
type CommitThenWriteTerminalEventInput<TerminalEvent extends object, TerminalWriteResult, CommitErrorWriteResult, CommitError, TerminalWriteError, CommitErrorWriteError> = {
|
|
46
40
|
readonly commit: Effect.Effect<void, CommitError>;
|
|
47
41
|
readonly terminal: TerminalEvent;
|
|
48
42
|
readonly write: (event: TerminalEvent) => Effect.Effect<TerminalWriteResult, TerminalWriteError>;
|
|
49
43
|
readonly writeCommitError: (error: unknown) => Effect.Effect<CommitErrorWriteResult, CommitErrorWriteError>;
|
|
50
|
-
readonly close: Effect.Effect<void, CloseError>;
|
|
51
44
|
};
|
|
52
45
|
type CommitThenWriteTerminalEventResult<TerminalWriteResult, CommitErrorWriteResult> = {
|
|
53
46
|
readonly _tag: 'Committed';
|
|
54
47
|
readonly writeResult: TerminalWriteResult;
|
|
55
|
-
readonly closeResult: TerminalEventCloseResult;
|
|
56
48
|
} | {
|
|
57
49
|
readonly _tag: 'CommitFailed';
|
|
58
50
|
readonly commitError: unknown;
|
|
59
51
|
readonly writeResult: CommitErrorWriteResult;
|
|
60
|
-
readonly closeResult: TerminalEventCloseResult;
|
|
61
52
|
} | {
|
|
62
53
|
readonly _tag: 'TerminalWriteFailed';
|
|
63
54
|
readonly error: unknown;
|
|
64
|
-
readonly closeResult: TerminalEventCloseResult;
|
|
65
55
|
} | {
|
|
66
56
|
readonly _tag: 'CommitErrorWriteFailed';
|
|
67
57
|
readonly commitError: unknown;
|
|
68
58
|
readonly error: unknown;
|
|
69
|
-
readonly closeResult: TerminalEventCloseResult;
|
|
70
59
|
};
|
|
71
60
|
declare const makeDurableAgentEventSequencerState: (eventSequence?: number) => DurableAgentEventSequencerState;
|
|
72
61
|
declare const durableAgentEventId: (input: DurableAgentEventIdInput) => string;
|
|
73
62
|
declare const sequenceDurableAgentEvent: <Event extends object>(input: SequenceDurableAgentEventInput<Event>) => SequencedDurableAgentEvent<Event>;
|
|
74
63
|
declare const writeDurableAgentEvent: <Event extends object>(input: WriteDurableAgentEventInput<Event>) => Effect.Effect<SequencedDurableAgentEvent<Event>, unknown>;
|
|
75
|
-
declare const commitThenWriteTerminalEvent: <TerminalEvent extends object, TerminalWriteResult, CommitErrorWriteResult, CommitError, TerminalWriteError, CommitErrorWriteError
|
|
64
|
+
declare const commitThenWriteTerminalEvent: <TerminalEvent extends object, TerminalWriteResult, CommitErrorWriteResult, CommitError, TerminalWriteError, CommitErrorWriteError>(input: CommitThenWriteTerminalEventInput<TerminalEvent, TerminalWriteResult, CommitErrorWriteResult, CommitError, TerminalWriteError, CommitErrorWriteError>) => Effect.Effect<CommitThenWriteTerminalEventResult<TerminalWriteResult, CommitErrorWriteResult>, never>;
|
|
76
65
|
//#endregion
|
|
77
|
-
export { CommitThenWriteTerminalEventInput, CommitThenWriteTerminalEventResult, DurableAgentEvent, DurableAgentEventIdInput, DurableAgentEventSequencerState, SequenceDurableAgentEventInput, SequencedDurableAgentEvent,
|
|
66
|
+
export { CommitThenWriteTerminalEventInput, CommitThenWriteTerminalEventResult, DurableAgentEvent, DurableAgentEventIdInput, DurableAgentEventSequencerState, SequenceDurableAgentEventInput, SequencedDurableAgentEvent, WriteDurableAgentEventInput, commitThenWriteTerminalEvent, durableAgentEventId, makeDurableAgentEventSequencerState, sequenceDurableAgentEvent, writeDurableAgentEvent };
|
|
78
67
|
//# sourceMappingURL=workflow-events.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-events.d.mts","names":[],"sources":["../src/workflow-events.ts"],"mappings":";;;KAEY,+BAAA;EAAA,SACD,aAAa;AAAA;AAAA,KAGZ,iBAAA,kCAAmD,KAAK;EAAA,SACzD,OAAA;EAAA,SACA,WAAA;AAAA;AAAA,KAGC,wBAAA;EAAA,SACD,QAAA;EAAA,SACA,IAAA;EAAA,SACA,aAAA;AAAA;AAAA,KAGC,8BAAA;EAAA,SACD,KAAA,EAAO,+BAAA;EAVP;;AAAW;AAGtB;;;;EAHW,SAkBA,QAAA;EAAA,SACA,IAAA;EAAA,SACA,KAAA,EAAO,KAAK;EAAA,SACZ,WAAA;AAAA;AAAA,KAGC,0BAAA;EAAA,SACD,KAAA,EAAO,iBAAA,CAAkB,KAAA;EAAA,SACzB,aAAA;EAAA,SACA,iBAAA;EAAA,SACA,SAAA,EAAW,+BAAA;AAAA;AAAA,KAGV,2BAAA,kCACV,8BAAA,CAA+B,KAAA;EAAA,SACpB,MAAA,EAAQ,2BAAA,CAA4B,UAAA;AAAA;AAAA,KAGrC,
|
|
1
|
+
{"version":3,"file":"workflow-events.d.mts","names":[],"sources":["../src/workflow-events.ts"],"mappings":";;;KAEY,+BAAA;EAAA,SACD,aAAa;AAAA;AAAA,KAGZ,iBAAA,kCAAmD,KAAK;EAAA,SACzD,OAAA;EAAA,SACA,WAAA;AAAA;AAAA,KAGC,wBAAA;EAAA,SACD,QAAA;EAAA,SACA,IAAA;EAAA,SACA,aAAA;AAAA;AAAA,KAGC,8BAAA;EAAA,SACD,KAAA,EAAO,+BAAA;EAVP;;AAAW;AAGtB;;;;EAHW,SAkBA,QAAA;EAAA,SACA,IAAA;EAAA,SACA,KAAA,EAAO,KAAK;EAAA,SACZ,WAAA;AAAA;AAAA,KAGC,0BAAA;EAAA,SACD,KAAA,EAAO,iBAAA,CAAkB,KAAA;EAAA,SACzB,aAAA;EAAA,SACA,iBAAA;EAAA,SACA,SAAA,EAAW,+BAAA;AAAA;AAAA,KAGV,2BAAA,kCACV,8BAAA,CAA+B,KAAA;EAAA,SACpB,MAAA,EAAQ,2BAAA,CAA4B,UAAA;AAAA;AAAA,KAGrC,iCAAA;EAAA,SAQD,MAAA,EAAQ,MAAA,CAAO,MAAA,OAAa,WAAA;EAAA,SAC5B,QAAA,EAAU,aAAA;EAAA,SACV,KAAA,GAAQ,KAAA,EAAO,aAAA,KAAkB,MAAA,CAAO,MAAA,CAAO,mBAAA,EAAqB,kBAAA;EAAA,SACpE,gBAAA,GACP,KAAA,cACG,MAAA,CAAO,MAAA,CAAO,sBAAA,EAAwB,qBAAA;AAAA;AAAA,KAGjC,kCAAA;EAAA,SAEG,IAAA;EAAA,SACA,WAAA,EAAa,mBAAA;AAAA;EAAA,SAGb,IAAA;EAAA,SACA,WAAA;EAAA,SACA,WAAA,EAAa,sBAAsB;AAAA;EAAA,SAGnC,IAAA;EAAA,SACA,KAAA;AAAA;EAAA,SAGA,IAAA;EAAA,SACA,WAAA;EAAA,SACA,KAAA;AAAA;AAAA,cAKF,mCAAA,GACX,aAAA,cACC,+BAAsD;AAAA,cAE5C,mBAAA,GAAuB,KAA+B,EAAxB,wBAAwB;AAAA,cAGtD,yBAAA,yBACX,KAAA,EAAO,8BAAA,CAA+B,KAAA,MACrC,0BAAA,CAA2B,KAAA;AAAA,cAwBjB,sBAAA,yBACX,KAAA,EAAO,2BAAA,CAA4B,KAAA,MAClC,MAAA,CAAO,MAAA,CAAO,0BAAA,CAA2B,KAAA;AAAA,cA2C/B,4BAAA,sIAQX,KAAA,EAAO,iCAAA,CACL,aAAA,EACA,mBAAA,EACA,sBAAA,EACA,WAAA,EACA,kBAAA,EACA,qBAAA,MAED,MAAA,CAAO,MAAA,CACR,kCAAA,CAAmC,mBAAA,EAAqB,sBAAA"}
|
package/dist/workflow-events.mjs
CHANGED
|
@@ -30,45 +30,32 @@ const writeDurableAgentEvent = (input) => Effect.gen(function* () {
|
|
|
30
30
|
});
|
|
31
31
|
return sequenced;
|
|
32
32
|
});
|
|
33
|
-
const
|
|
34
|
-
const closeFailedTerminalEventWriterResult = (error) => ({
|
|
35
|
-
_tag: "CloseFailed",
|
|
36
|
-
error
|
|
37
|
-
});
|
|
38
|
-
const committedTerminalResult = (writeResult, closeResult) => ({
|
|
33
|
+
const committedTerminalResult = (writeResult) => ({
|
|
39
34
|
_tag: "Committed",
|
|
40
|
-
writeResult
|
|
41
|
-
closeResult
|
|
35
|
+
writeResult
|
|
42
36
|
});
|
|
43
|
-
const commitFailedTerminalResult = (commitError, writeResult
|
|
37
|
+
const commitFailedTerminalResult = (commitError, writeResult) => ({
|
|
44
38
|
_tag: "CommitFailed",
|
|
45
39
|
commitError,
|
|
46
|
-
writeResult
|
|
47
|
-
closeResult
|
|
40
|
+
writeResult
|
|
48
41
|
});
|
|
49
|
-
const terminalWriteFailedResult = (error
|
|
42
|
+
const terminalWriteFailedResult = (error) => ({
|
|
50
43
|
_tag: "TerminalWriteFailed",
|
|
51
|
-
error
|
|
52
|
-
closeResult
|
|
44
|
+
error
|
|
53
45
|
});
|
|
54
|
-
const commitErrorWriteFailedResult = (commitError, error
|
|
46
|
+
const commitErrorWriteFailedResult = (commitError, error) => ({
|
|
55
47
|
_tag: "CommitErrorWriteFailed",
|
|
56
48
|
commitError,
|
|
57
|
-
error
|
|
58
|
-
closeResult
|
|
49
|
+
error
|
|
59
50
|
});
|
|
60
|
-
const closeTerminalEventWriterEffect = (close) => close.pipe(Effect.match({
|
|
61
|
-
onFailure: closeFailedTerminalEventWriterResult,
|
|
62
|
-
onSuccess: () => closedTerminalEventWriterResult()
|
|
63
|
-
}));
|
|
64
51
|
const commitThenWriteTerminalEvent = (input) => input.commit.pipe(Effect.matchEffect({
|
|
65
|
-
onFailure: (commitError) => input.writeCommitError(commitError).pipe(Effect.
|
|
66
|
-
onFailure: (error) =>
|
|
67
|
-
onSuccess: (writeResult) =>
|
|
52
|
+
onFailure: (commitError) => input.writeCommitError(commitError).pipe(Effect.match({
|
|
53
|
+
onFailure: (error) => commitErrorWriteFailedResult(commitError, error),
|
|
54
|
+
onSuccess: (writeResult) => commitFailedTerminalResult(commitError, writeResult)
|
|
68
55
|
})),
|
|
69
|
-
onSuccess: () => input.write(input.terminal).pipe(Effect.
|
|
70
|
-
onFailure: (error) =>
|
|
71
|
-
onSuccess: (writeResult) =>
|
|
56
|
+
onSuccess: () => input.write(input.terminal).pipe(Effect.match({
|
|
57
|
+
onFailure: (error) => terminalWriteFailedResult(error),
|
|
58
|
+
onSuccess: (writeResult) => committedTerminalResult(writeResult)
|
|
72
59
|
}))
|
|
73
60
|
}));
|
|
74
61
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-events.mjs","names":[],"sources":["../src/workflow-events.ts"],"sourcesContent":["import { Effect } from 'effect'\n\nexport type DurableAgentEventSequencerState = {\n readonly eventSequence: number\n}\n\nexport type DurableAgentEvent<Event extends object = object> = Event & {\n readonly eventId: string\n readonly createdAtMs?: number\n}\n\nexport type DurableAgentEventIdInput = {\n readonly streamId: string\n readonly turn: number\n readonly eventSequence: number\n}\n\nexport type SequenceDurableAgentEventInput<Event extends object = object> = {\n readonly state: DurableAgentEventSequencerState\n /**\n * Stable id namespace for one independent durable stream.\n *\n * Include the workflow/session/run id when multiple logical runs can be\n * projected in the same client. Replay-safe clients de-dupe by `eventId`, so\n * reusing a stream id across runs can drop legitimate follow-up events.\n */\n readonly streamId: string\n readonly turn: number\n readonly event: Event\n readonly createdAtMs?: number\n}\n\nexport type SequencedDurableAgentEvent<Event extends object = object> = {\n readonly event: DurableAgentEvent<Event>\n readonly eventSequence: number\n readonly nextEventSequence: number\n readonly nextState: DurableAgentEventSequencerState\n}\n\nexport type WriteDurableAgentEventInput<Event extends object = object> =\n SequenceDurableAgentEventInput<Event> & {\n readonly writer: WritableStreamDefaultWriter<Uint8Array>\n }\n\nexport type TerminalEventCloseResult =\n | { readonly _tag: 'Closed' }\n | { readonly _tag: 'CloseFailed'; readonly error: unknown }\n\nexport type CommitThenWriteTerminalEventInput<\n TerminalEvent extends object,\n TerminalWriteResult,\n CommitErrorWriteResult,\n CommitError,\n TerminalWriteError,\n CommitErrorWriteError,\n CloseError\n> = {\n readonly commit: Effect.Effect<void, CommitError>\n readonly terminal: TerminalEvent\n readonly write: (event: TerminalEvent) => Effect.Effect<TerminalWriteResult, TerminalWriteError>\n readonly writeCommitError: (\n error: unknown\n ) => Effect.Effect<CommitErrorWriteResult, CommitErrorWriteError>\n readonly close: Effect.Effect<void, CloseError>\n}\n\nexport type CommitThenWriteTerminalEventResult<TerminalWriteResult, CommitErrorWriteResult> =\n | {\n readonly _tag: 'Committed'\n readonly writeResult: TerminalWriteResult\n readonly closeResult: TerminalEventCloseResult\n }\n | {\n readonly _tag: 'CommitFailed'\n readonly commitError: unknown\n readonly writeResult: CommitErrorWriteResult\n readonly closeResult: TerminalEventCloseResult\n }\n | {\n readonly _tag: 'TerminalWriteFailed'\n readonly error: unknown\n readonly closeResult: TerminalEventCloseResult\n }\n | {\n readonly _tag: 'CommitErrorWriteFailed'\n readonly commitError: unknown\n readonly error: unknown\n readonly closeResult: TerminalEventCloseResult\n }\n\nconst textEncoder = new TextEncoder()\n\nexport const makeDurableAgentEventSequencerState = (\n eventSequence = 0\n): DurableAgentEventSequencerState => ({ eventSequence })\n\nexport const durableAgentEventId = (input: DurableAgentEventIdInput) =>\n `${input.streamId}:${input.turn}:${input.eventSequence}`\n\nexport const sequenceDurableAgentEvent = <Event extends object>(\n input: SequenceDurableAgentEventInput<Event>\n): SequencedDurableAgentEvent<Event> => {\n const eventSequence = input.state.eventSequence\n const nextEventSequence = eventSequence + 1\n const event = {\n ...input.event,\n eventId: durableAgentEventId({\n streamId: input.streamId,\n turn: input.turn,\n eventSequence\n }),\n ...(input.createdAtMs === undefined ? {} : { createdAtMs: input.createdAtMs })\n }\n\n return {\n event,\n eventSequence,\n nextEventSequence,\n nextState: makeDurableAgentEventSequencerState(nextEventSequence)\n }\n}\n\nconst encodeDurableAgentEventNdjson = <Event extends object>(event: DurableAgentEvent<Event>) =>\n textEncoder.encode(`${JSON.stringify(event)}\\n`)\n\nexport const writeDurableAgentEvent = <Event extends object>(\n input: WriteDurableAgentEventInput<Event>\n): Effect.Effect<SequencedDurableAgentEvent<Event>, unknown> =>\n Effect.gen(function* () {\n const sequenced = sequenceDurableAgentEvent(input)\n yield* Effect.tryPromise({\n try: () => input.writer.write(encodeDurableAgentEventNdjson(sequenced.event)),\n catch: cause => cause\n })\n\n return sequenced\n })\n\nconst closedTerminalEventWriterResult = (): TerminalEventCloseResult => ({ _tag: 'Closed' })\n\nconst closeFailedTerminalEventWriterResult = (error: unknown): TerminalEventCloseResult => ({\n _tag: 'CloseFailed',\n error\n})\n\nconst committedTerminalResult = <TerminalWriteResult, CommitErrorWriteResult>(\n writeResult: TerminalWriteResult,\n closeResult: TerminalEventCloseResult\n): CommitThenWriteTerminalEventResult<TerminalWriteResult, CommitErrorWriteResult> => ({\n _tag: 'Committed',\n writeResult,\n closeResult\n})\n\nconst commitFailedTerminalResult = <TerminalWriteResult, CommitErrorWriteResult>(\n commitError: unknown,\n writeResult: CommitErrorWriteResult,\n closeResult: TerminalEventCloseResult\n): CommitThenWriteTerminalEventResult<TerminalWriteResult, CommitErrorWriteResult> => ({\n _tag: 'CommitFailed',\n commitError,\n writeResult,\n closeResult\n})\n\nconst terminalWriteFailedResult = <TerminalWriteResult, CommitErrorWriteResult>(\n error: unknown,\n closeResult: TerminalEventCloseResult\n): CommitThenWriteTerminalEventResult<TerminalWriteResult, CommitErrorWriteResult> => ({\n _tag: 'TerminalWriteFailed',\n error,\n closeResult\n})\n\nconst commitErrorWriteFailedResult = <TerminalWriteResult, CommitErrorWriteResult>(\n commitError: unknown,\n error: unknown,\n closeResult: TerminalEventCloseResult\n): CommitThenWriteTerminalEventResult<TerminalWriteResult, CommitErrorWriteResult> => ({\n _tag: 'CommitErrorWriteFailed',\n commitError,\n error,\n closeResult\n})\n\nconst closeTerminalEventWriterEffect = <CloseError>(\n close: Effect.Effect<void, CloseError>\n): Effect.Effect<TerminalEventCloseResult, never> =>\n close.pipe(\n Effect.match({\n onFailure: closeFailedTerminalEventWriterResult,\n onSuccess: () => closedTerminalEventWriterResult()\n })\n )\n\nexport const commitThenWriteTerminalEvent = <\n TerminalEvent extends object,\n TerminalWriteResult,\n CommitErrorWriteResult,\n CommitError,\n TerminalWriteError,\n CommitErrorWriteError,\n CloseError\n>(\n input: CommitThenWriteTerminalEventInput<\n TerminalEvent,\n TerminalWriteResult,\n CommitErrorWriteResult,\n CommitError,\n TerminalWriteError,\n CommitErrorWriteError,\n CloseError\n >\n): Effect.Effect<\n CommitThenWriteTerminalEventResult<TerminalWriteResult, CommitErrorWriteResult>,\n never\n> =>\n input.commit.pipe(\n Effect.matchEffect({\n onFailure: commitError =>\n input.writeCommitError(commitError).pipe(\n Effect.matchEffect({\n onFailure: error =>\n closeTerminalEventWriterEffect(input.close).pipe(\n Effect.map(closeResult =>\n commitErrorWriteFailedResult<TerminalWriteResult, CommitErrorWriteResult>(\n commitError,\n error,\n closeResult\n )\n )\n ),\n onSuccess: writeResult =>\n closeTerminalEventWriterEffect(input.close).pipe(\n Effect.map(closeResult =>\n commitFailedTerminalResult<TerminalWriteResult, CommitErrorWriteResult>(\n commitError,\n writeResult,\n closeResult\n )\n )\n )\n })\n ),\n onSuccess: () =>\n input.write(input.terminal).pipe(\n Effect.matchEffect({\n onFailure: error =>\n closeTerminalEventWriterEffect(input.close).pipe(\n Effect.map(closeResult =>\n terminalWriteFailedResult<TerminalWriteResult, CommitErrorWriteResult>(\n error,\n closeResult\n )\n )\n ),\n onSuccess: writeResult =>\n closeTerminalEventWriterEffect(input.close).pipe(\n Effect.map(closeResult =>\n committedTerminalResult<TerminalWriteResult, CommitErrorWriteResult>(\n writeResult,\n closeResult\n )\n )\n )\n })\n )\n })\n )\n"],"mappings":";;AA0FA,MAAM,cAAc,IAAI,YAAY;AAEpC,MAAa,uCACX,gBAAgB,OACqB,EAAE,cAAc;AAEvD,MAAa,uBAAuB,UAClC,GAAG,MAAM,SAAS,GAAG,MAAM,KAAK,GAAG,MAAM;AAE3C,MAAa,6BACX,UACsC;CACtC,MAAM,gBAAgB,MAAM,MAAM;CAClC,MAAM,oBAAoB,gBAAgB;CAW1C,OAAO;EACL,OAAA;GAVA,GAAG,MAAM;GACT,SAAS,oBAAoB;IAC3B,UAAU,MAAM;IAChB,MAAM,MAAM;IACZ;GACF,CAAC;GACD,GAAI,MAAM,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,MAAM,YAAY;EAIxE;EACJ;EACA;EACA,WAAW,oCAAoC,iBAAiB;CAClE;AACF;AAEA,MAAM,iCAAuD,UAC3D,YAAY,OAAO,GAAG,KAAK,UAAU,KAAK,EAAE,GAAG;AAEjD,MAAa,0BACX,UAEA,OAAO,IAAI,aAAa;CACtB,MAAM,YAAY,0BAA0B,KAAK;CACjD,OAAO,OAAO,WAAW;EACvB,WAAW,MAAM,OAAO,MAAM,8BAA8B,UAAU,KAAK,CAAC;EAC5E,QAAO,UAAS;CAClB,CAAC;CAED,OAAO;AACT,CAAC;AAEH,MAAM,yCAAmE,EAAE,MAAM,SAAS;AAE1F,MAAM,wCAAwC,WAA8C;CAC1F,MAAM;CACN;AACF;AAEA,MAAM,2BACJ,aACA,iBACqF;CACrF,MAAM;CACN;CACA;AACF;AAEA,MAAM,8BACJ,aACA,aACA,iBACqF;CACrF,MAAM;CACN;CACA;CACA;AACF;AAEA,MAAM,6BACJ,OACA,iBACqF;CACrF,MAAM;CACN;CACA;AACF;AAEA,MAAM,gCACJ,aACA,OACA,iBACqF;CACrF,MAAM;CACN;CACA;CACA;AACF;AAEA,MAAM,kCACJ,UAEA,MAAM,KACJ,OAAO,MAAM;CACX,WAAW;CACX,iBAAiB,gCAAgC;AACnD,CAAC,CACH;AAEF,MAAa,gCASX,UAaA,MAAM,OAAO,KACX,OAAO,YAAY;CACjB,YAAW,gBACT,MAAM,iBAAiB,WAAW,EAAE,KAClC,OAAO,YAAY;EACjB,YAAW,UACT,+BAA+B,MAAM,KAAK,EAAE,KAC1C,OAAO,KAAI,gBACT,6BACE,aACA,OACA,WACF,CACF,CACF;EACF,YAAW,gBACT,+BAA+B,MAAM,KAAK,EAAE,KAC1C,OAAO,KAAI,gBACT,2BACE,aACA,aACA,WACF,CACF,CACF;CACJ,CAAC,CACH;CACF,iBACE,MAAM,MAAM,MAAM,QAAQ,EAAE,KAC1B,OAAO,YAAY;EACjB,YAAW,UACT,+BAA+B,MAAM,KAAK,EAAE,KAC1C,OAAO,KAAI,gBACT,0BACE,OACA,WACF,CACF,CACF;EACF,YAAW,gBACT,+BAA+B,MAAM,KAAK,EAAE,KAC1C,OAAO,KAAI,gBACT,wBACE,aACA,WACF,CACF,CACF;CACJ,CAAC,CACH;AACJ,CAAC,CACH"}
|
|
1
|
+
{"version":3,"file":"workflow-events.mjs","names":[],"sources":["../src/workflow-events.ts"],"sourcesContent":["import { Effect } from 'effect'\n\nexport type DurableAgentEventSequencerState = {\n readonly eventSequence: number\n}\n\nexport type DurableAgentEvent<Event extends object = object> = Event & {\n readonly eventId: string\n readonly createdAtMs?: number\n}\n\nexport type DurableAgentEventIdInput = {\n readonly streamId: string\n readonly turn: number\n readonly eventSequence: number\n}\n\nexport type SequenceDurableAgentEventInput<Event extends object = object> = {\n readonly state: DurableAgentEventSequencerState\n /**\n * Stable id namespace for one independent durable stream.\n *\n * Include the workflow/session/run id when multiple logical runs can be\n * projected in the same client. Replay-safe clients de-dupe by `eventId`, so\n * reusing a stream id across runs can drop legitimate follow-up events.\n */\n readonly streamId: string\n readonly turn: number\n readonly event: Event\n readonly createdAtMs?: number\n}\n\nexport type SequencedDurableAgentEvent<Event extends object = object> = {\n readonly event: DurableAgentEvent<Event>\n readonly eventSequence: number\n readonly nextEventSequence: number\n readonly nextState: DurableAgentEventSequencerState\n}\n\nexport type WriteDurableAgentEventInput<Event extends object = object> =\n SequenceDurableAgentEventInput<Event> & {\n readonly writer: WritableStreamDefaultWriter<Uint8Array>\n }\n\nexport type CommitThenWriteTerminalEventInput<\n TerminalEvent extends object,\n TerminalWriteResult,\n CommitErrorWriteResult,\n CommitError,\n TerminalWriteError,\n CommitErrorWriteError\n> = {\n readonly commit: Effect.Effect<void, CommitError>\n readonly terminal: TerminalEvent\n readonly write: (event: TerminalEvent) => Effect.Effect<TerminalWriteResult, TerminalWriteError>\n readonly writeCommitError: (\n error: unknown\n ) => Effect.Effect<CommitErrorWriteResult, CommitErrorWriteError>\n}\n\nexport type CommitThenWriteTerminalEventResult<TerminalWriteResult, CommitErrorWriteResult> =\n | {\n readonly _tag: 'Committed'\n readonly writeResult: TerminalWriteResult\n }\n | {\n readonly _tag: 'CommitFailed'\n readonly commitError: unknown\n readonly writeResult: CommitErrorWriteResult\n }\n | {\n readonly _tag: 'TerminalWriteFailed'\n readonly error: unknown\n }\n | {\n readonly _tag: 'CommitErrorWriteFailed'\n readonly commitError: unknown\n readonly error: unknown\n }\n\nconst textEncoder = new TextEncoder()\n\nexport const makeDurableAgentEventSequencerState = (\n eventSequence = 0\n): DurableAgentEventSequencerState => ({ eventSequence })\n\nexport const durableAgentEventId = (input: DurableAgentEventIdInput) =>\n `${input.streamId}:${input.turn}:${input.eventSequence}`\n\nexport const sequenceDurableAgentEvent = <Event extends object>(\n input: SequenceDurableAgentEventInput<Event>\n): SequencedDurableAgentEvent<Event> => {\n const eventSequence = input.state.eventSequence\n const nextEventSequence = eventSequence + 1\n const event = {\n ...input.event,\n eventId: durableAgentEventId({\n streamId: input.streamId,\n turn: input.turn,\n eventSequence\n }),\n ...(input.createdAtMs === undefined ? {} : { createdAtMs: input.createdAtMs })\n }\n\n return {\n event,\n eventSequence,\n nextEventSequence,\n nextState: makeDurableAgentEventSequencerState(nextEventSequence)\n }\n}\n\nconst encodeDurableAgentEventNdjson = <Event extends object>(event: DurableAgentEvent<Event>) =>\n textEncoder.encode(`${JSON.stringify(event)}\\n`)\n\nexport const writeDurableAgentEvent = <Event extends object>(\n input: WriteDurableAgentEventInput<Event>\n): Effect.Effect<SequencedDurableAgentEvent<Event>, unknown> =>\n Effect.gen(function* () {\n const sequenced = sequenceDurableAgentEvent(input)\n yield* Effect.tryPromise({\n try: () => input.writer.write(encodeDurableAgentEventNdjson(sequenced.event)),\n catch: cause => cause\n })\n\n return sequenced\n })\n\nconst committedTerminalResult = <TerminalWriteResult, CommitErrorWriteResult>(\n writeResult: TerminalWriteResult\n): CommitThenWriteTerminalEventResult<TerminalWriteResult, CommitErrorWriteResult> => ({\n _tag: 'Committed',\n writeResult\n})\n\nconst commitFailedTerminalResult = <TerminalWriteResult, CommitErrorWriteResult>(\n commitError: unknown,\n writeResult: CommitErrorWriteResult\n): CommitThenWriteTerminalEventResult<TerminalWriteResult, CommitErrorWriteResult> => ({\n _tag: 'CommitFailed',\n commitError,\n writeResult\n})\n\nconst terminalWriteFailedResult = <TerminalWriteResult, CommitErrorWriteResult>(\n error: unknown\n): CommitThenWriteTerminalEventResult<TerminalWriteResult, CommitErrorWriteResult> => ({\n _tag: 'TerminalWriteFailed',\n error\n})\n\nconst commitErrorWriteFailedResult = <TerminalWriteResult, CommitErrorWriteResult>(\n commitError: unknown,\n error: unknown\n): CommitThenWriteTerminalEventResult<TerminalWriteResult, CommitErrorWriteResult> => ({\n _tag: 'CommitErrorWriteFailed',\n commitError,\n error\n})\n\nexport const commitThenWriteTerminalEvent = <\n TerminalEvent extends object,\n TerminalWriteResult,\n CommitErrorWriteResult,\n CommitError,\n TerminalWriteError,\n CommitErrorWriteError\n>(\n input: CommitThenWriteTerminalEventInput<\n TerminalEvent,\n TerminalWriteResult,\n CommitErrorWriteResult,\n CommitError,\n TerminalWriteError,\n CommitErrorWriteError\n >\n): Effect.Effect<\n CommitThenWriteTerminalEventResult<TerminalWriteResult, CommitErrorWriteResult>,\n never\n> =>\n input.commit.pipe(\n Effect.matchEffect({\n onFailure: commitError =>\n input.writeCommitError(commitError).pipe(\n Effect.match({\n onFailure: error =>\n commitErrorWriteFailedResult<TerminalWriteResult, CommitErrorWriteResult>(\n commitError,\n error\n ),\n onSuccess: writeResult =>\n commitFailedTerminalResult<TerminalWriteResult, CommitErrorWriteResult>(\n commitError,\n writeResult\n )\n })\n ),\n onSuccess: () =>\n input.write(input.terminal).pipe(\n Effect.match({\n onFailure: error =>\n terminalWriteFailedResult<TerminalWriteResult, CommitErrorWriteResult>(error),\n onSuccess: writeResult =>\n committedTerminalResult<TerminalWriteResult, CommitErrorWriteResult>(writeResult)\n })\n )\n })\n )\n"],"mappings":";;AAgFA,MAAM,cAAc,IAAI,YAAY;AAEpC,MAAa,uCACX,gBAAgB,OACqB,EAAE,cAAc;AAEvD,MAAa,uBAAuB,UAClC,GAAG,MAAM,SAAS,GAAG,MAAM,KAAK,GAAG,MAAM;AAE3C,MAAa,6BACX,UACsC;CACtC,MAAM,gBAAgB,MAAM,MAAM;CAClC,MAAM,oBAAoB,gBAAgB;CAW1C,OAAO;EACL,OAAA;GAVA,GAAG,MAAM;GACT,SAAS,oBAAoB;IAC3B,UAAU,MAAM;IAChB,MAAM,MAAM;IACZ;GACF,CAAC;GACD,GAAI,MAAM,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,MAAM,YAAY;EAIxE;EACJ;EACA;EACA,WAAW,oCAAoC,iBAAiB;CAClE;AACF;AAEA,MAAM,iCAAuD,UAC3D,YAAY,OAAO,GAAG,KAAK,UAAU,KAAK,EAAE,GAAG;AAEjD,MAAa,0BACX,UAEA,OAAO,IAAI,aAAa;CACtB,MAAM,YAAY,0BAA0B,KAAK;CACjD,OAAO,OAAO,WAAW;EACvB,WAAW,MAAM,OAAO,MAAM,8BAA8B,UAAU,KAAK,CAAC;EAC5E,QAAO,UAAS;CAClB,CAAC;CAED,OAAO;AACT,CAAC;AAEH,MAAM,2BACJ,iBACqF;CACrF,MAAM;CACN;AACF;AAEA,MAAM,8BACJ,aACA,iBACqF;CACrF,MAAM;CACN;CACA;AACF;AAEA,MAAM,6BACJ,WACqF;CACrF,MAAM;CACN;AACF;AAEA,MAAM,gCACJ,aACA,WACqF;CACrF,MAAM;CACN;CACA;AACF;AAEA,MAAa,gCAQX,UAYA,MAAM,OAAO,KACX,OAAO,YAAY;CACjB,YAAW,gBACT,MAAM,iBAAiB,WAAW,EAAE,KAClC,OAAO,MAAM;EACX,YAAW,UACT,6BACE,aACA,KACF;EACF,YAAW,gBACT,2BACE,aACA,WACF;CACJ,CAAC,CACH;CACF,iBACE,MAAM,MAAM,MAAM,QAAQ,EAAE,KAC1B,OAAO,MAAM;EACX,YAAW,UACT,0BAAuE,KAAK;EAC9E,YAAW,gBACT,wBAAqE,WAAW;CACpF,CAAC,CACH;AACJ,CAAC,CACH"}
|
package/dist/workflow.d.mts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { SerializableWorkflowState, VercelAgentWorkflowAwaitingInput, VercelAgentWorkflowInput, VercelAgentWorkflowLoopConfig, VercelAgentWorkflowModelStepInput, VercelAgentWorkflowModelStepResult, VercelAgentWorkflowRunResult, VercelAgentWorkflowStepRetryPolicy, VercelAgentWorkflowToolBatchStepInput, VercelAgentWorkflowToolBatchStepResult, WorkflowStepResult, defaultMaxWorkflowTurns, noWorkflowStepRetry, retryWorkflowStep, runVercelAgentWorkflow, settleWorkflowStep } from "./workflow-loop.mjs";
|
|
2
|
-
import { CommitThenWriteTerminalEventInput, CommitThenWriteTerminalEventResult, DurableAgentEvent, DurableAgentEventIdInput, DurableAgentEventSequencerState, SequenceDurableAgentEventInput, SequencedDurableAgentEvent,
|
|
3
|
-
export { type CommitThenWriteTerminalEventInput, type CommitThenWriteTerminalEventResult, type DurableAgentEvent, type DurableAgentEventIdInput, type DurableAgentEventSequencerState, type SequenceDurableAgentEventInput, type SequencedDurableAgentEvent, type SerializableWorkflowState, type
|
|
2
|
+
import { CommitThenWriteTerminalEventInput, CommitThenWriteTerminalEventResult, DurableAgentEvent, DurableAgentEventIdInput, DurableAgentEventSequencerState, SequenceDurableAgentEventInput, SequencedDurableAgentEvent, WriteDurableAgentEventInput, commitThenWriteTerminalEvent, durableAgentEventId, makeDurableAgentEventSequencerState, sequenceDurableAgentEvent, writeDurableAgentEvent } from "./workflow-events.mjs";
|
|
3
|
+
export { type CommitThenWriteTerminalEventInput, type CommitThenWriteTerminalEventResult, type DurableAgentEvent, type DurableAgentEventIdInput, type DurableAgentEventSequencerState, type SequenceDurableAgentEventInput, type SequencedDurableAgentEvent, type SerializableWorkflowState, type VercelAgentWorkflowAwaitingInput, type VercelAgentWorkflowInput, type VercelAgentWorkflowLoopConfig, type VercelAgentWorkflowModelStepInput, type VercelAgentWorkflowModelStepResult, type VercelAgentWorkflowRunResult, type VercelAgentWorkflowStepRetryPolicy, type VercelAgentWorkflowToolBatchStepInput, type VercelAgentWorkflowToolBatchStepResult, type WorkflowStepResult, type WriteDurableAgentEventInput, commitThenWriteTerminalEvent, defaultMaxWorkflowTurns, durableAgentEventId, makeDurableAgentEventSequencerState, noWorkflowStepRetry, retryWorkflowStep, runVercelAgentWorkflow, sequenceDurableAgentEvent, settleWorkflowStep, writeDurableAgentEvent };
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
package/src/workflow-events.ts
CHANGED
|
@@ -42,18 +42,13 @@ export type WriteDurableAgentEventInput<Event extends object = object> =
|
|
|
42
42
|
readonly writer: WritableStreamDefaultWriter<Uint8Array>
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
export type TerminalEventCloseResult =
|
|
46
|
-
| { readonly _tag: 'Closed' }
|
|
47
|
-
| { readonly _tag: 'CloseFailed'; readonly error: unknown }
|
|
48
|
-
|
|
49
45
|
export type CommitThenWriteTerminalEventInput<
|
|
50
46
|
TerminalEvent extends object,
|
|
51
47
|
TerminalWriteResult,
|
|
52
48
|
CommitErrorWriteResult,
|
|
53
49
|
CommitError,
|
|
54
50
|
TerminalWriteError,
|
|
55
|
-
CommitErrorWriteError
|
|
56
|
-
CloseError
|
|
51
|
+
CommitErrorWriteError
|
|
57
52
|
> = {
|
|
58
53
|
readonly commit: Effect.Effect<void, CommitError>
|
|
59
54
|
readonly terminal: TerminalEvent
|
|
@@ -61,31 +56,26 @@ export type CommitThenWriteTerminalEventInput<
|
|
|
61
56
|
readonly writeCommitError: (
|
|
62
57
|
error: unknown
|
|
63
58
|
) => Effect.Effect<CommitErrorWriteResult, CommitErrorWriteError>
|
|
64
|
-
readonly close: Effect.Effect<void, CloseError>
|
|
65
59
|
}
|
|
66
60
|
|
|
67
61
|
export type CommitThenWriteTerminalEventResult<TerminalWriteResult, CommitErrorWriteResult> =
|
|
68
62
|
| {
|
|
69
63
|
readonly _tag: 'Committed'
|
|
70
64
|
readonly writeResult: TerminalWriteResult
|
|
71
|
-
readonly closeResult: TerminalEventCloseResult
|
|
72
65
|
}
|
|
73
66
|
| {
|
|
74
67
|
readonly _tag: 'CommitFailed'
|
|
75
68
|
readonly commitError: unknown
|
|
76
69
|
readonly writeResult: CommitErrorWriteResult
|
|
77
|
-
readonly closeResult: TerminalEventCloseResult
|
|
78
70
|
}
|
|
79
71
|
| {
|
|
80
72
|
readonly _tag: 'TerminalWriteFailed'
|
|
81
73
|
readonly error: unknown
|
|
82
|
-
readonly closeResult: TerminalEventCloseResult
|
|
83
74
|
}
|
|
84
75
|
| {
|
|
85
76
|
readonly _tag: 'CommitErrorWriteFailed'
|
|
86
77
|
readonly commitError: unknown
|
|
87
78
|
readonly error: unknown
|
|
88
|
-
readonly closeResult: TerminalEventCloseResult
|
|
89
79
|
}
|
|
90
80
|
|
|
91
81
|
const textEncoder = new TextEncoder()
|
|
@@ -136,71 +126,45 @@ export const writeDurableAgentEvent = <Event extends object>(
|
|
|
136
126
|
return sequenced
|
|
137
127
|
})
|
|
138
128
|
|
|
139
|
-
const closedTerminalEventWriterResult = (): TerminalEventCloseResult => ({ _tag: 'Closed' })
|
|
140
|
-
|
|
141
|
-
const closeFailedTerminalEventWriterResult = (error: unknown): TerminalEventCloseResult => ({
|
|
142
|
-
_tag: 'CloseFailed',
|
|
143
|
-
error
|
|
144
|
-
})
|
|
145
|
-
|
|
146
129
|
const committedTerminalResult = <TerminalWriteResult, CommitErrorWriteResult>(
|
|
147
|
-
writeResult: TerminalWriteResult
|
|
148
|
-
closeResult: TerminalEventCloseResult
|
|
130
|
+
writeResult: TerminalWriteResult
|
|
149
131
|
): CommitThenWriteTerminalEventResult<TerminalWriteResult, CommitErrorWriteResult> => ({
|
|
150
132
|
_tag: 'Committed',
|
|
151
|
-
writeResult
|
|
152
|
-
closeResult
|
|
133
|
+
writeResult
|
|
153
134
|
})
|
|
154
135
|
|
|
155
136
|
const commitFailedTerminalResult = <TerminalWriteResult, CommitErrorWriteResult>(
|
|
156
137
|
commitError: unknown,
|
|
157
|
-
writeResult: CommitErrorWriteResult
|
|
158
|
-
closeResult: TerminalEventCloseResult
|
|
138
|
+
writeResult: CommitErrorWriteResult
|
|
159
139
|
): CommitThenWriteTerminalEventResult<TerminalWriteResult, CommitErrorWriteResult> => ({
|
|
160
140
|
_tag: 'CommitFailed',
|
|
161
141
|
commitError,
|
|
162
|
-
writeResult
|
|
163
|
-
closeResult
|
|
142
|
+
writeResult
|
|
164
143
|
})
|
|
165
144
|
|
|
166
145
|
const terminalWriteFailedResult = <TerminalWriteResult, CommitErrorWriteResult>(
|
|
167
|
-
error: unknown
|
|
168
|
-
closeResult: TerminalEventCloseResult
|
|
146
|
+
error: unknown
|
|
169
147
|
): CommitThenWriteTerminalEventResult<TerminalWriteResult, CommitErrorWriteResult> => ({
|
|
170
148
|
_tag: 'TerminalWriteFailed',
|
|
171
|
-
error
|
|
172
|
-
closeResult
|
|
149
|
+
error
|
|
173
150
|
})
|
|
174
151
|
|
|
175
152
|
const commitErrorWriteFailedResult = <TerminalWriteResult, CommitErrorWriteResult>(
|
|
176
153
|
commitError: unknown,
|
|
177
|
-
error: unknown
|
|
178
|
-
closeResult: TerminalEventCloseResult
|
|
154
|
+
error: unknown
|
|
179
155
|
): CommitThenWriteTerminalEventResult<TerminalWriteResult, CommitErrorWriteResult> => ({
|
|
180
156
|
_tag: 'CommitErrorWriteFailed',
|
|
181
157
|
commitError,
|
|
182
|
-
error
|
|
183
|
-
closeResult
|
|
158
|
+
error
|
|
184
159
|
})
|
|
185
160
|
|
|
186
|
-
const closeTerminalEventWriterEffect = <CloseError>(
|
|
187
|
-
close: Effect.Effect<void, CloseError>
|
|
188
|
-
): Effect.Effect<TerminalEventCloseResult, never> =>
|
|
189
|
-
close.pipe(
|
|
190
|
-
Effect.match({
|
|
191
|
-
onFailure: closeFailedTerminalEventWriterResult,
|
|
192
|
-
onSuccess: () => closedTerminalEventWriterResult()
|
|
193
|
-
})
|
|
194
|
-
)
|
|
195
|
-
|
|
196
161
|
export const commitThenWriteTerminalEvent = <
|
|
197
162
|
TerminalEvent extends object,
|
|
198
163
|
TerminalWriteResult,
|
|
199
164
|
CommitErrorWriteResult,
|
|
200
165
|
CommitError,
|
|
201
166
|
TerminalWriteError,
|
|
202
|
-
CommitErrorWriteError
|
|
203
|
-
CloseError
|
|
167
|
+
CommitErrorWriteError
|
|
204
168
|
>(
|
|
205
169
|
input: CommitThenWriteTerminalEventInput<
|
|
206
170
|
TerminalEvent,
|
|
@@ -208,8 +172,7 @@ export const commitThenWriteTerminalEvent = <
|
|
|
208
172
|
CommitErrorWriteResult,
|
|
209
173
|
CommitError,
|
|
210
174
|
TerminalWriteError,
|
|
211
|
-
CommitErrorWriteError
|
|
212
|
-
CloseError
|
|
175
|
+
CommitErrorWriteError
|
|
213
176
|
>
|
|
214
177
|
): Effect.Effect<
|
|
215
178
|
CommitThenWriteTerminalEventResult<TerminalWriteResult, CommitErrorWriteResult>,
|
|
@@ -219,50 +182,26 @@ export const commitThenWriteTerminalEvent = <
|
|
|
219
182
|
Effect.matchEffect({
|
|
220
183
|
onFailure: commitError =>
|
|
221
184
|
input.writeCommitError(commitError).pipe(
|
|
222
|
-
Effect.
|
|
185
|
+
Effect.match({
|
|
223
186
|
onFailure: error =>
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
commitError,
|
|
228
|
-
error,
|
|
229
|
-
closeResult
|
|
230
|
-
)
|
|
231
|
-
)
|
|
187
|
+
commitErrorWriteFailedResult<TerminalWriteResult, CommitErrorWriteResult>(
|
|
188
|
+
commitError,
|
|
189
|
+
error
|
|
232
190
|
),
|
|
233
191
|
onSuccess: writeResult =>
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
commitError,
|
|
238
|
-
writeResult,
|
|
239
|
-
closeResult
|
|
240
|
-
)
|
|
241
|
-
)
|
|
192
|
+
commitFailedTerminalResult<TerminalWriteResult, CommitErrorWriteResult>(
|
|
193
|
+
commitError,
|
|
194
|
+
writeResult
|
|
242
195
|
)
|
|
243
196
|
})
|
|
244
197
|
),
|
|
245
198
|
onSuccess: () =>
|
|
246
199
|
input.write(input.terminal).pipe(
|
|
247
|
-
Effect.
|
|
200
|
+
Effect.match({
|
|
248
201
|
onFailure: error =>
|
|
249
|
-
|
|
250
|
-
Effect.map(closeResult =>
|
|
251
|
-
terminalWriteFailedResult<TerminalWriteResult, CommitErrorWriteResult>(
|
|
252
|
-
error,
|
|
253
|
-
closeResult
|
|
254
|
-
)
|
|
255
|
-
)
|
|
256
|
-
),
|
|
202
|
+
terminalWriteFailedResult<TerminalWriteResult, CommitErrorWriteResult>(error),
|
|
257
203
|
onSuccess: writeResult =>
|
|
258
|
-
|
|
259
|
-
Effect.map(closeResult =>
|
|
260
|
-
committedTerminalResult<TerminalWriteResult, CommitErrorWriteResult>(
|
|
261
|
-
writeResult,
|
|
262
|
-
closeResult
|
|
263
|
-
)
|
|
264
|
-
)
|
|
265
|
-
)
|
|
204
|
+
committedTerminalResult<TerminalWriteResult, CommitErrorWriteResult>(writeResult)
|
|
266
205
|
})
|
|
267
206
|
)
|
|
268
207
|
})
|