@symerian/symi 2.1.6 → 2.1.7

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 (91) hide show
  1. package/dist/{audio-preflight-5NsCxagO.js → audio-preflight-BZIRAXlv.js} +4 -4
  2. package/dist/{audio-preflight-BnwAAlLw.js → audio-preflight-IRs02MgH.js} +4 -4
  3. package/dist/build-info.json +3 -3
  4. package/dist/bundled/boot-md/handler.js +6 -6
  5. package/dist/bundled/session-memory/handler.js +6 -6
  6. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  7. package/dist/{chrome-DM65TRMk.js → chrome-791kNCCB.js} +7 -7
  8. package/dist/{chrome-DPHgzMPu.js → chrome-CqribT6Z.js} +7 -7
  9. package/dist/{deliver-Cgg1qwKP.js → deliver-CrlXl9KD.js} +1 -1
  10. package/dist/{deliver-EKA6SdgU.js → deliver-vWWI-94q.js} +1 -1
  11. package/dist/extensionAPI.js +6 -6
  12. package/dist/{image-EKTeO3aa.js → image-CV4FUL4M.js} +1 -1
  13. package/dist/{image-xvVpGzK5.js → image-ycxQmhff.js} +1 -1
  14. package/dist/llm-slug-generator.js +6 -6
  15. package/dist/{pi-embedded-DuWfOlkO.js → pi-embedded-AKhKHxb6.js} +16 -16
  16. package/dist/{pi-embedded-02ObvVIR.js → pi-embedded-DguKAKpR.js} +16 -16
  17. package/dist/{pi-embedded-helpers-Cd124krQ.js → pi-embedded-helpers-DoTustDz.js} +4 -4
  18. package/dist/{pi-embedded-helpers-B6ugLqkI.js → pi-embedded-helpers-SPJVuQfB.js} +4 -4
  19. package/dist/plugin-sdk/{accounts-BtaOa4z_.js → accounts-BToL3HlP.js} +1 -1
  20. package/dist/plugin-sdk/{accounts-Ddm33hQm.js → accounts-D9zGZU5t.js} +3 -3
  21. package/dist/plugin-sdk/{accounts-s-AdhXVR.js → accounts-Dtszw3Zn.js} +1 -1
  22. package/dist/plugin-sdk/{active-listener-BXYeALs0.js → active-listener-bEk__wbB.js} +1 -1
  23. package/dist/plugin-sdk/{agent-scope-CYYpcO9W.js → agent-scope-C3gMMKCU.js} +2 -2
  24. package/dist/plugin-sdk/{api-key-rotation-BNN7DLRF.js → api-key-rotation-B7wX2cS9.js} +1 -1
  25. package/dist/plugin-sdk/{audio-preflight-Cx5FPiJc.js → audio-preflight-ni0fpVp8.js} +24 -24
  26. package/dist/plugin-sdk/{bindings-C7hRtgYW.js → bindings-BbwoUGPx.js} +2 -2
  27. package/dist/plugin-sdk/{channel-activity-DoC1xtDu.js → channel-activity-Ji7f0gqq.js} +1 -1
  28. package/dist/plugin-sdk/{channel-web-Bz7z_PrR.js → channel-web-DLpcsfAm.js} +22 -22
  29. package/dist/plugin-sdk/{chrome-BMG9BEuT.js → chrome-B3sE4bXC.js} +3 -3
  30. package/dist/plugin-sdk/{chunk-Dw2XBYXv.js → chunk-jvk9axTQ.js} +1 -1
  31. package/dist/plugin-sdk/{command-format-GKSevep4.js → command-format-DSdvQ_M5.js} +1 -1
  32. package/dist/plugin-sdk/{commands-registry-B6QKgH1z.js → commands-registry-DFVoW5Za.js} +4 -4
  33. package/dist/plugin-sdk/{config-ChoJh2v6.js → config-C8bdNl-t.js} +9 -9
  34. package/dist/plugin-sdk/{deliver-PHupXW27.js → deliver-DupqKEgT.js} +10 -10
  35. package/dist/plugin-sdk/{diagnostic-05pm5Rxi.js → diagnostic-mFf4i4G9.js} +1 -1
  36. package/dist/plugin-sdk/{image-ops-BlQR__MN.js → image-ops-Bnp6LXEx.js} +1 -1
  37. package/dist/plugin-sdk/{image-CZeY-Q2T.js → image-t0--fcO_.js} +4 -4
  38. package/dist/plugin-sdk/index.js +53 -53
  39. package/dist/plugin-sdk/{ir-BJ6BHE5b.js → ir-Fb3qpcis.js} +4 -4
  40. package/dist/plugin-sdk/{local-roots-BHLNSI8U.js → local-roots-Ckk1QfzI.js} +3 -3
  41. package/dist/plugin-sdk/{login-WrHy4q1W.js → login-YiSLGJpw.js} +7 -7
  42. package/dist/plugin-sdk/{login-qr-D30S2gk7.js → login-qr-Ct3iRCTA.js} +9 -9
  43. package/dist/plugin-sdk/{manager-Cn2S7u-y.js → manager-PXN_BUWT.js} +8 -8
  44. package/dist/plugin-sdk/{manifest-registry-CPnHl_K3.js → manifest-registry-B3ugY9-f.js} +1 -1
  45. package/dist/plugin-sdk/{markdown-tables-BoYFajMu.js → markdown-tables-Dfaqilz6.js} +1 -1
  46. package/dist/plugin-sdk/{message-channel-COTAJzHd.js → message-channel-BdI5Ra9S.js} +1 -1
  47. package/dist/plugin-sdk/{model-selection-CPEL3Uc_.js → model-selection-UQwTqGSw.js} +4 -4
  48. package/dist/plugin-sdk/{outbound-ps5sAOfw.js → outbound-BaAisH4u.js} +7 -7
  49. package/dist/plugin-sdk/{outbound-attachment-CnslKL38.js → outbound-attachment-DnVQfTG2.js} +2 -2
  50. package/dist/plugin-sdk/{pi-auth-json-D4gyc_V3.js → pi-auth-json-DAttpBPg.js} +5 -5
  51. package/dist/plugin-sdk/{pi-embedded-helpers-CU4D77Op.js → pi-embedded-helpers-CHlXbJGj.js} +17 -17
  52. package/dist/plugin-sdk/{plugins-BNByVCIH.js → plugins-BbAvhC25.js} +4 -4
  53. package/dist/plugin-sdk/{pw-ai-81tOC-Ch.js → pw-ai-JO8xac-v.js} +8 -8
  54. package/dist/plugin-sdk/{qmd-manager-CH0XbIHf.js → qmd-manager-mjKcdwVr.js} +4 -4
  55. package/dist/plugin-sdk/{registry-D0xTnUWt.js → registry--_pGht6S.js} +2 -2
  56. package/dist/plugin-sdk/{replies-zmY9bbot.js → replies-CVSgwFjl.js} +3 -3
  57. package/dist/plugin-sdk/{reply-BSikbH6_.js → reply-GcVMmckw.js} +78 -78
  58. package/dist/plugin-sdk/{reply-prefix-uxfMZW4p.js → reply-prefix-BHuV5t70.js} +1 -1
  59. package/dist/plugin-sdk/{resolve-outbound-target-BiyAyTWz.js → resolve-outbound-target-BkCUbYGV.js} +2 -2
  60. package/dist/plugin-sdk/{resolve-route-B3CCBumQ.js → resolve-route-D3JH_D2N.js} +3 -3
  61. package/dist/plugin-sdk/{retry-CwQ_iIj8.js → retry-ilSJqnz9.js} +1 -1
  62. package/dist/plugin-sdk/{runner-Co_eR7xp.js → runner-Dm_yIGe6.js} +9 -9
  63. package/dist/plugin-sdk/{send-BNZVvZHE.js → send-BEeCC5ku.js} +6 -6
  64. package/dist/plugin-sdk/{send-6DwkdgEF.js → send-C9rT2n2M.js} +7 -7
  65. package/dist/plugin-sdk/{send-D6BxZPP0.js → send-DNkOLgrC.js} +6 -6
  66. package/dist/plugin-sdk/{send-D8vgGF3T.js → send-DWr9Drgp.js} +10 -10
  67. package/dist/plugin-sdk/{send-Dw4gTEN6.js → send-mQr5eXnb.js} +10 -10
  68. package/dist/plugin-sdk/{session-BTN5wyhB.js → session-CQ5dJOsX.js} +4 -4
  69. package/dist/plugin-sdk/{skill-commands-BUVE0jBL.js → skill-commands-27tIhSRP.js} +5 -5
  70. package/dist/plugin-sdk/{skills-_yTP47Cd.js → skills-B1GeRYlu.js} +7 -7
  71. package/dist/plugin-sdk/{sqlite-CxAR5ttJ.js → sqlite-Cq_7Cg4E.js} +1 -1
  72. package/dist/plugin-sdk/{store-BdrNabcU.js → store-Do3t33-c.js} +2 -2
  73. package/dist/plugin-sdk/{subsystem-B2uDN3TV.js → subsystem-Coz2AgU8.js} +1 -1
  74. package/dist/plugin-sdk/{tables-DNwXwNFa.js → tables-DR0NmBeH.js} +1 -1
  75. package/dist/plugin-sdk/{target-errors-Paro1BjP.js → target-errors-B7YyMnIi.js} +2 -2
  76. package/dist/plugin-sdk/{thinking-CXqf7WTe.js → thinking-DCNUIAHY.js} +5 -5
  77. package/dist/plugin-sdk/{tokens-bC3UVmVH.js → tokens-CWMflosr.js} +1 -1
  78. package/dist/plugin-sdk/{tool-images-HJ2sfZDV.js → tool-images-D7Lno-TE.js} +2 -2
  79. package/dist/plugin-sdk/{tool-loop-detection-BVA6fax-.js → tool-loop-detection-edmW8ZiF.js} +2 -2
  80. package/dist/plugin-sdk/web-CJWupzDH.js +65 -0
  81. package/dist/plugin-sdk/{whatsapp-actions-DU3CTVCg.js → whatsapp-actions-ZlyPpuJN.js} +21 -21
  82. package/dist/{pw-ai-CL_YRdbc.js → pw-ai-DIVguI36.js} +1 -1
  83. package/dist/{pw-ai-CD2xT-vT.js → pw-ai-DnN0T7wd.js} +1 -1
  84. package/dist/{runner-CCo2QuJE.js → runner-Cw5KZrjx.js} +1 -1
  85. package/dist/{runner-BlTur7kC.js → runner-Cx1wJumq.js} +1 -1
  86. package/dist/{web-BFa88W3e.js → web-Kz-ZuUjq.js} +6 -6
  87. package/dist/{web-CMl4g_Bl.js → web-cSkprx6P.js} +6 -6
  88. package/extensions/outlook/index.ts +105 -1
  89. package/extensions/outlook/src/auth.ts +91 -0
  90. package/package.json +1 -1
  91. package/dist/plugin-sdk/web-eAue9zIL.js +0 -65
@@ -1,16 +1,16 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
- import { B as parseTargetPrefixes, F as resolveDiscordAccount, I as normalizeDiscordToken, L as buildMessagingTarget, R as ensureTargetId, V as requireTargetKind, z as parseTargetMention } from "./plugins-BNByVCIH.js";
2
+ import { B as parseTargetPrefixes, F as resolveDiscordAccount, I as normalizeDiscordToken, L as buildMessagingTarget, R as ensureTargetId, V as requireTargetKind, z as parseTargetMention } from "./plugins-BbAvhC25.js";
3
3
  import { t as resolveFetch } from "./fetch-CUNoPTKm.js";
4
- import { ut as resolvePreferredSymiTmpDir } from "./registry-D0xTnUWt.js";
5
- import { n as retryAsync, t as resolveRetryConfig } from "./retry-CwQ_iIj8.js";
6
- import { n as loadConfig } from "./config-ChoJh2v6.js";
7
- import { n as recordChannelActivity, r as createDiscordRetryRunner } from "./channel-activity-DoC1xtDu.js";
4
+ import { ut as resolvePreferredSymiTmpDir } from "./registry--_pGht6S.js";
5
+ import { n as retryAsync, t as resolveRetryConfig } from "./retry-ilSJqnz9.js";
6
+ import { n as loadConfig } from "./config-C8bdNl-t.js";
7
+ import { n as recordChannelActivity, r as createDiscordRetryRunner } from "./channel-activity-Ji7f0gqq.js";
8
8
  import { n as normalizePollInput, t as normalizePollDurationHours } from "./polls-3WJMd-G-.js";
9
- import { _ as maxBytesForKind, l as extensionForMime } from "./image-ops-BlQR__MN.js";
10
- import { a as loadWebMedia, o as loadWebMediaRaw } from "./ir-BJ6BHE5b.js";
11
- import { c as resolveChunkMode, i as chunkMarkdownTextWithMode } from "./chunk-Dw2XBYXv.js";
12
- import { n as resolveMarkdownTableMode } from "./markdown-tables-BoYFajMu.js";
13
- import { t as convertMarkdownTables } from "./tables-DNwXwNFa.js";
9
+ import { _ as maxBytesForKind, l as extensionForMime } from "./image-ops-Bnp6LXEx.js";
10
+ import { a as loadWebMedia, o as loadWebMediaRaw } from "./ir-Fb3qpcis.js";
11
+ import { c as resolveChunkMode, i as chunkMarkdownTextWithMode } from "./chunk-jvk9axTQ.js";
12
+ import { n as resolveMarkdownTableMode } from "./markdown-tables-Dfaqilz6.js";
13
+ import { t as convertMarkdownTables } from "./tables-DR0NmBeH.js";
14
14
  import path from "node:path";
15
15
  import { ButtonStyle, ChannelType, MessageFlags, PermissionFlagsBits, Routes, TextInputStyle } from "discord-api-types/v10";
16
16
  import { Button, ChannelSelectMenu, CheckboxGroup, Container, Embed, File, Label, LinkButton, MediaGallery, MentionableSelectMenu, Modal, RadioGroup, RequestClient, RoleSelectMenu, Row, Section, Separator, StringSelectMenu, TextDisplay, TextInput, Thumbnail, UserSelectMenu, parseCustomId, serializePayload } from "@buape/carbon";
@@ -1,7 +1,7 @@
1
- import { d as readCredsJsonRaw, h as resolveWebCredsPath, l as maybeRestoreCredsFromBackup, m as resolveWebCredsBackupPath, p as resolveDefaultWebAuthDir } from "./accounts-Ddm33hQm.js";
2
- import { P as resolveUserPath, U as danger, X as success, at as toPinoLikeLogger, tt as getChildLogger, w as ensureDir } from "./registry-D0xTnUWt.js";
3
- import { Z as VERSION } from "./config-ChoJh2v6.js";
4
- import { t as formatCliCommand } from "./command-format-GKSevep4.js";
1
+ import { d as readCredsJsonRaw, h as resolveWebCredsPath, l as maybeRestoreCredsFromBackup, m as resolveWebCredsBackupPath, p as resolveDefaultWebAuthDir } from "./accounts-D9zGZU5t.js";
2
+ import { P as resolveUserPath, U as danger, X as success, at as toPinoLikeLogger, tt as getChildLogger, w as ensureDir } from "./registry--_pGht6S.js";
3
+ import { Z as VERSION } from "./config-C8bdNl-t.js";
4
+ import { t as formatCliCommand } from "./command-format-DSdvQ_M5.js";
5
5
  import fs from "node:fs";
6
6
  import { randomUUID } from "node:crypto";
7
7
  import { DisconnectReason, fetchLatestBaileysVersion, makeCacheableSignalKeyStore, makeWASocket, useMultiFileAuthState } from "@whiskeysockets/baileys";
@@ -1,10 +1,10 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
2
  import { s as resolveStateDir } from "./paths-DR2yt_mP.js";
3
- import { P as resolveUserPath, b as CONFIG_DIR } from "./registry-D0xTnUWt.js";
4
- import { t as createSubsystemLogger } from "./subsystem-B2uDN3TV.js";
5
- import { s as resolveAgentWorkspaceDir, t as listAgentIds } from "./agent-scope-CYYpcO9W.js";
6
- import { o as resolvePluginSkillDirs, t as buildWorkspaceSkillCommandSpecs } from "./skills-_yTP47Cd.js";
7
- import { i as listChatCommands } from "./commands-registry-B6QKgH1z.js";
3
+ import { P as resolveUserPath, b as CONFIG_DIR } from "./registry--_pGht6S.js";
4
+ import { t as createSubsystemLogger } from "./subsystem-Coz2AgU8.js";
5
+ import { s as resolveAgentWorkspaceDir, t as listAgentIds } from "./agent-scope-C3gMMKCU.js";
6
+ import { o as resolvePluginSkillDirs, t as buildWorkspaceSkillCommandSpecs } from "./skills-B1GeRYlu.js";
7
+ import { i as listChatCommands } from "./commands-registry-DFVoW5Za.js";
8
8
  import fs from "node:fs";
9
9
  import path from "node:path";
10
10
  import os from "node:os";
@@ -1,12 +1,12 @@
1
- import { P as resolveUserPath, b as CONFIG_DIR } from "./registry-D0xTnUWt.js";
2
- import { t as createSubsystemLogger } from "./subsystem-B2uDN3TV.js";
3
- import { i as parseBooleanValue } from "./command-format-GKSevep4.js";
4
- import { M as normalizeSkillFilter, w as resolveSymiPackageRootSync } from "./agent-scope-CYYpcO9W.js";
5
- import { a as LEGACY_MANIFEST_KEYS, c as normalizePluginsConfig, l as resolveEnableState, o as MANIFEST_KEY, p as isDangerousHostEnvVarName, t as loadPluginManifestRegistry, u as resolveMemorySlotDecision } from "./manifest-registry-CPnHl_K3.js";
1
+ import { P as resolveUserPath, b as CONFIG_DIR } from "./registry--_pGht6S.js";
2
+ import { t as createSubsystemLogger } from "./subsystem-Coz2AgU8.js";
3
+ import { i as parseBooleanValue } from "./command-format-DSdvQ_M5.js";
4
+ import { M as normalizeSkillFilter, w as resolveSymiPackageRootSync } from "./agent-scope-C3gMMKCU.js";
5
+ import { a as LEGACY_MANIFEST_KEYS, c as normalizePluginsConfig, l as resolveEnableState, o as MANIFEST_KEY, p as isDangerousHostEnvVarName, t as loadPluginManifestRegistry, u as resolveMemorySlotDecision } from "./manifest-registry-B3ugY9-f.js";
6
6
  import fs from "node:fs";
7
7
  import path from "node:path";
8
8
  import os from "node:os";
9
- import JSON5 from "json5";
9
+ import json5 from "json5";
10
10
  import { createHash, timingSafeEqual } from "node:crypto";
11
11
  import fs$1 from "node:fs/promises";
12
12
  import { fileURLToPath } from "node:url";
@@ -226,7 +226,7 @@ function resolveSymiManifestBlock(params) {
226
226
  const raw = getFrontmatterString(params.frontmatter, params.key ?? "metadata");
227
227
  if (!raw) return;
228
228
  try {
229
- const parsed = JSON5.parse(raw);
229
+ const parsed = json5.parse(raw);
230
230
  if (!parsed || typeof parsed !== "object") return;
231
231
  const manifestKeys = [MANIFEST_KEY, ...LEGACY_MANIFEST_KEYS];
232
232
  for (const key of manifestKeys) {
@@ -1,4 +1,4 @@
1
- import { t as createSubsystemLogger } from "./subsystem-B2uDN3TV.js";
1
+ import { t as createSubsystemLogger } from "./subsystem-Coz2AgU8.js";
2
2
  import { t as redactSensitiveText } from "./redact-DPnDWsnT.js";
3
3
  import { o as resolveSessionTranscriptsDirForAgent } from "./paths-A0xdf3yk.js";
4
4
  import { createRequire } from "node:module";
@@ -1,5 +1,5 @@
1
- import { M as resolveConfigDir } from "./registry-D0xTnUWt.js";
2
- import { c as detectMime, l as extensionForMime } from "./image-ops-BlQR__MN.js";
1
+ import { M as resolveConfigDir } from "./registry--_pGht6S.js";
2
+ import { c as detectMime, l as extensionForMime } from "./image-ops-Bnp6LXEx.js";
3
3
  import { createWriteStream } from "node:fs";
4
4
  import path from "node:path";
5
5
  import crypto from "node:crypto";
@@ -1,4 +1,4 @@
1
- import { G as isVerbose, ct as normalizeLogLevel, lt as readLoggingConfig, n as CHAT_CHANNEL_ORDER, ot as loggingState, rt as isFileLogLevelEnabled, st as levelToMinLevel, tt as getChildLogger } from "./registry-D0xTnUWt.js";
1
+ import { G as isVerbose, ct as normalizeLogLevel, lt as readLoggingConfig, n as CHAT_CHANNEL_ORDER, ot as loggingState, rt as isFileLogLevelEnabled, st as levelToMinLevel, tt as getChildLogger } from "./registry--_pGht6S.js";
2
2
  import { Chalk } from "chalk";
3
3
 
4
4
  //#region src/terminal/progress-line.ts
@@ -1,4 +1,4 @@
1
- import { r as markdownToIRWithMeta } from "./ir-BJ6BHE5b.js";
1
+ import { r as markdownToIRWithMeta } from "./ir-Fb3qpcis.js";
2
2
  import { t as renderMarkdownWithMarkers } from "./render-BiJZ5W4Z.js";
3
3
 
4
4
  //#region src/markdown/tables.ts
@@ -1,5 +1,5 @@
1
- import { c as detectMime } from "./image-ops-BlQR__MN.js";
2
- import { r as sanitizeToolResultImages } from "./tool-images-HJ2sfZDV.js";
1
+ import { c as detectMime } from "./image-ops-Bnp6LXEx.js";
2
+ import { r as sanitizeToolResultImages } from "./tool-images-D7Lno-TE.js";
3
3
  import fs from "node:fs/promises";
4
4
 
5
5
  //#region src/agents/tools/common.ts
@@ -1,9 +1,9 @@
1
1
  import { p as normalizeAccountId } from "./session-key-C_0eELjb.js";
2
- import { r as resolveWhatsAppAccount } from "./accounts-Ddm33hQm.js";
3
- import { D as resolveSlackAccount, F as resolveDiscordAccount, O as resolveSlackReplyToMode, S as resolveTelegramAccount, _ as normalizeWhatsAppTarget } from "./plugins-BNByVCIH.js";
4
- import { A as normalizeE164, T as escapeRegExp, i as getChatChannelMeta, l as requireActivePluginRegistry, n as CHAT_CHANNEL_ORDER } from "./registry-D0xTnUWt.js";
5
- import { r as resolveIMessageAccount } from "./accounts-s-AdhXVR.js";
6
- import { i as resolveSignalAccount } from "./accounts-BtaOa4z_.js";
2
+ import { r as resolveWhatsAppAccount } from "./accounts-D9zGZU5t.js";
3
+ import { D as resolveSlackAccount, F as resolveDiscordAccount, O as resolveSlackReplyToMode, S as resolveTelegramAccount, _ as normalizeWhatsAppTarget } from "./plugins-BbAvhC25.js";
4
+ import { A as normalizeE164, T as escapeRegExp, i as getChatChannelMeta, l as requireActivePluginRegistry, n as CHAT_CHANNEL_ORDER } from "./registry--_pGht6S.js";
5
+ import { r as resolveIMessageAccount } from "./accounts-Dtszw3Zn.js";
6
+ import { i as resolveSignalAccount } from "./accounts-BToL3HlP.js";
7
7
 
8
8
  //#region src/config/group-policy.ts
9
9
  function resolveChannelGroupConfig(groups, groupId, caseInsensitive = false) {
@@ -1,4 +1,4 @@
1
- import { T as escapeRegExp } from "./registry-D0xTnUWt.js";
1
+ import { T as escapeRegExp } from "./registry--_pGht6S.js";
2
2
 
3
3
  //#region src/auto-reply/tokens.ts
4
4
  const SYMIPULSE_TOKEN = "SYMIPULSE_OK";
@@ -1,5 +1,5 @@
1
- import { t as createSubsystemLogger } from "./subsystem-B2uDN3TV.js";
2
- import { i as getImageMetadata, n as buildImageResizeSideGrid, s as resizeToJpeg, t as IMAGE_REDUCE_QUALITY_STEPS } from "./image-ops-BlQR__MN.js";
1
+ import { t as createSubsystemLogger } from "./subsystem-Coz2AgU8.js";
2
+ import { i as getImageMetadata, n as buildImageResizeSideGrid, s as resizeToJpeg, t as IMAGE_REDUCE_QUALITY_STEPS } from "./image-ops-Bnp6LXEx.js";
3
3
 
4
4
  //#region src/agents/image-sanitization.ts
5
5
  const DEFAULT_IMAGE_MAX_DIMENSION_PX = 1200;
@@ -1,6 +1,6 @@
1
1
  import "./paths-DR2yt_mP.js";
2
- import { H as isPlainObject } from "./registry-D0xTnUWt.js";
3
- import { t as createSubsystemLogger } from "./subsystem-B2uDN3TV.js";
2
+ import { H as isPlainObject } from "./registry--_pGht6S.js";
3
+ import { t as createSubsystemLogger } from "./subsystem-Coz2AgU8.js";
4
4
  import { createHash } from "node:crypto";
5
5
 
6
6
  //#region src/agents/tool-loop-detection.ts
@@ -0,0 +1,65 @@
1
+ import { a as WA_WEB_AUTH_DIR, g as webAuthExists, s as logWebSelfId, u as pickWebChannel } from "./accounts-D9zGZU5t.js";
2
+ import "./reply-GcVMmckw.js";
3
+ import "./paths-DR2yt_mP.js";
4
+ import "./github-copilot-token-D9X2phUj.js";
5
+ import "./plugins-BbAvhC25.js";
6
+ import "./fetch-CUNoPTKm.js";
7
+ import "./registry--_pGht6S.js";
8
+ import "./retry-ilSJqnz9.js";
9
+ import "./send-mQr5eXnb.js";
10
+ import "./config-C8bdNl-t.js";
11
+ import "./subsystem-Coz2AgU8.js";
12
+ import "./command-format-DSdvQ_M5.js";
13
+ import "./model-selection-UQwTqGSw.js";
14
+ import "./agent-scope-C3gMMKCU.js";
15
+ import "./manifest-registry-B3ugY9-f.js";
16
+ import "./redact-DPnDWsnT.js";
17
+ import "./errors-Bv8oZiTO.js";
18
+ import "./channel-activity-Ji7f0gqq.js";
19
+ import "./image-ops-Bnp6LXEx.js";
20
+ import "./ssrf-DKZ8eBrk.js";
21
+ import "./local-roots-Ckk1QfzI.js";
22
+ import "./ir-Fb3qpcis.js";
23
+ import "./chunk-jvk9axTQ.js";
24
+ import "./message-channel-BdI5Ra9S.js";
25
+ import "./bindings-BbwoUGPx.js";
26
+ import "./markdown-tables-Dfaqilz6.js";
27
+ import "./render-BiJZ5W4Z.js";
28
+ import "./tables-DR0NmBeH.js";
29
+ import "./send-C9rT2n2M.js";
30
+ import "./tool-images-D7Lno-TE.js";
31
+ import "./target-errors-B7YyMnIi.js";
32
+ import "./send-BEeCC5ku.js";
33
+ import "./send-DWr9Drgp.js";
34
+ import "./runner-Dm_yIGe6.js";
35
+ import "./reply-prefix-BHuV5t70.js";
36
+ import "./tokens-CWMflosr.js";
37
+ import "./skill-commands-27tIhSRP.js";
38
+ import "./skills-B1GeRYlu.js";
39
+ import "./chrome-B3sE4bXC.js";
40
+ import "./thinking-DCNUIAHY.js";
41
+ import "./accounts-Dtszw3Zn.js";
42
+ import "./accounts-BToL3HlP.js";
43
+ import "./deliver-DupqKEgT.js";
44
+ import "./pi-embedded-helpers-CHlXbJGj.js";
45
+ import "./paths-A0xdf3yk.js";
46
+ import "./diagnostic-mFf4i4G9.js";
47
+ import "./store-Do3t33-c.js";
48
+ import { n as monitorWebInbox, t as monitorWebChannel } from "./channel-web-DLpcsfAm.js";
49
+ import "./image-t0--fcO_.js";
50
+ import "./pi-model-discovery-LbcEa65a.js";
51
+ import "./api-key-rotation-B7wX2cS9.js";
52
+ import "./sqlite-Cq_7Cg4E.js";
53
+ import "./diagnostic-session-state-Wd5tNeQG.js";
54
+ import "./manager-PXN_BUWT.js";
55
+ import "./commands-registry-DFVoW5Za.js";
56
+ import "./send-DNkOLgrC.js";
57
+ import "./proxy-MquBDehr.js";
58
+ import "./resolve-route-D3JH_D2N.js";
59
+ import "./replies-CVSgwFjl.js";
60
+ import "./outbound-attachment-DnVQfTG2.js";
61
+ import { n as sendMessageWhatsApp } from "./outbound-BaAisH4u.js";
62
+ import { i as waitForWaConnection, t as createWaSocket } from "./session-CQ5dJOsX.js";
63
+ import { t as loginWeb } from "./login-YiSLGJpw.js";
64
+
65
+ export { WA_WEB_AUTH_DIR, createWaSocket, logWebSelfId, loginWeb, monitorWebChannel, monitorWebInbox, pickWebChannel, sendMessageWhatsApp, waitForWaConnection, webAuthExists };
@@ -1,28 +1,28 @@
1
- import { r as resolveWhatsAppAccount } from "./accounts-Ddm33hQm.js";
1
+ import { r as resolveWhatsAppAccount } from "./accounts-D9zGZU5t.js";
2
2
  import "./paths-DR2yt_mP.js";
3
3
  import "./github-copilot-token-D9X2phUj.js";
4
- import "./plugins-BNByVCIH.js";
5
- import "./registry-D0xTnUWt.js";
6
- import "./config-ChoJh2v6.js";
7
- import "./subsystem-B2uDN3TV.js";
8
- import "./command-format-GKSevep4.js";
9
- import "./model-selection-CPEL3Uc_.js";
10
- import "./agent-scope-CYYpcO9W.js";
11
- import "./manifest-registry-CPnHl_K3.js";
12
- import "./image-ops-BlQR__MN.js";
4
+ import "./plugins-BbAvhC25.js";
5
+ import "./registry--_pGht6S.js";
6
+ import "./config-C8bdNl-t.js";
7
+ import "./subsystem-Coz2AgU8.js";
8
+ import "./command-format-DSdvQ_M5.js";
9
+ import "./model-selection-UQwTqGSw.js";
10
+ import "./agent-scope-C3gMMKCU.js";
11
+ import "./manifest-registry-B3ugY9-f.js";
12
+ import "./image-ops-Bnp6LXEx.js";
13
13
  import "./ssrf-DKZ8eBrk.js";
14
- import "./local-roots-BHLNSI8U.js";
15
- import "./ir-BJ6BHE5b.js";
16
- import "./chunk-Dw2XBYXv.js";
17
- import "./message-channel-COTAJzHd.js";
18
- import "./bindings-C7hRtgYW.js";
19
- import "./markdown-tables-BoYFajMu.js";
14
+ import "./local-roots-Ckk1QfzI.js";
15
+ import "./ir-Fb3qpcis.js";
16
+ import "./chunk-jvk9axTQ.js";
17
+ import "./message-channel-BdI5Ra9S.js";
18
+ import "./bindings-BbwoUGPx.js";
19
+ import "./markdown-tables-Dfaqilz6.js";
20
20
  import "./render-BiJZ5W4Z.js";
21
- import "./tables-DNwXwNFa.js";
22
- import "./tool-images-HJ2sfZDV.js";
23
- import { a as createActionGate, c as jsonResult, d as readReactionParams, i as ToolAuthorizationError, m as readStringParam } from "./target-errors-Paro1BjP.js";
24
- import { t as resolveWhatsAppOutboundTarget } from "./resolve-outbound-target-BiyAyTWz.js";
25
- import { r as sendReactionWhatsApp } from "./outbound-ps5sAOfw.js";
21
+ import "./tables-DR0NmBeH.js";
22
+ import "./tool-images-D7Lno-TE.js";
23
+ import { a as createActionGate, c as jsonResult, d as readReactionParams, i as ToolAuthorizationError, m as readStringParam } from "./target-errors-B7YyMnIi.js";
24
+ import { t as resolveWhatsAppOutboundTarget } from "./resolve-outbound-target-BkCUbYGV.js";
25
+ import { r as sendReactionWhatsApp } from "./outbound-BaAisH4u.js";
26
26
 
27
27
  //#region src/agents/tools/whatsapp-target-auth.ts
28
28
  function resolveAuthorizedWhatsAppOutboundTarget(params) {
@@ -9,7 +9,7 @@ import "./model-auth-64S8o7s-.js";
9
9
  import "./github-copilot-token-C_qUP7p5.js";
10
10
  import "./config-CfZ-oKwR.js";
11
11
  import "./manifest-registry-D0IQ3WuX.js";
12
- import { _ as fetchJson, b as withCdpSocket, d as normalizeCdpWsUrl, g as appendCdpPath, h as withBrowserNavigationPolicy, m as assertBrowserNavigationAllowed, t as getChromeWebSocketUrl, u as formatAriaSnapshot, y as getHeadersWithAuth } from "./chrome-DM65TRMk.js";
12
+ import { _ as fetchJson, b as withCdpSocket, d as normalizeCdpWsUrl, g as appendCdpPath, h as withBrowserNavigationPolicy, m as assertBrowserNavigationAllowed, t as getChromeWebSocketUrl, u as formatAriaSnapshot, y as getHeadersWithAuth } from "./chrome-791kNCCB.js";
13
13
  import "./redact-jSxx6Ep2.js";
14
14
  import { n as formatErrorMessage } from "./errors-BoQgnc8X.js";
15
15
  import "./ssrf-BTMDZjHT.js";
@@ -7,7 +7,7 @@ import "./github-copilot-token-BbsJ0Qbo.js";
7
7
  import { r as formatCliCommand } from "./env-CQ_DQOwT.js";
8
8
  import "./config-diuFc3fL.js";
9
9
  import "./manifest-registry-D-mTF1cj.js";
10
- import { _ as fetchJson, b as withCdpSocket, d as normalizeCdpWsUrl, g as appendCdpPath, h as withBrowserNavigationPolicy, m as assertBrowserNavigationAllowed, t as getChromeWebSocketUrl, u as formatAriaSnapshot, y as getHeadersWithAuth } from "./chrome-DPHgzMPu.js";
10
+ import { _ as fetchJson, b as withCdpSocket, d as normalizeCdpWsUrl, g as appendCdpPath, h as withBrowserNavigationPolicy, m as assertBrowserNavigationAllowed, t as getChromeWebSocketUrl, u as formatAriaSnapshot, y as getHeadersWithAuth } from "./chrome-CqribT6Z.js";
11
11
  import "./redact-1NGYV_8p.js";
12
12
  import { n as formatErrorMessage } from "./errors-CPfngF0S.js";
13
13
  import "./ssrf-CxfFyMRZ.js";
@@ -4,7 +4,7 @@ import { t as normalizeChatType } from "./chat-type-C_KiWNAH.js";
4
4
  import { _ as kindFromMime, d as detectMime, h as isAudioFileName, p as getFileExtension } from "./image-ops-CvJzsyvE.js";
5
5
  import { A as normalizeProviderId, L as normalizeGoogleModelId, i as resolveApiKeyForProvider, r as requireApiKey, y as resolveSymiAgentDir } from "./model-auth-64S8o7s-.js";
6
6
  import { d as DEFAULT_IMESSAGE_ATTACHMENT_ROOTS, f as isInboundPathAllowed, m as resolveIMessageAttachmentRoots, n as loadConfig, p as mergeInboundPathRoots } from "./config-CfZ-oKwR.js";
7
- import { S as ensureSymiModelsJson, t as describeImageWithModel } from "./image-xvVpGzK5.js";
7
+ import { S as ensureSymiModelsJson, t as describeImageWithModel } from "./image-ycxQmhff.js";
8
8
  import { n as collectProviderApiKeysForExecution, r as executeWithApiKeyRotation, t as parseGeminiAuth } from "./gemini-auth-DzFcFvHV.js";
9
9
  import { n as fetchWithTimeout } from "./fetch-timeout-DL3f_O53.js";
10
10
  import { i as fetchRemoteMedia, n as getDefaultMediaLocalRoots, o as fetchWithSsrFGuard, r as MediaFetchError } from "./local-roots-DMwIh5cS.js";
@@ -4,7 +4,7 @@ import { G as resolveSymiAgentDir, T as resolveApiKeyForProvider, c as normalize
4
4
  import { t as normalizeChatType } from "./chat-type-DFDuk3FY.js";
5
5
  import { _ as kindFromMime, d as detectMime, h as isAudioFileName, p as getFileExtension } from "./image-ops-ByaQt43P.js";
6
6
  import { d as DEFAULT_IMESSAGE_ATTACHMENT_ROOTS, f as isInboundPathAllowed, m as resolveIMessageAttachmentRoots, n as loadConfig, p as mergeInboundPathRoots } from "./config-diuFc3fL.js";
7
- import { S as ensureSymiModelsJson, t as describeImageWithModel } from "./image-EKTeO3aa.js";
7
+ import { S as ensureSymiModelsJson, t as describeImageWithModel } from "./image-CV4FUL4M.js";
8
8
  import { n as collectProviderApiKeysForExecution, r as executeWithApiKeyRotation, t as parseGeminiAuth } from "./gemini-auth-CrwifqcZ.js";
9
9
  import { n as fetchWithTimeout } from "./fetch-timeout-BheTNyes.js";
10
10
  import { i as fetchRemoteMedia, n as getDefaultMediaLocalRoots, o as fetchWithSsrFGuard, r as MediaFetchError } from "./local-roots-CC8jiKDk.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-DuWfOlkO.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-AKhKHxb6.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";
@@ -13,7 +13,7 @@ import { t as formatCliCommand } from "./command-format-BaxDnULz.js";
13
13
  import "./bindings-B7Ke6LJi.js";
14
14
  import "./send-Ct3wqNP6.js";
15
15
  import "./send-D0WfDllx.js";
16
- import "./deliver-Cgg1qwKP.js";
16
+ import "./deliver-CrlXl9KD.js";
17
17
  import "./diagnostic-CI0kRQkt.js";
18
18
  import "./diagnostic-session-state-Bxo4UHOL.js";
19
19
  import "./accounts-CWktKM8a.js";
@@ -23,10 +23,10 @@ import "./model-auth-64S8o7s-.js";
23
23
  import "./github-copilot-token-C_qUP7p5.js";
24
24
  import "./pi-model-discovery-DaNAekda.js";
25
25
  import "./message-channel-Dz5lr5b0.js";
26
- import { Ct as resolveGroupSessionKey, G as updateLastRoute, H as loadSessionStore, U as readSessionUpdatedAt, W as recordSessionMetaFromInbound } from "./pi-embedded-helpers-Cd124krQ.js";
26
+ import { Ct as resolveGroupSessionKey, G as updateLastRoute, H as loadSessionStore, U as readSessionUpdatedAt, W as recordSessionMetaFromInbound } from "./pi-embedded-helpers-DoTustDz.js";
27
27
  import { n as loadConfig } from "./config-CfZ-oKwR.js";
28
28
  import "./manifest-registry-D0IQ3WuX.js";
29
- import "./chrome-DM65TRMk.js";
29
+ import "./chrome-791kNCCB.js";
30
30
  import "./frontmatter-C_bv_0P8.js";
31
31
  import "./skills-BFekKL7i.js";
32
32
  import "./redact-jSxx6Ep2.js";
@@ -37,7 +37,7 @@ import { h as resolveChannelGroupRequireMention, m as resolveChannelGroupPolicy
37
37
  import "./accounts-qtxJ-6em.js";
38
38
  import { s as resolveStorePath } from "./paths-DLyHUt31.js";
39
39
  import "./tool-images-DXB7tqWi.js";
40
- import "./image-xvVpGzK5.js";
40
+ import "./image-ycxQmhff.js";
41
41
  import { c as resolveIdentityNamePrefix, l as resolveMessagePrefix, t as createReplyPrefixOptions } from "./reply-prefix-XlyuyChD.js";
42
42
  import "./manager-M83fJMDC.js";
43
43
  import "./gemini-auth-DzFcFvHV.js";
@@ -52,7 +52,7 @@ import "./render-CDCvpfhh.js";
52
52
  import "./commands-registry-BCRa0DAp.js";
53
53
  import "./skill-commands-DCDG7ki5.js";
54
54
  import { t as finalizeInboundContext } from "./inbound-context-BlHX0H3E.js";
55
- import { p as registerUnhandledRejectionHandler } from "./runner-CCo2QuJE.js";
55
+ import { p as registerUnhandledRejectionHandler } from "./runner-Cw5KZrjx.js";
56
56
  import "./fetch-Bso4i15F.js";
57
57
  import { n as recordChannelActivity } from "./channel-activity-CsM_hJ_s.js";
58
58
  import { t as convertMarkdownTables } from "./tables-DuZspiBu.js";
@@ -8,13 +8,13 @@ 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-02ObvVIR.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-DguKAKpR.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";
15
15
  import "./send-BPW99hCM.js";
16
16
  import "./send-DFVqIDB9.js";
17
- import "./deliver-EKA6SdgU.js";
17
+ import "./deliver-vWWI-94q.js";
18
18
  import "./diagnostic-D0xmLpej.js";
19
19
  import "./diagnostic-session-state-C1vRJs5w.js";
20
20
  import "./accounts-8zZqL37v.js";
@@ -22,10 +22,10 @@ import { G as formatLocationText, J as readChannelAllowFromStore, K as toLocatio
22
22
  import "./image-ops-ByaQt43P.js";
23
23
  import "./pi-model-discovery-j5tVLINv.js";
24
24
  import "./message-channel-BQINJQIT.js";
25
- import { Ct as resolveGroupSessionKey, H as loadSessionStore, K as updateLastRoute, U as readSessionUpdatedAt, W as recordSessionMetaFromInbound } from "./pi-embedded-helpers-B6ugLqkI.js";
25
+ import { Ct as resolveGroupSessionKey, H as loadSessionStore, K as updateLastRoute, U as readSessionUpdatedAt, W as recordSessionMetaFromInbound } from "./pi-embedded-helpers-SPJVuQfB.js";
26
26
  import { n as loadConfig } from "./config-diuFc3fL.js";
27
27
  import "./manifest-registry-D-mTF1cj.js";
28
- import "./chrome-DPHgzMPu.js";
28
+ import "./chrome-CqribT6Z.js";
29
29
  import "./skills-BNpGMnp-.js";
30
30
  import "./redact-1NGYV_8p.js";
31
31
  import "./errors-CPfngF0S.js";
@@ -35,7 +35,7 @@ import { h as resolveChannelGroupRequireMention, m as resolveChannelGroupPolicy
35
35
  import "./accounts-DImOt9jX.js";
36
36
  import { s as resolveStorePath } from "./paths-DkMamAQ-.js";
37
37
  import "./tool-images-ChC2CXaN.js";
38
- import "./image-EKTeO3aa.js";
38
+ import "./image-CV4FUL4M.js";
39
39
  import "./manager-CL7MzOkQ.js";
40
40
  import "./gemini-auth-CrwifqcZ.js";
41
41
  import "./sqlite-BNh23mUR.js";
@@ -49,7 +49,7 @@ import "./render-B1VqYyvo.js";
49
49
  import "./commands-registry-B_XO7lUV.js";
50
50
  import "./skill-commands-sj8KNio8.js";
51
51
  import { t as finalizeInboundContext } from "./inbound-context-QOi5vzUt.js";
52
- import { p as registerUnhandledRejectionHandler } from "./runner-BlTur7kC.js";
52
+ import { p as registerUnhandledRejectionHandler } from "./runner-Cx1wJumq.js";
53
53
  import "./fetch-DtLn7YU3.js";
54
54
  import { n as recordChannelActivity } from "./channel-activity-D9q-fIPB.js";
55
55
  import { t as convertMarkdownTables } from "./tables-COnZ169v.js";
@@ -1,6 +1,11 @@
1
1
  import { buildOauthProviderAuthResult, emptyPluginConfigSchema } from "symi/plugin-sdk";
2
2
  import type { AnyAgentTool, SymiPluginApi, ProviderAuthContext } from "../../src/plugins/types.js";
3
- import { loginOutlook } from "./src/auth.js";
3
+ import {
4
+ loginOutlook,
5
+ requestDeviceCode,
6
+ pollForDeviceCodeToken,
7
+ fetchUserProfile,
8
+ } from "./src/auth.js";
4
9
  import { saveCredentials, loadCredentials, deleteCredentials } from "./src/store.js";
5
10
  import {
6
11
  createOutlookListTool,
@@ -202,6 +207,105 @@ const outlookPlugin = {
202
207
  },
203
208
  { commands: ["outlook"] },
204
209
  );
210
+
211
+ // -------------------------------------------------------------------------
212
+ // Chat commands — /outlook login, /outlook logout, /outlook status
213
+ // Accessible from Telegram, Discord, WhatsApp, etc.
214
+ // -------------------------------------------------------------------------
215
+ api.registerCommand({
216
+ name: "outlook",
217
+ description: "Outlook 365 email — login, logout, status",
218
+ acceptsArgs: true,
219
+ handler: async (ctx) => {
220
+ const subcommand = ctx.args?.trim().split(/\s+/)[0]?.toLowerCase() ?? "";
221
+
222
+ if (subcommand === "login") {
223
+ const creds = loadCredentials();
224
+ if (creds && Date.now() < creds.expires) {
225
+ return {
226
+ text: `Already connected as ${creds.email ?? "unknown"}. Use /outlook logout to disconnect first.`,
227
+ };
228
+ }
229
+
230
+ try {
231
+ const deviceCode = await requestDeviceCode();
232
+
233
+ // Start polling in the background
234
+ const pollPromise = pollForDeviceCodeToken({
235
+ deviceCode: deviceCode.device_code,
236
+ intervalMs: (deviceCode.interval ?? 5) * 1000,
237
+ expiresInMs: (deviceCode.expires_in ?? 900) * 1000,
238
+ });
239
+
240
+ // Don't await — let it poll while user signs in
241
+ pollPromise
242
+ .then(async (tokens) => {
243
+ const profile = await fetchUserProfile(tokens.access);
244
+ saveCredentials({
245
+ access: tokens.access,
246
+ refresh: tokens.refresh,
247
+ expires: tokens.expires,
248
+ email: profile.email,
249
+ displayName: profile.displayName,
250
+ });
251
+ // The completion message will be picked up by the next interaction
252
+ api.logger.info(
253
+ `Outlook connected as ${profile.displayName ?? profile.email ?? "unknown"}`,
254
+ );
255
+ })
256
+ .catch((err) => {
257
+ api.logger.error(`Outlook login failed: ${String(err)}`);
258
+ });
259
+
260
+ return {
261
+ text: [
262
+ "Sign in to your Microsoft account:",
263
+ "",
264
+ `1. Go to: ${deviceCode.verification_uri}`,
265
+ `2. Enter code: **${deviceCode.user_code}**`,
266
+ "",
267
+ `Code expires in ${Math.floor(deviceCode.expires_in / 60)} minutes.`,
268
+ "I'll confirm once you've signed in.",
269
+ ].join("\n"),
270
+ };
271
+ } catch (err) {
272
+ return {
273
+ text: `Outlook login failed: ${err instanceof Error ? err.message : String(err)}`,
274
+ };
275
+ }
276
+ }
277
+
278
+ if (subcommand === "logout") {
279
+ const removed = deleteCredentials();
280
+ return { text: removed ? "Outlook disconnected." : "Outlook was not connected." };
281
+ }
282
+
283
+ if (subcommand === "status") {
284
+ const creds = loadCredentials();
285
+ if (!creds) {
286
+ return { text: "Outlook not connected. Send /outlook login to sign in." };
287
+ }
288
+ const expired = Date.now() >= creds.expires;
289
+ return {
290
+ text: [
291
+ `Account: ${creds.email ?? "unknown"}`,
292
+ `Name: ${creds.displayName ?? "unknown"}`,
293
+ `Token: ${expired ? "expired (will auto-refresh)" : "valid"}`,
294
+ ].join("\n"),
295
+ };
296
+ }
297
+
298
+ return {
299
+ text: [
300
+ "Outlook 365 commands:",
301
+ "",
302
+ "/outlook login — Sign in with Microsoft",
303
+ "/outlook logout — Disconnect",
304
+ "/outlook status — Show connection info",
305
+ ].join("\n"),
306
+ };
307
+ },
308
+ });
205
309
  },
206
310
  };
207
311