@symerian/symi 2.8.10 → 2.8.12

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 (177) hide show
  1. package/dist/{agents-BbVxJTp2.js → agents-OAonMxYV.js} +4 -4
  2. package/dist/{agents.config-LE2JxgiS.js → agents.config-BIhaDwT2.js} +1 -1
  3. package/dist/{agents.config-DckCExUX.js → agents.config-DGu_K5xz.js} +1 -1
  4. package/dist/{audio-preflight-NdNUAZ0y.js → audio-preflight-C6vpFnOG.js} +4 -4
  5. package/dist/{audio-preflight-rjCWpcfE.js → audio-preflight-Cb-T0r6e.js} +4 -4
  6. package/dist/{audit-CNU0I_UT.js → audit-Bi9Je9FZ.js} +1 -1
  7. package/dist/{audit-F5zQ_Wk9.js → audit-Oa5dsn5p.js} +1 -1
  8. package/dist/{auth-choice-j1FEYnxv.js → auth-choice-BvPX7B4c.js} +1 -1
  9. package/dist/{auth-choice-DnKOB8Gs.js → auth-choice-DDzWns1k.js} +1 -1
  10. package/dist/{banner-BFr8n0of.js → banner-BFdiq-O5.js} +1 -1
  11. package/dist/build-info.json +3 -3
  12. package/dist/bundled/boot-md/handler.js +7 -7
  13. package/dist/bundled/session-memory/handler.js +7 -7
  14. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  15. package/dist/{channel-options-DrBxsMlw.js → channel-options-DTqUB0OP.js} +1 -1
  16. package/dist/{channel-options-BtmFCQOB.js → channel-options-tfnOGSNF.js} +1 -1
  17. package/dist/{channel-web-YgdajAXX.js → channel-web-CcUXobcu.js} +1 -1
  18. package/dist/{channels-cli-fYbw-4gz.js → channels-cli-BcE5tHIr.js} +7 -7
  19. package/dist/{channels-cli-ChS_nQcP.js → channels-cli-CmShA-wJ.js} +7 -7
  20. package/dist/{chrome-BUT--ob3.js → chrome-B14NNyfm.js} +7 -7
  21. package/dist/{chrome-C08Z0XAa.js → chrome-ROtrXlNs.js} +7 -7
  22. package/dist/{cli-CA4qcSFY.js → cli-BxoD2wzk.js} +4 -4
  23. package/dist/{cli-NfoZJEPh.js → cli-CKG2iAr3.js} +4 -4
  24. package/dist/{command-registry-B6spVZMd.js → command-registry-D1Le-Fmh.js} +10 -10
  25. package/dist/{completion-cli-VQrV_JN9.js → completion-cli-D9pC-ttw.js} +2 -2
  26. package/dist/{completion-cli-DKoZNVbW.js → completion-cli-DgiFjSGS.js} +1 -1
  27. package/dist/{config-cli-CgC3xSoL.js → config-cli-5mFA0UDP.js} +1 -1
  28. package/dist/{config-cli-Dm2QMcwn.js → config-cli-C_uZQsTl.js} +1 -1
  29. package/dist/{configure-COCCg2tV.js → configure-BJcy7wXm.js} +3 -3
  30. package/dist/{configure-DiDXmX3E.js → configure-DuRTFCuW.js} +3 -3
  31. package/dist/{deliver-qUx-eLKt.js → deliver-B0OUq6RP.js} +1 -1
  32. package/dist/{deliver-B_Q_nWJV.js → deliver-D0bWiRCg.js} +1 -1
  33. package/dist/{doctor-completion-CPFKFTc-.js → doctor-completion-DCRTHpiY.js} +1 -1
  34. package/dist/{doctor-completion-BR5k35Qj.js → doctor-completion-sQVhKKei.js} +1 -1
  35. package/dist/entry.js +1 -1
  36. package/dist/extensionAPI.js +7 -7
  37. package/dist/{gateway-cli-BJH2K8fn.js → gateway-cli-C3ujhxO0.js} +13 -13
  38. package/dist/{gateway-cli-BF1-DFEf.js → gateway-cli-C_MT4JFm.js} +13 -13
  39. package/dist/{glass-ui-ws-B7j7iTDg.js → glass-ui-ws-B7zRY2BL.js} +11 -11
  40. package/dist/{glass-ui-ws-DyoHQW3O.js → glass-ui-ws-ColAiWUr.js} +11 -11
  41. package/dist/{health-D-0xOxV8.js → health-C12hy3Ao.js} +1 -1
  42. package/dist/{health-BAjSATWA.js → health-vKJZ7iJR.js} +1 -1
  43. package/dist/{hooks-cli-ZZaM2xfC.js → hooks-cli-CdUQvj8s.js} +5 -5
  44. package/dist/{hooks-cli-BaoCFIbQ.js → hooks-cli-fCPl5hur.js} +5 -5
  45. package/dist/{image-C6rCON9L.js → image-BuVL0jHI.js} +1 -1
  46. package/dist/{image-tzIqIuKx.js → image-MNvheU8U.js} +1 -1
  47. package/dist/index.js +9 -9
  48. package/dist/llm-slug-generator.js +7 -7
  49. package/dist/{manager-BpvcDr-7.js → manager-BJvYQ7xP.js} +1 -1
  50. package/dist/{manager-BxJ9BhQe.js → manager-CLrJn9l-.js} +1 -1
  51. package/dist/{manager-B5JWZL0E.js → manager-DHRBy5oR.js} +1 -1
  52. package/dist/{manager-DUuPE1N1.js → manager-Df_ZdrNG.js} +1 -1
  53. package/dist/{memory-cli-r-ulsUBa.js → memory-cli-BgJciaHC.js} +3 -3
  54. package/dist/{memory-cli-BQZ0rTKC.js → memory-cli-T-a5-lqZ.js} +3 -3
  55. package/dist/{models-B1__62Qo.js → models-BXXV_sZU.js} +2 -2
  56. package/dist/{models-cli-BGpB4PAp.js → models-cli-BI-DyItH.js} +5 -5
  57. package/dist/{models-cli-Ch-4PBud.js → models-cli-Bs6JAGq-.js} +6 -6
  58. package/dist/{onboard-D2NC88Mp.js → onboard-Czi_FRdi.js} +2 -2
  59. package/dist/{onboard-D_2-lyyt.js → onboard-DKDCWveE.js} +2 -2
  60. package/dist/{onboard-channels-CYlZtWF6.js → onboard-channels-BUCYZF02.js} +1 -1
  61. package/dist/{onboard-channels-BgA4i9TU.js → onboard-channels-sTuhQBVu.js} +1 -1
  62. package/dist/{onboarding-D7N2AfyJ.js → onboarding-Bgx0qZhA.js} +3 -3
  63. package/dist/{onboarding-uVLsv2Sd.js → onboarding-CokRRVEi.js} +3 -3
  64. package/dist/{onboarding.finalize-CTDv0xwp.js → onboarding.finalize-BCv5jB0d.js} +9 -9
  65. package/dist/{onboarding.finalize-DEjTjgRt.js → onboarding.finalize-BzEKyraI.js} +8 -8
  66. package/dist/{pi-embedded-HSRJqesT.js → pi-embedded-DXY7TLac.js} +27 -20
  67. package/dist/{pi-embedded-helpers-P13adotN.js → pi-embedded-helpers-D1_Sab0M.js} +4 -4
  68. package/dist/{pi-embedded-helpers-DjSdA5BG.js → pi-embedded-helpers-TcYQOZAY.js} +4 -4
  69. package/dist/{pi-tools.policy-BPVIDK7o.js → pi-tools.policy-BZrM6a-w.js} +8 -1
  70. package/dist/{pi-tools.policy-dbCkhLDL.js → pi-tools.policy-QIVWAVVI.js} +8 -1
  71. package/dist/{plugin-registry-Chvg6kT0.js → plugin-registry-B2cpTmJz.js} +1 -1
  72. package/dist/{plugin-registry-DEKq3ti3.js → plugin-registry-CyrsJDyE.js} +1 -1
  73. package/dist/plugin-sdk/{channel-web-CfaamthT.js → channel-web-t6enTxNE.js} +1 -1
  74. package/dist/plugin-sdk/index.js +3 -3
  75. package/dist/plugin-sdk/{manager-B3jEviU1.js → manager-LRE7zEk2.js} +1 -1
  76. package/dist/plugin-sdk/{reply-DWwxgBtH.js → reply-JypoGhql.js} +13 -6
  77. package/dist/plugin-sdk/{synthesis-C_u94H_P.js → synthesis-_WpVyZKx.js} +2 -2
  78. package/dist/plugin-sdk/{web-DFvYfej5.js → web-BTVj4kiQ.js} +3 -3
  79. package/dist/{plugins-cli-QZlpLtva.js → plugins-cli-B-zoQyqU.js} +5 -5
  80. package/dist/{plugins-cli-Cd99p333.js → plugins-cli-DJwRd3EZ.js} +5 -5
  81. package/dist/{program-viRCc6Je.js → program-H7h6Iqrq.js} +10 -10
  82. package/dist/{program-context-Dun-c3nf.js → program-context-BgecQAHU.js} +19 -19
  83. package/dist/{prompt-select-styled-DVLibGeR.js → prompt-select-styled-BDN2o35i.js} +6 -6
  84. package/dist/{prompt-select-styled-W2G26g34.js → prompt-select-styled-BglmD29e.js} +6 -6
  85. package/dist/{provider-auth-helpers-KFQclkJT.js → provider-auth-helpers-BGIgr7xM.js} +1 -1
  86. package/dist/{provider-auth-helpers-DCEiDG3X.js → provider-auth-helpers-MfKmTeLY.js} +1 -1
  87. package/dist/{push-apns-tfhjtI57.js → push-apns-IcfSTzfr.js} +1 -1
  88. package/dist/{push-apns-CB_8WzQ9.js → push-apns-b6bH1EBC.js} +1 -1
  89. package/dist/{pw-ai-CQtaPvM8.js → pw-ai-40Jf9QIb.js} +1 -1
  90. package/dist/{pw-ai-CeWN4iD9.js → pw-ai-DWkC5eGA.js} +1 -1
  91. package/dist/{register.agent--QTUjLu9.js → register.agent-BgyETrrj.js} +8 -8
  92. package/dist/{register.agent-i2wi1-vo.js → register.agent-ChwMSIC4.js} +9 -9
  93. package/dist/{register.configure-B9JysEK8.js → register.configure-Bm4CvoLF.js} +9 -9
  94. package/dist/{register.configure-ByJcC9t4.js → register.configure-DH3L2tqW.js} +9 -9
  95. package/dist/{register.maintenance-DqJL_QWT.js → register.maintenance-BbOBw1eI.js} +10 -10
  96. package/dist/{register.maintenance-BGiYxRYm.js → register.maintenance-CAyHUEzP.js} +11 -11
  97. package/dist/{register.message-G6-UeGON.js → register.message-DQ3MOWFE.js} +5 -5
  98. package/dist/{register.message-DT_TqsFl.js → register.message-DheqsiR0.js} +5 -5
  99. package/dist/{register.onboard-CfySx27T.js → register.onboard-CxqR4S1C.js} +7 -7
  100. package/dist/{register.onboard-848EXgTB.js → register.onboard-DOJkUhoY.js} +7 -7
  101. package/dist/{register.setup-B40A19lI.js → register.setup-48YBHzMZ.js} +7 -7
  102. package/dist/{register.setup-C-NYSAGY.js → register.setup-zdrIJA2P.js} +7 -7
  103. package/dist/{register.status-health-sessions-B03EDfwZ.js → register.status-health-sessions-CeT5pVXb.js} +7 -7
  104. package/dist/{register.status-health-sessions-BACExyrd.js → register.status-health-sessions-CimrhScH.js} +7 -7
  105. package/dist/{register.subclis-kF8KnNuq.js → register.subclis-B-zh940S.js} +10 -10
  106. package/dist/{reply-C5VU6T-F.js → reply-CUR4xpYM.js} +5 -5
  107. package/dist/{run-main-BqpvNq8c.js → run-main-CW_kj5Lj.js} +18 -18
  108. package/dist/{runner-Dpjulwnm.js → runner-DFuAePEr.js} +1 -1
  109. package/dist/{runner-D633VT13.js → runner-ecX1WzDt.js} +1 -1
  110. package/dist/{security-cli-ChPAyhec.js → security-cli-BpnzAB5_.js} +2 -2
  111. package/dist/{security-cli-Cq56CAVI.js → security-cli-D9WEiEjD.js} +2 -2
  112. package/dist/{server-methods-DjB0hxeW.js → server-methods-C1h0A5n0.js} +39 -15
  113. package/dist/{server-methods-CkLzZq0Y.js → server-methods-C4id-H_X.js} +39 -15
  114. package/dist/{server-node-events-BM-APRHy.js → server-node-events-BPZEGV_N.js} +5 -5
  115. package/dist/{server-node-events-ZgCh4sCg.js → server-node-events-CD2yDaEj.js} +5 -5
  116. package/dist/{status-WMQ2CpbK.js → status-Cb932Vl4.js} +4 -4
  117. package/dist/{status-C_gwgMp4.js → status-DCeW2a07.js} +4 -4
  118. package/dist/{status-BhQk3JSz.js → status-DvHD1cnq.js} +1 -1
  119. package/dist/{status-Nf53o222.js → status-_xBnHTlx.js} +1 -1
  120. package/dist/{subagent-registry-BCWbFTGF.js → subagent-registry-BKuL9PdW.js} +5 -5
  121. package/dist/{synthesis-VfWtSYrv.js → synthesis-BUqDGjlc.js} +7 -7
  122. package/dist/{synthesis-CJIAYDoU.js → synthesis-C9RputIi.js} +4 -4
  123. package/dist/{synthesis-CWsrtigA.js → synthesis-DOiTUsXQ.js} +7 -7
  124. package/dist/{synthesis-DIKBPZgB.js → synthesis-Ia9egx87.js} +4 -4
  125. package/dist/{unified-runner-yPBTU4xt.js → unified-runner-CVItnwwP.js} +27 -20
  126. package/dist/{update-cli-BCFHfhUW.js → update-cli-ChEABesZ.js} +11 -11
  127. package/dist/{update-cli-B_Mxicbw.js → update-cli-D6ax3jSX.js} +10 -10
  128. package/dist/{update-runner-DG5x7t--.js → update-runner-B2EY9BWM.js} +1 -1
  129. package/dist/{update-runner-BQJSshFU.js → update-runner-CWG6GxKs.js} +1 -1
  130. package/dist/{web-TVVa5EDS.js → web-CpSE67Jp.js} +5 -5
  131. package/dist/{web-Dpfsnk-b.js → web-D6PPeyG7.js} +4 -4
  132. package/dist/{web-eJWNRwV5.js → web-DMdb2p-h.js} +7 -7
  133. package/dist/{web-D9_FatXM.js → web-z-yQ8riS.js} +7 -7
  134. package/docs/reference/templates/AGENTS.md +14 -0
  135. package/extensions/bluebubbles/package.json +1 -1
  136. package/extensions/copilot-proxy/package.json +1 -1
  137. package/extensions/diagnostics-otel/package.json +1 -1
  138. package/extensions/discord/package.json +1 -1
  139. package/extensions/feishu/package.json +1 -1
  140. package/extensions/google-antigravity-auth/package.json +1 -1
  141. package/extensions/google-gemini-cli-auth/package.json +1 -1
  142. package/extensions/googlechat/package.json +1 -1
  143. package/extensions/imessage/package.json +1 -1
  144. package/extensions/irc/package.json +1 -1
  145. package/extensions/learning-loop/package.json +1 -1
  146. package/extensions/line/package.json +1 -1
  147. package/extensions/llm-task/package.json +1 -1
  148. package/extensions/matrix/CHANGELOG.md +12 -0
  149. package/extensions/matrix/package.json +1 -1
  150. package/extensions/mattermost/package.json +1 -1
  151. package/extensions/memory-core/package.json +1 -1
  152. package/extensions/memory-lancedb/package.json +1 -1
  153. package/extensions/minimax-portal-auth/package.json +1 -1
  154. package/extensions/msteams/CHANGELOG.md +12 -0
  155. package/extensions/msteams/package.json +1 -1
  156. package/extensions/nextcloud-talk/package.json +1 -1
  157. package/extensions/nostr/CHANGELOG.md +12 -0
  158. package/extensions/nostr/package.json +1 -1
  159. package/extensions/open-prose/package.json +1 -1
  160. package/extensions/outlook/index.ts +81 -7
  161. package/extensions/outlook/package.json +1 -1
  162. package/extensions/outlook/src/store.ts +118 -11
  163. package/extensions/pipeline/package.json +1 -1
  164. package/extensions/signal/package.json +1 -1
  165. package/extensions/slack/package.json +1 -1
  166. package/extensions/telegram/package.json +1 -1
  167. package/extensions/tlon/package.json +1 -1
  168. package/extensions/twitch/CHANGELOG.md +12 -0
  169. package/extensions/twitch/package.json +1 -1
  170. package/extensions/voice-call/CHANGELOG.md +12 -0
  171. package/extensions/voice-call/package.json +1 -1
  172. package/extensions/whatsapp/package.json +1 -1
  173. package/extensions/zalo/CHANGELOG.md +12 -0
  174. package/extensions/zalo/package.json +1 -1
  175. package/extensions/zalouser/CHANGELOG.md +12 -0
  176. package/extensions/zalouser/package.json +1 -1
  177. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
1
  import fs from "node:fs";
2
+ import os from "node:os";
2
3
  import path from "node:path";
3
4
  import { refreshAccessToken } from "./auth.js";
4
5
 
@@ -9,34 +10,105 @@ export type OutlookCredentials = {
9
10
  email?: string;
10
11
  displayName?: string;
11
12
  updatedAt?: string;
13
+ /**
14
+ * Unix ms of the most recent moment we KNOW the refresh token worked —
15
+ * set on OAuth-flow success and on every successful refreshAccessToken.
16
+ * Consumed by `resolveConnectionState` to tell the difference between
17
+ * "we hold a refresh string" (previous weak check) and "the refresh
18
+ * string actually produced a valid access token recently." If this
19
+ * field is absent on an existing credentials file (pre-2.8.11), we
20
+ * treat it as "never verified" and the state falls back to "stale" —
21
+ * a safe default that surfaces the uncertainty rather than silently
22
+ * claiming "connected."
23
+ */
24
+ lastVerifiedAt?: number;
12
25
  };
13
26
 
14
- const STORE_DIR = path.join(
15
- process.env.HOME || process.env.USERPROFILE || "/tmp",
16
- ".symi",
17
- "credentials",
18
- );
27
+ /**
28
+ * How long a successful refresh is trusted before we downgrade the
29
+ * reported connection state to "stale" (still usable — the next tool
30
+ * call will attempt a refresh — but the system prompt hedges the claim
31
+ * so the agent doesn't assert a connection that may have been
32
+ * invalidated upstream).
33
+ */
34
+ export const REFRESH_TRUST_WINDOW_MS = 24 * 60 * 60 * 1000;
35
+
36
+ /**
37
+ * Tri-state connection classification. Consumed by the plugin's system-
38
+ * prompt injection (extensions/outlook/index.ts) and by the gateway
39
+ * status RPC (src/gateway/server-methods/channels.ts) so both surface
40
+ * the same truth.
41
+ *
42
+ * - valid access token still inside its expiry window
43
+ * - trusted access expired, but refresh was verified < 24h ago
44
+ * - stale access expired, refresh never verified or > 24h ago
45
+ * (still attempt refresh on next tool call; may or may
46
+ * not succeed — Microsoft could have invalidated the
47
+ * refresh token without telling us)
48
+ * - not-connected no credentials on disk, or creds file is unreadable
49
+ */
50
+ export type OutlookConnectionState = "valid" | "trusted" | "stale" | "not-connected";
51
+
52
+ function resolveHome(): string {
53
+ const home = os.homedir();
54
+ if (home && home.length > 0) {
55
+ return home;
56
+ }
57
+ // Defence-in-depth — os.homedir() is the canonical resolution and
58
+ // consults /etc/passwd / platform APIs before falling back to the env.
59
+ // If it returns empty, environment variables are the next-best bet.
60
+ // Absolute last resort is /var/symi rather than /tmp — /tmp is purged
61
+ // by the OS on a cadence that silently eats OAuth tokens.
62
+ return process.env.HOME || process.env.USERPROFILE || "/var/symi";
63
+ }
64
+
65
+ export function getStoreDir(): string {
66
+ return path.join(resolveHome(), ".symi", "credentials");
67
+ }
19
68
 
20
- const STORE_PATH = path.join(STORE_DIR, "outlook.json");
69
+ export function getStorePath(): string {
70
+ return path.join(getStoreDir(), "outlook.json");
71
+ }
21
72
 
22
73
  export function loadCredentials(): OutlookCredentials | null {
23
74
  try {
24
- const data = fs.readFileSync(STORE_PATH, "utf-8");
75
+ const data = fs.readFileSync(getStorePath(), "utf-8");
25
76
  return JSON.parse(data) as OutlookCredentials;
26
77
  } catch {
27
78
  return null;
28
79
  }
29
80
  }
30
81
 
82
+ /**
83
+ * Atomic write: tmp file + fsync + rename. Prevents torn writes if the
84
+ * process crashes mid-save (which would otherwise leave a zero-byte
85
+ * file and look like a missing credential to every subsequent load).
86
+ *
87
+ * Caller contract: every save is VERIFIED — saveCredentials only runs
88
+ * after a successful OAuth flow or successful refreshAccessToken, so
89
+ * stamping `lastVerifiedAt = now` unconditionally is correct. If a
90
+ * future code path needs to save unverified credentials (e.g. partial
91
+ * OAuth in progress), introduce a separate saveUnverifiedCredentials
92
+ * that skips the stamp.
93
+ */
31
94
  export function saveCredentials(creds: OutlookCredentials): void {
32
- fs.mkdirSync(STORE_DIR, { recursive: true });
33
- creds.updatedAt = new Date().toISOString();
34
- fs.writeFileSync(STORE_PATH, JSON.stringify(creds, null, 2), { mode: 0o600 });
95
+ const dir = getStoreDir();
96
+ fs.mkdirSync(dir, { recursive: true });
97
+ const now = Date.now();
98
+ const stamped: OutlookCredentials = {
99
+ ...creds,
100
+ updatedAt: new Date(now).toISOString(),
101
+ lastVerifiedAt: now,
102
+ };
103
+ const finalPath = getStorePath();
104
+ const tmpPath = `${finalPath}.tmp-${process.pid}-${now}`;
105
+ fs.writeFileSync(tmpPath, JSON.stringify(stamped, null, 2), { mode: 0o600 });
106
+ fs.renameSync(tmpPath, finalPath);
35
107
  }
36
108
 
37
109
  export function deleteCredentials(): boolean {
38
110
  try {
39
- fs.unlinkSync(STORE_PATH);
111
+ fs.unlinkSync(getStorePath());
40
112
  return true;
41
113
  } catch {
42
114
  return false;
@@ -46,6 +118,12 @@ export function deleteCredentials(): boolean {
46
118
  /**
47
119
  * Returns a valid access token, refreshing if expired.
48
120
  * Throws if no credentials stored or refresh fails.
121
+ *
122
+ * On successful refresh, re-saves credentials — which re-stamps
123
+ * `lastVerifiedAt` via the saveCredentials contract. This is how
124
+ * `stale` transitions back to `trusted` (and the agent's system-
125
+ * prompt block flips back to the unqualified "Connected as X" form)
126
+ * as soon as a tool call succeeds.
49
127
  */
50
128
  export async function getAccessToken(): Promise<string> {
51
129
  const creds = loadCredentials();
@@ -70,3 +148,32 @@ export async function getAccessToken(): Promise<string> {
70
148
  });
71
149
  return refreshed.access;
72
150
  }
151
+
152
+ /**
153
+ * Classify the current connection based on the credential state — used
154
+ * by both the plugin's `before_prompt_build` hook and the gateway's
155
+ * `channels.status` RPC so both surfaces agree on the truth.
156
+ *
157
+ * See the OutlookConnectionState doc for the meaning of each state.
158
+ */
159
+ export function resolveConnectionState(
160
+ creds: OutlookCredentials | null,
161
+ now: number = Date.now(),
162
+ ): OutlookConnectionState {
163
+ if (!creds) {
164
+ return "not-connected";
165
+ }
166
+ if (typeof creds.expires === "number" && now < creds.expires) {
167
+ return "valid";
168
+ }
169
+ if (
170
+ typeof creds.lastVerifiedAt === "number" &&
171
+ now - creds.lastVerifiedAt < REFRESH_TRUST_WINDOW_MS
172
+ ) {
173
+ return "trusted";
174
+ }
175
+ if (typeof creds.refresh === "string" && creds.refresh.length > 0) {
176
+ return "stale";
177
+ }
178
+ return "not-connected";
179
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symi/pipeline",
3
- "version": "2.8.10",
3
+ "version": "2.8.12",
4
4
  "description": "Pipeline workflow tool plugin (typed pipelines + resumable approvals)",
5
5
  "type": "module",
6
6
  "symi": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symi/signal",
3
- "version": "2.8.10",
3
+ "version": "2.8.12",
4
4
  "private": true,
5
5
  "description": "Symi Signal channel plugin",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symi/slack",
3
- "version": "2.8.10",
3
+ "version": "2.8.12",
4
4
  "private": true,
5
5
  "description": "Symi Slack channel plugin",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symi/telegram",
3
- "version": "2.8.10",
3
+ "version": "2.8.12",
4
4
  "private": true,
5
5
  "description": "Symi Telegram channel plugin",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symi/tlon",
3
- "version": "2.8.10",
3
+ "version": "2.8.12",
4
4
  "private": true,
5
5
  "description": "Symi Tlon/Urbit channel plugin",
6
6
  "type": "module",
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.8.12
4
+
5
+ ### Changes
6
+
7
+ - Version alignment with core Symi release numbers.
8
+
9
+ ## 2.8.11
10
+
11
+ ### Changes
12
+
13
+ - Version alignment with core Symi release numbers.
14
+
3
15
  ## 2.8.10
4
16
 
5
17
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symi/twitch",
3
- "version": "2.8.10",
3
+ "version": "2.8.12",
4
4
  "private": true,
5
5
  "description": "Symi Twitch channel plugin",
6
6
  "type": "module",
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.8.12
4
+
5
+ ### Changes
6
+
7
+ - Version alignment with core Symi release numbers.
8
+
9
+ ## 2.8.11
10
+
11
+ ### Changes
12
+
13
+ - Version alignment with core Symi release numbers.
14
+
3
15
  ## 2.8.10
4
16
 
5
17
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symi/voice-call",
3
- "version": "2.8.10",
3
+ "version": "2.8.12",
4
4
  "description": "Symi voice-call plugin",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symi/whatsapp",
3
- "version": "2.8.10",
3
+ "version": "2.8.12",
4
4
  "private": true,
5
5
  "description": "Symi WhatsApp channel plugin",
6
6
  "type": "module",
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.8.12
4
+
5
+ ### Changes
6
+
7
+ - Version alignment with core Symi release numbers.
8
+
9
+ ## 2.8.11
10
+
11
+ ### Changes
12
+
13
+ - Version alignment with core Symi release numbers.
14
+
3
15
  ## 2.8.10
4
16
 
5
17
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symi/zalo",
3
- "version": "2.8.10",
3
+ "version": "2.8.12",
4
4
  "description": "Symi Zalo channel plugin",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.8.12
4
+
5
+ ### Changes
6
+
7
+ - Version alignment with core Symi release numbers.
8
+
9
+ ## 2.8.11
10
+
11
+ ### Changes
12
+
13
+ - Version alignment with core Symi release numbers.
14
+
3
15
  ## 2.8.10
4
16
 
5
17
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symi/zalouser",
3
- "version": "2.8.10",
3
+ "version": "2.8.12",
4
4
  "description": "Symi Zalo Personal Account plugin via zca-cli",
5
5
  "type": "module",
6
6
  "dependencies": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symerian/symi",
3
- "version": "2.8.10",
3
+ "version": "2.8.12",
4
4
  "description": "Multi-channel AI gateway with extensible messaging integrations",
5
5
  "keywords": [],
6
6
  "homepage": "https://github.com/jaysteelmind/symi#readme",