@rubytech/create-sitedesk-code 0.1.523 → 0.1.524

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 (690) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/agent-dispatch-rule/dist/index.d.ts +99 -0
  3. package/payload/platform/lib/agent-dispatch-rule/dist/index.d.ts.map +1 -0
  4. package/payload/platform/lib/agent-dispatch-rule/dist/index.js +228 -0
  5. package/payload/platform/lib/agent-dispatch-rule/dist/index.js.map +1 -0
  6. package/payload/platform/lib/agent-dispatch-rule/package.json +6 -0
  7. package/payload/platform/lib/agent-dispatch-rule/src/__tests__/rule.test.ts +384 -0
  8. package/payload/platform/lib/agent-dispatch-rule/src/index.ts +269 -0
  9. package/payload/platform/lib/agent-dispatch-rule/tsconfig.json +9 -0
  10. package/payload/platform/lib/agent-dispatch-rule/vitest.config.ts +9 -0
  11. package/payload/platform/lib/routine-templates/dist/roster.js +1 -1
  12. package/payload/platform/lib/routine-templates/src/roster.ts +1 -1
  13. package/payload/platform/package.json +2 -2
  14. package/payload/platform/plugins/admin/PLUGIN.md +1 -0
  15. package/payload/platform/plugins/admin/hooks/__tests__/mailbox-inject.test.sh +501 -0
  16. package/payload/platform/plugins/admin/hooks/mailbox-inject.sh +299 -0
  17. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +54 -21
  18. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +6 -0
  19. package/payload/platform/plugins/docs/references/admin-ui.md +49 -18
  20. package/payload/platform/plugins/docs/references/workflows.md +4 -2
  21. package/payload/platform/plugins/email/mcp/dist/__tests__/email-status.test.js +72 -1
  22. package/payload/platform/plugins/email/mcp/dist/__tests__/email-status.test.js.map +1 -1
  23. package/payload/platform/plugins/email/mcp/dist/__tests__/mailbox-resolve.test.js +4 -1
  24. package/payload/platform/plugins/email/mcp/dist/__tests__/mailbox-resolve.test.js.map +1 -1
  25. package/payload/platform/plugins/email/mcp/dist/lib/credentials.d.ts.map +1 -1
  26. package/payload/platform/plugins/email/mcp/dist/lib/credentials.js +4 -2
  27. package/payload/platform/plugins/email/mcp/dist/lib/credentials.js.map +1 -1
  28. package/payload/platform/plugins/email/mcp/dist/tools/email-status.d.ts +0 -6
  29. package/payload/platform/plugins/email/mcp/dist/tools/email-status.d.ts.map +1 -1
  30. package/payload/platform/plugins/email/mcp/dist/tools/email-status.js +24 -2
  31. package/payload/platform/plugins/email/mcp/dist/tools/email-status.js.map +1 -1
  32. package/payload/platform/plugins/email/references/email-reference.md +1 -1
  33. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mail-search-delegated-ids.test.d.ts +2 -0
  34. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mail-search-delegated-ids.test.d.ts.map +1 -0
  35. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mail-search-delegated-ids.test.js +322 -0
  36. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mail-search-delegated-ids.test.js.map +1 -0
  37. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mailbox-registry.test.js +21 -1
  38. package/payload/platform/plugins/outlook/mcp/dist/__tests__/mailbox-registry.test.js.map +1 -1
  39. package/payload/platform/plugins/outlook/mcp/dist/auth/mailbox-registry.d.ts +13 -0
  40. package/payload/platform/plugins/outlook/mcp/dist/auth/mailbox-registry.d.ts.map +1 -1
  41. package/payload/platform/plugins/outlook/mcp/dist/auth/mailbox-registry.js +16 -0
  42. package/payload/platform/plugins/outlook/mcp/dist/auth/mailbox-registry.js.map +1 -1
  43. package/payload/platform/plugins/outlook/mcp/dist/index.js +5 -5
  44. package/payload/platform/plugins/outlook/mcp/dist/index.js.map +1 -1
  45. package/payload/platform/plugins/outlook/mcp/dist/lib/graph-client.d.ts.map +1 -1
  46. package/payload/platform/plugins/outlook/mcp/dist/lib/graph-client.js +6 -0
  47. package/payload/platform/plugins/outlook/mcp/dist/lib/graph-client.js.map +1 -1
  48. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-search.d.ts +7 -0
  49. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-search.d.ts.map +1 -1
  50. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-search.js +122 -8
  51. package/payload/platform/plugins/outlook/mcp/dist/tools/mail-search.js.map +1 -1
  52. package/payload/platform/plugins/scheduling/PLUGIN.md +20 -1
  53. package/payload/platform/plugins/scheduling/mcp/dist/index.js +6 -4
  54. package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
  55. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/agent-dispatch.test.js +8 -36
  56. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/agent-dispatch.test.js.map +1 -1
  57. package/payload/platform/plugins/scheduling/mcp/dist/lib/agent-dispatch.d.ts +10 -65
  58. package/payload/platform/plugins/scheduling/mcp/dist/lib/agent-dispatch.d.ts.map +1 -1
  59. package/payload/platform/plugins/scheduling/mcp/dist/lib/agent-dispatch.js +29 -122
  60. package/payload/platform/plugins/scheduling/mcp/dist/lib/agent-dispatch.js.map +1 -1
  61. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-status.test.d.ts +2 -0
  62. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-status.test.d.ts.map +1 -0
  63. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-status.test.js +305 -0
  64. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-status.test.js.map +1 -0
  65. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts +46 -1
  66. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts.map +1 -1
  67. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js +172 -4
  68. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js.map +1 -1
  69. package/payload/platform/plugins/scheduling/skills/routine-control/SKILL.md +48 -0
  70. package/payload/platform/plugins/sweep/skills/email-graph-sweep/SKILL.md +21 -7
  71. package/payload/platform/scripts/__tests__/mailbox-inject-registered.test.sh +80 -0
  72. package/payload/platform/scripts/lib/__tests__/account-settings-mailbox-inject.test.sh +166 -0
  73. package/payload/platform/scripts/lib/account-settings-mailbox-inject.sh +91 -0
  74. package/payload/platform/scripts/lib/provision-account-dir.sh +1 -0
  75. package/payload/platform/scripts/setup-account.sh +15 -0
  76. package/payload/server/public/activity.html +5 -5
  77. package/payload/server/public/agents.html +4 -4
  78. package/payload/server/public/assets/{AdminLoginScreens-uknqh2Pm.js → AdminLoginScreens-BgDjueVe.js} +1 -1
  79. package/payload/server/public/assets/AdminLoginScreens-BgDjueVe.js.br +0 -0
  80. package/payload/server/public/assets/AdminLoginScreens-BgDjueVe.js.gz +0 -0
  81. package/payload/server/public/assets/{AdminShell-GqtMImyQ.js → AdminShell-YctTrR-D.js} +1 -1
  82. package/payload/server/public/assets/AdminShell-YctTrR-D.js.br +0 -0
  83. package/payload/server/public/assets/AdminShell-YctTrR-D.js.gz +0 -0
  84. package/payload/server/public/assets/{activity-B4KfMJqO.js → activity-DGQt5ys_.js} +1 -1
  85. package/payload/server/public/assets/activity-DGQt5ys_.js.br +0 -0
  86. package/payload/server/public/assets/activity-DGQt5ys_.js.gz +0 -0
  87. package/payload/server/public/assets/admin-DnUxbB3P.js +1 -0
  88. package/payload/server/public/assets/admin-DnUxbB3P.js.br +0 -0
  89. package/payload/server/public/assets/admin-DnUxbB3P.js.gz +0 -0
  90. package/payload/server/public/assets/agents-Bc2LZjwC.js +1 -0
  91. package/payload/server/public/assets/agents-Bc2LZjwC.js.br +0 -0
  92. package/payload/server/public/assets/agents-Bc2LZjwC.js.gz +0 -0
  93. package/payload/server/public/assets/{arc-DaI5MLTq.js → arc-DaudCnXg.js} +1 -1
  94. package/payload/server/public/assets/arc-DaudCnXg.js.br +0 -0
  95. package/payload/server/public/assets/arc-DaudCnXg.js.gz +0 -0
  96. package/payload/server/public/assets/architecture-YZFGNWBL-DPFsm5jD.js +1 -0
  97. package/payload/server/public/assets/architecture-YZFGNWBL-DPFsm5jD.js.br +0 -0
  98. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-CBGVUEN9.js → architectureDiagram-Q4EWVU46-BEEC3s7i.js} +1 -1
  99. package/payload/server/public/assets/architectureDiagram-Q4EWVU46-BEEC3s7i.js.br +0 -0
  100. package/payload/server/public/assets/architectureDiagram-Q4EWVU46-BEEC3s7i.js.gz +0 -0
  101. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-DS6dS4GZ.js → blockDiagram-DXYQGD6D-BIWyfb18.js} +1 -1
  102. package/payload/server/public/assets/blockDiagram-DXYQGD6D-BIWyfb18.js.br +0 -0
  103. package/payload/server/public/assets/blockDiagram-DXYQGD6D-BIWyfb18.js.gz +0 -0
  104. package/payload/server/public/assets/{browser-B3hSzI3O.js → browser-BtF7SzvG.js} +1 -1
  105. package/payload/server/public/assets/browser-BtF7SzvG.js.br +0 -0
  106. package/payload/server/public/assets/browser-BtF7SzvG.js.gz +0 -0
  107. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-hBSBUZPt.js → c4Diagram-AHTNJAMY--h6oE2cv.js} +1 -1
  108. package/payload/server/public/assets/c4Diagram-AHTNJAMY--h6oE2cv.js.br +0 -0
  109. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-hBSBUZPt.js.gz → c4Diagram-AHTNJAMY--h6oE2cv.js.gz} +0 -0
  110. package/payload/server/public/assets/{calendar-BggxXxhS.js → calendar-D25EhXbD.js} +1 -1
  111. package/payload/server/public/assets/calendar-D25EhXbD.js.br +0 -0
  112. package/payload/server/public/assets/calendar-D25EhXbD.js.gz +0 -0
  113. package/payload/server/public/assets/channel-TwxCDSpK.js +1 -0
  114. package/payload/server/public/assets/channel-TwxCDSpK.js.br +0 -0
  115. package/payload/server/public/assets/chat-z4jsHFXg.js +1 -0
  116. package/payload/server/public/assets/chat-z4jsHFXg.js.br +0 -0
  117. package/payload/server/public/assets/chat-z4jsHFXg.js.gz +0 -0
  118. package/payload/server/public/assets/chevron-left-BD09SN6R.js +1 -0
  119. package/payload/server/public/assets/chevron-right-ChmWeo7T.js +1 -0
  120. package/payload/server/public/assets/chevron-right-ChmWeo7T.js.br +0 -0
  121. package/payload/server/public/assets/{chunk-2KRD3SAO-B6koUoB7.js → chunk-2KRD3SAO-BwEVlnxo.js} +1 -1
  122. package/payload/server/public/assets/chunk-2KRD3SAO-BwEVlnxo.js.br +0 -0
  123. package/payload/server/public/assets/chunk-2KRD3SAO-BwEVlnxo.js.gz +0 -0
  124. package/payload/server/public/assets/{chunk-336JU56O-BF6BRh8u.js → chunk-336JU56O-DQddTATH.js} +2 -2
  125. package/payload/server/public/assets/chunk-336JU56O-DQddTATH.js.br +0 -0
  126. package/payload/server/public/assets/chunk-336JU56O-DQddTATH.js.gz +0 -0
  127. package/payload/server/public/assets/chunk-426QAEUC-BDC8wptW.js +1 -0
  128. package/payload/server/public/assets/chunk-426QAEUC-BDC8wptW.js.br +0 -0
  129. package/payload/server/public/assets/chunk-426QAEUC-BDC8wptW.js.gz +0 -0
  130. package/payload/server/public/assets/{chunk-4BX2VUAB-7sO95xR2.js → chunk-4BX2VUAB-C5p3xTC6.js} +1 -1
  131. package/payload/server/public/assets/chunk-4BX2VUAB-C5p3xTC6.js.br +0 -0
  132. package/payload/server/public/assets/chunk-4BX2VUAB-C5p3xTC6.js.gz +0 -0
  133. package/payload/server/public/assets/{chunk-4TB4RGXK-GCTndJYx.js → chunk-4TB4RGXK-gClfNc1w.js} +1 -1
  134. package/payload/server/public/assets/chunk-4TB4RGXK-gClfNc1w.js.br +0 -0
  135. package/payload/server/public/assets/chunk-4TB4RGXK-gClfNc1w.js.gz +0 -0
  136. package/payload/server/public/assets/{chunk-55IACEB6-ggIJf_TC.js → chunk-55IACEB6-DDU_m1ra.js} +1 -1
  137. package/payload/server/public/assets/chunk-55IACEB6-DDU_m1ra.js.br +0 -0
  138. package/payload/server/public/assets/chunk-55IACEB6-DDU_m1ra.js.gz +0 -0
  139. package/payload/server/public/assets/{chunk-5FUZZQ4R-DeGmkimt.js → chunk-5FUZZQ4R-CZ2jQWNR.js} +1 -1
  140. package/payload/server/public/assets/chunk-5FUZZQ4R-CZ2jQWNR.js.br +0 -0
  141. package/payload/server/public/assets/chunk-5FUZZQ4R-CZ2jQWNR.js.gz +0 -0
  142. package/payload/server/public/assets/{chunk-5PVQY5BW-aFIQKk_U.js → chunk-5PVQY5BW-kcZ5kfTg.js} +1 -1
  143. package/payload/server/public/assets/chunk-5PVQY5BW-kcZ5kfTg.js.br +0 -0
  144. package/payload/server/public/assets/chunk-5PVQY5BW-kcZ5kfTg.js.gz +0 -0
  145. package/payload/server/public/assets/{chunk-67CJDMHE-LS8rUbii.js → chunk-67CJDMHE-9W0Qv0jm.js} +1 -1
  146. package/payload/server/public/assets/chunk-67CJDMHE-9W0Qv0jm.js.br +0 -0
  147. package/payload/server/public/assets/chunk-67CJDMHE-9W0Qv0jm.js.gz +0 -0
  148. package/payload/server/public/assets/{chunk-7N4EOEYR-JKOVngS0.js → chunk-7N4EOEYR-B3gqydR3.js} +1 -1
  149. package/payload/server/public/assets/chunk-7N4EOEYR-B3gqydR3.js.br +0 -0
  150. package/payload/server/public/assets/chunk-7N4EOEYR-B3gqydR3.js.gz +0 -0
  151. package/payload/server/public/assets/{chunk-AA7GKIK3-CoXnTVK6.js → chunk-AA7GKIK3-DW8a-2NK.js} +1 -1
  152. package/payload/server/public/assets/chunk-AA7GKIK3-DW8a-2NK.js.br +4 -0
  153. package/payload/server/public/assets/chunk-AA7GKIK3-DW8a-2NK.js.gz +0 -0
  154. package/payload/server/public/assets/{chunk-BSJP7CBP-CcsqObFg.js → chunk-BSJP7CBP-DqXIO_5R.js} +1 -1
  155. package/payload/server/public/assets/chunk-BSJP7CBP-DqXIO_5R.js.br +0 -0
  156. package/payload/server/public/assets/chunk-BSJP7CBP-DqXIO_5R.js.gz +0 -0
  157. package/payload/server/public/assets/{chunk-CIAEETIT-CpsybR7q.js → chunk-CIAEETIT-BMJfgj2u.js} +1 -1
  158. package/payload/server/public/assets/chunk-CIAEETIT-BMJfgj2u.js.br +0 -0
  159. package/payload/server/public/assets/chunk-CIAEETIT-BMJfgj2u.js.gz +0 -0
  160. package/payload/server/public/assets/{chunk-EDXVE4YY-BZ2I9PSq.js → chunk-EDXVE4YY-BxdLPk0b.js} +1 -1
  161. package/payload/server/public/assets/chunk-EDXVE4YY-BxdLPk0b.js.br +0 -0
  162. package/payload/server/public/assets/chunk-EDXVE4YY-BxdLPk0b.js.gz +0 -0
  163. package/payload/server/public/assets/{chunk-ENJZ2VHE-DbTwt6OZ.js → chunk-ENJZ2VHE-Cfe2DCjQ.js} +1 -1
  164. package/payload/server/public/assets/chunk-ENJZ2VHE-Cfe2DCjQ.js.br +0 -0
  165. package/payload/server/public/assets/chunk-ENJZ2VHE-Cfe2DCjQ.js.gz +0 -0
  166. package/payload/server/public/assets/{chunk-FMBD7UC4-D27VnSCa.js → chunk-FMBD7UC4-CdPjwbtf.js} +1 -1
  167. package/payload/server/public/assets/chunk-FMBD7UC4-CdPjwbtf.js.br +0 -0
  168. package/payload/server/public/assets/chunk-FMBD7UC4-CdPjwbtf.js.gz +0 -0
  169. package/payload/server/public/assets/{chunk-FOC6F5B3-C0tU2UFl.js → chunk-FOC6F5B3-Dl6l1KAh.js} +1 -1
  170. package/payload/server/public/assets/chunk-FOC6F5B3-Dl6l1KAh.js.br +0 -0
  171. package/payload/server/public/assets/chunk-FOC6F5B3-Dl6l1KAh.js.gz +0 -0
  172. package/payload/server/public/assets/{chunk-ICPOFSXX-UPPu2OIq.js → chunk-ICPOFSXX-PnsGrqtx.js} +2 -2
  173. package/payload/server/public/assets/chunk-ICPOFSXX-PnsGrqtx.js.br +0 -0
  174. package/payload/server/public/assets/chunk-ICPOFSXX-PnsGrqtx.js.gz +0 -0
  175. package/payload/server/public/assets/{chunk-K5T4RW27-DIKxqyYw.js → chunk-K5T4RW27--g29_wjW.js} +1 -1
  176. package/payload/server/public/assets/chunk-K5T4RW27--g29_wjW.js.br +0 -0
  177. package/payload/server/public/assets/chunk-K5T4RW27--g29_wjW.js.gz +0 -0
  178. package/payload/server/public/assets/{chunk-KGLVRYIC-CiL4YVLo.js → chunk-KGLVRYIC-CI77ENeO.js} +1 -1
  179. package/payload/server/public/assets/chunk-KGLVRYIC-CI77ENeO.js.br +3 -0
  180. package/payload/server/public/assets/chunk-KGLVRYIC-CI77ENeO.js.gz +0 -0
  181. package/payload/server/public/assets/{chunk-LIHQZDEY-ejKezVlD.js → chunk-LIHQZDEY-CE-XByg6.js} +1 -1
  182. package/payload/server/public/assets/chunk-LIHQZDEY-CE-XByg6.js.br +0 -0
  183. package/payload/server/public/assets/chunk-LIHQZDEY-CE-XByg6.js.gz +0 -0
  184. package/payload/server/public/assets/{chunk-ORNJ4GCN-Cc0vqc-D.js → chunk-ORNJ4GCN-DkjJQQSm.js} +1 -1
  185. package/payload/server/public/assets/chunk-ORNJ4GCN-DkjJQQSm.js.br +0 -0
  186. package/payload/server/public/assets/chunk-ORNJ4GCN-DkjJQQSm.js.gz +0 -0
  187. package/payload/server/public/assets/{chunk-OYMX7WX6-Drxn1qG0.js → chunk-OYMX7WX6-DhogFeD7.js} +1 -1
  188. package/payload/server/public/assets/chunk-OYMX7WX6-DhogFeD7.js.br +0 -0
  189. package/payload/server/public/assets/chunk-OYMX7WX6-DhogFeD7.js.gz +0 -0
  190. package/payload/server/public/assets/chunk-QZHKN3VN-DnqqL1de.js +1 -0
  191. package/payload/server/public/assets/chunk-QZHKN3VN-DnqqL1de.js.br +0 -0
  192. package/payload/server/public/assets/chunk-QZHKN3VN-DnqqL1de.js.gz +0 -0
  193. package/payload/server/public/assets/{chunk-U2HBQHQK-DnbQIkRP.js → chunk-U2HBQHQK-CeaRXuiO.js} +1 -1
  194. package/payload/server/public/assets/chunk-U2HBQHQK-CeaRXuiO.js.br +0 -0
  195. package/payload/server/public/assets/chunk-U2HBQHQK-CeaRXuiO.js.gz +0 -0
  196. package/payload/server/public/assets/{chunk-X2U36JSP-CauTSVWg.js → chunk-X2U36JSP-BqxXeOqf.js} +1 -1
  197. package/payload/server/public/assets/chunk-X2U36JSP-BqxXeOqf.js.br +0 -0
  198. package/payload/server/public/assets/chunk-X2U36JSP-BqxXeOqf.js.gz +0 -0
  199. package/payload/server/public/assets/{chunk-XPW4576I-DZqqB9Zi.js → chunk-XPW4576I-DtqJwn2x.js} +1 -1
  200. package/payload/server/public/assets/chunk-XPW4576I-DtqJwn2x.js.br +0 -0
  201. package/payload/server/public/assets/chunk-XPW4576I-DtqJwn2x.js.gz +0 -0
  202. package/payload/server/public/assets/{chunk-YZCP3GAM-BGHo4Li-.js → chunk-YZCP3GAM-COBlEwQw.js} +1 -1
  203. package/payload/server/public/assets/chunk-YZCP3GAM-COBlEwQw.js.br +0 -0
  204. package/payload/server/public/assets/chunk-YZCP3GAM-COBlEwQw.js.gz +0 -0
  205. package/payload/server/public/assets/{chunk-ZZ45TVLE-DWGJKPd7.js → chunk-ZZ45TVLE-CcL088y6.js} +1 -1
  206. package/payload/server/public/assets/chunk-ZZ45TVLE-CcL088y6.js.br +0 -0
  207. package/payload/server/public/assets/chunk-ZZ45TVLE-CcL088y6.js.gz +0 -0
  208. package/payload/server/public/assets/classDiagram-6PBFFD2Q-Bc3P4dpc.js +1 -0
  209. package/payload/server/public/assets/classDiagram-6PBFFD2Q-Bc3P4dpc.js.br +0 -0
  210. package/payload/server/public/assets/classDiagram-6PBFFD2Q-Bc3P4dpc.js.gz +0 -0
  211. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DgEF_rR_.js +1 -0
  212. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DgEF_rR_.js.br +0 -0
  213. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DgEF_rR_.js.gz +0 -0
  214. package/payload/server/public/assets/clock-Yqf7Ke7I.js +1 -0
  215. package/payload/server/public/assets/clock-Yqf7Ke7I.js.br +0 -0
  216. package/payload/server/public/assets/clock-Yqf7Ke7I.js.gz +0 -0
  217. package/payload/server/public/assets/clone-B3vq32j7.js +1 -0
  218. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-D-95BzXL.js → cose-bilkent-S5V4N54A-kEHVkDNn.js} +1 -1
  219. package/payload/server/public/assets/cose-bilkent-S5V4N54A-kEHVkDNn.js.br +0 -0
  220. package/payload/server/public/assets/cose-bilkent-S5V4N54A-kEHVkDNn.js.gz +0 -0
  221. package/payload/server/public/assets/{dagre-BZYNBHvT.js → dagre-D2wUw1zC.js} +1 -1
  222. package/payload/server/public/assets/dagre-D2wUw1zC.js.br +0 -0
  223. package/payload/server/public/assets/dagre-D2wUw1zC.js.gz +0 -0
  224. package/payload/server/public/assets/{dagre-KV5264BT-DyU4HQLQ.js → dagre-KV5264BT-BWfTDwEs.js} +1 -1
  225. package/payload/server/public/assets/dagre-KV5264BT-BWfTDwEs.js.br +0 -0
  226. package/payload/server/public/assets/dagre-KV5264BT-BWfTDwEs.js.gz +0 -0
  227. package/payload/server/public/assets/data-RmnKj5nC.js +1 -0
  228. package/payload/server/public/assets/data-RmnKj5nC.js.br +2 -0
  229. package/payload/server/public/assets/data-RmnKj5nC.js.gz +0 -0
  230. package/payload/server/public/assets/{diagram-5BDNPKRD-CCttJ9XA.js → diagram-5BDNPKRD-Tl9dS8w0.js} +1 -1
  231. package/payload/server/public/assets/diagram-5BDNPKRD-Tl9dS8w0.js.br +0 -0
  232. package/payload/server/public/assets/diagram-5BDNPKRD-Tl9dS8w0.js.gz +0 -0
  233. package/payload/server/public/assets/{diagram-G4DWMVQ6-DvkpgSLO.js → diagram-G4DWMVQ6-CeSe6TMu.js} +1 -1
  234. package/payload/server/public/assets/diagram-G4DWMVQ6-CeSe6TMu.js.br +0 -0
  235. package/payload/server/public/assets/diagram-G4DWMVQ6-CeSe6TMu.js.gz +0 -0
  236. package/payload/server/public/assets/{diagram-MMDJMWI5-DHmW5Y9k.js → diagram-MMDJMWI5-DYBNJCmk.js} +1 -1
  237. package/payload/server/public/assets/diagram-MMDJMWI5-DYBNJCmk.js.br +0 -0
  238. package/payload/server/public/assets/diagram-MMDJMWI5-DYBNJCmk.js.gz +0 -0
  239. package/payload/server/public/assets/{diagram-TYMM5635-C6T4hwzO.js → diagram-TYMM5635-BmpUGltx.js} +1 -1
  240. package/payload/server/public/assets/diagram-TYMM5635-BmpUGltx.js.br +0 -0
  241. package/payload/server/public/assets/diagram-TYMM5635-BmpUGltx.js.gz +0 -0
  242. package/payload/server/public/assets/{erDiagram-SMLLAGMA-5v_o7s3T.js → erDiagram-SMLLAGMA-DuwuNGqx.js} +1 -1
  243. package/payload/server/public/assets/erDiagram-SMLLAGMA-DuwuNGqx.js.br +0 -0
  244. package/payload/server/public/assets/erDiagram-SMLLAGMA-DuwuNGqx.js.gz +0 -0
  245. package/payload/server/public/assets/file-download-CiGklOfA.js +1 -0
  246. package/payload/server/public/assets/file-download-CiGklOfA.js.br +0 -0
  247. package/payload/server/public/assets/file-download-CiGklOfA.js.gz +0 -0
  248. package/payload/server/public/assets/{file-text-BKs9eyiw.js → file-text-XjJPULAZ.js} +1 -1
  249. package/payload/server/public/assets/file-text-XjJPULAZ.js.br +0 -0
  250. package/payload/server/public/assets/file-text-XjJPULAZ.js.gz +0 -0
  251. package/payload/server/public/assets/{flatten-BtIc9jX7.js → flatten-Bu-b1uTY.js} +1 -1
  252. package/payload/server/public/assets/flatten-Bu-b1uTY.js.br +0 -0
  253. package/payload/server/public/assets/flatten-Bu-b1uTY.js.gz +0 -0
  254. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-3UhCDsjt.js → flowDiagram-DWJPFMVM-Bpp8P6Ba.js} +1 -1
  255. package/payload/server/public/assets/flowDiagram-DWJPFMVM-Bpp8P6Ba.js.br +0 -0
  256. package/payload/server/public/assets/flowDiagram-DWJPFMVM-Bpp8P6Ba.js.gz +0 -0
  257. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-F2zgHIIQ.js → ganttDiagram-T4ZO3ILL-CE6ppjB4.js} +1 -1
  258. package/payload/server/public/assets/ganttDiagram-T4ZO3ILL-CE6ppjB4.js.br +0 -0
  259. package/payload/server/public/assets/ganttDiagram-T4ZO3ILL-CE6ppjB4.js.gz +0 -0
  260. package/payload/server/public/assets/gitGraph-7Q5UKJZL-B0OUwOUx.js +1 -0
  261. package/payload/server/public/assets/gitGraph-7Q5UKJZL-B0OUwOUx.js.br +0 -0
  262. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-oQc1N3dT.js → gitGraphDiagram-UUTBAWPF-BdK1GjPr.js} +1 -1
  263. package/payload/server/public/assets/gitGraphDiagram-UUTBAWPF-BdK1GjPr.js.br +0 -0
  264. package/payload/server/public/assets/gitGraphDiagram-UUTBAWPF-BdK1GjPr.js.gz +0 -0
  265. package/payload/server/public/assets/{graph-DTi71NaZ.js → graph-BjHJ0z_6.js} +1 -1
  266. package/payload/server/public/assets/graph-BjHJ0z_6.js.br +0 -0
  267. package/payload/server/public/assets/graph-BjHJ0z_6.js.gz +0 -0
  268. package/payload/server/public/assets/{graph-labels-BT3S6e9H.js → graph-labels-D-0u37KA.js} +1 -1
  269. package/payload/server/public/assets/graph-labels-D-0u37KA.js.br +0 -0
  270. package/payload/server/public/assets/graph-labels-D-0u37KA.js.gz +0 -0
  271. package/payload/server/public/assets/{graphlib-DY4-AT2Q.js → graphlib-CHEXylyU.js} +1 -1
  272. package/payload/server/public/assets/graphlib-CHEXylyU.js.br +0 -0
  273. package/payload/server/public/assets/graphlib-CHEXylyU.js.gz +0 -0
  274. package/payload/server/public/assets/info-OMHHGYJF-C_8TwPDe.js +1 -0
  275. package/payload/server/public/assets/info-OMHHGYJF-C_8TwPDe.js.br +0 -0
  276. package/payload/server/public/assets/infoDiagram-42DDH7IO-msfwyvbV.js +2 -0
  277. package/payload/server/public/assets/infoDiagram-42DDH7IO-msfwyvbV.js.br +0 -0
  278. package/payload/server/public/assets/infoDiagram-42DDH7IO-msfwyvbV.js.gz +0 -0
  279. package/payload/server/public/assets/{isEmpty-Bu4fZ8Kf.js → isEmpty-CjH0UASp.js} +1 -1
  280. package/payload/server/public/assets/isEmpty-CjH0UASp.js.br +0 -0
  281. package/payload/server/public/assets/isEmpty-CjH0UASp.js.gz +0 -0
  282. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-wJhSOkuw.js → ishikawaDiagram-UXIWVN3A-CgkVZ4-3.js} +1 -1
  283. package/payload/server/public/assets/ishikawaDiagram-UXIWVN3A-CgkVZ4-3.js.br +0 -0
  284. package/payload/server/public/assets/ishikawaDiagram-UXIWVN3A-CgkVZ4-3.js.gz +0 -0
  285. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-DgadC6Pz.js → journeyDiagram-VCZTEJTY-ByUPv8q6.js} +1 -1
  286. package/payload/server/public/assets/journeyDiagram-VCZTEJTY-ByUPv8q6.js.br +0 -0
  287. package/payload/server/public/assets/journeyDiagram-VCZTEJTY-ByUPv8q6.js.gz +0 -0
  288. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-Bs4nQqXI.js → kanban-definition-6JOO6SKY-CFinqhpu.js} +1 -1
  289. package/payload/server/public/assets/kanban-definition-6JOO6SKY-CFinqhpu.js.br +0 -0
  290. package/payload/server/public/assets/kanban-definition-6JOO6SKY-CFinqhpu.js.gz +0 -0
  291. package/payload/server/public/assets/{line-Bnmxy1hO.js → line-Y4ns5Ghi.js} +1 -1
  292. package/payload/server/public/assets/line-Y4ns5Ghi.js.br +0 -0
  293. package/payload/server/public/assets/line-Y4ns5Ghi.js.gz +0 -0
  294. package/payload/server/public/assets/{linear-RvwZxFzh.js → linear-l39GooQ5.js} +1 -1
  295. package/payload/server/public/assets/linear-l39GooQ5.js.br +0 -0
  296. package/payload/server/public/assets/linear-l39GooQ5.js.gz +0 -0
  297. package/payload/server/public/assets/{maximize-2-zC94tsxY.js → maximize-2-BJ9S-nfS.js} +1 -1
  298. package/payload/server/public/assets/maximize-2-BJ9S-nfS.js.br +0 -0
  299. package/payload/server/public/assets/maximize-2-BJ9S-nfS.js.gz +0 -0
  300. package/payload/server/public/assets/{mermaid-parser.core-DeNV8RtA.js → mermaid-parser.core-5w0T1dRj.js} +2 -2
  301. package/payload/server/public/assets/mermaid-parser.core-5w0T1dRj.js.br +0 -0
  302. package/payload/server/public/assets/mermaid-parser.core-5w0T1dRj.js.gz +0 -0
  303. package/payload/server/public/assets/{mermaid.core-BU9IiSCP.js → mermaid.core-DBADY5VW.js} +3 -3
  304. package/payload/server/public/assets/mermaid.core-DBADY5VW.js.br +0 -0
  305. package/payload/server/public/assets/mermaid.core-DBADY5VW.js.gz +0 -0
  306. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-D1PMUxxm.js → mindmap-definition-QFDTVHPH-rHz37loq.js} +1 -1
  307. package/payload/server/public/assets/mindmap-definition-QFDTVHPH-rHz37loq.js.br +0 -0
  308. package/payload/server/public/assets/mindmap-definition-QFDTVHPH-rHz37loq.js.gz +0 -0
  309. package/payload/server/public/assets/{operator-BtWNEMh-.js → operator-Cay4rOOK.js} +1 -1
  310. package/payload/server/public/assets/operator-Cay4rOOK.js.br +0 -0
  311. package/payload/server/public/assets/operator-Cay4rOOK.js.gz +0 -0
  312. package/payload/server/public/assets/{ordinal-C2TEWKNu.js → ordinal-D6D6WcTC.js} +1 -1
  313. package/payload/server/public/assets/ordinal-D6D6WcTC.js.br +0 -0
  314. package/payload/server/public/assets/ordinal-D6D6WcTC.js.gz +0 -0
  315. package/payload/server/public/assets/packet-4T2RLAQJ-CCQdbIqO.js +1 -0
  316. package/payload/server/public/assets/packet-4T2RLAQJ-CCQdbIqO.js.br +0 -0
  317. package/payload/server/public/assets/{page-Ccl0FazM.js → page-Cci_j_y7.js} +3 -3
  318. package/payload/server/public/assets/page-Cci_j_y7.js.br +0 -0
  319. package/payload/server/public/assets/page-Cci_j_y7.js.gz +0 -0
  320. package/payload/server/public/assets/page-shuh4ES9.js +1 -0
  321. package/payload/server/public/assets/page-shuh4ES9.js.br +0 -0
  322. package/payload/server/public/assets/page-shuh4ES9.js.gz +0 -0
  323. package/payload/server/public/assets/{pdf-render-C257cidb.js → pdf-render-BSgBp8Fr.js} +1 -1
  324. package/payload/server/public/assets/pdf-render-BSgBp8Fr.js.br +0 -0
  325. package/payload/server/public/assets/pdf-render-BSgBp8Fr.js.gz +0 -0
  326. package/payload/server/public/assets/pie-ZZUOXDRM-Bdw3Iqs7.js +1 -0
  327. package/payload/server/public/assets/pie-ZZUOXDRM-Bdw3Iqs7.js.br +0 -0
  328. package/payload/server/public/assets/{pieDiagram-DEJITSTG-BzdNzoKA.js → pieDiagram-DEJITSTG-as0e_DSH.js} +1 -1
  329. package/payload/server/public/assets/pieDiagram-DEJITSTG-as0e_DSH.js.br +0 -0
  330. package/payload/server/public/assets/pieDiagram-DEJITSTG-as0e_DSH.js.gz +0 -0
  331. package/payload/server/public/assets/{public-BpC6cn9S.js → public-BbJcQGsO.js} +1 -1
  332. package/payload/server/public/assets/public-BbJcQGsO.js.br +0 -0
  333. package/payload/server/public/assets/public-BbJcQGsO.js.gz +0 -0
  334. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-oFr1MJRO.js → quadrantDiagram-34T5L4WZ-B4t8HO9J.js} +1 -1
  335. package/payload/server/public/assets/quadrantDiagram-34T5L4WZ-B4t8HO9J.js.br +0 -0
  336. package/payload/server/public/assets/quadrantDiagram-34T5L4WZ-B4t8HO9J.js.gz +0 -0
  337. package/payload/server/public/assets/radar-PYXPWWZC-D3FUdA3r.js +1 -0
  338. package/payload/server/public/assets/radar-PYXPWWZC-D3FUdA3r.js.br +0 -0
  339. package/payload/server/public/assets/{reduce-BGpN5lgn.js → reduce-BtXXK8Ma.js} +1 -1
  340. package/payload/server/public/assets/reduce-BtXXK8Ma.js.br +0 -0
  341. package/payload/server/public/assets/reduce-BtXXK8Ma.js.gz +0 -0
  342. package/payload/server/public/assets/{requirementDiagram-MS252O5E-C9QBQxDh.js → requirementDiagram-MS252O5E-yxh30zHX.js} +1 -1
  343. package/payload/server/public/assets/requirementDiagram-MS252O5E-yxh30zHX.js.br +0 -0
  344. package/payload/server/public/assets/requirementDiagram-MS252O5E-yxh30zHX.js.gz +0 -0
  345. package/payload/server/public/assets/{rotate-ccw-BNcqbHkZ.js → rotate-ccw-jeSVwUAv.js} +1 -1
  346. package/payload/server/public/assets/rotate-ccw-jeSVwUAv.js.br +0 -0
  347. package/payload/server/public/assets/rotate-ccw-jeSVwUAv.js.gz +0 -0
  348. package/payload/server/public/assets/routines-D3M1Wh3a.js +1 -0
  349. package/payload/server/public/assets/routines-D3M1Wh3a.js.br +0 -0
  350. package/payload/server/public/assets/routines-D3M1Wh3a.js.gz +0 -0
  351. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-c_y3bvVv.js → sankeyDiagram-XADWPNL6-j-k9Wfty.js} +1 -1
  352. package/payload/server/public/assets/sankeyDiagram-XADWPNL6-j-k9Wfty.js.br +0 -0
  353. package/payload/server/public/assets/sankeyDiagram-XADWPNL6-j-k9Wfty.js.gz +0 -0
  354. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-YwlCBPHE.js → sequenceDiagram-FGHM5R23-DGLgcLhC.js} +1 -1
  355. package/payload/server/public/assets/sequenceDiagram-FGHM5R23-DGLgcLhC.js.br +0 -0
  356. package/payload/server/public/assets/sequenceDiagram-FGHM5R23-DGLgcLhC.js.gz +0 -0
  357. package/payload/server/public/assets/{skills-COLAw_jt.js → skills-Bhej2ub1.js} +1 -1
  358. package/payload/server/public/assets/skills-Bhej2ub1.js.br +0 -0
  359. package/payload/server/public/assets/skills-Bhej2ub1.js.gz +0 -0
  360. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-BFE3e-FM.js → stateDiagram-FHFEXIEX-C9p1OUMI.js} +1 -1
  361. package/payload/server/public/assets/stateDiagram-FHFEXIEX-C9p1OUMI.js.br +0 -0
  362. package/payload/server/public/assets/stateDiagram-FHFEXIEX-C9p1OUMI.js.gz +0 -0
  363. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Bf808Apk.js +1 -0
  364. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Bf808Apk.js.br +0 -0
  365. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Bf808Apk.js.gz +0 -0
  366. package/payload/server/public/assets/{tasks-CZDQI4nB.js → tasks-qY-dtOI2.js} +1 -1
  367. package/payload/server/public/assets/tasks-qY-dtOI2.js.br +0 -0
  368. package/payload/server/public/assets/tasks-qY-dtOI2.js.gz +0 -0
  369. package/payload/server/public/assets/{time-entry-format-laTFzawg.js → time-entry-format-r5UY9rjG.js} +1 -1
  370. package/payload/server/public/assets/time-entry-format-r5UY9rjG.js.br +0 -0
  371. package/payload/server/public/assets/time-entry-format-r5UY9rjG.js.gz +0 -0
  372. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-azqhmRwZ.js → timeline-definition-GMOUNBTQ-B1g7pgkH.js} +1 -1
  373. package/payload/server/public/assets/timeline-definition-GMOUNBTQ-B1g7pgkH.js.br +0 -0
  374. package/payload/server/public/assets/timeline-definition-GMOUNBTQ-B1g7pgkH.js.gz +0 -0
  375. package/payload/server/public/assets/treeView-SZITEDCU-DetKw0D0.js +1 -0
  376. package/payload/server/public/assets/treeView-SZITEDCU-DetKw0D0.js.br +0 -0
  377. package/payload/server/public/assets/treemap-W4RFUUIX-zQkIANxW.js +1 -0
  378. package/payload/server/public/assets/treemap-W4RFUUIX-zQkIANxW.js.br +0 -0
  379. package/payload/server/public/assets/{triangle-alert-DrwqhEog.js → triangle-alert--PCKaewD.js} +1 -1
  380. package/payload/server/public/assets/triangle-alert--PCKaewD.js.br +2 -0
  381. package/payload/server/public/assets/triangle-alert--PCKaewD.js.gz +0 -0
  382. package/payload/server/public/assets/{useCopyFeedback-Cxme5GK6.js → useCopyFeedback-Dg5lNgqH.js} +1 -1
  383. package/payload/server/public/assets/useCopyFeedback-Dg5lNgqH.js.br +0 -0
  384. package/payload/server/public/assets/useCopyFeedback-Dg5lNgqH.js.gz +0 -0
  385. package/payload/server/public/assets/useSubAccountSwitcher-BYfe9vj8.css +1 -0
  386. package/payload/server/public/assets/useSubAccountSwitcher-BYfe9vj8.css.br +0 -0
  387. package/payload/server/public/assets/useSubAccountSwitcher-BYfe9vj8.css.gz +0 -0
  388. package/payload/server/public/assets/{useVoiceRecorder-DUBpVa2T.js → useVoiceRecorder-BY6ZsGMH.js} +2 -2
  389. package/payload/server/public/assets/useVoiceRecorder-BY6ZsGMH.js.br +0 -0
  390. package/payload/server/public/assets/useVoiceRecorder-BY6ZsGMH.js.gz +0 -0
  391. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-Da2RfFs8.js → vennDiagram-DHZGUBPP-D2ZjFfh4.js} +1 -1
  392. package/payload/server/public/assets/vennDiagram-DHZGUBPP-D2ZjFfh4.js.br +0 -0
  393. package/payload/server/public/assets/vennDiagram-DHZGUBPP-D2ZjFfh4.js.gz +0 -0
  394. package/payload/server/public/assets/wardley-RL74JXVD-DkQV3DvB.js +1 -0
  395. package/payload/server/public/assets/wardley-RL74JXVD-DkQV3DvB.js.br +0 -0
  396. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-HdrdBYES.js → wardleyDiagram-NUSXRM2D-BFAhfkD8.js} +1 -1
  397. package/payload/server/public/assets/wardleyDiagram-NUSXRM2D-BFAhfkD8.js.br +0 -0
  398. package/payload/server/public/assets/wardleyDiagram-NUSXRM2D-BFAhfkD8.js.gz +0 -0
  399. package/payload/server/public/assets/{wrench-DWuxPnzF.js → wrench-Bw1FMolk.js} +1 -1
  400. package/payload/server/public/assets/wrench-Bw1FMolk.js.br +0 -0
  401. package/payload/server/public/assets/wrench-Bw1FMolk.js.gz +0 -0
  402. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-DMk6rTcQ.js → xychartDiagram-5P7HB3ND-Dt94h2RQ.js} +1 -1
  403. package/payload/server/public/assets/xychartDiagram-5P7HB3ND-Dt94h2RQ.js.br +0 -0
  404. package/payload/server/public/assets/xychartDiagram-5P7HB3ND-Dt94h2RQ.js.gz +0 -0
  405. package/payload/server/public/brand-defaults.css +1 -0
  406. package/payload/server/public/browser.html +4 -4
  407. package/payload/server/public/calendar.html +7 -7
  408. package/payload/server/public/chat.html +14 -14
  409. package/payload/server/public/data.html +13 -12
  410. package/payload/server/public/graph.html +9 -9
  411. package/payload/server/public/index.html +16 -15
  412. package/payload/server/public/operator.html +15 -15
  413. package/payload/server/public/public.html +14 -14
  414. package/payload/server/public/routines.html +7 -6
  415. package/payload/server/public/skills.html +5 -5
  416. package/payload/server/public/tasks.html +6 -6
  417. package/payload/server/server.js +744 -425
  418. package/payload/server/public/assets/AdminLoginScreens-uknqh2Pm.js.br +0 -0
  419. package/payload/server/public/assets/AdminLoginScreens-uknqh2Pm.js.gz +0 -0
  420. package/payload/server/public/assets/AdminShell-GqtMImyQ.js.br +0 -0
  421. package/payload/server/public/assets/AdminShell-GqtMImyQ.js.gz +0 -0
  422. package/payload/server/public/assets/activity-B4KfMJqO.js.br +0 -0
  423. package/payload/server/public/assets/activity-B4KfMJqO.js.gz +0 -0
  424. package/payload/server/public/assets/admin-DxCZeVw0.js +0 -1
  425. package/payload/server/public/assets/admin-DxCZeVw0.js.br +0 -0
  426. package/payload/server/public/assets/admin-DxCZeVw0.js.gz +0 -0
  427. package/payload/server/public/assets/agents-BtwBuO4G.js +0 -1
  428. package/payload/server/public/assets/agents-BtwBuO4G.js.br +0 -0
  429. package/payload/server/public/assets/agents-BtwBuO4G.js.gz +0 -0
  430. package/payload/server/public/assets/arc-DaI5MLTq.js.br +0 -0
  431. package/payload/server/public/assets/arc-DaI5MLTq.js.gz +0 -0
  432. package/payload/server/public/assets/architecture-YZFGNWBL-DWZIX5aV.js +0 -1
  433. package/payload/server/public/assets/architecture-YZFGNWBL-DWZIX5aV.js.br +0 -0
  434. package/payload/server/public/assets/architectureDiagram-Q4EWVU46-CBGVUEN9.js.br +0 -0
  435. package/payload/server/public/assets/architectureDiagram-Q4EWVU46-CBGVUEN9.js.gz +0 -0
  436. package/payload/server/public/assets/blockDiagram-DXYQGD6D-DS6dS4GZ.js.br +0 -0
  437. package/payload/server/public/assets/blockDiagram-DXYQGD6D-DS6dS4GZ.js.gz +0 -0
  438. package/payload/server/public/assets/browser-B3hSzI3O.js.br +0 -0
  439. package/payload/server/public/assets/browser-B3hSzI3O.js.gz +0 -0
  440. package/payload/server/public/assets/c4Diagram-AHTNJAMY-hBSBUZPt.js.br +0 -0
  441. package/payload/server/public/assets/calendar-BggxXxhS.js.br +0 -0
  442. package/payload/server/public/assets/calendar-BggxXxhS.js.gz +0 -0
  443. package/payload/server/public/assets/channel-BEokjAeE.js +0 -1
  444. package/payload/server/public/assets/channel-BEokjAeE.js.br +0 -0
  445. package/payload/server/public/assets/chat-flivHt0t.js +0 -1
  446. package/payload/server/public/assets/chat-flivHt0t.js.br +0 -0
  447. package/payload/server/public/assets/chat-flivHt0t.js.gz +0 -0
  448. package/payload/server/public/assets/chevron-left-nVRThX7f.js +0 -1
  449. package/payload/server/public/assets/chevron-right-CLqfrkRA.js +0 -1
  450. package/payload/server/public/assets/chevron-right-CLqfrkRA.js.br +0 -0
  451. package/payload/server/public/assets/chunk-2KRD3SAO-B6koUoB7.js.br +0 -0
  452. package/payload/server/public/assets/chunk-2KRD3SAO-B6koUoB7.js.gz +0 -0
  453. package/payload/server/public/assets/chunk-336JU56O-BF6BRh8u.js.br +0 -0
  454. package/payload/server/public/assets/chunk-336JU56O-BF6BRh8u.js.gz +0 -0
  455. package/payload/server/public/assets/chunk-426QAEUC-pbQ4PWBU.js +0 -1
  456. package/payload/server/public/assets/chunk-426QAEUC-pbQ4PWBU.js.br +0 -0
  457. package/payload/server/public/assets/chunk-426QAEUC-pbQ4PWBU.js.gz +0 -0
  458. package/payload/server/public/assets/chunk-4BX2VUAB-7sO95xR2.js.br +0 -0
  459. package/payload/server/public/assets/chunk-4BX2VUAB-7sO95xR2.js.gz +0 -0
  460. package/payload/server/public/assets/chunk-4TB4RGXK-GCTndJYx.js.br +0 -0
  461. package/payload/server/public/assets/chunk-4TB4RGXK-GCTndJYx.js.gz +0 -0
  462. package/payload/server/public/assets/chunk-55IACEB6-ggIJf_TC.js.br +0 -0
  463. package/payload/server/public/assets/chunk-55IACEB6-ggIJf_TC.js.gz +0 -0
  464. package/payload/server/public/assets/chunk-5FUZZQ4R-DeGmkimt.js.br +0 -0
  465. package/payload/server/public/assets/chunk-5FUZZQ4R-DeGmkimt.js.gz +0 -0
  466. package/payload/server/public/assets/chunk-5PVQY5BW-aFIQKk_U.js.br +0 -0
  467. package/payload/server/public/assets/chunk-5PVQY5BW-aFIQKk_U.js.gz +0 -0
  468. package/payload/server/public/assets/chunk-67CJDMHE-LS8rUbii.js.br +0 -2
  469. package/payload/server/public/assets/chunk-67CJDMHE-LS8rUbii.js.gz +0 -0
  470. package/payload/server/public/assets/chunk-7N4EOEYR-JKOVngS0.js.br +0 -2
  471. package/payload/server/public/assets/chunk-7N4EOEYR-JKOVngS0.js.gz +0 -0
  472. package/payload/server/public/assets/chunk-AA7GKIK3-CoXnTVK6.js.br +0 -0
  473. package/payload/server/public/assets/chunk-AA7GKIK3-CoXnTVK6.js.gz +0 -0
  474. package/payload/server/public/assets/chunk-BSJP7CBP-CcsqObFg.js.br +0 -0
  475. package/payload/server/public/assets/chunk-BSJP7CBP-CcsqObFg.js.gz +0 -0
  476. package/payload/server/public/assets/chunk-CIAEETIT-CpsybR7q.js.br +0 -0
  477. package/payload/server/public/assets/chunk-CIAEETIT-CpsybR7q.js.gz +0 -0
  478. package/payload/server/public/assets/chunk-EDXVE4YY-BZ2I9PSq.js.br +0 -0
  479. package/payload/server/public/assets/chunk-EDXVE4YY-BZ2I9PSq.js.gz +0 -0
  480. package/payload/server/public/assets/chunk-ENJZ2VHE-DbTwt6OZ.js.br +0 -0
  481. package/payload/server/public/assets/chunk-ENJZ2VHE-DbTwt6OZ.js.gz +0 -0
  482. package/payload/server/public/assets/chunk-FMBD7UC4-D27VnSCa.js.br +0 -0
  483. package/payload/server/public/assets/chunk-FMBD7UC4-D27VnSCa.js.gz +0 -0
  484. package/payload/server/public/assets/chunk-FOC6F5B3-C0tU2UFl.js.br +0 -0
  485. package/payload/server/public/assets/chunk-FOC6F5B3-C0tU2UFl.js.gz +0 -0
  486. package/payload/server/public/assets/chunk-ICPOFSXX-UPPu2OIq.js.br +0 -0
  487. package/payload/server/public/assets/chunk-ICPOFSXX-UPPu2OIq.js.gz +0 -0
  488. package/payload/server/public/assets/chunk-K5T4RW27-DIKxqyYw.js.br +0 -0
  489. package/payload/server/public/assets/chunk-K5T4RW27-DIKxqyYw.js.gz +0 -0
  490. package/payload/server/public/assets/chunk-KGLVRYIC-CiL4YVLo.js.br +0 -0
  491. package/payload/server/public/assets/chunk-KGLVRYIC-CiL4YVLo.js.gz +0 -0
  492. package/payload/server/public/assets/chunk-LIHQZDEY-ejKezVlD.js.br +0 -0
  493. package/payload/server/public/assets/chunk-LIHQZDEY-ejKezVlD.js.gz +0 -0
  494. package/payload/server/public/assets/chunk-ORNJ4GCN-Cc0vqc-D.js.br +0 -0
  495. package/payload/server/public/assets/chunk-ORNJ4GCN-Cc0vqc-D.js.gz +0 -0
  496. package/payload/server/public/assets/chunk-OYMX7WX6-Drxn1qG0.js.br +0 -0
  497. package/payload/server/public/assets/chunk-OYMX7WX6-Drxn1qG0.js.gz +0 -0
  498. package/payload/server/public/assets/chunk-QZHKN3VN-Dhlh7Pkk.js +0 -1
  499. package/payload/server/public/assets/chunk-QZHKN3VN-Dhlh7Pkk.js.br +0 -0
  500. package/payload/server/public/assets/chunk-QZHKN3VN-Dhlh7Pkk.js.gz +0 -0
  501. package/payload/server/public/assets/chunk-U2HBQHQK-DnbQIkRP.js.br +0 -0
  502. package/payload/server/public/assets/chunk-U2HBQHQK-DnbQIkRP.js.gz +0 -0
  503. package/payload/server/public/assets/chunk-X2U36JSP-CauTSVWg.js.br +0 -0
  504. package/payload/server/public/assets/chunk-X2U36JSP-CauTSVWg.js.gz +0 -0
  505. package/payload/server/public/assets/chunk-XPW4576I-DZqqB9Zi.js.br +0 -0
  506. package/payload/server/public/assets/chunk-XPW4576I-DZqqB9Zi.js.gz +0 -0
  507. package/payload/server/public/assets/chunk-YZCP3GAM-BGHo4Li-.js.br +0 -0
  508. package/payload/server/public/assets/chunk-YZCP3GAM-BGHo4Li-.js.gz +0 -0
  509. package/payload/server/public/assets/chunk-ZZ45TVLE-DWGJKPd7.js.br +0 -0
  510. package/payload/server/public/assets/chunk-ZZ45TVLE-DWGJKPd7.js.gz +0 -0
  511. package/payload/server/public/assets/classDiagram-6PBFFD2Q-D2z_ZV1x.js +0 -1
  512. package/payload/server/public/assets/classDiagram-6PBFFD2Q-D2z_ZV1x.js.br +0 -0
  513. package/payload/server/public/assets/classDiagram-6PBFFD2Q-D2z_ZV1x.js.gz +0 -0
  514. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BJwJoNEK.js +0 -1
  515. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BJwJoNEK.js.br +0 -0
  516. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BJwJoNEK.js.gz +0 -0
  517. package/payload/server/public/assets/clock-Dj3SRZKo.js +0 -1
  518. package/payload/server/public/assets/clock-Dj3SRZKo.js.br +0 -0
  519. package/payload/server/public/assets/clock-Dj3SRZKo.js.gz +0 -0
  520. package/payload/server/public/assets/clone-Bn7XXVhr.js +0 -1
  521. package/payload/server/public/assets/clone-Bn7XXVhr.js.br +0 -0
  522. package/payload/server/public/assets/cose-bilkent-S5V4N54A-D-95BzXL.js.br +0 -0
  523. package/payload/server/public/assets/cose-bilkent-S5V4N54A-D-95BzXL.js.gz +0 -0
  524. package/payload/server/public/assets/dagre-BZYNBHvT.js.br +0 -0
  525. package/payload/server/public/assets/dagre-BZYNBHvT.js.gz +0 -0
  526. package/payload/server/public/assets/dagre-KV5264BT-DyU4HQLQ.js.br +0 -0
  527. package/payload/server/public/assets/dagre-KV5264BT-DyU4HQLQ.js.gz +0 -0
  528. package/payload/server/public/assets/data-Ckjkne54.js +0 -1
  529. package/payload/server/public/assets/data-Ckjkne54.js.br +0 -3
  530. package/payload/server/public/assets/data-Ckjkne54.js.gz +0 -0
  531. package/payload/server/public/assets/diagram-5BDNPKRD-CCttJ9XA.js.br +0 -0
  532. package/payload/server/public/assets/diagram-5BDNPKRD-CCttJ9XA.js.gz +0 -0
  533. package/payload/server/public/assets/diagram-G4DWMVQ6-DvkpgSLO.js.br +0 -0
  534. package/payload/server/public/assets/diagram-G4DWMVQ6-DvkpgSLO.js.gz +0 -0
  535. package/payload/server/public/assets/diagram-MMDJMWI5-DHmW5Y9k.js.br +0 -0
  536. package/payload/server/public/assets/diagram-MMDJMWI5-DHmW5Y9k.js.gz +0 -0
  537. package/payload/server/public/assets/diagram-TYMM5635-C6T4hwzO.js.br +0 -0
  538. package/payload/server/public/assets/diagram-TYMM5635-C6T4hwzO.js.gz +0 -0
  539. package/payload/server/public/assets/erDiagram-SMLLAGMA-5v_o7s3T.js.br +0 -0
  540. package/payload/server/public/assets/erDiagram-SMLLAGMA-5v_o7s3T.js.gz +0 -0
  541. package/payload/server/public/assets/file-text-BKs9eyiw.js.br +0 -0
  542. package/payload/server/public/assets/file-text-BKs9eyiw.js.gz +0 -0
  543. package/payload/server/public/assets/flatten-BtIc9jX7.js.br +0 -0
  544. package/payload/server/public/assets/flatten-BtIc9jX7.js.gz +0 -0
  545. package/payload/server/public/assets/flowDiagram-DWJPFMVM-3UhCDsjt.js.br +0 -0
  546. package/payload/server/public/assets/flowDiagram-DWJPFMVM-3UhCDsjt.js.gz +0 -0
  547. package/payload/server/public/assets/ganttDiagram-T4ZO3ILL-F2zgHIIQ.js.br +0 -0
  548. package/payload/server/public/assets/ganttDiagram-T4ZO3ILL-F2zgHIIQ.js.gz +0 -0
  549. package/payload/server/public/assets/gitGraph-7Q5UKJZL-C-FvNTHZ.js +0 -1
  550. package/payload/server/public/assets/gitGraph-7Q5UKJZL-C-FvNTHZ.js.br +0 -0
  551. package/payload/server/public/assets/gitGraphDiagram-UUTBAWPF-oQc1N3dT.js.br +0 -0
  552. package/payload/server/public/assets/gitGraphDiagram-UUTBAWPF-oQc1N3dT.js.gz +0 -0
  553. package/payload/server/public/assets/graph-DTi71NaZ.js.br +0 -0
  554. package/payload/server/public/assets/graph-DTi71NaZ.js.gz +0 -0
  555. package/payload/server/public/assets/graph-labels-BT3S6e9H.js.br +0 -0
  556. package/payload/server/public/assets/graph-labels-BT3S6e9H.js.gz +0 -0
  557. package/payload/server/public/assets/graphlib-DY4-AT2Q.js.br +0 -0
  558. package/payload/server/public/assets/graphlib-DY4-AT2Q.js.gz +0 -0
  559. package/payload/server/public/assets/info-OMHHGYJF-BjLPgHAC.js +0 -1
  560. package/payload/server/public/assets/info-OMHHGYJF-BjLPgHAC.js.br +0 -0
  561. package/payload/server/public/assets/infoDiagram-42DDH7IO-CXNKLTui.js +0 -2
  562. package/payload/server/public/assets/infoDiagram-42DDH7IO-CXNKLTui.js.br +0 -0
  563. package/payload/server/public/assets/infoDiagram-42DDH7IO-CXNKLTui.js.gz +0 -0
  564. package/payload/server/public/assets/isEmpty-Bu4fZ8Kf.js.br +0 -0
  565. package/payload/server/public/assets/isEmpty-Bu4fZ8Kf.js.gz +0 -0
  566. package/payload/server/public/assets/ishikawaDiagram-UXIWVN3A-wJhSOkuw.js.br +0 -0
  567. package/payload/server/public/assets/ishikawaDiagram-UXIWVN3A-wJhSOkuw.js.gz +0 -0
  568. package/payload/server/public/assets/journeyDiagram-VCZTEJTY-DgadC6Pz.js.br +0 -0
  569. package/payload/server/public/assets/journeyDiagram-VCZTEJTY-DgadC6Pz.js.gz +0 -0
  570. package/payload/server/public/assets/kanban-definition-6JOO6SKY-Bs4nQqXI.js.br +0 -0
  571. package/payload/server/public/assets/kanban-definition-6JOO6SKY-Bs4nQqXI.js.gz +0 -0
  572. package/payload/server/public/assets/line-Bnmxy1hO.js.br +0 -0
  573. package/payload/server/public/assets/line-Bnmxy1hO.js.gz +0 -0
  574. package/payload/server/public/assets/linear-RvwZxFzh.js.br +0 -0
  575. package/payload/server/public/assets/linear-RvwZxFzh.js.gz +0 -0
  576. package/payload/server/public/assets/maximize-2-zC94tsxY.js.br +0 -0
  577. package/payload/server/public/assets/maximize-2-zC94tsxY.js.gz +0 -0
  578. package/payload/server/public/assets/mermaid-parser.core-DeNV8RtA.js.br +0 -0
  579. package/payload/server/public/assets/mermaid-parser.core-DeNV8RtA.js.gz +0 -0
  580. package/payload/server/public/assets/mermaid.core-BU9IiSCP.js.br +0 -0
  581. package/payload/server/public/assets/mermaid.core-BU9IiSCP.js.gz +0 -0
  582. package/payload/server/public/assets/mindmap-definition-QFDTVHPH-D1PMUxxm.js.br +0 -0
  583. package/payload/server/public/assets/mindmap-definition-QFDTVHPH-D1PMUxxm.js.gz +0 -0
  584. package/payload/server/public/assets/operator-BtWNEMh-.js.br +0 -0
  585. package/payload/server/public/assets/operator-BtWNEMh-.js.gz +0 -0
  586. package/payload/server/public/assets/ordinal-C2TEWKNu.js.br +0 -0
  587. package/payload/server/public/assets/ordinal-C2TEWKNu.js.gz +0 -0
  588. package/payload/server/public/assets/packet-4T2RLAQJ-BBAZASfb.js +0 -1
  589. package/payload/server/public/assets/packet-4T2RLAQJ-BBAZASfb.js.br +0 -0
  590. package/payload/server/public/assets/page-BFm91p0e.js +0 -1
  591. package/payload/server/public/assets/page-BFm91p0e.js.br +0 -0
  592. package/payload/server/public/assets/page-BFm91p0e.js.gz +0 -0
  593. package/payload/server/public/assets/page-Ccl0FazM.js.br +0 -0
  594. package/payload/server/public/assets/page-Ccl0FazM.js.gz +0 -0
  595. package/payload/server/public/assets/pdf-render-C257cidb.js.br +0 -0
  596. package/payload/server/public/assets/pdf-render-C257cidb.js.gz +0 -0
  597. package/payload/server/public/assets/pie-ZZUOXDRM-CCJUnMeG.js +0 -1
  598. package/payload/server/public/assets/pie-ZZUOXDRM-CCJUnMeG.js.br +0 -0
  599. package/payload/server/public/assets/pieDiagram-DEJITSTG-BzdNzoKA.js.br +0 -0
  600. package/payload/server/public/assets/pieDiagram-DEJITSTG-BzdNzoKA.js.gz +0 -0
  601. package/payload/server/public/assets/public-BpC6cn9S.js.br +0 -0
  602. package/payload/server/public/assets/public-BpC6cn9S.js.gz +0 -0
  603. package/payload/server/public/assets/quadrantDiagram-34T5L4WZ-oFr1MJRO.js.br +0 -0
  604. package/payload/server/public/assets/quadrantDiagram-34T5L4WZ-oFr1MJRO.js.gz +0 -0
  605. package/payload/server/public/assets/radar-PYXPWWZC-BsRU8Aep.js +0 -1
  606. package/payload/server/public/assets/radar-PYXPWWZC-BsRU8Aep.js.br +0 -0
  607. package/payload/server/public/assets/reduce-BGpN5lgn.js.br +0 -0
  608. package/payload/server/public/assets/reduce-BGpN5lgn.js.gz +0 -0
  609. package/payload/server/public/assets/requirementDiagram-MS252O5E-C9QBQxDh.js.br +0 -0
  610. package/payload/server/public/assets/requirementDiagram-MS252O5E-C9QBQxDh.js.gz +0 -0
  611. package/payload/server/public/assets/rotate-ccw-BNcqbHkZ.js.br +0 -0
  612. package/payload/server/public/assets/rotate-ccw-BNcqbHkZ.js.gz +0 -0
  613. package/payload/server/public/assets/routines-D5iia-XG.js +0 -1
  614. package/payload/server/public/assets/routines-D5iia-XG.js.br +0 -0
  615. package/payload/server/public/assets/routines-D5iia-XG.js.gz +0 -0
  616. package/payload/server/public/assets/sankeyDiagram-XADWPNL6-c_y3bvVv.js.br +0 -0
  617. package/payload/server/public/assets/sankeyDiagram-XADWPNL6-c_y3bvVv.js.gz +0 -0
  618. package/payload/server/public/assets/sequenceDiagram-FGHM5R23-YwlCBPHE.js.br +0 -0
  619. package/payload/server/public/assets/sequenceDiagram-FGHM5R23-YwlCBPHE.js.gz +0 -0
  620. package/payload/server/public/assets/skills-COLAw_jt.js.br +0 -0
  621. package/payload/server/public/assets/skills-COLAw_jt.js.gz +0 -0
  622. package/payload/server/public/assets/stateDiagram-FHFEXIEX-BFE3e-FM.js.br +0 -0
  623. package/payload/server/public/assets/stateDiagram-FHFEXIEX-BFE3e-FM.js.gz +0 -0
  624. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-CpjB4ykI.js +0 -1
  625. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-CpjB4ykI.js.br +0 -4
  626. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-CpjB4ykI.js.gz +0 -0
  627. package/payload/server/public/assets/tasks-CZDQI4nB.js.br +0 -0
  628. package/payload/server/public/assets/tasks-CZDQI4nB.js.gz +0 -0
  629. package/payload/server/public/assets/time-entry-format-laTFzawg.js.br +0 -0
  630. package/payload/server/public/assets/time-entry-format-laTFzawg.js.gz +0 -0
  631. package/payload/server/public/assets/timeline-definition-GMOUNBTQ-azqhmRwZ.js.br +0 -0
  632. package/payload/server/public/assets/timeline-definition-GMOUNBTQ-azqhmRwZ.js.gz +0 -0
  633. package/payload/server/public/assets/treeView-SZITEDCU-BDzhKA6v.js +0 -1
  634. package/payload/server/public/assets/treeView-SZITEDCU-BDzhKA6v.js.br +0 -0
  635. package/payload/server/public/assets/treemap-W4RFUUIX-epHpdeWa.js +0 -1
  636. package/payload/server/public/assets/treemap-W4RFUUIX-epHpdeWa.js.br +0 -0
  637. package/payload/server/public/assets/triangle-alert-DrwqhEog.js.br +0 -0
  638. package/payload/server/public/assets/triangle-alert-DrwqhEog.js.gz +0 -0
  639. package/payload/server/public/assets/useCopyFeedback-Cxme5GK6.js.br +0 -0
  640. package/payload/server/public/assets/useCopyFeedback-Cxme5GK6.js.gz +0 -0
  641. package/payload/server/public/assets/useSubAccountSwitcher-B-K8y5a4.css +0 -1
  642. package/payload/server/public/assets/useSubAccountSwitcher-B-K8y5a4.css.br +0 -0
  643. package/payload/server/public/assets/useSubAccountSwitcher-B-K8y5a4.css.gz +0 -0
  644. package/payload/server/public/assets/useVoiceRecorder-DUBpVa2T.js.br +0 -0
  645. package/payload/server/public/assets/useVoiceRecorder-DUBpVa2T.js.gz +0 -0
  646. package/payload/server/public/assets/vennDiagram-DHZGUBPP-Da2RfFs8.js.br +0 -0
  647. package/payload/server/public/assets/vennDiagram-DHZGUBPP-Da2RfFs8.js.gz +0 -0
  648. package/payload/server/public/assets/wardley-RL74JXVD-DNSZCrxV.js +0 -1
  649. package/payload/server/public/assets/wardley-RL74JXVD-DNSZCrxV.js.br +0 -0
  650. package/payload/server/public/assets/wardleyDiagram-NUSXRM2D-HdrdBYES.js.br +0 -0
  651. package/payload/server/public/assets/wardleyDiagram-NUSXRM2D-HdrdBYES.js.gz +0 -0
  652. package/payload/server/public/assets/wrench-DWuxPnzF.js.br +0 -0
  653. package/payload/server/public/assets/wrench-DWuxPnzF.js.gz +0 -0
  654. package/payload/server/public/assets/xychartDiagram-5P7HB3ND-DMk6rTcQ.js.br +0 -0
  655. package/payload/server/public/assets/xychartDiagram-5P7HB3ND-DMk6rTcQ.js.gz +0 -0
  656. /package/payload/server/public/assets/{_baseFor-Be3EKK3K.js → _baseFor-B12He5Rp.js} +0 -0
  657. /package/payload/server/public/assets/{_baseFor-Be3EKK3K.js.br → _baseFor-B12He5Rp.js.br} +0 -0
  658. /package/payload/server/public/assets/{_baseFor-Be3EKK3K.js.gz → _baseFor-B12He5Rp.js.gz} +0 -0
  659. /package/payload/server/public/assets/{array-X0JlPOfd.js → array-DO1uCttT.js} +0 -0
  660. /package/payload/server/public/assets/{array-X0JlPOfd.js.br → array-DO1uCttT.js.br} +0 -0
  661. /package/payload/server/public/assets/{cytoscape.esm-CI2IWMLB.js → cytoscape.esm-DFn2foqy.js} +0 -0
  662. /package/payload/server/public/assets/{cytoscape.esm-CI2IWMLB.js.br → cytoscape.esm-DFn2foqy.js.br} +0 -0
  663. /package/payload/server/public/assets/{cytoscape.esm-CI2IWMLB.js.gz → cytoscape.esm-DFn2foqy.js.gz} +0 -0
  664. /package/payload/server/public/assets/{defaultLocale-B6RGN4id.js → defaultLocale-ieI3yFoA.js} +0 -0
  665. /package/payload/server/public/assets/{defaultLocale-B6RGN4id.js.br → defaultLocale-ieI3yFoA.js.br} +0 -0
  666. /package/payload/server/public/assets/{defaultLocale-B6RGN4id.js.gz → defaultLocale-ieI3yFoA.js.gz} +0 -0
  667. /package/payload/server/public/assets/{dist-QvbmK1IP.js → dist-DlU7AEeD.js} +0 -0
  668. /package/payload/server/public/assets/{dist-QvbmK1IP.js.br → dist-DlU7AEeD.js.br} +0 -0
  669. /package/payload/server/public/assets/{dist-QvbmK1IP.js.gz → dist-DlU7AEeD.js.gz} +0 -0
  670. /package/payload/server/public/assets/{init-BmUWJJHz.js → init-BCRlEgNP.js} +0 -0
  671. /package/payload/server/public/assets/{init-BmUWJJHz.js.br → init-BCRlEgNP.js.br} +0 -0
  672. /package/payload/server/public/assets/{init-BmUWJJHz.js.gz → init-BCRlEgNP.js.gz} +0 -0
  673. /package/payload/server/public/assets/{katex-BjZuzSQn.js → katex-gkTaZgi6.js} +0 -0
  674. /package/payload/server/public/assets/{katex-BjZuzSQn.js.br → katex-gkTaZgi6.js.br} +0 -0
  675. /package/payload/server/public/assets/{katex-BjZuzSQn.js.gz → katex-gkTaZgi6.js.gz} +0 -0
  676. /package/payload/server/public/assets/{path-CoPyR7c2.js → path-DTmzQFjQ.js} +0 -0
  677. /package/payload/server/public/assets/{path-CoPyR7c2.js.br → path-DTmzQFjQ.js.br} +0 -0
  678. /package/payload/server/public/assets/{path-CoPyR7c2.js.gz → path-DTmzQFjQ.js.gz} +0 -0
  679. /package/payload/server/public/assets/{preload-helper-BQrMkyGX.js → preload-helper-eAV8hweq.js} +0 -0
  680. /package/payload/server/public/assets/{preload-helper-BQrMkyGX.js.br → preload-helper-eAV8hweq.js.br} +0 -0
  681. /package/payload/server/public/assets/{preload-helper-BQrMkyGX.js.gz → preload-helper-eAV8hweq.js.gz} +0 -0
  682. /package/payload/server/public/assets/{rough.esm-jSt7UMyi.js → rough.esm-BFJ-MgcB.js} +0 -0
  683. /package/payload/server/public/assets/{rough.esm-jSt7UMyi.js.br → rough.esm-BFJ-MgcB.js.br} +0 -0
  684. /package/payload/server/public/assets/{rough.esm-jSt7UMyi.js.gz → rough.esm-BFJ-MgcB.js.gz} +0 -0
  685. /package/payload/server/public/assets/{src-C2WwTWSY.js → src-9CNk4JU0.js} +0 -0
  686. /package/payload/server/public/assets/{src-C2WwTWSY.js.br → src-9CNk4JU0.js.br} +0 -0
  687. /package/payload/server/public/assets/{src-C2WwTWSY.js.gz → src-9CNk4JU0.js.gz} +0 -0
  688. /package/payload/server/public/assets/{useSubAccountSwitcher-C_1E11Dv.js → useSubAccountSwitcher-CnpeWIYq.js} +0 -0
  689. /package/payload/server/public/assets/{useSubAccountSwitcher-C_1E11Dv.js.br → useSubAccountSwitcher-CnpeWIYq.js.br} +0 -0
  690. /package/payload/server/public/assets/{useSubAccountSwitcher-C_1E11Dv.js.gz → useSubAccountSwitcher-CnpeWIYq.js.gz} +0 -0
@@ -0,0 +1,384 @@
1
+ import { describe, it, expect, afterEach } from "vitest";
2
+ import { mkdtempSync, rmSync, mkdirSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import {
6
+ normalizeE164,
7
+ phonesMatch,
8
+ readChannelAdmins,
9
+ registeredAccountForDestination,
10
+ boundSubAccountFor,
11
+ validateAgentDestination,
12
+ listDispatchDestinations,
13
+ } from "../index.js";
14
+ import { normalizeE164 as canonicalNormalizeE164 } from "../../../../ui/app/lib/whatsapp/normalize.js";
15
+
16
+ const HOUSE = "11111111-1111-4111-8111-111111111111";
17
+ const SUB_A = "22222222-2222-4222-8222-222222222222";
18
+ const SUB_B = "33333333-3333-4333-8333-333333333333";
19
+
20
+ const dirs: string[] = [];
21
+
22
+ function makeAccountsDir(seed: (accountsDir: string) => void): string {
23
+ const dir = mkdtempSync(join(tmpdir(), "agent-dispatch-rule-"));
24
+ dirs.push(dir);
25
+ seed(dir);
26
+ return dir;
27
+ }
28
+
29
+ function seedAccount(accountsDir: string, id: string, cfg: Record<string, unknown>): void {
30
+ const d = join(accountsDir, id);
31
+ mkdirSync(d, { recursive: true });
32
+ writeFileSync(join(d, "account.json"), JSON.stringify(cfg), "utf-8");
33
+ }
34
+
35
+ afterEach(() => {
36
+ while (dirs.length > 0) rmSync(dirs.pop()!, { recursive: true, force: true });
37
+ });
38
+
39
+ // The replica exists because this package must not depend on platform/ui. That
40
+ // makes drift the standing risk, so the two implementations are run over one
41
+ // corpus and asserted equal. An edit to either that changes behaviour turns
42
+ // this red rather than splitting the WhatsApp identity rule in half.
43
+
44
+ const E164_CORPUS = [
45
+ " whatsapp:+44 (7700) 900-123 ",
46
+ "00447700900123",
47
+ "+447700900123",
48
+ "447700900123",
49
+ "whatsapp:447700900123",
50
+ "WhatsApp:+44-7700-900-123",
51
+ "not-a-number",
52
+ "",
53
+ " ",
54
+ "+",
55
+ "00",
56
+ "007",
57
+ "+0044 7700 900123",
58
+ "(0)7700900123",
59
+ "07700900123",
60
+ "44 7700 900 123",
61
+ "+1 (555) 010-9999",
62
+ "555.010.9999",
63
+ "12345678901234567890",
64
+ "+44770090012a",
65
+ "٤٤٧٧٠٠",
66
+ ];
67
+
68
+ describe("E.164 replica parity with platform/ui normalize.ts", () => {
69
+ it("agrees with the canonical implementation on every corpus entry", () => {
70
+ for (const value of E164_CORPUS) {
71
+ expect([value, normalizeE164(value)]).toEqual([value, canonicalNormalizeE164(value)]);
72
+ }
73
+ });
74
+ });
75
+
76
+ describe("normalizeE164 / phonesMatch", () => {
77
+ it("strips punctuation, a whatsapp prefix, and a leading + or 00", () => {
78
+ expect(normalizeE164(" whatsapp:+44 (7700) 900-123 ")).toBe("447700900123");
79
+ expect(normalizeE164("00447700900123")).toBe("447700900123");
80
+ expect(normalizeE164("not-a-number")).toBe("");
81
+ });
82
+
83
+ it("matches on the normalized form and never matches empty", () => {
84
+ expect(phonesMatch("+447700900123", "whatsapp:447700900123")).toBe(true);
85
+ expect(phonesMatch("", "")).toBe(false);
86
+ });
87
+ });
88
+
89
+ describe("readChannelAdmins", () => {
90
+ it("reads adminPhones and a bare-string account manager", () => {
91
+ const accountsDir = makeAccountsDir((d) => {
92
+ seedAccount(d, HOUSE, {
93
+ role: "house",
94
+ whatsapp: { adminPhones: ["+447700900111"], accountManagers: { "+447700900222": SUB_A } },
95
+ });
96
+ });
97
+ const wa = readChannelAdmins(join(accountsDir, HOUSE), "whatsapp");
98
+ expect(wa.adminPhones).toEqual(["+447700900111"]);
99
+ expect(wa.accountManagers).toEqual({ "+447700900222": SUB_A });
100
+ });
101
+
102
+ it("reads an OBJECT-shaped manager binding whose mode is active or absent", () => {
103
+ const accountsDir = makeAccountsDir((d) => {
104
+ seedAccount(d, HOUSE, {
105
+ role: "house",
106
+ whatsapp: {
107
+ adminPhones: [],
108
+ accountManagers: {
109
+ "+447700900222": { managesAccount: SUB_A, mode: "active" },
110
+ "+447700900444": { managesAccount: SUB_B },
111
+ },
112
+ },
113
+ });
114
+ });
115
+ const wa = readChannelAdmins(join(accountsDir, HOUSE), "whatsapp");
116
+ expect(wa.accountManagers).toEqual({
117
+ "+447700900222": SUB_A,
118
+ "+447700900444": SUB_B,
119
+ });
120
+ });
121
+
122
+ it("excludes a PASSIVE binding, which no fire path can deliver to", () => {
123
+ // effective-account.ts returns null for mode:'passive' and
124
+ // schedule-inject answers 403 account-manager-unresolved without spawning,
125
+ // so a routine bound to one would save and then fail on every fire.
126
+ const accountsDir = makeAccountsDir((d) => {
127
+ seedAccount(d, HOUSE, {
128
+ role: "house",
129
+ whatsapp: {
130
+ adminPhones: [],
131
+ accountManagers: {
132
+ "+447700900222": SUB_A,
133
+ "+447700900333": { managesAccount: SUB_B, mode: "passive" },
134
+ },
135
+ },
136
+ });
137
+ });
138
+ expect(readChannelAdmins(join(accountsDir, HOUSE), "whatsapp").accountManagers).toEqual({
139
+ "+447700900222": SUB_A,
140
+ });
141
+ });
142
+
143
+ it("treats an unrecognised mode as passive, failing closed", () => {
144
+ const accountsDir = makeAccountsDir((d) => {
145
+ seedAccount(d, HOUSE, {
146
+ role: "house",
147
+ whatsapp: { adminPhones: [], accountManagers: { "+447700900555": { managesAccount: SUB_A, mode: "activ" } } },
148
+ });
149
+ });
150
+ expect(readChannelAdmins(join(accountsDir, HOUSE), "whatsapp").accountManagers).toEqual({});
151
+ });
152
+
153
+ it("drops a manager entry with no string managesAccount", () => {
154
+ const accountsDir = makeAccountsDir((d) => {
155
+ seedAccount(d, HOUSE, {
156
+ role: "house",
157
+ whatsapp: { adminPhones: [], accountManagers: { "+447700900222": { mode: "active" } } },
158
+ });
159
+ });
160
+ expect(readChannelAdmins(join(accountsDir, HOUSE), "whatsapp").accountManagers).toEqual({});
161
+ });
162
+
163
+ it("yields empty lists for missing or malformed config", () => {
164
+ const accountsDir = makeAccountsDir(() => {});
165
+ const wa = readChannelAdmins(join(accountsDir, "nope"), "whatsapp");
166
+ expect(wa.adminPhones).toEqual([]);
167
+ expect(wa.accountManagers).toEqual({});
168
+ expect(readChannelAdmins(join(accountsDir, "nope"), "telegram").adminUsers).toEqual([]);
169
+ });
170
+
171
+ it("keeps only numeric telegram adminUsers", () => {
172
+ const accountsDir = makeAccountsDir((d) => {
173
+ seedAccount(d, SUB_A, { telegram: { adminUsers: [123, "456", 789] } });
174
+ });
175
+ expect(readChannelAdmins(join(accountsDir, SUB_A), "telegram").adminUsers).toEqual([123, 789]);
176
+ });
177
+ });
178
+
179
+ describe("registeredAccountForDestination", () => {
180
+ it("gives a manager binding precedence over an adminPhones match", () => {
181
+ const accountsDir = makeAccountsDir((d) => {
182
+ seedAccount(d, HOUSE, {
183
+ role: "house",
184
+ whatsapp: {
185
+ adminPhones: ["+447700900222"],
186
+ accountManagers: { "+447700900222": SUB_A },
187
+ },
188
+ });
189
+ });
190
+ expect(registeredAccountForDestination(join(accountsDir, HOUSE), HOUSE, "447700900222")).toBe(SUB_A);
191
+ });
192
+
193
+ it("returns the house for an adminPhones-only entry and null for an unknown number", () => {
194
+ const accountsDir = makeAccountsDir((d) => {
195
+ seedAccount(d, HOUSE, {
196
+ role: "house",
197
+ whatsapp: { adminPhones: ["+447700900111"], accountManagers: {} },
198
+ });
199
+ });
200
+ const houseDir = join(accountsDir, HOUSE);
201
+ expect(registeredAccountForDestination(houseDir, HOUSE, "+447700900111")).toBe(HOUSE);
202
+ expect(registeredAccountForDestination(houseDir, HOUSE, "+447700900999")).toBeNull();
203
+ });
204
+
205
+ it("resolves an object-form ACTIVE binding and refuses a passive one", () => {
206
+ const accountsDir = makeAccountsDir((d) => {
207
+ seedAccount(d, HOUSE, {
208
+ role: "house",
209
+ whatsapp: {
210
+ adminPhones: [],
211
+ accountManagers: {
212
+ "+447700900444": { managesAccount: SUB_A, mode: "active" },
213
+ "+447700900333": { managesAccount: SUB_B, mode: "passive" },
214
+ },
215
+ },
216
+ });
217
+ });
218
+ const houseDir = join(accountsDir, HOUSE);
219
+ expect(registeredAccountForDestination(houseDir, HOUSE, "447700900444")).toBe(SUB_A);
220
+ expect(registeredAccountForDestination(houseDir, HOUSE, "447700900333")).toBeNull();
221
+ });
222
+ });
223
+
224
+ describe("boundSubAccountFor", () => {
225
+ it("returns the bound sub-account for a manager phone and null otherwise", () => {
226
+ const accountsDir = makeAccountsDir((d) => {
227
+ seedAccount(d, HOUSE, {
228
+ role: "house",
229
+ whatsapp: { adminPhones: [], accountManagers: { "+447700900222": SUB_A } },
230
+ });
231
+ });
232
+ const houseDir = join(accountsDir, HOUSE);
233
+ expect(boundSubAccountFor(houseDir, "447700900222")).toBe(SUB_A);
234
+ expect(boundSubAccountFor(houseDir, "447700900999")).toBeNull();
235
+ });
236
+ });
237
+
238
+ describe("validateAgentDestination", () => {
239
+ function houseWith(managers: Record<string, unknown>, adminPhones: string[] = ["+447700900111"]): string {
240
+ return makeAccountsDir((d) => {
241
+ seedAccount(d, HOUSE, { role: "house", whatsapp: { adminPhones, accountManagers: managers } });
242
+ seedAccount(d, SUB_A, { telegram: { adminUsers: [555001] } });
243
+ seedAccount(d, SUB_B, {});
244
+ });
245
+ }
246
+
247
+ it("accepts an adminPhones number for the house itself", () => {
248
+ const dir = houseWith({});
249
+ expect(validateAgentDestination(dir, HOUSE, HOUSE, "whatsapp", "+447700900111")).toEqual({ valid: true });
250
+ });
251
+
252
+ it("accepts a sub-account targeting its own bound manager phone", () => {
253
+ const dir = houseWith({ "+447700900222": SUB_A });
254
+ expect(validateAgentDestination(dir, HOUSE, SUB_A, "whatsapp", "+447700900222")).toEqual({ valid: true });
255
+ });
256
+
257
+ it("accepts the house targeting any registered manager phone", () => {
258
+ const dir = houseWith({ "+447700900222": SUB_A });
259
+ expect(validateAgentDestination(dir, HOUSE, HOUSE, "whatsapp", "+447700900222")).toEqual({ valid: true });
260
+ });
261
+
262
+ it("refuses an unknown number as not-registered", () => {
263
+ const dir = houseWith({});
264
+ expect(validateAgentDestination(dir, HOUSE, SUB_A, "whatsapp", "+447700900999")).toEqual({
265
+ valid: false,
266
+ reason: "not-registered",
267
+ });
268
+ });
269
+
270
+ it("refuses another sub-account's manager phone as cross-account, naming both", () => {
271
+ const dir = houseWith({ "+447700900222": SUB_A });
272
+ expect(validateAgentDestination(dir, HOUSE, SUB_B, "whatsapp", "+447700900222")).toEqual({
273
+ valid: false,
274
+ reason: "cross-account",
275
+ destinationAccount: SUB_A,
276
+ scheduleAccount: SUB_B,
277
+ });
278
+ });
279
+
280
+ it("accepts an object-form ACTIVE manager phone for its own account", () => {
281
+ const dir = houseWith({ "+447700900444": { managesAccount: SUB_A, mode: "active" } });
282
+ expect(validateAgentDestination(dir, HOUSE, SUB_A, "whatsapp", "+447700900444")).toEqual({ valid: true });
283
+ });
284
+
285
+ it("refuses a PASSIVE manager phone, matching what the fire path can deliver", () => {
286
+ const dir = houseWith({ "+447700900333": { managesAccount: SUB_A, mode: "passive" } });
287
+ expect(validateAgentDestination(dir, HOUSE, SUB_A, "whatsapp", "+447700900333")).toEqual({
288
+ valid: false,
289
+ reason: "not-registered",
290
+ });
291
+ });
292
+
293
+ it("accepts a telegram id in the CREATING account's own list and refuses anything else", () => {
294
+ const dir = houseWith({});
295
+ expect(validateAgentDestination(dir, HOUSE, SUB_A, "telegram", "555001")).toEqual({ valid: true });
296
+ expect(validateAgentDestination(dir, HOUSE, SUB_A, "telegram", "555002")).toEqual({
297
+ valid: false,
298
+ reason: "not-registered",
299
+ });
300
+ expect(validateAgentDestination(dir, HOUSE, SUB_A, "telegram", "55.5")).toEqual({
301
+ valid: false,
302
+ reason: "not-registered",
303
+ });
304
+ });
305
+ });
306
+
307
+ describe("listDispatchDestinations", () => {
308
+ function seeded(): string {
309
+ return makeAccountsDir((d) => {
310
+ seedAccount(d, HOUSE, {
311
+ role: "house",
312
+ whatsapp: {
313
+ adminPhones: ["+447700900111", "+447700900222"],
314
+ accountManagers: {
315
+ "+447700900222": SUB_A,
316
+ "+447700900333": { managesAccount: SUB_B, mode: "passive" },
317
+ "+447700900444": { managesAccount: SUB_B, mode: "active" },
318
+ },
319
+ },
320
+ telegram: { adminUsers: [900001] },
321
+ });
322
+ seedAccount(d, SUB_A, { telegram: { adminUsers: [555002, 555001] } });
323
+ seedAccount(d, SUB_B, {});
324
+ });
325
+ }
326
+
327
+ it("offers the house every registered destination, each entry once", () => {
328
+ const dir = seeded();
329
+ expect(listDispatchDestinations({ accountsDir: dir, houseAccountId: HOUSE, accountId: HOUSE })).toEqual([
330
+ { channel: "whatsapp", destination: "+447700900222", label: "Account manager" },
331
+ { channel: "whatsapp", destination: "+447700900444", label: "Account manager" },
332
+ { channel: "whatsapp", destination: "+447700900111", label: "House admin" },
333
+ { channel: "telegram", destination: "900001", label: "Telegram admin" },
334
+ ]);
335
+ });
336
+
337
+ it("never offers the passive-bound phone, to anyone", () => {
338
+ const dir = seeded();
339
+ for (const accountId of [HOUSE, SUB_A, SUB_B]) {
340
+ const offered = listDispatchDestinations({ accountsDir: dir, houseAccountId: HOUSE, accountId })
341
+ .map((d) => d.destination);
342
+ expect(offered).not.toContain("+447700900333");
343
+ }
344
+ });
345
+
346
+ it("offers a sub-account only its own manager phone and its own telegram ids", () => {
347
+ const dir = seeded();
348
+ expect(listDispatchDestinations({ accountsDir: dir, houseAccountId: HOUSE, accountId: SUB_A })).toEqual([
349
+ { channel: "whatsapp", destination: "+447700900222", label: "Account manager" },
350
+ { channel: "telegram", destination: "555001", label: "Telegram admin" },
351
+ { channel: "telegram", destination: "555002", label: "Telegram admin" },
352
+ ]);
353
+ });
354
+
355
+ it("offers every listed entry to exactly the accounts validateAgentDestination accepts", () => {
356
+ const dir = seeded();
357
+ for (const accountId of [HOUSE, SUB_A, SUB_B]) {
358
+ for (const d of listDispatchDestinations({ accountsDir: dir, houseAccountId: HOUSE, accountId })) {
359
+ expect(validateAgentDestination(dir, HOUSE, accountId, d.channel, d.destination)).toEqual({ valid: true });
360
+ }
361
+ }
362
+ });
363
+
364
+ it("drops every WhatsApp entry when the house cannot be resolved, keeping telegram", () => {
365
+ const dir = seeded();
366
+ expect(listDispatchDestinations({ accountsDir: dir, houseAccountId: null, accountId: SUB_A })).toEqual([
367
+ { channel: "telegram", destination: "555001", label: "Telegram admin" },
368
+ { channel: "telegram", destination: "555002", label: "Telegram admin" },
369
+ ]);
370
+ });
371
+
372
+ it("offers a sub-account its ACTIVE binding but not its passive one", () => {
373
+ const dir = seeded();
374
+ expect(listDispatchDestinations({ accountsDir: dir, houseAccountId: HOUSE, accountId: SUB_B })).toEqual([
375
+ { channel: "whatsapp", destination: "+447700900444", label: "Account manager" },
376
+ ]);
377
+ });
378
+
379
+ it("returns an empty list for an account with no registered destination", () => {
380
+ const dir = seeded();
381
+ const stranger = "44444444-4444-4444-8444-444444444444";
382
+ expect(listDispatchDestinations({ accountsDir: dir, houseAccountId: HOUSE, accountId: stranger })).toEqual([]);
383
+ });
384
+ });
@@ -0,0 +1,269 @@
1
+ /**
2
+ * The dispatch-destination rule, shared by the scheduling plugin and the admin
3
+ * UI so create-time, fire-time and dashboard-time cannot diverge on the rule or
4
+ * on the reason codes. Extracted from
5
+ * `plugins/scheduling/mcp/src/lib/agent-dispatch.ts`: `platform/ui` must never
6
+ * import from `platform/plugins`, and re-implementing the rule in the UI is the
7
+ * two-copies drift this module exists to prevent.
8
+ *
9
+ * House resolution is the CALLER's job. Every entry point takes the house
10
+ * account's id as a parameter and this module never scans the accounts
11
+ * directory to choose one. Two consequences, both deliberate: it carries no
12
+ * dependency on `account-enumeration`, so a consumer that already imports that
13
+ * lib does not end up with two copies of its per-process cache; and nothing
14
+ * here can answer for an account the caller did not name, which is the failure
15
+ * `check-admin-route-account-scope.mjs` exists to prevent on the UI side.
16
+ *
17
+ * The E.164 matching is a replica of
18
+ * `platform/ui/app/lib/whatsapp/normalize.ts`. The replica exists because this
19
+ * package must not depend on `platform/ui`. `src/__tests__/rule.test.ts` runs
20
+ * a shared corpus through BOTH implementations and asserts they agree, so an
21
+ * edit to either one that changes behaviour turns the suite red instead of
22
+ * silently splitting the two halves of the WhatsApp identity rule.
23
+ */
24
+ import { readFileSync } from "node:fs";
25
+ import { resolve } from "node:path";
26
+
27
+ export type AgentChannel = "whatsapp" | "telegram";
28
+
29
+ /**
30
+ * Reason codes are the true cause, not a symptom:
31
+ * - `not-registered`: the destination is in no authoritative list (the house's
32
+ * `adminPhones`/`accountManagers` for WhatsApp; the creating account's
33
+ * `telegram.adminUsers` for Telegram).
34
+ * - `cross-account`: the destination IS registered, but to an account other
35
+ * than the one that created the schedule (and the creator is not the house).
36
+ * Names both accounts so the mismatch is explained, not guessed.
37
+ */
38
+ export type DestinationValidity =
39
+ | { valid: true }
40
+ | { valid: false; reason: "not-registered" }
41
+ | { valid: false; reason: "cross-account"; destinationAccount: string; scheduleAccount: string };
42
+
43
+ /** Strip whitespace/dashes/parens, a `whatsapp:` prefix, and a leading `+` or
44
+ * `00`; return digits-only or `''`. */
45
+ export function normalizeE164(value: string): string {
46
+ let candidate = value.trim().replace(/[\s\-().]/g, "");
47
+ candidate = candidate.replace(/^whatsapp:/i, "");
48
+ if (candidate.startsWith("+")) candidate = candidate.slice(1);
49
+ else if (candidate.startsWith("00")) candidate = candidate.slice(2);
50
+ if (!/^\d+$/.test(candidate)) return "";
51
+ return candidate;
52
+ }
53
+
54
+ /** Normalized equality, non-empty. */
55
+ export function phonesMatch(a: string, b: string): boolean {
56
+ const na = normalizeE164(a);
57
+ const nb = normalizeE164(b);
58
+ return na.length > 0 && na === nb;
59
+ }
60
+
61
+ interface WhatsAppAdmins {
62
+ adminPhones: string[];
63
+ /** Manager phone to the sub-account it is bound to. */
64
+ accountManagers: Record<string, string>;
65
+ }
66
+
67
+ /** Read the channel admin config from `<accountDir>/account.json`. Missing or
68
+ * malformed config yields empty lists (a fail-closed default: no destination
69
+ * validates against empty config). */
70
+ export function readChannelAdmins(accountDir: string, channel: "whatsapp"): WhatsAppAdmins;
71
+ export function readChannelAdmins(accountDir: string, channel: "telegram"): { adminUsers: number[] };
72
+ export function readChannelAdmins(
73
+ accountDir: string,
74
+ channel: AgentChannel,
75
+ ): WhatsAppAdmins | { adminUsers: number[] } {
76
+ let config: Record<string, unknown> = {};
77
+ try {
78
+ config = JSON.parse(readFileSync(resolve(accountDir, "account.json"), "utf-8"));
79
+ } catch {
80
+ config = {};
81
+ }
82
+ if (channel === "whatsapp") {
83
+ const wa = (config.whatsapp as Record<string, unknown> | undefined) ?? {};
84
+ const adminPhones = Array.isArray(wa.adminPhones)
85
+ ? wa.adminPhones.filter((p): p is string => typeof p === "string")
86
+ : [];
87
+ const managersRaw = (wa.accountManagers as Record<string, unknown> | undefined) ?? {};
88
+ const accountManagers: Record<string, string> = {};
89
+ for (const [k, v] of Object.entries(managersRaw)) {
90
+ // This map is the set of manager phones a dispatch may be SENT to, which
91
+ // is narrower than the set of bindings that exist.
92
+ //
93
+ // `config-persist.ts` writes two shapes and the shape encodes the mode:
94
+ // an active binding persists as a bare string, and the object form
95
+ // `{managesAccount, mode:'passive'}` is written ONLY for passive. A
96
+ // passive manager is not a deliverable target — `effective-account.ts`
97
+ // returns null for `mode === 'passive'` and `schedule-inject.ts` answers
98
+ // 403 `account-manager-unresolved` without spawning — so admitting one
99
+ // here would let a routine save against a destination that fails on
100
+ // every single fire, which is the exact silence this surface exists to
101
+ // remove.
102
+ //
103
+ // The object form is therefore read for its `managesAccount` but kept
104
+ // only when its mode is active or absent. Today `config-persist` never
105
+ // writes an active object, so that arm admits nothing; it is here so an
106
+ // object-form active entry would be read correctly rather than dropped
107
+ // for its shape. An unrecognised mode is treated as passive, matching
108
+ // `readAccountManagers`, which coerces a malformed mode toward the less
109
+ // capable value rather than failing open.
110
+ if (typeof v === "string") accountManagers[k] = v;
111
+ else if (v && typeof v === "object" && typeof (v as { managesAccount?: unknown }).managesAccount === "string") {
112
+ const mode = (v as { mode?: unknown }).mode;
113
+ if (mode === undefined || mode === "active") {
114
+ accountManagers[k] = (v as { managesAccount: string }).managesAccount;
115
+ }
116
+ }
117
+ }
118
+ return { adminPhones, accountManagers };
119
+ }
120
+ const tg = (config.telegram as Record<string, unknown> | undefined) ?? {};
121
+ const adminUsers = Array.isArray(tg.adminUsers)
122
+ ? tg.adminUsers.filter((u): u is number => typeof u === "number")
123
+ : [];
124
+ return { adminUsers };
125
+ }
126
+
127
+ /**
128
+ * The account a WhatsApp `destination` is registered to on the HOUSE's lists,
129
+ * or null if it is in neither list. A manager binding wins over an admin match:
130
+ * if the number is an `accountManagers` key its registered account is the bound
131
+ * sub-account (the isolation-relevant fact); otherwise if it is an `adminPhones`
132
+ * entry its registered account is the house.
133
+ */
134
+ export function registeredAccountForDestination(
135
+ houseDir: string,
136
+ houseAccountId: string,
137
+ destination: string,
138
+ ): string | null {
139
+ const { adminPhones, accountManagers } = readChannelAdmins(houseDir, "whatsapp");
140
+ for (const [managerPhone, subAccountId] of Object.entries(accountManagers)) {
141
+ if (subAccountId && phonesMatch(managerPhone, destination)) return subAccountId;
142
+ }
143
+ if (adminPhones.some((p) => phonesMatch(p, destination))) return houseAccountId;
144
+ return null;
145
+ }
146
+
147
+ /**
148
+ * The sub-account a WhatsApp manager destination is bound to, or null. Telegram
149
+ * has no account-manager surface (house-only), so it always returns null. Used
150
+ * by the standing audit to detect a deleted sub-account.
151
+ */
152
+ export function boundSubAccountFor(accountDir: string, destination: string): string | null {
153
+ const { accountManagers } = readChannelAdmins(accountDir, "whatsapp");
154
+ for (const [managerPhone, subAccountId] of Object.entries(accountManagers)) {
155
+ if (subAccountId && phonesMatch(managerPhone, destination)) return subAccountId;
156
+ }
157
+ return null;
158
+ }
159
+
160
+ /**
161
+ * Validate a dispatch destination under the two-part rule.
162
+ * `accountsDir` is the PARENT accounts directory
163
+ * (`$PLATFORM_ROOT/../data/accounts`); `houseAccountId` is the socket-owning
164
+ * house, resolved by the CALLER; `creatingAccountId` is the account that
165
+ * created (or owns) the schedule.
166
+ *
167
+ * - whatsapp: read the house's authoritative lists and compute the
168
+ * destination's registered account. `not-registered` if it is in no house
169
+ * list. Otherwise valid iff the creator IS the house (owner exception: it
170
+ * owns the single line and may target any registered admin/manager) OR the
171
+ * registered account equals the creating account. Any other case is
172
+ * `cross-account`.
173
+ * - telegram: house-only. Reads the creating account's own
174
+ * `telegram.adminUsers`; there is no manager surface and thus no
175
+ * cross-account concept — an integer chat id present in the list is valid,
176
+ * anything else is `not-registered`. `houseAccountId` is unused on this
177
+ * branch, which is why a telegram caller need not resolve one.
178
+ */
179
+ export function validateAgentDestination(
180
+ accountsDir: string,
181
+ houseAccountId: string,
182
+ creatingAccountId: string,
183
+ channel: AgentChannel,
184
+ destination: string,
185
+ ): DestinationValidity {
186
+ if (channel === "whatsapp") {
187
+ const houseDir = resolve(accountsDir, houseAccountId);
188
+ const registered = registeredAccountForDestination(houseDir, houseAccountId, destination);
189
+ if (registered === null) return { valid: false, reason: "not-registered" };
190
+ if (creatingAccountId === houseAccountId) return { valid: true };
191
+ if (registered === creatingAccountId) return { valid: true };
192
+ return {
193
+ valid: false,
194
+ reason: "cross-account",
195
+ destinationAccount: registered,
196
+ scheduleAccount: creatingAccountId,
197
+ };
198
+ }
199
+ const { adminUsers } = readChannelAdmins(resolve(accountsDir, creatingAccountId), "telegram");
200
+ const asNumber = Number(destination);
201
+ const ok = Number.isInteger(asNumber) && adminUsers.includes(asNumber);
202
+ return ok ? { valid: true } : { valid: false, reason: "not-registered" };
203
+ }
204
+
205
+ /** Which authoritative list an offered destination came from. Not a name: no
206
+ * personal name exists in `account.json`, and inventing one from the graph
207
+ * would let the picker and the validator disagree. */
208
+ export type DispatchLabel = "House admin" | "Account manager" | "Telegram admin";
209
+
210
+ export interface DispatchDestination {
211
+ channel: AgentChannel;
212
+ destination: string;
213
+ label: DispatchLabel;
214
+ }
215
+
216
+ /**
217
+ * Every destination `accountId` may legally bind, computed from the same lists
218
+ * `validateAgentDestination` reads and filtered by the same two-part rule, so
219
+ * the picker can never offer what the save would refuse. The parity is asserted
220
+ * directly in this lib's test suite.
221
+ *
222
+ * `houseAccountId` is nullable because the caller's resolver throws on an
223
+ * install with no `role:'house'` account and more than one valid account. In
224
+ * that state no WhatsApp destination can be validated at all, so none is
225
+ * offered; Telegram is unaffected because it never consults the house.
226
+ */
227
+ export function listDispatchDestinations(input: {
228
+ accountsDir: string;
229
+ houseAccountId: string | null;
230
+ accountId: string;
231
+ }): DispatchDestination[] {
232
+ const { accountsDir, houseAccountId, accountId } = input;
233
+ const managers: DispatchDestination[] = [];
234
+ const admins: DispatchDestination[] = [];
235
+
236
+ if (houseAccountId !== null) {
237
+ const houseDir = resolve(accountsDir, houseAccountId);
238
+ const { adminPhones, accountManagers } = readChannelAdmins(houseDir, "whatsapp");
239
+ const seen = new Set<string>();
240
+ // Managers first, and a phone in both lists is emitted only as a manager:
241
+ // that is the account `registeredAccountForDestination` resolves for it, so
242
+ // any other label would name an account the rule does not use.
243
+ for (const [phone, subAccountId] of Object.entries(accountManagers)) {
244
+ const key = normalizeE164(phone);
245
+ if (key.length === 0 || seen.has(key)) continue;
246
+ if (accountId !== houseAccountId && subAccountId !== accountId) continue;
247
+ seen.add(key);
248
+ managers.push({ channel: "whatsapp", destination: phone, label: "Account manager" });
249
+ }
250
+ for (const phone of adminPhones) {
251
+ const key = normalizeE164(phone);
252
+ if (key.length === 0 || seen.has(key)) continue;
253
+ // An adminPhones entry registers to the house, so both arms of the rule
254
+ // collapse to the same test: only the house may target it.
255
+ if (accountId !== houseAccountId) continue;
256
+ seen.add(key);
257
+ admins.push({ channel: "whatsapp", destination: phone, label: "House admin" });
258
+ }
259
+ }
260
+
261
+ const { adminUsers } = readChannelAdmins(resolve(accountsDir, accountId), "telegram");
262
+ const telegram: DispatchDestination[] = [...adminUsers]
263
+ .sort((a, b) => a - b)
264
+ .map((id) => ({ channel: "telegram" as const, destination: String(id), label: "Telegram admin" as const }));
265
+
266
+ const byDestination = (a: DispatchDestination, b: DispatchDestination) =>
267
+ a.destination.localeCompare(b.destination);
268
+ return [...managers.sort(byDestination), ...admins.sort(byDestination), ...telegram];
269
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist",
5
+ "rootDir": "src"
6
+ },
7
+ "include": ["src"],
8
+ "exclude": ["src/__tests__"]
9
+ }
@@ -0,0 +1,9 @@
1
+ import { defineConfig } from "vitest/config";
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ environment: "node",
6
+ globals: false,
7
+ include: ["src/__tests__/**/*.test.ts"],
8
+ },
9
+ });
@@ -168,7 +168,7 @@ exports.ROUTINE_ROSTER = [
168
168
  { key: "end-of-day", name: "End of day wrap-up", recurrence: "0 18 * * 1-5", prompt: END_OF_DAY },
169
169
  { key: "appointment-reminder", name: "Appointment reminders", recurrence: "0 * * * *", prompt: APPOINTMENT_REMINDER },
170
170
  { key: "commitment-chase", name: "Commitment chase", recurrence: "0 10 * * 2", prompt: COMMITMENT_CHASE },
171
- { key: "calendar-reconcile", name: "Calendar reconcile", recurrence: "15 */4 * * *", prompt: CALENDAR_RECONCILE },
171
+ { key: "calendar-reconcile", name: "Calendar reconcile", recurrence: "*/15 * * * *", prompt: CALENDAR_RECONCILE },
172
172
  { key: "contact-reconcile", name: "Contact reconcile", recurrence: "45 6 * * 1-5", prompt: CONTACT_RECONCILE },
173
173
  { key: "crm-reconcile", name: "Operational system reconcile", recurrence: "0 3 * * *", prompt: CRM_RECONCILE },
174
174
  { key: "finance-reconcile", name: "Finance reconcile", recurrence: "0 4 * * 1", prompt: FINANCE_RECONCILE },