@rubytech/create-maxy-code 0.1.440 → 0.1.442

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 (107) hide show
  1. package/dist/index.js +99 -1
  2. package/package.json +1 -1
  3. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +64 -8
  4. package/payload/platform/plugins/cloudflare/skills/calendar-site/SKILL.md +15 -5
  5. package/payload/platform/plugins/cloudflare/skills/calendar-site/template/functions/api/calendar/free-busy.ts +152 -0
  6. package/payload/platform/plugins/cloudflare/skills/calendar-site/template/public/index.html +6 -3
  7. package/payload/platform/plugins/cloudflare/skills/calendar-site/template/schema.sql +11 -0
  8. package/payload/platform/plugins/docs/references/admin-ui.md +1 -1
  9. package/payload/platform/plugins/docs/references/calendar-booking.md +1 -1
  10. package/payload/platform/plugins/docs/references/graph.md +19 -3
  11. package/payload/platform/plugins/docs/references/outlook-guide.md +7 -2
  12. package/payload/platform/plugins/docs/references/troubleshooting.md +35 -0
  13. package/payload/platform/plugins/outlook/.claude-plugin/plugin.json +1 -1
  14. package/payload/platform/plugins/outlook/PLUGIN.md +7 -3
  15. package/payload/platform/plugins/outlook/mcp/dist/__tests__/account-register.test.js +100 -10
  16. package/payload/platform/plugins/outlook/mcp/dist/__tests__/account-register.test.js.map +1 -1
  17. package/payload/platform/plugins/outlook/mcp/dist/__tests__/device-flow.test.js +37 -4
  18. package/payload/platform/plugins/outlook/mcp/dist/__tests__/device-flow.test.js.map +1 -1
  19. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mailbox-list.test.d.ts +2 -0
  20. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mailbox-list.test.d.ts.map +1 -0
  21. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mailbox-list.test.js +64 -0
  22. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mailbox-list.test.js.map +1 -0
  23. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mailbox-registry.test.d.ts +2 -0
  24. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mailbox-registry.test.d.ts.map +1 -0
  25. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mailbox-registry.test.js +193 -0
  26. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mailbox-registry.test.js.map +1 -0
  27. package/payload/platform/plugins/outlook/mcp/dist/__tests__/token-store.test.js +58 -1
  28. package/payload/platform/plugins/outlook/mcp/dist/__tests__/token-store.test.js.map +1 -1
  29. package/payload/platform/plugins/outlook/mcp/dist/auth/device-flow.d.ts +27 -3
  30. package/payload/platform/plugins/outlook/mcp/dist/auth/device-flow.d.ts.map +1 -1
  31. package/payload/platform/plugins/outlook/mcp/dist/auth/device-flow.js +52 -11
  32. package/payload/platform/plugins/outlook/mcp/dist/auth/device-flow.js.map +1 -1
  33. package/payload/platform/plugins/outlook/mcp/dist/auth/mailbox-registry.d.ts +81 -0
  34. package/payload/platform/plugins/outlook/mcp/dist/auth/mailbox-registry.d.ts.map +1 -0
  35. package/payload/platform/plugins/outlook/mcp/dist/auth/mailbox-registry.js +171 -0
  36. package/payload/platform/plugins/outlook/mcp/dist/auth/mailbox-registry.js.map +1 -0
  37. package/payload/platform/plugins/outlook/mcp/dist/auth/token-store.d.ts +16 -1
  38. package/payload/platform/plugins/outlook/mcp/dist/auth/token-store.d.ts.map +1 -1
  39. package/payload/platform/plugins/outlook/mcp/dist/auth/token-store.js +25 -3
  40. package/payload/platform/plugins/outlook/mcp/dist/auth/token-store.js.map +1 -1
  41. package/payload/platform/plugins/outlook/mcp/dist/index.js +119 -50
  42. package/payload/platform/plugins/outlook/mcp/dist/index.js.map +1 -1
  43. package/payload/platform/plugins/outlook/mcp/dist/lib/graph-client.js +1 -1
  44. package/payload/platform/plugins/outlook/mcp/dist/lib/graph-client.js.map +1 -1
  45. package/payload/platform/plugins/outlook/mcp/dist/tools/account-register.d.ts +13 -4
  46. package/payload/platform/plugins/outlook/mcp/dist/tools/account-register.d.ts.map +1 -1
  47. package/payload/platform/plugins/outlook/mcp/dist/tools/account-register.js +54 -3
  48. package/payload/platform/plugins/outlook/mcp/dist/tools/account-register.js.map +1 -1
  49. package/payload/platform/plugins/outlook/mcp/dist/tools/mailbox-list.d.ts +26 -0
  50. package/payload/platform/plugins/outlook/mcp/dist/tools/mailbox-list.d.ts.map +1 -0
  51. package/payload/platform/plugins/outlook/mcp/dist/tools/mailbox-list.js +28 -0
  52. package/payload/platform/plugins/outlook/mcp/dist/tools/mailbox-list.js.map +1 -0
  53. package/payload/platform/plugins/outlook/references/auth.md +36 -8
  54. package/payload/platform/plugins/scheduling/mcp/dist/scripts/publish-availability.d.ts +27 -0
  55. package/payload/platform/plugins/scheduling/mcp/dist/scripts/publish-availability.d.ts.map +1 -0
  56. package/payload/platform/plugins/scheduling/mcp/dist/scripts/publish-availability.js +241 -0
  57. package/payload/platform/plugins/scheduling/mcp/dist/scripts/publish-availability.js.map +1 -0
  58. package/payload/platform/plugins/whatsapp/mcp/dist/index.js +20 -22
  59. package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
  60. package/payload/platform/plugins/whatsapp/references/channels-whatsapp.md +3 -1
  61. package/payload/platform/scripts/logs-read.sh +24 -6
  62. package/payload/platform/scripts/logs-read.test.sh +42 -0
  63. package/payload/platform/scripts/rss-sampler.sh +107 -0
  64. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  65. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +1 -0
  66. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  67. package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
  68. package/payload/server/public/assets/{AdminLoginScreens-CukwQufW.js → AdminLoginScreens-BJVwtpLH.js} +1 -1
  69. package/payload/server/public/assets/{AdminShell-BwEBH6tT.js → AdminShell-CMu8_Xwn.js} +1 -1
  70. package/payload/server/public/assets/{Checkbox-B629mOPp.js → Checkbox-CzD0ORqA.js} +1 -1
  71. package/payload/server/public/assets/{admin-CdFRCUUZ.js → admin-D0yk2LMq.js} +1 -1
  72. package/payload/server/public/assets/{browser-BWR59IkB.js → browser-CvfbgznO.js} +1 -1
  73. package/payload/server/public/assets/{calendar-kuTcxX1t.js → calendar-fw4WethJ.js} +1 -1
  74. package/payload/server/public/assets/chat-DhD-NES_.js +1 -0
  75. package/payload/server/public/assets/chevron-left-B3xSeEDR.js +1 -0
  76. package/payload/server/public/assets/data-CUnDzDox.js +1 -0
  77. package/payload/server/public/assets/{file-download-4mKJxUi-.js → file-download-Px4s0Bhp.js} +1 -1
  78. package/payload/server/public/assets/{graph-NgQDY0Pb.js → graph-DbT8nA6R.js} +2 -2
  79. package/payload/server/public/assets/{graph-labels-B8YAdo3Z.js → graph-labels-C1YIyLiA.js} +1 -1
  80. package/payload/server/public/assets/{maximize-2-CxstTgoK.js → maximize-2-BwphzI9S.js} +1 -1
  81. package/payload/server/public/assets/{operator-oSaB1mya.js → operator-zcIfeB14.js} +1 -1
  82. package/payload/server/public/assets/{page-DMeJHVfA.js → page-6fCnIb45.js} +2 -2
  83. package/payload/server/public/assets/page-CfQFAJia.js +1 -0
  84. package/payload/server/public/assets/{public-C54tl6V4.js → public-C0ehZCdE.js} +1 -1
  85. package/payload/server/public/assets/{rotate-ccw-COGQTi7n.js → rotate-ccw-C7BqkMec.js} +1 -1
  86. package/payload/server/public/assets/{tasks-B97VpwEJ.js → tasks-DlgiCafL.js} +1 -1
  87. package/payload/server/public/assets/{time-entry-format-C09rDHo9.js → time-entry-format-CyNYVDkq.js} +1 -1
  88. package/payload/server/public/assets/{useCopyFeedback-DHoYHiK9.js → useCopyFeedback-ByGUMN94.js} +1 -1
  89. package/payload/server/public/assets/useSubAccountSwitcher-1izQvPiD.css +1 -0
  90. package/payload/server/public/assets/useVoiceRecorder-XgpWvXpk.js +2 -0
  91. package/payload/server/public/browser.html +5 -5
  92. package/payload/server/public/calendar.html +6 -6
  93. package/payload/server/public/chat.html +12 -12
  94. package/payload/server/public/data.html +10 -10
  95. package/payload/server/public/graph.html +11 -11
  96. package/payload/server/public/index.html +13 -13
  97. package/payload/server/public/operator.html +14 -14
  98. package/payload/server/public/public.html +12 -12
  99. package/payload/server/public/tasks.html +5 -5
  100. package/payload/server/server.js +498 -180
  101. package/payload/server/public/assets/chat-ejnq2rck.js +0 -1
  102. package/payload/server/public/assets/chevron-left-u4tjq7fI.js +0 -1
  103. package/payload/server/public/assets/data-dZbOyLdT.js +0 -1
  104. package/payload/server/public/assets/page-DEkI-Gl1.js +0 -1
  105. package/payload/server/public/assets/useSubAccountSwitcher-Dzmd7Aip.css +0 -1
  106. package/payload/server/public/assets/useVoiceRecorder-b7HzTFs0.js +0 -2
  107. /package/payload/server/public/assets/{useSubAccountSwitcher-DLJFISqf.js → useSubAccountSwitcher-s6WlRn52.js} +0 -0
@@ -0,0 +1,193 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { mkdtempSync, rmSync, existsSync, mkdirSync, writeFileSync } from "node:fs";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { TokenStore } from "../auth/token-store.js";
7
+ import { MailboxRegistry, credResolveEvent } from "../auth/mailbox-registry.js";
8
+ function makeAccountsDir() {
9
+ const dir = mkdtempSync(join(tmpdir(), "outlook-reg-"));
10
+ return { dir, cleanup: () => rmSync(dir, { recursive: true, force: true }) };
11
+ }
12
+ test("MailboxRegistry migrates a legacy single-mailbox layout on read", () => {
13
+ const { dir, cleanup } = makeAccountsDir();
14
+ try {
15
+ // Seed the pre-migration layout: one tokens.enc at the account root.
16
+ new TokenStore("acct", dir).store("access-rob", "refresh-rob", 3600, {
17
+ graphUserId: "rob-guid",
18
+ mail: "rob@ecolecltd.co.uk",
19
+ scopes: ["Mail.Read"],
20
+ });
21
+ const legacyPath = join(dir, "acct", "secrets", "outlook", "tokens.enc");
22
+ assert.ok(existsSync(legacyPath), "precondition: legacy tokens.enc present");
23
+ const reg = new MailboxRegistry("acct", dir);
24
+ const boxes = reg.list();
25
+ assert.ok(!existsSync(legacyPath), "legacy tokens.enc must be moved away");
26
+ assert.ok(existsSync(join(dir, "acct", "secrets", "outlook", "mailboxes", "rob-guid", "tokens.enc")), "migrated blob must live under mailboxes/<graphUserId>");
27
+ assert.equal(boxes.length, 1);
28
+ assert.equal(boxes[0].graphUserId, "rob-guid");
29
+ assert.equal(boxes[0].mail, "rob@ecolecltd.co.uk");
30
+ assert.equal(boxes[0].readable, true);
31
+ // No re-auth: the migrated blob still decrypts to the same tokens.
32
+ assert.equal(reg.resolve("rob-guid").kind, "ok");
33
+ }
34
+ finally {
35
+ cleanup();
36
+ }
37
+ });
38
+ test("MailboxRegistry lists two coexisting mailboxes", () => {
39
+ const { dir, cleanup } = makeAccountsDir();
40
+ try {
41
+ new TokenStore("acct", dir, "rob-guid").store("a", "r", 3600, {
42
+ graphUserId: "rob-guid", mail: "rob@ecolecltd.co.uk", scopes: [],
43
+ });
44
+ new TokenStore("acct", dir, "info-guid").store("a", "r", 3600, {
45
+ graphUserId: "info-guid", mail: "info@ecolecltd.co.uk", scopes: [],
46
+ });
47
+ const boxes = new MailboxRegistry("acct", dir).list();
48
+ assert.equal(boxes.length, 2);
49
+ const mails = boxes.map((b) => b.mail).sort();
50
+ assert.deepEqual(mails, ["info@ecolecltd.co.uk", "rob@ecolecltd.co.uk"]);
51
+ }
52
+ finally {
53
+ cleanup();
54
+ }
55
+ });
56
+ test("MailboxRegistry.resolve — none / sole / ambiguous / explicit / notfound", () => {
57
+ const { dir, cleanup } = makeAccountsDir();
58
+ try {
59
+ const reg = new MailboxRegistry("acct", dir);
60
+ assert.equal(reg.resolve().kind, "none", "no mailboxes → none");
61
+ new TokenStore("acct", dir, "rob-guid").store("a", "r", 3600, {
62
+ graphUserId: "rob-guid", mail: "rob@ecolecltd.co.uk", scopes: [],
63
+ });
64
+ const sole = new MailboxRegistry("acct", dir).resolve();
65
+ assert.equal(sole.kind, "ok", "single mailbox, no selector → ok");
66
+ new TokenStore("acct", dir, "info-guid").store("a", "r", 3600, {
67
+ graphUserId: "info-guid", mail: "info@ecolecltd.co.uk", scopes: [],
68
+ });
69
+ const reg2 = new MailboxRegistry("acct", dir);
70
+ const ambiguous = reg2.resolve();
71
+ assert.equal(ambiguous.kind, "ambiguous");
72
+ if (ambiguous.kind === "ambiguous") {
73
+ assert.deepEqual(ambiguous.identities.slice().sort(), ["info@ecolecltd.co.uk", "rob@ecolecltd.co.uk"]);
74
+ }
75
+ // Explicit selection by mail is case-insensitive and picks the right store.
76
+ const byMail = reg2.resolve("ROB@ecolecltd.co.uk");
77
+ assert.equal(byMail.kind, "ok");
78
+ if (byMail.kind === "ok") {
79
+ assert.equal(byMail.descriptor.graphUserId, "rob-guid");
80
+ }
81
+ // Explicit selection by graphUserId.
82
+ assert.equal(reg2.resolve("info-guid").kind, "ok");
83
+ const missing = reg2.resolve("nobody@ecolecltd.co.uk");
84
+ assert.equal(missing.kind, "notfound");
85
+ if (missing.kind === "notfound") {
86
+ assert.equal(missing.selector, "nobody@ecolecltd.co.uk");
87
+ assert.equal(missing.identities.length, 2);
88
+ }
89
+ }
90
+ finally {
91
+ cleanup();
92
+ }
93
+ });
94
+ test("MailboxRegistry surfaces an unreadable blob without crashing", () => {
95
+ const { dir, cleanup } = makeAccountsDir();
96
+ try {
97
+ // One good mailbox so the account key exists.
98
+ new TokenStore("acct", dir, "good-guid").store("a", "r", 3600, {
99
+ graphUserId: "good-guid", mail: "good@x.com", scopes: [],
100
+ });
101
+ // A corrupt mailbox blob on disk.
102
+ const badDir = join(dir, "acct", "secrets", "outlook", "mailboxes", "bad-guid");
103
+ mkdirSync(badDir, { recursive: true });
104
+ writeFileSync(join(badDir, "tokens.enc"), "garbage-not-a-cipher");
105
+ const boxes = new MailboxRegistry("acct", dir).list();
106
+ assert.equal(boxes.length, 2, "both good and bad mailboxes listed");
107
+ const bad = boxes.find((b) => b.mailboxKey === "bad-guid");
108
+ assert.ok(bad, "corrupt mailbox must still appear");
109
+ assert.equal(bad.readable, false);
110
+ // Safety: a second, unreadable mailbox still forces a selector rather than
111
+ // silently resolving to the one readable mailbox — a no-selector call must
112
+ // not silently send from the wrong mailbox.
113
+ const res = new MailboxRegistry("acct", dir).resolve();
114
+ assert.equal(res.kind, "ambiguous");
115
+ if (res.kind === "ambiguous") {
116
+ assert.ok(res.identities.some((i) => i.includes("bad-guid") && i.includes("unreadable")));
117
+ }
118
+ // Naming the readable mailbox still resolves it.
119
+ assert.equal(new MailboxRegistry("acct", dir).resolve("good@x.com").kind, "ok");
120
+ }
121
+ finally {
122
+ cleanup();
123
+ }
124
+ });
125
+ test("MailboxRegistry resolves a lone unreadable mailbox to none, not a crash", () => {
126
+ const { dir, cleanup } = makeAccountsDir();
127
+ try {
128
+ // Establish the account key, then corrupt the only mailbox.
129
+ new TokenStore("acct", dir, "solo-guid").store("a", "r", 3600, {
130
+ graphUserId: "solo-guid", mail: "solo@x.com", scopes: [],
131
+ });
132
+ writeFileSync(join(dir, "acct", "secrets", "outlook", "mailboxes", "solo-guid", "tokens.enc"), "garbage");
133
+ assert.equal(new MailboxRegistry("acct", dir).resolve().kind, "none");
134
+ }
135
+ finally {
136
+ cleanup();
137
+ }
138
+ });
139
+ test("credResolveEvent names the resolved mailbox and its source (not a silent default)", () => {
140
+ const { dir, cleanup } = makeAccountsDir();
141
+ try {
142
+ new TokenStore("acct", dir, "rob-guid").store("a", "r", 3600, {
143
+ graphUserId: "rob-guid", mail: "rob@ecolecltd.co.uk", scopes: [],
144
+ });
145
+ new TokenStore("acct", dir, "info-guid").store("a", "r", 3600, {
146
+ graphUserId: "info-guid", mail: "info@ecolecltd.co.uk", scopes: [],
147
+ });
148
+ const reg = new MailboxRegistry("acct", dir);
149
+ // Explicit selection logs the chosen mailbox, source=arg. Proves selection.
150
+ const argEv = credResolveEvent(reg.resolve("info@ecolecltd.co.uk"), "acct", "info@ecolecltd.co.uk");
151
+ assert.equal(argEv.mailbox, "info@ecolecltd.co.uk");
152
+ assert.equal(argEv.source, "arg");
153
+ // Ambiguous refusal logs source=refused, never a silent fall-through.
154
+ const refusedEv = credResolveEvent(reg.resolve(), "acct");
155
+ assert.equal(refusedEv.source, "refused");
156
+ }
157
+ finally {
158
+ cleanup();
159
+ }
160
+ });
161
+ test("credResolveEvent marks the sole mailbox source=sole", () => {
162
+ const { dir, cleanup } = makeAccountsDir();
163
+ try {
164
+ new TokenStore("acct", dir, "only-guid").store("a", "r", 3600, {
165
+ graphUserId: "only-guid", mail: "only@x.com", scopes: [],
166
+ });
167
+ const ev = credResolveEvent(new MailboxRegistry("acct", dir).resolve(), "acct");
168
+ assert.equal(ev.mailbox, "only@x.com");
169
+ assert.equal(ev.source, "sole");
170
+ }
171
+ finally {
172
+ cleanup();
173
+ }
174
+ });
175
+ test("MailboxRegistry.storeFor overwrites the same mailbox in place", () => {
176
+ const { dir, cleanup } = makeAccountsDir();
177
+ try {
178
+ const reg = new MailboxRegistry("acct", dir);
179
+ reg.storeFor("rob-guid").store("access-1", "r", 3600, {
180
+ graphUserId: "rob-guid", mail: "rob@x.com", scopes: [],
181
+ });
182
+ reg.storeFor("rob-guid").store("access-2", "r", 3600, {
183
+ graphUserId: "rob-guid", mail: "rob@x.com", scopes: [],
184
+ });
185
+ const boxes = new MailboxRegistry("acct", dir).list();
186
+ assert.equal(boxes.length, 1, "re-register must not duplicate the mailbox");
187
+ assert.equal(reg.storeFor("rob-guid").read().accessToken, "access-2");
188
+ }
189
+ finally {
190
+ cleanup();
191
+ }
192
+ });
193
+ //# sourceMappingURL=mailbox-registry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mailbox-registry.test.js","sourceRoot":"","sources":["../../src/__tests__/mailbox-registry.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import test from "node:test";
2
2
  import assert from "node:assert/strict";
3
- import { mkdtempSync, rmSync, statSync, writeFileSync, readFileSync } from "node:fs";
3
+ import { mkdtempSync, rmSync, statSync, writeFileSync, readFileSync, existsSync } from "node:fs";
4
4
  import { tmpdir } from "node:os";
5
5
  import { join } from "node:path";
6
6
  import { TokenStore } from "../auth/token-store.js";
@@ -111,6 +111,63 @@ test("TokenStore.needsRefresh returns false outside the threshold window", () =>
111
111
  cleanup();
112
112
  }
113
113
  });
114
+ test("TokenStore round-trip preserves the mail field", () => {
115
+ const { dir, cleanup } = makeAccountsDir();
116
+ try {
117
+ const store = new TokenStore("acct-mail", dir, "user-1");
118
+ store.store("access-1", "refresh-1", 3600, {
119
+ graphUserId: "user-1",
120
+ mail: "rob@ecolecltd.co.uk",
121
+ scopes: ["Mail.Read"],
122
+ });
123
+ const blob = new TokenStore("acct-mail", dir, "user-1").read();
124
+ assert.equal(blob.mail, "rob@ecolecltd.co.uk");
125
+ }
126
+ finally {
127
+ cleanup();
128
+ }
129
+ });
130
+ test("TokenStore per-mailbox stores share one account key with disjoint token files", () => {
131
+ const { dir, cleanup } = makeAccountsDir();
132
+ try {
133
+ const a = new TokenStore("acct-multi", dir, "user-A");
134
+ const b = new TokenStore("acct-multi", dir, "user-B");
135
+ a.store("access-A", "refresh-A", 3600, { graphUserId: "user-A", mail: "a@x.com", scopes: [] });
136
+ b.store("access-B", "refresh-B", 3600, { graphUserId: "user-B", mail: "b@x.com", scopes: [] });
137
+ const base = join(dir, "acct-multi", "secrets", "outlook");
138
+ // Disjoint token files, one per mailbox.
139
+ assert.ok(existsSync(join(base, "mailboxes", "user-A", "tokens.enc")), "mailbox A tokens missing");
140
+ assert.ok(existsSync(join(base, "mailboxes", "user-B", "tokens.enc")), "mailbox B tokens missing");
141
+ // Exactly one account-level key, shared by both mailboxes.
142
+ assert.ok(existsSync(join(base, ".key")), "shared account key missing");
143
+ assert.ok(!existsSync(join(base, "mailboxes", "user-A", ".key")), "mailbox must not hold its own key");
144
+ // Each store reads back its own blob; the single key decrypts both.
145
+ assert.equal(new TokenStore("acct-multi", dir, "user-A").read().accessToken, "access-A");
146
+ assert.equal(new TokenStore("acct-multi", dir, "user-B").read().accessToken, "access-B");
147
+ }
148
+ finally {
149
+ cleanup();
150
+ }
151
+ });
152
+ test("TokenStore.store preserves mail when omitted (refresh-style call)", () => {
153
+ const { dir, cleanup } = makeAccountsDir();
154
+ try {
155
+ const store = new TokenStore("acct-refresh", dir, "user-1");
156
+ store.store("access-1", "refresh-1", 3600, {
157
+ graphUserId: "user-1",
158
+ mail: "keep@me.com",
159
+ scopes: ["Mail.Read"],
160
+ });
161
+ // Refresh path stores new access token but does not re-pass mail.
162
+ store.store("access-2", "refresh-1", 3600, { graphUserId: "user-1", scopes: ["Mail.Read"] });
163
+ const blob = new TokenStore("acct-refresh", dir, "user-1").read();
164
+ assert.equal(blob.accessToken, "access-2");
165
+ assert.equal(blob.mail, "keep@me.com", "mail must survive a refresh-style store");
166
+ }
167
+ finally {
168
+ cleanup();
169
+ }
170
+ });
114
171
  test("TokenStore.clear removes the token blob but leaves the key", () => {
115
172
  const { dir, cleanup } = makeAccountsDir();
116
173
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"token-store.test.js","sourceRoot":"","sources":["../../src/__tests__/token-store.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"token-store.test.js","sourceRoot":"","sources":["../../src/__tests__/token-store.test.ts"],"names":[],"mappings":"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"}
@@ -36,6 +36,22 @@ export declare function startDeviceCode(config: {
36
36
  clientId: string;
37
37
  tenantId: string;
38
38
  }): Promise<DeviceCodeStart>;
39
+ export interface AzureTokenError {
40
+ kind: "error";
41
+ httpStatus: number;
42
+ error: string;
43
+ errorDescription: string;
44
+ /** The AADSTSnnnnn code, from `error_codes[0]` or parsed out of the description. */
45
+ aadsts: string | null;
46
+ /** OAuth sub-error (e.g. `token_expired`, `bad_token`, `consent_required`) — the
47
+ * field that distinguishes causes sharing one top-level `invalid_grant`. */
48
+ suberror: string | null;
49
+ correlationId: string | null;
50
+ traceId: string | null;
51
+ timestamp: string | null;
52
+ /** The verbatim response body — never discarded, so no diagnostic detail is lost. */
53
+ raw: string;
54
+ }
39
55
  export type PollOutcome = {
40
56
  kind: "pending";
41
57
  } | {
@@ -48,11 +64,19 @@ export type PollOutcome = {
48
64
  kind: "success";
49
65
  tokenResponse: TokenResponse;
50
66
  scopes: string[];
51
- };
67
+ } | AzureTokenError;
68
+ /**
69
+ * Parse a Microsoft token-endpoint error body into structured fields. Every part
70
+ * Azure returns — AADSTS code, sub-error, description, correlation/trace IDs — is
71
+ * captured so a poll failure is diagnosable from the log without re-deriving it
72
+ * from an opaque string. A non-JSON body still yields a value: `raw` carries it.
73
+ */
74
+ export declare function parseAzureTokenError(httpStatus: number, text: string): AzureTokenError;
52
75
  /**
53
76
  * One device-code token poll against `/oauth2/v2.0/token`. 200 yields tokens;
54
- * the Microsoft error codes map to the polling states an RFC 8628 client must
55
- * handle. Any unrecognised error throws.
77
+ * the four RFC 8628 polling states map to their kinds. Any other error is
78
+ * returned as a structured `AzureTokenError` (never thrown, never discarded) so
79
+ * the caller can log the full Microsoft reason instead of an opaque string.
56
80
  */
57
81
  export declare function pollDeviceToken(config: {
58
82
  clientId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"device-flow.d.ts","sourceRoot":"","sources":["../../src/auth/device-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAwBH,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,EAAE,MAAM,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAWD;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,eAAe,CAAC,CA6B3B;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,aAAa,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAExE;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAC9C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC,CAoCtB;AAMD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,aAAa,CAAC,CAmBzB;AAED,eAAO,MAAM,UAAU;;CAAa,CAAC"}
1
+ {"version":3,"file":"device-flow.d.ts","sourceRoot":"","sources":["../../src/auth/device-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAwBH,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,EAAE,MAAM,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAWD;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,eAAe,CAAC,CA6B3B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,oFAAoF;IACpF,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;iFAC6E;IAC7E,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,qFAAqF;IACrF,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,aAAa,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,GACnE,eAAe,CAAC;AAEpB;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,CA6CtF;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAC9C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC,CA+BtB;AAMD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,aAAa,CAAC,CAmBzB;AAED,eAAO,MAAM,UAAU;;CAAa,CAAC"}
@@ -60,10 +60,57 @@ export async function startDeviceCode(config) {
60
60
  scopes: [...SCOPES],
61
61
  };
62
62
  }
63
+ /**
64
+ * Parse a Microsoft token-endpoint error body into structured fields. Every part
65
+ * Azure returns — AADSTS code, sub-error, description, correlation/trace IDs — is
66
+ * captured so a poll failure is diagnosable from the log without re-deriving it
67
+ * from an opaque string. A non-JSON body still yields a value: `raw` carries it.
68
+ */
69
+ export function parseAzureTokenError(httpStatus, text) {
70
+ let error = "";
71
+ let errorDescription = "";
72
+ let suberror = null;
73
+ let correlationId = null;
74
+ let traceId = null;
75
+ let timestamp = null;
76
+ let aadsts = null;
77
+ try {
78
+ const b = JSON.parse(text);
79
+ error = b.error ?? "";
80
+ errorDescription = b.error_description ?? "";
81
+ suberror = b.suberror ?? null;
82
+ correlationId = b.correlation_id ?? null;
83
+ traceId = b.trace_id ?? null;
84
+ timestamp = b.timestamp ?? null;
85
+ if (b.error_codes && b.error_codes.length > 0)
86
+ aadsts = `AADSTS${b.error_codes[0]}`;
87
+ }
88
+ catch {
89
+ // Non-JSON body (gateway HTML, empty, etc.): keep the structured shape and let
90
+ // `raw` carry the body so the failure is still fully recorded.
91
+ }
92
+ if (!aadsts) {
93
+ const m = /AADSTS\d+/.exec(errorDescription || text);
94
+ aadsts = m ? m[0] : null;
95
+ }
96
+ return {
97
+ kind: "error",
98
+ httpStatus,
99
+ error,
100
+ errorDescription,
101
+ aadsts,
102
+ suberror,
103
+ correlationId,
104
+ traceId,
105
+ timestamp,
106
+ raw: text,
107
+ };
108
+ }
63
109
  /**
64
110
  * One device-code token poll against `/oauth2/v2.0/token`. 200 yields tokens;
65
- * the Microsoft error codes map to the polling states an RFC 8628 client must
66
- * handle. Any unrecognised error throws.
111
+ * the four RFC 8628 polling states map to their kinds. Any other error is
112
+ * returned as a structured `AzureTokenError` (never thrown, never discarded) so
113
+ * the caller can log the full Microsoft reason instead of an opaque string.
67
114
  */
68
115
  export async function pollDeviceToken(config, deviceCode) {
69
116
  const { tokenUrl } = buildUrls(config.tenantId);
@@ -83,14 +130,8 @@ export async function pollDeviceToken(config, deviceCode) {
83
130
  return { kind: "success", tokenResponse, scopes };
84
131
  }
85
132
  const text = await response.text();
86
- let errorCode = "";
87
- try {
88
- errorCode = JSON.parse(text).error ?? "";
89
- }
90
- catch {
91
- errorCode = "";
92
- }
93
- switch (errorCode) {
133
+ const parsed = parseAzureTokenError(response.status, text);
134
+ switch (parsed.error) {
94
135
  case "authorization_pending":
95
136
  return { kind: "pending" };
96
137
  case "slow_down":
@@ -100,7 +141,7 @@ export async function pollDeviceToken(config, deviceCode) {
100
141
  case "access_denied":
101
142
  return { kind: "denied" };
102
143
  default:
103
- throw new Error(`Device-token poll failed (${response.status}): ${text}`);
144
+ return parsed;
104
145
  }
105
146
  }
106
147
  // ---------------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"device-flow.js","sourceRoot":"","sources":["../../src/auth/device-flow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"device-flow.js","sourceRoot":"","sources":["../../src/auth/device-flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Per-account registry of Outlook mailboxes.
3
+ *
4
+ * A sub-account can hold N mailboxes at once. Each mailbox is its own encrypted
5
+ * `tokens.enc` under `secrets/outlook/mailboxes/<graphUserId>/`, sharing the one
6
+ * account-level AES `.key`. This registry enumerates them, migrates the legacy
7
+ * single-mailbox layout on first read, and resolves a caller's mailbox selector
8
+ * down to the right TokenStore.
9
+ *
10
+ * Migration preserves the AES key, so the legacy ciphertext is valid as-is under
11
+ * the new path — migration is a file move, never a re-encrypt, and never forces
12
+ * a re-auth.
13
+ */
14
+ import { TokenStore } from "./token-store.js";
15
+ export interface MailboxDescriptor {
16
+ /** Sanitized directory name under `mailboxes/` — an opaque handle. */
17
+ mailboxKey: string;
18
+ graphUserId: string | null;
19
+ mail: string | null;
20
+ scopes: string[];
21
+ tokenExpSec: number | null;
22
+ refreshExpired: boolean;
23
+ /** false when the blob failed to decrypt or parse — surfaced, not hidden. */
24
+ readable: boolean;
25
+ }
26
+ export type ResolveResult = {
27
+ kind: "ok";
28
+ store: TokenStore;
29
+ descriptor: MailboxDescriptor;
30
+ } | {
31
+ kind: "none";
32
+ } | {
33
+ kind: "ambiguous";
34
+ identities: string[];
35
+ } | {
36
+ kind: "notfound";
37
+ selector: string;
38
+ identities: string[];
39
+ };
40
+ export interface CredResolveEvent {
41
+ event: "cred-resolve";
42
+ account: string;
43
+ mailbox: string;
44
+ source: "arg" | "sole" | "none" | "refused";
45
+ }
46
+ /**
47
+ * The observability line for a resolution: names the *resolved* mailbox and how
48
+ * it was chosen, so a wrong or absent selector is diagnosable from one line
49
+ * without decrypting the store. Pure — computed from the resolve result and the
50
+ * caller's selector, so selection (not a silent default) is testable.
51
+ */
52
+ export declare function credResolveEvent(resolved: ResolveResult, account: string, selector?: string): CredResolveEvent;
53
+ export declare class MailboxRegistry {
54
+ readonly accountId: string;
55
+ private readonly accountsDir;
56
+ private readonly secretsDir;
57
+ private readonly mailboxesDir;
58
+ private readonly legacyTokensPath;
59
+ constructor(accountId: string, accountsDir: string);
60
+ /**
61
+ * Move a pre-migration `secrets/outlook/tokens.enc` into
62
+ * `mailboxes/<graphUserId>/tokens.enc`. Idempotent: a no-op once the legacy
63
+ * file is gone. Reads the blob only to learn its mailbox key; the ciphertext
64
+ * itself is moved unchanged (same account key).
65
+ */
66
+ private migrateLegacy;
67
+ /** Every mailbox attached to this account, migrating legacy on first read. */
68
+ list(): MailboxDescriptor[];
69
+ private describe;
70
+ /**
71
+ * Resolve a mailbox selector to a TokenStore. Order: explicit selector
72
+ * (matched against graphUserId or mail, case-insensitive) → the sole readable
73
+ * mailbox → ambiguous (≥2 readable, none named) → none (zero readable).
74
+ * Unreadable mailboxes are never addressable.
75
+ */
76
+ resolve(selector?: string): ResolveResult;
77
+ /** A TokenStore for a specific mailbox key (a graphUserId at register time, or
78
+ * a descriptor's mailboxKey). Overwrites that mailbox in place on store(). */
79
+ storeFor(mailboxKey: string): TokenStore;
80
+ }
81
+ //# sourceMappingURL=mailbox-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mailbox-registry.d.ts","sourceRoot":"","sources":["../../src/auth/mailbox-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,UAAU,EAAsB,MAAM,kBAAkB,CAAC;AAElE,MAAM,WAAW,iBAAiB;IAChC,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;IACxB,6EAA6E;IAC7E,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,iBAAiB,CAAA;CAAE,GAChE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAUjE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,cAAc,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAC7C;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,gBAAgB,CAalB;AAED,qBAAa,eAAe;aAMR,SAAS,EAAE,MAAM;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAN9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;gBAGxB,SAAS,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM;IAOtC;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IA4BrB,8EAA8E;IAC9E,IAAI,IAAI,iBAAiB,EAAE;IAa3B,OAAO,CAAC,QAAQ;IAqBhB;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa;IA8BzC;kFAC8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU;CAGzC"}