@eigenpal/cli 0.10.18 → 0.10.20

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 CHANGED
@@ -1,5 +1,17 @@
1
1
  # @eigenpal/cli
2
2
 
3
+ ## 0.10.20
4
+
5
+ ### Minor Changes
6
+
7
+ - 28f2e84: The bundled workflow reference now documents durable retry policies, inheritance, supported step types, and retry safety limits.
8
+
9
+ ## 0.10.19
10
+
11
+ ### Minor Changes
12
+
13
+ - b84a877: Workflow YAML reference docs now describe `action.invoke-workflow` as the single composition primitive, including inline and child execution modes.
14
+
3
15
  ## 0.10.16
4
16
 
5
17
  ### Patch Changes
package/dist/cli.js CHANGED
@@ -61939,6 +61939,123 @@ function script(${typedParams}): StepOutput {
61939
61939
  }
61940
61940
  var SCRIPT_FN_MAX_BYTES = 50000;
61941
61941
 
61942
+ // ../types/src/workflow/retry.ts
61943
+ function normalizePolicy(policy) {
61944
+ if (policy === undefined || policy === "inherit")
61945
+ return policy;
61946
+ if (policy === "automatic")
61947
+ return { mode: "automatic" };
61948
+ if (policy === "never")
61949
+ return { mode: "never" };
61950
+ return policy;
61951
+ }
61952
+ function resolveRetryPolicy(args) {
61953
+ const step = normalizePolicy(args.step);
61954
+ const workflow = normalizePolicy(args.workflow);
61955
+ let policy;
61956
+ let source;
61957
+ if (step && step !== "inherit") {
61958
+ policy = policyForCapability(step, args.capability);
61959
+ source = "step";
61960
+ } else if (workflow && workflow !== "inherit") {
61961
+ policy = policyForCapability(workflow, args.capability);
61962
+ source = "workflow";
61963
+ } else {
61964
+ policy = { mode: "never" };
61965
+ source = "step_type";
61966
+ }
61967
+ const ceilings = args.ceilings ?? { maxAttempts: 10, maxElapsedMs: 86400000 };
61968
+ if (policy.mode === "never")
61969
+ return { policy, source, capped: false };
61970
+ const maxAttempts = Math.min(policy.maxAttempts ?? 3, ceilings.maxAttempts);
61971
+ const capped = maxAttempts !== (policy.maxAttempts ?? 3);
61972
+ return {
61973
+ policy: { ...policy, maxAttempts },
61974
+ source: capped ? "tenant_ceiling" : source,
61975
+ capped
61976
+ };
61977
+ }
61978
+ function policyForCapability(policy, capability) {
61979
+ if (policy.mode === "never")
61980
+ return policy;
61981
+ if (capability.replaySafety === "never")
61982
+ return { mode: "never" };
61983
+ if (capability.hasProviderRequestRetries || capability.automaticCategories.length === 0 || capability.replaySafety === "requires-idempotency") {
61984
+ return { mode: "automatic", maxAttempts: 1 };
61985
+ }
61986
+ return policy;
61987
+ }
61988
+ var RetryCategorySchema, AutomaticRetryPolicySchema, NeverRetryPolicySchema, ResolvedRetryPolicySchema, StepRetryPolicySchema, WorkflowRetryPolicySchema, RetryPolicySourceSchema, RetryTerminalReasonSchema, ExecutionFailureSchema, RetryDecisionSchema, StepRetryCapabilitySchema;
61989
+ var init_retry = __esm(() => {
61990
+ init_zod();
61991
+ RetryCategorySchema = exports_external.enum([
61992
+ "timeout",
61993
+ "rate_limited",
61994
+ "temporarily_unavailable",
61995
+ "invalid_provider_output",
61996
+ "validation",
61997
+ "authentication",
61998
+ "authorization",
61999
+ "not_found",
62000
+ "business",
62001
+ "cancelled",
62002
+ "unknown"
62003
+ ]);
62004
+ AutomaticRetryPolicySchema = exports_external.object({
62005
+ mode: exports_external.literal("automatic"),
62006
+ maxAttempts: exports_external.number().int().min(1).max(10).optional()
62007
+ });
62008
+ NeverRetryPolicySchema = exports_external.object({
62009
+ mode: exports_external.literal("never")
62010
+ });
62011
+ ResolvedRetryPolicySchema = exports_external.discriminatedUnion("mode", [
62012
+ AutomaticRetryPolicySchema,
62013
+ NeverRetryPolicySchema
62014
+ ]);
62015
+ StepRetryPolicySchema = exports_external.union([
62016
+ exports_external.literal("inherit"),
62017
+ exports_external.literal("automatic"),
62018
+ exports_external.literal("never"),
62019
+ ResolvedRetryPolicySchema
62020
+ ]);
62021
+ WorkflowRetryPolicySchema = exports_external.union([
62022
+ exports_external.literal("automatic"),
62023
+ exports_external.literal("never"),
62024
+ ResolvedRetryPolicySchema
62025
+ ]);
62026
+ RetryPolicySourceSchema = exports_external.enum(["step", "workflow", "step_type", "tenant_ceiling"]);
62027
+ RetryTerminalReasonSchema = exports_external.enum([
62028
+ "non_retryable",
62029
+ "unsafe_to_replay",
62030
+ "cancelled",
62031
+ "attempts_exhausted",
62032
+ "elapsed_time_exhausted",
62033
+ "retry_after_exceeds_budget",
62034
+ "operator_ceiling"
62035
+ ]);
62036
+ ExecutionFailureSchema = exports_external.object({
62037
+ code: exports_external.string().min(1),
62038
+ category: RetryCategorySchema,
62039
+ message: exports_external.string(),
62040
+ transient: exports_external.boolean(),
62041
+ retryAfterMs: exports_external.number().int().nonnegative().optional(),
62042
+ httpStatus: exports_external.number().int().min(100).max(599).optional(),
62043
+ provider: exports_external.string().optional()
62044
+ });
62045
+ RetryDecisionSchema = exports_external.object({
62046
+ retry: exports_external.boolean(),
62047
+ delayMs: exports_external.number().int().nonnegative().optional(),
62048
+ nextAttemptAt: exports_external.coerce.date().optional(),
62049
+ policySource: RetryPolicySourceSchema,
62050
+ terminalReason: RetryTerminalReasonSchema.optional()
62051
+ });
62052
+ StepRetryCapabilitySchema = exports_external.object({
62053
+ replaySafety: exports_external.enum(["safe", "requires-idempotency", "never"]),
62054
+ automaticCategories: exports_external.array(RetryCategorySchema),
62055
+ hasProviderRequestRetries: exports_external.boolean().optional()
62056
+ });
62057
+ });
62058
+
61942
62059
  // ../types/src/workflow/steps.ts
61943
62060
  function parseStepType(type) {
61944
62061
  const [category, operation] = type.split(".");
@@ -61947,9 +62064,10 @@ function parseStepType(type) {
61947
62064
  function isStepCategory(type, category) {
61948
62065
  return type.startsWith(`${category}.`);
61949
62066
  }
61950
- var AI_STEP_TYPES, TRANSFORM_STEP_TYPES, ACTION_STEP_TYPES, CONTROL_STEP_TYPES, STEP_TYPES, StepTypeValue, StepTypeSchema, BaseStepSchema, AIStepSchema, TransformStepSchema, HttpMethodSchema, ActionStepSchema, WaitStepSchema, FailStepSchema, BlockStepSchemaInner, IfStepSchemaInner, SwitchCaseSchemaInner, SwitchStepSchemaInner, ParallelBranchSchemaInner, ParallelStepSchemaInner, ForeachStepSchemaInner, ParallelMapStepSchemaInner, StepSchema, BlockStepSchema, IfStepSchema, SwitchStepSchema, ParallelBranchSchema, ParallelStepSchema, ForeachStepSchema, ParallelMapStepSchema;
62067
+ var AI_STEP_TYPES, TRANSFORM_STEP_TYPES, ACTION_STEP_TYPES, CONTROL_STEP_TYPES, STEP_TYPES, StepTypeValue, StepTypeSchema, BaseStepSchema, ControlContainerBaseStepSchema, AIStepSchema, TransformStepSchema, HttpMethodSchema, ActionStepSchema, WaitStepSchema, FailStepSchema, LegacyBlockStepSchemaInner, IfStepSchemaInner, SwitchCaseSchemaInner, SwitchStepSchemaInner, ParallelBranchSchemaInner, ParallelStepSchemaInner, ForeachStepSchemaInner, ParallelMapStepSchemaInner, StepSchema, LegacyBlockStepSchema, IfStepSchema, SwitchStepSchema, ParallelBranchSchema, ParallelStepSchema, ForeachStepSchema, ParallelMapStepSchema;
61951
62068
  var init_steps = __esm(() => {
61952
62069
  init_zod();
62070
+ init_retry();
61953
62071
  AI_STEP_TYPES = [
61954
62072
  "ai.parse",
61955
62073
  "ai.extract",
@@ -61982,7 +62100,6 @@ var init_steps = __esm(() => {
61982
62100
  "control.parallel",
61983
62101
  "control.parallel_map",
61984
62102
  "control.wait",
61985
- "control.block",
61986
62103
  "control.fail"
61987
62104
  ];
61988
62105
  STEP_TYPES = [
@@ -62017,7 +62134,6 @@ var init_steps = __esm(() => {
62017
62134
  CONTROL_PARALLEL: "control.parallel",
62018
62135
  CONTROL_PARALLEL_MAP: "control.parallel_map",
62019
62136
  CONTROL_WAIT: "control.wait",
62020
- CONTROL_BLOCK: "control.block",
62021
62137
  CONTROL_FAIL: "control.fail"
62022
62138
  };
62023
62139
  StepTypeSchema = exports_external.enum(STEP_TYPES);
@@ -62027,17 +62143,19 @@ var init_steps = __esm(() => {
62027
62143
  description: exports_external.string().optional(),
62028
62144
  if: exports_external.string().optional(),
62029
62145
  timeout: exports_external.number().positive().optional(),
62146
+ retry: StepRetryPolicySchema.optional(),
62030
62147
  retries: exports_external.number().int().min(0).optional(),
62031
62148
  retryDelay: exports_external.number().positive().optional(),
62032
62149
  with: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
62033
- });
62150
+ }).strict();
62151
+ ControlContainerBaseStepSchema = BaseStepSchema.omit({ retry: true });
62034
62152
  AIStepSchema = BaseStepSchema.extend({
62035
62153
  type: exports_external.enum(AI_STEP_TYPES)
62036
62154
  });
62037
62155
  TransformStepSchema = BaseStepSchema.extend({
62038
62156
  type: exports_external.enum(TRANSFORM_STEP_TYPES)
62039
62157
  });
62040
- HttpMethodSchema = exports_external.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]);
62158
+ HttpMethodSchema = exports_external.enum(["GET", "HEAD", "POST", "PUT", "PATCH", "DELETE"]);
62041
62159
  ActionStepSchema = BaseStepSchema.extend({
62042
62160
  type: exports_external.enum(ACTION_STEP_TYPES)
62043
62161
  });
@@ -62051,12 +62169,14 @@ var init_steps = __esm(() => {
62051
62169
  statusCode: exports_external.number().int().min(400).max(599).optional(),
62052
62170
  message: exports_external.string().min(1)
62053
62171
  });
62054
- BlockStepSchemaInner = BaseStepSchema.extend({
62172
+ LegacyBlockStepSchemaInner = BaseStepSchema.extend({
62055
62173
  type: exports_external.literal("control.block"),
62174
+ retries: exports_external.number().int().min(0).optional(),
62175
+ retryDelay: exports_external.number().positive().optional(),
62056
62176
  blockName: exports_external.string().min(1),
62057
62177
  inputs: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
62058
62178
  });
62059
- IfStepSchemaInner = BaseStepSchema.extend({
62179
+ IfStepSchemaInner = ControlContainerBaseStepSchema.extend({
62060
62180
  type: exports_external.literal("control.if"),
62061
62181
  condition: exports_external.string(),
62062
62182
  then: exports_external.lazy(() => exports_external.array(StepSchema)),
@@ -62066,7 +62186,7 @@ var init_steps = __esm(() => {
62066
62186
  when: exports_external.union([exports_external.string(), exports_external.number(), exports_external.boolean()]),
62067
62187
  steps: exports_external.lazy(() => exports_external.array(StepSchema))
62068
62188
  });
62069
- SwitchStepSchemaInner = BaseStepSchema.extend({
62189
+ SwitchStepSchemaInner = ControlContainerBaseStepSchema.extend({
62070
62190
  type: exports_external.literal("control.switch"),
62071
62191
  on: exports_external.string(),
62072
62192
  cases: exports_external.array(SwitchCaseSchemaInner),
@@ -62076,18 +62196,18 @@ var init_steps = __esm(() => {
62076
62196
  name: exports_external.string().min(1),
62077
62197
  steps: exports_external.lazy(() => exports_external.array(StepSchema))
62078
62198
  });
62079
- ParallelStepSchemaInner = BaseStepSchema.extend({
62199
+ ParallelStepSchemaInner = ControlContainerBaseStepSchema.extend({
62080
62200
  type: exports_external.literal("control.parallel"),
62081
62201
  branches: exports_external.array(ParallelBranchSchemaInner)
62082
62202
  });
62083
- ForeachStepSchemaInner = BaseStepSchema.extend({
62203
+ ForeachStepSchemaInner = ControlContainerBaseStepSchema.extend({
62084
62204
  type: exports_external.literal("control.foreach"),
62085
62205
  items: exports_external.string(),
62086
62206
  as: exports_external.string(),
62087
62207
  indexAs: exports_external.string().optional(),
62088
62208
  steps: exports_external.lazy(() => exports_external.array(StepSchema))
62089
62209
  });
62090
- ParallelMapStepSchemaInner = BaseStepSchema.extend({
62210
+ ParallelMapStepSchemaInner = ControlContainerBaseStepSchema.extend({
62091
62211
  type: exports_external.literal("control.parallel_map"),
62092
62212
  items: exports_external.string(),
62093
62213
  as: exports_external.string(),
@@ -62101,14 +62221,14 @@ var init_steps = __esm(() => {
62101
62221
  ActionStepSchema,
62102
62222
  WaitStepSchema,
62103
62223
  FailStepSchema,
62104
- BlockStepSchemaInner,
62224
+ LegacyBlockStepSchemaInner,
62105
62225
  IfStepSchemaInner,
62106
62226
  SwitchStepSchemaInner,
62107
62227
  ParallelStepSchemaInner,
62108
62228
  ForeachStepSchemaInner,
62109
62229
  ParallelMapStepSchemaInner
62110
62230
  ]));
62111
- BlockStepSchema = BlockStepSchemaInner;
62231
+ LegacyBlockStepSchema = LegacyBlockStepSchemaInner;
62112
62232
  IfStepSchema = IfStepSchemaInner;
62113
62233
  SwitchStepSchema = SwitchStepSchemaInner;
62114
62234
  ParallelBranchSchema = ParallelBranchSchemaInner;
@@ -62118,6 +62238,9 @@ var init_steps = __esm(() => {
62118
62238
  });
62119
62239
 
62120
62240
  // ../types/src/workflow/step-configs.ts
62241
+ function getStepRetryCapability(stepType) {
62242
+ return STEP_RETRY_CAPABILITIES[stepType];
62243
+ }
62121
62244
  function getStepSchema(stepType) {
62122
62245
  return STEP_SCHEMAS[stepType];
62123
62246
  }
@@ -62190,7 +62313,7 @@ function isOutputSchemaUnknown(stepType) {
62190
62313
  const def = schema._def;
62191
62314
  return def?.typeName === "ZodUnknown";
62192
62315
  }
62193
- var AiParseConfigSchema, AiParseOutputSchema, AiExtractConfigSchema, AiExtractOutputSchema, AiSplitConfigSchema, AiSplitOutputSchema, AiSegmentConfigSchema, AiSegmentOutputSchema, AiClassifyConfigSchema, AiClassifyOutputSchema, TransformSetConfigSchema, TransformSetOutputSchema, TransformRemoveConfigSchema, TransformRemoveOutputSchema, TransformCombineConfigSchema, TransformCombineOutputSchema, TransformSplitConfigSchema, TransformSplitOutputSchema, TransformMergeConfigSchema, TransformMergeOutputSchema, TransformTemplateConfigSchema, TransformTemplateOutputSchema, TransformPdfEmbedConfigSchema, TransformPdfEmbedOutputSchema, TransformXlsxToJsonConfigSchema, TransformXlsxToJsonOutputSchema, TransformScriptConfigSchema, TransformScriptOutputSchema, ParsedDocPageSchema, TransformTextChunkerConfigSchema, TransformTextChunkerOutputSchema, RegexNormalizerSchema, RegexFormatSchema, REGEX_FLAGS, RegexFieldSchema, TransformRegexExtractConfigSchema, TransformRegexExtractOutputSchema, ActionHttpConfigSchema, ActionHttpOutputSchema, ActionInvokeWorkflowConfigSchema, ActionInvokeWorkflowOutputSchema, ActionWebsiteReaderConfigSchema, ActionWebsiteReaderOutputSchema, ControlIfConfigSchema, ControlIfOutputSchema, ControlSwitchConfigSchema, ControlSwitchOutputSchema, ControlForeachConfigSchema, ControlForeachOutputSchema, ControlParallelMapConfigSchema, ControlParallelMapOutputSchema, ControlParallelConfigSchema, ControlParallelOutputSchema, ControlWaitConfigSchema, ControlWaitOutputSchema, ControlBlockConfigSchema, ControlBlockOutputSchema, ControlFailConfigSchema, ControlFailOutputSchema, STEP_SCHEMAS;
62316
+ var AiParseConfigSchema, AiParseOutputSchema, AiExtractConfigSchema, AiExtractOutputSchema, AiSplitConfigSchema, AiSplitOutputSchema, AiSegmentConfigSchema, AiSegmentOutputSchema, AiClassifyConfigSchema, AiClassifyOutputSchema, TransformSetConfigSchema, TransformSetOutputSchema, TransformRemoveConfigSchema, TransformRemoveOutputSchema, TransformCombineConfigSchema, TransformCombineOutputSchema, TransformSplitConfigSchema, TransformSplitOutputSchema, TransformMergeConfigSchema, TransformMergeOutputSchema, TransformTemplateConfigSchema, TransformTemplateOutputSchema, TransformPdfEmbedConfigSchema, TransformPdfEmbedOutputSchema, TransformXlsxToJsonConfigSchema, TransformXlsxToJsonOutputSchema, TransformScriptConfigSchema, TransformScriptOutputSchema, ParsedDocPageSchema, TransformTextChunkerConfigSchema, TransformTextChunkerOutputSchema, RegexNormalizerSchema, RegexFormatSchema, REGEX_FLAGS, RegexFieldSchema, TransformRegexExtractConfigSchema, TransformRegexExtractOutputSchema, ActionHttpConfigSchema, ActionHttpOutputSchema, ActionInvokeWorkflowConfigSchema, ActionInvokeWorkflowOutputSchema, ActionWebsiteReaderConfigSchema, ActionWebsiteReaderOutputSchema, ControlIfConfigSchema, ControlIfOutputSchema, ControlSwitchConfigSchema, ControlSwitchOutputSchema, ControlForeachConfigSchema, ControlForeachOutputSchema, ControlParallelMapConfigSchema, ControlParallelMapOutputSchema, ControlParallelConfigSchema, ControlParallelOutputSchema, ControlWaitConfigSchema, ControlWaitOutputSchema, ControlFailConfigSchema, ControlFailOutputSchema, AI_RETRY_CAPABILITY, DETERMINISTIC_RETRY_CAPABILITY, CONTROL_RETRY_CAPABILITY, FILE_OUTPUT_RETRY_CAPABILITY, STEP_RETRY_CAPABILITIES, STEP_SCHEMAS;
62194
62317
  var init_step_configs = __esm(() => {
62195
62318
  init_zod();
62196
62319
  init_common();
@@ -62516,7 +62639,7 @@ var init_step_configs = __esm(() => {
62516
62639
  TransformRegexExtractOutputSchema = exports_external.record(exports_external.string(), exports_external.unknown()).describe("Field name → extracted value (or default), plus `_evidence: { [field]: { pageIndex, matchOffset, raw } }` and `_unmatched: string[]`.");
62517
62640
  ActionHttpConfigSchema = exports_external.object({
62518
62641
  url: exports_external.string().min(1, "URL is required").describe("Request URL (supports template expressions)"),
62519
- method: exports_external.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]).default("GET").optional(),
62642
+ method: exports_external.enum(["GET", "HEAD", "POST", "PUT", "PATCH", "DELETE"]).default("GET").optional(),
62520
62643
  headers: exports_external.record(exports_external.string(), exports_external.string()).optional().describe("HTTP headers"),
62521
62644
  body: exports_external.unknown().optional().describe("Request body (JSON or string)"),
62522
62645
  timeout: exports_external.number().positive().default(30000).optional().describe("Timeout in milliseconds"),
@@ -62530,11 +62653,54 @@ var init_step_configs = __esm(() => {
62530
62653
  responseCharset: exports_external.string().describe("Charset used to decode the response body (e.g. utf-8, windows-1250)")
62531
62654
  });
62532
62655
  ActionInvokeWorkflowConfigSchema = exports_external.object({
62533
- workflowId: exports_external.string().min(1, "Workflow ID is required").describe("ID of workflow to invoke"),
62656
+ workflow: exports_external.string().min(1).optional().describe("Workflow to invoke — definition name or wf_ id (tenant-scoped)"),
62657
+ workflowId: exports_external.string().min(1).optional().describe("Legacy alias for workflow when the value is a wf_ id"),
62658
+ execution: exports_external.enum(["inline", "child"]).optional().describe("inline: run target steps in this execution (default). child: spawn a separate run with lineage."),
62534
62659
  input: exports_external.record(exports_external.string(), exports_external.unknown()).optional().describe("Input record keyed by the invoked workflow's declared inputs"),
62535
- wait: exports_external.boolean().optional().describe("Wait for the invoked workflow to complete and return its output (default: true). Set false for fire-and-forget."),
62536
- timeout: exports_external.number().optional().describe("Max wait time in ms when waiting (default: 300000)"),
62537
- pollInterval: exports_external.number().optional().describe("How often to poll status in ms when waiting (default: 1000)")
62660
+ wait: exports_external.boolean().optional().describe("Child mode only. Wait for the invoked workflow to complete and return its output (default: true). Set false for fire-and-forget."),
62661
+ timeout: exports_external.number().optional().describe("Child mode only. Max wait time in ms when waiting (default: 300000)"),
62662
+ pollInterval: exports_external.number().optional().describe("Child mode only. How often to poll status in ms when waiting (default: 1000)")
62663
+ }).superRefine((data, ctx) => {
62664
+ const hasWorkflow = typeof data.workflow === "string" && data.workflow.length > 0;
62665
+ const hasWorkflowId = typeof data.workflowId === "string" && data.workflowId.length > 0;
62666
+ if (hasWorkflow && hasWorkflowId) {
62667
+ ctx.addIssue({
62668
+ code: "custom",
62669
+ message: "Cannot set both workflow and workflowId",
62670
+ path: ["workflow"]
62671
+ });
62672
+ }
62673
+ if (!hasWorkflow && !hasWorkflowId) {
62674
+ ctx.addIssue({
62675
+ code: "custom",
62676
+ message: "workflow or workflowId is required",
62677
+ path: ["workflow"]
62678
+ });
62679
+ }
62680
+ const mode = data.execution === "child" ? "child" : "inline";
62681
+ if (mode === "inline") {
62682
+ if (data.wait === false) {
62683
+ ctx.addIssue({
62684
+ code: "custom",
62685
+ message: "wait: false is not supported with execution: inline",
62686
+ path: ["wait"]
62687
+ });
62688
+ }
62689
+ if (data.timeout !== undefined) {
62690
+ ctx.addIssue({
62691
+ code: "custom",
62692
+ message: "timeout is only supported with execution: child",
62693
+ path: ["timeout"]
62694
+ });
62695
+ }
62696
+ if (data.pollInterval !== undefined) {
62697
+ ctx.addIssue({
62698
+ code: "custom",
62699
+ message: "pollInterval is only supported with execution: child",
62700
+ path: ["pollInterval"]
62701
+ });
62702
+ }
62703
+ }
62538
62704
  });
62539
62705
  ActionInvokeWorkflowOutputSchema = exports_external.record(exports_external.string(), exports_external.unknown()).describe("When wait is true, the invoked workflow's declared output fields are flattened to the top level alongside a `files` array — reference them as {{ steps.<invoke>.output.<field> }} (there is no `.data` or `.result` wrapper). When wait is false, execution metadata. Call get_workflow_output_schema to see the exact resolved fields.");
62540
62706
  ActionWebsiteReaderConfigSchema = exports_external.object({
@@ -62599,17 +62765,71 @@ var init_step_configs = __esm(() => {
62599
62765
  ControlWaitOutputSchema = exports_external.object({
62600
62766
  waited: exports_external.number().describe("Actual milliseconds waited")
62601
62767
  });
62602
- ControlBlockConfigSchema = exports_external.object({
62603
- blockName: exports_external.string().min(1, "Block name is required").describe("Name of the block to execute"),
62604
- inputs: exports_external.record(exports_external.string(), exports_external.unknown()).optional().describe("Input mapping for the block")
62605
- });
62606
- ControlBlockOutputSchema = exports_external.record(exports_external.string(), exports_external.unknown()).describe("Output from block's declared output mapping");
62607
62768
  ControlFailConfigSchema = exports_external.object({
62608
62769
  condition: exports_external.string().optional().describe("Optional LiquidJS expression. When set, the step only fails if this evaluates truthy; when omitted, it always fails when reached (compose with control.if for legacy gating)."),
62609
62770
  statusCode: exports_external.number().int().min(400).max(599).default(422).describe("HTTP-style status code returned to the caller (sync runs) and persisted on the execution. Default 422 (Unprocessable Entity)."),
62610
62771
  message: exports_external.string().min(1).describe('Human-readable failure message. Supports template expressions, e.g. "Document classified as {{ steps.classify.output.label }}".')
62611
62772
  });
62612
62773
  ControlFailOutputSchema = exports_external.never().describe("control.fail never produces output — it terminates the workflow when triggered.");
62774
+ AI_RETRY_CAPABILITY = {
62775
+ replaySafety: "safe",
62776
+ automaticCategories: [
62777
+ "timeout",
62778
+ "rate_limited",
62779
+ "temporarily_unavailable",
62780
+ "invalid_provider_output"
62781
+ ],
62782
+ hasProviderRequestRetries: true
62783
+ };
62784
+ DETERMINISTIC_RETRY_CAPABILITY = {
62785
+ replaySafety: "safe",
62786
+ automaticCategories: []
62787
+ };
62788
+ CONTROL_RETRY_CAPABILITY = {
62789
+ replaySafety: "never",
62790
+ automaticCategories: []
62791
+ };
62792
+ FILE_OUTPUT_RETRY_CAPABILITY = {
62793
+ replaySafety: "never",
62794
+ automaticCategories: []
62795
+ };
62796
+ STEP_RETRY_CAPABILITIES = {
62797
+ "ai.parse": AI_RETRY_CAPABILITY,
62798
+ "ai.extract": AI_RETRY_CAPABILITY,
62799
+ "ai.split": AI_RETRY_CAPABILITY,
62800
+ "ai.segment": AI_RETRY_CAPABILITY,
62801
+ "ai.classify": AI_RETRY_CAPABILITY,
62802
+ "transform.set": DETERMINISTIC_RETRY_CAPABILITY,
62803
+ "transform.remove": DETERMINISTIC_RETRY_CAPABILITY,
62804
+ "transform.combine": DETERMINISTIC_RETRY_CAPABILITY,
62805
+ "transform.split": DETERMINISTIC_RETRY_CAPABILITY,
62806
+ "transform.merge": DETERMINISTIC_RETRY_CAPABILITY,
62807
+ "transform.template": FILE_OUTPUT_RETRY_CAPABILITY,
62808
+ "transform.pdf-embed": FILE_OUTPUT_RETRY_CAPABILITY,
62809
+ "transform.xlsx-to-json": FILE_OUTPUT_RETRY_CAPABILITY,
62810
+ "transform.script": DETERMINISTIC_RETRY_CAPABILITY,
62811
+ "transform.text-chunker": DETERMINISTIC_RETRY_CAPABILITY,
62812
+ "transform.regex-extract": DETERMINISTIC_RETRY_CAPABILITY,
62813
+ "action.http": {
62814
+ replaySafety: "requires-idempotency",
62815
+ automaticCategories: ["timeout", "rate_limited", "temporarily_unavailable"]
62816
+ },
62817
+ "action.invoke-workflow": {
62818
+ replaySafety: "requires-idempotency",
62819
+ automaticCategories: ["timeout", "temporarily_unavailable"]
62820
+ },
62821
+ "action.website-reader": {
62822
+ replaySafety: "safe",
62823
+ automaticCategories: ["timeout", "rate_limited", "temporarily_unavailable"]
62824
+ },
62825
+ "control.if": CONTROL_RETRY_CAPABILITY,
62826
+ "control.switch": CONTROL_RETRY_CAPABILITY,
62827
+ "control.foreach": CONTROL_RETRY_CAPABILITY,
62828
+ "control.parallel": CONTROL_RETRY_CAPABILITY,
62829
+ "control.parallel_map": CONTROL_RETRY_CAPABILITY,
62830
+ "control.wait": CONTROL_RETRY_CAPABILITY,
62831
+ "control.fail": CONTROL_RETRY_CAPABILITY
62832
+ };
62613
62833
  STEP_SCHEMAS = {
62614
62834
  "ai.parse": {
62615
62835
  type: "ai.parse",
@@ -62836,15 +63056,6 @@ var init_step_configs = __esm(() => {
62836
63056
  outputSchema: ControlWaitOutputSchema,
62837
63057
  configInWith: false
62838
63058
  },
62839
- "control.block": {
62840
- type: "control.block",
62841
- category: "control",
62842
- name: "Block",
62843
- description: "Execute a reusable block workflow inline with input/output mapping",
62844
- configSchema: ControlBlockConfigSchema,
62845
- outputSchema: ControlBlockOutputSchema,
62846
- configInWith: false
62847
- },
62848
63059
  "control.fail": {
62849
63060
  type: "control.fail",
62850
63061
  category: "control",
@@ -62967,6 +63178,7 @@ var WORKFLOW_NAME_PATTERN, WorkflowNameSchema, WorkflowInputDefSchema, ManualTri
62967
63178
  var init_workflow = __esm(() => {
62968
63179
  init_zod();
62969
63180
  init_common();
63181
+ init_retry();
62970
63182
  init_steps();
62971
63183
  WORKFLOW_NAME_PATTERN = /^[a-z0-9][a-z0-9_-]*$/;
62972
63184
  WorkflowNameSchema = exports_external.string().min(1).max(64).regex(WORKFLOW_NAME_PATTERN, 'Workflow name must start with a lowercase letter or digit and contain only lowercase letters, digits, "_" or "-".');
@@ -63046,12 +63258,13 @@ var init_workflow = __esm(() => {
63046
63258
  TriggerMethodsSchema = exports_external.array(TriggerMethodSchema).default([{ type: "manual" }]);
63047
63259
  WorkflowSettingsSchema = exports_external.object({
63048
63260
  timeout: exports_external.number().positive().optional(),
63261
+ retry: WorkflowRetryPolicySchema.optional(),
63049
63262
  retries: exports_external.number().int().min(0).optional(),
63050
63263
  retryDelay: exports_external.number().positive().optional()
63051
- });
63264
+ }).strict();
63052
63265
  WorkflowDefinitionSchema = exports_external.object({
63053
63266
  name: WorkflowNameSchema,
63054
- kind: exports_external.enum(["workflow", "block"]).default("workflow").optional(),
63267
+ kind: exports_external.enum(["workflow"]).default("workflow").optional(),
63055
63268
  version: exports_external.string().default("1.0.0"),
63056
63269
  description: exports_external.string().optional(),
63057
63270
  enabled: exports_external.boolean().default(true),
@@ -63251,11 +63464,12 @@ function isFileOutput(value) {
63251
63464
  function isWorkflowResult(value) {
63252
63465
  return value != null && typeof value === "object" && "files" in value && Array.isArray(value.files);
63253
63466
  }
63254
- var WorkflowExecutionStatusSchema3, StepExecutionStatusSchema3, ScopeEntryTypeSchema, ScopeEntrySchema, ScopeStackSchema, StepResultSchema, ExecutionContextSchema, StepInputReferenceSchema, WorkflowExecutionSchema, StepExecutionSchema, ConnectorSchema, WorkflowFileOutputSchema, WorkflowResultSchema;
63467
+ var WorkflowExecutionStatusSchema3, StepExecutionStatusSchema3, ScopeEntryTypeSchema, ScopeEntrySchema, ScopeStackSchema, StepResultSchema, ExecutionContextSchema, StepInputReferenceSchema, WorkflowExecutionSchema, StepExecutionSchema, StepExecutionAttemptSchema, ConnectorSchema, WorkflowFileOutputSchema, WorkflowResultSchema;
63255
63468
  var init_execution2 = __esm(() => {
63256
63469
  init_zod();
63257
63470
  init_common();
63258
63471
  init_execution();
63472
+ init_retry();
63259
63473
  init_workflow();
63260
63474
  WorkflowExecutionStatusSchema3 = WorkflowExecutionStatusSchema2;
63261
63475
  StepExecutionStatusSchema3 = StepExecutionStatusSchema2;
@@ -63266,6 +63480,7 @@ var init_execution2 = __esm(() => {
63266
63480
  "parallel-branch",
63267
63481
  "foreach-iteration",
63268
63482
  "parallel-map-iteration",
63483
+ "inline-invoke",
63269
63484
  "block"
63270
63485
  ]);
63271
63486
  ScopeEntrySchema = exports_external.object({
@@ -63315,6 +63530,7 @@ var init_execution2 = __esm(() => {
63315
63530
  result: exports_external.unknown().nullable(),
63316
63531
  error: exports_external.string().nullable(),
63317
63532
  priority: exports_external.number().default(50),
63533
+ availableAt: TimestampSchema2,
63318
63534
  leaseId: exports_external.string().nullable(),
63319
63535
  leaseExpiresAt: TimestampSchema2.nullable(),
63320
63536
  workerId: exports_external.string().nullable(),
@@ -63339,6 +63555,11 @@ var init_execution2 = __esm(() => {
63339
63555
  scopeHash: exports_external.string(),
63340
63556
  executionOrder: exports_external.number(),
63341
63557
  stepAttempt: exports_external.number().default(0),
63558
+ stepPath: exports_external.string().nullable().optional(),
63559
+ effectiveRetryPolicy: ResolvedRetryPolicySchema.nullable().optional(),
63560
+ retryPolicySource: RetryPolicySourceSchema.nullable().optional(),
63561
+ latestAttempt: exports_external.number().default(0),
63562
+ nextAttemptAt: TimestampSchema2.nullable().optional(),
63342
63563
  inputData: exports_external.unknown().nullable(),
63343
63564
  outputData: exports_external.unknown().nullable(),
63344
63565
  status: StepExecutionStatusSchema3,
@@ -63348,6 +63569,21 @@ var init_execution2 = __esm(() => {
63348
63569
  startedAt: TimestampSchema2.nullable(),
63349
63570
  completedAt: TimestampSchema2.nullable()
63350
63571
  });
63572
+ StepExecutionAttemptSchema = exports_external.object({
63573
+ id: exports_external.string(),
63574
+ stepExecutionId: exports_external.string(),
63575
+ executionId: exports_external.string(),
63576
+ tenantId: exports_external.string(),
63577
+ attemptNumber: exports_external.number().int().min(1),
63578
+ status: exports_external.enum(["running", "success", "failure", "cancelled"]),
63579
+ resolvedConfig: exports_external.unknown().nullable(),
63580
+ failure: ExecutionFailureSchema.nullable(),
63581
+ retryDecision: RetryDecisionSchema.nullable(),
63582
+ replaySafe: exports_external.boolean().nullable(),
63583
+ startedAt: TimestampSchema2,
63584
+ completedAt: TimestampSchema2.nullable(),
63585
+ durationMs: exports_external.number().nullable()
63586
+ });
63351
63587
  ConnectorSchema = exports_external.object({
63352
63588
  id: exports_external.string(),
63353
63589
  tenantId: exports_external.string(),
@@ -63448,6 +63684,21 @@ function hasDeclaredOutput(output) {
63448
63684
  return output.trim().length > 0;
63449
63685
  return !!output && Object.keys(output).length > 0;
63450
63686
  }
63687
+ function isWorkflowIdRef(ref) {
63688
+ return ref.startsWith("wf_");
63689
+ }
63690
+ function getInvokeExecutionMode(withConfig) {
63691
+ return withConfig?.execution === "child" ? "child" : "inline";
63692
+ }
63693
+ function getInvokeWorkflowRef(withConfig) {
63694
+ const workflow = withConfig?.workflow;
63695
+ if (typeof workflow === "string" && workflow.length > 0)
63696
+ return workflow;
63697
+ const workflowId = withConfig?.workflowId;
63698
+ if (typeof workflowId === "string" && workflowId.length > 0)
63699
+ return workflowId;
63700
+ return;
63701
+ }
63451
63702
  function* iterateSteps(steps) {
63452
63703
  if (!Array.isArray(steps))
63453
63704
  return;
@@ -63472,23 +63723,51 @@ function* iterateSteps(steps) {
63472
63723
  }
63473
63724
  }
63474
63725
  }
63726
+ function collectInvokeWorkflowTargets(definition) {
63727
+ const seen = new Set;
63728
+ const targets = [];
63729
+ for (const step of iterateSteps(definition?.steps)) {
63730
+ if (step.type !== "action.invoke-workflow")
63731
+ continue;
63732
+ const withConfig = step.with;
63733
+ const ref = getInvokeWorkflowRef(withConfig);
63734
+ if (!ref)
63735
+ continue;
63736
+ const key = `${getInvokeExecutionMode(withConfig)}:${ref}`;
63737
+ if (seen.has(key))
63738
+ continue;
63739
+ seen.add(key);
63740
+ targets.push({
63741
+ ref,
63742
+ mode: getInvokeExecutionMode(withConfig),
63743
+ stepName: typeof step.name === "string" ? step.name : undefined
63744
+ });
63745
+ }
63746
+ return targets;
63747
+ }
63475
63748
  function collectInvokeWorkflowTargetIds(definition) {
63476
63749
  const ids = new Set;
63477
- for (const step of iterateSteps(definition?.steps)) {
63478
- if (step.type === "action.invoke-workflow") {
63479
- const id = step.with?.workflowId;
63480
- if (typeof id === "string" && id.length > 0)
63481
- ids.add(id);
63482
- }
63750
+ for (const { ref } of collectInvokeWorkflowTargets(definition)) {
63751
+ if (isWorkflowIdRef(ref))
63752
+ ids.add(ref);
63483
63753
  }
63484
63754
  return [...ids];
63485
63755
  }
63756
+ function collectInvokeWorkflowTargetNames(definition) {
63757
+ const names = new Set;
63758
+ for (const { ref } of collectInvokeWorkflowTargets(definition)) {
63759
+ if (!isWorkflowIdRef(ref))
63760
+ names.add(ref);
63761
+ }
63762
+ return [...names];
63763
+ }
63486
63764
 
63487
63765
  // ../types/src/workflow/index.ts
63488
63766
  var init_workflow2 = __esm(() => {
63489
63767
  init_step_configs();
63490
63768
  init_actions();
63491
63769
  init_steps();
63770
+ init_retry();
63492
63771
  init_workflow();
63493
63772
  init_expected_output();
63494
63773
  init_local_meta();
@@ -64969,8 +65248,6 @@ function workflowMethodEnabled(methods, type) {
64969
65248
  return methods.some((method) => method.type === type);
64970
65249
  }
64971
65250
  function triggersFromWorkflowDefinition(definition) {
64972
- if (definition.kind === "block")
64973
- return [];
64974
65251
  const methods = getTriggerMethods(definition);
64975
65252
  return [
64976
65253
  { type: "api", enabled: workflowMethodEnabled(methods, "api") },
@@ -66149,6 +66426,7 @@ __export(exports_src, {
66149
66426
  runExpandErrorMessage: () => runExpandErrorMessage,
66150
66427
  rootS3Path: () => rootS3Path,
66151
66428
  resolveWorkflowPassThreshold: () => resolveWorkflowPassThreshold,
66429
+ resolveRetryPolicy: () => resolveRetryPolicy,
66152
66430
  resolveEffectiveMimeType: () => resolveEffectiveMimeType,
66153
66431
  resolveAgentOriginalSourceRef: () => resolveAgentOriginalSourceRef,
66154
66432
  requiresSpecializedParser: () => requiresSpecializedParser,
@@ -66179,6 +66457,7 @@ __export(exports_src, {
66179
66457
  judgeScoreJson: () => judgeScoreJson,
66180
66458
  judgeLabelJson: () => judgeLabelJson,
66181
66459
  isWorkflowResult: () => isWorkflowResult,
66460
+ isWorkflowIdRef: () => isWorkflowIdRef,
66182
66461
  isTerminalExecutionStatus: () => isTerminalExecutionStatus,
66183
66462
  isStepCategory: () => isStepCategory,
66184
66463
  isScopedFileRef: () => isScopedFileRef,
@@ -66206,11 +66485,14 @@ __export(exports_src, {
66206
66485
  getTriggerMethods: () => getTriggerMethods,
66207
66486
  getSupportedFormatsLabel: () => getSupportedFormatsLabel,
66208
66487
  getStepSchema: () => getStepSchema,
66488
+ getStepRetryCapability: () => getStepRetryCapability,
66209
66489
  getStepOutputSchema: () => getStepOutputSchema,
66210
66490
  getStepConfigSchema: () => getStepConfigSchema,
66211
66491
  getRequiredOutputKeys: () => getRequiredOutputKeys,
66212
66492
  getProcessorSchemas: () => getProcessorSchemas,
66213
66493
  getParserCategory: () => getParserCategory,
66494
+ getInvokeWorkflowRef: () => getInvokeWorkflowRef,
66495
+ getInvokeExecutionMode: () => getInvokeExecutionMode,
66214
66496
  getConfigSchema: () => getConfigSchema,
66215
66497
  getConfigFieldMetadata: () => getConfigFieldMetadata,
66216
66498
  getConfigDefaults: () => getConfigDefaults,
@@ -66246,6 +66528,8 @@ __export(exports_src, {
66246
66528
  compareExpectedValues: () => compareExpectedValues,
66247
66529
  compareExpectedError: () => compareExpectedError,
66248
66530
  combineEvalScores: () => combineEvalScores,
66531
+ collectInvokeWorkflowTargets: () => collectInvokeWorkflowTargets,
66532
+ collectInvokeWorkflowTargetNames: () => collectInvokeWorkflowTargetNames,
66249
66533
  collectInvokeWorkflowTargetIds: () => collectInvokeWorkflowTargetIds,
66250
66534
  collectFileReferenceSentinels: () => collectFileReferenceSentinels,
66251
66535
  coerceInput: () => coerceInput,
@@ -66266,6 +66550,7 @@ __export(exports_src, {
66266
66550
  WorkspaceDependencySchema: () => WorkspaceDependencySchema,
66267
66551
  WorkspaceDependencyNameSchema: () => WorkspaceDependencyNameSchema,
66268
66552
  WorkflowSettingsSchema: () => WorkflowSettingsSchema,
66553
+ WorkflowRetryPolicySchema: () => WorkflowRetryPolicySchema,
66269
66554
  WorkflowResultSchema: () => WorkflowResultSchema,
66270
66555
  WorkflowPackageManifestSchema: () => WorkflowPackageManifestSchema,
66271
66556
  WorkflowNameSchema: () => WorkflowNameSchema,
@@ -66319,11 +66604,14 @@ __export(exports_src, {
66319
66604
  StepTypeValue: () => StepTypeValue,
66320
66605
  StepTypeSchema: () => StepTypeSchema,
66321
66606
  StepSchema: () => StepSchema,
66607
+ StepRetryPolicySchema: () => StepRetryPolicySchema,
66608
+ StepRetryCapabilitySchema: () => StepRetryCapabilitySchema,
66322
66609
  StepResultSchema: () => StepResultSchema,
66323
66610
  StepInputReferenceSchema: () => StepInputReferenceSchema,
66324
66611
  StepExecutionStatusValue: () => StepExecutionStatusValue,
66325
66612
  StepExecutionStatusSchema: () => StepExecutionStatusSchema,
66326
66613
  StepExecutionSchema: () => StepExecutionSchema,
66614
+ StepExecutionAttemptSchema: () => StepExecutionAttemptSchema,
66327
66615
  SplitOutputSchema: () => SplitOutputSchema,
66328
66616
  SplitInputSchema: () => SplitInputSchema,
66329
66617
  SplitConfigSchema: () => SplitConfigSchema,
@@ -66353,6 +66641,7 @@ __export(exports_src, {
66353
66641
  ScopeEntrySchema: () => ScopeEntrySchema,
66354
66642
  STEP_TYPES: () => STEP_TYPES,
66355
66643
  STEP_SCHEMAS: () => STEP_SCHEMAS,
66644
+ STEP_RETRY_CAPABILITIES: () => STEP_RETRY_CAPABILITIES,
66356
66645
  STEP_EXECUTION_STATUSES: () => STEP_EXECUTION_STATUSES,
66357
66646
  SOURCE_VERSION_RANGE_PATTERN: () => SOURCE_VERSION_RANGE_PATTERN,
66358
66647
  SOURCE_SEMVER_PATTERN: () => SOURCE_SEMVER_PATTERN,
@@ -66370,6 +66659,11 @@ __export(exports_src, {
66370
66659
  RunTargetSchema: () => RunTargetSchema,
66371
66660
  RunTargetObjectSchema: () => RunTargetObjectSchema,
66372
66661
  RootSourceManifestSchema: () => RootSourceManifestSchema,
66662
+ RetryTerminalReasonSchema: () => RetryTerminalReasonSchema,
66663
+ RetryPolicySourceSchema: () => RetryPolicySourceSchema,
66664
+ RetryDecisionSchema: () => RetryDecisionSchema,
66665
+ RetryCategorySchema: () => RetryCategorySchema,
66666
+ ResolvedRetryPolicySchema: () => ResolvedRetryPolicySchema,
66373
66667
  ResolvedProcessorFileSchema: () => ResolvedProcessorFileSchema,
66374
66668
  ReleaseTagSchema: () => ReleaseTagSchema,
66375
66669
  RUN_TARGET_SEGMENT_PATTERN: () => RUN_TARGET_SEGMENT_PATTERN,
@@ -66415,6 +66709,7 @@ __export(exports_src, {
66415
66709
  LocalAgentResourceDirectorySchema: () => LocalAgentResourceDirectorySchema,
66416
66710
  LlmJudgeConfigSchema: () => LlmJudgeConfigSchema,
66417
66711
  LegacyFileIdInputSchema: () => LegacyFileIdInputSchema,
66712
+ LegacyBlockStepSchema: () => LegacyBlockStepSchema,
66418
66713
  LayoutElementTypeSchema: () => LayoutElementTypeSchema,
66419
66714
  LayoutElementSchema: () => LayoutElementSchema,
66420
66715
  LLM_JUDGE_PROMPT_MIN_LENGTH: () => LLM_JUDGE_PROMPT_MIN_LENGTH,
@@ -66452,6 +66747,7 @@ __export(exports_src, {
66452
66747
  ExpectedDocumentRefSchema: () => ExpectedDocumentRefSchema,
66453
66748
  ExecutionTypeValue: () => ExecutionTypeValue,
66454
66749
  ExecutionTypeSchema: () => ExecutionTypeSchema,
66750
+ ExecutionFailureSchema: () => ExecutionFailureSchema,
66455
66751
  ExecutionContextSchema: () => ExecutionContextSchema,
66456
66752
  ExactDiffConfigSchema: () => ExactDiffConfigSchema,
66457
66753
  EvaluatorsImportRequestSchema: () => EvaluatorsImportRequestSchema,
@@ -66520,8 +66816,6 @@ __export(exports_src, {
66520
66816
  ControlForeachConfigSchema: () => ControlForeachConfigSchema,
66521
66817
  ControlFailOutputSchema: () => ControlFailOutputSchema,
66522
66818
  ControlFailConfigSchema: () => ControlFailConfigSchema,
66523
- ControlBlockOutputSchema: () => ControlBlockOutputSchema,
66524
- ControlBlockConfigSchema: () => ControlBlockConfigSchema,
66525
66819
  ConnectorSchema: () => ConnectorSchema,
66526
66820
  ClassifyOutputSchema: () => ClassifyOutputSchema,
66527
66821
  ClassifyLabelSchema: () => ClassifyLabelSchema,
@@ -66532,7 +66826,6 @@ __export(exports_src, {
66532
66826
  CUSTOM_SCRIPT_MAX_BYTES: () => CUSTOM_SCRIPT_MAX_BYTES,
66533
66827
  CUSTOM_SCRIPT_CONTRACT: () => CUSTOM_SCRIPT_CONTRACT,
66534
66828
  BoundingRegionSchema: () => BoundingRegionSchema,
66535
- BlockStepSchema: () => BlockStepSchema,
66536
66829
  BaseEntitySchema: () => BaseEntitySchema,
66537
66830
  BUILTIN_FILE_SOURCE_DESCRIPTORS: () => BUILTIN_FILE_SOURCE_DESCRIPTORS,
66538
66831
  AutomationTargetSchema: () => AutomationTargetSchema,
@@ -181287,7 +181580,7 @@ import { fileURLToPath as fileURLToPath8 } from "url";
181287
181580
  // package.json
181288
181581
  var package_default = {
181289
181582
  name: "@eigenpal/cli",
181290
- version: "0.10.18",
181583
+ version: "0.10.20",
181291
181584
  description: "Eigenpal CLI — author and run document workflows from your terminal. Agent-ready.",
181292
181585
  keywords: [
181293
181586
  "eigenpal",
@@ -189348,6 +189641,11 @@ function parseWorkflow(yaml) {
189348
189641
  throw new YamlParseError(`Invalid YAML: ${message}`);
189349
189642
  }
189350
189643
  const upgraded = upgradeWorkflow(parsed);
189644
+ const deprecatedIssues = collectDeprecatedBlockIssues(upgraded);
189645
+ if (deprecatedIssues.length > 0) {
189646
+ const errorMessages = deprecatedIssues.map((e8) => `${e8.path.join(".")}: ${e8.message}`).join("; ");
189647
+ throw new WorkflowValidationError(`Invalid workflow definition: ${errorMessages}`, deprecatedIssues);
189648
+ }
189351
189649
  const result = WorkflowDefinitionSchema.safeParse(upgraded);
189352
189650
  if (!result.success) {
189353
189651
  const validationIssues = result.error.issues.map((e8) => ({
@@ -189365,11 +189663,83 @@ function parseWorkflow(yaml) {
189365
189663
  }
189366
189664
  return result.data;
189367
189665
  }
189666
+ function collectDeprecatedBlockIssues(definition) {
189667
+ const issues = [];
189668
+ if (definition.kind === "block") {
189669
+ issues.push({
189670
+ path: ["kind"],
189671
+ message: "kind: block was removed. Define a regular workflow and invoke it with action.invoke-workflow (execution: inline).",
189672
+ code: "deprecated_kind_block"
189673
+ });
189674
+ }
189675
+ function walkSteps(steps, pathPrefix) {
189676
+ if (!Array.isArray(steps))
189677
+ return;
189678
+ for (let i5 = 0;i5 < steps.length; i5++) {
189679
+ const raw = steps[i5];
189680
+ if (!raw || typeof raw !== "object")
189681
+ continue;
189682
+ const step = raw;
189683
+ const stepPath = [...pathPrefix, i5];
189684
+ if (step.type === "control.block") {
189685
+ issues.push({
189686
+ path: [...stepPath, "type"],
189687
+ message: "control.block was removed. Use action.invoke-workflow with execution: inline and workflow set to the target name or wf_ id.",
189688
+ code: "deprecated_control_block"
189689
+ });
189690
+ }
189691
+ for (const [key2, value] of Object.entries(step)) {
189692
+ if (!Array.isArray(value))
189693
+ continue;
189694
+ for (let j11 = 0;j11 < value.length; j11++) {
189695
+ const item = value[j11];
189696
+ if (!item || typeof item !== "object")
189697
+ continue;
189698
+ const obj = item;
189699
+ if ("type" in obj) {
189700
+ walkSteps([obj], [...stepPath, key2]);
189701
+ } else if (Array.isArray(obj.steps)) {
189702
+ walkSteps(obj.steps, [...stepPath, key2, j11, "steps"]);
189703
+ }
189704
+ }
189705
+ }
189706
+ if (Array.isArray(step.then))
189707
+ walkSteps(step.then, [...stepPath, "then"]);
189708
+ if (Array.isArray(step.else))
189709
+ walkSteps(step.else, [...stepPath, "else"]);
189710
+ if (Array.isArray(step.steps))
189711
+ walkSteps(step.steps, [...stepPath, "steps"]);
189712
+ if (Array.isArray(step.default))
189713
+ walkSteps(step.default, [...stepPath, "default"]);
189714
+ if (Array.isArray(step.cases)) {
189715
+ for (let j11 = 0;j11 < step.cases.length; j11++) {
189716
+ const c7 = step.cases[j11];
189717
+ if (Array.isArray(c7?.steps)) {
189718
+ walkSteps(c7.steps, [...stepPath, "cases", j11, "steps"]);
189719
+ }
189720
+ }
189721
+ }
189722
+ if (Array.isArray(step.branches)) {
189723
+ for (let j11 = 0;j11 < step.branches.length; j11++) {
189724
+ const b8 = step.branches[j11];
189725
+ if (Array.isArray(b8?.steps)) {
189726
+ walkSteps(b8.steps, [...stepPath, "branches", j11, "steps"]);
189727
+ }
189728
+ }
189729
+ }
189730
+ }
189731
+ }
189732
+ walkSteps(definition.steps, ["steps"]);
189733
+ return issues;
189734
+ }
189368
189735
  function validateStepConfigsRecursive(steps, pathPrefix) {
189369
189736
  const issues = [];
189370
189737
  for (let i5 = 0;i5 < steps.length; i5++) {
189371
189738
  const step = steps[i5];
189372
189739
  const stepPath = [...pathPrefix, i5];
189740
+ if (step.type === "control.block") {
189741
+ continue;
189742
+ }
189373
189743
  const schemaDef = getStepSchema(step.type);
189374
189744
  if (schemaDef?.configInWith) {
189375
189745
  const cfg = step.with ?? {};
@@ -25,7 +25,7 @@ implement at runtime. Server-side validation errors point you here.
25
25
  - `transform.*` — deterministic data transforms (set, remove, combine, split, merge,
26
26
  script, template, pdf-embed, xlsx-to-json). WASM sandboxed where applicable.
27
27
  - `action.*` — external side effects (HTTP, invoke another workflow, website reader).
28
- - `control.*` — flow control (if, foreach, parallel, parallel_map, wait, block, fail).
28
+ - `control.*` — flow control (if, foreach, parallel, parallel_map, wait, fail).
29
29
 
30
30
  The full per-type catalog with field tables is auto-generated below from
31
31
  `STEP_SCHEMAS`. The high-level map above tells you which family you want;
@@ -105,7 +105,7 @@ Reference user-supplied schema fields the same way:
105
105
  ## Control containers — nested step shape and scoping
106
106
 
107
107
  `control.parallel`, `control.parallel_map`, `control.foreach`, `control.if`,
108
- and `control.block` contain nested steps. The auto-generated catalog below
108
+ and inline `action.invoke-workflow` (`execution: inline`) contain nested steps. The auto-generated catalog below
109
109
  cannot render that shape, so the YAML form lives here. Same for the scoping
110
110
  rules — important because the runtime treats nested steps differently from
111
111
  top-level ones, and getting the access path wrong silently returns
@@ -285,19 +285,23 @@ scopes), but the template breaks the moment the OTHER branch runs. Use
285
285
  `steps.<if>.output.result` so the access is branch-agnostic — or compute
286
286
  the final shape in a trailing `transform.script` that handles both cases.
287
287
 
288
- ### `control.block` — call a reusable workflow block
288
+ ### `action.invoke-workflow` (inline) — call another workflow in the same run
289
289
 
290
290
  ```yaml
291
291
  - name: invoice-flow
292
- type: control.block
293
- blockName: parse-invoice # other workflow's `name:`
294
- inputs:
295
- contract: '{{ input.contract }}'
292
+ type: action.invoke-workflow
293
+ with:
294
+ workflow: parse-invoice # target workflow name or wf_ id
295
+ execution: inline # default; omit for same-run execution
296
+ input:
297
+ contract: '{{ input.contract }}'
296
298
  ```
297
299
 
298
- **Access the output:** the block's declared output fields are exposed as
299
- top-level keys under `steps.<this-step>.output`. Block-internal steps are
300
- not visible — the block runs in an isolated scope.
300
+ **Access the output:** the target's declared output fields are exposed as
301
+ top-level keys under `steps.<this-step>.output`, with a `files` array alongside.
302
+ Invoked workflow steps run in an isolated scope inside the parent run.
303
+
304
+ For a separate child run (lineage, fire-and-forget, polling), set `execution: child`.
301
305
 
302
306
  ## Classify-and-fail pattern
303
307
 
@@ -354,6 +358,8 @@ _Generated from `STEP_SCHEMAS` in `@eigenpal/types/src/workflow/step-configs.ts`
354
358
 
355
359
  Extract text from documents (PDF, DOCX, images) using OCR or vision models
356
360
 
361
+ **Durable retry:** Provider request retries are separate; the workflow engine does not durably retry this step.
362
+
357
363
  **Config** (in `step.with`):
358
364
 
359
365
  | Field | Type | Required | Default | Description |
@@ -382,6 +388,8 @@ Extract text from documents (PDF, DOCX, images) using OCR or vision models
382
388
 
383
389
  Extract structured data from text using AI with a JSON schema
384
390
 
391
+ **Durable retry:** Provider request retries are separate; the workflow engine does not durably retry this step.
392
+
385
393
  **Config** (in `step.with`):
386
394
 
387
395
  | Field | Type | Required | Default | Description |
@@ -405,6 +413,8 @@ Extract structured data from text using AI with a JSON schema
405
413
 
406
414
  Split a parsed document into named sections using an LLM. Consumes ai.parse output; emits per-section page ranges and text ready for downstream ai.extract via control.parallel_map.
407
415
 
416
+ **Durable retry:** Provider request retries are separate; the workflow engine does not durably retry this step.
417
+
408
418
  **Config** (in `step.with`):
409
419
 
410
420
  | Field | Type | Required | Default | Description |
@@ -425,6 +435,8 @@ Split a parsed document into named sections using an LLM. Consumes ai.parse outp
425
435
 
426
436
  Separate a concatenated batch (one big scan) into typed document instances using an LLM. Consumes ai.parse output and a type taxonomy; discovers an unknown number of documents in any order and emits per-document page ranges + text + type, ready for type-specific ai.extract via control.parallel_map. The inverse of ai.split.
427
437
 
438
+ **Durable retry:** Provider request retries are separate; the workflow engine does not durably retry this step.
439
+
428
440
  **Config** (in `step.with`):
429
441
 
430
442
  | Field | Type | Required | Default | Description |
@@ -446,6 +458,8 @@ Separate a concatenated batch (one big scan) into typed document instances using
446
458
 
447
459
  Classify a document or text into one of a fixed label set using an LLM. Output exposes the picked label (constrained to the configured names), a coarse confidence, and a short justification. Pair with control.fail to reject documents that match an undesired label.
448
460
 
461
+ **Durable retry:** Provider request retries are separate; the workflow engine does not durably retry this step.
462
+
449
463
  **Config** (in `step.with`):
450
464
 
451
465
  | Field | Type | Required | Default | Description |
@@ -471,6 +485,8 @@ Classify a document or text into one of a fixed label set using an LLM. Output e
471
485
 
472
486
  Set key-value pairs in the output object
473
487
 
488
+ **Durable retry:** Transforms, including those that write files, are not durably retried.
489
+
474
490
  **Config** (in `step.with`):
475
491
 
476
492
  | Field | Type | Required | Default | Description |
@@ -486,6 +502,8 @@ Set key-value pairs in the output object
486
502
 
487
503
  Remove specified fields from an object
488
504
 
505
+ **Durable retry:** Transforms, including those that write files, are not durably retried.
506
+
489
507
  **Config** (in `step.with`):
490
508
 
491
509
  | Field | Type | Required | Default | Description |
@@ -501,6 +519,8 @@ Remove specified fields from an object
501
519
 
502
520
  Merge multiple objects or concatenate arrays
503
521
 
522
+ **Durable retry:** Transforms, including those that write files, are not durably retried.
523
+
504
524
  **Config** (in `step.with`):
505
525
 
506
526
  | Field | Type | Required | Default | Description |
@@ -517,6 +537,8 @@ Merge multiple objects or concatenate arrays
517
537
 
518
538
  Split a string by delimiter or extract keys from an object
519
539
 
540
+ **Durable retry:** Transforms, including those that write files, are not durably retried.
541
+
520
542
  **Config** (in `step.with`):
521
543
 
522
544
  | Field | Type | Required | Default | Description |
@@ -536,6 +558,8 @@ Split a string by delimiter or extract keys from an object
536
558
 
537
559
  Merge multiple named inputs into a single output
538
560
 
561
+ **Durable retry:** Transforms, including those that write files, are not durably retried.
562
+
539
563
  **Config** (in `step.with`):
540
564
 
541
565
  | Field | Type | Required | Default | Description |
@@ -555,6 +579,8 @@ Merge multiple named inputs into a single output
555
579
 
556
580
  Fill a DOCX template with data from previous steps. Select a template in the workflow builder or provide a template ID from your workspace.
557
581
 
582
+ **Durable retry:** Transforms, including those that write files, are not durably retried.
583
+
558
584
  **Config** (in `step.with`):
559
585
 
560
586
  | Field | Type | Required | Default | Description |
@@ -575,6 +601,8 @@ Fill a DOCX template with data from previous steps. Select a template in the wor
575
601
 
576
602
  Embed OCR text layer into scanned PDFs/images to make them searchable
577
603
 
604
+ **Durable retry:** Transforms, including those that write files, are not durably retried.
605
+
578
606
  **Config** (in `step.with`):
579
607
 
580
608
  | Field | Type | Required | Default | Description |
@@ -597,6 +625,8 @@ Embed OCR text layer into scanned PDFs/images to make them searchable
597
625
 
598
626
  Convert XLSX spreadsheet to JSON array of row objects for use in scripts or downstream steps
599
627
 
628
+ **Durable retry:** Transforms, including those that write files, are not durably retried.
629
+
600
630
  **Config** (in `step.with`):
601
631
 
602
632
  | Field | Type | Required | Default | Description |
@@ -617,6 +647,8 @@ Convert XLSX spreadsheet to JSON array of row objects for use in scripts or down
617
647
 
618
648
  Execute a TypeScript function in a QuickJS sandbox. Input keys become the function's parameter list, in declaration order, and the required `: R` return-type annotation IS this step's output schema: `inputs: { items, taxRate }` ⇒ `function script(items: …, taxRate: …): R { … }`.
619
649
 
650
+ **Durable retry:** Transforms, including those that write files, are not durably retried.
651
+
620
652
  **Config** (in `step.with`):
621
653
 
622
654
  | Field | Type | Required | Default | Description |
@@ -634,6 +666,8 @@ Execute a TypeScript function in a QuickJS sandbox. Input keys become the functi
634
666
 
635
667
  Split long text into chunks with regex-anchored boundaries, overlap, and header preservation. Accepts raw text or a parsed-document object; chunks carry source page indexes when pages are provided.
636
668
 
669
+ **Durable retry:** Transforms, including those that write files, are not durably retried.
670
+
637
671
  **Config** (in `step.with`):
638
672
 
639
673
  | Field | Type | Required | Default | Description |
@@ -657,6 +691,8 @@ Split long text into chunks with regex-anchored boundaries, overlap, and header
657
691
 
658
692
  Pull named fields from text via regex patterns (deterministic counterpart to ai.extract). Accepts raw text or a parsed-document object; matches carry `_evidence.pageIndex` when pages are provided.
659
693
 
694
+ **Durable retry:** Transforms, including those that write files, are not durably retried.
695
+
660
696
  **Config** (in `step.with`):
661
697
 
662
698
  | Field | Type | Required | Default | Description |
@@ -676,12 +712,14 @@ Pull named fields from text via regex patterns (deterministic counterpart to ai.
676
712
 
677
713
  Make an HTTP request to an external API
678
714
 
715
+ **Durable retry:** HTTP `GET` and `HEAD` can durably retry transient timeout, rate limits, selected retryable server failures failures. Other methods are not replayed.
716
+
679
717
  **Config** (in `step.with`):
680
718
 
681
719
  | Field | Type | Required | Default | Description |
682
720
  | --- | --- | --- | --- | --- |
683
721
  | `url` | string | yes | | Request URL (supports template expressions) |
684
- | `method` | `"GET"` \| `"POST"` \| `"PUT"` \| `"PATCH"` \| `"DELETE"` | no | `"GET"` | |
722
+ | `method` | `"GET"` \| `"HEAD"` \| `"POST"` \| `"PUT"` \| `"PATCH"` \| `"DELETE"` | no | `"GET"` | |
685
723
  | `headers` | record<string, string> | no | | HTTP headers |
686
724
  | `body` | unknown | no | | Request body (JSON or string) |
687
725
  | `timeout` | number | no | `30000` | Timeout in milliseconds |
@@ -701,15 +739,19 @@ Make an HTTP request to an external API
701
739
 
702
740
  Execute another workflow and return its output
703
741
 
742
+ **Durable retry:** Invoked workflows are not replayed as durable leaf attempts.
743
+
704
744
  **Config** (in `step.with`):
705
745
 
706
746
  | Field | Type | Required | Default | Description |
707
747
  | --- | --- | --- | --- | --- |
708
- | `workflowId` | string | yes | | ID of workflow to invoke |
748
+ | `workflow` | string | no | | Workflow to invoke — definition name or wf_ id (tenant-scoped) |
749
+ | `workflowId` | string | no | | Legacy alias for workflow when the value is a wf_ id |
750
+ | `execution` | `"inline"` \| `"child"` | no | | inline: run target steps in this execution (default). child: spawn a separate run with lineage. |
709
751
  | `input` | record<string, unknown> | no | | Input record keyed by the invoked workflow's declared inputs |
710
- | `wait` | boolean | no | | Wait for the invoked workflow to complete and return its output (default: true). Set false for fire-and-forget. |
711
- | `timeout` | number | no | | Max wait time in ms when waiting (default: 300000) |
712
- | `pollInterval` | number | no | | How often to poll status in ms when waiting (default: 1000) |
752
+ | `wait` | boolean | no | | Child mode only. Wait for the invoked workflow to complete and return its output (default: true). Set false for fire-and-forget. |
753
+ | `timeout` | number | no | | Child mode only. Max wait time in ms when waiting (default: 300000) |
754
+ | `pollInterval` | number | no | | Child mode only. How often to poll status in ms when waiting (default: 1000) |
713
755
 
714
756
  **Output:** `record<string, unknown>`
715
757
 
@@ -719,6 +761,8 @@ Execute another workflow and return its output
719
761
 
720
762
  Fetch a webpage and convert content to markdown
721
763
 
764
+ **Durable retry:** Supported for transient timeout, rate limits, selected retryable server failures failures.
765
+
722
766
  **Config** (in `step.with`):
723
767
 
724
768
  | Field | Type | Required | Default | Description |
@@ -745,6 +789,8 @@ Fetch a webpage and convert content to markdown
745
789
 
746
790
  Branch execution based on a condition expression
747
791
 
792
+ **Durable retry:** The control container itself is not retried, but eligible leaves inside its sequential scope may retry durably.
793
+
748
794
  **Config** (at step level):
749
795
 
750
796
  | Field | Type | Required | Default | Description |
@@ -763,6 +809,8 @@ Branch execution based on a condition expression
763
809
 
764
810
  Multi-way routing: resolve an expression and run the first case whose value matches (else default). Cleaner than a nested control.if chain for routing an item to one of N pipelines by a discriminator field like a document type.
765
811
 
812
+ **Durable retry:** The control container itself is not retried, but eligible leaves inside its sequential scope may retry durably.
813
+
766
814
  **Config** (at step level):
767
815
 
768
816
  | Field | Type | Required | Default | Description |
@@ -782,6 +830,8 @@ Multi-way routing: resolve an expression and run the first case whose value matc
782
830
 
783
831
  Loop over an array and execute steps for each item
784
832
 
833
+ **Durable retry:** The control container itself is not retried, but eligible leaves inside its sequential scope may retry durably.
834
+
785
835
  **Config** (at step level):
786
836
 
787
837
  | Field | Type | Required | Default | Description |
@@ -802,6 +852,8 @@ Loop over an array and execute steps for each item
802
852
 
803
853
  Iterate over an array with concurrent execution up to a limit
804
854
 
855
+ **Durable retry:** The control container and leaves inside its concurrent branches do not retry durably.
856
+
805
857
  **Config** (at step level):
806
858
 
807
859
  | Field | Type | Required | Default | Description |
@@ -823,6 +875,8 @@ Iterate over an array with concurrent execution up to a limit
823
875
 
824
876
  Execute multiple branches concurrently
825
877
 
878
+ **Durable retry:** The control container and leaves inside its concurrent branches do not retry durably.
879
+
826
880
  **Config** (at step level):
827
881
 
828
882
  _No fields._
@@ -835,6 +889,8 @@ _No fields._
835
889
 
836
890
  Pause workflow execution for a specified duration
837
891
 
892
+ **Durable retry:** This control step is not retried durably.
893
+
838
894
  **Config** (at step level):
839
895
 
840
896
  | Field | Type | Required | Default | Description |
@@ -847,25 +903,12 @@ Pause workflow execution for a specified duration
847
903
  | --- | --- | --- | --- | --- |
848
904
  | `waited` | number | yes | | Actual milliseconds waited |
849
905
 
850
- #### `control.block` — Block
851
-
852
- Execute a reusable block workflow inline with input/output mapping
853
-
854
- **Config** (at step level):
855
-
856
- | Field | Type | Required | Default | Description |
857
- | --- | --- | --- | --- | --- |
858
- | `blockName` | string | yes | | Name of the block to execute |
859
- | `inputs` | record<string, unknown> | no | | Input mapping for the block |
860
-
861
- **Output:** `record<string, unknown>`
862
-
863
- > Output from block's declared output mapping
864
-
865
906
  #### `control.fail` — Fail
866
907
 
867
908
  Terminate the workflow with a typed status code + message. With an optional condition, only fails when the condition is truthy; otherwise always fails when reached. Pair with ai.classify or any prior step to fail fast on bad inputs.
868
909
 
910
+ **Durable retry:** This control step is not retried durably.
911
+
869
912
  **Config** (at step level):
870
913
 
871
914
  | Field | Type | Required | Default | Description |
@@ -127,6 +127,44 @@ Step references resolve via Liquid template expressions:
127
127
  `steps[].name` is the only handle into the step from later steps. Use
128
128
  short, descriptive names (`parse`, `extract`, `score`).
129
129
 
130
+ <!-- GENERATED:RETRY_REFERENCE START -->
131
+ ## Durable retry policies
132
+
133
+ _Policy syntax is generated from `WorkflowRetryPolicySchema` and `StepRetryPolicySchema`; step capability notes are generated from `STEP_RETRY_CAPABILITIES` in `@eigenpal/types`._
134
+
135
+ - Workflow policy values: `automatic`, `never` or an object with `mode` and `maxAttempts`.
136
+ - Step policy values: `inherit`, `automatic`, `never`. `automatic` supports object form with `mode` and `maxAttempts`; `never` supports `{ mode: 'never' }`; `inherit` is string-only.
137
+ - The schema accepts `maxAttempts` from 1 through 10. Studio offers 2-3 total attempts, and the current worker ceiling is 3.
138
+ - `maxAttempts` includes the first attempt. If no policy is set, durable retries are off.
139
+
140
+ ```yaml
141
+ settings:
142
+ retry:
143
+ mode: automatic
144
+ maxAttempts: 3
145
+
146
+ steps:
147
+ - name: fetch-catalog
148
+ type: action.http
149
+ retry: inherit
150
+ with:
151
+ method: GET
152
+ url: 'https://api.example.com/catalog'
153
+
154
+ - name: read-product-page
155
+ type: action.website-reader
156
+ retry: never
157
+ with:
158
+ url: '{{ input.url }}'
159
+ ```
160
+
161
+ `automatic` retries transient timeouts, rate limits, and selected retryable server failures. Delays use bounded exponential backoff, honor `Retry-After`, and stop after a five-minute elapsed budget.
162
+
163
+ Durable leaf retries are supported for Website Reader and HTTP `GET`/`HEAD`. Unsafe HTTP methods, Invoke Workflow, AI steps (which may have separate provider request retries), and transforms or file outputs are not durably replayed. Control containers are not attempts themselves; eligible leaves inside sequential If, Switch, and For Each scopes may retry, while concurrent Parallel and Parallel Map branches do not. See each generated step entry for its capability.
164
+
165
+ Legacy whole-run retry counts are accepted for compatibility but no longer restart failed runs. Move retry intent to the workflow retry default or an eligible step.
166
+ <!-- GENERATED:RETRY_REFERENCE END -->
167
+
130
168
  ### `output`
131
169
 
132
170
  ```yaml
@@ -471,7 +509,7 @@ _Generated from `WorkflowDefinitionSchema` in `@eigenpal/types/src/workflow/work
471
509
  | Field | Type | Required | Default | Description |
472
510
  | --- | --- | --- | --- | --- |
473
511
  | `name` | string | yes | | |
474
- | `kind` | `"workflow"` \| `"block"` | no | `"workflow"` | |
512
+ | `kind` | `"workflow"` | no | `"workflow"` | |
475
513
  | `version` | string | no | `"1.0.0"` | |
476
514
  | `description` | string | no | | |
477
515
  | `enabled` | boolean | no | `true` | |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eigenpal/cli",
3
- "version": "0.10.18",
3
+ "version": "0.10.20",
4
4
  "description": "Eigenpal CLI — author and run document workflows from your terminal. Agent-ready.",
5
5
  "keywords": [
6
6
  "eigenpal",