@symerian/symi 2.6.1 → 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 (110) hide show
  1. package/dist/{agents-DQIz-_on.js → agents-Dm0V9Z2G.js} +4 -4
  2. package/dist/{agents.config-CIJRaVWl.js → agents.config-DP0CLvIA.js} +1 -1
  3. package/dist/{agents.config-D8WPDf-m.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-DTDyJL1r.js → auth-choice-B9OnYICm.js} +1 -1
  6. package/dist/{auth-choice-BqFbNDuP.js → auth-choice-CXHi61T5.js} +1 -1
  7. package/dist/{banner-DYDCxnDL.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-CvHSm_Kx.js → channel-options-CsGrHsjP.js} +1 -1
  13. package/dist/{channel-options-vBCJhJB7.js → channel-options-Jl8AKRLD.js} +1 -1
  14. package/dist/{channel-web-CM2LyWZW.js → channel-web-qFGaLytG.js} +1 -1
  15. package/dist/{channels-cli-DzOjNNFn.js → channels-cli-BFyOmW-R.js} +4 -4
  16. package/dist/{channels-cli-D5H3Wcho.js → channels-cli-DQTl2Pk5.js} +4 -4
  17. package/dist/{chrome-DkaXoP36.js → chrome-DYZwl5Gv.js} +7 -7
  18. package/dist/{cli-8hqssnRJ.js → cli-B4biLt2z.js} +1 -1
  19. package/dist/{cli-DNZwCDRe.js → cli-DQw_LEew.js} +1 -1
  20. package/dist/{command-registry-CHtN2HeK.js → command-registry-D1OePePk.js} +9 -9
  21. package/dist/{completion-cli-Cov6N3BO.js → completion-cli-CI-0hC_u.js} +2 -2
  22. package/dist/{completion-cli-C8y_J5KC.js → completion-cli-DW8a1WYc.js} +1 -1
  23. package/dist/{config-cli-BwO0xAbV.js → config-cli-CpiluXlO.js} +1 -1
  24. package/dist/{config-cli-B2REEd2l.js → config-cli-DHXt5cQZ.js} +1 -1
  25. package/dist/{configure-C6yNe33U.js → configure-CmVnpTNi.js} +3 -3
  26. package/dist/{configure-BWSYSi2-.js → configure-Ha9cu8Bu.js} +3 -3
  27. package/dist/{deliver-C46-vyqg.js → deliver-dODxSv3b.js} +1 -1
  28. package/dist/{doctor-completion-BKKzstt6.js → doctor-completion-CRNCOXcf.js} +1 -1
  29. package/dist/{doctor-completion-D7CDLFLg.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-Datohp3m.js → gateway-cli-BPsbjmUI.js} +9 -9
  33. package/dist/{gateway-cli-BhFM4Bkm.js → gateway-cli-Cc7N8N_E.js} +9 -9
  34. package/dist/{glass-ui-ws-BzqfD_wX.js → glass-ui-ws-1O1O2xC6.js} +7 -7
  35. package/dist/{glass-ui-ws-D9yvYULL.js → glass-ui-ws-CKwLnOwl.js} +7 -7
  36. package/dist/{health-BjwDRAdd.js → health-DTRWmRB8.js} +1 -1
  37. package/dist/{health-C5XJPwpt.js → health-tYyUNVp5.js} +1 -1
  38. package/dist/{hooks-cli-U12oVyLH.js → hooks-cli-Cp81vqRc.js} +2 -2
  39. package/dist/{hooks-cli-CafMq9Vr.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-Bo4iHJy-.js → models-CuhnCX2U.js} +2 -2
  44. package/dist/{models-cli-B5vh-XK8.js → models-cli-BzwGQUdn.js} +3 -3
  45. package/dist/{models-cli-6aNi3eN9.js → models-cli-CFr_ZP5y.js} +2 -2
  46. package/dist/{onboard-f-GJ26Ix.js → onboard-B2g2Q6dd.js} +2 -2
  47. package/dist/{onboard-Bm-pmstf.js → onboard-CcB6pmEy.js} +2 -2
  48. package/dist/{onboard-channels-BRd1cXye.js → onboard-channels-CWd17q6h.js} +1 -1
  49. package/dist/{onboard-channels-CUl5U8kV.js → onboard-channels-DmRBC7VN.js} +1 -1
  50. package/dist/{onboarding-CvBDWlBJ.js → onboarding-DMqlt_p6.js} +3 -3
  51. package/dist/{onboarding-DIVKvosg.js → onboarding-DwvQIqR8.js} +3 -3
  52. package/dist/{onboarding.finalize-WSac-JKd.js → onboarding.finalize-BUSzTwhM.js} +5 -5
  53. package/dist/{onboarding.finalize-DJX6mSLa.js → onboarding.finalize-lJmZSE4C.js} +6 -6
  54. package/dist/{pi-embedded-BmbbC1Sb.js → pi-embedded-CT2JDfQr.js} +208 -132
  55. package/dist/{pi-embedded-helpers-CfqDGQ9J.js → pi-embedded-helpers-pubKo8HQ.js} +4 -4
  56. package/dist/{plugin-registry-5yf-hu_W.js → plugin-registry-DZdPnpP_.js} +1 -1
  57. package/dist/{plugin-registry-2zUJMasm.js → plugin-registry-vW2V1yCi.js} +1 -1
  58. package/dist/plugin-sdk/agents/pi-tools.validate-wrapper.d.ts +6 -6
  59. package/dist/plugin-sdk/{channel-web-DPyyTvFo.js → channel-web-38aqDKeT.js} +1 -1
  60. package/dist/plugin-sdk/index.js +2 -2
  61. package/dist/plugin-sdk/{reply-QAcAd9ev.js → reply-BjJZjZRr.js} +204 -128
  62. package/dist/plugin-sdk/{web-DaTTL9M0.js → web-BgKYnau3.js} +2 -2
  63. package/dist/{plugins-cli-D4eRESV2.js → plugins-cli-BTq9c2hZ.js} +2 -2
  64. package/dist/{plugins-cli-DksVl33N.js → plugins-cli-DkAx9r3h.js} +2 -2
  65. package/dist/{program-BjORH7Cc.js → program-DZx9PtyT.js} +7 -7
  66. package/dist/{program-context-DaNGrTOm.js → program-context-DyfuToE1.js} +17 -17
  67. package/dist/{prompt-select-styled-QaS2zul_.js → prompt-select-styled-CifWTOoY.js} +4 -4
  68. package/dist/{prompt-select-styled-YOj4xigd.js → prompt-select-styled-DNbD3v3G.js} +4 -4
  69. package/dist/{provider-auth-helpers-DCEbm2hz.js → provider-auth-helpers-BPIIDTwA.js} +1 -1
  70. package/dist/{provider-auth-helpers-BAGT_RXV.js → provider-auth-helpers-BzySaUp5.js} +1 -1
  71. package/dist/{push-apns-Bek3ANJa.js → push-apns-DbpeXPGR.js} +1 -1
  72. package/dist/{push-apns-BECodU1i.js → push-apns-IdD-dKZm.js} +1 -1
  73. package/dist/{pw-ai-m0mj2KWK.js → pw-ai-B5asscAD.js} +1 -1
  74. package/dist/{register.agent-DJHQo-Iq.js → register.agent-CfFcSvM1.js} +6 -6
  75. package/dist/{register.agent-B34lxx7F.js → register.agent-TFUcxDGN.js} +5 -5
  76. package/dist/{register.configure-DC_-t5kj.js → register.configure-BwRTNCws.js} +6 -6
  77. package/dist/{register.configure-BdhhIzb0.js → register.configure-D3BJejOC.js} +6 -6
  78. package/dist/{register.maintenance-cs-A4kHF.js → register.maintenance-B5350ddh.js} +7 -7
  79. package/dist/{register.maintenance-CITur3O_.js → register.maintenance-DkdVYwbj.js} +8 -8
  80. package/dist/{register.message-PIaHm2pZ.js → register.message-DTopCPGC.js} +2 -2
  81. package/dist/{register.message--RhtnEYn.js → register.message-FbCBAfJO.js} +2 -2
  82. package/dist/{register.onboard-DucZgrF7.js → register.onboard-DITZn8dx.js} +4 -4
  83. package/dist/{register.onboard-CTJQoDcK.js → register.onboard-GSv5xyA3.js} +4 -4
  84. package/dist/{register.setup-2ZiUN7ui.js → register.setup-BI6lILMU.js} +4 -4
  85. package/dist/{register.setup-DD4Rgkt9.js → register.setup-BuOeoBk0.js} +4 -4
  86. package/dist/{register.status-health-sessions-BqD7L8XL.js → register.status-health-sessions-C1RhWKxN.js} +3 -3
  87. package/dist/{register.status-health-sessions-sLgA92t7.js → register.status-health-sessions-EK4_odLb.js} +3 -3
  88. package/dist/{register.subclis-B2dGWFur.js → register.subclis-Bn_Mr_Wa.js} +9 -9
  89. package/dist/{reply-DYnTEYoa.js → reply-BGSd_cMI.js} +199 -123
  90. package/dist/{run-main-DWmu2b6D.js → run-main-Bu9IAm9E.js} +14 -14
  91. package/dist/{runner-CU9l0uJh.js → runner-WAG0M5s9.js} +1 -1
  92. package/dist/{server-methods-vDGoM3xL.js → server-methods-dxn6-zQz.js} +7 -7
  93. package/dist/{server-methods-C8EWZt2g.js → server-methods-tA9lkIQT.js} +7 -7
  94. package/dist/{server-node-events-CKi12bol.js → server-node-events-6jcJSpXA.js} +2 -2
  95. package/dist/{server-node-events-DFwGbkcO.js → server-node-events-CzcTGD9T.js} +2 -2
  96. package/dist/{status-B1_iHrOg.js → status-8176C-aV.js} +2 -2
  97. package/dist/{status-DiX0DAtH.js → status-CcQSl2sN.js} +1 -1
  98. package/dist/{status--iNVOTMO.js → status-DGKT6HnE.js} +2 -2
  99. package/dist/{status-BQcdARV4.js → status-DmPOSk-A.js} +1 -1
  100. package/dist/{subagent-registry-CXrOOgPW.js → subagent-registry-DqFKNTCX.js} +202 -126
  101. package/dist/{unified-runner-CulJZMxc.js → unified-runner-BbanUEmo.js} +227 -151
  102. package/dist/{update-cli-D1pLX3eo.js → update-cli-FMcGr7MA.js} +8 -8
  103. package/dist/{update-cli-560gprSp.js → update-cli-YCXB_6jz.js} +7 -7
  104. package/dist/{update-runner-CLKHrONW.js → update-runner-C8OkrKjW.js} +1 -1
  105. package/dist/{update-runner-BQxFFCGc.js → update-runner-DMP1rCS1.js} +1 -1
  106. package/dist/{web-hHX9a9YO.js → web-BsS1ia0M.js} +6 -6
  107. package/dist/{web-Bqrgp43v.js → web-CQ2F1f3a.js} +1 -1
  108. package/dist/{web-Dr5cOn-1.js → web-DoRGusTq.js} +2 -2
  109. package/dist/{web-D4qJ9XKP.js → web-LUMjboLF.js} +1 -1
  110. 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,10 +42337,27 @@ 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"]);
42342
+ const FILE_TOOL_NAMES = new Set([
42343
+ "write",
42344
+ "read",
42345
+ "edit",
42346
+ "patch",
42347
+ "file_write",
42348
+ "file_edit",
42349
+ "write_file",
42350
+ "edit_file",
42351
+ "create_file"
42352
+ ]);
42353
+ const FILE_PATH_KEYS = [
42354
+ "file_path",
42355
+ "path",
42356
+ "filePath"
42357
+ ];
42341
42358
  /**
42342
- * Wrap tools with argument validation. Only exec/bash tools are validated.
42343
- * Other tools pass through unchanged.
42359
+ * Wrap tools with argument validation. Exec/bash commands and file paths
42360
+ * are validated. Other tools pass through unchanged.
42344
42361
  *
42345
42362
  * Call this AFTER tools are created and the model profile is resolved.
42346
42363
  */
@@ -42349,24 +42366,64 @@ function wrapToolsWithArgValidation(tools, profile) {
42349
42366
  return tools.map((tool) => wrapToolWithArgValidation(tool));
42350
42367
  }
42351
42368
  /**
42352
- * Wrap a single tool with argument validation for exec/bash commands.
42369
+ * Clean a file path by stripping control token fragments.
42370
+ * Returns null if the path is irreparably corrupted (empty after cleanup).
42371
+ */
42372
+ function cleanFilePath(filePath) {
42373
+ let cleaned = filePath.replace(/<\|[^|>]*(?:\|>)?/g, "");
42374
+ cleaned = cleanResidualTokenFragments(cleaned);
42375
+ cleaned = cleaned.trim();
42376
+ if (!cleaned || !/[a-zA-Z0-9/._~-]/.test(cleaned)) return {
42377
+ valid: false,
42378
+ cleaned
42379
+ };
42380
+ return {
42381
+ valid: true,
42382
+ cleaned
42383
+ };
42384
+ }
42385
+ /**
42386
+ * Wrap a single tool with argument validation.
42353
42387
  */
42354
42388
  function wrapToolWithArgValidation(tool) {
42355
42389
  const toolName = (tool.name ?? "").toLowerCase().trim();
42356
- if (!EXEC_TOOL_NAMES.has(toolName)) return tool;
42390
+ const isExecTool = EXEC_TOOL_NAMES.has(toolName);
42391
+ const isFileTool = FILE_TOOL_NAMES.has(toolName);
42392
+ if (!isExecTool && !isFileTool) return tool;
42357
42393
  const originalExecute = tool.execute;
42358
42394
  return {
42359
42395
  ...tool,
42360
42396
  execute(toolCallId, params, ...rest) {
42361
- const command = params.command ?? params.cmd;
42362
- if (typeof command !== "string") return originalExecute.call(tool, toolCallId, params, ...rest);
42363
- const result = validateShellCommand(command);
42364
- 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.` });
42365
- if (result.cleaned !== command) return originalExecute.call(tool, toolCallId, {
42397
+ if (isExecTool) {
42398
+ const command = params.command ?? params.cmd;
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
+ }
42403
+ const result = validateShellCommand(command);
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
+ }
42415
+ return originalExecute.call(tool, toolCallId, params, ...rest);
42416
+ }
42417
+ const pathKey = FILE_PATH_KEYS.find((k) => typeof params[k] === "string");
42418
+ if (!pathKey) return originalExecute.call(tool, toolCallId, params, ...rest);
42419
+ const rawPath = params[pathKey];
42420
+ if (!rawPath.includes("<|") && !rawPath.includes("|>") && !/^[<"|]/.test(rawPath)) return originalExecute.call(tool, toolCallId, params, ...rest);
42421
+ const pathResult = cleanFilePath(rawPath);
42422
+ if (!pathResult.valid) return Promise.resolve({ output: `Error: file path "${rawPath}" contains model control tokens and could not be cleaned. Please provide a clean file path without any <|, |>, or XML-like tags.` });
42423
+ return originalExecute.call(tool, toolCallId, {
42366
42424
  ...params,
42367
- command: result.cleaned
42425
+ [pathKey]: pathResult.cleaned
42368
42426
  }, ...rest);
42369
- return originalExecute.call(tool, toolCallId, params, ...rest);
42370
42427
  }
42371
42428
  };
42372
42429
  }
@@ -42725,7 +42782,7 @@ async function truncateOversizedToolResultsInSession(params) {
42725
42782
  const textLength = getToolResultTextLength(msg);
42726
42783
  if (textLength > maxChars) {
42727
42784
  oversizedIndices.push(i);
42728
- 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"}`);
42729
42786
  }
42730
42787
  }
42731
42788
  if (oversizedIndices.length === 0) return {
@@ -42747,7 +42804,7 @@ async function truncateOversizedToolResultsInSession(params) {
42747
42804
  message = truncateToolResultMessage(message, maxChars);
42748
42805
  truncatedCount++;
42749
42806
  const newLength = getToolResultTextLength(message);
42750
- 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"}`);
42751
42808
  }
42752
42809
  sessionManager.appendMessage(message);
42753
42810
  } else if (entry.type === "compaction") sessionManager.appendCompaction(entry.summary, entry.firstKeptEntryId, entry.tokensBefore, entry.details, entry.fromHook);
@@ -42761,14 +42818,14 @@ async function truncateOversizedToolResultsInSession(params) {
42761
42818
  if (entry.name) sessionManager.appendSessionInfo(entry.name);
42762
42819
  }
42763
42820
  }
42764
- 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"}`);
42765
42822
  return {
42766
42823
  truncated: true,
42767
42824
  truncatedCount
42768
42825
  };
42769
42826
  } catch (err) {
42770
42827
  const errMsg = err instanceof Error ? err.message : String(err);
42771
- log$4.warn(`[tool-result-truncation] Failed to truncate: ${errMsg}`);
42828
+ log$5.warn(`[tool-result-truncation] Failed to truncate: ${errMsg}`);
42772
42829
  return {
42773
42830
  truncated: false,
42774
42831
  truncatedCount: 0,
@@ -44426,7 +44483,7 @@ function resolveAnthropicBetas(extraParams, provider, modelId) {
44426
44483
  for (const beta of configured) if (typeof beta === "string" && beta.trim()) betas.add(beta.trim());
44427
44484
  }
44428
44485
  if (extraParams?.context1m === true) if (isAnthropic1MModel(modelId)) betas.add(ANTHROPIC_CONTEXT_1M_BETA);
44429
- 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}`);
44430
44487
  return betas.size > 0 ? [...betas] : void 0;
44431
44488
  }
44432
44489
  function mergeAnthropicBetaHeader(headers, betas) {
@@ -45037,14 +45094,14 @@ function logToolSchemasForGoogle(params) {
45037
45094
  if (params.provider !== "google-antigravity" && params.provider !== "google-gemini-cli") return;
45038
45095
  const toolNames = params.tools.map((tool, index) => `${index}:${tool.name}`);
45039
45096
  const tools = sanitizeToolsForGoogle(params);
45040
- log$4.info("google tool schema snapshot", {
45097
+ log$5.info("google tool schema snapshot", {
45041
45098
  provider: params.provider,
45042
45099
  toolCount: tools.length,
45043
45100
  tools: toolNames
45044
45101
  });
45045
45102
  for (const [index, tool] of tools.entries()) {
45046
45103
  const violations = findUnsupportedSchemaKeywords(tool.parameters, `${tool.name}.parameters`);
45047
- 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", {
45048
45105
  index,
45049
45106
  tool: tool.name,
45050
45107
  violations: violations.slice(0, 12),
@@ -45056,7 +45113,7 @@ const compactionFailureEmitter = new EventEmitter();
45056
45113
  registerUnhandledRejectionHandler((reason) => {
45057
45114
  const message = describeUnknownError(reason);
45058
45115
  if (!isCompactionFailureError(message)) return false;
45059
- log$4.error(`Auto-compaction failed (unhandled): ${message}`);
45116
+ log$5.error(`Auto-compaction failed (unhandled): ${message}`);
45060
45117
  compactionFailureEmitter.emit("failure", message);
45061
45118
  return true;
45062
45119
  });
@@ -45108,7 +45165,7 @@ function applyGoogleTurnOrderingFix(params) {
45108
45165
  const sanitized = sanitizeGoogleTurnOrdering(params.messages);
45109
45166
  const didPrepend = sanitized !== params.messages;
45110
45167
  if (didPrepend && !hasGoogleTurnOrderingMarker(params.sessionManager)) {
45111
- (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})`);
45112
45169
  markGoogleTurnOrderingMarker(params.sessionManager);
45113
45170
  }
45114
45171
  return {
@@ -45716,7 +45773,7 @@ function isImageExtension(filePath) {
45716
45773
  }
45717
45774
  async function sanitizeImagesWithLog(images, label, imageSanitization) {
45718
45775
  const { images: sanitized, dropped } = await sanitizeImageBlocks(images, label, imageSanitization);
45719
- 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}).`);
45720
45777
  return sanitized;
45721
45778
  }
45722
45779
  /**
@@ -45791,7 +45848,7 @@ async function loadImageFromRef(ref, workspaceDir, options) {
45791
45848
  try {
45792
45849
  let targetPath = ref.resolved;
45793
45850
  if (ref.type === "url") {
45794
- 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}`);
45795
45852
  return null;
45796
45853
  }
45797
45854
  if (ref.type === "path") {
@@ -45801,7 +45858,7 @@ async function loadImageFromRef(ref, workspaceDir, options) {
45801
45858
  cwd: options.sandbox.root
45802
45859
  }).hostPath;
45803
45860
  } catch (err) {
45804
- 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)}`);
45805
45862
  return null;
45806
45863
  }
45807
45864
  else if (!path.isAbsolute(targetPath)) targetPath = path.resolve(workspaceDir, targetPath);
@@ -45815,7 +45872,7 @@ async function loadImageFromRef(ref, workspaceDir, options) {
45815
45872
  })
45816
45873
  }) : await loadWebMedia(targetPath, options?.maxBytes);
45817
45874
  if (media.kind !== "image") {
45818
- 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})`);
45819
45876
  return null;
45820
45877
  }
45821
45878
  const mimeType = media.contentType ?? "image/jpeg";
@@ -45825,7 +45882,7 @@ async function loadImageFromRef(ref, workspaceDir, options) {
45825
45882
  mimeType
45826
45883
  };
45827
45884
  } catch (err) {
45828
- 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)}`);
45829
45886
  return null;
45830
45887
  }
45831
45888
  }
@@ -45924,7 +45981,7 @@ async function detectAndLoadPromptImages(params) {
45924
45981
  loadedCount: 0,
45925
45982
  skippedCount: 0
45926
45983
  };
45927
- 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)`);
45928
45985
  const promptImages = [...params.existingImages ?? []];
45929
45986
  const historyImagesByIndex = /* @__PURE__ */ new Map();
45930
45987
  let loadedCount = 0;
@@ -45941,7 +45998,7 @@ async function detectAndLoadPromptImages(params) {
45941
45998
  else historyImagesByIndex.set(ref.messageIndex, [image]);
45942
45999
  } else promptImages.push(image);
45943
46000
  loadedCount++;
45944
- log$4.debug(`Native image: loaded ${ref.type} ${ref.resolved}`);
46001
+ log$5.debug(`Native image: loaded ${ref.type} ${ref.resolved}`);
45945
46002
  } else skippedCount++;
45946
46003
  }
45947
46004
  const imageSanitization = { maxDimensionPx: params.maxDimensionPx };
@@ -46037,7 +46094,7 @@ async function runEmbeddedAttempt(params) {
46037
46094
  const resolvedWorkspace = resolveUserPath(params.workspaceDir);
46038
46095
  const prevCwd = process.cwd();
46039
46096
  const runAbortController = new AbortController();
46040
- 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"}`);
46041
46098
  await fs$1.mkdir(resolvedWorkspace, { recursive: true });
46042
46099
  const sandboxSessionKey = params.sessionKey?.trim() || params.sessionId;
46043
46100
  const sandbox = await resolveSandboxContext({
@@ -46073,7 +46130,7 @@ async function runEmbeddedAttempt(params) {
46073
46130
  sessionId: params.sessionId,
46074
46131
  warn: makeBootstrapWarn({
46075
46132
  sessionLabel,
46076
- warn: (message) => log$4.warn(message)
46133
+ warn: (message) => log$5.warn(message)
46077
46134
  })
46078
46135
  });
46079
46136
  const workspaceNotes = hookAdjustedBootstrapFiles.some((file) => file.name === DEFAULT_BOOTSTRAP_FILENAME && !file.missing) ? ["Reminder: commit your changes in this workspace after edits."] : void 0;
@@ -46272,7 +46329,7 @@ async function runEmbeddedAttempt(params) {
46272
46329
  try {
46273
46330
  await repairSessionFileIfNeeded({
46274
46331
  sessionFile: params.sessionFile,
46275
- warn: (message) => log$4.warn(message)
46332
+ warn: (message) => log$5.warn(message)
46276
46333
  });
46277
46334
  const hadSessionFile = await fs$1.stat(params.sessionFile).then(() => true).catch(() => false);
46278
46335
  const transcriptPolicy = resolveTranscriptPolicy({
@@ -46281,7 +46338,7 @@ async function runEmbeddedAttempt(params) {
46281
46338
  modelId: params.modelId
46282
46339
  });
46283
46340
  const versionCheck = await handleSessionVersion(params.sessionFile);
46284
- 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}`);
46285
46342
  await prewarmSessionFile(params.sessionFile);
46286
46343
  sessionManager = guardSessionManager(SessionManager.open(params.sessionFile), {
46287
46344
  agentId: sessionAgentId,
@@ -46533,6 +46590,9 @@ async function runEmbeddedAttempt(params) {
46533
46590
  });
46534
46591
  };
46535
46592
  const streamMonitor = createStreamMonitor(modelProfile);
46593
+ const TOOL_ERROR_ABORT_THRESHOLD = 5;
46594
+ const TOOL_ERROR_WARN_THRESHOLD = 3;
46595
+ let consecutiveToolErrors = 0;
46536
46596
  const subscription = subscribeEmbeddedPiSession({
46537
46597
  session: activeSession,
46538
46598
  runId: params.runId,
@@ -46554,9 +46614,25 @@ async function runEmbeddedAttempt(params) {
46554
46614
  onAgentEvent: (evt) => {
46555
46615
  armSymipulseTimer();
46556
46616
  params.onAgentEvent?.(evt);
46617
+ if (evt.stream === "tool" && !aborted) {
46618
+ const phase = typeof evt.data?.phase === "string" ? evt.data.phase : "";
46619
+ const isError = evt.data?.isError === true;
46620
+ if (phase === "result") {
46621
+ if (isError) consecutiveToolErrors++;
46622
+ else consecutiveToolErrors = 0;
46623
+ if (consecutiveToolErrors >= TOOL_ERROR_ABORT_THRESHOLD) {
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
+ }
46631
+ }
46632
+ }
46557
46633
  if (evt.stream === "assistant" && typeof evt.data?.text === "string" && !aborted) {
46558
46634
  streamMonitor.onChunk(evt.data.text);
46559
- 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()}`);
46560
46636
  }
46561
46637
  },
46562
46638
  enforceFinalTag: params.enforceFinalTag,
@@ -46576,7 +46652,7 @@ async function runEmbeddedAttempt(params) {
46576
46652
  let abortWarnTimer;
46577
46653
  const isProbeSession = params.sessionId?.startsWith("probe-") ?? false;
46578
46654
  const abortTimer = setTimeout(() => {
46579
- 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}`);
46580
46656
  if (shouldFlagCompactionTimeout({
46581
46657
  isTimeout: true,
46582
46658
  isCompactionPendingOrRetrying: subscription.isCompacting(),
@@ -46585,7 +46661,7 @@ async function runEmbeddedAttempt(params) {
46585
46661
  abortRun(true);
46586
46662
  if (!abortWarnTimer) abortWarnTimer = setTimeout(() => {
46587
46663
  if (!activeSession.isStreaming) return;
46588
- 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}`);
46589
46665
  }, 1e4);
46590
46666
  }, Math.max(1, params.timeoutMs));
46591
46667
  armSymipulseTimer = () => {
@@ -46593,7 +46669,7 @@ async function runEmbeddedAttempt(params) {
46593
46669
  clearSymipulseTimer();
46594
46670
  symipulseTimer = setTimeout(() => {
46595
46671
  if (aborted) return;
46596
- 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)`);
46597
46673
  if (shouldFlagCompactionTimeout({
46598
46674
  isTimeout: true,
46599
46675
  isCompactionPendingOrRetrying: subscription.isCompacting(),
@@ -46637,13 +46713,13 @@ async function runEmbeddedAttempt(params) {
46637
46713
  prompt: params.prompt,
46638
46714
  messages: activeSession.messages
46639
46715
  }, hookCtx).catch((hookErr) => {
46640
- log$4.warn(`before_prompt_build hook failed: ${String(hookErr)}`);
46716
+ log$5.warn(`before_prompt_build hook failed: ${String(hookErr)}`);
46641
46717
  }) : void 0;
46642
46718
  const legacyResult = hookRunner?.hasHooks("before_agent_start") ? await hookRunner.runBeforeAgentStart({
46643
46719
  prompt: params.prompt,
46644
46720
  messages: activeSession.messages
46645
46721
  }, hookCtx).catch((hookErr) => {
46646
- 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)}`);
46647
46723
  }) : void 0;
46648
46724
  const hookResult = {
46649
46725
  systemPrompt: promptBuildResult?.systemPrompt ?? legacyResult?.systemPrompt,
@@ -46651,7 +46727,7 @@ async function runEmbeddedAttempt(params) {
46651
46727
  };
46652
46728
  if (hookResult?.prependContext) {
46653
46729
  effectivePrompt = `${hookResult.prependContext}\n\n${params.prompt}`;
46654
- 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)`);
46655
46731
  }
46656
46732
  {
46657
46733
  const autoRecallAgentId = normalizeAgentId(params.sessionKey);
@@ -46668,11 +46744,11 @@ async function runEmbeddedAttempt(params) {
46668
46744
  if (recallResults.length > 0) {
46669
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>`;
46670
46746
  effectivePrompt = `${recallBlock}\n\n${effectivePrompt}`;
46671
- 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)`);
46672
46748
  }
46673
46749
  }
46674
46750
  } catch (recallErr) {
46675
- log$4.debug(`auto-recall: skipped (${String(recallErr)})`);
46751
+ log$5.debug(`auto-recall: skipped (${String(recallErr)})`);
46676
46752
  }
46677
46753
  }
46678
46754
  {
@@ -46684,10 +46760,10 @@ async function runEmbeddedAttempt(params) {
46684
46760
  if (planResult.enter) {
46685
46761
  if (planResult.stripped != null) effectivePrompt = planResult.stripped;
46686
46762
  effectivePrompt = `${PLAN_MODE_SYSTEM_PROMPT}\n\n${effectivePrompt}`;
46687
- 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}`);
46688
46764
  } else if (planResult.stripped != null) effectivePrompt = planResult.stripped;
46689
46765
  }
46690
- 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}`);
46691
46767
  cacheTrace?.recordStage("prompt:before", {
46692
46768
  prompt: effectivePrompt,
46693
46769
  messages: activeSession.messages
@@ -46699,7 +46775,7 @@ async function runEmbeddedAttempt(params) {
46699
46775
  const sessionContext = sessionManager.buildSessionContext();
46700
46776
  const sanitizedOrphan = transcriptPolicy.sanitizeThinkingSignatures ? sanitizeAntigravityThinkingBlocks(sessionContext.messages) : sessionContext.messages;
46701
46777
  activeSession.agent.replaceMessages(sanitizedOrphan);
46702
- 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}`);
46703
46779
  }
46704
46780
  try {
46705
46781
  const imageResult = await detectAndLoadPromptImages({
@@ -46721,12 +46797,12 @@ async function runEmbeddedAttempt(params) {
46721
46797
  messages: activeSession.messages,
46722
46798
  note: `images: prompt=${imageResult.images.length} history=${imageResult.historyImagesByIndex.size}`
46723
46799
  });
46724
- if (log$4.isEnabled("debug")) {
46800
+ if (log$5.isEnabled("debug")) {
46725
46801
  const msgCount = activeSession.messages.length;
46726
46802
  const systemLen = systemPromptText?.length ?? 0;
46727
46803
  const promptLen = effectivePrompt.length;
46728
46804
  const sessionSummary = summarizeSessionContext(activeSession.messages);
46729
- 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}`);
46730
46806
  }
46731
46807
  if (hookRunner?.hasHooks("llm_input")) hookRunner.runLlmInput({
46732
46808
  runId: params.runId,
@@ -46744,7 +46820,7 @@ async function runEmbeddedAttempt(params) {
46744
46820
  workspaceDir: params.workspaceDir,
46745
46821
  messageProvider: params.messageProvider ?? void 0
46746
46822
  }).catch((err) => {
46747
- log$4.warn(`llm_input hook failed: ${String(err)}`);
46823
+ log$5.warn(`llm_input hook failed: ${String(err)}`);
46748
46824
  });
46749
46825
  if (imageResult.images.length > 0) await abortable(activeSession.prompt(effectivePrompt, { images: imageResult.images }));
46750
46826
  else await abortable(activeSession.prompt(effectivePrompt));
@@ -46752,7 +46828,7 @@ async function runEmbeddedAttempt(params) {
46752
46828
  promptError = err;
46753
46829
  promptErrorSource = "prompt";
46754
46830
  } finally {
46755
- 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}`);
46756
46832
  }
46757
46833
  const wasCompactingBefore = activeSession.isCompacting;
46758
46834
  const snapshot = activeSession.messages.slice();
@@ -46767,7 +46843,7 @@ async function runEmbeddedAttempt(params) {
46767
46843
  promptError = err;
46768
46844
  promptErrorSource = "compaction";
46769
46845
  }
46770
- 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}`);
46771
46847
  } else throw err;
46772
46848
  }
46773
46849
  if (!timedOutDuringCompaction) {
@@ -46785,7 +46861,7 @@ async function runEmbeddedAttempt(params) {
46785
46861
  currentSessionId: activeSession.sessionId
46786
46862
  });
46787
46863
  if (timedOutDuringCompaction) {
46788
- 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}`);
46789
46865
  }
46790
46866
  messagesSnapshot = snapshotSelection.messagesSnapshot;
46791
46867
  sessionIdUsed = snapshotSelection.sessionIdUsed;
@@ -46800,7 +46876,7 @@ async function runEmbeddedAttempt(params) {
46800
46876
  error: describeUnknownError(promptError)
46801
46877
  });
46802
46878
  } catch (entryErr) {
46803
- log$4.warn(`failed to persist prompt error entry: ${String(entryErr)}`);
46879
+ log$5.warn(`failed to persist prompt error entry: ${String(entryErr)}`);
46804
46880
  }
46805
46881
  cacheTrace?.recordStage("session:after", {
46806
46882
  messages: messagesSnapshot,
@@ -46819,17 +46895,17 @@ async function runEmbeddedAttempt(params) {
46819
46895
  workspaceDir: params.workspaceDir,
46820
46896
  messageProvider: params.messageProvider ?? void 0
46821
46897
  }).catch((err) => {
46822
- log$4.warn(`agent_end hook failed: ${err}`);
46898
+ log$5.warn(`agent_end hook failed: ${err}`);
46823
46899
  });
46824
46900
  } finally {
46825
46901
  clearTimeout(abortTimer);
46826
46902
  clearSymipulseTimer();
46827
46903
  if (abortWarnTimer) clearTimeout(abortWarnTimer);
46828
- 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}`);
46829
46905
  try {
46830
46906
  unsubscribe();
46831
46907
  } catch (err) {
46832
- 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)}`);
46833
46909
  }
46834
46910
  clearActiveEmbeddedRun(params.sessionId, queueHandle, params.sessionKey);
46835
46911
  params.abortSignal?.removeEventListener?.("abort", onAbort);
@@ -46854,7 +46930,7 @@ async function runEmbeddedAttempt(params) {
46854
46930
  workspaceDir: params.workspaceDir,
46855
46931
  messageProvider: params.messageProvider ?? void 0
46856
46932
  }).catch((err) => {
46857
- log$4.warn(`llm_output hook failed: ${String(err)}`);
46933
+ log$5.warn(`llm_output hook failed: ${String(err)}`);
46858
46934
  });
46859
46935
  return {
46860
46936
  aborted,
@@ -47115,7 +47191,7 @@ async function runEmbeddedPiAgent(params) {
47115
47191
  const redactedSessionId = redactRunIdentifier(params.sessionId);
47116
47192
  const redactedSessionKey = redactRunIdentifier(params.sessionKey);
47117
47193
  const redactedWorkspace = redactRunIdentifier(resolvedWorkspace);
47118
- 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}`);
47119
47195
  const prevCwd = process.cwd();
47120
47196
  let provider = (params.provider ?? DEFAULT_PROVIDER).trim() || DEFAULT_PROVIDER;
47121
47197
  let modelId = (params.model ?? DEFAULT_MODEL).trim() || DEFAULT_MODEL;
@@ -47134,7 +47210,7 @@ async function runEmbeddedPiAgent(params) {
47134
47210
  if (hookRunner?.hasHooks("before_model_resolve")) try {
47135
47211
  modelResolveOverride = await hookRunner.runBeforeModelResolve({ prompt: params.prompt }, hookCtx);
47136
47212
  } catch (hookErr) {
47137
- log$4.warn(`before_model_resolve hook failed: ${String(hookErr)}`);
47213
+ log$5.warn(`before_model_resolve hook failed: ${String(hookErr)}`);
47138
47214
  }
47139
47215
  if (hookRunner?.hasHooks("before_agent_start")) try {
47140
47216
  const legacyResult = await hookRunner.runBeforeAgentStart({ prompt: params.prompt }, hookCtx);
@@ -47143,15 +47219,15 @@ async function runEmbeddedPiAgent(params) {
47143
47219
  modelOverride: modelResolveOverride?.modelOverride ?? legacyResult?.modelOverride
47144
47220
  };
47145
47221
  } catch (hookErr) {
47146
- 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)}`);
47147
47223
  }
47148
47224
  if (modelResolveOverride?.providerOverride) {
47149
47225
  provider = modelResolveOverride.providerOverride;
47150
- log$4.info(`[hooks] provider overridden to ${provider}`);
47226
+ log$5.info(`[hooks] provider overridden to ${provider}`);
47151
47227
  }
47152
47228
  if (modelResolveOverride?.modelOverride) {
47153
47229
  modelId = modelResolveOverride.modelOverride;
47154
- log$4.info(`[hooks] model overridden to ${modelId}`);
47230
+ log$5.info(`[hooks] model overridden to ${modelId}`);
47155
47231
  }
47156
47232
  const { model, error, authStorage, modelRegistry } = resolveModel(provider, modelId, agentDir, params.config);
47157
47233
  if (!model) throw new FailoverError(error ?? `Unknown model: ${provider}/${modelId}`, {
@@ -47171,9 +47247,9 @@ async function runEmbeddedPiAgent(params) {
47171
47247
  warnBelowTokens: CONTEXT_WINDOW_WARN_BELOW_TOKENS,
47172
47248
  hardMinTokens: CONTEXT_WINDOW_HARD_MIN_TOKENS
47173
47249
  });
47174
- 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}`);
47175
47251
  if (ctxGuard.shouldBlock) {
47176
- 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}`);
47177
47253
  throw new FailoverError(`Model context window too small (${ctxGuard.tokens} tokens). Minimum is ${CONTEXT_WINDOW_HARD_MIN_TOKENS}.`, {
47178
47254
  reason: "unknown",
47179
47255
  provider,
@@ -47303,7 +47379,7 @@ async function runEmbeddedPiAgent(params) {
47303
47379
  while (true) {
47304
47380
  if (runLoopIterations >= MAX_RUN_LOOP_ITERATIONS) {
47305
47381
  const message = `Exceeded retry limit after ${runLoopIterations} attempts (max=${MAX_RUN_LOOP_ITERATIONS}).`;
47306
- 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}`);
47307
47383
  return {
47308
47384
  payloads: [{
47309
47385
  text: "Request failed after repeated internal retries. Please try again, or use /new to start a fresh session.",
@@ -47424,18 +47500,18 @@ async function runEmbeddedPiAgent(params) {
47424
47500
  const overflowDiagId = createCompactionDiagId$1();
47425
47501
  const errorText = contextOverflowError.text;
47426
47502
  const msgCount = attempt.messagesSnapshot?.length ?? 0;
47427
- 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)}`);
47428
47504
  const isCompactionFailure = isCompactionFailureError(errorText);
47429
47505
  const hadAttemptLevelCompaction = attemptCompactionCount > 0;
47430
47506
  if (!isCompactionFailure && hadAttemptLevelCompaction && overflowCompactionAttempts < MAX_OVERFLOW_COMPACTION_ATTEMPTS) {
47431
47507
  overflowCompactionAttempts++;
47432
- 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}`);
47433
47509
  continue;
47434
47510
  }
47435
47511
  if (!isCompactionFailure && !hadAttemptLevelCompaction && overflowCompactionAttempts < MAX_OVERFLOW_COMPACTION_ATTEMPTS) {
47436
- 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}`);
47437
47513
  overflowCompactionAttempts++;
47438
- 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}`);
47439
47515
  const compactResult = await compactEmbeddedPiSessionDirect({
47440
47516
  sessionId: params.sessionId,
47441
47517
  sessionKey: params.sessionKey,
@@ -47464,10 +47540,10 @@ async function runEmbeddedPiAgent(params) {
47464
47540
  });
47465
47541
  if (compactResult.compacted) {
47466
47542
  autoCompactionCount += 1;
47467
- log$4.info(`auto-compaction succeeded for ${provider}/${modelId}; retrying prompt`);
47543
+ log$5.info(`auto-compaction succeeded for ${provider}/${modelId}; retrying prompt`);
47468
47544
  continue;
47469
47545
  }
47470
- 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"}`);
47471
47547
  }
47472
47548
  if (!toolResultTruncationAttempted) {
47473
47549
  const contextWindowTokens = ctxInfo.tokens;
@@ -47476,9 +47552,9 @@ async function runEmbeddedPiAgent(params) {
47476
47552
  contextWindowTokens
47477
47553
  }) : false;
47478
47554
  if (hasOversized) {
47479
- 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}`);
47480
47556
  toolResultTruncationAttempted = true;
47481
- 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)`);
47482
47558
  const truncResult = await truncateOversizedToolResultsInSession({
47483
47559
  sessionFile: params.sessionFile,
47484
47560
  contextWindowTokens,
@@ -47486,13 +47562,13 @@ async function runEmbeddedPiAgent(params) {
47486
47562
  sessionKey: params.sessionKey
47487
47563
  });
47488
47564
  if (truncResult.truncated) {
47489
- 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`);
47490
47566
  continue;
47491
47567
  }
47492
- log$4.warn(`[context-overflow-recovery] Tool result truncation did not help: ${truncResult.reason ?? "unknown"}`);
47493
- } 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}`);
47494
47570
  }
47495
- 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}`);
47496
47572
  const kind = isCompactionFailure ? "compaction_failure" : "context_overflow";
47497
47573
  return {
47498
47574
  payloads: [{
@@ -47573,7 +47649,7 @@ async function runEmbeddedPiAgent(params) {
47573
47649
  attempted: attemptedThinking
47574
47650
  });
47575
47651
  if (fallbackThinking) {
47576
- 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}`);
47577
47653
  thinkLevel = fallbackThinking;
47578
47654
  continue;
47579
47655
  }
@@ -47591,7 +47667,7 @@ async function runEmbeddedPiAgent(params) {
47591
47667
  attempted: attemptedThinking
47592
47668
  });
47593
47669
  if (fallbackThinking && !aborted) {
47594
- 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}`);
47595
47671
  thinkLevel = fallbackThinking;
47596
47672
  continue;
47597
47673
  }
@@ -47608,7 +47684,7 @@ async function runEmbeddedPiAgent(params) {
47608
47684
  imageDimensionError.contentIndex !== void 0 ? `content=${imageDimensionError.contentIndex}` : null,
47609
47685
  imageDimensionError.maxDimensionPx !== void 0 ? `limit=${imageDimensionError.maxDimensionPx}px` : null
47610
47686
  ].filter(Boolean).join(" ");
47611
- log$4.warn(`Profile ${lastProfileId} rejected image payload${details ? ` (${details})` : ""}.`);
47687
+ log$5.warn(`Profile ${lastProfileId} rejected image payload${details ? ` (${details})` : ""}.`);
47612
47688
  }
47613
47689
  const isLocalOllamaTimeout = timedOut && model.api === "ollama";
47614
47690
  if (!aborted && failoverFailure || timedOut && !timedOutDuringCompaction && !isLocalOllamaTimeout) {
@@ -47620,8 +47696,8 @@ async function runEmbeddedPiAgent(params) {
47620
47696
  cfg: params.config,
47621
47697
  agentDir: params.agentDir
47622
47698
  });
47623
- if (timedOut && !isProbeSession) log$4.warn(`Profile ${lastProfileId} timed out (possible rate limit). Trying next account...`);
47624
- 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.`);
47625
47701
  }
47626
47702
  if (await advanceAuthProfile()) continue;
47627
47703
  if (fallbackConfigured) {
@@ -47687,7 +47763,7 @@ async function runEmbeddedPiAgent(params) {
47687
47763
  const hasCodeBlocks = attempt.assistantTexts.some((text) => /```[\s\S]*?```/.test(text));
47688
47764
  if (hasCodeToolUsage || hasCodeBlocks) {
47689
47765
  verificationPassCompleted = true;
47690
- 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"}`);
47691
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.";
47692
47768
  try {
47693
47769
  const verifyAttempt = await runEmbeddedAttempt({
@@ -47773,10 +47849,10 @@ async function runEmbeddedPiAgent(params) {
47773
47849
  payloads.length = 0;
47774
47850
  payloads.push(...verifyPayloads);
47775
47851
  }
47776
- log$4.debug(`[verification] verification produced corrections: runId=${params.runId} tools=${verifyAttempt.toolMetas.length} texts=${verifyAttempt.assistantTexts.length}`);
47777
- } 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}`);
47778
47854
  } catch (verifyErr) {
47779
- 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)}`);
47780
47856
  }
47781
47857
  }
47782
47858
  }
@@ -47797,7 +47873,7 @@ async function runEmbeddedPiAgent(params) {
47797
47873
  messagingToolSentTargets: attempt.messagingToolSentTargets,
47798
47874
  successfulCronAdds: attempt.successfulCronAdds
47799
47875
  };
47800
- 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}`);
47801
47877
  if (lastProfileId) {
47802
47878
  await markAuthProfileGood({
47803
47879
  store: authStore,
@@ -60518,7 +60594,7 @@ function isVoiceChannelType(type) {
60518
60594
  function createDefaultDeps() {
60519
60595
  return {
60520
60596
  sendMessageWhatsApp: async (...args) => {
60521
- const { sendMessageWhatsApp } = await import("./web-D4qJ9XKP.js");
60597
+ const { sendMessageWhatsApp } = await import("./web-LUMjboLF.js");
60522
60598
  return await sendMessageWhatsApp(...args);
60523
60599
  },
60524
60600
  sendMessageTelegram: async (...args) => {
@@ -75798,7 +75874,7 @@ function loadWebLoginQr() {
75798
75874
  return webLoginQrPromise;
75799
75875
  }
75800
75876
  function loadWebChannel() {
75801
- webChannelPromise ??= import("./web-D4qJ9XKP.js");
75877
+ webChannelPromise ??= import("./web-LUMjboLF.js");
75802
75878
  return webChannelPromise;
75803
75879
  }
75804
75880
  function loadWhatsAppActions() {
@@ -78154,7 +78230,7 @@ async function compactEmbeddedPiSessionDirect(params) {
78154
78230
  const provider = (params.provider ?? DEFAULT_PROVIDER).trim() || DEFAULT_PROVIDER;
78155
78231
  const modelId = (params.model ?? DEFAULT_MODEL).trim() || DEFAULT_MODEL;
78156
78232
  const fail = (reason) => {
78157
- 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}`);
78158
78234
  return {
78159
78235
  ok: false,
78160
78236
  compacted: false,
@@ -78222,7 +78298,7 @@ async function compactEmbeddedPiSessionDirect(params) {
78222
78298
  sessionId: params.sessionId,
78223
78299
  warn: makeBootstrapWarn({
78224
78300
  sessionLabel,
78225
- warn: (message) => log$4.warn(message)
78301
+ warn: (message) => log$5.warn(message)
78226
78302
  })
78227
78303
  });
78228
78304
  const runAbortController = new AbortController();
@@ -78362,7 +78438,7 @@ async function compactEmbeddedPiSessionDirect(params) {
78362
78438
  try {
78363
78439
  await repairSessionFileIfNeeded({
78364
78440
  sessionFile: params.sessionFile,
78365
- warn: (message) => log$4.warn(message)
78441
+ warn: (message) => log$5.warn(message)
78366
78442
  });
78367
78443
  await prewarmSessionFile(params.sessionFile);
78368
78444
  const transcriptPolicy = resolveTranscriptPolicy({
@@ -78447,13 +78523,13 @@ async function compactEmbeddedPiSessionDirect(params) {
78447
78523
  messages: preCompactionMessages,
78448
78524
  sessionFile: params.sessionFile
78449
78525
  }, hookCtx).catch((hookErr) => {
78450
- log$4.warn(`before_compaction hook failed: ${String(hookErr)}`);
78526
+ log$5.warn(`before_compaction hook failed: ${String(hookErr)}`);
78451
78527
  });
78452
- const diagEnabled = log$4.isEnabled("debug");
78528
+ const diagEnabled = log$5.isEnabled("debug");
78453
78529
  const preMetrics = diagEnabled ? summarizeCompactionMessages(session.messages) : void 0;
78454
78530
  if (diagEnabled && preMetrics) {
78455
- 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"}`);
78456
- 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)}`);
78457
78533
  }
78458
78534
  const compactStartedAt = Date.now();
78459
78535
  const result = await compactWithSafetyTimeout(() => session.compact(params.customInstructions));
@@ -78471,10 +78547,10 @@ async function compactEmbeddedPiSessionDirect(params) {
78471
78547
  compactedCount: limited.length - session.messages.length,
78472
78548
  sessionFile: params.sessionFile
78473
78549
  }, hookCtx).catch((hookErr) => {
78474
- log$4.warn(`after_compaction hook failed: ${hookErr}`);
78550
+ log$5.warn(`after_compaction hook failed: ${hookErr}`);
78475
78551
  });
78476
78552
  const postMetrics = diagEnabled ? summarizeCompactionMessages(session.messages) : void 0;
78477
- 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"}`);
78478
78554
  return {
78479
78555
  ok: true,
78480
78556
  compacted: true,