@symerian/symi 2.6.7 → 2.6.9

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 (117) hide show
  1. package/dist/{agents-DPdRUY_O.js → agents-yeSooTtP.js} +4 -4
  2. package/dist/{agents.config-DIumfxnN.js → agents.config-DoTRueo1.js} +1 -1
  3. package/dist/{agents.config-Cr6DcdaD.js → agents.config-XOcM83Bx.js} +1 -1
  4. package/dist/{audio-preflight-CPBOQV4I.js → audio-preflight-C40mKAp7.js} +4 -4
  5. package/dist/{audio-preflight-BVaaZWkg.js → audio-preflight-DHTaS5U1.js} +4 -4
  6. package/dist/{auth-choice-z3-Baeyd.js → auth-choice-6h5vk1cG.js} +1 -1
  7. package/dist/{auth-choice-C5etRQcH.js → auth-choice-CSfG00oW.js} +1 -1
  8. package/dist/{banner-om7BRUIc.js → banner-C2tjwP2M.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-BqnokE7_.js → channel-options-5wdTOBFJ.js} +1 -1
  14. package/dist/{channel-options-Cb1PgfNV.js → channel-options-CHyjRl0C.js} +1 -1
  15. package/dist/{channel-web-DztB2W6w.js → channel-web-VYYpZqcw.js} +1 -1
  16. package/dist/{channels-cli-R2PHQWVd.js → channels-cli-CNS4BcpR.js} +4 -4
  17. package/dist/{channels-cli-xlZ2mjBu.js → channels-cli-Dm1d93Oy.js} +4 -4
  18. package/dist/{chrome-DkaXoP36.js → chrome-CDJYxX5a.js} +5 -5
  19. package/dist/{chrome-D2SKJnR7.js → chrome-DYZwl5Gv.js} +5 -5
  20. package/dist/{cli-DNGrFH7L.js → cli-D4MEJZ7W.js} +1 -1
  21. package/dist/{cli-DLly6H0w.js → cli-DqQ3teJy.js} +1 -1
  22. package/dist/{command-registry-DJbyskBr.js → command-registry-yzABgrim.js} +9 -9
  23. package/dist/{completion-cli-Dfw9JhkN.js → completion-cli-DDCDJyTb.js} +2 -2
  24. package/dist/{completion-cli-DosOadUD.js → completion-cli-zI_h8pr3.js} +1 -1
  25. package/dist/{config-cli-BaH8OVQ-.js → config-cli-Bth4qEO1.js} +1 -1
  26. package/dist/{config-cli-CbdeNt0M.js → config-cli-vqQE9gkx.js} +1 -1
  27. package/dist/{configure-BmNOfGox.js → configure-DU1IcIoq.js} +3 -3
  28. package/dist/{configure-D5dSJprr.js → configure-DyeOg2hp.js} +3 -3
  29. package/dist/{deliver-C-37cZUe.js → deliver-BH0l3UKW.js} +1 -1
  30. package/dist/{deliver-C46-vyqg.js → deliver-dODxSv3b.js} +1 -1
  31. package/dist/{doctor-completion-Xx92Sz9s.js → doctor-completion-BbWijhz0.js} +1 -1
  32. package/dist/{doctor-completion-DRucwWSo.js → doctor-completion-R-1oda1v.js} +1 -1
  33. package/dist/entry.js +1 -1
  34. package/dist/extensionAPI.js +6 -6
  35. package/dist/{gateway-cli-SlbXm0f7.js → gateway-cli-BFWLsB3b.js} +9 -9
  36. package/dist/{gateway-cli-D3kGHw5M.js → gateway-cli-DGKFkUrv.js} +9 -9
  37. package/dist/{glass-ui-ws-Cj9wbO1L.js → glass-ui-ws-DDgLRQXa.js} +7 -7
  38. package/dist/{glass-ui-ws-B7V2wHEu.js → glass-ui-ws-DFRu8a15.js} +7 -7
  39. package/dist/{health-DUKLANXu.js → health-BxPSqsO6.js} +1 -1
  40. package/dist/{health-BPOuBmYt.js → health-CJ7Y6Rln.js} +1 -1
  41. package/dist/{hooks-cli-BF0mbqlZ.js → hooks-cli-BAVmPXDl.js} +2 -2
  42. package/dist/{hooks-cli-BpfIySkB.js → hooks-cli-elIqdnzb.js} +2 -2
  43. package/dist/{image-DcpMiprB.js → image-CHzdaNJ4.js} +1 -1
  44. package/dist/{image-CuzFLQWC.js → image-CXu8W39c.js} +1 -1
  45. package/dist/index.js +6 -6
  46. package/dist/llm-slug-generator.js +6 -6
  47. package/dist/{models-Bt8lm_nD.js → models-CIUYv1__.js} +2 -2
  48. package/dist/{models-cli-bHYoiL5x.js → models-cli-DmffFgOZ.js} +2 -2
  49. package/dist/{models-cli-BmBmBUgl.js → models-cli-ydxkD2B-.js} +3 -3
  50. package/dist/{onboard-DFkXqe5P.js → onboard-BBZMfGdo.js} +2 -2
  51. package/dist/{onboard-DlY7trcj.js → onboard-DhJBvsPB.js} +2 -2
  52. package/dist/{onboard-channels-D0RHtaJE.js → onboard-channels-0wtc-NTC.js} +1 -1
  53. package/dist/{onboard-channels-DEFF3Rjo.js → onboard-channels-LCDTtAGK.js} +1 -1
  54. package/dist/{onboarding-mXPGwLNG.js → onboarding-Bm11jSTl.js} +3 -3
  55. package/dist/{onboarding-BEDqTyYQ.js → onboarding-Bs7a2RIn.js} +3 -3
  56. package/dist/{onboarding.finalize-DmeEphAd.js → onboarding.finalize-DOpAnwny.js} +5 -5
  57. package/dist/{onboarding.finalize-Ca-aQ6eE.js → onboarding.finalize-fdahnZvf.js} +6 -6
  58. package/dist/{pi-embedded-DPXbVwW0.js → pi-embedded-BwQa2XMa.js} +69 -68
  59. package/dist/{pi-embedded-helpers-B8kqLWns.js → pi-embedded-helpers-lgx_U5KS.js} +4 -4
  60. package/dist/{pi-embedded-helpers-CfqDGQ9J.js → pi-embedded-helpers-pubKo8HQ.js} +4 -4
  61. package/dist/{plugin-registry-CDIOKK_i.js → plugin-registry-CQCjMWVC.js} +1 -1
  62. package/dist/{plugin-registry-C1ghjhOE.js → plugin-registry-D3CP_n5q.js} +1 -1
  63. package/dist/plugin-sdk/agents/pi-tools.validate-wrapper.d.ts +8 -8
  64. package/dist/plugin-sdk/{channel-web-CxwLjrWk.js → channel-web-B76ttiD9.js} +1 -1
  65. package/dist/plugin-sdk/index.js +2 -2
  66. package/dist/plugin-sdk/{reply-CyZfsjrl.js → reply-CQPVXorK.js} +55 -54
  67. package/dist/plugin-sdk/{web-C2OyRvIo.js → web-DtkJFFr4.js} +2 -2
  68. package/dist/{plugins-cli-jv-Bqq1t.js → plugins-cli-D_r2gFIY.js} +2 -2
  69. package/dist/{plugins-cli-BFCJyRBX.js → plugins-cli-FUQHZ6tU.js} +2 -2
  70. package/dist/{program-T144qFaw.js → program-DwrSPQU4.js} +7 -7
  71. package/dist/{program-context-xpDrT9eG.js → program-context-CN4mNmYa.js} +17 -17
  72. package/dist/{prompt-select-styled-Bn4zyJmn.js → prompt-select-styled-BQW1Ropv.js} +4 -4
  73. package/dist/{prompt-select-styled-BN0aOmtR.js → prompt-select-styled-CK3VsV2a.js} +4 -4
  74. package/dist/{provider-auth-helpers-CqDTEFnD.js → provider-auth-helpers-Bg07iIOF.js} +1 -1
  75. package/dist/{provider-auth-helpers-CfBPNN7J.js → provider-auth-helpers-CY8preuC.js} +1 -1
  76. package/dist/{push-apns-CVRC-O3Q.js → push-apns-6u2NUzOH.js} +1 -1
  77. package/dist/{push-apns-CHIVwHRD.js → push-apns-D2hExRgY.js} +1 -1
  78. package/dist/{pw-ai-m0mj2KWK.js → pw-ai-B5asscAD.js} +1 -1
  79. package/dist/{pw-ai-1htA-NnS.js → pw-ai-De-KR9_s.js} +1 -1
  80. package/dist/{register.agent-DD2QErXm.js → register.agent-BhM4QQqa.js} +5 -5
  81. package/dist/{register.agent-B0ExzmtM.js → register.agent-BqRVkePg.js} +6 -6
  82. package/dist/{register.configure-DpHCcS5d.js → register.configure-0qzVn1Z5.js} +6 -6
  83. package/dist/{register.configure-ByNKeAo7.js → register.configure-BtnhfP3M.js} +6 -6
  84. package/dist/{register.maintenance-C9K829tk.js → register.maintenance-BNqMCfLm.js} +7 -7
  85. package/dist/{register.maintenance-Ck1jwY_N.js → register.maintenance-DrijKQoQ.js} +8 -8
  86. package/dist/{register.message-DZ45n1GX.js → register.message-2iSjsSI-.js} +2 -2
  87. package/dist/{register.message-BveFb6IW.js → register.message-CGexab2Y.js} +2 -2
  88. package/dist/{register.onboard-Byt2S-D0.js → register.onboard-D1b3xhDD.js} +4 -4
  89. package/dist/{register.onboard-BHUh0Xk1.js → register.onboard-DIAkE9FI.js} +4 -4
  90. package/dist/{register.setup-DCG9bst7.js → register.setup-Bvv5sUpg.js} +4 -4
  91. package/dist/{register.setup-BvB9oNh3.js → register.setup-Clq3FwZo.js} +4 -4
  92. package/dist/{register.status-health-sessions-CMJ_l4rs.js → register.status-health-sessions-IPxdVhoD.js} +3 -3
  93. package/dist/{register.status-health-sessions-DgNzHYE-.js → register.status-health-sessions-JHfNAhk3.js} +3 -3
  94. package/dist/{register.subclis-DnWR9l5V.js → register.subclis-C5wTDVDa.js} +9 -9
  95. package/dist/{reply-DcyKvFor.js → reply-dzRBlsmK.js} +55 -54
  96. package/dist/{run-main-B1aB8I5W.js → run-main-jPbs3Gm5.js} +14 -14
  97. package/dist/{runner-BcQ0sF9T.js → runner-DUBExAb5.js} +1 -1
  98. package/dist/{runner-CU9l0uJh.js → runner-WAG0M5s9.js} +1 -1
  99. package/dist/{server-methods-BdXCfO_O.js → server-methods-CJbZTdch.js} +7 -7
  100. package/dist/{server-methods-D1W-tViM.js → server-methods-DuaVOb2k.js} +7 -7
  101. package/dist/{server-node-events-DqVmWjof.js → server-node-events-BgFWyVCV.js} +2 -2
  102. package/dist/{server-node-events-BwGehjys.js → server-node-events-DesNIafd.js} +2 -2
  103. package/dist/{status-BvnWSBQl.js → status-BV22IA25.js} +1 -1
  104. package/dist/{status-BY4CnB2O.js → status-BxfE61b4.js} +2 -2
  105. package/dist/{status-kPaSg3RB.js → status-Bxkdy4Dq.js} +1 -1
  106. package/dist/{status-CfLq5R5j.js → status-DOB2UmDg.js} +2 -2
  107. package/dist/{subagent-registry-CVQOC9Jw.js → subagent-registry-DEdqc42m.js} +55 -54
  108. package/dist/{unified-runner-CxscxYKm.js → unified-runner-BIj2b1Y-.js} +69 -68
  109. package/dist/{update-cli-Bgrhor0g.js → update-cli-CNlljdlx.js} +8 -8
  110. package/dist/{update-cli-D5QWigS0.js → update-cli-D4OgWd1l.js} +7 -7
  111. package/dist/{update-runner-DdPdhkw5.js → update-runner-CZd6ajL6.js} +1 -1
  112. package/dist/{update-runner-CPOm0f_6.js → update-runner-Dtay-1lf.js} +1 -1
  113. package/dist/{web-DGLeD0Lo.js → web-B-E-mzTK.js} +6 -6
  114. package/dist/{web-DShKO-0L.js → web-DP9s1zzp.js} +6 -6
  115. package/dist/{web-ZnFT5LP9.js → web-DUi3cu-p.js} +1 -1
  116. package/dist/{web-DqjNQqGK.js → web-qJRZWEaD.js} +2 -2
  117. package/package.json +1 -1
@@ -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 "./subagent-registry-CVQOC9Jw.js";
17
+ import "./subagent-registry-DEdqc42m.js";
18
18
  import "./sessions-CJXnZVjR.js";
19
19
  import "./tokens-Csntmwwn.js";
20
20
  import "./plugins-CwSlLxM8.js";
@@ -99,18 +99,18 @@ import "./prompt-style-DwCXob2h.js";
99
99
  import "./pairing-labels-D1HDboV2.js";
100
100
  import "./pi-tools.policy-De00gPXt.js";
101
101
  import "./note-DDecZomM.js";
102
- import "./register.subclis-DnWR9l5V.js";
103
- import "./command-registry-DJbyskBr.js";
102
+ import "./register.subclis-C5wTDVDa.js";
103
+ import "./command-registry-yzABgrim.js";
104
104
  import "./program-context-CqzR_m-7.js";
105
- import { r as installCompletion } from "./completion-cli-Dfw9JhkN.js";
105
+ import { r as installCompletion } from "./completion-cli-DDCDJyTb.js";
106
106
  import { a as gatewayInstallErrorHint, i as buildGatewayInstallPlan, n as GATEWAY_DAEMON_RUNTIME_OPTIONS, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-CfRwa6qh.js";
107
107
  import "./runtime-guard-D7waq_Ho.js";
108
108
  import { r as isSystemdUserServiceAvailable } from "./systemd-DlMdyFDY.js";
109
109
  import { t as resolveGatewayService } from "./service-Cm9j9WzQ.js";
110
- import { r as healthCommand } from "./health-DUKLANXu.js";
110
+ import { r as healthCommand } from "./health-BxPSqsO6.js";
111
111
  import { t as ensureControlUiAssetsBuilt } from "./control-ui-assets-BseSWee1.js";
112
112
  import { t as formatHealthCheckFailure } from "./health-format-CzgUHmmX.js";
113
- import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-Xx92Sz9s.js";
113
+ import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-BbWijhz0.js";
114
114
  import { t as runTui } from "./tui-BJB80muc.js";
115
115
  import os from "node:os";
116
116
  import path from "node:path";
@@ -14,7 +14,7 @@ import { a as logoutWeb, i as logWebSelfId, l as readWebSelfId, p as webAuthExis
14
14
  import { t as normalizeChatType } from "./chat-type-DFDuk3FY.js";
15
15
  import { a as resolveSlackWebClientOptions, c as buildSlackBlocksFallbackText, i as createSlackWebClient, l as parseSlackTarget, o as parseSlackBlocksInput, s as validateSlackBlocksArray, t as sendMessageSlack, u as resolveSlackChannelId } from "./send-D-hWrHoH.js";
16
16
  import { $ as fetchChannelPermissionsDiscord, A as unpinMessageDiscord, B as listScheduledEventsDiscord, C as editMessageDiscord, Ct as resolveTimestampMs, D as pinMessageDiscord, Dt as normalizeChannelSlug, E as listThreadsDiscord, Et as buildChannelKeyCandidates, F as fetchMemberInfoDiscord, G as uploadStickerDiscord, H as timeoutMemberDiscord, I as fetchRoleInfoDiscord, J as editChannelDiscord, K as createChannelDiscord, L as fetchVoiceStatusDiscord, M as banMemberDiscord, N as createScheduledEventDiscord, O as readMessagesDiscord, Ot as resolveChannelEntryMatchWithFallback, P as fetchChannelInfoDiscord, Q as stripUndefinedFields, R as kickMemberDiscord, S as deleteMessageDiscord, St as resolveDiscordSystemLocation, T as listPinsDiscord, Tt as applyChannelMatchMeta, U as listGuildEmojisDiscord, V as removeRoleDiscord, W as uploadEmojiDiscord, X as removeChannelPermissionDiscord, Y as moveChannelDiscord, Z as setChannelPermissionDiscord, _ as sendPollDiscord, _t as resolveDiscordShouldRequireMention, a as removeReactionDiscord, at as resolveDiscordChannelId, b as sendWebhookMessageDiscord, bt as formatDiscordReactionEmoji, c as formatDiscordComponentEventText, ct as allowListMatches$1, d as parseDiscordModalCustomId, dt as normalizeDiscordSlug, et as hasAnyGuildPermissionDiscord, f as parseDiscordModalCustomIdForCarbon, ft as resolveDiscordAllowListMatch, g as sendMessageDiscord, gt as resolveDiscordOwnerAllowFrom, h as resolveDiscordModalEntry, ht as resolveDiscordMemberAccessState, i as removeOwnReactionsDiscord, it as parseDiscordTarget, j as addRoleDiscord, k as searchMessagesDiscord, l as parseDiscordComponentCustomId, lt as isDiscordGroupAllowedByPolicy, m as resolveDiscordComponentEntry, mt as resolveDiscordGuildEntry, n as fetchReactionsDiscord, nt as createDiscordClient, o as sendDiscordComponentMessage, ot as listDiscordDirectoryGroupsLive, p as readDiscordComponentSpec, pt as resolveDiscordChannelConfigWithFallback, q as deleteChannelDiscord, r as reactMessageDiscord, rt as createDiscordRestClient, s as createDiscordFormModal, st as listDiscordDirectoryPeersLive, tt as chunkDiscordTextWithMode, u as parseDiscordComponentCustomIdForCarbon, ut as normalizeDiscordAllowList, v as sendStickerDiscord, vt as resolveGroupDmAllow, w as fetchMessageDiscord, wt as fetchDiscord, x as createThreadDiscord, xt as formatDiscordUserTag, y as sendVoiceMessageDiscord, yt as shouldEmitDiscordReactionNotification, z as listGuildChannelsDiscord } from "./send-C1IYd3g7.js";
17
- import { C as getGlobalHookRunner, S as parseInlineDirectives$1, _ as normalizeTargetForProvider, a as normalizeOutboundPayloadsForJson, b as MEDIA_TOKEN_RE, c as applyReplyThreading, d as isRenderablePayload, f as shouldSuppressMessagingToolReplies, g as normalizeChannelTargetInput, h as buildTargetResolverSignature, i as normalizeOutboundPayloads, l as filterMessagingToolDuplicates, m as resolveReplyToMode, o as normalizeReplyPayloadsForDelivery, p as createReplyToModeFilterForChannel, r as formatOutboundPayloadLog, s as applyReplyTagsToPayload, t as deliverOutboundPayloads, u as filterMessagingToolMediaDuplicates, v as throwIfAborted, w as initializeGlobalHookRunner, x as splitMediaFromOutput, y as parseReplyDirectives } from "./deliver-C-37cZUe.js";
17
+ import { C as getGlobalHookRunner, S as parseInlineDirectives$1, _ as normalizeTargetForProvider, a as normalizeOutboundPayloadsForJson, b as MEDIA_TOKEN_RE, c as applyReplyThreading, d as isRenderablePayload, f as shouldSuppressMessagingToolReplies, g as normalizeChannelTargetInput, h as buildTargetResolverSignature, i as normalizeOutboundPayloads, l as filterMessagingToolDuplicates, m as resolveReplyToMode, o as normalizeReplyPayloadsForDelivery, p as createReplyToModeFilterForChannel, r as formatOutboundPayloadLog, s as applyReplyTagsToPayload, t as deliverOutboundPayloads, u as filterMessagingToolMediaDuplicates, v as throwIfAborted, w as initializeGlobalHookRunner, x as splitMediaFromOutput, y as parseReplyDirectives } from "./deliver-BH0l3UKW.js";
18
18
  import { a as logMessageProcessed, c as logWebhookError, d as startDiagnosticHeartbeat, f as stopDiagnosticHeartbeat, i as logLaneEnqueue, l as logWebhookProcessed, m as isDiagnosticsEnabled, o as logMessageQueued, p as emitDiagnosticEvent, r as logLaneDequeue, s as logSessionStateChange, t as diag, u as logWebhookReceived } from "./diagnostic-D0xmLpej.js";
19
19
  import { r as getDiagnosticSessionState } from "./diagnostic-session-state-C1vRJs5w.js";
20
20
  import { n as resolveSignalAccount, t as listEnabledSignalAccounts } from "./accounts-8zZqL37v.js";
@@ -22,10 +22,10 @@ import { $ as isVoiceCompatibleAudio, A as extractTelegramLocation, B as normali
22
22
  import { d as detectMime, f as extensionForMime, g as isGifMedia, h as isAudioFileName, i as getImageMetadata, m as imageMimeFromFormat, s as resizeToJpeg, x as mediaKindFromMime, y as MAX_IMAGE_BYTES } from "./image-ops-ByaQt43P.js";
23
23
  import { n as discoverModels, t as discoverAuthStorage } from "./pi-model-discovery-j5tVLINv.js";
24
24
  import { a as isMarkdownCapableMessageChannel, c as resolveGatewayMessageChannel, d as GATEWAY_CLIENT_MODES, f as GATEWAY_CLIENT_NAMES, i as isInternalMessageChannel, l as resolveMessageChannel, n as isDeliverableMessageChannel, o as listDeliverableMessageChannels, r as isGatewayMessageChannel, s as normalizeMessageChannel, t as INTERNAL_MESSAGE_CHANNEL, u as GATEWAY_CLIENT_IDS } from "./message-channel-BQINJQIT.js";
25
- import { $ as mergeDeliveryContext, A as isTransientHttpError, At as DEFAULT_UPLOAD_DIR, Bt as expandToolGroups, C as isContextOverflowError, Ct as resolveGroupSessionKey, D as isRateLimitAssistantError, Dt as registerBrowserRoutes, E as isLikelyContextOverflowError, Et as createBrowserRouteContext, F as resolveSandboxContext, Ft as resolveSandboxConfigForAgent, Gt as compileGlobPatterns, H as loadSessionStore, Ht as normalizeToolName, I as resolveSandboxRuntimeStatus, It as applyOwnerOnlyToolPolicy, J as updateSessionStoreEntry, Jt as ensureSessionHeader, K as updateLastRoute, Kt as matchesAnyGlobPattern, L as extractDeliveryInfo, Lt as buildPluginToolGroups, M as parseImageSizeError, Mt as getBridgeAuthForPort, N as sanitizeUserFacingText, Nt as ensureBrowserControlAuth, O as isRawApiErrorPayload, Ot as resolveBrowserConfig, P as ensureSandboxWorkspaceForSession, Pt as resolveBrowserControlAuth, Q as deliveryContextKey, R as parseSessionThreadInfo, Rt as collectExplicitAllowlist, S as isCompactionFailureError, St as deriveSessionMetaPatch, T as isFailoverErrorMessage, Tt as resolveSessionLockMaxHoldFromTimeout, U as readSessionUpdatedAt, Ut as resolveToolProfilePolicy, V as resolveAndPersistSessionFile, Vt as mergeAlsoAllowPolicy, W as recordSessionMetaFromInbound, Wt as stripPluginOnlyAllowlist, X as resolveCacheTtlMs$1, Xt as resolveBootstrapTotalMaxChars, Y as isCacheEnabled, Yt as resolveBootstrapMaxChars, Z as deliveryContextFromSession, Zt as sanitizeGoogleTurnOrdering, _ as formatRawAssistantErrorForUi, _t as DEFAULT_RESET_TRIGGERS, a as isMessagingToolDuplicateNormalized, at as countToolResults, b as isBillingAssistantError, bt as resolveExplicitAgentSessionKey, c as extractToolCallsFromAssistant, ct as applyInputProvenanceToUserMessage, d as isAntigravityClaude, dt as resolveSessionKey, et as normalizeDeliveryContext, f as isGoogleModelApi, ft as evaluateSessionFreshness, g as formatBillingErrorMessage, gt as resolveThreadFlag, h as formatAssistantErrorText, ht as resolveSessionResetType, it as capArrayByJsonBytes, j as parseImageDimensionError, jt as resolveExistingPathsWithinRoot, k as isTimeoutErrorMessage, kt as resolveProfile, l as extractToolResultId, lt as hasInterSessionUserProvenance, m as classifyFailoverReason, mt as resolveSessionResetPolicy, n as validateGeminiTurns, nt as normalizeAccountId$3, o as normalizeTextForComparison, ot as extractToolCallNames, p as BILLING_ERROR_USER_MESSAGE, pt as resolveChannelResetConfig, q as updateSessionStore, qt as buildBootstrapContextFiles, r as pickFallbackThinkingLevel, rt as archiveSessionTranscripts, s as sanitizeSessionMessagesImages, st as INPUT_PROVENANCE_KIND_VALUES, t as validateAnthropicTurns, tt as normalizeSessionDeliveryFields, u as downgradeOpenAIReasoningBlocks, ut as normalizeInputProvenance, v as getApiErrorPayloadFingerprint, vt as resolveFreshSessionTotalTokens, w as isFailoverAssistantError, wt as acquireSessionWriteLock, x as isCloudCodeAssistFormatError, xt as resolveMainSessionKey, y as isAuthAssistantError, yt as canonicalizeMainSessionAlias, z as appendAssistantMessageToSessionTranscript, zt as expandPolicyWithPluginGroups } from "./pi-embedded-helpers-B8kqLWns.js";
25
+ import { $ as mergeDeliveryContext, A as isTransientHttpError, At as DEFAULT_UPLOAD_DIR, Bt as expandToolGroups, C as isContextOverflowError, Ct as resolveGroupSessionKey, D as isRateLimitAssistantError, Dt as registerBrowserRoutes, E as isLikelyContextOverflowError, Et as createBrowserRouteContext, F as resolveSandboxContext, Ft as resolveSandboxConfigForAgent, Gt as compileGlobPatterns, H as loadSessionStore, Ht as normalizeToolName, I as resolveSandboxRuntimeStatus, It as applyOwnerOnlyToolPolicy, J as updateSessionStoreEntry, Jt as ensureSessionHeader, K as updateLastRoute, Kt as matchesAnyGlobPattern, L as extractDeliveryInfo, Lt as buildPluginToolGroups, M as parseImageSizeError, Mt as getBridgeAuthForPort, N as sanitizeUserFacingText, Nt as ensureBrowserControlAuth, O as isRawApiErrorPayload, Ot as resolveBrowserConfig, P as ensureSandboxWorkspaceForSession, Pt as resolveBrowserControlAuth, Q as deliveryContextKey, R as parseSessionThreadInfo, Rt as collectExplicitAllowlist, S as isCompactionFailureError, St as deriveSessionMetaPatch, T as isFailoverErrorMessage, Tt as resolveSessionLockMaxHoldFromTimeout, U as readSessionUpdatedAt, Ut as resolveToolProfilePolicy, V as resolveAndPersistSessionFile, Vt as mergeAlsoAllowPolicy, W as recordSessionMetaFromInbound, Wt as stripPluginOnlyAllowlist, X as resolveCacheTtlMs$1, Xt as resolveBootstrapTotalMaxChars, Y as isCacheEnabled, Yt as resolveBootstrapMaxChars, Z as deliveryContextFromSession, Zt as sanitizeGoogleTurnOrdering, _ as formatRawAssistantErrorForUi, _t as DEFAULT_RESET_TRIGGERS, a as isMessagingToolDuplicateNormalized, at as countToolResults, b as isBillingAssistantError, bt as resolveExplicitAgentSessionKey, c as extractToolCallsFromAssistant, ct as applyInputProvenanceToUserMessage, d as isAntigravityClaude, dt as resolveSessionKey, et as normalizeDeliveryContext, f as isGoogleModelApi, ft as evaluateSessionFreshness, g as formatBillingErrorMessage, gt as resolveThreadFlag, h as formatAssistantErrorText, ht as resolveSessionResetType, it as capArrayByJsonBytes, j as parseImageDimensionError, jt as resolveExistingPathsWithinRoot, k as isTimeoutErrorMessage, kt as resolveProfile, l as extractToolResultId, lt as hasInterSessionUserProvenance, m as classifyFailoverReason, mt as resolveSessionResetPolicy, n as validateGeminiTurns, nt as normalizeAccountId$3, o as normalizeTextForComparison, ot as extractToolCallNames, p as BILLING_ERROR_USER_MESSAGE, pt as resolveChannelResetConfig, q as updateSessionStore, qt as buildBootstrapContextFiles, r as pickFallbackThinkingLevel, rt as archiveSessionTranscripts, s as sanitizeSessionMessagesImages, st as INPUT_PROVENANCE_KIND_VALUES, t as validateAnthropicTurns, tt as normalizeSessionDeliveryFields, u as downgradeOpenAIReasoningBlocks, ut as normalizeInputProvenance, v as getApiErrorPayloadFingerprint, vt as resolveFreshSessionTotalTokens, w as isFailoverAssistantError, wt as acquireSessionWriteLock, x as isCloudCodeAssistFormatError, xt as resolveMainSessionKey, y as isAuthAssistantError, yt as canonicalizeMainSessionAlias, z as appendAssistantMessageToSessionTranscript, zt as expandPolicyWithPluginGroups } from "./pi-embedded-helpers-lgx_U5KS.js";
26
26
  import { A as VERSION, C as getConfigValueAtPath, D as isSafeExecutableValue, E as unsetConfigValueAtPath, O as DEFAULT_SUBAGENT_MAX_SPAWN_DEPTH, S as unsetConfigOverride, T as setConfigValueAtPath, _ as parseDurationMs, a as writeConfigFile, b as resetConfigOverrides, c as TELEGRAM_COMMAND_NAME_PATTERN, f as isInboundPathAllowed, g as normalizeScpRemoteHost, h as resolveIMessageRemoteAttachmentRoots, i as resolveConfigSnapshotHash, k as resolveAgentMaxConcurrent, l as normalizeTelegramCommandName, m as resolveIMessageAttachmentRoots, n as loadConfig, o as validateConfigObjectWithPlugins, r as readConfigFileSnapshot, u as resolveTelegramCustomCommands, v as validateJsonSchemaValue, w as parseConfigPath, x as setConfigOverride, y as getConfigOverrides } from "./config-BmV60pPT.js";
27
27
  import { c as normalizePluginsConfig, f as isPathInsideWithRealpath, i as safeStatSync, l as resolveEnableState, n as discoverSymiPlugins, p as isDangerousHostEnvVarName, r as isPathInside, s as applyTestPluginDefaults, t as loadPluginManifestRegistry, u as resolveMemorySlotDecision } from "./manifest-registry-D-mTF1cj.js";
28
- import { C as rawDataToString, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, T as isSecureWebSocketUrl, x as ensureChromeExtensionRelayServer } from "./chrome-D2SKJnR7.js";
28
+ import { C as rawDataToString, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, T as isSecureWebSocketUrl, x as ensureChromeExtensionRelayServer } from "./chrome-CDJYxX5a.js";
29
29
  import { c as assertSandboxPath, d as resolveSandboxedMediaSource, f as applySkillEnvOverrides, i as resolveSkillsPromptForRun, l as resolveSandboxInputPath, n as buildWorkspaceSkillSnapshot, p as applySkillEnvOverridesFromSnapshot, r as loadWorkspaceSkillEntries, s as assertMediaNotDataUrl } from "./skills-BNpGMnp-.js";
30
30
  import { n as formatErrorMessage, r as formatUncaughtError } from "./errors-CPfngF0S.js";
31
31
  import { i as isBlockedHostnameOrIp, o as normalizeHostname, t as SsrFBlockedError } from "./ssrf-CxfFyMRZ.js";
@@ -36,7 +36,7 @@ import { t as resolveIMessageAccount } from "./accounts-DImOt9jX.js";
36
36
  import { i as resolveSessionTranscriptPath, n as resolveSessionFilePath, o as resolveSessionTranscriptsDirForAgent, r as resolveSessionFilePathOptions, s as resolveStorePath, t as resolveDefaultSessionStorePath } from "./paths-DkMamAQ-.js";
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-ChC2CXaN.js";
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-DcpMiprB.js";
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-CHzdaNJ4.js";
40
40
  import { i as resolveMemorySearchConfig, n as probeOllamaEmbeddingModels, r as resolveOllamaBaseUrl } from "./manager-jpn5vRTY.js";
41
41
  import { d as listMemoryFiles, f as normalizeExtraMemoryPaths, g as runTasksWithConcurrency } from "./sqlite-BNh23mUR.js";
42
42
  import { n as retryAsync } from "./retry-QGp0jvVi.js";
@@ -49,7 +49,7 @@ import { a as loadWebMedia, i as getDefaultLocalRoots } from "./ir-F0moAwIl.js";
49
49
  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-C_aYUwpl.js";
50
50
  import { c as getSkillsSnapshotVersion, d as createAsyncLock, f as readJsonFile, i as resolveSkillCommandInvocation, l as pruneExpiredPending, n as listSkillCommandsForAgents, o as getRemoteSkillEligibility, p as writeJsonAtomic, r as listSkillCommandsForWorkspace, s as ensureSkillsWatcher, t as listReservedChatSlashCommandNames, u as resolvePairingPaths } from "./skill-commands-DklY7Cj7.js";
51
51
  import { r as normalizeInboundTextNewlines, t as finalizeInboundContext } from "./inbound-context-QOi5vzUt.js";
52
- import { _ as resolveMediaUnderstandingScope, a as resolveMediaAttachmentLocalRoots, c as loadModelCatalog, d as resolveAttachmentKind, f as buildRandomTempFilePath, g as normalizeMediaUnderstandingChatType, h as resolveTimeoutMs$1, i as resolveAutoImageModel, l as modelSupportsVision, m as resolveConcurrency, n as createMediaAttachmentCache, o as runCapability, p as registerUnhandledRejectionHandler, r as normalizeMediaAttachments, s as findModelInCatalog, t as buildProviderRegistry, v as CLI_OUTPUT_MAX_BUFFER, y as applyTemplate } from "./runner-BcQ0sF9T.js";
52
+ import { _ as resolveMediaUnderstandingScope, a as resolveMediaAttachmentLocalRoots, c as loadModelCatalog, d as resolveAttachmentKind, f as buildRandomTempFilePath, g as normalizeMediaUnderstandingChatType, h as resolveTimeoutMs$1, i as resolveAutoImageModel, l as modelSupportsVision, m as resolveConcurrency, n as createMediaAttachmentCache, o as runCapability, p as registerUnhandledRejectionHandler, r as normalizeMediaAttachments, s as findModelInCatalog, t as buildProviderRegistry, v as CLI_OUTPUT_MAX_BUFFER, y as applyTemplate } from "./runner-DUBExAb5.js";
53
53
  import { n as wrapFetchWithAbortSignal, t as resolveFetch } from "./fetch-DtLn7YU3.js";
54
54
  import { n as recordCommandPoll, r as resetCommandPollCount } from "./command-poll-backoff-DtXYsHEc.js";
55
55
  import { n as recordChannelActivity, r as createDiscordRetryRunner, t as getChannelActivity } from "./channel-activity-D9q-fIPB.js";
@@ -79,7 +79,7 @@ import { EdgeTTS } from "node-edge-tts";
79
79
  import AjvPkg from "ajv";
80
80
  import { createServer } from "node:http";
81
81
  import { ProxyAgent, fetch as fetch$1 } from "undici";
82
- import WebSocket, { WebSocket as WebSocket$1 } from "ws";
82
+ import WebSocket$1, { WebSocket } from "ws";
83
83
  import { Buffer as Buffer$1 } from "node:buffer";
84
84
  import { createJiti } from "jiti";
85
85
  import { Type } from "@sinclair/typebox";
@@ -5714,7 +5714,7 @@ var GatewayClient = class {
5714
5714
  if (fingerprint !== expected) return /* @__PURE__ */ new Error("gateway tls fingerprint mismatch");
5715
5715
  });
5716
5716
  }
5717
- this.ws = new WebSocket$1(url, wsOptions);
5717
+ this.ws = new WebSocket(url, wsOptions);
5718
5718
  this.ws.on("open", () => {
5719
5719
  if (url.startsWith("wss://") && this.opts.tlsFingerprint) {
5720
5720
  const tlsError = this.validateTlsFingerprint();
@@ -5933,7 +5933,7 @@ var GatewayClient = class {
5933
5933
  return null;
5934
5934
  }
5935
5935
  async request(method, params, opts) {
5936
- if (!this.ws || this.ws.readyState !== WebSocket$1.OPEN) throw new Error("gateway not connected");
5936
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) throw new Error("gateway not connected");
5937
5937
  const id = randomUUID();
5938
5938
  const frame = {
5939
5939
  type: "req",
@@ -7199,7 +7199,7 @@ async function routeReply(params) {
7199
7199
  const resolvedReplyToId = replyToId ?? (channelId === "slack" && threadId != null && threadId !== "" ? String(threadId) : void 0);
7200
7200
  const resolvedThreadId = channelId === "slack" ? null : threadId ?? null;
7201
7201
  try {
7202
- const { deliverOutboundPayloads } = await import("./deliver-C-37cZUe.js").then((n) => n.n);
7202
+ const { deliverOutboundPayloads } = await import("./deliver-BH0l3UKW.js").then((n) => n.n);
7203
7203
  return {
7204
7204
  ok: true,
7205
7205
  messageId: (await deliverOutboundPayloads({
@@ -39867,13 +39867,19 @@ function normalizeEvent(event, normalizer) {
39867
39867
  const tc = event.toolCall;
39868
39868
  if (tc.arguments && typeof tc.arguments === "object") {
39869
39869
  const cleanedArgs = normalizer.normalizeToolArgs(tc.arguments);
39870
- return { event: {
39870
+ const patchedEvent = {
39871
39871
  ...event,
39872
39872
  toolCall: {
39873
39873
  ...tc,
39874
39874
  arguments: cleanedArgs
39875
39875
  }
39876
- } };
39876
+ };
39877
+ const partial = patchedEvent.partial;
39878
+ if (partial && typeof partial === "object" && Array.isArray(partial.content)) {
39879
+ const content = partial.content;
39880
+ for (const block of content) if (block.type === "toolCall" && block.id === tc.id) block.arguments = cleanedArgs;
39881
+ }
39882
+ return { event: patchedEvent };
39877
39883
  }
39878
39884
  return { event };
39879
39885
  }
@@ -42339,25 +42345,10 @@ function validateShellCommand(command) {
42339
42345
  //#region src/agents/pi-tools.validate-wrapper.ts
42340
42346
  const log$1 = createSubsystemLogger("agents/tool-validate");
42341
42347
  const EXEC_TOOL_NAMES = new Set(["exec", "bash"]);
42342
- const FILE_TOOL_NAMES = new Set([
42343
- "write",
42344
- "read",
42345
- "edit",
42346
- "patch",
42347
- "file_write",
42348
- "file_edit",
42349
- "write_file",
42350
- "edit_file",
42351
- "create_file"
42352
- ]);
42353
- const FILE_PATH_KEYS = [
42354
- "file_path",
42355
- "path",
42356
- "filePath"
42357
- ];
42348
+ const GEMMA_MODEL_ID = "gemma";
42358
42349
  /**
42359
- * Wrap tools with argument validation. Exec/bash commands and file paths
42360
- * are validated. Other tools pass through unchanged.
42350
+ * Wrap ALL tools with universal string argument sanitization.
42351
+ * Exec/bash tools get additional structural command validation.
42361
42352
  *
42362
42353
  * Call this AFTER tools are created and the model profile is resolved.
42363
42354
  */
@@ -42367,44 +42358,64 @@ function wrapToolsWithArgValidation(tools, profile) {
42367
42358
  return tools;
42368
42359
  }
42369
42360
  const wrapped = tools.map((tool) => wrapToolWithArgValidation(tool));
42370
- const wrappedNames = wrapped.filter((t, i) => t !== tools[i]).map((t) => t.name);
42371
- log$1.debug(`[validate] applied to ${wrappedNames.length} tools: ${wrappedNames.join(",") || "(none matched)"}`);
42361
+ log$1.debug(`[validate] universal sanitizer applied to ${wrapped.length} tools`);
42372
42362
  return wrapped;
42373
42363
  }
42374
42364
  /**
42375
- * Clean a file path by stripping control token fragments.
42376
- * Returns null if the path is irreparably corrupted (empty after cleanup).
42365
+ * Sanitize a single string value: strip control tokens + residual fragments.
42366
+ * Returns the cleaned string, or the original if no changes needed.
42377
42367
  */
42378
- function cleanFilePath(filePath) {
42379
- let cleaned = filePath.replace(/<\|[^|>]*(?:\|>)?/g, "");
42380
- cleaned = cleanResidualTokenFragments(cleaned);
42381
- cleaned = cleaned.trim();
42382
- if (!cleaned || !/[a-zA-Z0-9/._~-]/.test(cleaned)) return {
42383
- valid: false,
42384
- cleaned
42385
- };
42368
+ function sanitizeString(value) {
42369
+ return cleanResidualTokenFragments(stripModelTokensAggressive(value, GEMMA_MODEL_ID));
42370
+ }
42371
+ /**
42372
+ * Check if a string contains control token patterns that need sanitization.
42373
+ * Fast check to avoid unnecessary work on clean strings.
42374
+ */
42375
+ function needsSanitization(value) {
42376
+ return value.includes("<|") || value.includes("|>") || /^[<"|]/.test(value);
42377
+ }
42378
+ /**
42379
+ * Recursively sanitize all string values in a params object.
42380
+ * Returns a new object if any values were changed, or the original if clean.
42381
+ */
42382
+ function sanitizeParams(params) {
42383
+ let changed = false;
42384
+ const cleaned = {};
42385
+ for (const [key, value] of Object.entries(params)) {
42386
+ if (typeof value === "string" && needsSanitization(value)) {
42387
+ const sanitized = sanitizeString(value);
42388
+ if (sanitized !== value) {
42389
+ cleaned[key] = sanitized;
42390
+ changed = true;
42391
+ continue;
42392
+ }
42393
+ }
42394
+ cleaned[key] = value;
42395
+ }
42386
42396
  return {
42387
- valid: true,
42388
- cleaned
42397
+ cleaned,
42398
+ changed
42389
42399
  };
42390
42400
  }
42391
42401
  /**
42392
- * Wrap a single tool with argument validation.
42402
+ * Wrap a single tool with universal argument sanitization.
42393
42403
  */
42394
42404
  function wrapToolWithArgValidation(tool) {
42395
42405
  const toolName = (tool.name ?? "").toLowerCase().trim();
42396
42406
  const isExecTool = EXEC_TOOL_NAMES.has(toolName);
42397
- const isFileTool = FILE_TOOL_NAMES.has(toolName);
42398
- if (!isExecTool && !isFileTool) return tool;
42399
42407
  const originalExecute = tool.execute;
42400
42408
  return {
42401
42409
  ...tool,
42402
42410
  execute(toolCallId, params, ...rest) {
42411
+ const { cleaned, changed } = sanitizeParams(params);
42412
+ if (changed) log$1.debug(`[validate] sanitized args for ${toolName}: ${Object.keys(params).filter((k) => cleaned[k] !== params[k]).join(",")}`);
42413
+ const effectiveParams = changed ? cleaned : params;
42403
42414
  if (isExecTool) {
42404
- const command = params.command ?? params.cmd;
42415
+ const command = effectiveParams.command ?? effectiveParams.cmd;
42405
42416
  if (typeof command !== "string") {
42406
- log$1.debug(`[validate] exec called without string command: keys=${Object.keys(params).join(",")}`);
42407
- return originalExecute.call(tool, toolCallId, params, ...rest);
42417
+ log$1.debug(`[validate] exec called without string command: keys=${Object.keys(effectiveParams).join(",")}`);
42418
+ return originalExecute.call(tool, toolCallId, effectiveParams, ...rest);
42408
42419
  }
42409
42420
  const result = validateShellCommand(command);
42410
42421
  if (!result.valid) {
@@ -42414,22 +42425,12 @@ function wrapToolWithArgValidation(tool) {
42414
42425
  if (result.cleaned !== command) {
42415
42426
  log$1.debug(`[validate] exec command cleaned: raw=${command.slice(0, 80)} → cleaned=${result.cleaned.slice(0, 80)}`);
42416
42427
  return originalExecute.call(tool, toolCallId, {
42417
- ...params,
42428
+ ...effectiveParams,
42418
42429
  command: result.cleaned
42419
42430
  }, ...rest);
42420
42431
  }
42421
- return originalExecute.call(tool, toolCallId, params, ...rest);
42422
42432
  }
42423
- const pathKey = FILE_PATH_KEYS.find((k) => typeof params[k] === "string");
42424
- if (!pathKey) return originalExecute.call(tool, toolCallId, params, ...rest);
42425
- const rawPath = params[pathKey];
42426
- if (!rawPath.includes("<|") && !rawPath.includes("|>") && !/^[<"|]/.test(rawPath)) return originalExecute.call(tool, toolCallId, params, ...rest);
42427
- const pathResult = cleanFilePath(rawPath);
42428
- 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.` });
42429
- return originalExecute.call(tool, toolCallId, {
42430
- ...params,
42431
- [pathKey]: pathResult.cleaned
42432
- }, ...rest);
42433
+ return originalExecute.call(tool, toolCallId, effectiveParams, ...rest);
42433
42434
  }
42434
42435
  };
42435
42436
  }
@@ -50710,7 +50711,7 @@ async function deliverSessionMaintenanceWarning(params) {
50710
50711
  return;
50711
50712
  }
50712
50713
  try {
50713
- const { deliverOutboundPayloads } = await import("./deliver-C-37cZUe.js").then((n) => n.n);
50714
+ const { deliverOutboundPayloads } = await import("./deliver-BH0l3UKW.js").then((n) => n.n);
50714
50715
  await deliverOutboundPayloads({
50715
50716
  cfg: params.cfg,
50716
50717
  channel,
@@ -54156,7 +54157,7 @@ async function describeStickerImage(params) {
54156
54157
  logVerbose(`telegram: describing sticker with ${provider}/${model}`);
54157
54158
  try {
54158
54159
  const buffer = await fs$1.readFile(imagePath);
54159
- const { describeImageWithModel } = await import("./image-DcpMiprB.js").then((n) => n.n);
54160
+ const { describeImageWithModel } = await import("./image-CHzdaNJ4.js").then((n) => n.n);
54160
54161
  return (await describeImageWithModel({
54161
54162
  buffer,
54162
54163
  fileName: "sticker.webp",
@@ -56818,7 +56819,7 @@ async function preflightDiscordMessage(params) {
56818
56819
  let preflightTranscript;
56819
56820
  const hasAudioAttachment = message.attachments?.some((att) => att.contentType?.startsWith("audio/"));
56820
56821
  if (!isDirectMessage && shouldRequireMention && hasAudioAttachment && !baseText && mentionRegexes.length > 0) try {
56821
- const { transcribeFirstAudio } = await import("./audio-preflight-CPBOQV4I.js");
56822
+ const { transcribeFirstAudio } = await import("./audio-preflight-C40mKAp7.js");
56822
56823
  const audioPaths = message.attachments?.filter((att) => att.contentType?.startsWith("audio/")).map((att) => att.url) ?? [];
56823
56824
  if (audioPaths.length > 0) preflightTranscript = await transcribeFirstAudio({
56824
56825
  ctx: {
@@ -60601,7 +60602,7 @@ function isVoiceChannelType(type) {
60601
60602
  function createDefaultDeps() {
60602
60603
  return {
60603
60604
  sendMessageWhatsApp: async (...args) => {
60604
- const { sendMessageWhatsApp } = await import("./web-DGLeD0Lo.js");
60605
+ const { sendMessageWhatsApp } = await import("./web-B-E-mzTK.js");
60605
60606
  return await sendMessageWhatsApp(...args);
60606
60607
  },
60607
60608
  sendMessageTelegram: async (...args) => {
@@ -63506,7 +63507,7 @@ function createDiscordGatewayPlugin(params) {
63506
63507
  super(options);
63507
63508
  }
63508
63509
  createWebSocket(url) {
63509
- return new WebSocket(url, { agent });
63510
+ return new WebSocket$1(url, { agent });
63510
63511
  }
63511
63512
  }
63512
63513
  return new ProxyGatewayPlugin();
@@ -73724,7 +73725,7 @@ const buildTelegramMessageContext = async ({ primaryCtx, allMedia, storeAllowFro
73724
73725
  const hasAudio = allMedia.some((media) => media.contentType?.startsWith("audio/"));
73725
73726
  let preflightTranscript;
73726
73727
  if (isGroup && requireMention && hasAudio && !hasUserText && mentionRegexes.length > 0) try {
73727
- const { transcribeFirstAudio } = await import("./audio-preflight-CPBOQV4I.js");
73728
+ const { transcribeFirstAudio } = await import("./audio-preflight-C40mKAp7.js");
73728
73729
  preflightTranscript = await transcribeFirstAudio({
73729
73730
  ctx: {
73730
73731
  MediaPaths: allMedia.length > 0 ? allMedia.map((m) => m.path) : void 0,
@@ -75881,7 +75882,7 @@ function loadWebLoginQr() {
75881
75882
  return webLoginQrPromise;
75882
75883
  }
75883
75884
  function loadWebChannel() {
75884
- webChannelPromise ??= import("./web-DGLeD0Lo.js");
75885
+ webChannelPromise ??= import("./web-B-E-mzTK.js");
75885
75886
  return webChannelPromise;
75886
75887
  }
75887
75888
  function loadWhatsAppActions() {
@@ -10,7 +10,7 @@ import { t as normalizeChatType } from "./chat-type-DFDuk3FY.js";
10
10
  import { c as SafeOpenError, i as getImageMetadata, l as openFileWithinRoot, n as buildImageResizeSideGrid, s as resizeToJpeg, t as IMAGE_REDUCE_QUALITY_STEPS } from "./image-ops-ByaQt43P.js";
11
11
  import { o as listDeliverableMessageChannels, s as normalizeMessageChannel } from "./message-channel-BQINJQIT.js";
12
12
  import { _ as parseDurationMs, a as writeConfigFile, n as loadConfig, s as parseByteSize, t as createConfigIO } from "./config-BmV60pPT.js";
13
- import { A as DEFAULT_BROWSER_EVALUATE_ENABLED, D as DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS, E as DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH, M as DEFAULT_SYMI_BROWSER_ENABLED, N as DEFAULT_SYMI_BROWSER_PROFILE_NAME, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, S as stopChromeExtensionRelayServer, _ as fetchJson, a as resolveSymiUserDataDir, c as captureScreenshot, d as normalizeCdpWsUrl, f as snapshotAria, g as appendCdpPath, h as withBrowserNavigationPolicy, i as launchSymiChrome, j as DEFAULT_SYMI_BROWSER_COLOR, k as DEFAULT_BROWSER_DEFAULT_PROFILE_NAME, l as createTargetViaCdp, m as assertBrowserNavigationAllowed, n as isChromeCdpReady, o as stopSymiChrome, p as InvalidBrowserNavigationUrlError, r as isChromeReachable, s as resolveBrowserExecutableForPlatform, v as fetchOk, w as isLoopbackHost, x as ensureChromeExtensionRelayServer } from "./chrome-D2SKJnR7.js";
13
+ import { A as DEFAULT_BROWSER_EVALUATE_ENABLED, D as DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS, E as DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH, M as DEFAULT_SYMI_BROWSER_ENABLED, N as DEFAULT_SYMI_BROWSER_PROFILE_NAME, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, S as stopChromeExtensionRelayServer, _ as fetchJson, a as resolveSymiUserDataDir, c as captureScreenshot, d as normalizeCdpWsUrl, f as snapshotAria, g as appendCdpPath, h as withBrowserNavigationPolicy, i as launchSymiChrome, j as DEFAULT_SYMI_BROWSER_COLOR, k as DEFAULT_BROWSER_DEFAULT_PROFILE_NAME, l as createTargetViaCdp, m as assertBrowserNavigationAllowed, n as isChromeCdpReady, o as stopSymiChrome, p as InvalidBrowserNavigationUrlError, r as isChromeReachable, s as resolveBrowserExecutableForPlatform, v as fetchOk, w as isLoopbackHost, x as ensureChromeExtensionRelayServer } from "./chrome-CDJYxX5a.js";
14
14
  import { a as syncSkillsToWorkspace, l as resolveSandboxInputPath, m as sanitizeEnvVars, u as resolveSandboxPath } from "./skills-BNpGMnp-.js";
15
15
  import { n as formatErrorMessage, t as extractErrorCode } from "./errors-CPfngF0S.js";
16
16
  import { t as SsrFBlockedError } from "./ssrf-CxfFyMRZ.js";
@@ -931,7 +931,7 @@ function isModuleNotFoundError(err) {
931
931
  }
932
932
  async function loadPwAiModule(mode) {
933
933
  try {
934
- return await import("./pw-ai-1htA-NnS.js");
934
+ return await import("./pw-ai-De-KR9_s.js");
935
935
  } catch (err) {
936
936
  if (mode === "soft") return null;
937
937
  if (isModuleNotFoundError(err)) return null;
@@ -3471,11 +3471,11 @@ function createProfileContext(opts, profile) {
3471
3471
  const userDataDir = resolveSymiUserDataDir(profile.name);
3472
3472
  const profileState = getProfileState();
3473
3473
  if (await isHttpReachable(300) && !profileState.running) try {
3474
- await (await import("./pw-ai-1htA-NnS.js")).closePlaywrightBrowserConnection();
3474
+ await (await import("./pw-ai-De-KR9_s.js")).closePlaywrightBrowserConnection();
3475
3475
  } catch {}
3476
3476
  if (profileState.running) await stopRunningBrowser();
3477
3477
  try {
3478
- await (await import("./pw-ai-1htA-NnS.js")).closePlaywrightBrowserConnection();
3478
+ await (await import("./pw-ai-De-KR9_s.js")).closePlaywrightBrowserConnection();
3479
3479
  } catch {}
3480
3480
  if (!fs.existsSync(userDataDir)) return {
3481
3481
  moved: false,
@@ -9,7 +9,7 @@ import { h as isPidAlive, m as resolveProcessScopedMap } from "./auth-profiles-D
9
9
  import { n as formatCliCommand } from "./env-BDXYbTKj.js";
10
10
  import { t as parseBooleanValue } from "./boolean-CE7i9tBR.js";
11
11
  import { _ as parseDurationMs, a as writeConfigFile, n as loadConfig, s as parseByteSize, t as createConfigIO } from "./config-5SdHIcHU.js";
12
- import { A as DEFAULT_BROWSER_EVALUATE_ENABLED, D as DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS, E as DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH, M as DEFAULT_SYMI_BROWSER_ENABLED, N as DEFAULT_SYMI_BROWSER_PROFILE_NAME, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, S as stopChromeExtensionRelayServer, _ as fetchJson, a as resolveSymiUserDataDir, c as captureScreenshot, d as normalizeCdpWsUrl, f as snapshotAria, g as appendCdpPath, h as withBrowserNavigationPolicy, i as launchSymiChrome, j as DEFAULT_SYMI_BROWSER_COLOR, k as DEFAULT_BROWSER_DEFAULT_PROFILE_NAME, l as createTargetViaCdp, m as assertBrowserNavigationAllowed, n as isChromeCdpReady, o as stopSymiChrome, p as InvalidBrowserNavigationUrlError, r as isChromeReachable, s as resolveBrowserExecutableForPlatform, v as fetchOk, w as isLoopbackHost, x as ensureChromeExtensionRelayServer } from "./chrome-DkaXoP36.js";
12
+ import { A as DEFAULT_BROWSER_EVALUATE_ENABLED, D as DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS, E as DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH, M as DEFAULT_SYMI_BROWSER_ENABLED, N as DEFAULT_SYMI_BROWSER_PROFILE_NAME, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, S as stopChromeExtensionRelayServer, _ as fetchJson, a as resolveSymiUserDataDir, c as captureScreenshot, d as normalizeCdpWsUrl, f as snapshotAria, g as appendCdpPath, h as withBrowserNavigationPolicy, i as launchSymiChrome, j as DEFAULT_SYMI_BROWSER_COLOR, k as DEFAULT_BROWSER_DEFAULT_PROFILE_NAME, l as createTargetViaCdp, m as assertBrowserNavigationAllowed, n as isChromeCdpReady, o as stopSymiChrome, p as InvalidBrowserNavigationUrlError, r as isChromeReachable, s as resolveBrowserExecutableForPlatform, v as fetchOk, w as isLoopbackHost, x as ensureChromeExtensionRelayServer } from "./chrome-DYZwl5Gv.js";
13
13
  import { a as syncSkillsToWorkspace, l as resolveSandboxInputPath, m as sanitizeEnvVars, u as resolveSandboxPath } from "./skills-Bs0AW1g3.js";
14
14
  import { n as formatErrorMessage, t as extractErrorCode } from "./errors-XIsvXeC-.js";
15
15
  import { b as openFileWithinRoot, i as getImageMetadata, n as buildImageResizeSideGrid, s as resizeToJpeg, t as IMAGE_REDUCE_QUALITY_STEPS, y as SafeOpenError } from "./image-ops-C7CauEK8.js";
@@ -933,7 +933,7 @@ function isModuleNotFoundError(err) {
933
933
  }
934
934
  async function loadPwAiModule(mode) {
935
935
  try {
936
- return await import("./pw-ai-m0mj2KWK.js");
936
+ return await import("./pw-ai-B5asscAD.js");
937
937
  } catch (err) {
938
938
  if (mode === "soft") return null;
939
939
  if (isModuleNotFoundError(err)) return null;
@@ -3473,11 +3473,11 @@ function createProfileContext(opts, profile) {
3473
3473
  const userDataDir = resolveSymiUserDataDir(profile.name);
3474
3474
  const profileState = getProfileState();
3475
3475
  if (await isHttpReachable(300) && !profileState.running) try {
3476
- await (await import("./pw-ai-m0mj2KWK.js")).closePlaywrightBrowserConnection();
3476
+ await (await import("./pw-ai-B5asscAD.js")).closePlaywrightBrowserConnection();
3477
3477
  } catch {}
3478
3478
  if (profileState.running) await stopRunningBrowser();
3479
3479
  try {
3480
- await (await import("./pw-ai-m0mj2KWK.js")).closePlaywrightBrowserConnection();
3480
+ await (await import("./pw-ai-B5asscAD.js")).closePlaywrightBrowserConnection();
3481
3481
  } catch {}
3482
3482
  if (!fs.existsSync(userDataDir)) return {
3483
3483
  moved: false,
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
- import { ft as loadSymiPlugins } from "./reply-DcyKvFor.js";
2
+ import { ft as loadSymiPlugins } from "./reply-dzRBlsmK.js";
3
3
  import { d as getActivePluginRegistry } from "./registry-Cja8eT7G.js";
4
4
  import { t as createSubsystemLogger } from "./subsystem-D9vIQve0.js";
5
5
  import { c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId } from "./agent-scope-CgUHAtCo.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-D-jRCY0d.js";
4
4
  import { i as loadConfig } from "./config-DHBLS1Hl.js";
5
- import { m as loadSymiPlugins } from "./subagent-registry-CVQOC9Jw.js";
5
+ import { m as loadSymiPlugins } from "./subagent-registry-DEdqc42m.js";
6
6
 
7
7
  //#region src/cli/plugin-registry.ts
8
8
  var plugin_registry_exports = /* @__PURE__ */ __exportAll({ ensurePluginRegistryLoaded: () => ensurePluginRegistryLoaded });
@@ -1,23 +1,23 @@
1
1
  /**
2
- * Tool argument validation wrapper validates exec/bash commands and
3
- * file paths before execution when the model profile has validateToolArgs enabled.
2
+ * Universal tool argument sanitizerstrips model control tokens from ALL
3
+ * string arguments on ALL tools when the model profile has validateToolArgs
4
+ * enabled. Exec/bash commands get additional structural validation.
4
5
  *
5
- * Gated on ModelProfile.filters.validateToolArgs. Returns an instructive
6
- * error message when corruption is detected, giving the model a chance
7
- * to retry with clean arguments.
6
+ * Gated on ModelProfile.filters.validateToolArgs. Claude gets passthrough.
7
+ * Gemma/Ollama profiles get full sanitization.
8
8
  *
9
9
  * @module
10
10
  */
11
11
  import type { ModelProfile } from "../config/model-profiles.js";
12
12
  import type { AnyAgentTool } from "./pi-tools.types.js";
13
13
  /**
14
- * Wrap tools with argument validation. Exec/bash commands and file paths
15
- * are validated. Other tools pass through unchanged.
14
+ * Wrap ALL tools with universal string argument sanitization.
15
+ * Exec/bash tools get additional structural command validation.
16
16
  *
17
17
  * Call this AFTER tools are created and the model profile is resolved.
18
18
  */
19
19
  export declare function wrapToolsWithArgValidation(tools: AnyAgentTool[], profile: ModelProfile): AnyAgentTool[];
20
20
  /**
21
- * Wrap a single tool with argument validation.
21
+ * Wrap a single tool with universal argument sanitization.
22
22
  */
23
23
  export declare function wrapToolWithArgValidation(tool: AnyAgentTool): AnyAgentTool;
@@ -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 { E as enqueueSystemEvent, G as resolveMentionGating, W as shouldAckReactionForWhatsApp, X as buildHistoryContextFromEntries, Y as DEFAULT_GROUP_HISTORY_LIMIT, _ as resolveEnvelopeFormatOptions, c as computeBackoff, d as formatDurationPrecise, f as dispatchReplyWithBufferedBlockDispatcher, g as formatInboundEnvelope, h as resolveInboundDebounceMs, ht as createDedupeCache, l as sleepWithAbort, m as createInboundDebouncer, n as normalizeGroupActivation, nt as buildMentionRegexes, r as parseActivationCommand, rt as normalizeMentionText, t as getReplyFromConfig, tt as recordPendingHistoryEntryIfEnabled, u as buildPairingReply, v as hasControlCommand, y as shouldComputeCommandAuthorized } from "./reply-CyZfsjrl.js";
3
+ import { E as enqueueSystemEvent, G as resolveMentionGating, W as shouldAckReactionForWhatsApp, X as buildHistoryContextFromEntries, Y as DEFAULT_GROUP_HISTORY_LIMIT, _ as resolveEnvelopeFormatOptions, c as computeBackoff, d as formatDurationPrecise, f as dispatchReplyWithBufferedBlockDispatcher, g as formatInboundEnvelope, h as resolveInboundDebounceMs, ht as createDedupeCache, l as sleepWithAbort, m as createInboundDebouncer, n as normalizeGroupActivation, nt as buildMentionRegexes, r as parseActivationCommand, rt as normalizeMentionText, t as getReplyFromConfig, tt as recordPendingHistoryEntryIfEnabled, u as buildPairingReply, v as hasControlCommand, y as shouldComputeCommandAuthorized } from "./reply-CQPVXorK.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-DDkdiUOR.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 stripMarkdown, Ct as unbindThreadBindingsBySessionKey, D as resolveSlackUserAllowlist, Dt as BLUEBUBBLES_ACTION_NAMES, 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 processLineMessage, St as listThreadBindingsBySessionKey, T as attachFooterText, 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 normalizeAccountId$1, 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 listLineAccountIds, it as isWSL2Sync, j as resolveDiscordChannelAllowlist, k as detectBinary, kt as CHANNEL_MESSAGE_ACTION_NAMES, lt as RequestBodyLimitError, mt as requestBodyErrorToText, o as resolveDefaultLineAccountId, ot as isWSLSync, pt as readRequestBodyWithLimit, q as mergeAllowlist, s as resolveLineAccount, st as DEFAULT_WEBHOOK_BODY_TIMEOUT_MS, tt as recordPendingHistoryEntryIfEnabled, ut as installRequestBodyLimitGuard, vt as rejectDevicePairing, w as createReceiptCard, wt as formatAllowlistMatchMeta, x as hasMarkdownToConvert, xt as autoBindSpawnedDiscordSubagent, yt as extractToolSend, z as logInboundDrop } from "./reply-CyZfsjrl.js";
3
+ import { $ as clearHistoryEntriesIfEnabled, A as resolveDiscordUserAllowlist, B as logTypingFailure, C as stripMarkdown, Ct as unbindThreadBindingsBySessionKey, D as resolveSlackUserAllowlist, Dt as BLUEBUBBLES_ACTION_NAMES, 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 processLineMessage, St as listThreadBindingsBySessionKey, T as attachFooterText, 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 normalizeAccountId$1, 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 listLineAccountIds, it as isWSL2Sync, j as resolveDiscordChannelAllowlist, k as detectBinary, kt as CHANNEL_MESSAGE_ACTION_NAMES, lt as RequestBodyLimitError, mt as requestBodyErrorToText, o as resolveDefaultLineAccountId, ot as isWSLSync, pt as readRequestBodyWithLimit, q as mergeAllowlist, s as resolveLineAccount, st as DEFAULT_WEBHOOK_BODY_TIMEOUT_MS, tt as recordPendingHistoryEntryIfEnabled, ut as installRequestBodyLimitGuard, vt as rejectDevicePairing, w as createReceiptCard, wt as formatAllowlistMatchMeta, x as hasMarkdownToConvert, xt as autoBindSpawnedDiscordSubagent, yt as extractToolSend, z as logInboundDrop } from "./reply-CQPVXorK.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-BbAvhC25.js";
@@ -47,7 +47,7 @@ import "./paths-A0xdf3yk.js";
47
47
  import { h as onDiagnosticEvent, m as isDiagnosticsEnabled, p as emitDiagnosticEvent } from "./diagnostic-mFf4i4G9.js";
48
48
  import { n as extractOriginalFilename } from "./store-Do3t33-c.js";
49
49
  import { t as resolveWhatsAppOutboundTarget } from "./resolve-outbound-target-BkCUbYGV.js";
50
- import { r as resolveWhatsAppHeartbeatRecipients } from "./channel-web-CxwLjrWk.js";
50
+ import { r as resolveWhatsAppHeartbeatRecipients } from "./channel-web-B76ttiD9.js";
51
51
  import "./image-BOYy0Ump.js";
52
52
  import "./pi-model-discovery-LbcEa65a.js";
53
53
  import "./api-key-rotation-CVBMpnPc.js";