@cydm/pie 1.0.10 → 1.0.11

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.
@@ -1,8 +1,8 @@
1
1
  import { createRequire as __createRequire } from "node:module"; const require = __createRequire(import.meta.url);
2
2
  import {
3
3
  createAskUserCapability
4
- } from "../../../chunks/chunk-EJGQAAKS.js";
5
- import "../../../chunks/chunk-A5JSJAPK.js";
4
+ } from "../../../chunks/chunk-H6PTIABA.js";
5
+ import "../../../chunks/chunk-QACYLY3B.js";
6
6
  import "../../../chunks/chunk-TG2EQLX2.js";
7
7
 
8
8
  // builtin/extensions/ask-user/index.ts
@@ -7,8 +7,8 @@ import {
7
7
  isPlanModeSafeCommand,
8
8
  markCompletedPlanSteps,
9
9
  restoreExecutionState
10
- } from "../../../chunks/chunk-EJGQAAKS.js";
11
- import "../../../chunks/chunk-A5JSJAPK.js";
10
+ } from "../../../chunks/chunk-H6PTIABA.js";
11
+ import "../../../chunks/chunk-QACYLY3B.js";
12
12
  import "../../../chunks/chunk-TG2EQLX2.js";
13
13
 
14
14
  // builtin/extensions/plan-mode/index.ts
@@ -1,12 +1,12 @@
1
1
  import { createRequire as __createRequire } from "node:module"; const require = __createRequire(import.meta.url);
2
2
  import {
3
3
  createCliHostCapabilities
4
- } from "../../../chunks/chunk-R2HMYSEK.js";
4
+ } from "../../../chunks/chunk-GNHANWYT.js";
5
5
  import {
6
6
  createSharedFileSystemTools,
7
7
  createSubagentCapability
8
- } from "../../../chunks/chunk-EJGQAAKS.js";
9
- import "../../../chunks/chunk-A5JSJAPK.js";
8
+ } from "../../../chunks/chunk-H6PTIABA.js";
9
+ import "../../../chunks/chunk-QACYLY3B.js";
10
10
  import "../../../chunks/chunk-TG2EQLX2.js";
11
11
 
12
12
  // builtin/extensions/subagent/index.ts
@@ -7,8 +7,8 @@ import {
7
7
  executeManageTodoList,
8
8
  executionStateToTodos,
9
9
  restoreExecutionState
10
- } from "../../../chunks/chunk-EJGQAAKS.js";
11
- import "../../../chunks/chunk-A5JSJAPK.js";
10
+ } from "../../../chunks/chunk-H6PTIABA.js";
11
+ import "../../../chunks/chunk-QACYLY3B.js";
12
12
  import "../../../chunks/chunk-TG2EQLX2.js";
13
13
 
14
14
  // builtin/extensions/todo/index.ts
@@ -8,10 +8,10 @@ import {
8
8
  createSharedWebSearchTool,
9
9
  interpretShellExit,
10
10
  requestInteraction
11
- } from "./chunk-EJGQAAKS.js";
11
+ } from "./chunk-H6PTIABA.js";
12
12
  import {
13
13
  Type
14
- } from "./chunk-A5JSJAPK.js";
14
+ } from "./chunk-QACYLY3B.js";
15
15
 
16
16
  // src/config.ts
17
17
  import { existsSync, mkdirSync, readFileSync, renameSync } from "fs";
@@ -8,7 +8,7 @@ import {
8
8
  getFileSystem,
9
9
  getPlatformConfig,
10
10
  streamSimple
11
- } from "./chunk-A5JSJAPK.js";
11
+ } from "./chunk-QACYLY3B.js";
12
12
  import {
13
13
  __require
14
14
  } from "./chunk-TG2EQLX2.js";
@@ -435,7 +435,7 @@ function migrateV1ToV2(data) {
435
435
  };
436
436
  }
437
437
  function writeFileAtomic(gateway, filePath, content) {
438
- const tempPath = filePath + ".tmp";
438
+ const tempPath = `${filePath}.${Date.now()}.${Math.random().toString(36).slice(2)}.tmp`;
439
439
  gateway.writeFile(tempPath, content, "utf-8");
440
440
  try {
441
441
  const req = globalThis.require;
@@ -1230,6 +1230,8 @@ function summarizeToolResultForGuard(result) {
1230
1230
  const text = content.filter((block) => !!block && typeof block === "object" && "type" in block).filter((block) => block.type === "text").map((block) => block.text || "").join("\n").trim();
1231
1231
  return text || stableStringify(result);
1232
1232
  }
1233
+ var RUNAWAY_TOOLCALL_WHITESPACE_DELTA_CHARS = 16384;
1234
+ var RUNAWAY_TOOLCALL_WHITESPACE_DELTA_EVENTS = 40;
1233
1235
  function cloneQueuedInput(input) {
1234
1236
  return {
1235
1237
  ...input,
@@ -1262,6 +1264,10 @@ var AgentSessionController = class {
1262
1264
  pendingAutoCompact;
1263
1265
  queueIdCounter = 0;
1264
1266
  repeatedToolFailures = /* @__PURE__ */ new Map();
1267
+ streamGuard = {
1268
+ whitespaceToolCallDeltaChars: 0,
1269
+ whitespaceToolCallDeltaEvents: 0
1270
+ };
1265
1271
  runtimeGuardTriggered = false;
1266
1272
  constructor(options) {
1267
1273
  this.agent = options.agent;
@@ -1285,6 +1291,9 @@ var AgentSessionController = class {
1285
1291
  this.resetRuntimeGuardState();
1286
1292
  this.emit({ type: "streaming_changed", isStreaming: true });
1287
1293
  }
1294
+ if (event.type === "message_update") {
1295
+ this.recordMessageUpdateForGuard(event);
1296
+ }
1288
1297
  if (event.type === "tool_execution_end") {
1289
1298
  this.recordToolExecutionEndForGuard(event);
1290
1299
  }
@@ -1879,8 +1888,52 @@ var AgentSessionController = class {
1879
1888
  }
1880
1889
  resetRuntimeGuardState() {
1881
1890
  this.repeatedToolFailures.clear();
1891
+ this.streamGuard = {
1892
+ whitespaceToolCallDeltaChars: 0,
1893
+ whitespaceToolCallDeltaEvents: 0
1894
+ };
1882
1895
  this.runtimeGuardTriggered = false;
1883
1896
  }
1897
+ triggerRuntimeGuard(toolName, repeatCount, reason) {
1898
+ if (this.runtimeGuardTriggered) {
1899
+ return;
1900
+ }
1901
+ this.runtimeGuardTriggered = true;
1902
+ this.cancelRetry();
1903
+ this.cancelAutoCompactTimerOnly();
1904
+ this.cancelDispatchTimerOnly();
1905
+ this.cancelAutoContinueTimerOnly();
1906
+ this.emit({ type: "runtime_guard_triggered", toolName, repeatCount, reason });
1907
+ this.agent.abort();
1908
+ }
1909
+ recordMessageUpdateForGuard(event) {
1910
+ if (this.runtimeGuardTriggered) {
1911
+ return;
1912
+ }
1913
+ const assistantEvent = event.assistantMessageEvent;
1914
+ if (assistantEvent.type !== "toolcall_delta") {
1915
+ this.streamGuard.whitespaceToolCallDeltaChars = 0;
1916
+ this.streamGuard.whitespaceToolCallDeltaEvents = 0;
1917
+ return;
1918
+ }
1919
+ if (assistantEvent.delta.trim().length > 0) {
1920
+ this.streamGuard.whitespaceToolCallDeltaChars = 0;
1921
+ this.streamGuard.whitespaceToolCallDeltaEvents = 0;
1922
+ return;
1923
+ }
1924
+ this.streamGuard.whitespaceToolCallDeltaChars += assistantEvent.delta.length;
1925
+ this.streamGuard.whitespaceToolCallDeltaEvents += 1;
1926
+ const content = event.message.role === "assistant" && Array.isArray(event.message.content) ? event.message.content[assistantEvent.contentIndex] : void 0;
1927
+ const partialArgs = typeof content?.partialArgs === "string" ? content.partialArgs : "";
1928
+ const sparsePartialArgs = partialArgs.length >= RUNAWAY_TOOLCALL_WHITESPACE_DELTA_CHARS && partialArgs.replace(/\s/g, "").length / partialArgs.length < 0.05;
1929
+ if (sparsePartialArgs || this.streamGuard.whitespaceToolCallDeltaChars >= RUNAWAY_TOOLCALL_WHITESPACE_DELTA_CHARS && this.streamGuard.whitespaceToolCallDeltaEvents >= RUNAWAY_TOOLCALL_WHITESPACE_DELTA_EVENTS) {
1930
+ this.triggerRuntimeGuard(
1931
+ "assistant_stream",
1932
+ this.streamGuard.whitespaceToolCallDeltaEvents,
1933
+ "runaway_tool_call_arguments"
1934
+ );
1935
+ }
1936
+ }
1884
1937
  recordToolExecutionEndForGuard(event) {
1885
1938
  if (!event.isError) {
1886
1939
  const prefix = `${event.toolName}:`;
@@ -1898,14 +1951,7 @@ var AgentSessionController = class {
1898
1951
  if (repeatCount < 3 || this.runtimeGuardTriggered) {
1899
1952
  return;
1900
1953
  }
1901
- this.runtimeGuardTriggered = true;
1902
- this.cancelRetry();
1903
- this.cancelAutoCompactTimerOnly();
1904
- this.cancelDispatchTimerOnly();
1905
- this.cancelAutoContinueTimerOnly();
1906
- const reason = "repeated_tool_error";
1907
- this.emit({ type: "runtime_guard_triggered", toolName: event.toolName, repeatCount, reason });
1908
- this.agent.abort();
1954
+ this.triggerRuntimeGuard(event.toolName, repeatCount, "repeated_tool_error");
1909
1955
  }
1910
1956
  emit(event) {
1911
1957
  for (const listener of this.listeners) {
@@ -3184,7 +3230,11 @@ var SessionTraceSnapshotWriter = class {
3184
3230
  this.flushTimer = null;
3185
3231
  }
3186
3232
  if (!this.cachedController || !this.cachedSessionId) return;
3187
- this.options.saveTrace(this.cachedController.getSnapshot());
3233
+ try {
3234
+ this.options.saveTrace(this.cachedController.getSnapshot());
3235
+ } catch (error) {
3236
+ console.warn("[SessionTrace] Failed to save session trace:", error);
3237
+ }
3188
3238
  }
3189
3239
  notePendingUserText(text) {
3190
3240
  this.mutate((controller) => {
@@ -3567,7 +3617,7 @@ function inferUncertainty(text, signals) {
3567
3617
  function isParentHandoffRequired(task) {
3568
3618
  return task.needsParentWrite || task.status === "timeout" || task.status === "failed" || task.confidenceSignals.some((signal) => signal.type === "tool_error" || signal.type === "no_tool_use");
3569
3619
  }
3570
- async function runSubagentWithProgress(deps, task, reportProgress) {
3620
+ async function runSubagentWithProgress(deps, task, reportProgress, signal) {
3571
3621
  const startTime = Date.now();
3572
3622
  task.status = "running";
3573
3623
  let timedOut = false;
@@ -3588,6 +3638,9 @@ async function runSubagentWithProgress(deps, task, reportProgress) {
3588
3638
  if (!apiKey) {
3589
3639
  throw new Error("No API key available for subagent execution.");
3590
3640
  }
3641
+ if (signal?.aborted) {
3642
+ throw new Error("Subagent aborted by parent");
3643
+ }
3591
3644
  deps.log(`[Subagent ${task.name}] Plan: ${plan.complexity}/${plan.modelClass}, ${tools.length} tools`);
3592
3645
  deps.debugLog?.("plan", "SubagentPlan", plan);
3593
3646
  const systemPrompt = `You are a specialized subagent focused on one bounded task.
@@ -3611,6 +3664,7 @@ ${formatSkillsForPrompt(deps.skills ?? [])}`;
3611
3664
  let rejectTimeout = () => void 0;
3612
3665
  let timeout;
3613
3666
  let unsubscribe;
3667
+ let removeAbortListener;
3614
3668
  const timeoutPromise = new Promise((_, reject) => {
3615
3669
  rejectTimeout = reject;
3616
3670
  });
@@ -3620,6 +3674,19 @@ ${formatSkillsForPrompt(deps.skills ?? [])}`;
3620
3674
  subagent.abort?.();
3621
3675
  rejectTimeout(new Error(timeoutMessage));
3622
3676
  }, plan.timeoutSeconds * 1e3);
3677
+ const abortPromise = new Promise((_, reject) => {
3678
+ if (!signal) return;
3679
+ const abortSubagent = () => {
3680
+ subagent.abort?.();
3681
+ reject(new Error("Subagent aborted by parent"));
3682
+ };
3683
+ if (signal.aborted) {
3684
+ abortSubagent();
3685
+ return;
3686
+ }
3687
+ signal.addEventListener("abort", abortSubagent, { once: true });
3688
+ removeAbortListener = () => signal.removeEventListener("abort", abortSubagent);
3689
+ });
3623
3690
  unsubscribe = subagent.subscribe((event) => {
3624
3691
  if (event.type === "tool_execution_start") {
3625
3692
  toolCalls++;
@@ -3654,12 +3721,14 @@ ${formatSkillsForPrompt(deps.skills ?? [])}`;
3654
3721
  await subagent.prompt(prompt);
3655
3722
  await subagent.waitForIdle?.();
3656
3723
  })(),
3657
- timeoutPromise
3724
+ timeoutPromise,
3725
+ abortPromise
3658
3726
  ]);
3659
3727
  } finally {
3660
3728
  if (timeout) {
3661
3729
  clearTimeout(timeout);
3662
3730
  }
3731
+ removeAbortListener?.();
3663
3732
  unsubscribe?.();
3664
3733
  }
3665
3734
  const messages = subagent.state.messages;
@@ -3795,9 +3864,19 @@ Use this for independent investigation, search, review, or triage work. Provide
3795
3864
  { description: "Array of tasks to run in parallel", minItems: 1, maxItems: 10 }
3796
3865
  )
3797
3866
  }, { additionalProperties: false }),
3798
- async execute(first, second) {
3867
+ async execute(first, second, third, fourth) {
3799
3868
  const args = typeof first === "string" ? second : first;
3800
- const toolContext = typeof first === "string" ? { log: deps.log } : second;
3869
+ const signal = typeof first === "string" ? third : second?.signal;
3870
+ const reportProgress = typeof first === "string" ? fourth ? (update) => {
3871
+ fourth({
3872
+ content: update.message ? [{ type: "text", text: update.message }] : [],
3873
+ details: { increment: update.increment }
3874
+ });
3875
+ } : () => void 0 : second?.reportProgress ?? (() => void 0);
3876
+ const toolContext = {
3877
+ log: typeof first === "string" ? deps.log : second?.log ?? deps.log,
3878
+ reportProgress
3879
+ };
3801
3880
  const normalized = normalizeTaskDefs(args);
3802
3881
  if ("error" in normalized) {
3803
3882
  return {
@@ -3825,7 +3904,7 @@ Use this for independent investigation, search, review, or triage work. Provide
3825
3904
  toolContext.log?.(`Spawning ${tasks.length} parallel subagents: ${tasks.map((task) => task.name).join(", ")}`);
3826
3905
  toolContext.reportProgress?.({ message: `Launching ${tasks.length} parallel subagents...`, increment: 5 });
3827
3906
  const startTime = Date.now();
3828
- await Promise.all(tasks.map((task) => runSubagentWithProgress(deps, task, toolContext.reportProgress ?? (() => void 0))));
3907
+ await Promise.all(tasks.map((task) => runSubagentWithProgress(deps, task, toolContext.reportProgress, signal)));
3829
3908
  const totalDuration = Date.now() - startTime;
3830
3909
  const completed = tasks.filter((task) => task.status === "completed").length;
3831
3910
  const failed = tasks.filter((task) => task.status === "failed" || task.status === "timeout").length;
@@ -9002,35 +9002,78 @@ registerApiProvider({
9002
9002
  });
9003
9003
 
9004
9004
  // ../../packages/agent-core/src/agent-loop.ts
9005
+ function createLoopErrorMessage(error, config, signal) {
9006
+ const message = error instanceof Error ? error.message : String(error);
9007
+ return {
9008
+ role: "assistant",
9009
+ content: [{ type: "text", text: "" }],
9010
+ api: config.model.api,
9011
+ provider: config.model.provider,
9012
+ model: config.model.id,
9013
+ usage: {
9014
+ input: 0,
9015
+ output: 0,
9016
+ cacheRead: 0,
9017
+ cacheWrite: 0,
9018
+ totalTokens: 0,
9019
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 }
9020
+ },
9021
+ stopReason: signal?.aborted ? "aborted" : "error",
9022
+ errorMessage: message,
9023
+ timestamp: Date.now()
9024
+ };
9025
+ }
9026
+ async function notifyOnError(config, error, phase) {
9027
+ try {
9028
+ await config.hooks?.onError?.(error instanceof Error ? error : new Error(String(error)), { phase });
9029
+ } catch (hookError) {
9030
+ console.warn(`[AgentLoop] onError hook failed during ${phase}:`, hookError);
9031
+ }
9032
+ }
9033
+ function endStreamWithError(stream, newMessages, config, signal, error) {
9034
+ const errorMessage = createLoopErrorMessage(error, config, signal);
9035
+ newMessages.push(errorMessage);
9036
+ stream.push({ type: "message_start", message: errorMessage });
9037
+ stream.push({ type: "message_end", message: errorMessage });
9038
+ stream.push({ type: "turn_end", message: errorMessage, toolResults: [] });
9039
+ stream.push({ type: "agent_end", messages: newMessages });
9040
+ stream.end(newMessages);
9041
+ }
9005
9042
  function agentLoop(prompts, context, config, signal, streamFn) {
9006
9043
  const stream = createAgentStream();
9007
9044
  (async () => {
9008
- try {
9009
- await config.hooks?.beforeAgentStart?.();
9010
- } catch (e) {
9011
- console.warn("[AgentLoop] beforeAgentStart hook failed:", e);
9012
- }
9013
9045
  const newMessages = [...prompts];
9014
- const currentContext = {
9015
- ...context,
9016
- messages: [...context.messages, ...prompts]
9017
- };
9018
- stream.push({ type: "agent_start" });
9019
- stream.push({ type: "turn_start" });
9020
- for (const prompt of prompts) {
9021
- stream.push({ type: "message_start", message: prompt });
9022
- stream.push({ type: "message_end", message: prompt });
9023
- }
9024
9046
  try {
9025
- await runLoop(currentContext, newMessages, config, signal, stream, streamFn);
9047
+ try {
9048
+ await config.hooks?.beforeAgentStart?.();
9049
+ } catch (e) {
9050
+ console.warn("[AgentLoop] beforeAgentStart hook failed:", e);
9051
+ }
9052
+ const currentContext = {
9053
+ ...context,
9054
+ messages: [...context.messages, ...prompts]
9055
+ };
9056
+ stream.push({ type: "agent_start" });
9057
+ stream.push({ type: "turn_start" });
9058
+ for (const prompt of prompts) {
9059
+ stream.push({ type: "message_start", message: prompt });
9060
+ stream.push({ type: "message_end", message: prompt });
9061
+ }
9062
+ try {
9063
+ await runLoop(currentContext, newMessages, config, signal, stream, streamFn);
9064
+ } catch (error) {
9065
+ await notifyOnError(config, error, "runLoop");
9066
+ endStreamWithError(stream, newMessages, config, signal, error);
9067
+ return;
9068
+ }
9069
+ try {
9070
+ await config.hooks?.afterAgentEnd?.(newMessages);
9071
+ } catch (e) {
9072
+ console.warn("[AgentLoop] afterAgentEnd hook failed:", e);
9073
+ }
9026
9074
  } catch (error) {
9027
- config.hooks?.onError?.(error, { phase: "runLoop" });
9028
- throw error;
9029
- }
9030
- try {
9031
- await config.hooks?.afterAgentEnd?.(newMessages);
9032
- } catch (e) {
9033
- console.warn("[AgentLoop] afterAgentEnd hook failed:", e);
9075
+ await notifyOnError(config, error, "agentLoop");
9076
+ endStreamWithError(stream, newMessages, config, signal, error);
9034
9077
  }
9035
9078
  })();
9036
9079
  return stream;
@@ -9044,25 +9087,31 @@ function agentLoopContinue(context, config, signal, streamFn) {
9044
9087
  }
9045
9088
  const stream = createAgentStream();
9046
9089
  (async () => {
9047
- try {
9048
- await config.hooks?.beforeAgentStart?.();
9049
- } catch (e) {
9050
- console.warn("[AgentLoop] beforeAgentStart hook failed:", e);
9051
- }
9052
9090
  const newMessages = [];
9053
- const currentContext = { ...context };
9054
- stream.push({ type: "agent_start" });
9055
- stream.push({ type: "turn_start" });
9056
9091
  try {
9057
- await runLoop(currentContext, newMessages, config, signal, stream, streamFn);
9092
+ try {
9093
+ await config.hooks?.beforeAgentStart?.();
9094
+ } catch (e) {
9095
+ console.warn("[AgentLoop] beforeAgentStart hook failed:", e);
9096
+ }
9097
+ const currentContext = { ...context };
9098
+ stream.push({ type: "agent_start" });
9099
+ stream.push({ type: "turn_start" });
9100
+ try {
9101
+ await runLoop(currentContext, newMessages, config, signal, stream, streamFn);
9102
+ } catch (error) {
9103
+ await notifyOnError(config, error, "runLoop");
9104
+ endStreamWithError(stream, newMessages, config, signal, error);
9105
+ return;
9106
+ }
9107
+ try {
9108
+ await config.hooks?.afterAgentEnd?.(newMessages);
9109
+ } catch (e) {
9110
+ console.warn("[AgentLoop] afterAgentEnd hook failed:", e);
9111
+ }
9058
9112
  } catch (error) {
9059
- config.hooks?.onError?.(error, { phase: "runLoop" });
9060
- throw error;
9061
- }
9062
- try {
9063
- await config.hooks?.afterAgentEnd?.(newMessages);
9064
- } catch (e) {
9065
- console.warn("[AgentLoop] afterAgentEnd hook failed:", e);
9113
+ await notifyOnError(config, error, "agentLoopContinue");
9114
+ endStreamWithError(stream, newMessages, config, signal, error);
9066
9115
  }
9067
9116
  })();
9068
9117
  return stream;
@@ -9098,7 +9147,7 @@ async function runLoop(currentContext, newMessages, config, signal, stream, stre
9098
9147
  try {
9099
9148
  message = await streamAssistantResponse(currentContext, config, signal, stream, streamFn);
9100
9149
  } catch (error) {
9101
- config.hooks?.onError?.(error, { phase: "streamAssistantResponse" });
9150
+ await notifyOnError(config, error, "streamAssistantResponse");
9102
9151
  throw error;
9103
9152
  }
9104
9153
  newMessages.push(message);
@@ -9274,10 +9323,14 @@ async function executeToolCalls(tools, assistantMessage, signal, stream, getStee
9274
9323
  details: {}
9275
9324
  };
9276
9325
  isError = true;
9277
- hooks?.onError?.(e instanceof Error ? e : new Error(String(e)), {
9278
- toolName: toolCall.name,
9279
- phase: "toolExecution"
9280
- });
9326
+ try {
9327
+ await hooks?.onError?.(e instanceof Error ? e : new Error(String(e)), {
9328
+ toolName: toolCall.name,
9329
+ phase: "toolExecution"
9330
+ });
9331
+ } catch (hookError) {
9332
+ console.warn(`[AgentLoop] onError hook failed during toolExecution for ${toolCall.name}:`, hookError);
9333
+ }
9281
9334
  }
9282
9335
  }
9283
9336
  try {
@@ -9789,15 +9842,30 @@ var Agent = class {
9789
9842
  this.abortController = void 0;
9790
9843
  }
9791
9844
  }
9845
+ reportObserverError(kind, eventType, error) {
9846
+ console.warn(`[Agent] ${kind} failed while handling ${eventType}:`, error);
9847
+ }
9792
9848
  emit(e) {
9793
9849
  for (const listener of this.listeners) {
9794
- listener(e);
9850
+ try {
9851
+ listener(e);
9852
+ } catch (error) {
9853
+ this.reportObserverError("agent event listener", e.type, error);
9854
+ }
9855
+ }
9856
+ try {
9857
+ this.emitDerivedSemanticEvents(e);
9858
+ } catch (error) {
9859
+ this.reportObserverError("derived semantic event", e.type, error);
9795
9860
  }
9796
- this.emitDerivedSemanticEvents(e);
9797
9861
  }
9798
9862
  emitSemantic(e) {
9799
9863
  for (const listener of this.semanticListeners) {
9800
- listener(e);
9864
+ try {
9865
+ listener(e);
9866
+ } catch (error) {
9867
+ this.reportObserverError("semantic event listener", e.type, error);
9868
+ }
9801
9869
  }
9802
9870
  }
9803
9871
  updateStatusSnapshot(next) {
@@ -3,7 +3,7 @@ import {
3
3
  Agent,
4
4
  agentLoop,
5
5
  agentLoopContinue
6
- } from "./chunk-A5JSJAPK.js";
6
+ } from "./chunk-QACYLY3B.js";
7
7
  import "./chunk-TG2EQLX2.js";
8
8
  export {
9
9
  Agent,
package/dist/cli.js CHANGED
@@ -14,7 +14,7 @@ import {
14
14
  getSettingsPath,
15
15
  getThemesDir,
16
16
  migrateConfigFromAgentDir
17
- } from "./chunks/chunk-R2HMYSEK.js";
17
+ } from "./chunks/chunk-GNHANWYT.js";
18
18
  import {
19
19
  AGENTS_CONTEXT_FILE_NAME,
20
20
  AgentSessionController,
@@ -52,7 +52,7 @@ import {
52
52
  selectToolsForRuntimePolicy,
53
53
  shouldPreserveExecutionStateForUserText,
54
54
  supersedeExecutionState
55
- } from "./chunks/chunk-EJGQAAKS.js";
55
+ } from "./chunks/chunk-H6PTIABA.js";
56
56
  import {
57
57
  Deref,
58
58
  Errors,
@@ -86,7 +86,7 @@ import {
86
86
  setLogger,
87
87
  sortToolModelCandidatesByCapability,
88
88
  type_exports
89
- } from "./chunks/chunk-A5JSJAPK.js";
89
+ } from "./chunks/chunk-QACYLY3B.js";
90
90
  import {
91
91
  resolveCliProjectRoot
92
92
  } from "./chunks/chunk-NTYHFBUA.js";
@@ -56031,6 +56031,27 @@ var ExecutionStateManager = class {
56031
56031
  // src/session-trace.ts
56032
56032
  import * as fs15 from "node:fs";
56033
56033
  import * as path16 from "node:path";
56034
+ function saveTraceFileBestEffort(tracePath, content) {
56035
+ const tempPath = `${tracePath}.${process.pid}.${Date.now()}.tmp`;
56036
+ try {
56037
+ fs15.writeFileSync(tempPath, content, "utf8");
56038
+ try {
56039
+ fs15.renameSync(tempPath, tracePath);
56040
+ return;
56041
+ } catch {
56042
+ try {
56043
+ fs15.copyFileSync(tempPath, tracePath);
56044
+ } catch {
56045
+ } finally {
56046
+ try {
56047
+ fs15.unlinkSync(tempPath);
56048
+ } catch {
56049
+ }
56050
+ }
56051
+ }
56052
+ } catch {
56053
+ }
56054
+ }
56034
56055
  var SessionTraceWriter = class extends SessionTraceSnapshotWriter {
56035
56056
  constructor(sessionsDir, sessionManager) {
56036
56057
  super({
@@ -56046,9 +56067,7 @@ var SessionTraceWriter = class extends SessionTraceSnapshotWriter {
56046
56067
  },
56047
56068
  saveTrace: (trace) => {
56048
56069
  const tracePath = path16.join(sessionsDir, `${trace.sessionId}.trace.json`);
56049
- const tempPath = `${tracePath}.tmp`;
56050
- fs15.writeFileSync(tempPath, JSON.stringify(trace, null, 2), "utf8");
56051
- fs15.renameSync(tempPath, tracePath);
56070
+ saveTraceFileBestEffort(tracePath, JSON.stringify(trace, null, 2));
56052
56071
  }
56053
56072
  });
56054
56073
  this.sessionsDir = sessionsDir;
@@ -65328,7 +65347,7 @@ var InteractiveMode = class {
65328
65347
  if (savedLevel) {
65329
65348
  this.thinkingLevel = savedLevel;
65330
65349
  }
65331
- const { Agent } = await import("./chunks/src-3X3HBT2G.js");
65350
+ const { Agent } = await import("./chunks/src-M32UEGIU.js");
65332
65351
  const activeSession = this.sessionManager.getActiveSession();
65333
65352
  this.agent = new Agent({
65334
65353
  initialState: {
@@ -67321,7 +67340,7 @@ async function startChat(initialPrompt, testCommand) {
67321
67340
  `);
67322
67341
  console.log("Assistant: ");
67323
67342
  }
67324
- const { Agent } = await import("./chunks/src-3X3HBT2G.js");
67343
+ const { Agent } = await import("./chunks/src-M32UEGIU.js");
67325
67344
  let agent;
67326
67345
  const printModeExtensions = await loadPrintModeExtensions({
67327
67346
  cwd,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cydm/pie",
3
- "version": "1.0.10",
3
+ "version": "1.0.11",
4
4
  "description": "Pie AI Agent CLI",
5
5
  "type": "module",
6
6
  "bin": {