@automagik/omni 2.260703.2 → 2.260703.3

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.
@@ -23404,11 +23404,12 @@ var init_agent_route = __esm(() => {
23404
23404
  agentGateEnabled: exports_external.boolean().nullable(),
23405
23405
  agentGateModel: exports_external.string().max(120).nullable(),
23406
23406
  agentGatePrompt: exports_external.string().nullable(),
23407
- messageDebounceMode: exports_external.enum(["disabled", "fixed", "randomized"]).nullable(),
23407
+ messageDebounceMode: exports_external.enum(["disabled", "fixed", "randomized", "presence"]).nullable(),
23408
23408
  messageDebounceMinMs: exports_external.number().int().nonnegative().nullable(),
23409
23409
  messageDebounceMaxMs: exports_external.number().int().nonnegative().nullable(),
23410
23410
  messageDebounceGroupMs: exports_external.number().int().nonnegative().nullable(),
23411
23411
  messageDebounceRestartOnTyping: exports_external.boolean().nullable(),
23412
+ messageDebounceMaxWaitMs: exports_external.number().int().nonnegative().nullable(),
23412
23413
  messageSplitDelayMode: exports_external.enum(["disabled", "fixed", "randomized"]).nullable(),
23413
23414
  messageSplitDelayFixedMs: exports_external.number().int().nonnegative().nullable(),
23414
23415
  messageSplitDelayMinMs: exports_external.number().int().nonnegative().nullable(),
@@ -23439,11 +23440,12 @@ var init_agent_route = __esm(() => {
23439
23440
  agentGateEnabled: exports_external.boolean().optional(),
23440
23441
  agentGateModel: exports_external.string().max(120).optional(),
23441
23442
  agentGatePrompt: exports_external.string().optional(),
23442
- messageDebounceMode: exports_external.enum(["disabled", "fixed", "randomized"]).optional(),
23443
+ messageDebounceMode: exports_external.enum(["disabled", "fixed", "randomized", "presence"]).optional(),
23443
23444
  messageDebounceMinMs: exports_external.number().int().nonnegative().optional(),
23444
23445
  messageDebounceMaxMs: exports_external.number().int().nonnegative().optional(),
23445
23446
  messageDebounceGroupMs: exports_external.number().int().nonnegative().optional(),
23446
23447
  messageDebounceRestartOnTyping: exports_external.boolean().optional(),
23448
+ messageDebounceMaxWaitMs: exports_external.number().int().nonnegative().optional(),
23447
23449
  messageSplitDelayMode: exports_external.enum(["disabled", "fixed", "randomized"]).optional(),
23448
23450
  messageSplitDelayFixedMs: exports_external.number().int().nonnegative().optional(),
23449
23451
  messageSplitDelayMinMs: exports_external.number().int().nonnegative().optional(),
@@ -23473,11 +23475,12 @@ var init_agent_route = __esm(() => {
23473
23475
  agentGateEnabled: exports_external.boolean().optional().nullable(),
23474
23476
  agentGateModel: exports_external.string().max(120).optional().nullable(),
23475
23477
  agentGatePrompt: exports_external.string().optional().nullable(),
23476
- messageDebounceMode: exports_external.enum(["disabled", "fixed", "randomized"]).optional().nullable(),
23478
+ messageDebounceMode: exports_external.enum(["disabled", "fixed", "randomized", "presence"]).optional().nullable(),
23477
23479
  messageDebounceMinMs: exports_external.number().int().nonnegative().optional().nullable(),
23478
23480
  messageDebounceMaxMs: exports_external.number().int().nonnegative().optional().nullable(),
23479
23481
  messageDebounceGroupMs: exports_external.number().int().nonnegative().optional().nullable(),
23480
23482
  messageDebounceRestartOnTyping: exports_external.boolean().optional().nullable(),
23483
+ messageDebounceMaxWaitMs: exports_external.number().int().nonnegative().optional().nullable(),
23481
23484
  messageSplitDelayMode: exports_external.enum(["disabled", "fixed", "randomized"]).optional().nullable(),
23482
23485
  messageSplitDelayFixedMs: exports_external.number().int().nonnegative().optional().nullable(),
23483
23486
  messageSplitDelayMinMs: exports_external.number().int().nonnegative().optional().nullable(),
@@ -225291,7 +225294,7 @@ var init_sentry_scrub = __esm(() => {
225291
225294
  var require_package7 = __commonJS((exports, module) => {
225292
225295
  module.exports = {
225293
225296
  name: "@omni/api",
225294
- version: "2.260703.2",
225297
+ version: "2.260703.3",
225295
225298
  type: "module",
225296
225299
  exports: {
225297
225300
  ".": {
@@ -277533,7 +277536,7 @@ var init_schema2 = __esm(() => {
277533
277536
  agentTypes = ["agent", "team", "workflow"];
277534
277537
  agentSystems = ["claude", "agno", "openai", "gemini", "custom", "omni-internal"];
277535
277538
  agentEntityTypes = ["assistant", "workflow", "team", "tool"];
277536
- debounceMode = ["disabled", "fixed", "randomized"];
277539
+ debounceMode = ["disabled", "fixed", "randomized", "presence"];
277537
277540
  splitDelayMode = ["disabled", "fixed", "randomized"];
277538
277541
  replyFilterMode = ["all", "filtered"];
277539
277542
  agentSessionStrategies = ["per_user", "per_chat", "per_thread"];
@@ -277669,6 +277672,7 @@ var init_schema2 = __esm(() => {
277669
277672
  messageDebounceMaxMs: integer("message_debounce_max_ms"),
277670
277673
  messageDebounceGroupMs: integer("message_debounce_group_ms"),
277671
277674
  messageDebounceRestartOnTyping: boolean("message_debounce_restart_on_typing"),
277675
+ messageDebounceMaxWaitMs: integer("message_debounce_max_wait_ms"),
277672
277676
  messageSplitDelayMode: varchar("message_split_delay_mode", { length: 20 }).$type(),
277673
277677
  messageSplitDelayFixedMs: integer("message_split_delay_fixed_ms"),
277674
277678
  messageSplitDelayMinMs: integer("message_split_delay_min_ms"),
@@ -277822,6 +277826,7 @@ var init_schema2 = __esm(() => {
277822
277826
  messageDebounceGroupMs: integer("message_debounce_group_ms"),
277823
277827
  messageDebounceMaxMs: integer("message_debounce_max_ms").notNull().default(0),
277824
277828
  messageDebounceRestartOnTyping: boolean("message_debounce_restart_on_typing").notNull().default(false),
277829
+ messageDebounceMaxWaitMs: integer("message_debounce_max_wait_ms"),
277825
277830
  agentGateEnabled: boolean("agent_gate_enabled").notNull().default(false),
277826
277831
  agentGateModel: varchar("agent_gate_model", { length: 120 }),
277827
277832
  agentGatePrompt: text("agent_gate_prompt"),
@@ -337464,9 +337469,12 @@ class MessageDebouncer {
337464
337469
  buffers = new Map;
337465
337470
  timers = new Map;
337466
337471
  inFlight = new Set;
337472
+ firstBufferedAt = new Map;
337467
337473
  onFlush;
337468
- constructor(onFlush) {
337474
+ now;
337475
+ constructor(onFlush, now = Date.now) {
337469
337476
  this.onFlush = onFlush;
337477
+ this.now = now;
337470
337478
  }
337471
337479
  getChatKey(instanceId, chatId) {
337472
337480
  return `${instanceId}:${chatId}`;
@@ -337476,6 +337484,8 @@ class MessageDebouncer {
337476
337484
  const buffer3 = this.buffers.get(chatKey) ?? [];
337477
337485
  buffer3.push(message2);
337478
337486
  this.buffers.set(chatKey, buffer3);
337487
+ if (!this.firstBufferedAt.has(chatKey))
337488
+ this.firstBufferedAt.set(chatKey, this.now());
337479
337489
  if (this.inFlight.has(chatKey))
337480
337490
  return;
337481
337491
  this.restartTimer(chatKey, config4);
@@ -337484,14 +337494,16 @@ class MessageDebouncer {
337484
337494
  const chatKey = this.getChatKey(instanceId, chatId);
337485
337495
  if (this.inFlight.has(chatKey))
337486
337496
  return;
337487
- if (config4.restartOnTyping && this.buffers.has(chatKey)) {
337497
+ const restarts = config4.restartOnTyping || config4.mode === "presence";
337498
+ if (restarts && this.buffers.has(chatKey)) {
337488
337499
  log97.debug("Restarting debounce timer on user typing", { chatKey });
337489
337500
  this.restartTimer(chatKey, config4, true);
337490
337501
  }
337491
337502
  }
337492
337503
  restartTimer(chatKey, config4, force = false) {
337493
337504
  const existing = this.timers.get(chatKey);
337494
- if (config4.mode === "fixed" && existing && !force)
337505
+ const fixedWindow = config4.mode === "fixed" || config4.mode === "presence";
337506
+ if (fixedWindow && existing && !force)
337495
337507
  return;
337496
337508
  if (existing)
337497
337509
  clearTimeout(existing);
@@ -337501,6 +337513,7 @@ class MessageDebouncer {
337501
337513
  delay2 = 0;
337502
337514
  break;
337503
337515
  case "fixed":
337516
+ case "presence":
337504
337517
  delay2 = config4.minMs;
337505
337518
  break;
337506
337519
  case "randomized":
@@ -337509,14 +337522,25 @@ class MessageDebouncer {
337509
337522
  default:
337510
337523
  delay2 = 0;
337511
337524
  }
337525
+ delay2 = this.applyMaxWaitCap(chatKey, config4, delay2);
337512
337526
  const timer2 = setTimeout(() => this.flush(chatKey), delay2);
337513
337527
  this.timers.set(chatKey, timer2);
337514
337528
  }
337529
+ applyMaxWaitCap(chatKey, config4, delay2) {
337530
+ if (config4.maxWaitMs == null || config4.maxWaitMs <= 0)
337531
+ return delay2;
337532
+ const firstAt = this.firstBufferedAt.get(chatKey);
337533
+ if (firstAt == null)
337534
+ return delay2;
337535
+ const remaining = firstAt + config4.maxWaitMs - this.now();
337536
+ return Math.max(0, Math.min(delay2, remaining));
337537
+ }
337515
337538
  async flush(chatKey) {
337516
337539
  const messages4 = this.buffers.get(chatKey);
337517
337540
  const timer2 = this.timers.get(chatKey);
337518
337541
  this.buffers.delete(chatKey);
337519
337542
  this.timers.delete(chatKey);
337543
+ this.firstBufferedAt.delete(chatKey);
337520
337544
  if (timer2)
337521
337545
  clearTimeout(timer2);
337522
337546
  if (!messages4?.length)
@@ -337534,11 +337558,20 @@ class MessageDebouncer {
337534
337558
  }
337535
337559
  }
337536
337560
  }
337561
+ async flushAll() {
337562
+ const chatKeys = [...this.buffers.keys()];
337563
+ await Promise.all(chatKeys.map((chatKey) => this.flush(chatKey)));
337564
+ for (const timer2 of this.timers.values())
337565
+ clearTimeout(timer2);
337566
+ this.timers.clear();
337567
+ this.firstBufferedAt.clear();
337568
+ }
337537
337569
  clear() {
337538
337570
  for (const timer2 of this.timers.values())
337539
337571
  clearTimeout(timer2);
337540
337572
  this.buffers.clear();
337541
337573
  this.timers.clear();
337574
+ this.firstBufferedAt.clear();
337542
337575
  this.inFlight.clear();
337543
337576
  }
337544
337577
  }
@@ -338413,12 +338446,15 @@ class ReactionDedup {
338413
338446
  }
338414
338447
  }
338415
338448
  function getDebounceConfig(instance4) {
338449
+ const mode = instance4.messageDebounceMode ?? "disabled";
338450
+ const isPresence = mode === "presence";
338416
338451
  return {
338417
- mode: instance4.messageDebounceMode ?? "disabled",
338418
- minMs: instance4.messageDebounceMinMs ?? 0,
338452
+ mode,
338453
+ minMs: instance4.messageDebounceMinMs || (isPresence ? PRESENCE_DEFAULT_MIN_MS : 0),
338419
338454
  maxMs: instance4.messageDebounceMaxMs ?? 0,
338420
- restartOnTyping: instance4.messageDebounceRestartOnTyping ?? false,
338421
- groupMs: instance4.messageDebounceGroupMs
338455
+ restartOnTyping: isPresence ? true : instance4.messageDebounceRestartOnTyping ?? false,
338456
+ groupMs: instance4.messageDebounceGroupMs,
338457
+ maxWaitMs: instance4.messageDebounceMaxWaitMs ?? (isPresence ? PRESENCE_DEFAULT_MAX_WAIT_MS : null)
338422
338458
  };
338423
338459
  }
338424
338460
  function buildSlackMessageContext(rawPayload, text3) {
@@ -340514,6 +340550,7 @@ function mergeRouteOverrides(instance4, route) {
340514
340550
  messageDebounceMaxMs: route.messageDebounceMaxMs ?? instance4.messageDebounceMaxMs,
340515
340551
  messageDebounceGroupMs: route.messageDebounceGroupMs ?? instance4.messageDebounceGroupMs,
340516
340552
  messageDebounceRestartOnTyping: route.messageDebounceRestartOnTyping ?? instance4.messageDebounceRestartOnTyping,
340553
+ messageDebounceMaxWaitMs: route.messageDebounceMaxWaitMs ?? instance4.messageDebounceMaxWaitMs,
340517
340554
  messageSplitDelayMode: route.messageSplitDelayMode ?? instance4.messageSplitDelayMode,
340518
340555
  messageSplitDelayFixedMs: route.messageSplitDelayFixedMs ?? instance4.messageSplitDelayFixedMs,
340519
340556
  messageSplitDelayMinMs: route.messageSplitDelayMinMs ?? instance4.messageSplitDelayMinMs,
@@ -341282,7 +341319,7 @@ async function setupAgentDispatcher(eventBus, services, db2) {
341282
341319
  return async () => {
341283
341320
  log99.info("Shutting down agent dispatcher");
341284
341321
  clearInterval(mediaCleanupInterval);
341285
- debouncer.clear();
341322
+ await debouncer.flushAll();
341286
341323
  for (const [mediaId, pending] of mediaCompletions.entries()) {
341287
341324
  pending.reject(new Error("dispatcher shutting down"));
341288
341325
  mediaCompletions.delete(mediaId);
@@ -341326,7 +341363,7 @@ async function setupAgentDispatcher(eventBus, services, db2) {
341326
341363
  log99.info("Agent dispatcher shutdown complete");
341327
341364
  };
341328
341365
  }
341329
- var import_api32, log99, agentDispatchLimiter, _natsGenieProviderCtor, QUOTED_MESSAGE_MAX_CHARS = 4000, DM_HISTORY_LIMIT = 20, LIFECYCLE_PREVIEW_MAX_CHARS = 160, LIFECYCLE_SENSITIVE_KEY_PARTS, DEFAULT_DISPATCH_ERROR_MESSAGE = "\u26A0\uFE0F Sorry, I ran into an issue processing your message. Please try again.", DEFAULT_ERROR_HANDOFF_MESSAGE = "T\xF4 com um probleminha t\xE9cnico aqui agora. Logo algu\xE9m do time vai entrar em contato com voc\xEA.", TRANSIENT_DISPATCH_ERROR_PATTERNS, TRANSIENT_DISPATCH_RETRY_DELAYS_MS, CHANNEL_MESSAGE_LIMITS, DEFAULT_MESSAGE_LIMIT = 4000, MEDIA_BASE_PATH3, MEDIA_ICONS, MEDIA_WAIT_NULL, mediaCompletions, mediaResultCache, MEDIA_WAIT_TIMEOUT_MS = 30000, DEFAULT_SEND_MEDIA_PATH_TYPES, BOT_PREFIX = "\uD83E\uDD16 ", activeStreams, sessionActivityStore, PROC_REACT_START, PROC_REACT_DONE = "\u2705", providerCache, openclawClientPool, nullFilterWarnedInstances, ACTIVE_OWNER_IDENTIFIER_CACHE_TTL_MS = 1e4, cachedActiveOwnerIdentifiers = null, cachedActiveOwnerIdentifiersAt = 0, DEFAULT_GATE_MODEL = "gemini-3-flash-preview", GATE_TIMEOUT_MS = 3000, setupAgentResponder;
341366
+ var import_api32, log99, agentDispatchLimiter, _natsGenieProviderCtor, QUOTED_MESSAGE_MAX_CHARS = 4000, DM_HISTORY_LIMIT = 20, LIFECYCLE_PREVIEW_MAX_CHARS = 160, LIFECYCLE_SENSITIVE_KEY_PARTS, PRESENCE_DEFAULT_MIN_MS = 5000, PRESENCE_DEFAULT_MAX_WAIT_MS = 30000, DEFAULT_DISPATCH_ERROR_MESSAGE = "\u26A0\uFE0F Sorry, I ran into an issue processing your message. Please try again.", DEFAULT_ERROR_HANDOFF_MESSAGE = "T\xF4 com um probleminha t\xE9cnico aqui agora. Logo algu\xE9m do time vai entrar em contato com voc\xEA.", TRANSIENT_DISPATCH_ERROR_PATTERNS, TRANSIENT_DISPATCH_RETRY_DELAYS_MS, CHANNEL_MESSAGE_LIMITS, DEFAULT_MESSAGE_LIMIT = 4000, MEDIA_BASE_PATH3, MEDIA_ICONS, MEDIA_WAIT_NULL, mediaCompletions, mediaResultCache, MEDIA_WAIT_TIMEOUT_MS = 30000, DEFAULT_SEND_MEDIA_PATH_TYPES, BOT_PREFIX = "\uD83E\uDD16 ", activeStreams, sessionActivityStore, PROC_REACT_START, PROC_REACT_DONE = "\u2705", providerCache, openclawClientPool, nullFilterWarnedInstances, ACTIVE_OWNER_IDENTIFIER_CACHE_TTL_MS = 1e4, cachedActiveOwnerIdentifiers = null, cachedActiveOwnerIdentifiersAt = 0, DEFAULT_GATE_MODEL = "gemini-3-flash-preview", GATE_TIMEOUT_MS = 3000, setupAgentResponder;
341330
341367
  var init_agent_dispatcher = __esm(() => {
341331
341368
  init_src2();
341332
341369
  init_src();
@@ -341640,6 +341677,7 @@ class RouteService {
341640
341677
  messageDebounceMaxMs: data.messageDebounceMaxMs ?? null,
341641
341678
  messageDebounceGroupMs: data.messageDebounceGroupMs ?? null,
341642
341679
  messageDebounceRestartOnTyping: data.messageDebounceRestartOnTyping ?? null,
341680
+ messageDebounceMaxWaitMs: data.messageDebounceMaxWaitMs ?? null,
341643
341681
  messageSplitDelayMode: data.messageSplitDelayMode ?? null,
341644
341682
  messageSplitDelayFixedMs: data.messageSplitDelayFixedMs ?? null,
341645
341683
  messageSplitDelayMinMs: data.messageSplitDelayMinMs ?? null,
@@ -345227,11 +345265,12 @@ var init_agent_routes = __esm(() => {
345227
345265
  agentGateEnabled: exports_external.boolean().nullable().openapi({ description: "Response gate enabled override" }),
345228
345266
  agentGateModel: exports_external.string().max(120).nullable().openapi({ description: "Response gate model override" }),
345229
345267
  agentGatePrompt: exports_external.string().nullable().openapi({ description: "Response gate prompt override" }),
345230
- messageDebounceMode: exports_external.enum(["disabled", "fixed", "randomized"]).nullable().openapi({ description: "Debounce mode override" }),
345268
+ messageDebounceMode: exports_external.enum(["disabled", "fixed", "randomized", "presence"]).nullable().openapi({ description: "Debounce mode override" }),
345231
345269
  messageDebounceMinMs: exports_external.number().int().nonnegative().nullable().openapi({ description: "Debounce min delay (ms) override" }),
345232
345270
  messageDebounceMaxMs: exports_external.number().int().nonnegative().nullable().openapi({ description: "Debounce max delay (ms) override" }),
345233
345271
  messageDebounceGroupMs: exports_external.number().int().nonnegative().nullable().openapi({ description: "Debounce group chat delay (ms) override" }),
345234
345272
  messageDebounceRestartOnTyping: exports_external.boolean().nullable().openapi({ description: "Restart debounce on typing override" }),
345273
+ messageDebounceMaxWaitMs: exports_external.number().int().nonnegative().nullable().openapi({ description: "Presence-mode hard cap (ms) override; null = no cap" }),
345235
345274
  messageSplitDelayMode: exports_external.enum(["disabled", "fixed", "randomized"]).nullable().openapi({ description: "Split delay mode override" }),
345236
345275
  messageSplitDelayFixedMs: exports_external.number().int().nonnegative().nullable().openapi({ description: "Split delay fixed (ms) override" }),
345237
345276
  messageSplitDelayMinMs: exports_external.number().int().nonnegative().nullable().openapi({ description: "Split delay min (ms) override" }),
@@ -345262,11 +345301,12 @@ var init_agent_routes = __esm(() => {
345262
345301
  agentGateEnabled: exports_external.boolean().optional().openapi({ description: "Enable LLM response gate" }),
345263
345302
  agentGateModel: exports_external.string().max(120).optional().openapi({ description: "Response gate model" }),
345264
345303
  agentGatePrompt: exports_external.string().optional().openapi({ description: "Response gate prompt" }),
345265
- messageDebounceMode: exports_external.enum(["disabled", "fixed", "randomized"]).optional().openapi({ description: "Debounce mode" }),
345304
+ messageDebounceMode: exports_external.enum(["disabled", "fixed", "randomized", "presence"]).optional().openapi({ description: "Debounce mode" }),
345266
345305
  messageDebounceMinMs: exports_external.number().int().nonnegative().optional().openapi({ description: "Debounce min delay (ms)" }),
345267
345306
  messageDebounceMaxMs: exports_external.number().int().nonnegative().optional().openapi({ description: "Debounce max delay (ms)" }),
345268
345307
  messageDebounceGroupMs: exports_external.number().int().nonnegative().optional().openapi({ description: "Debounce group chat delay (ms)" }),
345269
345308
  messageDebounceRestartOnTyping: exports_external.boolean().optional().openapi({ description: "Restart debounce on typing" }),
345309
+ messageDebounceMaxWaitMs: exports_external.number().int().nonnegative().optional().openapi({ description: "Presence-mode hard cap (ms); null = no cap" }),
345270
345310
  messageSplitDelayMode: exports_external.enum(["disabled", "fixed", "randomized"]).optional().openapi({ description: "Split delay mode" }),
345271
345311
  messageSplitDelayFixedMs: exports_external.number().int().nonnegative().optional().openapi({ description: "Split delay fixed (ms)" }),
345272
345312
  messageSplitDelayMinMs: exports_external.number().int().nonnegative().optional().openapi({ description: "Split delay min (ms)" }),
@@ -345292,11 +345332,12 @@ var init_agent_routes = __esm(() => {
345292
345332
  agentGateEnabled: exports_external.boolean().nullable().optional().openapi({ description: "Enable LLM response gate" }),
345293
345333
  agentGateModel: exports_external.string().max(120).nullable().optional().openapi({ description: "Response gate model" }),
345294
345334
  agentGatePrompt: exports_external.string().nullable().optional().openapi({ description: "Response gate prompt" }),
345295
- messageDebounceMode: exports_external.enum(["disabled", "fixed", "randomized"]).nullable().optional().openapi({ description: "Debounce mode" }),
345335
+ messageDebounceMode: exports_external.enum(["disabled", "fixed", "randomized", "presence"]).nullable().optional().openapi({ description: "Debounce mode" }),
345296
345336
  messageDebounceMinMs: exports_external.number().int().nonnegative().nullable().optional().openapi({ description: "Debounce min delay (ms)" }),
345297
345337
  messageDebounceMaxMs: exports_external.number().int().nonnegative().nullable().optional().openapi({ description: "Debounce max delay (ms)" }),
345298
345338
  messageDebounceGroupMs: exports_external.number().int().nonnegative().nullable().optional().openapi({ description: "Debounce group chat delay (ms)" }),
345299
345339
  messageDebounceRestartOnTyping: exports_external.boolean().nullable().optional().openapi({ description: "Restart debounce on typing" }),
345340
+ messageDebounceMaxWaitMs: exports_external.number().int().nonnegative().nullable().optional().openapi({ description: "Presence-mode hard cap (ms); null = no cap" }),
345300
345341
  messageSplitDelayMode: exports_external.enum(["disabled", "fixed", "randomized"]).nullable().optional().openapi({ description: "Split delay mode" }),
345301
345342
  messageSplitDelayFixedMs: exports_external.number().int().nonnegative().nullable().optional().openapi({ description: "Split delay fixed (ms)" }),
345302
345343
  messageSplitDelayMinMs: exports_external.number().int().nonnegative().nullable().optional().openapi({ description: "Split delay min (ms)" }),
@@ -353712,11 +353753,12 @@ var init_instances3 = __esm(() => {
353712
353753
  agentWaitForMedia: exports_external.boolean().default(true).describe("Wait for media processing before dispatching to agent"),
353713
353754
  agentSendMediaPath: exports_external.boolean().default(true).describe("Include file path in formatted media text sent to agent"),
353714
353755
  agentSendMediaPathTypes: exports_external.array(exports_external.string()).optional().nullable().describe("Content types that receive file path (e.g. image, video, document). Default: all except audio"),
353715
- messageDebounceMode: exports_external.enum(["disabled", "fixed", "randomized"]).default("randomized").describe("Message debounce mode: disabled, fixed delay, or randomized delay"),
353756
+ messageDebounceMode: exports_external.enum(["disabled", "fixed", "randomized", "presence"]).default("randomized").describe("Message debounce mode: disabled, fixed delay, randomized delay, or presence (typing-aware)"),
353716
353757
  messageDebounceMinMs: exports_external.number().int().min(0).default(0).describe("Minimum debounce delay in milliseconds (0 = no debounce)"),
353717
353758
  messageDebounceMaxMs: exports_external.number().int().min(0).default(0).describe("Maximum debounce delay in milliseconds (0 = no debounce)"),
353718
353759
  messageDebounceRestartOnTyping: exports_external.boolean().default(false).describe("Restart debounce timer when user is typing"),
353719
353760
  messageDebounceGroupMs: exports_external.number().int().min(0).nullable().default(null).describe("Debounce delay for group chats in milliseconds (null = use messageDebounceMinMs)"),
353761
+ messageDebounceMaxWaitMs: exports_external.number().int().min(0).nullable().default(null).describe("Presence-mode hard cap in milliseconds \u2014 flush at firstBuffered + this even under continuous typing (null = no cap)"),
353720
353762
  messageSplitDelayMode: exports_external.enum(["disabled", "fixed", "randomized"]).default("randomized").describe("Between-chunk delay when agent responses are split into multiple messages"),
353721
353763
  messageSplitDelayFixedMs: exports_external.number().int().min(0).default(0).describe('Fixed delay between split chunks in milliseconds (used when messageSplitDelayMode="fixed")'),
353722
353764
  messageSplitDelayMinMs: exports_external.number().int().min(0).default(300).describe('Minimum delay between split chunks in milliseconds (used when messageSplitDelayMode="randomized")'),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@automagik/omni",
3
- "version": "2.260703.2",
3
+ "version": "2.260703.3",
4
4
  "description": "LLM-optimized CLI for Omni",
5
5
  "type": "module",
6
6
  "bin": {