@symerian/symi 3.0.6 → 3.0.7

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 (157) hide show
  1. package/dist/{agents-gbr-1Je_.js → agents-CFKyEJDh.js} +4 -4
  2. package/dist/{agents.config-CpxstSW7.js → agents.config-DSrQ0TM2.js} +1 -1
  3. package/dist/{agents.config-BfNlwhop.js → agents.config-JYh7a1x9.js} +1 -1
  4. package/dist/{auth-choice-54kgymsK.js → auth-choice-BPmdR0Zg.js} +1 -1
  5. package/dist/{auth-choice-D-6X8Ju1.js → auth-choice-BqParF2V.js} +1 -1
  6. package/dist/{banner-a-SFB2A_.js → banner-Lq52Hf1m.js} +1 -1
  7. package/dist/build-info.json +3 -3
  8. package/dist/bundled/boot-md/handler.js +2 -2
  9. package/dist/bundled/session-memory/handler.js +2 -2
  10. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  11. package/dist/{channel-options-LdOWOuGF.js → channel-options-DbwyNFsd.js} +1 -1
  12. package/dist/{channel-options-Gr9E4Kzw.js → channel-options-uukUHxrR.js} +1 -1
  13. package/dist/{channel-web-CegzhXtr.js → channel-web-CBUFAaN-.js} +1 -1
  14. package/dist/{channels-cli-yEaXg9E8.js → channels-cli-DUwg4n9o.js} +6 -6
  15. package/dist/{channels-cli-BqxfCcHJ.js → channels-cli-DwWkhoS-.js} +6 -6
  16. package/dist/{cli-frCx1q0g.js → cli-BK00_StG.js} +3 -3
  17. package/dist/{cli-CBgbuAgA.js → cli-DZZmysLn.js} +3 -3
  18. package/dist/{command-registry-BuNPoTgT.js → command-registry-DPjt2ua4.js} +10 -10
  19. package/dist/{completion-cli-CslG8pRZ.js → completion-cli-DUHXuBGj.js} +2 -2
  20. package/dist/{completion-cli-CtslzC-3.js → completion-cli-Jc5c91D9.js} +1 -1
  21. package/dist/{config-cli-DG0Q2opp.js → config-cli-CfqGGDZJ.js} +1 -1
  22. package/dist/{config-cli-Bne_ToTi.js → config-cli-Chi8-vDl.js} +1 -1
  23. package/dist/{configure-CrUroh9h.js → configure-CpVWXUGL.js} +3 -3
  24. package/dist/{configure-DVEumX9d.js → configure-n6QOImwq.js} +3 -3
  25. package/dist/{doctor-completion-BdPD9NXi.js → doctor-completion-DRSIyjR1.js} +1 -1
  26. package/dist/{doctor-completion-C7FYoFcz.js → doctor-completion-efxxrdhl.js} +1 -1
  27. package/dist/entry.js +1 -1
  28. package/dist/extensionAPI.js +2 -2
  29. package/dist/{gateway-cli-C01t6lTD.js → gateway-cli-5x14dzdY.js} +12 -12
  30. package/dist/{gateway-cli-C3pl_TOb.js → gateway-cli-C9oE1hBq.js} +12 -12
  31. package/dist/{glass-ui-ws-DdfAZRq2.js → glass-ui-ws-CSvguyD3.js} +10 -10
  32. package/dist/{glass-ui-ws-D4FpSEkk.js → glass-ui-ws-Dy9BMqps.js} +10 -10
  33. package/dist/{health-BJOdskDn.js → health-CMNaNxdO.js} +2 -2
  34. package/dist/{health-Ux1rRtE3.js → health-CcIuOt6-.js} +2 -2
  35. package/dist/{heartbeat-visibility-BOc3XHJM.js → heartbeat-visibility-C1vHOBwO.js} +1 -1
  36. package/dist/{heartbeat-visibility-DiKuGlXT.js → heartbeat-visibility-D7nLp3pi.js} +1 -1
  37. package/dist/{hooks-cli-QOqeVacd.js → hooks-cli-BJBRRQxq.js} +4 -4
  38. package/dist/{hooks-cli-C4qRn2e6.js → hooks-cli-Lu13tVB5.js} +4 -4
  39. package/dist/index.js +9 -9
  40. package/dist/llm-slug-generator.js +2 -2
  41. package/dist/{manager-H_Xir_av.js → manager-CpueNJtZ.js} +1 -1
  42. package/dist/{manager-OL6o99xD.js → manager-DrpXfTr8.js} +1 -1
  43. package/dist/{manager-DdfJ-DW0.js → manager-_IXN4-V8.js} +1 -1
  44. package/dist/{manager-D7uDkX3d.js → manager-ba9NOjzn.js} +1 -1
  45. package/dist/{memory-cli-CEvfDody.js → memory-cli-CFc9bXRp.js} +3 -3
  46. package/dist/{memory-cli-BFgNzW3D.js → memory-cli-LV7-59SK.js} +3 -3
  47. package/dist/{models-Bf1Qgxcd.js → models-BB9yLhYJ.js} +2 -2
  48. package/dist/{models-cli-C-yQI9uO.js → models-cli-RtPAmw2C.js} +4 -4
  49. package/dist/{models-cli-IPj8YpFi.js → models-cli-trgrhp5d.js} +5 -5
  50. package/dist/{onboard-D3RCwOQV.js → onboard-CQ-O5iJq.js} +2 -2
  51. package/dist/{onboard-DxD7tZro.js → onboard-DHXKRs-D.js} +2 -2
  52. package/dist/{onboard-channels-C9yhPSG7.js → onboard-channels-jMIN_VEb.js} +1 -1
  53. package/dist/{onboard-channels-DjyTcloL.js → onboard-channels-puKAWnzj.js} +1 -1
  54. package/dist/{onboarding-3Zmxzq_U.js → onboarding-B-gCsRKr.js} +3 -3
  55. package/dist/{onboarding-BT5x19Ld.js → onboarding-C0pJSLCL.js} +3 -3
  56. package/dist/{onboarding.finalize-Di8oo0E9.js → onboarding.finalize-CwYMMBek.js} +8 -8
  57. package/dist/{onboarding.finalize-DYIUxpai.js → onboarding.finalize-TzNrDgVI.js} +9 -9
  58. package/dist/{pi-embedded-DiktDTAb.js → pi-embedded-D9KmgdGY.js} +99 -5
  59. package/dist/{plugin-registry-Dv9QEb6z.js → plugin-registry-B33lS3i0.js} +1 -1
  60. package/dist/{plugin-registry-DSVGT3l_.js → plugin-registry-DzQCMRvf.js} +1 -1
  61. package/dist/plugin-sdk/agents/model-aware-stream.d.ts +21 -0
  62. package/dist/plugin-sdk/{channel-web-CQucEpek.js → channel-web-oG-aaS67.js} +1 -1
  63. package/dist/plugin-sdk/index.js +3 -3
  64. package/dist/plugin-sdk/{manager-DMMQnz2r.js → manager-hfHALsDs.js} +1 -1
  65. package/dist/plugin-sdk/{synthesis-B3oSNA87.js → synthesis-BWBeCBqa.js} +2 -2
  66. package/dist/plugin-sdk/{unified-runner-DPD66ppH.js → unified-runner-CZE3p9mg.js} +99 -5
  67. package/dist/plugin-sdk/{web-O8zxjM0h.js → web-CD_2TcPx.js} +3 -3
  68. package/dist/{plugins-cli-BKE00xaA.js → plugins-cli-BH-dPouA.js} +4 -4
  69. package/dist/{plugins-cli-Cudgx5xM.js → plugins-cli-D7SeopUy.js} +4 -4
  70. package/dist/{program-D6GycU7K.js → program-CbKSDUST.js} +9 -9
  71. package/dist/{program-context-DUf2HkNT.js → program-context-ClWlMpYr.js} +18 -18
  72. package/dist/{prompt-select-styled-MZgg9luq.js → prompt-select-styled-CM2KCKfA.js} +6 -6
  73. package/dist/{prompt-select-styled-9fffbtA8.js → prompt-select-styled-CdC8Q0fu.js} +6 -6
  74. package/dist/{provider-auth-helpers-CbjDDek6.js → provider-auth-helpers-Brx0zsB4.js} +1 -1
  75. package/dist/{provider-auth-helpers-CH_rD9Ck.js → provider-auth-helpers-Df50nCNL.js} +1 -1
  76. package/dist/{push-apns-D2xhFnz-.js → push-apns-CXP9q39j.js} +1 -1
  77. package/dist/{push-apns-zIsKDi4p.js → push-apns-jE3kPG6g.js} +1 -1
  78. package/dist/{register.agent-BkQdGAxf.js → register.agent-DGwbPjex.js} +7 -7
  79. package/dist/{register.agent-CR1I0Nxi.js → register.agent-DzQtVgfQ.js} +8 -8
  80. package/dist/{register.configure-CIbNs3Ys.js → register.configure-B56gsKYf.js} +9 -9
  81. package/dist/{register.configure-O5fmbHql.js → register.configure-BQ1gQQOO.js} +9 -9
  82. package/dist/{register.maintenance-B6o6Fdf-.js → register.maintenance-DLsCNL7g.js} +11 -11
  83. package/dist/{register.maintenance-BjE-lDkf.js → register.maintenance-mKHTp7uq.js} +10 -10
  84. package/dist/{register.message-DkZC56-E.js → register.message--QXkhXHQ.js} +4 -4
  85. package/dist/{register.message-CPV6KKj_.js → register.message-xW7Gic5V.js} +4 -4
  86. package/dist/{register.onboard-DPUx5H9I.js → register.onboard-Cd0kw_oz.js} +7 -7
  87. package/dist/{register.onboard-DB0X3H1H.js → register.onboard-Cxvbpqqb.js} +7 -7
  88. package/dist/{register.setup-BdfIHr44.js → register.setup-C63_l0Z_.js} +7 -7
  89. package/dist/{register.setup-BHGui0h8.js → register.setup-D-WYhPYF.js} +7 -7
  90. package/dist/{register.status-health-sessions-CAr_-YOR.js → register.status-health-sessions-BGA-7IT8.js} +6 -6
  91. package/dist/{register.status-health-sessions-Bx_x7PLI.js → register.status-health-sessions-CsjDghzj.js} +6 -6
  92. package/dist/{register.subclis-Bd9G7Uhk.js → register.subclis-BOf3y4FX.js} +9 -9
  93. package/dist/{run-main-DINwkweo.js → run-main-CG1sYHQC.js} +17 -17
  94. package/dist/{server-methods-D_HpHoWo.js → server-methods-C72ajlYe.js} +9 -9
  95. package/dist/{server-methods-BBiqjTnY.js → server-methods-C_TFp6B4.js} +9 -9
  96. package/dist/{server-node-events-D33Ivpdb.js → server-node-events-BTuwCzuB.js} +4 -4
  97. package/dist/{server-node-events-BBcYbve5.js → server-node-events-Cn5abeER.js} +4 -4
  98. package/dist/{status-CdRoRdX8.js → status-C5RXDLjI.js} +1 -1
  99. package/dist/{status-Do0t7I6P.js → status-CrxGjZwV.js} +3 -3
  100. package/dist/{status-B5SAsM15.js → status-CvJZLdWA.js} +1 -1
  101. package/dist/{status-E8bxgRbF.js → status-DIGJ8-hp.js} +3 -3
  102. package/dist/{subagent-registry-B4gg8TFc.js → subagent-registry-k0ZBnJuU.js} +98 -4
  103. package/dist/{synthesis-BzXl3DdN.js → synthesis-C-rsRpDw.js} +2 -2
  104. package/dist/{synthesis-BuXEOM51.js → synthesis-C3AKD3Nb.js} +2 -2
  105. package/dist/{synthesis-CmoAF3Ks.js → synthesis-D4qwtCYE.js} +3 -3
  106. package/dist/{synthesis-Camc_uQg.js → synthesis-cor0WJGI.js} +3 -3
  107. package/dist/{unified-runner-NjwIEpGt.js → unified-runner-CzxCpDUC.js} +98 -4
  108. package/dist/{unified-runner-Bvqbwaaa.js → unified-runner-Dv9LPnmm.js} +99 -5
  109. package/dist/{update-cli-BmxN561H.js → update-cli-D2Ou3_k5.js} +10 -10
  110. package/dist/{update-cli-DT51XdLt.js → update-cli-DGrOVmGg.js} +11 -11
  111. package/dist/{update-runner-BSHkPRya.js → update-runner-BSDKsvVP.js} +1 -1
  112. package/dist/{update-runner-DObjNXP5.js → update-runner-Bcmd0XnZ.js} +1 -1
  113. package/dist/{web-CWFF4V6q.js → web-CSPcQYqR.js} +2 -2
  114. package/dist/{web-DMJyGxn3.js → web-D9-D09LS.js} +4 -4
  115. package/dist/{web-DNwg0ZOA.js → web-DJqpgWuK.js} +5 -5
  116. package/dist/{web-BPiGXIj5.js → web-gqbdxJga.js} +2 -2
  117. package/extensions/bluebubbles/package.json +1 -1
  118. package/extensions/copilot-proxy/package.json +1 -1
  119. package/extensions/diagnostics-otel/package.json +1 -1
  120. package/extensions/discord/package.json +1 -1
  121. package/extensions/feishu/package.json +1 -1
  122. package/extensions/google-antigravity-auth/package.json +1 -1
  123. package/extensions/google-gemini-cli-auth/package.json +1 -1
  124. package/extensions/googlechat/package.json +1 -1
  125. package/extensions/imessage/package.json +1 -1
  126. package/extensions/irc/package.json +1 -1
  127. package/extensions/learning-loop/package.json +1 -1
  128. package/extensions/line/package.json +1 -1
  129. package/extensions/llm-task/package.json +1 -1
  130. package/extensions/matrix/CHANGELOG.md +6 -0
  131. package/extensions/matrix/package.json +1 -1
  132. package/extensions/mattermost/package.json +1 -1
  133. package/extensions/memory-core/package.json +1 -1
  134. package/extensions/memory-lancedb/package.json +1 -1
  135. package/extensions/minimax-portal-auth/package.json +1 -1
  136. package/extensions/msteams/CHANGELOG.md +6 -0
  137. package/extensions/msteams/package.json +1 -1
  138. package/extensions/nextcloud-talk/package.json +1 -1
  139. package/extensions/nostr/CHANGELOG.md +6 -0
  140. package/extensions/nostr/package.json +1 -1
  141. package/extensions/open-prose/package.json +1 -1
  142. package/extensions/outlook/package.json +1 -1
  143. package/extensions/pipeline/package.json +1 -1
  144. package/extensions/signal/package.json +1 -1
  145. package/extensions/slack/package.json +1 -1
  146. package/extensions/telegram/package.json +1 -1
  147. package/extensions/tlon/package.json +1 -1
  148. package/extensions/twitch/CHANGELOG.md +6 -0
  149. package/extensions/twitch/package.json +1 -1
  150. package/extensions/voice-call/CHANGELOG.md +6 -0
  151. package/extensions/voice-call/package.json +1 -1
  152. package/extensions/whatsapp/package.json +1 -1
  153. package/extensions/zalo/CHANGELOG.md +6 -0
  154. package/extensions/zalo/package.json +1 -1
  155. package/extensions/zalouser/CHANGELOG.md +6 -0
  156. package/extensions/zalouser/package.json +1 -1
  157. package/package.json +1 -1
@@ -223,7 +223,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
223
223
  const { ensureAuthProfileStore } = await import("./auth-profiles-B5Csh1eO.js").then((n) => n.t);
224
224
  const { promptAuthChoiceGrouped } = await import("./auth-choice-prompt-DF6R_pgV.js").then((n) => n.t);
225
225
  const { promptCustomApiConfig } = await import("./onboard-custom-D1bZYymg.js").then((n) => n.r);
226
- const { applyAuthChoice, resolvePreferredProviderForAuthChoice, warnIfModelConfigLooksOff } = await import("./auth-choice-54kgymsK.js").then((n) => n.t);
226
+ const { applyAuthChoice, resolvePreferredProviderForAuthChoice, warnIfModelConfigLooksOff } = await import("./auth-choice-BPmdR0Zg.js").then((n) => n.t);
227
227
  const { applyPrimaryModel, promptDefaultModel } = await import("./model-picker-BO_XjLs5.js").then((n) => n.i);
228
228
  const authStore = ensureAuthProfileStore(void 0, { allowKeychainPrompt: false });
229
229
  const authChoiceFromPrompt = opts.authChoice === void 0;
@@ -276,7 +276,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
276
276
  if (opts.skipChannels ?? opts.skipProviders) await prompter.note("Skipping channel setup.", "Channels");
277
277
  else {
278
278
  const { listChannelPlugins } = await import("./plugins-DTKQE9kt.js").then((n) => n.i);
279
- const { setupChannels } = await import("./onboard-channels-C9yhPSG7.js").then((n) => n.n);
279
+ const { setupChannels } = await import("./onboard-channels-jMIN_VEb.js").then((n) => n.n);
280
280
  const quickstartAllowFromChannels = flow === "quickstart" ? listChannelPlugins().filter((plugin) => plugin.meta.quickstartAllowFrom).map((plugin) => plugin.id) : [];
281
281
  nextConfig = await setupChannels(nextConfig, runtime, prompter, {
282
282
  allowSignalInstall: true,
@@ -302,7 +302,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
302
302
  mode
303
303
  });
304
304
  await writeConfigFile(nextConfig);
305
- const { finalizeOnboardingWizard } = await import("./onboarding.finalize-DYIUxpai.js");
305
+ const { finalizeOnboardingWizard } = await import("./onboarding.finalize-TzNrDgVI.js");
306
306
  const { launchedTui } = await finalizeOnboardingWizard({
307
307
  flow,
308
308
  opts,
@@ -225,7 +225,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
225
225
  const { ensureAuthProfileStore } = await import("./auth-profiles-HXq6s5EV.js").then((n) => n.t);
226
226
  const { promptAuthChoiceGrouped } = await import("./auth-choice-prompt-PeQmwVpp.js").then((n) => n.t);
227
227
  const { promptCustomApiConfig } = await import("./onboard-custom-BZNMW8nN.js").then((n) => n.r);
228
- const { applyAuthChoice, resolvePreferredProviderForAuthChoice, warnIfModelConfigLooksOff } = await import("./auth-choice-D-6X8Ju1.js").then((n) => n.t);
228
+ const { applyAuthChoice, resolvePreferredProviderForAuthChoice, warnIfModelConfigLooksOff } = await import("./auth-choice-BqParF2V.js").then((n) => n.t);
229
229
  const { applyPrimaryModel, promptDefaultModel } = await import("./model-picker-CdgzsHoJ.js").then((n) => n.i);
230
230
  const authStore = ensureAuthProfileStore(void 0, { allowKeychainPrompt: false });
231
231
  const authChoiceFromPrompt = opts.authChoice === void 0;
@@ -278,7 +278,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
278
278
  if (opts.skipChannels ?? opts.skipProviders) await prompter.note("Skipping channel setup.", "Channels");
279
279
  else {
280
280
  const { listChannelPlugins } = await import("./plugins-BL5D1_sT.js").then((n) => n.i);
281
- const { setupChannels } = await import("./onboard-channels-DjyTcloL.js").then((n) => n.n);
281
+ const { setupChannels } = await import("./onboard-channels-puKAWnzj.js").then((n) => n.n);
282
282
  const quickstartAllowFromChannels = flow === "quickstart" ? listChannelPlugins().filter((plugin) => plugin.meta.quickstartAllowFrom).map((plugin) => plugin.id) : [];
283
283
  nextConfig = await setupChannels(nextConfig, runtime, prompter, {
284
284
  allowSignalInstall: true,
@@ -304,7 +304,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
304
304
  mode
305
305
  });
306
306
  await writeConfigFile(nextConfig);
307
- const { finalizeOnboardingWizard } = await import("./onboarding.finalize-Di8oo0E9.js");
307
+ const { finalizeOnboardingWizard } = await import("./onboarding.finalize-CwYMMBek.js");
308
308
  const { launchedTui } = await finalizeOnboardingWizard({
309
309
  flow,
310
310
  opts,
@@ -1,7 +1,7 @@
1
1
  import "./paths-Cqn-zk3M.js";
2
2
  import { h as pathExists, y as resolveUserPath } from "./utils-B-0b9bGM.js";
3
3
  import "./tokens-Cz6cgZ7r.js";
4
- import "./unified-runner-NjwIEpGt.js";
4
+ import "./unified-runner-CzxCpDUC.js";
5
5
  import "./registry-ClO_zVv-.js";
6
6
  import { p as restoreTerminalState } from "./subsystem-zqierDLj.js";
7
7
  import "./auth-profiles-HXq6s5EV.js";
@@ -56,8 +56,8 @@ import "./send-DNJPCiwf.js";
56
56
  import "./model-DIO3dH08.js";
57
57
  import "./pi-model-discovery-CXXH7biP.js";
58
58
  import "./reply-prefix-DnXliXio.js";
59
- import "./memory-cli-BFgNzW3D.js";
60
- import "./manager-DdfJ-DW0.js";
59
+ import "./memory-cli-LV7-59SK.js";
60
+ import "./manager-_IXN4-V8.js";
61
61
  import "./gemini-auth-D7Wqp9Ma.js";
62
62
  import "./retry-DYICeae5.js";
63
63
  import "./sqlite-CRogFEk1.js";
@@ -103,18 +103,18 @@ import { b as waitForGatewayReachable, f as openUrl, g as resolveControlUiLinks,
103
103
  import "./prompt-style-CSNJI4MG.js";
104
104
  import "./pairing-labels-6wdVkxUt.js";
105
105
  import "./pi-tools.policy-CQ0NqaBl.js";
106
- import "./heartbeat-visibility-DiKuGlXT.js";
106
+ import "./heartbeat-visibility-D7nLp3pi.js";
107
107
  import "./runtime-guard-dBbuLE2m.js";
108
- import "./program-context-DUf2HkNT.js";
108
+ import "./program-context-ClWlMpYr.js";
109
109
  import "./note-CYS1SoX6.js";
110
- import { r as installCompletion } from "./completion-cli-CtslzC-3.js";
110
+ import { r as installCompletion } from "./completion-cli-Jc5c91D9.js";
111
111
  import { a as gatewayInstallErrorHint, i as buildGatewayInstallPlan, n as GATEWAY_DAEMON_RUNTIME_OPTIONS, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-BR2zWQaj.js";
112
112
  import { r as isSystemdUserServiceAvailable } from "./systemd-z4aO4iTi.js";
113
113
  import { t as resolveGatewayService } from "./service-CW2RUNzh.js";
114
- import { r as healthCommand } from "./health-Ux1rRtE3.js";
114
+ import { r as healthCommand } from "./health-CcIuOt6-.js";
115
115
  import { t as ensureControlUiAssetsBuilt } from "./control-ui-assets-CtKVON4w.js";
116
116
  import { t as formatHealthCheckFailure } from "./health-format-Ct4VWeSk.js";
117
- import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-C7FYoFcz.js";
117
+ import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-efxxrdhl.js";
118
118
  import { t as runTui } from "./tui-Cb1kUTIe.js";
119
119
  import os from "node:os";
120
120
  import path from "node:path";
@@ -15,7 +15,7 @@ import "./client-CJIMV1WD.js";
15
15
  import "./call-DgBbW7bk.js";
16
16
  import "./message-channel-C9dERklz.js";
17
17
  import "./pairing-token-Byh6drgn.js";
18
- import "./subagent-registry-B4gg8TFc.js";
18
+ import "./subagent-registry-k0ZBnJuU.js";
19
19
  import "./sessions-D94fC0u0.js";
20
20
  import "./tokens-BEvOiQ65.js";
21
21
  import "./plugins-DTKQE9kt.js";
@@ -53,8 +53,8 @@ import "./tool-images-CVLISeRT.js";
53
53
  import "./thinking-8sKPnzpp.js";
54
54
  import "./models-config-BEX8iiQb.js";
55
55
  import "./reply-prefix-Pz-5t5RS.js";
56
- import "./memory-cli-CEvfDody.js";
57
- import "./manager-OL6o99xD.js";
56
+ import "./memory-cli-CFc9bXRp.js";
57
+ import "./manager-DrpXfTr8.js";
58
58
  import "./gemini-auth-48fFOTO4.js";
59
59
  import "./retry-C4Q_VPOo.js";
60
60
  import "./sqlite-BP8tiuca.js";
@@ -99,20 +99,20 @@ import { b as waitForGatewayReachable, f as openUrl, g as resolveControlUiLinks,
99
99
  import "./prompt-style-BxVdnrLq.js";
100
100
  import "./pairing-labels-D5bj-6hr.js";
101
101
  import "./pi-tools.policy-Dcon0Kdw.js";
102
- import "./heartbeat-visibility-BOc3XHJM.js";
102
+ import "./heartbeat-visibility-C1vHOBwO.js";
103
103
  import "./note-DewoEWtc.js";
104
- import "./register.subclis-Bd9G7Uhk.js";
105
- import "./command-registry-BuNPoTgT.js";
104
+ import "./register.subclis-BOf3y4FX.js";
105
+ import "./command-registry-DPjt2ua4.js";
106
106
  import "./program-context-DeZ44oQ9.js";
107
- import { r as installCompletion } from "./completion-cli-CslG8pRZ.js";
107
+ import { r as installCompletion } from "./completion-cli-DUHXuBGj.js";
108
108
  import { a as gatewayInstallErrorHint, i as buildGatewayInstallPlan, n as GATEWAY_DAEMON_RUNTIME_OPTIONS, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-zr84-Tnf.js";
109
109
  import "./runtime-guard-BofkqBu7.js";
110
110
  import { r as isSystemdUserServiceAvailable } from "./systemd-CJ5L2ee4.js";
111
111
  import { t as resolveGatewayService } from "./service-RxN7lQKN.js";
112
- import { r as healthCommand } from "./health-BJOdskDn.js";
112
+ import { r as healthCommand } from "./health-CMNaNxdO.js";
113
113
  import { t as ensureControlUiAssetsBuilt } from "./control-ui-assets-DKcwWWGv.js";
114
114
  import { t as formatHealthCheckFailure } from "./health-format-DkjSgkDx.js";
115
- import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-BdPD9NXi.js";
115
+ import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-DRSIyjR1.js";
116
116
  import { t as runTui } from "./tui-lLpf5sOM.js";
117
117
  import os from "node:os";
118
118
  import path from "node:path";
@@ -37,7 +37,7 @@ import { i as resolveSessionTranscriptPath, n as resolveSessionFilePath, o as re
37
37
  import { t as emitSessionTranscriptUpdate } from "./transcript-events-C8Tqw4td.js";
38
38
  import { i as resolveImageSanitizationLimits, n as sanitizeImageBlocks, r as sanitizeToolResultImages } from "./tool-images-CdTyeTEN.js";
39
39
  import { S as ensureSymiModelsJson, _ as stripMinimaxToolCallXml, a as decodeDataUrl, b as stripReasoningTagsFromText, c as extractAssistantText$1, d as extractThinkingFromTaggedText, f as formatReasoningMessage, g as stripDowngradedToolCallText, h as promoteThinkingTagsToBlocks, i as coerceImageModelConfig, l as extractAssistantThinking, m as isAssistantMessage, o as resolveProviderVisionModelFromConfig, p as inferToolMetaFromArgs, r as coerceImageAssistantText, s as minimaxUnderstandImage, u as extractThinkingFromTaggedStream, v as stripThinkingTagsFromText, x as extractTextFromChatContent, y as resolveToolDisplay } from "./image-BwUdkv5g.js";
40
- import { i as resolveMemorySearchConfig, n as probeOllamaEmbeddingModels, r as resolveOllamaBaseUrl } from "./manager-D7uDkX3d.js";
40
+ import { i as resolveMemorySearchConfig, n as probeOllamaEmbeddingModels, r as resolveOllamaBaseUrl } from "./manager-ba9NOjzn.js";
41
41
  import { c as normalizeExtraMemoryPaths, f as runTasksWithConcurrency, s as listMemoryFiles } from "./internal-479FB0St.js";
42
42
  import { n as retryAsync } from "./retry-QGp0jvVi.js";
43
43
  import { a as createActionGate, c as jsonResult, d as readReactionParams, f as readStringArrayParam, l as parseAvailableTags, m as readStringParam, n as missingTargetError, o as imageResult, p as readStringOrNumberParam, r as unknownTargetError, s as imageResultFromFile, t as ambiguousTargetError, u as readNumberParam } from "./target-errors-43lkDH_r.js";
@@ -3473,7 +3473,7 @@ async function getMemorySearchManager(params) {
3473
3473
  const wrapper = new FallbackMemoryManager({
3474
3474
  primary,
3475
3475
  fallbackFactory: async () => {
3476
- const { MemoryIndexManager } = await import("./manager-D7uDkX3d.js").then((n) => n.t);
3476
+ const { MemoryIndexManager } = await import("./manager-ba9NOjzn.js").then((n) => n.t);
3477
3477
  return await MemoryIndexManager.get(params);
3478
3478
  }
3479
3479
  }, () => QMD_MANAGER_CACHE.delete(cacheKey));
@@ -3486,7 +3486,7 @@ async function getMemorySearchManager(params) {
3486
3486
  }
3487
3487
  }
3488
3488
  try {
3489
- const { MemoryIndexManager } = await import("./manager-D7uDkX3d.js").then((n) => n.t);
3489
+ const { MemoryIndexManager } = await import("./manager-ba9NOjzn.js").then((n) => n.t);
3490
3490
  return { manager: await MemoryIndexManager.get(params) };
3491
3491
  } catch (err) {
3492
3492
  return {
@@ -22489,6 +22489,11 @@ function buildAgentSystemPrompt(params) {
22489
22489
  "- Never narrate or quote tool output you did not actually receive from a real tool result. Writing \"I ran X and got Y\" without a corresponding tool invocation is fabrication and breaks user trust.",
22490
22490
  "- For factual local-system lookups (hostname, file contents, process state, env vars, current dir, system info), the answer comes from invoking the appropriate tool — not from priors. Always invoke.",
22491
22491
  "",
22492
+ "Example — when the user explicitly names a tool:",
22493
+ " User: \"Use the exec tool to run: echo hi\"",
22494
+ " Correct: call exec with command=\"echo hi\", then summarise the actual stdout you received.",
22495
+ " Wrong: emit \"hi\" as text without calling exec — that's fabrication.",
22496
+ "",
22492
22497
  ...compactMode ? [] : [
22493
22498
  "## Tool Call Style",
22494
22499
  "Default: do not narrate routine, low-risk tool calls (just call the tool).",
@@ -41604,6 +41609,91 @@ function createOutputNormalizer(profile, modelId) {
41604
41609
  //#endregion
41605
41610
  //#region src/agents/model-aware-stream.ts
41606
41611
  /**
41612
+ * Match imperative tool requests:
41613
+ * "Use the exec tool to run X"
41614
+ * "use exec to ..."
41615
+ * "Please invoke the read tool"
41616
+ * "call memory_search with ..."
41617
+ *
41618
+ * Anchored to start-of-string, start-of-line, or after a closing-bracket
41619
+ * delimiter `] ` (covers Symi's `[Thu 2026-04-30 20:48 EDT] ` timestamp
41620
+ * envelope, the `[Outlook 365] ` plugin banner, and similar prefixes that
41621
+ * gateway middleware can inject before the user's actual prompt — verified
41622
+ * live: `chat.send` from Glass UI ships content like
41623
+ *
41624
+ * Conversation info (untrusted metadata):
41625
+ * ```json
41626
+ * { "message_id": "...", ... }
41627
+ * ```
41628
+ *
41629
+ * [Thu 2026-04-30 20:48 EDT] Use the exec tool to run: hostname
41630
+ *
41631
+ * so the `Use` is preceded by `] ` not by `\n` or `^`).
41632
+ *
41633
+ * Verb list is conservative (use/invoke/call/please-{use,call}) — pure
41634
+ * imperative verbs that read unambiguously as "do this for me." Tool name
41635
+ * must match EXPLICIT_TOOL_NAMES exactly to keep "use poetic language" /
41636
+ * "use clear writing" / etc. from triggering.
41637
+ */
41638
+ const EXPLICIT_TOOL_REQUEST_PATTERN = new RegExp(String.raw`(?:^|\n|\]\s)\s*(?:please\s+)?(?:use|invoke|call)\s+(?:the\s+)?(?:` + [
41639
+ "exec",
41640
+ "bash",
41641
+ "read",
41642
+ "write",
41643
+ "edit",
41644
+ "patch",
41645
+ "web_search",
41646
+ "web_fetch",
41647
+ "browser",
41648
+ "browser_navigate",
41649
+ "browser_snapshot",
41650
+ "browser_click",
41651
+ "browser_type",
41652
+ "memory_search",
41653
+ "memory_get",
41654
+ "memory_pin",
41655
+ "memory_unpin",
41656
+ "spawn_agent",
41657
+ "message",
41658
+ "task_list",
41659
+ "task_cancel",
41660
+ "cron",
41661
+ "fetch",
41662
+ "skill_search"
41663
+ ].map((n) => n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|") + String.raw`)(?:\s+tool)?\b`, "i");
41664
+ /**
41665
+ * Extract the user-role text ONLY when it's the LAST message in the
41666
+ * conversation (i.e., we're at the start of a fresh turn, not in the
41667
+ * middle of an agent loop). Returns "" when:
41668
+ * - messages isn't an array
41669
+ * - the last message isn't user-role (= we're after a tool_call /
41670
+ * tool_result and the model is continuing — forcing tool_choice
41671
+ * "required" here would loop the agent: model must call a tool →
41672
+ * tool result → model must call ANOTHER tool → tool result → ...)
41673
+ *
41674
+ * Verified live on 3.0.7 dev: with the original "find any prior user
41675
+ * message" implementation, every agent-loop iteration saw the same
41676
+ * matching userText and re-forced tool_choice="required", spinning the
41677
+ * model in an infinite tool-call loop and timing out at 180s.
41678
+ */
41679
+ function extractLastUserText(messages) {
41680
+ if (!Array.isArray(messages) || messages.length === 0) return "";
41681
+ const last = messages[messages.length - 1];
41682
+ if (!last || typeof last !== "object") return "";
41683
+ const msg = last;
41684
+ if (msg.role !== "user") return "";
41685
+ if (typeof msg.content === "string") return msg.content;
41686
+ if (Array.isArray(msg.content)) {
41687
+ const parts = [];
41688
+ for (const part of msg.content) if (part && typeof part === "object") {
41689
+ const block = part;
41690
+ if (block.type === "text" && typeof block.text === "string") parts.push(block.text);
41691
+ }
41692
+ return parts.join("\n");
41693
+ }
41694
+ return "";
41695
+ }
41696
+ /**
41607
41697
  * Create a single stream function wrapper that handles all provider-specific
41608
41698
  * param injection via one onPayload hook.
41609
41699
  *
@@ -41651,6 +41741,10 @@ function createModelAwareStreamFn(opts) {
41651
41741
  delete p.store;
41652
41742
  }
41653
41743
  if (Array.isArray(p.tools) && p.tools.length > 0 && p.tool_choice === void 0) p.tool_choice = "auto";
41744
+ if (Array.isArray(p.tools) && p.tools.length > 0 && p.tool_choice === "auto") {
41745
+ const userText = extractLastUserText(p.messages);
41746
+ if (userText && EXPLICIT_TOOL_REQUEST_PATTERN.test(userText)) p.tool_choice = "required";
41747
+ }
41654
41748
  }
41655
41749
  callerOnPayload?.(payload);
41656
41750
  };
@@ -60936,7 +61030,7 @@ function setCliSessionId(entry, provider, sessionId) {
60936
61030
  function createDefaultDeps() {
60937
61031
  return {
60938
61032
  sendMessageWhatsApp: async (...args) => {
60939
- const { sendMessageWhatsApp } = await import("./web-BPiGXIj5.js");
61033
+ const { sendMessageWhatsApp } = await import("./web-gqbdxJga.js");
60940
61034
  return await sendMessageWhatsApp(...args);
60941
61035
  },
60942
61036
  sendMessageTelegram: async (...args) => {
@@ -76216,7 +76310,7 @@ function loadWebLoginQr() {
76216
76310
  return webLoginQrPromise;
76217
76311
  }
76218
76312
  function loadWebChannel() {
76219
- webChannelPromise ??= import("./web-BPiGXIj5.js");
76313
+ webChannelPromise ??= import("./web-gqbdxJga.js");
76220
76314
  return webChannelPromise;
76221
76315
  }
76222
76316
  function loadWhatsAppActions() {
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
- import { s as loadSymiPlugins } from "./unified-runner-NjwIEpGt.js";
2
+ import { s as loadSymiPlugins } from "./unified-runner-CzxCpDUC.js";
3
3
  import { d as getActivePluginRegistry } from "./registry-ClO_zVv-.js";
4
4
  import { t as createSubsystemLogger } from "./subsystem-zqierDLj.js";
5
5
  import { c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId } from "./agent-scope-BajBuriF.js";
@@ -2,7 +2,7 @@ import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
2
  import { M as getActivePluginRegistry, o as createSubsystemLogger } from "./entry.js";
3
3
  import { c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId } from "./agent-scope-xM36I1Em.js";
4
4
  import { i as loadConfig } from "./config-CE_yCGtB.js";
5
- import { m as loadSymiPlugins } from "./subagent-registry-B4gg8TFc.js";
5
+ import { m as loadSymiPlugins } from "./subagent-registry-k0ZBnJuU.js";
6
6
 
7
7
  //#region src/cli/plugin-registry.ts
8
8
  var plugin_registry_exports = /* @__PURE__ */ __exportAll({ ensurePluginRegistryLoaded: () => ensurePluginRegistryLoaded });
@@ -13,6 +13,26 @@
13
13
  import type { StreamFn } from "@mariozechner/pi-agent-core";
14
14
  import type { SymiConfig } from "../config/config.js";
15
15
  import type { ModelProfile } from "../config/model-profiles.js";
16
+ /**
17
+ * Extract the user-role text ONLY when it's the LAST message in the
18
+ * conversation (i.e., we're at the start of a fresh turn, not in the
19
+ * middle of an agent loop). Returns "" when:
20
+ * - messages isn't an array
21
+ * - the last message isn't user-role (= we're after a tool_call /
22
+ * tool_result and the model is continuing — forcing tool_choice
23
+ * "required" here would loop the agent: model must call a tool →
24
+ * tool result → model must call ANOTHER tool → tool result → ...)
25
+ *
26
+ * Verified live on 3.0.7 dev: with the original "find any prior user
27
+ * message" implementation, every agent-loop iteration saw the same
28
+ * matching userText and re-forced tool_choice="required", spinning the
29
+ * model in an infinite tool-call loop and timing out at 180s.
30
+ */
31
+ declare function extractLastUserText(messages: unknown): string;
32
+ /** Exposed for unit tests. */
33
+ export declare const __EXPLICIT_TOOL_REQUEST_PATTERN: RegExp;
34
+ /** Exposed for unit tests. */
35
+ export declare const __extractLastUserText: typeof extractLastUserText;
16
36
  export interface ModelAwareStreamOptions {
17
37
  /** Base streaming function — streamSimple or createOllamaStreamFn. */
18
38
  baseStreamFn?: StreamFn;
@@ -39,3 +59,4 @@ export interface ModelAwareStreamOptions {
39
59
  export declare function createModelAwareStreamFn(opts: ModelAwareStreamOptions): StreamFn;
40
60
  /** Detect vLLM providers by model hints or baseUrl patterns. */
41
61
  export declare function isVllmProvider(provider: string, modelId: string, config?: SymiConfig): boolean;
62
+ export {};
@@ -1,6 +1,6 @@
1
1
  import { a as buildGroupHistoryKey, n as DEFAULT_MAIN_KEY, r as buildAgentMainSessionKey, s as normalizeAgentId } from "./session-key-C_0eELjb.js";
2
2
  import { f as readWebSelfId, o as getWebAuthAgeMs, r as resolveWhatsAppAccount } from "./accounts-D9zGZU5t.js";
3
- import { G as resolveMentionGating, W as shouldAckReactionForWhatsApp, X as buildHistoryContextFromEntries, Y as DEFAULT_GROUP_HISTORY_LIMIT, _ as formatInboundEnvelope, b as shouldComputeCommandAuthorized, c as buildPairingReply, d as formatDurationPrecise, f as enqueueSystemEvent, g as resolveInboundDebounceMs, h as createInboundDebouncer, ht as createDedupeCache, l as dispatchReplyWithBufferedBlockDispatcher, m as parseActivationCommand, nt as buildMentionRegexes, o as computeBackoff, p as normalizeGroupActivation, rt as normalizeMentionText, s as sleepWithAbort, tt as recordPendingHistoryEntryIfEnabled, v as resolveEnvelopeFormatOptions, y as hasControlCommand } from "./unified-runner-DPD66ppH.js";
3
+ import { G as resolveMentionGating, W as shouldAckReactionForWhatsApp, X as buildHistoryContextFromEntries, Y as DEFAULT_GROUP_HISTORY_LIMIT, _ as formatInboundEnvelope, b as shouldComputeCommandAuthorized, c as buildPairingReply, d as formatDurationPrecise, f as enqueueSystemEvent, g as resolveInboundDebounceMs, h as createInboundDebouncer, ht as createDedupeCache, l as dispatchReplyWithBufferedBlockDispatcher, m as parseActivationCommand, nt as buildMentionRegexes, o as computeBackoff, p as normalizeGroupActivation, rt as normalizeMentionText, s as sleepWithAbort, tt as recordPendingHistoryEntryIfEnabled, v as resolveEnvelopeFormatOptions, y as hasControlCommand } from "./unified-runner-CZE3p9mg.js";
4
4
  import { A as normalizeE164, B as toWhatsappJid, K as logVerbose, N as resolveJidToE164, O as isSelfChatMode, R as sleep, Y as shouldLogVerbose, k as jidToE164, s as normalizeChatChannelId, tt as getChildLogger, x as clamp } from "./registry--_pGht6S.js";
5
5
  import { n as loadConfig } from "./config-Bv0LE_Mp.js";
6
6
  import { i as defaultRuntime, t as createSubsystemLogger } from "./subsystem-Coz2AgU8.js";
@@ -1,6 +1,6 @@
1
1
  import { f as DEFAULT_ACCOUNT_ID, p as normalizeAccountId } from "./session-key-C_0eELjb.js";
2
2
  import { _ as createAccountListHelpers, i as resolveWhatsAppAuthDir, n as resolveDefaultWhatsAppAccountId, r as resolveWhatsAppAccount, t as listWhatsAppAccountIds } from "./accounts-D9zGZU5t.js";
3
- import { $ as clearHistoryEntriesIfEnabled, A as resolveDiscordUserAllowlist, B as logTypingFailure, C as processLineMessage, Ct as unbindThreadBindingsBySessionKey, D as resolveSlackUserAllowlist, Dt as BLUEBUBBLES_ACTION_NAMES, E as attachFooterText, Et as BLUEBUBBLES_ACTIONS, F as stringEnum, G as resolveMentionGating, H as removeAckReactionAfterReply, I as recordInboundSession, J as summarizeMapping, K as resolveMentionGatingWithBypass, L as resolveControlCommandGate, M as collectDiscordAuditChannelIds, N as formatDocsLink, O as resolveSlackChannelAllowlist, Ot as BLUEBUBBLES_GROUP_ACTIONS, P as optionalStringEnum, Q as clearHistoryEntries, R as logAckFailure, S as hasMarkdownToConvert, St as listThreadBindingsBySessionKey, T as createReceiptCard, Tt as resolveAllowlistMatchSimple, U as shouldAckReaction, V as createTypingCallbacks, W as shouldAckReactionForWhatsApp, Y as DEFAULT_GROUP_HISTORY_LIMIT, Z as buildPendingHistoryContextFromMap, _t as listDevicePairing, a as resolveLineAccount, at as isWSLEnv, bt as registerPluginHttpRoute, ct as DEFAULT_WEBHOOK_MAX_BODY_BYTES, dt as isRequestBodyLimitError, et as recordPendingHistoryEntry, ft as readJsonBodyWithLimit, gt as approveDevicePairing, ht as createDedupeCache, i as resolveDefaultLineAccountId, it as isWSL2Sync, j as resolveDiscordChannelAllowlist, k as detectBinary, kt as CHANNEL_MESSAGE_ACTION_NAMES, lt as RequestBodyLimitError, mt as requestBodyErrorToText, n as listLineAccountIds, ot as isWSLSync, pt as readRequestBodyWithLimit, q as mergeAllowlist, r as normalizeAccountId$1, st as DEFAULT_WEBHOOK_BODY_TIMEOUT_MS, tt as recordPendingHistoryEntryIfEnabled, ut as installRequestBodyLimitGuard, vt as rejectDevicePairing, w as stripMarkdown, wt as formatAllowlistMatchMeta, xt as autoBindSpawnedDiscordSubagent, yt as extractToolSend, z as logInboundDrop } from "./unified-runner-DPD66ppH.js";
3
+ import { $ as clearHistoryEntriesIfEnabled, A as resolveDiscordUserAllowlist, B as logTypingFailure, C as processLineMessage, Ct as unbindThreadBindingsBySessionKey, D as resolveSlackUserAllowlist, Dt as BLUEBUBBLES_ACTION_NAMES, E as attachFooterText, Et as BLUEBUBBLES_ACTIONS, F as stringEnum, G as resolveMentionGating, H as removeAckReactionAfterReply, I as recordInboundSession, J as summarizeMapping, K as resolveMentionGatingWithBypass, L as resolveControlCommandGate, M as collectDiscordAuditChannelIds, N as formatDocsLink, O as resolveSlackChannelAllowlist, Ot as BLUEBUBBLES_GROUP_ACTIONS, P as optionalStringEnum, Q as clearHistoryEntries, R as logAckFailure, S as hasMarkdownToConvert, St as listThreadBindingsBySessionKey, T as createReceiptCard, Tt as resolveAllowlistMatchSimple, U as shouldAckReaction, V as createTypingCallbacks, W as shouldAckReactionForWhatsApp, Y as DEFAULT_GROUP_HISTORY_LIMIT, Z as buildPendingHistoryContextFromMap, _t as listDevicePairing, a as resolveLineAccount, at as isWSLEnv, bt as registerPluginHttpRoute, ct as DEFAULT_WEBHOOK_MAX_BODY_BYTES, dt as isRequestBodyLimitError, et as recordPendingHistoryEntry, ft as readJsonBodyWithLimit, gt as approveDevicePairing, ht as createDedupeCache, i as resolveDefaultLineAccountId, it as isWSL2Sync, j as resolveDiscordChannelAllowlist, k as detectBinary, kt as CHANNEL_MESSAGE_ACTION_NAMES, lt as RequestBodyLimitError, mt as requestBodyErrorToText, n as listLineAccountIds, ot as isWSLSync, pt as readRequestBodyWithLimit, q as mergeAllowlist, r as normalizeAccountId$1, st as DEFAULT_WEBHOOK_BODY_TIMEOUT_MS, tt as recordPendingHistoryEntryIfEnabled, ut as installRequestBodyLimitGuard, vt as rejectDevicePairing, w as stripMarkdown, wt as formatAllowlistMatchMeta, xt as autoBindSpawnedDiscordSubagent, yt as extractToolSend, z as logInboundDrop } from "./unified-runner-CZE3p9mg.js";
4
4
  import "./paths-DR2yt_mP.js";
5
5
  import "./github-copilot-token-D9X2phUj.js";
6
6
  import { D as resolveSlackAccount, E as resolveDefaultSlackAccountId, F as resolveDiscordAccount, M as listDiscordAccountIds, O as resolveSlackReplyToMode, P as resolveDefaultDiscordAccountId, S as resolveTelegramAccount, T as listSlackAccountIds, _ as normalizeWhatsAppTarget, a as listDiscordDirectoryPeersFromConfig, b as listTelegramAccountIds, c as listTelegramDirectoryGroupsFromConfig, d as listWhatsAppDirectoryPeersFromConfig, f as looksLikeSlackTargetId, g as isWhatsAppGroupJid, i as listDiscordDirectoryGroupsFromConfig, l as listTelegramDirectoryPeersFromConfig, o as listSlackDirectoryGroupsFromConfig, p as normalizeSlackMessagingTarget, s as listSlackDirectoryPeersFromConfig, u as listWhatsAppDirectoryGroupsFromConfig, w as listEnabledSlackAccounts, x as resolveDefaultTelegramAccountId } from "./plugins-muf5lfx-.js";
@@ -47,12 +47,12 @@ import "./paths-A0xdf3yk.js";
47
47
  import { h as onDiagnosticEvent, m as isDiagnosticsEnabled, p as emitDiagnosticEvent } from "./diagnostic-fnIb_o_V.js";
48
48
  import { n as extractOriginalFilename } from "./store-uf7TpQm3.js";
49
49
  import { t as resolveWhatsAppOutboundTarget } from "./resolve-outbound-target-BkHNUpdB.js";
50
- import { r as resolveWhatsAppHeartbeatRecipients } from "./channel-web-CQucEpek.js";
50
+ import { r as resolveWhatsAppHeartbeatRecipients } from "./channel-web-oG-aaS67.js";
51
51
  import "./diagnostic-session-state-DnkpMfCl.js";
52
52
  import "./image-Br537YWQ.js";
53
53
  import "./pi-auth-json-BMKHahdN.js";
54
54
  import "./pi-model-discovery-Cdz3tuFk.js";
55
- import "./manager-DMMQnz2r.js";
55
+ import "./manager-hfHALsDs.js";
56
56
  import "./gemini-auth-BJBLsO9s.js";
57
57
  import "./sqlite-BflKfcLD.js";
58
58
  import "./commands-registry-BMqWVyks.js";
@@ -3972,7 +3972,7 @@ var MemoryIndexManager = class MemoryIndexManager extends MemoryManagerEmbedding
3972
3972
  * to bypass the min-interval guard (CLI use).
3973
3973
  */
3974
3974
  async runL3CycleIfDue(params) {
3975
- const [{ runL3Cycle, runL3CycleIfDue }, { createSynthesizer }] = await Promise.all([import("./consolidate-BieO-_k_.js"), import("./synthesis-B3oSNA87.js")]);
3975
+ const [{ runL3Cycle, runL3CycleIfDue }, { createSynthesizer }] = await Promise.all([import("./consolidate-BieO-_k_.js"), import("./synthesis-BWBeCBqa.js")]);
3976
3976
  const synthesize = createSynthesizer({
3977
3977
  cfg: this.cfg,
3978
3978
  agentId: this.agentId,
@@ -1,5 +1,5 @@
1
1
  import "./accounts-D9zGZU5t.js";
2
- import { t as runAgentTurn } from "./unified-runner-DPD66ppH.js";
2
+ import { t as runAgentTurn } from "./unified-runner-CZE3p9mg.js";
3
3
  import "./paths-DR2yt_mP.js";
4
4
  import "./github-copilot-token-D9X2phUj.js";
5
5
  import "./plugins-muf5lfx-.js";
@@ -49,7 +49,7 @@ import "./diagnostic-session-state-DnkpMfCl.js";
49
49
  import "./image-Br537YWQ.js";
50
50
  import "./pi-auth-json-BMKHahdN.js";
51
51
  import "./pi-model-discovery-Cdz3tuFk.js";
52
- import "./manager-DMMQnz2r.js";
52
+ import "./manager-hfHALsDs.js";
53
53
  import "./gemini-auth-BJBLsO9s.js";
54
54
  import "./sqlite-BflKfcLD.js";
55
55
  import "./commands-registry-BMqWVyks.js";
@@ -52,7 +52,7 @@ import { r as getDiagnosticSessionState } from "./diagnostic-session-state-DnkpM
52
52
  import { S as ensureSymiModelsJson, _ as stripMinimaxToolCallXml, a as decodeDataUrl, b as stripReasoningTagsFromText, c as extractAssistantText$1, d as extractThinkingFromTaggedText, f as formatReasoningMessage, g as stripDowngradedToolCallText, h as promoteThinkingTagsToBlocks, i as coerceImageModelConfig, l as extractAssistantThinking, m as isAssistantMessage, o as resolveProviderVisionModelFromConfig, p as inferToolMetaFromArgs, r as coerceImageAssistantText, s as minimaxUnderstandImage, u as extractThinkingFromTaggedStream, v as stripThinkingTagsFromText, x as extractTextFromChatContent, y as resolveToolDisplay } from "./image-Br537YWQ.js";
53
53
  import { t as ensurePiAuthJsonFromAuthProfiles } from "./pi-auth-json-BMKHahdN.js";
54
54
  import { n as discoverModels, t as discoverAuthStorage } from "./pi-model-discovery-Cdz3tuFk.js";
55
- import { i as resolveMemorySearchConfig, n as probeOllamaEmbeddingModels, r as resolveOllamaBaseUrl } from "./manager-DMMQnz2r.js";
55
+ import { i as resolveMemorySearchConfig, n as probeOllamaEmbeddingModels, r as resolveOllamaBaseUrl } from "./manager-hfHALsDs.js";
56
56
  import { c as normalizeExtraMemoryPaths, f as runTasksWithConcurrency, s as listMemoryFiles } from "./internal-BpFmQTvo.js";
57
57
  import { _ as resolveNativeCommandsEnabled, a as listChatCommandsForConfig, c as normalizeCommandBody, d as resolveCommandArgMenu, f as serializeCommandArgs, g as isRestartEnabled, h as isNativeCommandsExplicitlyDisabled, i as listChatCommands, l as parseCommandArgs, m as isCommandFlagEnabled, o as listNativeCommandSpecs, p as shouldHandleTextCommands, r as findCommandByNativeName, s as listNativeCommandSpecsForConfig, t as buildCommandTextFromArgs, u as resolveCommandArgChoices, v as resolveNativeSkillsEnabled } from "./commands-registry-BMqWVyks.js";
58
58
  import { r as normalizeInboundTextNewlines, t as finalizeInboundContext } from "./inbound-context-5H7RKVif.js";
@@ -9628,7 +9628,7 @@ async function getMemorySearchManager(params) {
9628
9628
  const wrapper = new FallbackMemoryManager({
9629
9629
  primary,
9630
9630
  fallbackFactory: async () => {
9631
- const { MemoryIndexManager } = await import("./manager-DMMQnz2r.js").then((n) => n.t);
9631
+ const { MemoryIndexManager } = await import("./manager-hfHALsDs.js").then((n) => n.t);
9632
9632
  return await MemoryIndexManager.get(params);
9633
9633
  }
9634
9634
  }, () => QMD_MANAGER_CACHE.delete(cacheKey));
@@ -9641,7 +9641,7 @@ async function getMemorySearchManager(params) {
9641
9641
  }
9642
9642
  }
9643
9643
  try {
9644
- const { MemoryIndexManager } = await import("./manager-DMMQnz2r.js").then((n) => n.t);
9644
+ const { MemoryIndexManager } = await import("./manager-hfHALsDs.js").then((n) => n.t);
9645
9645
  return { manager: await MemoryIndexManager.get(params) };
9646
9646
  } catch (err) {
9647
9647
  return {
@@ -12511,6 +12511,11 @@ function buildAgentSystemPrompt(params) {
12511
12511
  "- Never narrate or quote tool output you did not actually receive from a real tool result. Writing \"I ran X and got Y\" without a corresponding tool invocation is fabrication and breaks user trust.",
12512
12512
  "- For factual local-system lookups (hostname, file contents, process state, env vars, current dir, system info), the answer comes from invoking the appropriate tool — not from priors. Always invoke.",
12513
12513
  "",
12514
+ "Example — when the user explicitly names a tool:",
12515
+ " User: \"Use the exec tool to run: echo hi\"",
12516
+ " Correct: call exec with command=\"echo hi\", then summarise the actual stdout you received.",
12517
+ " Wrong: emit \"hi\" as text without calling exec — that's fabrication.",
12518
+ "",
12514
12519
  ...compactMode ? [] : [
12515
12520
  "## Tool Call Style",
12516
12521
  "Default: do not narrate routine, low-risk tool calls (just call the tool).",
@@ -54617,7 +54622,7 @@ function setCliSessionId(entry, provider, sessionId) {
54617
54622
  function createDefaultDeps() {
54618
54623
  return {
54619
54624
  sendMessageWhatsApp: async (...args) => {
54620
- const { sendMessageWhatsApp } = await import("./web-O8zxjM0h.js");
54625
+ const { sendMessageWhatsApp } = await import("./web-CD_2TcPx.js");
54621
54626
  return await sendMessageWhatsApp(...args);
54622
54627
  },
54623
54628
  sendMessageTelegram: async (...args) => {
@@ -69288,7 +69293,7 @@ function loadWebLoginQr() {
69288
69293
  return webLoginQrPromise;
69289
69294
  }
69290
69295
  function loadWebChannel() {
69291
- webChannelPromise ??= import("./web-O8zxjM0h.js");
69296
+ webChannelPromise ??= import("./web-CD_2TcPx.js");
69292
69297
  return webChannelPromise;
69293
69298
  }
69294
69299
  function loadWhatsAppActions() {
@@ -73998,6 +74003,91 @@ function createOutputNormalizer(profile, modelId) {
73998
74003
  //#endregion
73999
74004
  //#region src/agents/model-aware-stream.ts
74000
74005
  /**
74006
+ * Match imperative tool requests:
74007
+ * "Use the exec tool to run X"
74008
+ * "use exec to ..."
74009
+ * "Please invoke the read tool"
74010
+ * "call memory_search with ..."
74011
+ *
74012
+ * Anchored to start-of-string, start-of-line, or after a closing-bracket
74013
+ * delimiter `] ` (covers Symi's `[Thu 2026-04-30 20:48 EDT] ` timestamp
74014
+ * envelope, the `[Outlook 365] ` plugin banner, and similar prefixes that
74015
+ * gateway middleware can inject before the user's actual prompt — verified
74016
+ * live: `chat.send` from Glass UI ships content like
74017
+ *
74018
+ * Conversation info (untrusted metadata):
74019
+ * ```json
74020
+ * { "message_id": "...", ... }
74021
+ * ```
74022
+ *
74023
+ * [Thu 2026-04-30 20:48 EDT] Use the exec tool to run: hostname
74024
+ *
74025
+ * so the `Use` is preceded by `] ` not by `\n` or `^`).
74026
+ *
74027
+ * Verb list is conservative (use/invoke/call/please-{use,call}) — pure
74028
+ * imperative verbs that read unambiguously as "do this for me." Tool name
74029
+ * must match EXPLICIT_TOOL_NAMES exactly to keep "use poetic language" /
74030
+ * "use clear writing" / etc. from triggering.
74031
+ */
74032
+ const EXPLICIT_TOOL_REQUEST_PATTERN = new RegExp(String.raw`(?:^|\n|\]\s)\s*(?:please\s+)?(?:use|invoke|call)\s+(?:the\s+)?(?:` + [
74033
+ "exec",
74034
+ "bash",
74035
+ "read",
74036
+ "write",
74037
+ "edit",
74038
+ "patch",
74039
+ "web_search",
74040
+ "web_fetch",
74041
+ "browser",
74042
+ "browser_navigate",
74043
+ "browser_snapshot",
74044
+ "browser_click",
74045
+ "browser_type",
74046
+ "memory_search",
74047
+ "memory_get",
74048
+ "memory_pin",
74049
+ "memory_unpin",
74050
+ "spawn_agent",
74051
+ "message",
74052
+ "task_list",
74053
+ "task_cancel",
74054
+ "cron",
74055
+ "fetch",
74056
+ "skill_search"
74057
+ ].map((n) => n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|") + String.raw`)(?:\s+tool)?\b`, "i");
74058
+ /**
74059
+ * Extract the user-role text ONLY when it's the LAST message in the
74060
+ * conversation (i.e., we're at the start of a fresh turn, not in the
74061
+ * middle of an agent loop). Returns "" when:
74062
+ * - messages isn't an array
74063
+ * - the last message isn't user-role (= we're after a tool_call /
74064
+ * tool_result and the model is continuing — forcing tool_choice
74065
+ * "required" here would loop the agent: model must call a tool →
74066
+ * tool result → model must call ANOTHER tool → tool result → ...)
74067
+ *
74068
+ * Verified live on 3.0.7 dev: with the original "find any prior user
74069
+ * message" implementation, every agent-loop iteration saw the same
74070
+ * matching userText and re-forced tool_choice="required", spinning the
74071
+ * model in an infinite tool-call loop and timing out at 180s.
74072
+ */
74073
+ function extractLastUserText(messages) {
74074
+ if (!Array.isArray(messages) || messages.length === 0) return "";
74075
+ const last = messages[messages.length - 1];
74076
+ if (!last || typeof last !== "object") return "";
74077
+ const msg = last;
74078
+ if (msg.role !== "user") return "";
74079
+ if (typeof msg.content === "string") return msg.content;
74080
+ if (Array.isArray(msg.content)) {
74081
+ const parts = [];
74082
+ for (const part of msg.content) if (part && typeof part === "object") {
74083
+ const block = part;
74084
+ if (block.type === "text" && typeof block.text === "string") parts.push(block.text);
74085
+ }
74086
+ return parts.join("\n");
74087
+ }
74088
+ return "";
74089
+ }
74090
+ /**
74001
74091
  * Create a single stream function wrapper that handles all provider-specific
74002
74092
  * param injection via one onPayload hook.
74003
74093
  *
@@ -74045,6 +74135,10 @@ function createModelAwareStreamFn(opts) {
74045
74135
  delete p.store;
74046
74136
  }
74047
74137
  if (Array.isArray(p.tools) && p.tools.length > 0 && p.tool_choice === void 0) p.tool_choice = "auto";
74138
+ if (Array.isArray(p.tools) && p.tools.length > 0 && p.tool_choice === "auto") {
74139
+ const userText = extractLastUserText(p.messages);
74140
+ if (userText && EXPLICIT_TOOL_REQUEST_PATTERN.test(userText)) p.tool_choice = "required";
74141
+ }
74048
74142
  }
74049
74143
  callerOnPayload?.(payload);
74050
74144
  };
@@ -1,5 +1,5 @@
1
1
  import { a as WA_WEB_AUTH_DIR, g as webAuthExists, s as logWebSelfId, u as pickWebChannel } from "./accounts-D9zGZU5t.js";
2
- import "./unified-runner-DPD66ppH.js";
2
+ import "./unified-runner-CZE3p9mg.js";
3
3
  import "./paths-DR2yt_mP.js";
4
4
  import "./github-copilot-token-D9X2phUj.js";
5
5
  import "./plugins-muf5lfx-.js";
@@ -45,12 +45,12 @@ import "./pi-embedded-helpers-DLlOikDI.js";
45
45
  import "./paths-A0xdf3yk.js";
46
46
  import "./diagnostic-fnIb_o_V.js";
47
47
  import "./store-uf7TpQm3.js";
48
- import { n as monitorWebInbox, t as monitorWebChannel } from "./channel-web-CQucEpek.js";
48
+ import { n as monitorWebInbox, t as monitorWebChannel } from "./channel-web-oG-aaS67.js";
49
49
  import "./diagnostic-session-state-DnkpMfCl.js";
50
50
  import "./image-Br537YWQ.js";
51
51
  import "./pi-auth-json-BMKHahdN.js";
52
52
  import "./pi-model-discovery-Cdz3tuFk.js";
53
- import "./manager-DMMQnz2r.js";
53
+ import "./manager-hfHALsDs.js";
54
54
  import "./gemini-auth-BJBLsO9s.js";
55
55
  import "./sqlite-BflKfcLD.js";
56
56
  import "./commands-registry-BMqWVyks.js";
@@ -14,7 +14,7 @@ import "./client-CJIMV1WD.js";
14
14
  import "./call-DgBbW7bk.js";
15
15
  import "./message-channel-C9dERklz.js";
16
16
  import "./pairing-token-Byh6drgn.js";
17
- import "./subagent-registry-B4gg8TFc.js";
17
+ import "./subagent-registry-k0ZBnJuU.js";
18
18
  import "./sessions-D94fC0u0.js";
19
19
  import "./tokens-BEvOiQ65.js";
20
20
  import "./plugins-DTKQE9kt.js";
@@ -52,8 +52,8 @@ import "./tool-images-CVLISeRT.js";
52
52
  import "./thinking-8sKPnzpp.js";
53
53
  import "./models-config-BEX8iiQb.js";
54
54
  import "./reply-prefix-Pz-5t5RS.js";
55
- import "./memory-cli-CEvfDody.js";
56
- import "./manager-OL6o99xD.js";
55
+ import "./memory-cli-CFc9bXRp.js";
56
+ import "./manager-DrpXfTr8.js";
57
57
  import "./gemini-auth-48fFOTO4.js";
58
58
  import "./retry-C4Q_VPOo.js";
59
59
  import "./sqlite-BP8tiuca.js";
@@ -103,7 +103,7 @@ import "./npm-registry-spec-PuS2I1Em.js";
103
103
  import "./skill-scanner-BV3QHmsf.js";
104
104
  import { i as resolvePluginInstallDir, n as installPluginFromNpmSpec, r as installPluginFromPath, t as recordPluginInstall } from "./installs-B4sNNRaW.js";
105
105
  import { t as renderTable } from "./table-Bka4fasy.js";
106
- import { t as buildPluginStatusReport } from "./status-B5SAsM15.js";
106
+ import { t as buildPluginStatusReport } from "./status-CvJZLdWA.js";
107
107
  import { n as updateNpmInstalledPlugins } from "./update-DticqU4-.js";
108
108
  import os from "node:os";
109
109
  import path from "node:path";