@automagik/omni 2.260501.4 → 2.260501.5

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.
package/dist/index.js CHANGED
@@ -34234,7 +34234,8 @@ class AutomationEngine {
34234
34234
  this.deps = {
34235
34235
  eventBus,
34236
34236
  sendMessage: deps.sendMessage,
34237
- callAgent: deps.callAgent
34237
+ callAgent: deps.callAgent,
34238
+ staleIdleTimeoutGate: deps.staleIdleTimeoutGate
34238
34239
  };
34239
34240
  this.automations = automations.filter((a) => a.enabled);
34240
34241
  await this.reconcileSubscriptions();
@@ -34371,6 +34372,34 @@ class AutomationEngine {
34371
34372
  this.reconcileTimer = null;
34372
34373
  }
34373
34374
  }
34375
+ async shouldSkipStaleIdleTimeout(event) {
34376
+ if (event.type !== "chat.idle_timeout" || !this.deps.staleIdleTimeoutGate)
34377
+ return false;
34378
+ const payload = event.payload;
34379
+ const chatId = payload?.chatId;
34380
+ const payloadInstanceId = payload?.instanceId ?? event.metadata.instanceId;
34381
+ if (!chatId || !payloadInstanceId)
34382
+ return false;
34383
+ try {
34384
+ const verdict = await this.deps.staleIdleTimeoutGate(chatId, payloadInstanceId);
34385
+ if (verdict.skip) {
34386
+ logger4.info("Skipping stale chat.idle_timeout event", {
34387
+ eventId: event.id,
34388
+ chatId,
34389
+ instanceId: payloadInstanceId,
34390
+ reason: verdict.reason ?? "unknown"
34391
+ });
34392
+ return true;
34393
+ }
34394
+ } catch (err2) {
34395
+ logger4.warn("staleIdleTimeoutGate threw, proceeding without skip", {
34396
+ eventId: event.id,
34397
+ chatId,
34398
+ error: err2 instanceof Error ? err2.message : String(err2)
34399
+ });
34400
+ }
34401
+ return false;
34402
+ }
34374
34403
  async handleEvent(event) {
34375
34404
  const eventType = event.type;
34376
34405
  const instanceId = event.metadata.instanceId ?? "global";
@@ -34378,6 +34407,9 @@ class AutomationEngine {
34378
34407
  if (matchingAutomations.length === 0) {
34379
34408
  return;
34380
34409
  }
34410
+ if (await this.shouldSkipStaleIdleTimeout(event)) {
34411
+ return;
34412
+ }
34381
34413
  logger4.debug(`Processing event ${eventType} for ${matchingAutomations.length} automation(s)`, {
34382
34414
  eventId: event.id,
34383
34415
  instanceId
@@ -114177,7 +114209,7 @@ import { fileURLToPath } from "url";
114177
114209
  // package.json
114178
114210
  var package_default = {
114179
114211
  name: "@automagik/omni",
114180
- version: "2.260501.4",
114212
+ version: "2.260501.5",
114181
114213
  description: "LLM-optimized CLI for Omni",
114182
114214
  type: "module",
114183
114215
  bin: {
@@ -28397,7 +28397,8 @@ class AutomationEngine {
28397
28397
  this.deps = {
28398
28398
  eventBus,
28399
28399
  sendMessage: deps.sendMessage,
28400
- callAgent: deps.callAgent
28400
+ callAgent: deps.callAgent,
28401
+ staleIdleTimeoutGate: deps.staleIdleTimeoutGate
28401
28402
  };
28402
28403
  this.automations = automations.filter((a) => a.enabled);
28403
28404
  await this.reconcileSubscriptions();
@@ -28534,6 +28535,34 @@ class AutomationEngine {
28534
28535
  this.reconcileTimer = null;
28535
28536
  }
28536
28537
  }
28538
+ async shouldSkipStaleIdleTimeout(event) {
28539
+ if (event.type !== "chat.idle_timeout" || !this.deps.staleIdleTimeoutGate)
28540
+ return false;
28541
+ const payload = event.payload;
28542
+ const chatId = payload?.chatId;
28543
+ const payloadInstanceId = payload?.instanceId ?? event.metadata.instanceId;
28544
+ if (!chatId || !payloadInstanceId)
28545
+ return false;
28546
+ try {
28547
+ const verdict = await this.deps.staleIdleTimeoutGate(chatId, payloadInstanceId);
28548
+ if (verdict.skip) {
28549
+ logger4.info("Skipping stale chat.idle_timeout event", {
28550
+ eventId: event.id,
28551
+ chatId,
28552
+ instanceId: payloadInstanceId,
28553
+ reason: verdict.reason ?? "unknown"
28554
+ });
28555
+ return true;
28556
+ }
28557
+ } catch (err) {
28558
+ logger4.warn("staleIdleTimeoutGate threw, proceeding without skip", {
28559
+ eventId: event.id,
28560
+ chatId,
28561
+ error: err instanceof Error ? err.message : String(err)
28562
+ });
28563
+ }
28564
+ return false;
28565
+ }
28537
28566
  async handleEvent(event) {
28538
28567
  const eventType = event.type;
28539
28568
  const instanceId = event.metadata.instanceId ?? "global";
@@ -28541,6 +28570,9 @@ class AutomationEngine {
28541
28570
  if (matchingAutomations.length === 0) {
28542
28571
  return;
28543
28572
  }
28573
+ if (await this.shouldSkipStaleIdleTimeout(event)) {
28574
+ return;
28575
+ }
28544
28576
  logger4.debug(`Processing event ${eventType} for ${matchingAutomations.length} automation(s)`, {
28545
28577
  eventId: event.id,
28546
28578
  instanceId
@@ -224654,7 +224686,7 @@ var init_sentry_scrub = __esm(() => {
224654
224686
  var require_package8 = __commonJS((exports, module) => {
224655
224687
  module.exports = {
224656
224688
  name: "@omni/api",
224657
- version: "2.260501.4",
224689
+ version: "2.260501.5",
224658
224690
  type: "module",
224659
224691
  exports: {
224660
224692
  ".": {
@@ -283512,6 +283544,16 @@ class FollowUpLifecycleService {
283512
283544
  const created = row?.xmax === "0";
283513
283545
  return { created };
283514
283546
  }
283547
+ async evaluateIdleTimeoutFreshness(chatId, instanceId) {
283548
+ if (await this.isInActiveCloseState(chatId, instanceId)) {
283549
+ return { skip: true, reason: "chat_closed" };
283550
+ }
283551
+ const row = await this.readExistingRow(chatId, instanceId);
283552
+ if (row?.disarmReason) {
283553
+ return { skip: true, reason: `disarmed_${row.disarmReason}` };
283554
+ }
283555
+ return { skip: false };
283556
+ }
283515
283557
  async readExistingRow(chatId, instanceId) {
283516
283558
  const [row] = await this.db.select({
283517
283559
  disarmReason: chatFollowUpState.disarmReason,
@@ -297343,6 +297385,7 @@ async function resolveChatIdParam(c, raw2, explicitInstanceId) {
297343
297385
  const instanceId = explicitInstanceId ?? await getActiveInstanceId(c);
297344
297386
  if (!instanceId)
297345
297387
  return null;
297388
+ checkInstanceAccess(c.get("apiKey"), instanceId);
297346
297389
  const services = c.get("services");
297347
297390
  const chat2 = await services.chats.findByExternalIdSmart(instanceId, raw2);
297348
297391
  return chat2?.id ?? null;
@@ -297553,8 +297596,11 @@ var init_chats2 = __esm(() => {
297553
297596
  duration: exports_external.number().int().positive().optional().describe("Mute duration in milliseconds (default: 8 hours)")
297554
297597
  });
297555
297598
  chatsRoutes.post("/:id/archive", zValidator("json", chatChannelActionSchema), async (c) => {
297556
- const id = c.req.param("id");
297599
+ const raw2 = c.req.param("id");
297557
297600
  const body = c.req.valid("json");
297601
+ const id = await resolveChatIdParam(c, raw2, body?.instanceId);
297602
+ if (id === null)
297603
+ return chatNotFoundResponse(c, raw2);
297558
297604
  const services = c.get("services");
297559
297605
  const channelRegistry2 = c.get("channelRegistry");
297560
297606
  if (body?.instanceId) {
@@ -297568,8 +297614,11 @@ var init_chats2 = __esm(() => {
297568
297614
  return c.json({ data: chat2 });
297569
297615
  });
297570
297616
  chatsRoutes.post("/:id/unarchive", zValidator("json", chatChannelActionSchema), async (c) => {
297571
- const id = c.req.param("id");
297617
+ const raw2 = c.req.param("id");
297572
297618
  const body = c.req.valid("json");
297619
+ const id = await resolveChatIdParam(c, raw2, body?.instanceId);
297620
+ if (id === null)
297621
+ return chatNotFoundResponse(c, raw2);
297573
297622
  const services = c.get("services");
297574
297623
  const channelRegistry2 = c.get("channelRegistry");
297575
297624
  if (body?.instanceId) {
@@ -297586,21 +297635,30 @@ var init_chats2 = __esm(() => {
297586
297635
  label: exports_external.string().min(1).max(50)
297587
297636
  });
297588
297637
  chatsRoutes.post("/:id/hide", async (c) => {
297589
- const id = c.req.param("id");
297638
+ const raw2 = c.req.param("id");
297639
+ const id = await resolveChatIdParam(c, raw2);
297640
+ if (id === null)
297641
+ return chatNotFoundResponse(c, raw2);
297590
297642
  const services = c.get("services");
297591
297643
  await services.chats.hide(id);
297592
297644
  const chat2 = await services.chats.getById(id, { includeHidden: true });
297593
297645
  return c.json({ data: chat2 });
297594
297646
  });
297595
297647
  chatsRoutes.post("/:id/unhide", async (c) => {
297596
- const id = c.req.param("id");
297648
+ const raw2 = c.req.param("id");
297649
+ const id = await resolveChatIdParam(c, raw2);
297650
+ if (id === null)
297651
+ return chatNotFoundResponse(c, raw2);
297597
297652
  const services = c.get("services");
297598
297653
  await services.chats.unhide(id);
297599
297654
  const chat2 = await services.chats.getById(id);
297600
297655
  return c.json({ data: chat2 });
297601
297656
  });
297602
297657
  chatsRoutes.post("/:id/label", zValidator("json", labelBodySchema), async (c) => {
297603
- const id = c.req.param("id");
297658
+ const raw2 = c.req.param("id");
297659
+ const id = await resolveChatIdParam(c, raw2);
297660
+ if (id === null)
297661
+ return chatNotFoundResponse(c, raw2);
297604
297662
  const { label } = c.req.valid("json");
297605
297663
  const services = c.get("services");
297606
297664
  await services.chats.addLabel(id, label);
@@ -297608,7 +297666,10 @@ var init_chats2 = __esm(() => {
297608
297666
  return c.json({ data: chat2 });
297609
297667
  });
297610
297668
  chatsRoutes.delete("/:id/label", zValidator("json", labelBodySchema), async (c) => {
297611
- const id = c.req.param("id");
297669
+ const raw2 = c.req.param("id");
297670
+ const id = await resolveChatIdParam(c, raw2);
297671
+ if (id === null)
297672
+ return chatNotFoundResponse(c, raw2);
297612
297673
  const { label } = c.req.valid("json");
297613
297674
  const services = c.get("services");
297614
297675
  await services.chats.removeLabel(id, label);
@@ -297616,8 +297677,11 @@ var init_chats2 = __esm(() => {
297616
297677
  return c.json({ data: chat2 });
297617
297678
  });
297618
297679
  chatsRoutes.post("/:id/pin", zValidator("json", exports_external.object({ instanceId: exports_external.string().uuid() })), async (c) => {
297619
- const id = c.req.param("id");
297680
+ const raw2 = c.req.param("id");
297620
297681
  const { instanceId } = c.req.valid("json");
297682
+ const id = await resolveChatIdParam(c, raw2, instanceId);
297683
+ if (id === null)
297684
+ return chatNotFoundResponse(c, raw2);
297621
297685
  const services = c.get("services");
297622
297686
  const channelRegistry2 = c.get("channelRegistry");
297623
297687
  checkInstanceAccess(c.get("apiKey"), instanceId);
@@ -297626,8 +297690,11 @@ var init_chats2 = __esm(() => {
297626
297690
  return c.json({ success: true, data: { chatId: id, action: "pin" } });
297627
297691
  });
297628
297692
  chatsRoutes.post("/:id/unpin", zValidator("json", exports_external.object({ instanceId: exports_external.string().uuid() })), async (c) => {
297629
- const id = c.req.param("id");
297693
+ const raw2 = c.req.param("id");
297630
297694
  const { instanceId } = c.req.valid("json");
297695
+ const id = await resolveChatIdParam(c, raw2, instanceId);
297696
+ if (id === null)
297697
+ return chatNotFoundResponse(c, raw2);
297631
297698
  const services = c.get("services");
297632
297699
  const channelRegistry2 = c.get("channelRegistry");
297633
297700
  checkInstanceAccess(c.get("apiKey"), instanceId);
@@ -297636,8 +297703,11 @@ var init_chats2 = __esm(() => {
297636
297703
  return c.json({ success: true, data: { chatId: id, action: "unpin" } });
297637
297704
  });
297638
297705
  chatsRoutes.post("/:id/mute", zValidator("json", muteActionSchema), async (c) => {
297639
- const id = c.req.param("id");
297706
+ const raw2 = c.req.param("id");
297640
297707
  const { instanceId, duration } = c.req.valid("json");
297708
+ const id = await resolveChatIdParam(c, raw2, instanceId);
297709
+ if (id === null)
297710
+ return chatNotFoundResponse(c, raw2);
297641
297711
  const services = c.get("services");
297642
297712
  const channelRegistry2 = c.get("channelRegistry");
297643
297713
  checkInstanceAccess(c.get("apiKey"), instanceId);
@@ -297646,8 +297716,11 @@ var init_chats2 = __esm(() => {
297646
297716
  return c.json({ success: true, data: { chatId: id, action: "mute", duration } });
297647
297717
  });
297648
297718
  chatsRoutes.post("/:id/unmute", zValidator("json", exports_external.object({ instanceId: exports_external.string().uuid() })), async (c) => {
297649
- const id = c.req.param("id");
297719
+ const raw2 = c.req.param("id");
297650
297720
  const { instanceId } = c.req.valid("json");
297721
+ const id = await resolveChatIdParam(c, raw2, instanceId);
297722
+ if (id === null)
297723
+ return chatNotFoundResponse(c, raw2);
297651
297724
  const services = c.get("services");
297652
297725
  const channelRegistry2 = c.get("channelRegistry");
297653
297726
  checkInstanceAccess(c.get("apiKey"), instanceId);
@@ -297665,7 +297738,10 @@ var init_chats2 = __esm(() => {
297665
297738
  return c.json({ items: participants });
297666
297739
  });
297667
297740
  chatsRoutes.post("/:id/participants", zValidator("json", addParticipantSchema), async (c) => {
297668
- const chatId = c.req.param("id");
297741
+ const raw2 = c.req.param("id");
297742
+ const chatId = await resolveChatIdParam(c, raw2);
297743
+ if (chatId === null)
297744
+ return chatNotFoundResponse(c, raw2);
297669
297745
  const body = c.req.valid("json");
297670
297746
  const services = c.get("services");
297671
297747
  const participant = await services.chats.addParticipant({
@@ -297675,14 +297751,20 @@ var init_chats2 = __esm(() => {
297675
297751
  return c.json({ data: participant }, 201);
297676
297752
  });
297677
297753
  chatsRoutes.delete("/:id/participants/:platformUserId", async (c) => {
297678
- const chatId = c.req.param("id");
297754
+ const raw2 = c.req.param("id");
297755
+ const chatId = await resolveChatIdParam(c, raw2);
297756
+ if (chatId === null)
297757
+ return chatNotFoundResponse(c, raw2);
297679
297758
  const platformUserId = c.req.param("platformUserId");
297680
297759
  const services = c.get("services");
297681
297760
  await services.chats.removeParticipant(chatId, platformUserId);
297682
297761
  return c.json({ success: true });
297683
297762
  });
297684
297763
  chatsRoutes.patch("/:id/participants/:platformUserId/role", zValidator("json", updateParticipantRoleSchema), async (c) => {
297685
- const chatId = c.req.param("id");
297764
+ const raw2 = c.req.param("id");
297765
+ const chatId = await resolveChatIdParam(c, raw2);
297766
+ if (chatId === null)
297767
+ return chatNotFoundResponse(c, raw2);
297686
297768
  const platformUserId = c.req.param("platformUserId");
297687
297769
  const { role } = c.req.valid("json");
297688
297770
  const services = c.get("services");
@@ -297727,8 +297809,11 @@ var init_chats2 = __esm(() => {
297727
297809
  instanceId: exports_external.string().uuid().describe("Instance ID")
297728
297810
  });
297729
297811
  chatsRoutes.post("/:id/read", zValidator("json", markChatReadSchema), async (c) => {
297730
- const chatId = c.req.param("id");
297812
+ const raw2 = c.req.param("id");
297731
297813
  const { instanceId } = c.req.valid("json");
297814
+ const chatId = await resolveChatIdParam(c, raw2, instanceId);
297815
+ if (chatId === null)
297816
+ return chatNotFoundResponse(c, raw2);
297732
297817
  const services = c.get("services");
297733
297818
  const channelRegistry2 = c.get("channelRegistry");
297734
297819
  const chat2 = await services.chats.getById(chatId);
@@ -297775,8 +297860,11 @@ var init_chats2 = __esm(() => {
297775
297860
  "90d": 7776000
297776
297861
  };
297777
297862
  chatsRoutes.post("/:id/disappearing", zValidator("json", disappearingSchema), async (c) => {
297778
- const chatId = c.req.param("id");
297863
+ const raw2 = c.req.param("id");
297779
297864
  const { instanceId, duration } = c.req.valid("json");
297865
+ const chatId = await resolveChatIdParam(c, raw2, instanceId);
297866
+ if (chatId === null)
297867
+ return chatNotFoundResponse(c, raw2);
297780
297868
  const services = c.get("services");
297781
297869
  const channelRegistry2 = c.get("channelRegistry");
297782
297870
  checkInstanceAccess(c.get("apiKey"), instanceId);
@@ -297914,7 +298002,10 @@ var init_chats2 = __esm(() => {
297914
298002
  return c.json({ success: true, sessionId, sessionStrategy });
297915
298003
  });
297916
298004
  chatsRoutes.post("/:id/reopen-contact", async (c) => {
297917
- const id = c.req.param("id");
298005
+ const raw2 = c.req.param("id");
298006
+ const id = await resolveChatIdParam(c, raw2);
298007
+ if (id === null)
298008
+ return chatNotFoundResponse(c, raw2);
297918
298009
  const services = c.get("services");
297919
298010
  const chat2 = await services.chats.getById(id);
297920
298011
  if (!chat2)
@@ -308970,6 +309061,9 @@ async function setupEventBusServices(eventBus, services, db3) {
308970
309061
  status: result.metadata.status
308971
309062
  }
308972
309063
  };
309064
+ },
309065
+ staleIdleTimeoutGate: async (chatId, instanceId) => {
309066
+ return services.followUpLifecycle.evaluateIdleTimeoutFreshness(chatId, instanceId);
308973
309067
  }
308974
309068
  });
308975
309069
  } catch (error2) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@automagik/omni",
3
- "version": "2.260501.4",
3
+ "version": "2.260501.5",
4
4
  "description": "LLM-optimized CLI for Omni",
5
5
  "type": "module",
6
6
  "bin": {
@@ -51,15 +51,15 @@
51
51
  "qrcode-terminal": "^0.12.0"
52
52
  },
53
53
  "devDependencies": {
54
- "@omni/api": "2.260501.3",
55
- "@omni/channel-discord": "2.260501.3",
56
- "@omni/channel-gupshup": "2.260501.3",
57
- "@omni/channel-sdk": "2.260501.3",
58
- "@omni/channel-slack": "2.260501.3",
59
- "@omni/channel-telegram": "2.260501.3",
60
- "@omni/channel-whatsapp": "2.260501.3",
61
- "@omni/core": "2.260501.3",
62
- "@omni/sdk": "2.260501.3",
54
+ "@omni/api": "2.260501.4",
55
+ "@omni/channel-discord": "2.260501.4",
56
+ "@omni/channel-gupshup": "2.260501.4",
57
+ "@omni/channel-sdk": "2.260501.4",
58
+ "@omni/channel-slack": "2.260501.4",
59
+ "@omni/channel-telegram": "2.260501.4",
60
+ "@omni/channel-whatsapp": "2.260501.4",
61
+ "@omni/core": "2.260501.4",
62
+ "@omni/sdk": "2.260501.4",
63
63
  "@types/node": "^22.10.3",
64
64
  "@types/qrcode-terminal": "^0.12.2",
65
65
  "typescript": "^5.7.3"