@n8n/instance-ai 1.3.5 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/dist/agent/credential-guardrails.prompt.d.ts +1 -0
  2. package/dist/agent/credential-guardrails.prompt.js +5 -0
  3. package/dist/agent/credential-guardrails.prompt.js.map +1 -0
  4. package/dist/agent/instance-agent.js +0 -1
  5. package/dist/agent/instance-agent.js.map +1 -1
  6. package/dist/agent/shared-prompts.d.ts +4 -0
  7. package/dist/agent/shared-prompts.js +17 -0
  8. package/dist/agent/shared-prompts.js.map +1 -0
  9. package/dist/agent/sub-agent-debriefing.d.ts +2 -2
  10. package/dist/agent/sub-agent-factory.d.ts +1 -1
  11. package/dist/agent/sub-agent-factory.js +7 -7
  12. package/dist/agent/sub-agent-factory.js.map +1 -1
  13. package/dist/agent/system-prompt.js +56 -29
  14. package/dist/agent/system-prompt.js.map +1 -1
  15. package/dist/build.tsbuildinfo +1 -1
  16. package/dist/constants/max-steps.d.ts +1 -1
  17. package/dist/constants/max-steps.js +1 -1
  18. package/dist/constants/max-steps.js.map +1 -1
  19. package/dist/constants/model-settings.d.ts +3 -0
  20. package/dist/constants/model-settings.js +7 -0
  21. package/dist/constants/model-settings.js.map +1 -0
  22. package/dist/index.d.ts +9 -3
  23. package/dist/index.js +10 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/logger.d.ts +6 -0
  26. package/dist/planned-tasks/planned-task-permissions.d.ts +2 -0
  27. package/dist/planned-tasks/planned-task-permissions.js +8 -2
  28. package/dist/planned-tasks/planned-task-permissions.js.map +1 -1
  29. package/dist/planned-tasks/planned-task-service.d.ts +14 -1
  30. package/dist/planned-tasks/planned-task-service.js +138 -2
  31. package/dist/planned-tasks/planned-task-service.js.map +1 -1
  32. package/dist/runtime/background-task-manager.d.ts +25 -1
  33. package/dist/runtime/background-task-manager.js +66 -2
  34. package/dist/runtime/background-task-manager.js.map +1 -1
  35. package/dist/runtime/builder-sandbox-session-registry.d.ts +45 -0
  36. package/dist/runtime/builder-sandbox-session-registry.js +159 -0
  37. package/dist/runtime/builder-sandbox-session-registry.js.map +1 -0
  38. package/dist/runtime/run-state-registry.d.ts +7 -4
  39. package/dist/runtime/run-state-registry.js +9 -0
  40. package/dist/runtime/run-state-registry.js.map +1 -1
  41. package/dist/storage/agent-tree-snapshot.d.ts +2 -0
  42. package/dist/storage/planned-task-storage.js +2 -1
  43. package/dist/storage/planned-task-storage.js.map +1 -1
  44. package/dist/storage/workflow-loop-storage.d.ts +292 -12
  45. package/dist/stream/consume-with-hitl.d.ts +1 -0
  46. package/dist/stream/consume-with-hitl.js +1 -0
  47. package/dist/stream/consume-with-hitl.js.map +1 -1
  48. package/dist/tools/credentials.tool.js +20 -3
  49. package/dist/tools/credentials.tool.js.map +1 -1
  50. package/dist/tools/data-tables.tool.js +60 -22
  51. package/dist/tools/data-tables.tool.js.map +1 -1
  52. package/dist/tools/executions.tool.js +4 -1
  53. package/dist/tools/executions.tool.js.map +1 -1
  54. package/dist/tools/index.d.ts +1 -2
  55. package/dist/tools/index.js +2 -3
  56. package/dist/tools/index.js.map +1 -1
  57. package/dist/tools/nodes/suggested-nodes-data.js +1 -1
  58. package/dist/tools/nodes/suggested-nodes-data.js.map +1 -1
  59. package/dist/tools/nodes.tool.js +25 -13
  60. package/dist/tools/nodes.tool.js.map +1 -1
  61. package/dist/tools/orchestration/add-plan-item.tool.js +3 -1
  62. package/dist/tools/orchestration/add-plan-item.tool.js.map +1 -1
  63. package/dist/tools/orchestration/blueprint-accumulator.d.ts +4 -1
  64. package/dist/tools/orchestration/blueprint-accumulator.js +28 -0
  65. package/dist/tools/orchestration/blueprint-accumulator.js.map +1 -1
  66. package/dist/tools/orchestration/blueprint.schema.d.ts +60 -15
  67. package/dist/tools/orchestration/blueprint.schema.js +15 -1
  68. package/dist/tools/orchestration/blueprint.schema.js.map +1 -1
  69. package/dist/tools/orchestration/browser-credential-setup.prompt.d.ts +13 -0
  70. package/dist/tools/orchestration/browser-credential-setup.prompt.js +140 -0
  71. package/dist/tools/orchestration/browser-credential-setup.prompt.js.map +1 -0
  72. package/dist/tools/orchestration/browser-credential-setup.tool.d.ts +1 -0
  73. package/dist/tools/orchestration/browser-credential-setup.tool.js +8 -139
  74. package/dist/tools/orchestration/browser-credential-setup.tool.js.map +1 -1
  75. package/dist/tools/orchestration/build-workflow-agent.prompt.js +137 -239
  76. package/dist/tools/orchestration/build-workflow-agent.prompt.js.map +1 -1
  77. package/dist/tools/orchestration/build-workflow-agent.tool.d.ts +51 -3
  78. package/dist/tools/orchestration/build-workflow-agent.tool.js +842 -269
  79. package/dist/tools/orchestration/build-workflow-agent.tool.js.map +1 -1
  80. package/dist/tools/orchestration/builder-memory-compaction.d.ts +38 -0
  81. package/dist/tools/orchestration/builder-memory-compaction.js +146 -0
  82. package/dist/tools/orchestration/builder-memory-compaction.js.map +1 -0
  83. package/dist/tools/orchestration/complete-checkpoint.tool.d.ts +2 -0
  84. package/dist/tools/orchestration/complete-checkpoint.tool.js +76 -0
  85. package/dist/tools/orchestration/complete-checkpoint.tool.js.map +1 -0
  86. package/dist/tools/orchestration/data-table-agent.prompt.d.ts +1 -1
  87. package/dist/tools/orchestration/data-table-agent.prompt.js +4 -6
  88. package/dist/tools/orchestration/data-table-agent.prompt.js.map +1 -1
  89. package/dist/tools/orchestration/data-table-agent.tool.js +34 -18
  90. package/dist/tools/orchestration/data-table-agent.tool.js.map +1 -1
  91. package/dist/tools/orchestration/delegate.tool.js +33 -17
  92. package/dist/tools/orchestration/delegate.tool.js.map +1 -1
  93. package/dist/tools/orchestration/plan-agent-prompt.d.ts +1 -1
  94. package/dist/tools/orchestration/plan-agent-prompt.js +17 -17
  95. package/dist/tools/orchestration/plan-agent-prompt.js.map +1 -1
  96. package/dist/tools/orchestration/plan-with-agent.tool.d.ts +8 -0
  97. package/dist/tools/orchestration/plan-with-agent.tool.js +43 -12
  98. package/dist/tools/orchestration/plan-with-agent.tool.js.map +1 -1
  99. package/dist/tools/orchestration/plan.tool.js +82 -2
  100. package/dist/tools/orchestration/plan.tool.js.map +1 -1
  101. package/dist/tools/orchestration/report-verification-verdict.tool.d.ts +40 -2
  102. package/dist/tools/orchestration/report-verification-verdict.tool.js +89 -7
  103. package/dist/tools/orchestration/report-verification-verdict.tool.js.map +1 -1
  104. package/dist/tools/orchestration/research-agent-prompt.d.ts +1 -1
  105. package/dist/tools/orchestration/research-agent-prompt.js +2 -4
  106. package/dist/tools/orchestration/research-agent-prompt.js.map +1 -1
  107. package/dist/tools/orchestration/research-with-agent.tool.js +33 -17
  108. package/dist/tools/orchestration/research-with-agent.tool.js.map +1 -1
  109. package/dist/tools/orchestration/verify-built-workflow.tool.d.ts +8 -2
  110. package/dist/tools/orchestration/verify-built-workflow.tool.js +476 -6
  111. package/dist/tools/orchestration/verify-built-workflow.tool.js.map +1 -1
  112. package/dist/tools/research.tool.js +2 -2
  113. package/dist/tools/research.tool.js.map +1 -1
  114. package/dist/tools/shared/ask-user.tool.js +2 -1
  115. package/dist/tools/shared/ask-user.tool.js.map +1 -1
  116. package/dist/tools/templates.tool.js +5 -90
  117. package/dist/tools/templates.tool.js.map +1 -1
  118. package/dist/tools/web-research/sanitize-web-content.d.ts +0 -1
  119. package/dist/tools/web-research/sanitize-web-content.js +0 -9
  120. package/dist/tools/web-research/sanitize-web-content.js.map +1 -1
  121. package/dist/tools/workflows/apply-workflow-credentials.tool.d.ts +2 -2
  122. package/dist/tools/workflows/build-workflow.tool.d.ts +8 -8
  123. package/dist/tools/workflows/build-workflow.tool.js +14 -2
  124. package/dist/tools/workflows/build-workflow.tool.js.map +1 -1
  125. package/dist/tools/workflows/materialize-node-type.tool.d.ts +8 -8
  126. package/dist/tools/workflows/resolve-credentials.js +6 -6
  127. package/dist/tools/workflows/resolve-credentials.js.map +1 -1
  128. package/dist/tools/workflows/setup-workflow.service.js +3 -2
  129. package/dist/tools/workflows/setup-workflow.service.js.map +1 -1
  130. package/dist/tools/workflows/submit-workflow-identity.d.ts +35 -0
  131. package/dist/tools/workflows/submit-workflow-identity.js +154 -0
  132. package/dist/tools/workflows/submit-workflow-identity.js.map +1 -0
  133. package/dist/tools/workflows/submit-workflow.tool.d.ts +82 -3
  134. package/dist/tools/workflows/submit-workflow.tool.js +114 -35
  135. package/dist/tools/workflows/submit-workflow.tool.js.map +1 -1
  136. package/dist/tracing/langsmith-tracing.d.ts +12 -0
  137. package/dist/tracing/langsmith-tracing.js +35 -3
  138. package/dist/tracing/langsmith-tracing.js.map +1 -1
  139. package/dist/tracing/trace-replay.d.ts +3 -0
  140. package/dist/tracing/trace-replay.js +65 -0
  141. package/dist/tracing/trace-replay.js.map +1 -1
  142. package/dist/types.d.ts +82 -12
  143. package/dist/utils/eval-agents.js +4 -2
  144. package/dist/utils/eval-agents.js.map +1 -1
  145. package/dist/workflow-builder/parse-validate.d.ts +5 -1
  146. package/dist/workflow-builder/parse-validate.js +4 -3
  147. package/dist/workflow-builder/parse-validate.js.map +1 -1
  148. package/dist/workflow-loop/guidance.js +15 -5
  149. package/dist/workflow-loop/guidance.js.map +1 -1
  150. package/dist/workflow-loop/index.d.ts +3 -2
  151. package/dist/workflow-loop/index.js +9 -1
  152. package/dist/workflow-loop/index.js.map +1 -1
  153. package/dist/workflow-loop/remediation.d.ts +13 -0
  154. package/dist/workflow-loop/remediation.js +36 -0
  155. package/dist/workflow-loop/remediation.js.map +1 -0
  156. package/dist/workflow-loop/runtime.js +7 -0
  157. package/dist/workflow-loop/runtime.js.map +1 -1
  158. package/dist/workflow-loop/workflow-loop-controller.d.ts +1 -1
  159. package/dist/workflow-loop/workflow-loop-controller.js +196 -29
  160. package/dist/workflow-loop/workflow-loop-controller.js.map +1 -1
  161. package/dist/workflow-loop/workflow-loop-state.d.ts +338 -8
  162. package/dist/workflow-loop/workflow-loop-state.js +44 -1
  163. package/dist/workflow-loop/workflow-loop-state.js.map +1 -1
  164. package/dist/workflow-loop/workflow-task-service.d.ts +2 -1
  165. package/dist/workflow-loop/workflow-task-service.js +4 -0
  166. package/dist/workflow-loop/workflow-task-service.js.map +1 -1
  167. package/dist/workspace/builder-sandbox-factory.d.ts +6 -1
  168. package/dist/workspace/builder-sandbox-factory.js +115 -26
  169. package/dist/workspace/builder-sandbox-factory.js.map +1 -1
  170. package/dist/workspace/create-workspace.d.ts +2 -0
  171. package/dist/workspace/create-workspace.js.map +1 -1
  172. package/dist/workspace/pack-workspace-sdk.d.ts +9 -0
  173. package/dist/workspace/pack-workspace-sdk.js +80 -0
  174. package/dist/workspace/pack-workspace-sdk.js.map +1 -0
  175. package/dist/workspace/sandbox-fs.d.ts +1 -1
  176. package/dist/workspace/sandbox-fs.js +3 -1
  177. package/dist/workspace/sandbox-fs.js.map +1 -1
  178. package/dist/workspace/sandbox-setup.js +83 -19
  179. package/dist/workspace/sandbox-setup.js.map +1 -1
  180. package/dist/workspace/snapshot-manager.d.ts +14 -2
  181. package/dist/workspace/snapshot-manager.js +57 -1
  182. package/dist/workspace/snapshot-manager.js.map +1 -1
  183. package/package.json +15 -8
  184. package/dist/tools/templates/template-api.d.ts +0 -21
  185. package/dist/tools/templates/template-api.js +0 -104
  186. package/dist/tools/templates/template-api.js.map +0 -1
  187. package/dist/tools/templates/types.d.ts +0 -52
  188. package/dist/tools/templates/types.js +0 -37
  189. package/dist/tools/templates/types.js.map +0 -1
  190. package/dist/tools/utils/mermaid.utils.d.ts +0 -15
  191. package/dist/tools/utils/mermaid.utils.js +0 -622
  192. package/dist/tools/utils/mermaid.utils.js.map +0 -1
  193. package/dist/tools/utils/node-configuration.utils.d.ts +0 -6
  194. package/dist/tools/utils/node-configuration.utils.js +0 -77
  195. package/dist/tools/utils/node-configuration.utils.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"eval-agents.js","sourceRoot":"","sources":["../../src/utils/eval-agents.ts"],"names":[],"mappings":";;;AA0CA,0CAoBC;AAMD,kCAkBC;AA/ED,wCAA+D;AAEtD,qFAFO,aAAI,OAEP;AAMA,QAAA,YAAY,GAAG,6BAA6B,CAAC;AAC7C,QAAA,WAAW,GAAG,qCAAqC,CAAC;AAMjE,SAAS,SAAS;IACjB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC1F,IAAI,CAAC,GAAG,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACd,mGAAmG,CACnG,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAMD,MAAM,mBAAmB,GAAG;IAC3B,eAAe,EAAE;QAChB,SAAS,EAAE,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,WAAoB,EAAE,EAAE;KAC3D;CACD,CAAC;AAEF,SAAgB,eAAe,CAC9B,IAAY,EACZ,OAIC;IAED,MAAM,KAAK,GAAG,IAAI,cAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;QACnC,EAAE,EAAE,OAAO,CAAC,KAAK,IAAI,oBAAY;QACjC,MAAM,EAAE,SAAS,EAAE;KACnB,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACP,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAMD,SAAgB,WAAW,CAAC,MAAsB;IACjD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACnC,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW;YAAE,SAAS;QAC3D,IAAI,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,SAAS;QACjE,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChC,IACC,OAAO,IAAI,KAAK,QAAQ;gBACxB,IAAI,KAAK,IAAI;gBACb,MAAM,IAAI,IAAI;gBACd,IAAI,CAAC,IAAI,KAAK,MAAM;gBACpB,MAAM,IAAI,IAAI,EACb,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/B,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"eval-agents.js","sourceRoot":"","sources":["../../src/utils/eval-agents.ts"],"names":[],"mappings":";;;AA6CA,0CAoBC;AAMD,kCAkBC;AAlFD,wCAA+D;AAEtD,qFAFO,aAAI,OAEP;AAMA,QAAA,YAAY,GAAG,6BAA6B,CAAC;AAC7C,QAAA,WAAW,GAAG,qCAAqC,CAAC;AAMjE,SAAS,SAAS;IACjB,MAAM,GAAG,GACR,OAAO,CAAC,GAAG,CAAC,6BAA6B;QACzC,OAAO,CAAC,GAAG,CAAC,oBAAoB;QAChC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACd,qHAAqH,CACrH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAMD,MAAM,mBAAmB,GAAG;IAC3B,eAAe,EAAE;QAChB,SAAS,EAAE,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,WAAoB,EAAE,EAAE;KAC3D;CACD,CAAC;AAEF,SAAgB,eAAe,CAC9B,IAAY,EACZ,OAIC;IAED,MAAM,KAAK,GAAG,IAAI,cAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;QACnC,EAAE,EAAE,OAAO,CAAC,KAAK,IAAI,oBAAY;QACjC,MAAM,EAAE,SAAS,EAAE;KACnB,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACP,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAMD,SAAgB,WAAW,CAAC,MAAsB;IACjD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACnC,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW;YAAE,SAAS;QAC3D,IAAI,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,SAAS;QACjE,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChC,IACC,OAAO,IAAI,KAAK,QAAQ;gBACxB,IAAI,KAAK,IAAI;gBACb,MAAM,IAAI,IAAI;gBACd,IAAI,CAAC,IAAI,KAAK,MAAM;gBACpB,MAAM,IAAI,IAAI,EACb,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/B,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvB,CAAC"}
@@ -1,5 +1,9 @@
1
+ import type { INodeTypes } from 'n8n-workflow';
1
2
  import type { ParseAndValidateResult, ValidationWarning } from './types';
2
- export declare function parseAndValidate(code: string): ParseAndValidateResult;
3
+ export interface ParseAndValidateOptions {
4
+ nodeTypesProvider?: INodeTypes;
5
+ }
6
+ export declare function parseAndValidate(code: string, options?: ParseAndValidateOptions): ParseAndValidateResult;
3
7
  export declare function partitionWarnings(warnings: ValidationWarning[]): {
4
8
  errors: ValidationWarning[];
5
9
  informational: ValidationWarning[];
@@ -13,17 +13,18 @@ function collectValidationIssues(issues, allWarnings) {
13
13
  });
14
14
  }
15
15
  }
16
- function parseAndValidate(code) {
16
+ function parseAndValidate(code, options = {}) {
17
17
  const codeToParse = (0, extract_code_1.stripImportStatements)(code);
18
+ const { nodeTypesProvider } = options;
18
19
  try {
19
20
  const builder = (0, workflow_sdk_1.parseWorkflowCodeToBuilder)(codeToParse);
20
21
  builder.regenerateNodeIds();
21
22
  const allWarnings = [];
22
- const graphValidation = builder.validate();
23
+ const graphValidation = builder.validate({ nodeTypesProvider });
23
24
  collectValidationIssues(graphValidation.errors, allWarnings);
24
25
  collectValidationIssues(graphValidation.warnings, allWarnings);
25
26
  const json = builder.toJSON();
26
- const schemaValidation = (0, workflow_sdk_1.validateWorkflow)(json);
27
+ const schemaValidation = (0, workflow_sdk_1.validateWorkflow)(json, { nodeTypesProvider, strictMode: true });
27
28
  collectValidationIssues(schemaValidation.errors, allWarnings);
28
29
  collectValidationIssues(schemaValidation.warnings, allWarnings);
29
30
  return { workflow: json, warnings: allWarnings };
@@ -1 +1 @@
1
- {"version":3,"file":"parse-validate.js","sourceRoot":"","sources":["../../src/workflow-builder/parse-validate.ts"],"names":[],"mappings":";;AAgDA,4CA+BC;AAQD,8CAmBC;AAlGD,oDAAiF;AAEjF,iDAAuD;AAavD,SAAS,uBAAuB,CAC/B,MAAyB,EACzB,WAAgC;IAEhC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,WAAW,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACxB,CAAC,CAAC;IACJ,CAAC;AACF,CAAC;AAcD,SAAgB,gBAAgB,CAAC,IAAY;IAE5C,MAAM,WAAW,GAAG,IAAA,oCAAqB,EAAC,IAAI,CAAC,CAAC;IAEhD,IAAI,CAAC;QAEJ,MAAM,OAAO,GAAG,IAAA,yCAA0B,EAAC,WAAW,CAAC,CAAC;QAGxD,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAE5B,MAAM,WAAW,GAAwB,EAAE,CAAC;QAG5C,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC3C,uBAAuB,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC7D,uBAAuB,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAE/D,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAG9B,MAAM,gBAAgB,GAAG,IAAA,+BAAgB,EAAC,IAAI,CAAC,CAAC;QAChD,uBAAuB,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC9D,uBAAuB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAEhE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACd,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAC5F,CAAC;IACH,CAAC;AACF,CAAC;AAQD,SAAgB,iBAAiB,CAAC,QAA6B;IAK9D,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAE7E,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,MAAM,aAAa,GAAwB,EAAE,CAAC;IAE9C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC;IACF,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"parse-validate.js","sourceRoot":"","sources":["../../src/workflow-builder/parse-validate.ts"],"names":[],"mappings":";;AAyDA,4CAsCC;AAQD,8CAmBC;AAlHD,oDAAiF;AAGjF,iDAAuD;AAqBvD,SAAS,uBAAuB,CAC/B,MAAyB,EACzB,WAAgC;IAEhC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,WAAW,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACxB,CAAC,CAAC;IACJ,CAAC;AACF,CAAC;AAcD,SAAgB,gBAAgB,CAC/B,IAAY,EACZ,UAAmC,EAAE;IAGrC,MAAM,WAAW,GAAG,IAAA,oCAAqB,EAAC,IAAI,CAAC,CAAC;IAEhD,MAAM,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC;IAEtC,IAAI,CAAC;QAEJ,MAAM,OAAO,GAAG,IAAA,yCAA0B,EAAC,WAAW,CAAC,CAAC;QAGxD,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAE5B,MAAM,WAAW,GAAwB,EAAE,CAAC;QAG5C,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAChE,uBAAuB,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC7D,uBAAuB,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAE/D,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAK9B,MAAM,gBAAgB,GAAG,IAAA,+BAAgB,EAAC,IAAI,EAAE,EAAE,iBAAiB,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QACzF,uBAAuB,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC9D,uBAAuB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAEhE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACd,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAC5F,CAAC;IACH,CAAC;AACF,CAAC;AAQD,SAAgB,iBAAiB,CAAC,QAA6B;IAK9D,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAE7E,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,MAAM,aAAa,GAAwB,EAAE,CAAC;IAE9C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC;IACF,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;AAClC,CAAC"}
@@ -3,6 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.formatWorkflowLoopGuidance = formatWorkflowLoopGuidance;
4
4
  function formatWorkflowLoopGuidance(action, options = {}) {
5
5
  switch (action.type) {
6
+ case 'ignored':
7
+ return `STALE REPORT IGNORED: ${action.reason}`;
8
+ case 'continue_building':
9
+ return `SUBMIT FAILED: ${action.reason}. Fix the workflow code and call \`submit-workflow\` again.`;
6
10
  case 'done': {
7
11
  if (action.mockedCredentialTypes?.length || action.hasUnresolvedPlaceholders) {
8
12
  return ('Workflow verified successfully with temporary mock data. ' +
@@ -21,15 +25,21 @@ function formatWorkflowLoopGuidance(action, options = {}) {
21
25
  case 'blocked':
22
26
  return `BUILD BLOCKED: ${action.reason}. Explain this to the user and ask how to proceed.`;
23
27
  case 'rebuild':
24
- return (`REBUILD NEEDED: The workflow at ${action.workflowId} needs structural repair. ` +
25
- 'Submit a new `plan` with one `build-workflow` task. ' +
26
- `In the task spec, explain that workflow "${action.workflowId}" needs structural repair and include these details: ${action.failureDetails}`);
28
+ return (`REBUILD NEEDED: Workflow "${action.workflowId}" needs structural repair. ` +
29
+ `Call \`build-workflow-with-agent\` directly with \`workflowId: "${action.workflowId}"\` ` +
30
+ `and \`workItemId: "${options.workItemId ?? 'unknown'}"\` ` +
31
+ '(no plan — this is a single-task rebuild; `workflowId` and `workItemId` are required ' +
32
+ 'so the builder updates the existing workflow instead of creating a duplicate). ' +
33
+ `In the \`task\` parameter, describe the structural repair and include these details: ${action.failureDetails}`);
27
34
  case 'patch':
28
35
  return (`PATCH NEEDED: Node "${action.failedNodeName}" in workflow ${action.workflowId} needs a targeted fix. ` +
29
36
  `Diagnosis: ${action.diagnosis}. ` +
30
37
  (action.patch ? `Suggested fix: ${JSON.stringify(action.patch)}. ` : '') +
31
- 'Submit a new `plan` with one `build-workflow` task. ' +
32
- `In the task spec, set mode "patch", include workflowId "${action.workflowId}", and describe the targeted fix.`);
38
+ `Call \`build-workflow-with-agent\` directly with \`workflowId: "${action.workflowId}"\` ` +
39
+ `and \`workItemId: "${options.workItemId ?? 'unknown'}"\` ` +
40
+ '(no plan — this is a single-task patch; `workflowId` and `workItemId` are required ' +
41
+ 'so the builder updates the existing workflow instead of creating a duplicate). ' +
42
+ 'In the `task` parameter, describe the targeted fix to apply.');
33
43
  }
34
44
  }
35
45
  //# sourceMappingURL=guidance.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"guidance.js","sourceRoot":"","sources":["../../src/workflow-loop/guidance.ts"],"names":[],"mappings":";;AAMA,gEAyCC;AAzCD,SAAgB,0BAA0B,CACzC,MAA0B,EAC1B,UAAuC,EAAE;IAEzC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,CAAC,CAAC;YACb,IAAI,MAAM,CAAC,qBAAqB,EAAE,MAAM,IAAI,MAAM,CAAC,yBAAyB,EAAE,CAAC;gBAC9E,OAAO,CACN,2DAA2D;oBAC3D,uDAAuD,MAAM,CAAC,UAAU,IAAI,SAAS,IAAI;oBACzF,wFAAwF;oBACxF,6HAA6H,CAC7H,CAAC;YACH,CAAC;YACD,OAAO,iEAAiE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACzI,CAAC;QACD,KAAK,QAAQ;YACZ,OAAO,CACN,wBAAwB,MAAM,CAAC,UAAU,IAAI;gBAC7C,uFAAuF,OAAO,CAAC,UAAU,IAAI,SAAS,KAAK;gBAC3H,4CAA4C;gBAC5C,6DAA6D;gBAC7D,8DAA8D,OAAO,CAAC,UAAU,IAAI,SAAS,sBAAsB,CACnH,CAAC;QACH,KAAK,SAAS;YACb,OAAO,kBAAkB,MAAM,CAAC,MAAM,oDAAoD,CAAC;QAC5F,KAAK,SAAS;YACb,OAAO,CACN,mCAAmC,MAAM,CAAC,UAAU,4BAA4B;gBAChF,sDAAsD;gBACtD,4CAA4C,MAAM,CAAC,UAAU,wDAAwD,MAAM,CAAC,cAAc,EAAE,CAC5I,CAAC;QACH,KAAK,OAAO;YACX,OAAO,CACN,uBAAuB,MAAM,CAAC,cAAc,iBAAiB,MAAM,CAAC,UAAU,yBAAyB;gBACvG,cAAc,MAAM,CAAC,SAAS,IAAI;gBAClC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxE,sDAAsD;gBACtD,2DAA2D,MAAM,CAAC,UAAU,mCAAmC,CAC/G,CAAC;IACJ,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"guidance.js","sourceRoot":"","sources":["../../src/workflow-loop/guidance.ts"],"names":[],"mappings":";;AAMA,gEAmDC;AAnDD,SAAgB,0BAA0B,CACzC,MAA0B,EAC1B,UAAuC,EAAE;IAEzC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,SAAS;YACb,OAAO,yBAAyB,MAAM,CAAC,MAAM,EAAE,CAAC;QACjD,KAAK,mBAAmB;YACvB,OAAO,kBAAkB,MAAM,CAAC,MAAM,6DAA6D,CAAC;QACrG,KAAK,MAAM,CAAC,CAAC,CAAC;YACb,IAAI,MAAM,CAAC,qBAAqB,EAAE,MAAM,IAAI,MAAM,CAAC,yBAAyB,EAAE,CAAC;gBAC9E,OAAO,CACN,2DAA2D;oBAC3D,uDAAuD,MAAM,CAAC,UAAU,IAAI,SAAS,IAAI;oBACzF,wFAAwF;oBACxF,6HAA6H,CAC7H,CAAC;YACH,CAAC;YACD,OAAO,iEAAiE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACzI,CAAC;QACD,KAAK,QAAQ;YACZ,OAAO,CACN,wBAAwB,MAAM,CAAC,UAAU,IAAI;gBAC7C,uFAAuF,OAAO,CAAC,UAAU,IAAI,SAAS,KAAK;gBAC3H,4CAA4C;gBAC5C,6DAA6D;gBAC7D,8DAA8D,OAAO,CAAC,UAAU,IAAI,SAAS,sBAAsB,CACnH,CAAC;QACH,KAAK,SAAS;YACb,OAAO,kBAAkB,MAAM,CAAC,MAAM,oDAAoD,CAAC;QAC5F,KAAK,SAAS;YACb,OAAO,CACN,6BAA6B,MAAM,CAAC,UAAU,6BAA6B;gBAC3E,mEAAmE,MAAM,CAAC,UAAU,MAAM;gBAC1F,sBAAsB,OAAO,CAAC,UAAU,IAAI,SAAS,MAAM;gBAC3D,uFAAuF;gBACvF,iFAAiF;gBACjF,wFAAwF,MAAM,CAAC,cAAc,EAAE,CAC/G,CAAC;QACH,KAAK,OAAO;YACX,OAAO,CACN,uBAAuB,MAAM,CAAC,cAAc,iBAAiB,MAAM,CAAC,UAAU,yBAAyB;gBACvG,cAAc,MAAM,CAAC,SAAS,IAAI;gBAClC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxE,mEAAmE,MAAM,CAAC,UAAU,MAAM;gBAC1F,sBAAsB,OAAO,CAAC,UAAU,IAAI,SAAS,MAAM;gBAC3D,qFAAqF;gBACrF,iFAAiF;gBACjF,8DAA8D,CAC9D,CAAC;IACJ,CAAC;AACF,CAAC"}
@@ -1,5 +1,6 @@
1
- export { workflowLoopPhaseSchema, workflowLoopStatusSchema, workflowLoopSourceSchema, workflowLoopStateSchema, attemptActionSchema, attemptResultSchema, attemptRecordSchema, triggerTypeSchema, workflowBuildOutcomeSchema, verificationVerdictSchema, verificationResultSchema, } from './workflow-loop-state';
2
- export type { WorkflowLoopPhase, WorkflowLoopStatus, WorkflowLoopSource, WorkflowLoopState, AttemptAction, AttemptResult, AttemptRecord, TriggerType, WorkflowBuildOutcome, VerificationVerdict, VerificationResult, WorkflowLoopAction, } from './workflow-loop-state';
1
+ export { workflowLoopPhaseSchema, workflowLoopStatusSchema, workflowLoopSourceSchema, remediationCategorySchema, remediationMetadataSchema, workflowLoopStateSchema, attemptActionSchema, attemptResultSchema, attemptRecordSchema, triggerTypeSchema, workflowBuildOutcomeSchema, verificationVerdictSchema, verificationResultSchema, } from './workflow-loop-state';
2
+ export type { WorkflowLoopPhase, WorkflowLoopStatus, WorkflowLoopSource, RemediationCategory, RemediationMetadata, WorkflowLoopState, AttemptAction, AttemptResult, AttemptRecord, TriggerType, WorkflowBuildOutcome, VerificationVerdict, VerificationResult, WorkflowLoopAction, } from './workflow-loop-state';
3
3
  export { createWorkItem, handleBuildOutcome, handleVerificationVerdict, formatAttemptHistory, } from './workflow-loop-controller';
4
4
  export { formatWorkflowLoopGuidance } from './guidance';
5
5
  export { WorkflowTaskCoordinator } from './workflow-task-service';
6
+ export { MAX_POST_SUBMIT_REMEDIATION_SUBMITS, MAX_PRE_SAVE_SUBMIT_FAILURES, createRemediation, remainingPostSubmitRemediations, terminalRemediationFromState, } from './remediation';
@@ -1,10 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WorkflowTaskCoordinator = exports.formatWorkflowLoopGuidance = exports.formatAttemptHistory = exports.handleVerificationVerdict = exports.handleBuildOutcome = exports.createWorkItem = exports.verificationResultSchema = exports.verificationVerdictSchema = exports.workflowBuildOutcomeSchema = exports.triggerTypeSchema = exports.attemptRecordSchema = exports.attemptResultSchema = exports.attemptActionSchema = exports.workflowLoopStateSchema = exports.workflowLoopSourceSchema = exports.workflowLoopStatusSchema = exports.workflowLoopPhaseSchema = void 0;
3
+ exports.terminalRemediationFromState = exports.remainingPostSubmitRemediations = exports.createRemediation = exports.MAX_PRE_SAVE_SUBMIT_FAILURES = exports.MAX_POST_SUBMIT_REMEDIATION_SUBMITS = exports.WorkflowTaskCoordinator = exports.formatWorkflowLoopGuidance = exports.formatAttemptHistory = exports.handleVerificationVerdict = exports.handleBuildOutcome = exports.createWorkItem = exports.verificationResultSchema = exports.verificationVerdictSchema = exports.workflowBuildOutcomeSchema = exports.triggerTypeSchema = exports.attemptRecordSchema = exports.attemptResultSchema = exports.attemptActionSchema = exports.workflowLoopStateSchema = exports.remediationMetadataSchema = exports.remediationCategorySchema = exports.workflowLoopSourceSchema = exports.workflowLoopStatusSchema = exports.workflowLoopPhaseSchema = void 0;
4
4
  var workflow_loop_state_1 = require("./workflow-loop-state");
5
5
  Object.defineProperty(exports, "workflowLoopPhaseSchema", { enumerable: true, get: function () { return workflow_loop_state_1.workflowLoopPhaseSchema; } });
6
6
  Object.defineProperty(exports, "workflowLoopStatusSchema", { enumerable: true, get: function () { return workflow_loop_state_1.workflowLoopStatusSchema; } });
7
7
  Object.defineProperty(exports, "workflowLoopSourceSchema", { enumerable: true, get: function () { return workflow_loop_state_1.workflowLoopSourceSchema; } });
8
+ Object.defineProperty(exports, "remediationCategorySchema", { enumerable: true, get: function () { return workflow_loop_state_1.remediationCategorySchema; } });
9
+ Object.defineProperty(exports, "remediationMetadataSchema", { enumerable: true, get: function () { return workflow_loop_state_1.remediationMetadataSchema; } });
8
10
  Object.defineProperty(exports, "workflowLoopStateSchema", { enumerable: true, get: function () { return workflow_loop_state_1.workflowLoopStateSchema; } });
9
11
  Object.defineProperty(exports, "attemptActionSchema", { enumerable: true, get: function () { return workflow_loop_state_1.attemptActionSchema; } });
10
12
  Object.defineProperty(exports, "attemptResultSchema", { enumerable: true, get: function () { return workflow_loop_state_1.attemptResultSchema; } });
@@ -22,4 +24,10 @@ var guidance_1 = require("./guidance");
22
24
  Object.defineProperty(exports, "formatWorkflowLoopGuidance", { enumerable: true, get: function () { return guidance_1.formatWorkflowLoopGuidance; } });
23
25
  var workflow_task_service_1 = require("./workflow-task-service");
24
26
  Object.defineProperty(exports, "WorkflowTaskCoordinator", { enumerable: true, get: function () { return workflow_task_service_1.WorkflowTaskCoordinator; } });
27
+ var remediation_1 = require("./remediation");
28
+ Object.defineProperty(exports, "MAX_POST_SUBMIT_REMEDIATION_SUBMITS", { enumerable: true, get: function () { return remediation_1.MAX_POST_SUBMIT_REMEDIATION_SUBMITS; } });
29
+ Object.defineProperty(exports, "MAX_PRE_SAVE_SUBMIT_FAILURES", { enumerable: true, get: function () { return remediation_1.MAX_PRE_SAVE_SUBMIT_FAILURES; } });
30
+ Object.defineProperty(exports, "createRemediation", { enumerable: true, get: function () { return remediation_1.createRemediation; } });
31
+ Object.defineProperty(exports, "remainingPostSubmitRemediations", { enumerable: true, get: function () { return remediation_1.remainingPostSubmitRemediations; } });
32
+ Object.defineProperty(exports, "terminalRemediationFromState", { enumerable: true, get: function () { return remediation_1.terminalRemediationFromState; } });
25
33
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflow-loop/index.ts"],"names":[],"mappings":";;;AAAA,6DAY+B;AAX9B,8HAAA,uBAAuB,OAAA;AACvB,+HAAA,wBAAwB,OAAA;AACxB,+HAAA,wBAAwB,OAAA;AACxB,8HAAA,uBAAuB,OAAA;AACvB,0HAAA,mBAAmB,OAAA;AACnB,0HAAA,mBAAmB,OAAA;AACnB,0HAAA,mBAAmB,OAAA;AACnB,wHAAA,iBAAiB,OAAA;AACjB,iIAAA,0BAA0B,OAAA;AAC1B,gIAAA,yBAAyB,OAAA;AACzB,+HAAA,wBAAwB,OAAA;AAkBzB,uEAKoC;AAJnC,0HAAA,cAAc,OAAA;AACd,8HAAA,kBAAkB,OAAA;AAClB,qIAAA,yBAAyB,OAAA;AACzB,gIAAA,oBAAoB,OAAA;AAGrB,uCAAwD;AAA/C,sHAAA,0BAA0B,OAAA;AACnC,iEAAkE;AAAzD,gIAAA,uBAAuB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflow-loop/index.ts"],"names":[],"mappings":";;;AAAA,6DAc+B;AAb9B,8HAAA,uBAAuB,OAAA;AACvB,+HAAA,wBAAwB,OAAA;AACxB,+HAAA,wBAAwB,OAAA;AACxB,gIAAA,yBAAyB,OAAA;AACzB,gIAAA,yBAAyB,OAAA;AACzB,8HAAA,uBAAuB,OAAA;AACvB,0HAAA,mBAAmB,OAAA;AACnB,0HAAA,mBAAmB,OAAA;AACnB,0HAAA,mBAAmB,OAAA;AACnB,wHAAA,iBAAiB,OAAA;AACjB,iIAAA,0BAA0B,OAAA;AAC1B,gIAAA,yBAAyB,OAAA;AACzB,+HAAA,wBAAwB,OAAA;AAoBzB,uEAKoC;AAJnC,0HAAA,cAAc,OAAA;AACd,8HAAA,kBAAkB,OAAA;AAClB,qIAAA,yBAAyB,OAAA;AACzB,gIAAA,oBAAoB,OAAA;AAGrB,uCAAwD;AAA/C,sHAAA,0BAA0B,OAAA;AACnC,iEAAkE;AAAzD,gIAAA,uBAAuB,OAAA;AAChC,6CAMuB;AALtB,kIAAA,mCAAmC,OAAA;AACnC,2HAAA,4BAA4B,OAAA;AAC5B,gHAAA,iBAAiB,OAAA;AACjB,8HAAA,+BAA+B,OAAA;AAC/B,2HAAA,4BAA4B,OAAA"}
@@ -0,0 +1,13 @@
1
+ import type { RemediationCategory, RemediationMetadata, WorkflowLoopState } from './workflow-loop-state';
2
+ export declare const MAX_PRE_SAVE_SUBMIT_FAILURES = 3;
3
+ export declare const MAX_POST_SUBMIT_REMEDIATION_SUBMITS = 2;
4
+ export declare function createRemediation(input: {
5
+ category: RemediationCategory;
6
+ shouldEdit: boolean;
7
+ guidance: string;
8
+ reason?: string;
9
+ remainingSubmitFixes?: number;
10
+ attemptCount?: number;
11
+ }): RemediationMetadata;
12
+ export declare function remainingPostSubmitRemediations(state: WorkflowLoopState): number;
13
+ export declare function terminalRemediationFromState(state: WorkflowLoopState | undefined, currentRunId?: string): RemediationMetadata | undefined;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MAX_POST_SUBMIT_REMEDIATION_SUBMITS = exports.MAX_PRE_SAVE_SUBMIT_FAILURES = void 0;
4
+ exports.createRemediation = createRemediation;
5
+ exports.remainingPostSubmitRemediations = remainingPostSubmitRemediations;
6
+ exports.terminalRemediationFromState = terminalRemediationFromState;
7
+ exports.MAX_PRE_SAVE_SUBMIT_FAILURES = 3;
8
+ exports.MAX_POST_SUBMIT_REMEDIATION_SUBMITS = 2;
9
+ function createRemediation(input) {
10
+ return input;
11
+ }
12
+ function remainingPostSubmitRemediations(state) {
13
+ return Math.max(0, exports.MAX_POST_SUBMIT_REMEDIATION_SUBMITS - (state.postSubmitRemediationSubmitsUsed ?? 0));
14
+ }
15
+ function terminalRemediationFromState(state, currentRunId) {
16
+ if (!state)
17
+ return undefined;
18
+ if (currentRunId !== undefined && state.runId !== currentRunId)
19
+ return undefined;
20
+ if (state.lastRemediation && !state.lastRemediation.shouldEdit) {
21
+ return state.lastRemediation;
22
+ }
23
+ if (state.successfulSubmitSeen &&
24
+ (state.postSubmitRemediationSubmitsUsed ?? 0) >= exports.MAX_POST_SUBMIT_REMEDIATION_SUBMITS) {
25
+ return createRemediation({
26
+ category: 'blocked',
27
+ shouldEdit: false,
28
+ reason: 'post_submit_budget_exhausted',
29
+ attemptCount: state.postSubmitRemediationSubmitsUsed ?? 0,
30
+ remainingSubmitFixes: 0,
31
+ guidance: 'The workflow was saved, but the automatic repair budget is exhausted. Stop editing and explain the blocker to the user.',
32
+ });
33
+ }
34
+ return undefined;
35
+ }
36
+ //# sourceMappingURL=remediation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remediation.js","sourceRoot":"","sources":["../../src/workflow-loop/remediation.ts"],"names":[],"mappings":";;;AASA,8CASC;AAED,0EAKC;AAED,oEAwBC;AA7CY,QAAA,4BAA4B,GAAG,CAAC,CAAC;AACjC,QAAA,mCAAmC,GAAG,CAAC,CAAC;AAErD,SAAgB,iBAAiB,CAAC,KAOjC;IACA,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAgB,+BAA+B,CAAC,KAAwB;IACvE,OAAO,IAAI,CAAC,GAAG,CACd,CAAC,EACD,2CAAmC,GAAG,CAAC,KAAK,CAAC,gCAAgC,IAAI,CAAC,CAAC,CACnF,CAAC;AACH,CAAC;AAED,SAAgB,4BAA4B,CAC3C,KAAoC,EACpC,YAAqB;IAErB,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,YAAY,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,YAAY;QAAE,OAAO,SAAS,CAAC;IACjF,IAAI,KAAK,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;QAChE,OAAO,KAAK,CAAC,eAAe,CAAC;IAC9B,CAAC;IACD,IACC,KAAK,CAAC,oBAAoB;QAC1B,CAAC,KAAK,CAAC,gCAAgC,IAAI,CAAC,CAAC,IAAI,2CAAmC,EACnF,CAAC;QACF,OAAO,iBAAiB,CAAC;YACxB,QAAQ,EAAE,SAAS;YACnB,UAAU,EAAE,KAAK;YACjB,MAAM,EAAE,8BAA8B;YACtC,YAAY,EAAE,KAAK,CAAC,gCAAgC,IAAI,CAAC;YACzD,oBAAoB,EAAE,CAAC;YACvB,QAAQ,EACP,yHAAyH;SAC1H,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC"}
@@ -6,11 +6,14 @@ function createInitialState(threadId, outcome) {
6
6
  return {
7
7
  workItemId: outcome.workItemId,
8
8
  threadId,
9
+ runId: outcome.runId,
9
10
  workflowId: outcome.workflowId,
10
11
  phase: 'building',
11
12
  status: 'active',
12
13
  source: outcome.workflowId ? 'modify' : 'create',
13
14
  rebuildAttempts: 0,
15
+ preSaveSubmitFailures: 0,
16
+ postSubmitRemediationSubmitsUsed: 0,
14
17
  };
15
18
  }
16
19
  class WorkflowLoopRuntime {
@@ -23,6 +26,8 @@ class WorkflowLoopRuntime {
23
26
  const state = existing?.state ?? createInitialState(threadId, outcome);
24
27
  const attempts = existing?.attempts ?? [];
25
28
  const { state: newState, action, attempt } = (0, workflow_loop_controller_1.handleBuildOutcome)(state, attempts, outcome);
29
+ if (action.type === 'ignored')
30
+ return action;
26
31
  await this.storage.saveWorkItem(threadId, newState, [...attempts, attempt], outcome);
27
32
  return action;
28
33
  }
@@ -32,6 +37,8 @@ class WorkflowLoopRuntime {
32
37
  return { type: 'blocked', reason: `Unknown work item: ${verdict.workItemId}` };
33
38
  }
34
39
  const { state: newState, action, attempt, } = (0, workflow_loop_controller_1.handleVerificationVerdict)(existing.state, existing.attempts, verdict);
40
+ if (action.type === 'ignored')
41
+ return action;
35
42
  await this.storage.saveWorkItem(threadId, newState, [...existing.attempts, attempt]);
36
43
  return action;
37
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/workflow-loop/runtime.ts"],"names":[],"mappings":";;;AAAA,yEAA2F;AAS3F,SAAS,kBAAkB,CAAC,QAAgB,EAAE,OAA6B;IAC1E,OAAO;QACN,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,QAAQ;QACR,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;QAChD,eAAe,EAAE,CAAC;KAClB,CAAC;AACH,CAAC;AAED,MAAa,mBAAmB;IACF;IAA7B,YAA6B,OAA4B;QAA5B,YAAO,GAAP,OAAO,CAAqB;IAAG,CAAC;IAE7D,KAAK,CAAC,iBAAiB,CACtB,QAAgB,EAChB,OAA6B;QAE7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9E,MAAM,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,QAAQ,EAAE,QAAQ,IAAI,EAAE,CAAC;QAE1C,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,6CAAkB,EAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC1F,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QACrF,OAAO,MAAM,CAAC;IACf,CAAC;IAED,KAAK,CAAC,wBAAwB,CAC7B,QAAgB,EAChB,OAA2B;QAE3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9E,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,sBAAsB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;QAChF,CAAC;QAED,MAAM,EACL,KAAK,EAAE,QAAQ,EACf,MAAM,EACN,OAAO,GACP,GAAG,IAAA,oDAAyB,EAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE1E,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QACrF,OAAO,MAAM,CAAC;IACf,CAAC;CACD;AAlCD,kDAkCC"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/workflow-loop/runtime.ts"],"names":[],"mappings":";;;AAAA,yEAA2F;AAS3F,SAAS,kBAAkB,CAAC,QAAgB,EAAE,OAA6B;IAC1E,OAAO;QACN,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,QAAQ;QACR,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;QAChD,eAAe,EAAE,CAAC;QAClB,qBAAqB,EAAE,CAAC;QACxB,gCAAgC,EAAE,CAAC;KACnC,CAAC;AACH,CAAC;AAED,MAAa,mBAAmB;IACF;IAA7B,YAA6B,OAA4B;QAA5B,YAAO,GAAP,OAAO,CAAqB;IAAG,CAAC;IAE7D,KAAK,CAAC,iBAAiB,CACtB,QAAgB,EAChB,OAA6B;QAE7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9E,MAAM,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,QAAQ,EAAE,QAAQ,IAAI,EAAE,CAAC;QAE1C,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,6CAAkB,EAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC1F,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QAE7C,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QACrF,OAAO,MAAM,CAAC;IACf,CAAC;IAED,KAAK,CAAC,wBAAwB,CAC7B,QAAgB,EAChB,OAA2B;QAE3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9E,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,sBAAsB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;QAChF,CAAC;QAED,MAAM,EACL,KAAK,EAAE,QAAQ,EACf,MAAM,EACN,OAAO,GACP,GAAG,IAAA,oDAAyB,EAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC1E,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QAE7C,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QACrF,OAAO,MAAM,CAAC;IACf,CAAC;CACD;AArCD,kDAqCC"}
@@ -1,5 +1,5 @@
1
1
  import type { AttemptRecord, WorkflowBuildOutcome, WorkflowLoopAction, WorkflowLoopSource, WorkflowLoopState, VerificationResult } from './workflow-loop-state';
2
- export declare function createWorkItem(threadId: string, source: WorkflowLoopSource, workflowId?: string): WorkflowLoopState;
2
+ export declare function createWorkItem(threadId: string, source: WorkflowLoopSource, workflowId?: string, runId?: string): WorkflowLoopState;
3
3
  interface TransitionResult {
4
4
  state: WorkflowLoopState;
5
5
  action: WorkflowLoopAction;
@@ -5,26 +5,91 @@ exports.handleBuildOutcome = handleBuildOutcome;
5
5
  exports.handleVerificationVerdict = handleVerificationVerdict;
6
6
  exports.formatAttemptHistory = formatAttemptHistory;
7
7
  const nanoid_1 = require("nanoid");
8
- function createWorkItem(threadId, source, workflowId) {
8
+ const remediation_1 = require("./remediation");
9
+ function createWorkItem(threadId, source, workflowId, runId) {
9
10
  return {
10
11
  workItemId: `wi_${(0, nanoid_1.nanoid)(8)}`,
11
12
  threadId,
13
+ runId,
12
14
  workflowId,
13
15
  phase: 'building',
14
16
  status: 'active',
15
17
  source,
16
18
  rebuildAttempts: 0,
19
+ preSaveSubmitFailures: 0,
20
+ postSubmitRemediationSubmitsUsed: 0,
17
21
  };
18
22
  }
19
23
  function handleBuildOutcome(state, attempts, outcome) {
20
- const attempt = makeAttempt(state, 'build', attempts);
24
+ if (isStaleRunReport(state, outcome.runId)) {
25
+ const attempt = makeAttempt(state, 'build', attempts);
26
+ attempt.result = 'failure';
27
+ return {
28
+ state,
29
+ action: { type: 'ignored', reason: staleRunReportReason(state.runId, outcome.runId) },
30
+ attempt,
31
+ };
32
+ }
33
+ const normalizedState = state;
34
+ const attempt = makeAttempt(normalizedState, 'build', attempts);
35
+ const isRepairSubmit = Boolean(normalizedState.successfulSubmitSeen);
36
+ const postSubmitRemediationSubmitsUsed = isRepairSubmit
37
+ ? (normalizedState.postSubmitRemediationSubmitsUsed ?? 0) + 1
38
+ : (normalizedState.postSubmitRemediationSubmitsUsed ?? 0);
39
+ const remainingSubmitFixes = Math.max(0, remediation_1.MAX_POST_SUBMIT_REMEDIATION_SUBMITS - postSubmitRemediationSubmitsUsed);
40
+ const remediation = withRemainingSubmitFixes(outcome.remediation, remainingSubmitFixes);
41
+ applyRemediationToAttempt(attempt, remediation);
21
42
  if (!outcome.submitted) {
22
- attempt.result = outcome.needsUserInput ? 'blocked' : 'failure';
43
+ const preSaveSubmitFailures = normalizedState.successfulSubmitSeen
44
+ ? (normalizedState.preSaveSubmitFailures ?? 0)
45
+ : (normalizedState.preSaveSubmitFailures ?? 0) + 1;
46
+ const preSaveBudgetExhausted = !normalizedState.successfulSubmitSeen &&
47
+ preSaveSubmitFailures >= remediation_1.MAX_PRE_SAVE_SUBMIT_FAILURES;
48
+ const postSubmitBudgetExhausted = normalizedState.successfulSubmitSeen &&
49
+ postSubmitRemediationSubmitsUsed >= remediation_1.MAX_POST_SUBMIT_REMEDIATION_SUBMITS;
50
+ let terminalRemediation = remediation;
51
+ if (preSaveBudgetExhausted && remediation?.shouldEdit !== false) {
52
+ terminalRemediation = (0, remediation_1.createRemediation)({
53
+ category: 'blocked',
54
+ shouldEdit: false,
55
+ reason: 'pre_save_submit_budget_exhausted',
56
+ attemptCount: preSaveSubmitFailures,
57
+ remainingSubmitFixes: 0,
58
+ guidance: 'The workflow could not be saved after three submit attempts. Stop editing and explain the blocker to the user.',
59
+ });
60
+ }
61
+ else if (postSubmitBudgetExhausted && remediation?.shouldEdit !== false) {
62
+ terminalRemediation = (0, remediation_1.createRemediation)({
63
+ category: 'blocked',
64
+ shouldEdit: false,
65
+ reason: 'post_submit_budget_exhausted',
66
+ attemptCount: postSubmitRemediationSubmitsUsed,
67
+ remainingSubmitFixes: 0,
68
+ guidance: 'The workflow was saved, but the automatic repair budget is exhausted. Stop editing and explain the blocker to the user.',
69
+ });
70
+ }
71
+ applyRemediationToAttempt(attempt, terminalRemediation);
72
+ attempt.result =
73
+ outcome.needsUserInput || terminalRemediation?.shouldEdit === false ? 'blocked' : 'failure';
23
74
  attempt.failureSignature = outcome.failureSignature;
24
- const reason = outcome.blockingReason ?? outcome.failureSignature ?? 'Builder failed to submit workflow';
75
+ const reason = terminalRemediation?.guidance ??
76
+ outcome.blockingReason ??
77
+ outcome.failureSignature ??
78
+ 'Builder failed to submit workflow';
79
+ const nextState = {
80
+ ...normalizedState,
81
+ lastTaskId: outcome.taskId,
82
+ preSaveSubmitFailures,
83
+ postSubmitRemediationSubmitsUsed,
84
+ lastRemediation: terminalRemediation ?? normalizedState.lastRemediation,
85
+ };
25
86
  return {
26
- state: { ...state, phase: 'blocked', status: 'blocked', lastTaskId: outcome.taskId },
27
- action: { type: 'blocked', reason },
87
+ state: outcome.needsUserInput || terminalRemediation?.shouldEdit === false
88
+ ? { ...nextState, phase: 'blocked', status: 'blocked' }
89
+ : nextState,
90
+ action: outcome.needsUserInput || terminalRemediation?.shouldEdit === false
91
+ ? { type: 'blocked', reason }
92
+ : { type: 'continue_building', reason },
28
93
  attempt,
29
94
  };
30
95
  }
@@ -35,12 +100,25 @@ function handleBuildOutcome(state, attempts, outcome) {
35
100
  : undefined;
36
101
  const hasUnresolvedPlaceholders = outcome.hasUnresolvedPlaceholders ?? undefined;
37
102
  const updatedState = {
38
- ...state,
39
- workflowId: outcome.workflowId ?? state.workflowId,
103
+ ...normalizedState,
104
+ workflowId: outcome.workflowId ?? normalizedState.workflowId,
40
105
  lastTaskId: outcome.taskId,
41
- mockedCredentialTypes: mockedCredentialTypes ?? state.mockedCredentialTypes,
42
- hasUnresolvedPlaceholders: hasUnresolvedPlaceholders ?? state.hasUnresolvedPlaceholders,
106
+ mockedCredentialTypes: mockedCredentialTypes ?? normalizedState.mockedCredentialTypes,
107
+ hasUnresolvedPlaceholders: hasUnresolvedPlaceholders ?? normalizedState.hasUnresolvedPlaceholders,
108
+ successfulSubmitSeen: true,
109
+ preSaveSubmitFailures: normalizedState.successfulSubmitSeen
110
+ ? (normalizedState.preSaveSubmitFailures ?? 0)
111
+ : 0,
112
+ postSubmitRemediationSubmitsUsed,
113
+ lastRemediation: remediation,
43
114
  };
115
+ if (outcome.needsUserInput) {
116
+ return {
117
+ state: { ...updatedState, phase: 'blocked', status: 'blocked' },
118
+ action: { type: 'blocked', reason: outcome.blockingReason ?? 'Needs user input' },
119
+ attempt,
120
+ };
121
+ }
44
122
  if (outcome.triggerType === 'trigger_only') {
45
123
  return {
46
124
  state: { ...updatedState, phase: 'done', status: 'completed' },
@@ -54,13 +132,6 @@ function handleBuildOutcome(state, attempts, outcome) {
54
132
  attempt,
55
133
  };
56
134
  }
57
- if (outcome.needsUserInput) {
58
- return {
59
- state: { ...updatedState, phase: 'blocked', status: 'blocked' },
60
- action: { type: 'blocked', reason: outcome.blockingReason ?? 'Needs user input' },
61
- attempt,
62
- };
63
- }
64
135
  return {
65
136
  state: { ...updatedState, phase: 'verifying', status: 'active' },
66
137
  action: { type: 'verify', workflowId: outcome.workflowId },
@@ -68,26 +139,54 @@ function handleBuildOutcome(state, attempts, outcome) {
68
139
  };
69
140
  }
70
141
  function handleVerificationVerdict(state, attempts, verdict) {
71
- const attempt = makeAttempt(state, 'verify', attempts);
142
+ if (isStaleRunReport(state, verdict.runId)) {
143
+ const attempt = makeAttempt(state, 'verify', attempts);
144
+ attempt.result = 'failure';
145
+ return {
146
+ state,
147
+ action: { type: 'ignored', reason: staleRunReportReason(state.runId, verdict.runId) },
148
+ attempt,
149
+ };
150
+ }
151
+ const normalizedState = state;
152
+ const attempt = makeAttempt(normalizedState, 'verify', attempts);
72
153
  attempt.executionId = verdict.executionId;
73
154
  attempt.failureSignature = verdict.failureSignature;
74
155
  attempt.diagnosis = verdict.diagnosis;
156
+ const remediation = withRemainingSubmitFixes(verdict.remediation, (0, remediation_1.remainingPostSubmitRemediations)(normalizedState));
157
+ applyRemediationToAttempt(attempt, remediation);
158
+ if (remediation && !remediation.shouldEdit) {
159
+ attempt.result = 'blocked';
160
+ return {
161
+ state: {
162
+ ...normalizedState,
163
+ phase: 'blocked',
164
+ status: 'blocked',
165
+ lastExecutionId: verdict.executionId,
166
+ lastFailureSignature: verdict.failureSignature,
167
+ lastRemediation: remediation,
168
+ },
169
+ action: { type: 'blocked', reason: remediation.guidance },
170
+ attempt,
171
+ };
172
+ }
75
173
  switch (verdict.verdict) {
76
174
  case 'verified': {
77
175
  attempt.result = 'success';
78
176
  return {
79
177
  state: {
80
- ...state,
178
+ ...normalizedState,
81
179
  phase: 'done',
82
180
  status: 'completed',
83
181
  lastExecutionId: verdict.executionId,
182
+ lastRemediation: remediation,
84
183
  },
85
184
  action: {
86
185
  type: 'done',
87
186
  workflowId: verdict.workflowId,
88
187
  summary: verdict.summary,
89
- mockedCredentialTypes: state.mockedCredentialTypes,
90
- hasUnresolvedPlaceholders: state.hasUnresolvedPlaceholders,
188
+ mockedCredentialTypes: normalizedState.mockedCredentialTypes,
189
+ hasUnresolvedPlaceholders: normalizedState.hasUnresolvedPlaceholders,
91
190
  },
92
191
  attempt,
93
192
  };
@@ -95,13 +194,18 @@ function handleVerificationVerdict(state, attempts, verdict) {
95
194
  case 'trigger_only': {
96
195
  attempt.result = 'success';
97
196
  return {
98
- state: { ...state, phase: 'done', status: 'completed' },
197
+ state: {
198
+ ...normalizedState,
199
+ phase: 'done',
200
+ status: 'completed',
201
+ lastRemediation: remediation,
202
+ },
99
203
  action: {
100
204
  type: 'done',
101
205
  workflowId: verdict.workflowId,
102
206
  summary: verdict.summary,
103
- mockedCredentialTypes: state.mockedCredentialTypes,
104
- hasUnresolvedPlaceholders: state.hasUnresolvedPlaceholders,
207
+ mockedCredentialTypes: normalizedState.mockedCredentialTypes,
208
+ hasUnresolvedPlaceholders: normalizedState.hasUnresolvedPlaceholders,
105
209
  },
106
210
  attempt,
107
211
  };
@@ -109,7 +213,12 @@ function handleVerificationVerdict(state, attempts, verdict) {
109
213
  case 'needs_user_input': {
110
214
  attempt.result = 'blocked';
111
215
  return {
112
- state: { ...state, phase: 'blocked', status: 'blocked' },
216
+ state: {
217
+ ...normalizedState,
218
+ phase: 'blocked',
219
+ status: 'blocked',
220
+ lastRemediation: remediation,
221
+ },
113
222
  action: { type: 'blocked', reason: verdict.diagnosis ?? 'Needs user input' },
114
223
  attempt,
115
224
  };
@@ -118,10 +227,11 @@ function handleVerificationVerdict(state, attempts, verdict) {
118
227
  attempt.result = 'failure';
119
228
  return {
120
229
  state: {
121
- ...state,
230
+ ...normalizedState,
122
231
  phase: 'blocked',
123
232
  status: 'blocked',
124
233
  lastFailureSignature: verdict.failureSignature,
234
+ lastRemediation: remediation,
125
235
  },
126
236
  action: { type: 'blocked', reason: verdict.summary },
127
237
  attempt,
@@ -130,7 +240,7 @@ function handleVerificationVerdict(state, attempts, verdict) {
130
240
  case 'needs_patch': {
131
241
  attempt.result = 'failure';
132
242
  attempt.action = 'patch';
133
- return escalateToRepair(state, attempts, verdict, attempt, {
243
+ return escalateToRepair(normalizedState, attempts, verdict, attempt, remediation, {
134
244
  type: 'patch',
135
245
  workflowId: verdict.workflowId,
136
246
  failedNodeName: verdict.failedNodeName ?? 'unknown',
@@ -148,7 +258,7 @@ function handleVerificationVerdict(state, attempts, verdict) {
148
258
  ]
149
259
  .filter(Boolean)
150
260
  .join('. ');
151
- return escalateToRepair(state, attempts, verdict, attempt, {
261
+ return escalateToRepair(normalizedState, attempts, verdict, attempt, remediation, {
152
262
  type: 'rebuild',
153
263
  workflowId: verdict.workflowId,
154
264
  failureDetails: failureDetails || verdict.summary,
@@ -156,14 +266,24 @@ function handleVerificationVerdict(state, attempts, verdict) {
156
266
  }
157
267
  }
158
268
  }
159
- function escalateToRepair(state, attempts, verdict, attempt, action) {
269
+ function escalateToRepair(state, attempts, verdict, attempt, remediation, action) {
160
270
  if (verdict.failureSignature && hasRepeatedRepair(attempts, verdict.failureSignature)) {
271
+ const blockedRemediation = (0, remediation_1.createRemediation)({
272
+ category: 'blocked',
273
+ shouldEdit: false,
274
+ reason: 'duplicate_failure_signature',
275
+ attemptCount: state.postSubmitRemediationSubmitsUsed ?? 0,
276
+ remainingSubmitFixes: (0, remediation_1.remainingPostSubmitRemediations)(state),
277
+ guidance: `Repeated repair failure: ${verdict.failureSignature}`,
278
+ });
279
+ applyRemediationToAttempt(attempt, blockedRemediation);
161
280
  return {
162
281
  state: {
163
282
  ...state,
164
283
  phase: 'blocked',
165
284
  status: 'blocked',
166
285
  lastFailureSignature: verdict.failureSignature,
286
+ lastRemediation: blockedRemediation,
167
287
  },
168
288
  action: {
169
289
  type: 'blocked',
@@ -172,6 +292,31 @@ function escalateToRepair(state, attempts, verdict, attempt, action) {
172
292
  attempt,
173
293
  };
174
294
  }
295
+ if ((state.postSubmitRemediationSubmitsUsed ?? 0) >= remediation_1.MAX_POST_SUBMIT_REMEDIATION_SUBMITS) {
296
+ const blockedRemediation = (0, remediation_1.createRemediation)({
297
+ category: 'blocked',
298
+ shouldEdit: false,
299
+ reason: 'post_submit_budget_exhausted',
300
+ attemptCount: state.postSubmitRemediationSubmitsUsed ?? 0,
301
+ remainingSubmitFixes: 0,
302
+ guidance: 'The workflow was saved, but the automatic repair budget is exhausted. Stop editing and explain the blocker to the user.',
303
+ });
304
+ applyRemediationToAttempt(attempt, blockedRemediation);
305
+ return {
306
+ state: {
307
+ ...state,
308
+ phase: 'blocked',
309
+ status: 'blocked',
310
+ lastFailureSignature: verdict.failureSignature,
311
+ lastRemediation: blockedRemediation,
312
+ },
313
+ action: {
314
+ type: 'blocked',
315
+ reason: blockedRemediation.guidance,
316
+ },
317
+ attempt,
318
+ };
319
+ }
175
320
  return {
176
321
  state: {
177
322
  ...state,
@@ -180,11 +325,33 @@ function escalateToRepair(state, attempts, verdict, attempt, action) {
180
325
  rebuildAttempts: state.rebuildAttempts + 1,
181
326
  lastFailureSignature: verdict.failureSignature,
182
327
  lastExecutionId: verdict.executionId,
328
+ lastRemediation: remediation,
183
329
  },
184
330
  action,
185
331
  attempt,
186
332
  };
187
333
  }
334
+ function isStaleRunReport(state, runId) {
335
+ return Boolean(runId && state.runId && state.runId !== runId);
336
+ }
337
+ function staleRunReportReason(stateRunId, reportRunId) {
338
+ return `Ignoring report from stale run "${reportRunId}" for active run "${stateRunId ?? 'unknown'}".`;
339
+ }
340
+ function withRemainingSubmitFixes(remediation, remainingSubmitFixes) {
341
+ if (!remediation)
342
+ return undefined;
343
+ return {
344
+ ...remediation,
345
+ remainingSubmitFixes,
346
+ };
347
+ }
348
+ function applyRemediationToAttempt(attempt, remediation) {
349
+ if (!remediation)
350
+ return;
351
+ attempt.remediationCategory = remediation.category;
352
+ attempt.remediationShouldEdit = remediation.shouldEdit;
353
+ attempt.remediationGuidance = remediation.guidance;
354
+ }
188
355
  function hasRepeatedRepair(attempts, failureSignature) {
189
356
  return attempts.some((a) => (a.action === 'rebuild' || a.action === 'patch') && a.failureSignature === failureSignature);
190
357
  }