@kody-ade/kody-engine 0.4.650 → 0.4.651

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 (2) hide show
  1. package/dist/bin/kody.js +24 -16
  2. package/package.json +1 -1
package/dist/bin/kody.js CHANGED
@@ -15,7 +15,7 @@ var init_package = __esm({
15
15
  "package.json"() {
16
16
  package_default = {
17
17
  name: "@kody-ade/kody-engine",
18
- version: "0.4.650",
18
+ version: "0.4.651",
19
19
  description: "kody \u2014 autonomous development engine. Single-session Claude Code agent behind a generic executor + declarative implementation profiles.",
20
20
  license: "MIT",
21
21
  repository: {
@@ -24969,8 +24969,7 @@ async function runJob(job, base) {
24969
24969
  });
24970
24970
  }
24971
24971
  if (valid.workflowRunId && workflowIdentity && base.config && result.workflowState) {
24972
- await lease?.checkpoint();
24973
- await writeWorkflowRunState(base.config, base.cwd, workflowIdentity, valid.workflowRunId, result.workflowState);
24972
+ await checkpointTerminalWorkflowState(checkpoint, result.workflowState);
24974
24973
  }
24975
24974
  if (valid.workflowRunId && workflowIdentity && hasGitHubActionsIdentity() && result.workflowState?.status !== "waiting-approval") {
24976
24975
  const facts = result.workflowState?.facts ?? {};
@@ -25122,7 +25121,7 @@ async function runCapabilityWorkflow(parent, workflow, capability, base, checkpo
25122
25121
  const state = initialWorkflowState(parent, workflow);
25123
25122
  state.status = "blocked";
25124
25123
  state.blocker = invalid;
25125
- await checkpoint?.(state);
25124
+ await checkpointTerminalWorkflowState(checkpoint, state);
25126
25125
  return { exitCode: 64, reason: invalid, workflowState: state };
25127
25126
  }
25128
25127
  return { exitCode: 64, reason: invalid };
@@ -25132,7 +25131,7 @@ async function runCapabilityWorkflow(parent, workflow, capability, base, checkpo
25132
25131
  const state = initialWorkflowState(parent, workflow);
25133
25132
  state.status = "blocked";
25134
25133
  state.blocker = resumeBlocker;
25135
- await checkpoint?.(state);
25134
+ await checkpointTerminalWorkflowState(checkpoint, state);
25136
25135
  return { exitCode: 64, reason: resumeBlocker, workflowState: state };
25137
25136
  }
25138
25137
  const result = isGraphWorkflow(workflow) ? await runGraphCapabilityWorkflow(parent, workflow, capability, base, checkpoint) : await runLinearCapabilityWorkflow(parent, workflow, capability, base, checkpoint);
@@ -25226,7 +25225,7 @@ async function runLinearCapabilityWorkflow(parent, workflow, capability, base, c
25226
25225
  if (result.exitCode !== 0 && !canContinueWorkflow(step, outcome)) {
25227
25226
  state.status = result.capabilityResults?.at(-1)?.status === "blocked" ? "blocked" : "failed";
25228
25227
  state.blocker = result.reason ?? `workflow ${capability.slug} stopped at step ${index + 1}/${workflow.steps.length}: ${label}`;
25229
- await checkpoint?.(state);
25228
+ await checkpointTerminalWorkflowState(checkpoint, state);
25230
25229
  return withWorkflowBoundaryEval(capability, {
25231
25230
  ...result,
25232
25231
  reason: state.blocker,
@@ -25236,7 +25235,7 @@ async function runLinearCapabilityWorkflow(parent, workflow, capability, base, c
25236
25235
  }
25237
25236
  state.status = "done";
25238
25237
  delete state.blocker;
25239
- await checkpoint?.(state);
25238
+ await checkpointTerminalWorkflowState(checkpoint, state);
25240
25239
  return withWorkflowBoundaryEval(capability, { ...result, workflowState: state });
25241
25240
  }
25242
25241
  function isGraphWorkflow(workflow) {
@@ -25335,7 +25334,7 @@ async function runGraphCapabilityWorkflow(parent, workflow, capability, base, ch
25335
25334
  const reason = `workflow ${capability.slug} exceeded ${maxExecutedSteps} executed steps`;
25336
25335
  state.status = "blocked";
25337
25336
  state.blocker = reason;
25338
- await checkpoint?.(state);
25337
+ await checkpointTerminalWorkflowState(checkpoint, state);
25339
25338
  return { ...result, exitCode: 64, reason, workflowState: state };
25340
25339
  }
25341
25340
  const index = workflow.steps.findIndex((step2) => step2.id === state.currentStepId);
@@ -25344,7 +25343,7 @@ async function runGraphCapabilityWorkflow(parent, workflow, capability, base, ch
25344
25343
  const reason = `workflow ${capability.slug} current step ${state.currentStepId} is missing`;
25345
25344
  state.status = "blocked";
25346
25345
  state.blocker = reason;
25347
- await checkpoint?.(state);
25346
+ await checkpointTerminalWorkflowState(checkpoint, state);
25348
25347
  return { ...result, exitCode: 64, reason, workflowState: state };
25349
25348
  }
25350
25349
  const label = step.action ?? step.capability;
@@ -25377,7 +25376,7 @@ async function runGraphCapabilityWorkflow(parent, workflow, capability, base, ch
25377
25376
  output: { status: "blocked", summary: reason },
25378
25377
  completedAt: (/* @__PURE__ */ new Date()).toISOString()
25379
25378
  };
25380
- await checkpoint?.(state);
25379
+ await checkpointTerminalWorkflowState(checkpoint, state);
25381
25380
  return { exitCode: 64, reason, workflowState: state };
25382
25381
  }
25383
25382
  beginWorkflowStep(state, step, child);
@@ -25438,7 +25437,7 @@ async function runGraphCapabilityWorkflow(parent, workflow, capability, base, ch
25438
25437
  const lastResult = result.capabilityResults?.at(-1);
25439
25438
  state.status = lastResult?.status === "blocked" ? "blocked" : "failed";
25440
25439
  state.blocker = result.reason ?? `workflow step ${step.id} failed`;
25441
- await checkpoint?.(state);
25440
+ await checkpointTerminalWorkflowState(checkpoint, state);
25442
25441
  return withWorkflowBoundaryEval(capability, { ...result, workflowState: state });
25443
25442
  }
25444
25443
  if (!step.next || step.next.length === 0) {
@@ -25449,7 +25448,7 @@ async function runGraphCapabilityWorkflow(parent, workflow, capability, base, ch
25449
25448
  const reason = `workflow step ${step.id} did not emit the structured result required by its conditions: ${resultConditionPaths.join(", ")}`;
25450
25449
  state.status = "blocked";
25451
25450
  state.blocker = reason;
25452
- await checkpoint?.(state);
25451
+ await checkpointTerminalWorkflowState(checkpoint, state);
25453
25452
  return { ...result, exitCode: 64, reason, workflowState: state };
25454
25453
  }
25455
25454
  const transition = selectWorkflowTransition(step, chainData, state.transitionCounts);
@@ -25458,7 +25457,7 @@ async function runGraphCapabilityWorkflow(parent, workflow, capability, base, ch
25458
25457
  const reason = exhausted.length > 0 ? `workflow step ${step.id} reached iteration limit: ${exhausted.join(", ")}` : `workflow step ${step.id} has no available connection`;
25459
25458
  state.status = "blocked";
25460
25459
  state.blocker = reason;
25461
- await checkpoint?.(state);
25460
+ await checkpointTerminalWorkflowState(checkpoint, state);
25462
25461
  return { ...result, exitCode: 64, reason, workflowState: state };
25463
25462
  }
25464
25463
  if (transition.maxIterations !== void 0) {
@@ -25474,7 +25473,7 @@ async function runGraphCapabilityWorkflow(parent, workflow, capability, base, ch
25474
25473
  await checkpoint?.(state);
25475
25474
  }
25476
25475
  state.status = "done";
25477
- await checkpoint?.(state);
25476
+ await checkpointTerminalWorkflowState(checkpoint, state);
25478
25477
  return withWorkflowBoundaryEval(capability, { ...result, workflowState: state });
25479
25478
  }
25480
25479
  async function completeWorkflowAtTerminal(capability, state, output, checkpoint) {
@@ -25485,7 +25484,7 @@ async function completeWorkflowAtTerminal(capability, state, output, checkpoint)
25485
25484
  const summary = result?.summary ?? (typeof output.capabilityOutput?.summary === "string" ? output.capabilityOutput.summary : "Workflow ended without a usable result");
25486
25485
  state.status = terminalFailure;
25487
25486
  state.blocker = summary;
25488
- await checkpoint?.(state);
25487
+ await checkpointTerminalWorkflowState(checkpoint, state);
25489
25488
  return withWorkflowBoundaryEval(capability, {
25490
25489
  ...output,
25491
25490
  exitCode: terminalFailure === "failed" ? 1 : 64,
@@ -25496,9 +25495,18 @@ async function completeWorkflowAtTerminal(capability, state, output, checkpoint)
25496
25495
  state.status = "done";
25497
25496
  delete state.currentStepId;
25498
25497
  delete state.blocker;
25499
- await checkpoint?.(state);
25498
+ await checkpointTerminalWorkflowState(checkpoint, state);
25500
25499
  return withWorkflowBoundaryEval(capability, { ...output, workflowState: state });
25501
25500
  }
25501
+ async function checkpointTerminalWorkflowState(checkpoint, state) {
25502
+ if (!checkpoint) return;
25503
+ try {
25504
+ await checkpoint(state);
25505
+ } catch (error) {
25506
+ process.stderr.write(`warning: failed to save terminal Workflow state: ${String(error)}
25507
+ `);
25508
+ }
25509
+ }
25502
25510
  function graphWorkflowExecutionKey(parentExecutionKey, workflowSlug, stepId, transitionCounts) {
25503
25511
  const transitionHistory = Object.entries(transitionCounts).filter(([, count]) => count > 0).sort(([left], [right]) => left.localeCompare(right)).map(([transition, count]) => `${transition}=${count}`).join(",");
25504
25512
  return [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kody-ade/kody-engine",
3
- "version": "0.4.650",
3
+ "version": "0.4.651",
4
4
  "description": "kody — autonomous development engine. Single-session Claude Code agent behind a generic executor + declarative implementation profiles.",
5
5
  "license": "MIT",
6
6
  "repository": {