@elizaos/agent 2.0.0-alpha.437 → 2.0.0-alpha.439

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 (36) hide show
  1. package/apps/app-lifeops/src/lifeops/discord-browser-scraper.d.ts +1 -0
  2. package/apps/app-lifeops/src/lifeops/discord-browser-scraper.d.ts.map +1 -1
  3. package/apps/app-lifeops/src/lifeops/discord-browser-scraper.js +57 -21
  4. package/apps/app-lifeops/src/lifeops/imessage-bridge.d.ts +1 -0
  5. package/apps/app-lifeops/src/lifeops/imessage-bridge.d.ts.map +1 -1
  6. package/apps/app-lifeops/src/lifeops/imessage-bridge.js +41 -36
  7. package/apps/app-lifeops/src/lifeops/service-mixin-signal.js +7 -0
  8. package/apps/app-lifeops/src/lifeops/service-mixin-telegram.js +8 -1
  9. package/apps/app-lifeops/src/lifeops/signal-local-client.d.ts +4 -4
  10. package/apps/app-lifeops/src/lifeops/signal-local-client.d.ts.map +1 -1
  11. package/apps/app-lifeops/src/lifeops/signal-local-client.js +40 -15
  12. package/apps/app-lifeops/src/lifeops/telegram-auth.d.ts.map +1 -1
  13. package/apps/app-lifeops/src/lifeops/telegram-auth.js +21 -1
  14. package/apps/app-lifeops/src/lifeops/telegram-local-client.d.ts +3 -0
  15. package/apps/app-lifeops/src/lifeops/telegram-local-client.d.ts.map +1 -1
  16. package/apps/app-lifeops/src/lifeops/telegram-local-client.js +61 -18
  17. package/apps/app-lifeops/src/lifeops/whatsapp-client.d.ts +7 -0
  18. package/apps/app-lifeops/src/lifeops/whatsapp-client.d.ts.map +1 -1
  19. package/apps/app-lifeops/src/lifeops/whatsapp-client.js +47 -16
  20. package/package.json +4 -4
  21. package/packages/agent/src/actions/terminal.d.ts +3 -3
  22. package/packages/agent/src/actions/terminal.d.ts.map +1 -1
  23. package/packages/agent/src/actions/terminal.js +80 -157
  24. package/packages/shared/src/contracts/lifeops.d.ts +14 -0
  25. package/packages/shared/src/contracts/lifeops.d.ts.map +1 -1
  26. package/packages/typescript/src/features/advanced-capabilities/clipboard/actions/save-attachment-to-clipboard.d.ts +4 -0
  27. package/packages/typescript/src/features/advanced-capabilities/clipboard/actions/save-attachment-to-clipboard.d.ts.map +1 -0
  28. package/packages/typescript/src/features/advanced-capabilities/clipboard/actions/save-attachment-to-clipboard.js +127 -0
  29. package/packages/typescript/src/features/advanced-capabilities/clipboard/index.d.ts +2 -0
  30. package/packages/typescript/src/features/advanced-capabilities/clipboard/index.d.ts.map +1 -1
  31. package/packages/typescript/src/features/advanced-capabilities/clipboard/index.js +4 -0
  32. package/packages/typescript/src/runtime.d.ts.map +1 -1
  33. package/packages/typescript/src/runtime.js +10 -2
  34. package/packages/typescript/src/services/message.d.ts +7 -0
  35. package/packages/typescript/src/services/message.d.ts.map +1 -1
  36. package/packages/typescript/src/services/message.js +22 -18
@@ -68,6 +68,7 @@ export interface DiscordMessageSearchResult {
68
68
  id: string | null;
69
69
  content: string;
70
70
  authorName: string | null;
71
+ guildId: string | null;
71
72
  channelId: string | null;
72
73
  timestamp: string | null;
73
74
  /** Delivery status indicator derived from DOM state (partial). */
@@ -1 +1 @@
1
- {"version":3,"file":"discord-browser-scraper.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/discord-browser-scraper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discord-browser-scraper.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/discord-browser-scraper.ts"],"names":[],"mappings":"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"}
@@ -343,17 +343,50 @@ export async function probeDiscordTab(tabId, env = process.env) {
343
343
  dmInbox: result.dmInbox ?? emptyDiscordDmInboxProbe(),
344
344
  };
345
345
  }
346
- /**
347
- * DOM script injected into the Discord tab to read search results from the
348
- * "Search Results" panel after Discord's own Ctrl+F / search UX has rendered.
349
- *
350
- * Discord renders search results inside `[class*="searchResultMessage"]` or
351
- * the newer `[data-testid*="message-item"]` containers. We read what the DOM
352
- * exposes — no regex on content, no heuristics.
353
- */
346
+ function normalizeDiscordDeliveryStatus(value) {
347
+ return value === "sent" ||
348
+ value === "sending" ||
349
+ value === "failed" ||
350
+ value === "unknown"
351
+ ? value
352
+ : null;
353
+ }
354
+ function normalizeDiscordResultText(value) {
355
+ return typeof value === "string" ? normalizeDiscordText(value) : null;
356
+ }
357
+ function normalizeDiscordMessageSearchResults(value, operation) {
358
+ if (!Array.isArray(value)) {
359
+ throw new Error(`Discord ${operation} returned an invalid result.`);
360
+ }
361
+ return value.map((item, index) => {
362
+ if (!item || typeof item !== "object") {
363
+ throw new Error(`Discord ${operation} result ${index} is invalid.`);
364
+ }
365
+ const record = item;
366
+ if (typeof record.content !== "string") {
367
+ throw new Error(`Discord ${operation} result ${index} is missing content.`);
368
+ }
369
+ const deliveryStatus = normalizeDiscordDeliveryStatus(record.deliveryStatus);
370
+ if (!deliveryStatus) {
371
+ throw new Error(`Discord ${operation} result ${index} has invalid delivery status.`);
372
+ }
373
+ return {
374
+ id: normalizeDiscordResultText(record.id),
375
+ content: record.content,
376
+ authorName: normalizeDiscordResultText(record.authorName),
377
+ guildId: normalizeDiscordResultText(record.guildId),
378
+ channelId: normalizeDiscordResultText(record.channelId),
379
+ timestamp: normalizeDiscordResultText(record.timestamp),
380
+ deliveryStatus,
381
+ };
382
+ });
383
+ }
354
384
  function buildDiscordSearchResultsScript() {
355
385
  return `(() => {
356
386
  const results = [];
387
+ const routeMatch = window.location.href.match(/\\/channels\\/([^/?#]+)\\/([^/?#]+)/);
388
+ const guildId = routeMatch && routeMatch[1] !== "@me" ? routeMatch[1] : null;
389
+ const channelId = routeMatch ? routeMatch[2] : null;
357
390
  const containers = Array.from(
358
391
  document.querySelectorAll(
359
392
  '[class*="searchResultMessage"], [class*="search-result-message"]'
@@ -383,11 +416,7 @@ function buildDiscordSearchResultsScript() {
383
416
  ? timestampEl.getAttribute('datetime')
384
417
  : null;
385
418
 
386
- const href = window.location.href;
387
- const channelMatch = href.match(/\\/channels\\/@me\\/([\\d]+)/);
388
- const channelId = channelMatch ? channelMatch[1] : null;
389
-
390
- results.push({ id, content, authorName, channelId, timestamp, deliveryStatus: "unknown" });
419
+ results.push({ id, content, authorName, guildId, channelId, timestamp, deliveryStatus: "unknown" });
391
420
  }
392
421
  return results;
393
422
  })();`;
@@ -443,13 +472,19 @@ export async function searchDiscordMessages(args) {
443
472
  return { injected: false, error: String(e) };
444
473
  }
445
474
  })();`;
446
- await evaluateBrowserWorkspaceTab({ id: args.tabId, script: searchScript }, env);
475
+ const injected = await evaluateBrowserWorkspaceTab({ id: args.tabId, script: searchScript }, env);
476
+ if (!injected ||
477
+ typeof injected !== "object" ||
478
+ injected.injected !== true) {
479
+ const error = typeof injected?.error === "string"
480
+ ? ` ${injected.error}`
481
+ : "";
482
+ throw new Error(`Discord search injection failed.${error}`);
483
+ }
447
484
  // Wait for Discord's search results panel to render.
448
485
  await new Promise((resolve) => setTimeout(resolve, 1200));
449
486
  const raw = (await evaluateBrowserWorkspaceTab({ id: args.tabId, script: buildDiscordSearchResultsScript() }, env));
450
- if (!Array.isArray(raw))
451
- return [];
452
- return raw.filter((item) => typeof item === "object" && item !== null);
487
+ return normalizeDiscordMessageSearchResults(raw, "search");
453
488
  }
454
489
  // ---------------------------------------------------------------------------
455
490
  // Delivery status capture via DOM eval
@@ -468,6 +503,9 @@ export async function captureDiscordDeliveryStatus(args) {
468
503
  const env = args.env ?? process.env;
469
504
  const script = `(() => {
470
505
  const results = [];
506
+ const routeMatch = window.location.href.match(/\\/channels\\/([^/?#]+)\\/([^/?#]+)/);
507
+ const guildId = routeMatch && routeMatch[1] !== "@me" ? routeMatch[1] : null;
508
+ const channelId = routeMatch ? routeMatch[2] : null;
471
509
  const messages = Array.from(
472
510
  document.querySelectorAll('[class*="message-"] [id^="message-content-"], [id^="chat-messages-"] li')
473
511
  );
@@ -489,12 +527,10 @@ export async function captureDiscordDeliveryStatus(args) {
489
527
  !!el.querySelector('[aria-label*="failed" i]');
490
528
  const deliveryStatus = isFailed ? 'failed' : isSending ? 'sending' : 'sent';
491
529
 
492
- results.push({ id, content, authorName: null, channelId: null, timestamp, deliveryStatus });
530
+ results.push({ id, content, authorName: null, guildId, channelId, timestamp, deliveryStatus });
493
531
  }
494
532
  return results;
495
533
  })();`;
496
534
  const raw = (await evaluateBrowserWorkspaceTab({ id: args.tabId, script }, env));
497
- if (!Array.isArray(raw))
498
- return [];
499
- return raw.filter((item) => typeof item === "object" && item !== null);
535
+ return normalizeDiscordMessageSearchResults(raw, "delivery status capture");
500
536
  }
@@ -86,6 +86,7 @@ export interface IMessageDeliveryResult {
86
86
  isRead: boolean | null;
87
87
  isDelivered: boolean | null;
88
88
  errorDescription: string | null;
89
+ checkedAt: string;
89
90
  }
90
91
  /**
91
92
  * Fetch delivery/read-receipt status for sent iMessages.
@@ -1 +1 @@
1
- {"version":3,"file":"imessage-bridge.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/imessage-bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"imessage-bridge.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/imessage-bridge.ts"],"names":[],"mappings":"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"}
@@ -252,6 +252,15 @@ function deriveBlueBubblesSendMode(info) {
252
252
  ? "private-api"
253
253
  : "apple-script";
254
254
  }
255
+ function directRecipientFromBlueBubblesChatGuid(chatGuid) {
256
+ const directPrefix = ";-;";
257
+ const directMarkerIndex = chatGuid?.indexOf(directPrefix) ?? -1;
258
+ if (!chatGuid || directMarkerIndex < 0) {
259
+ return undefined;
260
+ }
261
+ const recipient = chatGuid.slice(directMarkerIndex + directPrefix.length);
262
+ return recipient.trim().length > 0 ? recipient : undefined;
263
+ }
255
264
  function buildBlueBubblesUrl(config, pathname, search) {
256
265
  if (!config.bluebubblesUrl) {
257
266
  throw new IMessageBridgeError("BlueBubbles URL not configured", "bluebubbles");
@@ -320,10 +329,12 @@ function normalizeBlueBubblesChat(raw) {
320
329
  function normalizeBlueBubblesMessage(raw) {
321
330
  const firstChat = raw.chats?.[0];
322
331
  const chatId = raw.chatGuid ?? firstChat?.guid;
332
+ const handle = raw.handle?.address?.trim() ?? "";
333
+ const outboundRecipient = handle || directRecipientFromBlueBubblesChatGuid(chatId);
323
334
  return {
324
335
  id: raw.guid,
325
- fromHandle: raw.handle?.address ?? "",
326
- toHandles: [],
336
+ fromHandle: raw.isFromMe ? "me" : handle,
337
+ toHandles: raw.isFromMe && outboundRecipient ? [outboundRecipient] : [],
327
338
  text: raw.text ?? "",
328
339
  isFromMe: Boolean(raw.isFromMe),
329
340
  sentAt: typeof raw.dateCreated === "number"
@@ -350,6 +361,9 @@ async function sendViaBlueBubbles(req, config) {
350
361
  method,
351
362
  }),
352
363
  });
364
+ if (!result.guid?.trim()) {
365
+ throw new IMessageBridgeError("BlueBubbles /api/v1/message/text returned message without guid", "bluebubbles");
366
+ }
353
367
  return { ok: true, messageId: result.guid };
354
368
  }
355
369
  async function readViaBlueBubbles(opts, config) {
@@ -506,46 +520,37 @@ export async function getIMessageDeliveryStatus(messageIds, config) {
506
520
  isRead: null,
507
521
  isDelivered: null,
508
522
  errorDescription: null,
523
+ checkedAt: new Date().toISOString(),
509
524
  }));
510
525
  }
511
526
  const results = [];
512
527
  for (const id of ids) {
513
- try {
514
- const detail = await bluebubblesRequest(config ?? {}, `/api/v1/message/${encodeURIComponent(id)}`, { method: "GET" });
515
- const isRead = typeof detail.isRead === "boolean" ? detail.isRead : null;
516
- const isDelivered = typeof detail.isDelivered === "boolean" ? detail.isDelivered : null;
517
- let status;
518
- if (detail.error) {
519
- status = "failed";
520
- }
521
- else if (isRead) {
522
- status = "delivered_read";
523
- }
524
- else if (isDelivered) {
525
- status = "delivered";
526
- }
527
- else {
528
- status = "sent";
529
- }
530
- results.push({
531
- messageId: id,
532
- status,
533
- isRead,
534
- isDelivered,
535
- errorDescription: typeof detail.errorDescription === "string"
536
- ? detail.errorDescription
537
- : null,
538
- });
528
+ const detail = await bluebubblesRequest(config ?? {}, `/api/v1/message/${encodeURIComponent(id)}`, { method: "GET" });
529
+ const isRead = typeof detail.isRead === "boolean" ? detail.isRead : null;
530
+ const isDelivered = typeof detail.isDelivered === "boolean" ? detail.isDelivered : null;
531
+ let status;
532
+ if (detail.error) {
533
+ status = "failed";
534
+ }
535
+ else if (isRead) {
536
+ status = "delivered_read";
539
537
  }
540
- catch {
541
- results.push({
542
- messageId: id,
543
- status: "unknown",
544
- isRead: null,
545
- isDelivered: null,
546
- errorDescription: null,
547
- });
538
+ else if (isDelivered) {
539
+ status = "delivered";
548
540
  }
541
+ else {
542
+ status = "sent";
543
+ }
544
+ results.push({
545
+ messageId: id,
546
+ status,
547
+ isRead,
548
+ isDelivered,
549
+ errorDescription: typeof detail.errorDescription === "string"
550
+ ? detail.errorDescription
551
+ : null,
552
+ checkedAt: new Date().toISOString(),
553
+ });
549
554
  }
550
555
  return results;
551
556
  }
@@ -262,7 +262,14 @@ export function withSignal(Base) {
262
262
  id: entry.id,
263
263
  roomId: entry.roomId,
264
264
  channelId: entry.channelId,
265
+ threadId: entry.channelId || entry.roomId,
266
+ roomName: entry.roomName,
265
267
  speakerName: entry.speakerName,
268
+ senderNumber: entry.isGroup ? null : entry.channelId || null,
269
+ senderUuid: null,
270
+ sourceDevice: null,
271
+ groupId: entry.isGroup ? entry.channelId || null : null,
272
+ groupType: null,
266
273
  text: entry.text,
267
274
  createdAt: entry.createdAt,
268
275
  isInbound: !entry.isFromAgent,
@@ -5,6 +5,10 @@ import { fail, requireNonEmptyString, } from "./service-normalize.js";
5
5
  import { normalizeOptionalConnectorSide, } from "./service-normalize-connector.js";
6
6
  import { buildTelegramTokenRef, cancelTelegramAuth, deleteStoredTelegramToken, findPendingTelegramAuthSession, inferRetryableTelegramAuthState, hasManagedTelegramCredentials, readStoredTelegramToken, startTelegramAuth as startTelegramAuthFlow, submitTelegramAuthCode, submitTelegramAuthPassword, } from "./telegram-auth.js";
7
7
  import { getTelegramReadReceipts, searchTelegramMessages, sendTelegramAccountMessage, telegramLocalSessionAvailable, verifyTelegramLocalConnector, } from "./telegram-local-client.js";
8
+ function isLifeOpsTelegramCapability(value) {
9
+ return (typeof value === "string" &&
10
+ LIFEOPS_TELEGRAM_CAPABILITIES.includes(value));
11
+ }
8
12
  /** @internal */
9
13
  export function withTelegram(Base) {
10
14
  class LifeOpsTelegramServiceMixin extends Base {
@@ -28,7 +32,7 @@ export function withTelegram(Base) {
28
32
  ? "connected"
29
33
  : retryableAuthState ?? pendingSession?.state ?? "idle";
30
34
  const capabilities = grant
31
- ? [...LIFEOPS_TELEGRAM_CAPABILITIES]
35
+ ? grant.capabilities.filter(isLifeOpsTelegramCapability)
32
36
  : [];
33
37
  return {
34
38
  provider: "telegram",
@@ -177,6 +181,9 @@ export function withTelegram(Base) {
177
181
  if (!status.connected || !status.grant?.tokenRef) {
178
182
  fail(409, "Telegram connector is not connected.");
179
183
  }
184
+ if (!status.grantedCapabilities.includes("telegram.read")) {
185
+ fail(403, "Telegram connector is missing read permission.");
186
+ }
180
187
  if (!status.grantedCapabilities.includes("telegram.send")) {
181
188
  fail(403, "Telegram connector is missing send permission.");
182
189
  }
@@ -52,10 +52,10 @@ export declare function readSignalLocalClientConfigFromEnv(env?: NodeJS.ProcessE
52
52
  * on delivery. Callers are responsible for persisting returned messages before
53
53
  * calling again.
54
54
  *
55
- * Returns an empty array when:
56
- * - The daemon is unreachable (logged at warn, not thrown).
57
- * - No messages are pending.
58
- * - The envelope contains no user-visible text (receipts, syncs, calls).
55
+ * Returns an empty array when no messages are pending or when envelopes contain
56
+ * no user-visible text. Transport and protocol failures throw
57
+ * `SignalLocalClientError` so callers do not confuse degraded Signal with an
58
+ * empty inbox.
59
59
  */
60
60
  export declare function readSignalInboundMessages(config: SignalLocalClientConfig, limit?: number): Promise<LifeOpsSignalInboundMessage[]>;
61
61
  //# sourceMappingURL=signal-local-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"signal-local-client.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/signal-local-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAEnE;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;gBAG9D,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,QAAQ,EAAE,sBAAsB,CAAC,UAAU,CAAC,CAAC;KAC9C;CAOJ;AAMD;;;GAGG;AACH,wBAAgB,kCAAkC,CAChD,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,uBAAuB,GAAG,IAAI,CAKhC;AAsCD;;;;;;;;;;;GAWG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,uBAAuB,EAC/B,KAAK,SAAwB,GAC5B,OAAO,CAAC,2BAA2B,EAAE,CAAC,CA8FxC"}
1
+ {"version":3,"file":"signal-local-client.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/signal-local-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAEnE;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;gBAG9D,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,QAAQ,EAAE,sBAAsB,CAAC,UAAU,CAAC,CAAC;KAC9C;CAOJ;AAMD;;;GAGG;AACH,wBAAgB,kCAAkC,CAChD,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,uBAAuB,GAAG,IAAI,CAKhC;AA0CD;;;;;;;;;;;GAWG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,uBAAuB,EAC/B,KAAK,SAAwB,GAC5B,OAAO,CAAC,2BAA2B,EAAE,CAAC,CA+HxC"}
@@ -23,6 +23,9 @@ export function readSignalLocalClientConfigFromEnv(env = process.env) {
23
23
  return null;
24
24
  return { httpUrl, accountNumber };
25
25
  }
26
+ function isSignalCliReceiveResponse(value) {
27
+ return Boolean(value && typeof value === "object");
28
+ }
26
29
  // ---------------------------------------------------------------------------
27
30
  // Public API
28
31
  // ---------------------------------------------------------------------------
@@ -33,10 +36,10 @@ export function readSignalLocalClientConfigFromEnv(env = process.env) {
33
36
  * on delivery. Callers are responsible for persisting returned messages before
34
37
  * calling again.
35
38
  *
36
- * Returns an empty array when:
37
- * - The daemon is unreachable (logged at warn, not thrown).
38
- * - No messages are pending.
39
- * - The envelope contains no user-visible text (receipts, syncs, calls).
39
+ * Returns an empty array when no messages are pending or when envelopes contain
40
+ * no user-visible text. Transport and protocol failures throw
41
+ * `SignalLocalClientError` so callers do not confuse degraded Signal with an
42
+ * empty inbox.
40
43
  */
41
44
  export async function readSignalInboundMessages(config, limit = DEFAULT_RECEIVE_LIMIT) {
42
45
  const clampedLimit = Math.min(Math.max(1, Math.floor(limit)), MAX_RECEIVE_LIMIT);
@@ -58,20 +61,25 @@ export async function readSignalInboundMessages(config, limit = DEFAULT_RECEIVE_
58
61
  operation: "signal_local_receive",
59
62
  httpUrl: config.httpUrl,
60
63
  }, `[lifeops] Signal local client network failure: ${message}`);
61
- return [];
64
+ throw new SignalLocalClientError(`Signal local receive failed: ${message}`, { status: null, category: "network" });
62
65
  }
63
66
  if (!response.ok) {
67
+ const category = response.status === 401 || response.status === 403
68
+ ? "auth"
69
+ : response.status === 404
70
+ ? "not_found"
71
+ : "unknown";
64
72
  logger.warn({
65
73
  boundary: "lifeops",
66
74
  integration: "signal",
67
75
  operation: "signal_local_receive",
68
76
  statusCode: response.status,
69
77
  }, `[lifeops] Signal local client HTTP ${response.status}`);
70
- return [];
78
+ throw new SignalLocalClientError(`Signal local receive failed with HTTP ${response.status}`, { status: response.status, category });
71
79
  }
72
80
  let body;
73
81
  try {
74
- body = (await response.json());
82
+ body = await response.json();
75
83
  }
76
84
  catch {
77
85
  logger.warn({
@@ -79,12 +87,16 @@ export async function readSignalInboundMessages(config, limit = DEFAULT_RECEIVE_
79
87
  integration: "signal",
80
88
  operation: "signal_local_receive",
81
89
  }, "[lifeops] Signal local client returned non-JSON body");
82
- return [];
90
+ throw new SignalLocalClientError("Signal local receive returned non-JSON", {
91
+ status: response.status,
92
+ category: "unknown",
93
+ });
94
+ }
95
+ if (!Array.isArray(body)) {
96
+ throw new SignalLocalClientError("Signal local receive returned an unexpected payload", { status: response.status, category: "unknown" });
83
97
  }
84
- if (!Array.isArray(body))
85
- return [];
86
98
  const messages = [];
87
- for (const item of body.slice(0, clampedLimit)) {
99
+ for (const item of body.filter(isSignalCliReceiveResponse).slice(0, clampedLimit)) {
88
100
  const envelope = item.envelope;
89
101
  if (!envelope)
90
102
  continue;
@@ -92,11 +104,17 @@ export async function readSignalInboundMessages(config, limit = DEFAULT_RECEIVE_
92
104
  const dataMessage = envelope.dataMessage;
93
105
  if (!dataMessage?.message)
94
106
  continue;
95
- const senderNumber = envelope.sourceNumber ?? envelope.source ?? "";
96
- const speakerName = envelope.sourceName ?? senderNumber;
107
+ const senderNumber = envelope.sourceNumber ?? envelope.source ?? null;
108
+ const senderUuid = envelope.sourceUuid ?? null;
109
+ const speakerName = envelope.sourceName ?? senderNumber ?? "Unknown Signal sender";
97
110
  const isGroup = Boolean(dataMessage.groupInfo?.groupId);
98
111
  const groupId = dataMessage.groupInfo?.groupId ?? null;
99
- const channelId = isGroup && groupId ? groupId : senderNumber;
112
+ const groupType = dataMessage.groupInfo?.type ?? null;
113
+ const channelId = isGroup && groupId ? groupId : (senderNumber ?? senderUuid ?? "");
114
+ if (!channelId)
115
+ continue;
116
+ const senderKey = senderNumber ?? senderUuid ?? channelId;
117
+ const roomName = isGroup && groupId ? `Signal group ${groupId}` : speakerName;
100
118
  // Stable ID: timestamp + sender — signal-cli does not assign message IDs in
101
119
  // the receive response, so we derive one from the envelope timestamp.
102
120
  const timestampMs = typeof dataMessage.timestamp === "number"
@@ -104,12 +122,19 @@ export async function readSignalInboundMessages(config, limit = DEFAULT_RECEIVE_
104
122
  : typeof envelope.timestamp === "number"
105
123
  ? envelope.timestamp
106
124
  : Date.now();
107
- const id = `signal:${senderNumber}:${timestampMs}`;
125
+ const id = `signal:${senderKey}:${timestampMs}`;
108
126
  messages.push({
109
127
  id,
110
128
  roomId: channelId,
111
129
  channelId,
130
+ threadId: channelId,
131
+ roomName,
112
132
  speakerName,
133
+ senderNumber,
134
+ senderUuid,
135
+ sourceDevice: typeof envelope.sourceDevice === "number" ? envelope.sourceDevice : null,
136
+ groupId,
137
+ groupType,
113
138
  text: dataMessage.message,
114
139
  createdAt: timestampMs,
115
140
  isInbound: true,
@@ -1 +1 @@
1
- {"version":3,"file":"telegram-auth.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/telegram-auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"telegram-auth.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/telegram-auth.ts"],"names":[],"mappings":"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"}
@@ -519,13 +519,33 @@ export function findPendingTelegramAuthSession(agentId, side) {
519
519
  // ---------------------------------------------------------------------------
520
520
  // Credential management
521
521
  // ---------------------------------------------------------------------------
522
+ function isStoredTelegramConnectorToken(value) {
523
+ if (!value || typeof value !== "object") {
524
+ return false;
525
+ }
526
+ const token = value;
527
+ return (token.provider === "telegram" &&
528
+ typeof token.agentId === "string" &&
529
+ (token.side === "owner" || token.side === "agent") &&
530
+ typeof token.sessionString === "string" &&
531
+ typeof token.apiId === "number" &&
532
+ typeof token.apiHash === "string" &&
533
+ typeof token.phone === "string" &&
534
+ Boolean(token.identity) &&
535
+ typeof token.identity === "object" &&
536
+ typeof token.identity.id === "string" &&
537
+ typeof token.identity.username === "string" &&
538
+ typeof token.identity.firstName === "string" &&
539
+ typeof token.createdAt === "string" &&
540
+ typeof token.updatedAt === "string");
541
+ }
522
542
  export function readStoredTelegramToken(tokenRef) {
523
543
  const filePath = resolveTokenPath(tokenRef);
524
544
  if (!fs.existsSync(filePath)) {
525
545
  return null;
526
546
  }
527
547
  const parsed = JSON.parse(readTelegramStoragePayload(filePath));
528
- if (!parsed || typeof parsed !== "object" || parsed.provider !== "telegram") {
548
+ if (!isStoredTelegramConnectorToken(parsed)) {
529
549
  return null;
530
550
  }
531
551
  return parsed;
@@ -40,8 +40,11 @@ export type TelegramDeliveryStatus = "delivered_read" | "sent" | "unknown";
40
40
  export interface TelegramMessageSearchResult {
41
41
  id: string | null;
42
42
  dialogId: string | null;
43
+ threadId: string | null;
43
44
  dialogTitle: string | null;
44
45
  username: string | null;
46
+ peerId: string | null;
47
+ senderId: string | null;
45
48
  content: string;
46
49
  timestamp: string | null;
47
50
  outgoing: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"telegram-local-client.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/telegram-local-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"telegram-local-client.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/telegram-local-client.ts"],"names":[],"mappings":"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"}