@cydm/pie 1.0.14 → 1.0.15

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.
@@ -3,7 +3,8 @@ import {
3
3
  Agent,
4
4
  agentLoop,
5
5
  agentLoopContinue
6
- } from "./chunk-D7NAXU7F.js";
6
+ } from "./chunk-VE2HDCNB.js";
7
+ import "./chunk-5DA2D3K2.js";
7
8
  import "./chunk-TG2EQLX2.js";
8
9
  export {
9
10
  Agent,
@@ -0,0 +1,94 @@
1
+ import { createRequire as __createRequire } from "node:module"; const require = __createRequire(import.meta.url);
2
+ import {
3
+ EventStream
4
+ } from "./chunk-5DA2D3K2.js";
5
+ import "./chunk-TG2EQLX2.js";
6
+
7
+ // src/app/test-stream.ts
8
+ function createAssistantMessage(model, text, stopReason = "stop", errorMessage) {
9
+ return {
10
+ role: "assistant",
11
+ content: [{ type: "text", text }],
12
+ api: model.api,
13
+ provider: model.provider,
14
+ model: model.id,
15
+ usage: {
16
+ input: 1,
17
+ output: text ? 1 : 0,
18
+ cacheRead: 0,
19
+ cacheWrite: 0,
20
+ totalTokens: text ? 2 : 1,
21
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 }
22
+ },
23
+ stopReason,
24
+ errorMessage,
25
+ timestamp: Date.now()
26
+ };
27
+ }
28
+ function parseMockStreamSequence(value) {
29
+ const parsed = JSON.parse(value);
30
+ if (!Array.isArray(parsed)) {
31
+ throw new Error("PIE_TEST_MOCK_STREAM_SEQUENCE must be a JSON array");
32
+ }
33
+ return parsed.map((item) => {
34
+ if (!item || typeof item !== "object") {
35
+ throw new Error("PIE_TEST_MOCK_STREAM_SEQUENCE entries must be objects");
36
+ }
37
+ const record = item;
38
+ if (record.type === "error" && typeof record.error === "string") {
39
+ return {
40
+ type: "error",
41
+ error: record.error,
42
+ partialText: typeof record.partialText === "string" ? record.partialText : void 0
43
+ };
44
+ }
45
+ if (record.type === "text" && typeof record.text === "string") {
46
+ return { type: "text", text: record.text };
47
+ }
48
+ throw new Error("PIE_TEST_MOCK_STREAM_SEQUENCE entries must be text or error steps");
49
+ });
50
+ }
51
+ function createTestStreamFnFromSequenceEnv(value = process.env.PIE_TEST_MOCK_STREAM_SEQUENCE) {
52
+ if (!value) {
53
+ return void 0;
54
+ }
55
+ const steps = parseMockStreamSequence(value);
56
+ let callIndex = 0;
57
+ return async (model) => {
58
+ const step = steps[Math.min(callIndex, steps.length - 1)];
59
+ callIndex += 1;
60
+ const stream = new EventStream(
61
+ (event) => event.type === "done" || event.type === "error",
62
+ (event) => event.type === "done" ? event.message : event.error
63
+ );
64
+ queueMicrotask(() => {
65
+ if (!step) {
66
+ const message2 = createAssistantMessage(model, "");
67
+ stream.push({ type: "done", reason: "stop", message: message2 });
68
+ return;
69
+ }
70
+ if (step.type === "error") {
71
+ if (step.partialText) {
72
+ const partial = createAssistantMessage(model, step.partialText);
73
+ stream.push({ type: "start", partial });
74
+ stream.push({ type: "text_start", contentIndex: 0, partial });
75
+ stream.push({ type: "text_delta", contentIndex: 0, delta: step.partialText, partial });
76
+ stream.push({ type: "text_end", contentIndex: 0, content: step.partialText, partial });
77
+ }
78
+ const error = createAssistantMessage(model, "", "error", step.error);
79
+ stream.push({ type: "error", reason: "error", error });
80
+ return;
81
+ }
82
+ const message = createAssistantMessage(model, step.text);
83
+ stream.push({ type: "start", partial: message });
84
+ stream.push({ type: "text_start", contentIndex: 0, partial: message });
85
+ stream.push({ type: "text_delta", contentIndex: 0, delta: step.text, partial: message });
86
+ stream.push({ type: "text_end", contentIndex: 0, content: step.text, partial: message });
87
+ stream.push({ type: "done", reason: "stop", message });
88
+ });
89
+ return stream;
90
+ };
91
+ }
92
+ export {
93
+ createTestStreamFnFromSequenceEnv
94
+ };
package/dist/cli.js CHANGED
@@ -14,7 +14,7 @@ import {
14
14
  getSettingsPath,
15
15
  getThemesDir,
16
16
  migrateConfigFromAgentDir
17
- } from "./chunks/chunk-EFG2MQFD.js";
17
+ } from "./chunks/chunk-55RUSXEA.js";
18
18
  import {
19
19
  AGENTS_CONTEXT_FILE_NAME,
20
20
  AgentSessionController,
@@ -52,7 +52,8 @@ import {
52
52
  selectToolsForRuntimePolicy,
53
53
  shouldPreserveExecutionStateForUserText,
54
54
  supersedeExecutionState
55
- } from "./chunks/chunk-LF5Q7BVU.js";
55
+ } from "./chunks/chunk-R5LYKDKA.js";
56
+ import "./chunks/chunk-VE2HDCNB.js";
56
57
  import {
57
58
  Deref,
58
59
  Errors,
@@ -86,7 +87,7 @@ import {
86
87
  setLogger,
87
88
  sortToolModelCandidatesByCapability,
88
89
  type_exports
89
- } from "./chunks/chunk-D7NAXU7F.js";
90
+ } from "./chunks/chunk-5DA2D3K2.js";
90
91
  import {
91
92
  resolveCliProjectRoot
92
93
  } from "./chunks/chunk-NTYHFBUA.js";
@@ -64043,6 +64044,34 @@ function buildCliSystemPrompt(options) {
64043
64044
  ].filter(Boolean).join("\n\n");
64044
64045
  }
64045
64046
 
64047
+ // src/runtime/retry-policy.ts
64048
+ var TRANSIENT_MODEL_ERROR_PATTERN = /overloaded|rate.?limit|too many requests|429|500|502|503|504|service.?unavailable|server error|internal error|connection.?error|connection.?refused|other side closed|fetch failed|upstream.?connect|reset before headers|terminated|retry delay|sse stream aborted|sse stream closed before end|sse stream ended before response completed/i;
64049
+ var USER_ABORT_PATTERN = /request was aborted/i;
64050
+ var CLI_RETRY_MAX_RETRIES = 3;
64051
+ var CLI_RETRY_BASE_DELAY_MS = 2e3;
64052
+ function isCliContextOverflowError(errorMessage3) {
64053
+ return /context length exceeded|context_length_exceeded|maximum context length|maximum context size|too many tokens|input.*too long|prompt.*too long|context window|token limit exceeded|exceeds.{0,20}context/i.test(
64054
+ errorMessage3
64055
+ );
64056
+ }
64057
+ function isCliRetryableError(errorMessage3) {
64058
+ if (isCliContextOverflowError(errorMessage3)) {
64059
+ return false;
64060
+ }
64061
+ if (USER_ABORT_PATTERN.test(errorMessage3)) {
64062
+ return false;
64063
+ }
64064
+ return TRANSIENT_MODEL_ERROR_PATTERN.test(errorMessage3);
64065
+ }
64066
+ function getCliRetryBaseDelayMs() {
64067
+ const override = process.env.PIE_TEST_CLI_RETRY_BASE_DELAY_MS;
64068
+ if (!override) {
64069
+ return CLI_RETRY_BASE_DELAY_MS;
64070
+ }
64071
+ const parsed = Number(override);
64072
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : CLI_RETRY_BASE_DELAY_MS;
64073
+ }
64074
+
64046
64075
  // src/runtime/interactive-context-ui.ts
64047
64076
  function calculateContextUsage(host) {
64048
64077
  const messages = host.agent?.state.messages ?? [];
@@ -64266,9 +64295,7 @@ function setupAutocomplete(host) {
64266
64295
  host.editor.setAutocompleteProvider(provider);
64267
64296
  }
64268
64297
  function isContextOverflowError(errorMessage3) {
64269
- return /context length exceeded|context_length_exceeded|maximum context length|maximum context size|too many tokens|input.*too long|prompt.*too long|context window|token limit exceeded|exceeds.{0,20}context/i.test(
64270
- errorMessage3
64271
- );
64298
+ return isCliContextOverflowError(errorMessage3);
64272
64299
  }
64273
64300
  function shouldAutoCompact(host, contextTokens, contextWindow) {
64274
64301
  if (!host.options.settingsManager.getAutoCompactEnabled()) return false;
@@ -64277,9 +64304,7 @@ function shouldAutoCompact(host, contextTokens, contextWindow) {
64277
64304
  return contextTokens > contextWindow - reserveTokens;
64278
64305
  }
64279
64306
  function isRetryableError(errorMessage3) {
64280
- return /overloaded|rate.?limit|too many requests|429|500|502|503|504|service.?unavailable|server error|internal error|connection.?error|connection.?refused|other side closed|fetch failed|upstream.?connect|reset before headers|terminated|retry delay/i.test(
64281
- errorMessage3
64282
- );
64307
+ return isCliRetryableError(errorMessage3);
64283
64308
  }
64284
64309
  function isInvalidFileReferenceError(errorMessage3) {
64285
64310
  return /not the owner of this file|owner of this file|invalid_authentication_error/i.test(
@@ -64778,9 +64803,9 @@ function createInteractiveAgentSessionController(host) {
64778
64803
  },
64779
64804
  getAutoContinueMessage: () => host.getTodoAutoContinueMessage(),
64780
64805
  retry: {
64781
- isRetryableError: (errorMessage3) => !host._isContextOverflowError(errorMessage3) && host._isRetryableError(errorMessage3),
64782
- maxRetries: 3,
64783
- baseDelayMs: 2e3
64806
+ isRetryableError: (errorMessage3) => !host._isContextOverflowError(errorMessage3) && isCliRetryableError(errorMessage3),
64807
+ maxRetries: CLI_RETRY_MAX_RETRIES,
64808
+ baseDelayMs: getCliRetryBaseDelayMs()
64784
64809
  },
64785
64810
  compaction: {
64786
64811
  compact: async ({ messages }) => createAutoCompactionResult(host, messages)
@@ -66739,7 +66764,7 @@ var InteractiveMode = class {
66739
66764
  if (savedLevel) {
66740
66765
  this.thinkingLevel = savedLevel;
66741
66766
  }
66742
- const { Agent } = await import("./chunks/src-LZC56DRG.js");
66767
+ const { Agent } = await import("./chunks/src-6WPNVGT2.js");
66743
66768
  const activeSession = this.sessionManager.getActiveSession();
66744
66769
  this.agent = new Agent({
66745
66770
  initialState: {
@@ -67303,6 +67328,12 @@ function createNoOpExtensionUIContext() {
67303
67328
  custom: async () => void 0
67304
67329
  };
67305
67330
  }
67331
+ function readAssistantError(message) {
67332
+ if (message.role !== "assistant") {
67333
+ return "";
67334
+ }
67335
+ return message.errorMessage || "assistant response failed";
67336
+ }
67306
67337
  async function loadPrintModeExtensions(params) {
67307
67338
  const uiContext = createNoOpExtensionUIContext();
67308
67339
  const executionState = new ExecutionStateManager();
@@ -67400,7 +67431,7 @@ async function runPrintMode(params) {
67400
67431
  `);
67401
67432
  console.log("Assistant: ");
67402
67433
  }
67403
- const { Agent: AgentClass } = await import("./chunks/src-LZC56DRG.js");
67434
+ const { Agent: AgentClass } = await import("./chunks/src-6WPNVGT2.js");
67404
67435
  let agent;
67405
67436
  const printModeExtensions = await loadPrintModeExtensions({
67406
67437
  cwd: runtime.cwd,
@@ -67437,8 +67468,10 @@ async function runPrintMode(params) {
67437
67468
  tools: printModeTools,
67438
67469
  thinkingLevel: "off"
67439
67470
  },
67440
- apiKey: runtime.apiKey
67471
+ apiKey: runtime.apiKey,
67472
+ streamFn: params.streamFn
67441
67473
  });
67474
+ const sessionTrace = new SessionTraceWriter(runtime.paths.sessionsDir, runtime.sessionManager);
67442
67475
  const agentSessionController = new AgentSessionController({
67443
67476
  agent,
67444
67477
  sessionManager: runtime.sessionManager,
@@ -67458,9 +67491,25 @@ async function runPrintMode(params) {
67458
67491
  systemPrompt: result.systemPrompt ?? context.baseSystemPrompt ?? baseSystemPrompt,
67459
67492
  messages: result.messages?.length ? [...context.messages, ...result.messages] : context.messages
67460
67493
  };
67494
+ },
67495
+ retry: {
67496
+ isRetryableError: isCliRetryableError,
67497
+ maxRetries: CLI_RETRY_MAX_RETRIES,
67498
+ baseDelayMs: getCliRetryBaseDelayMs()
67499
+ },
67500
+ onEvent: (event) => {
67501
+ sessionTrace.noteRuntimeEvent(event.type, event);
67502
+ if (event.type === "retry_scheduled") {
67503
+ console.error(`Transient request error: ${event.errorMessage}. Retrying in ${event.delayMs / 1e3}s (${event.attempt}/${event.maxRetries}).`);
67504
+ } else if (event.type === "retry_start") {
67505
+ console.error(`Retrying request (${event.attempt}/${event.maxRetries})...`);
67506
+ } else if (event.type === "retry_succeeded") {
67507
+ console.error(`Retry succeeded after ${event.attempts} attempt${event.attempts === 1 ? "" : "s"}.`);
67508
+ } else if (event.type === "retry_exhausted") {
67509
+ console.error(`Request failed after ${event.maxRetries} retries: ${event.errorMessage}`);
67510
+ }
67461
67511
  }
67462
67512
  });
67463
- const sessionTrace = new SessionTraceWriter(runtime.paths.sessionsDir, runtime.sessionManager);
67464
67513
  sessionTrace.notePendingUserText(params.initialPrompt);
67465
67514
  attachAgentEventsToSessionTrace({ agent, trace: sessionTrace });
67466
67515
  agent.setTools(wrapToolsWithExtensions(agent.state.tools, printModeExtensions.runner));
@@ -67470,19 +67519,37 @@ async function runPrintMode(params) {
67470
67519
  await agentSessionController.prompt(params.initialPrompt, { source: "print" });
67471
67520
  sessionTrace.noteDispatchSettled({ mode: "print" });
67472
67521
  sessionTrace.noteWaitForIdleStart({ mode: "print" });
67473
- await agentSessionController.waitForIdle();
67522
+ await agentSessionController.waitForSettled();
67474
67523
  sessionTrace.noteWaitForIdleSettled({ mode: "print" });
67475
67524
  const messages = agent.state.messages;
67476
67525
  const lastMessage = messages[messages.length - 1];
67477
67526
  let assistantText = "";
67527
+ let assistantError = "";
67478
67528
  if (lastMessage?.role === "assistant") {
67479
67529
  for (const content of lastMessage.content) {
67480
67530
  if (typeof content === "object" && "type" in content && content.type === "text" && "text" in content) {
67481
67531
  assistantText += content.text;
67482
67532
  }
67483
67533
  }
67534
+ if (lastMessage.stopReason === "error" || lastMessage.stopReason === "aborted") {
67535
+ assistantError = readAssistantError(lastMessage);
67536
+ }
67484
67537
  }
67485
- if (params.jsonOutput) {
67538
+ if (assistantError) {
67539
+ process.exitCode = 1;
67540
+ if (params.jsonOutput) {
67541
+ console.log(
67542
+ JSON.stringify({
67543
+ ok: false,
67544
+ error: assistantError,
67545
+ sessionId: runtime.sessionManager.getActiveSession()?.id,
67546
+ provider: runtime.provider,
67547
+ modelId: runtime.modelId
67548
+ })
67549
+ );
67550
+ }
67551
+ console.error("Error:", assistantError);
67552
+ } else if (params.jsonOutput) {
67486
67553
  console.log(
67487
67554
  JSON.stringify({
67488
67555
  ok: true,
@@ -67606,6 +67673,13 @@ function assistantTextFromAgent(agent) {
67606
67673
  }
67607
67674
  return text;
67608
67675
  }
67676
+ function assistantErrorFromAgent(agent) {
67677
+ const messages = agent?.state.messages ?? [];
67678
+ const lastMessage = messages[messages.length - 1];
67679
+ if (lastMessage?.role !== "assistant") return "";
67680
+ if (lastMessage.stopReason !== "error" && lastMessage.stopReason !== "aborted") return "";
67681
+ return lastMessage.errorMessage || "assistant response failed";
67682
+ }
67609
67683
  function readProgressText(value) {
67610
67684
  return typeof value === "string" ? value : "";
67611
67685
  }
@@ -67712,6 +67786,7 @@ async function runJsonEventsMode(params) {
67712
67786
  let disposeAgentSubscription;
67713
67787
  let disposeSemanticSubscription;
67714
67788
  let trace;
67789
+ let lastRetryEvent;
67715
67790
  const noProgressTimeoutMs = Number(process.env.PIE_JSON_EVENTS_NO_PROGRESS_MS || 6e5);
67716
67791
  const mockResponseDelayMs = Number(process.env.PIE_TEST_MOCK_RESPONSE_DELAY_MS || 0);
67717
67792
  writeEvent({ type: "agent.ready", sessionId });
@@ -67729,9 +67804,11 @@ async function runJsonEventsMode(params) {
67729
67804
  activeTurn.lastActivityAt = Date.now();
67730
67805
  }
67731
67806
  }
67732
- function display(chunk) {
67807
+ function display(chunk, options) {
67733
67808
  if (!activeTurn || !chunk) return;
67734
- activeTurn.summary += chunk;
67809
+ if (options?.appendToSummary !== false) {
67810
+ activeTurn.summary += chunk;
67811
+ }
67735
67812
  touch();
67736
67813
  writeEvent({
67737
67814
  type: "display.output",
@@ -67747,7 +67824,7 @@ async function runJsonEventsMode(params) {
67747
67824
  turn.finalized = true;
67748
67825
  switch (kind) {
67749
67826
  case "completed":
67750
- writeEvent({ type: "turn.completed", sessionId: turn.sessionId, turnId: turn.turnId, summary: turn.summary.trim() });
67827
+ writeEvent({ type: "turn.completed", sessionId: turn.sessionId, turnId: turn.turnId, summary: (detail ?? turn.summary).trim() });
67751
67828
  break;
67752
67829
  case "failed":
67753
67830
  writeEvent({ type: "turn.failed", sessionId: turn.sessionId, turnId: turn.turnId, error: detail || "turn failed" });
@@ -67783,7 +67860,7 @@ async function runJsonEventsMode(params) {
67783
67860
  const progressText = extractJsonEventsToolProgressText(event.partialResult);
67784
67861
  if (progressText) {
67785
67862
  display(progressText.endsWith("\n") ? progressText : `${progressText}
67786
- `);
67863
+ `, { appendToSummary: false });
67787
67864
  }
67788
67865
  }
67789
67866
  break;
@@ -67804,6 +67881,70 @@ async function runJsonEventsMode(params) {
67804
67881
  break;
67805
67882
  }
67806
67883
  }
67884
+ function handleControllerEvent(event) {
67885
+ trace?.noteRuntimeEvent(event.type, event);
67886
+ if (!activeTurn || activeTurn.finalized) return;
67887
+ if (event.type === "retry_scheduled") {
67888
+ lastRetryEvent = {
67889
+ attempt: event.attempt,
67890
+ maxRetries: event.maxRetries,
67891
+ delayMs: event.delayMs,
67892
+ error: event.errorMessage
67893
+ };
67894
+ touch();
67895
+ writeEvent({
67896
+ type: "turn.retry.scheduled",
67897
+ sessionId: activeTurn.sessionId,
67898
+ turnId: activeTurn.turnId,
67899
+ attempt: event.attempt,
67900
+ maxRetries: event.maxRetries,
67901
+ delayMs: event.delayMs,
67902
+ error: event.errorMessage
67903
+ });
67904
+ } else if (event.type === "retry_start") {
67905
+ activeTurn.summary = "";
67906
+ lastRetryEvent = {
67907
+ attempt: event.attempt,
67908
+ maxRetries: event.maxRetries,
67909
+ delayMs: lastRetryEvent?.delayMs,
67910
+ error: lastRetryEvent?.error
67911
+ };
67912
+ touch();
67913
+ writeEvent({
67914
+ type: "turn.retry.started",
67915
+ sessionId: activeTurn.sessionId,
67916
+ turnId: activeTurn.turnId,
67917
+ attempt: event.attempt,
67918
+ maxRetries: event.maxRetries,
67919
+ delayMs: lastRetryEvent.delayMs,
67920
+ error: lastRetryEvent.error
67921
+ });
67922
+ } else if (event.type === "retry_succeeded") {
67923
+ touch();
67924
+ writeEvent({
67925
+ type: "turn.retry.succeeded",
67926
+ sessionId: activeTurn.sessionId,
67927
+ turnId: activeTurn.turnId,
67928
+ attempt: event.attempts,
67929
+ maxRetries: lastRetryEvent?.maxRetries ?? CLI_RETRY_MAX_RETRIES,
67930
+ delayMs: lastRetryEvent?.delayMs,
67931
+ error: lastRetryEvent?.error
67932
+ });
67933
+ lastRetryEvent = void 0;
67934
+ } else if (event.type === "retry_exhausted") {
67935
+ touch();
67936
+ writeEvent({
67937
+ type: "turn.retry.exhausted",
67938
+ sessionId: activeTurn.sessionId,
67939
+ turnId: activeTurn.turnId,
67940
+ attempt: lastRetryEvent?.attempt ?? event.maxRetries,
67941
+ maxRetries: event.maxRetries,
67942
+ delayMs: lastRetryEvent?.delayMs,
67943
+ error: event.errorMessage
67944
+ });
67945
+ lastRetryEvent = void 0;
67946
+ }
67947
+ }
67807
67948
  async function ensureRuntime() {
67808
67949
  if (params.mockResponse !== void 0 || controller) return;
67809
67950
  const runtime = params.runtime;
@@ -67813,7 +67954,7 @@ async function runJsonEventsMode(params) {
67813
67954
  if (runtime.initialModel.unconfigured) {
67814
67955
  return;
67815
67956
  }
67816
- const { Agent: AgentClass } = await import("./chunks/src-LZC56DRG.js");
67957
+ const { Agent: AgentClass } = await import("./chunks/src-6WPNVGT2.js");
67817
67958
  const jsonModeExtensions = await loadJsonModeExtensions({ runtime, getAgent: () => agent });
67818
67959
  const tools = [...runtime.tools, ...jsonModeExtensions.extensionTools];
67819
67960
  recordCliCompositionStep(runtime.compositionTrace, {
@@ -67840,7 +67981,8 @@ async function runJsonEventsMode(params) {
67840
67981
  tools,
67841
67982
  thinkingLevel: "off"
67842
67983
  },
67843
- apiKey: runtime.apiKey
67984
+ apiKey: runtime.apiKey,
67985
+ streamFn: params.streamFn
67844
67986
  });
67845
67987
  controller = new AgentSessionController({
67846
67988
  agent,
@@ -67858,7 +68000,13 @@ async function runJsonEventsMode(params) {
67858
68000
  systemPrompt: result?.systemPrompt ?? context.baseSystemPrompt ?? baseSystemPrompt,
67859
68001
  messages: result?.messages?.length ? [...context.messages, ...result.messages] : context.messages
67860
68002
  };
67861
- }
68003
+ },
68004
+ retry: {
68005
+ isRetryableError: isCliRetryableError,
68006
+ maxRetries: CLI_RETRY_MAX_RETRIES,
68007
+ baseDelayMs: getCliRetryBaseDelayMs()
68008
+ },
68009
+ onEvent: handleControllerEvent
67862
68010
  });
67863
68011
  trace = new SessionTraceWriter(runtime.paths.sessionsDir, runtime.sessionManager);
67864
68012
  attachAgentEventsToSessionTrace({ agent, trace });
@@ -67938,7 +68086,7 @@ async function runJsonEventsMode(params) {
67938
68086
  if (!turn2 || turn2.finalized) return;
67939
68087
  if (Date.now() - turn2.lastActivityAt >= noProgressTimeoutMs) {
67940
68088
  turn2.stalled = true;
67941
- agent?.abort();
68089
+ controller?.abort();
67942
68090
  finalize("stalled", "no_progress_timeout");
67943
68091
  }
67944
68092
  }, Math.max(1e3, Math.min(noProgressTimeoutMs, 1e4)));
@@ -67949,14 +68097,23 @@ async function runJsonEventsMode(params) {
67949
68097
  await controller.prompt(message.prompt, { source: "json-events" });
67950
68098
  trace?.noteDispatchSettled({ mode: "json-events" });
67951
68099
  trace?.noteWaitForIdleStart({ mode: "json-events" });
67952
- await controller.waitForIdle();
68100
+ await controller.waitForSettled();
67953
68101
  trace?.noteWaitForIdleSettled({ mode: "json-events" });
67954
68102
  if (!activeTurn?.finalized) {
67955
- const text = activeTurn?.summary.trim() || assistantTextFromAgent(agent);
68103
+ const finalError = assistantErrorFromAgent(agent);
68104
+ if (activeTurn?.interrupted) {
68105
+ finalize("cancelled", "user_interrupt");
68106
+ return;
68107
+ }
68108
+ if (finalError) {
68109
+ finalize("failed", finalError);
68110
+ return;
68111
+ }
68112
+ const text = assistantTextFromAgent(agent);
67956
68113
  if (!activeTurn?.summary && text) {
67957
68114
  display(text);
67958
68115
  }
67959
- finalize(activeTurn?.interrupted ? "cancelled" : "completed", activeTurn?.interrupted ? "user_interrupt" : void 0);
68116
+ finalize("completed", text || activeTurn?.summary.trim());
67960
68117
  }
67961
68118
  } catch (error) {
67962
68119
  const messageText = error instanceof Error ? error.message : String(error);
@@ -68000,7 +68157,7 @@ async function runJsonEventsMode(params) {
68000
68157
  return;
68001
68158
  }
68002
68159
  activeTurn.interrupted = true;
68003
- agent?.abort();
68160
+ controller?.abort();
68004
68161
  if (params.mockResponse !== void 0) {
68005
68162
  finalize("cancelled", message.reason || "user_interrupt");
68006
68163
  activeTurn = null;
@@ -68018,7 +68175,7 @@ async function runJsonEventsMode(params) {
68018
68175
  if (message.type === "shutdown") {
68019
68176
  if (activeTurn && !activeTurn.finalized) {
68020
68177
  activeTurn.interrupted = true;
68021
- agent?.abort();
68178
+ controller?.abort();
68022
68179
  finalize("cancelled", message.reason || "shutdown");
68023
68180
  }
68024
68181
  break;
@@ -68198,6 +68355,13 @@ async function runWithJsonEventsConsoleIsolation(fn) {
68198
68355
  console.debug = originalDebug;
68199
68356
  }
68200
68357
  }
68358
+ async function createCliTestStreamFnFromEnv() {
68359
+ if (!process.env.PIE_TEST_MOCK_STREAM_SEQUENCE) {
68360
+ return void 0;
68361
+ }
68362
+ const { createTestStreamFnFromSequenceEnv } = await import("./chunks/test-stream-ZSKNLUEJ.js");
68363
+ return createTestStreamFnFromSequenceEnv();
68364
+ }
68201
68365
  async function startChat(initialPrompt, testCommand) {
68202
68366
  const rawOutput = process.argv.includes("--raw-output");
68203
68367
  const jsonOutput = process.argv.includes("--json-output");
@@ -68227,7 +68391,11 @@ async function startChat(initialPrompt, testCommand) {
68227
68391
  }
68228
68392
  throw error;
68229
68393
  }
68230
- await runJsonEventsMode({ runtime: runtime2, explicitSessionId });
68394
+ await runJsonEventsMode({
68395
+ runtime: runtime2,
68396
+ explicitSessionId,
68397
+ streamFn: await createCliTestStreamFnFromEnv()
68398
+ });
68231
68399
  });
68232
68400
  return;
68233
68401
  }
@@ -68256,7 +68424,13 @@ async function startChat(initialPrompt, testCommand) {
68256
68424
  throw error;
68257
68425
  }
68258
68426
  if (initialPrompt) {
68259
- await runPrintMode({ initialPrompt, rawOutput, jsonOutput, runtime });
68427
+ await runPrintMode({
68428
+ initialPrompt,
68429
+ rawOutput,
68430
+ jsonOutput,
68431
+ runtime,
68432
+ streamFn: await createCliTestStreamFnFromEnv()
68433
+ });
68260
68434
  process.exit(process.exitCode ?? 0);
68261
68435
  return;
68262
68436
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cydm/pie",
3
- "version": "1.0.14",
3
+ "version": "1.0.15",
4
4
  "description": "Pie AI Agent CLI",
5
5
  "type": "module",
6
6
  "bin": {