@symerian/symi 2.3.4 → 2.4.0

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 (104) hide show
  1. package/dist/{agents-E_Ere0qU.js → agents-CI3xxYc_.js} +4 -4
  2. package/dist/{agents.config-Cv_wsBXL.js → agents.config-DCE3RGr9.js} +1 -1
  3. package/dist/{agents.config-DJTb7Jka.js → agents.config-DTUAM1AG.js} +1 -1
  4. package/dist/{auth-choice-D8ynWABO.js → auth-choice-DuQwRfJc.js} +1 -1
  5. package/dist/{auth-choice-B3D_jLQw.js → auth-choice-IiIysHGO.js} +1 -1
  6. package/dist/{banner-ChYzCy5p.js → banner-xhDZu_ZJ.js} +1 -1
  7. package/dist/build-info.json +3 -3
  8. package/dist/bundled/boot-md/handler.js +1 -1
  9. package/dist/bundled/session-memory/handler.js +1 -1
  10. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  11. package/dist/{channel-options-BYUiEgev.js → channel-options-D3gGVwBd.js} +1 -1
  12. package/dist/{channel-options-CMNzHg4p.js → channel-options-Dvxd7eJY.js} +1 -1
  13. package/dist/{channel-web-C-HLPbLL.js → channel-web-a5tX1YI3.js} +1 -1
  14. package/dist/{channels-cli-CcCmH-Tp.js → channels-cli-BLUkl5Li.js} +4 -4
  15. package/dist/{channels-cli-CyhXPEWq.js → channels-cli-C9wBYmDe.js} +4 -4
  16. package/dist/{cli-Gcuf3NTF.js → cli-CaEE46xi.js} +1 -1
  17. package/dist/{cli-Cp-NQ7yu.js → cli-Cw45F0yJ.js} +1 -1
  18. package/dist/{command-registry-Cvr_dlLY.js → command-registry-ea9SD1eA.js} +9 -9
  19. package/dist/{completion-cli-DaOHSXM3.js → completion-cli-CMJmUQbI.js} +1 -1
  20. package/dist/{completion-cli-DDlYn0ya.js → completion-cli-DVkiEAEA.js} +2 -2
  21. package/dist/{config-cli-CmUPAVUz.js → config-cli-B2d28_hb.js} +1 -1
  22. package/dist/{config-cli-BcuAsDOu.js → config-cli-VIg0PSyq.js} +1 -1
  23. package/dist/{configure-Ctwt1377.js → configure-C_TVBt76.js} +3 -3
  24. package/dist/{configure-OxYdT2hU.js → configure-D-3FiJbK.js} +3 -3
  25. package/dist/{doctor-completion-D7ShsgUp.js → doctor-completion-CJHJYIwQ.js} +1 -1
  26. package/dist/{doctor-completion-Dw78bQaQ.js → doctor-completion-DeRX6gkI.js} +1 -1
  27. package/dist/entry.js +1 -1
  28. package/dist/extensionAPI.js +1 -1
  29. package/dist/{gateway-cli-Bd7u0krH.js → gateway-cli-BDDHBfYP.js} +9 -9
  30. package/dist/{gateway-cli-D7nxPtEc.js → gateway-cli-DiDJ6Z2d.js} +9 -9
  31. package/dist/{glass-ui-ws-CzH0ikhI.js → glass-ui-ws-Bj1IuJXt.js} +7 -7
  32. package/dist/{glass-ui-ws-DBivjzVA.js → glass-ui-ws-rGIAkViC.js} +7 -7
  33. package/dist/{health-BSOMI4B6.js → health-Bst5HnLF.js} +1 -1
  34. package/dist/{health-rR61mwm3.js → health-CypF_2ZD.js} +1 -1
  35. package/dist/{hooks-cli-BbiA-gGi.js → hooks-cli-CDMcqTy4.js} +2 -2
  36. package/dist/{hooks-cli-dS4fMEKE.js → hooks-cli-CfsqqxPX.js} +2 -2
  37. package/dist/index.js +6 -6
  38. package/dist/llm-slug-generator.js +1 -1
  39. package/dist/{models-DqE1s0YL.js → models-ZEOGlFx7.js} +2 -2
  40. package/dist/{models-cli-6v9jkDxp.js → models-cli-BM1QyeXr.js} +3 -3
  41. package/dist/{models-cli-BWC7jYp4.js → models-cli-BwOQhZ_c.js} +2 -2
  42. package/dist/{onboard-Bxoibs4p.js → onboard-CU-pntZD.js} +2 -2
  43. package/dist/{onboard-BUEYf2m9.js → onboard-DQ34giB5.js} +2 -2
  44. package/dist/{onboard-channels-af6Cu6fT.js → onboard-channels-BOBxxhHX.js} +1 -1
  45. package/dist/{onboard-channels-C3UYzZNC.js → onboard-channels-g5cvwJpx.js} +1 -1
  46. package/dist/{onboarding-DW-7o6Ln.js → onboarding-CXWUjdM5.js} +3 -3
  47. package/dist/{onboarding-CDdMZbov.js → onboarding-DWs6tHZ9.js} +3 -3
  48. package/dist/{onboarding.finalize-29jsMLO2.js → onboarding.finalize-CAYf88mf.js} +6 -6
  49. package/dist/{onboarding.finalize-BI70KOeI.js → onboarding.finalize-vupGASMK.js} +5 -5
  50. package/dist/{pi-embedded-PkSwAmVq.js → pi-embedded-CJsSOG2j.js} +103 -168
  51. package/dist/{pi-embedded-JXvD5-F-.js → pi-embedded-DwbQz0MC.js} +103 -168
  52. package/dist/{plugin-registry-B7AdPXfF.js → plugin-registry-BDpdOTei.js} +1 -1
  53. package/dist/{plugin-registry-Reem6P3K.js → plugin-registry-CZeHSx_c.js} +1 -1
  54. package/dist/plugin-sdk/agents/model-aware-stream.d.ts +41 -0
  55. package/dist/plugin-sdk/agents/pi-embedded-runner/extra-params.d.ts +13 -0
  56. package/dist/plugin-sdk/{channel-web-CM7A3Y7G.js → channel-web-uUypcT9Q.js} +1 -1
  57. package/dist/plugin-sdk/index.js +2 -2
  58. package/dist/plugin-sdk/{reply-CDloTGFF.js → reply-DTKTuCrn.js} +103 -168
  59. package/dist/plugin-sdk/{web-CWNoMlnF.js → web-Dh6Youzv.js} +2 -2
  60. package/dist/{plugins-cli-V8mTTTnD.js → plugins-cli-CCQ3skeQ.js} +2 -2
  61. package/dist/{plugins-cli-B-6wVg3A.js → plugins-cli-D_RzeRoE.js} +2 -2
  62. package/dist/{program-DBtlRiFS.js → program-Cl9i8ubQ.js} +7 -7
  63. package/dist/{program-context-BHPNVgg2.js → program-context-BbmYGW-V.js} +17 -17
  64. package/dist/{prompt-select-styled-Bh-zAqW1.js → prompt-select-styled-BN0T6GxF.js} +4 -4
  65. package/dist/{prompt-select-styled-Cup1c9RJ.js → prompt-select-styled-BfuyvChh.js} +4 -4
  66. package/dist/{provider-auth-helpers-CiuLdUK3.js → provider-auth-helpers-CkmLFHXL.js} +1 -1
  67. package/dist/{provider-auth-helpers-BNmU48Ez.js → provider-auth-helpers-CuT5EHza.js} +1 -1
  68. package/dist/{push-apns-8VJkVSdh.js → push-apns-CFkFVwEz.js} +1 -1
  69. package/dist/{push-apns-9zUNNHgy.js → push-apns-DeJt9kAO.js} +1 -1
  70. package/dist/{register.agent-BtNmleKV.js → register.agent-BQm4YmZp.js} +6 -6
  71. package/dist/{register.agent-DnglG42G.js → register.agent-BygseJ7t.js} +5 -5
  72. package/dist/{register.configure-DfQOfV1W.js → register.configure-C2fhjZze.js} +6 -6
  73. package/dist/{register.configure-CLW9tdE4.js → register.configure-Cj95vB2U.js} +6 -6
  74. package/dist/{register.maintenance-BQfMsgo7.js → register.maintenance-CClfXq5e.js} +8 -8
  75. package/dist/{register.maintenance-jFYcRLEN.js → register.maintenance-K1x3E7OS.js} +7 -7
  76. package/dist/{register.message-DUsBvFSF.js → register.message-BSr-kUvJ.js} +2 -2
  77. package/dist/{register.message-BhoZYcqM.js → register.message-CSRzBl-c.js} +2 -2
  78. package/dist/{register.onboard-BBwhoeoE.js → register.onboard-Bd6wPydW.js} +4 -4
  79. package/dist/{register.onboard-DQOkpYBY.js → register.onboard-TsU21RR7.js} +4 -4
  80. package/dist/{register.setup-Ca6khTSz.js → register.setup-C9gu0W5l.js} +4 -4
  81. package/dist/{register.setup-6jlL3L1h.js → register.setup-DK-zsne2.js} +4 -4
  82. package/dist/{register.status-health-sessions-DQDXZYI3.js → register.status-health-sessions-DN5Ui3V0.js} +3 -3
  83. package/dist/{register.status-health-sessions-DsYNMl06.js → register.status-health-sessions-rZsuoqtr.js} +3 -3
  84. package/dist/{register.subclis-DJf3ihsW.js → register.subclis-DnzHFtLz.js} +9 -9
  85. package/dist/{reply-DSjeqLEz.js → reply-Ca3slrA3.js} +103 -168
  86. package/dist/{run-main-B2coomPj.js → run-main-DlHh5iOO.js} +14 -14
  87. package/dist/{server-methods-QNBQbsvr.js → server-methods-BYOkyf-q.js} +7 -7
  88. package/dist/{server-methods-DHo5e8Gj.js → server-methods-b_Qod4tt.js} +7 -7
  89. package/dist/{server-node-events-D_S0NRCQ.js → server-node-events-60nWpTh1.js} +2 -2
  90. package/dist/{server-node-events-CJOo8WcL.js → server-node-events-oU4Amei7.js} +2 -2
  91. package/dist/{status-B8yaGk2o.js → status-BXW5l4sd.js} +2 -2
  92. package/dist/{status-4DaGE8j5.js → status-BxbbINLV.js} +2 -2
  93. package/dist/{status-D_J6qcC1.js → status-D3-lP2_9.js} +1 -1
  94. package/dist/{status-kfEtYX22.js → status-kdz9P3tw.js} +1 -1
  95. package/dist/{subagent-registry-CyW0EDWw.js → subagent-registry-CbTbJKLs.js} +103 -168
  96. package/dist/{update-cli-DJupxo-f.js → update-cli-B5TI650v.js} +7 -7
  97. package/dist/{update-cli-C-ZGqknl.js → update-cli-Cy0gdWRf.js} +8 -8
  98. package/dist/{update-runner-BF5UULe-.js → update-runner-B0NdgPvD.js} +1 -1
  99. package/dist/{update-runner-AiIhp7fw.js → update-runner-Bacq0oLK.js} +1 -1
  100. package/dist/{web-6026eRzJ.js → web-D-oCzJTU.js} +1 -1
  101. package/dist/{web-CryqKXT4.js → web-DWNtg4iV.js} +1 -1
  102. package/dist/{web-HeObJp6A.js → web-DmED3zDP.js} +2 -2
  103. package/dist/{web-6vYYN17n.js → web-QVwKg99Q.js} +1 -1
  104. package/package.json +1 -1
@@ -44208,7 +44208,7 @@ function isVoiceChannelType(type) {
44208
44208
  function createDefaultDeps() {
44209
44209
  return {
44210
44210
  sendMessageWhatsApp: async (...args) => {
44211
- const { sendMessageWhatsApp } = await import("./web-6026eRzJ.js");
44211
+ const { sendMessageWhatsApp } = await import("./web-D-oCzJTU.js");
44212
44212
  return await sendMessageWhatsApp(...args);
44213
44213
  },
44214
44214
  sendMessageTelegram: async (...args) => {
@@ -59524,7 +59524,7 @@ function loadWebLoginQr() {
59524
59524
  return webLoginQrPromise;
59525
59525
  }
59526
59526
  function loadWebChannel() {
59527
- webChannelPromise ??= import("./web-6026eRzJ.js");
59527
+ webChannelPromise ??= import("./web-D-oCzJTU.js");
59528
59528
  return webChannelPromise;
59529
59529
  }
59530
59530
  function loadWhatsAppActions() {
@@ -65073,10 +65073,6 @@ function resolveModelProfile(modelId, userProfiles) {
65073
65073
 
65074
65074
  //#endregion
65075
65075
  //#region src/agents/pi-embedded-runner/extra-params.ts
65076
- const OPENROUTER_APP_HEADERS = {
65077
- "HTTP-Referer": "https://symi.ai",
65078
- "X-Title": "Symi"
65079
- };
65080
65076
  const ANTHROPIC_CONTEXT_1M_BETA = "context-1m-2025-08-07";
65081
65077
  const ANTHROPIC_1M_MODEL_PREFIXES = ["claude-opus-4", "claude-sonnet-4"];
65082
65078
  const OPENAI_RESPONSES_APIS = new Set(["openai-responses"]);
@@ -65094,70 +65090,6 @@ function resolveExtraParams(params) {
65094
65090
  const profile = resolveModelProfile(modelKey, params.cfg?.models?.profiles);
65095
65091
  if (profile.params && Object.keys(profile.params).length > 0) return { ...profile.params };
65096
65092
  }
65097
- /**
65098
- * Resolve cacheRetention from extraParams, supporting both new `cacheRetention`
65099
- * and legacy `cacheControlTtl` values for backwards compatibility.
65100
- *
65101
- * Mapping: "5m" → "short", "1h" → "long"
65102
- *
65103
- * Only applies to Anthropic provider (OpenRouter uses openai-completions API
65104
- * with hardcoded cache_control, not the cacheRetention stream option).
65105
- *
65106
- * Defaults to "short" for Anthropic provider when not explicitly configured.
65107
- */
65108
- function resolveCacheRetention(extraParams, provider) {
65109
- if (provider !== "anthropic") return;
65110
- const newVal = extraParams?.cacheRetention;
65111
- if (newVal === "none" || newVal === "short" || newVal === "long") return newVal;
65112
- const legacy = extraParams?.cacheControlTtl;
65113
- if (legacy === "5m") return "short";
65114
- if (legacy === "1h") return "long";
65115
- return "short";
65116
- }
65117
- function createStreamFnWithExtraParams(baseStreamFn, extraParams, provider) {
65118
- if (!extraParams || Object.keys(extraParams).length === 0) return;
65119
- const streamParams = {};
65120
- if (typeof extraParams.temperature === "number") streamParams.temperature = extraParams.temperature;
65121
- if (typeof extraParams.maxTokens === "number") streamParams.maxTokens = extraParams.maxTokens;
65122
- if (typeof extraParams.top_p === "number") streamParams.top_p = extraParams.top_p;
65123
- if (typeof extraParams.top_k === "number") streamParams.top_k = extraParams.top_k;
65124
- if (typeof extraParams.repeat_penalty === "number") streamParams.repeat_penalty = extraParams.repeat_penalty;
65125
- if (Array.isArray(extraParams.stop) && extraParams.stop.length > 0) streamParams.stop = extraParams.stop;
65126
- if (extraParams.chat_template_kwargs && typeof extraParams.chat_template_kwargs === "object") streamParams.chat_template_kwargs = extraParams.chat_template_kwargs;
65127
- const cacheRetention = resolveCacheRetention(extraParams, provider);
65128
- if (cacheRetention) streamParams.cacheRetention = cacheRetention;
65129
- if (Object.keys(streamParams).length === 0) return;
65130
- log$2.debug(`creating streamFn wrapper with params: ${JSON.stringify(streamParams)}`);
65131
- const sp = streamParams;
65132
- const payloadOverrides = {};
65133
- if (Array.isArray(sp.stop) && sp.stop.length > 0) payloadOverrides.stop = sp.stop;
65134
- if (typeof sp.top_p === "number") payloadOverrides.top_p = sp.top_p;
65135
- if (typeof sp.top_k === "number") payloadOverrides.top_k = sp.top_k;
65136
- if (typeof sp.repeat_penalty === "number") payloadOverrides.repeat_penalty = sp.repeat_penalty;
65137
- const hasPayloadOverrides = Object.keys(payloadOverrides).length > 0;
65138
- const underlying = baseStreamFn ?? streamSimple;
65139
- const wrappedStreamFn = (model, context, options) => {
65140
- if (hasPayloadOverrides) {
65141
- const originalOnPayload = options?.onPayload;
65142
- return underlying(model, context, {
65143
- ...streamParams,
65144
- ...options,
65145
- onPayload: (payload) => {
65146
- if (payload && typeof payload === "object") {
65147
- const p = payload;
65148
- for (const [key, value] of Object.entries(payloadOverrides)) if (p[key] === void 0) p[key] = value;
65149
- }
65150
- originalOnPayload?.(payload);
65151
- }
65152
- });
65153
- }
65154
- return underlying(model, context, {
65155
- ...streamParams,
65156
- ...options
65157
- });
65158
- };
65159
- return wrappedStreamFn;
65160
- }
65161
65093
  function isDirectOpenAIBaseUrl(baseUrl) {
65162
65094
  if (typeof baseUrl !== "string" || !baseUrl.trim()) return true;
65163
65095
  try {
@@ -65238,20 +65170,6 @@ function createAnthropicBetaHeadersWrapper(baseStreamFn, betas) {
65238
65170
  };
65239
65171
  }
65240
65172
  /**
65241
- * Create a streamFn wrapper that adds OpenRouter app attribution headers.
65242
- * These headers allow Symi to appear on OpenRouter's leaderboard.
65243
- */
65244
- function createOpenRouterHeadersWrapper(baseStreamFn) {
65245
- const underlying = baseStreamFn ?? streamSimple;
65246
- return (model, context, options) => underlying(model, context, {
65247
- ...options,
65248
- headers: {
65249
- ...OPENROUTER_APP_HEADERS,
65250
- ...options?.headers
65251
- }
65252
- });
65253
- }
65254
- /**
65255
65173
  * Create a streamFn wrapper that injects tool_stream=true for Z.AI providers.
65256
65174
  *
65257
65175
  * Z.AI's API supports the `tool_stream` parameter to enable real-time streaming
@@ -65274,82 +65192,6 @@ function createZaiToolStreamWrapper(baseStreamFn, enabled) {
65274
65192
  });
65275
65193
  };
65276
65194
  }
65277
- const GEMMA_STOP_SEQUENCES = ["<end_of_turn>", "<eos>"];
65278
- const VLLM_GEMMA_HINTS = ["gemma", "redsand"];
65279
- function isVllmOrGemmaProvider(provider, modelId, cfg) {
65280
- const lower = `${provider}/${modelId}`.toLowerCase();
65281
- if (VLLM_GEMMA_HINTS.some((h) => lower.includes(h))) return true;
65282
- const baseUrl = ((cfg?.models?.providers?.[provider])?.baseUrl ?? "").toLowerCase();
65283
- return baseUrl.includes("coreweave") || baseUrl.includes("vllm");
65284
- }
65285
- /**
65286
- * Wrap the stream function to fix vLLM/Gemma compat issues via onPayload:
65287
- * 1. Replace `max_completion_tokens` with `max_tokens` (vLLM ignores the former)
65288
- * 2. Inject Gemma stop sequences if none are set
65289
- * 3. Remove unsupported fields (store, stream_options.include_usage on older vLLM)
65290
- */
65291
- function createVllmCompatWrapper(baseStreamFn, extraParams) {
65292
- const underlying = baseStreamFn ?? streamSimple;
65293
- const configuredStop = Array.isArray(extraParams.stop) ? extraParams.stop : GEMMA_STOP_SEQUENCES;
65294
- return (model, context, options) => {
65295
- const originalOnPayload = options?.onPayload;
65296
- return underlying(model, context, {
65297
- ...options,
65298
- onPayload: (payload) => {
65299
- if (payload && typeof payload === "object") {
65300
- const p = payload;
65301
- if (p.max_completion_tokens && !p.max_tokens) {
65302
- p.max_tokens = p.max_completion_tokens;
65303
- delete p.max_completion_tokens;
65304
- }
65305
- if (!p.stop && configuredStop.length > 0) p.stop = configuredStop;
65306
- delete p.store;
65307
- }
65308
- originalOnPayload?.(payload);
65309
- }
65310
- });
65311
- };
65312
- }
65313
- /**
65314
- * Apply extra params (like temperature) to an agent's streamFn.
65315
- * Also adds OpenRouter app attribution headers when using the OpenRouter provider.
65316
- *
65317
- * @internal Exported for testing
65318
- */
65319
- function applyExtraParamsToAgent(agent, cfg, provider, modelId, extraParamsOverride) {
65320
- const extraParams = resolveExtraParams({
65321
- cfg,
65322
- provider,
65323
- modelId
65324
- });
65325
- const override = extraParamsOverride && Object.keys(extraParamsOverride).length > 0 ? Object.fromEntries(Object.entries(extraParamsOverride).filter(([, value]) => value !== void 0)) : void 0;
65326
- const merged = Object.assign({}, extraParams, override);
65327
- const wrappedStreamFn = createStreamFnWithExtraParams(agent.streamFn, merged, provider);
65328
- if (wrappedStreamFn) {
65329
- log$2.debug(`applying extraParams to agent streamFn for ${provider}/${modelId}`);
65330
- agent.streamFn = wrappedStreamFn;
65331
- }
65332
- const anthropicBetas = resolveAnthropicBetas(merged, provider, modelId);
65333
- if (anthropicBetas?.length) {
65334
- log$2.debug(`applying Anthropic beta header for ${provider}/${modelId}: ${anthropicBetas.join(",")}`);
65335
- agent.streamFn = createAnthropicBetaHeadersWrapper(agent.streamFn, anthropicBetas);
65336
- }
65337
- if (provider === "openrouter") {
65338
- log$2.debug(`applying OpenRouter app attribution headers for ${provider}/${modelId}`);
65339
- agent.streamFn = createOpenRouterHeadersWrapper(agent.streamFn);
65340
- }
65341
- if (provider === "zai" || provider === "z-ai") {
65342
- if (merged?.tool_stream !== false) {
65343
- log$2.debug(`enabling Z.AI tool_stream for ${provider}/${modelId}`);
65344
- agent.streamFn = createZaiToolStreamWrapper(agent.streamFn, true);
65345
- }
65346
- }
65347
- if (isVllmOrGemmaProvider(provider, modelId, cfg)) {
65348
- log$2.debug(`applying vLLM/Gemma compat wrapper for ${provider}/${modelId}`);
65349
- agent.streamFn = createVllmCompatWrapper(agent.streamFn, merged);
65350
- }
65351
- agent.streamFn = createOpenAIResponsesStoreWrapper(agent.streamFn);
65352
- }
65353
65195
 
65354
65196
  //#endregion
65355
65197
  //#region src/utils/safe-json.ts
@@ -65626,6 +65468,74 @@ function createCacheTrace(params) {
65626
65468
  };
65627
65469
  }
65628
65470
 
65471
+ //#endregion
65472
+ //#region src/agents/model-aware-stream.ts
65473
+ /**
65474
+ * Create a single stream function wrapper that handles all provider-specific
65475
+ * param injection via one onPayload hook.
65476
+ *
65477
+ * Replaces: createStreamFnWithExtraParams, createVllmCompatWrapper,
65478
+ * createOpenRouterHeadersWrapper.
65479
+ */
65480
+ function createModelAwareStreamFn(opts) {
65481
+ const underlying = opts.baseStreamFn ?? streamSimple;
65482
+ const mergedParams = {
65483
+ ...opts.profile.params,
65484
+ ...opts.configExtraParams,
65485
+ ...opts.streamParamsOverride
65486
+ };
65487
+ const nativeOpts = {};
65488
+ if (typeof mergedParams.temperature === "number") nativeOpts.temperature = mergedParams.temperature;
65489
+ if (typeof mergedParams.max_tokens === "number") nativeOpts.maxTokens = mergedParams.max_tokens;
65490
+ else if (typeof mergedParams.maxTokens === "number") nativeOpts.maxTokens = mergedParams.maxTokens;
65491
+ const injections = {};
65492
+ if (Array.isArray(mergedParams.stop) && mergedParams.stop.length > 0) injections.stop = mergedParams.stop;
65493
+ if (typeof mergedParams.top_p === "number") injections.top_p = mergedParams.top_p;
65494
+ if (typeof mergedParams.top_k === "number") injections.top_k = mergedParams.top_k;
65495
+ if (typeof mergedParams.repeat_penalty === "number") injections.repeat_penalty = mergedParams.repeat_penalty;
65496
+ const isVllm = isVllmProvider(opts.provider, opts.modelId, opts.config);
65497
+ const isOpenRouter = opts.provider === "openrouter";
65498
+ const extraHeaders = {};
65499
+ if (isOpenRouter) {
65500
+ extraHeaders["HTTP-Referer"] = "https://symi.ai";
65501
+ extraHeaders["X-Title"] = "Symi";
65502
+ }
65503
+ const hasExtraHeaders = Object.keys(extraHeaders).length > 0;
65504
+ const onPayloadHook = (payload, callerOnPayload) => {
65505
+ if (payload && typeof payload === "object") {
65506
+ const p = payload;
65507
+ for (const [key, val] of Object.entries(injections)) if (p[key] === void 0) p[key] = val;
65508
+ if (isVllm) {
65509
+ if (p.max_completion_tokens && !p.max_tokens) {
65510
+ p.max_tokens = p.max_completion_tokens;
65511
+ delete p.max_completion_tokens;
65512
+ }
65513
+ delete p.store;
65514
+ }
65515
+ }
65516
+ callerOnPayload?.(payload);
65517
+ };
65518
+ return (model, context, options) => {
65519
+ const callerOnPayload = options?.onPayload;
65520
+ return underlying(model, context, {
65521
+ ...nativeOpts,
65522
+ ...options,
65523
+ onPayload: (payload) => onPayloadHook(payload, callerOnPayload),
65524
+ ...hasExtraHeaders ? { headers: {
65525
+ ...extraHeaders,
65526
+ ...options?.headers
65527
+ } } : {}
65528
+ });
65529
+ };
65530
+ }
65531
+ /** Detect vLLM/Gemma providers by model hints or baseUrl patterns. */
65532
+ function isVllmProvider(provider, modelId, config) {
65533
+ const lower = `${provider}/${modelId}`.toLowerCase();
65534
+ if (["gemma", "redsand"].some((h) => lower.includes(h))) return true;
65535
+ const baseUrl = ((config?.models?.providers?.[provider])?.baseUrl ?? "").toLowerCase();
65536
+ return baseUrl.includes("coreweave") || baseUrl.includes("vllm");
65537
+ }
65538
+
65629
65539
  //#endregion
65630
65540
  //#region src/auto-reply/reply/streaming-directives.ts
65631
65541
  const splitTrailingDirective = (text) => {
@@ -68676,14 +68586,39 @@ async function runEmbeddedAttempt(params) {
68676
68586
  modelApi: params.model.api,
68677
68587
  workspaceDir: params.workspaceDir
68678
68588
  });
68679
- if (params.model.api === "ollama") {
68680
- const providerConfig = params.config?.models?.providers?.[params.model.provider];
68681
- const modelBaseUrl = typeof params.model.baseUrl === "string" ? params.model.baseUrl.trim() : "";
68682
- const providerBaseUrl = typeof providerConfig?.baseUrl === "string" ? providerConfig.baseUrl.trim() : "";
68683
- const ollamaBaseUrl = modelBaseUrl || providerBaseUrl || OLLAMA_NATIVE_BASE_URL;
68684
- activeSession.agent.streamFn = createOllamaStreamFn(ollamaBaseUrl);
68685
- } else activeSession.agent.streamFn = streamSimple;
68686
- applyExtraParamsToAgent(activeSession.agent, params.config, params.provider, params.modelId, params.streamParams);
68589
+ {
68590
+ let baseStreamFn = streamSimple;
68591
+ if (params.model.api === "ollama") {
68592
+ const providerConfig = params.config?.models?.providers?.[params.model.provider];
68593
+ const modelBaseUrl = typeof params.model.baseUrl === "string" ? params.model.baseUrl.trim() : "";
68594
+ const providerBaseUrl = typeof providerConfig?.baseUrl === "string" ? providerConfig.baseUrl.trim() : "";
68595
+ baseStreamFn = createOllamaStreamFn(modelBaseUrl || providerBaseUrl || OLLAMA_NATIVE_BASE_URL);
68596
+ }
68597
+ const configExtraParams = resolveExtraParams({
68598
+ cfg: params.config,
68599
+ provider: params.provider,
68600
+ modelId: params.modelId
68601
+ });
68602
+ activeSession.agent.streamFn = createModelAwareStreamFn({
68603
+ baseStreamFn,
68604
+ profile: modelProfile,
68605
+ provider: params.provider,
68606
+ modelId: params.modelId,
68607
+ config: params.config,
68608
+ configExtraParams,
68609
+ streamParamsOverride: params.streamParams
68610
+ });
68611
+ const merged = {
68612
+ ...configExtraParams,
68613
+ ...params.streamParams
68614
+ };
68615
+ const anthropicBetas = resolveAnthropicBetas(merged, params.provider, params.modelId);
68616
+ if (anthropicBetas?.length) activeSession.agent.streamFn = createAnthropicBetaHeadersWrapper(activeSession.agent.streamFn, anthropicBetas);
68617
+ if (params.provider === "zai" || params.provider === "z-ai") {
68618
+ if (merged?.tool_stream !== false) activeSession.agent.streamFn = createZaiToolStreamWrapper(activeSession.agent.streamFn, true);
68619
+ }
68620
+ activeSession.agent.streamFn = createOpenAIResponsesStoreWrapper(activeSession.agent.streamFn);
68621
+ }
68687
68622
  if (cacheTrace) {
68688
68623
  cacheTrace.recordStage("session:loaded", {
68689
68624
  messages: activeSession.messages,
@@ -1,7 +1,7 @@
1
1
  import { g as resolveStateDir } from "./paths-Cqn-zk3M.js";
2
2
  import { B as theme, h as pathExists } from "./utils-B-0b9bGM.js";
3
3
  import "./thinking-EAliFiVK.js";
4
- import { K as trimLogTail } from "./reply-DSjeqLEz.js";
4
+ import { K as trimLogTail } from "./reply-Ca3slrA3.js";
5
5
  import { t as resolveSymiPackageRoot } from "./symi-root-CrGJbkzf.js";
6
6
  import "./registry-Cja8eT7G.js";
7
7
  import { f as defaultRuntime } from "./subsystem-D9vIQve0.js";
@@ -106,7 +106,7 @@ import "./stagger-BUClb97_.js";
106
106
  import { c as resolveGatewayLaunchAgentLabel, d as resolveGatewaySystemdServiceName, f as resolveGatewayWindowsTaskName } from "./constants-C8_BLnaW.js";
107
107
  import "./channel-selection-DuWs0Aak.js";
108
108
  import { r as parseSemver } from "./runtime-guard-B37eizu-.js";
109
- import "./program-context-BHPNVgg2.js";
109
+ import "./program-context-BbmYGW-V.js";
110
110
  import "./catalog-RiADx7MA.js";
111
111
  import "./skills-status-CURJKnyY.js";
112
112
  import { n as inheritOptionFromParent } from "./command-options-BtDai3oC.js";
@@ -117,7 +117,7 @@ import "./npm-registry-spec-C2JDdSZS.js";
117
117
  import "./skill-scanner-CLs8u6vQ.js";
118
118
  import "./installs-C1Cebk97.js";
119
119
  import "./channels-status-issues-B_kBkl_u.js";
120
- import { r as installCompletion } from "./completion-cli-DaOHSXM3.js";
120
+ import { r as installCompletion } from "./completion-cli-CMJmUQbI.js";
121
121
  import "./daemon-runtime-2mwX-jqj.js";
122
122
  import "./systemd-riq8uNJQ.js";
123
123
  import { t as resolveGatewayService } from "./service-Cl74hx8J.js";
@@ -126,19 +126,19 @@ import "./systemd-hints-BR6gChwm.js";
126
126
  import { i as runDaemonInstall, r as runDaemonRestart } from "./daemon-cli-DscwlsKW.js";
127
127
  import "./diagnostics-BAMlsVVX.js";
128
128
  import { t as renderTable } from "./table-BTgkRafz.js";
129
- import "./health-rR61mwm3.js";
129
+ import "./health-CypF_2ZD.js";
130
130
  import "./control-ui-assets-Z947tKLt.js";
131
131
  import { a as resolveNpmChannelTag, c as DEFAULT_PACKAGE_CHANNEL, d as formatUpdateChannelLabel, g as resolveUpdateChannelDisplay, h as resolveEffectiveUpdateChannel, m as normalizeUpdateChannel, n as compareSemverStrings, r as fetchNpmTagVersion, s as DEFAULT_GIT_CHANNEL, t as checkUpdateStatus, u as channelToNpmTag } from "./update-check-CtckACbb.js";
132
132
  import "./dm-policy-shared-Bh3TbexU.js";
133
133
  import { i as resolveUpdateAvailability, n as formatUpdateOneLiner, t as formatUpdateAvailableHint } from "./status.update-DtwCUTf-.js";
134
- import { a as globalInstallArgs, c as readPackageVersion, i as detectGlobalInstallManagerForRoot, n as cleanupGlobalRenameDirs, o as resolveGlobalPackageRoot, r as detectGlobalInstallManagerByPresence, s as readPackageName, t as runGatewayUpdate } from "./update-runner-AiIhp7fw.js";
134
+ import { a as globalInstallArgs, c as readPackageVersion, i as detectGlobalInstallManagerForRoot, n as cleanupGlobalRenameDirs, o as resolveGlobalPackageRoot, r as detectGlobalInstallManagerByPresence, s as readPackageName, t as runGatewayUpdate } from "./update-runner-Bacq0oLK.js";
135
135
  import "./logging-BzzwiKjv.js";
136
136
  import { n as updateNpmInstalledPlugins, t as syncPluginsForUpdateChannel } from "./update-rw7wJwHd.js";
137
137
  import "./doctor-config-flow-QnaBd8kL.js";
138
138
  import "./systemd-linger-aQ75ZlXY.js";
139
139
  import "./health-format-DSwnXZPU.js";
140
- import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-Cup1c9RJ.js";
141
- import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-D7ShsgUp.js";
140
+ import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-BfuyvChh.js";
141
+ import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-CJHJYIwQ.js";
142
142
  import os from "node:os";
143
143
  import path from "node:path";
144
144
  import fs from "node:fs/promises";
@@ -16,7 +16,7 @@ import "./client-DMBZpU6X.js";
16
16
  import "./call-BcE47FtD.js";
17
17
  import "./message-channel-C9dERklz.js";
18
18
  import "./pairing-token-Byh6drgn.js";
19
- import { wt as trimLogTail } from "./subagent-registry-CyW0EDWw.js";
19
+ import { wt as trimLogTail } from "./subagent-registry-CbTbJKLs.js";
20
20
  import "./sessions-CJXnZVjR.js";
21
21
  import "./tokens-Csntmwwn.js";
22
22
  import "./plugins-CwSlLxM8.js";
@@ -111,10 +111,10 @@ import "./npm-registry-spec-DkaZNHAW.js";
111
111
  import "./skill-scanner-BGWOBqLY.js";
112
112
  import "./installs-CgQpVncj.js";
113
113
  import "./channels-status-issues-c7qZbYG5.js";
114
- import "./register.subclis-DJf3ihsW.js";
115
- import "./command-registry-Cvr_dlLY.js";
114
+ import "./register.subclis-DnzHFtLz.js";
115
+ import "./command-registry-ea9SD1eA.js";
116
116
  import "./program-context-CqzR_m-7.js";
117
- import { r as installCompletion } from "./completion-cli-DDlYn0ya.js";
117
+ import { r as installCompletion } from "./completion-cli-DVkiEAEA.js";
118
118
  import "./daemon-runtime-CfRwa6qh.js";
119
119
  import { r as parseSemver } from "./runtime-guard-D7waq_Ho.js";
120
120
  import "./systemd-DlMdyFDY.js";
@@ -124,19 +124,19 @@ import "./systemd-hints-sQipWGd1.js";
124
124
  import { i as runDaemonInstall, r as runDaemonRestart } from "./daemon-cli-wWnBIQtk.js";
125
125
  import "./diagnostics-CS1ov_hH.js";
126
126
  import { t as renderTable } from "./table-D01d2GuY.js";
127
- import "./health-BSOMI4B6.js";
127
+ import "./health-Bst5HnLF.js";
128
128
  import "./control-ui-assets-BseSWee1.js";
129
129
  import { a as resolveNpmChannelTag, c as DEFAULT_PACKAGE_CHANNEL, d as formatUpdateChannelLabel, g as resolveUpdateChannelDisplay, h as resolveEffectiveUpdateChannel, m as normalizeUpdateChannel, n as compareSemverStrings, r as fetchNpmTagVersion, s as DEFAULT_GIT_CHANNEL, t as checkUpdateStatus, u as channelToNpmTag } from "./update-check-ZdimP1aU.js";
130
130
  import "./dm-policy-shared-DJ-61hCT.js";
131
131
  import { i as resolveUpdateAvailability, n as formatUpdateOneLiner, t as formatUpdateAvailableHint } from "./status.update-DbmZz0Aq.js";
132
- import { a as globalInstallArgs, c as readPackageVersion, i as detectGlobalInstallManagerForRoot, n as cleanupGlobalRenameDirs, o as resolveGlobalPackageRoot, r as detectGlobalInstallManagerByPresence, s as readPackageName, t as runGatewayUpdate } from "./update-runner-BF5UULe-.js";
132
+ import { a as globalInstallArgs, c as readPackageVersion, i as detectGlobalInstallManagerForRoot, n as cleanupGlobalRenameDirs, o as resolveGlobalPackageRoot, r as detectGlobalInstallManagerByPresence, s as readPackageName, t as runGatewayUpdate } from "./update-runner-B0NdgPvD.js";
133
133
  import "./logging-BGewRZy0.js";
134
134
  import { n as updateNpmInstalledPlugins, t as syncPluginsForUpdateChannel } from "./update-DEMKx4eC.js";
135
135
  import "./doctor-config-flow-CA3eiKhd.js";
136
136
  import "./systemd-linger-DA_LW52P.js";
137
137
  import "./health-format-CzgUHmmX.js";
138
- import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-Bh-zAqW1.js";
139
- import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-Dw78bQaQ.js";
138
+ import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-BN0T6GxF.js";
139
+ import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-DeRX6gkI.js";
140
140
  import { spawn, spawnSync } from "node:child_process";
141
141
  import os from "node:os";
142
142
  import path from "node:path";
@@ -1,6 +1,6 @@
1
1
  import { nt as pathExists } from "./entry.js";
2
2
  import { t as runCommandWithTimeout } from "./exec-CBKBIMpA.js";
3
- import { wt as trimLogTail } from "./subagent-registry-CyW0EDWw.js";
3
+ import { wt as trimLogTail } from "./subagent-registry-CbTbJKLs.js";
4
4
  import { n as resolveControlUiDistIndexHealth, r as resolveControlUiDistIndexPathForRoot } from "./control-ui-assets-BseSWee1.js";
5
5
  import { c as DEFAULT_PACKAGE_CHANNEL, f as isBetaTag, l as DEV_BRANCH, n as compareSemverStrings, o as detectPackageManager$1, p as isStableTag, u as channelToNpmTag } from "./update-check-ZdimP1aU.js";
6
6
  import os from "node:os";
@@ -1,5 +1,5 @@
1
1
  import { h as pathExists } from "./utils-B-0b9bGM.js";
2
- import { K as trimLogTail } from "./reply-DSjeqLEz.js";
2
+ import { K as trimLogTail } from "./reply-Ca3slrA3.js";
3
3
  import { t as runCommandWithTimeout } from "./exec-CWkblSrI.js";
4
4
  import { n as resolveControlUiDistIndexHealth, r as resolveControlUiDistIndexPathForRoot } from "./control-ui-assets-Z947tKLt.js";
5
5
  import { c as DEFAULT_PACKAGE_CHANNEL, f as isBetaTag, l as DEV_BRANCH, n as compareSemverStrings, o as detectPackageManager$1, p as isStableTag, u as channelToNpmTag } from "./update-check-CtckACbb.js";
@@ -15,7 +15,7 @@ import "./client-DMBZpU6X.js";
15
15
  import "./call-BcE47FtD.js";
16
16
  import "./message-channel-C9dERklz.js";
17
17
  import "./pairing-token-Byh6drgn.js";
18
- import { B as DEFAULT_GROUP_HISTORY_LIMIT, Bn as formatInboundEnvelope, E as sleepWithAbort, H as recordPendingHistoryEntryIfEnabled, Jn as normalizeMentionText, R as buildPairingReply, Rn as createInboundDebouncer, T as computeBackoff, U as shouldAckReactionForWhatsApp, Un as hasControlCommand, V as buildHistoryContextFromEntries, Vn as resolveEnvelopeFormatOptions, W as dispatchReplyWithBufferedBlockDispatcher, Wn as shouldComputeCommandAuthorized, X as getReplyFromConfig, Y as createDedupeCache, nn as normalizeGroupActivation, qn as buildMentionRegexes, rn as parseActivationCommand, wn as enqueueSystemEvent, z as resolveMentionGating, zn as resolveInboundDebounceMs } from "./subagent-registry-CyW0EDWw.js";
18
+ import { B as DEFAULT_GROUP_HISTORY_LIMIT, Bn as formatInboundEnvelope, E as sleepWithAbort, H as recordPendingHistoryEntryIfEnabled, Jn as normalizeMentionText, R as buildPairingReply, Rn as createInboundDebouncer, T as computeBackoff, U as shouldAckReactionForWhatsApp, Un as hasControlCommand, V as buildHistoryContextFromEntries, Vn as resolveEnvelopeFormatOptions, W as dispatchReplyWithBufferedBlockDispatcher, Wn as shouldComputeCommandAuthorized, X as getReplyFromConfig, Y as createDedupeCache, nn as normalizeGroupActivation, qn as buildMentionRegexes, rn as parseActivationCommand, wn as enqueueSystemEvent, z as resolveMentionGating, zn as resolveInboundDebounceMs } from "./subagent-registry-CbTbJKLs.js";
19
19
  import { B as resolveGroupSessionKey, c as recordSessionMetaFromInbound, o as loadSessionStore, s as readSessionUpdatedAt, u as updateLastRoute } from "./sessions-CJXnZVjR.js";
20
20
  import "./tokens-Csntmwwn.js";
21
21
  import "./plugins-CwSlLxM8.js";
@@ -8,7 +8,7 @@ import { c as resolveIdentityNamePrefix, l as resolveMessagePrefix, t as createR
8
8
  import "./github-copilot-token-BbsJ0Qbo.js";
9
9
  import { r as formatCliCommand } from "./env-CQ_DQOwT.js";
10
10
  import "./tokens-Cn6drXx2.js";
11
- import { C as shouldComputeCommandAuthorized, S as hasControlCommand, T as normalizeMentionText, _ as enqueueSystemEvent, a as resolveMentionGating, b as formatInboundEnvelope, c as recordPendingHistoryEntryIfEnabled, f as createDedupeCache, g as formatDurationPrecise, h as parseActivationCommand, i as buildPairingReply, l as shouldAckReactionForWhatsApp, m as normalizeGroupActivation, n as computeBackoff, o as DEFAULT_GROUP_HISTORY_LIMIT, p as getReplyFromConfig, r as sleepWithAbort, s as buildHistoryContextFromEntries, u as dispatchReplyWithBufferedBlockDispatcher, v as createInboundDebouncer, w as buildMentionRegexes, x as resolveEnvelopeFormatOptions, y as resolveInboundDebounceMs } from "./pi-embedded-JXvD5-F-.js";
11
+ import { C as shouldComputeCommandAuthorized, S as hasControlCommand, T as normalizeMentionText, _ as enqueueSystemEvent, a as resolveMentionGating, b as formatInboundEnvelope, c as recordPendingHistoryEntryIfEnabled, f as createDedupeCache, g as formatDurationPrecise, h as parseActivationCommand, i as buildPairingReply, l as shouldAckReactionForWhatsApp, m as normalizeGroupActivation, n as computeBackoff, o as DEFAULT_GROUP_HISTORY_LIMIT, p as getReplyFromConfig, r as sleepWithAbort, s as buildHistoryContextFromEntries, u as dispatchReplyWithBufferedBlockDispatcher, v as createInboundDebouncer, w as buildMentionRegexes, x as resolveEnvelopeFormatOptions, y as resolveInboundDebounceMs } from "./pi-embedded-DwbQz0MC.js";
12
12
  import "./plugins-71oIavrF.js";
13
13
  import { i as logWebSelfId, l as readWebSelfId, n as WA_WEB_AUTH_DIR, p as webAuthExists, r as getWebAuthAgeMs, s as pickWebChannel, t as resolveWhatsAppAccount } from "./accounts-DDEyGwby.js";
14
14
  import "./bindings-DYVakimr.js";
@@ -1,7 +1,7 @@
1
1
  import "./paths-Cqn-zk3M.js";
2
2
  import "./utils-B-0b9bGM.js";
3
3
  import "./thinking-EAliFiVK.js";
4
- import "./reply-DSjeqLEz.js";
4
+ import "./reply-Ca3slrA3.js";
5
5
  import "./registry-Cja8eT7G.js";
6
6
  import "./subsystem-D9vIQve0.js";
7
7
  import "./exec-CWkblSrI.js";
@@ -101,7 +101,7 @@ import "./pi-tools.policy-CIDBbw6x.js";
101
101
  import "./control-service-Bz7rxLWq.js";
102
102
  import "./stagger-BUClb97_.js";
103
103
  import "./channel-selection-DuWs0Aak.js";
104
- import { n as monitorWebInbox, t as monitorWebChannel } from "./channel-web-C-HLPbLL.js";
104
+ import { n as monitorWebInbox, t as monitorWebChannel } from "./channel-web-a5tX1YI3.js";
105
105
  import { n as sendMessageWhatsApp } from "./outbound-DB5Zus0-.js";
106
106
  import { i as waitForWaConnection, t as createWaSocket } from "./session-DIBTkyvE.js";
107
107
  import { t as loginWeb } from "./login-dIlDkG4X.js";
@@ -5,7 +5,7 @@ import "./agent-scope-BxoUQqgM.js";
5
5
  import { r as defaultRuntime, t as createSubsystemLogger } from "./subsystem-Bs9YvKLa.js";
6
6
  import "./workspace-wAaHI8-5.js";
7
7
  import "./tokens-H1H1LiSQ.js";
8
- import { C as resolveEnvelopeFormatOptions, D as normalizeMentionText, E as buildMentionRegexes, S as formatInboundEnvelope, T as shouldComputeCommandAuthorized, _ as parseActivationCommand, b as createInboundDebouncer, c as DEFAULT_GROUP_HISTORY_LIMIT, d as shouldAckReactionForWhatsApp, f as dispatchReplyWithBufferedBlockDispatcher, g as normalizeGroupActivation, h as getReplyFromConfig, l as buildHistoryContextFromEntries, m as createDedupeCache, n as computeBackoff, o as buildPairingReply, r as sleepWithAbort, s as resolveMentionGating, u as recordPendingHistoryEntryIfEnabled, v as formatDurationPrecise, w as hasControlCommand, x as resolveInboundDebounceMs, y as enqueueSystemEvent } from "./pi-embedded-PkSwAmVq.js";
8
+ import { C as resolveEnvelopeFormatOptions, D as normalizeMentionText, E as buildMentionRegexes, S as formatInboundEnvelope, T as shouldComputeCommandAuthorized, _ as parseActivationCommand, b as createInboundDebouncer, c as DEFAULT_GROUP_HISTORY_LIMIT, d as shouldAckReactionForWhatsApp, f as dispatchReplyWithBufferedBlockDispatcher, g as normalizeGroupActivation, h as getReplyFromConfig, l as buildHistoryContextFromEntries, m as createDedupeCache, n as computeBackoff, o as buildPairingReply, r as sleepWithAbort, s as resolveMentionGating, u as recordPendingHistoryEntryIfEnabled, v as formatDurationPrecise, w as hasControlCommand, x as resolveInboundDebounceMs, y as enqueueSystemEvent } from "./pi-embedded-CJsSOG2j.js";
9
9
  import "./plugins-DQYI3Fr-.js";
10
10
  import { i as logWebSelfId, l as readWebSelfId, n as WA_WEB_AUTH_DIR, p as webAuthExists, r as getWebAuthAgeMs, s as pickWebChannel, t as resolveWhatsAppAccount } from "./accounts-tNElYrCH.js";
11
11
  import "./boolean-B8-BqKGQ.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symerian/symi",
3
- "version": "2.3.4",
3
+ "version": "2.4.0",
4
4
  "description": "Multi-channel AI gateway with extensible messaging integrations",
5
5
  "keywords": [],
6
6
  "homepage": "https://github.com/jaysteelmind/symi#readme",