@autohq/cli 0.1.179 → 0.1.181

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.
@@ -19874,7 +19874,6 @@ var ProviderCredentialKindSchema = external_exports.enum([
19874
19874
  "github_app_installation",
19875
19875
  "oauth",
19876
19876
  "api_token",
19877
- "nango_connection",
19878
19877
  "webhook",
19879
19878
  "internal"
19880
19879
  ]);
@@ -26572,7 +26571,7 @@ Object.assign(lookup, {
26572
26571
  // package.json
26573
26572
  var package_default = {
26574
26573
  name: "@autohq/cli",
26575
- version: "0.1.179",
26574
+ version: "0.1.181",
26576
26575
  license: "SEE LICENSE IN README.md",
26577
26576
  publishConfig: {
26578
26577
  access: "public"
@@ -46910,6 +46909,14 @@ var ClaudeAgentBridgeSessionImpl = class {
46910
46909
  stderr;
46911
46910
  options;
46912
46911
  state = { kind: "idle" };
46912
+ // Turns sent to the SDK but not yet ended by a `result`. A bare boolean
46913
+ // cannot tell an interrupted turn's terminal `result` apart from the next
46914
+ // turn's: an out-of-order `result` could clear the flag while a fresh turn is
46915
+ // mid-flight and silently swallow a later interrupt. A counter is
46916
+ // order-independent — every sent message increments, every `result`
46917
+ // decrements — so interleaved interrupt/result deliveries stay balanced.
46918
+ activeTurnCount = 0;
46919
+ interruptInFlight = null;
46913
46920
  exitReported = false;
46914
46921
  constructor(input) {
46915
46922
  const optionsStartedAt = Date.now();
@@ -46954,7 +46961,9 @@ var ClaudeAgentBridgeSessionImpl = class {
46954
46961
  }
46955
46962
  }
46956
46963
  async sendMessage(message) {
46964
+ await this.interruptActiveTurnBeforeMessage();
46957
46965
  this.inputQueue.push(claudeAgentUserMessage(message));
46966
+ this.activeTurnCount += 1;
46958
46967
  void this.ensureRunningQuery().catch((error51) => {
46959
46968
  void this.input.onError(error51);
46960
46969
  });
@@ -46965,6 +46974,7 @@ var ClaudeAgentBridgeSessionImpl = class {
46965
46974
  return;
46966
46975
  }
46967
46976
  this.state = { kind: "closed" };
46977
+ this.activeTurnCount = 0;
46968
46978
  this.stderr.flush();
46969
46979
  this.inputQueue.close();
46970
46980
  if (previousState.kind === "started") {
@@ -47047,6 +47057,9 @@ var ClaudeAgentBridgeSessionImpl = class {
47047
47057
  void (async () => {
47048
47058
  try {
47049
47059
  for await (const message of query) {
47060
+ if (isClaudeAgentTurnResult(message)) {
47061
+ this.activeTurnCount = Math.max(0, this.activeTurnCount - 1);
47062
+ }
47050
47063
  const failure = probeClaudeAgentMessage(
47051
47064
  message,
47052
47065
  this.messageProbeContext()
@@ -47068,11 +47081,46 @@ var ClaudeAgentBridgeSessionImpl = class {
47068
47081
  await this.input.onError(error51);
47069
47082
  }
47070
47083
  } finally {
47084
+ this.activeTurnCount = 0;
47071
47085
  this.state = { kind: "closed" };
47072
47086
  this.reportExit();
47073
47087
  }
47074
47088
  })();
47075
47089
  }
47090
+ async interruptActiveTurnBeforeMessage() {
47091
+ if (this.activeTurnCount === 0 || this.state.kind !== "running") {
47092
+ return;
47093
+ }
47094
+ if (this.interruptInFlight) {
47095
+ await this.interruptInFlight;
47096
+ return;
47097
+ }
47098
+ const query = this.state.query;
47099
+ const startedAt = Date.now();
47100
+ this.input.writeOutput?.(
47101
+ `agent_bridge_claude_mid_turn_interrupt_started at=${new Date(startedAt).toISOString()}`
47102
+ );
47103
+ const interruptPromise = (async () => {
47104
+ try {
47105
+ await query.interrupt();
47106
+ this.input.writeOutput?.(
47107
+ `agent_bridge_claude_mid_turn_interrupt_ready duration_ms=${Date.now() - startedAt}`
47108
+ );
47109
+ } catch (error51) {
47110
+ this.input.writeOutput?.(
47111
+ `agent_bridge_claude_mid_turn_interrupt_failed duration_ms=${Date.now() - startedAt} error=${error51 instanceof Error ? error51.message : String(error51)}`
47112
+ );
47113
+ }
47114
+ })();
47115
+ this.interruptInFlight = interruptPromise;
47116
+ try {
47117
+ await interruptPromise;
47118
+ } finally {
47119
+ if (this.interruptInFlight === interruptPromise) {
47120
+ this.interruptInFlight = null;
47121
+ }
47122
+ }
47123
+ }
47076
47124
  messageProbeContext() {
47077
47125
  return {
47078
47126
  configuredMcpServerNames: Object.keys(this.options.mcpServers ?? {}),
@@ -47217,6 +47265,9 @@ function claudeAgentUserMessage(message) {
47217
47265
  parent_tool_use_id: null
47218
47266
  };
47219
47267
  }
47268
+ function isClaudeAgentTurnResult(message) {
47269
+ return message.type === "result";
47270
+ }
47220
47271
 
47221
47272
  // src/commands/agent-bridge/harness/claude-code/index.ts
47222
47273
  async function runAgentBridgeClaudeCode(options) {
package/dist/index.js CHANGED
@@ -16306,7 +16306,6 @@ var init_provider_grants = __esm({
16306
16306
  "github_app_installation",
16307
16307
  "oauth",
16308
16308
  "api_token",
16309
- "nango_connection",
16310
16309
  "webhook",
16311
16310
  "internal"
16312
16311
  ]);
@@ -21682,7 +21681,7 @@ var init_package = __esm({
21682
21681
  "package.json"() {
21683
21682
  package_default = {
21684
21683
  name: "@autohq/cli",
21685
- version: "0.1.179",
21684
+ version: "0.1.181",
21686
21685
  license: "SEE LICENSE IN README.md",
21687
21686
  publishConfig: {
21688
21687
  access: "public"
@@ -31448,6 +31447,14 @@ var ClaudeAgentBridgeSessionImpl = class {
31448
31447
  stderr;
31449
31448
  options;
31450
31449
  state = { kind: "idle" };
31450
+ // Turns sent to the SDK but not yet ended by a `result`. A bare boolean
31451
+ // cannot tell an interrupted turn's terminal `result` apart from the next
31452
+ // turn's: an out-of-order `result` could clear the flag while a fresh turn is
31453
+ // mid-flight and silently swallow a later interrupt. A counter is
31454
+ // order-independent — every sent message increments, every `result`
31455
+ // decrements — so interleaved interrupt/result deliveries stay balanced.
31456
+ activeTurnCount = 0;
31457
+ interruptInFlight = null;
31451
31458
  exitReported = false;
31452
31459
  constructor(input) {
31453
31460
  const optionsStartedAt = Date.now();
@@ -31492,7 +31499,9 @@ var ClaudeAgentBridgeSessionImpl = class {
31492
31499
  }
31493
31500
  }
31494
31501
  async sendMessage(message) {
31502
+ await this.interruptActiveTurnBeforeMessage();
31495
31503
  this.inputQueue.push(claudeAgentUserMessage(message));
31504
+ this.activeTurnCount += 1;
31496
31505
  void this.ensureRunningQuery().catch((error51) => {
31497
31506
  void this.input.onError(error51);
31498
31507
  });
@@ -31503,6 +31512,7 @@ var ClaudeAgentBridgeSessionImpl = class {
31503
31512
  return;
31504
31513
  }
31505
31514
  this.state = { kind: "closed" };
31515
+ this.activeTurnCount = 0;
31506
31516
  this.stderr.flush();
31507
31517
  this.inputQueue.close();
31508
31518
  if (previousState.kind === "started") {
@@ -31585,6 +31595,9 @@ var ClaudeAgentBridgeSessionImpl = class {
31585
31595
  void (async () => {
31586
31596
  try {
31587
31597
  for await (const message of query) {
31598
+ if (isClaudeAgentTurnResult(message)) {
31599
+ this.activeTurnCount = Math.max(0, this.activeTurnCount - 1);
31600
+ }
31588
31601
  const failure = probeClaudeAgentMessage(
31589
31602
  message,
31590
31603
  this.messageProbeContext()
@@ -31606,11 +31619,46 @@ var ClaudeAgentBridgeSessionImpl = class {
31606
31619
  await this.input.onError(error51);
31607
31620
  }
31608
31621
  } finally {
31622
+ this.activeTurnCount = 0;
31609
31623
  this.state = { kind: "closed" };
31610
31624
  this.reportExit();
31611
31625
  }
31612
31626
  })();
31613
31627
  }
31628
+ async interruptActiveTurnBeforeMessage() {
31629
+ if (this.activeTurnCount === 0 || this.state.kind !== "running") {
31630
+ return;
31631
+ }
31632
+ if (this.interruptInFlight) {
31633
+ await this.interruptInFlight;
31634
+ return;
31635
+ }
31636
+ const query = this.state.query;
31637
+ const startedAt = Date.now();
31638
+ this.input.writeOutput?.(
31639
+ `agent_bridge_claude_mid_turn_interrupt_started at=${new Date(startedAt).toISOString()}`
31640
+ );
31641
+ const interruptPromise = (async () => {
31642
+ try {
31643
+ await query.interrupt();
31644
+ this.input.writeOutput?.(
31645
+ `agent_bridge_claude_mid_turn_interrupt_ready duration_ms=${Date.now() - startedAt}`
31646
+ );
31647
+ } catch (error51) {
31648
+ this.input.writeOutput?.(
31649
+ `agent_bridge_claude_mid_turn_interrupt_failed duration_ms=${Date.now() - startedAt} error=${error51 instanceof Error ? error51.message : String(error51)}`
31650
+ );
31651
+ }
31652
+ })();
31653
+ this.interruptInFlight = interruptPromise;
31654
+ try {
31655
+ await interruptPromise;
31656
+ } finally {
31657
+ if (this.interruptInFlight === interruptPromise) {
31658
+ this.interruptInFlight = null;
31659
+ }
31660
+ }
31661
+ }
31614
31662
  messageProbeContext() {
31615
31663
  return {
31616
31664
  configuredMcpServerNames: Object.keys(this.options.mcpServers ?? {}),
@@ -31755,6 +31803,9 @@ function claudeAgentUserMessage(message) {
31755
31803
  parent_tool_use_id: null
31756
31804
  };
31757
31805
  }
31806
+ function isClaudeAgentTurnResult(message) {
31807
+ return message.type === "result";
31808
+ }
31758
31809
 
31759
31810
  // src/commands/agent-bridge/harness/claude-code/index.ts
31760
31811
  async function runAgentBridgeClaudeCode(options) {
@@ -35673,7 +35724,9 @@ init_login();
35673
35724
  var SETUP_STATUS_POLL_INTERVAL_MS = 5e3;
35674
35725
  var SETUP_STATUS_HINT_EVERY_POLLS = 12;
35675
35726
  var SETUP_STATUS_MAX_CONSECUTIVE_ERRORS = 12;
35676
- async function setupAction(context, options) {
35727
+ var WIZARD_MARGIN = 2;
35728
+ async function setupAction(rawContext, options) {
35729
+ const context = withWizardMargin(rawContext);
35677
35730
  const apiBaseUrl = apiUrlFromOptions(context, options);
35678
35731
  const client = createContextApiClient(context);
35679
35732
  await showPitchAndWait(context);
@@ -36030,6 +36083,13 @@ var SETUP_AUTO_LOGOS = [
36030
36083
  function logoWidth(logo) {
36031
36084
  return Math.max(...logo.map((line) => line.length));
36032
36085
  }
36086
+ function wizardMargin(columns) {
36087
+ if (columns === void 0) {
36088
+ return 0;
36089
+ }
36090
+ const largestLogoWidth = logoWidth(SETUP_AUTO_LOGOS[0]);
36091
+ return largestLogoWidth + WIZARD_MARGIN <= columns ? WIZARD_MARGIN : 0;
36092
+ }
36033
36093
  function bullet(style, text) {
36034
36094
  return `${style.id(" -")} ${text}`;
36035
36095
  }
@@ -36039,6 +36099,19 @@ function numbered(style, index, text) {
36039
36099
  function indent(text, spaces) {
36040
36100
  return `${" ".repeat(spaces)}${text}`;
36041
36101
  }
36102
+ function withWizardMargin(context) {
36103
+ const margin = wizardMargin(context.stdout.columns);
36104
+ if (margin === 0) {
36105
+ return context;
36106
+ }
36107
+ return {
36108
+ ...context,
36109
+ writeOutput: (message) => context.writeOutput(indentBlock(message, margin))
36110
+ };
36111
+ }
36112
+ function indentBlock(text, spaces) {
36113
+ return text.split("\n").map((line) => line.length === 0 ? line : indent(line, spaces)).join("\n");
36114
+ }
36042
36115
  async function explainAndWait(context, input) {
36043
36116
  context.writeOutput(context.io.style.heading(input.heading));
36044
36117
  for (const line of input.body) {
@@ -36067,9 +36140,10 @@ async function pressEnter(context, prompt) {
36067
36140
  stdin: context.stdin,
36068
36141
  stdout: context.stdout
36069
36142
  });
36143
+ const margin = wizardMargin(context.stdout.columns);
36070
36144
  try {
36071
36145
  await Promise.race([
36072
- readline.question(context.io.style.dim(prompt)),
36146
+ readline.question(context.io.style.dim(indent(prompt, margin))),
36073
36147
  new Promise((resolve3) => {
36074
36148
  readline.once("close", resolve3);
36075
36149
  })
@@ -36178,8 +36252,9 @@ async function askRequired(context, question) {
36178
36252
  stdin: context.stdin,
36179
36253
  stdout: context.stdout
36180
36254
  });
36255
+ const margin = wizardMargin(context.stdout.columns);
36181
36256
  try {
36182
- const answer = (await readline.question(question)).trim();
36257
+ const answer = (await readline.question(indent(question, margin))).trim();
36183
36258
  if (!answer) {
36184
36259
  throw new Error("A non-empty answer is required.");
36185
36260
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autohq/cli",
3
- "version": "0.1.179",
3
+ "version": "0.1.181",
4
4
  "license": "SEE LICENSE IN README.md",
5
5
  "publishConfig": {
6
6
  "access": "public"