@mastra/inngest 0.0.0-tool-call-parts-20250630193309 → 0.0.0-transpile-packages-20250730132657
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/CHANGELOG.md +225 -3
- package/LICENSE.md +11 -42
- package/dist/_tsup-dts-rollup.d.cts +63 -16
- package/dist/_tsup-dts-rollup.d.ts +63 -16
- package/dist/index.cjs +213 -23
- package/dist/index.js +214 -24
- package/docker-compose.yaml +3 -3
- package/package.json +12 -11
- package/src/index.test.ts +1158 -218
- package/src/index.ts +274 -21
- package/vitest.config.ts +6 -0
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { randomUUID } from 'crypto';
|
|
2
2
|
import { subscribe } from '@inngest/realtime';
|
|
3
3
|
import { RuntimeContext } from '@mastra/core/di';
|
|
4
|
-
import { Tool } from '@mastra/core/tools';
|
|
4
|
+
import { ToolStream, Tool } from '@mastra/core/tools';
|
|
5
5
|
import { Run, Workflow, DefaultExecutionEngine } from '@mastra/core/workflows';
|
|
6
6
|
import { EMITTER_SYMBOL } from '@mastra/core/workflows/_constants';
|
|
7
7
|
import { serve as serve$1 } from 'inngest/hono';
|
|
@@ -10,13 +10,17 @@ import { z } from 'zod';
|
|
|
10
10
|
// src/index.ts
|
|
11
11
|
function serve({ mastra, inngest }) {
|
|
12
12
|
const wfs = mastra.getWorkflows();
|
|
13
|
-
const functions =
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
13
|
+
const functions = Array.from(
|
|
14
|
+
new Set(
|
|
15
|
+
Object.values(wfs).flatMap((wf) => {
|
|
16
|
+
if (wf instanceof InngestWorkflow) {
|
|
17
|
+
wf.__registerMastra(mastra);
|
|
18
|
+
return wf.getFunctions();
|
|
19
|
+
}
|
|
20
|
+
return [];
|
|
21
|
+
})
|
|
22
|
+
)
|
|
23
|
+
);
|
|
20
24
|
return serve$1({
|
|
21
25
|
client: inngest,
|
|
22
26
|
functions
|
|
@@ -46,8 +50,15 @@ var InngestRun = class extends Run {
|
|
|
46
50
|
while (runs?.[0]?.status !== "Completed" || runs?.[0]?.event_id !== eventId) {
|
|
47
51
|
await new Promise((resolve) => setTimeout(resolve, 1e3));
|
|
48
52
|
runs = await this.getRuns(eventId);
|
|
49
|
-
if (runs?.[0]?.status === "Failed"
|
|
53
|
+
if (runs?.[0]?.status === "Failed") {
|
|
54
|
+
console.log("run", runs?.[0]);
|
|
50
55
|
throw new Error(`Function run ${runs?.[0]?.status}`);
|
|
56
|
+
} else if (runs?.[0]?.status === "Cancelled") {
|
|
57
|
+
const snapshot = await this.#mastra?.storage?.loadWorkflowSnapshot({
|
|
58
|
+
workflowName: this.workflowId,
|
|
59
|
+
runId: this.runId
|
|
60
|
+
});
|
|
61
|
+
return { output: { result: { steps: snapshot?.context, status: "canceled" } } };
|
|
51
62
|
}
|
|
52
63
|
}
|
|
53
64
|
return runs?.[0];
|
|
@@ -58,6 +69,28 @@ var InngestRun = class extends Run {
|
|
|
58
69
|
data
|
|
59
70
|
});
|
|
60
71
|
}
|
|
72
|
+
async cancel() {
|
|
73
|
+
await this.inngest.send({
|
|
74
|
+
name: `cancel.workflow.${this.workflowId}`,
|
|
75
|
+
data: {
|
|
76
|
+
runId: this.runId
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
const snapshot = await this.#mastra?.storage?.loadWorkflowSnapshot({
|
|
80
|
+
workflowName: this.workflowId,
|
|
81
|
+
runId: this.runId
|
|
82
|
+
});
|
|
83
|
+
if (snapshot) {
|
|
84
|
+
await this.#mastra?.storage?.persistWorkflowSnapshot({
|
|
85
|
+
workflowName: this.workflowId,
|
|
86
|
+
runId: this.runId,
|
|
87
|
+
snapshot: {
|
|
88
|
+
...snapshot,
|
|
89
|
+
status: "canceled"
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
61
94
|
async start({
|
|
62
95
|
inputData
|
|
63
96
|
}) {
|
|
@@ -120,6 +153,7 @@ var InngestRun = class extends Run {
|
|
|
120
153
|
data: {
|
|
121
154
|
inputData: params.resumeData,
|
|
122
155
|
runId: this.runId,
|
|
156
|
+
workflowId: this.workflowId,
|
|
123
157
|
stepResults: snapshot?.context,
|
|
124
158
|
resume: {
|
|
125
159
|
steps,
|
|
@@ -322,8 +356,12 @@ var InngestWorkflow = class _InngestWorkflow extends Workflow {
|
|
|
322
356
|
return this.function;
|
|
323
357
|
}
|
|
324
358
|
this.function = this.inngest.createFunction(
|
|
325
|
-
|
|
326
|
-
|
|
359
|
+
{
|
|
360
|
+
id: `workflow.${this.id}`,
|
|
361
|
+
// @ts-ignore
|
|
362
|
+
retries: this.retryConfig?.attempts ?? 0,
|
|
363
|
+
cancelOn: [{ event: `cancel.workflow.${this.id}` }]
|
|
364
|
+
},
|
|
327
365
|
{ event: `workflow.${this.id}` },
|
|
328
366
|
async ({ event, step, attempt, publish }) => {
|
|
329
367
|
let { inputData, runId, resume } = event.data;
|
|
@@ -365,7 +403,8 @@ var InngestWorkflow = class _InngestWorkflow extends Workflow {
|
|
|
365
403
|
retryConfig: this.retryConfig,
|
|
366
404
|
runtimeContext: new RuntimeContext(),
|
|
367
405
|
// TODO
|
|
368
|
-
resume
|
|
406
|
+
resume,
|
|
407
|
+
abortController: new AbortController()
|
|
369
408
|
});
|
|
370
409
|
return { result, runId };
|
|
371
410
|
}
|
|
@@ -409,7 +448,7 @@ function createStep(params) {
|
|
|
409
448
|
outputSchema: z.object({
|
|
410
449
|
text: z.string()
|
|
411
450
|
}),
|
|
412
|
-
execute: async ({ inputData, [EMITTER_SYMBOL]: emitter, runtimeContext }) => {
|
|
451
|
+
execute: async ({ inputData, [EMITTER_SYMBOL]: emitter, runtimeContext, abortSignal, abort }) => {
|
|
413
452
|
let streamPromise = {};
|
|
414
453
|
streamPromise.promise = new Promise((resolve, reject) => {
|
|
415
454
|
streamPromise.resolve = resolve;
|
|
@@ -429,8 +468,12 @@ function createStep(params) {
|
|
|
429
468
|
runtimeContext,
|
|
430
469
|
onFinish: (result) => {
|
|
431
470
|
streamPromise.resolve(result.text);
|
|
432
|
-
}
|
|
471
|
+
},
|
|
472
|
+
abortSignal
|
|
433
473
|
});
|
|
474
|
+
if (abortSignal.aborted) {
|
|
475
|
+
return abort();
|
|
476
|
+
}
|
|
434
477
|
for await (const chunk of fullStream) {
|
|
435
478
|
switch (chunk.type) {
|
|
436
479
|
case "text-delta":
|
|
@@ -605,7 +648,9 @@ var InngestExecutionEngine = class extends DefaultExecutionEngine {
|
|
|
605
648
|
resume,
|
|
606
649
|
prevOutput,
|
|
607
650
|
emitter,
|
|
608
|
-
|
|
651
|
+
abortController,
|
|
652
|
+
runtimeContext,
|
|
653
|
+
writableStream
|
|
609
654
|
}) {
|
|
610
655
|
return super.executeStep({
|
|
611
656
|
workflowId,
|
|
@@ -616,11 +661,132 @@ var InngestExecutionEngine = class extends DefaultExecutionEngine {
|
|
|
616
661
|
resume,
|
|
617
662
|
prevOutput,
|
|
618
663
|
emitter,
|
|
619
|
-
|
|
664
|
+
abortController,
|
|
665
|
+
runtimeContext,
|
|
666
|
+
writableStream
|
|
620
667
|
});
|
|
621
668
|
}
|
|
622
|
-
async executeSleep({ id, duration }) {
|
|
623
|
-
|
|
669
|
+
// async executeSleep({ id, duration }: { id: string; duration: number }): Promise<void> {
|
|
670
|
+
// await this.inngestStep.sleep(id, duration);
|
|
671
|
+
// }
|
|
672
|
+
async executeSleep({
|
|
673
|
+
workflowId,
|
|
674
|
+
runId,
|
|
675
|
+
entry,
|
|
676
|
+
prevOutput,
|
|
677
|
+
stepResults,
|
|
678
|
+
emitter,
|
|
679
|
+
abortController,
|
|
680
|
+
runtimeContext,
|
|
681
|
+
writableStream
|
|
682
|
+
}) {
|
|
683
|
+
let { duration, fn } = entry;
|
|
684
|
+
if (fn) {
|
|
685
|
+
const stepCallId = randomUUID();
|
|
686
|
+
duration = await this.inngestStep.run(`workflow.${workflowId}.sleep.${entry.id}`, async () => {
|
|
687
|
+
return await fn({
|
|
688
|
+
runId,
|
|
689
|
+
workflowId,
|
|
690
|
+
mastra: this.mastra,
|
|
691
|
+
runtimeContext,
|
|
692
|
+
inputData: prevOutput,
|
|
693
|
+
runCount: -1,
|
|
694
|
+
getInitData: () => stepResults?.input,
|
|
695
|
+
getStepResult: (step) => {
|
|
696
|
+
if (!step?.id) {
|
|
697
|
+
return null;
|
|
698
|
+
}
|
|
699
|
+
const result = stepResults[step.id];
|
|
700
|
+
if (result?.status === "success") {
|
|
701
|
+
return result.output;
|
|
702
|
+
}
|
|
703
|
+
return null;
|
|
704
|
+
},
|
|
705
|
+
// TODO: this function shouldn't have suspend probably?
|
|
706
|
+
suspend: async (_suspendPayload) => {
|
|
707
|
+
},
|
|
708
|
+
bail: () => {
|
|
709
|
+
},
|
|
710
|
+
abort: () => {
|
|
711
|
+
abortController?.abort();
|
|
712
|
+
},
|
|
713
|
+
[EMITTER_SYMBOL]: emitter,
|
|
714
|
+
engine: { step: this.inngestStep },
|
|
715
|
+
abortSignal: abortController?.signal,
|
|
716
|
+
writer: new ToolStream(
|
|
717
|
+
{
|
|
718
|
+
prefix: "step",
|
|
719
|
+
callId: stepCallId,
|
|
720
|
+
name: "sleep",
|
|
721
|
+
runId
|
|
722
|
+
},
|
|
723
|
+
writableStream
|
|
724
|
+
)
|
|
725
|
+
});
|
|
726
|
+
});
|
|
727
|
+
}
|
|
728
|
+
await this.inngestStep.sleep(entry.id, !duration || duration < 0 ? 0 : duration);
|
|
729
|
+
}
|
|
730
|
+
async executeSleepUntil({
|
|
731
|
+
workflowId,
|
|
732
|
+
runId,
|
|
733
|
+
entry,
|
|
734
|
+
prevOutput,
|
|
735
|
+
stepResults,
|
|
736
|
+
emitter,
|
|
737
|
+
abortController,
|
|
738
|
+
runtimeContext,
|
|
739
|
+
writableStream
|
|
740
|
+
}) {
|
|
741
|
+
let { date, fn } = entry;
|
|
742
|
+
if (fn) {
|
|
743
|
+
date = await this.inngestStep.run(`workflow.${workflowId}.sleepUntil.${entry.id}`, async () => {
|
|
744
|
+
const stepCallId = randomUUID();
|
|
745
|
+
return await fn({
|
|
746
|
+
runId,
|
|
747
|
+
workflowId,
|
|
748
|
+
mastra: this.mastra,
|
|
749
|
+
runtimeContext,
|
|
750
|
+
inputData: prevOutput,
|
|
751
|
+
runCount: -1,
|
|
752
|
+
getInitData: () => stepResults?.input,
|
|
753
|
+
getStepResult: (step) => {
|
|
754
|
+
if (!step?.id) {
|
|
755
|
+
return null;
|
|
756
|
+
}
|
|
757
|
+
const result = stepResults[step.id];
|
|
758
|
+
if (result?.status === "success") {
|
|
759
|
+
return result.output;
|
|
760
|
+
}
|
|
761
|
+
return null;
|
|
762
|
+
},
|
|
763
|
+
// TODO: this function shouldn't have suspend probably?
|
|
764
|
+
suspend: async (_suspendPayload) => {
|
|
765
|
+
},
|
|
766
|
+
bail: () => {
|
|
767
|
+
},
|
|
768
|
+
abort: () => {
|
|
769
|
+
abortController?.abort();
|
|
770
|
+
},
|
|
771
|
+
[EMITTER_SYMBOL]: emitter,
|
|
772
|
+
engine: { step: this.inngestStep },
|
|
773
|
+
abortSignal: abortController?.signal,
|
|
774
|
+
writer: new ToolStream(
|
|
775
|
+
{
|
|
776
|
+
prefix: "step",
|
|
777
|
+
callId: stepCallId,
|
|
778
|
+
name: "sleep",
|
|
779
|
+
runId
|
|
780
|
+
},
|
|
781
|
+
writableStream
|
|
782
|
+
)
|
|
783
|
+
});
|
|
784
|
+
});
|
|
785
|
+
}
|
|
786
|
+
if (!(date instanceof Date)) {
|
|
787
|
+
return;
|
|
788
|
+
}
|
|
789
|
+
await this.inngestStep.sleepUntil(entry.id, date);
|
|
624
790
|
}
|
|
625
791
|
async executeWaitForEvent({ event, timeout }) {
|
|
626
792
|
const eventData = await this.inngestStep.waitForEvent(`user-event-${event}`, {
|
|
@@ -639,7 +805,9 @@ var InngestExecutionEngine = class extends DefaultExecutionEngine {
|
|
|
639
805
|
resume,
|
|
640
806
|
prevOutput,
|
|
641
807
|
emitter,
|
|
642
|
-
|
|
808
|
+
abortController,
|
|
809
|
+
runtimeContext,
|
|
810
|
+
writableStream
|
|
643
811
|
}) {
|
|
644
812
|
const startedAt = await this.inngestStep.run(
|
|
645
813
|
`workflow.${executionContext.workflowId}.run.${executionContext.runId}.step.${step.id}.running_ev`,
|
|
@@ -670,7 +838,9 @@ var InngestExecutionEngine = class extends DefaultExecutionEngine {
|
|
|
670
838
|
type: "step-start",
|
|
671
839
|
payload: {
|
|
672
840
|
id: step.id,
|
|
673
|
-
status: "running"
|
|
841
|
+
status: "running",
|
|
842
|
+
payload: prevOutput,
|
|
843
|
+
startedAt: startedAt2
|
|
674
844
|
}
|
|
675
845
|
});
|
|
676
846
|
return startedAt2;
|
|
@@ -856,6 +1026,7 @@ var InngestExecutionEngine = class extends DefaultExecutionEngine {
|
|
|
856
1026
|
runId: executionContext.runId,
|
|
857
1027
|
mastra: this.mastra,
|
|
858
1028
|
runtimeContext,
|
|
1029
|
+
writableStream,
|
|
859
1030
|
inputData: prevOutput,
|
|
860
1031
|
resumeData: resume?.steps[0] === step.id ? resume?.resumePayload : void 0,
|
|
861
1032
|
getInitData: () => stepResults?.input,
|
|
@@ -882,7 +1053,8 @@ var InngestExecutionEngine = class extends DefaultExecutionEngine {
|
|
|
882
1053
|
[EMITTER_SYMBOL]: emitter,
|
|
883
1054
|
engine: {
|
|
884
1055
|
step: this.inngestStep
|
|
885
|
-
}
|
|
1056
|
+
},
|
|
1057
|
+
abortSignal: abortController.signal
|
|
886
1058
|
});
|
|
887
1059
|
const endedAt = Date.now();
|
|
888
1060
|
execResults = {
|
|
@@ -1013,7 +1185,9 @@ var InngestExecutionEngine = class extends DefaultExecutionEngine {
|
|
|
1013
1185
|
resume,
|
|
1014
1186
|
executionContext,
|
|
1015
1187
|
emitter,
|
|
1016
|
-
|
|
1188
|
+
abortController,
|
|
1189
|
+
runtimeContext,
|
|
1190
|
+
writableStream
|
|
1017
1191
|
}) {
|
|
1018
1192
|
let execResults;
|
|
1019
1193
|
const truthyIndexes = (await Promise.all(
|
|
@@ -1022,6 +1196,7 @@ var InngestExecutionEngine = class extends DefaultExecutionEngine {
|
|
|
1022
1196
|
try {
|
|
1023
1197
|
const result = await cond({
|
|
1024
1198
|
runId,
|
|
1199
|
+
workflowId,
|
|
1025
1200
|
mastra: this.mastra,
|
|
1026
1201
|
runtimeContext,
|
|
1027
1202
|
runCount: -1,
|
|
@@ -1042,10 +1217,23 @@ var InngestExecutionEngine = class extends DefaultExecutionEngine {
|
|
|
1042
1217
|
},
|
|
1043
1218
|
bail: () => {
|
|
1044
1219
|
},
|
|
1220
|
+
abort: () => {
|
|
1221
|
+
abortController.abort();
|
|
1222
|
+
},
|
|
1045
1223
|
[EMITTER_SYMBOL]: emitter,
|
|
1046
1224
|
engine: {
|
|
1047
1225
|
step: this.inngestStep
|
|
1048
|
-
}
|
|
1226
|
+
},
|
|
1227
|
+
abortSignal: abortController.signal,
|
|
1228
|
+
writer: new ToolStream(
|
|
1229
|
+
{
|
|
1230
|
+
prefix: "step",
|
|
1231
|
+
callId: randomUUID(),
|
|
1232
|
+
name: "conditional",
|
|
1233
|
+
runId
|
|
1234
|
+
},
|
|
1235
|
+
writableStream
|
|
1236
|
+
)
|
|
1049
1237
|
});
|
|
1050
1238
|
return result ? index : null;
|
|
1051
1239
|
} catch (e) {
|
|
@@ -1074,7 +1262,9 @@ var InngestExecutionEngine = class extends DefaultExecutionEngine {
|
|
|
1074
1262
|
executionSpan: executionContext.executionSpan
|
|
1075
1263
|
},
|
|
1076
1264
|
emitter,
|
|
1077
|
-
|
|
1265
|
+
abortController,
|
|
1266
|
+
runtimeContext,
|
|
1267
|
+
writableStream
|
|
1078
1268
|
})
|
|
1079
1269
|
)
|
|
1080
1270
|
);
|
package/docker-compose.yaml
CHANGED
|
@@ -2,9 +2,9 @@ version: '3'
|
|
|
2
2
|
|
|
3
3
|
services:
|
|
4
4
|
inngest:
|
|
5
|
-
image: inngest/inngest
|
|
6
|
-
command: inngest dev -u http://host.docker.internal:
|
|
5
|
+
image: inngest/inngest:v1.8.2
|
|
6
|
+
command: inngest dev -p 4000 -u http://host.docker.internal:4001/inngest/api --poll-interval=1
|
|
7
7
|
ports:
|
|
8
|
-
- '
|
|
8
|
+
- '4000:4000'
|
|
9
9
|
extra_hosts:
|
|
10
10
|
- 'host.docker.internal:host-gateway'
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mastra/inngest",
|
|
3
|
-
"version": "0.0.0-
|
|
3
|
+
"version": "0.0.0-transpile-packages-20250730132657",
|
|
4
4
|
"description": "Mastra Inngest integration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -21,34 +21,35 @@
|
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@inngest/realtime": "^0.3.1",
|
|
23
23
|
"@opentelemetry/api": "^1.9.0",
|
|
24
|
-
"inngest": "^3.
|
|
24
|
+
"inngest": "^3.40.0",
|
|
25
25
|
"zod": "^3.25.67"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
+
"inngest-cli": "1.8.2",
|
|
28
29
|
"@ai-sdk/openai": "^1.3.22",
|
|
29
30
|
"@hono/node-server": "^1.14.4",
|
|
30
31
|
"@microsoft/api-extractor": "^7.52.8",
|
|
31
32
|
"@types/node": "^20.19.0",
|
|
32
33
|
"ai": "^4.3.16",
|
|
33
|
-
"eslint": "^9.
|
|
34
|
+
"eslint": "^9.30.1",
|
|
34
35
|
"execa": "^9.6.0",
|
|
35
36
|
"get-port": "7.1.0",
|
|
36
|
-
"hono": "^4.8.
|
|
37
|
+
"hono": "^4.8.4",
|
|
37
38
|
"tsup": "^8.5.0",
|
|
38
39
|
"typescript": "^5.8.3",
|
|
39
|
-
"vitest": "^2.
|
|
40
|
-
"@mastra/core": "0.0.0-
|
|
41
|
-
"@mastra/libsql": "0.0.0-
|
|
42
|
-
"@
|
|
43
|
-
"@
|
|
40
|
+
"vitest": "^3.2.4",
|
|
41
|
+
"@mastra/core": "0.0.0-transpile-packages-20250730132657",
|
|
42
|
+
"@mastra/libsql": "0.0.0-transpile-packages-20250730132657",
|
|
43
|
+
"@mastra/deployer": "0.0.0-transpile-packages-20250730132657",
|
|
44
|
+
"@internal/lint": "0.0.0-transpile-packages-20250730132657"
|
|
44
45
|
},
|
|
45
46
|
"peerDependencies": {
|
|
46
|
-
"@mastra/core": "0.0.0-
|
|
47
|
+
"@mastra/core": "0.0.0-transpile-packages-20250730132657"
|
|
47
48
|
},
|
|
48
49
|
"scripts": {
|
|
49
50
|
"build": "tsup src/index.ts --format esm,cjs --experimental-dts --clean --treeshake=smallest --splitting",
|
|
50
51
|
"build:watch": "pnpm build --watch",
|
|
51
|
-
"test": "vitest run",
|
|
52
|
+
"test": "docker-compose up -d && vitest run --no-isolate --bail=1 --retry=1 && docker-compose down",
|
|
52
53
|
"lint": "eslint ."
|
|
53
54
|
}
|
|
54
55
|
}
|