@kimbho/kimbho-cli 0.1.22 → 0.1.25

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/index.cjs CHANGED
@@ -12718,7 +12718,7 @@ function createCompletionRuntimeCommand(program2) {
12718
12718
  // package.json
12719
12719
  var package_default = {
12720
12720
  name: "@kimbho/kimbho-cli",
12721
- version: "0.1.22",
12721
+ version: "0.1.25",
12722
12722
  description: "Kimbho CLI is a terminal-native coding agent for planning, execution, and verification.",
12723
12723
  type: "module",
12724
12724
  engines: {
@@ -24540,7 +24540,8 @@ async function runShellCommand(toolId, command, cwd, timeoutMs, signal) {
24540
24540
  command
24541
24541
  ], cwd, timeoutMs, signal);
24542
24542
  const success2 = !result.timedOut && result.code === 0;
24543
- const summary = result.timedOut ? `Command timed out after ${timeoutMs}ms.` : success2 ? `Command completed successfully.` : `Command exited with code ${result.code ?? "unknown"}.`;
24543
+ const interactiveSetupSummary = !success2 ? detectInteractiveShellPrompt(command, result.stdout, result.stderr) : null;
24544
+ const summary = result.timedOut ? `Command timed out after ${timeoutMs}ms.` : interactiveSetupSummary ? interactiveSetupSummary : success2 ? `Command completed successfully.` : `Command exited with code ${result.code ?? "unknown"}.`;
24544
24545
  return ToolResultSchema.parse({
24545
24546
  toolId,
24546
24547
  success: success2,
@@ -24549,6 +24550,18 @@ async function runShellCommand(toolId, command, cwd, timeoutMs, signal) {
24549
24550
  stderr: truncateOutput(result.stderr)
24550
24551
  });
24551
24552
  }
24553
+ function detectInteractiveShellPrompt(command, stdout, stderr) {
24554
+ const combined = `${stdout}
24555
+ ${stderr}`;
24556
+ const normalizedCommand = command.trim().toLowerCase();
24557
+ if (/how would you like to configure eslint\?/i.test(combined) || normalizedCommand.includes("next lint") && /eslint/i.test(combined) && /(strict \(recommended\)|base|cancel)/i.test(combined)) {
24558
+ return "Interactive ESLint setup required before next lint can run.";
24559
+ }
24560
+ if (/\?\s+[^\n]+\n(?:\s*❯|\s*>|\s*\*)/i.test(combined) || /(would you like to|choose one of the following|select an option|enter a value)/i.test(combined)) {
24561
+ return "Command requires interactive input before it can continue.";
24562
+ }
24563
+ return null;
24564
+ }
24552
24565
  async function executeFileRead(input, context) {
24553
24566
  if (context.signal?.aborted) {
24554
24567
  const error2 = new Error("Tool execution aborted.");
@@ -33108,6 +33121,24 @@ function isVerificationAction(action) {
33108
33121
  const command = typeof action.input.command === "string" ? action.input.command : "";
33109
33122
  return command.length > 0 && isVerificationCommand(command);
33110
33123
  }
33124
+ function extractShellCommand(action) {
33125
+ if (action.type !== "tool" || action.tool !== "shell.exec") {
33126
+ return "";
33127
+ }
33128
+ return typeof action.input.command === "string" ? action.input.command.trim() : "";
33129
+ }
33130
+ function isInteractiveVerificationSetupFailure(action, result) {
33131
+ if (!isVerificationAction(action) || result.success) {
33132
+ return false;
33133
+ }
33134
+ const command = extractShellCommand(action).toLowerCase();
33135
+ const combined = [
33136
+ result.summary,
33137
+ result.stdout ?? "",
33138
+ result.stderr ?? ""
33139
+ ].join("\n").toLowerCase();
33140
+ return combined.includes("interactive eslint setup required") || combined.includes("command requires interactive input before it can continue") || command.includes("lint") && combined.includes("how would you like to configure eslint");
33141
+ }
33111
33142
  function buildSystemPrompt(agent, task, request, allowedTools, plan, extraInstructions) {
33112
33143
  const toolShape = allowedTools.join("|");
33113
33144
  const dependencyTasks = plan ? flattenPlanTasks(plan).filter((candidate) => task.dependsOn.includes(candidate.id)) : [];
@@ -33150,6 +33181,7 @@ function buildSystemPrompt(agent, task, request, allowedTools, plan, extraInstru
33150
33181
  `- Keep paths relative to the workspace.`,
33151
33182
  `- In an existing repo, inspect and change the likely source files before running build or test verification. Do not front-load verification unless you are confirming an already-completed change or diagnosing a failure.`,
33152
33183
  `- After changing code, run verification with tests.run or shell.exec when appropriate.`,
33184
+ `- If a verification command asks for interactive setup or operator input, do not rerun it unchanged. Choose a different non-interactive verifier, or configure that verifier only if the task explicitly requires it.`,
33153
33185
  `- Do not claim success unless the task acceptance criteria are satisfied.`,
33154
33186
  `- If the task is underspecified, make a pragmatic implementation choice and continue.`,
33155
33187
  ...task.subagentInstructions ? [
@@ -33820,6 +33852,7 @@ ${truncateForModel(customAgentMemory)}`);
33820
33852
  const applyToolResult = async (parsedAction, result, step, transcriptEntry) => {
33821
33853
  const mutatingAction = isMutatingAction(parsedAction);
33822
33854
  const verificationAction = isVerificationAction(parsedAction);
33855
+ const interactiveVerificationSetupFailure = verificationAction && !result.success && isInteractiveVerificationSetupFailure(parsedAction, result);
33823
33856
  if (mutatingAction && result.success) {
33824
33857
  changedWorkspace = true;
33825
33858
  verifiedAfterLatestChange = false;
@@ -33834,6 +33867,10 @@ ${truncateForModel(customAgentMemory)}`);
33834
33867
  repairRequiredBeforeVerification = false;
33835
33868
  repairAppliedSinceFailure = false;
33836
33869
  lastVerificationFailure = null;
33870
+ } else if (interactiveVerificationSetupFailure) {
33871
+ repairRequiredBeforeVerification = false;
33872
+ repairAppliedSinceFailure = false;
33873
+ lastVerificationFailure = result;
33837
33874
  } else {
33838
33875
  verificationFailures += 1;
33839
33876
  repairRequiredBeforeVerification = true;
@@ -33853,9 +33890,25 @@ ${truncateForModel(customAgentMemory)}`);
33853
33890
  if (mutatingAction && result.success) {
33854
33891
  followUp.push("Code or workspace state changed. Inspect the diff if needed and run verification before finishing.");
33855
33892
  }
33856
- if (verificationAction && !result.success) {
33893
+ if (verificationAction && interactiveVerificationSetupFailure) {
33894
+ const failureSummary = `${result.toolId}: ${result.summary}`;
33857
33895
  transcriptEntry.runtimeNote = [
33858
- `Verification failed (${verificationFailures}/${maxRepairAttempts} repair attempts used).`,
33896
+ `Verification could not run non-interactively. Latest failure: ${failureSummary}`,
33897
+ "Executor should choose a different non-interactive verifier or configure the verifier explicitly."
33898
+ ].join(" ");
33899
+ await emitProgress({
33900
+ type: "task-note",
33901
+ sessionId,
33902
+ taskId: task.id,
33903
+ agentRole: task.agentRole,
33904
+ step,
33905
+ message: `Verification needs setup via ${failureSummary}. Choosing a different non-interactive verifier or configuration path.`
33906
+ });
33907
+ followUp.push(`The attempted verification was not a code failure. It requires interactive setup or input (${failureSummary}). Do not rerun the same verifier unchanged. Choose a different non-interactive verification command, or configure the verifier explicitly if the task requires it.`);
33908
+ } else if (verificationAction && !result.success) {
33909
+ const failureSummary = `${result.toolId}: ${result.summary}`;
33910
+ transcriptEntry.runtimeNote = [
33911
+ `Verification failed (${verificationFailures}/${maxRepairAttempts} repair attempts used). Latest failure: ${failureSummary}`,
33859
33912
  "Executor requires a repair action before the next verification run."
33860
33913
  ].join(" ");
33861
33914
  await emitProgress({
@@ -33864,9 +33917,9 @@ ${truncateForModel(customAgentMemory)}`);
33864
33917
  taskId: task.id,
33865
33918
  agentRole: task.agentRole,
33866
33919
  step,
33867
- message: `Verification failed. Repair attempts used: ${verificationFailures}/${maxRepairAttempts}.`
33920
+ message: `Verification failed via ${failureSummary}. Repair attempts used: ${verificationFailures}/${maxRepairAttempts}.`
33868
33921
  });
33869
- followUp.push(`Verification failed. Inspect the failure output, repair the issue, and run verification again before finishing. Repair attempts used: ${verificationFailures}/${maxRepairAttempts}.`);
33922
+ followUp.push(`Verification failed via ${failureSummary}. Inspect the failure output, repair the issue, and run verification again before finishing. Repair attempts used: ${verificationFailures}/${maxRepairAttempts}.`);
33870
33923
  if (verificationFailures >= maxRepairAttempts) {
33871
33924
  transcriptEntry.runtimeNote = [
33872
33925
  transcriptEntry.runtimeNote,
@@ -34255,11 +34308,20 @@ ${truncateForModel(customAgentMemory)}`);
34255
34308
  sessionId,
34256
34309
  taskId: task.id,
34257
34310
  agentRole: task.agentRole,
34258
- message: `Step budget exhausted after ${maxSteps} steps.`
34311
+ message: task.agentRole !== "test-debugger" ? `Step budget exhausted after ${maxSteps} steps; handing task to test-debugger.` : `Step budget exhausted after ${maxSteps} steps; debugger escalation exhausted.`
34259
34312
  });
34313
+ if (task.agentRole !== "test-debugger") {
34314
+ return {
34315
+ status: "handoff",
34316
+ summary: `Autonomous executor reached the step limit (${maxSteps}) for ${task.id}; handing off to test-debugger.`,
34317
+ toolResults,
34318
+ artifacts: Array.from(artifacts),
34319
+ usage: usageTotals
34320
+ };
34321
+ }
34260
34322
  return {
34261
- status: "paused",
34262
- summary: `Autonomous executor reached the step limit (${maxSteps}) for ${task.id}.`,
34323
+ status: "blocked",
34324
+ summary: `Autonomous executor reached the step limit (${maxSteps}) for ${task.id}; debugger escalation exhausted.`,
34263
34325
  toolResults,
34264
34326
  artifacts: Array.from(artifacts),
34265
34327
  usage: usageTotals
@@ -43848,6 +43910,9 @@ async function renderCustomAgents(cwd) {
43848
43910
  // src/shell.ts
43849
43911
  var AMBER = "\x1B[38;5;214m";
43850
43912
  var CYAN = "\x1B[38;5;45m";
43913
+ var RED = "\x1B[38;5;203m";
43914
+ var SHIMMER_HEAD = "\x1B[38;5;230m";
43915
+ var SHIMMER_TAIL = "\x1B[38;5;223m";
43851
43916
  var BOLD = "\x1B[1m";
43852
43917
  var DIM = "\x1B[2m";
43853
43918
  var RESET = "\x1B[0m";
@@ -43908,7 +43973,9 @@ var MAX_CHAT_MESSAGES = 12;
43908
43973
  var MAX_CHAT_CONTEXT_CHARS = 8e3;
43909
43974
  var CHAT_COMPACTION_TAIL_MESSAGES = 6;
43910
43975
  var DEFAULT_MAX_AUTO_TASKS = 3;
43976
+ var UNBOUNDED_MAX_AUTO_TASKS = Number.MAX_SAFE_INTEGER;
43911
43977
  var DEFAULT_MAX_AGENT_STEPS = 8;
43978
+ var UNBOUNDED_MAX_AGENT_STEPS = 128;
43912
43979
  var DEFAULT_MAX_REPAIR_ATTEMPTS2 = 2;
43913
43980
  var SPINNER_FRAMES = [
43914
43981
  "-",
@@ -43916,6 +43983,14 @@ var SPINNER_FRAMES = [
43916
43983
  "|",
43917
43984
  "/"
43918
43985
  ];
43986
+ var ELLIPSIS_FRAMES = [
43987
+ ". ",
43988
+ ".. ",
43989
+ "...",
43990
+ " ..",
43991
+ " .",
43992
+ " "
43993
+ ];
43919
43994
  var IDLE_STATUS_LABELS = [
43920
43995
  "thinking",
43921
43996
  "musing",
@@ -43927,6 +44002,24 @@ var IDLE_STATUS_LABELS = [
43927
44002
  function color(code, value) {
43928
44003
  return `${code}${value}${RESET}`;
43929
44004
  }
44005
+ function renderShimmeringLabel(label, frameIndex) {
44006
+ const characters = Array.from(label);
44007
+ if (characters.length === 0) {
44008
+ return color(BOLD, label);
44009
+ }
44010
+ const shimmerWidth = Math.min(4, characters.length + 1);
44011
+ const head = frameIndex % (characters.length + shimmerWidth);
44012
+ return characters.map((character, index) => {
44013
+ const distance = head - index;
44014
+ if (distance === 0) {
44015
+ return `${BOLD}${SHIMMER_HEAD}${character}${RESET}`;
44016
+ }
44017
+ if (distance > 0 && distance < shimmerWidth) {
44018
+ return `${BOLD}${SHIMMER_TAIL}${character}${RESET}`;
44019
+ }
44020
+ return `${BOLD}${character}${RESET}`;
44021
+ }).join("");
44022
+ }
43930
44023
  function readRuntimeOverrideEntries() {
43931
44024
  const raw = import_node_process26.default.env[KIMBHO_RUNTIME_OVERRIDES_ENV];
43932
44025
  if (!raw || raw.trim().length === 0) {
@@ -43991,6 +44084,12 @@ function shouldAutoStartApprovedRuns(runtime) {
43991
44084
  const approvalMode = resolveRuntimeOverrideApprovalMode(runtime);
43992
44085
  return approvalMode === "auto" || approvalMode === "dontAsk" || approvalMode === "acceptEdits" || approvalMode === "bypassPermissions";
43993
44086
  }
44087
+ function resolveShellMaxAutoTasks(runtime) {
44088
+ return shouldAutoStartApprovedRuns(runtime) ? UNBOUNDED_MAX_AUTO_TASKS : DEFAULT_MAX_AUTO_TASKS;
44089
+ }
44090
+ function resolveShellMaxAgentSteps(runtime) {
44091
+ return shouldAutoStartApprovedRuns(runtime) ? UNBOUNDED_MAX_AGENT_STEPS : DEFAULT_MAX_AGENT_STEPS;
44092
+ }
43994
44093
  function normalizeApprovalMode(value) {
43995
44094
  const normalized = value.trim().toLowerCase();
43996
44095
  if (normalized === "manual" || normalized === "default") {
@@ -44132,7 +44231,7 @@ function createExecutionTelemetry() {
44132
44231
  }
44133
44232
  var ShellActivityIndicator = class {
44134
44233
  interval = null;
44135
- frameIndex = 0;
44234
+ animationTick = 0;
44136
44235
  label;
44137
44236
  activeLine = false;
44138
44237
  constructor(label) {
@@ -44145,12 +44244,15 @@ var ShellActivityIndicator = class {
44145
44244
  this.activeLine = true;
44146
44245
  this.render();
44147
44246
  this.interval = setInterval(() => {
44148
- this.frameIndex = (this.frameIndex + 1) % SPINNER_FRAMES.length;
44247
+ this.animationTick += 1;
44149
44248
  this.render();
44150
- }, 120);
44249
+ }, 140);
44151
44250
  this.interval.unref?.();
44152
44251
  }
44153
44252
  update(label) {
44253
+ if (label !== this.label) {
44254
+ this.animationTick = 0;
44255
+ }
44154
44256
  this.label = label;
44155
44257
  if (this.interval) {
44156
44258
  this.render();
@@ -44180,9 +44282,10 @@ var ShellActivityIndicator = class {
44180
44282
  if (!import_node_process26.default.stdout.isTTY) {
44181
44283
  return;
44182
44284
  }
44183
- const frame = color(AMBER, SPINNER_FRAMES[this.frameIndex]);
44184
- const status = color(BOLD, this.label);
44185
- const raw = `${frame} ${status}${color(DIM, "...")}`;
44285
+ const frame = color(AMBER, SPINNER_FRAMES[this.animationTick % SPINNER_FRAMES.length]);
44286
+ const status = renderShimmeringLabel(this.label, this.animationTick);
44287
+ const dots = color(DIM, ELLIPSIS_FRAMES[this.animationTick % ELLIPSIS_FRAMES.length]);
44288
+ const raw = `${frame} ${status}${dots}`;
44186
44289
  this.clear();
44187
44290
  (0, import_node_readline2.cursorTo)(import_node_process26.default.stdout, 0);
44188
44291
  import_node_process26.default.stdout.write(raw);
@@ -44491,6 +44594,27 @@ function hashString(value) {
44491
44594
  function pickStatusLabel(message) {
44492
44595
  const lower = message.toLowerCase();
44493
44596
  const choose = (labels) => labels[hashString(message) % labels.length];
44597
+ if (lower.includes("verification needs setup") || lower.includes("different non-interactive verifier")) {
44598
+ return choose([
44599
+ "adapting",
44600
+ "rerouting",
44601
+ "recovering"
44602
+ ]);
44603
+ }
44604
+ if (lower.includes("verification failed") || lower.includes("repair attempts used")) {
44605
+ return choose([
44606
+ "repairing",
44607
+ "debugging",
44608
+ "recovering"
44609
+ ]);
44610
+ }
44611
+ if (lower.includes("repair budget exhausted") || lower.includes("debugger escalation")) {
44612
+ return choose([
44613
+ "escalating",
44614
+ "stopping",
44615
+ "blocking"
44616
+ ]);
44617
+ }
44494
44618
  if (lower.includes("synthesizing") || lower.includes("architecture brief")) {
44495
44619
  return choose([
44496
44620
  "planning",
@@ -44540,6 +44664,13 @@ function pickStatusLabel(message) {
44540
44664
  "untangling"
44541
44665
  ]);
44542
44666
  }
44667
+ if (lower.includes("verify") || lower.includes("verification")) {
44668
+ return choose([
44669
+ "verifying",
44670
+ "checking",
44671
+ "confirming"
44672
+ ]);
44673
+ }
44543
44674
  return choose([
44544
44675
  "thinking",
44545
44676
  "musing",
@@ -44667,13 +44798,13 @@ function renderShellPlanSummary(plan) {
44667
44798
  }
44668
44799
  return lines;
44669
44800
  }
44670
- function renderPendingRunProposal(proposal) {
44801
+ function renderPendingRunProposal(proposal, options = {}) {
44671
44802
  const lines = [
44672
44803
  `${color(BOLD, proposal.source === "queued" ? "Queued Plan Ready" : "Ready To Run")}`,
44673
44804
  ...renderShellPlanSummary(proposal.plan),
44674
44805
  "",
44675
44806
  color(DIM, `saved plan: ${proposal.planPath}`),
44676
- "next: /approve to start, /run revise <feedback> to adjust, /run cancel to drop it"
44807
+ options.autoStart ? color(DIM, "next: auto-starting in the current permission mode") : "next: /approve to start, /run revise <feedback> to adjust, /run cancel to drop it"
44677
44808
  ];
44678
44809
  if (proposal.source === "queued") {
44679
44810
  lines.splice(1, 0, color(DIM, "The next queued request has been planned and is waiting for your approval."));
@@ -44734,8 +44865,12 @@ function renderShellSessionSummary(snapshot, planPath, sessionPath) {
44734
44865
  lines.push(color(DIM, `saved session: ${sessionPath}`));
44735
44866
  if (snapshot.pendingApprovals.length > 0) {
44736
44867
  lines.push("next: /approve to continue, /deny to stop");
44737
- } else {
44868
+ } else if (snapshot.status === "paused" || snapshot.status === "running" || snapshot.status === "ready") {
44738
44869
  lines.push("next: /resume to continue a paused run or start another request");
44870
+ } else if (snapshot.status === "blocked") {
44871
+ lines.push("next: review the blocker or start another request");
44872
+ } else {
44873
+ lines.push("next: start another request");
44739
44874
  }
44740
44875
  return lines.join("\n");
44741
44876
  }
@@ -44777,7 +44912,10 @@ function renderLiveExecutionEvent(event, board, startedAt) {
44777
44912
  ];
44778
44913
  case "task-finished":
44779
44914
  return [
44780
- `${color(event.status === "completed" ? CYAN : AMBER, event.status === "completed" ? "Completed" : event.status === "awaiting-approval" ? "Paused" : "Updated")} ${simplifyExecutionSummary(event.summary) || event.taskId}`,
44915
+ `${color(
44916
+ event.status === "completed" ? CYAN : event.status === "blocked" ? RED : AMBER,
44917
+ event.status === "completed" ? "Completed" : event.status === "awaiting-approval" ? "Paused" : event.status === "handoff" ? "Rerouting" : event.status === "blocked" ? "Blocked" : "Updated"
44918
+ )} ${simplifyExecutionSummary(event.summary) || event.taskId}`,
44781
44919
  ...renderConciseProgress(board, startedAt)
44782
44920
  ];
44783
44921
  case "task-note":
@@ -45128,7 +45266,12 @@ async function prepareRunProposal(cwd, goal, runtime, options = {}) {
45128
45266
  feedback: options.feedback ?? [],
45129
45267
  source: options.source ?? "direct"
45130
45268
  };
45131
- console.log(renderPendingRunProposal(runtime.pendingRunProposal).join("\n"));
45269
+ console.log(renderPendingRunProposal(
45270
+ runtime.pendingRunProposal,
45271
+ {
45272
+ autoStart: shouldAutoStartApprovedRuns(runtime)
45273
+ }
45274
+ ).join("\n"));
45132
45275
  return request.cwd;
45133
45276
  }
45134
45277
  async function executePendingRunProposal(runtime) {
@@ -45150,8 +45293,8 @@ async function executePendingRunProposal(runtime) {
45150
45293
  proposal.goal,
45151
45294
  request,
45152
45295
  proposal.plan,
45153
- DEFAULT_MAX_AUTO_TASKS,
45154
- DEFAULT_MAX_AGENT_STEPS,
45296
+ resolveShellMaxAutoTasks(runtime),
45297
+ resolveShellMaxAgentSteps(runtime),
45155
45298
  DEFAULT_MAX_REPAIR_ATTEMPTS2
45156
45299
  );
45157
45300
  console.log(renderRunStartCard(liveBoard));
@@ -45161,8 +45304,8 @@ async function executePendingRunProposal(runtime) {
45161
45304
  let snapshot;
45162
45305
  try {
45163
45306
  snapshot = await new ExecutionOrchestrator().continueSession(proposal.snapshot, {
45164
- maxAutoTasks: DEFAULT_MAX_AUTO_TASKS,
45165
- maxAgentSteps: DEFAULT_MAX_AGENT_STEPS,
45307
+ maxAutoTasks: resolveShellMaxAutoTasks(runtime),
45308
+ maxAgentSteps: resolveShellMaxAgentSteps(runtime),
45166
45309
  maxRepairAttempts: DEFAULT_MAX_REPAIR_ATTEMPTS2,
45167
45310
  signal: controller.signal,
45168
45311
  onProgress: async (event) => {
@@ -45215,8 +45358,8 @@ async function resumeGoalExecution(cwd, runtime) {
45215
45358
  session.goal,
45216
45359
  session.request,
45217
45360
  session.plan,
45218
- DEFAULT_MAX_AUTO_TASKS,
45219
- DEFAULT_MAX_AGENT_STEPS,
45361
+ resolveShellMaxAutoTasks(runtime),
45362
+ resolveShellMaxAgentSteps(runtime),
45220
45363
  DEFAULT_MAX_REPAIR_ATTEMPTS2
45221
45364
  );
45222
45365
  const controller = new AbortController();
@@ -45230,8 +45373,8 @@ async function resumeGoalExecution(cwd, runtime) {
45230
45373
  let snapshot;
45231
45374
  try {
45232
45375
  snapshot = await new ExecutionOrchestrator().continueSession(session, {
45233
- maxAutoTasks: DEFAULT_MAX_AUTO_TASKS,
45234
- maxAgentSteps: DEFAULT_MAX_AGENT_STEPS,
45376
+ maxAutoTasks: resolveShellMaxAutoTasks(runtime),
45377
+ maxAgentSteps: resolveShellMaxAgentSteps(runtime),
45235
45378
  maxRepairAttempts: DEFAULT_MAX_REPAIR_ATTEMPTS2,
45236
45379
  signal: controller.signal,
45237
45380
  onProgress: async (event) => {
@@ -45309,8 +45452,8 @@ async function resolvePendingApproval(cwd, runtime, decision, approvalId, option
45309
45452
  session.goal,
45310
45453
  session.request,
45311
45454
  session.plan,
45312
- DEFAULT_MAX_AUTO_TASKS,
45313
- DEFAULT_MAX_AGENT_STEPS,
45455
+ resolveShellMaxAutoTasks(runtime),
45456
+ resolveShellMaxAgentSteps(runtime),
45314
45457
  DEFAULT_MAX_REPAIR_ATTEMPTS2
45315
45458
  );
45316
45459
  liveBoard.approvals = session.pendingApprovals.length;
@@ -45325,8 +45468,8 @@ async function resolvePendingApproval(cwd, runtime, decision, approvalId, option
45325
45468
  let snapshot;
45326
45469
  try {
45327
45470
  snapshot = await new ExecutionOrchestrator().continueSession(session, {
45328
- maxAutoTasks: DEFAULT_MAX_AUTO_TASKS,
45329
- maxAgentSteps: DEFAULT_MAX_AGENT_STEPS,
45471
+ maxAutoTasks: resolveShellMaxAutoTasks(runtime),
45472
+ maxAgentSteps: resolveShellMaxAgentSteps(runtime),
45330
45473
  maxRepairAttempts: DEFAULT_MAX_REPAIR_ATTEMPTS2,
45331
45474
  approvalDecisions: approvals.map((approval) => ({
45332
45475
  approvalId: approval.id,
@@ -46663,7 +46806,12 @@ async function handleShellCommand(cwd, input, state, runtime, execute) {
46663
46806
  if (head === "run" || head === "new" || head === "scaffold") {
46664
46807
  const subcommand = tokens[1]?.trim().toLowerCase();
46665
46808
  if (!tokens[1] && runtime.pendingRunProposal) {
46666
- console.log(renderPendingRunProposal(runtime.pendingRunProposal).join("\n"));
46809
+ console.log(renderPendingRunProposal(
46810
+ runtime.pendingRunProposal,
46811
+ {
46812
+ autoStart: shouldAutoStartApprovedRuns(runtime)
46813
+ }
46814
+ ).join("\n"));
46667
46815
  return cwd;
46668
46816
  }
46669
46817
  if (subcommand === "approve" || subcommand === "start" || subcommand === "execute") {