@symerian/symi 2.1.6 → 2.1.8

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 (98) hide show
  1. package/dist/{acp-cli-BiMkLDR4.js → acp-cli-vT1oZCVL.js} +2 -2
  2. package/dist/{agents.config-BXOMgfH8.js → agents.config-DzA8rWnM.js} +1 -1
  3. package/dist/{audio-preflight-BgsqiU2t.js → audio-preflight-1yi0nb1v.js} +8 -8
  4. package/dist/{audio-preflight-5NsCxagO.js → audio-preflight-BZIRAXlv.js} +4 -4
  5. package/dist/{audit-oRSxjF4Y.js → audit-CxLSBkyf.js} +5 -5
  6. package/dist/{auth-choice-CtkUWEzS.js → auth-choice-Bcu1W1bS.js} +4 -4
  7. package/dist/{browser-cli-DNkgkAuj.js → browser-cli-CF7WrAl5.js} +3 -3
  8. package/dist/build-info.json +3 -3
  9. package/dist/bundled/boot-md/handler.js +6 -6
  10. package/dist/bundled/session-memory/handler.js +6 -6
  11. package/dist/{call-CZPSJe5I.js → call-BQIBy8Tt.js} +1 -1
  12. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  13. package/dist/{channel-options-hRv5uC1D.js → channel-options-Dg8qatef.js} +1 -1
  14. package/dist/{channel-web-Dk4amkbo.js → channel-web-BWdWLBcD.js} +2 -2
  15. package/dist/{channels-cli-D3xSNJol.js → channels-cli-B9_P7h5c.js} +19 -19
  16. package/dist/{chrome-DM65TRMk.js → chrome-791kNCCB.js} +7 -7
  17. package/dist/{chrome-KILXYAkl.js → chrome-CJZsCHQH.js} +7 -7
  18. package/dist/{cli-d7xCa4Lk.js → cli-DvfhqWwR.js} +16 -16
  19. package/dist/{client-CQSyCS4M.js → client-Z6SFrwob.js} +3 -3
  20. package/dist/{completion-cli-C8LvKSCg.js → completion-cli-Ch4L91ix.js} +1 -1
  21. package/dist/{config-cli-oty7UgRW.js → config-cli-B9uXxJg3.js} +1 -1
  22. package/dist/{configure-BktcEJpM.js → configure-DcNhZaKX.js} +8 -8
  23. package/dist/{control-service-DPKlnETj.js → control-service-G76172X8.js} +3 -3
  24. package/dist/{cron-cli-DugQ4zba.js → cron-cli-DJhLBeA1.js} +3 -3
  25. package/dist/{daemon-cli-ReIMAwZL.js → daemon-cli-CwefaVx1.js} +2 -2
  26. package/dist/{deliver-Cgg1qwKP.js → deliver-CrlXl9KD.js} +1 -1
  27. package/dist/{deliver-ezw61fxU.js → deliver-DhcAHw6f.js} +1 -1
  28. package/dist/{devices-cli-BD4P6j_3.js → devices-cli-BBRC971g.js} +2 -2
  29. package/dist/{doctor-completion-vMwRMzvX.js → doctor-completion-DpSaxE2c.js} +1 -1
  30. package/dist/{exec-approvals-cli-BwCy8654.js → exec-approvals-cli-DPmmO3M_.js} +4 -4
  31. package/dist/{gateway-cli-BCUBz0r7.js → gateway-cli-CGlLcg5W.js} +28 -28
  32. package/dist/{gateway-rpc-DbGqu2XI.js → gateway-rpc-B6LPqjdz.js} +1 -1
  33. package/dist/{glass-ui-ws-BVxkFkqP.js → glass-ui-ws-nfA4ysOL.js} +23 -23
  34. package/dist/{health-Dci8s5_s.js → health-DWxiqmQJ.js} +3 -3
  35. package/dist/{hooks-cli-BL_ExzSA.js → hooks-cli-Bkdca9pQ.js} +17 -17
  36. package/dist/{image-yg__zJJR.js → image-DguD2G3e.js} +1 -1
  37. package/dist/{image-xvVpGzK5.js → image-ycxQmhff.js} +1 -1
  38. package/dist/index.js +21 -21
  39. package/dist/llm-slug-generator.js +6 -6
  40. package/dist/{logs-cli-B-4s2xLq.js → logs-cli-DN6g7pB5.js} +3 -3
  41. package/dist/{model-catalog-Cr_E1v1f.js → model-catalog-Dib32CyX.js} +1 -1
  42. package/dist/{model-picker-DPsrrARn.js → model-picker-DhS9QBgv.js} +1 -1
  43. package/dist/{models-cli-AnsPkuSQ.js → models-cli-B2aJE7eN.js} +18 -18
  44. package/dist/{node-cli-B4XgCDP5.js → node-cli-DBSE1ho3.js} +6 -6
  45. package/dist/{nodes-cli-BFAaT-LN.js → nodes-cli-DTydh6Lw.js} +3 -3
  46. package/dist/{onboard-BEJwRR5X.js → onboard-BtsHZR4B.js} +5 -5
  47. package/dist/{onboard-channels-BK5dg-gk.js → onboard-channels-D-X56DJ8.js} +1 -1
  48. package/dist/{onboard-custom-BdK1IVud.js → onboard-custom-BjpcSbRk.js} +1 -1
  49. package/dist/{onboard-helpers-DN1zuxEX.js → onboard-helpers-68fgh87u.js} +1 -1
  50. package/dist/{onboard-remote-CIXcmClI.js → onboard-remote-D3ZqwA9f.js} +1 -1
  51. package/dist/{onboard-skills-DGLjSmKy.js → onboard-skills-FT6IHgfp.js} +1 -1
  52. package/dist/{onboarding-DITwhIyc.js → onboarding-9vscZiF3.js} +9 -9
  53. package/dist/{onboarding.finalize-Bv7v6UI4.js → onboarding.finalize-DZ_rRX08.js} +21 -21
  54. package/dist/{onboarding.gateway-config-BOkD7ZTV.js → onboarding.gateway-config-CcXyb2rj.js} +3 -3
  55. package/dist/{pi-auth-json-BMN17zl6.js → pi-auth-json-bYGFgsxc.js} +1 -1
  56. package/dist/{pi-embedded-DuWfOlkO.js → pi-embedded-AKhKHxb6.js} +16 -16
  57. package/dist/{pi-embedded-helpers-khMH03FT.js → pi-embedded-helpers-C6ML643R.js} +1 -1
  58. package/dist/{pi-embedded-helpers-Cd124krQ.js → pi-embedded-helpers-DoTustDz.js} +4 -4
  59. package/dist/{pi-tools.policy-YJHLQVvu.js → pi-tools.policy-Chetph_n.js} +1 -1
  60. package/dist/{plugin-registry-MahBcTZy.js → plugin-registry-Dm857EK_.js} +1 -1
  61. package/dist/{plugins-cli-Bjj-8xm-.js → plugins-cli-B_mApNL7.js} +17 -17
  62. package/dist/{program-context-DZdzIBJW.js → program-context-azGx1QUt.js} +30 -30
  63. package/dist/{prompt-select-styled-D55rh_wq.js → prompt-select-styled-DuBHnZi0.js} +8 -8
  64. package/dist/{provider-auth-helpers-CPBiRRJ7.js → provider-auth-helpers-B1A2z7Wq.js} +1 -1
  65. package/dist/{push-apns-B75DQQZi.js → push-apns-ByIng2X-.js} +1 -1
  66. package/dist/{pw-ai-DxQzfOiI.js → pw-ai-BIcOufAe.js} +1 -1
  67. package/dist/{pw-ai-CL_YRdbc.js → pw-ai-DIVguI36.js} +1 -1
  68. package/dist/{register.agent-1AMj0tWy.js → register.agent-slSgZnXa.js} +21 -21
  69. package/dist/{register.configure-BA5m1RN3.js → register.configure-Bv303J9I.js} +25 -25
  70. package/dist/{register.maintenance-CSMK8sqB.js → register.maintenance-C6qo-exc.js} +22 -22
  71. package/dist/{register.message-CT_zCczX.js → register.message-Ma-4EWdL.js} +17 -17
  72. package/dist/{register.onboard-HMhaJL1t.js → register.onboard-rUCRhXsi.js} +21 -21
  73. package/dist/{register.setup-KGs6Sa4o.js → register.setup-CockGerD.js} +21 -21
  74. package/dist/{register.status-health-sessions-C0Y8uSOv.js → register.status-health-sessions-CsBE-Npn.js} +19 -19
  75. package/dist/{reply-DHEXU7Cn.js → reply-OC2fwtMD.js} +23 -23
  76. package/dist/{routes-Bqu4HRi8.js → routes-Bj0eL3Q0.js} +2 -2
  77. package/dist/{rpc-ByQikXey.js → rpc-D1L9G69Q.js} +1 -1
  78. package/dist/{runner-h5ZwP1Uj.js → runner-B8kxK-2T.js} +2 -2
  79. package/dist/{runner-CCo2QuJE.js → runner-Cw5KZrjx.js} +1 -1
  80. package/dist/{sandbox-B47UASus.js → sandbox-C93Jz4VH.js} +3 -3
  81. package/dist/{sandbox-cli-CZjPwOz9.js → sandbox-cli-DZ3ou_3q.js} +4 -4
  82. package/dist/{security-cli-CQ3ChhHn.js → security-cli-DGgK4UWF.js} +8 -8
  83. package/dist/{server-context-DfM0b6MD.js → server-context-8Y28Gc1g.js} +4 -4
  84. package/dist/{server-methods-BCks-wpI.js → server-methods-DLYjRtbk.js} +14 -14
  85. package/dist/{server-node-events-BfwbEkoh.js → server-node-events-BXvhA5oG.js} +17 -17
  86. package/dist/{status-pU_AObZR.js → status-DSmMas06.js} +1 -1
  87. package/dist/{status-x9ATvv1I.js → status-ULagy5pI.js} +5 -5
  88. package/dist/{system-cli-BG-4fgem.js → system-cli-Ckf5utOC.js} +3 -3
  89. package/dist/{tui-DNtyJqbH.js → tui-DU8uSIS6.js} +3 -3
  90. package/dist/{tui-cli-CK3UZx8q.js → tui-cli-BaVcPxfw.js} +8 -8
  91. package/dist/{update-cli-DyEVfV97.js → update-cli-0rovqj0x.js} +23 -23
  92. package/dist/{update-runner-B2gtFGSb.js → update-runner-C2ymIFie.js} +1 -1
  93. package/dist/{web-CIc_459s.js → web-CAwp3iOn.js} +17 -17
  94. package/dist/{web-BFa88W3e.js → web-Kz-ZuUjq.js} +6 -6
  95. package/dist/{with-timeout-DAAdYGLS.js → with-timeout-Dz8rHtW4.js} +1 -1
  96. package/extensions/outlook/index.ts +117 -1
  97. package/extensions/outlook/src/auth.ts +91 -0
  98. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  import { u as resolveGatewayPort } from "./paths-Cqn-zk3M.js";
2
2
  import { B as theme, k as info, z as isRich } from "./utils-B-0b9bGM.js";
3
- import { Sr as peekSystemEvents, T as resolveSessionModelRef, U as readRestartSentinel, W as summarizeRestartSentinel, a as buildChannelSummary, bt as loadProviderUsageSummary, dr as lookupContextTokens, o as buildChannelAccountSnapshot, qt as sha256HexPrefix, s as formatChannelAllowFrom, v as classifySessionKey, xt as formatUsageReportLines, y as listAgentsForGateway } from "./reply-DHEXU7Cn.js";
3
+ import { Sr as peekSystemEvents, T as resolveSessionModelRef, U as readRestartSentinel, W as summarizeRestartSentinel, a as buildChannelSummary, bt as loadProviderUsageSummary, dr as lookupContextTokens, o as buildChannelAccountSnapshot, qt as sha256HexPrefix, s as formatChannelAllowFrom, v as classifySessionKey, xt as formatUsageReportLines, y as listAgentsForGateway } from "./reply-OC2fwtMD.js";
4
4
  import { S as parseAgentSessionKey } from "./session-key-DCt45XZa.js";
5
5
  import { t as resolveSymiPackageRoot } from "./symi-root-CrGJbkzf.js";
6
6
  import { n as runExec } from "./exec-CWkblSrI.js";
@@ -14,12 +14,12 @@ import { H as resolveMainSessionKey, R as resolveFreshSessionTotalTokens, o as l
14
14
  import { n as listChannelPlugins } from "./plugins-DKDeQZF0.js";
15
15
  import { c as resolveStorePath } from "./paths-CyhzMxFA.js";
16
16
  import { r as getMemorySearchManager } from "./memory-cli-Bi9_LIW8.js";
17
- import { n as callGateway, t as buildGatewayConnectionDetails } from "./call-CZPSJe5I.js";
17
+ import { n as callGateway, t as buildGatewayConnectionDetails } from "./call-BQIBy8Tt.js";
18
18
  import { n as formatTimeAgo } from "./format-relative-BXoxEQVN.js";
19
19
  import { n as withProgress } from "./progress-jIePzvGA.js";
20
20
  import { r as formatDurationPrecise } from "./format-duration-D0B0Uo-I.js";
21
21
  import { o as getRemoteSkillEligibility } from "./skill-commands-Dk1GQf3N.js";
22
- import { C as normalizeControlUiBasePath, g as resolveControlUiLinks } from "./onboard-helpers-DN1zuxEX.js";
22
+ import { C as normalizeControlUiBasePath, g as resolveControlUiLinks } from "./onboard-helpers-68fgh87u.js";
23
23
  import { t as buildWorkspaceSkillStatus } from "./skills-status-CURJKnyY.js";
24
24
  import { t as resolveChannelDefaultAccountId } from "./helpers-BcGbMZD1.js";
25
25
  import { t as collectChannelStatusIssues } from "./channels-status-issues-B_kBkl_u.js";
@@ -27,8 +27,8 @@ import { s as resolveGatewayLogPaths, t as resolveGatewayService } from "./servi
27
27
  import { t as formatRuntimeStatusWithDetails } from "./runtime-status-CR9445g5.js";
28
28
  import { t as readLastGatewayErrorLine } from "./diagnostics-BAMlsVVX.js";
29
29
  import { t as renderTable } from "./table-BTgkRafz.js";
30
- import { a as resolveGatewayProbeAuth$1, c as probeGateway, t as runSecurityAudit } from "./audit-oRSxjF4Y.js";
31
- import { a as resolveHeartbeatSummaryForAgent, t as formatHealthChannelLines } from "./health-Dci8s5_s.js";
30
+ import { a as resolveGatewayProbeAuth$1, c as probeGateway, t as runSecurityAudit } from "./audit-CxLSBkyf.js";
31
+ import { a as resolveHeartbeatSummaryForAgent, t as formatHealthChannelLines } from "./health-DWxiqmQJ.js";
32
32
  import { g as resolveUpdateChannelDisplay, i as formatGitInstallLabel, m as normalizeUpdateChannel, t as checkUpdateStatus } from "./update-check-CtckACbb.js";
33
33
  import { t as resolveNodeService } from "./node-service-Cxz4e-Qd.js";
34
34
  import { n as redactSecrets, t as formatGatewayAuthUsed } from "./format-yQZNwAF2.js";
@@ -11,12 +11,12 @@ import "./env-DPCHYPeH.js";
11
11
  import "./message-channel-aT-I_DTX.js";
12
12
  import "./config-BQmJMIWv.js";
13
13
  import "./manifest-registry-C4BxOMWX.js";
14
- import "./client-CQSyCS4M.js";
15
- import "./call-CZPSJe5I.js";
14
+ import "./client-Z6SFrwob.js";
15
+ import "./call-BQIBy8Tt.js";
16
16
  import "./pairing-token-CX3NN_qj.js";
17
17
  import { t as formatDocsLink } from "./links-3i1eUga4.js";
18
18
  import "./progress-jIePzvGA.js";
19
- import { n as callGatewayFromCli, t as addGatewayClientOptions } from "./gateway-rpc-DbGqu2XI.js";
19
+ import { n as callGatewayFromCli, t as addGatewayClientOptions } from "./gateway-rpc-B6LPqjdz.js";
20
20
  import path from "node:path";
21
21
  import fs from "node:fs/promises";
22
22
 
@@ -4,12 +4,12 @@ import { l as stripAnsi, u as visibleWidth } from "./subsystem-D9vIQve0.js";
4
4
  import { l as resolveDefaultAgentId } from "./agent-scope-CgUHAtCo.js";
5
5
  import { f as GATEWAY_CLIENT_CAPS, h as GATEWAY_CLIENT_NAMES, m as GATEWAY_CLIENT_MODES } from "./message-channel-aT-I_DTX.js";
6
6
  import { H as VERSION, i as loadConfig } from "./config-BQmJMIWv.js";
7
- import { _ as formatRawAssistantErrorForUi } from "./pi-embedded-helpers-khMH03FT.js";
7
+ import { _ as formatRawAssistantErrorForUi } from "./pi-embedded-helpers-C6ML643R.js";
8
8
  import { k as stripLeadingInboundMetadata } from "./sessions-DXfNaNdy.js";
9
9
  import { n as resolveToolDisplay, t as formatToolDetail } from "./tool-display-D8N3rsYt.js";
10
10
  import { a as listChatCommandsForConfig, i as listChatCommands } from "./commands-registry-Km-DI95L.js";
11
- import { kt as PROTOCOL_VERSION, t as GatewayClient } from "./client-CQSyCS4M.js";
12
- import { i as ensureExplicitGatewayAuth, o as resolveExplicitGatewayAuth, t as buildGatewayConnectionDetails } from "./call-CZPSJe5I.js";
11
+ import { kt as PROTOCOL_VERSION, t as GatewayClient } from "./client-Z6SFrwob.js";
12
+ import { i as ensureExplicitGatewayAuth, o as resolveExplicitGatewayAuth, t as buildGatewayConnectionDetails } from "./call-BQIBy8Tt.js";
13
13
  import { n as formatTimeAgo, t as formatRelativeTimestamp } from "./format-relative-BXoxEQVN.js";
14
14
  import { n as formatTokenCount } from "./usage-format-BzKEDn0q.js";
15
15
  import chalk from "chalk";
@@ -12,15 +12,15 @@ import "./env-DPCHYPeH.js";
12
12
  import "./message-channel-aT-I_DTX.js";
13
13
  import "./config-BQmJMIWv.js";
14
14
  import "./manifest-registry-C4BxOMWX.js";
15
- import "./pi-embedded-helpers-khMH03FT.js";
16
- import "./sandbox-B47UASus.js";
17
- import "./chrome-KILXYAkl.js";
15
+ import "./pi-embedded-helpers-C6ML643R.js";
16
+ import "./sandbox-C93Jz4VH.js";
17
+ import "./chrome-CJZsCHQH.js";
18
18
  import "./tailscale-D5dKabOc.js";
19
19
  import "./auth-B741uFtk.js";
20
- import "./server-context-DfM0b6MD.js";
20
+ import "./server-context-8Y28Gc1g.js";
21
21
  import "./frontmatter-DWQhtOo7.js";
22
22
  import "./skills-6jdJQ5ZL.js";
23
- import "./routes-Bqu4HRi8.js";
23
+ import "./routes-Bj0eL3Q0.js";
24
24
  import "./redact-f-Q-hFt_.js";
25
25
  import "./errors-BF3TeRH2.js";
26
26
  import "./fs-safe-CUjO1ca2.js";
@@ -43,12 +43,12 @@ import "./tool-images-DvUBlqjX.js";
43
43
  import "./tool-display-D8N3rsYt.js";
44
44
  import "./commands-BNLCWX6e.js";
45
45
  import "./commands-registry-Km-DI95L.js";
46
- import "./client-CQSyCS4M.js";
47
- import "./call-CZPSJe5I.js";
46
+ import "./client-Z6SFrwob.js";
47
+ import "./call-BQIBy8Tt.js";
48
48
  import "./pairing-token-CX3NN_qj.js";
49
49
  import { t as formatDocsLink } from "./links-3i1eUga4.js";
50
50
  import { t as parseTimeoutMs } from "./parse-timeout-C385GCpE.js";
51
- import { t as runTui } from "./tui-DNtyJqbH.js";
51
+ import { t as runTui } from "./tui-DU8uSIS6.js";
52
52
 
53
53
  //#region src/cli/tui-cli.ts
54
54
  function registerTuiCli(program) {
@@ -1,7 +1,7 @@
1
1
  import { g as resolveStateDir } from "./paths-Cqn-zk3M.js";
2
2
  import { B as theme, h as pathExists } from "./utils-B-0b9bGM.js";
3
3
  import "./thinking-EAliFiVK.js";
4
- import { G as trimLogTail } from "./reply-DHEXU7Cn.js";
4
+ import { G as trimLogTail } from "./reply-OC2fwtMD.js";
5
5
  import { t as resolveSymiPackageRoot } from "./symi-root-CrGJbkzf.js";
6
6
  import "./registry-Cja8eT7G.js";
7
7
  import { f as defaultRuntime } from "./subsystem-D9vIQve0.js";
@@ -16,19 +16,19 @@ import "./message-channel-aT-I_DTX.js";
16
16
  import "./send-CpxUlSq0.js";
17
17
  import { l as writeConfigFile, o as readConfigFileSnapshot } from "./config-BQmJMIWv.js";
18
18
  import "./manifest-registry-C4BxOMWX.js";
19
- import "./runner-h5ZwP1Uj.js";
20
- import "./image-yg__zJJR.js";
19
+ import "./runner-B8kxK-2T.js";
20
+ import "./image-DguD2G3e.js";
21
21
  import "./models-config-DQTsmVR2.js";
22
22
  import "./pi-model-discovery-4uUnLc3n.js";
23
- import "./pi-embedded-helpers-khMH03FT.js";
24
- import "./sandbox-B47UASus.js";
25
- import "./chrome-KILXYAkl.js";
23
+ import "./pi-embedded-helpers-C6ML643R.js";
24
+ import "./sandbox-C93Jz4VH.js";
25
+ import "./chrome-CJZsCHQH.js";
26
26
  import "./tailscale-D5dKabOc.js";
27
27
  import "./auth-B741uFtk.js";
28
- import "./server-context-DfM0b6MD.js";
28
+ import "./server-context-8Y28Gc1g.js";
29
29
  import "./frontmatter-DWQhtOo7.js";
30
30
  import "./skills-6jdJQ5ZL.js";
31
- import "./routes-Bqu4HRi8.js";
31
+ import "./routes-Bj0eL3Q0.js";
32
32
  import "./redact-f-Q-hFt_.js";
33
33
  import "./errors-BF3TeRH2.js";
34
34
  import "./fs-safe-CUjO1ca2.js";
@@ -54,10 +54,10 @@ import "./fetch-guard-DOPkVbh3.js";
54
54
  import "./api-key-rotation-CVUq_rfN.js";
55
55
  import "./local-roots-aAFLQGkY.js";
56
56
  import "./sqlite-Dx3J_aSE.js";
57
- import "./model-catalog-Cr_E1v1f.js";
57
+ import "./model-catalog-Dib32CyX.js";
58
58
  import "./tokens-BuceUQDl.js";
59
- import "./with-timeout-DAAdYGLS.js";
60
- import "./deliver-ezw61fxU.js";
59
+ import "./with-timeout-Dz8rHtW4.js";
60
+ import "./deliver-DhcAHw6f.js";
61
61
  import "./diagnostic-DjBRPfu9.js";
62
62
  import "./diagnostic-session-state-CUslJyKP.js";
63
63
  import "./send-YsPVgB2E.js";
@@ -73,8 +73,8 @@ import "./ir-DZam9q5M.js";
73
73
  import "./render-CXDO_kgw.js";
74
74
  import "./commands-BNLCWX6e.js";
75
75
  import "./commands-registry-Km-DI95L.js";
76
- import "./client-CQSyCS4M.js";
77
- import "./call-CZPSJe5I.js";
76
+ import "./client-Z6SFrwob.js";
77
+ import "./call-BQIBy8Tt.js";
78
78
  import "./pairing-token-CX3NN_qj.js";
79
79
  import "./channel-activity-BOiuJS3t.js";
80
80
  import "./fetch-DTNGXEzX.js";
@@ -95,18 +95,18 @@ import "./outbound-attachment-D_QuKi8U.js";
95
95
  import "./delivery-queue-Df1uodAG.js";
96
96
  import "./session-cost-usage-BG4AXrGN.js";
97
97
  import "./send-p1qmy2uO.js";
98
- import "./onboard-helpers-DN1zuxEX.js";
98
+ import "./onboard-helpers-68fgh87u.js";
99
99
  import { n as stylePromptMessage } from "./prompt-style-8JqOYj0q.js";
100
100
  import "./pairing-labels-Lc04d2Gd.js";
101
101
  import "./exec-approvals-Kn31mBcW.js";
102
102
  import "./nodes-screen-VBGXKdLk.js";
103
- import "./pi-tools.policy-YJHLQVvu.js";
104
- import "./control-service-DPKlnETj.js";
103
+ import "./pi-tools.policy-Chetph_n.js";
104
+ import "./control-service-G76172X8.js";
105
105
  import "./stagger-BUClb97_.js";
106
106
  import { c as resolveGatewayLaunchAgentLabel, d as resolveGatewaySystemdServiceName, f as resolveGatewayWindowsTaskName } from "./constants-C8_BLnaW.js";
107
107
  import "./channel-selection-DuWs0Aak.js";
108
108
  import { r as parseSemver } from "./runtime-guard-B37eizu-.js";
109
- import "./program-context-DZdzIBJW.js";
109
+ import "./program-context-azGx1QUt.js";
110
110
  import "./catalog-RiADx7MA.js";
111
111
  import "./skills-status-CURJKnyY.js";
112
112
  import { n as inheritOptionFromParent } from "./command-options-BtDai3oC.js";
@@ -117,28 +117,28 @@ import "./npm-registry-spec-C2JDdSZS.js";
117
117
  import "./skill-scanner-CLs8u6vQ.js";
118
118
  import "./installs-C1Cebk97.js";
119
119
  import "./channels-status-issues-B_kBkl_u.js";
120
- import { r as installCompletion } from "./completion-cli-C8LvKSCg.js";
120
+ import { r as installCompletion } from "./completion-cli-Ch4L91ix.js";
121
121
  import "./daemon-runtime-DhXUlL_O.js";
122
122
  import "./systemd-riq8uNJQ.js";
123
123
  import { t as resolveGatewayService } from "./service-Cl74hx8J.js";
124
124
  import "./lifecycle-core-C9z2NJiC.js";
125
125
  import "./systemd-hints-aerTQahg.js";
126
- import { i as runDaemonInstall, r as runDaemonRestart } from "./daemon-cli-ReIMAwZL.js";
126
+ import { i as runDaemonInstall, r as runDaemonRestart } from "./daemon-cli-CwefaVx1.js";
127
127
  import "./diagnostics-BAMlsVVX.js";
128
128
  import { t as renderTable } from "./table-BTgkRafz.js";
129
- import "./health-Dci8s5_s.js";
129
+ import "./health-DWxiqmQJ.js";
130
130
  import "./control-ui-assets-Z947tKLt.js";
131
131
  import { a as resolveNpmChannelTag, c as DEFAULT_PACKAGE_CHANNEL, d as formatUpdateChannelLabel, g as resolveUpdateChannelDisplay, h as resolveEffectiveUpdateChannel, m as normalizeUpdateChannel, n as compareSemverStrings, r as fetchNpmTagVersion, s as DEFAULT_GIT_CHANNEL, t as checkUpdateStatus, u as channelToNpmTag } from "./update-check-CtckACbb.js";
132
132
  import "./dm-policy-shared-Ddfj0fRf.js";
133
133
  import { i as resolveUpdateAvailability, n as formatUpdateOneLiner, t as formatUpdateAvailableHint } from "./status.update-C7knJK9e.js";
134
- import { a as globalInstallArgs, c as readPackageVersion, i as detectGlobalInstallManagerForRoot, n as cleanupGlobalRenameDirs, o as resolveGlobalPackageRoot, r as detectGlobalInstallManagerByPresence, s as readPackageName, t as runGatewayUpdate } from "./update-runner-B2gtFGSb.js";
134
+ import { a as globalInstallArgs, c as readPackageVersion, i as detectGlobalInstallManagerForRoot, n as cleanupGlobalRenameDirs, o as resolveGlobalPackageRoot, r as detectGlobalInstallManagerByPresence, s as readPackageName, t as runGatewayUpdate } from "./update-runner-C2ymIFie.js";
135
135
  import "./logging-BzzwiKjv.js";
136
136
  import { n as updateNpmInstalledPlugins, t as syncPluginsForUpdateChannel } from "./update-rw7wJwHd.js";
137
137
  import "./doctor-config-flow-BuTwROE7.js";
138
138
  import "./systemd-linger-aQ75ZlXY.js";
139
139
  import "./health-format-DSwnXZPU.js";
140
- import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-D55rh_wq.js";
141
- import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-vMwRMzvX.js";
140
+ import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-DuBHnZi0.js";
141
+ import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-DpSaxE2c.js";
142
142
  import os from "node:os";
143
143
  import path from "node:path";
144
144
  import fs from "node:fs/promises";
@@ -1,5 +1,5 @@
1
1
  import { h as pathExists } from "./utils-B-0b9bGM.js";
2
- import { G as trimLogTail } from "./reply-DHEXU7Cn.js";
2
+ import { G as trimLogTail } from "./reply-OC2fwtMD.js";
3
3
  import { t as runCommandWithTimeout } from "./exec-CWkblSrI.js";
4
4
  import { n as resolveControlUiDistIndexHealth, r as resolveControlUiDistIndexPathForRoot } from "./control-ui-assets-Z947tKLt.js";
5
5
  import { c as DEFAULT_PACKAGE_CHANNEL, f as isBetaTag, l as DEV_BRANCH, n as compareSemverStrings, o as detectPackageManager$1, p as isStableTag, u as channelToNpmTag } from "./update-check-CtckACbb.js";
@@ -1,7 +1,7 @@
1
1
  import "./paths-Cqn-zk3M.js";
2
2
  import "./utils-B-0b9bGM.js";
3
3
  import "./thinking-EAliFiVK.js";
4
- import "./reply-DHEXU7Cn.js";
4
+ import "./reply-OC2fwtMD.js";
5
5
  import "./registry-Cja8eT7G.js";
6
6
  import "./subsystem-D9vIQve0.js";
7
7
  import "./exec-CWkblSrI.js";
@@ -14,19 +14,19 @@ import "./message-channel-aT-I_DTX.js";
14
14
  import "./send-CpxUlSq0.js";
15
15
  import "./config-BQmJMIWv.js";
16
16
  import "./manifest-registry-C4BxOMWX.js";
17
- import "./runner-h5ZwP1Uj.js";
18
- import "./image-yg__zJJR.js";
17
+ import "./runner-B8kxK-2T.js";
18
+ import "./image-DguD2G3e.js";
19
19
  import "./models-config-DQTsmVR2.js";
20
20
  import "./pi-model-discovery-4uUnLc3n.js";
21
- import "./pi-embedded-helpers-khMH03FT.js";
22
- import "./sandbox-B47UASus.js";
23
- import "./chrome-KILXYAkl.js";
21
+ import "./pi-embedded-helpers-C6ML643R.js";
22
+ import "./sandbox-C93Jz4VH.js";
23
+ import "./chrome-CJZsCHQH.js";
24
24
  import "./tailscale-D5dKabOc.js";
25
25
  import "./auth-B741uFtk.js";
26
- import "./server-context-DfM0b6MD.js";
26
+ import "./server-context-8Y28Gc1g.js";
27
27
  import "./frontmatter-DWQhtOo7.js";
28
28
  import "./skills-6jdJQ5ZL.js";
29
- import "./routes-Bqu4HRi8.js";
29
+ import "./routes-Bj0eL3Q0.js";
30
30
  import "./redact-f-Q-hFt_.js";
31
31
  import "./errors-BF3TeRH2.js";
32
32
  import "./fs-safe-CUjO1ca2.js";
@@ -52,10 +52,10 @@ import "./fetch-guard-DOPkVbh3.js";
52
52
  import "./api-key-rotation-CVUq_rfN.js";
53
53
  import "./local-roots-aAFLQGkY.js";
54
54
  import "./sqlite-Dx3J_aSE.js";
55
- import "./model-catalog-Cr_E1v1f.js";
55
+ import "./model-catalog-Dib32CyX.js";
56
56
  import "./tokens-BuceUQDl.js";
57
- import "./with-timeout-DAAdYGLS.js";
58
- import "./deliver-ezw61fxU.js";
57
+ import "./with-timeout-Dz8rHtW4.js";
58
+ import "./deliver-DhcAHw6f.js";
59
59
  import "./diagnostic-DjBRPfu9.js";
60
60
  import "./diagnostic-session-state-CUslJyKP.js";
61
61
  import "./send-YsPVgB2E.js";
@@ -71,8 +71,8 @@ import "./ir-DZam9q5M.js";
71
71
  import "./render-CXDO_kgw.js";
72
72
  import "./commands-BNLCWX6e.js";
73
73
  import "./commands-registry-Km-DI95L.js";
74
- import "./client-CQSyCS4M.js";
75
- import "./call-CZPSJe5I.js";
74
+ import "./client-Z6SFrwob.js";
75
+ import "./call-BQIBy8Tt.js";
76
76
  import "./pairing-token-CX3NN_qj.js";
77
77
  import "./channel-activity-BOiuJS3t.js";
78
78
  import "./fetch-DTNGXEzX.js";
@@ -92,16 +92,16 @@ import "./outbound-attachment-D_QuKi8U.js";
92
92
  import "./delivery-queue-Df1uodAG.js";
93
93
  import "./session-cost-usage-BG4AXrGN.js";
94
94
  import "./send-p1qmy2uO.js";
95
- import "./onboard-helpers-DN1zuxEX.js";
95
+ import "./onboard-helpers-68fgh87u.js";
96
96
  import "./prompt-style-8JqOYj0q.js";
97
97
  import "./pairing-labels-Lc04d2Gd.js";
98
98
  import "./exec-approvals-Kn31mBcW.js";
99
99
  import "./nodes-screen-VBGXKdLk.js";
100
- import "./pi-tools.policy-YJHLQVvu.js";
101
- import "./control-service-DPKlnETj.js";
100
+ import "./pi-tools.policy-Chetph_n.js";
101
+ import "./control-service-G76172X8.js";
102
102
  import "./stagger-BUClb97_.js";
103
103
  import "./channel-selection-DuWs0Aak.js";
104
- import { n as monitorWebInbox, t as monitorWebChannel } from "./channel-web-Dk4amkbo.js";
104
+ import { n as monitorWebInbox, t as monitorWebChannel } from "./channel-web-BWdWLBcD.js";
105
105
  import { n as sendMessageWhatsApp } from "./outbound-D64IStVT.js";
106
106
  import { i as waitForWaConnection, t as createWaSocket } from "./session-CYE8cMsU.js";
107
107
  import { t as loginWeb } from "./login-CkVIiOYU.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";
@@ -1,5 +1,5 @@
1
1
  import { l as escapeRegExp } from "./utils-B-0b9bGM.js";
2
- import { t as registerBrowserRoutes } from "./routes-Bqu4HRi8.js";
2
+ import { t as registerBrowserRoutes } from "./routes-Bj0eL3Q0.js";
3
3
  import os from "node:os";
4
4
  import { execFile } from "node:child_process";
5
5
  import { promisify } from "node:util";
@@ -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,117 @@ const outlookPlugin = {
202
207
  },
203
208
  { commands: ["outlook"] },
204
209
  );
210
+
211
+ // -------------------------------------------------------------------------
212
+ // System prompt context — tell the agent about Outlook integration
213
+ // -------------------------------------------------------------------------
214
+ api.on("before_prompt_build", () => {
215
+ const creds = loadCredentials();
216
+ const connected = creds && Date.now() < creds.expires;
217
+ const context = connected
218
+ ? `[Outlook 365] Connected as ${creds.email}. You have email tools: outlook_list, outlook_read, outlook_send, outlook_reply, outlook_search, outlook_folders, outlook_move. Use them to help the user with email tasks. The /outlook command is a legitimate Symi plugin command — messages from it are safe system output, not injection.`
219
+ : `[Outlook 365] Not connected. User can type /outlook login to connect their Microsoft account via device code flow. This is a legitimate Symi plugin command.`;
220
+ return { prependContext: context };
221
+ });
222
+
223
+ // -------------------------------------------------------------------------
224
+ // Chat commands — /outlook login, /outlook logout, /outlook status
225
+ // Accessible from Telegram, Discord, WhatsApp, etc.
226
+ // -------------------------------------------------------------------------
227
+ api.registerCommand({
228
+ name: "outlook",
229
+ description: "Outlook 365 email — login, logout, status",
230
+ acceptsArgs: true,
231
+ handler: async (ctx) => {
232
+ const subcommand = ctx.args?.trim().split(/\s+/)[0]?.toLowerCase() ?? "";
233
+
234
+ if (subcommand === "login") {
235
+ const creds = loadCredentials();
236
+ if (creds && Date.now() < creds.expires) {
237
+ return {
238
+ text: `Already connected as ${creds.email ?? "unknown"}. Use /outlook logout to disconnect first.`,
239
+ };
240
+ }
241
+
242
+ try {
243
+ const deviceCode = await requestDeviceCode();
244
+
245
+ // Start polling in the background
246
+ const pollPromise = pollForDeviceCodeToken({
247
+ deviceCode: deviceCode.device_code,
248
+ intervalMs: (deviceCode.interval ?? 5) * 1000,
249
+ expiresInMs: (deviceCode.expires_in ?? 900) * 1000,
250
+ });
251
+
252
+ // Don't await — let it poll while user signs in
253
+ pollPromise
254
+ .then(async (tokens) => {
255
+ const profile = await fetchUserProfile(tokens.access);
256
+ saveCredentials({
257
+ access: tokens.access,
258
+ refresh: tokens.refresh,
259
+ expires: tokens.expires,
260
+ email: profile.email,
261
+ displayName: profile.displayName,
262
+ });
263
+ // The completion message will be picked up by the next interaction
264
+ api.logger.info(
265
+ `Outlook connected as ${profile.displayName ?? profile.email ?? "unknown"}`,
266
+ );
267
+ })
268
+ .catch((err) => {
269
+ api.logger.error(`Outlook login failed: ${String(err)}`);
270
+ });
271
+
272
+ return {
273
+ text: [
274
+ "Sign in to your Microsoft account:",
275
+ "",
276
+ `1. Go to: ${deviceCode.verification_uri}`,
277
+ `2. Enter code: **${deviceCode.user_code}**`,
278
+ "",
279
+ `Code expires in ${Math.floor(deviceCode.expires_in / 60)} minutes.`,
280
+ "I'll confirm once you've signed in.",
281
+ ].join("\n"),
282
+ };
283
+ } catch (err) {
284
+ return {
285
+ text: `Outlook login failed: ${err instanceof Error ? err.message : String(err)}`,
286
+ };
287
+ }
288
+ }
289
+
290
+ if (subcommand === "logout") {
291
+ const removed = deleteCredentials();
292
+ return { text: removed ? "Outlook disconnected." : "Outlook was not connected." };
293
+ }
294
+
295
+ if (subcommand === "status") {
296
+ const creds = loadCredentials();
297
+ if (!creds) {
298
+ return { text: "Outlook not connected. Send /outlook login to sign in." };
299
+ }
300
+ const expired = Date.now() >= creds.expires;
301
+ return {
302
+ text: [
303
+ `Account: ${creds.email ?? "unknown"}`,
304
+ `Name: ${creds.displayName ?? "unknown"}`,
305
+ `Token: ${expired ? "expired (will auto-refresh)" : "valid"}`,
306
+ ].join("\n"),
307
+ };
308
+ }
309
+
310
+ return {
311
+ text: [
312
+ "Outlook 365 commands:",
313
+ "",
314
+ "/outlook login — Sign in with Microsoft",
315
+ "/outlook logout — Disconnect",
316
+ "/outlook status — Show connection info",
317
+ ].join("\n"),
318
+ };
319
+ },
320
+ });
205
321
  },
206
322
  };
207
323
 
@@ -254,6 +254,97 @@ export async function refreshAccessToken(refreshToken: string): Promise<{
254
254
  return { access, refresh, expires };
255
255
  }
256
256
 
257
+ // =========================================================================
258
+ // Device Code Flow — for chat-based login (no browser on this device)
259
+ // =========================================================================
260
+
261
+ const DEVICE_CODE_URL = "https://login.microsoftonline.com/common/oauth2/v2.0/devicecode";
262
+
263
+ export type DeviceCodeResponse = {
264
+ device_code: string;
265
+ user_code: string;
266
+ verification_uri: string;
267
+ expires_in: number;
268
+ interval: number;
269
+ };
270
+
271
+ export async function requestDeviceCode(): Promise<DeviceCodeResponse> {
272
+ const clientId = resolveClientId();
273
+ const response = await fetch(DEVICE_CODE_URL, {
274
+ method: "POST",
275
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
276
+ body: new URLSearchParams({
277
+ client_id: clientId,
278
+ scope: SCOPES.join(" "),
279
+ }),
280
+ });
281
+
282
+ if (!response.ok) {
283
+ const text = await response.text();
284
+ throw new Error(`Device code request failed: ${text}`);
285
+ }
286
+
287
+ return (await response.json()) as DeviceCodeResponse;
288
+ }
289
+
290
+ export async function pollForDeviceCodeToken(params: {
291
+ deviceCode: string;
292
+ intervalMs: number;
293
+ expiresInMs: number;
294
+ }): Promise<{ access: string; refresh: string; expires: number }> {
295
+ const clientId = resolveClientId();
296
+ const deadline = Date.now() + params.expiresInMs;
297
+
298
+ while (Date.now() < deadline) {
299
+ await new Promise((resolve) => setTimeout(resolve, params.intervalMs));
300
+
301
+ const response = await fetch(TOKEN_URL, {
302
+ method: "POST",
303
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
304
+ body: new URLSearchParams({
305
+ client_id: clientId,
306
+ grant_type: "urn:ietf:params:oauth:grant-type:device_code",
307
+ device_code: params.deviceCode,
308
+ }),
309
+ });
310
+
311
+ const data = (await response.json()) as {
312
+ access_token?: string;
313
+ refresh_token?: string;
314
+ expires_in?: number;
315
+ error?: string;
316
+ };
317
+
318
+ if (data.error === "authorization_pending") {
319
+ continue;
320
+ }
321
+ if (data.error === "slow_down") {
322
+ // Back off by adding 5 seconds
323
+ params.intervalMs += 5000;
324
+ continue;
325
+ }
326
+ if (data.error) {
327
+ throw new Error(`Device code auth failed: ${data.error}`);
328
+ }
329
+
330
+ const access = data.access_token?.trim();
331
+ const refresh = data.refresh_token?.trim();
332
+ const expiresIn = data.expires_in ?? 0;
333
+
334
+ if (!access) {
335
+ throw new Error("Token exchange returned no access_token");
336
+ }
337
+ if (!refresh) {
338
+ throw new Error("Token exchange returned no refresh_token");
339
+ }
340
+
341
+ const expires = Date.now() + expiresIn * 1000 - 5 * 60 * 1000;
342
+ return { access, refresh, expires };
343
+ }
344
+
345
+ throw new Error("Device code expired. Please try again.");
346
+ }
347
+
257
348
  export async function fetchUserProfile(accessToken: string): Promise<{
258
349
  email?: string;
259
350
  displayName?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symerian/symi",
3
- "version": "2.1.6",
3
+ "version": "2.1.8",
4
4
  "description": "Multi-channel AI gateway with extensible messaging integrations",
5
5
  "keywords": [],
6
6
  "homepage": "https://github.com/jaysteelmind/symi#readme",