@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.
- package/dist/{acp-cli-BiMkLDR4.js → acp-cli-vT1oZCVL.js} +2 -2
- package/dist/{agents.config-BXOMgfH8.js → agents.config-DzA8rWnM.js} +1 -1
- package/dist/{audio-preflight-BgsqiU2t.js → audio-preflight-1yi0nb1v.js} +8 -8
- package/dist/{audio-preflight-5NsCxagO.js → audio-preflight-BZIRAXlv.js} +4 -4
- package/dist/{audit-oRSxjF4Y.js → audit-CxLSBkyf.js} +5 -5
- package/dist/{auth-choice-CtkUWEzS.js → auth-choice-Bcu1W1bS.js} +4 -4
- package/dist/{browser-cli-DNkgkAuj.js → browser-cli-CF7WrAl5.js} +3 -3
- package/dist/build-info.json +3 -3
- package/dist/bundled/boot-md/handler.js +6 -6
- package/dist/bundled/session-memory/handler.js +6 -6
- package/dist/{call-CZPSJe5I.js → call-BQIBy8Tt.js} +1 -1
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/{channel-options-hRv5uC1D.js → channel-options-Dg8qatef.js} +1 -1
- package/dist/{channel-web-Dk4amkbo.js → channel-web-BWdWLBcD.js} +2 -2
- package/dist/{channels-cli-D3xSNJol.js → channels-cli-B9_P7h5c.js} +19 -19
- package/dist/{chrome-DM65TRMk.js → chrome-791kNCCB.js} +7 -7
- package/dist/{chrome-KILXYAkl.js → chrome-CJZsCHQH.js} +7 -7
- package/dist/{cli-d7xCa4Lk.js → cli-DvfhqWwR.js} +16 -16
- package/dist/{client-CQSyCS4M.js → client-Z6SFrwob.js} +3 -3
- package/dist/{completion-cli-C8LvKSCg.js → completion-cli-Ch4L91ix.js} +1 -1
- package/dist/{config-cli-oty7UgRW.js → config-cli-B9uXxJg3.js} +1 -1
- package/dist/{configure-BktcEJpM.js → configure-DcNhZaKX.js} +8 -8
- package/dist/{control-service-DPKlnETj.js → control-service-G76172X8.js} +3 -3
- package/dist/{cron-cli-DugQ4zba.js → cron-cli-DJhLBeA1.js} +3 -3
- package/dist/{daemon-cli-ReIMAwZL.js → daemon-cli-CwefaVx1.js} +2 -2
- package/dist/{deliver-Cgg1qwKP.js → deliver-CrlXl9KD.js} +1 -1
- package/dist/{deliver-ezw61fxU.js → deliver-DhcAHw6f.js} +1 -1
- package/dist/{devices-cli-BD4P6j_3.js → devices-cli-BBRC971g.js} +2 -2
- package/dist/{doctor-completion-vMwRMzvX.js → doctor-completion-DpSaxE2c.js} +1 -1
- package/dist/{exec-approvals-cli-BwCy8654.js → exec-approvals-cli-DPmmO3M_.js} +4 -4
- package/dist/{gateway-cli-BCUBz0r7.js → gateway-cli-CGlLcg5W.js} +28 -28
- package/dist/{gateway-rpc-DbGqu2XI.js → gateway-rpc-B6LPqjdz.js} +1 -1
- package/dist/{glass-ui-ws-BVxkFkqP.js → glass-ui-ws-nfA4ysOL.js} +23 -23
- package/dist/{health-Dci8s5_s.js → health-DWxiqmQJ.js} +3 -3
- package/dist/{hooks-cli-BL_ExzSA.js → hooks-cli-Bkdca9pQ.js} +17 -17
- package/dist/{image-yg__zJJR.js → image-DguD2G3e.js} +1 -1
- package/dist/{image-xvVpGzK5.js → image-ycxQmhff.js} +1 -1
- package/dist/index.js +21 -21
- package/dist/llm-slug-generator.js +6 -6
- package/dist/{logs-cli-B-4s2xLq.js → logs-cli-DN6g7pB5.js} +3 -3
- package/dist/{model-catalog-Cr_E1v1f.js → model-catalog-Dib32CyX.js} +1 -1
- package/dist/{model-picker-DPsrrARn.js → model-picker-DhS9QBgv.js} +1 -1
- package/dist/{models-cli-AnsPkuSQ.js → models-cli-B2aJE7eN.js} +18 -18
- package/dist/{node-cli-B4XgCDP5.js → node-cli-DBSE1ho3.js} +6 -6
- package/dist/{nodes-cli-BFAaT-LN.js → nodes-cli-DTydh6Lw.js} +3 -3
- package/dist/{onboard-BEJwRR5X.js → onboard-BtsHZR4B.js} +5 -5
- package/dist/{onboard-channels-BK5dg-gk.js → onboard-channels-D-X56DJ8.js} +1 -1
- package/dist/{onboard-custom-BdK1IVud.js → onboard-custom-BjpcSbRk.js} +1 -1
- package/dist/{onboard-helpers-DN1zuxEX.js → onboard-helpers-68fgh87u.js} +1 -1
- package/dist/{onboard-remote-CIXcmClI.js → onboard-remote-D3ZqwA9f.js} +1 -1
- package/dist/{onboard-skills-DGLjSmKy.js → onboard-skills-FT6IHgfp.js} +1 -1
- package/dist/{onboarding-DITwhIyc.js → onboarding-9vscZiF3.js} +9 -9
- package/dist/{onboarding.finalize-Bv7v6UI4.js → onboarding.finalize-DZ_rRX08.js} +21 -21
- package/dist/{onboarding.gateway-config-BOkD7ZTV.js → onboarding.gateway-config-CcXyb2rj.js} +3 -3
- package/dist/{pi-auth-json-BMN17zl6.js → pi-auth-json-bYGFgsxc.js} +1 -1
- package/dist/{pi-embedded-DuWfOlkO.js → pi-embedded-AKhKHxb6.js} +16 -16
- package/dist/{pi-embedded-helpers-khMH03FT.js → pi-embedded-helpers-C6ML643R.js} +1 -1
- package/dist/{pi-embedded-helpers-Cd124krQ.js → pi-embedded-helpers-DoTustDz.js} +4 -4
- package/dist/{pi-tools.policy-YJHLQVvu.js → pi-tools.policy-Chetph_n.js} +1 -1
- package/dist/{plugin-registry-MahBcTZy.js → plugin-registry-Dm857EK_.js} +1 -1
- package/dist/{plugins-cli-Bjj-8xm-.js → plugins-cli-B_mApNL7.js} +17 -17
- package/dist/{program-context-DZdzIBJW.js → program-context-azGx1QUt.js} +30 -30
- package/dist/{prompt-select-styled-D55rh_wq.js → prompt-select-styled-DuBHnZi0.js} +8 -8
- package/dist/{provider-auth-helpers-CPBiRRJ7.js → provider-auth-helpers-B1A2z7Wq.js} +1 -1
- package/dist/{push-apns-B75DQQZi.js → push-apns-ByIng2X-.js} +1 -1
- package/dist/{pw-ai-DxQzfOiI.js → pw-ai-BIcOufAe.js} +1 -1
- package/dist/{pw-ai-CL_YRdbc.js → pw-ai-DIVguI36.js} +1 -1
- package/dist/{register.agent-1AMj0tWy.js → register.agent-slSgZnXa.js} +21 -21
- package/dist/{register.configure-BA5m1RN3.js → register.configure-Bv303J9I.js} +25 -25
- package/dist/{register.maintenance-CSMK8sqB.js → register.maintenance-C6qo-exc.js} +22 -22
- package/dist/{register.message-CT_zCczX.js → register.message-Ma-4EWdL.js} +17 -17
- package/dist/{register.onboard-HMhaJL1t.js → register.onboard-rUCRhXsi.js} +21 -21
- package/dist/{register.setup-KGs6Sa4o.js → register.setup-CockGerD.js} +21 -21
- package/dist/{register.status-health-sessions-C0Y8uSOv.js → register.status-health-sessions-CsBE-Npn.js} +19 -19
- package/dist/{reply-DHEXU7Cn.js → reply-OC2fwtMD.js} +23 -23
- package/dist/{routes-Bqu4HRi8.js → routes-Bj0eL3Q0.js} +2 -2
- package/dist/{rpc-ByQikXey.js → rpc-D1L9G69Q.js} +1 -1
- package/dist/{runner-h5ZwP1Uj.js → runner-B8kxK-2T.js} +2 -2
- package/dist/{runner-CCo2QuJE.js → runner-Cw5KZrjx.js} +1 -1
- package/dist/{sandbox-B47UASus.js → sandbox-C93Jz4VH.js} +3 -3
- package/dist/{sandbox-cli-CZjPwOz9.js → sandbox-cli-DZ3ou_3q.js} +4 -4
- package/dist/{security-cli-CQ3ChhHn.js → security-cli-DGgK4UWF.js} +8 -8
- package/dist/{server-context-DfM0b6MD.js → server-context-8Y28Gc1g.js} +4 -4
- package/dist/{server-methods-BCks-wpI.js → server-methods-DLYjRtbk.js} +14 -14
- package/dist/{server-node-events-BfwbEkoh.js → server-node-events-BXvhA5oG.js} +17 -17
- package/dist/{status-pU_AObZR.js → status-DSmMas06.js} +1 -1
- package/dist/{status-x9ATvv1I.js → status-ULagy5pI.js} +5 -5
- package/dist/{system-cli-BG-4fgem.js → system-cli-Ckf5utOC.js} +3 -3
- package/dist/{tui-DNtyJqbH.js → tui-DU8uSIS6.js} +3 -3
- package/dist/{tui-cli-CK3UZx8q.js → tui-cli-BaVcPxfw.js} +8 -8
- package/dist/{update-cli-DyEVfV97.js → update-cli-0rovqj0x.js} +23 -23
- package/dist/{update-runner-B2gtFGSb.js → update-runner-C2ymIFie.js} +1 -1
- package/dist/{web-CIc_459s.js → web-CAwp3iOn.js} +17 -17
- package/dist/{web-BFa88W3e.js → web-Kz-ZuUjq.js} +6 -6
- package/dist/{with-timeout-DAAdYGLS.js → with-timeout-Dz8rHtW4.js} +1 -1
- package/extensions/outlook/index.ts +117 -1
- package/extensions/outlook/src/auth.ts +91 -0
- 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-
|
|
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-
|
|
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-
|
|
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-
|
|
31
|
-
import { a as resolveHeartbeatSummaryForAgent, t as formatHealthChannelLines } from "./health-
|
|
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-
|
|
15
|
-
import "./call-
|
|
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-
|
|
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-
|
|
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-
|
|
12
|
-
import { i as ensureExplicitGatewayAuth, o as resolveExplicitGatewayAuth, t as buildGatewayConnectionDetails } from "./call-
|
|
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-
|
|
16
|
-
import "./sandbox-
|
|
17
|
-
import "./chrome-
|
|
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-
|
|
20
|
+
import "./server-context-8Y28Gc1g.js";
|
|
21
21
|
import "./frontmatter-DWQhtOo7.js";
|
|
22
22
|
import "./skills-6jdJQ5ZL.js";
|
|
23
|
-
import "./routes-
|
|
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-
|
|
47
|
-
import "./call-
|
|
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-
|
|
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-
|
|
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-
|
|
20
|
-
import "./image-
|
|
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-
|
|
24
|
-
import "./sandbox-
|
|
25
|
-
import "./chrome-
|
|
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-
|
|
28
|
+
import "./server-context-8Y28Gc1g.js";
|
|
29
29
|
import "./frontmatter-DWQhtOo7.js";
|
|
30
30
|
import "./skills-6jdJQ5ZL.js";
|
|
31
|
-
import "./routes-
|
|
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-
|
|
57
|
+
import "./model-catalog-Dib32CyX.js";
|
|
58
58
|
import "./tokens-BuceUQDl.js";
|
|
59
|
-
import "./with-timeout-
|
|
60
|
-
import "./deliver-
|
|
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-
|
|
77
|
-
import "./call-
|
|
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-
|
|
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-
|
|
104
|
-
import "./control-service-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
141
|
-
import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-
|
|
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-
|
|
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-
|
|
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-
|
|
18
|
-
import "./image-
|
|
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-
|
|
22
|
-
import "./sandbox-
|
|
23
|
-
import "./chrome-
|
|
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-
|
|
26
|
+
import "./server-context-8Y28Gc1g.js";
|
|
27
27
|
import "./frontmatter-DWQhtOo7.js";
|
|
28
28
|
import "./skills-6jdJQ5ZL.js";
|
|
29
|
-
import "./routes-
|
|
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-
|
|
55
|
+
import "./model-catalog-Dib32CyX.js";
|
|
56
56
|
import "./tokens-BuceUQDl.js";
|
|
57
|
-
import "./with-timeout-
|
|
58
|
-
import "./deliver-
|
|
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-
|
|
75
|
-
import "./call-
|
|
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-
|
|
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-
|
|
101
|
-
import "./control-service-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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 {
|
|
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;
|