@symerian/symi 2.4.0 → 2.4.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 (111) hide show
  1. package/dist/{agents-CI3xxYc_.js → agents-BrpbYYTb.js} +4 -4
  2. package/dist/{agents.config-DCE3RGr9.js → agents.config-Bf8u_0ts.js} +1 -1
  3. package/dist/{agents.config-DTUAM1AG.js → agents.config-j4SWyB6K.js} +1 -1
  4. package/dist/{audio-preflight-C40mKAp7.js → audio-preflight-CPBOQV4I.js} +4 -4
  5. package/dist/{auth-choice-IiIysHGO.js → auth-choice-BYB9fJiu.js} +1 -1
  6. package/dist/{auth-choice-DuQwRfJc.js → auth-choice-DlrjQI-v.js} +1 -1
  7. package/dist/{banner-xhDZu_ZJ.js → banner-DRJJmkv1.js} +1 -1
  8. package/dist/build-info.json +3 -3
  9. package/dist/bundled/boot-md/handler.js +1 -1
  10. package/dist/bundled/session-memory/handler.js +1 -1
  11. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  12. package/dist/{channel-options-D3gGVwBd.js → channel-options-BQz0F4El.js} +1 -1
  13. package/dist/{channel-options-Dvxd7eJY.js → channel-options-CxSIp3x-.js} +1 -1
  14. package/dist/{channel-web-a5tX1YI3.js → channel-web-BY4lhNxW.js} +1 -1
  15. package/dist/{channels-cli-C9wBYmDe.js → channels-cli--rkhLJvR.js} +4 -4
  16. package/dist/{channels-cli-BLUkl5Li.js → channels-cli-B5Nj_nHr.js} +4 -4
  17. package/dist/{chrome-CDJYxX5a.js → chrome-D2SKJnR7.js} +7 -7
  18. package/dist/{cli-Cw45F0yJ.js → cli-CATf6JAq.js} +1 -1
  19. package/dist/{cli-CaEE46xi.js → cli-Ds6poYQ6.js} +1 -1
  20. package/dist/{command-registry-ea9SD1eA.js → command-registry-CsDAPQfS.js} +9 -9
  21. package/dist/{completion-cli-CMJmUQbI.js → completion-cli-B_f5PMBc.js} +1 -1
  22. package/dist/{completion-cli-DVkiEAEA.js → completion-cli-CSdjFWHy.js} +2 -2
  23. package/dist/{config-cli-B2d28_hb.js → config-cli-B_KCvdli.js} +1 -1
  24. package/dist/{config-cli-VIg0PSyq.js → config-cli-C_GarUko.js} +1 -1
  25. package/dist/{configure-C_TVBt76.js → configure-CM-z8YCS.js} +3 -3
  26. package/dist/{configure-D-3FiJbK.js → configure-vfmJApU8.js} +3 -3
  27. package/dist/{deliver-BH0l3UKW.js → deliver-C-37cZUe.js} +1 -1
  28. package/dist/{doctor-completion-CJHJYIwQ.js → doctor-completion-BWJvfjTC.js} +1 -1
  29. package/dist/{doctor-completion-DeRX6gkI.js → doctor-completion-llX6EnGy.js} +1 -1
  30. package/dist/entry.js +1 -1
  31. package/dist/extensionAPI.js +6 -6
  32. package/dist/{gateway-cli-BDDHBfYP.js → gateway-cli-70k2-I4K.js} +20 -16
  33. package/dist/{gateway-cli-DiDJ6Z2d.js → gateway-cli-BApdH1bD.js} +20 -16
  34. package/dist/{glass-ui-ws-Bj1IuJXt.js → glass-ui-ws-Be_AOhp7.js} +7 -7
  35. package/dist/{glass-ui-ws-rGIAkViC.js → glass-ui-ws-Z_wtGa_A.js} +7 -7
  36. package/dist/{health-CypF_2ZD.js → health-BBGgp_dC.js} +1 -1
  37. package/dist/{health-Bst5HnLF.js → health-BmaWws9G.js} +1 -1
  38. package/dist/{hooks-cli-CfsqqxPX.js → hooks-cli-C5eV9sxP.js} +2 -2
  39. package/dist/{hooks-cli-CDMcqTy4.js → hooks-cli-W_aoP9nb.js} +2 -2
  40. package/dist/{image-CHzdaNJ4.js → image-DcpMiprB.js} +1 -1
  41. package/dist/index.js +6 -6
  42. package/dist/llm-slug-generator.js +1 -1
  43. package/dist/{models-ZEOGlFx7.js → models-COaQWNz5.js} +2 -2
  44. package/dist/{models-cli-BM1QyeXr.js → models-cli-DH17yK8M.js} +3 -3
  45. package/dist/{models-cli-BwOQhZ_c.js → models-cli-DeG1qheS.js} +2 -2
  46. package/dist/{onboard-CU-pntZD.js → onboard-1wGdR0wt.js} +2 -2
  47. package/dist/{onboard-channels-g5cvwJpx.js → onboard-channels-BCUkNB26.js} +1 -1
  48. package/dist/{onboard-channels-BOBxxhHX.js → onboard-channels-D93AAHMd.js} +1 -1
  49. package/dist/{onboard-DQ34giB5.js → onboard-nQYq_dsr.js} +2 -2
  50. package/dist/{onboarding-DWs6tHZ9.js → onboarding-Peg7PNOz.js} +3 -3
  51. package/dist/{onboarding-CXWUjdM5.js → onboarding-gQRA57l_.js} +3 -3
  52. package/dist/{onboarding.finalize-CAYf88mf.js → onboarding.finalize-C4DSBMrV.js} +6 -6
  53. package/dist/{onboarding.finalize-vupGASMK.js → onboarding.finalize-D26o-hBA.js} +5 -5
  54. package/dist/{pi-embedded-DwbQz0MC.js → pi-embedded-CfxhTbYF.js} +108 -16
  55. package/dist/{pi-embedded-helpers-lgx_U5KS.js → pi-embedded-helpers-B8kqLWns.js} +4 -4
  56. package/dist/{pi-embedded-CJsSOG2j.js → pi-embedded-k69DSy1Y.js} +94 -2
  57. package/dist/{plugin-registry-CZeHSx_c.js → plugin-registry-C0iHnZ7j.js} +1 -1
  58. package/dist/{plugin-registry-BDpdOTei.js → plugin-registry-D_BAH1V5.js} +1 -1
  59. package/dist/plugin-sdk/agents/pi-embedded-runner/extra-params.d.ts +6 -0
  60. package/dist/plugin-sdk/agents/stream-monitor.d.ts +62 -0
  61. package/dist/plugin-sdk/{channel-web-uUypcT9Q.js → channel-web-ilY3YUmF.js} +1 -1
  62. package/dist/plugin-sdk/index.js +2 -2
  63. package/dist/plugin-sdk/{reply-DTKTuCrn.js → reply-CSgeVqcV.js} +94 -2
  64. package/dist/plugin-sdk/{web-Dh6Youzv.js → web-BVg5EjiY.js} +2 -2
  65. package/dist/{plugins-cli-CCQ3skeQ.js → plugins-cli-BhOXY_Ay.js} +2 -2
  66. package/dist/{plugins-cli-D_RzeRoE.js → plugins-cli-LqQNHF1I.js} +2 -2
  67. package/dist/{program-Cl9i8ubQ.js → program-Bx47hl_J.js} +7 -7
  68. package/dist/{program-context-BbmYGW-V.js → program-context-JFmxYLfK.js} +17 -17
  69. package/dist/{prompt-select-styled-BfuyvChh.js → prompt-select-styled--d3H0JCo.js} +4 -4
  70. package/dist/{prompt-select-styled-BN0T6GxF.js → prompt-select-styled-BeJhp9PS.js} +4 -4
  71. package/dist/{provider-auth-helpers-CkmLFHXL.js → provider-auth-helpers-BzczCfh8.js} +1 -1
  72. package/dist/{provider-auth-helpers-CuT5EHza.js → provider-auth-helpers-Ds_HwlgY.js} +1 -1
  73. package/dist/{push-apns-DeJt9kAO.js → push-apns-CT8-VcK5.js} +1 -1
  74. package/dist/{push-apns-CFkFVwEz.js → push-apns-DvcqkHld.js} +1 -1
  75. package/dist/{pw-ai-De-KR9_s.js → pw-ai-1htA-NnS.js} +1 -1
  76. package/dist/{register.agent-BQm4YmZp.js → register.agent-DMvHFw16.js} +6 -6
  77. package/dist/{register.agent-BygseJ7t.js → register.agent-yoXoJ_5O.js} +5 -5
  78. package/dist/{register.configure-Cj95vB2U.js → register.configure-B8UDTEcS.js} +6 -6
  79. package/dist/{register.configure-C2fhjZze.js → register.configure-BqrNBkwZ.js} +6 -6
  80. package/dist/{register.maintenance-CClfXq5e.js → register.maintenance-CYhp47Hs.js} +8 -8
  81. package/dist/{register.maintenance-K1x3E7OS.js → register.maintenance-CvaHYkoX.js} +7 -7
  82. package/dist/{register.message-BSr-kUvJ.js → register.message-BnLBwUw9.js} +2 -2
  83. package/dist/{register.message-CSRzBl-c.js → register.message-CgtrjEFw.js} +2 -2
  84. package/dist/{register.onboard-Bd6wPydW.js → register.onboard-CoySBEdQ.js} +4 -4
  85. package/dist/{register.onboard-TsU21RR7.js → register.onboard-mCscJN7t.js} +4 -4
  86. package/dist/{register.setup-DK-zsne2.js → register.setup-BmE-pwMT.js} +4 -4
  87. package/dist/{register.setup-C9gu0W5l.js → register.setup-CzrsIQMG.js} +4 -4
  88. package/dist/{register.status-health-sessions-DN5Ui3V0.js → register.status-health-sessions-CP7JWQHw.js} +3 -3
  89. package/dist/{register.status-health-sessions-rZsuoqtr.js → register.status-health-sessions-DhTfQ530.js} +3 -3
  90. package/dist/{register.subclis-DnzHFtLz.js → register.subclis-wsgQ6wk8.js} +9 -9
  91. package/dist/{reply-Ca3slrA3.js → reply-DkwaBRX-.js} +94 -2
  92. package/dist/{run-main-DlHh5iOO.js → run-main-mKcFqx7h.js} +14 -14
  93. package/dist/{runner-DUBExAb5.js → runner-BcQ0sF9T.js} +1 -1
  94. package/dist/{server-methods-BYOkyf-q.js → server-methods-CbeCo-6O.js} +7 -7
  95. package/dist/{server-methods-b_Qod4tt.js → server-methods-EQ0JkHOg.js} +7 -7
  96. package/dist/{server-node-events-60nWpTh1.js → server-node-events-C1FDqJb9.js} +2 -2
  97. package/dist/{server-node-events-oU4Amei7.js → server-node-events-CBHpc_25.js} +2 -2
  98. package/dist/{status-BXW5l4sd.js → status-B1r3Wp0-.js} +2 -2
  99. package/dist/{status-D3-lP2_9.js → status-Cksz7z4T.js} +1 -1
  100. package/dist/{status-BxbbINLV.js → status-CnogoaI_.js} +2 -2
  101. package/dist/{status-kdz9P3tw.js → status-jVJSC_Ga.js} +1 -1
  102. package/dist/{subagent-registry-CbTbJKLs.js → subagent-registry-Jwg44JMf.js} +94 -2
  103. package/dist/{update-cli-Cy0gdWRf.js → update-cli-BEBDpJF4.js} +8 -8
  104. package/dist/{update-cli-B5TI650v.js → update-cli-C22V-tFW.js} +7 -7
  105. package/dist/{update-runner-Bacq0oLK.js → update-runner-BQg__DB5.js} +1 -1
  106. package/dist/{update-runner-B0NdgPvD.js → update-runner-le1Hcqx4.js} +1 -1
  107. package/dist/{web-DmED3zDP.js → web-BSs2eYJa.js} +2 -2
  108. package/dist/{web-D-oCzJTU.js → web-DajtZMaX.js} +1 -1
  109. package/dist/{web-DWNtg4iV.js → web-DolrvXij.js} +6 -6
  110. package/dist/{web-QVwKg99Q.js → web-kIIXN8hK.js} +1 -1
  111. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  import "./paths-Cqn-zk3M.js";
2
2
  import { h as pathExists, y as resolveUserPath } from "./utils-B-0b9bGM.js";
3
3
  import "./thinking-EAliFiVK.js";
4
- import "./reply-Ca3slrA3.js";
4
+ import "./reply-DkwaBRX-.js";
5
5
  import "./registry-Cja8eT7G.js";
6
6
  import { p as restoreTerminalState } from "./subsystem-D9vIQve0.js";
7
7
  import "./exec-CWkblSrI.js";
@@ -103,16 +103,16 @@ import "./control-service-Bz7rxLWq.js";
103
103
  import "./stagger-BUClb97_.js";
104
104
  import "./channel-selection-DuWs0Aak.js";
105
105
  import "./runtime-guard-B37eizu-.js";
106
- import "./program-context-BbmYGW-V.js";
106
+ import "./program-context-JFmxYLfK.js";
107
107
  import "./note-DeHoW7xO.js";
108
- import { r as installCompletion } from "./completion-cli-CMJmUQbI.js";
108
+ import { r as installCompletion } from "./completion-cli-B_f5PMBc.js";
109
109
  import { a as gatewayInstallErrorHint, i as buildGatewayInstallPlan, n as GATEWAY_DAEMON_RUNTIME_OPTIONS, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-2mwX-jqj.js";
110
110
  import { r as isSystemdUserServiceAvailable } from "./systemd-riq8uNJQ.js";
111
111
  import { t as resolveGatewayService } from "./service-Cl74hx8J.js";
112
- import { r as healthCommand } from "./health-CypF_2ZD.js";
112
+ import { r as healthCommand } from "./health-BBGgp_dC.js";
113
113
  import { t as ensureControlUiAssetsBuilt } from "./control-ui-assets-Z947tKLt.js";
114
114
  import { t as formatHealthCheckFailure } from "./health-format-DSwnXZPU.js";
115
- import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-CJHJYIwQ.js";
115
+ import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-BWJvfjTC.js";
116
116
  import { t as runTui } from "./tui-CriznorL.js";
117
117
  import os from "node:os";
118
118
  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-BH0l3UKW.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";
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-lgx_U5KS.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";
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-CDJYxX5a.js";
28
+ import { C as rawDataToString, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, T as isSecureWebSocketUrl, x as ensureChromeExtensionRelayServer } from "./chrome-D2SKJnR7.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-CHzdaNJ4.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";
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-DUBExAb5.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";
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$1, { WebSocket } from "ws";
82
+ import WebSocket, { WebSocket as WebSocket$1 } 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(url, wsOptions);
5717
+ this.ws = new WebSocket$1(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.OPEN) throw new Error("gateway not connected");
5936
+ if (!this.ws || this.ws.readyState !== WebSocket$1.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-BH0l3UKW.js").then((n) => n.n);
7202
+ const { deliverOutboundPayloads } = await import("./deliver-C-37cZUe.js").then((n) => n.n);
7203
7203
  return {
7204
7204
  ok: true,
7205
7205
  messageId: (await deliverOutboundPayloads({
@@ -41673,7 +41673,7 @@ async function deliverSessionMaintenanceWarning(params) {
41673
41673
  return;
41674
41674
  }
41675
41675
  try {
41676
- const { deliverOutboundPayloads } = await import("./deliver-BH0l3UKW.js").then((n) => n.n);
41676
+ const { deliverOutboundPayloads } = await import("./deliver-C-37cZUe.js").then((n) => n.n);
41677
41677
  await deliverOutboundPayloads({
41678
41678
  cfg: params.cfg,
41679
41679
  channel,
@@ -45119,7 +45119,7 @@ async function describeStickerImage(params) {
45119
45119
  logVerbose(`telegram: describing sticker with ${provider}/${model}`);
45120
45120
  try {
45121
45121
  const buffer = await fs$1.readFile(imagePath);
45122
- const { describeImageWithModel } = await import("./image-CHzdaNJ4.js").then((n) => n.n);
45122
+ const { describeImageWithModel } = await import("./image-DcpMiprB.js").then((n) => n.n);
45123
45123
  return (await describeImageWithModel({
45124
45124
  buffer,
45125
45125
  fileName: "sticker.webp",
@@ -47781,7 +47781,7 @@ async function preflightDiscordMessage(params) {
47781
47781
  let preflightTranscript;
47782
47782
  const hasAudioAttachment = message.attachments?.some((att) => att.contentType?.startsWith("audio/"));
47783
47783
  if (!isDirectMessage && shouldRequireMention && hasAudioAttachment && !baseText && mentionRegexes.length > 0) try {
47784
- const { transcribeFirstAudio } = await import("./audio-preflight-C40mKAp7.js");
47784
+ const { transcribeFirstAudio } = await import("./audio-preflight-CPBOQV4I.js");
47785
47785
  const audioPaths = message.attachments?.filter((att) => att.contentType?.startsWith("audio/")).map((att) => att.url) ?? [];
47786
47786
  if (audioPaths.length > 0) preflightTranscript = await transcribeFirstAudio({
47787
47787
  ctx: {
@@ -51787,7 +51787,7 @@ function isVoiceChannelType(type) {
51787
51787
  function createDefaultDeps() {
51788
51788
  return {
51789
51789
  sendMessageWhatsApp: async (...args) => {
51790
- const { sendMessageWhatsApp } = await import("./web-DWNtg4iV.js");
51790
+ const { sendMessageWhatsApp } = await import("./web-DolrvXij.js");
51791
51791
  return await sendMessageWhatsApp(...args);
51792
51792
  },
51793
51793
  sendMessageTelegram: async (...args) => {
@@ -54694,7 +54694,7 @@ function createDiscordGatewayPlugin(params) {
54694
54694
  super(options);
54695
54695
  }
54696
54696
  createWebSocket(url) {
54697
- return new WebSocket$1(url, { agent });
54697
+ return new WebSocket(url, { agent });
54698
54698
  }
54699
54699
  }
54700
54700
  return new ProxyGatewayPlugin();
@@ -64912,7 +64912,7 @@ const buildTelegramMessageContext = async ({ primaryCtx, allMedia, storeAllowFro
64912
64912
  const hasAudio = allMedia.some((media) => media.contentType?.startsWith("audio/"));
64913
64913
  let preflightTranscript;
64914
64914
  if (isGroup && requireMention && hasAudio && !hasUserText && mentionRegexes.length > 0) try {
64915
- const { transcribeFirstAudio } = await import("./audio-preflight-C40mKAp7.js");
64915
+ const { transcribeFirstAudio } = await import("./audio-preflight-CPBOQV4I.js");
64916
64916
  preflightTranscript = await transcribeFirstAudio({
64917
64917
  ctx: {
64918
64918
  MediaPaths: allMedia.length > 0 ? allMedia.map((m) => m.path) : void 0,
@@ -67069,7 +67069,7 @@ function loadWebLoginQr() {
67069
67069
  return webLoginQrPromise;
67070
67070
  }
67071
67071
  function loadWebChannel() {
67072
- webChannelPromise ??= import("./web-DWNtg4iV.js");
67072
+ webChannelPromise ??= import("./web-DolrvXij.js");
67073
67073
  return webChannelPromise;
67074
67074
  }
67075
67075
  function loadWhatsAppActions() {
@@ -75282,6 +75282,89 @@ Use the message tool with buttons:
75282
75282
  [{"label": "✅ Proceed", "data": "/plan-proceed"}, {"label": "✏️ Modify", "data": "/plan-modify"}, {"label": "❌ Cancel", "data": "/plan-cancel"}]
75283
75283
  </plan_mode>`;
75284
75284
 
75285
+ //#endregion
75286
+ //#region src/agents/stream-monitor.ts
75287
+ /**
75288
+ * Create a stream monitor configured for the given model profile.
75289
+ *
75290
+ * - Claude (hasStructuredThinking: true): repetition detection only
75291
+ * - Gemma/vLLM (hasStructuredThinking: false): tool JSON + repetition detection
75292
+ */
75293
+ function createStreamMonitor(profile, overrides) {
75294
+ const detectToolJson = overrides?.detectToolJson ?? !profile.filters.hasStructuredThinking;
75295
+ const detectRepetition = overrides?.detectRepetition ?? true;
75296
+ const minBlockSize = overrides?.repetitionMinBlockSize ?? 150;
75297
+ let accumulated = "";
75298
+ let stopSignaled = false;
75299
+ let stopReason;
75300
+ return {
75301
+ onChunk(delta) {
75302
+ if (stopSignaled) return;
75303
+ accumulated += delta;
75304
+ if (detectToolJson && hasCompleteToolJson(accumulated)) {
75305
+ stopSignaled = true;
75306
+ stopReason = "complete-tool-json";
75307
+ return;
75308
+ }
75309
+ if (detectRepetition && hasRepetition(accumulated, minBlockSize)) {
75310
+ stopSignaled = true;
75311
+ stopReason = "repetition-detected";
75312
+ return;
75313
+ }
75314
+ },
75315
+ shouldStop: () => stopSignaled,
75316
+ getAccumulated: () => accumulated,
75317
+ getStopReason: () => stopReason,
75318
+ reset() {
75319
+ accumulated = "";
75320
+ stopSignaled = false;
75321
+ stopReason = void 0;
75322
+ }
75323
+ };
75324
+ }
75325
+ /**
75326
+ * Detect if the accumulated text contains a syntactically complete JSON
75327
+ * object with tool_name and tool_args. Used for models that output tool
75328
+ * calls as plain text JSON (not native structured tool calls).
75329
+ */
75330
+ function hasCompleteToolJson(text) {
75331
+ const hasToolKey = text.includes("tool_name") || text.includes("\"tool\"");
75332
+ const hasArgsKey = text.includes("tool_args") || text.includes("\"args\"");
75333
+ if (!hasToolKey || !hasArgsKey) return false;
75334
+ const lastBrace = text.lastIndexOf("}");
75335
+ if (lastBrace < 0) return false;
75336
+ let depth = 0;
75337
+ let start = -1;
75338
+ for (let i = lastBrace; i >= 0; i--) {
75339
+ if (text[i] === "}") depth++;
75340
+ if (text[i] === "{") depth--;
75341
+ if (depth === 0) {
75342
+ start = i;
75343
+ break;
75344
+ }
75345
+ }
75346
+ if (start < 0) return false;
75347
+ const candidate = text.slice(start, lastBrace + 1);
75348
+ try {
75349
+ const parsed = JSON.parse(candidate);
75350
+ return typeof parsed === "object" && parsed !== null && (typeof parsed.tool_name === "string" || typeof parsed.tool === "string") && (typeof parsed.tool_args === "object" || typeof parsed.args === "object");
75351
+ } catch {
75352
+ return false;
75353
+ }
75354
+ }
75355
+ /**
75356
+ * Detect if the accumulated text contains a repeated block, indicating
75357
+ * a looping cascade. Returns true if a block of `minBlockSize` chars
75358
+ * from the first half appears again in the second half.
75359
+ */
75360
+ function hasRepetition(text, minBlockSize) {
75361
+ if (text.length < minBlockSize * 2.5) return false;
75362
+ const sampleStart = Math.floor(text.length * .25);
75363
+ const sample = text.slice(sampleStart, sampleStart + minBlockSize);
75364
+ const searchStart = sampleStart + minBlockSize;
75365
+ return text.indexOf(sample, searchStart) >= 0;
75366
+ }
75367
+
75285
75368
  //#endregion
75286
75369
  //#region src/agents/symipulse-timeout.ts
75287
75370
  /**
@@ -76496,6 +76579,7 @@ async function runEmbeddedAttempt(params) {
76496
76579
  return fn(...args);
76497
76580
  });
76498
76581
  };
76582
+ const streamMonitor = createStreamMonitor(modelProfile);
76499
76583
  const subscription = subscribeEmbeddedPiSession({
76500
76584
  session: activeSession,
76501
76585
  runId: params.runId,
@@ -76517,6 +76601,14 @@ async function runEmbeddedAttempt(params) {
76517
76601
  onAgentEvent: (evt) => {
76518
76602
  armSymipulseTimer();
76519
76603
  params.onAgentEvent?.(evt);
76604
+ if (evt.stream === "assistant" && typeof evt.data?.text === "string" && !aborted) {
76605
+ streamMonitor.onChunk(evt.data.text);
76606
+ if (streamMonitor.shouldStop()) {
76607
+ const reason = streamMonitor.getStopReason();
76608
+ log$2.warn(`stream monitor triggered abort: runId=${params.runId} reason=${reason}`);
76609
+ abortRun(false, /* @__PURE__ */ new Error(`stream-monitor:${reason}`));
76610
+ }
76611
+ }
76520
76612
  },
76521
76613
  enforceFinalTag: params.enforceFinalTag,
76522
76614
  config: params.config,
@@ -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-CDJYxX5a.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";
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-De-KR9_s.js");
934
+ return await import("./pw-ai-1htA-NnS.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-De-KR9_s.js")).closePlaywrightBrowserConnection();
3474
+ await (await import("./pw-ai-1htA-NnS.js")).closePlaywrightBrowserConnection();
3475
3475
  } catch {}
3476
3476
  if (profileState.running) await stopRunningBrowser();
3477
3477
  try {
3478
- await (await import("./pw-ai-De-KR9_s.js")).closePlaywrightBrowserConnection();
3478
+ await (await import("./pw-ai-1htA-NnS.js")).closePlaywrightBrowserConnection();
3479
3479
  } catch {}
3480
3480
  if (!fs.existsSync(userDataDir)) return {
3481
3481
  moved: false,
@@ -51789,7 +51789,7 @@ function isVoiceChannelType(type) {
51789
51789
  function createDefaultDeps() {
51790
51790
  return {
51791
51791
  sendMessageWhatsApp: async (...args) => {
51792
- const { sendMessageWhatsApp } = await import("./web-QVwKg99Q.js");
51792
+ const { sendMessageWhatsApp } = await import("./web-kIIXN8hK.js");
51793
51793
  return await sendMessageWhatsApp(...args);
51794
51794
  },
51795
51795
  sendMessageTelegram: async (...args) => {
@@ -67071,7 +67071,7 @@ function loadWebLoginQr() {
67071
67071
  return webLoginQrPromise;
67072
67072
  }
67073
67073
  function loadWebChannel() {
67074
- webChannelPromise ??= import("./web-QVwKg99Q.js");
67074
+ webChannelPromise ??= import("./web-kIIXN8hK.js");
67075
67075
  return webChannelPromise;
67076
67076
  }
67077
67077
  function loadWhatsAppActions() {
@@ -75284,6 +75284,89 @@ Use the message tool with buttons:
75284
75284
  [{"label": "✅ Proceed", "data": "/plan-proceed"}, {"label": "✏️ Modify", "data": "/plan-modify"}, {"label": "❌ Cancel", "data": "/plan-cancel"}]
75285
75285
  </plan_mode>`;
75286
75286
 
75287
+ //#endregion
75288
+ //#region src/agents/stream-monitor.ts
75289
+ /**
75290
+ * Create a stream monitor configured for the given model profile.
75291
+ *
75292
+ * - Claude (hasStructuredThinking: true): repetition detection only
75293
+ * - Gemma/vLLM (hasStructuredThinking: false): tool JSON + repetition detection
75294
+ */
75295
+ function createStreamMonitor(profile, overrides) {
75296
+ const detectToolJson = overrides?.detectToolJson ?? !profile.filters.hasStructuredThinking;
75297
+ const detectRepetition = overrides?.detectRepetition ?? true;
75298
+ const minBlockSize = overrides?.repetitionMinBlockSize ?? 150;
75299
+ let accumulated = "";
75300
+ let stopSignaled = false;
75301
+ let stopReason;
75302
+ return {
75303
+ onChunk(delta) {
75304
+ if (stopSignaled) return;
75305
+ accumulated += delta;
75306
+ if (detectToolJson && hasCompleteToolJson(accumulated)) {
75307
+ stopSignaled = true;
75308
+ stopReason = "complete-tool-json";
75309
+ return;
75310
+ }
75311
+ if (detectRepetition && hasRepetition(accumulated, minBlockSize)) {
75312
+ stopSignaled = true;
75313
+ stopReason = "repetition-detected";
75314
+ return;
75315
+ }
75316
+ },
75317
+ shouldStop: () => stopSignaled,
75318
+ getAccumulated: () => accumulated,
75319
+ getStopReason: () => stopReason,
75320
+ reset() {
75321
+ accumulated = "";
75322
+ stopSignaled = false;
75323
+ stopReason = void 0;
75324
+ }
75325
+ };
75326
+ }
75327
+ /**
75328
+ * Detect if the accumulated text contains a syntactically complete JSON
75329
+ * object with tool_name and tool_args. Used for models that output tool
75330
+ * calls as plain text JSON (not native structured tool calls).
75331
+ */
75332
+ function hasCompleteToolJson(text) {
75333
+ const hasToolKey = text.includes("tool_name") || text.includes("\"tool\"");
75334
+ const hasArgsKey = text.includes("tool_args") || text.includes("\"args\"");
75335
+ if (!hasToolKey || !hasArgsKey) return false;
75336
+ const lastBrace = text.lastIndexOf("}");
75337
+ if (lastBrace < 0) return false;
75338
+ let depth = 0;
75339
+ let start = -1;
75340
+ for (let i = lastBrace; i >= 0; i--) {
75341
+ if (text[i] === "}") depth++;
75342
+ if (text[i] === "{") depth--;
75343
+ if (depth === 0) {
75344
+ start = i;
75345
+ break;
75346
+ }
75347
+ }
75348
+ if (start < 0) return false;
75349
+ const candidate = text.slice(start, lastBrace + 1);
75350
+ try {
75351
+ const parsed = JSON.parse(candidate);
75352
+ return typeof parsed === "object" && parsed !== null && (typeof parsed.tool_name === "string" || typeof parsed.tool === "string") && (typeof parsed.tool_args === "object" || typeof parsed.args === "object");
75353
+ } catch {
75354
+ return false;
75355
+ }
75356
+ }
75357
+ /**
75358
+ * Detect if the accumulated text contains a repeated block, indicating
75359
+ * a looping cascade. Returns true if a block of `minBlockSize` chars
75360
+ * from the first half appears again in the second half.
75361
+ */
75362
+ function hasRepetition(text, minBlockSize) {
75363
+ if (text.length < minBlockSize * 2.5) return false;
75364
+ const sampleStart = Math.floor(text.length * .25);
75365
+ const sample = text.slice(sampleStart, sampleStart + minBlockSize);
75366
+ const searchStart = sampleStart + minBlockSize;
75367
+ return text.indexOf(sample, searchStart) >= 0;
75368
+ }
75369
+
75287
75370
  //#endregion
75288
75371
  //#region src/agents/symipulse-timeout.ts
75289
75372
  /**
@@ -76498,6 +76581,7 @@ async function runEmbeddedAttempt(params) {
76498
76581
  return fn(...args);
76499
76582
  });
76500
76583
  };
76584
+ const streamMonitor = createStreamMonitor(modelProfile);
76501
76585
  const subscription = subscribeEmbeddedPiSession({
76502
76586
  session: activeSession,
76503
76587
  runId: params.runId,
@@ -76519,6 +76603,14 @@ async function runEmbeddedAttempt(params) {
76519
76603
  onAgentEvent: (evt) => {
76520
76604
  armSymipulseTimer();
76521
76605
  params.onAgentEvent?.(evt);
76606
+ if (evt.stream === "assistant" && typeof evt.data?.text === "string" && !aborted) {
76607
+ streamMonitor.onChunk(evt.data.text);
76608
+ if (streamMonitor.shouldStop()) {
76609
+ const reason = streamMonitor.getStopReason();
76610
+ log$2.warn(`stream monitor triggered abort: runId=${params.runId} reason=${reason}`);
76611
+ abortRun(false, /* @__PURE__ */ new Error(`stream-monitor:${reason}`));
76612
+ }
76613
+ }
76522
76614
  },
76523
76615
  enforceFinalTag: params.enforceFinalTag,
76524
76616
  config: params.config,
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
- import { vt as loadSymiPlugins } from "./reply-Ca3slrA3.js";
2
+ import { vt as loadSymiPlugins } from "./reply-DkwaBRX-.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 { b as loadSymiPlugins } from "./subagent-registry-CbTbJKLs.js";
5
+ import { b as loadSymiPlugins } from "./subagent-registry-Jwg44JMf.js";
6
6
 
7
7
  //#region src/cli/plugin-registry.ts
8
8
  var plugin_registry_exports = /* @__PURE__ */ __exportAll({ ensurePluginRegistryLoaded: () => ensurePluginRegistryLoaded });
@@ -28,6 +28,12 @@ export declare function createZaiToolStreamWrapper(baseStreamFn: StreamFn | unde
28
28
  * Apply extra params (like temperature) to an agent's streamFn.
29
29
  * Also adds OpenRouter app attribution headers when using the OpenRouter provider.
30
30
  *
31
+ * @deprecated The 6-wrapper chain in this function has been superseded by
32
+ * `createModelAwareStreamFn` in `model-aware-stream.ts`. `attempt.ts`
33
+ * now calls `createModelAwareStreamFn` directly and uses the individual
34
+ * exported wrappers (Anthropic betas, Z.AI, OpenAI store) separately.
35
+ * This function is preserved for backward compatibility with existing tests.
36
+ *
31
37
  * @internal Exported for testing
32
38
  */
33
39
  export declare function applyExtraParamsToAgent(agent: {
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Stream Monitor — callback-based early exit and repetition detection.
3
+ *
4
+ * Adapted from agent-zero's streaming callback pattern. Instead of
5
+ * relying solely on model stop tokens (which may be ignored or lost),
6
+ * the monitor watches the streaming output in real-time and signals
7
+ * when to stop.
8
+ *
9
+ * Two detection modes:
10
+ * 1. Tool JSON detection — stops when a complete tool call JSON block
11
+ * is found in the accumulated stream (for models without native
12
+ * structured tool calls, like Gemma).
13
+ * 2. Repetition detection — stops when the same block of text appears
14
+ * twice, indicating a looping cascade.
15
+ *
16
+ * @module
17
+ */
18
+ import type { ModelProfile } from "../config/model-profiles.js";
19
+ export interface StreamMonitor {
20
+ /** Process a new text delta. Call on each streaming chunk. */
21
+ onChunk(delta: string): void;
22
+ /** Returns true if the monitor thinks generation should stop. */
23
+ shouldStop(): boolean;
24
+ /** Get the accumulated text so far. */
25
+ getAccumulated(): string;
26
+ /** Get the reason for stop signal (for logging). */
27
+ getStopReason(): string | undefined;
28
+ /** Reset state for a new generation turn. */
29
+ reset(): void;
30
+ }
31
+ export interface StreamMonitorOptions {
32
+ /** Enable tool JSON detection (for models without structured tool calls). */
33
+ detectToolJson?: boolean;
34
+ /** Enable repetition cascade detection. */
35
+ detectRepetition?: boolean;
36
+ /** Minimum block size (chars) for repetition detection. Default: 150. */
37
+ repetitionMinBlockSize?: number;
38
+ }
39
+ /**
40
+ * Create a stream monitor configured for the given model profile.
41
+ *
42
+ * - Claude (hasStructuredThinking: true): repetition detection only
43
+ * - Gemma/vLLM (hasStructuredThinking: false): tool JSON + repetition detection
44
+ */
45
+ export declare function createStreamMonitor(profile: ModelProfile, overrides?: StreamMonitorOptions): StreamMonitor;
46
+ /**
47
+ * Detect if the accumulated text contains a syntactically complete JSON
48
+ * object with tool_name and tool_args. Used for models that output tool
49
+ * calls as plain text JSON (not native structured tool calls).
50
+ */
51
+ declare function hasCompleteToolJson(text: string): boolean;
52
+ /**
53
+ * Detect if the accumulated text contains a repeated block, indicating
54
+ * a looping cascade. Returns true if a block of `minBlockSize` chars
55
+ * from the first half appears again in the second half.
56
+ */
57
+ declare function hasRepetition(text: string, minBlockSize: number): boolean;
58
+ export declare const __testing: {
59
+ hasCompleteToolJson: typeof hasCompleteToolJson;
60
+ hasRepetition: typeof hasRepetition;
61
+ };
62
+ export {};
@@ -1,6 +1,6 @@
1
1
  import { a as buildGroupHistoryKey, n as DEFAULT_MAIN_KEY, r as buildAgentMainSessionKey, s as normalizeAgentId } from "./session-key-C_0eELjb.js";
2
2
  import { f as readWebSelfId, o as getWebAuthAgeMs, r as resolveWhatsAppAccount } from "./accounts-D9zGZU5t.js";
3
- import { 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-DTKTuCrn.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-CSgeVqcV.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-DTKTuCrn.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-CSgeVqcV.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-uUypcT9Q.js";
50
+ import { r as resolveWhatsAppHeartbeatRecipients } from "./channel-web-ilY3YUmF.js";
51
51
  import "./image-BOYy0Ump.js";
52
52
  import "./pi-model-discovery-LbcEa65a.js";
53
53
  import "./api-key-rotation-CVBMpnPc.js";