@rubytech/create-maxy-code 0.1.495 → 0.1.497

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 (212) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/docs/superpowers/plans/2026-07-24-task-1942-subaccount-switcher-brand-head.md +327 -0
  3. package/payload/platform/docs/superpowers/specs/2026-07-24-task-1942-subaccount-switcher-brand-head-design.md +35 -0
  4. package/payload/platform/plugins/admin/skills/insight/SKILL.md +1 -1
  5. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +36 -11
  6. package/payload/platform/plugins/docs/references/admin-ui.md +30 -9
  7. package/payload/platform/plugins/docs/references/outlook-guide.md +5 -1
  8. package/payload/platform/plugins/memory/references/schema-estate-agent.md +1 -1
  9. package/payload/platform/plugins/outlook/.claude-plugin/plugin.json +1 -1
  10. package/payload/platform/plugins/outlook/PLUGIN.md +6 -2
  11. package/payload/platform/plugins/outlook/mcp/dist/__tests__/dispatch-grouping.test.d.ts +2 -0
  12. package/payload/platform/plugins/outlook/mcp/dist/__tests__/dispatch-grouping.test.d.ts.map +1 -0
  13. package/payload/platform/plugins/outlook/mcp/dist/__tests__/dispatch-grouping.test.js +54 -0
  14. package/payload/platform/plugins/outlook/mcp/dist/__tests__/dispatch-grouping.test.js.map +1 -0
  15. package/payload/platform/plugins/outlook/mcp/dist/__tests__/fetch-body-fromname.test.d.ts +2 -0
  16. package/payload/platform/plugins/outlook/mcp/dist/__tests__/fetch-body-fromname.test.d.ts.map +1 -0
  17. package/payload/platform/plugins/outlook/mcp/dist/__tests__/fetch-body-fromname.test.js +19 -0
  18. package/payload/platform/plugins/outlook/mcp/dist/__tests__/fetch-body-fromname.test.js.map +1 -0
  19. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mail-ingest-decisions.test.d.ts +2 -0
  20. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mail-ingest-decisions.test.d.ts.map +1 -0
  21. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mail-ingest-decisions.test.js +20 -0
  22. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mail-ingest-decisions.test.js.map +1 -0
  23. package/payload/platform/plugins/outlook/mcp/dist/index.js +21 -0
  24. package/payload/platform/plugins/outlook/mcp/dist/index.js.map +1 -1
  25. package/payload/platform/plugins/outlook/mcp/dist/lib/conversation-archive-dispatch.d.ts +40 -0
  26. package/payload/platform/plugins/outlook/mcp/dist/lib/conversation-archive-dispatch.d.ts.map +1 -0
  27. package/payload/platform/plugins/outlook/mcp/dist/lib/conversation-archive-dispatch.js +143 -0
  28. package/payload/platform/plugins/outlook/mcp/dist/lib/conversation-archive-dispatch.js.map +1 -0
  29. package/payload/platform/plugins/outlook/mcp/dist/lib/neo4j.d.ts +5 -0
  30. package/payload/platform/plugins/outlook/mcp/dist/lib/neo4j.d.ts.map +1 -0
  31. package/payload/platform/plugins/outlook/mcp/dist/lib/neo4j.js +44 -0
  32. package/payload/platform/plugins/outlook/mcp/dist/lib/neo4j.js.map +1 -0
  33. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-fetch-body.d.ts +14 -0
  34. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-fetch-body.d.ts.map +1 -1
  35. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-fetch-body.js +13 -1
  36. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-fetch-body.js.map +1 -1
  37. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-ingest.d.ts +27 -0
  38. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-ingest.d.ts.map +1 -0
  39. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-ingest.js +69 -0
  40. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-ingest.js.map +1 -0
  41. package/payload/platform/plugins/outlook/mcp/package.json +1 -0
  42. package/payload/platform/plugins/outlook/references/graph-surfaces.md +10 -1
  43. package/payload/platform/plugins/outlook/skills/outlook/SKILL.md +4 -0
  44. package/payload/platform/plugins/outlook/skills/outlook-mail-ingest/SKILL.md +85 -0
  45. package/payload/platform/scripts/__tests__/account-schema-owned-dirs.test.sh +51 -7
  46. package/payload/platform/scripts/__tests__/provision-role-stamp.test.sh +4 -1
  47. package/payload/platform/scripts/lib/account-schema-owned-dirs.py +13 -1
  48. package/payload/platform/scripts/lib/account-schema-owned-dirs.sh +23 -1
  49. package/payload/platform/scripts/lib/provision-account-dir.sh +5 -0
  50. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  51. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +1 -0
  52. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  53. package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
  54. package/payload/server/public/activity.html +5 -5
  55. package/payload/server/public/assets/{AdminLoginScreens-DgVFsHtd.js → AdminLoginScreens-BXDYzNbq.js} +1 -1
  56. package/payload/server/public/assets/AdminShell-CiTHCp5t.js +2 -0
  57. package/payload/server/public/assets/{activity-2DL2DwLr.js → activity-cVe5ZnG7.js} +1 -1
  58. package/payload/server/public/assets/admin-BbcLizN0.js +1 -0
  59. package/payload/server/public/assets/{arc-CFMJyMm-.js → arc-BrHWN2Kr.js} +1 -1
  60. package/payload/server/public/assets/architecture-YZFGNWBL-CZQzGRSM.js +1 -0
  61. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-CiSSgdL8.js → architectureDiagram-Q4EWVU46-1OxSL3rT.js} +1 -1
  62. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-_sXtIW5c.js → blockDiagram-DXYQGD6D-C6yKiblF.js} +1 -1
  63. package/payload/server/public/assets/{bot-CpBuDQlF.js → bot-Bb8yj02k.js} +1 -1
  64. package/payload/server/public/assets/{browser-CSApuZrv.js → browser-BdWeCfYJ.js} +1 -1
  65. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-Bh7OAMXs.js → c4Diagram-AHTNJAMY-BzTyHS1I.js} +1 -1
  66. package/payload/server/public/assets/calendar-B4KbpiXR.js +1 -0
  67. package/payload/server/public/assets/channel-uhtvXKHn.js +1 -0
  68. package/payload/server/public/assets/chat-BEcbZB3e.js +1 -0
  69. package/payload/server/public/assets/chevron-left-Cy_RXwhn.js +1 -0
  70. package/payload/server/public/assets/chevron-right-CEjdB4AT.js +1 -0
  71. package/payload/server/public/assets/{chunk-2KRD3SAO-D4fktAwW.js → chunk-2KRD3SAO-BGAUfWvM.js} +1 -1
  72. package/payload/server/public/assets/{chunk-336JU56O-CcQoKH2G.js → chunk-336JU56O-M1H_u2Qv.js} +2 -2
  73. package/payload/server/public/assets/chunk-426QAEUC-D4XtWgLR.js +1 -0
  74. package/payload/server/public/assets/{chunk-4BX2VUAB-C13Wz3zS.js → chunk-4BX2VUAB-CkxXXCiF.js} +1 -1
  75. package/payload/server/public/assets/{chunk-4TB4RGXK-BL48D7gN.js → chunk-4TB4RGXK-DPWZYGHH.js} +1 -1
  76. package/payload/server/public/assets/{chunk-55IACEB6-TmOKdy8a.js → chunk-55IACEB6-CBkNmqrt.js} +1 -1
  77. package/payload/server/public/assets/{chunk-5FUZZQ4R-DZ_jSF6N.js → chunk-5FUZZQ4R-uIqIu9ha.js} +1 -1
  78. package/payload/server/public/assets/{chunk-5PVQY5BW-De4G1vfV.js → chunk-5PVQY5BW-B_S7XzpE.js} +1 -1
  79. package/payload/server/public/assets/{chunk-67CJDMHE-Cif9Uu5C.js → chunk-67CJDMHE-BbMV1lgW.js} +1 -1
  80. package/payload/server/public/assets/{chunk-7N4EOEYR-WjTHCXnd.js → chunk-7N4EOEYR-C49Mv-nQ.js} +1 -1
  81. package/payload/server/public/assets/{chunk-AA7GKIK3-CwCfdQmb.js → chunk-AA7GKIK3-Dy_pJOp_.js} +1 -1
  82. package/payload/server/public/assets/{chunk-BSJP7CBP-9A67yXwT.js → chunk-BSJP7CBP-Ce-OmPqn.js} +1 -1
  83. package/payload/server/public/assets/{chunk-CIAEETIT-DPMiWSBi.js → chunk-CIAEETIT-tnjq-APC.js} +1 -1
  84. package/payload/server/public/assets/{chunk-EDXVE4YY-C2f_Qvx-.js → chunk-EDXVE4YY-uzO7kO4e.js} +1 -1
  85. package/payload/server/public/assets/{chunk-ENJZ2VHE-B-Q9EbSQ.js → chunk-ENJZ2VHE-DQMOsG1f.js} +1 -1
  86. package/payload/server/public/assets/{chunk-FMBD7UC4-Bmt_ZRlV.js → chunk-FMBD7UC4-Top6y08S.js} +1 -1
  87. package/payload/server/public/assets/{chunk-FOC6F5B3-DfGJGxpX.js → chunk-FOC6F5B3-B9LPNCUS.js} +1 -1
  88. package/payload/server/public/assets/{chunk-ICPOFSXX-Wyym1Q8K.js → chunk-ICPOFSXX-DeIt3WoY.js} +2 -2
  89. package/payload/server/public/assets/{chunk-K5T4RW27-DMpoaqw2.js → chunk-K5T4RW27-DAnRM04h.js} +1 -1
  90. package/payload/server/public/assets/{chunk-KGLVRYIC-DYUFgri2.js → chunk-KGLVRYIC-C0QYcbLe.js} +1 -1
  91. package/payload/server/public/assets/{chunk-LIHQZDEY-x3LmeKmx.js → chunk-LIHQZDEY-BjvA5ykt.js} +1 -1
  92. package/payload/server/public/assets/{chunk-ORNJ4GCN-BeuNAWkW.js → chunk-ORNJ4GCN-Cs46Gj7z.js} +1 -1
  93. package/payload/server/public/assets/{chunk-OYMX7WX6-BUWVAfQA.js → chunk-OYMX7WX6-CBHIFMBx.js} +1 -1
  94. package/payload/server/public/assets/chunk-QZHKN3VN-Qlc2PFAj.js +1 -0
  95. package/payload/server/public/assets/{chunk-U2HBQHQK-DKS5adQo.js → chunk-U2HBQHQK-5_DL8yx6.js} +1 -1
  96. package/payload/server/public/assets/{chunk-X2U36JSP-CT_UM4IN.js → chunk-X2U36JSP-BDCaWRe9.js} +1 -1
  97. package/payload/server/public/assets/{chunk-XPW4576I-ByFnN4JO.js → chunk-XPW4576I-B10QuxYb.js} +1 -1
  98. package/payload/server/public/assets/{chunk-YZCP3GAM-DCetC20J.js → chunk-YZCP3GAM-81jJqyDd.js} +1 -1
  99. package/payload/server/public/assets/{chunk-ZZ45TVLE-Bh1QIv8N.js → chunk-ZZ45TVLE-DGx3J6Dx.js} +1 -1
  100. package/payload/server/public/assets/classDiagram-6PBFFD2Q-CBH5ngSm.js +1 -0
  101. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-Ck3eNZce.js +1 -0
  102. package/payload/server/public/assets/clone-Cv8evfNb.js +1 -0
  103. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-DgLEaApT.js → cose-bilkent-S5V4N54A-CRDvLRXs.js} +1 -1
  104. package/payload/server/public/assets/{dagre-unhMIyVo.js → dagre--rdjN6xZ.js} +1 -1
  105. package/payload/server/public/assets/{dagre-KV5264BT-BfkUPrEV.js → dagre-KV5264BT-DHbVQPnV.js} +1 -1
  106. package/payload/server/public/assets/data-L-hMHLBN.js +1 -0
  107. package/payload/server/public/assets/{diagram-5BDNPKRD-BjjwcTD9.js → diagram-5BDNPKRD-D8HC1Idg.js} +1 -1
  108. package/payload/server/public/assets/{diagram-G4DWMVQ6-BbgWtVSS.js → diagram-G4DWMVQ6-evvg8aey.js} +1 -1
  109. package/payload/server/public/assets/{diagram-MMDJMWI5-DyAnkWGy.js → diagram-MMDJMWI5-4hZuk-Dd.js} +1 -1
  110. package/payload/server/public/assets/{diagram-TYMM5635-SAMMoLxq.js → diagram-TYMM5635-Cwei1ql9.js} +1 -1
  111. package/payload/server/public/assets/{erDiagram-SMLLAGMA-Cvo-5-fD.js → erDiagram-SMLLAGMA-BG5OK4Fx.js} +1 -1
  112. package/payload/server/public/assets/{flatten-BXzaHgtL.js → flatten-naJ5PJ4f.js} +1 -1
  113. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-y3o2Ycld.js → flowDiagram-DWJPFMVM-CPB_poda.js} +1 -1
  114. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BEm_CQaK.js → ganttDiagram-T4ZO3ILL-CD6BL1UP.js} +1 -1
  115. package/payload/server/public/assets/gitGraph-7Q5UKJZL-CBZPQJLj.js +1 -0
  116. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-CqmOxS7F.js → gitGraphDiagram-UUTBAWPF-C-e8FDGn.js} +1 -1
  117. package/payload/server/public/assets/{graph-kaxS9a_7.js → graph-COyGp2x1.js} +3 -3
  118. package/payload/server/public/assets/{graph-labels-GgejRtgV.js → graph-labels-CR-HqNdV.js} +1 -1
  119. package/payload/server/public/assets/{graphlib-_HfbQcBf.js → graphlib-CdCZY1Mj.js} +1 -1
  120. package/payload/server/public/assets/info-OMHHGYJF-1vIoX-kP.js +1 -0
  121. package/payload/server/public/assets/infoDiagram-42DDH7IO-BDInZV9G.js +2 -0
  122. package/payload/server/public/assets/{isEmpty-uB1dEu_Z.js → isEmpty-Bnpg7b8f.js} +1 -1
  123. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-C_d0vcZC.js → ishikawaDiagram-UXIWVN3A-CFLhfPpo.js} +1 -1
  124. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-DsjRBqlW.js → journeyDiagram-VCZTEJTY-BN0PaMgT.js} +1 -1
  125. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-BwtK6LS-.js → kanban-definition-6JOO6SKY-CmRilACp.js} +1 -1
  126. package/payload/server/public/assets/{line-szBCFOLJ.js → line-DR6Zk7d6.js} +1 -1
  127. package/payload/server/public/assets/{linear-X3O7lwK3.js → linear-CAOWPodQ.js} +1 -1
  128. package/payload/server/public/assets/{maximize-2-CPq3nwZA.js → maximize-2-ne1kaQlS.js} +1 -1
  129. package/payload/server/public/assets/{mermaid-parser.core-BavvMAhU.js → mermaid-parser.core-0vmQl6Gn.js} +2 -2
  130. package/payload/server/public/assets/{mermaid.core-Br2F9Hdm.js → mermaid.core-DWgpHiLh.js} +3 -3
  131. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-4qlwXoJ-.js → mindmap-definition-QFDTVHPH-CViR7VGV.js} +1 -1
  132. package/payload/server/public/assets/operator-Q0F_EEyq.js +1 -0
  133. package/payload/server/public/assets/{ordinal-CZY9laxg.js → ordinal-Wx4m9zHk.js} +1 -1
  134. package/payload/server/public/assets/packet-4T2RLAQJ-CTU0gCGb.js +1 -0
  135. package/payload/server/public/assets/{page-DBHzC59_.js → page-DwfYACyC.js} +4 -4
  136. package/payload/server/public/assets/page-bRjlk8Dt.js +1 -0
  137. package/payload/server/public/assets/{pdf-render-H884L3EI.js → pdf-render-0hyh3Jlf.js} +1 -1
  138. package/payload/server/public/assets/pie-ZZUOXDRM-D-EEHxhC.js +1 -0
  139. package/payload/server/public/assets/{pieDiagram-DEJITSTG-BbXryIg0.js → pieDiagram-DEJITSTG-B7YQ1_Kr.js} +1 -1
  140. package/payload/server/public/assets/{public-jIzvdjt_.js → public-BACeh5xm.js} +1 -1
  141. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-BHLjcvh3.js → quadrantDiagram-34T5L4WZ-Dxs0nGu5.js} +1 -1
  142. package/payload/server/public/assets/radar-PYXPWWZC-DHXATZGB.js +1 -0
  143. package/payload/server/public/assets/{reduce-BGQzAenn.js → reduce-BUmc8RDR.js} +1 -1
  144. package/payload/server/public/assets/{requirementDiagram-MS252O5E-BXaVO0lk.js → requirementDiagram-MS252O5E-DDNYDqZc.js} +1 -1
  145. package/payload/server/public/assets/{rotate-ccw-DieZzl10.js → rotate-ccw-tY4mfSrJ.js} +1 -1
  146. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-CmN1s17Q.js → sankeyDiagram-XADWPNL6-DLWoegU5.js} +1 -1
  147. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-DC08e5NY.js → sequenceDiagram-FGHM5R23-DINNPlTY.js} +1 -1
  148. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-DnoQMuOW.js → stateDiagram-FHFEXIEX-Dsan8EIl.js} +1 -1
  149. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-B4yeYYgL.js +1 -0
  150. package/payload/server/public/assets/{tasks-DYyCGz8W.js → tasks-C4nPXsbX.js} +1 -1
  151. package/payload/server/public/assets/{time-entry-format-CC_9jFuR.js → time-entry-format-CmqjpGG2.js} +1 -1
  152. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-eTn3uRaH.js → timeline-definition-GMOUNBTQ-CISzecz5.js} +1 -1
  153. package/payload/server/public/assets/treeView-SZITEDCU-CC7ouMFd.js +1 -0
  154. package/payload/server/public/assets/treemap-W4RFUUIX-CaCg27im.js +1 -0
  155. package/payload/server/public/assets/{triangle-alert-7mQfCQWP.js → triangle-alert-DKZ69dOa.js} +1 -1
  156. package/payload/server/public/assets/{useCopyFeedback-os7N0yCx.js → useCopyFeedback-Cf5jFDR5.js} +1 -1
  157. package/payload/server/public/assets/useSubAccountSwitcher-DFnDNIDO.css +1 -0
  158. package/payload/server/public/assets/useSubAccountSwitcher-DdctgpPL.js +9 -0
  159. package/payload/server/public/assets/{useVoiceRecorder-ZFwt5i6d.js → useVoiceRecorder-BVdKbTku.js} +2 -2
  160. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-DNx6o_ZQ.js → vennDiagram-DHZGUBPP-Bh2s76nJ.js} +1 -1
  161. package/payload/server/public/assets/wardley-RL74JXVD-bMPsqQZ7.js +1 -0
  162. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-BZOchqF3.js → wardleyDiagram-NUSXRM2D-Grzw0FHg.js} +1 -1
  163. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-ZBEGH6ZI.js → xychartDiagram-5P7HB3ND-7pY90HjH.js} +1 -1
  164. package/payload/server/public/browser.html +4 -4
  165. package/payload/server/public/calendar.html +6 -6
  166. package/payload/server/public/chat.html +13 -14
  167. package/payload/server/public/data.html +11 -11
  168. package/payload/server/public/graph.html +9 -10
  169. package/payload/server/public/index.html +15 -16
  170. package/payload/server/public/operator.html +14 -15
  171. package/payload/server/public/public.html +13 -14
  172. package/payload/server/public/tasks.html +6 -6
  173. package/payload/server/public/assets/AdminShell-BwNqwb4k.js +0 -2
  174. package/payload/server/public/assets/admin-COe0dT2U.js +0 -1
  175. package/payload/server/public/assets/architecture-YZFGNWBL-Cypt5qHL.js +0 -1
  176. package/payload/server/public/assets/calendar-DlvwZnS7.js +0 -1
  177. package/payload/server/public/assets/channel-BMyXE4zc.js +0 -1
  178. package/payload/server/public/assets/chat-1SSmFsjd.js +0 -1
  179. package/payload/server/public/assets/chevron-down-Dnuuw6Q2.js +0 -1
  180. package/payload/server/public/assets/chevron-left-CC4zmWOr.js +0 -1
  181. package/payload/server/public/assets/chevron-right-CG_lHTx_.js +0 -1
  182. package/payload/server/public/assets/chunk-426QAEUC-Xu6JKP4d.js +0 -1
  183. package/payload/server/public/assets/chunk-QZHKN3VN-7_kS3RBy.js +0 -1
  184. package/payload/server/public/assets/classDiagram-6PBFFD2Q-DJqbNcuC.js +0 -1
  185. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-CGglqfQA.js +0 -1
  186. package/payload/server/public/assets/clone-BiTMTzp_.js +0 -1
  187. package/payload/server/public/assets/data-CJbC_cVy.js +0 -1
  188. package/payload/server/public/assets/gitGraph-7Q5UKJZL-C_-XjxLd.js +0 -1
  189. package/payload/server/public/assets/info-OMHHGYJF-BH8yDCfL.js +0 -1
  190. package/payload/server/public/assets/infoDiagram-42DDH7IO-DyDXyJ6U.js +0 -2
  191. package/payload/server/public/assets/operator-Cxq9TxaH.js +0 -1
  192. package/payload/server/public/assets/packet-4T2RLAQJ-Bajcns4r.js +0 -1
  193. package/payload/server/public/assets/page-BE6DkJP9.js +0 -1
  194. package/payload/server/public/assets/pie-ZZUOXDRM-D7hjM5w1.js +0 -1
  195. package/payload/server/public/assets/radar-PYXPWWZC-B46d5x7a.js +0 -1
  196. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-CrstH34p.js +0 -1
  197. package/payload/server/public/assets/treeView-SZITEDCU-3XQh5xQ1.js +0 -1
  198. package/payload/server/public/assets/treemap-W4RFUUIX-DwR-_l5z.js +0 -1
  199. package/payload/server/public/assets/useSubAccountSwitcher-Bgfqig1V.css +0 -1
  200. package/payload/server/public/assets/useSubAccountSwitcher-Q941cZYV.js +0 -9
  201. package/payload/server/public/assets/wardley-RL74JXVD-DZp9oCGv.js +0 -1
  202. /package/payload/server/public/assets/{_baseFor-CMWvz0uA.js → _baseFor-k8hYPe-U.js} +0 -0
  203. /package/payload/server/public/assets/{array-Cny_NT6T.js → array-BFDiaBgf.js} +0 -0
  204. /package/payload/server/public/assets/{cytoscape.esm-De0CCmB2.js → cytoscape.esm-Ch0xptA4.js} +0 -0
  205. /package/payload/server/public/assets/{defaultLocale-BahRht8U.js → defaultLocale-ZeknFqNe.js} +0 -0
  206. /package/payload/server/public/assets/{dist-C9D_xz81.js → dist-B2N0v8hZ.js} +0 -0
  207. /package/payload/server/public/assets/{init-DoIvjoJ_.js → init-0VJVrkRJ.js} +0 -0
  208. /package/payload/server/public/assets/{katex-Bfn1OZEl.js → katex-Br7bH10N.js} +0 -0
  209. /package/payload/server/public/assets/{path-CTezU8L5.js → path-INs8XTPH.js} +0 -0
  210. /package/payload/server/public/assets/{preload-helper-D_sPnjeL.js → preload-helper-CH6UZRzu.js} +0 -0
  211. /package/payload/server/public/assets/{rough.esm-BJo4pvXu.js → rough.esm-DU9bZLvZ.js} +0 -0
  212. /package/payload/server/public/assets/{src-BTKk8KAG.js → src-DHSQDYx-.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"mail-fetch-body.d.ts","sourceRoot":"","sources":["../../src/tools/mail-fetch-body.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAMhE,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AAkBD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,iBAAiB,EACzB,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAC1B,OAAO,CAAC,eAAe,CAAC,CAmC1B"}
1
+ {"version":3,"file":"mail-fetch-body.d.ts","sourceRoot":"","sources":["../../src/tools/mail-fetch-body.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAMhE,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AAkBD;;;GAGG;AACH,wBAAgB,UAAU,CACxB,IAAI,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,IAAI,GACnE;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAKlD;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,iBAAiB,EACzB,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAC1B,OAAO,CAAC,eAAe,CAAC,CAqC1B"}
@@ -3,6 +3,16 @@ import { htmlToText } from "../lib/html-to-text.js";
3
3
  import { log } from "../lib/log.js";
4
4
  import { addrs } from "../lib/recipients.js";
5
5
  const SELECT = "id,subject,from,toRecipients,ccRecipients,receivedDateTime,conversationId,isRead,hasAttachments,body";
6
+ /**
7
+ * Map Graph's `from.emailAddress` to the archive's { from, fromName } pair.
8
+ * Exported so the mapping is unit-testable without a live Graph call.
9
+ */
10
+ export function mapRawFrom(from) {
11
+ return {
12
+ from: from?.emailAddress?.address ?? null,
13
+ fromName: from?.emailAddress?.name ?? null,
14
+ };
15
+ }
6
16
  /**
7
17
  * Read the COMPLETE body of one message by id. Graph's bodyPreview (returned by
8
18
  * outlook-mail-list/-search) is capped near 255 chars; this requests the full
@@ -24,10 +34,12 @@ export async function runMailFetchBody(config, args) {
24
34
  bytes: body.length,
25
35
  contentType,
26
36
  });
37
+ const fromMapped = mapRawFrom(msg.from);
27
38
  return {
28
39
  id: msg.id,
29
40
  subject: msg.subject ?? null,
30
- from: msg.from?.emailAddress?.address ?? null,
41
+ from: fromMapped.from,
42
+ fromName: fromMapped.fromName,
31
43
  to: addrs(msg.toRecipients),
32
44
  cc: addrs(msg.ccRecipients),
33
45
  receivedDateTime: msg.receivedDateTime,
@@ -1 +1 @@
1
- {"version":3,"file":"mail-fetch-body.js","sourceRoot":"","sources":["../../src/tools/mail-fetch-body.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,KAAK,EAAqB,MAAM,sBAAsB,CAAC;AA6BhE,MAAM,MAAM,GACV,sGAAsG,CAAC;AAEzG;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAyB,EACzB,IAA2B;IAE3B,MAAM,IAAI,GAAG,gBAAgB,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;IAClE,MAAM,GAAG,GAAG,MAAM,SAAS,CACzB,MAAM,EACN,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAe,EAC7E,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE,CAC1C,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAChE,MAAM,WAAW,GAAoB,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1E,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAE5D,GAAG,CAAC;QACF,KAAK,EAAE,iBAAiB;QACxB,EAAE,EAAE,YAAY;QAChB,OAAO,EAAE,MAAM,CAAC,SAAS;QACzB,EAAE,EAAE,IAAI,CAAC,SAAS;QAClB,KAAK,EAAE,IAAI,CAAC,MAAM;QAClB,WAAW;KACZ,CAAC,CAAC;IAEH,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI;QAC5B,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,IAAI,IAAI;QAC7C,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;QAC3B,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;QAC3B,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;QACtC,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,IAAI;QAC1C,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,KAAK;QAC3B,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,KAAK;QAC3C,WAAW;QACX,IAAI;KACL,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"mail-fetch-body.js","sourceRoot":"","sources":["../../src/tools/mail-fetch-body.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,KAAK,EAAqB,MAAM,sBAAsB,CAAC;AA8BhE,MAAM,MAAM,GACV,sGAAsG,CAAC;AAEzG;;;GAGG;AACH,MAAM,UAAU,UAAU,CACxB,IAAoE;IAEpE,OAAO;QACL,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,IAAI,IAAI;QACzC,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,IAAI,IAAI;KAC3C,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAyB,EACzB,IAA2B;IAE3B,MAAM,IAAI,GAAG,gBAAgB,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;IAClE,MAAM,GAAG,GAAG,MAAM,SAAS,CACzB,MAAM,EACN,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAe,EAC7E,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE,CAC1C,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAChE,MAAM,WAAW,GAAoB,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1E,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAE5D,GAAG,CAAC;QACF,KAAK,EAAE,iBAAiB;QACxB,EAAE,EAAE,YAAY;QAChB,OAAO,EAAE,MAAM,CAAC,SAAS;QACzB,EAAE,EAAE,IAAI,CAAC,SAAS;QAClB,KAAK,EAAE,IAAI,CAAC,MAAM;QAClB,WAAW;KACZ,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI;QAC5B,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;QAC3B,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;QAC3B,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;QACtC,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,IAAI;QAC1C,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,KAAK;QAC3B,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,KAAK;QAC3C,WAAW;QACX,IAAI;KACL,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { GraphClientConfig } from "../lib/graph-client.js";
2
+ export interface IngestDecision {
3
+ messageId: string;
4
+ disposition: "ingest" | "discard";
5
+ }
6
+ /**
7
+ * Split decisions into ingest ids + a discard count. Refuses an empty array
8
+ * (nothing to do) or a duplicate messageId (ambiguous disposition) so the
9
+ * operator re-issues a clean set rather than a silent partial ingest. Unlike
10
+ * email-ingest there is no staged batch or high-water mark to guard: the ids
11
+ * are explicit and the per-message decision holds over exactly this call.
12
+ */
13
+ export declare function validateDecisions(decisions: IngestDecision[]): {
14
+ toIngest: string[];
15
+ discarded: number;
16
+ };
17
+ /**
18
+ * Write operator-reviewed messages into the business graph. For each `ingest`
19
+ * decision the full body + envelope is fetched, threads are grouped by
20
+ * conversationId, participants are resolved closed-set against Neo4j, and each
21
+ * resolvable thread is dispatched through the shared conversation-archive
22
+ * script. Unresolved-address threads are skipped and reported.
23
+ */
24
+ export declare function runMailIngest(config: GraphClientConfig, params: {
25
+ decisions: IngestDecision[];
26
+ }): Promise<string>;
27
+ //# sourceMappingURL=mail-ingest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail-ingest.d.ts","sourceRoot":"","sources":["../../src/tools/mail-ingest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAOhE,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,QAAQ,GAAG,SAAS,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,cAAc,EAAE,GAC1B;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAsB3C;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE;IAAE,SAAS,EAAE,cAAc,EAAE,CAAA;CAAE,GACtC,OAAO,CAAC,MAAM,CAAC,CAwCjB"}
@@ -0,0 +1,69 @@
1
+ import { runMailFetchBody } from "./mail-fetch-body.js";
2
+ import { dispatchOutlookMessagesToConversationArchive, } from "../lib/conversation-archive-dispatch.js";
3
+ /**
4
+ * Split decisions into ingest ids + a discard count. Refuses an empty array
5
+ * (nothing to do) or a duplicate messageId (ambiguous disposition) so the
6
+ * operator re-issues a clean set rather than a silent partial ingest. Unlike
7
+ * email-ingest there is no staged batch or high-water mark to guard: the ids
8
+ * are explicit and the per-message decision holds over exactly this call.
9
+ */
10
+ export function validateDecisions(decisions) {
11
+ if (decisions.length === 0) {
12
+ throw new Error("Refusing to ingest — no decisions passed. List messages with outlook-mail-list or outlook-mail-search first, then pass a disposition for each.");
13
+ }
14
+ const seen = new Set();
15
+ const toIngest = [];
16
+ let discarded = 0;
17
+ for (const d of decisions) {
18
+ const id = d.messageId.trim();
19
+ if (!id)
20
+ throw new Error(`Decision had a blank messageId: ${JSON.stringify(d)}`);
21
+ if (seen.has(id)) {
22
+ throw new Error(`Refusing to ingest — duplicate messageId "${id}". Pass one disposition per message.`);
23
+ }
24
+ seen.add(id);
25
+ if (d.disposition === "ingest")
26
+ toIngest.push(id);
27
+ else
28
+ discarded++;
29
+ }
30
+ return { toIngest, discarded };
31
+ }
32
+ /**
33
+ * Write operator-reviewed messages into the business graph. For each `ingest`
34
+ * decision the full body + envelope is fetched, threads are grouped by
35
+ * conversationId, participants are resolved closed-set against Neo4j, and each
36
+ * resolvable thread is dispatched through the shared conversation-archive
37
+ * script. Unresolved-address threads are skipped and reported.
38
+ */
39
+ export async function runMailIngest(config, params) {
40
+ const { toIngest, discarded } = validateDecisions(params.decisions);
41
+ const messages = [];
42
+ for (const messageId of toIngest) {
43
+ const body = await runMailFetchBody(config, { messageId });
44
+ messages.push({
45
+ messageId: body.id,
46
+ conversationId: body.conversationId,
47
+ fromAddress: body.from,
48
+ fromName: body.fromName,
49
+ toAddresses: body.to,
50
+ ccAddresses: body.cc,
51
+ subject: body.subject,
52
+ bodyText: body.body,
53
+ receivedDateTime: body.receivedDateTime,
54
+ accountId: config.accountId,
55
+ });
56
+ console.error(`[outlook-mcp] mail-ingest op=ingest id=${body.id} conversationId=${body.conversationId ?? "none"} disposition=ingest`);
57
+ }
58
+ const { threadsDispatched, threadsSkipped, unresolvedAddresses } = await dispatchOutlookMessagesToConversationArchive(messages);
59
+ console.error(`[outlook-mcp] mail-ingest op=summary ingested=${toIngest.length} discarded=${discarded} threadsDispatched=${threadsDispatched} threadsSkipped=${threadsSkipped} unresolved=${unresolvedAddresses.length}`);
60
+ const lines = [
61
+ `Ingested ${toIngest.length} message(s); discarded ${discarded}.`,
62
+ `Graph: ${threadsDispatched} thread(s) dispatched to conversation-archive, ${threadsSkipped} skipped.`,
63
+ ];
64
+ if (unresolvedAddresses.length > 0) {
65
+ lines.push(`Unresolved sender/recipient addresses (no :Person or :AdminUser carries these emails — add them to the graph and re-run outlook-mail-ingest to land their threads): ${unresolvedAddresses.join(", ")}`);
66
+ }
67
+ return lines.join("\n");
68
+ }
69
+ //# sourceMappingURL=mail-ingest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail-ingest.js","sourceRoot":"","sources":["../../src/tools/mail-ingest.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@
11
11
  "dependencies": {
12
12
  "@microsoft/microsoft-graph-client": "^3.0.7",
13
13
  "@modelcontextprotocol/sdk": "^1.12.1",
14
+ "neo4j-driver": "^5.28.1",
14
15
  "zod": "^3.24.0"
15
16
  },
16
17
  "devDependencies": {
@@ -76,7 +76,8 @@ Reads the COMPLETE body (not `bodyPreview`). `body.contentType` is `html` or `te
76
76
  {
77
77
  id: string;
78
78
  subject: string | null;
79
- from: string | null;
79
+ from: string | null; // from.emailAddress.address
80
+ fromName: string | null; // from.emailAddress.name (additive) — the sender display name outlook-mail-ingest carries into the archive
80
81
  to: string[]; // toRecipients[].emailAddress.address
81
82
  cc: string[];
82
83
  receivedDateTime: string;
@@ -124,6 +125,14 @@ Recoverable — moves to Deleted Items, never hard-deletes or expunges. An id al
124
125
 
125
126
  **Returned shape:** `{ moved: string[]; notMoved: string[] }`.
126
127
 
128
+ ## outlook-mail-ingest
129
+
130
+ **No direct Graph mutation.** Per approved message it calls `runMailFetchBody`'s `GET /me/messages/{id}?$select=…,body` to read the full body + envelope (including `conversationId` and the additive `fromName`). The graph write is delegated: threads are grouped by `conversationId`, participants resolve closed-set against Neo4j (`UNWIND $addresses … WHERE (p:Person OR p:AdminUser) AND p.accountId=$accountId AND toLower(p.email)=addr`), and each resolvable thread is written by spawning `plugins/memory/bin/conversation-archive-ingest.sh <thread.json> --source email --participant-person-ids <elementIds> --scope admin --session-id outlook-<uuid>`. The thread JSON is `[{from:{name,email}, date, bodyText}]`, the shape the shared `email` normaliser consumes. An unresolved From/To/Cc address skips its whole thread; no `:Person` is auto-created. This is the plugin's only Neo4j coupling (`neo4j-driver`, `lib/neo4j.ts`).
131
+
132
+ **Input:** `{ decisions: [{ messageId, disposition: "ingest" | "discard" }], mailbox? }`. Refuses an empty array and a duplicate messageId.
133
+
134
+ **Returned shape:** a plain-text summary — ingested/discarded counts, threads dispatched/skipped, and any unresolved addresses.
135
+
127
136
  ## outlook-mail-otp-extract
128
137
 
129
138
  **Endpoints:** `GET /me/mailFolders/Inbox/messages?$top=15&$orderby=receivedDateTime DESC&$select=id,subject,from,receivedDateTime` to list candidates, then `outlook-mail-fetch-body`'s `GET /me/messages/{id}?$select=…,body` per sender-matched candidate. Scans immediately, then polls every 5 s until a code is found or `timeout` seconds (default 60) elapse. `extractOtpFromText` is shared verbatim with the `email` plugin.
@@ -60,6 +60,10 @@ The revoke path below is scoped to one specific, visible failure. It is not a ge
60
60
  - `outlook-mail-reply messageId=<id> body=<text>` — reply in-thread. Threads natively (the original conversation is preserved). `replyAll=true` replies to the sender and every original recipient; `cc`/`bcc` add recipients; `attachments` is an array of file paths inside the account directory (up to 25 MB per file). The body is plain text, prepended above the quoted original. Needs `Mail.ReadWrite` + `Mail.Send`.
61
61
  - `outlook-mail-delete ids=[<id>...]` — move messages to Deleted Items. RECOVERABLE: it never hard-deletes or expunges, so recovery is possible from the mailbox's Deleted Items. Pass the ids from a prior list/search. An id already gone is reported not-moved without failing the rest. Needs `Mail.ReadWrite`.
62
62
 
63
+ ## Ingesting mail into memory
64
+
65
+ Writing operator-reviewed messages into the business graph is the `outlook-mail-ingest` skill (its own SKILL.md), which drives the list, summarise, ask, ingest loop over `outlook-mail-ingest`.
66
+
63
67
  ## One-time codes (OTP)
64
68
 
65
69
  - `outlook-mail-otp-extract sender=<domain>` — poll the inbox for a verification code from a sender (e.g. `cloudflare.com`). Optional `subjectPattern` (regex) and `timeout` (seconds, default 60). Reads full bodies to extract the code. Used during service authentication.
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: outlook-mail-ingest
3
+ description: "Operator-initiated Outlook mail ingestion. Activate when the operator asks to check, triage, or pull Outlook mail into memory ('check my Outlook', 'ingest these Outlook messages', 'pull that thread into the graph'). Drives a list, summarise, ask, ingest loop using the outlook-mail-list / outlook-mail-search and outlook-mail-ingest tools. Human-in-the-loop: nothing enters the graph without an explicit operator decision per message."
4
+ ---
5
+
6
+ # Outlook mail ingestion
7
+
8
+ Invoked from `specialists:personal-assistant`.
9
+
10
+ Operator-initiated, human-in-the-loop ingestion of an Outlook mailbox into the business graph. Reviewed messages become `:ConversationArchive {source:'email'}` threads. A message enters the graph only when the operator says so, and only the ones they pick. There is no background poll, no automatic classifier, no silent writes.
11
+
12
+ This is the Microsoft Graph analogue of the IMAP `email-ingest` skill. It differs in one structural way: Outlook reads are stateless Graph calls, so there is no staged batch and no high-water mark. You list with the ordinary read tools and pass the exact message ids you want to `outlook-mail-ingest`.
13
+
14
+ ## When to activate
15
+
16
+ Activate when the operator wants to bring Outlook mail into the agent's memory. Typical phrasings:
17
+
18
+ - "Check my Outlook."
19
+ - "Ingest these Outlook messages."
20
+ - "Pull that Outlook thread into the graph."
21
+
22
+ Do not activate for:
23
+
24
+ - Reading or searching mail already in the mailbox or the graph. Those are `outlook-mail-list`, `outlook-mail-search`, `outlook-mail-fetch-body`.
25
+ - Drafting or sending. Those are `outlook-draft`, `outlook-mail-reply`, `outlook-mail-send`.
26
+ - Setup, status, or OTP extraction. Those are direct tool calls.
27
+
28
+ ## Flow
29
+
30
+ ### 1. List
31
+
32
+ Call `outlook-mail-list` (or `outlook-mail-search` for a sender or subject filter). Both return a preview per message with its id, sender, subject, and `receivedDateTime`. They write nothing to the graph.
33
+
34
+ An account can hold more than one mailbox. When it does, every operational tool refuses unless it names one, and the refusal lists the connected mailboxes. That refusal means "say which mailbox", not "there is no mail". Resolve it with `outlook-mailbox-list`, then pass `mailbox` and carry on.
35
+
36
+ Reads page beyond the newest window. When a response carries a `nextCursor`, older messages remain behind it; pass the cursor back to page on. Absence of a `nextCursor` is the only thing that means you saw everything in range.
37
+
38
+ ### 2. Summarise
39
+
40
+ Present the listed messages to the operator as a numbered or per-id summary. For each, surface the sender, the subject, and a one-line gist from the preview. Where a message is obviously one or the other, suggest a disposition ("newsletter, looks like discard"; "thread reply from a known correspondent, looks like ingest"). The suggestion is a hint, never an action; the operator decides.
41
+
42
+ There is no screener. If a message looks like phishing, say so in plain English so the operator can discard it by eye.
43
+
44
+ ### 3. Ask
45
+
46
+ Ask the operator to confirm a disposition for every message you intend to ingest. Either a blanket call ("ingest all", "discard the rest") that you turn into the per-message map, or an explicit per-message choice ("ingest 1, 2, 4; discard 3"). If the operator answers ambiguously ("the work ones"), restate the messages you think they mean and confirm before proceeding. Never guess.
47
+
48
+ ### 4. Ingest
49
+
50
+ Call `outlook-mail-ingest` with a `decisions` array: one `{ messageId, disposition }` per message, `disposition` being `ingest` or `discard`. The tool refuses an empty array and refuses a duplicate messageId, so pass a clean set with one disposition per id.
51
+
52
+ For each `ingest` message the tool fetches the full body and envelope, groups messages into threads by Graph `conversationId`, and resolves every From/To/Cc address closed-set against the graph. An address that does not already resolve to a `:Person` or `:AdminUser` for this account causes its whole thread to skip; the tool returns the unresolved addresses. It never creates a `:Person`.
53
+
54
+ On success the tool returns a one-line summary: how many were ingested, how many discarded, how many threads dispatched or skipped, and any unresolved addresses.
55
+
56
+ ### 5. Confirm
57
+
58
+ Echo the tool's summary back to the operator in one sentence. If any thread was skipped for an unresolved address, tell the operator which address, and that adding that person to the graph and re-running will land the thread. If they want to draft a reply to anything just ingested, hand off to the Outlook compose tools.
59
+
60
+ ## Edge cases
61
+
62
+ | Situation | Behaviour |
63
+ |-----------|-----------|
64
+ | The list returns zero messages | Tell the operator and stop. Do not call `outlook-mail-ingest`. |
65
+ | An address on a thread does not resolve | The thread is skipped and the address is returned. Surface it; the operator adds the person to the graph, then re-runs for that message. |
66
+ | Operator wants to ingest some now and review the rest later | Fine. Ids are explicit, so ingest exactly the ones decided now and list the rest again later. There is no high-water mark to advance and nothing is silently dropped. |
67
+ | Operator abandons mid-flow | Do not call `outlook-mail-ingest`. Nothing was staged and nothing changes. |
68
+ | A tool errors (Graph down, auth failure) | Surface the error verbatim. Do not retry silently. |
69
+
70
+ ## Out of scope
71
+
72
+ - Automatic re-screening or classification. The operator is the screener.
73
+ - Scheduled or recurring ingestion. The operator initiates every cycle.
74
+ - Attachment ingest. This skill lands text threads only.
75
+ - Other channels. WhatsApp, IMAP email, and the public web have their own ingestion paths.
76
+
77
+ ## Observability
78
+
79
+ Each ingest emits tagged lines the operator can grep:
80
+
81
+ - `[outlook-mcp] mail-ingest op=ingest id=<id> conversationId=<id> disposition=ingest` per approved message.
82
+ - `[outlook-mcp] mail-ingest op=thread-dispatched root=<key> messages=<n> participants=<n>` per landed thread.
83
+ - `[outlook-mcp] mail-ingest op=summary ingested=<n> discarded=<m> threadsDispatched=<n> threadsSkipped=<n> unresolved=<n>` once per call.
84
+
85
+ A complete cycle is greppable as the `[outlook-mcp] mail-ingest` lines for one session. A `threadsSkipped` above zero with an `unresolved` count is the closed-set resolution refusing an unknown participant, not a failure.
@@ -13,6 +13,8 @@ PASS=0; FAIL=0; FAILED=()
13
13
  assert_grep() { if printf '%s' "$2" | grep -qF "$1"; then PASS=$((PASS+1)); else FAIL=$((FAIL+1)); FAILED+=("$3: expected to find [$1]"); fi; }
14
14
  assert_nogrep() { if printf '%s' "$2" | grep -qF "$1"; then FAIL=$((FAIL+1)); FAILED+=("$3: expected NOT to find [$1]"); else PASS=$((PASS+1)); fi; }
15
15
  assert_eq() { if [ "$1" = "$2" ]; then PASS=$((PASS+1)); else FAIL=$((FAIL+1)); FAILED+=("$3: expected [$2] got [$1]"); fi; }
16
+ assert_dir() { if [ -d "$1" ]; then PASS=$((PASS+1)); else FAIL=$((FAIL+1)); FAILED+=("$2: expected directory [$1]"); fi; }
17
+ assert_nodir() { if [ -d "$1" ]; then FAIL=$((FAIL+1)); FAILED+=("$2: expected NO directory [$1]"); else PASS=$((PASS+1)); fi; }
16
18
 
17
19
  . "$PLAT_SCRIPTS/lib/account-schema-owned-dirs.sh"
18
20
 
@@ -156,21 +158,63 @@ assert_eq "$(shasum "$A_C/SCHEMA.md" | awk '{print $1}')" "$B_C" "con-idempotent
156
158
  RCS="$(PROJECT_DIR="$PROJECT_DIR" python3 "$PLAT_SCRIPTS/lib/account-schema-owned-dirs.py" reconcile "$A_C")"
157
159
  assert_grep "ontologyEntity=Supplier bucket=suppliers present=true" "$RCS" "con-supplier-root-present"
158
160
 
159
- # --- estate-agent vertical: root buckets only, listing-owned entities nested ---
161
+ # --- estate-agent vertical: Property is the sole root; Listing (and its own
162
+ # children Viewing/Offer) nest, mirroring Quote<-Job in construction ---
160
163
  T_E="$(make_vertical_tree '["real-agent"]' 'schema-estate-agent')"; A_E="$(make_account "$T_E")"
161
164
  export PROJECT_DIR="$T_E/platform"
162
- merge_owned_dirs_into_schema "$A_E" >/dev/null
165
+ OUT_E="$(merge_owned_dirs_into_schema "$A_E")"
166
+ assert_grep "domainBuckets=properties" "$OUT_E" "ea-domain-log"
167
+ assert_grep "roots=properties" "$OUT_E" "ea-roots-log"
168
+ assert_grep "nested=Listing<-Property,Viewing<-Listing,Offer<-Listing" "$OUT_E" "ea-nested-log"
163
169
  ALLOWED_E="$(awk '/^```allowed-top-level$/{f=1;next} /^```$/{f=0} f' "$A_E/SCHEMA.md")"
164
- # Root entities get a bucket; Listing-owned Viewing/Offer do not.
165
- for d in properties listings; do
166
- assert_grep "$d" "$ALLOWED_E" "ea-allow-$d"
167
- done
168
- for d in viewings offers; do
170
+ # Property (blank Owner) is the only root bucket.
171
+ assert_grep "properties" "$ALLOWED_E" "ea-allow-properties"
172
+ # Listing and its children nest; none is a root bucket.
173
+ for d in listings viewings offers; do
169
174
  assert_nogrep "$d" "$ALLOWED_E" "ea-noroot-$d"
170
175
  done
171
176
  assert_nogrep "jobs" "$ALLOWED_E" "ea-no-sitedesk-jobs"
172
177
  # The suppliers/ bucket is construction-only; it must not leak into another vertical.
173
178
  assert_nogrep "suppliers" "$ALLOWED_E" "ea-no-suppliers"
179
+ # The descriptive region tells the agent Listing records live under properties/.
180
+ assert_grep '`Listing` records live under `properties/` (owned by `Property`), not a root bucket.' "$(cat "$A_E/SCHEMA.md")" "ea-nested-line"
181
+
182
+ # --- roots subcommand + seed_domain_root_dirs: buckets materialise on disk ---
183
+ # estate-agent (PROJECT_DIR still $T_E/platform): properties/ is created.
184
+ ROOTS_E="$(PROJECT_DIR="$T_E/platform" python3 "$PLAT_SCRIPTS/lib/account-schema-owned-dirs.py" roots)"
185
+ assert_grep "properties" "$ROOTS_E" "ea-roots-cmd"
186
+ assert_nogrep "listings" "$ROOTS_E" "ea-roots-cmd-no-listings"
187
+ SEED_E="$(seed_domain_root_dirs "$A_E")"
188
+ assert_grep "seeded-roots=properties" "$SEED_E" "ea-seed-log"
189
+ assert_dir "$A_E/properties" "ea-seed-dir"
190
+ # Idempotent: a second run creates nothing.
191
+ SEED_E2="$(seed_domain_root_dirs "$A_E")"
192
+ assert_grep "seeded-roots=none" "$SEED_E2" "ea-seed-idempotent"
193
+
194
+ # construction: every root bucket is created; nested entities are not.
195
+ export PROJECT_DIR="$T_C/platform"
196
+ A_SEED_C="$(make_account "$T_C")"
197
+ ROOTS_C="$(PROJECT_DIR="$T_C/platform" python3 "$PLAT_SCRIPTS/lib/account-schema-owned-dirs.py" roots)"
198
+ for d in jobs customers customer-sites assets parts suppliers ppm-contracts; do
199
+ assert_grep "$d" "$ROOTS_C" "con-roots-cmd-$d"
200
+ done
201
+ seed_domain_root_dirs "$A_SEED_C" >/dev/null
202
+ for d in jobs customers customer-sites assets parts suppliers ppm-contracts; do
203
+ assert_dir "$A_SEED_C/$d" "con-seed-dir-$d"
204
+ done
205
+ for d in quotes visits purchase-orders; do
206
+ assert_nodir "$A_SEED_C/$d" "con-seed-nonested-$d"
207
+ done
208
+
209
+ # The all-accounts sweep seeds an existing account's root buckets too, so a
210
+ # sub-account (provisioned once at creation) gains properties/ on upgrade.
211
+ export PROJECT_DIR="$T_E/platform"
212
+ SWEEP_ACCTS="$(mktemp -d)"; mkdir -p "$SWEEP_ACCTS/ea1"
213
+ cp "$T_E/platform/templates/account-schema/SCHEMA.md" "$SWEEP_ACCTS/ea1/SCHEMA.md"
214
+ printf '{"accountId":"ea1","role":"client"}\n' > "$SWEEP_ACCTS/ea1/account.json"
215
+ SWEEP_E="$(reconcile_all_accounts_owned_dirs "$SWEEP_ACCTS" 2>&1)"
216
+ assert_grep "seeded-roots=properties" "$SWEEP_E" "sweep-seed-log"
217
+ assert_dir "$SWEEP_ACCTS/ea1/properties" "sweep-seed-properties-dir"
174
218
 
175
219
  # --- no vertical declared: generic base only ---
176
220
  T_N="$(make_tree '[]')"; A_N="$(make_account "$T_N")"
@@ -20,8 +20,11 @@ export USERS_FILE="/nonexistent/users.json"
20
20
 
21
21
  # Fresh account -> role=house stamped
22
22
  T1=$(mktemp -d); A1="$T1/acct-house"
23
- provision_account_dir "$A1" "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" "house" >/dev/null 2>&1
23
+ OUT1="$(provision_account_dir "$A1" "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" "house" 2>/dev/null)"
24
24
  assert_eq "$(role_of "$A1/account.json")" "house" "fresh-house-role"
25
+ # Task 1938 — provision seeds the vertical's root domain buckets; the log line
26
+ # proves seed_domain_root_dirs ran (bucket set depends on the brand's vertical).
27
+ assert_eq "$(printf '%s' "$OUT1" | grep -c 'seeded-roots=')" "1" "fresh-seed-roots-logged"
25
28
  assert_eq "$(ms_of "$A1/account.json")" "False" "fresh-managedService-default"
26
29
  # Task 1483 — the WhatsApp passive requirement-intake identity is seeded, non-empty.
27
30
  assert_nonempty "$A1/agents/passive/IDENTITY.md" "passive-identity-seeded"
@@ -410,9 +410,19 @@ def reconcile(project_dir, account_dir):
410
410
  f"bucket={b['dir']} expectedAtRoot=false stray={is_stray}")
411
411
 
412
412
 
413
+ def roots(project_dir):
414
+ """Print each root domain bucket dir (blank/absent Owner) of the brand's
415
+ vertical, one per line, in table order. Empty when no vertical is declared.
416
+ Provision consumes this to mkdir the operator-data buckets so they exist as
417
+ directories, not just allowed names."""
418
+ for b in resolve_domain_buckets(project_dir):
419
+ if _is_root(b["owner"]):
420
+ print(b["dir"])
421
+
422
+
413
423
  def main():
414
424
  if len(sys.argv) < 2:
415
- sys.exit("usage: account-schema-owned-dirs.py {resolve|merge|reconcile} [account_dir]")
425
+ sys.exit("usage: account-schema-owned-dirs.py {resolve|merge|reconcile|roots} [account_dir]")
416
426
  cmd = sys.argv[1]
417
427
  pd = _project_dir()
418
428
  if cmd == "resolve":
@@ -421,6 +431,8 @@ def main():
421
431
  merge(pd, sys.argv[2])
422
432
  elif cmd == "reconcile":
423
433
  reconcile(pd, sys.argv[2])
434
+ elif cmd == "roots":
435
+ roots(pd)
424
436
  else:
425
437
  sys.exit(f"unknown command: {cmd}")
426
438
 
@@ -17,9 +17,30 @@ merge_owned_dirs_into_schema() {
17
17
  echo " [acct-schema] op=seed-owned-dirs ${_out}"
18
18
  }
19
19
 
20
+ # seed_domain_root_dirs <account_dir>
21
+ # mkdir each root domain bucket the brand's vertical projects (Property ->
22
+ # properties/ for estate-agent, Job/Customer/... for construction), so the
23
+ # operator-data buckets exist as directories, not just allowed names. Idempotent.
24
+ # Logs the buckets created so a provision can be audited from its log.
25
+ seed_domain_root_dirs() {
26
+ local _acct="$1"
27
+ local _created=""
28
+ local _d
29
+ while IFS= read -r _d; do
30
+ [ -n "$_d" ] || continue
31
+ if [ ! -d "$_acct/$_d" ]; then
32
+ mkdir -p "$_acct/$_d"
33
+ _created="${_created:+$_created,}$_d"
34
+ fi
35
+ done < <(PROJECT_DIR="$PROJECT_DIR" python3 "$_ACCT_SCHEMA_PY" roots 2>/dev/null)
36
+ echo " [acct-schema] seeded-roots=${_created:-none}"
37
+ }
38
+
20
39
  # reconcile_all_accounts_owned_dirs <accounts_dir>
21
40
  # Standing check + backfill: for every account dir with an account.json, log the
22
- # pre-merge present state of each declared owned dir, then merge (backfill).
41
+ # pre-merge present state of each declared owned dir, merge (backfill), then seed
42
+ # the vertical's root buckets so an existing account (sub-accounts are only
43
+ # provisioned once, at creation) gains the same directories a fresh one gets.
23
44
  reconcile_all_accounts_owned_dirs() {
24
45
  local _accts="$1"
25
46
  [ -d "$_accts" ] || return 0
@@ -29,5 +50,6 @@ reconcile_all_accounts_owned_dirs() {
29
50
  PROJECT_DIR="$PROJECT_DIR" python3 "$_ACCT_SCHEMA_PY" reconcile "$_acct" 2>/dev/null \
30
51
  | while IFS= read -r _line; do echo " [acct-schema] op=reconcile ${_line}"; done
31
52
  merge_owned_dirs_into_schema "$_acct"
53
+ seed_domain_root_dirs "$_acct"
32
54
  done
33
55
  }
@@ -45,6 +45,11 @@ provision_account_dir() {
45
45
  # seeded SCHEMA.md so the guard admits them (e.g. quoting/ on SiteDesk).
46
46
  merge_owned_dirs_into_schema "$ACCOUNT_DIR"
47
47
 
48
+ # Create the vertical's root domain buckets on disk (Property -> properties/
49
+ # for estate-agent, Job/Customer/... for construction) so they are present
50
+ # directories, not just allowed names the operator never sees.
51
+ seed_domain_root_dirs "$ACCOUNT_DIR"
52
+
48
53
  # Claude Code discovers project-level .claude/ relative to the nearest .git
49
54
  # root. Without a .git in the account dir it traverses up to ~/maxy/.git and
50
55
  # misses accountDir/.claude/. Initialise a repo so the account dir IS the root.
@@ -1 +1 @@
1
- {"version":3,"file":"canonical-tool-names.generated.d.ts","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"AAQA,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAyB7C,CAAA;AAED,gEAAgE;AAChE,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EA8TtD,CAAA"}
1
+ {"version":3,"file":"canonical-tool-names.generated.d.ts","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"AAQA,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAyB7C,CAAA;AAED,gEAAgE;AAChE,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EA+TtD,CAAA"}
@@ -260,6 +260,7 @@ export const CANONICAL_MAXY_TOOL_NAMES = [
260
260
  "mcp__plugin_outlook_outlook__outlook-mail-attachment",
261
261
  "mcp__plugin_outlook_outlook__outlook-mail-delete",
262
262
  "mcp__plugin_outlook_outlook__outlook-mail-fetch-body",
263
+ "mcp__plugin_outlook_outlook__outlook-mail-ingest",
263
264
  "mcp__plugin_outlook_outlook__outlook-mail-list",
264
265
  "mcp__plugin_outlook_outlook__outlook-mail-otp-extract",
265
266
  "mcp__plugin_outlook_outlook__outlook-mail-reply",
@@ -1 +1 @@
1
- {"version":3,"file":"canonical-tool-names.generated.js","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"canonical-tool-names.generated.js","sourceRoot":"","sources":["../src/canonical-tool-names.generated.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,kEAAkE;AAClE,yDAAyD;AACzD,kFAAkF;AAClF,EAAE;AACF,yEAAyE;AACzE,6DAA6D;AAE7D,+EAA+E;AAC/E,MAAM,CAAC,MAAM,gBAAgB,GAAsB;IACjD,OAAO;IACP,KAAK;IACL,SAAS;IACT,WAAW;IACX,UAAU;IACV,OAAO;IACP,YAAY;IACZ,QAAQ;IACR,OAAO;IACP,cAAc;IACd,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,gBAAgB;IAChB,UAAU;IACV,SAAS;IACT,cAAc;IACd,UAAU;IACV,MAAM;IACN,WAAW;CACZ,CAAA;AAED,gEAAgE;AAChE,MAAM,CAAC,MAAM,yBAAyB,GAAsB;IAC1D,yCAAyC;IACzC,yCAAyC;IACzC,kDAAkD;IAClD,sDAAsD;IACtD,yCAAyC;IACzC,yCAAyC;IACzC,uCAAuC;IACvC,wCAAwC;IACxC,iDAAiD;IACjD,yCAAyC;IACzC,iDAAiD;IACjD,yCAAyC;IACzC,sCAAsC;IACtC,yCAAyC;IACzC,wCAAwC;IACxC,oCAAoC;IACpC,yCAAyC;IACzC,qCAAqC;IACrC,uCAAuC;IACvC,2CAA2C;IAC3C,4CAA4C;IAC5C,qCAAqC;IACrC,yCAAyC;IACzC,4CAA4C;IAC5C,0CAA0C;IAC1C,2CAA2C;IAC3C,oCAAoC;IACpC,sCAAsC;IACtC,0CAA0C;IAC1C,uCAAuC;IACvC,sCAAsC;IACtC,sDAAsD;IACtD,mDAAmD;IACnD,6CAA6C;IAC7C,wCAAwC;IACxC,yCAAyC;IACzC,qCAAqC;IACrC,uCAAuC;IACvC,sCAAsC;IACtC,wCAAwC;IACxC,+BAA+B;IAC/B,qCAAqC;IACrC,sCAAsC;IACtC,yCAAyC;IACzC,4CAA4C;IAC5C,uDAAuD;IACvD,+CAA+C;IAC/C,2CAA2C;IAC3C,gDAAgD;IAChD,oDAAoD;IACpD,4CAA4C;IAC5C,+CAA+C;IAC/C,+CAA+C;IAC/C,gDAAgD;IAChD,6CAA6C;IAC7C,6CAA6C;IAC7C,iDAAiD;IACjD,oDAAoD;IACpD,+CAA+C;IAC/C,2CAA2C;IAC3C,2CAA2C;IAC3C,+CAA+C;IAC/C,iDAAiD;IACjD,uDAAuD;IACvD,iDAAiD;IACjD,qDAAqD;IACrD,+CAA+C;IAC/C,+CAA+C;IAC/C,8CAA8C;IAC9C,+CAA+C;IAC/C,6CAA6C;IAC7C,+CAA+C;IAC/C,+CAA+C;IAC/C,6CAA6C;IAC7C,6CAA6C;IAC7C,uCAAuC;IACvC,sCAAsC;IACtC,2CAA2C;IAC3C,2CAA2C;IAC3C,sCAAsC;IACtC,iDAAiD;IACjD,2CAA2C;IAC3C,4CAA4C;IAC5C,uCAAuC;IACvC,4CAA4C;IAC5C,8CAA8C;IAC9C,qCAAqC;IACrC,sCAAsC;IACtC,uCAAuC;IACvC,qCAAqC;IACrC,sCAAsC;IACtC,uCAAuC;IACvC,8CAA8C;IAC9C,8CAA8C;IAC9C,8CAA8C;IAC9C,8CAA8C;IAC9C,8CAA8C;IAC9C,+CAA+C;IAC/C,gDAAgD;IAChD,gDAAgD;IAChD,oDAAoD;IACpD,yDAAyD;IACzD,2DAA2D;IAC3D,mDAAmD;IACnD,mDAAmD;IACnD,kDAAkD;IAClD,qDAAqD;IACrD,iDAAiD;IACjD,oDAAoD;IACpD,mDAAmD;IACnD,qDAAqD;IACrD,sDAAsD;IACtD,uDAAuD;IACvD,wDAAwD;IACxD,sDAAsD;IACtD,mDAAmD;IACnD,oDAAoD;IACpD,sDAAsD;IACtD,iEAAiE;IACjE,2DAA2D;IAC3D,yDAAyD;IACzD,yDAAyD;IACzD,sDAAsD;IACtD,uDAAuD;IACvD,yDAAyD;IACzD,sDAAsD;IACtD,uDAAuD;IACvD,2DAA2D;IAC3D,0DAA0D;IAC1D,wDAAwD;IACxD,qDAAqD;IACrD,sDAAsD;IACtD,gEAAgE;IAChE,qDAAqD;IACrD,oDAAoD;IACpD,iDAAiD;IACjD,kDAAkD;IAClD,wDAAwD;IACxD,oDAAoD;IACpD,wDAAwD;IACxD,wDAAwD;IACxD,qDAAqD;IACrD,uDAAuD;IACvD,sDAAsD;IACtD,mDAAmD;IACnD,oDAAoD;IACpD,qDAAqD;IACrD,kDAAkD;IAClD,mDAAmD;IACnD,qDAAqD;IACrD,0DAA0D;IAC1D,wDAAwD;IACxD,0DAA0D;IAC1D,sDAAsD;IACtD,sDAAsD;IACtD,sDAAsD;IACtD,mDAAmD;IACnD,8DAA8D;IAC9D,sDAAsD;IACtD,2CAA2C;IAC3C,+CAA+C;IAC/C,iDAAiD;IACjD,kDAAkD;IAClD,kDAAkD;IAClD,6CAA6C;IAC7C,6CAA6C;IAC7C,iEAAiE;IACjE,kEAAkE;IAClE,6DAA6D;IAC7D,8CAA8C;IAC9C,wDAAwD;IACxD,gDAAgD;IAChD,qDAAqD;IACrD,sDAAsD;IACtD,wDAAwD;IACxD,wCAAwC;IACxC,wCAAwC;IACxC,iDAAiD;IACjD,wDAAwD;IACxD,0DAA0D;IAC1D,0CAA0C;IAC1C,6CAA6C;IAC7C,wCAAwC;IACxC,mDAAmD;IACnD,+CAA+C;IAC/C,mDAAmD;IACnD,0CAA0C;IAC1C,kDAAkD;IAClD,8CAA8C;IAC9C,oDAAoD;IACpD,kDAAkD;IAClD,+CAA+C;IAC/C,mDAAmD;IACnD,2CAA2C;IAC3C,qDAAqD;IACrD,+CAA+C;IAC/C,sDAAsD;IACtD,gDAAgD;IAChD,2CAA2C;IAC3C,gDAAgD;IAChD,0CAA0C;IAC1C,0CAA0C;IAC1C,kDAAkD;IAClD,yCAAyC;IACzC,kDAAkD;IAClD,2CAA2C;IAC3C,yCAAyC;IACzC,2CAA2C;IAC3C,4CAA4C;IAC5C,mDAAmD;IACnD,uDAAuD;IACvD,4DAA4D;IAC5D,sDAAsD;IACtD,sDAAsD;IACtD,qDAAqD;IACrD,wDAAwD;IACxD,oDAAoD;IACpD,uDAAuD;IACvD,sDAAsD;IACtD,oDAAoD;IACpD,4CAA4C;IAC5C,iDAAiD;IACjD,iDAAiD;IACjD,sDAAsD;IACtD,kDAAkD;IAClD,sDAAsD;IACtD,kDAAkD;IAClD,gDAAgD;IAChD,uDAAuD;IACvD,iDAAiD;IACjD,kDAAkD;IAClD,gDAAgD;IAChD,mDAAmD;IACnD,mDAAmD;IACnD,6DAA6D;IAC7D,2DAA2D;IAC3D,2DAA2D;IAC3D,+DAA+D;IAC/D,+DAA+D;IAC/D,+DAA+D;IAC/D,0DAA0D;IAC1D,6DAA6D;IAC7D,6DAA6D;IAC7D,8DAA8D;IAC9D,8DAA8D;IAC9D,8DAA8D;IAC9D,qDAAqD;IACrD,sDAAsD;IACtD,2DAA2D;IAC3D,iDAAiD;IACjD,sDAAsD;IACtD,uDAAuD;IACvD,yDAAyD;IACzD,oDAAoD;IACpD,iEAAiE;IACjE,mDAAmD;IACnD,wDAAwD;IACxD,iDAAiD;IACjD,wDAAwD;IACxD,kDAAkD;IAClD,oDAAoD;IACpD,iDAAiD;IACjD,8DAA8D;IAC9D,4DAA4D;IAC5D,6DAA6D;IAC7D,gEAAgE;IAChE,iEAAiE;IACjE,iEAAiE;IACjE,qEAAqE;IACrE,mEAAmE;IACnE,qEAAqE;IACrE,kEAAkE;IAClE,mEAAmE;IACnE,kEAAkE;IAClE,wCAAwC;IACxC,gDAAgD;IAChD,0DAA0D;IAC1D,sCAAsC;IACtC,6DAA6D;IAC7D,kEAAkE;IAClE,8DAA8D;IAC9D,oEAAoE;IACpE,0DAA0D;IAC1D,kDAAkD;IAClD,gDAAgD;IAChD,kEAAkE;IAClE,uDAAuD;IACvD,oDAAoD;IACpD,oDAAoD;IACpD,qDAAqD;IACrD,oDAAoD;IACpD,kDAAkD;IAClD,+CAA+C;IAC/C,oDAAoD;IACpD,gDAAgD;IAChD,yCAAyC;IACzC,uCAAuC;IACvC,oCAAoC;IACpC,qCAAqC;IACrC,uCAAuC;IACvC,qCAAqC;IACrC,yCAAyC;IACzC,qCAAqC;IACrC,sCAAsC;IACtC,oCAAoC;IACpC,iCAAiC;IACjC,kCAAkC;IAClC,mCAAmC;IACnC,oCAAoC;IACpC,oCAAoC;IACpC,kDAAkD;IAClD,kDAAkD;IAClD,mDAAmD;IACnD,+CAA+C;IAC/C,gDAAgD;IAChD,gDAAgD;IAChD,kDAAkD;IAClD,oDAAoD;CACrD,CAAA"}
@@ -3,7 +3,7 @@ name: personal-assistant
3
3
  description: "Platform settings, messaging channels (Telegram, WhatsApp, email, Outlook), and browser automation, plus mechanical calendar subtasks you hand it with the facts already resolved (export these event IDs to .ics, parse this inbound .ics). Delegate when the work is configuring the platform, sending or reading messages, or driving a browser. Do not delegate calendar reasoning or an availability-affecting booking: only your admin session sees the connector-backed real calendar, so the specialist would answer from the internal scheduling store alone and miss it. You own what is on the calendar and what booking against it does."
4
4
  summary: "Handles the operational tasks you'd give a personal assistant: scheduling meetings, managing your platform settings, connecting messaging channels, and completing browser-based tasks on your behalf."
5
5
  model: claude-sonnet-5
6
- tools: Skill, mcp__plugin_admin_admin__system-status, mcp__plugin_admin_admin__brand-settings, mcp__plugin_admin_admin__account-manage, mcp__plugin_admin_admin__account-update, mcp__plugin_admin_admin__logs-read, mcp__plugin_admin_admin__plugin-read, mcp__plugin_admin_admin__wifi, mcp__plugin_contacts_contacts__contact-create, mcp__plugin_contacts_contacts__contact-lookup, mcp__plugin_contacts_contacts__contact-update, mcp__plugin_contacts_contacts__contact-delete, mcp__plugin_contacts_contacts__contact-list, mcp__plugin_contacts_contacts__contact-export, mcp__plugin_contacts_contacts__contact-erase, mcp__plugin_contacts_contacts__group-create, mcp__plugin_contacts_contacts__group-manage, mcp__plugin_telegram_telegram__message, mcp__plugin_telegram_telegram__message-history, mcp__plugin_telegram_telegram__telegram-webhook-register, mcp__plugin_whatsapp_whatsapp__whatsapp-login-start, mcp__plugin_whatsapp_whatsapp__whatsapp-login-wait, mcp__plugin_whatsapp_whatsapp__whatsapp-status, mcp__plugin_whatsapp_whatsapp__whatsapp-disconnect, mcp__plugin_whatsapp_whatsapp__whatsapp-config, mcp__plugin_whatsapp_whatsapp__whatsapp-activity, mcp__plugin_whatsapp_whatsapp__whatsapp-conversations, mcp__plugin_whatsapp_whatsapp__whatsapp-messages, mcp__plugin_whatsapp_whatsapp__whatsapp-conversation-graph-state, mcp__plugin_whatsapp_whatsapp__whatsapp-group-info, mcp__plugin_whatsapp_whatsapp__whatsapp-send-admin, mcp__plugin_whatsapp_whatsapp__whatsapp-reply, mcp__plugin_email_email__email-provider-info, mcp__plugin_email_email__email-setup, mcp__plugin_email_email__email-read, mcp__plugin_email_email__email-fetch-body, mcp__plugin_email_email__email-fetch-attachment, mcp__plugin_email_email__email-send, mcp__plugin_email_email__email-draft, mcp__plugin_email_email__email-draft-edit, mcp__plugin_email_email__email-draft-send, mcp__plugin_email_email__email-reply, mcp__plugin_email_email__email-search, mcp__plugin_email_email__email-delete, mcp__plugin_email_email__email-graph-query, mcp__plugin_email_email__email-otp-extract, mcp__plugin_email_email__email-status, mcp__plugin_email_email__email-fetch, mcp__plugin_email_email__email-ingest, mcp__plugin_outlook_outlook__outlook-account-register, mcp__plugin_outlook_outlook__outlook-account-register-poll, mcp__plugin_outlook_outlook__outlook-mail-list, mcp__plugin_outlook_outlook__outlook-mail-search, mcp__plugin_outlook_outlook__outlook-mail-fetch-body, mcp__plugin_outlook_outlook__outlook-mail-attachment, mcp__plugin_outlook_outlook__outlook-mail-reply, mcp__plugin_outlook_outlook__outlook-mail-delete, mcp__plugin_outlook_outlook__outlook-mail-otp-extract, mcp__plugin_outlook_outlook__outlook-mail-send, mcp__plugin_outlook_outlook__outlook-draft, mcp__plugin_outlook_outlook__outlook-draft-edit, mcp__plugin_outlook_outlook__outlook-draft-send, mcp__plugin_outlook_outlook__outlook-calendar-list, mcp__plugin_outlook_outlook__outlook-calendar-event, mcp__plugin_outlook_outlook__outlook-calendar-create, mcp__plugin_outlook_outlook__outlook-calendar-update, mcp__plugin_outlook_outlook__outlook-calendar-cancel, mcp__plugin_outlook_outlook__outlook-calendar-respond, mcp__plugin_outlook_outlook__outlook-calendar-freebusy, mcp__plugin_outlook_outlook__outlook-contacts-list, mcp__plugin_outlook_outlook__outlook-mailbox-info, mcp__plugin_outlook_outlook__outlook-mailbox-list, mcp__plugin_google_google__google-account-register, mcp__plugin_google_google__google-account-register-poll, mcp__plugin_google_google__google-account-register-submit, mcp__plugin_google_google__google-calendar-list, mcp__plugin_google_google__google-calendar-event, mcp__plugin_google_google__google-calendar-create, mcp__plugin_google_google__google-calendar-update, mcp__plugin_google_google__google-calendar-cancel, mcp__plugin_google_google__google-calendar-respond, mcp__plugin_google_google__google-calendar-freebusy, mcp__plugin_google_google__google-account-info, mcp__plugin_google_google__google-account-list, mcp__plugin_scheduling_scheduling__schedule-event, mcp__plugin_scheduling_scheduling__schedule-list, mcp__plugin_scheduling_scheduling__schedule-get, mcp__plugin_scheduling_scheduling__schedule-update, mcp__plugin_scheduling_scheduling__schedule-cancel, mcp__plugin_scheduling_scheduling__schedule-export-ics, mcp__plugin_scheduling_scheduling__schedule-import-ics, mcp__plugin_scheduling_scheduling__time-resolve, mcp__plugin_memory_memory__memory-search, mcp__plugin_memory_memory__profile-update, mcp__plugin_url-get_url-get__url-get, mcp__plugin_browser_browser__browser-render, mcp__plugin_browser_browser__browser-navigate, mcp__plugin_browser_browser__browser-snapshot, mcp__plugin_browser_browser__browser-click, mcp__plugin_browser_browser__browser-fill, mcp__plugin_browser_browser__browser-fill-form, mcp__plugin_browser_browser__browser-type, mcp__plugin_browser_browser__browser-press-key, mcp__plugin_browser_browser__browser-hover, mcp__plugin_browser_browser__browser-select-option, mcp__plugin_browser_browser__browser-wait-for, mcp__plugin_browser_browser__browser-handle-dialog, mcp__plugin_browser_browser__browser-evaluate, mcp__plugin_browser_browser__browser-console-messages, mcp__plugin_browser_browser__browser-tabs, mcp__plugin_browser_browser__browser-pdf-save, mcp__plugin_browser_browser__browser-screenshot, mcp__plugin_browser_browser__browser-resize
6
+ tools: Skill, mcp__plugin_admin_admin__system-status, mcp__plugin_admin_admin__brand-settings, mcp__plugin_admin_admin__account-manage, mcp__plugin_admin_admin__account-update, mcp__plugin_admin_admin__logs-read, mcp__plugin_admin_admin__plugin-read, mcp__plugin_admin_admin__wifi, mcp__plugin_contacts_contacts__contact-create, mcp__plugin_contacts_contacts__contact-lookup, mcp__plugin_contacts_contacts__contact-update, mcp__plugin_contacts_contacts__contact-delete, mcp__plugin_contacts_contacts__contact-list, mcp__plugin_contacts_contacts__contact-export, mcp__plugin_contacts_contacts__contact-erase, mcp__plugin_contacts_contacts__group-create, mcp__plugin_contacts_contacts__group-manage, mcp__plugin_telegram_telegram__message, mcp__plugin_telegram_telegram__message-history, mcp__plugin_telegram_telegram__telegram-webhook-register, mcp__plugin_whatsapp_whatsapp__whatsapp-login-start, mcp__plugin_whatsapp_whatsapp__whatsapp-login-wait, mcp__plugin_whatsapp_whatsapp__whatsapp-status, mcp__plugin_whatsapp_whatsapp__whatsapp-disconnect, mcp__plugin_whatsapp_whatsapp__whatsapp-config, mcp__plugin_whatsapp_whatsapp__whatsapp-activity, mcp__plugin_whatsapp_whatsapp__whatsapp-conversations, mcp__plugin_whatsapp_whatsapp__whatsapp-messages, mcp__plugin_whatsapp_whatsapp__whatsapp-conversation-graph-state, mcp__plugin_whatsapp_whatsapp__whatsapp-group-info, mcp__plugin_whatsapp_whatsapp__whatsapp-send-admin, mcp__plugin_whatsapp_whatsapp__whatsapp-reply, mcp__plugin_email_email__email-provider-info, mcp__plugin_email_email__email-setup, mcp__plugin_email_email__email-read, mcp__plugin_email_email__email-fetch-body, mcp__plugin_email_email__email-fetch-attachment, mcp__plugin_email_email__email-send, mcp__plugin_email_email__email-draft, mcp__plugin_email_email__email-draft-edit, mcp__plugin_email_email__email-draft-send, mcp__plugin_email_email__email-reply, mcp__plugin_email_email__email-search, mcp__plugin_email_email__email-delete, mcp__plugin_email_email__email-graph-query, mcp__plugin_email_email__email-otp-extract, mcp__plugin_email_email__email-status, mcp__plugin_email_email__email-fetch, mcp__plugin_email_email__email-ingest, mcp__plugin_outlook_outlook__outlook-account-register, mcp__plugin_outlook_outlook__outlook-account-register-poll, mcp__plugin_outlook_outlook__outlook-mail-list, mcp__plugin_outlook_outlook__outlook-mail-search, mcp__plugin_outlook_outlook__outlook-mail-fetch-body, mcp__plugin_outlook_outlook__outlook-mail-attachment, mcp__plugin_outlook_outlook__outlook-mail-reply, mcp__plugin_outlook_outlook__outlook-mail-delete, mcp__plugin_outlook_outlook__outlook-mail-ingest, mcp__plugin_outlook_outlook__outlook-mail-otp-extract, mcp__plugin_outlook_outlook__outlook-mail-send, mcp__plugin_outlook_outlook__outlook-draft, mcp__plugin_outlook_outlook__outlook-draft-edit, mcp__plugin_outlook_outlook__outlook-draft-send, mcp__plugin_outlook_outlook__outlook-calendar-list, mcp__plugin_outlook_outlook__outlook-calendar-event, mcp__plugin_outlook_outlook__outlook-calendar-create, mcp__plugin_outlook_outlook__outlook-calendar-update, mcp__plugin_outlook_outlook__outlook-calendar-cancel, mcp__plugin_outlook_outlook__outlook-calendar-respond, mcp__plugin_outlook_outlook__outlook-calendar-freebusy, mcp__plugin_outlook_outlook__outlook-contacts-list, mcp__plugin_outlook_outlook__outlook-mailbox-info, mcp__plugin_outlook_outlook__outlook-mailbox-list, mcp__plugin_google_google__google-account-register, mcp__plugin_google_google__google-account-register-poll, mcp__plugin_google_google__google-account-register-submit, mcp__plugin_google_google__google-calendar-list, mcp__plugin_google_google__google-calendar-event, mcp__plugin_google_google__google-calendar-create, mcp__plugin_google_google__google-calendar-update, mcp__plugin_google_google__google-calendar-cancel, mcp__plugin_google_google__google-calendar-respond, mcp__plugin_google_google__google-calendar-freebusy, mcp__plugin_google_google__google-account-info, mcp__plugin_google_google__google-account-list, mcp__plugin_scheduling_scheduling__schedule-event, mcp__plugin_scheduling_scheduling__schedule-list, mcp__plugin_scheduling_scheduling__schedule-get, mcp__plugin_scheduling_scheduling__schedule-update, mcp__plugin_scheduling_scheduling__schedule-cancel, mcp__plugin_scheduling_scheduling__schedule-export-ics, mcp__plugin_scheduling_scheduling__schedule-import-ics, mcp__plugin_scheduling_scheduling__time-resolve, mcp__plugin_memory_memory__memory-search, mcp__plugin_memory_memory__profile-update, mcp__plugin_url-get_url-get__url-get, mcp__plugin_browser_browser__browser-render, mcp__plugin_browser_browser__browser-navigate, mcp__plugin_browser_browser__browser-snapshot, mcp__plugin_browser_browser__browser-click, mcp__plugin_browser_browser__browser-fill, mcp__plugin_browser_browser__browser-fill-form, mcp__plugin_browser_browser__browser-type, mcp__plugin_browser_browser__browser-press-key, mcp__plugin_browser_browser__browser-hover, mcp__plugin_browser_browser__browser-select-option, mcp__plugin_browser_browser__browser-wait-for, mcp__plugin_browser_browser__browser-handle-dialog, mcp__plugin_browser_browser__browser-evaluate, mcp__plugin_browser_browser__browser-console-messages, mcp__plugin_browser_browser__browser-tabs, mcp__plugin_browser_browser__browser-pdf-save, mcp__plugin_browser_browser__browser-screenshot, mcp__plugin_browser_browser__browser-resize
7
7
  pattern_deliverable: false
8
8
  ---
9
9
 
@@ -5,12 +5,12 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Activity — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/activity-2DL2DwLr.js"></script>
8
+ <script type="module" crossorigin src="/assets/activity-cVe5ZnG7.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-TPjIAO9U.js">
10
- <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-Q941cZYV.js">
11
- <link rel="modulepreload" crossorigin href="/assets/AdminShell-BwNqwb4k.js">
12
- <link rel="modulepreload" crossorigin href="/assets/triangle-alert-7mQfCQWP.js">
13
- <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-Bgfqig1V.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/useSubAccountSwitcher-DdctgpPL.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/AdminShell-CiTHCp5t.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/triangle-alert-DKZ69dOa.js">
13
+ <link rel="stylesheet" crossorigin href="/assets/useSubAccountSwitcher-DFnDNIDO.css">
14
14
  <link rel="stylesheet" href="/brand-defaults.css">
15
15
  </head>
16
16
  <body>