@symerian/symi 2.6.2 → 2.6.3

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.
Files changed (109) hide show
  1. package/dist/{agents-qLMWAYwU.js → agents-Dm0V9Z2G.js} +4 -4
  2. package/dist/{agents.config-BmdFH4J5.js → agents.config-DP0CLvIA.js} +1 -1
  3. package/dist/{agents.config-BfjAwFCr.js → agents.config-WdkJjM2-.js} +1 -1
  4. package/dist/{audio-preflight-BVaaZWkg.js → audio-preflight-DHTaS5U1.js} +4 -4
  5. package/dist/{auth-choice-D1u_GPfQ.js → auth-choice-B9OnYICm.js} +1 -1
  6. package/dist/{auth-choice-zFq3WRQ0.js → auth-choice-CXHi61T5.js} +1 -1
  7. package/dist/{banner-DpH44qlJ.js → banner-ToxTMzfL.js} +1 -1
  8. package/dist/build-info.json +3 -3
  9. package/dist/bundled/boot-md/handler.js +6 -6
  10. package/dist/bundled/session-memory/handler.js +6 -6
  11. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  12. package/dist/{channel-options-C8tKm8re.js → channel-options-CsGrHsjP.js} +1 -1
  13. package/dist/{channel-options-0iOfzVR3.js → channel-options-Jl8AKRLD.js} +1 -1
  14. package/dist/{channel-web-DYinYBz4.js → channel-web-qFGaLytG.js} +1 -1
  15. package/dist/{channels-cli-93tLT17t.js → channels-cli-BFyOmW-R.js} +4 -4
  16. package/dist/{channels-cli-C8HgSMTH.js → channels-cli-DQTl2Pk5.js} +4 -4
  17. package/dist/{chrome-DkaXoP36.js → chrome-DYZwl5Gv.js} +7 -7
  18. package/dist/{cli-BYJyRW2M.js → cli-B4biLt2z.js} +1 -1
  19. package/dist/{cli-DapZXGSB.js → cli-DQw_LEew.js} +1 -1
  20. package/dist/{command-registry-9EhYc6da.js → command-registry-D1OePePk.js} +9 -9
  21. package/dist/{completion-cli-BFZv3K5D.js → completion-cli-CI-0hC_u.js} +2 -2
  22. package/dist/{completion-cli-CCeQlMlC.js → completion-cli-DW8a1WYc.js} +1 -1
  23. package/dist/{config-cli-Dv2mtIeM.js → config-cli-CpiluXlO.js} +1 -1
  24. package/dist/{config-cli-DbWMIBUz.js → config-cli-DHXt5cQZ.js} +1 -1
  25. package/dist/{configure-CVQf2UJE.js → configure-CmVnpTNi.js} +3 -3
  26. package/dist/{configure-B8zV6Hxj.js → configure-Ha9cu8Bu.js} +3 -3
  27. package/dist/{deliver-C46-vyqg.js → deliver-dODxSv3b.js} +1 -1
  28. package/dist/{doctor-completion-BunqvoqZ.js → doctor-completion-CRNCOXcf.js} +1 -1
  29. package/dist/{doctor-completion-CLeX1kaN.js → doctor-completion-ve-JPlmN.js} +1 -1
  30. package/dist/entry.js +1 -1
  31. package/dist/extensionAPI.js +1 -1
  32. package/dist/{gateway-cli-Co-tp-WC.js → gateway-cli-BPsbjmUI.js} +9 -9
  33. package/dist/{gateway-cli-DMey_29a.js → gateway-cli-Cc7N8N_E.js} +9 -9
  34. package/dist/{glass-ui-ws-CKb1jTZR.js → glass-ui-ws-1O1O2xC6.js} +7 -7
  35. package/dist/{glass-ui-ws-C4O227UO.js → glass-ui-ws-CKwLnOwl.js} +7 -7
  36. package/dist/{health-CDGOsNeD.js → health-DTRWmRB8.js} +1 -1
  37. package/dist/{health-CM1asUG8.js → health-tYyUNVp5.js} +1 -1
  38. package/dist/{hooks-cli-DFKB3Z6X.js → hooks-cli-Cp81vqRc.js} +2 -2
  39. package/dist/{hooks-cli-Tx0TzSju.js → hooks-cli-eC03ywfG.js} +2 -2
  40. package/dist/{image-CuzFLQWC.js → image-CXu8W39c.js} +1 -1
  41. package/dist/index.js +6 -6
  42. package/dist/llm-slug-generator.js +6 -6
  43. package/dist/{models-CiqHYwje.js → models-CuhnCX2U.js} +2 -2
  44. package/dist/{models-cli-B4ATSsNS.js → models-cli-BzwGQUdn.js} +3 -3
  45. package/dist/{models-cli-B-b-gBKG.js → models-cli-CFr_ZP5y.js} +2 -2
  46. package/dist/{onboard-B_ECX48L.js → onboard-B2g2Q6dd.js} +2 -2
  47. package/dist/{onboard-DcnGZKZX.js → onboard-CcB6pmEy.js} +2 -2
  48. package/dist/{onboard-channels-pfSGhg_C.js → onboard-channels-CWd17q6h.js} +1 -1
  49. package/dist/{onboard-channels-FFQPpuEN.js → onboard-channels-DmRBC7VN.js} +1 -1
  50. package/dist/{onboarding-jhZxQcZ3.js → onboarding-DMqlt_p6.js} +3 -3
  51. package/dist/{onboarding-BU14cspo.js → onboarding-DwvQIqR8.js} +3 -3
  52. package/dist/{onboarding.finalize-ByZT4dF5.js → onboarding.finalize-BUSzTwhM.js} +5 -5
  53. package/dist/{onboarding.finalize-B8oOMfHc.js → onboarding.finalize-lJmZSE4C.js} +6 -6
  54. package/dist/{pi-embedded-BY9AnmoP.js → pi-embedded-CT2JDfQr.js} +147 -141
  55. package/dist/{pi-embedded-helpers-CfqDGQ9J.js → pi-embedded-helpers-pubKo8HQ.js} +4 -4
  56. package/dist/{plugin-registry-DXWJkJX6.js → plugin-registry-DZdPnpP_.js} +1 -1
  57. package/dist/{plugin-registry-CNf1_8hj.js → plugin-registry-vW2V1yCi.js} +1 -1
  58. package/dist/plugin-sdk/{channel-web-DZQQ0mzN.js → channel-web-38aqDKeT.js} +1 -1
  59. package/dist/plugin-sdk/index.js +2 -2
  60. package/dist/plugin-sdk/{reply-DvZeyOVA.js → reply-BjJZjZRr.js} +143 -137
  61. package/dist/plugin-sdk/{web-BCsJFuQu.js → web-BgKYnau3.js} +2 -2
  62. package/dist/{plugins-cli-BiedlZMy.js → plugins-cli-BTq9c2hZ.js} +2 -2
  63. package/dist/{plugins-cli-C9TYM40P.js → plugins-cli-DkAx9r3h.js} +2 -2
  64. package/dist/{program-bnWda72r.js → program-DZx9PtyT.js} +7 -7
  65. package/dist/{program-context-CY1jWc5A.js → program-context-DyfuToE1.js} +17 -17
  66. package/dist/{prompt-select-styled-B_lFTtqp.js → prompt-select-styled-CifWTOoY.js} +4 -4
  67. package/dist/{prompt-select-styled-BEnZY8wI.js → prompt-select-styled-DNbD3v3G.js} +4 -4
  68. package/dist/{provider-auth-helpers-DApJuzBd.js → provider-auth-helpers-BPIIDTwA.js} +1 -1
  69. package/dist/{provider-auth-helpers-DcNKxc7D.js → provider-auth-helpers-BzySaUp5.js} +1 -1
  70. package/dist/{push-apns-CKKHlj6j.js → push-apns-DbpeXPGR.js} +1 -1
  71. package/dist/{push-apns-DA7UMNQH.js → push-apns-IdD-dKZm.js} +1 -1
  72. package/dist/{pw-ai-m0mj2KWK.js → pw-ai-B5asscAD.js} +1 -1
  73. package/dist/{register.agent-ulu0VmOg.js → register.agent-CfFcSvM1.js} +6 -6
  74. package/dist/{register.agent-8lxVlmzQ.js → register.agent-TFUcxDGN.js} +5 -5
  75. package/dist/{register.configure-rq0h5r3X.js → register.configure-BwRTNCws.js} +6 -6
  76. package/dist/{register.configure-45--Sly1.js → register.configure-D3BJejOC.js} +6 -6
  77. package/dist/{register.maintenance-DyEJx7NY.js → register.maintenance-B5350ddh.js} +7 -7
  78. package/dist/{register.maintenance-CXbxRtWI.js → register.maintenance-DkdVYwbj.js} +8 -8
  79. package/dist/{register.message-CiN_pt6K.js → register.message-DTopCPGC.js} +2 -2
  80. package/dist/{register.message-C7Yh1uky.js → register.message-FbCBAfJO.js} +2 -2
  81. package/dist/{register.onboard-e_2hc2Rm.js → register.onboard-DITZn8dx.js} +4 -4
  82. package/dist/{register.onboard-BWaRkbei.js → register.onboard-GSv5xyA3.js} +4 -4
  83. package/dist/{register.setup-BIIFHtF7.js → register.setup-BI6lILMU.js} +4 -4
  84. package/dist/{register.setup-zwh90Vn-.js → register.setup-BuOeoBk0.js} +4 -4
  85. package/dist/{register.status-health-sessions-D6t5maEr.js → register.status-health-sessions-C1RhWKxN.js} +3 -3
  86. package/dist/{register.status-health-sessions-O-sVAFHE.js → register.status-health-sessions-EK4_odLb.js} +3 -3
  87. package/dist/{register.subclis-DOiZocR6.js → register.subclis-Bn_Mr_Wa.js} +9 -9
  88. package/dist/{reply-05js8eGB.js → reply-BGSd_cMI.js} +138 -132
  89. package/dist/{run-main-u-Eyc8Wm.js → run-main-Bu9IAm9E.js} +14 -14
  90. package/dist/{runner-CU9l0uJh.js → runner-WAG0M5s9.js} +1 -1
  91. package/dist/{server-methods-Dds-iEoY.js → server-methods-dxn6-zQz.js} +7 -7
  92. package/dist/{server-methods-Bvl1xubo.js → server-methods-tA9lkIQT.js} +7 -7
  93. package/dist/{server-node-events-Qp-gJMET.js → server-node-events-6jcJSpXA.js} +2 -2
  94. package/dist/{server-node-events-qGqpsPxm.js → server-node-events-CzcTGD9T.js} +2 -2
  95. package/dist/{status-BRSo-LY3.js → status-8176C-aV.js} +2 -2
  96. package/dist/{status-BqQ9mm64.js → status-CcQSl2sN.js} +1 -1
  97. package/dist/{status-BATOXGRi.js → status-DGKT6HnE.js} +2 -2
  98. package/dist/{status-CfYa1Q9K.js → status-DmPOSk-A.js} +1 -1
  99. package/dist/{subagent-registry-lbDgDwLy.js → subagent-registry-DqFKNTCX.js} +141 -135
  100. package/dist/{unified-runner-B4ICXRlg.js → unified-runner-BbanUEmo.js} +166 -160
  101. package/dist/{update-cli-BOaP4XyQ.js → update-cli-FMcGr7MA.js} +8 -8
  102. package/dist/{update-cli-R8-SSkbS.js → update-cli-YCXB_6jz.js} +7 -7
  103. package/dist/{update-runner-CWJ4pC1b.js → update-runner-C8OkrKjW.js} +1 -1
  104. package/dist/{update-runner-B8UmqtLI.js → update-runner-DMP1rCS1.js} +1 -1
  105. package/dist/{web-CQH9fSkH.js → web-BsS1ia0M.js} +6 -6
  106. package/dist/{web-CSrDbJJ7.js → web-CQ2F1f3a.js} +1 -1
  107. package/dist/{web-BWybtnEa.js → web-DoRGusTq.js} +2 -2
  108. package/dist/{web-DBFW0ejP.js → web-LUMjboLF.js} +1 -1
  109. package/package.json +1 -1
@@ -3448,7 +3448,7 @@ function resolveMemoryBackendConfig(params) {
3448
3448
 
3449
3449
  //#endregion
3450
3450
  //#region src/memory/search-manager.ts
3451
- const log$9 = createSubsystemLogger("memory");
3451
+ const log$10 = createSubsystemLogger("memory");
3452
3452
  const QMD_MANAGER_CACHE = /* @__PURE__ */ new Map();
3453
3453
  async function getMemorySearchManager(params) {
3454
3454
  const resolved = resolveMemoryBackendConfig(params);
@@ -3481,7 +3481,7 @@ async function getMemorySearchManager(params) {
3481
3481
  }
3482
3482
  } catch (err) {
3483
3483
  const message = err instanceof Error ? err.message : String(err);
3484
- log$9.warn(`qmd memory unavailable; falling back to builtin: ${message}`);
3484
+ log$10.warn(`qmd memory unavailable; falling back to builtin: ${message}`);
3485
3485
  }
3486
3486
  }
3487
3487
  try {
@@ -3508,7 +3508,7 @@ var FallbackMemoryManager = class {
3508
3508
  } catch (err) {
3509
3509
  this.primaryFailed = true;
3510
3510
  this.lastError = err instanceof Error ? err.message : String(err);
3511
- log$9.warn(`qmd memory failed; switching to builtin index: ${this.lastError}`);
3511
+ log$10.warn(`qmd memory failed; switching to builtin index: ${this.lastError}`);
3512
3512
  await this.deps.primary.close?.().catch(() => {});
3513
3513
  this.evictCacheEntry();
3514
3514
  }
@@ -3588,12 +3588,12 @@ var FallbackMemoryManager = class {
3588
3588
  try {
3589
3589
  fallback = await this.deps.fallbackFactory();
3590
3590
  if (!fallback) {
3591
- log$9.warn("memory fallback requested but builtin index is unavailable");
3591
+ log$10.warn("memory fallback requested but builtin index is unavailable");
3592
3592
  return null;
3593
3593
  }
3594
3594
  } catch (err) {
3595
3595
  const message = err instanceof Error ? err.message : String(err);
3596
- log$9.warn(`memory fallback unavailable: ${message}`);
3596
+ log$10.warn(`memory fallback unavailable: ${message}`);
3597
3597
  return null;
3598
3598
  }
3599
3599
  this.fallback = fallback;
@@ -17253,7 +17253,7 @@ function createRunRegistry(options) {
17253
17253
 
17254
17254
  //#endregion
17255
17255
  //#region src/process/supervisor/supervisor.ts
17256
- const log$8 = createSubsystemLogger("process/supervisor");
17256
+ const log$9 = createSubsystemLogger("process/supervisor");
17257
17257
  function clampTimeout(value) {
17258
17258
  if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) return;
17259
17259
  return Math.max(1, Math.floor(value));
@@ -17439,7 +17439,7 @@ function createProcessSupervisor() {
17439
17439
  exitCode: null,
17440
17440
  exitSignal: null
17441
17441
  });
17442
- log$8.warn(`spawn failed: runId=${runId} reason=${String(err)}`);
17442
+ log$9.warn(`spawn failed: runId=${runId} reason=${String(err)}`);
17443
17443
  throw err;
17444
17444
  }
17445
17445
  };
@@ -34770,7 +34770,7 @@ function createNodesTool(options) {
34770
34770
 
34771
34771
  //#endregion
34772
34772
  //#region src/gateway/session-utils.ts
34773
- const log$7 = createSubsystemLogger("session-utils");
34773
+ const log$8 = createSubsystemLogger("session-utils");
34774
34774
  const AVATAR_MAX_BYTES = 2 * 1024 * 1024;
34775
34775
  function isStorePathTemplate(store) {
34776
34776
  return typeof store === "string" && store.includes("{agentId}");
@@ -35633,7 +35633,7 @@ async function resolveAnnounceTarget(params) {
35633
35633
 
35634
35634
  //#endregion
35635
35635
  //#region src/agents/tools/sessions-send-tool.a2a.ts
35636
- const log$6 = createSubsystemLogger("agents/sessions-send");
35636
+ const log$7 = createSubsystemLogger("agents/sessions-send");
35637
35637
  async function runSessionsSendA2AFlow(params) {
35638
35638
  const runContextId = params.waitRunId ?? "unknown";
35639
35639
  try {
@@ -35724,7 +35724,7 @@ async function runSessionsSendA2AFlow(params) {
35724
35724
  timeoutMs: 1e4
35725
35725
  });
35726
35726
  } catch (err) {
35727
- log$6.warn("sessions_send announce delivery failed", {
35727
+ log$7.warn("sessions_send announce delivery failed", {
35728
35728
  runId: runContextId,
35729
35729
  channel: announceTarget.channel,
35730
35730
  to: announceTarget.to,
@@ -35732,7 +35732,7 @@ async function runSessionsSendA2AFlow(params) {
35732
35732
  });
35733
35733
  }
35734
35734
  } catch (err) {
35735
- log$6.warn("sessions_send announce flow failed", {
35735
+ log$7.warn("sessions_send announce flow failed", {
35736
35736
  runId: runContextId,
35737
35737
  error: formatErrorMessage(err)
35738
35738
  });
@@ -38762,7 +38762,7 @@ function resolveRunWorkspaceDir(params) {
38762
38762
 
38763
38763
  //#endregion
38764
38764
  //#region src/agents/cli-runner.ts
38765
- const log$5 = createSubsystemLogger("agent/claude-cli");
38765
+ const log$6 = createSubsystemLogger("agent/claude-cli");
38766
38766
  async function runCliAgent(params) {
38767
38767
  const started = Date.now();
38768
38768
  const workspaceResolution = resolveRunWorkspaceDir({
@@ -38775,7 +38775,7 @@ async function runCliAgent(params) {
38775
38775
  const redactedSessionId = redactRunIdentifier(params.sessionId);
38776
38776
  const redactedSessionKey = redactRunIdentifier(params.sessionKey);
38777
38777
  const redactedWorkspace = redactRunIdentifier(resolvedWorkspace);
38778
- if (workspaceResolution.usedFallback) log$5.warn(`[workspace-fallback] caller=runCliAgent reason=${workspaceResolution.fallbackReason} run=${params.runId} session=${redactedSessionId} sessionKey=${redactedSessionKey} agent=${workspaceResolution.agentId} workspace=${redactedWorkspace}`);
38778
+ if (workspaceResolution.usedFallback) log$6.warn(`[workspace-fallback] caller=runCliAgent reason=${workspaceResolution.fallbackReason} run=${params.runId} session=${redactedSessionId} sessionKey=${redactedSessionKey} agent=${workspaceResolution.agentId} workspace=${redactedWorkspace}`);
38779
38779
  const workspaceDir = resolvedWorkspace;
38780
38780
  const backendResolved = resolveCliBackendConfig(params.provider, params.config);
38781
38781
  if (!backendResolved) throw new Error(`Unknown CLI backend: ${params.provider}`);
@@ -38792,7 +38792,7 @@ async function runCliAgent(params) {
38792
38792
  sessionId: params.sessionId,
38793
38793
  warn: makeBootstrapWarn({
38794
38794
  sessionLabel,
38795
- warn: (message) => log$5.warn(message)
38795
+ warn: (message) => log$6.warn(message)
38796
38796
  })
38797
38797
  });
38798
38798
  const { defaultAgentId, sessionAgentId } = resolveSessionAgentIds({
@@ -38858,7 +38858,7 @@ async function runCliAgent(params) {
38858
38858
  const queueKey = backend.serialize ?? true ? backendResolved.id : `${backendResolved.id}:${params.runId}`;
38859
38859
  try {
38860
38860
  const output = await enqueueCliRun(queueKey, async () => {
38861
- log$5.info(`cli exec: provider=${params.provider} model=${normalizedModel} promptChars=${params.prompt.length}`);
38861
+ log$6.info(`cli exec: provider=${params.provider} model=${normalizedModel} promptChars=${params.prompt.length}`);
38862
38862
  const logOutputText = isTruthyEnvValue(process.env.SYMI_CLAUDE_CLI_LOG_OUTPUT);
38863
38863
  if (logOutputText) {
38864
38864
  const logArgs = [];
@@ -38891,7 +38891,7 @@ async function runCliAgent(params) {
38891
38891
  const promptIndex = logArgs.indexOf(argsPrompt);
38892
38892
  if (promptIndex >= 0) logArgs[promptIndex] = `<prompt:${argsPrompt.length} chars>`;
38893
38893
  }
38894
- log$5.info(`cli argv: ${backend.command} ${logArgs.join(" ")}`);
38894
+ log$6.info(`cli argv: ${backend.command} ${logArgs.join(" ")}`);
38895
38895
  }
38896
38896
  const env = (() => {
38897
38897
  const next = {
@@ -38929,17 +38929,17 @@ async function runCliAgent(params) {
38929
38929
  const stdout = result.stdout.trim();
38930
38930
  const stderr = result.stderr.trim();
38931
38931
  if (logOutputText) {
38932
- if (stdout) log$5.info(`cli stdout:\n${stdout}`);
38933
- if (stderr) log$5.info(`cli stderr:\n${stderr}`);
38932
+ if (stdout) log$6.info(`cli stdout:\n${stdout}`);
38933
+ if (stderr) log$6.info(`cli stderr:\n${stderr}`);
38934
38934
  }
38935
38935
  if (shouldLogVerbose()) {
38936
- if (stdout) log$5.debug(`cli stdout:\n${stdout}`);
38937
- if (stderr) log$5.debug(`cli stderr:\n${stderr}`);
38936
+ if (stdout) log$6.debug(`cli stdout:\n${stdout}`);
38937
+ if (stderr) log$6.debug(`cli stderr:\n${stderr}`);
38938
38938
  }
38939
38939
  if (result.exitCode !== 0 || result.reason !== "exit") {
38940
38940
  if (result.reason === "no-output-timeout" || result.noOutputTimedOut) {
38941
38941
  const timeoutReason = `CLI produced no output for ${Math.round(noOutputTimeoutMs / 1e3)}s and was terminated.`;
38942
- log$5.warn(`cli watchdog timeout: provider=${params.provider} model=${modelId} session=${cliSessionIdToSend ?? params.sessionId} noOutputTimeoutMs=${noOutputTimeoutMs} pid=${managedRun.pid ?? "unknown"}`);
38942
+ log$6.warn(`cli watchdog timeout: provider=${params.provider} model=${modelId} session=${cliSessionIdToSend ?? params.sessionId} noOutputTimeoutMs=${noOutputTimeoutMs} pid=${managedRun.pid ?? "unknown"}`);
38943
38943
  throw new FailoverError(timeoutReason, {
38944
38944
  reason: "timeout",
38945
38945
  provider: params.provider,
@@ -39258,7 +39258,7 @@ function resolveEmbeddedSessionLane(key) {
39258
39258
 
39259
39259
  //#endregion
39260
39260
  //#region src/agents/pi-embedded-runner/logger.ts
39261
- const log$4 = createSubsystemLogger("agent/embedded");
39261
+ const log$5 = createSubsystemLogger("agent/embedded");
39262
39262
 
39263
39263
  //#endregion
39264
39264
  //#region src/utils/safe-json.ts
@@ -39304,7 +39304,7 @@ function getQueuedFileWriter(writers, filePath) {
39304
39304
  //#endregion
39305
39305
  //#region src/agents/anthropic-payload-log.ts
39306
39306
  const writers$1 = /* @__PURE__ */ new Map();
39307
- const log$3 = createSubsystemLogger("agent/anthropic-payload");
39307
+ const log$4 = createSubsystemLogger("agent/anthropic-payload");
39308
39308
  function resolvePayloadLogConfig(env) {
39309
39309
  const enabled = parseBooleanValue$1(env.SYMI_ANTHROPIC_PAYLOAD_LOG) ?? false;
39310
39310
  const fileOverride = env.SYMI_ANTHROPIC_PAYLOAD_LOG_FILE?.trim();
@@ -39394,13 +39394,13 @@ function createAnthropicPayloadLogger(params) {
39394
39394
  usage,
39395
39395
  error: errorMessage
39396
39396
  });
39397
- log$3.info("anthropic usage", {
39397
+ log$4.info("anthropic usage", {
39398
39398
  runId: params.runId,
39399
39399
  sessionId: params.sessionId,
39400
39400
  usage
39401
39401
  });
39402
39402
  };
39403
- log$3.info("anthropic payload logger enabled", { filePath: writer.filePath });
39403
+ log$4.info("anthropic payload logger enabled", { filePath: writer.filePath });
39404
39404
  return {
39405
39405
  enabled: true,
39406
39406
  wrapStreamFn,
@@ -41492,7 +41492,7 @@ function createEmbeddedPiSessionEventHandler(ctx) {
41492
41492
  //#region src/agents/pi-embedded-subscribe.ts
41493
41493
  const THINKING_TAG_SCAN_RE = /<\s*(\/?)\s*(?:think(?:ing)?|thought|antthinking)\s*>/gi;
41494
41494
  const FINAL_TAG_SCAN_RE = /<\s*(\/?)\s*final\s*>/gi;
41495
- const log$2 = createSubsystemLogger("agent/embedded");
41495
+ const log$3 = createSubsystemLogger("agent/embedded");
41496
41496
  function subscribeEmbeddedPiSession(params) {
41497
41497
  const reasoningMode = params.reasoningMode ?? "off";
41498
41498
  const useMarkdown = (params.toolResultFormat ?? "markdown") === "markdown";
@@ -41649,7 +41649,7 @@ function subscribeEmbeddedPiSession(params) {
41649
41649
  state.compactionRetryReject = reject;
41650
41650
  });
41651
41651
  state.compactionRetryPromise.catch((err) => {
41652
- log$2.debug(`compaction promise rejected (no waiter): ${String(err)}`);
41652
+ log$3.debug(`compaction promise rejected (no waiter): ${String(err)}`);
41653
41653
  });
41654
41654
  }
41655
41655
  };
@@ -41801,7 +41801,7 @@ function subscribeEmbeddedPiSession(params) {
41801
41801
  if (!chunk) return;
41802
41802
  if (chunk === state.lastBlockReplyText) return;
41803
41803
  if (isMessagingToolDuplicateNormalized(normalizeTextForComparison(chunk), messagingToolSentTextsNormalized)) {
41804
- log$2.debug(`Skipping block reply - already sent via messaging tool: ${chunk.slice(0, 50)}...`);
41804
+ log$3.debug(`Skipping block reply - already sent via messaging tool: ${chunk.slice(0, 50)}...`);
41805
41805
  return;
41806
41806
  }
41807
41807
  if (shouldSkipAssistantText(chunk)) return;
@@ -41879,7 +41879,7 @@ function subscribeEmbeddedPiSession(params) {
41879
41879
  const ctx = {
41880
41880
  params,
41881
41881
  state,
41882
- log: log$2,
41882
+ log: log$3,
41883
41883
  blockChunking,
41884
41884
  blockChunker,
41885
41885
  hookRunner: params.hookRunner,
@@ -41912,7 +41912,7 @@ function subscribeEmbeddedPiSession(params) {
41912
41912
  if (state.unsubscribed) return;
41913
41913
  state.unsubscribed = true;
41914
41914
  if (state.compactionRetryPromise) {
41915
- log$2.debug(`unsubscribe: rejecting compaction wait runId=${params.runId}`);
41915
+ log$3.debug(`unsubscribe: rejecting compaction wait runId=${params.runId}`);
41916
41916
  const reject = state.compactionRetryReject;
41917
41917
  state.compactionRetryResolve = void 0;
41918
41918
  state.compactionRetryReject = void 0;
@@ -41922,11 +41922,11 @@ function subscribeEmbeddedPiSession(params) {
41922
41922
  reject?.(abortErr);
41923
41923
  }
41924
41924
  if (params.session.isCompacting) {
41925
- log$2.debug(`unsubscribe: aborting in-flight compaction runId=${params.runId}`);
41925
+ log$3.debug(`unsubscribe: aborting in-flight compaction runId=${params.runId}`);
41926
41926
  try {
41927
41927
  params.session.abortCompaction();
41928
41928
  } catch (err) {
41929
- log$2.warn(`unsubscribe: compaction abort failed runId=${params.runId} err=${String(err)}`);
41929
+ log$3.warn(`unsubscribe: compaction abort failed runId=${params.runId} err=${String(err)}`);
41930
41930
  }
41931
41931
  }
41932
41932
  sessionUnsubscribe();
@@ -41975,7 +41975,7 @@ function subscribeEmbeddedPiSession(params) {
41975
41975
 
41976
41976
  //#endregion
41977
41977
  //#region src/agents/pi-tools.before-tool-call.ts
41978
- const log$1 = createSubsystemLogger("agents/tools");
41978
+ const log$2 = createSubsystemLogger("agents/tools");
41979
41979
  const BEFORE_TOOL_CALL_WRAPPED = Symbol("beforeToolCallWrapped");
41980
41980
  const adjustedParamsByToolCallId = /* @__PURE__ */ new Map();
41981
41981
  const MAX_TRACKED_ADJUSTED_PARAMS = 1024;
@@ -42009,7 +42009,7 @@ async function recordLoopOutcome(args) {
42009
42009
  config: args.ctx.loopDetection
42010
42010
  });
42011
42011
  } catch (err) {
42012
- log$1.warn(`tool loop outcome tracking failed: tool=${args.toolName} error=${String(err)}`);
42012
+ log$2.warn(`tool loop outcome tracking failed: tool=${args.toolName} error=${String(err)}`);
42013
42013
  }
42014
42014
  }
42015
42015
  async function runBeforeToolCallHook(args) {
@@ -42026,7 +42026,7 @@ async function runBeforeToolCallHook(args) {
42026
42026
  const loopResult = detectToolCallLoop(sessionState, toolName, params, args.ctx.loopDetection);
42027
42027
  if (loopResult.stuck) {
42028
42028
  if (loopResult.level === "critical") {
42029
- log$1.error(`Blocking ${toolName} due to critical loop: ${loopResult.message}`);
42029
+ log$2.error(`Blocking ${toolName} due to critical loop: ${loopResult.message}`);
42030
42030
  logToolLoopAction({
42031
42031
  sessionKey: args.ctx.sessionKey,
42032
42032
  sessionId: args.ctx?.agentId,
@@ -42043,7 +42043,7 @@ async function runBeforeToolCallHook(args) {
42043
42043
  reason: loopResult.message
42044
42044
  };
42045
42045
  } else if (shouldEmitLoopWarning(sessionState, loopResult.warningKey ?? `${loopResult.detector}:${toolName}`, loopResult.count)) {
42046
- log$1.warn(`Loop warning for ${toolName}: ${loopResult.message}`);
42046
+ log$2.warn(`Loop warning for ${toolName}: ${loopResult.message}`);
42047
42047
  logToolLoopAction({
42048
42048
  sessionKey: args.ctx.sessionKey,
42049
42049
  sessionId: args.ctx?.agentId,
@@ -42093,7 +42093,7 @@ async function runBeforeToolCallHook(args) {
42093
42093
  }
42094
42094
  } catch (err) {
42095
42095
  const toolCallId = args.toolCallId ? ` toolCallId=${args.toolCallId}` : "";
42096
- log$1.warn(`before_tool_call hook failed: tool=${toolName}${toolCallId} error=${String(err)}`);
42096
+ log$2.warn(`before_tool_call hook failed: tool=${toolName}${toolCallId} error=${String(err)}`);
42097
42097
  }
42098
42098
  return {
42099
42099
  blocked: false,
@@ -42337,6 +42337,7 @@ function validateShellCommand(command) {
42337
42337
 
42338
42338
  //#endregion
42339
42339
  //#region src/agents/pi-tools.validate-wrapper.ts
42340
+ const log$1 = createSubsystemLogger("agents/tool-validate");
42340
42341
  const EXEC_TOOL_NAMES = new Set(["exec", "bash"]);
42341
42342
  const FILE_TOOL_NAMES = new Set([
42342
42343
  "write",
@@ -42395,13 +42396,22 @@ function wrapToolWithArgValidation(tool) {
42395
42396
  execute(toolCallId, params, ...rest) {
42396
42397
  if (isExecTool) {
42397
42398
  const command = params.command ?? params.cmd;
42398
- if (typeof command !== "string") return originalExecute.call(tool, toolCallId, params, ...rest);
42399
+ if (typeof command !== "string") {
42400
+ log$1.debug(`[validate] exec called without string command: keys=${Object.keys(params).join(",")}`);
42401
+ return originalExecute.call(tool, toolCallId, params, ...rest);
42402
+ }
42399
42403
  const result = validateShellCommand(command);
42400
- if (!result.valid) return Promise.resolve({ output: `Error: ${result.reason}. The command appears to contain model control tokens. Please provide a clean shell command without any <|, |>, or XML-like tags. Only valid shell syntax is accepted.` });
42401
- if (result.cleaned !== command) return originalExecute.call(tool, toolCallId, {
42402
- ...params,
42403
- command: result.cleaned
42404
- }, ...rest);
42404
+ if (!result.valid) {
42405
+ log$1.warn(`[validate] exec command rejected: reason=${result.reason} raw=${command.slice(0, 100)}`);
42406
+ return Promise.resolve({ output: `Error: ${result.reason}. The command appears to contain model control tokens. Please provide a clean shell command without any <|, |>, or XML-like tags. Only valid shell syntax is accepted.` });
42407
+ }
42408
+ if (result.cleaned !== command) {
42409
+ log$1.debug(`[validate] exec command cleaned: raw=${command.slice(0, 80)} → cleaned=${result.cleaned.slice(0, 80)}`);
42410
+ return originalExecute.call(tool, toolCallId, {
42411
+ ...params,
42412
+ command: result.cleaned
42413
+ }, ...rest);
42414
+ }
42405
42415
  return originalExecute.call(tool, toolCallId, params, ...rest);
42406
42416
  }
42407
42417
  const pathKey = FILE_PATH_KEYS.find((k) => typeof params[k] === "string");
@@ -42772,7 +42782,7 @@ async function truncateOversizedToolResultsInSession(params) {
42772
42782
  const textLength = getToolResultTextLength(msg);
42773
42783
  if (textLength > maxChars) {
42774
42784
  oversizedIndices.push(i);
42775
- log$4.info(`[tool-result-truncation] Found oversized tool result: entry=${entry.id} chars=${textLength} maxChars=${maxChars} sessionKey=${params.sessionKey ?? params.sessionId ?? "unknown"}`);
42785
+ log$5.info(`[tool-result-truncation] Found oversized tool result: entry=${entry.id} chars=${textLength} maxChars=${maxChars} sessionKey=${params.sessionKey ?? params.sessionId ?? "unknown"}`);
42776
42786
  }
42777
42787
  }
42778
42788
  if (oversizedIndices.length === 0) return {
@@ -42794,7 +42804,7 @@ async function truncateOversizedToolResultsInSession(params) {
42794
42804
  message = truncateToolResultMessage(message, maxChars);
42795
42805
  truncatedCount++;
42796
42806
  const newLength = getToolResultTextLength(message);
42797
- log$4.info(`[tool-result-truncation] Truncated tool result: originalEntry=${entry.id} newChars=${newLength} sessionKey=${params.sessionKey ?? params.sessionId ?? "unknown"}`);
42807
+ log$5.info(`[tool-result-truncation] Truncated tool result: originalEntry=${entry.id} newChars=${newLength} sessionKey=${params.sessionKey ?? params.sessionId ?? "unknown"}`);
42798
42808
  }
42799
42809
  sessionManager.appendMessage(message);
42800
42810
  } else if (entry.type === "compaction") sessionManager.appendCompaction(entry.summary, entry.firstKeptEntryId, entry.tokensBefore, entry.details, entry.fromHook);
@@ -42808,14 +42818,14 @@ async function truncateOversizedToolResultsInSession(params) {
42808
42818
  if (entry.name) sessionManager.appendSessionInfo(entry.name);
42809
42819
  }
42810
42820
  }
42811
- log$4.info(`[tool-result-truncation] Truncated ${truncatedCount} tool result(s) in session (contextWindow=${contextWindowTokens} maxChars=${maxChars}) sessionKey=${params.sessionKey ?? params.sessionId ?? "unknown"}`);
42821
+ log$5.info(`[tool-result-truncation] Truncated ${truncatedCount} tool result(s) in session (contextWindow=${contextWindowTokens} maxChars=${maxChars}) sessionKey=${params.sessionKey ?? params.sessionId ?? "unknown"}`);
42812
42822
  return {
42813
42823
  truncated: true,
42814
42824
  truncatedCount
42815
42825
  };
42816
42826
  } catch (err) {
42817
42827
  const errMsg = err instanceof Error ? err.message : String(err);
42818
- log$4.warn(`[tool-result-truncation] Failed to truncate: ${errMsg}`);
42828
+ log$5.warn(`[tool-result-truncation] Failed to truncate: ${errMsg}`);
42819
42829
  return {
42820
42830
  truncated: false,
42821
42831
  truncatedCount: 0,
@@ -44473,7 +44483,7 @@ function resolveAnthropicBetas(extraParams, provider, modelId) {
44473
44483
  for (const beta of configured) if (typeof beta === "string" && beta.trim()) betas.add(beta.trim());
44474
44484
  }
44475
44485
  if (extraParams?.context1m === true) if (isAnthropic1MModel(modelId)) betas.add(ANTHROPIC_CONTEXT_1M_BETA);
44476
- else log$4.warn(`ignoring context1m for non-opus/sonnet model: ${provider}/${modelId}`);
44486
+ else log$5.warn(`ignoring context1m for non-opus/sonnet model: ${provider}/${modelId}`);
44477
44487
  return betas.size > 0 ? [...betas] : void 0;
44478
44488
  }
44479
44489
  function mergeAnthropicBetaHeader(headers, betas) {
@@ -45084,14 +45094,14 @@ function logToolSchemasForGoogle(params) {
45084
45094
  if (params.provider !== "google-antigravity" && params.provider !== "google-gemini-cli") return;
45085
45095
  const toolNames = params.tools.map((tool, index) => `${index}:${tool.name}`);
45086
45096
  const tools = sanitizeToolsForGoogle(params);
45087
- log$4.info("google tool schema snapshot", {
45097
+ log$5.info("google tool schema snapshot", {
45088
45098
  provider: params.provider,
45089
45099
  toolCount: tools.length,
45090
45100
  tools: toolNames
45091
45101
  });
45092
45102
  for (const [index, tool] of tools.entries()) {
45093
45103
  const violations = findUnsupportedSchemaKeywords(tool.parameters, `${tool.name}.parameters`);
45094
- if (violations.length > 0) log$4.warn("google tool schema has unsupported keywords", {
45104
+ if (violations.length > 0) log$5.warn("google tool schema has unsupported keywords", {
45095
45105
  index,
45096
45106
  tool: tool.name,
45097
45107
  violations: violations.slice(0, 12),
@@ -45103,7 +45113,7 @@ const compactionFailureEmitter = new EventEmitter();
45103
45113
  registerUnhandledRejectionHandler((reason) => {
45104
45114
  const message = describeUnknownError(reason);
45105
45115
  if (!isCompactionFailureError(message)) return false;
45106
- log$4.error(`Auto-compaction failed (unhandled): ${message}`);
45116
+ log$5.error(`Auto-compaction failed (unhandled): ${message}`);
45107
45117
  compactionFailureEmitter.emit("failure", message);
45108
45118
  return true;
45109
45119
  });
@@ -45155,7 +45165,7 @@ function applyGoogleTurnOrderingFix(params) {
45155
45165
  const sanitized = sanitizeGoogleTurnOrdering(params.messages);
45156
45166
  const didPrepend = sanitized !== params.messages;
45157
45167
  if (didPrepend && !hasGoogleTurnOrderingMarker(params.sessionManager)) {
45158
- (params.warn ?? ((message) => log$4.warn(message)))(`google turn ordering fixup: prepended user bootstrap (sessionId=${params.sessionId})`);
45168
+ (params.warn ?? ((message) => log$5.warn(message)))(`google turn ordering fixup: prepended user bootstrap (sessionId=${params.sessionId})`);
45159
45169
  markGoogleTurnOrderingMarker(params.sessionManager);
45160
45170
  }
45161
45171
  return {
@@ -45763,7 +45773,7 @@ function isImageExtension(filePath) {
45763
45773
  }
45764
45774
  async function sanitizeImagesWithLog(images, label, imageSanitization) {
45765
45775
  const { images: sanitized, dropped } = await sanitizeImageBlocks(images, label, imageSanitization);
45766
- if (dropped > 0) log$4.warn(`Native image: dropped ${dropped} image(s) after sanitization (${label}).`);
45776
+ if (dropped > 0) log$5.warn(`Native image: dropped ${dropped} image(s) after sanitization (${label}).`);
45767
45777
  return sanitized;
45768
45778
  }
45769
45779
  /**
@@ -45838,7 +45848,7 @@ async function loadImageFromRef(ref, workspaceDir, options) {
45838
45848
  try {
45839
45849
  let targetPath = ref.resolved;
45840
45850
  if (ref.type === "url") {
45841
- log$4.debug(`Native image: rejecting remote URL (local-only): ${ref.resolved}`);
45851
+ log$5.debug(`Native image: rejecting remote URL (local-only): ${ref.resolved}`);
45842
45852
  return null;
45843
45853
  }
45844
45854
  if (ref.type === "path") {
@@ -45848,7 +45858,7 @@ async function loadImageFromRef(ref, workspaceDir, options) {
45848
45858
  cwd: options.sandbox.root
45849
45859
  }).hostPath;
45850
45860
  } catch (err) {
45851
- log$4.debug(`Native image: sandbox validation failed for ${ref.resolved}: ${err instanceof Error ? err.message : String(err)}`);
45861
+ log$5.debug(`Native image: sandbox validation failed for ${ref.resolved}: ${err instanceof Error ? err.message : String(err)}`);
45852
45862
  return null;
45853
45863
  }
45854
45864
  else if (!path.isAbsolute(targetPath)) targetPath = path.resolve(workspaceDir, targetPath);
@@ -45862,7 +45872,7 @@ async function loadImageFromRef(ref, workspaceDir, options) {
45862
45872
  })
45863
45873
  }) : await loadWebMedia(targetPath, options?.maxBytes);
45864
45874
  if (media.kind !== "image") {
45865
- log$4.debug(`Native image: not an image file: ${targetPath} (got ${media.kind})`);
45875
+ log$5.debug(`Native image: not an image file: ${targetPath} (got ${media.kind})`);
45866
45876
  return null;
45867
45877
  }
45868
45878
  const mimeType = media.contentType ?? "image/jpeg";
@@ -45872,7 +45882,7 @@ async function loadImageFromRef(ref, workspaceDir, options) {
45872
45882
  mimeType
45873
45883
  };
45874
45884
  } catch (err) {
45875
- log$4.debug(`Native image: failed to load ${ref.resolved}: ${err instanceof Error ? err.message : String(err)}`);
45885
+ log$5.debug(`Native image: failed to load ${ref.resolved}: ${err instanceof Error ? err.message : String(err)}`);
45876
45886
  return null;
45877
45887
  }
45878
45888
  }
@@ -45971,7 +45981,7 @@ async function detectAndLoadPromptImages(params) {
45971
45981
  loadedCount: 0,
45972
45982
  skippedCount: 0
45973
45983
  };
45974
- log$4.debug(`Native image: detected ${allRefs.length} image refs (${promptRefs.length} in prompt, ${uniqueHistoryRefs.length} in history)`);
45984
+ log$5.debug(`Native image: detected ${allRefs.length} image refs (${promptRefs.length} in prompt, ${uniqueHistoryRefs.length} in history)`);
45975
45985
  const promptImages = [...params.existingImages ?? []];
45976
45986
  const historyImagesByIndex = /* @__PURE__ */ new Map();
45977
45987
  let loadedCount = 0;
@@ -45988,7 +45998,7 @@ async function detectAndLoadPromptImages(params) {
45988
45998
  else historyImagesByIndex.set(ref.messageIndex, [image]);
45989
45999
  } else promptImages.push(image);
45990
46000
  loadedCount++;
45991
- log$4.debug(`Native image: loaded ${ref.type} ${ref.resolved}`);
46001
+ log$5.debug(`Native image: loaded ${ref.type} ${ref.resolved}`);
45992
46002
  } else skippedCount++;
45993
46003
  }
45994
46004
  const imageSanitization = { maxDimensionPx: params.maxDimensionPx };
@@ -46084,7 +46094,7 @@ async function runEmbeddedAttempt(params) {
46084
46094
  const resolvedWorkspace = resolveUserPath(params.workspaceDir);
46085
46095
  const prevCwd = process.cwd();
46086
46096
  const runAbortController = new AbortController();
46087
- log$4.debug(`embedded run start: runId=${params.runId} sessionId=${params.sessionId} provider=${params.provider} model=${params.modelId} thinking=${params.thinkLevel} messageChannel=${params.messageChannel ?? params.messageProvider ?? "unknown"}`);
46097
+ log$5.debug(`embedded run start: runId=${params.runId} sessionId=${params.sessionId} provider=${params.provider} model=${params.modelId} thinking=${params.thinkLevel} messageChannel=${params.messageChannel ?? params.messageProvider ?? "unknown"}`);
46088
46098
  await fs$1.mkdir(resolvedWorkspace, { recursive: true });
46089
46099
  const sandboxSessionKey = params.sessionKey?.trim() || params.sessionId;
46090
46100
  const sandbox = await resolveSandboxContext({
@@ -46120,7 +46130,7 @@ async function runEmbeddedAttempt(params) {
46120
46130
  sessionId: params.sessionId,
46121
46131
  warn: makeBootstrapWarn({
46122
46132
  sessionLabel,
46123
- warn: (message) => log$4.warn(message)
46133
+ warn: (message) => log$5.warn(message)
46124
46134
  })
46125
46135
  });
46126
46136
  const workspaceNotes = hookAdjustedBootstrapFiles.some((file) => file.name === DEFAULT_BOOTSTRAP_FILENAME && !file.missing) ? ["Reminder: commit your changes in this workspace after edits."] : void 0;
@@ -46319,7 +46329,7 @@ async function runEmbeddedAttempt(params) {
46319
46329
  try {
46320
46330
  await repairSessionFileIfNeeded({
46321
46331
  sessionFile: params.sessionFile,
46322
- warn: (message) => log$4.warn(message)
46332
+ warn: (message) => log$5.warn(message)
46323
46333
  });
46324
46334
  const hadSessionFile = await fs$1.stat(params.sessionFile).then(() => true).catch(() => false);
46325
46335
  const transcriptPolicy = resolveTranscriptPolicy({
@@ -46328,7 +46338,7 @@ async function runEmbeddedAttempt(params) {
46328
46338
  modelId: params.modelId
46329
46339
  });
46330
46340
  const versionCheck = await handleSessionVersion(params.sessionFile);
46331
- if (versionCheck.archived) log$4.warn(`session archived: created by ${versionCheck.poisonVersion}, known corruption range → ${versionCheck.archivePath}`);
46341
+ if (versionCheck.archived) log$5.warn(`session archived: created by ${versionCheck.poisonVersion}, known corruption range → ${versionCheck.archivePath}`);
46332
46342
  await prewarmSessionFile(params.sessionFile);
46333
46343
  sessionManager = guardSessionManager(SessionManager.open(params.sessionFile), {
46334
46344
  agentId: sessionAgentId,
@@ -46583,7 +46593,6 @@ async function runEmbeddedAttempt(params) {
46583
46593
  const TOOL_ERROR_ABORT_THRESHOLD = 5;
46584
46594
  const TOOL_ERROR_WARN_THRESHOLD = 3;
46585
46595
  let consecutiveToolErrors = 0;
46586
- let lastErrorToolName = "";
46587
46596
  const subscription = subscribeEmbeddedPiSession({
46588
46597
  session: activeSession,
46589
46598
  runId: params.runId,
@@ -46607,26 +46616,23 @@ async function runEmbeddedAttempt(params) {
46607
46616
  params.onAgentEvent?.(evt);
46608
46617
  if (evt.stream === "tool" && !aborted) {
46609
46618
  const phase = typeof evt.data?.phase === "string" ? evt.data.phase : "";
46610
- const toolName = typeof evt.data?.name === "string" ? evt.data.name : "";
46611
46619
  const isError = evt.data?.isError === true;
46612
- if (phase === "result" && toolName) {
46613
- if (isError && toolName === lastErrorToolName) consecutiveToolErrors++;
46614
- else if (isError) {
46615
- consecutiveToolErrors = 1;
46616
- lastErrorToolName = toolName;
46617
- } else {
46618
- consecutiveToolErrors = 0;
46619
- lastErrorToolName = "";
46620
- }
46620
+ if (phase === "result") {
46621
+ if (isError) consecutiveToolErrors++;
46622
+ else consecutiveToolErrors = 0;
46621
46623
  if (consecutiveToolErrors >= TOOL_ERROR_ABORT_THRESHOLD) {
46622
- log$4.error(`Agent-loop circuit breaker: ${toolName} failed ${consecutiveToolErrors} consecutive times. Aborting run ${params.runId}.`);
46623
- abortRun(false, /* @__PURE__ */ new Error(`Tool ${toolName} failed ${consecutiveToolErrors} consecutive times. The model may be generating corrupted tool arguments. Run aborted to prevent infinite loop.`));
46624
- } else if (consecutiveToolErrors === TOOL_ERROR_WARN_THRESHOLD) log$4.warn(`Agent-loop tool error warning: ${toolName} failed ${consecutiveToolErrors} times consecutively. runId=${params.runId}`);
46624
+ const toolName = typeof evt.data?.name === "string" ? evt.data.name : "unknown";
46625
+ log$5.error(`Agent-loop circuit breaker: ${consecutiveToolErrors} consecutive tool errors (last: ${toolName}). Aborting run ${params.runId}.`);
46626
+ abortRun(false, /* @__PURE__ */ new Error(`${consecutiveToolErrors} consecutive tool errors. The model may be generating corrupted tool arguments. Run aborted to prevent infinite loop.`));
46627
+ } else if (consecutiveToolErrors === TOOL_ERROR_WARN_THRESHOLD) {
46628
+ const toolName = typeof evt.data?.name === "string" ? evt.data.name : "unknown";
46629
+ log$5.warn(`Agent-loop tool error warning: ${consecutiveToolErrors} consecutive failures (last: ${toolName}). runId=${params.runId}`);
46630
+ }
46625
46631
  }
46626
46632
  }
46627
46633
  if (evt.stream === "assistant" && typeof evt.data?.text === "string" && !aborted) {
46628
46634
  streamMonitor.onChunk(evt.data.text);
46629
- if (streamMonitor.shouldStop()) log$4.debug(`stream monitor detection (log-only, no abort): runId=${params.runId} reason=${streamMonitor.getStopReason()}`);
46635
+ if (streamMonitor.shouldStop()) log$5.debug(`stream monitor detection (log-only, no abort): runId=${params.runId} reason=${streamMonitor.getStopReason()}`);
46630
46636
  }
46631
46637
  },
46632
46638
  enforceFinalTag: params.enforceFinalTag,
@@ -46646,7 +46652,7 @@ async function runEmbeddedAttempt(params) {
46646
46652
  let abortWarnTimer;
46647
46653
  const isProbeSession = params.sessionId?.startsWith("probe-") ?? false;
46648
46654
  const abortTimer = setTimeout(() => {
46649
- if (!isProbeSession) log$4.warn(`embedded run timeout: runId=${params.runId} sessionId=${params.sessionId} timeoutMs=${params.timeoutMs}`);
46655
+ if (!isProbeSession) log$5.warn(`embedded run timeout: runId=${params.runId} sessionId=${params.sessionId} timeoutMs=${params.timeoutMs}`);
46650
46656
  if (shouldFlagCompactionTimeout({
46651
46657
  isTimeout: true,
46652
46658
  isCompactionPendingOrRetrying: subscription.isCompacting(),
@@ -46655,7 +46661,7 @@ async function runEmbeddedAttempt(params) {
46655
46661
  abortRun(true);
46656
46662
  if (!abortWarnTimer) abortWarnTimer = setTimeout(() => {
46657
46663
  if (!activeSession.isStreaming) return;
46658
- if (!isProbeSession) log$4.warn(`embedded run abort still streaming: runId=${params.runId} sessionId=${params.sessionId}`);
46664
+ if (!isProbeSession) log$5.warn(`embedded run abort still streaming: runId=${params.runId} sessionId=${params.sessionId}`);
46659
46665
  }, 1e4);
46660
46666
  }, Math.max(1, params.timeoutMs));
46661
46667
  armSymipulseTimer = () => {
@@ -46663,7 +46669,7 @@ async function runEmbeddedAttempt(params) {
46663
46669
  clearSymipulseTimer();
46664
46670
  symipulseTimer = setTimeout(() => {
46665
46671
  if (aborted) return;
46666
- if (!isProbeSession) log$4.warn(`symipulse timeout: runId=${params.runId} sessionId=${params.sessionId} symipulseMs=${symipulseMs} (no activity)`);
46672
+ if (!isProbeSession) log$5.warn(`symipulse timeout: runId=${params.runId} sessionId=${params.sessionId} symipulseMs=${symipulseMs} (no activity)`);
46667
46673
  if (shouldFlagCompactionTimeout({
46668
46674
  isTimeout: true,
46669
46675
  isCompactionPendingOrRetrying: subscription.isCompacting(),
@@ -46707,13 +46713,13 @@ async function runEmbeddedAttempt(params) {
46707
46713
  prompt: params.prompt,
46708
46714
  messages: activeSession.messages
46709
46715
  }, hookCtx).catch((hookErr) => {
46710
- log$4.warn(`before_prompt_build hook failed: ${String(hookErr)}`);
46716
+ log$5.warn(`before_prompt_build hook failed: ${String(hookErr)}`);
46711
46717
  }) : void 0;
46712
46718
  const legacyResult = hookRunner?.hasHooks("before_agent_start") ? await hookRunner.runBeforeAgentStart({
46713
46719
  prompt: params.prompt,
46714
46720
  messages: activeSession.messages
46715
46721
  }, hookCtx).catch((hookErr) => {
46716
- log$4.warn(`before_agent_start hook (legacy prompt build path) failed: ${String(hookErr)}`);
46722
+ log$5.warn(`before_agent_start hook (legacy prompt build path) failed: ${String(hookErr)}`);
46717
46723
  }) : void 0;
46718
46724
  const hookResult = {
46719
46725
  systemPrompt: promptBuildResult?.systemPrompt ?? legacyResult?.systemPrompt,
@@ -46721,7 +46727,7 @@ async function runEmbeddedAttempt(params) {
46721
46727
  };
46722
46728
  if (hookResult?.prependContext) {
46723
46729
  effectivePrompt = `${hookResult.prependContext}\n\n${params.prompt}`;
46724
- log$4.debug(`hooks: prepended context to prompt (${hookResult.prependContext.length} chars)`);
46730
+ log$5.debug(`hooks: prepended context to prompt (${hookResult.prependContext.length} chars)`);
46725
46731
  }
46726
46732
  {
46727
46733
  const autoRecallAgentId = normalizeAgentId(params.sessionKey);
@@ -46738,11 +46744,11 @@ async function runEmbeddedAttempt(params) {
46738
46744
  if (recallResults.length > 0) {
46739
46745
  const recallBlock = `<memory_context>\nThe following memory snippets were automatically retrieved as relevant context:\n\n${recallResults.map((r) => `[${r.path}#L${r.startLine}-L${r.endLine}]\n${r.snippet}`).join("\n---\n")}\n</memory_context>`;
46740
46746
  effectivePrompt = `${recallBlock}\n\n${effectivePrompt}`;
46741
- log$4.debug(`auto-recall: injected ${recallResults.length} snippets (${recallBlock.length} chars)`);
46747
+ log$5.debug(`auto-recall: injected ${recallResults.length} snippets (${recallBlock.length} chars)`);
46742
46748
  }
46743
46749
  }
46744
46750
  } catch (recallErr) {
46745
- log$4.debug(`auto-recall: skipped (${String(recallErr)})`);
46751
+ log$5.debug(`auto-recall: skipped (${String(recallErr)})`);
46746
46752
  }
46747
46753
  }
46748
46754
  {
@@ -46754,10 +46760,10 @@ async function runEmbeddedAttempt(params) {
46754
46760
  if (planResult.enter) {
46755
46761
  if (planResult.stripped != null) effectivePrompt = planResult.stripped;
46756
46762
  effectivePrompt = `${PLAN_MODE_SYSTEM_PROMPT}\n\n${effectivePrompt}`;
46757
- log$4.info(`plan-mode: activated (${planResult.reason}) for runId=${params.runId}`);
46763
+ log$5.info(`plan-mode: activated (${planResult.reason}) for runId=${params.runId}`);
46758
46764
  } else if (planResult.stripped != null) effectivePrompt = planResult.stripped;
46759
46765
  }
46760
- log$4.debug(`embedded run prompt start: runId=${params.runId} sessionId=${params.sessionId}`);
46766
+ log$5.debug(`embedded run prompt start: runId=${params.runId} sessionId=${params.sessionId}`);
46761
46767
  cacheTrace?.recordStage("prompt:before", {
46762
46768
  prompt: effectivePrompt,
46763
46769
  messages: activeSession.messages
@@ -46769,7 +46775,7 @@ async function runEmbeddedAttempt(params) {
46769
46775
  const sessionContext = sessionManager.buildSessionContext();
46770
46776
  const sanitizedOrphan = transcriptPolicy.sanitizeThinkingSignatures ? sanitizeAntigravityThinkingBlocks(sessionContext.messages) : sessionContext.messages;
46771
46777
  activeSession.agent.replaceMessages(sanitizedOrphan);
46772
- log$4.warn(`Removed orphaned user message to prevent consecutive user turns. runId=${params.runId} sessionId=${params.sessionId}`);
46778
+ log$5.warn(`Removed orphaned user message to prevent consecutive user turns. runId=${params.runId} sessionId=${params.sessionId}`);
46773
46779
  }
46774
46780
  try {
46775
46781
  const imageResult = await detectAndLoadPromptImages({
@@ -46791,12 +46797,12 @@ async function runEmbeddedAttempt(params) {
46791
46797
  messages: activeSession.messages,
46792
46798
  note: `images: prompt=${imageResult.images.length} history=${imageResult.historyImagesByIndex.size}`
46793
46799
  });
46794
- if (log$4.isEnabled("debug")) {
46800
+ if (log$5.isEnabled("debug")) {
46795
46801
  const msgCount = activeSession.messages.length;
46796
46802
  const systemLen = systemPromptText?.length ?? 0;
46797
46803
  const promptLen = effectivePrompt.length;
46798
46804
  const sessionSummary = summarizeSessionContext(activeSession.messages);
46799
- log$4.debug(`[context-diag] pre-prompt: sessionKey=${params.sessionKey ?? params.sessionId} messages=${msgCount} roleCounts=${sessionSummary.roleCounts} historyTextChars=${sessionSummary.totalTextChars} maxMessageTextChars=${sessionSummary.maxMessageTextChars} historyImageBlocks=${sessionSummary.totalImageBlocks} systemPromptChars=${systemLen} promptChars=${promptLen} promptImages=${imageResult.images.length} historyImageMessages=${imageResult.historyImagesByIndex.size} provider=${params.provider}/${params.modelId} sessionFile=${params.sessionFile}`);
46805
+ log$5.debug(`[context-diag] pre-prompt: sessionKey=${params.sessionKey ?? params.sessionId} messages=${msgCount} roleCounts=${sessionSummary.roleCounts} historyTextChars=${sessionSummary.totalTextChars} maxMessageTextChars=${sessionSummary.maxMessageTextChars} historyImageBlocks=${sessionSummary.totalImageBlocks} systemPromptChars=${systemLen} promptChars=${promptLen} promptImages=${imageResult.images.length} historyImageMessages=${imageResult.historyImagesByIndex.size} provider=${params.provider}/${params.modelId} sessionFile=${params.sessionFile}`);
46800
46806
  }
46801
46807
  if (hookRunner?.hasHooks("llm_input")) hookRunner.runLlmInput({
46802
46808
  runId: params.runId,
@@ -46814,7 +46820,7 @@ async function runEmbeddedAttempt(params) {
46814
46820
  workspaceDir: params.workspaceDir,
46815
46821
  messageProvider: params.messageProvider ?? void 0
46816
46822
  }).catch((err) => {
46817
- log$4.warn(`llm_input hook failed: ${String(err)}`);
46823
+ log$5.warn(`llm_input hook failed: ${String(err)}`);
46818
46824
  });
46819
46825
  if (imageResult.images.length > 0) await abortable(activeSession.prompt(effectivePrompt, { images: imageResult.images }));
46820
46826
  else await abortable(activeSession.prompt(effectivePrompt));
@@ -46822,7 +46828,7 @@ async function runEmbeddedAttempt(params) {
46822
46828
  promptError = err;
46823
46829
  promptErrorSource = "prompt";
46824
46830
  } finally {
46825
- log$4.debug(`embedded run prompt end: runId=${params.runId} sessionId=${params.sessionId} durationMs=${Date.now() - promptStartedAt}`);
46831
+ log$5.debug(`embedded run prompt end: runId=${params.runId} sessionId=${params.sessionId} durationMs=${Date.now() - promptStartedAt}`);
46826
46832
  }
46827
46833
  const wasCompactingBefore = activeSession.isCompacting;
46828
46834
  const snapshot = activeSession.messages.slice();
@@ -46837,7 +46843,7 @@ async function runEmbeddedAttempt(params) {
46837
46843
  promptError = err;
46838
46844
  promptErrorSource = "compaction";
46839
46845
  }
46840
- if (!isProbeSession) log$4.debug(`compaction wait aborted: runId=${params.runId} sessionId=${params.sessionId}`);
46846
+ if (!isProbeSession) log$5.debug(`compaction wait aborted: runId=${params.runId} sessionId=${params.sessionId}`);
46841
46847
  } else throw err;
46842
46848
  }
46843
46849
  if (!timedOutDuringCompaction) {
@@ -46855,7 +46861,7 @@ async function runEmbeddedAttempt(params) {
46855
46861
  currentSessionId: activeSession.sessionId
46856
46862
  });
46857
46863
  if (timedOutDuringCompaction) {
46858
- if (!isProbeSession) log$4.warn(`using ${snapshotSelection.source} snapshot: timed out during compaction runId=${params.runId} sessionId=${params.sessionId}`);
46864
+ if (!isProbeSession) log$5.warn(`using ${snapshotSelection.source} snapshot: timed out during compaction runId=${params.runId} sessionId=${params.sessionId}`);
46859
46865
  }
46860
46866
  messagesSnapshot = snapshotSelection.messagesSnapshot;
46861
46867
  sessionIdUsed = snapshotSelection.sessionIdUsed;
@@ -46870,7 +46876,7 @@ async function runEmbeddedAttempt(params) {
46870
46876
  error: describeUnknownError(promptError)
46871
46877
  });
46872
46878
  } catch (entryErr) {
46873
- log$4.warn(`failed to persist prompt error entry: ${String(entryErr)}`);
46879
+ log$5.warn(`failed to persist prompt error entry: ${String(entryErr)}`);
46874
46880
  }
46875
46881
  cacheTrace?.recordStage("session:after", {
46876
46882
  messages: messagesSnapshot,
@@ -46889,17 +46895,17 @@ async function runEmbeddedAttempt(params) {
46889
46895
  workspaceDir: params.workspaceDir,
46890
46896
  messageProvider: params.messageProvider ?? void 0
46891
46897
  }).catch((err) => {
46892
- log$4.warn(`agent_end hook failed: ${err}`);
46898
+ log$5.warn(`agent_end hook failed: ${err}`);
46893
46899
  });
46894
46900
  } finally {
46895
46901
  clearTimeout(abortTimer);
46896
46902
  clearSymipulseTimer();
46897
46903
  if (abortWarnTimer) clearTimeout(abortWarnTimer);
46898
- if (!isProbeSession && (aborted || timedOut) && !timedOutDuringCompaction) log$4.debug(`run cleanup: runId=${params.runId} sessionId=${params.sessionId} aborted=${aborted} timedOut=${timedOut}`);
46904
+ if (!isProbeSession && (aborted || timedOut) && !timedOutDuringCompaction) log$5.debug(`run cleanup: runId=${params.runId} sessionId=${params.sessionId} aborted=${aborted} timedOut=${timedOut}`);
46899
46905
  try {
46900
46906
  unsubscribe();
46901
46907
  } catch (err) {
46902
- log$4.error(`CRITICAL: unsubscribe failed, possible resource leak: runId=${params.runId} ${String(err)}`);
46908
+ log$5.error(`CRITICAL: unsubscribe failed, possible resource leak: runId=${params.runId} ${String(err)}`);
46903
46909
  }
46904
46910
  clearActiveEmbeddedRun(params.sessionId, queueHandle, params.sessionKey);
46905
46911
  params.abortSignal?.removeEventListener?.("abort", onAbort);
@@ -46924,7 +46930,7 @@ async function runEmbeddedAttempt(params) {
46924
46930
  workspaceDir: params.workspaceDir,
46925
46931
  messageProvider: params.messageProvider ?? void 0
46926
46932
  }).catch((err) => {
46927
- log$4.warn(`llm_output hook failed: ${String(err)}`);
46933
+ log$5.warn(`llm_output hook failed: ${String(err)}`);
46928
46934
  });
46929
46935
  return {
46930
46936
  aborted,
@@ -47185,7 +47191,7 @@ async function runEmbeddedPiAgent(params) {
47185
47191
  const redactedSessionId = redactRunIdentifier(params.sessionId);
47186
47192
  const redactedSessionKey = redactRunIdentifier(params.sessionKey);
47187
47193
  const redactedWorkspace = redactRunIdentifier(resolvedWorkspace);
47188
- if (workspaceResolution.usedFallback) log$4.warn(`[workspace-fallback] caller=runEmbeddedPiAgent reason=${workspaceResolution.fallbackReason} run=${params.runId} session=${redactedSessionId} sessionKey=${redactedSessionKey} agent=${workspaceResolution.agentId} workspace=${redactedWorkspace}`);
47194
+ if (workspaceResolution.usedFallback) log$5.warn(`[workspace-fallback] caller=runEmbeddedPiAgent reason=${workspaceResolution.fallbackReason} run=${params.runId} session=${redactedSessionId} sessionKey=${redactedSessionKey} agent=${workspaceResolution.agentId} workspace=${redactedWorkspace}`);
47189
47195
  const prevCwd = process.cwd();
47190
47196
  let provider = (params.provider ?? DEFAULT_PROVIDER).trim() || DEFAULT_PROVIDER;
47191
47197
  let modelId = (params.model ?? DEFAULT_MODEL).trim() || DEFAULT_MODEL;
@@ -47204,7 +47210,7 @@ async function runEmbeddedPiAgent(params) {
47204
47210
  if (hookRunner?.hasHooks("before_model_resolve")) try {
47205
47211
  modelResolveOverride = await hookRunner.runBeforeModelResolve({ prompt: params.prompt }, hookCtx);
47206
47212
  } catch (hookErr) {
47207
- log$4.warn(`before_model_resolve hook failed: ${String(hookErr)}`);
47213
+ log$5.warn(`before_model_resolve hook failed: ${String(hookErr)}`);
47208
47214
  }
47209
47215
  if (hookRunner?.hasHooks("before_agent_start")) try {
47210
47216
  const legacyResult = await hookRunner.runBeforeAgentStart({ prompt: params.prompt }, hookCtx);
@@ -47213,15 +47219,15 @@ async function runEmbeddedPiAgent(params) {
47213
47219
  modelOverride: modelResolveOverride?.modelOverride ?? legacyResult?.modelOverride
47214
47220
  };
47215
47221
  } catch (hookErr) {
47216
- log$4.warn(`before_agent_start hook (legacy model resolve path) failed: ${String(hookErr)}`);
47222
+ log$5.warn(`before_agent_start hook (legacy model resolve path) failed: ${String(hookErr)}`);
47217
47223
  }
47218
47224
  if (modelResolveOverride?.providerOverride) {
47219
47225
  provider = modelResolveOverride.providerOverride;
47220
- log$4.info(`[hooks] provider overridden to ${provider}`);
47226
+ log$5.info(`[hooks] provider overridden to ${provider}`);
47221
47227
  }
47222
47228
  if (modelResolveOverride?.modelOverride) {
47223
47229
  modelId = modelResolveOverride.modelOverride;
47224
- log$4.info(`[hooks] model overridden to ${modelId}`);
47230
+ log$5.info(`[hooks] model overridden to ${modelId}`);
47225
47231
  }
47226
47232
  const { model, error, authStorage, modelRegistry } = resolveModel(provider, modelId, agentDir, params.config);
47227
47233
  if (!model) throw new FailoverError(error ?? `Unknown model: ${provider}/${modelId}`, {
@@ -47241,9 +47247,9 @@ async function runEmbeddedPiAgent(params) {
47241
47247
  warnBelowTokens: CONTEXT_WINDOW_WARN_BELOW_TOKENS,
47242
47248
  hardMinTokens: CONTEXT_WINDOW_HARD_MIN_TOKENS
47243
47249
  });
47244
- if (ctxGuard.shouldWarn) log$4.warn(`low context window: ${provider}/${modelId} ctx=${ctxGuard.tokens} (warn<${CONTEXT_WINDOW_WARN_BELOW_TOKENS}) source=${ctxGuard.source}`);
47250
+ if (ctxGuard.shouldWarn) log$5.warn(`low context window: ${provider}/${modelId} ctx=${ctxGuard.tokens} (warn<${CONTEXT_WINDOW_WARN_BELOW_TOKENS}) source=${ctxGuard.source}`);
47245
47251
  if (ctxGuard.shouldBlock) {
47246
- log$4.error(`blocked model (context window too small): ${provider}/${modelId} ctx=${ctxGuard.tokens} (min=${CONTEXT_WINDOW_HARD_MIN_TOKENS}) source=${ctxGuard.source}`);
47252
+ log$5.error(`blocked model (context window too small): ${provider}/${modelId} ctx=${ctxGuard.tokens} (min=${CONTEXT_WINDOW_HARD_MIN_TOKENS}) source=${ctxGuard.source}`);
47247
47253
  throw new FailoverError(`Model context window too small (${ctxGuard.tokens} tokens). Minimum is ${CONTEXT_WINDOW_HARD_MIN_TOKENS}.`, {
47248
47254
  reason: "unknown",
47249
47255
  provider,
@@ -47373,7 +47379,7 @@ async function runEmbeddedPiAgent(params) {
47373
47379
  while (true) {
47374
47380
  if (runLoopIterations >= MAX_RUN_LOOP_ITERATIONS) {
47375
47381
  const message = `Exceeded retry limit after ${runLoopIterations} attempts (max=${MAX_RUN_LOOP_ITERATIONS}).`;
47376
- log$4.error(`[run-retry-limit] sessionKey=${params.sessionKey ?? params.sessionId} provider=${provider}/${modelId} attempts=${runLoopIterations} maxAttempts=${MAX_RUN_LOOP_ITERATIONS}`);
47382
+ log$5.error(`[run-retry-limit] sessionKey=${params.sessionKey ?? params.sessionId} provider=${provider}/${modelId} attempts=${runLoopIterations} maxAttempts=${MAX_RUN_LOOP_ITERATIONS}`);
47377
47383
  return {
47378
47384
  payloads: [{
47379
47385
  text: "Request failed after repeated internal retries. Please try again, or use /new to start a fresh session.",
@@ -47494,18 +47500,18 @@ async function runEmbeddedPiAgent(params) {
47494
47500
  const overflowDiagId = createCompactionDiagId$1();
47495
47501
  const errorText = contextOverflowError.text;
47496
47502
  const msgCount = attempt.messagesSnapshot?.length ?? 0;
47497
- log$4.warn(`[context-overflow-diag] sessionKey=${params.sessionKey ?? params.sessionId} provider=${provider}/${modelId} source=${contextOverflowError.source} messages=${msgCount} sessionFile=${params.sessionFile} diagId=${overflowDiagId} compactionAttempts=${overflowCompactionAttempts} error=${errorText.slice(0, 200)}`);
47503
+ log$5.warn(`[context-overflow-diag] sessionKey=${params.sessionKey ?? params.sessionId} provider=${provider}/${modelId} source=${contextOverflowError.source} messages=${msgCount} sessionFile=${params.sessionFile} diagId=${overflowDiagId} compactionAttempts=${overflowCompactionAttempts} error=${errorText.slice(0, 200)}`);
47498
47504
  const isCompactionFailure = isCompactionFailureError(errorText);
47499
47505
  const hadAttemptLevelCompaction = attemptCompactionCount > 0;
47500
47506
  if (!isCompactionFailure && hadAttemptLevelCompaction && overflowCompactionAttempts < MAX_OVERFLOW_COMPACTION_ATTEMPTS) {
47501
47507
  overflowCompactionAttempts++;
47502
- log$4.warn(`context overflow persisted after in-attempt compaction (attempt ${overflowCompactionAttempts}/${MAX_OVERFLOW_COMPACTION_ATTEMPTS}); retrying prompt without additional compaction for ${provider}/${modelId}`);
47508
+ log$5.warn(`context overflow persisted after in-attempt compaction (attempt ${overflowCompactionAttempts}/${MAX_OVERFLOW_COMPACTION_ATTEMPTS}); retrying prompt without additional compaction for ${provider}/${modelId}`);
47503
47509
  continue;
47504
47510
  }
47505
47511
  if (!isCompactionFailure && !hadAttemptLevelCompaction && overflowCompactionAttempts < MAX_OVERFLOW_COMPACTION_ATTEMPTS) {
47506
- if (log$4.isEnabled("debug")) log$4.debug(`[compaction-diag] decision diagId=${overflowDiagId} branch=compact isCompactionFailure=${isCompactionFailure} hasOversizedToolResults=unknown attempt=${overflowCompactionAttempts + 1} maxAttempts=${MAX_OVERFLOW_COMPACTION_ATTEMPTS}`);
47512
+ if (log$5.isEnabled("debug")) log$5.debug(`[compaction-diag] decision diagId=${overflowDiagId} branch=compact isCompactionFailure=${isCompactionFailure} hasOversizedToolResults=unknown attempt=${overflowCompactionAttempts + 1} maxAttempts=${MAX_OVERFLOW_COMPACTION_ATTEMPTS}`);
47507
47513
  overflowCompactionAttempts++;
47508
- log$4.warn(`context overflow detected (attempt ${overflowCompactionAttempts}/${MAX_OVERFLOW_COMPACTION_ATTEMPTS}); attempting auto-compaction for ${provider}/${modelId}`);
47514
+ log$5.warn(`context overflow detected (attempt ${overflowCompactionAttempts}/${MAX_OVERFLOW_COMPACTION_ATTEMPTS}); attempting auto-compaction for ${provider}/${modelId}`);
47509
47515
  const compactResult = await compactEmbeddedPiSessionDirect({
47510
47516
  sessionId: params.sessionId,
47511
47517
  sessionKey: params.sessionKey,
@@ -47534,10 +47540,10 @@ async function runEmbeddedPiAgent(params) {
47534
47540
  });
47535
47541
  if (compactResult.compacted) {
47536
47542
  autoCompactionCount += 1;
47537
- log$4.info(`auto-compaction succeeded for ${provider}/${modelId}; retrying prompt`);
47543
+ log$5.info(`auto-compaction succeeded for ${provider}/${modelId}; retrying prompt`);
47538
47544
  continue;
47539
47545
  }
47540
- log$4.warn(`auto-compaction failed for ${provider}/${modelId}: ${compactResult.reason ?? "nothing to compact"}`);
47546
+ log$5.warn(`auto-compaction failed for ${provider}/${modelId}: ${compactResult.reason ?? "nothing to compact"}`);
47541
47547
  }
47542
47548
  if (!toolResultTruncationAttempted) {
47543
47549
  const contextWindowTokens = ctxInfo.tokens;
@@ -47546,9 +47552,9 @@ async function runEmbeddedPiAgent(params) {
47546
47552
  contextWindowTokens
47547
47553
  }) : false;
47548
47554
  if (hasOversized) {
47549
- if (log$4.isEnabled("debug")) log$4.debug(`[compaction-diag] decision diagId=${overflowDiagId} branch=truncate_tool_results isCompactionFailure=${isCompactionFailure} hasOversizedToolResults=${hasOversized} attempt=${overflowCompactionAttempts} maxAttempts=${MAX_OVERFLOW_COMPACTION_ATTEMPTS}`);
47555
+ if (log$5.isEnabled("debug")) log$5.debug(`[compaction-diag] decision diagId=${overflowDiagId} branch=truncate_tool_results isCompactionFailure=${isCompactionFailure} hasOversizedToolResults=${hasOversized} attempt=${overflowCompactionAttempts} maxAttempts=${MAX_OVERFLOW_COMPACTION_ATTEMPTS}`);
47550
47556
  toolResultTruncationAttempted = true;
47551
- log$4.warn(`[context-overflow-recovery] Attempting tool result truncation for ${provider}/${modelId} (contextWindow=${contextWindowTokens} tokens)`);
47557
+ log$5.warn(`[context-overflow-recovery] Attempting tool result truncation for ${provider}/${modelId} (contextWindow=${contextWindowTokens} tokens)`);
47552
47558
  const truncResult = await truncateOversizedToolResultsInSession({
47553
47559
  sessionFile: params.sessionFile,
47554
47560
  contextWindowTokens,
@@ -47556,13 +47562,13 @@ async function runEmbeddedPiAgent(params) {
47556
47562
  sessionKey: params.sessionKey
47557
47563
  });
47558
47564
  if (truncResult.truncated) {
47559
- log$4.info(`[context-overflow-recovery] Truncated ${truncResult.truncatedCount} tool result(s); retrying prompt`);
47565
+ log$5.info(`[context-overflow-recovery] Truncated ${truncResult.truncatedCount} tool result(s); retrying prompt`);
47560
47566
  continue;
47561
47567
  }
47562
- log$4.warn(`[context-overflow-recovery] Tool result truncation did not help: ${truncResult.reason ?? "unknown"}`);
47563
- } else if (log$4.isEnabled("debug")) log$4.debug(`[compaction-diag] decision diagId=${overflowDiagId} branch=give_up isCompactionFailure=${isCompactionFailure} hasOversizedToolResults=${hasOversized} attempt=${overflowCompactionAttempts} maxAttempts=${MAX_OVERFLOW_COMPACTION_ATTEMPTS}`);
47568
+ log$5.warn(`[context-overflow-recovery] Tool result truncation did not help: ${truncResult.reason ?? "unknown"}`);
47569
+ } else if (log$5.isEnabled("debug")) log$5.debug(`[compaction-diag] decision diagId=${overflowDiagId} branch=give_up isCompactionFailure=${isCompactionFailure} hasOversizedToolResults=${hasOversized} attempt=${overflowCompactionAttempts} maxAttempts=${MAX_OVERFLOW_COMPACTION_ATTEMPTS}`);
47564
47570
  }
47565
- if ((isCompactionFailure || overflowCompactionAttempts >= MAX_OVERFLOW_COMPACTION_ATTEMPTS || toolResultTruncationAttempted) && log$4.isEnabled("debug")) log$4.debug(`[compaction-diag] decision diagId=${overflowDiagId} branch=give_up isCompactionFailure=${isCompactionFailure} hasOversizedToolResults=unknown attempt=${overflowCompactionAttempts} maxAttempts=${MAX_OVERFLOW_COMPACTION_ATTEMPTS}`);
47571
+ if ((isCompactionFailure || overflowCompactionAttempts >= MAX_OVERFLOW_COMPACTION_ATTEMPTS || toolResultTruncationAttempted) && log$5.isEnabled("debug")) log$5.debug(`[compaction-diag] decision diagId=${overflowDiagId} branch=give_up isCompactionFailure=${isCompactionFailure} hasOversizedToolResults=unknown attempt=${overflowCompactionAttempts} maxAttempts=${MAX_OVERFLOW_COMPACTION_ATTEMPTS}`);
47566
47572
  const kind = isCompactionFailure ? "compaction_failure" : "context_overflow";
47567
47573
  return {
47568
47574
  payloads: [{
@@ -47643,7 +47649,7 @@ async function runEmbeddedPiAgent(params) {
47643
47649
  attempted: attemptedThinking
47644
47650
  });
47645
47651
  if (fallbackThinking) {
47646
- log$4.warn(`unsupported thinking level for ${provider}/${modelId}; retrying with ${fallbackThinking}`);
47652
+ log$5.warn(`unsupported thinking level for ${provider}/${modelId}; retrying with ${fallbackThinking}`);
47647
47653
  thinkLevel = fallbackThinking;
47648
47654
  continue;
47649
47655
  }
@@ -47661,7 +47667,7 @@ async function runEmbeddedPiAgent(params) {
47661
47667
  attempted: attemptedThinking
47662
47668
  });
47663
47669
  if (fallbackThinking && !aborted) {
47664
- log$4.warn(`unsupported thinking level for ${provider}/${modelId}; retrying with ${fallbackThinking}`);
47670
+ log$5.warn(`unsupported thinking level for ${provider}/${modelId}; retrying with ${fallbackThinking}`);
47665
47671
  thinkLevel = fallbackThinking;
47666
47672
  continue;
47667
47673
  }
@@ -47678,7 +47684,7 @@ async function runEmbeddedPiAgent(params) {
47678
47684
  imageDimensionError.contentIndex !== void 0 ? `content=${imageDimensionError.contentIndex}` : null,
47679
47685
  imageDimensionError.maxDimensionPx !== void 0 ? `limit=${imageDimensionError.maxDimensionPx}px` : null
47680
47686
  ].filter(Boolean).join(" ");
47681
- log$4.warn(`Profile ${lastProfileId} rejected image payload${details ? ` (${details})` : ""}.`);
47687
+ log$5.warn(`Profile ${lastProfileId} rejected image payload${details ? ` (${details})` : ""}.`);
47682
47688
  }
47683
47689
  const isLocalOllamaTimeout = timedOut && model.api === "ollama";
47684
47690
  if (!aborted && failoverFailure || timedOut && !timedOutDuringCompaction && !isLocalOllamaTimeout) {
@@ -47690,8 +47696,8 @@ async function runEmbeddedPiAgent(params) {
47690
47696
  cfg: params.config,
47691
47697
  agentDir: params.agentDir
47692
47698
  });
47693
- if (timedOut && !isProbeSession) log$4.warn(`Profile ${lastProfileId} timed out (possible rate limit). Trying next account...`);
47694
- if (cloudCodeAssistFormatError) log$4.warn(`Profile ${lastProfileId} hit Cloud Code Assist format error. Tool calls will be sanitized on retry.`);
47699
+ if (timedOut && !isProbeSession) log$5.warn(`Profile ${lastProfileId} timed out (possible rate limit). Trying next account...`);
47700
+ if (cloudCodeAssistFormatError) log$5.warn(`Profile ${lastProfileId} hit Cloud Code Assist format error. Tool calls will be sanitized on retry.`);
47695
47701
  }
47696
47702
  if (await advanceAuthProfile()) continue;
47697
47703
  if (fallbackConfigured) {
@@ -47757,7 +47763,7 @@ async function runEmbeddedPiAgent(params) {
47757
47763
  const hasCodeBlocks = attempt.assistantTexts.some((text) => /```[\s\S]*?```/.test(text));
47758
47764
  if (hasCodeToolUsage || hasCodeBlocks) {
47759
47765
  verificationPassCompleted = true;
47760
- log$4.debug(`[verification] starting verification pass: runId=${params.runId} sessionId=${params.sessionId} trigger=${hasCodeToolUsage ? "tool_usage" : "code_blocks"}`);
47766
+ log$5.debug(`[verification] starting verification pass: runId=${params.runId} sessionId=${params.sessionId} trigger=${hasCodeToolUsage ? "tool_usage" : "code_blocks"}`);
47761
47767
  const verificationPrompt = "Review your response against the original user request. Check: (1) Did you address every requirement? (2) Did you include tests if requested? (3) Did you run and verify the code works? If you missed anything, fix it now. If everything looks correct, briefly confirm.";
47762
47768
  try {
47763
47769
  const verifyAttempt = await runEmbeddedAttempt({
@@ -47843,10 +47849,10 @@ async function runEmbeddedPiAgent(params) {
47843
47849
  payloads.length = 0;
47844
47850
  payloads.push(...verifyPayloads);
47845
47851
  }
47846
- log$4.debug(`[verification] verification produced corrections: runId=${params.runId} tools=${verifyAttempt.toolMetas.length} texts=${verifyAttempt.assistantTexts.length}`);
47847
- } else log$4.debug(`[verification] verification confirmed original response: runId=${params.runId}`);
47852
+ log$5.debug(`[verification] verification produced corrections: runId=${params.runId} tools=${verifyAttempt.toolMetas.length} texts=${verifyAttempt.assistantTexts.length}`);
47853
+ } else log$5.debug(`[verification] verification confirmed original response: runId=${params.runId}`);
47848
47854
  } catch (verifyErr) {
47849
- log$4.warn(`[verification] verification pass failed, keeping original response: runId=${params.runId} error=${String(verifyErr)}`);
47855
+ log$5.warn(`[verification] verification pass failed, keeping original response: runId=${params.runId} error=${String(verifyErr)}`);
47850
47856
  }
47851
47857
  }
47852
47858
  }
@@ -47867,7 +47873,7 @@ async function runEmbeddedPiAgent(params) {
47867
47873
  messagingToolSentTargets: attempt.messagingToolSentTargets,
47868
47874
  successfulCronAdds: attempt.successfulCronAdds
47869
47875
  };
47870
- log$4.debug(`embedded run done: runId=${params.runId} sessionId=${params.sessionId} durationMs=${Date.now() - started} aborted=${aborted}`);
47876
+ log$5.debug(`embedded run done: runId=${params.runId} sessionId=${params.sessionId} durationMs=${Date.now() - started} aborted=${aborted}`);
47871
47877
  if (lastProfileId) {
47872
47878
  await markAuthProfileGood({
47873
47879
  store: authStore,
@@ -60588,7 +60594,7 @@ function isVoiceChannelType(type) {
60588
60594
  function createDefaultDeps() {
60589
60595
  return {
60590
60596
  sendMessageWhatsApp: async (...args) => {
60591
- const { sendMessageWhatsApp } = await import("./web-DBFW0ejP.js");
60597
+ const { sendMessageWhatsApp } = await import("./web-LUMjboLF.js");
60592
60598
  return await sendMessageWhatsApp(...args);
60593
60599
  },
60594
60600
  sendMessageTelegram: async (...args) => {
@@ -75868,7 +75874,7 @@ function loadWebLoginQr() {
75868
75874
  return webLoginQrPromise;
75869
75875
  }
75870
75876
  function loadWebChannel() {
75871
- webChannelPromise ??= import("./web-DBFW0ejP.js");
75877
+ webChannelPromise ??= import("./web-LUMjboLF.js");
75872
75878
  return webChannelPromise;
75873
75879
  }
75874
75880
  function loadWhatsAppActions() {
@@ -78224,7 +78230,7 @@ async function compactEmbeddedPiSessionDirect(params) {
78224
78230
  const provider = (params.provider ?? DEFAULT_PROVIDER).trim() || DEFAULT_PROVIDER;
78225
78231
  const modelId = (params.model ?? DEFAULT_MODEL).trim() || DEFAULT_MODEL;
78226
78232
  const fail = (reason) => {
78227
- log$4.warn(`[compaction-diag] end runId=${runId} sessionKey=${params.sessionKey ?? params.sessionId} diagId=${diagId} trigger=${trigger} provider=${provider}/${modelId} attempt=${attempt} maxAttempts=${maxAttempts} outcome=failed reason=${classifyCompactionReason(reason)} durationMs=${Date.now() - startedAt}`);
78233
+ log$5.warn(`[compaction-diag] end runId=${runId} sessionKey=${params.sessionKey ?? params.sessionId} diagId=${diagId} trigger=${trigger} provider=${provider}/${modelId} attempt=${attempt} maxAttempts=${maxAttempts} outcome=failed reason=${classifyCompactionReason(reason)} durationMs=${Date.now() - startedAt}`);
78228
78234
  return {
78229
78235
  ok: false,
78230
78236
  compacted: false,
@@ -78292,7 +78298,7 @@ async function compactEmbeddedPiSessionDirect(params) {
78292
78298
  sessionId: params.sessionId,
78293
78299
  warn: makeBootstrapWarn({
78294
78300
  sessionLabel,
78295
- warn: (message) => log$4.warn(message)
78301
+ warn: (message) => log$5.warn(message)
78296
78302
  })
78297
78303
  });
78298
78304
  const runAbortController = new AbortController();
@@ -78432,7 +78438,7 @@ async function compactEmbeddedPiSessionDirect(params) {
78432
78438
  try {
78433
78439
  await repairSessionFileIfNeeded({
78434
78440
  sessionFile: params.sessionFile,
78435
- warn: (message) => log$4.warn(message)
78441
+ warn: (message) => log$5.warn(message)
78436
78442
  });
78437
78443
  await prewarmSessionFile(params.sessionFile);
78438
78444
  const transcriptPolicy = resolveTranscriptPolicy({
@@ -78517,13 +78523,13 @@ async function compactEmbeddedPiSessionDirect(params) {
78517
78523
  messages: preCompactionMessages,
78518
78524
  sessionFile: params.sessionFile
78519
78525
  }, hookCtx).catch((hookErr) => {
78520
- log$4.warn(`before_compaction hook failed: ${String(hookErr)}`);
78526
+ log$5.warn(`before_compaction hook failed: ${String(hookErr)}`);
78521
78527
  });
78522
- const diagEnabled = log$4.isEnabled("debug");
78528
+ const diagEnabled = log$5.isEnabled("debug");
78523
78529
  const preMetrics = diagEnabled ? summarizeCompactionMessages(session.messages) : void 0;
78524
78530
  if (diagEnabled && preMetrics) {
78525
- log$4.debug(`[compaction-diag] start runId=${runId} sessionKey=${params.sessionKey ?? params.sessionId} diagId=${diagId} trigger=${trigger} provider=${provider}/${modelId} attempt=${attempt} maxAttempts=${maxAttempts} pre.messages=${preMetrics.messages} pre.historyTextChars=${preMetrics.historyTextChars} pre.toolResultChars=${preMetrics.toolResultChars} pre.estTokens=${preMetrics.estTokens ?? "unknown"}`);
78526
- log$4.debug(`[compaction-diag] contributors diagId=${diagId} top=${JSON.stringify(preMetrics.contributors)}`);
78531
+ log$5.debug(`[compaction-diag] start runId=${runId} sessionKey=${params.sessionKey ?? params.sessionId} diagId=${diagId} trigger=${trigger} provider=${provider}/${modelId} attempt=${attempt} maxAttempts=${maxAttempts} pre.messages=${preMetrics.messages} pre.historyTextChars=${preMetrics.historyTextChars} pre.toolResultChars=${preMetrics.toolResultChars} pre.estTokens=${preMetrics.estTokens ?? "unknown"}`);
78532
+ log$5.debug(`[compaction-diag] contributors diagId=${diagId} top=${JSON.stringify(preMetrics.contributors)}`);
78527
78533
  }
78528
78534
  const compactStartedAt = Date.now();
78529
78535
  const result = await compactWithSafetyTimeout(() => session.compact(params.customInstructions));
@@ -78541,10 +78547,10 @@ async function compactEmbeddedPiSessionDirect(params) {
78541
78547
  compactedCount: limited.length - session.messages.length,
78542
78548
  sessionFile: params.sessionFile
78543
78549
  }, hookCtx).catch((hookErr) => {
78544
- log$4.warn(`after_compaction hook failed: ${hookErr}`);
78550
+ log$5.warn(`after_compaction hook failed: ${hookErr}`);
78545
78551
  });
78546
78552
  const postMetrics = diagEnabled ? summarizeCompactionMessages(session.messages) : void 0;
78547
- if (diagEnabled && preMetrics && postMetrics) log$4.debug(`[compaction-diag] end runId=${runId} sessionKey=${params.sessionKey ?? params.sessionId} diagId=${diagId} trigger=${trigger} provider=${provider}/${modelId} attempt=${attempt} maxAttempts=${maxAttempts} outcome=compacted reason=none durationMs=${Date.now() - compactStartedAt} retrying=false post.messages=${postMetrics.messages} post.historyTextChars=${postMetrics.historyTextChars} post.toolResultChars=${postMetrics.toolResultChars} post.estTokens=${postMetrics.estTokens ?? "unknown"} delta.messages=${postMetrics.messages - preMetrics.messages} delta.historyTextChars=${postMetrics.historyTextChars - preMetrics.historyTextChars} delta.toolResultChars=${postMetrics.toolResultChars - preMetrics.toolResultChars} delta.estTokens=${typeof preMetrics.estTokens === "number" && typeof postMetrics.estTokens === "number" ? postMetrics.estTokens - preMetrics.estTokens : "unknown"}`);
78553
+ if (diagEnabled && preMetrics && postMetrics) log$5.debug(`[compaction-diag] end runId=${runId} sessionKey=${params.sessionKey ?? params.sessionId} diagId=${diagId} trigger=${trigger} provider=${provider}/${modelId} attempt=${attempt} maxAttempts=${maxAttempts} outcome=compacted reason=none durationMs=${Date.now() - compactStartedAt} retrying=false post.messages=${postMetrics.messages} post.historyTextChars=${postMetrics.historyTextChars} post.toolResultChars=${postMetrics.toolResultChars} post.estTokens=${postMetrics.estTokens ?? "unknown"} delta.messages=${postMetrics.messages - preMetrics.messages} delta.historyTextChars=${postMetrics.historyTextChars - preMetrics.historyTextChars} delta.toolResultChars=${postMetrics.toolResultChars - preMetrics.toolResultChars} delta.estTokens=${typeof preMetrics.estTokens === "number" && typeof postMetrics.estTokens === "number" ? postMetrics.estTokens - preMetrics.estTokens : "unknown"}`);
78548
78554
  return {
78549
78555
  ok: true,
78550
78556
  compacted: true,