@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.
- package/dist/agent/credential-guardrails.prompt.d.ts +1 -0
- package/dist/agent/credential-guardrails.prompt.js +5 -0
- package/dist/agent/credential-guardrails.prompt.js.map +1 -0
- package/dist/agent/instance-agent.js +0 -1
- package/dist/agent/instance-agent.js.map +1 -1
- package/dist/agent/shared-prompts.d.ts +4 -0
- package/dist/agent/shared-prompts.js +17 -0
- package/dist/agent/shared-prompts.js.map +1 -0
- package/dist/agent/sub-agent-debriefing.d.ts +2 -2
- package/dist/agent/sub-agent-factory.d.ts +1 -1
- package/dist/agent/sub-agent-factory.js +7 -7
- package/dist/agent/sub-agent-factory.js.map +1 -1
- package/dist/agent/system-prompt.js +56 -29
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/build.tsbuildinfo +1 -1
- package/dist/constants/max-steps.d.ts +1 -1
- package/dist/constants/max-steps.js +1 -1
- package/dist/constants/max-steps.js.map +1 -1
- package/dist/constants/model-settings.d.ts +3 -0
- package/dist/constants/model-settings.js +7 -0
- package/dist/constants/model-settings.js.map +1 -0
- package/dist/index.d.ts +9 -3
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +6 -0
- package/dist/planned-tasks/planned-task-permissions.d.ts +2 -0
- package/dist/planned-tasks/planned-task-permissions.js +8 -2
- package/dist/planned-tasks/planned-task-permissions.js.map +1 -1
- package/dist/planned-tasks/planned-task-service.d.ts +14 -1
- package/dist/planned-tasks/planned-task-service.js +138 -2
- package/dist/planned-tasks/planned-task-service.js.map +1 -1
- package/dist/runtime/background-task-manager.d.ts +25 -1
- package/dist/runtime/background-task-manager.js +66 -2
- package/dist/runtime/background-task-manager.js.map +1 -1
- package/dist/runtime/builder-sandbox-session-registry.d.ts +45 -0
- package/dist/runtime/builder-sandbox-session-registry.js +159 -0
- package/dist/runtime/builder-sandbox-session-registry.js.map +1 -0
- package/dist/runtime/run-state-registry.d.ts +7 -4
- package/dist/runtime/run-state-registry.js +9 -0
- package/dist/runtime/run-state-registry.js.map +1 -1
- package/dist/storage/agent-tree-snapshot.d.ts +2 -0
- package/dist/storage/planned-task-storage.js +2 -1
- package/dist/storage/planned-task-storage.js.map +1 -1
- package/dist/storage/workflow-loop-storage.d.ts +292 -12
- package/dist/stream/consume-with-hitl.d.ts +1 -0
- package/dist/stream/consume-with-hitl.js +1 -0
- package/dist/stream/consume-with-hitl.js.map +1 -1
- package/dist/tools/credentials.tool.js +20 -3
- package/dist/tools/credentials.tool.js.map +1 -1
- package/dist/tools/data-tables.tool.js +60 -22
- package/dist/tools/data-tables.tool.js.map +1 -1
- package/dist/tools/executions.tool.js +4 -1
- package/dist/tools/executions.tool.js.map +1 -1
- package/dist/tools/index.d.ts +1 -2
- package/dist/tools/index.js +2 -3
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/nodes/suggested-nodes-data.js +1 -1
- package/dist/tools/nodes/suggested-nodes-data.js.map +1 -1
- package/dist/tools/nodes.tool.js +25 -13
- package/dist/tools/nodes.tool.js.map +1 -1
- package/dist/tools/orchestration/add-plan-item.tool.js +3 -1
- package/dist/tools/orchestration/add-plan-item.tool.js.map +1 -1
- package/dist/tools/orchestration/blueprint-accumulator.d.ts +4 -1
- package/dist/tools/orchestration/blueprint-accumulator.js +28 -0
- package/dist/tools/orchestration/blueprint-accumulator.js.map +1 -1
- package/dist/tools/orchestration/blueprint.schema.d.ts +60 -15
- package/dist/tools/orchestration/blueprint.schema.js +15 -1
- package/dist/tools/orchestration/blueprint.schema.js.map +1 -1
- package/dist/tools/orchestration/browser-credential-setup.prompt.d.ts +13 -0
- package/dist/tools/orchestration/browser-credential-setup.prompt.js +140 -0
- package/dist/tools/orchestration/browser-credential-setup.prompt.js.map +1 -0
- package/dist/tools/orchestration/browser-credential-setup.tool.d.ts +1 -0
- package/dist/tools/orchestration/browser-credential-setup.tool.js +8 -139
- package/dist/tools/orchestration/browser-credential-setup.tool.js.map +1 -1
- package/dist/tools/orchestration/build-workflow-agent.prompt.js +137 -239
- package/dist/tools/orchestration/build-workflow-agent.prompt.js.map +1 -1
- package/dist/tools/orchestration/build-workflow-agent.tool.d.ts +51 -3
- package/dist/tools/orchestration/build-workflow-agent.tool.js +842 -269
- package/dist/tools/orchestration/build-workflow-agent.tool.js.map +1 -1
- package/dist/tools/orchestration/builder-memory-compaction.d.ts +38 -0
- package/dist/tools/orchestration/builder-memory-compaction.js +146 -0
- package/dist/tools/orchestration/builder-memory-compaction.js.map +1 -0
- package/dist/tools/orchestration/complete-checkpoint.tool.d.ts +2 -0
- package/dist/tools/orchestration/complete-checkpoint.tool.js +76 -0
- package/dist/tools/orchestration/complete-checkpoint.tool.js.map +1 -0
- package/dist/tools/orchestration/data-table-agent.prompt.d.ts +1 -1
- package/dist/tools/orchestration/data-table-agent.prompt.js +4 -6
- package/dist/tools/orchestration/data-table-agent.prompt.js.map +1 -1
- package/dist/tools/orchestration/data-table-agent.tool.js +34 -18
- package/dist/tools/orchestration/data-table-agent.tool.js.map +1 -1
- package/dist/tools/orchestration/delegate.tool.js +33 -17
- package/dist/tools/orchestration/delegate.tool.js.map +1 -1
- package/dist/tools/orchestration/plan-agent-prompt.d.ts +1 -1
- package/dist/tools/orchestration/plan-agent-prompt.js +17 -17
- package/dist/tools/orchestration/plan-agent-prompt.js.map +1 -1
- package/dist/tools/orchestration/plan-with-agent.tool.d.ts +8 -0
- package/dist/tools/orchestration/plan-with-agent.tool.js +43 -12
- package/dist/tools/orchestration/plan-with-agent.tool.js.map +1 -1
- package/dist/tools/orchestration/plan.tool.js +82 -2
- package/dist/tools/orchestration/plan.tool.js.map +1 -1
- package/dist/tools/orchestration/report-verification-verdict.tool.d.ts +40 -2
- package/dist/tools/orchestration/report-verification-verdict.tool.js +89 -7
- package/dist/tools/orchestration/report-verification-verdict.tool.js.map +1 -1
- package/dist/tools/orchestration/research-agent-prompt.d.ts +1 -1
- package/dist/tools/orchestration/research-agent-prompt.js +2 -4
- package/dist/tools/orchestration/research-agent-prompt.js.map +1 -1
- package/dist/tools/orchestration/research-with-agent.tool.js +33 -17
- package/dist/tools/orchestration/research-with-agent.tool.js.map +1 -1
- package/dist/tools/orchestration/verify-built-workflow.tool.d.ts +8 -2
- package/dist/tools/orchestration/verify-built-workflow.tool.js +476 -6
- package/dist/tools/orchestration/verify-built-workflow.tool.js.map +1 -1
- package/dist/tools/research.tool.js +2 -2
- package/dist/tools/research.tool.js.map +1 -1
- package/dist/tools/shared/ask-user.tool.js +2 -1
- package/dist/tools/shared/ask-user.tool.js.map +1 -1
- package/dist/tools/templates.tool.js +5 -90
- package/dist/tools/templates.tool.js.map +1 -1
- package/dist/tools/web-research/sanitize-web-content.d.ts +0 -1
- package/dist/tools/web-research/sanitize-web-content.js +0 -9
- package/dist/tools/web-research/sanitize-web-content.js.map +1 -1
- package/dist/tools/workflows/apply-workflow-credentials.tool.d.ts +2 -2
- package/dist/tools/workflows/build-workflow.tool.d.ts +8 -8
- package/dist/tools/workflows/build-workflow.tool.js +14 -2
- package/dist/tools/workflows/build-workflow.tool.js.map +1 -1
- package/dist/tools/workflows/materialize-node-type.tool.d.ts +8 -8
- package/dist/tools/workflows/resolve-credentials.js +6 -6
- package/dist/tools/workflows/resolve-credentials.js.map +1 -1
- package/dist/tools/workflows/setup-workflow.service.js +3 -2
- package/dist/tools/workflows/setup-workflow.service.js.map +1 -1
- package/dist/tools/workflows/submit-workflow-identity.d.ts +35 -0
- package/dist/tools/workflows/submit-workflow-identity.js +154 -0
- package/dist/tools/workflows/submit-workflow-identity.js.map +1 -0
- package/dist/tools/workflows/submit-workflow.tool.d.ts +82 -3
- package/dist/tools/workflows/submit-workflow.tool.js +114 -35
- package/dist/tools/workflows/submit-workflow.tool.js.map +1 -1
- package/dist/tracing/langsmith-tracing.d.ts +12 -0
- package/dist/tracing/langsmith-tracing.js +35 -3
- package/dist/tracing/langsmith-tracing.js.map +1 -1
- package/dist/tracing/trace-replay.d.ts +3 -0
- package/dist/tracing/trace-replay.js +65 -0
- package/dist/tracing/trace-replay.js.map +1 -1
- package/dist/types.d.ts +82 -12
- package/dist/utils/eval-agents.js +4 -2
- package/dist/utils/eval-agents.js.map +1 -1
- package/dist/workflow-builder/parse-validate.d.ts +5 -1
- package/dist/workflow-builder/parse-validate.js +4 -3
- package/dist/workflow-builder/parse-validate.js.map +1 -1
- package/dist/workflow-loop/guidance.js +15 -5
- package/dist/workflow-loop/guidance.js.map +1 -1
- package/dist/workflow-loop/index.d.ts +3 -2
- package/dist/workflow-loop/index.js +9 -1
- package/dist/workflow-loop/index.js.map +1 -1
- package/dist/workflow-loop/remediation.d.ts +13 -0
- package/dist/workflow-loop/remediation.js +36 -0
- package/dist/workflow-loop/remediation.js.map +1 -0
- package/dist/workflow-loop/runtime.js +7 -0
- package/dist/workflow-loop/runtime.js.map +1 -1
- package/dist/workflow-loop/workflow-loop-controller.d.ts +1 -1
- package/dist/workflow-loop/workflow-loop-controller.js +196 -29
- package/dist/workflow-loop/workflow-loop-controller.js.map +1 -1
- package/dist/workflow-loop/workflow-loop-state.d.ts +338 -8
- package/dist/workflow-loop/workflow-loop-state.js +44 -1
- package/dist/workflow-loop/workflow-loop-state.js.map +1 -1
- package/dist/workflow-loop/workflow-task-service.d.ts +2 -1
- package/dist/workflow-loop/workflow-task-service.js +4 -0
- package/dist/workflow-loop/workflow-task-service.js.map +1 -1
- package/dist/workspace/builder-sandbox-factory.d.ts +6 -1
- package/dist/workspace/builder-sandbox-factory.js +115 -26
- package/dist/workspace/builder-sandbox-factory.js.map +1 -1
- package/dist/workspace/create-workspace.d.ts +2 -0
- package/dist/workspace/create-workspace.js.map +1 -1
- package/dist/workspace/pack-workspace-sdk.d.ts +9 -0
- package/dist/workspace/pack-workspace-sdk.js +80 -0
- package/dist/workspace/pack-workspace-sdk.js.map +1 -0
- package/dist/workspace/sandbox-fs.d.ts +1 -1
- package/dist/workspace/sandbox-fs.js +3 -1
- package/dist/workspace/sandbox-fs.js.map +1 -1
- package/dist/workspace/sandbox-setup.js +83 -19
- package/dist/workspace/sandbox-setup.js.map +1 -1
- package/dist/workspace/snapshot-manager.d.ts +14 -2
- package/dist/workspace/snapshot-manager.js +57 -1
- package/dist/workspace/snapshot-manager.js.map +1 -1
- package/package.json +15 -8
- package/dist/tools/templates/template-api.d.ts +0 -21
- package/dist/tools/templates/template-api.js +0 -104
- package/dist/tools/templates/template-api.js.map +0 -1
- package/dist/tools/templates/types.d.ts +0 -52
- package/dist/tools/templates/types.js +0 -37
- package/dist/tools/templates/types.js.map +0 -1
- package/dist/tools/utils/mermaid.utils.d.ts +0 -15
- package/dist/tools/utils/mermaid.utils.js +0 -622
- package/dist/tools/utils/mermaid.utils.js.map +0 -1
- package/dist/tools/utils/node-configuration.utils.d.ts +0 -6
- package/dist/tools/utils/node-configuration.utils.js +0 -77
- 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":";;;
|
|
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
|
|
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":";;
|
|
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:
|
|
25
|
-
|
|
26
|
-
`
|
|
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
|
-
|
|
32
|
-
`
|
|
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,
|
|
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,
|
|
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;
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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:
|
|
27
|
-
|
|
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
|
-
...
|
|
39
|
-
workflowId: outcome.workflowId ??
|
|
103
|
+
...normalizedState,
|
|
104
|
+
workflowId: outcome.workflowId ?? normalizedState.workflowId,
|
|
40
105
|
lastTaskId: outcome.taskId,
|
|
41
|
-
mockedCredentialTypes: mockedCredentialTypes ??
|
|
42
|
-
hasUnresolvedPlaceholders: 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
|
-
|
|
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
|
-
...
|
|
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:
|
|
90
|
-
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: {
|
|
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:
|
|
104
|
-
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: {
|
|
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
|
-
...
|
|
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(
|
|
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(
|
|
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
|
}
|