@rubytech/create-sitedesk-code 0.1.520 → 0.1.522

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 (283) hide show
  1. package/dist/index.js +17 -3
  2. package/package.json +1 -1
  3. package/payload/platform/lib/account-schema-regions/package-lock.json +12 -0
  4. package/payload/platform/lib/active-rules/package-lock.json +12 -0
  5. package/payload/platform/lib/mcp-lifeline/package-lock.json +12 -0
  6. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +46 -7
  7. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +12 -0
  8. package/payload/platform/plugins/docs/references/admin-ui.md +11 -1
  9. package/payload/platform/plugins/docs/references/internals.md +4 -0
  10. package/payload/platform/plugins/docs/references/outlook-guide.md +27 -4
  11. package/payload/platform/plugins/email/mcp/dist/__tests__/attachment-metadata-calendar.test.js +46 -1
  12. package/payload/platform/plugins/email/mcp/dist/__tests__/attachment-metadata-calendar.test.js.map +1 -1
  13. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts +14 -0
  14. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts.map +1 -1
  15. package/payload/platform/plugins/email/mcp/dist/lib/imap.js +35 -4
  16. package/payload/platform/plugins/email/mcp/dist/lib/imap.js.map +1 -1
  17. package/payload/platform/plugins/email/references/email-reference.md +1 -1
  18. package/payload/platform/plugins/outlook/.claude-plugin/plugin.json +1 -1
  19. package/payload/platform/plugins/outlook/PLUGIN.md +9 -1
  20. package/payload/platform/plugins/outlook/mcp/dist/__tests__/delegated-resolve.test.d.ts +2 -0
  21. package/payload/platform/plugins/outlook/mcp/dist/__tests__/delegated-resolve.test.d.ts.map +1 -0
  22. package/payload/platform/plugins/outlook/mcp/dist/__tests__/delegated-resolve.test.js +151 -0
  23. package/payload/platform/plugins/outlook/mcp/dist/__tests__/delegated-resolve.test.js.map +1 -0
  24. package/payload/platform/plugins/outlook/mcp/dist/__tests__/delegated-store.test.d.ts +2 -0
  25. package/payload/platform/plugins/outlook/mcp/dist/__tests__/delegated-store.test.d.ts.map +1 -0
  26. package/payload/platform/plugins/outlook/mcp/dist/__tests__/delegated-store.test.js +151 -0
  27. package/payload/platform/plugins/outlook/mcp/dist/__tests__/delegated-store.test.js.map +1 -0
  28. package/payload/platform/plugins/outlook/mcp/dist/__tests__/device-flow.test.js +38 -4
  29. package/payload/platform/plugins/outlook/mcp/dist/__tests__/device-flow.test.js.map +1 -1
  30. package/payload/platform/plugins/outlook/mcp/dist/__tests__/graph-client-prefix-wiring.test.d.ts +2 -0
  31. package/payload/platform/plugins/outlook/mcp/dist/__tests__/graph-client-prefix-wiring.test.d.ts.map +1 -0
  32. package/payload/platform/plugins/outlook/mcp/dist/__tests__/graph-client-prefix-wiring.test.js +146 -0
  33. package/payload/platform/plugins/outlook/mcp/dist/__tests__/graph-client-prefix-wiring.test.js.map +1 -0
  34. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mailbox-list-delegated.test.d.ts +2 -0
  35. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mailbox-list-delegated.test.d.ts.map +1 -0
  36. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mailbox-list-delegated.test.js +120 -0
  37. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mailbox-list-delegated.test.js.map +1 -0
  38. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mailbox-list.test.js +8 -8
  39. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mailbox-list.test.js.map +1 -1
  40. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mailbox-path-prefix.test.d.ts +2 -0
  41. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mailbox-path-prefix.test.d.ts.map +1 -0
  42. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mailbox-path-prefix.test.js +27 -0
  43. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mailbox-path-prefix.test.js.map +1 -0
  44. package/payload/platform/plugins/outlook/mcp/dist/__tests__/shared-mail-only-guard.test.d.ts +2 -0
  45. package/payload/platform/plugins/outlook/mcp/dist/__tests__/shared-mail-only-guard.test.d.ts.map +1 -0
  46. package/payload/platform/plugins/outlook/mcp/dist/__tests__/shared-mail-only-guard.test.js +70 -0
  47. package/payload/platform/plugins/outlook/mcp/dist/__tests__/shared-mail-only-guard.test.js.map +1 -0
  48. package/payload/platform/plugins/outlook/mcp/dist/__tests__/shared-mailbox-add.test.d.ts +2 -0
  49. package/payload/platform/plugins/outlook/mcp/dist/__tests__/shared-mailbox-add.test.d.ts.map +1 -0
  50. package/payload/platform/plugins/outlook/mcp/dist/__tests__/shared-mailbox-add.test.js +152 -0
  51. package/payload/platform/plugins/outlook/mcp/dist/__tests__/shared-mailbox-add.test.js.map +1 -0
  52. package/payload/platform/plugins/outlook/mcp/dist/auth/delegated-store.d.ts +57 -0
  53. package/payload/platform/plugins/outlook/mcp/dist/auth/delegated-store.d.ts.map +1 -0
  54. package/payload/platform/plugins/outlook/mcp/dist/auth/delegated-store.js +163 -0
  55. package/payload/platform/plugins/outlook/mcp/dist/auth/delegated-store.js.map +1 -0
  56. package/payload/platform/plugins/outlook/mcp/dist/auth/device-flow.d.ts +12 -0
  57. package/payload/platform/plugins/outlook/mcp/dist/auth/device-flow.d.ts.map +1 -1
  58. package/payload/platform/plugins/outlook/mcp/dist/auth/device-flow.js +21 -1
  59. package/payload/platform/plugins/outlook/mcp/dist/auth/device-flow.js.map +1 -1
  60. package/payload/platform/plugins/outlook/mcp/dist/auth/mailbox-registry.d.ts +35 -4
  61. package/payload/platform/plugins/outlook/mcp/dist/auth/mailbox-registry.d.ts.map +1 -1
  62. package/payload/platform/plugins/outlook/mcp/dist/auth/mailbox-registry.js +92 -10
  63. package/payload/platform/plugins/outlook/mcp/dist/auth/mailbox-registry.js.map +1 -1
  64. package/payload/platform/plugins/outlook/mcp/dist/index.js +106 -3
  65. package/payload/platform/plugins/outlook/mcp/dist/index.js.map +1 -1
  66. package/payload/platform/plugins/outlook/mcp/dist/lib/graph-client.d.ts +49 -0
  67. package/payload/platform/plugins/outlook/mcp/dist/lib/graph-client.d.ts.map +1 -1
  68. package/payload/platform/plugins/outlook/mcp/dist/lib/graph-client.js +126 -8
  69. package/payload/platform/plugins/outlook/mcp/dist/lib/graph-client.js.map +1 -1
  70. package/payload/platform/plugins/outlook/mcp/dist/tools/mailbox-info.d.ts +13 -0
  71. package/payload/platform/plugins/outlook/mcp/dist/tools/mailbox-info.d.ts.map +1 -1
  72. package/payload/platform/plugins/outlook/mcp/dist/tools/mailbox-info.js +9 -0
  73. package/payload/platform/plugins/outlook/mcp/dist/tools/mailbox-info.js.map +1 -1
  74. package/payload/platform/plugins/outlook/mcp/dist/tools/mailbox-list.d.ts +42 -8
  75. package/payload/platform/plugins/outlook/mcp/dist/tools/mailbox-list.d.ts.map +1 -1
  76. package/payload/platform/plugins/outlook/mcp/dist/tools/mailbox-list.js +59 -19
  77. package/payload/platform/plugins/outlook/mcp/dist/tools/mailbox-list.js.map +1 -1
  78. package/payload/platform/plugins/outlook/mcp/dist/tools/shared-mailbox-add.d.ts +47 -0
  79. package/payload/platform/plugins/outlook/mcp/dist/tools/shared-mailbox-add.d.ts.map +1 -0
  80. package/payload/platform/plugins/outlook/mcp/dist/tools/shared-mailbox-add.js +67 -0
  81. package/payload/platform/plugins/outlook/mcp/dist/tools/shared-mailbox-add.js.map +1 -0
  82. package/payload/platform/plugins/outlook/mcp/dist/tools/shared-mailbox-remove.d.ts +12 -0
  83. package/payload/platform/plugins/outlook/mcp/dist/tools/shared-mailbox-remove.d.ts.map +1 -0
  84. package/payload/platform/plugins/outlook/mcp/dist/tools/shared-mailbox-remove.js +18 -0
  85. package/payload/platform/plugins/outlook/mcp/dist/tools/shared-mailbox-remove.js.map +1 -0
  86. package/payload/platform/plugins/outlook/references/auth.md +15 -2
  87. package/payload/platform/plugins/outlook/references/graph-surfaces.md +8 -0
  88. package/payload/platform/plugins/outlook/skills/outlook/SKILL.md +21 -1
  89. package/payload/platform/plugins/whatsapp/references/channels-whatsapp.md +3 -1
  90. package/payload/platform/scripts/check-architecture-skill-no-drift.mjs +20 -6
  91. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  92. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +2 -0
  93. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  94. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +17 -5
  95. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  96. package/payload/platform/services/whatsapp-channel/dist/notification.js +30 -6
  97. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  98. package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
  99. package/payload/platform/services/whatsapp-channel/dist/server.js +53 -21
  100. package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
  101. package/payload/platform/services/whatsapp-channel/dist/turn-follow.d.ts +16 -0
  102. package/payload/platform/services/whatsapp-channel/dist/turn-follow.d.ts.map +1 -1
  103. package/payload/platform/services/whatsapp-channel/dist/turn-follow.js +41 -2
  104. package/payload/platform/services/whatsapp-channel/dist/turn-follow.js.map +1 -1
  105. package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
  106. package/payload/server/{chunk-TIIWMF5G.js → chunk-K7CJGZPU.js} +459 -196
  107. package/payload/server/{manager-B6OFOXSW.js → manager-RKL7JZ4Y.js} +3 -1
  108. package/payload/server/public/activity.html +5 -5
  109. package/payload/server/public/agents.html +4 -4
  110. package/payload/server/public/assets/{AdminLoginScreens-SW7mEMcP.js → AdminLoginScreens-zc2_qqh-.js} +1 -1
  111. package/payload/server/public/assets/AdminLoginScreens-zc2_qqh-.js.br +0 -0
  112. package/payload/server/public/assets/AdminLoginScreens-zc2_qqh-.js.gz +0 -0
  113. package/payload/server/public/assets/AdminShell-IGUdTx5q.js +2 -0
  114. package/payload/server/public/assets/AdminShell-IGUdTx5q.js.br +0 -0
  115. package/payload/server/public/assets/AdminShell-IGUdTx5q.js.gz +0 -0
  116. package/payload/server/public/assets/{activity-sqbyX0pX.js → activity-DVgO8YuM.js} +1 -1
  117. package/payload/server/public/assets/activity-DVgO8YuM.js.br +0 -0
  118. package/payload/server/public/assets/activity-DVgO8YuM.js.gz +0 -0
  119. package/payload/server/public/assets/admin-xtpM7fgl.js +1 -0
  120. package/payload/server/public/assets/admin-xtpM7fgl.js.br +0 -0
  121. package/payload/server/public/assets/admin-xtpM7fgl.js.gz +0 -0
  122. package/payload/server/public/assets/{agents-BFYM5EDA.js → agents-P0nTIxo-.js} +1 -1
  123. package/payload/server/public/assets/agents-P0nTIxo-.js.br +0 -0
  124. package/payload/server/public/assets/agents-P0nTIxo-.js.gz +0 -0
  125. package/payload/server/public/assets/{browser-DP5GZe4G.js → browser-Mw7DY3ft.js} +1 -1
  126. package/payload/server/public/assets/browser-Mw7DY3ft.js.br +0 -0
  127. package/payload/server/public/assets/browser-Mw7DY3ft.js.gz +0 -0
  128. package/payload/server/public/assets/{calendar-BKaemLDG.js → calendar-B9gvL_1_.js} +1 -1
  129. package/payload/server/public/assets/calendar-B9gvL_1_.js.br +0 -0
  130. package/payload/server/public/assets/calendar-B9gvL_1_.js.gz +0 -0
  131. package/payload/server/public/assets/chat-DBGqh4wg.js +1 -0
  132. package/payload/server/public/assets/chat-DBGqh4wg.js.br +2 -0
  133. package/payload/server/public/assets/chat-DBGqh4wg.js.gz +0 -0
  134. package/payload/server/public/assets/chevron-left-Bl4vpOM0.js +1 -0
  135. package/payload/server/public/assets/chevron-left-Bl4vpOM0.js.br +0 -0
  136. package/payload/server/public/assets/chevron-right-BExigCnp.js +1 -0
  137. package/payload/server/public/assets/chevron-right-BExigCnp.js.br +0 -0
  138. package/payload/server/public/assets/clock-D8TJvgJC.js +1 -0
  139. package/payload/server/public/assets/clock-D8TJvgJC.js.br +0 -0
  140. package/payload/server/public/assets/data-HfFSxaC2.js +1 -0
  141. package/payload/server/public/assets/data-HfFSxaC2.js.br +0 -0
  142. package/payload/server/public/assets/data-HfFSxaC2.js.gz +0 -0
  143. package/payload/server/public/assets/{file-text-BKK7R-k_.js → file-text-dYBnXNEX.js} +1 -1
  144. package/payload/server/public/assets/file-text-dYBnXNEX.js.br +0 -0
  145. package/payload/server/public/assets/file-text-dYBnXNEX.js.gz +0 -0
  146. package/payload/server/public/assets/{graph-FuxYySjK.js → graph-CDyzd1Et.js} +2 -2
  147. package/payload/server/public/assets/graph-CDyzd1Et.js.br +0 -0
  148. package/payload/server/public/assets/graph-CDyzd1Et.js.gz +0 -0
  149. package/payload/server/public/assets/{graph-labels-Cip6fmKK.js → graph-labels-D1LkKiJr.js} +1 -1
  150. package/payload/server/public/assets/graph-labels-D1LkKiJr.js.br +0 -0
  151. package/payload/server/public/assets/graph-labels-D1LkKiJr.js.gz +0 -0
  152. package/payload/server/public/assets/{maximize-2-D79AhVDo.js → maximize-2-M-iSaznd.js} +1 -1
  153. package/payload/server/public/assets/maximize-2-M-iSaznd.js.br +0 -0
  154. package/payload/server/public/assets/maximize-2-M-iSaznd.js.gz +0 -0
  155. package/payload/server/public/assets/{operator-BPAfgFhP.js → operator-9jfCv1Fg.js} +1 -1
  156. package/payload/server/public/assets/operator-9jfCv1Fg.js.br +0 -0
  157. package/payload/server/public/assets/operator-9jfCv1Fg.js.gz +0 -0
  158. package/payload/server/public/assets/page-CZ-73FAk.js +32 -0
  159. package/payload/server/public/assets/page-CZ-73FAk.js.br +0 -0
  160. package/payload/server/public/assets/page-CZ-73FAk.js.gz +0 -0
  161. package/payload/server/public/assets/{page-BqEyS0W4.js → page-CjwSt7kx.js} +1 -1
  162. package/payload/server/public/assets/page-CjwSt7kx.js.br +0 -0
  163. package/payload/server/public/assets/page-CjwSt7kx.js.gz +0 -0
  164. package/payload/server/public/assets/{public-D1xs3FzD.js → public-CN-ltC8x.js} +1 -1
  165. package/payload/server/public/assets/public-CN-ltC8x.js.br +0 -0
  166. package/payload/server/public/assets/public-CN-ltC8x.js.gz +0 -0
  167. package/payload/server/public/assets/{rotate-ccw-CcU_XD8B.js → rotate-ccw-Buopsc22.js} +1 -1
  168. package/payload/server/public/assets/rotate-ccw-Buopsc22.js.br +0 -0
  169. package/payload/server/public/assets/rotate-ccw-Buopsc22.js.gz +0 -0
  170. package/payload/server/public/assets/routines-C-yr8ddT.js +1 -0
  171. package/payload/server/public/assets/routines-C-yr8ddT.js.br +0 -0
  172. package/payload/server/public/assets/routines-C-yr8ddT.js.gz +0 -0
  173. package/payload/server/public/assets/skills-DiiuVzDK.js +1 -0
  174. package/payload/server/public/assets/skills-DiiuVzDK.js.br +0 -0
  175. package/payload/server/public/assets/skills-DiiuVzDK.js.gz +0 -0
  176. package/payload/server/public/assets/tasks-CnHIfn2_.js +1 -0
  177. package/payload/server/public/assets/tasks-CnHIfn2_.js.br +0 -0
  178. package/payload/server/public/assets/tasks-CnHIfn2_.js.gz +0 -0
  179. package/payload/server/public/assets/{time-entry-format-IFqinQJj.js → time-entry-format-BBokCF-D.js} +1 -1
  180. package/payload/server/public/assets/time-entry-format-BBokCF-D.js.br +0 -0
  181. package/payload/server/public/assets/time-entry-format-BBokCF-D.js.gz +0 -0
  182. package/payload/server/public/assets/{triangle-alert-C5vH__sq.js → triangle-alert-C_AcpTW5.js} +1 -1
  183. package/payload/server/public/assets/triangle-alert-C_AcpTW5.js.br +0 -0
  184. package/payload/server/public/assets/triangle-alert-C_AcpTW5.js.gz +0 -0
  185. package/payload/server/public/assets/{useCopyFeedback-BeL2gPl6.js → useCopyFeedback-TdimmPVR.js} +1 -1
  186. package/payload/server/public/assets/useCopyFeedback-TdimmPVR.js.br +0 -0
  187. package/payload/server/public/assets/useCopyFeedback-TdimmPVR.js.gz +0 -0
  188. package/payload/server/public/assets/useSubAccountSwitcher-BwHqV55p.js +14 -0
  189. package/payload/server/public/assets/useSubAccountSwitcher-BwHqV55p.js.br +0 -0
  190. package/payload/server/public/assets/useSubAccountSwitcher-BwHqV55p.js.gz +0 -0
  191. package/payload/server/public/assets/useSubAccountSwitcher-CsrPYqtm.css +1 -0
  192. package/payload/server/public/assets/useSubAccountSwitcher-CsrPYqtm.css.br +0 -0
  193. package/payload/server/public/assets/useSubAccountSwitcher-CsrPYqtm.css.gz +0 -0
  194. package/payload/server/public/assets/{useVoiceRecorder-Cpw3aOSt.js → useVoiceRecorder-BT2738ZS.js} +1 -1
  195. package/payload/server/public/assets/useVoiceRecorder-BT2738ZS.js.br +0 -0
  196. package/payload/server/public/assets/useVoiceRecorder-BT2738ZS.js.gz +0 -0
  197. package/payload/server/public/assets/{wrench-BBEup3hd.js → wrench-B51s5kGA.js} +1 -1
  198. package/payload/server/public/assets/wrench-B51s5kGA.js.br +0 -0
  199. package/payload/server/public/assets/wrench-B51s5kGA.js.gz +0 -0
  200. package/payload/server/public/browser.html +4 -4
  201. package/payload/server/public/calendar.html +7 -7
  202. package/payload/server/public/chat.html +13 -13
  203. package/payload/server/public/data.html +11 -11
  204. package/payload/server/public/graph.html +9 -9
  205. package/payload/server/public/index.html +14 -14
  206. package/payload/server/public/operator.html +14 -14
  207. package/payload/server/public/public.html +13 -13
  208. package/payload/server/public/routines.html +6 -6
  209. package/payload/server/public/skills.html +5 -5
  210. package/payload/server/public/tasks.html +6 -6
  211. package/payload/server/server.js +1238 -653
  212. package/payload/server/public/assets/AdminLoginScreens-SW7mEMcP.js.br +0 -0
  213. package/payload/server/public/assets/AdminLoginScreens-SW7mEMcP.js.gz +0 -0
  214. package/payload/server/public/assets/AdminShell-Djg6ndne.js +0 -2
  215. package/payload/server/public/assets/AdminShell-Djg6ndne.js.br +0 -0
  216. package/payload/server/public/assets/AdminShell-Djg6ndne.js.gz +0 -0
  217. package/payload/server/public/assets/activity-sqbyX0pX.js.br +0 -0
  218. package/payload/server/public/assets/activity-sqbyX0pX.js.gz +0 -0
  219. package/payload/server/public/assets/admin-D9Bt47GY.js +0 -1
  220. package/payload/server/public/assets/admin-D9Bt47GY.js.br +0 -0
  221. package/payload/server/public/assets/admin-D9Bt47GY.js.gz +0 -0
  222. package/payload/server/public/assets/agents-BFYM5EDA.js.br +0 -0
  223. package/payload/server/public/assets/agents-BFYM5EDA.js.gz +0 -0
  224. package/payload/server/public/assets/browser-DP5GZe4G.js.br +0 -0
  225. package/payload/server/public/assets/browser-DP5GZe4G.js.gz +0 -0
  226. package/payload/server/public/assets/calendar-BKaemLDG.js.br +0 -0
  227. package/payload/server/public/assets/calendar-BKaemLDG.js.gz +0 -0
  228. package/payload/server/public/assets/chat-DPhT6urD.js +0 -1
  229. package/payload/server/public/assets/chat-DPhT6urD.js.br +0 -1
  230. package/payload/server/public/assets/chat-DPhT6urD.js.gz +0 -0
  231. package/payload/server/public/assets/chevron-left-BSdXvJcH.js +0 -1
  232. package/payload/server/public/assets/chevron-right-DI7vI3IB.js +0 -1
  233. package/payload/server/public/assets/chevron-right-DI7vI3IB.js.br +0 -0
  234. package/payload/server/public/assets/clock-YUTPXZH5.js +0 -1
  235. package/payload/server/public/assets/clock-YUTPXZH5.js.br +0 -0
  236. package/payload/server/public/assets/clock-YUTPXZH5.js.gz +0 -0
  237. package/payload/server/public/assets/data-CfjttTvR.js +0 -1
  238. package/payload/server/public/assets/data-CfjttTvR.js.br +0 -2
  239. package/payload/server/public/assets/data-CfjttTvR.js.gz +0 -0
  240. package/payload/server/public/assets/file-text-BKK7R-k_.js.br +0 -0
  241. package/payload/server/public/assets/file-text-BKK7R-k_.js.gz +0 -0
  242. package/payload/server/public/assets/graph-FuxYySjK.js.br +0 -0
  243. package/payload/server/public/assets/graph-FuxYySjK.js.gz +0 -0
  244. package/payload/server/public/assets/graph-labels-Cip6fmKK.js.br +0 -0
  245. package/payload/server/public/assets/graph-labels-Cip6fmKK.js.gz +0 -0
  246. package/payload/server/public/assets/maximize-2-D79AhVDo.js.br +0 -0
  247. package/payload/server/public/assets/maximize-2-D79AhVDo.js.gz +0 -0
  248. package/payload/server/public/assets/operator-BPAfgFhP.js.br +0 -0
  249. package/payload/server/public/assets/operator-BPAfgFhP.js.gz +0 -0
  250. package/payload/server/public/assets/page--78CbdFs.js +0 -32
  251. package/payload/server/public/assets/page--78CbdFs.js.br +0 -0
  252. package/payload/server/public/assets/page--78CbdFs.js.gz +0 -0
  253. package/payload/server/public/assets/page-BqEyS0W4.js.br +0 -0
  254. package/payload/server/public/assets/page-BqEyS0W4.js.gz +0 -0
  255. package/payload/server/public/assets/public-D1xs3FzD.js.br +0 -0
  256. package/payload/server/public/assets/public-D1xs3FzD.js.gz +0 -0
  257. package/payload/server/public/assets/rotate-ccw-CcU_XD8B.js.br +0 -0
  258. package/payload/server/public/assets/rotate-ccw-CcU_XD8B.js.gz +0 -0
  259. package/payload/server/public/assets/routines-CA7D0myr.js +0 -1
  260. package/payload/server/public/assets/routines-CA7D0myr.js.br +0 -0
  261. package/payload/server/public/assets/routines-CA7D0myr.js.gz +0 -0
  262. package/payload/server/public/assets/skills-CfVPPSxO.js +0 -1
  263. package/payload/server/public/assets/skills-CfVPPSxO.js.br +0 -0
  264. package/payload/server/public/assets/skills-CfVPPSxO.js.gz +0 -0
  265. package/payload/server/public/assets/tasks-DgieyZqz.js +0 -1
  266. package/payload/server/public/assets/tasks-DgieyZqz.js.br +0 -0
  267. package/payload/server/public/assets/tasks-DgieyZqz.js.gz +0 -0
  268. package/payload/server/public/assets/time-entry-format-IFqinQJj.js.br +0 -0
  269. package/payload/server/public/assets/time-entry-format-IFqinQJj.js.gz +0 -0
  270. package/payload/server/public/assets/triangle-alert-C5vH__sq.js.br +0 -0
  271. package/payload/server/public/assets/triangle-alert-C5vH__sq.js.gz +0 -0
  272. package/payload/server/public/assets/useCopyFeedback-BeL2gPl6.js.br +0 -0
  273. package/payload/server/public/assets/useCopyFeedback-BeL2gPl6.js.gz +0 -0
  274. package/payload/server/public/assets/useSubAccountSwitcher-CH9qm2Ad.js +0 -14
  275. package/payload/server/public/assets/useSubAccountSwitcher-CH9qm2Ad.js.br +0 -0
  276. package/payload/server/public/assets/useSubAccountSwitcher-CH9qm2Ad.js.gz +0 -0
  277. package/payload/server/public/assets/useSubAccountSwitcher-DLqUQzOl.css +0 -1
  278. package/payload/server/public/assets/useSubAccountSwitcher-DLqUQzOl.css.br +0 -0
  279. package/payload/server/public/assets/useSubAccountSwitcher-DLqUQzOl.css.gz +0 -0
  280. package/payload/server/public/assets/useVoiceRecorder-Cpw3aOSt.js.br +0 -0
  281. package/payload/server/public/assets/useVoiceRecorder-Cpw3aOSt.js.gz +0 -0
  282. package/payload/server/public/assets/wrench-BBEup3hd.js.br +0 -0
  283. package/payload/server/public/assets/wrench-BBEup3hd.js.gz +0 -0
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Per-account registry of DELEGATED mailboxes — shared mailboxes the signed-in
3
+ * user can reach through Exchange Full Access.
4
+ *
5
+ * A delegated mailbox never signs in, so it has no tokens of its own and cannot
6
+ * live in `mailboxes/<graphUserId>/tokens.enc` like a registered mailbox does.
7
+ * What is stored is a pointer: the shared address, and the mailbox key of the
8
+ * signed-in mailbox whose tokens address it. Holding no secret, this file is
9
+ * plain JSON rather than an encrypted blob, but it sits under the same 0700
10
+ * secrets directory and is written 0600 so its permissions never widen the
11
+ * directory's.
12
+ */
13
+ import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, statSync, unlinkSync, writeFileSync, } from "node:fs";
14
+ import { randomBytes } from "node:crypto";
15
+ import { join } from "node:path";
16
+ /** How long a writer waits for a peer's lock before refusing. Bounded because
17
+ * the caller is a live tool call, not a background job. */
18
+ const DELEGATED_LOCK_WAIT_MS = 5_000;
19
+ const DELEGATED_LOCK_POLL_MS = 25;
20
+ /** A lock older than this belonged to a process that died mid-write. Well
21
+ * inside the wait budget, so stealing one still leaves time to finish. */
22
+ const DELEGATED_LOCK_STALE_MS = 10_000;
23
+ /** Block this process briefly. The mutation is a few file operations long, so
24
+ * an async lock would buy nothing and would make every caller async. */
25
+ function sleepSync(ms) {
26
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
27
+ }
28
+ /** The one address form used as a key, everywhere. */
29
+ export function normalizeAddress(address) {
30
+ return address.trim().toLowerCase();
31
+ }
32
+ export class DelegatedStore {
33
+ accountId;
34
+ secretsDir;
35
+ filePath;
36
+ constructor(accountId, accountsDir) {
37
+ this.accountId = accountId;
38
+ this.secretsDir = join(accountsDir, accountId, "secrets", "outlook");
39
+ this.filePath = join(this.secretsDir, "delegated.json");
40
+ }
41
+ /**
42
+ * Every delegated mailbox on this account. An absent or unparseable file
43
+ * reads as empty: a delegated record carries no credential, so a corrupt one
44
+ * costs the operator a re-add, and refusing to list the readable mailboxes
45
+ * beside it would be the larger failure. An entry missing either field is
46
+ * dropped rather than surfaced half-formed, since a record without a
47
+ * delegator cannot address anything.
48
+ */
49
+ read() {
50
+ if (!existsSync(this.filePath))
51
+ return {};
52
+ try {
53
+ const parsed = JSON.parse(readFileSync(this.filePath, "utf8"));
54
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
55
+ return {};
56
+ const out = {};
57
+ for (const [address, entry] of Object.entries(parsed)) {
58
+ const e = entry;
59
+ if (typeof e?.viaMailboxKey !== "string" || typeof e?.addedAt !== "number")
60
+ continue;
61
+ out[normalizeAddress(address)] = { viaMailboxKey: e.viaMailboxKey, addedAt: e.addedAt };
62
+ }
63
+ return out;
64
+ }
65
+ catch {
66
+ return {};
67
+ }
68
+ }
69
+ add(address, viaMailboxKey, nowMs) {
70
+ this.mutate((map) => {
71
+ map[normalizeAddress(address)] = { viaMailboxKey, addedAt: nowMs };
72
+ return true;
73
+ });
74
+ }
75
+ /** True when an entry was removed, false when there was nothing to remove. */
76
+ remove(address) {
77
+ const key = normalizeAddress(address);
78
+ return this.mutate((map) => {
79
+ if (!Object.hasOwn(map, key))
80
+ return false;
81
+ delete map[key];
82
+ return true;
83
+ });
84
+ }
85
+ /**
86
+ * Read, change, write under an exclusive lock.
87
+ *
88
+ * Each write is atomic on its own, but add and remove are read-modify-write,
89
+ * so two processes attaching different mailboxes at the same moment would
90
+ * each write a map built from the state before the other's write and one
91
+ * record would be lost while both reported success. The MCP server runs one
92
+ * process per spawn and an account can hold several at once, so this is
93
+ * reachable. The lock is a directory, whose creation is atomic on every
94
+ * filesystem this runs on, and a holder older than the timeout is stolen so a
95
+ * process killed mid-write cannot wedge the account permanently.
96
+ */
97
+ mutate(change) {
98
+ const lockPath = `${this.filePath}.lock`;
99
+ mkdirSync(this.secretsDir, { recursive: true, mode: 0o700 });
100
+ const deadline = Date.now() + DELEGATED_LOCK_WAIT_MS;
101
+ for (;;) {
102
+ try {
103
+ mkdirSync(lockPath);
104
+ break;
105
+ }
106
+ catch (err) {
107
+ if (err.code !== "EEXIST")
108
+ throw err;
109
+ let ageMs = 0;
110
+ try {
111
+ ageMs = Date.now() - statSync(lockPath).mtimeMs;
112
+ }
113
+ catch {
114
+ continue; // the holder released it between our attempt and the stat
115
+ }
116
+ if (ageMs > DELEGATED_LOCK_STALE_MS) {
117
+ try {
118
+ rmSync(lockPath, { recursive: true, force: true });
119
+ }
120
+ catch {
121
+ // another process stole it first; retry the acquire
122
+ }
123
+ continue;
124
+ }
125
+ if (Date.now() > deadline) {
126
+ throw new Error(`Another process is updating this account's shared-mailbox records and did not release within ${DELEGATED_LOCK_WAIT_MS} ms. Retry.`);
127
+ }
128
+ sleepSync(DELEGATED_LOCK_POLL_MS);
129
+ }
130
+ }
131
+ try {
132
+ const map = this.read();
133
+ const changed = change(map);
134
+ if (changed)
135
+ this.write(map);
136
+ return changed;
137
+ }
138
+ finally {
139
+ rmSync(lockPath, { recursive: true, force: true });
140
+ }
141
+ }
142
+ /** Atomic: temp plus rename, so a reader sees either the old map or the new
143
+ * one and never a partial write. The temp name carries this writer's pid, so
144
+ * two processes on one account never share a temp path. */
145
+ write(map) {
146
+ mkdirSync(this.secretsDir, { recursive: true, mode: 0o700 });
147
+ const temp = `${this.filePath}.${process.pid}.${randomBytes(6).toString("hex")}.tmp`;
148
+ writeFileSync(temp, `${JSON.stringify(map, null, 2)}\n`, { mode: 0o600 });
149
+ try {
150
+ renameSync(temp, this.filePath);
151
+ }
152
+ catch (err) {
153
+ try {
154
+ unlinkSync(temp);
155
+ }
156
+ catch {
157
+ // the temp is already gone; nothing to clean up
158
+ }
159
+ throw err;
160
+ }
161
+ }
162
+ }
163
+ //# sourceMappingURL=delegated-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegated-store.js","sourceRoot":"","sources":["../../src/auth/delegated-store.ts"],"names":[],"mappings":"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"}
@@ -99,10 +99,22 @@ export declare class TokenRefreshError extends Error {
99
99
  get oauthError(): string | null;
100
100
  get statusCode(): number;
101
101
  }
102
+ /**
103
+ * Mint a new access token from a stored refresh token.
104
+ *
105
+ * `grantedScopes` is what THIS mailbox actually consented to, read from its
106
+ * stored blob — never the `SCOPES` constant. A refresh must ask for what was
107
+ * granted: widening `SCOPES` (Task 2122 added the two `.Shared` scopes) would
108
+ * otherwise make every already-connected mailbox request consent it never gave,
109
+ * and an `invalid_grant` answer to that is treated as a revoked grant, which
110
+ * clears the mailbox's credentials. An empty list omits `scope` entirely, which
111
+ * is how the token endpoint is told to return the original grant unchanged.
112
+ */
102
113
  export declare function refreshAccessToken(args: {
103
114
  clientId: string;
104
115
  tenantId: string;
105
116
  refreshToken: string;
117
+ grantedScopes: string[];
106
118
  }): Promise<TokenResponse>;
107
119
  export declare const _internals: {
108
120
  SCOPES: 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,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;;;;;;;;GAQG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAGxC,QAAQ,CAAC,KAAK,EAAE,eAAe;gBAD/B,OAAO,EAAE,MAAM,EACN,KAAK,EAAE,eAAe;IAMjC;6CACyC;IACzC,IAAI,UAAU,IAAI,MAAM,GAAG,IAAI,CAE9B;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;CACF;AAED,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,CAsBzB;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;AA+BH,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;;;;;;;;GAQG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAGxC,QAAQ,CAAC,KAAK,EAAE,eAAe;gBAD/B,OAAO,EAAE,MAAM,EACN,KAAK,EAAE,eAAe;IAMjC;6CACyC;IACzC,IAAI,UAAU,IAAI,MAAM,GAAG,IAAI,CAE9B;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;CACF;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB,GAAG,OAAO,CAAC,aAAa,CAAC,CAwBzB;AAED,eAAO,MAAM,UAAU;;CAAa,CAAC"}
@@ -10,11 +10,18 @@
10
10
  * `refreshAccessToken` (used by the read path in graph-client.ts) and the SCOPES
11
11
  * set are unchanged from the prior Auth-Code implementation.
12
12
  */
13
+ // The two `.Shared` scopes are what make a shared or delegated mailbox
14
+ // reachable at /users/<address>; without them Graph returns 403 even when the
15
+ // signed-in user holds Full Access. They widen only what THIS registration
16
+ // consents to — a mailbox already connected keeps the grant it was given and
17
+ // must be re-registered before it can reach a shared mailbox (Task 2122).
13
18
  const SCOPES = [
14
19
  "offline_access",
15
20
  "User.Read",
16
21
  "Mail.ReadWrite",
17
22
  "Mail.Send",
23
+ "Mail.ReadWrite.Shared",
24
+ "Mail.Send.Shared",
18
25
  "Calendars.ReadWrite",
19
26
  "Contacts.Read",
20
27
  ];
@@ -172,14 +179,27 @@ export class TokenRefreshError extends Error {
172
179
  return this.azure.httpStatus;
173
180
  }
174
181
  }
182
+ /**
183
+ * Mint a new access token from a stored refresh token.
184
+ *
185
+ * `grantedScopes` is what THIS mailbox actually consented to, read from its
186
+ * stored blob — never the `SCOPES` constant. A refresh must ask for what was
187
+ * granted: widening `SCOPES` (Task 2122 added the two `.Shared` scopes) would
188
+ * otherwise make every already-connected mailbox request consent it never gave,
189
+ * and an `invalid_grant` answer to that is treated as a revoked grant, which
190
+ * clears the mailbox's credentials. An empty list omits `scope` entirely, which
191
+ * is how the token endpoint is told to return the original grant unchanged.
192
+ */
175
193
  export async function refreshAccessToken(args) {
176
194
  const { tokenUrl } = buildUrls(args.tenantId);
177
195
  const params = new URLSearchParams({
178
196
  client_id: args.clientId,
179
- scope: SCOPES.join(" "),
180
197
  refresh_token: args.refreshToken,
181
198
  grant_type: "refresh_token",
182
199
  });
200
+ if (args.grantedScopes.length > 0) {
201
+ params.set("scope", args.grantedScopes.join(" "));
202
+ }
183
203
  const response = await fetch(tokenUrl, {
184
204
  method: "POST",
185
205
  headers: { "Content-Type": "application/x-www-form-urlencoded" },
@@ -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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"}
@@ -53,6 +53,12 @@ export type ResolveResult = {
53
53
  kind: "ok";
54
54
  store: TokenStore;
55
55
  descriptor: MailboxDescriptor;
56
+ /** "/me" for a signed-in mailbox, "/users/<encoded address>" for a delegated one. */
57
+ pathPrefix: string;
58
+ /** The delegator's identity when this is a delegated mailbox, else null. */
59
+ via: string | null;
60
+ /** The delegated address when this is a delegated mailbox, else null. */
61
+ delegatedAddress: string | null;
56
62
  } | {
57
63
  kind: "none";
58
64
  } | {
@@ -62,12 +68,27 @@ export type ResolveResult = {
62
68
  kind: "notfound";
63
69
  selector: string;
64
70
  identities: string[];
71
+ }
72
+ /** A shared mailbox is attached, but the mailbox that delegates for it is no
73
+ * longer connected. Distinct from `notfound` because the record exists and
74
+ * the remedy is different: re-register the delegator, or drop the record. */
75
+ | {
76
+ kind: "delegator-missing";
77
+ selector: string;
78
+ via: string;
65
79
  };
66
80
  export interface CredResolveEvent {
67
81
  event: "cred-resolve";
68
82
  account: string;
69
83
  mailbox: string;
70
84
  source: "arg" | "sole" | "none" | "refused";
85
+ /** Whether the call runs against the operator's own mailbox or through a
86
+ * delegation. Without it, a delegated call is indistinguishable in the log
87
+ * from a signed-in one, which is exactly the difference that matters when a
88
+ * shared mailbox stops answering. */
89
+ kind: "signed-in" | "delegated";
90
+ /** The delegator's identity on a delegated resolution, else "". */
91
+ via: string;
71
92
  }
72
93
  /**
73
94
  * The observability line for a resolution: names the *resolved* mailbox and how
@@ -82,6 +103,7 @@ export declare class MailboxRegistry {
82
103
  private readonly secretsDir;
83
104
  private readonly mailboxesDir;
84
105
  private readonly legacyTokensPath;
106
+ private readonly delegatedStore;
85
107
  constructor(accountId: string, accountsDir: string);
86
108
  /**
87
109
  * Move a pre-migration `secrets/outlook/tokens.enc` into
@@ -94,12 +116,21 @@ export declare class MailboxRegistry {
94
116
  list(): MailboxDescriptor[];
95
117
  private describe;
96
118
  /**
97
- * Resolve a mailbox selector to a TokenStore. Order: explicit selector
98
- * (matched against graphUserId or mail, case-insensitive) the sole readable
99
- * mailbox ambiguous (≥2 readable, none named) → none (zero readable).
100
- * Unreadable mailboxes are never addressable.
119
+ * Resolve a mailbox selector to a TokenStore and the Graph path prefix that
120
+ * addresses it. Order: an explicit selector against the signed-in mailboxes
121
+ * (graphUserId or mail, case-insensitive) → the same selector against the
122
+ * delegated records the sole readable signed-in mailbox → ambiguous (≥2
123
+ * attached, none named) → none. Unreadable mailboxes are never addressable.
124
+ *
125
+ * Delegated records deliberately take part in NEITHER the sole-mailbox
126
+ * default nor the ambiguity count. Attaching a shared mailbox must not change
127
+ * what a bare call means, or every existing tool call on a single-mailbox
128
+ * account would start refusing the moment a shared mailbox was added.
101
129
  */
102
130
  resolve(selector?: string): ResolveResult;
131
+ /** Every selectable identity on this account, signed-in and delegated, so a
132
+ * refusal is honest about what IS attached rather than listing half of it. */
133
+ private identities;
103
134
  /** A TokenStore for a specific mailbox key (a graphUserId at register time, or
104
135
  * a descriptor's mailboxKey). Overwrites that mailbox in place on store(). */
105
136
  storeFor(mailboxKey: string): TokenStore;
@@ -1 +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;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,aAAa,GAAG,iBAAiB,GAAG,IAAI,CAAC;AAEpF,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;IAClB,2EAA2E;IAC3E,MAAM,EAAE,aAAa,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;CACzB,GAAG,aAAa,CAKhB;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;IAuBhB;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa;IA8BzC;kFAC8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU;CAGzC"}
1
+ {"version":3,"file":"mailbox-registry.d.ts","sourceRoot":"","sources":["../../src/auth/mailbox-registry.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,8 @@
14
14
  import { existsSync, mkdirSync, readdirSync, renameSync, unlinkSync } from "node:fs";
15
15
  import { join } from "node:path";
16
16
  import { TokenStore, sanitizeMailboxKey } from "./token-store.js";
17
+ import { DelegatedStore, normalizeAddress } from "./delegated-store.js";
18
+ import { OWN_MAILBOX_PREFIX, sharedMailboxPrefix } from "../lib/graph-client.js";
17
19
  /**
18
20
  * Classify a mailbox's usability from its readable/mail/refresh facts. Pure and
19
21
  * total, evaluated in precedence order so the most blocking condition wins:
@@ -48,14 +50,43 @@ export function credResolveEvent(resolved, account, selector) {
48
50
  return {
49
51
  event: "cred-resolve",
50
52
  account,
51
- mailbox: identityOf(resolved.descriptor),
53
+ mailbox: resolved.delegatedAddress ?? identityOf(resolved.descriptor),
52
54
  source: selector ? "arg" : "sole",
55
+ kind: resolved.delegatedAddress ? "delegated" : "signed-in",
56
+ via: resolved.via ?? "",
53
57
  };
54
58
  }
55
59
  if (resolved.kind === "none") {
56
- return { event: "cred-resolve", account, mailbox: "", source: "none" };
60
+ return {
61
+ event: "cred-resolve",
62
+ account,
63
+ mailbox: "",
64
+ source: "none",
65
+ kind: "signed-in",
66
+ via: "",
67
+ };
57
68
  }
58
- return { event: "cred-resolve", account, mailbox: selector ?? "", source: "refused" };
69
+ if (resolved.kind === "delegator-missing") {
70
+ // The one refusal these two fields exist to diagnose. Labelling it
71
+ // signed-in with no delegator would hide exactly the fact the operator
72
+ // needs: which mailbox was supposed to reach this shared one.
73
+ return {
74
+ event: "cred-resolve",
75
+ account,
76
+ mailbox: resolved.selector,
77
+ source: "refused",
78
+ kind: "delegated",
79
+ via: resolved.via,
80
+ };
81
+ }
82
+ return {
83
+ event: "cred-resolve",
84
+ account,
85
+ mailbox: selector ?? "",
86
+ source: "refused",
87
+ kind: "signed-in",
88
+ via: "",
89
+ };
59
90
  }
60
91
  export class MailboxRegistry {
61
92
  accountId;
@@ -63,12 +94,14 @@ export class MailboxRegistry {
63
94
  secretsDir;
64
95
  mailboxesDir;
65
96
  legacyTokensPath;
97
+ delegatedStore;
66
98
  constructor(accountId, accountsDir) {
67
99
  this.accountId = accountId;
68
100
  this.accountsDir = accountsDir;
69
101
  this.secretsDir = join(accountsDir, accountId, "secrets", "outlook");
70
102
  this.mailboxesDir = join(this.secretsDir, "mailboxes");
71
103
  this.legacyTokensPath = join(this.secretsDir, "tokens.enc");
104
+ this.delegatedStore = new DelegatedStore(accountId, accountsDir);
72
105
  }
73
106
  /**
74
107
  * Move a pre-migration `secrets/outlook/tokens.enc` into
@@ -149,22 +182,56 @@ export class MailboxRegistry {
149
182
  }
150
183
  }
151
184
  /**
152
- * Resolve a mailbox selector to a TokenStore. Order: explicit selector
153
- * (matched against graphUserId or mail, case-insensitive) the sole readable
154
- * mailbox ambiguous (≥2 readable, none named) → none (zero readable).
155
- * Unreadable mailboxes are never addressable.
185
+ * Resolve a mailbox selector to a TokenStore and the Graph path prefix that
186
+ * addresses it. Order: an explicit selector against the signed-in mailboxes
187
+ * (graphUserId or mail, case-insensitive) → the same selector against the
188
+ * delegated records the sole readable signed-in mailbox → ambiguous (≥2
189
+ * attached, none named) → none. Unreadable mailboxes are never addressable.
190
+ *
191
+ * Delegated records deliberately take part in NEITHER the sole-mailbox
192
+ * default nor the ambiguity count. Attaching a shared mailbox must not change
193
+ * what a bare call means, or every existing tool call on a single-mailbox
194
+ * account would start refusing the moment a shared mailbox was added.
156
195
  */
157
196
  resolve(selector) {
158
197
  const all = this.list();
159
198
  const addressable = all.filter((d) => d.readable);
199
+ const delegated = this.delegatedStore.read();
160
200
  if (selector) {
161
201
  const needle = selector.toLowerCase();
162
202
  const match = addressable.find((d) => d.graphUserId?.toLowerCase() === needle ||
163
203
  d.mail?.toLowerCase() === needle);
164
204
  if (match) {
165
- return { kind: "ok", store: this.storeFor(match.mailboxKey), descriptor: match };
205
+ return {
206
+ kind: "ok",
207
+ store: this.storeFor(match.mailboxKey),
208
+ descriptor: match,
209
+ pathPrefix: OWN_MAILBOX_PREFIX,
210
+ via: null,
211
+ delegatedAddress: null,
212
+ };
166
213
  }
167
- return { kind: "notfound", selector, identities: all.map(identityOf) };
214
+ const address = normalizeAddress(selector);
215
+ // Own-property check, not a bare index: a plain object answers
216
+ // "constructor" or "toString" with an inherited function, which would
217
+ // read as an attached delegated record and refuse with a confabulated
218
+ // "attached through a mailbox that is no longer connected".
219
+ const entry = Object.hasOwn(delegated, address) ? delegated[address] : undefined;
220
+ if (entry) {
221
+ const delegator = addressable.find((d) => d.mailboxKey === entry.viaMailboxKey);
222
+ if (!delegator) {
223
+ return { kind: "delegator-missing", selector: address, via: entry.viaMailboxKey };
224
+ }
225
+ return {
226
+ kind: "ok",
227
+ store: this.storeFor(delegator.mailboxKey),
228
+ descriptor: delegator,
229
+ pathPrefix: sharedMailboxPrefix(address),
230
+ via: identityOf(delegator),
231
+ delegatedAddress: address,
232
+ };
233
+ }
234
+ return { kind: "notfound", selector, identities: this.identities(all, delegated) };
168
235
  }
169
236
  // Ambiguity is decided by the number of mailboxes *attached* (readable or
170
237
  // not), never the readable subset. If a second mailbox is transiently
@@ -174,11 +241,26 @@ export class MailboxRegistry {
174
241
  return { kind: "none" };
175
242
  if (all.length === 1) {
176
243
  return addressable.length === 1
177
- ? { kind: "ok", store: this.storeFor(addressable[0].mailboxKey), descriptor: addressable[0] }
244
+ ? {
245
+ kind: "ok",
246
+ store: this.storeFor(addressable[0].mailboxKey),
247
+ descriptor: addressable[0],
248
+ pathPrefix: OWN_MAILBOX_PREFIX,
249
+ via: null,
250
+ delegatedAddress: null,
251
+ }
178
252
  : { kind: "none" };
179
253
  }
180
254
  return { kind: "ambiguous", identities: all.map(identityOf) };
181
255
  }
256
+ /** Every selectable identity on this account, signed-in and delegated, so a
257
+ * refusal is honest about what IS attached rather than listing half of it. */
258
+ identities(all, delegated) {
259
+ return [
260
+ ...all.map(identityOf),
261
+ ...Object.keys(delegated).map((address) => `${address} (delegated)`),
262
+ ];
263
+ }
182
264
  /** A TokenStore for a specific mailbox key (a graphUserId at register time, or
183
265
  * a descriptor's mailboxKey). Overwrites that mailbox in place on store(). */
184
266
  storeFor(mailboxKey) {
@@ -1 +1 @@
1
- {"version":3,"file":"mailbox-registry.js","sourceRoot":"","sources":["../../src/auth/mailbox-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mailbox-registry.js","sourceRoot":"","sources":["../../src/auth/mailbox-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAqB,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AA8BjF;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,CAI7B;IACC,IAAI,CAAC,CAAC,CAAC,QAAQ;QAAE,OAAO,YAAY,CAAC;IACrC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,aAAa,CAAC;IAC1D,IAAI,CAAC,CAAC,cAAc;QAAE,OAAO,iBAAiB,CAAC;IAC/C,OAAO,IAAI,CAAC;AACd,CAAC;AAsBD;;wEAEwE;AACxE,SAAS,UAAU,CAAC,CAAoB;IACtC,IAAI,CAAC,CAAC,CAAC,QAAQ;QAAE,OAAO,GAAG,CAAC,CAAC,UAAU,eAAe,CAAC;IACvD,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,UAAU,CAAC;AACjD,CAAC;AAgBD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAuB,EACvB,OAAe,EACf,QAAiB;IAEjB,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO;YACL,KAAK,EAAE,cAAc;YACrB,OAAO;YACP,OAAO,EAAE,QAAQ,CAAC,gBAAgB,IAAI,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;YACrE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;YACjC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW;YAC3D,GAAG,EAAE,QAAQ,CAAC,GAAG,IAAI,EAAE;SACxB,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC7B,OAAO;YACL,KAAK,EAAE,cAAc;YACrB,OAAO;YACP,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,WAAW;YACjB,GAAG,EAAE,EAAE;SACR,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QAC1C,mEAAmE;QACnE,uEAAuE;QACvE,8DAA8D;QAC9D,OAAO;YACL,KAAK,EAAE,cAAc;YACrB,OAAO;YACP,OAAO,EAAE,QAAQ,CAAC,QAAQ;YAC1B,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,WAAW;YACjB,GAAG,EAAE,QAAQ,CAAC,GAAG;SAClB,CAAC;IACJ,CAAC;IACD,OAAO;QACL,KAAK,EAAE,cAAc;QACrB,OAAO;QACP,OAAO,EAAE,QAAQ,IAAI,EAAE;QACvB,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,WAAW;QACjB,GAAG,EAAE,EAAE;KACR,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,eAAe;IAOR;IACC;IAPF,UAAU,CAAS;IACnB,YAAY,CAAS;IACrB,gBAAgB,CAAS;IACzB,cAAc,CAAiB;IAEhD,YACkB,SAAiB,EAChB,WAAmB;QADpB,cAAS,GAAT,SAAS,CAAQ;QAChB,gBAAW,GAAX,WAAW,CAAQ;QAEpC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACrE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACvD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAC5D,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACnE,CAAC;IAED;;;;;OAKG;IACK,aAAa;QACnB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC;YAAE,OAAO;QAC/C,IAAI,GAAG,GAAG,SAAS,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;YACrE,IAAI,IAAI,EAAE,WAAW;gBAAE,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;YACvE,4EAA4E;YAC5E,GAAG,GAAG,mBAAmB,CAAC;QAC5B,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC7C,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,yEAAyE;gBACzE,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,sEAAsE;YACtE,4EAA4E;YAC5E,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,CAAC;QAClE,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,IAAI;QACF,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;YAAE,OAAO,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAwB,EAAE,CAAC;QACpC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC5E,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBAAE,SAAS;YACnC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC;YAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;gBAAE,SAAS;YAC7E,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,QAAQ,CAAC,UAAkB;QACjC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC3E,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;YACpJ,CAAC;YACD,MAAM,cAAc,GAAG,KAAK,CAAC,mBAAmB,EAAE,CAAC;YACnD,OAAO;gBACL,UAAU;gBACV,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;gBACtD,cAAc;gBACd,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,aAAa,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC;aAC3E,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;QACpJ,CAAC;IACH,CAAC;IAED;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,QAAiB;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,SAAS,GAAiB,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAE3D,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAC5B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,MAAM;gBACvC,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,MAAM,CACnC,CAAC;YACF,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO;oBACL,IAAI,EAAE,IAAI;oBACV,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;oBACtC,UAAU,EAAE,KAAK;oBACjB,UAAU,EAAE,kBAAkB;oBAC9B,GAAG,EAAE,IAAI;oBACT,gBAAgB,EAAE,IAAI;iBACvB,CAAC;YACJ,CAAC;YACD,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC3C,+DAA+D;YAC/D,sEAAsE;YACtE,sEAAsE;YACtE,4DAA4D;YAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACjF,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,KAAK,CAAC,aAAa,CAAC,CAAC;gBAChF,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;gBACpF,CAAC;gBACD,OAAO;oBACL,IAAI,EAAE,IAAI;oBACV,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC;oBAC1C,UAAU,EAAE,SAAS;oBACrB,UAAU,EAAE,mBAAmB,CAAC,OAAO,CAAC;oBACxC,GAAG,EAAE,UAAU,CAAC,SAAS,CAAC;oBAC1B,gBAAgB,EAAE,OAAO;iBAC1B,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC;QACrF,CAAC;QAED,0EAA0E;QAC1E,sEAAsE;QACtE,2EAA2E;QAC3E,yEAAyE;QACzE,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC9C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,WAAW,CAAC,MAAM,KAAK,CAAC;gBAC7B,CAAC,CAAC;oBACE,IAAI,EAAE,IAAI;oBACV,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;oBAC/C,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;oBAC1B,UAAU,EAAE,kBAAkB;oBAC9B,GAAG,EAAE,IAAI;oBACT,gBAAgB,EAAE,IAAI;iBACvB;gBACH,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACvB,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;IAChE,CAAC;IAED;kFAC8E;IACtE,UAAU,CAAC,GAAwB,EAAE,SAAuB;QAClE,OAAO;YACL,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC;YACtB,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,cAAc,CAAC;SACrE,CAAC;IACJ,CAAC;IAED;kFAC8E;IAC9E,QAAQ,CAAC,UAAkB;QACzB,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACtE,CAAC;CACF"}