@symerian/symi 2.6.0 → 2.6.2

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 (188) hide show
  1. package/dist/{agents-Bi50kp6u.js → agents-qLMWAYwU.js} +4 -4
  2. package/dist/{agents.config-BcTeP94V.js → agents.config-BfjAwFCr.js} +1 -1
  3. package/dist/{agents.config-Duce7lam.js → agents.config-BmdFH4J5.js} +1 -1
  4. package/dist/{audio-preflight-DHTaS5U1.js → audio-preflight-BVaaZWkg.js} +4 -4
  5. package/dist/{audio-preflight-C40mKAp7.js → audio-preflight-CPBOQV4I.js} +4 -4
  6. package/dist/{auth-choice-Dyq-0MNq.js → auth-choice-D1u_GPfQ.js} +1 -1
  7. package/dist/{auth-choice-BFIBR4l9.js → auth-choice-zFq3WRQ0.js} +1 -1
  8. package/dist/{banner-D50f_0qf.js → banner-DpH44qlJ.js} +1 -1
  9. package/dist/build-info.json +3 -3
  10. package/dist/bundled/boot-md/handler.js +6 -6
  11. package/dist/bundled/session-memory/handler.js +6 -6
  12. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  13. package/dist/{channel-options-BFqaanEt.js → channel-options-0iOfzVR3.js} +1 -1
  14. package/dist/{channel-options-BvBcjqyk.js → channel-options-C8tKm8re.js} +1 -1
  15. package/dist/{channel-web-BQtFg4IP.js → channel-web-DYinYBz4.js} +1 -1
  16. package/dist/{channels-cli-BuTH-iVi.js → channels-cli-93tLT17t.js} +4 -4
  17. package/dist/{channels-cli-BYFQdWnL.js → channels-cli-C8HgSMTH.js} +4 -4
  18. package/dist/{chrome-DYZwl5Gv.js → chrome-D2SKJnR7.js} +5 -5
  19. package/dist/{chrome-CDJYxX5a.js → chrome-DkaXoP36.js} +5 -5
  20. package/dist/{cli-r2L-UK6y.js → cli-BYJyRW2M.js} +1 -1
  21. package/dist/{cli-eOBlVLcC.js → cli-DapZXGSB.js} +1 -1
  22. package/dist/{command-registry-D-pwcAIW.js → command-registry-9EhYc6da.js} +9 -9
  23. package/dist/{completion-cli-DIx7KyOG.js → completion-cli-BFZv3K5D.js} +2 -2
  24. package/dist/{completion-cli-DMO2OGTm.js → completion-cli-CCeQlMlC.js} +1 -1
  25. package/dist/{config-cli-BsDxqYDU.js → config-cli-DbWMIBUz.js} +1 -1
  26. package/dist/{config-cli-seaVWVru.js → config-cli-Dv2mtIeM.js} +1 -1
  27. package/dist/{configure-BmPwuHXL.js → configure-B8zV6Hxj.js} +3 -3
  28. package/dist/{configure-CqbKA0_V.js → configure-CVQf2UJE.js} +3 -3
  29. package/dist/{deliver-BH0l3UKW.js → deliver-C-37cZUe.js} +1 -1
  30. package/dist/{deliver-dODxSv3b.js → deliver-C46-vyqg.js} +1 -1
  31. package/dist/{doctor-completion-DMjs7-Qa.js → doctor-completion-BunqvoqZ.js} +1 -1
  32. package/dist/{doctor-completion-C2IV3lKi.js → doctor-completion-CLeX1kaN.js} +1 -1
  33. package/dist/entry.js +1 -1
  34. package/dist/extensionAPI.js +6 -6
  35. package/dist/{gateway-cli-BanaeKQ_.js → gateway-cli-Co-tp-WC.js} +9 -9
  36. package/dist/{gateway-cli-C-J_s559.js → gateway-cli-DMey_29a.js} +9 -9
  37. package/dist/{glass-ui-ws-DUzp9m0D.js → glass-ui-ws-C4O227UO.js} +7 -7
  38. package/dist/{glass-ui-ws-DK7x3Tz7.js → glass-ui-ws-CKb1jTZR.js} +7 -7
  39. package/dist/{health-DK6rAOhC.js → health-CDGOsNeD.js} +1 -1
  40. package/dist/{health-BpHgCv-u.js → health-CM1asUG8.js} +1 -1
  41. package/dist/{hooks-cli-D-75G_66.js → hooks-cli-DFKB3Z6X.js} +2 -2
  42. package/dist/{hooks-cli-Cin_3tFg.js → hooks-cli-Tx0TzSju.js} +2 -2
  43. package/dist/{image-CXu8W39c.js → image-CuzFLQWC.js} +1 -1
  44. package/dist/{image-CHzdaNJ4.js → image-DcpMiprB.js} +1 -1
  45. package/dist/index.js +6 -6
  46. package/dist/llm-slug-generator.js +6 -6
  47. package/dist/{models-CeKIXf5B.js → models-CiqHYwje.js} +2 -2
  48. package/dist/{models-cli-2NcPKR9A.js → models-cli-B-b-gBKG.js} +2 -2
  49. package/dist/{models-cli-DN4AVlpI.js → models-cli-B4ATSsNS.js} +3 -3
  50. package/dist/{onboard-BukRqcRH.js → onboard-B_ECX48L.js} +2 -2
  51. package/dist/{onboard-BcxDiUl_.js → onboard-DcnGZKZX.js} +2 -2
  52. package/dist/{onboard-channels-DS6s341R.js → onboard-channels-FFQPpuEN.js} +1 -1
  53. package/dist/{onboard-channels-HPxu77wp.js → onboard-channels-pfSGhg_C.js} +1 -1
  54. package/dist/{onboarding-DI-o_sax.js → onboarding-BU14cspo.js} +3 -3
  55. package/dist/{onboarding-B8uz24jt.js → onboarding-jhZxQcZ3.js} +3 -3
  56. package/dist/{onboarding.finalize-CfE_AEto.js → onboarding.finalize-B8oOMfHc.js} +6 -6
  57. package/dist/{onboarding.finalize-Bn2e61yb.js → onboarding.finalize-ByZT4dF5.js} +5 -5
  58. package/dist/{pi-embedded-B5qBa69e.js → pi-embedded-BY9AnmoP.js} +203 -27
  59. package/dist/{pi-embedded-helpers-lgx_U5KS.js → pi-embedded-helpers-B8kqLWns.js} +4 -4
  60. package/dist/{pi-embedded-helpers-pubKo8HQ.js → pi-embedded-helpers-CfqDGQ9J.js} +4 -4
  61. package/dist/{plugin-registry-NIUxULTk.js → plugin-registry-CNf1_8hj.js} +1 -1
  62. package/dist/{plugin-registry-cj99EI0k.js → plugin-registry-DXWJkJX6.js} +1 -1
  63. package/dist/plugin-sdk/{accounts-BtaOa4z_.js → accounts-BToL3HlP.js} +1 -1
  64. package/dist/plugin-sdk/{accounts-Ddm33hQm.js → accounts-D9zGZU5t.js} +3 -3
  65. package/dist/plugin-sdk/{accounts-s-AdhXVR.js → accounts-Dtszw3Zn.js} +1 -1
  66. package/dist/plugin-sdk/{active-listener-BXYeALs0.js → active-listener-bEk__wbB.js} +1 -1
  67. package/dist/plugin-sdk/{agent-scope-CYYpcO9W.js → agent-scope-C3gMMKCU.js} +2 -2
  68. package/dist/plugin-sdk/agents/model-token-filter.d.ts +10 -0
  69. package/dist/plugin-sdk/agents/pi-tools.validate-wrapper.d.ts +23 -0
  70. package/dist/plugin-sdk/agents/pi-tools.validate.d.ts +26 -0
  71. package/dist/plugin-sdk/agents/tool-loop-detection.d.ts +3 -1
  72. package/dist/plugin-sdk/{api-key-rotation-D_sMvI5W.js → api-key-rotation-CVBMpnPc.js} +1 -1
  73. package/dist/plugin-sdk/{audio-preflight-VpItkiy3.js → audio-preflight-DoQQKlxa.js} +24 -24
  74. package/dist/plugin-sdk/{bindings-C7hRtgYW.js → bindings-BbwoUGPx.js} +2 -2
  75. package/dist/plugin-sdk/{channel-activity-DoC1xtDu.js → channel-activity-Ji7f0gqq.js} +1 -1
  76. package/dist/plugin-sdk/{channel-web-CSd16cDi.js → channel-web-DZQQ0mzN.js} +22 -22
  77. package/dist/plugin-sdk/{chrome-B7RdxmJ0.js → chrome-C7c_0I5M.js} +3 -3
  78. package/dist/plugin-sdk/{chunk-Dw2XBYXv.js → chunk-jvk9axTQ.js} +1 -1
  79. package/dist/plugin-sdk/{command-format-GKSevep4.js → command-format-DSdvQ_M5.js} +1 -1
  80. package/dist/plugin-sdk/{commands-registry-COIaslGl.js → commands-registry-CQFbmUMs.js} +4 -4
  81. package/dist/plugin-sdk/config/model-profiles.d.ts +2 -0
  82. package/dist/plugin-sdk/{config-KlTNfkFF.js → config-DDkdiUOR.js} +9 -9
  83. package/dist/plugin-sdk/{deliver-BZ99UKQq.js → deliver-BZ6iNLl7.js} +10 -10
  84. package/dist/plugin-sdk/{diagnostic-05pm5Rxi.js → diagnostic-mFf4i4G9.js} +1 -1
  85. package/dist/plugin-sdk/{image-CLOPx7yW.js → image-BOYy0Ump.js} +4 -4
  86. package/dist/plugin-sdk/{image-ops-BlQR__MN.js → image-ops-Bnp6LXEx.js} +1 -1
  87. package/dist/plugin-sdk/index.js +53 -53
  88. package/dist/plugin-sdk/infra/diagnostic-events.d.ts +1 -1
  89. package/dist/plugin-sdk/{ir-BJ6BHE5b.js → ir-Fb3qpcis.js} +4 -4
  90. package/dist/plugin-sdk/{local-roots-BHLNSI8U.js → local-roots-Ckk1QfzI.js} +3 -3
  91. package/dist/plugin-sdk/logging/diagnostic-session-state.d.ts +2 -0
  92. package/dist/plugin-sdk/logging/diagnostic.d.ts +1 -1
  93. package/dist/plugin-sdk/{login-DQMXuxOk.js → login-Bh3DZPam.js} +7 -7
  94. package/dist/plugin-sdk/{login-qr-BjVZSoCi.js → login-qr-DbR7odSr.js} +9 -9
  95. package/dist/plugin-sdk/{manager-CBSBFuFz.js → manager-DckktAQ3.js} +8 -8
  96. package/dist/plugin-sdk/{manifest-registry-CPnHl_K3.js → manifest-registry-B3ugY9-f.js} +1 -1
  97. package/dist/plugin-sdk/{markdown-tables-BoYFajMu.js → markdown-tables-Dfaqilz6.js} +1 -1
  98. package/dist/plugin-sdk/{message-channel-COTAJzHd.js → message-channel-BdI5Ra9S.js} +1 -1
  99. package/dist/plugin-sdk/{model-selection-CsbEfrS0.js → model-selection-OpU8HN50.js} +4 -4
  100. package/dist/plugin-sdk/{outbound-attachment-CnslKL38.js → outbound-attachment-DnVQfTG2.js} +2 -2
  101. package/dist/plugin-sdk/{outbound-B0e8KdaR.js → outbound-rF6G8Xpr.js} +7 -7
  102. package/dist/plugin-sdk/{pi-auth-json-qWi7ZIYV.js → pi-auth-json-CJk8t14T.js} +5 -5
  103. package/dist/plugin-sdk/{pi-embedded-helpers-CW630epe.js → pi-embedded-helpers-BveUP4hk.js} +17 -17
  104. package/dist/plugin-sdk/{plugins-BNByVCIH.js → plugins-BbAvhC25.js} +4 -4
  105. package/dist/plugin-sdk/{pw-ai-CnbPIPY9.js → pw-ai-DjGUsee-.js} +8 -8
  106. package/dist/plugin-sdk/{qmd-manager-CH0XbIHf.js → qmd-manager-mjKcdwVr.js} +4 -4
  107. package/dist/plugin-sdk/{registry-D0xTnUWt.js → registry--_pGht6S.js} +2 -2
  108. package/dist/plugin-sdk/{replies-LLcQL3w6.js → replies-fI39rPGa.js} +3 -3
  109. package/dist/plugin-sdk/{reply-CkqSfQZN.js → reply-DvZeyOVA.js} +263 -87
  110. package/dist/plugin-sdk/{reply-prefix-uxfMZW4p.js → reply-prefix-BHuV5t70.js} +1 -1
  111. package/dist/plugin-sdk/{resolve-outbound-target-BiyAyTWz.js → resolve-outbound-target-BkCUbYGV.js} +2 -2
  112. package/dist/plugin-sdk/{resolve-route-B3CCBumQ.js → resolve-route-D3JH_D2N.js} +3 -3
  113. package/dist/plugin-sdk/{retry-CwQ_iIj8.js → retry-ilSJqnz9.js} +1 -1
  114. package/dist/plugin-sdk/{runner-CGBT7tgF.js → runner-BVqnEfNe.js} +9 -9
  115. package/dist/plugin-sdk/{send-C5h_YxNb.js → send-BHbXh8Ly.js} +7 -7
  116. package/dist/plugin-sdk/{send-pYqe432l.js → send-BMfJIhCk.js} +6 -6
  117. package/dist/plugin-sdk/{send-B2CEnVLL.js → send-BtANzsAo.js} +6 -6
  118. package/dist/plugin-sdk/{send-CjOBB3Vo.js → send-Bxdu6ZZy.js} +10 -10
  119. package/dist/plugin-sdk/{send-CRsR8-vO.js → send-D6LMZJ_h.js} +10 -10
  120. package/dist/plugin-sdk/{session-BsOrxiMj.js → session-kI0tzViQ.js} +4 -4
  121. package/dist/plugin-sdk/{skill-commands-ff_01_r3.js → skill-commands-DCNXVERE.js} +5 -5
  122. package/dist/plugin-sdk/{skills-_yTP47Cd.js → skills-B1GeRYlu.js} +7 -7
  123. package/dist/plugin-sdk/{sqlite-CxAR5ttJ.js → sqlite-Cq_7Cg4E.js} +1 -1
  124. package/dist/plugin-sdk/{store-BdrNabcU.js → store-Do3t33-c.js} +2 -2
  125. package/dist/plugin-sdk/{subsystem-B2uDN3TV.js → subsystem-Coz2AgU8.js} +1 -1
  126. package/dist/plugin-sdk/{tables-DNwXwNFa.js → tables-DR0NmBeH.js} +1 -1
  127. package/dist/plugin-sdk/{target-errors-Paro1BjP.js → target-errors-B7YyMnIi.js} +2 -2
  128. package/dist/plugin-sdk/{thinking-CXqf7WTe.js → thinking-DCNUIAHY.js} +5 -5
  129. package/dist/plugin-sdk/{tokens-bC3UVmVH.js → tokens-CWMflosr.js} +1 -1
  130. package/dist/plugin-sdk/{tool-images-HJ2sfZDV.js → tool-images-D7Lno-TE.js} +2 -2
  131. package/dist/plugin-sdk/{tool-loop-detection-BVA6fax-.js → tool-loop-detection-DU5sTIKg.js} +55 -5
  132. package/dist/plugin-sdk/web-BCsJFuQu.js +65 -0
  133. package/dist/plugin-sdk/{whatsapp-actions-DfseosPO.js → whatsapp-actions-CcBzDuL-.js} +21 -21
  134. package/dist/{plugins-cli-CcjxxESJ.js → plugins-cli-BiedlZMy.js} +2 -2
  135. package/dist/{plugins-cli-D8hhTHZD.js → plugins-cli-C9TYM40P.js} +2 -2
  136. package/dist/{program-D09h71pS.js → program-bnWda72r.js} +7 -7
  137. package/dist/{program-context-CLJSWBZr.js → program-context-CY1jWc5A.js} +17 -17
  138. package/dist/{prompt-select-styled-DQqZEGoo.js → prompt-select-styled-BEnZY8wI.js} +4 -4
  139. package/dist/{prompt-select-styled-zRUqu0c8.js → prompt-select-styled-B_lFTtqp.js} +4 -4
  140. package/dist/{provider-auth-helpers-LzJ2WQIc.js → provider-auth-helpers-DApJuzBd.js} +1 -1
  141. package/dist/{provider-auth-helpers-16r2WHNe.js → provider-auth-helpers-DcNKxc7D.js} +1 -1
  142. package/dist/{push-apns-DJddAK3u.js → push-apns-CKKHlj6j.js} +1 -1
  143. package/dist/{push-apns-B5xZKIxK.js → push-apns-DA7UMNQH.js} +1 -1
  144. package/dist/{pw-ai-De-KR9_s.js → pw-ai-1htA-NnS.js} +1 -1
  145. package/dist/{pw-ai-B5asscAD.js → pw-ai-m0mj2KWK.js} +1 -1
  146. package/dist/{register.agent-D7NKuUkY.js → register.agent-8lxVlmzQ.js} +5 -5
  147. package/dist/{register.agent-CP_sigRh.js → register.agent-ulu0VmOg.js} +6 -6
  148. package/dist/{register.configure-BEsGd0PR.js → register.configure-45--Sly1.js} +6 -6
  149. package/dist/{register.configure-BjRLNatb.js → register.configure-rq0h5r3X.js} +6 -6
  150. package/dist/{register.maintenance-DD6TNFtV.js → register.maintenance-CXbxRtWI.js} +8 -8
  151. package/dist/{register.maintenance-CN6KUuX7.js → register.maintenance-DyEJx7NY.js} +7 -7
  152. package/dist/{register.message-DEUcNly1.js → register.message-C7Yh1uky.js} +2 -2
  153. package/dist/{register.message-DMVC_Sqm.js → register.message-CiN_pt6K.js} +2 -2
  154. package/dist/{register.onboard-CP6RP90V.js → register.onboard-BWaRkbei.js} +4 -4
  155. package/dist/{register.onboard-J1pgV7lz.js → register.onboard-e_2hc2Rm.js} +4 -4
  156. package/dist/{register.setup-Dhc3jKpK.js → register.setup-BIIFHtF7.js} +4 -4
  157. package/dist/{register.setup-BeHpW3xI.js → register.setup-zwh90Vn-.js} +4 -4
  158. package/dist/{register.status-health-sessions-b-lWNsTM.js → register.status-health-sessions-D6t5maEr.js} +3 -3
  159. package/dist/{register.status-health-sessions-DDkC0aoW.js → register.status-health-sessions-O-sVAFHE.js} +3 -3
  160. package/dist/{register.subclis-BJqiT8Q2.js → register.subclis-DOiZocR6.js} +9 -9
  161. package/dist/{reply-D40cmAci.js → reply-05js8eGB.js} +189 -13
  162. package/dist/{run-main-BruREeZ6.js → run-main-u-Eyc8Wm.js} +14 -14
  163. package/dist/{runner-DUBExAb5.js → runner-BcQ0sF9T.js} +1 -1
  164. package/dist/{runner-WAG0M5s9.js → runner-CU9l0uJh.js} +1 -1
  165. package/dist/{server-methods-K-0MHs8x.js → server-methods-Bvl1xubo.js} +7 -7
  166. package/dist/{server-methods-Cyw_WS3A.js → server-methods-Dds-iEoY.js} +7 -7
  167. package/dist/{server-node-events-89R9Ryky.js → server-node-events-Qp-gJMET.js} +2 -2
  168. package/dist/{server-node-events-RA8RurtC.js → server-node-events-qGqpsPxm.js} +2 -2
  169. package/dist/{status-DHJLMwQN.js → status-BATOXGRi.js} +2 -2
  170. package/dist/{status-CtNKWuzg.js → status-BRSo-LY3.js} +2 -2
  171. package/dist/{status-Kv_hsY8N.js → status-BqQ9mm64.js} +1 -1
  172. package/dist/{status-BSMEjz4q.js → status-CfYa1Q9K.js} +1 -1
  173. package/dist/{subagent-registry-Cb5e_x99.js → subagent-registry-lbDgDwLy.js} +189 -13
  174. package/dist/{tool-loop-detection-BgbtzUGc.js → tool-loop-detection-C7TCF2V2.js} +53 -3
  175. package/dist/{tool-loop-detection-BU3fbtCd.js → tool-loop-detection-D7qjFnRh.js} +53 -3
  176. package/dist/{tool-loop-detection-B6j1r-Wk.js → tool-loop-detection-DPVtQOfM.js} +53 -3
  177. package/dist/{tool-loop-detection-D0kUzUGu.js → tool-loop-detection-DR_rrIA1.js} +53 -3
  178. package/dist/{unified-runner-CkJLTsTK.js → unified-runner-B4ICXRlg.js} +203 -27
  179. package/dist/{update-cli-CrRBoiVU.js → update-cli-BOaP4XyQ.js} +8 -8
  180. package/dist/{update-cli-Bl66LJZ4.js → update-cli-R8-SSkbS.js} +7 -7
  181. package/dist/{update-runner-DxpSPK-f.js → update-runner-B8UmqtLI.js} +1 -1
  182. package/dist/{update-runner-FgrqoxvV.js → update-runner-CWJ4pC1b.js} +1 -1
  183. package/dist/{web-BYRKX5Ln.js → web-BWybtnEa.js} +2 -2
  184. package/dist/{web-RePh7lRy.js → web-CQH9fSkH.js} +6 -6
  185. package/dist/{web-Czp0JS6-.js → web-CSrDbJJ7.js} +1 -1
  186. package/dist/{web-D99WHLTL.js → web-DBFW0ejP.js} +6 -6
  187. package/package.json +1 -1
  188. package/dist/plugin-sdk/web-DdTTil50.js +0 -65
@@ -12,7 +12,7 @@ import { f as GATEWAY_CLIENT_CAPS, g as hasGatewayClientCap, i as isGatewayMessa
12
12
  import { c as writeJsonAtomic, o as createAsyncLock, s as readJsonFile } from "./pairing-token-Byh6drgn.js";
13
13
  import { s as pickPrimaryLanIPv4 } from "./net-DZ5Ayk-W.js";
14
14
  import { i as normalizeInputProvenance } from "./input-provenance-D0lNkCf6.js";
15
- import { $n as resolveTtsAutoMode, B as dispatchInboundMessage, C as resolveAgentDeliveryPlan, Cn as enqueueSystemEvent, Cr as onAgentEvent, D as createOutboundSendDeps, Dt as normalizeCronJobPatch, Et as normalizeCronJobCreate, G as BARE_SESSION_RESET_PROMPT, Gn as stopSubagentsForRequester, Gt as persistBrowserProxyFiles, In as resolveAgentTimeoutMs, Jn as resolveUserTimezone, Qn as resolveTtsApiKey, Sn as parseVerboseOverride, V as createReplyDispatcher, Vn as formatZonedTimestamp, Wn as isAbortTrigger, Wt as applyBrowserProxyPaths, Xn as isTtsEnabled, Y as abortEmbeddedPiRun, Yn as getTtsProvider, Z as waitForEmbeddedPiRunEnd, Zn as isTtsProviderConfigured, Zt as scheduleGatewaySigusr1Restart, a as listSubagentRunsForRequester, ar as textToSpeech, bn as applyModelOverrideToSessionEntry, c as clearSessionQueues, ct as resolveOutboundSessionRoute, dt as resolveOutboundTarget, en as unbindThreadBindingsBySessionKey, er as resolveTtsConfig, hn as resolveSendPolicy, i as listDescendantRunsForRequester, ir as setTtsProvider, m as loadSymiPlugins, mn as normalizeSendPolicy, nr as resolveTtsProviderOrder, or as OPENAI_TTS_MODELS, rn as loadProviderUsageSummary, rr as setTtsEnabled, sr as OPENAI_TTS_VOICES, st as ensureOutboundSessionEntry, tn as normalizeGroupActivation, tr as resolveTtsPrefsPath, w as resolveAgentOutboundTarget, wn as isSystemEventContextChanged, wr as registerAgentRunContext, wt as writeRestartSentinel, x as agentCommand, xn as applyVerboseOverride, yt as formatDoctorNonInteractiveHint } from "./subagent-registry-Cb5e_x99.js";
15
+ import { $n as resolveTtsAutoMode, B as dispatchInboundMessage, C as resolveAgentDeliveryPlan, Cn as enqueueSystemEvent, Cr as onAgentEvent, D as createOutboundSendDeps, Dt as normalizeCronJobPatch, Et as normalizeCronJobCreate, G as BARE_SESSION_RESET_PROMPT, Gn as stopSubagentsForRequester, Gt as persistBrowserProxyFiles, In as resolveAgentTimeoutMs, Jn as resolveUserTimezone, Qn as resolveTtsApiKey, Sn as parseVerboseOverride, V as createReplyDispatcher, Vn as formatZonedTimestamp, Wn as isAbortTrigger, Wt as applyBrowserProxyPaths, Xn as isTtsEnabled, Y as abortEmbeddedPiRun, Yn as getTtsProvider, Z as waitForEmbeddedPiRunEnd, Zn as isTtsProviderConfigured, Zt as scheduleGatewaySigusr1Restart, a as listSubagentRunsForRequester, ar as textToSpeech, bn as applyModelOverrideToSessionEntry, c as clearSessionQueues, ct as resolveOutboundSessionRoute, dt as resolveOutboundTarget, en as unbindThreadBindingsBySessionKey, er as resolveTtsConfig, hn as resolveSendPolicy, i as listDescendantRunsForRequester, ir as setTtsProvider, m as loadSymiPlugins, mn as normalizeSendPolicy, nr as resolveTtsProviderOrder, or as OPENAI_TTS_MODELS, rn as loadProviderUsageSummary, rr as setTtsEnabled, sr as OPENAI_TTS_VOICES, st as ensureOutboundSessionEntry, tn as normalizeGroupActivation, tr as resolveTtsPrefsPath, w as resolveAgentOutboundTarget, wn as isSystemEventContextChanged, wr as registerAgentRunContext, wt as writeRestartSentinel, x as agentCommand, xn as applyVerboseOverride, yt as formatDoctorNonInteractiveHint } from "./subagent-registry-lbDgDwLy.js";
16
16
  import { F as resolveMainSessionKey, I as resolveMainSessionKeyFromConfig, J as normalizeSessionDeliveryFields, N as resolveAgentMainSessionKey, P as resolveExplicitAgentSessionKey, R as snapshotSessionOrigin, S as stripEnvelopeFromMessages, _ as capArrayByJsonBytes, d as updateSessionStore, g as archiveSessionTranscripts, h as archiveFileOnDisk, o as loadSessionStore, t as extractDeliveryInfo, v as readSessionMessages, x as resolveSessionTranscriptCandidates, y as readSessionPreviewItemsFromTranscript } from "./sessions-CJXnZVjR.js";
17
17
  import { n as listChannelPlugins, r as normalizeChannelId, t as getChannelPlugin } from "./plugins-CwSlLxM8.js";
18
18
  import { n as createBrowserRouteDispatcher } from "./with-timeout-Di0nddLY.js";
@@ -37,14 +37,14 @@ import { t as WizardCancelledError } from "./prompts-m1IJwIAx.js";
37
37
  import { t as resolveChannelDefaultAccountId } from "./helpers-cLP5YLeQ.js";
38
38
  import { t as buildChannelAccountSnapshot } from "./status-BUedPCLb.js";
39
39
  import { o as isNodeCommandAllowed, s as resolveNodeCommandAllowlist } from "./audit-Byo5jCLN.js";
40
- import { r as getStatusSummary } from "./status-CtNKWuzg.js";
41
- import { c as setHeartbeatsEnabled } from "./health-BpHgCv-u.js";
40
+ import { r as getStatusSummary } from "./status-BRSo-LY3.js";
41
+ import { c as setHeartbeatsEnabled } from "./health-CM1asUG8.js";
42
42
  import { m as normalizeUpdateChannel } from "./update-check-ZdimP1aU.js";
43
- import { a as sendApnsAlert, c as parseMessageWithAttachments, i as resolveApnsAuthConfigFromEnv, l as formatForLog, n as normalizeApnsEnvironment, o as sendApnsBackgroundWake, s as normalizeRpcAttachmentsToChatAttachments, t as loadApnsRegistration } from "./push-apns-DJddAK3u.js";
44
- import { a as pruneAgentConfig, i as loadAgentIdentity, r as findAgentEntryIndex, t as applyAgentConfig } from "./agents.config-BcTeP94V.js";
43
+ import { a as sendApnsAlert, c as parseMessageWithAttachments, i as resolveApnsAuthConfigFromEnv, l as formatForLog, n as normalizeApnsEnvironment, o as sendApnsBackgroundWake, s as normalizeRpcAttachmentsToChatAttachments, t as loadApnsRegistration } from "./push-apns-CKKHlj6j.js";
44
+ import { a as pruneAgentConfig, i as loadAgentIdentity, r as findAgentEntryIndex, t as applyAgentConfig } from "./agents.config-BfjAwFCr.js";
45
45
  import { t as resolveSystemRunCommand } from "./system-run-command-ByVa3txU.js";
46
46
  import { t as installSkill } from "./skills-install-1ZdwGTnh.js";
47
- import { t as runGatewayUpdate } from "./update-runner-DxpSPK-f.js";
47
+ import { t as runGatewayUpdate } from "./update-runner-B8UmqtLI.js";
48
48
  import { spawnSync } from "node:child_process";
49
49
  import * as os$1 from "node:os";
50
50
  import os from "node:os";
@@ -6851,7 +6851,7 @@ const nodeHandlers = {
6851
6851
  const p = params;
6852
6852
  const payloadJSON = typeof p.payloadJSON === "string" ? p.payloadJSON : p.payload !== void 0 ? JSON.stringify(p.payload) : null;
6853
6853
  await respondUnavailableOnThrow(respond, async () => {
6854
- const { handleNodeEvent } = await import("./server-node-events-89R9Ryky.js");
6854
+ const { handleNodeEvent } = await import("./server-node-events-Qp-gJMET.js");
6855
6855
  const nodeId = client?.connect?.device?.id ?? client?.connect?.client?.id ?? "node";
6856
6856
  await handleNodeEvent({
6857
6857
  deps: context.deps,
@@ -1,7 +1,7 @@
1
1
  import { g as resolveStateDir, t as CONFIG_PATH } from "./paths-Cqn-zk3M.js";
2
2
  import { D as isPlainObject, U as getResolvedLoggerSettings, r as clamp, y as resolveUserPath } from "./utils-B-0b9bGM.js";
3
3
  import { a as normalizeElevatedLevel, c as normalizeUsageDisplay, d as supportsXHighThinking, n as formatXHighModelHint, o as normalizeReasoningLevel, s as normalizeThinkLevel, t as formatThinkingLevels } from "./thinking-EAliFiVK.js";
4
- import { $n as OPENAI_TTS_MODELS, Bn as registerAgentRunContext, Bt as abortEmbeddedPiRun, C as ensureOutboundSessionEntry, Et as agentCommand, Ft as normalizeSendPolicy, G as normalizeCronJobPatch, Gn as resolveTtsApiKey, H as writeRestartSentinel, Hn as getTtsProvider, Ht as waitForEmbeddedPiRunEnd, It as resolveSendPolicy, Jn as resolveTtsPrefsPath, Kn as resolveTtsAutoMode, L as formatDoctorNonInteractiveHint, Mn as listSubagentRunsForRequester, Mt as resolveOutboundTarget, N as scheduleGatewaySigusr1Restart, Ot as resolveAgentDeliveryPlan, Pr as resolveAgentTimeoutMs, Qn as textToSpeech, Rt as createOutboundSendDeps, Sr as isSystemEventContextChanged, Tn as stopSubagentsForRequester, Un as isTtsEnabled, Vn as resolveUserTimezone, W as normalizeCronJobCreate, Wn as isTtsProviderConfigured, Xn as setTtsEnabled, Yn as resolveTtsProviderOrder, Zn as setTtsProvider, _ as loadCombinedSessionStoreForGateway, at as persistBrowserProxyFiles, b as resolveGatewaySessionStoreTarget, br as parseVerboseOverride, c as clearSessionQueues, er as OPENAI_TTS_VOICES, ft as loadSymiPlugins, g as listSessionsFromStore, gt as loadProviderUsageSummary, h as listAgentsForGateway, in as unbindThreadBindingsBySessionKey, it as applyBrowserProxyPaths, jn as listDescendantRunsForRequester, kt as resolveAgentOutboundTarget, mn as createReplyDispatcher, mt as normalizeGroupActivation, n as BARE_SESSION_RESET_PROMPT, p as canonicalizeSpawnedByForAgent, pn as dispatchInboundMessage, qn as resolveTtsConfig, v as loadSessionEntry, vr as applyModelOverrideToSessionEntry, w as resolveOutboundSessionRoute, wn as isAbortTrigger, x as resolveSessionModelRef, xn as formatZonedTimestamp, xr as enqueueSystemEvent, y as pruneLegacyStoreKeys, yr as applyVerboseOverride, zn as onAgentEvent } from "./reply-D40cmAci.js";
4
+ import { $n as OPENAI_TTS_MODELS, Bn as registerAgentRunContext, Bt as abortEmbeddedPiRun, C as ensureOutboundSessionEntry, Et as agentCommand, Ft as normalizeSendPolicy, G as normalizeCronJobPatch, Gn as resolveTtsApiKey, H as writeRestartSentinel, Hn as getTtsProvider, Ht as waitForEmbeddedPiRunEnd, It as resolveSendPolicy, Jn as resolveTtsPrefsPath, Kn as resolveTtsAutoMode, L as formatDoctorNonInteractiveHint, Mn as listSubagentRunsForRequester, Mt as resolveOutboundTarget, N as scheduleGatewaySigusr1Restart, Ot as resolveAgentDeliveryPlan, Pr as resolveAgentTimeoutMs, Qn as textToSpeech, Rt as createOutboundSendDeps, Sr as isSystemEventContextChanged, Tn as stopSubagentsForRequester, Un as isTtsEnabled, Vn as resolveUserTimezone, W as normalizeCronJobCreate, Wn as isTtsProviderConfigured, Xn as setTtsEnabled, Yn as resolveTtsProviderOrder, Zn as setTtsProvider, _ as loadCombinedSessionStoreForGateway, at as persistBrowserProxyFiles, b as resolveGatewaySessionStoreTarget, br as parseVerboseOverride, c as clearSessionQueues, er as OPENAI_TTS_VOICES, ft as loadSymiPlugins, g as listSessionsFromStore, gt as loadProviderUsageSummary, h as listAgentsForGateway, in as unbindThreadBindingsBySessionKey, it as applyBrowserProxyPaths, jn as listDescendantRunsForRequester, kt as resolveAgentOutboundTarget, mn as createReplyDispatcher, mt as normalizeGroupActivation, n as BARE_SESSION_RESET_PROMPT, p as canonicalizeSpawnedByForAgent, pn as dispatchInboundMessage, qn as resolveTtsConfig, v as loadSessionEntry, vr as applyModelOverrideToSessionEntry, w as resolveOutboundSessionRoute, wn as isAbortTrigger, x as resolveSessionModelRef, xn as formatZonedTimestamp, xr as enqueueSystemEvent, y as pruneLegacyStoreKeys, yr as applyVerboseOverride, zn as onAgentEvent } from "./reply-05js8eGB.js";
5
5
  import { S as parseAgentSessionKey, l as resolveAgentIdFromSessionKey, m as DEFAULT_ACCOUNT_ID, o as classifySessionKeyShape, s as normalizeAgentId, t as DEFAULT_AGENT_ID, x as isSubagentSessionKey } from "./session-key-DCt45XZa.js";
6
6
  import { t as resolveSymiPackageRoot } from "./symi-root-CrGJbkzf.js";
7
7
  import { C as createInternalHookEvent, T as triggerInternalHook, d as getActivePluginRegistry, r as DEFAULT_CHAT_CHANNEL, t as CHANNEL_IDS } from "./registry-Cja8eT7G.js";
@@ -39,14 +39,14 @@ import { t as WizardCancelledError } from "./prompts-Xu2Sveka.js";
39
39
  import { t as resolveChannelDefaultAccountId } from "./helpers-BcGbMZD1.js";
40
40
  import { t as buildChannelAccountSnapshot } from "./status-BrV-afZE.js";
41
41
  import { o as isNodeCommandAllowed, s as resolveNodeCommandAllowlist } from "./audit-CrITRV6w.js";
42
- import { n as getStatusSummary } from "./status-DHJLMwQN.js";
43
- import { s as setHeartbeatsEnabled } from "./health-DK6rAOhC.js";
42
+ import { n as getStatusSummary } from "./status-BATOXGRi.js";
43
+ import { s as setHeartbeatsEnabled } from "./health-CDGOsNeD.js";
44
44
  import { m as normalizeUpdateChannel } from "./update-check-CtckACbb.js";
45
- import { a as sendApnsAlert, c as parseMessageWithAttachments, i as resolveApnsAuthConfigFromEnv, l as formatForLog, n as normalizeApnsEnvironment, o as sendApnsBackgroundWake, s as normalizeRpcAttachmentsToChatAttachments, t as loadApnsRegistration } from "./push-apns-B5xZKIxK.js";
46
- import { a as pruneAgentConfig, i as loadAgentIdentity, r as findAgentEntryIndex, t as applyAgentConfig } from "./agents.config-Duce7lam.js";
45
+ import { a as sendApnsAlert, c as parseMessageWithAttachments, i as resolveApnsAuthConfigFromEnv, l as formatForLog, n as normalizeApnsEnvironment, o as sendApnsBackgroundWake, s as normalizeRpcAttachmentsToChatAttachments, t as loadApnsRegistration } from "./push-apns-DA7UMNQH.js";
46
+ import { a as pruneAgentConfig, i as loadAgentIdentity, r as findAgentEntryIndex, t as applyAgentConfig } from "./agents.config-BmdFH4J5.js";
47
47
  import { t as resolveSystemRunCommand } from "./system-run-command-ByVa3txU.js";
48
48
  import { t as installSkill } from "./skills-install-D67isO1L.js";
49
- import { t as runGatewayUpdate } from "./update-runner-FgrqoxvV.js";
49
+ import { t as runGatewayUpdate } from "./update-runner-CWJ4pC1b.js";
50
50
  import * as fs$2 from "node:fs";
51
51
  import fs from "node:fs";
52
52
  import * as os$1 from "node:os";
@@ -6853,7 +6853,7 @@ const nodeHandlers = {
6853
6853
  const p = params;
6854
6854
  const payloadJSON = typeof p.payloadJSON === "string" ? p.payloadJSON : p.payload !== void 0 ? JSON.stringify(p.payload) : null;
6855
6855
  await respondUnavailableOnThrow(respond, async () => {
6856
- const { handleNodeEvent } = await import("./server-node-events-RA8RurtC.js");
6856
+ const { handleNodeEvent } = await import("./server-node-events-qGqpsPxm.js");
6857
6857
  const nodeId = client?.connect?.device?.id ?? client?.connect?.client?.id ?? "node";
6858
6858
  await handleNodeEvent({
6859
6859
  deps: context.deps,
@@ -14,7 +14,7 @@ import "./client-DMBZpU6X.js";
14
14
  import "./call-BcE47FtD.js";
15
15
  import "./message-channel-C9dERklz.js";
16
16
  import "./pairing-token-Byh6drgn.js";
17
- import { Cn as enqueueSystemEvent, T as createOutboundSendDeps, dn as requestHeartbeatNow, dt as resolveOutboundTarget, x as agentCommand } from "./subagent-registry-Cb5e_x99.js";
17
+ import { Cn as enqueueSystemEvent, T as createOutboundSendDeps, dn as requestHeartbeatNow, dt as resolveOutboundTarget, x as agentCommand } from "./subagent-registry-lbDgDwLy.js";
18
18
  import { d as updateSessionStore } from "./sessions-CJXnZVjR.js";
19
19
  import "./tokens-Csntmwwn.js";
20
20
  import { r as normalizeChannelId } from "./plugins-CwSlLxM8.js";
@@ -98,7 +98,7 @@ import "./onboard-helpers-_pit1NZW.js";
98
98
  import "./prompt-style-DwCXob2h.js";
99
99
  import "./pairing-labels-D1HDboV2.js";
100
100
  import "./pi-tools.policy-De00gPXt.js";
101
- import { c as parseMessageWithAttachments, l as formatForLog, r as registerApnsToken, s as normalizeRpcAttachmentsToChatAttachments } from "./push-apns-DJddAK3u.js";
101
+ import { c as parseMessageWithAttachments, l as formatForLog, r as registerApnsToken, s as normalizeRpcAttachmentsToChatAttachments } from "./push-apns-CKKHlj6j.js";
102
102
  import { randomUUID } from "node:crypto";
103
103
 
104
104
  //#region src/gateway/server-node-events.ts
@@ -1,7 +1,7 @@
1
1
  import "./paths-Cqn-zk3M.js";
2
2
  import "./utils-B-0b9bGM.js";
3
3
  import "./thinking-EAliFiVK.js";
4
- import { Et as agentCommand, Mt as resolveOutboundTarget, Pt as createOutboundSendDeps, b as resolveGatewaySessionStoreTarget, st as requestHeartbeatNow, v as loadSessionEntry, xr as enqueueSystemEvent, y as pruneLegacyStoreKeys } from "./reply-D40cmAci.js";
4
+ import { Et as agentCommand, Mt as resolveOutboundTarget, Pt as createOutboundSendDeps, b as resolveGatewaySessionStoreTarget, st as requestHeartbeatNow, v as loadSessionEntry, xr as enqueueSystemEvent, y as pruneLegacyStoreKeys } from "./reply-05js8eGB.js";
5
5
  import { c as normalizeMainKey } from "./session-key-DCt45XZa.js";
6
6
  import "./registry-Cja8eT7G.js";
7
7
  import { f as defaultRuntime } from "./subsystem-D9vIQve0.js";
@@ -102,7 +102,7 @@ import "./pi-tools.policy-CIDBbw6x.js";
102
102
  import "./control-service-Bz7rxLWq.js";
103
103
  import "./stagger-BUClb97_.js";
104
104
  import "./channel-selection-DuWs0Aak.js";
105
- import { c as parseMessageWithAttachments, l as formatForLog, r as registerApnsToken, s as normalizeRpcAttachmentsToChatAttachments } from "./push-apns-B5xZKIxK.js";
105
+ import { c as parseMessageWithAttachments, l as formatForLog, r as registerApnsToken, s as normalizeRpcAttachmentsToChatAttachments } from "./push-apns-DA7UMNQH.js";
106
106
  import { randomUUID } from "node:crypto";
107
107
 
108
108
  //#region src/gateway/server-node-events.ts
@@ -1,6 +1,6 @@
1
1
  import { u as resolveGatewayPort } from "./paths-Cqn-zk3M.js";
2
2
  import { B as theme, k as info, z as isRich } from "./utils-B-0b9bGM.js";
3
- import { B as summarizeRestartSentinel, Jt as sha256HexPrefix, _t as formatUsageReportLines, a as buildChannelSummary, gt as loadProviderUsageSummary, h as listAgentsForGateway, m as classifySessionKey, o as buildChannelAccountSnapshot, pr as lookupContextTokens, s as formatChannelAllowFrom, wr as peekSystemEvents, x as resolveSessionModelRef, z as readRestartSentinel } from "./reply-D40cmAci.js";
3
+ import { B as summarizeRestartSentinel, Jt as sha256HexPrefix, _t as formatUsageReportLines, a as buildChannelSummary, gt as loadProviderUsageSummary, h as listAgentsForGateway, m as classifySessionKey, o as buildChannelAccountSnapshot, pr as lookupContextTokens, s as formatChannelAllowFrom, wr as peekSystemEvents, x as resolveSessionModelRef, z as readRestartSentinel } from "./reply-05js8eGB.js";
4
4
  import { S as parseAgentSessionKey } from "./session-key-DCt45XZa.js";
5
5
  import { t as resolveSymiPackageRoot } from "./symi-root-CrGJbkzf.js";
6
6
  import { n as runExec } from "./exec-CWkblSrI.js";
@@ -28,7 +28,7 @@ import { t as formatRuntimeStatusWithDetails } from "./runtime-status-CR9445g5.j
28
28
  import { t as readLastGatewayErrorLine } from "./diagnostics-BAMlsVVX.js";
29
29
  import { t as renderTable } from "./table-BTgkRafz.js";
30
30
  import { a as resolveGatewayProbeAuth$1, c as probeGateway, t as runSecurityAudit } from "./audit-CrITRV6w.js";
31
- import { a as resolveHeartbeatSummaryForAgent, t as formatHealthChannelLines } from "./health-DK6rAOhC.js";
31
+ import { a as resolveHeartbeatSummaryForAgent, t as formatHealthChannelLines } from "./health-CDGOsNeD.js";
32
32
  import { g as resolveUpdateChannelDisplay, i as formatGitInstallLabel, m as normalizeUpdateChannel, t as checkUpdateStatus } from "./update-check-CtckACbb.js";
33
33
  import { t as resolveNodeService } from "./node-service-Cxz4e-Qd.js";
34
34
  import { n as redactSecrets, t as formatGatewayAuthUsed } from "./format-yQZNwAF2.js";
@@ -9,7 +9,7 @@ import { c as resolveAgentWorkspaceDir } from "./agent-scope-D-jRCY0d.js";
9
9
  import { t as buildWorkspaceSkillStatus } from "./skills-status-DKXJ-tbi.js";
10
10
  import { H as VERSION, i as loadConfig, o as readConfigFileSnapshot } from "./config-DHBLS1Hl.js";
11
11
  import { n as callGateway, t as buildGatewayConnectionDetails } from "./call-BcE47FtD.js";
12
- import { En as peekSystemEvents, St as summarizeRestartSentinel, cn as buildChannelAccountSnapshot, in as formatUsageReportLines, ln as formatChannelAllowFrom, nt as sha256HexPrefix, rn as loadProviderUsageSummary, sn as buildChannelSummary, xt as readRestartSentinel } from "./subagent-registry-Cb5e_x99.js";
12
+ import { En as peekSystemEvents, St as summarizeRestartSentinel, cn as buildChannelAccountSnapshot, in as formatUsageReportLines, ln as formatChannelAllowFrom, nt as sha256HexPrefix, rn as loadProviderUsageSummary, sn as buildChannelSummary, xt as readRestartSentinel } from "./subagent-registry-lbDgDwLy.js";
13
13
  import { F as resolveMainSessionKey, j as resolveFreshSessionTotalTokens, o as loadSessionStore } from "./sessions-CJXnZVjR.js";
14
14
  import { n as listChannelPlugins } from "./plugins-CwSlLxM8.js";
15
15
  import { o as getTailnetHostname, s as readTailscaleStatusJson } from "./tailscale-CbbvYNVw.js";
@@ -29,7 +29,7 @@ import { t as formatRuntimeStatusWithDetails } from "./runtime-status-hFVEC3wO.j
29
29
  import { t as readLastGatewayErrorLine } from "./diagnostics-CS1ov_hH.js";
30
30
  import { t as renderTable } from "./table-D01d2GuY.js";
31
31
  import { a as resolveGatewayProbeAuth$1, c as probeGateway, t as runSecurityAudit } from "./audit-Byo5jCLN.js";
32
- import { o as resolveHeartbeatSummaryForAgent, t as formatHealthChannelLines } from "./health-BpHgCv-u.js";
32
+ import { o as resolveHeartbeatSummaryForAgent, t as formatHealthChannelLines } from "./health-CM1asUG8.js";
33
33
  import { g as resolveUpdateChannelDisplay, i as formatGitInstallLabel, m as normalizeUpdateChannel, t as checkUpdateStatus } from "./update-check-ZdimP1aU.js";
34
34
  import { t as resolveNodeService } from "./node-service-fcZExd22.js";
35
35
  import { n as redactSecrets, t as formatGatewayAuthUsed } from "./format-DVLB9DNB.js";
@@ -1,4 +1,4 @@
1
- import { dt as createPluginLoaderLogger, ft as loadSymiPlugins } from "./reply-D40cmAci.js";
1
+ import { dt as createPluginLoaderLogger, ft as loadSymiPlugins } from "./reply-05js8eGB.js";
2
2
  import { t as createSubsystemLogger } from "./subsystem-D9vIQve0.js";
3
3
  import { D as resolveDefaultAgentWorkspaceDir, c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId } from "./agent-scope-CgUHAtCo.js";
4
4
  import { i as loadConfig } from "./config-CHwyw6l5.js";
@@ -1,7 +1,7 @@
1
1
  import { o as createSubsystemLogger } from "./entry.js";
2
2
  import { D as resolveDefaultAgentWorkspaceDir, c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId } from "./agent-scope-D-jRCY0d.js";
3
3
  import { i as loadConfig } from "./config-DHBLS1Hl.js";
4
- import { m as loadSymiPlugins, p as createPluginLoaderLogger } from "./subagent-registry-Cb5e_x99.js";
4
+ import { m as loadSymiPlugins, p as createPluginLoaderLogger } from "./subagent-registry-lbDgDwLy.js";
5
5
 
6
6
  //#region src/plugins/status.ts
7
7
  const log = createSubsystemLogger("plugins");
@@ -32327,7 +32327,8 @@ const BUILTIN_PROFILES = [
32327
32327
  "<end_of_turn>"
32328
32328
  ],
32329
32329
  suppressMonologue: true,
32330
- hasStructuredThinking: false
32330
+ hasStructuredThinking: false,
32331
+ validateToolArgs: true
32331
32332
  },
32332
32333
  promptAdditions: [
32333
32334
  "CRITICAL OUTPUT RULES:",
@@ -32337,7 +32338,8 @@ const BUILTIN_PROFILES = [
32337
32338
  "- Do not write verification checklists, self-assessments, or numbered assessment lists after your answer.",
32338
32339
  "- Do not write 'Verification:', 'Requirements:', 'Status Check:', or 'Everything is correct'.",
32339
32340
  "- If you need to verify your work, do so before writing your response, not after.",
32340
- "- Send brief progress updates on long tasks so the user knows you are active."
32341
+ "- Send brief progress updates on long tasks so the user knows you are active.",
32342
+ "- When calling tools, provide arguments as clean values only. Never include <|, |>, or XML-like tags in tool argument values. For exec/bash commands, provide only valid shell syntax."
32341
32343
  ],
32342
32344
  ui: {
32343
32345
  badge: "Local",
@@ -32361,7 +32363,8 @@ const BUILTIN_PROFILES = [
32361
32363
  filters: {
32362
32364
  stripPatterns: [],
32363
32365
  suppressMonologue: false,
32364
- hasStructuredThinking: true
32366
+ hasStructuredThinking: true,
32367
+ validateToolArgs: false
32365
32368
  },
32366
32369
  promptAdditions: [],
32367
32370
  ui: {
@@ -32395,7 +32398,8 @@ const BUILTIN_PROFILES = [
32395
32398
  "^\\s*<bos>\\s*"
32396
32399
  ],
32397
32400
  suppressMonologue: true,
32398
- hasStructuredThinking: false
32401
+ hasStructuredThinking: false,
32402
+ validateToolArgs: true
32399
32403
  },
32400
32404
  promptAdditions: [
32401
32405
  "CRITICAL OUTPUT RULES:",
@@ -32406,7 +32410,8 @@ const BUILTIN_PROFILES = [
32406
32410
  "- Do not write 'Verification:', 'Requirements:', 'Status Check:', or 'Everything is correct'.",
32407
32411
  "- If you need to verify your work, do so before writing your response, not after.",
32408
32412
  "- Keep planning and reasoning internal. Only speak when you have a result or need user input.",
32409
- "- When working on multi-step tasks, send a brief one-line status update so the user knows you are active."
32413
+ "- When working on multi-step tasks, send a brief one-line status update so the user knows you are active.",
32414
+ "- When calling tools, provide arguments as clean values only. Never include <|, |>, or XML-like tags in tool argument values. For exec/bash commands, provide only valid shell syntax."
32410
32415
  ],
32411
32416
  ui: {
32412
32417
  badge: "CoreWeave",
@@ -32434,7 +32439,8 @@ const FALLBACK_PROFILE = {
32434
32439
  filters: {
32435
32440
  stripPatterns: [],
32436
32441
  suppressMonologue: false,
32437
- hasStructuredThinking: false
32442
+ hasStructuredThinking: false,
32443
+ validateToolArgs: false
32438
32444
  },
32439
32445
  promptAdditions: [],
32440
32446
  ui: {
@@ -32861,6 +32867,19 @@ function stripModelTokensAggressive(text, modelId) {
32861
32867
  }
32862
32868
  return result;
32863
32869
  }
32870
+ /**
32871
+ * Clean residual fragments left after aggressive token stripping.
32872
+ * After `<|` and `|>` are removed, orphaned `<`, `"`, `|` can remain
32873
+ * at string boundaries (e.g., `<<|"|uname -a` → `<"uname -a`).
32874
+ *
32875
+ * Conservative: only trims leading junk before what looks like a command,
32876
+ * and trailing junk. Does NOT touch content in the middle of the string.
32877
+ * Preserves heredoc syntax (`<<EOF`, `<<"EOF"`) via negative lookahead.
32878
+ */
32879
+ function cleanResidualTokenFragments(text) {
32880
+ if (!text) return text;
32881
+ return text.replace(/^[<"|]+(?!<[A-Z_])(?=[a-zA-Z0-9/~$.(])/gm, "").replace(/[<"|]+$/gm, "").trim();
32882
+ }
32864
32883
 
32865
32884
  //#endregion
32866
32885
  //#region src/agents/output-normalizer.ts
@@ -32946,10 +32965,14 @@ function detectRepetition(text, minBlock) {
32946
32965
  const searchStart = sampleStart + minBlock;
32947
32966
  return text.indexOf(sample, searchStart) >= 0;
32948
32967
  }
32968
+ function sanitizeStringValue(value, modelId) {
32969
+ const stripped = stripModelTokensAggressive(value, modelId);
32970
+ return isGemmaModel$1(modelId) ? cleanResidualTokenFragments(stripped) : stripped;
32971
+ }
32949
32972
  function sanitizeArgs(args, modelId) {
32950
32973
  const result = {};
32951
- for (const [key, value] of Object.entries(args)) if (typeof value === "string") result[key] = stripModelTokensAggressive(value, modelId);
32952
- else if (Array.isArray(value)) result[key] = value.map((item) => typeof item === "string" ? stripModelTokensAggressive(item, modelId) : item && typeof item === "object" ? sanitizeArgs(item, modelId) : item);
32974
+ for (const [key, value] of Object.entries(args)) if (typeof value === "string") result[key] = sanitizeStringValue(value, modelId);
32975
+ else if (Array.isArray(value)) result[key] = value.map((item) => typeof item === "string" ? sanitizeStringValue(item, modelId) : item && typeof item === "object" ? sanitizeArgs(item, modelId) : item);
32953
32976
  else if (value && typeof value === "object") result[key] = sanitizeArgs(value, modelId);
32954
32977
  else result[key] = value;
32955
32978
  return result;
@@ -35243,7 +35266,7 @@ async function recordLoopOutcome(args) {
35243
35266
  if (!args.ctx?.sessionKey) return;
35244
35267
  try {
35245
35268
  const { getDiagnosticSessionState } = await import("./diagnostic-session-state-CIjIGxEE.js").then((n) => n.n);
35246
- const { recordToolCallOutcome } = await import("./tool-loop-detection-BU3fbtCd.js");
35269
+ const { recordToolCallOutcome } = await import("./tool-loop-detection-D7qjFnRh.js");
35247
35270
  recordToolCallOutcome(getDiagnosticSessionState({
35248
35271
  sessionKey: args.ctx.sessionKey,
35249
35272
  sessionId: args.ctx?.agentId
@@ -35265,7 +35288,7 @@ async function runBeforeToolCallHook(args) {
35265
35288
  if (args.ctx?.sessionKey) {
35266
35289
  const { getDiagnosticSessionState } = await import("./diagnostic-session-state-CIjIGxEE.js").then((n) => n.n);
35267
35290
  const { logToolLoopAction } = await import("./diagnostic-Ci8Xsc_Y.js").then((n) => n.n);
35268
- const { detectToolCallLoop, recordToolCall } = await import("./tool-loop-detection-BU3fbtCd.js");
35291
+ const { detectToolCallLoop, recordToolCall } = await import("./tool-loop-detection-D7qjFnRh.js");
35269
35292
  const sessionState = getDiagnosticSessionState({
35270
35293
  sessionKey: args.ctx.sessionKey,
35271
35294
  sessionId: args.ctx?.agentId
@@ -35536,6 +35559,135 @@ function toClientToolDefinitions(tools, onClientToolCall, hookContext) {
35536
35559
  });
35537
35560
  }
35538
35561
 
35562
+ //#endregion
35563
+ //#region src/agents/pi-tools.validate.ts
35564
+ /**
35565
+ * Tool argument validation — validates that exec/bash commands contain
35566
+ * valid shell syntax after model token sanitization.
35567
+ *
35568
+ * Gated on ModelProfile.filters.validateToolArgs — only active for
35569
+ * models known to leak control tokens into structured output (Gemma, Ollama).
35570
+ *
35571
+ * @module
35572
+ */
35573
+ /**
35574
+ * Validate that a command string contains extractable valid shell syntax.
35575
+ * Returns the cleaned command if valid, or an error reason if not.
35576
+ *
35577
+ * Does NOT attempt to parse the full shell grammar — just checks for
35578
+ * obvious corruption (residual control tokens, empty commands).
35579
+ * Preserves heredocs, redirects, pipes, and other legitimate shell syntax.
35580
+ */
35581
+ function validateShellCommand(command) {
35582
+ if (!command || !command.trim()) return {
35583
+ valid: false,
35584
+ cleaned: "",
35585
+ reason: "empty command"
35586
+ };
35587
+ let cleaned = cleanResidualTokenFragments(command);
35588
+ if (/(?:^|[^<])<\|/.test(cleaned) || /\|>/.test(cleaned)) {
35589
+ cleaned = cleaned.replace(/<\|[^|>]*(?:\|>)?/g, "").trim();
35590
+ cleaned = cleanResidualTokenFragments(cleaned);
35591
+ }
35592
+ if (!cleaned || !cleaned.trim()) return {
35593
+ valid: false,
35594
+ cleaned: "",
35595
+ reason: "command is empty after removing control tokens"
35596
+ };
35597
+ if (!/[a-zA-Z0-9_/.~-]/.test(cleaned)) return {
35598
+ valid: false,
35599
+ cleaned,
35600
+ reason: "no recognizable shell command found"
35601
+ };
35602
+ return {
35603
+ valid: true,
35604
+ cleaned: cleaned.trim()
35605
+ };
35606
+ }
35607
+
35608
+ //#endregion
35609
+ //#region src/agents/pi-tools.validate-wrapper.ts
35610
+ const EXEC_TOOL_NAMES = new Set(["exec", "bash"]);
35611
+ const FILE_TOOL_NAMES = new Set([
35612
+ "write",
35613
+ "read",
35614
+ "edit",
35615
+ "patch",
35616
+ "file_write",
35617
+ "file_edit",
35618
+ "write_file",
35619
+ "edit_file",
35620
+ "create_file"
35621
+ ]);
35622
+ const FILE_PATH_KEYS = [
35623
+ "file_path",
35624
+ "path",
35625
+ "filePath"
35626
+ ];
35627
+ /**
35628
+ * Wrap tools with argument validation. Exec/bash commands and file paths
35629
+ * are validated. Other tools pass through unchanged.
35630
+ *
35631
+ * Call this AFTER tools are created and the model profile is resolved.
35632
+ */
35633
+ function wrapToolsWithArgValidation(tools, profile) {
35634
+ if (!profile.filters?.validateToolArgs) return tools;
35635
+ return tools.map((tool) => wrapToolWithArgValidation(tool));
35636
+ }
35637
+ /**
35638
+ * Clean a file path by stripping control token fragments.
35639
+ * Returns null if the path is irreparably corrupted (empty after cleanup).
35640
+ */
35641
+ function cleanFilePath(filePath) {
35642
+ let cleaned = filePath.replace(/<\|[^|>]*(?:\|>)?/g, "");
35643
+ cleaned = cleanResidualTokenFragments(cleaned);
35644
+ cleaned = cleaned.trim();
35645
+ if (!cleaned || !/[a-zA-Z0-9/._~-]/.test(cleaned)) return {
35646
+ valid: false,
35647
+ cleaned
35648
+ };
35649
+ return {
35650
+ valid: true,
35651
+ cleaned
35652
+ };
35653
+ }
35654
+ /**
35655
+ * Wrap a single tool with argument validation.
35656
+ */
35657
+ function wrapToolWithArgValidation(tool) {
35658
+ const toolName = (tool.name ?? "").toLowerCase().trim();
35659
+ const isExecTool = EXEC_TOOL_NAMES.has(toolName);
35660
+ const isFileTool = FILE_TOOL_NAMES.has(toolName);
35661
+ if (!isExecTool && !isFileTool) return tool;
35662
+ const originalExecute = tool.execute;
35663
+ return {
35664
+ ...tool,
35665
+ execute(toolCallId, params, ...rest) {
35666
+ if (isExecTool) {
35667
+ const command = params.command ?? params.cmd;
35668
+ if (typeof command !== "string") return originalExecute.call(tool, toolCallId, params, ...rest);
35669
+ const result = validateShellCommand(command);
35670
+ 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.` });
35671
+ if (result.cleaned !== command) return originalExecute.call(tool, toolCallId, {
35672
+ ...params,
35673
+ command: result.cleaned
35674
+ }, ...rest);
35675
+ return originalExecute.call(tool, toolCallId, params, ...rest);
35676
+ }
35677
+ const pathKey = FILE_PATH_KEYS.find((k) => typeof params[k] === "string");
35678
+ if (!pathKey) return originalExecute.call(tool, toolCallId, params, ...rest);
35679
+ const rawPath = params[pathKey];
35680
+ if (!rawPath.includes("<|") && !rawPath.includes("|>") && !/^[<"|]/.test(rawPath)) return originalExecute.call(tool, toolCallId, params, ...rest);
35681
+ const pathResult = cleanFilePath(rawPath);
35682
+ 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.` });
35683
+ return originalExecute.call(tool, toolCallId, {
35684
+ ...params,
35685
+ [pathKey]: pathResult.cleaned
35686
+ }, ...rest);
35687
+ }
35688
+ };
35689
+ }
35690
+
35539
35691
  //#endregion
35540
35692
  //#region src/agents/plan-mode.ts
35541
35693
  /**
@@ -39488,10 +39640,11 @@ async function runEmbeddedAttempt(params) {
39488
39640
  await resourceLoader.reload();
39489
39641
  }
39490
39642
  const hookRunner = getGlobalHookRunner();
39491
- const { builtInTools, customTools } = splitSdkTools({
39643
+ const { builtInTools: rawBuiltInTools, customTools } = splitSdkTools({
39492
39644
  tools,
39493
39645
  sandboxEnabled: !!sandbox?.enabled
39494
39646
  });
39647
+ const builtInTools = wrapToolsWithArgValidation(rawBuiltInTools, modelProfile);
39495
39648
  let clientToolCallDetected = null;
39496
39649
  const clientToolLoopDetection = resolveToolLoopDetectionConfig({
39497
39650
  cfg: params.config,
@@ -39700,6 +39853,10 @@ async function runEmbeddedAttempt(params) {
39700
39853
  });
39701
39854
  };
39702
39855
  const streamMonitor = createStreamMonitor(modelProfile);
39856
+ const TOOL_ERROR_ABORT_THRESHOLD = 5;
39857
+ const TOOL_ERROR_WARN_THRESHOLD = 3;
39858
+ let consecutiveToolErrors = 0;
39859
+ let lastErrorToolName = "";
39703
39860
  const subscription = subscribeEmbeddedPiSession({
39704
39861
  session: activeSession,
39705
39862
  runId: params.runId,
@@ -39721,6 +39878,25 @@ async function runEmbeddedAttempt(params) {
39721
39878
  onAgentEvent: (evt) => {
39722
39879
  armSymipulseTimer();
39723
39880
  params.onAgentEvent?.(evt);
39881
+ if (evt.stream === "tool" && !aborted) {
39882
+ const phase = typeof evt.data?.phase === "string" ? evt.data.phase : "";
39883
+ const toolName = typeof evt.data?.name === "string" ? evt.data.name : "";
39884
+ const isError = evt.data?.isError === true;
39885
+ if (phase === "result" && toolName) {
39886
+ if (isError && toolName === lastErrorToolName) consecutiveToolErrors++;
39887
+ else if (isError) {
39888
+ consecutiveToolErrors = 1;
39889
+ lastErrorToolName = toolName;
39890
+ } else {
39891
+ consecutiveToolErrors = 0;
39892
+ lastErrorToolName = "";
39893
+ }
39894
+ if (consecutiveToolErrors >= TOOL_ERROR_ABORT_THRESHOLD) {
39895
+ log$4.error(`Agent-loop circuit breaker: ${toolName} failed ${consecutiveToolErrors} consecutive times. Aborting run ${params.runId}.`);
39896
+ abortRun(false, /* @__PURE__ */ new Error(`Tool ${toolName} failed ${consecutiveToolErrors} consecutive times. The model may be generating corrupted tool arguments. Run aborted to prevent infinite loop.`));
39897
+ } else if (consecutiveToolErrors === TOOL_ERROR_WARN_THRESHOLD) log$4.warn(`Agent-loop tool error warning: ${toolName} failed ${consecutiveToolErrors} times consecutively. runId=${params.runId}`);
39898
+ }
39899
+ }
39724
39900
  if (evt.stream === "assistant" && typeof evt.data?.text === "string" && !aborted) {
39725
39901
  streamMonitor.onChunk(evt.data.text);
39726
39902
  if (streamMonitor.shouldStop()) log$4.debug(`stream monitor detection (log-only, no abort): runId=${params.runId} reason=${streamMonitor.getStopReason()}`);
@@ -52836,7 +53012,7 @@ function isVoiceChannelType(type) {
52836
53012
  function createDefaultDeps() {
52837
53013
  return {
52838
53014
  sendMessageWhatsApp: async (...args) => {
52839
- const { sendMessageWhatsApp } = await import("./web-Czp0JS6-.js");
53015
+ const { sendMessageWhatsApp } = await import("./web-CSrDbJJ7.js");
52840
53016
  return await sendMessageWhatsApp(...args);
52841
53017
  },
52842
53018
  sendMessageTelegram: async (...args) => {
@@ -68150,7 +68326,7 @@ function loadWebLoginQr() {
68150
68326
  return webLoginQrPromise;
68151
68327
  }
68152
68328
  function loadWebChannel() {
68153
- webChannelPromise ??= import("./web-Czp0JS6-.js");
68329
+ webChannelPromise ??= import("./web-CSrDbJJ7.js");
68154
68330
  return webChannelPromise;
68155
68331
  }
68156
68332
  function loadWhatsAppActions() {
@@ -9,6 +9,8 @@ const TOOL_CALL_HISTORY_SIZE = 30;
9
9
  const WARNING_THRESHOLD = 10;
10
10
  const CRITICAL_THRESHOLD = 20;
11
11
  const GLOBAL_CIRCUIT_BREAKER_THRESHOLD = 30;
12
+ const CONSECUTIVE_FAILURE_WARNING_THRESHOLD = 3;
13
+ const CONSECUTIVE_FAILURE_CRITICAL_THRESHOLD = 5;
12
14
  const DEFAULT_LOOP_DETECTION_CONFIG = {
13
15
  enabled: false,
14
16
  historySize: TOOL_CALL_HISTORY_SIZE,
@@ -18,8 +20,11 @@ const DEFAULT_LOOP_DETECTION_CONFIG = {
18
20
  detectors: {
19
21
  genericRepeat: true,
20
22
  knownPollNoProgress: true,
21
- pingPong: true
22
- }
23
+ pingPong: true,
24
+ consecutiveFailure: true
25
+ },
26
+ consecutiveFailureWarningThreshold: CONSECUTIVE_FAILURE_WARNING_THRESHOLD,
27
+ consecutiveFailureCriticalThreshold: CONSECUTIVE_FAILURE_CRITICAL_THRESHOLD
23
28
  };
24
29
  function asPositiveInt(value, fallback) {
25
30
  if (typeof value !== "number" || !Number.isInteger(value) || value <= 0) return fallback;
@@ -37,10 +42,13 @@ function resolveLoopDetectionConfig(config) {
37
42
  warningThreshold,
38
43
  criticalThreshold,
39
44
  globalCircuitBreakerThreshold,
45
+ consecutiveFailureWarningThreshold: asPositiveInt(config?.consecutiveFailureWarningThreshold, DEFAULT_LOOP_DETECTION_CONFIG.consecutiveFailureWarningThreshold),
46
+ consecutiveFailureCriticalThreshold: asPositiveInt(config?.consecutiveFailureCriticalThreshold, DEFAULT_LOOP_DETECTION_CONFIG.consecutiveFailureCriticalThreshold),
40
47
  detectors: {
41
48
  genericRepeat: config?.detectors?.genericRepeat ?? DEFAULT_LOOP_DETECTION_CONFIG.detectors.genericRepeat,
42
49
  knownPollNoProgress: config?.detectors?.knownPollNoProgress ?? DEFAULT_LOOP_DETECTION_CONFIG.detectors.knownPollNoProgress,
43
- pingPong: config?.detectors?.pingPong ?? DEFAULT_LOOP_DETECTION_CONFIG.detectors.pingPong
50
+ pingPong: config?.detectors?.pingPong ?? DEFAULT_LOOP_DETECTION_CONFIG.detectors.pingPong,
51
+ consecutiveFailure: (config?.detectors)?.consecutiveFailure ?? DEFAULT_LOOP_DETECTION_CONFIG.detectors.consecutiveFailure
44
52
  }
45
53
  };
46
54
  }
@@ -218,6 +226,22 @@ function canonicalPairKey(signatureA, signatureB) {
218
226
  return [signatureA, signatureB].toSorted().join("|");
219
227
  }
220
228
  /**
229
+ * Count consecutive error results for a specific tool, walking backward from
230
+ * the most recent call. A success or a call to a different tool resets the streak.
231
+ * Only counts entries that have been resolved (have a resultHash or isError flag).
232
+ */
233
+ function getConsecutiveFailureStreak(history, toolName) {
234
+ let count = 0;
235
+ for (let i = history.length - 1; i >= 0; i--) {
236
+ const entry = history[i];
237
+ if (entry.toolName !== toolName) break;
238
+ if (entry.resultHash === void 0 && entry.isError === void 0) break;
239
+ if (!entry.isError) break;
240
+ count++;
241
+ }
242
+ return count;
243
+ }
244
+ /**
221
245
  * Detect if an agent is stuck in a repetitive tool call loop.
222
246
  * Checks if the same tool+params combination has been called excessively.
223
247
  */
@@ -230,6 +254,31 @@ function detectToolCallLoop(state, toolName, params, config) {
230
254
  const noProgressStreak = noProgress.count;
231
255
  const knownPollTool = isKnownPollToolCall(toolName, params);
232
256
  const pingPong = getPingPongStreak(history, currentHash);
257
+ if (resolvedConfig.detectors.consecutiveFailure) {
258
+ const failureStreak = getConsecutiveFailureStreak(history, toolName);
259
+ if (failureStreak >= resolvedConfig.consecutiveFailureCriticalThreshold) {
260
+ log.error(`Consecutive failure circuit breaker: ${toolName} failed ${failureStreak} times in a row`);
261
+ return {
262
+ stuck: true,
263
+ level: "critical",
264
+ detector: "consecutive_failure",
265
+ count: failureStreak,
266
+ message: `CRITICAL: ${toolName} has failed ${failureStreak} consecutive times. Stop calling this tool. Explain to the user what you were trying to do and why it failed.`,
267
+ warningKey: `consecutive-failure:${toolName}`
268
+ };
269
+ }
270
+ if (failureStreak >= resolvedConfig.consecutiveFailureWarningThreshold) {
271
+ log.warn(`Consecutive failure warning: ${toolName} failed ${failureStreak} times in a row`);
272
+ return {
273
+ stuck: true,
274
+ level: "warning",
275
+ detector: "consecutive_failure",
276
+ count: failureStreak,
277
+ message: `WARNING: You have failed to call ${toolName} ${failureStreak} times consecutively. Stop retrying and explain to the user what you were trying to do. The tool arguments may contain invalid syntax from model control tokens.`,
278
+ warningKey: `consecutive-failure:${toolName}`
279
+ };
280
+ }
281
+ }
233
282
  if (noProgressStreak >= resolvedConfig.globalCircuitBreakerThreshold) {
234
283
  log.error(`Global circuit breaker triggered: ${toolName} repeated ${noProgressStreak} times with no progress`);
235
284
  return {
@@ -334,6 +383,7 @@ function recordToolCallOutcome(state, params) {
334
383
  if (call.toolName !== params.toolName || call.argsHash !== argsHash) continue;
335
384
  if (call.resultHash !== void 0) continue;
336
385
  call.resultHash = resultHash;
386
+ call.isError = params.error !== void 0;
337
387
  matched = true;
338
388
  break;
339
389
  }