@xyne/workflow-sdk 2.1.2 → 2.3.0

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.
Files changed (94) hide show
  1. package/dist/agents/agent-step.d.ts +115 -3
  2. package/dist/agents/agent-step.d.ts.map +1 -1
  3. package/dist/agents/agent-step.js +247 -85
  4. package/dist/agents/agent-step.js.map +1 -1
  5. package/dist/agents/builtin/run-code-tool.d.ts +29 -0
  6. package/dist/agents/builtin/run-code-tool.d.ts.map +1 -0
  7. package/dist/agents/builtin/run-code-tool.js +54 -0
  8. package/dist/agents/builtin/run-code-tool.js.map +1 -0
  9. package/dist/agents/index.d.ts +1 -0
  10. package/dist/agents/index.d.ts.map +1 -1
  11. package/dist/agents/index.js +1 -0
  12. package/dist/agents/index.js.map +1 -1
  13. package/dist/agents/pi-mono-runtime.d.ts +5 -6
  14. package/dist/agents/pi-mono-runtime.d.ts.map +1 -1
  15. package/dist/agents/pi-mono-runtime.js +4 -5
  16. package/dist/agents/pi-mono-runtime.js.map +1 -1
  17. package/dist/agents/tool-types.d.ts +5 -0
  18. package/dist/agents/tool-types.d.ts.map +1 -1
  19. package/dist/agents/types.d.ts +5 -1
  20. package/dist/agents/types.d.ts.map +1 -1
  21. package/dist/agents/types.js.map +1 -1
  22. package/dist/client/index.d.ts +1 -1
  23. package/dist/client/index.d.ts.map +1 -1
  24. package/dist/client/types.d.ts +23 -1
  25. package/dist/client/types.d.ts.map +1 -1
  26. package/dist/client/workflow-client.d.ts.map +1 -1
  27. package/dist/client/workflow-client.js +22 -0
  28. package/dist/client/workflow-client.js.map +1 -1
  29. package/dist/common/attachment.d.ts +31 -2
  30. package/dist/common/attachment.d.ts.map +1 -1
  31. package/dist/common/attachment.js +53 -0
  32. package/dist/common/attachment.js.map +1 -1
  33. package/dist/common/principal.d.ts +45 -0
  34. package/dist/common/principal.d.ts.map +1 -0
  35. package/dist/common/principal.js +9 -0
  36. package/dist/common/principal.js.map +1 -0
  37. package/dist/engine/config-validator.d.ts.map +1 -1
  38. package/dist/engine/config-validator.js +0 -1
  39. package/dist/engine/config-validator.js.map +1 -1
  40. package/dist/engine/workflow-executor.d.ts +8 -0
  41. package/dist/engine/workflow-executor.d.ts.map +1 -1
  42. package/dist/engine/workflow-executor.js +16 -4
  43. package/dist/engine/workflow-executor.js.map +1 -1
  44. package/dist/index.d.ts +3 -0
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +4 -0
  47. package/dist/index.js.map +1 -1
  48. package/dist/persistence/in-memory-adapter.d.ts +2 -0
  49. package/dist/persistence/in-memory-adapter.d.ts.map +1 -1
  50. package/dist/persistence/in-memory-adapter.js +3 -1
  51. package/dist/persistence/in-memory-adapter.js.map +1 -1
  52. package/dist/persistence/types.d.ts +7 -2
  53. package/dist/persistence/types.d.ts.map +1 -1
  54. package/dist/router/workflow-router.d.ts.map +1 -1
  55. package/dist/router/workflow-router.js +93 -3
  56. package/dist/router/workflow-router.js.map +1 -1
  57. package/dist/runtime/types.d.ts +7 -0
  58. package/dist/runtime/types.d.ts.map +1 -1
  59. package/dist/runtime/workflow-runtime.d.ts +26 -1
  60. package/dist/runtime/workflow-runtime.d.ts.map +1 -1
  61. package/dist/runtime/workflow-runtime.js +41 -1
  62. package/dist/runtime/workflow-runtime.js.map +1 -1
  63. package/dist/sandbox/types.d.ts +85 -0
  64. package/dist/sandbox/types.d.ts.map +1 -0
  65. package/dist/sandbox/types.js +22 -0
  66. package/dist/sandbox/types.js.map +1 -0
  67. package/dist/steps/base-step.d.ts +14 -0
  68. package/dist/steps/base-step.d.ts.map +1 -1
  69. package/dist/steps/base-step.js.map +1 -1
  70. package/dist/steps/builtin/http-request.step.d.ts +2 -2
  71. package/dist/steps/builtin/transform.step.d.ts +247 -0
  72. package/dist/steps/builtin/transform.step.d.ts.map +1 -0
  73. package/dist/steps/builtin/transform.step.js +135 -0
  74. package/dist/steps/builtin/transform.step.js.map +1 -0
  75. package/dist/testing/mock-step-context.d.ts +4 -0
  76. package/dist/testing/mock-step-context.d.ts.map +1 -1
  77. package/dist/testing/mock-step-context.js +2 -0
  78. package/dist/testing/mock-step-context.js.map +1 -1
  79. package/dist/triggers/builtin/default-manual-trigger.d.ts.map +1 -1
  80. package/dist/triggers/builtin/default-manual-trigger.js +17 -4
  81. package/dist/triggers/builtin/default-manual-trigger.js.map +1 -1
  82. package/dist/types/attachment.d.ts +23 -0
  83. package/dist/types/attachment.d.ts.map +1 -0
  84. package/dist/types/attachment.js +2 -0
  85. package/dist/types/attachment.js.map +1 -0
  86. package/dist/types/resume-payload.d.ts +34 -0
  87. package/dist/types/resume-payload.d.ts.map +1 -0
  88. package/dist/types/resume-payload.js +12 -0
  89. package/dist/types/resume-payload.js.map +1 -0
  90. package/dist/util/executable-check.d.ts +42 -0
  91. package/dist/util/executable-check.d.ts.map +1 -0
  92. package/dist/util/executable-check.js +115 -0
  93. package/dist/util/executable-check.js.map +1 -0
  94. package/package.json +1 -1
@@ -0,0 +1,247 @@
1
+ /**
2
+ * TRANSFORM step — pure data manipulation.
3
+ *
4
+ * Applies a sequence of operations to the workflow context:
5
+ * - set: write a value at a dotted path
6
+ * - rename: move a value from one path to another
7
+ * - remove: delete a value at a dotted path
8
+ * - copy: copy a value from one path to another
9
+ *
10
+ * No services, no credentials — pure deterministic logic.
11
+ */
12
+ import { z } from 'zod';
13
+ import { BaseActionStep } from '../base-step.js';
14
+ import type { StepExecutionContext } from '../base-step.js';
15
+ import { BuiltinStepType } from '../../types/known-types.js';
16
+ import type { StepCategory } from '../../types/categories.js';
17
+ export declare const TransformOpSchema: z.ZodDiscriminatedUnion<"op", [z.ZodObject<{
18
+ op: z.ZodLiteral<"set">;
19
+ path: z.ZodString;
20
+ value: z.ZodUnknown;
21
+ }, "strip", z.ZodTypeAny, {
22
+ op: "set";
23
+ path: string;
24
+ value?: unknown;
25
+ }, {
26
+ op: "set";
27
+ path: string;
28
+ value?: unknown;
29
+ }>, z.ZodObject<{
30
+ op: z.ZodLiteral<"rename">;
31
+ from: z.ZodString;
32
+ to: z.ZodString;
33
+ }, "strip", z.ZodTypeAny, {
34
+ op: "rename";
35
+ from: string;
36
+ to: string;
37
+ }, {
38
+ op: "rename";
39
+ from: string;
40
+ to: string;
41
+ }>, z.ZodObject<{
42
+ op: z.ZodLiteral<"remove">;
43
+ path: z.ZodString;
44
+ }, "strip", z.ZodTypeAny, {
45
+ op: "remove";
46
+ path: string;
47
+ }, {
48
+ op: "remove";
49
+ path: string;
50
+ }>, z.ZodObject<{
51
+ op: z.ZodLiteral<"copy">;
52
+ from: z.ZodString;
53
+ to: z.ZodString;
54
+ }, "strip", z.ZodTypeAny, {
55
+ op: "copy";
56
+ from: string;
57
+ to: string;
58
+ }, {
59
+ op: "copy";
60
+ from: string;
61
+ to: string;
62
+ }>]>;
63
+ export type TransformOp = z.infer<typeof TransformOpSchema>;
64
+ export declare const TransformStepConfigSchema: z.ZodObject<{
65
+ operations: z.ZodArray<z.ZodDiscriminatedUnion<"op", [z.ZodObject<{
66
+ op: z.ZodLiteral<"set">;
67
+ path: z.ZodString;
68
+ value: z.ZodUnknown;
69
+ }, "strip", z.ZodTypeAny, {
70
+ op: "set";
71
+ path: string;
72
+ value?: unknown;
73
+ }, {
74
+ op: "set";
75
+ path: string;
76
+ value?: unknown;
77
+ }>, z.ZodObject<{
78
+ op: z.ZodLiteral<"rename">;
79
+ from: z.ZodString;
80
+ to: z.ZodString;
81
+ }, "strip", z.ZodTypeAny, {
82
+ op: "rename";
83
+ from: string;
84
+ to: string;
85
+ }, {
86
+ op: "rename";
87
+ from: string;
88
+ to: string;
89
+ }>, z.ZodObject<{
90
+ op: z.ZodLiteral<"remove">;
91
+ path: z.ZodString;
92
+ }, "strip", z.ZodTypeAny, {
93
+ op: "remove";
94
+ path: string;
95
+ }, {
96
+ op: "remove";
97
+ path: string;
98
+ }>, z.ZodObject<{
99
+ op: z.ZodLiteral<"copy">;
100
+ from: z.ZodString;
101
+ to: z.ZodString;
102
+ }, "strip", z.ZodTypeAny, {
103
+ op: "copy";
104
+ from: string;
105
+ to: string;
106
+ }, {
107
+ op: "copy";
108
+ from: string;
109
+ to: string;
110
+ }>]>, "many">;
111
+ }, "strip", z.ZodTypeAny, {
112
+ operations: ({
113
+ op: "set";
114
+ path: string;
115
+ value?: unknown;
116
+ } | {
117
+ op: "rename";
118
+ from: string;
119
+ to: string;
120
+ } | {
121
+ op: "remove";
122
+ path: string;
123
+ } | {
124
+ op: "copy";
125
+ from: string;
126
+ to: string;
127
+ })[];
128
+ }, {
129
+ operations: ({
130
+ op: "set";
131
+ path: string;
132
+ value?: unknown;
133
+ } | {
134
+ op: "rename";
135
+ from: string;
136
+ to: string;
137
+ } | {
138
+ op: "remove";
139
+ path: string;
140
+ } | {
141
+ op: "copy";
142
+ from: string;
143
+ to: string;
144
+ })[];
145
+ }>;
146
+ export type TransformStepConfig = z.infer<typeof TransformStepConfigSchema>;
147
+ export interface TransformStepOutput extends Record<string, unknown> {
148
+ applied: number;
149
+ }
150
+ export declare class TransformStep extends BaseActionStep<typeof TransformStepConfigSchema, TransformStepOutput> {
151
+ readonly type = BuiltinStepType.TRANSFORM;
152
+ readonly name = "Transform";
153
+ readonly description = "Apply data transformations to the workflow context";
154
+ readonly configSchema: z.ZodObject<{
155
+ operations: z.ZodArray<z.ZodDiscriminatedUnion<"op", [z.ZodObject<{
156
+ op: z.ZodLiteral<"set">;
157
+ path: z.ZodString;
158
+ value: z.ZodUnknown;
159
+ }, "strip", z.ZodTypeAny, {
160
+ op: "set";
161
+ path: string;
162
+ value?: unknown;
163
+ }, {
164
+ op: "set";
165
+ path: string;
166
+ value?: unknown;
167
+ }>, z.ZodObject<{
168
+ op: z.ZodLiteral<"rename">;
169
+ from: z.ZodString;
170
+ to: z.ZodString;
171
+ }, "strip", z.ZodTypeAny, {
172
+ op: "rename";
173
+ from: string;
174
+ to: string;
175
+ }, {
176
+ op: "rename";
177
+ from: string;
178
+ to: string;
179
+ }>, z.ZodObject<{
180
+ op: z.ZodLiteral<"remove">;
181
+ path: z.ZodString;
182
+ }, "strip", z.ZodTypeAny, {
183
+ op: "remove";
184
+ path: string;
185
+ }, {
186
+ op: "remove";
187
+ path: string;
188
+ }>, z.ZodObject<{
189
+ op: z.ZodLiteral<"copy">;
190
+ from: z.ZodString;
191
+ to: z.ZodString;
192
+ }, "strip", z.ZodTypeAny, {
193
+ op: "copy";
194
+ from: string;
195
+ to: string;
196
+ }, {
197
+ op: "copy";
198
+ from: string;
199
+ to: string;
200
+ }>]>, "many">;
201
+ }, "strip", z.ZodTypeAny, {
202
+ operations: ({
203
+ op: "set";
204
+ path: string;
205
+ value?: unknown;
206
+ } | {
207
+ op: "rename";
208
+ from: string;
209
+ to: string;
210
+ } | {
211
+ op: "remove";
212
+ path: string;
213
+ } | {
214
+ op: "copy";
215
+ from: string;
216
+ to: string;
217
+ })[];
218
+ }, {
219
+ operations: ({
220
+ op: "set";
221
+ path: string;
222
+ value?: unknown;
223
+ } | {
224
+ op: "rename";
225
+ from: string;
226
+ to: string;
227
+ } | {
228
+ op: "remove";
229
+ path: string;
230
+ } | {
231
+ op: "copy";
232
+ from: string;
233
+ to: string;
234
+ })[];
235
+ }>;
236
+ readonly outputSchema: z.ZodObject<{
237
+ applied: z.ZodNumber;
238
+ }, "strip", z.ZodTypeAny, {
239
+ applied: number;
240
+ }, {
241
+ applied: number;
242
+ }>;
243
+ readonly category: StepCategory;
244
+ readonly icon = "filter";
245
+ execute(config: TransformStepConfig, ctx: StepExecutionContext): Promise<TransformStepOutput>;
246
+ }
247
+ //# sourceMappingURL=transform.step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.step.d.ts","sourceRoot":"","sources":["../../../src/steps/builtin/transform.step.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AA4B9D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAK5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAI5E,MAAM,WAAW,mBAAoB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAClE,OAAO,EAAE,MAAM,CAAC;CACjB;AA+DD,qBAAa,aAAc,SAAQ,cAAc,CAC/C,OAAO,yBAAyB,EAChC,mBAAmB,CACpB;IACC,SAAkB,IAAI,6BAA6B;IACnD,SAAkB,IAAI,eAAe;IACrC,SAAkB,WAAW,wDAAwD;IACrF,SAAkB,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAA6B;IAC3D,SAAkB,YAAY;;;;;;OAA6B;IAC3D,SAAkB,QAAQ,EAAE,YAAY,CAAU;IAClD,SAAkB,IAAI,YAAY;IAEnB,OAAO,CACpB,MAAM,EAAE,mBAAmB,EAC3B,GAAG,EAAE,oBAAoB,GACxB,OAAO,CAAC,mBAAmB,CAAC;CAyChC"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * TRANSFORM step — pure data manipulation.
3
+ *
4
+ * Applies a sequence of operations to the workflow context:
5
+ * - set: write a value at a dotted path
6
+ * - rename: move a value from one path to another
7
+ * - remove: delete a value at a dotted path
8
+ * - copy: copy a value from one path to another
9
+ *
10
+ * No services, no credentials — pure deterministic logic.
11
+ */
12
+ import { z } from 'zod';
13
+ import { BaseActionStep } from '../base-step.js';
14
+ import { BuiltinStepType } from '../../types/known-types.js';
15
+ import { resolvePath } from '../../engine/variable-resolver.js';
16
+ // ─── Config ───
17
+ const SetOpSchema = z.object({
18
+ op: z.literal('set'),
19
+ path: z.string().min(1).describe('Dotted path where the value will be written'),
20
+ value: z.unknown().describe('Value to set at the path'),
21
+ });
22
+ const RenameOpSchema = z.object({
23
+ op: z.literal('rename'),
24
+ from: z.string().min(1).describe('Source dotted path'),
25
+ to: z.string().min(1).describe('Destination dotted path'),
26
+ });
27
+ const RemoveOpSchema = z.object({
28
+ op: z.literal('remove'),
29
+ path: z.string().min(1).describe('Dotted path to delete'),
30
+ });
31
+ const CopyOpSchema = z.object({
32
+ op: z.literal('copy'),
33
+ from: z.string().min(1).describe('Source dotted path'),
34
+ to: z.string().min(1).describe('Destination dotted path'),
35
+ });
36
+ export const TransformOpSchema = z.discriminatedUnion('op', [
37
+ SetOpSchema,
38
+ RenameOpSchema,
39
+ RemoveOpSchema,
40
+ CopyOpSchema,
41
+ ]);
42
+ export const TransformStepConfigSchema = z.object({
43
+ operations: z.array(TransformOpSchema).min(1).describe('Sequence of data transformation operations to apply'),
44
+ });
45
+ const TransformStepOutputSchema = z.object({
46
+ applied: z.number(),
47
+ });
48
+ // ─── Helpers ───
49
+ /**
50
+ * Set a value at a dotted path on a target object.
51
+ * Creates intermediate objects as needed.
52
+ */
53
+ function setAtPath(target, path, value) {
54
+ const parts = path.split('.');
55
+ let current = target;
56
+ for (let i = 0; i < parts.length - 1; i++) {
57
+ const key = parts[i];
58
+ if (current[key] === undefined ||
59
+ current[key] === null ||
60
+ typeof current[key] !== 'object') {
61
+ current[key] = {};
62
+ }
63
+ current = current[key];
64
+ }
65
+ current[parts[parts.length - 1]] = value;
66
+ }
67
+ /**
68
+ * Delete a value at a dotted path.
69
+ */
70
+ function deleteAtPath(target, path) {
71
+ const parts = path.split('.');
72
+ let current = target;
73
+ for (let i = 0; i < parts.length - 1; i++) {
74
+ const key = parts[i];
75
+ if (current[key] === undefined ||
76
+ current[key] === null ||
77
+ typeof current[key] !== 'object') {
78
+ return false;
79
+ }
80
+ current = current[key];
81
+ }
82
+ const lastKey = parts[parts.length - 1];
83
+ if (lastKey in current) {
84
+ delete current[lastKey];
85
+ return true;
86
+ }
87
+ return false;
88
+ }
89
+ // ─── Step ───
90
+ export class TransformStep extends BaseActionStep {
91
+ type = BuiltinStepType.TRANSFORM;
92
+ name = 'Transform';
93
+ description = 'Apply data transformations to the workflow context';
94
+ configSchema = TransformStepConfigSchema;
95
+ outputSchema = TransformStepOutputSchema;
96
+ category = 'data';
97
+ icon = 'filter';
98
+ async execute(config, ctx) {
99
+ let applied = 0;
100
+ // Operate on the steps record
101
+ const data = ctx.workflow.steps;
102
+ for (const op of config.operations) {
103
+ switch (op.op) {
104
+ case 'set':
105
+ setAtPath(data, op.path, op.value);
106
+ applied++;
107
+ break;
108
+ case 'rename': {
109
+ const value = resolvePath(ctx.workflow, op.from);
110
+ if (value !== undefined) {
111
+ setAtPath(data, op.to, value);
112
+ deleteAtPath(data, op.from);
113
+ applied++;
114
+ }
115
+ break;
116
+ }
117
+ case 'remove':
118
+ if (deleteAtPath(data, op.path)) {
119
+ applied++;
120
+ }
121
+ break;
122
+ case 'copy': {
123
+ const val = resolvePath(ctx.workflow, op.from);
124
+ if (val !== undefined) {
125
+ setAtPath(data, op.to, val);
126
+ applied++;
127
+ }
128
+ break;
129
+ }
130
+ }
131
+ }
132
+ return { applied };
133
+ }
134
+ }
135
+ //# sourceMappingURL=transform.step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.step.js","sourceRoot":"","sources":["../../../src/steps/builtin/transform.step.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,10 @@ interface MockStepContextOptions<TServices extends Record<string, unknown> = Rec
19
19
  emit?: (event: StepProgressEvent) => void;
20
20
  /** Prior step data — set on review-gate retry or rerunFromStep. */
21
21
  priorState?: Readonly<Record<string, unknown>>;
22
+ /** Inject a storage adapter (attachments / artifacts). */
23
+ storage?: StepExecutionContext['storage'];
24
+ /** Inject a sandbox adapter (code execution). */
25
+ sandbox?: StepExecutionContext['sandbox'];
22
26
  }
23
27
  /**
24
28
  * Create a mock StepExecutionContext for testing action steps.
@@ -1 +1 @@
1
- {"version":3,"file":"mock-step-context.d.ts","sourceRoot":"","sources":["../../src/testing/mock-step-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,2BAA2B,EAC5B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAGjE,UAAU,sBAAsB,CAC9B,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAEnE,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,iCAAiC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC;IACnD,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;IACtC,gCAAgC;IAChC,WAAW,CAAC,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAClD,oCAAoC;IACpC,UAAU,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC,CAAC;IACzD,+BAA+B;IAC/B,GAAG,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3C,8BAA8B;IAC9B,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC1C,mEAAmE;IACnE,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAChD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAEnE,OAAO,CAAC,EAAE,sBAAsB,CAAC,SAAS,CAAC,GAC1C,oBAAoB,CAAC,SAAS,CAAC,CAiCjC;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAEnE,OAAO,CAAC,EAAE,sBAAsB,CAAC,SAAS,CAAC,GAAG;IAC5C,wDAAwD;IACxD,UAAU,CAAC,EAAE,2BAA2B,CAAC,YAAY,CAAC,CAAC;CACxD,GACA,2BAA2B,CAAC,SAAS,CAAC,GAAG;IAC1C,iDAAiD;IACjD,eAAe,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAAC,OAAO,EAAE,eAAe,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;CACvG,CAaA"}
1
+ {"version":3,"file":"mock-step-context.d.ts","sourceRoot":"","sources":["../../src/testing/mock-step-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,2BAA2B,EAC5B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAGjE,UAAU,sBAAsB,CAC9B,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAEnE,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,iCAAiC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC;IACnD,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;IACtC,gCAAgC;IAChC,WAAW,CAAC,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAClD,oCAAoC;IACpC,UAAU,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC,CAAC;IACzD,+BAA+B;IAC/B,GAAG,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3C,8BAA8B;IAC9B,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC1C,mEAAmE;IACnE,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,0DAA0D;IAC1D,OAAO,CAAC,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAC1C,iDAAiD;IACjD,OAAO,CAAC,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;CAC3C;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAEnE,OAAO,CAAC,EAAE,sBAAsB,CAAC,SAAS,CAAC,GAC1C,oBAAoB,CAAC,SAAS,CAAC,CAmCjC;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAEnE,OAAO,CAAC,EAAE,sBAAsB,CAAC,SAAS,CAAC,GAAG;IAC5C,wDAAwD;IACxD,UAAU,CAAC,EAAE,2BAA2B,CAAC,YAAY,CAAC,CAAC;CACxD,GACA,2BAA2B,CAAC,SAAS,CAAC,GAAG;IAC1C,iDAAiD;IACjD,eAAe,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAAC,OAAO,EAAE,eAAe,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;CACvG,CAaA"}
@@ -22,6 +22,8 @@ export function createMockStepContext(options) {
22
22
  ...options?.runtime,
23
23
  },
24
24
  ...(options?.priorState ? { priorState: options.priorState } : {}),
25
+ ...(options?.storage ? { storage: options.storage } : {}),
26
+ ...(options?.sandbox ? { sandbox: options.sandbox } : {}),
25
27
  services: options?.services ??
26
28
  new ServiceRegistry(),
27
29
  credentials: options?.credentials ?? {},
@@ -1 +1 @@
1
- {"version":3,"file":"mock-step-context.js","sourceRoot":"","sources":["../../src/testing/mock-step-context.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAuBtD;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAGnC,OAA2C;IAE3C,MAAM,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;IACtB,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAE1C,OAAO;QACL,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE;QAClD,OAAO,EAAE;YACP,WAAW,EAAE,WAAW;YACxB,MAAM,EAAE,cAAc;YACtB,QAAQ,EAAE,WAAW;YACrB,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,EAAE;YACX,GAAG,OAAO,EAAE,OAAO;SACpB;QACD,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,QAAQ,EACN,OAAO,EAAE,QAAQ;YAChB,IAAI,eAAe,EAA4C;QAClE,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,EAAE;QACvC,UAAU,EAAE;YACV,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACnE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,SAAS;YAC1C,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,SAAS;SACjD;QACD,KAAK,EAAE,mBAAmB,EAAE;QAC5B,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,IAAI;QAC3B,GAAG,EAAE;YACH,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,IAAI,IAAI;YAChC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,IAAI,IAAI;YAChC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,IAAI,IAAI;SACnC;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAG1C,OAGC;IAKD,MAAM,KAAK,GAAyF,EAAE,CAAC;IACvG,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/C,OAAO;QACL,GAAG,OAAO;QACV,UAAU,EACR,OAAO,EAAE,UAAU;YACnB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE;gBACnC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;YAC5C,CAAC,CAAC;QACJ,eAAe,EAAE,KAAK;KACvB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"mock-step-context.js","sourceRoot":"","sources":["../../src/testing/mock-step-context.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AA2BtD;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAGnC,OAA2C;IAE3C,MAAM,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;IACtB,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAE1C,OAAO;QACL,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE;QAClD,OAAO,EAAE;YACP,WAAW,EAAE,WAAW;YACxB,MAAM,EAAE,cAAc;YACtB,QAAQ,EAAE,WAAW;YACrB,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,EAAE;YACX,GAAG,OAAO,EAAE,OAAO;SACpB;QACD,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,QAAQ,EACN,OAAO,EAAE,QAAQ;YAChB,IAAI,eAAe,EAA4C;QAClE,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,EAAE;QACvC,UAAU,EAAE;YACV,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACnE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,SAAS;YAC1C,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,SAAS;SACjD;QACD,KAAK,EAAE,mBAAmB,EAAE;QAC5B,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,IAAI;QAC3B,GAAG,EAAE;YACH,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,IAAI,IAAI;YAChC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,IAAI,IAAI;YAChC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,IAAI,IAAI;SACnC;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAG1C,OAGC;IAKD,MAAM,KAAK,GAAyF,EAAE,CAAC;IACvG,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/C,OAAO;QACL,GAAG,OAAO;QACV,UAAU,EACR,OAAO,EAAE,UAAU;YACnB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE;gBACnC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;YAC5C,CAAC,CAAC;QACJ,eAAe,EAAE,KAAK;KACvB,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"default-manual-trigger.d.ts","sourceRoot":"","sources":["../../../src/triggers/builtin/default-manual-trigger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;EASzC,CAAC;AAEH,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAE5F,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK3C,CAAC;AAEH;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,aAAa,CAAC,OAAO,gCAAgC,CAAC;IAC9F,SAAkB,IAAI,6BAA6B;IACnD,SAAkB,IAAI,oBAAoB;IAC1C,SAAkB,WAAW,uDAAuD;IACpF,SAAkB,QAAQ,0BAA0B;IACpD,SAAkB,IAAI,YAAY;IAClC,SAAkB,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAAoC;IAClE,SAAkB,YAAY,yCAAyB;IAE9C,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQ3F;;;;;;OAMG;IACM,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAY3F"}
1
+ {"version":3,"file":"default-manual-trigger.d.ts","sourceRoot":"","sources":["../../../src/triggers/builtin/default-manual-trigger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG5D;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;EASzC,CAAC;AAEH,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAE5F,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK3C,CAAC;AAEH;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,aAAa,CAAC,OAAO,gCAAgC,CAAC;IAC9F,SAAkB,IAAI,6BAA6B;IACnD,SAAkB,IAAI,oBAAoB;IAC1C,SAAkB,WAAW,uDAAuD;IACpF,SAAkB,QAAQ,0BAA0B;IACpD,SAAkB,IAAI,YAAY;IAClC,SAAkB,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAAoC;IAClE,SAAkB,YAAY,yCAAyB;IAE9C,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQ3F;;;;;;OAMG;IACM,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CA0B3F"}
@@ -2,6 +2,7 @@ import { z } from 'zod';
2
2
  import { ManualTrigger } from '../manual-trigger.js';
3
3
  import { BuiltinTriggerType } from '../../types/known-types.js';
4
4
  import { TriggerCategory } from '../../types/categories.js';
5
+ import { ATTACHMENT_ARRAY_JSON_SCHEMA } from '../../common/attachment.js';
5
6
  /**
6
7
  * Attachments slot — declares that the manual trigger accepts file uploads
7
8
  * alongside the JSON-schema-typed fields. When present, the UI renders an
@@ -52,13 +53,25 @@ export class DefaultManualTrigger extends ManualTrigger {
52
53
  */
53
54
  resolveOutputJsonSchema(config) {
54
55
  const inputSchema = config['inputSchema'];
55
- if (inputSchema &&
56
+ const hasInputSchema = inputSchema &&
56
57
  typeof inputSchema === 'object' &&
57
58
  !Array.isArray(inputSchema) &&
58
- Object.keys(inputSchema).length > 0) {
59
- return inputSchema;
59
+ Object.keys(inputSchema).length > 0;
60
+ const base = hasInputSchema
61
+ ? { ...inputSchema }
62
+ : { type: 'object', additionalProperties: true };
63
+ // When the trigger declares an attachments slot, uploaded files land in
64
+ // `context.trigger.attachments` at runtime — so expose them in the output
65
+ // schema as an attachment[] (typed so the variable picker offers
66
+ // `{{trigger.attachments}}` to attachment-typed inputs).
67
+ if (config['attachments']) {
68
+ const props = {
69
+ ...(base['properties'] ?? {}),
70
+ attachments: ATTACHMENT_ARRAY_JSON_SCHEMA,
71
+ };
72
+ return { ...base, type: 'object', properties: props };
60
73
  }
61
- return { type: 'object', additionalProperties: true };
74
+ return base;
62
75
  }
63
76
  }
64
77
  //# sourceMappingURL=default-manual-trigger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"default-manual-trigger.js","sourceRoot":"","sources":["../../../src/triggers/builtin/default-manual-trigger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC,MAAM,CAAC;IACrD,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;SACnC,QAAQ,CAAC,sEAAsE,CAAC;IACnF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;SAC5C,QAAQ,CAAC,oBAAoB,CAAC;IACjC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;SAC7C,QAAQ,CAAC,qBAAqB,CAAC;IAClC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;SACjC,QAAQ,CAAC,qEAAqE,CAAC;CACnF,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,CAAC,MAAM,CAAC;IACvD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;SAC1C,QAAQ,CAAC,mGAAmG,CAAC;IAChH,WAAW,EAAE,8BAA8B,CAAC,QAAQ,EAAE;SACnD,QAAQ,CAAC,uGAAuG,CAAC;CACrH,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,OAAO,oBAAqB,SAAQ,aAAsD;IAC5E,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC;IACjC,IAAI,GAAG,gBAAgB,CAAC;IACxB,WAAW,GAAG,mDAAmD,CAAC;IAClE,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC;IAClC,IAAI,GAAG,QAAQ,CAAC;IAChB,YAAY,GAAG,gCAAgC,CAAC;IAChD,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAE9C,oBAAoB,CAAC,UAAmC;QAC/D,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAwD,CAAC;QAC9F,IAAI,KAAK,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;QAC5E,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;;;;OAMG;IACM,uBAAuB,CAAC,MAA+B;QAC9D,MAAM,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;QAC1C,IACE,WAAW;YACX,OAAO,WAAW,KAAK,QAAQ;YAC/B,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,WAAsC,CAAC,CAAC,MAAM,GAAG,CAAC,EAC9D,CAAC;YACD,OAAO,WAAsC,CAAC;QAChD,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC;IACxD,CAAC;CACF"}
1
+ {"version":3,"file":"default-manual-trigger.js","sourceRoot":"","sources":["../../../src/triggers/builtin/default-manual-trigger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Attachment — opaque reference to a file managed by the host's StorageAdapter.
3
+ *
4
+ * Used everywhere the framework carries a file:
5
+ * - Trigger inputs (uploaded via `POST /uploads`, attached to `context.trigger.attachments`)
6
+ * - Resume payloads (uploaded with feedback in a review-gate retry)
7
+ * - Step inputs (rerunFromStep with attachments in configOverrides)
8
+ *
9
+ * The framework never opens `data` — it's a host-defined reference (URL,
10
+ * blob ID, signed token, `mem://uuid`). Steps that need the bytes call
11
+ * `StorageAdapter.read()` via a service the host registers.
12
+ */
13
+ export interface Attachment {
14
+ /** Original filename — e.g. "contract.pdf". */
15
+ name: string;
16
+ /** MIME type — e.g. "application/pdf", "image/png". */
17
+ mimeType: string;
18
+ /** Opaque host reference. Framework treats this as a string. */
19
+ data: string;
20
+ /** Size in bytes — set by storage after upload. Useful for UI display + size budgets. */
21
+ size?: number;
22
+ }
23
+ //# sourceMappingURL=attachment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment.d.ts","sourceRoot":"","sources":["../../src/types/attachment.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,UAAU;IACzB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=attachment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment.js","sourceRoot":"","sources":["../../src/types/attachment.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * ResumePayload — the unified shape for resuming a paused execution.
3
+ *
4
+ * One contract for every pause type:
5
+ * - Mid-execution agent pauses (tool approval, input required, user interrupted)
6
+ * - Review gates (`onComplete: 'review'`)
7
+ *
8
+ * The router validates incoming bodies into this shape; persistence stores it
9
+ * verbatim; the executor and step `onResume` handlers consume it.
10
+ */
11
+ import type { Attachment } from './attachment.js';
12
+ /**
13
+ * Alias for {@link Attachment} kept for clarity at call sites that historically
14
+ * said "resume attachment". The shape is shared across the framework.
15
+ */
16
+ export type ResumeAttachment = Attachment;
17
+ /**
18
+ * What the user decided.
19
+ * - `approve`: continue from a mid-pause OR advance past a review gate
20
+ * - `retry`: re-execute the current step with `priorState` + `feedback` (review gate)
21
+ * - `abort`: cancel the execution
22
+ */
23
+ export type ResumeAction = 'approve' | 'retry' | 'abort';
24
+ /** Payload from the host when resuming a paused execution. */
25
+ export interface ResumePayload {
26
+ action: ResumeAction;
27
+ /** User-provided text input (form feedback, instruction, additional context). */
28
+ feedback?: string;
29
+ /** Files uploaded alongside the feedback. Opaque references — host resolves. */
30
+ attachments?: ResumeAttachment[];
31
+ /** Step-specific extras from custom form fields. Opaque to the framework. */
32
+ data?: Record<string, unknown>;
33
+ }
34
+ //# sourceMappingURL=resume-payload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-payload.d.ts","sourceRoot":"","sources":["../../src/types/resume-payload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAEzD,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,WAAW,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACjC,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * ResumePayload — the unified shape for resuming a paused execution.
3
+ *
4
+ * One contract for every pause type:
5
+ * - Mid-execution agent pauses (tool approval, input required, user interrupted)
6
+ * - Review gates (`onComplete: 'review'`)
7
+ *
8
+ * The router validates incoming bodies into this shape; persistence stores it
9
+ * verbatim; the executor and step `onResume` handlers consume it.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=resume-payload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-payload.js","sourceRoot":"","sources":["../../src/types/resume-payload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Executable upload safety check.
3
+ *
4
+ * Allow-by-default with a deny-list of known dangerous types — covers the
5
+ * common attack surface (native binaries, scripts that auto-run, installers,
6
+ * macro-enabled Office docs) without forcing workflow authors to enumerate
7
+ * every safe MIME type.
8
+ *
9
+ * Two checks run in parallel so spoofed MIME types alone can't bypass:
10
+ * 1. MIME type matches the deny-list
11
+ * 2. Filename extension matches the deny-list
12
+ *
13
+ * Either match blocks the upload. To accept executables (e.g. a security-
14
+ * analysis workflow that intentionally examines binaries), the host opts
15
+ * in via `RuntimeOptions.allowExecutableUploads = true`.
16
+ */
17
+ /**
18
+ * MIME types treated as executable / unsafe (lowercase — input is also
19
+ * lowercased before comparison).
20
+ */
21
+ export declare const BLOCKED_EXECUTABLE_MIME_TYPES: ReadonlySet<string>;
22
+ /**
23
+ * File extensions treated as executable / unsafe (case-insensitive, no dot).
24
+ * The check uses the LAST extension so `report.exe.txt` is treated as text
25
+ * (Windows shows the trailing extension, which is what the user actually sees).
26
+ */
27
+ export declare const BLOCKED_EXECUTABLE_EXTENSIONS: ReadonlySet<string>;
28
+ /**
29
+ * Extract the lowercase extension (no dot) from a filename, or '' if none.
30
+ * A leading dot doesn't count — `.bashrc` has no extension, not "bashrc".
31
+ */
32
+ export declare function extensionOf(name: string): string;
33
+ /**
34
+ * Returns a human-readable reason if the file should be blocked as
35
+ * executable, or `null` if it's safe.
36
+ *
37
+ * Always check both the MIME type and the filename — clients can spoof one
38
+ * but rarely both. This is defense-in-depth, not authoritative malware
39
+ * detection (run real AV at the storage layer for that).
40
+ */
41
+ export declare function isExecutable(mimeType: string, name: string): string | null;
42
+ //# sourceMappingURL=executable-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executable-check.d.ts","sourceRoot":"","sources":["../../src/util/executable-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;GAGG;AACH,eAAO,MAAM,6BAA6B,EAAE,WAAW,CAAC,MAAM,CAwC5D,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,EAAE,WAAW,CAAC,MAAM,CAmB5D,CAAC;AAEH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS1E"}