@autohq/cli 0.1.348 → 0.1.350

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.
@@ -23492,7 +23492,7 @@ Object.assign(lookup, {
23492
23492
  // package.json
23493
23493
  var package_default = {
23494
23494
  name: "@autohq/cli",
23495
- version: "0.1.348",
23495
+ version: "0.1.350",
23496
23496
  license: "SEE LICENSE IN README.md",
23497
23497
  publishConfig: {
23498
23498
  access: "public"
@@ -45409,7 +45409,7 @@ var ClaudeCodeProjector = class {
45409
45409
  if (message.type === "assistant" && !suppressStreamed) {
45410
45410
  this.interruptMarkerSeen = false;
45411
45411
  }
45412
- const outputs = !suppressStreamed && message.type === "assistant" ? projectAssistantSnapshot(parsed.projections) : parsed.projections.flatMap((entry) => {
45412
+ const outputs = !suppressStreamed && message.type === "assistant" ? this.projectAssistantSnapshot(parsed.projections) : parsed.projections.flatMap((entry) => {
45413
45413
  if (suppressStreamed && (entry.kind === "message" || entry.kind === "tool_call")) {
45414
45414
  return [];
45415
45415
  }
@@ -45543,6 +45543,53 @@ var ClaudeCodeProjector = class {
45543
45543
  (index) => this.finishActiveToolInput(index)
45544
45544
  );
45545
45545
  }
45546
+ // A never-streamed assistant snapshot (an SDK-internal stream retry can
45547
+ // reissue the in-flight message under a fresh id, so suppression misses it;
45548
+ // pure snapshot delivery has no stream at all). Its content must respect the
45549
+ // one-UI-message-per-turn invariant: while the turn's message is open the
45550
+ // snapshot appends parts to it, and only a standalone snapshot may open —
45551
+ // and, when it awaits no tool results, close — a message of its own.
45552
+ // Emitting an unconditional start/finish here reset the downstream
45553
+ // assembler/part tracker mid-turn and froze the session's UI message
45554
+ // persistence for the rest of the turn (session_5d00e0a8, 2026-07-05).
45555
+ projectAssistantSnapshot(projections) {
45556
+ const messageChunks = this.assistantSnapshotMessageChunks(projections);
45557
+ const rest = projections.filter((projection) => !isAssistantMessageOrToolCall(projection)).flatMap((projection) => conversationProjectionToUiChunks(projection));
45558
+ const last = messageChunks.at(-1);
45559
+ if (last?.type === "ui_message_chunk" && last.chunk.type === "finish" && rest.length > 0) {
45560
+ return [...messageChunks.slice(0, -1), ...rest, last];
45561
+ }
45562
+ return [...messageChunks, ...rest];
45563
+ }
45564
+ assistantSnapshotMessageChunks(projections) {
45565
+ const messageProjection = projections.find(
45566
+ (projection) => projection.role === "assistant" && projection.kind === "message"
45567
+ );
45568
+ const toolCallProjections = projections.filter(
45569
+ (projection) => projection.role === "assistant" && projection.kind === "tool_call"
45570
+ );
45571
+ if (!messageProjection && toolCallProjections.length === 0) {
45572
+ return [];
45573
+ }
45574
+ const messageId = messageProjection?.messageId ?? toolCallProjections.find((projection) => projection.messageId)?.messageId ?? UNKNOWN_MESSAGE_ID;
45575
+ const standalone = this.activeResponseMessageId === null;
45576
+ const outputs = [
45577
+ ...this.ensureResponseStarted(messageId)
45578
+ ];
45579
+ if (messageProjection) {
45580
+ outputs.push(...messagePartChunks(messageProjection));
45581
+ }
45582
+ outputs.push(
45583
+ ...toolCallProjections.flatMap(
45584
+ (projection) => toolCallChunks(projection)
45585
+ )
45586
+ );
45587
+ if (standalone && toolCallProjections.length === 0) {
45588
+ outputs.push(uiChunk({ type: "finish", finishReason: "stop" }));
45589
+ this.activeResponseMessageId = null;
45590
+ }
45591
+ return outputs;
45592
+ }
45546
45593
  };
45547
45594
  function projectClaudeCodeResult(result, options = {}) {
45548
45595
  if (options.interrupted) {
@@ -45796,40 +45843,6 @@ function conversationProjectionToUiChunks(projection) {
45796
45843
  }
45797
45844
  ];
45798
45845
  }
45799
- function projectAssistantSnapshot(projections) {
45800
- const messageChunks = assistantSnapshotMessageChunks(projections);
45801
- const rest = projections.filter((projection) => !isAssistantMessageOrToolCall(projection)).flatMap((projection) => conversationProjectionToUiChunks(projection));
45802
- const last = messageChunks.at(-1);
45803
- if (last?.type === "ui_message_chunk" && last.chunk.type === "finish" && rest.length > 0) {
45804
- return [...messageChunks.slice(0, -1), ...rest, last];
45805
- }
45806
- return [...messageChunks, ...rest];
45807
- }
45808
- function assistantSnapshotMessageChunks(projections) {
45809
- const messageProjection = projections.find(
45810
- (projection) => projection.role === "assistant" && projection.kind === "message"
45811
- );
45812
- const toolCallProjections = projections.filter(
45813
- (projection) => projection.role === "assistant" && projection.kind === "tool_call"
45814
- );
45815
- if (!messageProjection && toolCallProjections.length === 0) {
45816
- return [];
45817
- }
45818
- const messageId = messageProjection?.messageId ?? toolCallProjections.find((projection) => projection.messageId)?.messageId ?? UNKNOWN_MESSAGE_ID;
45819
- const outputs = [
45820
- uiChunk({ type: "start", messageId })
45821
- ];
45822
- if (messageProjection) {
45823
- outputs.push(...messagePartChunks(messageProjection));
45824
- }
45825
- outputs.push(
45826
- ...toolCallProjections.flatMap((projection) => toolCallChunks(projection))
45827
- );
45828
- if (toolCallProjections.length === 0) {
45829
- outputs.push(uiChunk({ type: "finish", finishReason: "stop" }));
45830
- }
45831
- return outputs;
45832
- }
45833
45846
  function isAssistantMessageOrToolCall(projection) {
45834
45847
  return projection.role === "assistant" && (projection.kind === "message" || projection.kind === "tool_call");
45835
45848
  }
@@ -67644,6 +67657,9 @@ function classifyRetryableCodexTurnFailure(message) {
67644
67657
  if (!message) {
67645
67658
  return null;
67646
67659
  }
67660
+ if (isDeterministicClientErrorMessage(message)) {
67661
+ return null;
67662
+ }
67647
67663
  const explicitRetryAfterMs = parseExplicitRetryAfterMs(message);
67648
67664
  const retryAfterMs = explicitRetryAfterMs ?? parseTryAgainDelayMs(message);
67649
67665
  if (!isRateLimitMessage(message) && explicitRetryAfterMs === null) {
@@ -67671,6 +67687,17 @@ function isRateLimitMessage(message) {
67671
67687
  message
67672
67688
  ) || /\b429\b[^\n.]{0,80}\btoo many requests\b/i.test(message) || /\brate[-\s]?limit(?:ed| reached)?\b/i.test(message);
67673
67689
  }
67690
+ function isDeterministicClientErrorMessage(message) {
67691
+ const status = clientErrorStatusCode(message);
67692
+ return status !== null && status !== 429;
67693
+ }
67694
+ function clientErrorStatusCode(message) {
67695
+ const status = message.match(
67696
+ /\b(?:http\s*)?(?:status(?:\s*code)?|code)\s*[:=]?\s*(4\d\d)\b/i
67697
+ ) ?? message.match(/\bhttp\s+(4\d\d)\b/i) ?? message.match(/\bfailed\s*\((4\d\d)\)/i);
67698
+ const value2 = Number.parseInt(status?.[1] ?? "", 10);
67699
+ return Number.isInteger(value2) ? value2 : null;
67700
+ }
67674
67701
  function parseExplicitRetryAfterMs(message) {
67675
67702
  return parseDelayMs(
67676
67703
  message.match(
package/dist/index.js CHANGED
@@ -30534,7 +30534,7 @@ var init_package = __esm({
30534
30534
  "package.json"() {
30535
30535
  package_default = {
30536
30536
  name: "@autohq/cli",
30537
- version: "0.1.348",
30537
+ version: "0.1.350",
30538
30538
  license: "SEE LICENSE IN README.md",
30539
30539
  publishConfig: {
30540
30540
  access: "public"
@@ -42642,7 +42642,7 @@ var ClaudeCodeProjector = class {
42642
42642
  if (message.type === "assistant" && !suppressStreamed) {
42643
42643
  this.interruptMarkerSeen = false;
42644
42644
  }
42645
- const outputs = !suppressStreamed && message.type === "assistant" ? projectAssistantSnapshot(parsed.projections) : parsed.projections.flatMap((entry) => {
42645
+ const outputs = !suppressStreamed && message.type === "assistant" ? this.projectAssistantSnapshot(parsed.projections) : parsed.projections.flatMap((entry) => {
42646
42646
  if (suppressStreamed && (entry.kind === "message" || entry.kind === "tool_call")) {
42647
42647
  return [];
42648
42648
  }
@@ -42776,6 +42776,53 @@ var ClaudeCodeProjector = class {
42776
42776
  (index) => this.finishActiveToolInput(index)
42777
42777
  );
42778
42778
  }
42779
+ // A never-streamed assistant snapshot (an SDK-internal stream retry can
42780
+ // reissue the in-flight message under a fresh id, so suppression misses it;
42781
+ // pure snapshot delivery has no stream at all). Its content must respect the
42782
+ // one-UI-message-per-turn invariant: while the turn's message is open the
42783
+ // snapshot appends parts to it, and only a standalone snapshot may open —
42784
+ // and, when it awaits no tool results, close — a message of its own.
42785
+ // Emitting an unconditional start/finish here reset the downstream
42786
+ // assembler/part tracker mid-turn and froze the session's UI message
42787
+ // persistence for the rest of the turn (session_5d00e0a8, 2026-07-05).
42788
+ projectAssistantSnapshot(projections) {
42789
+ const messageChunks = this.assistantSnapshotMessageChunks(projections);
42790
+ const rest = projections.filter((projection) => !isAssistantMessageOrToolCall(projection)).flatMap((projection) => conversationProjectionToUiChunks(projection));
42791
+ const last = messageChunks.at(-1);
42792
+ if (last?.type === "ui_message_chunk" && last.chunk.type === "finish" && rest.length > 0) {
42793
+ return [...messageChunks.slice(0, -1), ...rest, last];
42794
+ }
42795
+ return [...messageChunks, ...rest];
42796
+ }
42797
+ assistantSnapshotMessageChunks(projections) {
42798
+ const messageProjection = projections.find(
42799
+ (projection) => projection.role === "assistant" && projection.kind === "message"
42800
+ );
42801
+ const toolCallProjections = projections.filter(
42802
+ (projection) => projection.role === "assistant" && projection.kind === "tool_call"
42803
+ );
42804
+ if (!messageProjection && toolCallProjections.length === 0) {
42805
+ return [];
42806
+ }
42807
+ const messageId = messageProjection?.messageId ?? toolCallProjections.find((projection) => projection.messageId)?.messageId ?? UNKNOWN_MESSAGE_ID;
42808
+ const standalone = this.activeResponseMessageId === null;
42809
+ const outputs = [
42810
+ ...this.ensureResponseStarted(messageId)
42811
+ ];
42812
+ if (messageProjection) {
42813
+ outputs.push(...messagePartChunks(messageProjection));
42814
+ }
42815
+ outputs.push(
42816
+ ...toolCallProjections.flatMap(
42817
+ (projection) => toolCallChunks(projection)
42818
+ )
42819
+ );
42820
+ if (standalone && toolCallProjections.length === 0) {
42821
+ outputs.push(uiChunk({ type: "finish", finishReason: "stop" }));
42822
+ this.activeResponseMessageId = null;
42823
+ }
42824
+ return outputs;
42825
+ }
42779
42826
  };
42780
42827
  function projectClaudeCodeResult(result, options = {}) {
42781
42828
  if (options.interrupted) {
@@ -43029,40 +43076,6 @@ function conversationProjectionToUiChunks(projection) {
43029
43076
  }
43030
43077
  ];
43031
43078
  }
43032
- function projectAssistantSnapshot(projections) {
43033
- const messageChunks = assistantSnapshotMessageChunks(projections);
43034
- const rest = projections.filter((projection) => !isAssistantMessageOrToolCall(projection)).flatMap((projection) => conversationProjectionToUiChunks(projection));
43035
- const last = messageChunks.at(-1);
43036
- if (last?.type === "ui_message_chunk" && last.chunk.type === "finish" && rest.length > 0) {
43037
- return [...messageChunks.slice(0, -1), ...rest, last];
43038
- }
43039
- return [...messageChunks, ...rest];
43040
- }
43041
- function assistantSnapshotMessageChunks(projections) {
43042
- const messageProjection = projections.find(
43043
- (projection) => projection.role === "assistant" && projection.kind === "message"
43044
- );
43045
- const toolCallProjections = projections.filter(
43046
- (projection) => projection.role === "assistant" && projection.kind === "tool_call"
43047
- );
43048
- if (!messageProjection && toolCallProjections.length === 0) {
43049
- return [];
43050
- }
43051
- const messageId = messageProjection?.messageId ?? toolCallProjections.find((projection) => projection.messageId)?.messageId ?? UNKNOWN_MESSAGE_ID;
43052
- const outputs = [
43053
- uiChunk({ type: "start", messageId })
43054
- ];
43055
- if (messageProjection) {
43056
- outputs.push(...messagePartChunks(messageProjection));
43057
- }
43058
- outputs.push(
43059
- ...toolCallProjections.flatMap((projection) => toolCallChunks(projection))
43060
- );
43061
- if (toolCallProjections.length === 0) {
43062
- outputs.push(uiChunk({ type: "finish", finishReason: "stop" }));
43063
- }
43064
- return outputs;
43065
- }
43066
43079
  function isAssistantMessageOrToolCall(projection) {
43067
43080
  return projection.role === "assistant" && (projection.kind === "message" || projection.kind === "tool_call");
43068
43081
  }
@@ -45310,6 +45323,9 @@ function classifyRetryableCodexTurnFailure(message) {
45310
45323
  if (!message) {
45311
45324
  return null;
45312
45325
  }
45326
+ if (isDeterministicClientErrorMessage(message)) {
45327
+ return null;
45328
+ }
45313
45329
  const explicitRetryAfterMs = parseExplicitRetryAfterMs(message);
45314
45330
  const retryAfterMs = explicitRetryAfterMs ?? parseTryAgainDelayMs(message);
45315
45331
  if (!isRateLimitMessage(message) && explicitRetryAfterMs === null) {
@@ -45337,6 +45353,17 @@ function isRateLimitMessage(message) {
45337
45353
  message
45338
45354
  ) || /\b429\b[^\n.]{0,80}\btoo many requests\b/i.test(message) || /\brate[-\s]?limit(?:ed| reached)?\b/i.test(message);
45339
45355
  }
45356
+ function isDeterministicClientErrorMessage(message) {
45357
+ const status = clientErrorStatusCode(message);
45358
+ return status !== null && status !== 429;
45359
+ }
45360
+ function clientErrorStatusCode(message) {
45361
+ const status = message.match(
45362
+ /\b(?:http\s*)?(?:status(?:\s*code)?|code)\s*[:=]?\s*(4\d\d)\b/i
45363
+ ) ?? message.match(/\bhttp\s+(4\d\d)\b/i) ?? message.match(/\bfailed\s*\((4\d\d)\)/i);
45364
+ const value = Number.parseInt(status?.[1] ?? "", 10);
45365
+ return Number.isInteger(value) ? value : null;
45366
+ }
45340
45367
  function parseExplicitRetryAfterMs(message) {
45341
45368
  return parseDelayMs(
45342
45369
  message.match(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autohq/cli",
3
- "version": "0.1.348",
3
+ "version": "0.1.350",
4
4
  "license": "SEE LICENSE IN README.md",
5
5
  "publishConfig": {
6
6
  "access": "public"