@rigkit/engine 0.2.2 → 0.2.4

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/src/types.ts CHANGED
@@ -52,18 +52,25 @@ export type CommandOptions = ExecOptions & {
52
52
  name?: string;
53
53
  };
54
54
 
55
- export type ProviderWorkspaceContext = object;
56
-
57
55
  export type LocalWorkspaceRuntime = {
58
56
  open(target: string): MaybePromise<void>;
59
57
  command?(input: LocalCommandRequest): MaybePromise<LocalCommandResult>;
60
- requestCapability?<Result = unknown>(capability: string, params: unknown): MaybePromise<Result>;
58
+ requestCapability?<Result = unknown>(
59
+ capability: string,
60
+ params: unknown,
61
+ options?: LocalHostCapabilityRequestOptions,
62
+ ): MaybePromise<Result>;
61
63
  requestCapabilitySession?<Result = unknown>(
62
64
  capability: string,
63
65
  params: unknown,
66
+ options?: LocalHostCapabilityRequestOptions,
64
67
  ): MaybePromise<HostCapabilitySession<Result>>;
65
68
  };
66
69
 
70
+ export type LocalHostCapabilityRequestOptions = {
71
+ nodePath?: string;
72
+ };
73
+
67
74
  export type HostCapabilitySession<Result = unknown> = {
68
75
  result: Result;
69
76
  closed: Promise<void>;
@@ -94,22 +101,19 @@ export type WorkflowProviderDefinition<
94
101
  ProviderId extends string = string,
95
102
  Config extends object = Record<string, unknown>,
96
103
  Runtime = unknown,
97
- WorkspaceContext extends ProviderWorkspaceContext = ProviderWorkspaceContext,
98
104
  > = {
99
105
  readonly kind: "rigkit.provider";
100
106
  readonly providerId: ProviderId;
101
107
  readonly config: ResolvableObject<Config>;
102
108
  readonly plugin?: unknown;
103
109
  readonly __runtime?: Runtime;
104
- readonly __workspaceContext?: WorkspaceContext;
105
110
  };
106
111
 
107
112
  export type DevProviderDefinition<
108
113
  ProviderId extends string = string,
109
114
  Config extends object = Record<string, unknown>,
110
115
  Runtime = unknown,
111
- WorkspaceContext extends ProviderWorkspaceContext = ProviderWorkspaceContext,
112
- > = WorkflowProviderDefinition<ProviderId, Config, Runtime, WorkspaceContext>;
116
+ > = WorkflowProviderDefinition<ProviderId, Config, Runtime>;
113
117
 
114
118
  export type LoadedProviderDefinition<
115
119
  ProviderId extends string = string,
@@ -120,18 +124,13 @@ export type LoadedProviderDefinition<
120
124
  plugin?: unknown;
121
125
  };
122
126
 
123
- export type WorkflowProviderMap = Record<string, WorkflowProviderDefinition<string, any, any, any>>;
127
+ export type WorkflowProviderMap = Record<string, WorkflowProviderDefinition<string, any, any>>;
124
128
 
125
129
  export type ProviderRuntimeOf<Provider> =
126
- Provider extends WorkflowProviderDefinition<any, any, infer Runtime, any>
130
+ Provider extends WorkflowProviderDefinition<any, any, infer Runtime>
127
131
  ? Runtime
128
132
  : never;
129
133
 
130
- export type ProviderWorkspaceContextOf<Provider> =
131
- Provider extends WorkflowProviderDefinition<any, any, any, infer WorkspaceContext extends ProviderWorkspaceContext>
132
- ? WorkspaceContext
133
- : ProviderWorkspaceContext;
134
-
135
134
  export type ProviderRuntimeMap<Providers extends WorkflowProviderMap> = {
136
135
  readonly [Key in keyof Providers]: ProviderRuntimeOf<Providers[Key]>;
137
136
  };
@@ -143,48 +142,47 @@ export type WorkflowRuntimeHelpers = {
143
142
  log(data: string, options?: { stream?: WorkflowLogStream; label?: string }): void;
144
143
  };
145
144
 
146
- export type WorkflowTaskRuntime<
147
- Providers extends WorkflowProviderMap,
148
- Context extends JsonObject,
149
- > = ProviderRuntimeMap<Providers> & {
150
- readonly providers: ProviderRuntimeMap<Providers>;
151
- readonly ctx: Readonly<Context>;
152
- readonly runtime: WorkflowRuntimeHelpers;
145
+ export const STEP_INVALIDATION_KIND = "rigkit.step.invalidate" as const;
146
+
147
+ export type WorkflowStepInvalidation<Target extends string = string> = {
148
+ readonly kind: typeof STEP_INVALIDATION_KIND;
149
+ readonly target: Target;
150
+ readonly targetNodePath: string;
153
151
  };
154
152
 
155
- export type WorkflowTaskResult = void | undefined | JsonObject;
153
+ export type WorkflowStepRuntime<
154
+ Context extends JsonObject = JsonObject,
155
+ PreviousTaskIds extends string = string,
156
+ > = WorkflowRuntimeHelpers & {
157
+ readonly ctx: Readonly<Context>;
158
+ invalidate<const Target extends PreviousTaskIds>(target: Target): WorkflowStepInvalidation<Target>;
159
+ };
156
160
 
157
- export type WorkflowTaskHandler<
158
- Providers extends WorkflowProviderMap,
159
- Context extends JsonObject,
160
- Result extends WorkflowTaskResult = WorkflowTaskResult,
161
- > = (context: WorkflowTaskRuntime<Providers, Context>) => MaybePromise<Result>;
161
+ export type WorkflowTaskContextResult<Context extends JsonObject = JsonObject> = {
162
+ readonly ctx: Context;
163
+ };
162
164
 
163
- export type WorkflowCreateRuntime<
165
+ export type WorkflowTaskRuntime<
164
166
  Providers extends WorkflowProviderMap,
165
167
  Context extends JsonObject,
168
+ PreviousTaskIds extends string = string,
166
169
  > = ProviderRuntimeMap<Providers> & {
167
- readonly ctx: Readonly<Context>;
168
- readonly name: string;
169
170
  readonly providers: ProviderRuntimeMap<Providers>;
170
- readonly local: LocalWorkspaceRuntime;
171
- readonly workflow: string;
171
+ readonly step: WorkflowStepRuntime<Context, PreviousTaskIds>;
172
172
  };
173
173
 
174
- export type WorkflowCreateResult = JsonObject;
174
+ export type WorkflowTaskResult =
175
+ | void
176
+ | undefined
177
+ | WorkflowTaskContextResult<JsonObject>
178
+ | WorkflowStepInvalidation<string>;
175
179
 
176
- export type WorkflowCreateHandler<
180
+ export type WorkflowTaskHandler<
177
181
  Providers extends WorkflowProviderMap,
178
182
  Context extends JsonObject,
179
- Result extends WorkflowCreateResult = WorkflowCreateResult,
180
- > = (context: WorkflowCreateRuntime<Providers, Context>) => MaybePromise<Result>;
181
-
182
- export type WorkflowCreateDefinition<
183
- Providers extends WorkflowProviderMap = WorkflowProviderMap,
184
- Context extends JsonObject = JsonObject,
185
- > = {
186
- readonly handler: WorkflowCreateHandler<Providers, Context, any>;
187
- };
183
+ PreviousTaskIds extends string = string,
184
+ Result extends WorkflowTaskResult = WorkflowTaskResult,
185
+ > = (context: WorkflowTaskRuntime<Providers, Context, PreviousTaskIds>) => MaybePromise<Result>;
188
186
 
189
187
  export type WorkflowInputFieldKind = "workspace" | "string" | "boolean" | "number";
190
188
 
@@ -199,9 +197,7 @@ export type WorkflowInputFieldDefinition<Value = unknown> = {
199
197
  };
200
198
 
201
199
  export type WorkflowOperationWorkspaceInput<Name extends string> = {
202
- [Key in Name]: WorkspaceRuntimeRecord & {
203
- data: Record<string, JsonValue>;
204
- };
200
+ [Key in Name]: WorkspaceRuntimeRecord;
205
201
  };
206
202
 
207
203
  export type WorkflowInputShape = Record<string, WorkflowInputFieldDefinition<any>>;
@@ -262,6 +258,7 @@ export type WorkflowOperationRuntime<
262
258
  readonly providers: ProviderRuntimeMap<Providers>;
263
259
  readonly local: LocalWorkspaceRuntime;
264
260
  readonly workflow: string;
261
+ readonly step: WorkflowStepRuntime;
265
262
  };
266
263
 
267
264
  export type WorkflowOperationResult = void | undefined | JsonValue;
@@ -272,25 +269,87 @@ export type WorkflowOperationHandler<
272
269
  Result extends WorkflowOperationResult = WorkflowOperationResult,
273
270
  > = (context: WorkflowOperationRuntime<Providers, Input>) => MaybePromise<Result>;
274
271
 
275
- export type WorkflowHostMethodRequirement = {
276
- readonly id: string;
277
- readonly modes?: readonly string[];
272
+ export type WorkflowRuntimeContext<Context extends JsonObject> = {
273
+ readonly name: string;
274
+ readonly ctx: Readonly<Context>;
278
275
  };
279
276
 
280
- export type WorkflowHostCapabilityRequirement = {
281
- readonly id: string;
282
- readonly schemaHash?: string;
277
+ export type ReadonlyWorkspaceContext<Context extends JsonObject> = {
278
+ readonly [Key in keyof Context]: Context[Key];
279
+ };
280
+
281
+ export type WorkspaceCreateRuntimeRecord = {
282
+ readonly name: string;
283
+ };
284
+
285
+ export type WorkspaceRuntimeRecord<Context extends object = JsonObject> = {
286
+ readonly name: string;
287
+ readonly ctx: Context;
288
+ };
289
+
290
+ export type WorkflowWorkspaceCreateRuntime<
291
+ Providers extends WorkflowProviderMap,
292
+ Context extends JsonObject,
293
+ > = ProviderRuntimeMap<Providers> & {
294
+ readonly workflow: WorkflowRuntimeContext<Context>;
295
+ readonly workspace: WorkspaceCreateRuntimeRecord;
296
+ readonly providers: ProviderRuntimeMap<Providers>;
297
+ readonly local: LocalWorkspaceRuntime;
298
+ readonly step: WorkflowStepRuntime;
283
299
  };
284
300
 
301
+ export type WorkflowWorkspaceCreateHandler<
302
+ Providers extends WorkflowProviderMap,
303
+ Context extends JsonObject,
304
+ Data extends JsonObject,
305
+ > = (context: WorkflowWorkspaceCreateRuntime<Providers, Context>) => MaybePromise<Data>;
306
+
307
+ export type WorkflowWorkspaceRemoveRuntime<
308
+ Providers extends WorkflowProviderMap,
309
+ Context extends JsonObject,
310
+ Data extends JsonObject,
311
+ > = ProviderRuntimeMap<Providers> & {
312
+ readonly workflow: WorkflowRuntimeContext<Context>;
313
+ readonly workspace: WorkspaceRuntimeRecord<ReadonlyWorkspaceContext<Data>>;
314
+ readonly providers: ProviderRuntimeMap<Providers>;
315
+ readonly local: LocalWorkspaceRuntime;
316
+ readonly step: WorkflowStepRuntime;
317
+ };
318
+
319
+ export type WorkflowWorkspaceRemoveHandler<
320
+ Providers extends WorkflowProviderMap,
321
+ Context extends JsonObject,
322
+ Data extends JsonObject,
323
+ > = (context: WorkflowWorkspaceRemoveRuntime<Providers, Context, Data>) => MaybePromise<void>;
324
+
325
+ export type WorkflowWorkspaceOperationRuntime<
326
+ Providers extends WorkflowProviderMap,
327
+ Context extends JsonObject,
328
+ Data extends object,
329
+ Input extends object,
330
+ > = ProviderRuntimeMap<Providers> & {
331
+ readonly workflow: WorkflowRuntimeContext<Context>;
332
+ readonly input: Readonly<Input>;
333
+ readonly workspace: WorkspaceRuntimeRecord<Data>;
334
+ readonly providers: ProviderRuntimeMap<Providers>;
335
+ readonly local: LocalWorkspaceRuntime;
336
+ readonly step: WorkflowStepRuntime;
337
+ };
338
+
339
+ export type WorkflowWorkspaceOperationHandler<
340
+ Providers extends WorkflowProviderMap,
341
+ Context extends JsonObject,
342
+ Data extends object,
343
+ Input extends object,
344
+ Result extends WorkflowOperationResult = WorkflowOperationResult,
345
+ > = (context: WorkflowWorkspaceOperationRuntime<Providers, Context, Data, Input>) => MaybePromise<Result>;
346
+
285
347
  export type WorkflowOperationOptions<
286
348
  Providers extends WorkflowProviderMap,
287
349
  Input extends object = {},
288
350
  > = {
289
351
  title?: string;
290
352
  description?: string;
291
- createsWorkspace?: boolean;
292
- requiredHostMethods?: readonly WorkflowHostMethodRequirement[];
293
- requiredHostCapabilities?: readonly WorkflowHostCapabilityRequirement[];
294
353
  input?: WorkflowOperationInputBuilder<Input> | ((workflow: WorkflowOperationInputHelpers) => WorkflowOperationInputBuilder<Input>);
295
354
  run: WorkflowOperationHandler<Providers, Input>;
296
355
  };
@@ -302,13 +361,35 @@ export type WorkflowOperationDefinition<
302
361
  readonly id: string;
303
362
  readonly title?: string;
304
363
  readonly description?: string;
305
- readonly createsWorkspace?: boolean;
306
- readonly requiredHostMethods?: readonly WorkflowHostMethodRequirement[];
307
- readonly requiredHostCapabilities?: readonly WorkflowHostCapabilityRequirement[];
308
364
  readonly input?: WorkflowOperationInputBuilder<Input>;
309
365
  readonly run: WorkflowOperationHandler<Providers, Input>;
310
366
  };
311
367
 
368
+ export type WorkflowWorkspaceOperationOptions<
369
+ Providers extends WorkflowProviderMap,
370
+ Context extends JsonObject,
371
+ Data extends object,
372
+ Input extends object = {},
373
+ > = {
374
+ title?: string;
375
+ description?: string;
376
+ input?: WorkflowOperationInputBuilder<Input> | ((workflow: WorkflowOperationInputHelpers) => WorkflowOperationInputBuilder<Input>);
377
+ run: WorkflowWorkspaceOperationHandler<Providers, Context, Data, Input>;
378
+ };
379
+
380
+ export type WorkflowWorkspaceOperationDefinition<
381
+ Providers extends WorkflowProviderMap = WorkflowProviderMap,
382
+ Context extends JsonObject = JsonObject,
383
+ Data extends object = JsonObject,
384
+ Input extends object = object,
385
+ > = {
386
+ readonly id: string;
387
+ readonly title?: string;
388
+ readonly description?: string;
389
+ readonly input?: WorkflowOperationInputBuilder<Input>;
390
+ readonly run: WorkflowWorkspaceOperationHandler<Providers, Context, Data, Input>;
391
+ };
392
+
312
393
  export type OutputSchema<Output extends JsonObject = JsonObject> =
313
394
  | { parse(value: unknown): Output }
314
395
  | {
@@ -329,8 +410,19 @@ export type OutputSchemaValue<Schema> =
329
410
  export type WorkflowTaskOptions<Output extends JsonObject = JsonObject> = {
330
411
  output?: OutputSchema<Output>;
331
412
  version?: string;
413
+ cacheTTL?: WorkflowTaskCacheTTL;
332
414
  };
333
415
 
416
+ export type WorkflowTaskCacheTTL =
417
+ | number
418
+ | string
419
+ | {
420
+ seconds?: number;
421
+ minutes?: number;
422
+ hours?: number;
423
+ days?: number;
424
+ };
425
+
334
426
  export type WorkflowNodeKind = "task" | "sequence" | "parallel";
335
427
 
336
428
  export type WorkflowDefinition<
@@ -344,29 +436,39 @@ export type WorkflowDefinition<
344
436
  sequence<InputContext extends JsonObject = {}>(name: string): WorkflowSequenceBuilder<
345
437
  Providers,
346
438
  InputContext,
347
- InputContext
439
+ InputContext,
440
+ JsonObject,
441
+ never,
442
+ never,
443
+ never
348
444
  >;
349
445
 
350
446
  task<Result extends WorkflowTaskResult>(
351
447
  name: string,
352
- handler: WorkflowTaskHandler<Providers, {}, Result>,
448
+ handler: WorkflowTaskHandler<Providers, {}, never, Result>,
353
449
  ): WorkflowTaskNode<Providers, {}, TaskReturnContext<Result>>;
354
450
 
355
- task<Schema extends OutputSchema<JsonObject>, Result extends MaybePromise<OutputSchemaValue<Schema> | void>>(
451
+ task<
452
+ Schema extends OutputSchema<JsonObject>,
453
+ Result extends MaybePromise<WorkflowTaskContextResult<OutputSchemaValue<Schema>> | WorkflowStepInvalidation<string> | void>,
454
+ >(
356
455
  name: string,
357
456
  options: WorkflowTaskOptions<OutputSchemaValue<Schema>>,
358
- handler: WorkflowTaskHandler<Providers, {}, Awaited<Result> & WorkflowTaskResult>,
457
+ handler: WorkflowTaskHandler<Providers, {}, never, Awaited<Result> & WorkflowTaskResult>,
359
458
  ): WorkflowTaskNode<Providers, {}, TaskReturnContext<Result>>;
360
459
 
361
460
  step<Result extends WorkflowTaskResult>(
362
461
  name: string,
363
- handler: WorkflowTaskHandler<Providers, {}, Result>,
462
+ handler: WorkflowTaskHandler<Providers, {}, never, Result>,
364
463
  ): WorkflowTaskNode<Providers, {}, TaskReturnContext<Result>>;
365
464
 
366
- step<Schema extends OutputSchema<JsonObject>, Result extends MaybePromise<OutputSchemaValue<Schema> | void>>(
465
+ step<
466
+ Schema extends OutputSchema<JsonObject>,
467
+ Result extends MaybePromise<WorkflowTaskContextResult<OutputSchemaValue<Schema>> | WorkflowStepInvalidation<string> | void>,
468
+ >(
367
469
  name: string,
368
470
  options: WorkflowTaskOptions<OutputSchemaValue<Schema>>,
369
- handler: WorkflowTaskHandler<Providers, {}, Awaited<Result> & WorkflowTaskResult>,
471
+ handler: WorkflowTaskHandler<Providers, {}, never, Awaited<Result> & WorkflowTaskResult>,
370
472
  ): WorkflowTaskNode<Providers, {}, TaskReturnContext<Result>>;
371
473
  };
372
474
 
@@ -389,8 +491,8 @@ export type WorkflowNodeDefinition<
389
491
  readonly name: string;
390
492
  readonly workflow: WorkflowDefinition<string, Providers>;
391
493
  readonly workspaceDefinition?: WorkflowWorkspaceDefinition<Providers, OutputContext>;
392
- readonly createDefinition?: WorkflowCreateDefinition<Providers, OutputContext>;
393
494
  readonly operations?: readonly WorkflowOperationDefinition<Providers, any>[];
495
+ readonly workspaceOperations?: readonly WorkflowWorkspaceOperationDefinition<Providers, OutputContext, any, any>[];
394
496
  readonly __providers?: Providers;
395
497
  readonly __input?: InputContext;
396
498
  readonly __output?: OutputContext;
@@ -403,42 +505,94 @@ export type WorkflowTaskNode<
403
505
  > = WorkflowNodeDefinition<Providers, InputContext, OutputContext> & {
404
506
  readonly nodeKind: "task";
405
507
  readonly options?: WorkflowTaskOptions;
406
- readonly handler: WorkflowTaskHandler<Providers, InputContext, any>;
508
+ readonly handler: WorkflowTaskHandler<Providers, InputContext, string, any>;
407
509
  };
408
510
 
409
511
  export type WorkflowSequenceBuilder<
410
512
  Providers extends WorkflowProviderMap,
411
513
  InputContext extends JsonObject,
412
514
  OutputContext extends JsonObject,
515
+ WorkspaceData extends object = JsonObject,
516
+ OperationIds extends string = never,
517
+ WorkspaceOperationIds extends string = never,
518
+ PreviousTaskIds extends string = never,
413
519
  > = WorkflowNodeDefinition<Providers, InputContext, OutputContext> & {
414
520
  readonly nodeKind: "sequence";
415
521
  readonly children: readonly WorkflowNodeDefinition<Providers, any, any>[];
416
522
 
417
- task<Result extends WorkflowTaskResult>(
418
- name: string,
419
- handler: WorkflowTaskHandler<Providers, OutputContext, Result>,
420
- ): WorkflowSequenceBuilder<Providers, InputContext, Merge<OutputContext, TaskReturnContext<Result>>>;
523
+ task<const Id extends string, Result extends WorkflowTaskResult>(
524
+ name: Id & WorkflowTaskIdConstraint<Id, PreviousTaskIds>,
525
+ handler: WorkflowTaskHandler<Providers, OutputContext, PreviousTaskIds, Result>,
526
+ ): WorkflowSequenceBuilder<
527
+ Providers,
528
+ InputContext,
529
+ TaskReturnContext<Result>,
530
+ WorkspaceData,
531
+ OperationIds,
532
+ WorkspaceOperationIds,
533
+ PreviousTaskIds | Id
534
+ >;
421
535
 
422
- task<Schema extends OutputSchema<JsonObject>, Result extends MaybePromise<OutputSchemaValue<Schema> | void>>(
423
- name: string,
536
+ task<
537
+ const Id extends string,
538
+ Schema extends OutputSchema<JsonObject>,
539
+ Result extends MaybePromise<WorkflowTaskContextResult<OutputSchemaValue<Schema>> | WorkflowStepInvalidation<string> | void>,
540
+ >(
541
+ name: Id & WorkflowTaskIdConstraint<Id, PreviousTaskIds>,
424
542
  options: WorkflowTaskOptions<OutputSchemaValue<Schema>>,
425
- handler: WorkflowTaskHandler<Providers, OutputContext, Awaited<Result> & WorkflowTaskResult>,
426
- ): WorkflowSequenceBuilder<Providers, InputContext, Merge<OutputContext, TaskReturnContext<Result>>>;
543
+ handler: WorkflowTaskHandler<Providers, OutputContext, PreviousTaskIds, Awaited<Result> & WorkflowTaskResult>,
544
+ ): WorkflowSequenceBuilder<
545
+ Providers,
546
+ InputContext,
547
+ TaskReturnContext<Result>,
548
+ WorkspaceData,
549
+ OperationIds,
550
+ WorkspaceOperationIds,
551
+ PreviousTaskIds | Id
552
+ >;
427
553
 
428
- step<Result extends WorkflowTaskResult>(
429
- name: string,
430
- handler: WorkflowTaskHandler<Providers, OutputContext, Result>,
431
- ): WorkflowSequenceBuilder<Providers, InputContext, Merge<OutputContext, TaskReturnContext<Result>>>;
554
+ step<const Id extends string, Result extends WorkflowTaskResult>(
555
+ name: Id & WorkflowTaskIdConstraint<Id, PreviousTaskIds>,
556
+ handler: WorkflowTaskHandler<Providers, OutputContext, PreviousTaskIds, Result>,
557
+ ): WorkflowSequenceBuilder<
558
+ Providers,
559
+ InputContext,
560
+ TaskReturnContext<Result>,
561
+ WorkspaceData,
562
+ OperationIds,
563
+ WorkspaceOperationIds,
564
+ PreviousTaskIds | Id
565
+ >;
432
566
 
433
- step<Schema extends OutputSchema<JsonObject>, Result extends MaybePromise<OutputSchemaValue<Schema> | void>>(
434
- name: string,
567
+ step<
568
+ const Id extends string,
569
+ Schema extends OutputSchema<JsonObject>,
570
+ Result extends MaybePromise<WorkflowTaskContextResult<OutputSchemaValue<Schema>> | WorkflowStepInvalidation<string> | void>,
571
+ >(
572
+ name: Id & WorkflowTaskIdConstraint<Id, PreviousTaskIds>,
435
573
  options: WorkflowTaskOptions<OutputSchemaValue<Schema>>,
436
- handler: WorkflowTaskHandler<Providers, OutputContext, Awaited<Result> & WorkflowTaskResult>,
437
- ): WorkflowSequenceBuilder<Providers, InputContext, Merge<OutputContext, TaskReturnContext<Result>>>;
574
+ handler: WorkflowTaskHandler<Providers, OutputContext, PreviousTaskIds, Awaited<Result> & WorkflowTaskResult>,
575
+ ): WorkflowSequenceBuilder<
576
+ Providers,
577
+ InputContext,
578
+ TaskReturnContext<Result>,
579
+ WorkspaceData,
580
+ OperationIds,
581
+ WorkspaceOperationIds,
582
+ PreviousTaskIds | Id
583
+ >;
438
584
 
439
585
  add<Node extends WorkflowNodeDefinition<Providers, any, any>>(
440
586
  node: OutputContext extends WorkflowNodeInput<Node> ? Node : never,
441
- ): WorkflowSequenceBuilder<Providers, InputContext, Merge<OutputContext, WorkflowNodeOutput<Node>>>;
587
+ ): WorkflowSequenceBuilder<
588
+ Providers,
589
+ InputContext,
590
+ WorkflowNodeOutput<Node>,
591
+ WorkspaceData,
592
+ OperationIds,
593
+ WorkspaceOperationIds,
594
+ PreviousTaskIds
595
+ >;
442
596
 
443
597
  parallel<const Branches extends Record<string, WorkflowNodeDefinition<Providers, any, any>>>(
444
598
  branches: {
@@ -446,22 +600,105 @@ export type WorkflowSequenceBuilder<
446
600
  ? Branches[Key]
447
601
  : never;
448
602
  },
449
- ): WorkflowSequenceBuilder<Providers, InputContext, Merge<OutputContext, ParallelOutput<Branches>>>;
450
-
451
- workspace(
452
- definition: WorkflowWorkspaceDefinition<Providers, OutputContext>,
453
- ): WorkflowSequenceBuilder<Providers, InputContext, OutputContext>;
603
+ ): WorkflowSequenceBuilder<
604
+ Providers,
605
+ InputContext,
606
+ Merge<OutputContext, ParallelOutput<Branches>>,
607
+ WorkspaceData,
608
+ OperationIds,
609
+ WorkspaceOperationIds,
610
+ PreviousTaskIds
611
+ >;
454
612
 
455
- create<Result extends WorkflowCreateResult>(
456
- handler: WorkflowCreateHandler<Providers, OutputContext, Result>,
457
- ): WorkflowSequenceBuilder<Providers, InputContext, OutputContext>;
613
+ workspace<Data extends JsonObject>(
614
+ definition: WorkflowWorkspaceDefinition<Providers, OutputContext, Data>,
615
+ ): WorkflowSequenceBuilder<
616
+ Providers,
617
+ InputContext,
618
+ OutputContext,
619
+ ReadonlyWorkspaceContext<Data>,
620
+ OperationIds,
621
+ WorkspaceOperationIds,
622
+ PreviousTaskIds
623
+ >;
458
624
 
459
625
  operation<const Id extends string, Input extends object = {}>(
460
- id: Id,
626
+ id: Id & WorkflowOperationIdConstraint<Id, OperationIds>,
461
627
  options: WorkflowOperationOptions<Providers, Input>,
462
- ): WorkflowSequenceBuilder<Providers, InputContext, OutputContext>;
628
+ ): WorkflowSequenceBuilder<
629
+ Providers,
630
+ InputContext,
631
+ OutputContext,
632
+ WorkspaceData,
633
+ OperationIds | Id,
634
+ WorkspaceOperationIds,
635
+ PreviousTaskIds
636
+ >;
637
+
638
+ workspaceOperation<const Id extends string, Input extends object = {}>(
639
+ id: Id & WorkflowOperationIdConstraint<Id, WorkspaceOperationIds>,
640
+ options: WorkflowWorkspaceOperationOptions<Providers, OutputContext, WorkspaceData, Input>,
641
+ ): WorkflowSequenceBuilder<
642
+ Providers,
643
+ InputContext,
644
+ OutputContext,
645
+ WorkspaceData,
646
+ OperationIds,
647
+ WorkspaceOperationIds | Id,
648
+ PreviousTaskIds
649
+ >;
463
650
  };
464
651
 
652
+ export const RESERVED_WORKFLOW_OPERATION_IDS = [
653
+ "apply",
654
+ "completion",
655
+ "create",
656
+ "doctor",
657
+ "fork",
658
+ "help",
659
+ "init",
660
+ "ls",
661
+ "plan",
662
+ "projects",
663
+ "remove",
664
+ "run",
665
+ "version",
666
+ ] as const;
667
+
668
+ export type ReservedWorkflowOperationId = typeof RESERVED_WORKFLOW_OPERATION_IDS[number];
669
+
670
+ type WorkflowOperationIdError<Message extends string> = {
671
+ readonly __rigkitOperationIdError: Message;
672
+ };
673
+
674
+ export type WorkflowOperationIdConstraint<
675
+ Id extends string,
676
+ Existing extends string,
677
+ > = string extends Id
678
+ ? unknown
679
+ : Id extends Existing
680
+ ? WorkflowOperationIdError<`Operation id "${Id}" is already defined`>
681
+ : Id extends ReservedWorkflowOperationId
682
+ ? WorkflowOperationIdError<`Operation id "${Id}" is reserved by Rigkit`>
683
+ : Id extends `${string}/${string}`
684
+ ? WorkflowOperationIdError<`Operation id "${Id}" cannot contain "/"`>
685
+ : unknown;
686
+
687
+ type WorkflowTaskIdError<Message extends string> = {
688
+ readonly __rigkitTaskIdError: Message;
689
+ };
690
+
691
+ export type WorkflowTaskIdConstraint<
692
+ Id extends string,
693
+ Existing extends string,
694
+ > = string extends Id
695
+ ? unknown
696
+ : Id extends Existing
697
+ ? WorkflowTaskIdError<`Task id "${Id}" is already defined`>
698
+ : Id extends ""
699
+ ? WorkflowTaskIdError<"Task ids must be non-empty">
700
+ : unknown;
701
+
465
702
  export type WorkflowNodeInput<Node> =
466
703
  Node extends WorkflowNodeDefinition<any, infer Input extends JsonObject, any>
467
704
  ? Input
@@ -476,13 +713,14 @@ export type ParallelOutput<Branches extends Record<string, WorkflowNodeDefinitio
476
713
  [Key in keyof Branches & string]: WorkflowNodeOutput<Branches[Key]>;
477
714
  };
478
715
 
479
- export type TaskReturnContext<Return> = Exclude<Awaited<Return>, void | undefined> extends infer Context
480
- ? [Context] extends [never]
481
- ? {}
482
- : Context extends JsonObject
483
- ? Context
484
- : never
485
- : {};
716
+ export type TaskReturnContext<Return> =
717
+ Exclude<Awaited<Return>, void | undefined | WorkflowStepInvalidation<string>> extends infer Result
718
+ ? [Result] extends [never]
719
+ ? {}
720
+ : Result extends { ctx: infer Context extends JsonObject }
721
+ ? Simplify<Context>
722
+ : never
723
+ : {};
486
724
 
487
725
  export type Merge<Left extends JsonObject, Right extends JsonObject> =
488
726
  Simplify<Omit<Left, keyof Right> & Right>;
@@ -492,42 +730,19 @@ export type Simplify<Value> = { [Key in keyof Value]: Value[Key] } & {};
492
730
  export type WorkflowWorkspaceDefinition<
493
731
  Providers extends WorkflowProviderMap = WorkflowProviderMap,
494
732
  Context extends JsonObject = JsonObject,
733
+ Data extends JsonObject = JsonObject,
495
734
  > = {
496
- source?: (ctx: Readonly<Context>) => JsonValue;
497
- cwd?: string | ((ctx: Readonly<Context>) => string | undefined);
498
- ports?: readonly number[];
499
- onCreated?: (context: WorkflowWorkspaceCreatedContext<Providers, Context>) => MaybePromise<void>;
500
- onOpen?: (context: WorkflowWorkspaceOpenContext<Providers, Context>) => MaybePromise<void>;
501
- };
502
-
503
- export type WorkflowWorkspaceCreatedContext<
504
- Providers extends WorkflowProviderMap = WorkflowProviderMap,
505
- Context extends JsonObject = JsonObject,
506
- > = WorkflowWorkspaceLifecycleContext<Providers, Context>;
507
-
508
- export type WorkflowWorkspaceOpenContext<
509
- Providers extends WorkflowProviderMap = WorkflowProviderMap,
510
- Context extends JsonObject = JsonObject,
511
- > = WorkflowWorkspaceLifecycleContext<Providers, Context>;
512
-
513
- export type WorkflowWorkspaceLifecycleContext<
514
- Providers extends WorkflowProviderMap = WorkflowProviderMap,
515
- Context extends JsonObject = JsonObject,
516
- > = {
517
- workspace: WorkspaceRuntimeRecord;
518
- ctx: Readonly<Context>;
519
- providers: ProviderRuntimeMap<Providers>;
520
- providerContext: ProviderWorkspaceContext;
521
- local: LocalWorkspaceRuntime;
735
+ create: WorkflowWorkspaceCreateHandler<Providers, Context, Data>;
736
+ remove: WorkflowWorkspaceRemoveHandler<Providers, Context, Data>;
522
737
  };
523
738
 
524
739
  export type LoadedWorkflow = {
525
740
  name: string;
526
741
  providers: Record<string, LoadedProviderDefinition>;
527
742
  root: WorkflowNodeDefinition<any, any, any>;
528
- workspace?: WorkflowWorkspaceDefinition<any, any>;
529
- create?: WorkflowCreateDefinition<any, any>;
743
+ workspace?: WorkflowWorkspaceDefinition<any, any, any>;
530
744
  operations: readonly WorkflowOperationDefinition<any, any>[];
745
+ workspaceOperations: readonly WorkflowWorkspaceOperationDefinition<any, any, any, any>[];
531
746
  };
532
747
 
533
748
  export type WorkflowPlanNode = {
@@ -554,19 +769,11 @@ export type MachinePlan = WorkflowPlan;
554
769
  export type WorkspaceRecord = {
555
770
  id: string;
556
771
  name: string;
557
- providerId: string;
558
772
  workflow: string;
559
- resourceId: string;
560
- snapshotId?: string;
561
- sourceRef: JsonValue;
562
- context: Record<string, JsonValue>;
773
+ workflowCtx: Record<string, JsonValue>;
774
+ ctx: Record<string, JsonValue>;
563
775
  createdAt: string;
564
776
  updatedAt: string;
565
- metadata: Record<string, JsonValue>;
566
- };
567
-
568
- export type WorkspaceRuntimeRecord = WorkspaceRecord & {
569
- cwd?: string;
570
777
  };
571
778
 
572
779
  export type WorkflowEvent =
@@ -597,7 +804,7 @@ export type WorkflowEvent =
597
804
  title: string;
598
805
  }
599
806
  | { type: "artifact.created"; nodePath: string; providerId: string; kind: string; ref: JsonValue }
600
- | { type: "workspace.ready"; workspaceId: string; providerId: string; resourceId: string; snapshotId?: string };
807
+ | { type: "workspace.ready"; workspaceId: string };
601
808
 
602
809
  export type DevMachineEvent = WorkflowEvent;
603
810