@rubytech/create-sitedesk-code 0.1.526 → 0.1.528

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 (716) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/plugins/admin/hooks/__tests__/fs-schema-guard.test.sh +82 -1
  3. package/payload/platform/plugins/admin/hooks/fs-schema-guard.sh +45 -13
  4. package/payload/platform/plugins/admin/mcp/dist/index.js +18 -4
  5. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  6. package/payload/platform/plugins/admin/mcp/dist/tools/logs-read-mcp.d.ts +16 -0
  7. package/payload/platform/plugins/admin/mcp/dist/tools/logs-read-mcp.d.ts.map +1 -0
  8. package/payload/platform/plugins/admin/mcp/dist/tools/logs-read-mcp.js +69 -0
  9. package/payload/platform/plugins/admin/mcp/dist/tools/logs-read-mcp.js.map +1 -0
  10. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +133 -9
  11. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +14 -0
  12. package/payload/platform/plugins/docs/references/admin-ui.md +127 -4
  13. package/payload/platform/plugins/docs/references/deployment.md +1 -1
  14. package/payload/platform/plugins/docs/references/internals.md +1 -1
  15. package/payload/platform/plugins/docs/references/platform.md +1 -1
  16. package/payload/platform/plugins/docs/references/plugins-guide.md +2 -1
  17. package/payload/platform/plugins/email/.claude-plugin/plugin.json +1 -1
  18. package/payload/platform/plugins/email/PLUGIN.md +8 -3
  19. package/payload/platform/plugins/email/mcp/dist/__tests__/compose-signature.test.js +61 -4
  20. package/payload/platform/plugins/email/mcp/dist/__tests__/compose-signature.test.js.map +1 -1
  21. package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft-edit.test.js +41 -0
  22. package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft-edit.test.js.map +1 -1
  23. package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft.test.js +47 -1
  24. package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft.test.js.map +1 -1
  25. package/payload/platform/plugins/email/mcp/dist/__tests__/email-sending-identity-set.test.d.ts +2 -0
  26. package/payload/platform/plugins/email/mcp/dist/__tests__/email-sending-identity-set.test.d.ts.map +1 -0
  27. package/payload/platform/plugins/email/mcp/dist/__tests__/email-sending-identity-set.test.js +184 -0
  28. package/payload/platform/plugins/email/mcp/dist/__tests__/email-sending-identity-set.test.js.map +1 -0
  29. package/payload/platform/plugins/email/mcp/dist/__tests__/email-signature-set.test.js +8 -5
  30. package/payload/platform/plugins/email/mcp/dist/__tests__/email-signature-set.test.js.map +1 -1
  31. package/payload/platform/plugins/email/mcp/dist/__tests__/email-status.test.js +64 -0
  32. package/payload/platform/plugins/email/mcp/dist/__tests__/email-status.test.js.map +1 -1
  33. package/payload/platform/plugins/email/mcp/dist/__tests__/mailbox-resolve.test.js +132 -0
  34. package/payload/platform/plugins/email/mcp/dist/__tests__/mailbox-resolve.test.js.map +1 -1
  35. package/payload/platform/plugins/email/mcp/dist/__tests__/signature.test.js +93 -11
  36. package/payload/platform/plugins/email/mcp/dist/__tests__/signature.test.js.map +1 -1
  37. package/payload/platform/plugins/email/mcp/dist/index.js +34 -3
  38. package/payload/platform/plugins/email/mcp/dist/index.js.map +1 -1
  39. package/payload/platform/plugins/email/mcp/dist/lib/compose.d.ts +2 -1
  40. package/payload/platform/plugins/email/mcp/dist/lib/compose.d.ts.map +1 -1
  41. package/payload/platform/plugins/email/mcp/dist/lib/compose.js +13 -2
  42. package/payload/platform/plugins/email/mcp/dist/lib/compose.js.map +1 -1
  43. package/payload/platform/plugins/email/mcp/dist/lib/credentials.d.ts +47 -2
  44. package/payload/platform/plugins/email/mcp/dist/lib/credentials.d.ts.map +1 -1
  45. package/payload/platform/plugins/email/mcp/dist/lib/credentials.js +92 -5
  46. package/payload/platform/plugins/email/mcp/dist/lib/credentials.js.map +1 -1
  47. package/payload/platform/plugins/email/mcp/dist/lib/signature.d.ts +55 -7
  48. package/payload/platform/plugins/email/mcp/dist/lib/signature.d.ts.map +1 -1
  49. package/payload/platform/plugins/email/mcp/dist/lib/signature.js +72 -9
  50. package/payload/platform/plugins/email/mcp/dist/lib/signature.js.map +1 -1
  51. package/payload/platform/plugins/email/mcp/dist/tools/email-draft-edit.d.ts.map +1 -1
  52. package/payload/platform/plugins/email/mcp/dist/tools/email-draft-edit.js +5 -2
  53. package/payload/platform/plugins/email/mcp/dist/tools/email-draft-edit.js.map +1 -1
  54. package/payload/platform/plugins/email/mcp/dist/tools/email-draft.d.ts.map +1 -1
  55. package/payload/platform/plugins/email/mcp/dist/tools/email-draft.js +6 -3
  56. package/payload/platform/plugins/email/mcp/dist/tools/email-draft.js.map +1 -1
  57. package/payload/platform/plugins/email/mcp/dist/tools/email-sending-identity-set.d.ts +20 -0
  58. package/payload/platform/plugins/email/mcp/dist/tools/email-sending-identity-set.d.ts.map +1 -0
  59. package/payload/platform/plugins/email/mcp/dist/tools/email-sending-identity-set.js +32 -0
  60. package/payload/platform/plugins/email/mcp/dist/tools/email-sending-identity-set.js.map +1 -0
  61. package/payload/platform/plugins/email/mcp/dist/tools/email-status.d.ts.map +1 -1
  62. package/payload/platform/plugins/email/mcp/dist/tools/email-status.js +22 -2
  63. package/payload/platform/plugins/email/mcp/dist/tools/email-status.js.map +1 -1
  64. package/payload/platform/plugins/email/references/email-reference.md +11 -3
  65. package/payload/platform/plugins/email/skills/email-composition/SKILL.md +3 -0
  66. package/payload/platform/plugins/email/skills/email-signature/SKILL.md +27 -9
  67. package/payload/platform/plugins/linkedin-extension/extension/README.md +10 -2
  68. package/payload/platform/plugins/linkedin-extension/extension/background/sw.js +37 -4
  69. package/payload/platform/plugins/linkedin-extension/extension/content/profile.js +17 -2
  70. package/payload/platform/plugins/linkedin-extension/extension/content/thread.js +17 -2
  71. package/payload/platform/plugins/linkedin-extension/extension/manifest.json +1 -0
  72. package/payload/platform/plugins/linkedin-extension/extension/options/options.html +1 -0
  73. package/payload/platform/plugins/linkedin-extension/extension/options/options.js +78 -3
  74. package/payload/platform/scripts/__tests__/vnc-cdp-liveness.test.sh +25 -2
  75. package/payload/platform/scripts/vnc.sh +34 -26
  76. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.d.ts +24 -1
  77. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.d.ts.map +1 -1
  78. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.js +84 -3
  79. package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.js.map +1 -1
  80. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  81. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +1 -0
  82. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  83. package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
  84. package/payload/server/{chunk-XCR5D2G3.js → chunk-BP7LH7MC.js} +0 -1
  85. package/payload/server/{chunk-WT2PFGY4.js → chunk-DLG7XSLA.js} +217 -2
  86. package/payload/server/{chunk-7MGR5M6G.js → chunk-UTIHI6KV.js} +1 -1
  87. package/payload/server/{manager-6XOWHREK.js → manager-B4LRDZKC.js} +2 -2
  88. package/payload/server/maxy-edge.js +227 -7
  89. package/payload/server/public/activity.html +5 -5
  90. package/payload/server/public/agents.html +4 -4
  91. package/payload/server/public/assets/AdminLoginScreens-Bx9vPuUg.js +1 -0
  92. package/payload/server/public/assets/AdminLoginScreens-Bx9vPuUg.js.br +0 -0
  93. package/payload/server/public/assets/AdminLoginScreens-Bx9vPuUg.js.gz +0 -0
  94. package/payload/server/public/assets/AdminShell-BxJPbC3p.js +2 -0
  95. package/payload/server/public/assets/AdminShell-BxJPbC3p.js.br +0 -0
  96. package/payload/server/public/assets/AdminShell-BxJPbC3p.js.gz +0 -0
  97. package/payload/server/public/assets/CdpScreencastSurface-5HLhTQTV.js +1 -0
  98. package/payload/server/public/assets/CdpScreencastSurface-5HLhTQTV.js.br +0 -0
  99. package/payload/server/public/assets/CdpScreencastSurface-5HLhTQTV.js.gz +0 -0
  100. package/payload/server/public/assets/{activity-DGQt5ys_.js → activity-BaSYn62l.js} +1 -1
  101. package/payload/server/public/assets/activity-BaSYn62l.js.br +0 -0
  102. package/payload/server/public/assets/activity-BaSYn62l.js.gz +0 -0
  103. package/payload/server/public/assets/admin-CYCKrV_x.js +1 -0
  104. package/payload/server/public/assets/admin-CYCKrV_x.js.br +0 -0
  105. package/payload/server/public/assets/admin-CYCKrV_x.js.gz +0 -0
  106. package/payload/server/public/assets/{agents-Bc2LZjwC.js → agents-D8EJG-ta.js} +1 -1
  107. package/payload/server/public/assets/agents-D8EJG-ta.js.br +0 -0
  108. package/payload/server/public/assets/agents-D8EJG-ta.js.gz +0 -0
  109. package/payload/server/public/assets/{arc-DaudCnXg.js → arc-CHoXZR2f.js} +1 -1
  110. package/payload/server/public/assets/arc-CHoXZR2f.js.br +0 -0
  111. package/payload/server/public/assets/arc-CHoXZR2f.js.gz +0 -0
  112. package/payload/server/public/assets/architecture-YZFGNWBL-CQyo9W6E.js +1 -0
  113. package/payload/server/public/assets/architecture-YZFGNWBL-CQyo9W6E.js.br +0 -0
  114. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-BEEC3s7i.js → architectureDiagram-Q4EWVU46-B8SCI0AR.js} +1 -1
  115. package/payload/server/public/assets/architectureDiagram-Q4EWVU46-B8SCI0AR.js.br +0 -0
  116. package/payload/server/public/assets/architectureDiagram-Q4EWVU46-B8SCI0AR.js.gz +0 -0
  117. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-BIWyfb18.js → blockDiagram-DXYQGD6D-CsJmhz5D.js} +1 -1
  118. package/payload/server/public/assets/blockDiagram-DXYQGD6D-CsJmhz5D.js.br +0 -0
  119. package/payload/server/public/assets/blockDiagram-DXYQGD6D-CsJmhz5D.js.gz +0 -0
  120. package/payload/server/public/assets/browser-D6Y_Zu8C.js +1 -0
  121. package/payload/server/public/assets/browser-D6Y_Zu8C.js.br +0 -0
  122. package/payload/server/public/assets/browser-D6Y_Zu8C.js.gz +0 -0
  123. package/payload/server/public/assets/{c4Diagram-AHTNJAMY--h6oE2cv.js → c4Diagram-AHTNJAMY-CzaSNqcs.js} +1 -1
  124. package/payload/server/public/assets/c4Diagram-AHTNJAMY-CzaSNqcs.js.br +0 -0
  125. package/payload/server/public/assets/c4Diagram-AHTNJAMY-CzaSNqcs.js.gz +0 -0
  126. package/payload/server/public/assets/{calendar-D25EhXbD.js → calendar-DD4oVa-r.js} +1 -1
  127. package/payload/server/public/assets/calendar-DD4oVa-r.js.br +0 -0
  128. package/payload/server/public/assets/calendar-DD4oVa-r.js.gz +0 -0
  129. package/payload/server/public/assets/channel-Dg_Rah6O.js +1 -0
  130. package/payload/server/public/assets/channel-Dg_Rah6O.js.br +0 -0
  131. package/payload/server/public/assets/chat-CwWs69PO.js +1 -0
  132. package/payload/server/public/assets/chat-CwWs69PO.js.br +0 -0
  133. package/payload/server/public/assets/chat-CwWs69PO.js.gz +0 -0
  134. package/payload/server/public/assets/chevron-left-ClfIy5Fx.js +1 -0
  135. package/payload/server/public/assets/chevron-right-B0QvXpxl.js +1 -0
  136. package/payload/server/public/assets/chevron-right-B0QvXpxl.js.br +0 -0
  137. package/payload/server/public/assets/{chunk-2KRD3SAO-BwEVlnxo.js → chunk-2KRD3SAO-DAN3KCZc.js} +1 -1
  138. package/payload/server/public/assets/chunk-2KRD3SAO-DAN3KCZc.js.br +0 -0
  139. package/payload/server/public/assets/chunk-2KRD3SAO-DAN3KCZc.js.gz +0 -0
  140. package/payload/server/public/assets/{chunk-336JU56O-DQddTATH.js → chunk-336JU56O-Dm-0_lIT.js} +2 -2
  141. package/payload/server/public/assets/chunk-336JU56O-Dm-0_lIT.js.br +0 -0
  142. package/payload/server/public/assets/chunk-336JU56O-Dm-0_lIT.js.gz +0 -0
  143. package/payload/server/public/assets/chunk-426QAEUC-Rh8qTRZB.js +1 -0
  144. package/payload/server/public/assets/chunk-426QAEUC-Rh8qTRZB.js.br +0 -0
  145. package/payload/server/public/assets/chunk-426QAEUC-Rh8qTRZB.js.gz +0 -0
  146. package/payload/server/public/assets/{chunk-4BX2VUAB-C5p3xTC6.js → chunk-4BX2VUAB-C2l9bAlo.js} +1 -1
  147. package/payload/server/public/assets/chunk-4BX2VUAB-C2l9bAlo.js.br +0 -0
  148. package/payload/server/public/assets/chunk-4BX2VUAB-C2l9bAlo.js.gz +0 -0
  149. package/payload/server/public/assets/{chunk-4TB4RGXK-gClfNc1w.js → chunk-4TB4RGXK-BMXDzU09.js} +1 -1
  150. package/payload/server/public/assets/chunk-4TB4RGXK-BMXDzU09.js.br +0 -0
  151. package/payload/server/public/assets/chunk-4TB4RGXK-BMXDzU09.js.gz +0 -0
  152. package/payload/server/public/assets/{chunk-55IACEB6-DDU_m1ra.js → chunk-55IACEB6-CbMYAZon.js} +1 -1
  153. package/payload/server/public/assets/chunk-55IACEB6-CbMYAZon.js.br +0 -0
  154. package/payload/server/public/assets/chunk-55IACEB6-CbMYAZon.js.gz +0 -0
  155. package/payload/server/public/assets/{chunk-5FUZZQ4R-CZ2jQWNR.js → chunk-5FUZZQ4R-DjdsuxLA.js} +1 -1
  156. package/payload/server/public/assets/chunk-5FUZZQ4R-DjdsuxLA.js.br +0 -0
  157. package/payload/server/public/assets/chunk-5FUZZQ4R-DjdsuxLA.js.gz +0 -0
  158. package/payload/server/public/assets/{chunk-5PVQY5BW-kcZ5kfTg.js → chunk-5PVQY5BW-CGSBzsF6.js} +1 -1
  159. package/payload/server/public/assets/chunk-5PVQY5BW-CGSBzsF6.js.br +0 -0
  160. package/payload/server/public/assets/chunk-5PVQY5BW-CGSBzsF6.js.gz +0 -0
  161. package/payload/server/public/assets/{chunk-67CJDMHE-9W0Qv0jm.js → chunk-67CJDMHE-ClOLWser.js} +1 -1
  162. package/payload/server/public/assets/chunk-67CJDMHE-ClOLWser.js.br +0 -0
  163. package/payload/server/public/assets/chunk-67CJDMHE-ClOLWser.js.gz +0 -0
  164. package/payload/server/public/assets/{chunk-7N4EOEYR-B3gqydR3.js → chunk-7N4EOEYR-BzC1dzY0.js} +1 -1
  165. package/payload/server/public/assets/chunk-7N4EOEYR-BzC1dzY0.js.br +0 -0
  166. package/payload/server/public/assets/chunk-7N4EOEYR-BzC1dzY0.js.gz +0 -0
  167. package/payload/server/public/assets/{chunk-AA7GKIK3-DW8a-2NK.js → chunk-AA7GKIK3-R_pjI1kw.js} +1 -1
  168. package/payload/server/public/assets/chunk-AA7GKIK3-R_pjI1kw.js.br +0 -0
  169. package/payload/server/public/assets/chunk-AA7GKIK3-R_pjI1kw.js.gz +0 -0
  170. package/payload/server/public/assets/{chunk-BSJP7CBP-DqXIO_5R.js → chunk-BSJP7CBP-D2KRAq3U.js} +1 -1
  171. package/payload/server/public/assets/chunk-BSJP7CBP-D2KRAq3U.js.br +0 -0
  172. package/payload/server/public/assets/chunk-BSJP7CBP-D2KRAq3U.js.gz +0 -0
  173. package/payload/server/public/assets/{chunk-CIAEETIT-BMJfgj2u.js → chunk-CIAEETIT-BPGWtrKR.js} +1 -1
  174. package/payload/server/public/assets/chunk-CIAEETIT-BPGWtrKR.js.br +0 -0
  175. package/payload/server/public/assets/chunk-CIAEETIT-BPGWtrKR.js.gz +0 -0
  176. package/payload/server/public/assets/{chunk-EDXVE4YY-BxdLPk0b.js → chunk-EDXVE4YY-tqt7wueu.js} +1 -1
  177. package/payload/server/public/assets/chunk-EDXVE4YY-tqt7wueu.js.br +3 -0
  178. package/payload/server/public/assets/chunk-EDXVE4YY-tqt7wueu.js.gz +0 -0
  179. package/payload/server/public/assets/{chunk-ENJZ2VHE-Cfe2DCjQ.js → chunk-ENJZ2VHE-DJG3cA6E.js} +1 -1
  180. package/payload/server/public/assets/chunk-ENJZ2VHE-DJG3cA6E.js.br +0 -0
  181. package/payload/server/public/assets/chunk-ENJZ2VHE-DJG3cA6E.js.gz +0 -0
  182. package/payload/server/public/assets/{chunk-FMBD7UC4-CdPjwbtf.js → chunk-FMBD7UC4-DO1xgCDf.js} +1 -1
  183. package/payload/server/public/assets/chunk-FMBD7UC4-DO1xgCDf.js.br +2 -0
  184. package/payload/server/public/assets/chunk-FMBD7UC4-DO1xgCDf.js.gz +0 -0
  185. package/payload/server/public/assets/{chunk-FOC6F5B3-Dl6l1KAh.js → chunk-FOC6F5B3-BhWAbCUG.js} +1 -1
  186. package/payload/server/public/assets/chunk-FOC6F5B3-BhWAbCUG.js.br +0 -0
  187. package/payload/server/public/assets/chunk-FOC6F5B3-BhWAbCUG.js.gz +0 -0
  188. package/payload/server/public/assets/{chunk-ICPOFSXX-PnsGrqtx.js → chunk-ICPOFSXX-BhUzt35c.js} +2 -2
  189. package/payload/server/public/assets/chunk-ICPOFSXX-BhUzt35c.js.br +0 -0
  190. package/payload/server/public/assets/chunk-ICPOFSXX-BhUzt35c.js.gz +0 -0
  191. package/payload/server/public/assets/{chunk-K5T4RW27--g29_wjW.js → chunk-K5T4RW27-Boj-qHrX.js} +1 -1
  192. package/payload/server/public/assets/chunk-K5T4RW27-Boj-qHrX.js.br +0 -0
  193. package/payload/server/public/assets/chunk-K5T4RW27-Boj-qHrX.js.gz +0 -0
  194. package/payload/server/public/assets/{chunk-KGLVRYIC-CI77ENeO.js → chunk-KGLVRYIC-3cBRDk1b.js} +1 -1
  195. package/payload/server/public/assets/chunk-KGLVRYIC-3cBRDk1b.js.br +2 -0
  196. package/payload/server/public/assets/chunk-KGLVRYIC-3cBRDk1b.js.gz +0 -0
  197. package/payload/server/public/assets/{chunk-LIHQZDEY-CE-XByg6.js → chunk-LIHQZDEY-CgkLKaII.js} +1 -1
  198. package/payload/server/public/assets/chunk-LIHQZDEY-CgkLKaII.js.br +0 -0
  199. package/payload/server/public/assets/chunk-LIHQZDEY-CgkLKaII.js.gz +0 -0
  200. package/payload/server/public/assets/{chunk-ORNJ4GCN-DkjJQQSm.js → chunk-ORNJ4GCN-Dl449r_k.js} +1 -1
  201. package/payload/server/public/assets/chunk-ORNJ4GCN-Dl449r_k.js.br +0 -0
  202. package/payload/server/public/assets/chunk-ORNJ4GCN-Dl449r_k.js.gz +0 -0
  203. package/payload/server/public/assets/{chunk-OYMX7WX6-DhogFeD7.js → chunk-OYMX7WX6-Dzkj67n6.js} +1 -1
  204. package/payload/server/public/assets/chunk-OYMX7WX6-Dzkj67n6.js.br +0 -0
  205. package/payload/server/public/assets/chunk-OYMX7WX6-Dzkj67n6.js.gz +0 -0
  206. package/payload/server/public/assets/chunk-QZHKN3VN-BDoCtU0N.js +1 -0
  207. package/payload/server/public/assets/chunk-QZHKN3VN-BDoCtU0N.js.br +0 -0
  208. package/payload/server/public/assets/chunk-QZHKN3VN-BDoCtU0N.js.gz +0 -0
  209. package/payload/server/public/assets/{chunk-U2HBQHQK-CeaRXuiO.js → chunk-U2HBQHQK-Dyz9Kbir.js} +1 -1
  210. package/payload/server/public/assets/chunk-U2HBQHQK-Dyz9Kbir.js.br +0 -0
  211. package/payload/server/public/assets/chunk-U2HBQHQK-Dyz9Kbir.js.gz +0 -0
  212. package/payload/server/public/assets/{chunk-X2U36JSP-BqxXeOqf.js → chunk-X2U36JSP-ag0VVCw6.js} +1 -1
  213. package/payload/server/public/assets/chunk-X2U36JSP-ag0VVCw6.js.br +0 -0
  214. package/payload/server/public/assets/chunk-X2U36JSP-ag0VVCw6.js.gz +0 -0
  215. package/payload/server/public/assets/{chunk-XPW4576I-DtqJwn2x.js → chunk-XPW4576I-B-vhDYPE.js} +1 -1
  216. package/payload/server/public/assets/chunk-XPW4576I-B-vhDYPE.js.br +0 -0
  217. package/payload/server/public/assets/chunk-XPW4576I-B-vhDYPE.js.gz +0 -0
  218. package/payload/server/public/assets/{chunk-YZCP3GAM-COBlEwQw.js → chunk-YZCP3GAM-C4COviPb.js} +1 -1
  219. package/payload/server/public/assets/chunk-YZCP3GAM-C4COviPb.js.br +0 -0
  220. package/payload/server/public/assets/chunk-YZCP3GAM-C4COviPb.js.gz +0 -0
  221. package/payload/server/public/assets/{chunk-ZZ45TVLE-CcL088y6.js → chunk-ZZ45TVLE-8dGsCp5b.js} +1 -1
  222. package/payload/server/public/assets/chunk-ZZ45TVLE-8dGsCp5b.js.br +0 -0
  223. package/payload/server/public/assets/chunk-ZZ45TVLE-8dGsCp5b.js.gz +0 -0
  224. package/payload/server/public/assets/classDiagram-6PBFFD2Q-qevfwy5C.js +1 -0
  225. package/payload/server/public/assets/classDiagram-6PBFFD2Q-qevfwy5C.js.br +0 -0
  226. package/payload/server/public/assets/classDiagram-6PBFFD2Q-qevfwy5C.js.gz +0 -0
  227. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-CxOR3aao.js +1 -0
  228. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-CxOR3aao.js.br +0 -0
  229. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-CxOR3aao.js.gz +0 -0
  230. package/payload/server/public/assets/clock-BIaRnIP_.js +1 -0
  231. package/payload/server/public/assets/clock-BIaRnIP_.js.br +0 -0
  232. package/payload/server/public/assets/clock-BIaRnIP_.js.gz +0 -0
  233. package/payload/server/public/assets/clone-CJmzeWWZ.js +1 -0
  234. package/payload/server/public/assets/clone-CJmzeWWZ.js.br +0 -0
  235. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-kEHVkDNn.js → cose-bilkent-S5V4N54A-qM4Q4TuE.js} +1 -1
  236. package/payload/server/public/assets/cose-bilkent-S5V4N54A-qM4Q4TuE.js.br +0 -0
  237. package/payload/server/public/assets/cose-bilkent-S5V4N54A-qM4Q4TuE.js.gz +0 -0
  238. package/payload/server/public/assets/{dagre-D2wUw1zC.js → dagre-DRvHdusQ.js} +1 -1
  239. package/payload/server/public/assets/dagre-DRvHdusQ.js.br +0 -0
  240. package/payload/server/public/assets/dagre-DRvHdusQ.js.gz +0 -0
  241. package/payload/server/public/assets/{dagre-KV5264BT-BWfTDwEs.js → dagre-KV5264BT-CGqSVVTn.js} +1 -1
  242. package/payload/server/public/assets/dagre-KV5264BT-CGqSVVTn.js.br +0 -0
  243. package/payload/server/public/assets/dagre-KV5264BT-CGqSVVTn.js.gz +0 -0
  244. package/payload/server/public/assets/data-O_9Kiicl.js +1 -0
  245. package/payload/server/public/assets/data-O_9Kiicl.js.br +2 -0
  246. package/payload/server/public/assets/data-O_9Kiicl.js.gz +0 -0
  247. package/payload/server/public/assets/{diagram-5BDNPKRD-Tl9dS8w0.js → diagram-5BDNPKRD-DfFgeApz.js} +1 -1
  248. package/payload/server/public/assets/diagram-5BDNPKRD-DfFgeApz.js.br +0 -0
  249. package/payload/server/public/assets/diagram-5BDNPKRD-DfFgeApz.js.gz +0 -0
  250. package/payload/server/public/assets/{diagram-G4DWMVQ6-CeSe6TMu.js → diagram-G4DWMVQ6-DPXc3Q8e.js} +1 -1
  251. package/payload/server/public/assets/diagram-G4DWMVQ6-DPXc3Q8e.js.br +0 -0
  252. package/payload/server/public/assets/diagram-G4DWMVQ6-DPXc3Q8e.js.gz +0 -0
  253. package/payload/server/public/assets/{diagram-MMDJMWI5-DYBNJCmk.js → diagram-MMDJMWI5-V8RCddvy.js} +1 -1
  254. package/payload/server/public/assets/diagram-MMDJMWI5-V8RCddvy.js.br +0 -0
  255. package/payload/server/public/assets/diagram-MMDJMWI5-V8RCddvy.js.gz +0 -0
  256. package/payload/server/public/assets/{diagram-TYMM5635-BmpUGltx.js → diagram-TYMM5635-CrvfIf-m.js} +1 -1
  257. package/payload/server/public/assets/diagram-TYMM5635-CrvfIf-m.js.br +0 -0
  258. package/payload/server/public/assets/diagram-TYMM5635-CrvfIf-m.js.gz +0 -0
  259. package/payload/server/public/assets/{erDiagram-SMLLAGMA-DuwuNGqx.js → erDiagram-SMLLAGMA-DClMgmBB.js} +1 -1
  260. package/payload/server/public/assets/erDiagram-SMLLAGMA-DClMgmBB.js.br +0 -0
  261. package/payload/server/public/assets/erDiagram-SMLLAGMA-DClMgmBB.js.gz +0 -0
  262. package/payload/server/public/assets/{file-download-CiGklOfA.js → file-download-sXU3_umF.js} +1 -1
  263. package/payload/server/public/assets/file-download-sXU3_umF.js.br +0 -0
  264. package/payload/server/public/assets/file-download-sXU3_umF.js.gz +0 -0
  265. package/payload/server/public/assets/{file-text-XjJPULAZ.js → file-text-CeXBviDH.js} +1 -1
  266. package/payload/server/public/assets/file-text-CeXBviDH.js.br +0 -0
  267. package/payload/server/public/assets/file-text-CeXBviDH.js.gz +0 -0
  268. package/payload/server/public/assets/{flatten-Bu-b1uTY.js → flatten-UdUTbm8v.js} +1 -1
  269. package/payload/server/public/assets/flatten-UdUTbm8v.js.br +0 -0
  270. package/payload/server/public/assets/flatten-UdUTbm8v.js.gz +0 -0
  271. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-Bpp8P6Ba.js → flowDiagram-DWJPFMVM-D29Ou09P.js} +1 -1
  272. package/payload/server/public/assets/flowDiagram-DWJPFMVM-D29Ou09P.js.br +0 -0
  273. package/payload/server/public/assets/flowDiagram-DWJPFMVM-D29Ou09P.js.gz +0 -0
  274. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-CE6ppjB4.js → ganttDiagram-T4ZO3ILL-CoAK7W_V.js} +1 -1
  275. package/payload/server/public/assets/ganttDiagram-T4ZO3ILL-CoAK7W_V.js.br +0 -0
  276. package/payload/server/public/assets/ganttDiagram-T4ZO3ILL-CoAK7W_V.js.gz +0 -0
  277. package/payload/server/public/assets/gitGraph-7Q5UKJZL--JSoLMoH.js +1 -0
  278. package/payload/server/public/assets/gitGraph-7Q5UKJZL--JSoLMoH.js.br +0 -0
  279. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-BdK1GjPr.js → gitGraphDiagram-UUTBAWPF-DMEc_1aX.js} +1 -1
  280. package/payload/server/public/assets/gitGraphDiagram-UUTBAWPF-DMEc_1aX.js.br +0 -0
  281. package/payload/server/public/assets/gitGraphDiagram-UUTBAWPF-DMEc_1aX.js.gz +0 -0
  282. package/payload/server/public/assets/{graph-BjHJ0z_6.js → graph-BSuDP6k7.js} +3 -3
  283. package/payload/server/public/assets/graph-BSuDP6k7.js.br +0 -0
  284. package/payload/server/public/assets/graph-BSuDP6k7.js.gz +0 -0
  285. package/payload/server/public/assets/{graph-labels-D-0u37KA.js → graph-labels-D2pQkgYW.js} +1 -1
  286. package/payload/server/public/assets/graph-labels-D2pQkgYW.js.br +0 -0
  287. package/payload/server/public/assets/graph-labels-D2pQkgYW.js.gz +0 -0
  288. package/payload/server/public/assets/{graphlib-CHEXylyU.js → graphlib-ihSLgqUG.js} +1 -1
  289. package/payload/server/public/assets/graphlib-ihSLgqUG.js.br +0 -0
  290. package/payload/server/public/assets/graphlib-ihSLgqUG.js.gz +0 -0
  291. package/payload/server/public/assets/info-OMHHGYJF-CY4gsXn4.js +1 -0
  292. package/payload/server/public/assets/info-OMHHGYJF-CY4gsXn4.js.br +0 -0
  293. package/payload/server/public/assets/infoDiagram-42DDH7IO-CpWSNS3C.js +2 -0
  294. package/payload/server/public/assets/infoDiagram-42DDH7IO-CpWSNS3C.js.br +0 -0
  295. package/payload/server/public/assets/infoDiagram-42DDH7IO-CpWSNS3C.js.gz +0 -0
  296. package/payload/server/public/assets/{isEmpty-CjH0UASp.js → isEmpty-DY_Xp9Na.js} +1 -1
  297. package/payload/server/public/assets/isEmpty-DY_Xp9Na.js.br +0 -0
  298. package/payload/server/public/assets/isEmpty-DY_Xp9Na.js.gz +0 -0
  299. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-CgkVZ4-3.js → ishikawaDiagram-UXIWVN3A-w8fVIbxy.js} +1 -1
  300. package/payload/server/public/assets/ishikawaDiagram-UXIWVN3A-w8fVIbxy.js.br +0 -0
  301. package/payload/server/public/assets/ishikawaDiagram-UXIWVN3A-w8fVIbxy.js.gz +0 -0
  302. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-ByUPv8q6.js → journeyDiagram-VCZTEJTY-BRTPKDT5.js} +1 -1
  303. package/payload/server/public/assets/journeyDiagram-VCZTEJTY-BRTPKDT5.js.br +0 -0
  304. package/payload/server/public/assets/journeyDiagram-VCZTEJTY-BRTPKDT5.js.gz +0 -0
  305. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-CFinqhpu.js → kanban-definition-6JOO6SKY-Ls3VaFZ_.js} +1 -1
  306. package/payload/server/public/assets/kanban-definition-6JOO6SKY-Ls3VaFZ_.js.br +0 -0
  307. package/payload/server/public/assets/kanban-definition-6JOO6SKY-Ls3VaFZ_.js.gz +0 -0
  308. package/payload/server/public/assets/{line-Y4ns5Ghi.js → line-BwhAIh8u.js} +1 -1
  309. package/payload/server/public/assets/line-BwhAIh8u.js.br +0 -0
  310. package/payload/server/public/assets/line-BwhAIh8u.js.gz +0 -0
  311. package/payload/server/public/assets/{linear-l39GooQ5.js → linear-USiZPFN4.js} +1 -1
  312. package/payload/server/public/assets/linear-USiZPFN4.js.br +0 -0
  313. package/payload/server/public/assets/linear-USiZPFN4.js.gz +0 -0
  314. package/payload/server/public/assets/{maximize-2-BJ9S-nfS.js → maximize-2-DlzSNygU.js} +1 -1
  315. package/payload/server/public/assets/maximize-2-DlzSNygU.js.br +0 -0
  316. package/payload/server/public/assets/maximize-2-DlzSNygU.js.gz +0 -0
  317. package/payload/server/public/assets/{mermaid-parser.core-5w0T1dRj.js → mermaid-parser.core-Bq--iC2w.js} +2 -2
  318. package/payload/server/public/assets/mermaid-parser.core-Bq--iC2w.js.br +0 -0
  319. package/payload/server/public/assets/mermaid-parser.core-Bq--iC2w.js.gz +0 -0
  320. package/payload/server/public/assets/{mermaid.core-DBADY5VW.js → mermaid.core-oYX-FxVa.js} +3 -3
  321. package/payload/server/public/assets/mermaid.core-oYX-FxVa.js.br +0 -0
  322. package/payload/server/public/assets/mermaid.core-oYX-FxVa.js.gz +0 -0
  323. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-rHz37loq.js → mindmap-definition-QFDTVHPH-ByZjL4Bs.js} +1 -1
  324. package/payload/server/public/assets/mindmap-definition-QFDTVHPH-ByZjL4Bs.js.br +0 -0
  325. package/payload/server/public/assets/mindmap-definition-QFDTVHPH-ByZjL4Bs.js.gz +0 -0
  326. package/payload/server/public/assets/operator-BP61-xjz.js +1 -0
  327. package/payload/server/public/assets/operator-BP61-xjz.js.br +0 -0
  328. package/payload/server/public/assets/operator-BP61-xjz.js.gz +0 -0
  329. package/payload/server/public/assets/{ordinal-D6D6WcTC.js → ordinal-gnpqfIHn.js} +1 -1
  330. package/payload/server/public/assets/ordinal-gnpqfIHn.js.br +0 -0
  331. package/payload/server/public/assets/ordinal-gnpqfIHn.js.gz +0 -0
  332. package/payload/server/public/assets/packet-4T2RLAQJ-DczCn3uj.js +1 -0
  333. package/payload/server/public/assets/packet-4T2RLAQJ-DczCn3uj.js.br +0 -0
  334. package/payload/server/public/assets/page-DX7ArY_s.js +1 -0
  335. package/payload/server/public/assets/page-DX7ArY_s.js.br +0 -0
  336. package/payload/server/public/assets/page-DX7ArY_s.js.gz +0 -0
  337. package/payload/server/public/assets/page-eQ4OVros.js +32 -0
  338. package/payload/server/public/assets/page-eQ4OVros.js.br +0 -0
  339. package/payload/server/public/assets/page-eQ4OVros.js.gz +0 -0
  340. package/payload/server/public/assets/{pdf-render-BSgBp8Fr.js → pdf-render-gEryZmeC.js} +1 -1
  341. package/payload/server/public/assets/pdf-render-gEryZmeC.js.br +0 -0
  342. package/payload/server/public/assets/pdf-render-gEryZmeC.js.gz +0 -0
  343. package/payload/server/public/assets/pie-ZZUOXDRM-CbvZUaof.js +1 -0
  344. package/payload/server/public/assets/pie-ZZUOXDRM-CbvZUaof.js.br +0 -0
  345. package/payload/server/public/assets/{pieDiagram-DEJITSTG-as0e_DSH.js → pieDiagram-DEJITSTG-BGFms5bU.js} +1 -1
  346. package/payload/server/public/assets/pieDiagram-DEJITSTG-BGFms5bU.js.br +0 -0
  347. package/payload/server/public/assets/pieDiagram-DEJITSTG-BGFms5bU.js.gz +0 -0
  348. package/payload/server/public/assets/{public-BbJcQGsO.js → public-DPDKFKM2.js} +1 -1
  349. package/payload/server/public/assets/public-DPDKFKM2.js.br +0 -0
  350. package/payload/server/public/assets/public-DPDKFKM2.js.gz +0 -0
  351. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-B4t8HO9J.js → quadrantDiagram-34T5L4WZ-_ymoz8bQ.js} +1 -1
  352. package/payload/server/public/assets/quadrantDiagram-34T5L4WZ-_ymoz8bQ.js.br +0 -0
  353. package/payload/server/public/assets/quadrantDiagram-34T5L4WZ-_ymoz8bQ.js.gz +0 -0
  354. package/payload/server/public/assets/radar-PYXPWWZC-XmuabQlO.js +1 -0
  355. package/payload/server/public/assets/radar-PYXPWWZC-XmuabQlO.js.br +0 -0
  356. package/payload/server/public/assets/{reduce-BtXXK8Ma.js → reduce-BvezuHIe.js} +1 -1
  357. package/payload/server/public/assets/reduce-BvezuHIe.js.br +0 -0
  358. package/payload/server/public/assets/reduce-BvezuHIe.js.gz +0 -0
  359. package/payload/server/public/assets/{requirementDiagram-MS252O5E-yxh30zHX.js → requirementDiagram-MS252O5E-lrOmOxIA.js} +1 -1
  360. package/payload/server/public/assets/requirementDiagram-MS252O5E-lrOmOxIA.js.br +0 -0
  361. package/payload/server/public/assets/requirementDiagram-MS252O5E-lrOmOxIA.js.gz +0 -0
  362. package/payload/server/public/assets/{rotate-ccw-jeSVwUAv.js → rotate-ccw-BR0JbPFV.js} +1 -1
  363. package/payload/server/public/assets/rotate-ccw-BR0JbPFV.js.br +0 -0
  364. package/payload/server/public/assets/rotate-ccw-BR0JbPFV.js.gz +0 -0
  365. package/payload/server/public/assets/{routines-D3M1Wh3a.js → routines-y413YZa-.js} +1 -1
  366. package/payload/server/public/assets/routines-y413YZa-.js.br +0 -0
  367. package/payload/server/public/assets/routines-y413YZa-.js.gz +0 -0
  368. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-j-k9Wfty.js → sankeyDiagram-XADWPNL6-CdUQThXU.js} +1 -1
  369. package/payload/server/public/assets/sankeyDiagram-XADWPNL6-CdUQThXU.js.br +0 -0
  370. package/payload/server/public/assets/sankeyDiagram-XADWPNL6-CdUQThXU.js.gz +0 -0
  371. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-DGLgcLhC.js → sequenceDiagram-FGHM5R23-DqnEEldq.js} +1 -1
  372. package/payload/server/public/assets/sequenceDiagram-FGHM5R23-DqnEEldq.js.br +0 -0
  373. package/payload/server/public/assets/sequenceDiagram-FGHM5R23-DqnEEldq.js.gz +0 -0
  374. package/payload/server/public/assets/{skills-Bhej2ub1.js → skills-fH0uA7cj.js} +1 -1
  375. package/payload/server/public/assets/skills-fH0uA7cj.js.br +0 -0
  376. package/payload/server/public/assets/skills-fH0uA7cj.js.gz +0 -0
  377. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-C9p1OUMI.js → stateDiagram-FHFEXIEX-KEdtxqdq.js} +1 -1
  378. package/payload/server/public/assets/stateDiagram-FHFEXIEX-KEdtxqdq.js.br +0 -0
  379. package/payload/server/public/assets/stateDiagram-FHFEXIEX-KEdtxqdq.js.gz +0 -0
  380. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Cs85Ewtt.js +1 -0
  381. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Cs85Ewtt.js.br +0 -0
  382. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Cs85Ewtt.js.gz +0 -0
  383. package/payload/server/public/assets/tasks-CrVzFrTR.js +3 -0
  384. package/payload/server/public/assets/tasks-CrVzFrTR.js.br +0 -0
  385. package/payload/server/public/assets/tasks-CrVzFrTR.js.gz +0 -0
  386. package/payload/server/public/assets/{time-entry-format-r5UY9rjG.js → time-entry-format-C_0jiMpQ.js} +1 -1
  387. package/payload/server/public/assets/time-entry-format-C_0jiMpQ.js.br +1 -0
  388. package/payload/server/public/assets/time-entry-format-C_0jiMpQ.js.gz +0 -0
  389. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-B1g7pgkH.js → timeline-definition-GMOUNBTQ-BRXdCMau.js} +1 -1
  390. package/payload/server/public/assets/timeline-definition-GMOUNBTQ-BRXdCMau.js.br +0 -0
  391. package/payload/server/public/assets/timeline-definition-GMOUNBTQ-BRXdCMau.js.gz +0 -0
  392. package/payload/server/public/assets/treeView-SZITEDCU-B-SYhqwK.js +1 -0
  393. package/payload/server/public/assets/treeView-SZITEDCU-B-SYhqwK.js.br +0 -0
  394. package/payload/server/public/assets/treemap-W4RFUUIX-DpZmFNM9.js +1 -0
  395. package/payload/server/public/assets/treemap-W4RFUUIX-DpZmFNM9.js.br +0 -0
  396. package/payload/server/public/assets/{triangle-alert--PCKaewD.js → triangle-alert-eLJHC_QJ.js} +1 -1
  397. package/payload/server/public/assets/triangle-alert-eLJHC_QJ.js.br +1 -0
  398. package/payload/server/public/assets/triangle-alert-eLJHC_QJ.js.gz +0 -0
  399. package/payload/server/public/assets/{useCopyFeedback-Dg5lNgqH.js → useCopyFeedback-vPCmdOmY.js} +1 -1
  400. package/payload/server/public/assets/useCopyFeedback-vPCmdOmY.js.br +0 -0
  401. package/payload/server/public/assets/useCopyFeedback-vPCmdOmY.js.gz +0 -0
  402. package/payload/server/public/assets/useSubAccountSwitcher-DMr3DR5N.js +14 -0
  403. package/payload/server/public/assets/useSubAccountSwitcher-DMr3DR5N.js.br +0 -0
  404. package/payload/server/public/assets/useSubAccountSwitcher-DMr3DR5N.js.gz +0 -0
  405. package/payload/server/public/assets/useSubAccountSwitcher-DxuUS_C7.css +1 -0
  406. package/payload/server/public/assets/useSubAccountSwitcher-DxuUS_C7.css.br +0 -0
  407. package/payload/server/public/assets/useSubAccountSwitcher-DxuUS_C7.css.gz +0 -0
  408. package/payload/server/public/assets/{useVoiceRecorder-BY6ZsGMH.js → useVoiceRecorder-D5bFDRqL.js} +2 -2
  409. package/payload/server/public/assets/useVoiceRecorder-D5bFDRqL.js.br +0 -0
  410. package/payload/server/public/assets/useVoiceRecorder-D5bFDRqL.js.gz +0 -0
  411. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-D2ZjFfh4.js → vennDiagram-DHZGUBPP-8nc7NUVQ.js} +1 -1
  412. package/payload/server/public/assets/vennDiagram-DHZGUBPP-8nc7NUVQ.js.br +0 -0
  413. package/payload/server/public/assets/vennDiagram-DHZGUBPP-8nc7NUVQ.js.gz +0 -0
  414. package/payload/server/public/assets/wardley-RL74JXVD-D2FCCV4-.js +1 -0
  415. package/payload/server/public/assets/wardley-RL74JXVD-D2FCCV4-.js.br +0 -0
  416. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-BFAhfkD8.js → wardleyDiagram-NUSXRM2D-Cjjiap8M.js} +1 -1
  417. package/payload/server/public/assets/wardleyDiagram-NUSXRM2D-Cjjiap8M.js.br +0 -0
  418. package/payload/server/public/assets/wardleyDiagram-NUSXRM2D-Cjjiap8M.js.gz +0 -0
  419. package/payload/server/public/assets/{wrench-Bw1FMolk.js → wrench-sXisQXkf.js} +1 -1
  420. package/payload/server/public/assets/wrench-sXisQXkf.js.br +0 -0
  421. package/payload/server/public/assets/wrench-sXisQXkf.js.gz +0 -0
  422. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-Dt94h2RQ.js → xychartDiagram-5P7HB3ND-DEzDNw_i.js} +1 -1
  423. package/payload/server/public/assets/xychartDiagram-5P7HB3ND-DEzDNw_i.js.br +0 -0
  424. package/payload/server/public/assets/xychartDiagram-5P7HB3ND-DEzDNw_i.js.gz +0 -0
  425. package/payload/server/public/brand-defaults.css +1 -1
  426. package/payload/server/public/browser.html +5 -4
  427. package/payload/server/public/calendar.html +7 -7
  428. package/payload/server/public/chat.html +14 -14
  429. package/payload/server/public/data.html +13 -13
  430. package/payload/server/public/graph.html +9 -9
  431. package/payload/server/public/index.html +17 -16
  432. package/payload/server/public/operator.html +16 -15
  433. package/payload/server/public/public.html +14 -14
  434. package/payload/server/public/routines.html +7 -7
  435. package/payload/server/public/skills.html +5 -5
  436. package/payload/server/public/tasks.html +6 -6
  437. package/payload/server/server.js +103 -77
  438. package/payload/server/public/assets/AdminLoginScreens-BgDjueVe.js +0 -1
  439. package/payload/server/public/assets/AdminLoginScreens-BgDjueVe.js.br +0 -0
  440. package/payload/server/public/assets/AdminLoginScreens-BgDjueVe.js.gz +0 -0
  441. package/payload/server/public/assets/AdminShell-YctTrR-D.js +0 -2
  442. package/payload/server/public/assets/AdminShell-YctTrR-D.js.br +0 -0
  443. package/payload/server/public/assets/AdminShell-YctTrR-D.js.gz +0 -0
  444. package/payload/server/public/assets/activity-DGQt5ys_.js.br +0 -0
  445. package/payload/server/public/assets/activity-DGQt5ys_.js.gz +0 -0
  446. package/payload/server/public/assets/admin-DnUxbB3P.js +0 -1
  447. package/payload/server/public/assets/admin-DnUxbB3P.js.br +0 -0
  448. package/payload/server/public/assets/admin-DnUxbB3P.js.gz +0 -0
  449. package/payload/server/public/assets/agents-Bc2LZjwC.js.br +0 -0
  450. package/payload/server/public/assets/agents-Bc2LZjwC.js.gz +0 -0
  451. package/payload/server/public/assets/arc-DaudCnXg.js.br +0 -0
  452. package/payload/server/public/assets/arc-DaudCnXg.js.gz +0 -0
  453. package/payload/server/public/assets/architecture-YZFGNWBL-DPFsm5jD.js +0 -1
  454. package/payload/server/public/assets/architecture-YZFGNWBL-DPFsm5jD.js.br +0 -0
  455. package/payload/server/public/assets/architectureDiagram-Q4EWVU46-BEEC3s7i.js.br +0 -0
  456. package/payload/server/public/assets/architectureDiagram-Q4EWVU46-BEEC3s7i.js.gz +0 -0
  457. package/payload/server/public/assets/blockDiagram-DXYQGD6D-BIWyfb18.js.br +0 -0
  458. package/payload/server/public/assets/blockDiagram-DXYQGD6D-BIWyfb18.js.gz +0 -0
  459. package/payload/server/public/assets/browser-BtF7SzvG.js +0 -1
  460. package/payload/server/public/assets/browser-BtF7SzvG.js.br +0 -0
  461. package/payload/server/public/assets/browser-BtF7SzvG.js.gz +0 -0
  462. package/payload/server/public/assets/c4Diagram-AHTNJAMY--h6oE2cv.js.br +0 -0
  463. package/payload/server/public/assets/c4Diagram-AHTNJAMY--h6oE2cv.js.gz +0 -0
  464. package/payload/server/public/assets/calendar-D25EhXbD.js.br +0 -0
  465. package/payload/server/public/assets/calendar-D25EhXbD.js.gz +0 -0
  466. package/payload/server/public/assets/channel-TwxCDSpK.js +0 -1
  467. package/payload/server/public/assets/channel-TwxCDSpK.js.br +0 -0
  468. package/payload/server/public/assets/chat-z4jsHFXg.js +0 -1
  469. package/payload/server/public/assets/chat-z4jsHFXg.js.br +0 -0
  470. package/payload/server/public/assets/chat-z4jsHFXg.js.gz +0 -0
  471. package/payload/server/public/assets/chevron-left-BD09SN6R.js +0 -1
  472. package/payload/server/public/assets/chevron-right-ChmWeo7T.js +0 -1
  473. package/payload/server/public/assets/chevron-right-ChmWeo7T.js.br +0 -0
  474. package/payload/server/public/assets/chunk-2KRD3SAO-BwEVlnxo.js.br +0 -0
  475. package/payload/server/public/assets/chunk-2KRD3SAO-BwEVlnxo.js.gz +0 -0
  476. package/payload/server/public/assets/chunk-336JU56O-DQddTATH.js.br +0 -0
  477. package/payload/server/public/assets/chunk-336JU56O-DQddTATH.js.gz +0 -0
  478. package/payload/server/public/assets/chunk-426QAEUC-BDC8wptW.js +0 -1
  479. package/payload/server/public/assets/chunk-426QAEUC-BDC8wptW.js.br +0 -0
  480. package/payload/server/public/assets/chunk-426QAEUC-BDC8wptW.js.gz +0 -0
  481. package/payload/server/public/assets/chunk-4BX2VUAB-C5p3xTC6.js.br +0 -0
  482. package/payload/server/public/assets/chunk-4BX2VUAB-C5p3xTC6.js.gz +0 -0
  483. package/payload/server/public/assets/chunk-4TB4RGXK-gClfNc1w.js.br +0 -0
  484. package/payload/server/public/assets/chunk-4TB4RGXK-gClfNc1w.js.gz +0 -0
  485. package/payload/server/public/assets/chunk-55IACEB6-DDU_m1ra.js.br +0 -0
  486. package/payload/server/public/assets/chunk-55IACEB6-DDU_m1ra.js.gz +0 -0
  487. package/payload/server/public/assets/chunk-5FUZZQ4R-CZ2jQWNR.js.br +0 -0
  488. package/payload/server/public/assets/chunk-5FUZZQ4R-CZ2jQWNR.js.gz +0 -0
  489. package/payload/server/public/assets/chunk-5PVQY5BW-kcZ5kfTg.js.br +0 -0
  490. package/payload/server/public/assets/chunk-5PVQY5BW-kcZ5kfTg.js.gz +0 -0
  491. package/payload/server/public/assets/chunk-67CJDMHE-9W0Qv0jm.js.br +0 -0
  492. package/payload/server/public/assets/chunk-67CJDMHE-9W0Qv0jm.js.gz +0 -0
  493. package/payload/server/public/assets/chunk-7N4EOEYR-B3gqydR3.js.br +0 -0
  494. package/payload/server/public/assets/chunk-7N4EOEYR-B3gqydR3.js.gz +0 -0
  495. package/payload/server/public/assets/chunk-AA7GKIK3-DW8a-2NK.js.br +0 -4
  496. package/payload/server/public/assets/chunk-AA7GKIK3-DW8a-2NK.js.gz +0 -0
  497. package/payload/server/public/assets/chunk-BSJP7CBP-DqXIO_5R.js.br +0 -0
  498. package/payload/server/public/assets/chunk-BSJP7CBP-DqXIO_5R.js.gz +0 -0
  499. package/payload/server/public/assets/chunk-CIAEETIT-BMJfgj2u.js.br +0 -0
  500. package/payload/server/public/assets/chunk-CIAEETIT-BMJfgj2u.js.gz +0 -0
  501. package/payload/server/public/assets/chunk-EDXVE4YY-BxdLPk0b.js.br +0 -0
  502. package/payload/server/public/assets/chunk-EDXVE4YY-BxdLPk0b.js.gz +0 -0
  503. package/payload/server/public/assets/chunk-ENJZ2VHE-Cfe2DCjQ.js.br +0 -0
  504. package/payload/server/public/assets/chunk-ENJZ2VHE-Cfe2DCjQ.js.gz +0 -0
  505. package/payload/server/public/assets/chunk-FMBD7UC4-CdPjwbtf.js.br +0 -0
  506. package/payload/server/public/assets/chunk-FMBD7UC4-CdPjwbtf.js.gz +0 -0
  507. package/payload/server/public/assets/chunk-FOC6F5B3-Dl6l1KAh.js.br +0 -0
  508. package/payload/server/public/assets/chunk-FOC6F5B3-Dl6l1KAh.js.gz +0 -0
  509. package/payload/server/public/assets/chunk-ICPOFSXX-PnsGrqtx.js.br +0 -0
  510. package/payload/server/public/assets/chunk-ICPOFSXX-PnsGrqtx.js.gz +0 -0
  511. package/payload/server/public/assets/chunk-K5T4RW27--g29_wjW.js.br +0 -0
  512. package/payload/server/public/assets/chunk-K5T4RW27--g29_wjW.js.gz +0 -0
  513. package/payload/server/public/assets/chunk-KGLVRYIC-CI77ENeO.js.br +0 -3
  514. package/payload/server/public/assets/chunk-KGLVRYIC-CI77ENeO.js.gz +0 -0
  515. package/payload/server/public/assets/chunk-LIHQZDEY-CE-XByg6.js.br +0 -0
  516. package/payload/server/public/assets/chunk-LIHQZDEY-CE-XByg6.js.gz +0 -0
  517. package/payload/server/public/assets/chunk-ORNJ4GCN-DkjJQQSm.js.br +0 -0
  518. package/payload/server/public/assets/chunk-ORNJ4GCN-DkjJQQSm.js.gz +0 -0
  519. package/payload/server/public/assets/chunk-OYMX7WX6-DhogFeD7.js.br +0 -0
  520. package/payload/server/public/assets/chunk-OYMX7WX6-DhogFeD7.js.gz +0 -0
  521. package/payload/server/public/assets/chunk-QZHKN3VN-DnqqL1de.js +0 -1
  522. package/payload/server/public/assets/chunk-QZHKN3VN-DnqqL1de.js.br +0 -0
  523. package/payload/server/public/assets/chunk-QZHKN3VN-DnqqL1de.js.gz +0 -0
  524. package/payload/server/public/assets/chunk-U2HBQHQK-CeaRXuiO.js.br +0 -0
  525. package/payload/server/public/assets/chunk-U2HBQHQK-CeaRXuiO.js.gz +0 -0
  526. package/payload/server/public/assets/chunk-X2U36JSP-BqxXeOqf.js.br +0 -0
  527. package/payload/server/public/assets/chunk-X2U36JSP-BqxXeOqf.js.gz +0 -0
  528. package/payload/server/public/assets/chunk-XPW4576I-DtqJwn2x.js.br +0 -0
  529. package/payload/server/public/assets/chunk-XPW4576I-DtqJwn2x.js.gz +0 -0
  530. package/payload/server/public/assets/chunk-YZCP3GAM-COBlEwQw.js.br +0 -0
  531. package/payload/server/public/assets/chunk-YZCP3GAM-COBlEwQw.js.gz +0 -0
  532. package/payload/server/public/assets/chunk-ZZ45TVLE-CcL088y6.js.br +0 -0
  533. package/payload/server/public/assets/chunk-ZZ45TVLE-CcL088y6.js.gz +0 -0
  534. package/payload/server/public/assets/classDiagram-6PBFFD2Q-Bc3P4dpc.js +0 -1
  535. package/payload/server/public/assets/classDiagram-6PBFFD2Q-Bc3P4dpc.js.br +0 -0
  536. package/payload/server/public/assets/classDiagram-6PBFFD2Q-Bc3P4dpc.js.gz +0 -0
  537. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DgEF_rR_.js +0 -1
  538. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DgEF_rR_.js.br +0 -0
  539. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DgEF_rR_.js.gz +0 -0
  540. package/payload/server/public/assets/clock-Yqf7Ke7I.js +0 -1
  541. package/payload/server/public/assets/clock-Yqf7Ke7I.js.br +0 -0
  542. package/payload/server/public/assets/clock-Yqf7Ke7I.js.gz +0 -0
  543. package/payload/server/public/assets/clone-B3vq32j7.js +0 -1
  544. package/payload/server/public/assets/cose-bilkent-S5V4N54A-kEHVkDNn.js.br +0 -0
  545. package/payload/server/public/assets/cose-bilkent-S5V4N54A-kEHVkDNn.js.gz +0 -0
  546. package/payload/server/public/assets/dagre-D2wUw1zC.js.br +0 -0
  547. package/payload/server/public/assets/dagre-D2wUw1zC.js.gz +0 -0
  548. package/payload/server/public/assets/dagre-KV5264BT-BWfTDwEs.js.br +0 -0
  549. package/payload/server/public/assets/dagre-KV5264BT-BWfTDwEs.js.gz +0 -0
  550. package/payload/server/public/assets/data-RmnKj5nC.js +0 -1
  551. package/payload/server/public/assets/data-RmnKj5nC.js.br +0 -2
  552. package/payload/server/public/assets/data-RmnKj5nC.js.gz +0 -0
  553. package/payload/server/public/assets/diagram-5BDNPKRD-Tl9dS8w0.js.br +0 -0
  554. package/payload/server/public/assets/diagram-5BDNPKRD-Tl9dS8w0.js.gz +0 -0
  555. package/payload/server/public/assets/diagram-G4DWMVQ6-CeSe6TMu.js.br +0 -0
  556. package/payload/server/public/assets/diagram-G4DWMVQ6-CeSe6TMu.js.gz +0 -0
  557. package/payload/server/public/assets/diagram-MMDJMWI5-DYBNJCmk.js.br +0 -0
  558. package/payload/server/public/assets/diagram-MMDJMWI5-DYBNJCmk.js.gz +0 -0
  559. package/payload/server/public/assets/diagram-TYMM5635-BmpUGltx.js.br +0 -0
  560. package/payload/server/public/assets/diagram-TYMM5635-BmpUGltx.js.gz +0 -0
  561. package/payload/server/public/assets/erDiagram-SMLLAGMA-DuwuNGqx.js.br +0 -0
  562. package/payload/server/public/assets/erDiagram-SMLLAGMA-DuwuNGqx.js.gz +0 -0
  563. package/payload/server/public/assets/file-download-CiGklOfA.js.br +0 -0
  564. package/payload/server/public/assets/file-download-CiGklOfA.js.gz +0 -0
  565. package/payload/server/public/assets/file-text-XjJPULAZ.js.br +0 -0
  566. package/payload/server/public/assets/file-text-XjJPULAZ.js.gz +0 -0
  567. package/payload/server/public/assets/flatten-Bu-b1uTY.js.br +0 -0
  568. package/payload/server/public/assets/flatten-Bu-b1uTY.js.gz +0 -0
  569. package/payload/server/public/assets/flowDiagram-DWJPFMVM-Bpp8P6Ba.js.br +0 -0
  570. package/payload/server/public/assets/flowDiagram-DWJPFMVM-Bpp8P6Ba.js.gz +0 -0
  571. package/payload/server/public/assets/ganttDiagram-T4ZO3ILL-CE6ppjB4.js.br +0 -0
  572. package/payload/server/public/assets/ganttDiagram-T4ZO3ILL-CE6ppjB4.js.gz +0 -0
  573. package/payload/server/public/assets/gitGraph-7Q5UKJZL-B0OUwOUx.js +0 -1
  574. package/payload/server/public/assets/gitGraph-7Q5UKJZL-B0OUwOUx.js.br +0 -0
  575. package/payload/server/public/assets/gitGraphDiagram-UUTBAWPF-BdK1GjPr.js.br +0 -0
  576. package/payload/server/public/assets/gitGraphDiagram-UUTBAWPF-BdK1GjPr.js.gz +0 -0
  577. package/payload/server/public/assets/graph-BjHJ0z_6.js.br +0 -0
  578. package/payload/server/public/assets/graph-BjHJ0z_6.js.gz +0 -0
  579. package/payload/server/public/assets/graph-labels-D-0u37KA.js.br +0 -0
  580. package/payload/server/public/assets/graph-labels-D-0u37KA.js.gz +0 -0
  581. package/payload/server/public/assets/graphlib-CHEXylyU.js.br +0 -0
  582. package/payload/server/public/assets/graphlib-CHEXylyU.js.gz +0 -0
  583. package/payload/server/public/assets/info-OMHHGYJF-C_8TwPDe.js +0 -1
  584. package/payload/server/public/assets/info-OMHHGYJF-C_8TwPDe.js.br +0 -0
  585. package/payload/server/public/assets/infoDiagram-42DDH7IO-msfwyvbV.js +0 -2
  586. package/payload/server/public/assets/infoDiagram-42DDH7IO-msfwyvbV.js.br +0 -0
  587. package/payload/server/public/assets/infoDiagram-42DDH7IO-msfwyvbV.js.gz +0 -0
  588. package/payload/server/public/assets/isEmpty-CjH0UASp.js.br +0 -0
  589. package/payload/server/public/assets/isEmpty-CjH0UASp.js.gz +0 -0
  590. package/payload/server/public/assets/ishikawaDiagram-UXIWVN3A-CgkVZ4-3.js.br +0 -0
  591. package/payload/server/public/assets/ishikawaDiagram-UXIWVN3A-CgkVZ4-3.js.gz +0 -0
  592. package/payload/server/public/assets/journeyDiagram-VCZTEJTY-ByUPv8q6.js.br +0 -0
  593. package/payload/server/public/assets/journeyDiagram-VCZTEJTY-ByUPv8q6.js.gz +0 -0
  594. package/payload/server/public/assets/kanban-definition-6JOO6SKY-CFinqhpu.js.br +0 -0
  595. package/payload/server/public/assets/kanban-definition-6JOO6SKY-CFinqhpu.js.gz +0 -0
  596. package/payload/server/public/assets/line-Y4ns5Ghi.js.br +0 -0
  597. package/payload/server/public/assets/line-Y4ns5Ghi.js.gz +0 -0
  598. package/payload/server/public/assets/linear-l39GooQ5.js.br +0 -0
  599. package/payload/server/public/assets/linear-l39GooQ5.js.gz +0 -0
  600. package/payload/server/public/assets/maximize-2-BJ9S-nfS.js.br +0 -0
  601. package/payload/server/public/assets/maximize-2-BJ9S-nfS.js.gz +0 -0
  602. package/payload/server/public/assets/mermaid-parser.core-5w0T1dRj.js.br +0 -0
  603. package/payload/server/public/assets/mermaid-parser.core-5w0T1dRj.js.gz +0 -0
  604. package/payload/server/public/assets/mermaid.core-DBADY5VW.js.br +0 -0
  605. package/payload/server/public/assets/mermaid.core-DBADY5VW.js.gz +0 -0
  606. package/payload/server/public/assets/mindmap-definition-QFDTVHPH-rHz37loq.js.br +0 -0
  607. package/payload/server/public/assets/mindmap-definition-QFDTVHPH-rHz37loq.js.gz +0 -0
  608. package/payload/server/public/assets/operator-Cay4rOOK.js +0 -1
  609. package/payload/server/public/assets/operator-Cay4rOOK.js.br +0 -0
  610. package/payload/server/public/assets/operator-Cay4rOOK.js.gz +0 -0
  611. package/payload/server/public/assets/ordinal-D6D6WcTC.js.br +0 -0
  612. package/payload/server/public/assets/ordinal-D6D6WcTC.js.gz +0 -0
  613. package/payload/server/public/assets/packet-4T2RLAQJ-CCQdbIqO.js +0 -1
  614. package/payload/server/public/assets/packet-4T2RLAQJ-CCQdbIqO.js.br +0 -0
  615. package/payload/server/public/assets/page-Cci_j_y7.js +0 -32
  616. package/payload/server/public/assets/page-Cci_j_y7.js.br +0 -0
  617. package/payload/server/public/assets/page-Cci_j_y7.js.gz +0 -0
  618. package/payload/server/public/assets/page-shuh4ES9.js +0 -1
  619. package/payload/server/public/assets/page-shuh4ES9.js.br +0 -0
  620. package/payload/server/public/assets/page-shuh4ES9.js.gz +0 -0
  621. package/payload/server/public/assets/pdf-render-BSgBp8Fr.js.br +0 -0
  622. package/payload/server/public/assets/pdf-render-BSgBp8Fr.js.gz +0 -0
  623. package/payload/server/public/assets/pie-ZZUOXDRM-Bdw3Iqs7.js +0 -1
  624. package/payload/server/public/assets/pie-ZZUOXDRM-Bdw3Iqs7.js.br +0 -0
  625. package/payload/server/public/assets/pieDiagram-DEJITSTG-as0e_DSH.js.br +0 -0
  626. package/payload/server/public/assets/pieDiagram-DEJITSTG-as0e_DSH.js.gz +0 -0
  627. package/payload/server/public/assets/public-BbJcQGsO.js.br +0 -0
  628. package/payload/server/public/assets/public-BbJcQGsO.js.gz +0 -0
  629. package/payload/server/public/assets/quadrantDiagram-34T5L4WZ-B4t8HO9J.js.br +0 -0
  630. package/payload/server/public/assets/quadrantDiagram-34T5L4WZ-B4t8HO9J.js.gz +0 -0
  631. package/payload/server/public/assets/radar-PYXPWWZC-D3FUdA3r.js +0 -1
  632. package/payload/server/public/assets/radar-PYXPWWZC-D3FUdA3r.js.br +0 -0
  633. package/payload/server/public/assets/reduce-BtXXK8Ma.js.br +0 -0
  634. package/payload/server/public/assets/reduce-BtXXK8Ma.js.gz +0 -0
  635. package/payload/server/public/assets/requirementDiagram-MS252O5E-yxh30zHX.js.br +0 -0
  636. package/payload/server/public/assets/requirementDiagram-MS252O5E-yxh30zHX.js.gz +0 -0
  637. package/payload/server/public/assets/rotate-ccw-jeSVwUAv.js.br +0 -0
  638. package/payload/server/public/assets/rotate-ccw-jeSVwUAv.js.gz +0 -0
  639. package/payload/server/public/assets/routines-D3M1Wh3a.js.br +0 -0
  640. package/payload/server/public/assets/routines-D3M1Wh3a.js.gz +0 -0
  641. package/payload/server/public/assets/sankeyDiagram-XADWPNL6-j-k9Wfty.js.br +0 -0
  642. package/payload/server/public/assets/sankeyDiagram-XADWPNL6-j-k9Wfty.js.gz +0 -0
  643. package/payload/server/public/assets/sequenceDiagram-FGHM5R23-DGLgcLhC.js.br +0 -0
  644. package/payload/server/public/assets/sequenceDiagram-FGHM5R23-DGLgcLhC.js.gz +0 -0
  645. package/payload/server/public/assets/skills-Bhej2ub1.js.br +0 -0
  646. package/payload/server/public/assets/skills-Bhej2ub1.js.gz +0 -0
  647. package/payload/server/public/assets/stateDiagram-FHFEXIEX-C9p1OUMI.js.br +0 -0
  648. package/payload/server/public/assets/stateDiagram-FHFEXIEX-C9p1OUMI.js.gz +0 -0
  649. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Bf808Apk.js +0 -1
  650. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Bf808Apk.js.br +0 -0
  651. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Bf808Apk.js.gz +0 -0
  652. package/payload/server/public/assets/tasks-qY-dtOI2.js +0 -1
  653. package/payload/server/public/assets/tasks-qY-dtOI2.js.br +0 -0
  654. package/payload/server/public/assets/tasks-qY-dtOI2.js.gz +0 -0
  655. package/payload/server/public/assets/time-entry-format-r5UY9rjG.js.br +0 -0
  656. package/payload/server/public/assets/time-entry-format-r5UY9rjG.js.gz +0 -0
  657. package/payload/server/public/assets/timeline-definition-GMOUNBTQ-B1g7pgkH.js.br +0 -0
  658. package/payload/server/public/assets/timeline-definition-GMOUNBTQ-B1g7pgkH.js.gz +0 -0
  659. package/payload/server/public/assets/treeView-SZITEDCU-DetKw0D0.js +0 -1
  660. package/payload/server/public/assets/treeView-SZITEDCU-DetKw0D0.js.br +0 -0
  661. package/payload/server/public/assets/treemap-W4RFUUIX-zQkIANxW.js +0 -1
  662. package/payload/server/public/assets/treemap-W4RFUUIX-zQkIANxW.js.br +0 -0
  663. package/payload/server/public/assets/triangle-alert--PCKaewD.js.br +0 -2
  664. package/payload/server/public/assets/triangle-alert--PCKaewD.js.gz +0 -0
  665. package/payload/server/public/assets/useCopyFeedback-Dg5lNgqH.js.br +0 -0
  666. package/payload/server/public/assets/useCopyFeedback-Dg5lNgqH.js.gz +0 -0
  667. package/payload/server/public/assets/useSubAccountSwitcher-BYfe9vj8.css +0 -1
  668. package/payload/server/public/assets/useSubAccountSwitcher-BYfe9vj8.css.br +0 -0
  669. package/payload/server/public/assets/useSubAccountSwitcher-BYfe9vj8.css.gz +0 -0
  670. package/payload/server/public/assets/useSubAccountSwitcher-CnpeWIYq.js +0 -14
  671. package/payload/server/public/assets/useSubAccountSwitcher-CnpeWIYq.js.br +0 -0
  672. package/payload/server/public/assets/useSubAccountSwitcher-CnpeWIYq.js.gz +0 -0
  673. package/payload/server/public/assets/useVoiceRecorder-BY6ZsGMH.js.br +0 -0
  674. package/payload/server/public/assets/useVoiceRecorder-BY6ZsGMH.js.gz +0 -0
  675. package/payload/server/public/assets/vennDiagram-DHZGUBPP-D2ZjFfh4.js.br +0 -0
  676. package/payload/server/public/assets/vennDiagram-DHZGUBPP-D2ZjFfh4.js.gz +0 -0
  677. package/payload/server/public/assets/wardley-RL74JXVD-DkQV3DvB.js +0 -1
  678. package/payload/server/public/assets/wardley-RL74JXVD-DkQV3DvB.js.br +0 -0
  679. package/payload/server/public/assets/wardleyDiagram-NUSXRM2D-BFAhfkD8.js.br +0 -0
  680. package/payload/server/public/assets/wardleyDiagram-NUSXRM2D-BFAhfkD8.js.gz +0 -0
  681. package/payload/server/public/assets/wrench-Bw1FMolk.js.br +0 -0
  682. package/payload/server/public/assets/wrench-Bw1FMolk.js.gz +0 -0
  683. package/payload/server/public/assets/xychartDiagram-5P7HB3ND-Dt94h2RQ.js.br +0 -0
  684. package/payload/server/public/assets/xychartDiagram-5P7HB3ND-Dt94h2RQ.js.gz +0 -0
  685. /package/payload/server/public/assets/{_baseFor-B12He5Rp.js → _baseFor-BApe6Tla.js} +0 -0
  686. /package/payload/server/public/assets/{_baseFor-B12He5Rp.js.br → _baseFor-BApe6Tla.js.br} +0 -0
  687. /package/payload/server/public/assets/{_baseFor-B12He5Rp.js.gz → _baseFor-BApe6Tla.js.gz} +0 -0
  688. /package/payload/server/public/assets/{array-DO1uCttT.js → array-eiH4WfvY.js} +0 -0
  689. /package/payload/server/public/assets/{array-DO1uCttT.js.br → array-eiH4WfvY.js.br} +0 -0
  690. /package/payload/server/public/assets/{cytoscape.esm-DFn2foqy.js → cytoscape.esm-BZ6NYo0w.js} +0 -0
  691. /package/payload/server/public/assets/{cytoscape.esm-DFn2foqy.js.br → cytoscape.esm-BZ6NYo0w.js.br} +0 -0
  692. /package/payload/server/public/assets/{cytoscape.esm-DFn2foqy.js.gz → cytoscape.esm-BZ6NYo0w.js.gz} +0 -0
  693. /package/payload/server/public/assets/{defaultLocale-ieI3yFoA.js → defaultLocale-DWHqsa6O.js} +0 -0
  694. /package/payload/server/public/assets/{defaultLocale-ieI3yFoA.js.br → defaultLocale-DWHqsa6O.js.br} +0 -0
  695. /package/payload/server/public/assets/{defaultLocale-ieI3yFoA.js.gz → defaultLocale-DWHqsa6O.js.gz} +0 -0
  696. /package/payload/server/public/assets/{dist-DlU7AEeD.js → dist-IoQuidkp.js} +0 -0
  697. /package/payload/server/public/assets/{dist-DlU7AEeD.js.br → dist-IoQuidkp.js.br} +0 -0
  698. /package/payload/server/public/assets/{dist-DlU7AEeD.js.gz → dist-IoQuidkp.js.gz} +0 -0
  699. /package/payload/server/public/assets/{init-BCRlEgNP.js → init-BdkYWjJJ.js} +0 -0
  700. /package/payload/server/public/assets/{init-BCRlEgNP.js.br → init-BdkYWjJJ.js.br} +0 -0
  701. /package/payload/server/public/assets/{init-BCRlEgNP.js.gz → init-BdkYWjJJ.js.gz} +0 -0
  702. /package/payload/server/public/assets/{katex-gkTaZgi6.js → katex-BCzoGtFh.js} +0 -0
  703. /package/payload/server/public/assets/{katex-gkTaZgi6.js.br → katex-BCzoGtFh.js.br} +0 -0
  704. /package/payload/server/public/assets/{katex-gkTaZgi6.js.gz → katex-BCzoGtFh.js.gz} +0 -0
  705. /package/payload/server/public/assets/{path-DTmzQFjQ.js → path-DY2qBuPM.js} +0 -0
  706. /package/payload/server/public/assets/{path-DTmzQFjQ.js.br → path-DY2qBuPM.js.br} +0 -0
  707. /package/payload/server/public/assets/{path-DTmzQFjQ.js.gz → path-DY2qBuPM.js.gz} +0 -0
  708. /package/payload/server/public/assets/{preload-helper-eAV8hweq.js → preload-helper-3YNEDsJZ.js} +0 -0
  709. /package/payload/server/public/assets/{preload-helper-eAV8hweq.js.br → preload-helper-3YNEDsJZ.js.br} +0 -0
  710. /package/payload/server/public/assets/{preload-helper-eAV8hweq.js.gz → preload-helper-3YNEDsJZ.js.gz} +0 -0
  711. /package/payload/server/public/assets/{rough.esm-BFJ-MgcB.js → rough.esm-ec8xsRC7.js} +0 -0
  712. /package/payload/server/public/assets/{rough.esm-BFJ-MgcB.js.br → rough.esm-ec8xsRC7.js.br} +0 -0
  713. /package/payload/server/public/assets/{rough.esm-BFJ-MgcB.js.gz → rough.esm-ec8xsRC7.js.gz} +0 -0
  714. /package/payload/server/public/assets/{src-9CNk4JU0.js → src-C-STKunZ.js} +0 -0
  715. /package/payload/server/public/assets/{src-9CNk4JU0.js.br → src-C-STKunZ.js.br} +0 -0
  716. /package/payload/server/public/assets/{src-9CNk4JU0.js.gz → src-C-STKunZ.js.gz} +0 -0
@@ -0,0 +1,16 @@
1
+ export declare const MCP_LOG_PREFIX = "mcp-";
2
+ /**
3
+ * Most files one key may fan out to. The key is a substring match, so a short
4
+ * key matches many names — the measured device dir holds 552 `mcp-*` files.
5
+ * A truncated result always names the total, so the cap is never silent.
6
+ */
7
+ export declare const MCP_KEY_MATCH_CAP = 20;
8
+ /**
9
+ * Tail every `mcp-*.log` in `mcpLogDir` whose FILENAME contains `sessionKey`,
10
+ * up to `MCP_KEY_MATCH_CAP` files. An 8-character key prefix matches a
11
+ * filename carrying the full session id.
12
+ */
13
+ export declare function readMcpLogsByKey(mcpLogDir: string, sessionKey: string, lines: number): string;
14
+ /** Tail the most recently modified `mcp-*.log` in `mcpLogDir`. */
15
+ export declare function readLatestMcpLog(mcpLogDir: string, lines: number): string;
16
+ //# sourceMappingURL=logs-read-mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs-read-mcp.d.ts","sourceRoot":"","sources":["../../src/tools/logs-read-mcp.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,cAAc,SAAS,CAAC;AAErC;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAcpC;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAmB7F;AAED,kEAAkE;AAClE,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAazE"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * logs-read type=mcp — resolution and tail.
3
+ *
4
+ * The MCP stderr sink is written by `lib/mcp-spawn-tee` (src/index.ts:60-65)
5
+ * as `${LOG_DIR}/mcp-<server>-<sessionId>.log`, where that LOG_DIR is the
6
+ * session manager's `config.persistDir/logs` — `~/.<brand>/logs`, the admin
7
+ * MCP's CONFIG_DIR. It is NOT the per-account log dir, which is where
8
+ * logs-read looked until Task 2168.
9
+ *
10
+ * The session key lives in the FILENAME. No line inside the file carries it,
11
+ * so a content grep — the strategy every other per-session type uses —
12
+ * returns nothing here however the directory is resolved.
13
+ *
14
+ * Caller supplies the directory; this module never resolves one itself.
15
+ */
16
+ import { execFileSync } from "node:child_process";
17
+ import { existsSync, readdirSync, statSync } from "node:fs";
18
+ import { resolve } from "node:path";
19
+ export const MCP_LOG_PREFIX = "mcp-";
20
+ /**
21
+ * Most files one key may fan out to. The key is a substring match, so a short
22
+ * key matches many names — the measured device dir holds 552 `mcp-*` files.
23
+ * A truncated result always names the total, so the cap is never silent.
24
+ */
25
+ export const MCP_KEY_MATCH_CAP = 20;
26
+ function isMcpLog(file) {
27
+ return file.startsWith(MCP_LOG_PREFIX) && file.endsWith(".log");
28
+ }
29
+ function missingDir(mcpLogDir) {
30
+ return `No MCP logs on this install yet (resolved dir does not exist on disk): ${mcpLogDir}. MCP server stderr is teed there on the first plugin spawn.`;
31
+ }
32
+ function tail(filePath, lines) {
33
+ return execFileSync("tail", ["-n", String(lines), filePath], { timeout: 5000 }).toString();
34
+ }
35
+ /**
36
+ * Tail every `mcp-*.log` in `mcpLogDir` whose FILENAME contains `sessionKey`,
37
+ * up to `MCP_KEY_MATCH_CAP` files. An 8-character key prefix matches a
38
+ * filename carrying the full session id.
39
+ */
40
+ export function readMcpLogsByKey(mcpLogDir, sessionKey, lines) {
41
+ if (!existsSync(mcpLogDir))
42
+ return missingDir(mcpLogDir);
43
+ const matches = readdirSync(mcpLogDir)
44
+ .filter(f => isMcpLog(f) && f.includes(sessionKey))
45
+ .sort();
46
+ if (matches.length === 0) {
47
+ return `No ${MCP_LOG_PREFIX}*.log filename contains session key "${sessionKey}" (resolved dir: ${mcpLogDir}, prefix: ${MCP_LOG_PREFIX}). The key is matched against the FILENAME, not the file contents — MCP log lines carry no session key.`;
48
+ }
49
+ const shown = matches.slice(0, MCP_KEY_MATCH_CAP);
50
+ const header = matches.length > shown.length
51
+ ? `# MCP logs for session key: ${sessionKey}\n${matches.length} filenames matched, showing the first ${shown.length} — narrow the key to see the rest.`
52
+ : `# MCP logs for session key: ${sessionKey}`;
53
+ const sections = shown.map(file => `## ${file}\n${tail(resolve(mcpLogDir, file), lines)}`);
54
+ return `${header}\n\n${sections.join("\n\n")}`;
55
+ }
56
+ /** Tail the most recently modified `mcp-*.log` in `mcpLogDir`. */
57
+ export function readLatestMcpLog(mcpLogDir, lines) {
58
+ if (!existsSync(mcpLogDir))
59
+ return missingDir(mcpLogDir);
60
+ const match = readdirSync(mcpLogDir)
61
+ .filter(isMcpLog)
62
+ .map(file => ({ file, mtime: statSync(resolve(mcpLogDir, file)).mtimeMs }))
63
+ .sort((a, b) => b.mtime - a.mtime)[0];
64
+ if (!match) {
65
+ return `No log file found for type 'mcp' (resolved dir: ${mcpLogDir}, prefix: ${MCP_LOG_PREFIX})`;
66
+ }
67
+ return `# ${match.file}\n\n${tail(resolve(mcpLogDir, match.file), lines)}`;
68
+ }
69
+ //# sourceMappingURL=logs-read-mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs-read-mcp.js","sourceRoot":"","sources":["../../src/tools/logs-read-mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AAErC;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,UAAU,CAAC,SAAiB;IACnC,OAAO,0EAA0E,SAAS,8DAA8D,CAAC;AAC3J,CAAC;AAED,SAAS,IAAI,CAAC,QAAgB,EAAE,KAAa;IAC3C,OAAO,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC7F,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,UAAkB,EAAE,KAAa;IACnF,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;IAEzD,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC;SACnC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;SAClD,IAAI,EAAE,CAAC;IAEV,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,MAAM,cAAc,wCAAwC,UAAU,oBAAoB,SAAS,aAAa,cAAc,yGAAyG,CAAC;IACjP,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAClD,MAAM,MAAM,GACV,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;QAC3B,CAAC,CAAC,+BAA+B,UAAU,KAAK,OAAO,CAAC,MAAM,yCAAyC,KAAK,CAAC,MAAM,oCAAoC;QACvJ,CAAC,CAAC,+BAA+B,UAAU,EAAE,CAAC;IAElD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAC3F,OAAO,GAAG,MAAM,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACjD,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,KAAa;IAC/D,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;IAEzD,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC;SACjC,MAAM,CAAC,QAAQ,CAAC;SAChB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;SAC1E,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAExC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,mDAAmD,SAAS,aAAa,cAAc,GAAG,CAAC;IACpG,CAAC;IAED,OAAO,KAAK,KAAK,CAAC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;AAC7E,CAAC"}
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: platform-architecture
3
3
  description: Use when grounding any documented-surface claim about what SiteDesk ships — plugins, skills, specialists, install/deploy flows, internals. This is the install catalogue, not evidence of what is enabled on the current account. For install state on this account, call `capabilities-here`; for documented surface, cite the `Source:` URL inline.
4
- content-hash: sha256:15f533911e93c443dda2624cad785b44ee24ca5bcf5b992fbd96932226abd055
4
+ content-hash: sha256:7106e5166b451f13c373e48b7eb6057846d8e385002c774fa6ba4db1b05aef6e
5
5
  brand: sitedesk-code
6
6
  product-name: SiteDesk
7
7
  ---
@@ -212,7 +212,7 @@ There is no dashboard, no settings panel, no menus. Everything is done through c
212
212
 
213
213
  The chat input auto-grows as you type — it expands to fit your message and shrinks back when you delete text. You can also drag the resize handle above the input to set a custom height.
214
214
 
215
- The admin interface is a three-pane layout: a sidebar on the left with navigation (Sessions, People, Agents, Projects, Tasks, Artefacts) and your recent conversations; the chat in the middle; and an artefact pane on the right that opens when you select a document, click a project, or open Browser, Data, or Graph from the menu, holding the surface side-by-side with the conversation so the chat stays live while you work in it. At the very top of the sidebar — above the nav rows — a borderless row holds two controls: a "+ New session" button on the left that spawns a fresh Claude Code session, and a Mode trigger on the right showing the current permission mode (Ask, Accept edits, Plan, or Auto). The sidebar's vertical order is: new-session strip first, then the nav (Sessions, People, Agents, Projects, Tasks, Artefacts), then the sessions list, then the footer. Both controls render as plain text-plus-icon affordances with no surrounding rectangle. The "+ New session" button is a text-width hit target — its clickable area is exactly the icon plus label, not the whole row — and shows no hover fill; the only hover feedback is the pointer cursor. The Mode trigger is pushed flush to the right edge of the row. Clicking the Mode trigger opens a popover downward from the row whose header reads "Mode" and lists the four permission modes with the current selection check-marked. The sidebar's nav rows swap the list view in place: Sessions shows recent conversations, Projects shows your active work projects, and Artefacts lists every KnowledgeDocument plus this account's agent templates (your admin agent's IDENTITY, SOUL, and KNOWLEDGE files plus one entry per enabled specialist). Each recent session row carries a three-state indicator: three pulsing dots when the session is busy (currently processing a turn), a solid sage dot when it is idle (live PTY waiting for input), and a hollow ring when it is archived (PTY exited, JSONL on disk for audit). The list itself splits into three views via a segmented control above the rows: **Active** shows every live session, **Archived** shows every JSONL on disk whose PTY has exited, and **All** shows both. The view choice persists across reloads. An "Include subagents" toggle inside the Active view surfaces specialist spawns (database-operator, premium-plugin agents, anything spawned with a `--agent` flag) which are hidden by default so the list reflects what you started directly. Each row also carries a small uppercase badge — `admin` for operator-driven sessions, the specialist name (for example `db-op`) for background work — so the source of any row is unambiguous at a glance. The People, Agents, and Tasks rows are graph shortcuts: clicking each opens the artefact-pane Graph filtered to every Person, every public Agent, or every Task in your account respectively, with no side-list, because the graph itself is the result. Public agents become first-class graph entities the moment you create them, with edges to their IDENTITY/SOUL/KNOWLEDGE files, edges to every knowledge document they have access to, and edges from every conversation they have handled, so a single Agents click reveals the whole shape of who knows what and who has been talking to whom. Click an artefact row to open the document. KnowledgeDocuments and your admin agent's templates are editable: type in the document and changes save automatically; specialist agent templates are read-only because they ship with SiteDesk and your edits would be overwritten on the next install. PDF artefacts render inline so you can read them without leaving the pane. If your browser doesn't have a built-in PDF viewer, a Download button appears instead. Artefacts that have no readable file backing them (orphan rows, files removed from disk, unsupported content types) show a one-line banner explaining the skip instead of opening to a blank pane. Click a project row to open the Graph view focused on that project's neighbourhood; clicking a second project swaps the focus rather than stacking on top. The sidebar's right edge is drag-resizable on every shell-hosted admin page (Sessions root, Chat, Graph, Browser, and Data): drag the handle to widen or narrow the sidebar, and your chosen width is remembered across reloads and shared across all of them. AdminShell mounts the drag handle itself, so every route that wraps its content in `<AdminShell>` gets sidebar resize for free; the handle does not render in the mobile drawer. The chat and artefact divider is also drag-resizable: drag the line between the columns to make either side wider; double-click it to reset to half of the available width (viewport minus sidebar), clamped to the chat and artefact min-width floors. Your chosen width is remembered across reloads. On wider screens (>1280px) all three panes are visible. The sidebar narrows at 1280px, the artefact pane hides at 1080px (Browser, Data, and Graph then open as full-window pages instead), and the sidebar collapses to a 56px icon rail at 820px. On every viewport the chat header reads left to right as a triptych: a dedicated sidebar toggle (the panel-right icon, which swaps to panel-right-open when the sidebar is showing), the brand mark next to the title in the centre, and the menu burger on the right. This header toggle is the sole sidebar-toggle button; the sidebar itself no longer carries a duplicate. The burger opens the navigation flyout: Dashboard, Data, Graph, Browser, and Chat at the top — Dashboard routes back to `/`, so every satellite page keeps a one-click way home, and the Chat item carries the Claude mark rather than a generic icon — then Public (the agents list) between the two dividers, and below the second divider the version row, Disconnect Claude, and Log out. Tap the sidebar toggle to show or hide the sidebar: on phones (<720px) it slides the drawer in or out, on wider screens it collapses or expands the sidebar column. The brand mark in the centre is decorative; clicks go through the dedicated toggle so the affordance is unambiguous. The drawer animation only fires on tap (220ms slide in or out); resizing your window across the 720px boundary snaps the layout without animation, so you never see a half-open flash. At ≤640px the session metadata pane stacks each label above its value instead of the desktop two-column grid, and the row of action buttons (Open in new tab / Download JSONL / View JSONL / Rename / Pin / Archive / End or Purge) collapses behind a single Actions trigger that opens a popover upward from the foot of the pane. Breakpoint summary: >1280px = full sidebar + chat + artefact pane (drag-resizable divider); 1280px→1080px = sidebar narrows; 1080px→820px = artefact pane hides (Browser/Data/Graph open as full-window pages instead); 820px→720px = sidebar collapses to 56px icon rail; ≤720px = sidebar becomes off-canvas drawer (vertical stack of nav, recents list, foot, the same shape as the desktop sidebar, just on top of the chat instead of beside it).
215
+ The admin interface is a three-pane layout: a sidebar on the left with navigation (Sessions, People, Agents, Projects, Tasks, Artefacts) and your recent conversations; the chat in the middle; and an artefact pane on the right that opens when you select a document, click a project, or open Browser, Data, or Graph from the menu, holding the surface side-by-side with the conversation so the chat stays live while you work in it. At the very top of the sidebar — above the nav rows — a borderless row holds two controls: a "+ New session" button on the left that spawns a fresh Claude Code session, and a Mode trigger on the right showing the current permission mode (Ask, Accept edits, Plan, or Auto). The sidebar's vertical order is: new-session strip first, then the nav (Sessions, People, Agents, Projects, Tasks, Artefacts), then the sessions list, then the footer. Both controls render as plain text-plus-icon affordances with no surrounding rectangle. The "+ New session" button is a text-width hit target — its clickable area is exactly the icon plus label, not the whole row — and shows no hover fill; the only hover feedback is the pointer cursor. The Mode trigger is pushed flush to the right edge of the row. Clicking the Mode trigger opens a popover downward from the row whose header reads "Mode" and lists the four permission modes with the current selection check-marked. The sidebar's nav rows swap the list view in place: Sessions shows recent conversations, Projects shows your active work projects, and Artefacts lists every KnowledgeDocument plus this account's agent templates (your admin agent's IDENTITY, SOUL, and KNOWLEDGE files plus one entry per enabled specialist). Each recent session row carries a three-state indicator: three pulsing dots when the session is busy (currently processing a turn), a solid sage dot when it is idle (live PTY waiting for input), and a hollow ring when it is archived (PTY exited, JSONL on disk for audit). The list itself splits into three views via a segmented control above the rows: **Active** shows every live session, **Archived** shows every JSONL on disk whose PTY has exited, and **All** shows both. The view choice persists across reloads. An "Include subagents" toggle inside the Active view surfaces specialist spawns (database-operator, premium-plugin agents, anything spawned with a `--agent` flag) which are hidden by default so the list reflects what you started directly. Each row also carries a small uppercase badge — `admin` for operator-driven sessions, the specialist name (for example `db-op`) for background work — so the source of any row is unambiguous at a glance. The People, Agents, and Tasks rows are graph shortcuts: clicking each opens the artefact-pane Graph filtered to every Person, every public Agent, or every Task in your account respectively, with no side-list, because the graph itself is the result. Public agents become first-class graph entities the moment you create them, with edges to their IDENTITY/SOUL/KNOWLEDGE files, edges to every knowledge document they have access to, and edges from every conversation they have handled, so a single Agents click reveals the whole shape of who knows what and who has been talking to whom. Click an artefact row to open the document. KnowledgeDocuments and your admin agent's templates are editable: type in the document and changes save automatically; specialist agent templates are read-only because they ship with SiteDesk and your edits would be overwritten on the next install. PDF artefacts render inline so you can read them without leaving the pane. If your browser doesn't have a built-in PDF viewer, a Download button appears instead. Artefacts that have no readable file backing them (orphan rows, files removed from disk, unsupported content types) show a one-line banner explaining the skip instead of opening to a blank pane. Click a project row to open the Graph view focused on that project's neighbourhood; clicking a second project swaps the focus rather than stacking on top. The sidebar's right edge is drag-resizable on every shell-hosted admin page (Sessions root, Chat, Graph, Browser, and Data): drag the handle to widen or narrow the sidebar, and your chosen width is remembered across reloads and shared across all of them. AdminShell mounts the drag handle itself, so every route that wraps its content in `<AdminShell>` gets sidebar resize for free; the handle does not render in the mobile drawer. The chat and artefact divider is also drag-resizable: drag the line between the columns to make either side wider; double-click it to reset to half of the available width (viewport minus sidebar), clamped to the chat and artefact min-width floors. Your chosen width is remembered across reloads. The conversation column on the Chat page has its own width control: a small handle sits half way up the page just inside each side of the column, and dragging either one widens or narrows the reading measure. The column stays centred, so both handles do the same thing — dragging the left one out and the right one out by the same distance give the same width. It will not go below its default 760px and will not go wider than the chat panel itself; the messages, the input box and the jump-to-latest button all move together. Double-click either handle to go back to 760px. Your chosen width is remembered across reloads. The handles do not appear on a phone (below 640px), where the conversation already fills the width. On wider screens (>1280px) all three panes are visible. The sidebar narrows at 1280px, the artefact pane hides at 1080px (Browser, Data, and Graph then open as full-window pages instead), and the sidebar collapses to a 56px icon rail at 820px. On every viewport the chat header reads left to right as a triptych: a dedicated sidebar toggle (the panel-right icon, which swaps to panel-right-open when the sidebar is showing), the brand mark next to the title in the centre, and the menu burger on the right. This header toggle is the sole sidebar-toggle button; the sidebar itself no longer carries a duplicate. The burger opens the navigation flyout: Dashboard, Data, Graph, Browser, and Chat at the top — Dashboard routes back to `/`, so every satellite page keeps a one-click way home, and the Chat item carries the Claude mark rather than a generic icon — then Public (the agents list) between the two dividers, and below the second divider the version row, Disconnect Claude, and Log out. Tap the sidebar toggle to show or hide the sidebar: on phones (<720px) it slides the drawer in or out, on wider screens it collapses or expands the sidebar column. The brand mark in the centre is decorative; clicks go through the dedicated toggle so the affordance is unambiguous. The drawer animation only fires on tap (220ms slide in or out); resizing your window across the 720px boundary snaps the layout without animation, so you never see a half-open flash. At ≤640px the session metadata pane stacks each label above its value instead of the desktop two-column grid, and the row of action buttons (Open in new tab / Download JSONL / View JSONL / Rename / Pin / Archive / End or Purge) collapses behind a single Actions trigger that opens a popover upward from the foot of the pane. Breakpoint summary: >1280px = full sidebar + chat + artefact pane (drag-resizable divider); 1280px→1080px = sidebar narrows; 1080px→820px = artefact pane hides (Browser/Data/Graph open as full-window pages instead); 820px→720px = sidebar collapses to 56px icon rail; ≤720px = sidebar becomes off-canvas drawer (vertical stack of nav, recents list, foot, the same shape as the desktop sidebar, just on top of the chat instead of beside it).
216
216
 
217
217
  Page titles are brand-aware: the browser tab shows your product name (e.g. `Real Agent` instead of `SiteDesk`) on every shell — chat, graph, and data — so a non-default brand never leaks the default name in tab strips or browser history.
218
218
 
@@ -510,7 +510,8 @@ There is no per-conversation stream log that interleaves MCP stderr with agent e
510
510
 
511
511
  **Retrieve MCP diagnostic lines for a conversation:**
512
512
 
513
- - `logs-read { type: "mcp" }` → tails the most recent `mcp-<name>-*.log` (per-server, keyed by session).
513
+ - `logs-read { type: "mcp" }` → tails the most recent `mcp-<name>-*.log` under `~/.<brand>/logs`, the platform config dir the tee writes to — not the account log dir, which holds no `mcp-*` at all.
514
+ - `logs-read { type: "mcp", sessionKey }` → tails every `mcp-*.log` whose **filename** carries that key, one section per server, up to 20 files; a truncated reply names how many matched so the cap is never silent. An 8-character key prefix matches the full session id in the name. The key is never matched against file contents, because MCP log lines carry no session key.
514
515
 
515
516
  ## Failure-path observability contract
516
517
 
@@ -3799,6 +3800,23 @@ pass's summary line, which is what makes the absence of a per-account line
3799
3800
  readable as "clean" rather than "never audited" — grep the summary line, not the
3800
3801
  per-account one, to confirm the check is running.
3801
3802
 
3803
+ **An unregistered file-write fence is the same shape of failure.** The
3804
+ account-dir path guard refuses a file edit whose resolved path lands inside
3805
+ another account's directory, for every session including a house-scoped one, and
3806
+ the Bash snapshot pair watches the account's own layout. All of them live in the
3807
+ account's `.claude/settings.json`, and a hook that is not registered there runs
3808
+ never and emits nothing, so the silence reads identical to a clean account. The
3809
+ same pass therefore checks the five registrations per account and reports any
3810
+ absence as
3811
+ `[fs-reconcile] op=hook-registration account=<id8> missing=<matcher>:<hook>,…`,
3812
+ with `hooks-missing=0 hooks-unaudited=0` on the summary line as the per-cycle
3813
+ proof the fence is wired everywhere. An account whose settings cannot be read
3814
+ counts as unaudited rather than clean, so an install where none of them can be
3815
+ read never reports itself as fenced. The refusal itself is agent-facing and lands
3816
+ in the session's own child log as
3817
+ `[fs-guard] blocked path=<abs> reason=cross-account target=<id8>`, not in
3818
+ `server.log`.
3819
+
3802
3820
  ### Graph
3803
3821
 
3804
3822
  | Mount | Purpose |
@@ -4009,15 +4027,72 @@ button** while it holds text — clicking empties the input, clears results
4009
4027
  | Mount | Purpose |
4010
4028
  |---|---|
4011
4029
  | `/browser` | `POST /launch` — launches Chromium on the resolved transport (native display or VNC) on demand. Backs the standalone `/browser` operator page. Lifeline tag `[admin/browser/launch]`. |
4030
+ | `/browser` | `GET /screencast-targets` — the page-target list behind the screencast viewer. Server-side hop to the CDP HTTP surface, which is loopback-only; filtered to `type:'page'`. `501` off the Linux display stack, `502` when Chromium is unreachable. |
4031
+ | `/browser` | `POST /screencast-event` — relay for the client half of the `[browser/screencast]` lifeline. Accepts a fixed op allowlist (`request`, `screencast-started`, `frame`, `input`, `teardown`); the server-side ops are refused so a client cannot emit a line that reads as a server decision. |
4012
4032
 
4013
4033
  The in-chat / artefact-embedded brand-VNC iframe components and the
4014
4034
  `/browser-iframe` event-beacon route were retired and stay
4015
4035
  deleted; the `/device-browser` (navigate-the-device-tab) route was also
4016
4036
  removed and is not restored. The standalone `/browser` page is a
4017
- sanctioned operator surface peer to `/graph` and `/data`: it embeds the live
4018
- VNC viewer (`/vnc-viewer.html`, popout `/vnc-popout.html`) and calls
4019
- `/api/admin/browser/launch`. On darwin (no noVNC asset) it shows a "VNC surface
4020
- not available" state.
4037
+ sanctioned operator surface peer to `/graph` and `/data`.
4038
+
4039
+ **The human view is a CDP screencast, not a framebuffer.** `/browser`
4040
+ renders `CdpScreencastSurface`: frames arrive as CDP `Page.screencastFrame` and
4041
+ paint to a canvas, and the operator's clicks, scrolling and typing leave as
4042
+ `Input.dispatch*`. Interaction therefore lands on page coordinates rather than
4043
+ screen pixels, and the view is one tab chosen from a strip rather than the whole
4044
+ X display. `VncSurface` and `/vnc-viewer.html` still exist and still work, but
4045
+ nothing reaches them, and deleting that stack is separate work.
4046
+
4047
+ **The Claude sign-in screen shows the same surface.** `AuthScreen` used to frame
4048
+ `/vnc-viewer.html` so the operator could complete the OAuth flow by looking at
4049
+ the browser on the X display; it now mounts `CdpScreencastSurface` too. Virtual
4050
+ mode runs Chromium headless (`--headless=new`, no `DISPLAY`), and a headless
4051
+ Chromium does not serve the ProcessSingleton socket — so the old mechanism, in
4052
+ which `claude auth login` exec'd `$BROWSER <url>` and a second Chromium handed
4053
+ the URL to the running instance, aborts with exit 21 and never opens the page.
4054
+ The wrapper `writeChromiumWrapper` generates therefore hands its URL to the
4055
+ running browser over CDP (`PUT /json/new`) instead of launching anything. Two
4056
+ details are load-bearing: the URL is percent-encoded into the query string,
4057
+ because that endpoint truncates a raw URL at its first `&`, and the id of the
4058
+ created target is recorded so the sign-in poll can tell the viewer which tab to
4059
+ show rather than leaving it on whichever tab CDP lists first.
4060
+
4061
+ The transport is `/cdp-screencast` on the dashboard's own host and port, claimed
4062
+ by the edge listener before its `forwardUpgrade` catch-all. It is gated by
4063
+ `canAccessAdmin` and rejected on operator and public hosts (`reason` values
4064
+ `origin-operator-host` and `origin-public-host`, mirroring the websockify
4065
+ rejection), and it validates the target id against a fixed 32-hex charset because
4066
+ that id is interpolated into the upstream request line. Before replaying the
4067
+ upgrade to Chromium it drops the admin session cookie and the browser `Origin`:
4068
+ Chromium is launched with no `--remote-allow-origins`, so its DevTools endpoint
4069
+ has no allowlisted origin, and the proxy has already checked same-origin itself.
4070
+
4071
+ Chromium's debugging port is bound to `127.0.0.1` on `${CDP_PORT}` and is never
4072
+ tunnelled or bound off-localhost. That port carries no authentication and total
4073
+ control of the browser, which is why the proxy is the only path to it. Per-brand
4074
+ isolation is the `CDP_PORT` import and nothing else, so two co-resident brands
4075
+ each view their own Chromium.
4076
+
4077
+ Off the Linux display stack, and whenever Chromium is unreachable, the surface
4078
+ renders an explicit unavailable state. That is deliberate rather than cosmetic: a
4079
+ canvas that never receives a frame is indistinguishable from a black desktop,
4080
+ where the iframe it replaced failed visibly.
4081
+
4082
+ Observability is `[browser/screencast]` correlated by `sid` across
4083
+ `request → gate → cdp-connected → screencast-started → frame → input → teardown
4084
+ → socket-closed`, plus `[cdp-ws-census] liveSockets=<N> sessions=<M>` on every
4085
+ open and close. Diagnostic path:
4086
+
4087
+ ```
4088
+ logs-read.sh | grep -E '\[browser/screencast\]|\[cdp-ws-census\]'
4089
+ ```
4090
+
4091
+ then filter to one `sid` for a whole session. Frame lines are sampled, so a
4092
+ frozen `seq` against a live socket is the frozen-viewer signature. `liveSockets`
4093
+ climbing while `sessions` stays flat is the leak signature: an operator tab that
4094
+ closes without a clean teardown emits no action log of its own, so the standing
4095
+ reconcile pass closes client-dead sockets and reports `op=orphan-reap closed=<N>`.
4021
4096
 
4022
4097
  ### Diagnostics
4023
4098
 
@@ -4318,6 +4393,55 @@ on every admin page; double-click resets to half the available width
4318
4393
  (viewport minus sidebar), clamped to the per-pane min-width floors. The
4319
4394
  chosen width is remembered across reloads.
4320
4395
 
4396
+ **The /chat reading measure is operator-set.** `--webchat-measure` was a fixed
4397
+ 760px; it is now the FLOOR of a range the operator drags, written inline on
4398
+ `.webchat-page` by `WebchatSplitter` so the message column, the composer and the
4399
+ jump-to-latest button — all three read the same property — stay aligned. Two
4400
+ handles, one just inside each column edge, vertically centred. The column is
4401
+ centre-aligned, so one symmetric rule drives both: `measure = 2 × |pointerX −
4402
+ panelCentreX|`, which is why the two handles are interchangeable. Envelope:
4403
+ 760px ≤ measure ≤ the chat panel's own width; double-click either handle to
4404
+ revert to 760px and clear the stored value; the measure persists in
4405
+ `localStorage` under `maxy-webchat-measure-px` and re-clamps on window resize and
4406
+ on any panel-width change (sidebar drag, artefact open/close). No handle renders
4407
+ below a 640px viewport, where the media query already gives the column the full
4408
+ width. A measure wider than its panel does not overflow — the column just fills
4409
+ the panel — so that state emits nothing on its own; the standing check is
4410
+ `[admin-ui] op=webchat-measure-audit measurePx= panelPx= availPx= columnPx=
4411
+ handles= governed= fit=`, emitted on mount and on every re-clamp with identical
4412
+ consecutive readings suppressed. `columnPx` is the measured `.wa-thread-scroll`
4413
+ rect, not the property read back, so a property written to the wrong element
4414
+ shows as `measurePx=1200 columnPx=760`; `columnPx=-1` means no transcript is
4415
+ mounted (the greeting panel). `fit=false` or `handles=` disagreeing with
4416
+ `governed=` is the failure. A completed drag logs `[admin-ui] webchat-resize
4417
+ px=<final>`; a bare click logs nothing.
4418
+
4419
+ **All four resize handles draw one pill.** The `/chat` column pills,
4420
+ the composer grip, and the sidebar and artefact splitters each paint a 3px-thick,
4421
+ 48px-long rounded pill (32px long on the horizontal composer grip) in
4422
+ `--text-tertiary`, at half strength when idle and full strength on hover. Every
4423
+ box keeps its old size — 8px wide for the three vertical surfaces — so the pill
4424
+ got thinner and the grab target did not. Thickness and length come from
4425
+ `--resize-grip-thickness` / `--resize-grip-length`; the colour is read as
4426
+ `var(--text-tertiary)` on each pill rather than through an alias, because a
4427
+ `var()` inside a custom property is substituted on the element that DECLARES it,
4428
+ which would freeze the colour at the base `#9A9A9A` instead of the surface's own
4429
+ value (measured inside `.admin-shell`: `rgb(154,154,154)` through an alias,
4430
+ `rgb(138,133,122)` direct). A pill that never paints emits no event and does not
4431
+ reproduce on a re-open, and the measure audit above counts elements rather than
4432
+ pixels, so the standing check is `[admin-ui] op=resize-grip-audit
4433
+ surface=<column-left|column-right|sidebar> thicknessPx= lengthPx= color= opacity=
4434
+ boxPx= painted=`, emitted for the two column pills on mount and on every
4435
+ re-clamp, and for the sidebar splitter once per mount. `opacity=` is the strength
4436
+ the operator actually sees: the column pills carry it on the box and the two
4437
+ splitters carry it on the pill, and the line multiplies both, so a pill hidden at
4438
+ either level reports `opacity=0`.
4439
+ `painted=false` or `thicknessPx=0` means an invisible handle; `thicknessPx=8`
4440
+ means the box is painting and the pill rule never applied; a missing line for a
4441
+ surface that should be mounted is itself the alarm. `painted=false
4442
+ source=unavailable` is the expected reading wherever pseudo-element styles are
4443
+ not reported (the jsdom test environment), never a real zero.
4444
+
4321
4445
  ## Health vs version
4322
4446
 
4323
4447
  Two endpoints, two surfaces, two restart-survival roles:
@@ -5315,7 +5439,7 @@ For estate-agent client work surfaced on the `/tasks` operator page, `work-creat
5315
5439
 
5316
5440
  Two surfaces feed the gate. (1) **Workflow path:** `memory-write` accepts an optional `producedByTaskId` parameter. When set, an inbound `:PRODUCED` edge from that Task is composed into the write's relationships before the gate runs — the typical agent-side pattern is to call `work-create` at the start of an autonomous flow, capture `taskId`, and pass it as `producedByTaskId` on every subsequent `memory-write` for a gated label. The gate verifies Task and write share the same `accountId`; mismatch is rejected loud. (2) **Direct-ask path:** the admin server resolves the active `:AdminConversation`'s `sessionId` UUID and stamps it as `SESSION_NODE_ID` in the spawn env at PTY-spawn time. The same stamp propagates onto specialist subagent spawns the admin dispatches so listing-curator, content-producer, database-operator etc. inherit the same conversation anchor. The `contact-create` and `memory-write` wrappers call `injectConversationProvenance` (exported from [`@maxy/graph-write`](../../../lib/graph-write/src/conversation-provenance.ts)) which MATCHes `(c:Conversation {sessionId, accountId})` — account isolation is part of the natural key, not a separate gate — and prepends the synthetic `:PRODUCED` edge (composed by Neo4j elementId, which the helper reads off the MATCH). No agent-visible schema field changes. `memory-write` uses the env-stamp only as a fallback when `producedByTaskId` is unset; `contact-create` has no `producedByTaskId` parameter today and relies on the env-stamp alone. Autonomous (cron-driven) specialists with no parent conversation legitimately have no env-stamp; those must thread `producedByTaskId`.
5317
5441
 
5318
- A task also carries a **workspace** edge, distinct from the two provenance ones above: `(t:Task)-[:WORKED_ON_IN]->(c:Conversation)` is the session an operator works the task in, written only by the `/tasks` page Session control. `RAISED_DURING` and `PART_OF` say where a task was *raised*, so neither can answer "which chat do I continue this task in" — a task raised in an unrelated conversation would resume that one. At most one such edge exists per task: the control's link route deletes any edge to a different Conversation before merging the new one, which is how a resume the session manager redirected to a live fork re-points itself rather than staying on the dead source. The `:Task` also carries `sessionSpawnRequestedAt`, stamped before the spawn and removed when the link lands, so a session that was created but never linked is countable rather than invisible.
5442
+ A task also carries a **workspace** edge, distinct from the two provenance ones above: `(t:Task)-[:WORKED_ON_IN]->(c:Conversation)` is the session an operator works the task in, written only by the `/tasks` page Session control. `RAISED_DURING` and `PART_OF` say where a task was *raised*, so neither can answer "which chat do I continue this task in" — a task raised in an unrelated conversation would resume that one. At most one such edge exists per task: the control's link route deletes any edge to a different Conversation before merging the new one. The link route runs only on a first click, when the task has no session yet; a click on an already-linked task navigates straight to `/chat?session=<id>` and writes nothing, so an edge is never re-pointed after it is first written. The `:Task` also carries `sessionSpawnRequestedAt`, stamped before the spawn and removed when the link lands, so a session that was created but never linked is countable rather than invisible.
5319
5443
 
5320
5444
  Operator audit cyphers:
5321
5445
  - "What entities did this conversation's actions produce?" — `MATCH (c:AdminConversation {sessionId:$id})<-[:RAISED_DURING]-(t:Task)-[:PRODUCED]->(e) RETURN labels(e), e.name, t.kind, t.status`
@@ -5540,7 +5664,7 @@ The logs will show which service failed to start and why. Common causes:
5540
5664
  Each installed brand runs two per-brand `--user` systemd units (earlier platform fixes + — unit filenames are prefixed with the brand's `hostname` so two brands on the same device never share a unit file):
5541
5665
 
5542
5666
  - `{hostname}.service` — the admin + public HTTP server on `127.0.0.1:19201` (public port + 1). Restarted by the upgrade flow; short downtime is expected during steps 8→11 of an upgrade. An earlier fix: the unit carries two port env vars — `PORT=<public>` (canonical public port, read by the upgrade detector) and `MAXY_UI_INTERNAL_PORT=<public+1>` (the port maxy-ui actually binds).
5543
- - `{hostname}-edge.service` — the always-on public listener on the configured port (default 19200). Reverse-proxies HTTP to the main brand service and handles `/websockify` (VNC) WebSocket upgrades locally. An earlier fix: also hosts `/api/admin/actions/*` and `/api/admin/version*` — the Software Update modal's own routes — so the log stream survives the brand service's restart window. Does NOT restart during an upgrade — the browser WebSocket stays connected by construction. The operator views this VNC display in the admin UI via the standalone `/browser` page (peer to `/graph` and `/data`).
5667
+ - `{hostname}-edge.service` — the always-on public listener on the configured port (default 19200). Reverse-proxies HTTP to the main brand service and handles `/websockify` (VNC) WebSocket upgrades locally. An earlier fix: also hosts `/api/admin/actions/*` and `/api/admin/version*` — the Software Update modal's own routes — so the log stream survives the brand service's restart window. Does NOT restart during an upgrade — the browser WebSocket stays connected by construction. The operator views the device's Chromium in the admin UI via the standalone `/browser` page (peer to `/graph` and `/data`) and on the Claude sign-in screen; both render CDP screencast frames over `/cdp-screencast`, not the framebuffer. Virtual-mode Chromium is headless, so nothing renders onto the X display and the `/websockify` upgrade has no remaining consumer; deleting that stack is separate work.
5544
5668
 
5545
5669
  Upgrade and Cloudflare setup run as detached actions: `systemd-run --user` transient units per invocation with stdout+stderr persisted to `~/.maxy/logs/actions/<actionId>.log` and streamed to the UI via SSE. No boot-time service file exists for these.
5546
5670
 
@@ -9,6 +9,20 @@ Invoked by the admin agent directly.
9
9
 
10
10
  This is the platform's release timeline, newest first. Each entry shows the date it shipped and the version it shipped in, so you can tell the operator how current their install is. To compare, read the installed version from `capabilities-here` and match it against the versions below. Keep answers high level and in plain English; this is a summary, not a full commit log.
11
11
 
12
+ ## 2026-07-30 (0.1.528)
13
+
14
+ - Where two or more accounts share one device, the assistant can no longer edit or write files belonging to a different account. Every account is now checked for that protection being in place.
15
+ - Your account now has a designated address that outbound mail is sent from, so asking to send an email no longer gets refused for want of knowing which address to use. The mailbox status tells you which address is designated, or that none is.
16
+ - Saving a draft now tells you exactly which parts of your signature were added, and a signature stored as formatted text now actually appears on the message instead of being silently dropped.
17
+ - The remote browser now runs the browser itself rather than sharing a desktop screen, which means signing in to Claude inside it works. The drag handles for resizing panels are thinner and lighter, matching the reference design.
18
+
19
+ ## 2026-07-30 (0.1.527)
20
+
21
+ - The remote browser page now shows a live picture of the browser you can click and type into directly, replacing the old screen-sharing view.
22
+ - The Session button on an open task now opens the chat inside the dashboard instead of sending you out to a different site, and the new session starts already knowing the task's description and notes.
23
+ - Posting to LinkedIn from the browser extension works again. It was being stopped before the post ever left the browser, and when it failed it blamed the wrong thing; a missing permission and an unreachable device are now reported as the different problems they are.
24
+ - The page title is smaller and the chat column can be dragged wider or narrower.
25
+
12
26
  ## 2026-07-30 (0.1.526)
13
27
 
14
28
  - Asking WhatsApp to reconnect now answers as soon as the reconnect starts, instead of waiting on the old connection to die and leaving you with no reply at all.
@@ -573,6 +573,23 @@ pass's summary line, which is what makes the absence of a per-account line
573
573
  readable as "clean" rather than "never audited" — grep the summary line, not the
574
574
  per-account one, to confirm the check is running.
575
575
 
576
+ **An unregistered file-write fence is the same shape of failure.** The
577
+ account-dir path guard refuses a file edit whose resolved path lands inside
578
+ another account's directory, for every session including a house-scoped one, and
579
+ the Bash snapshot pair watches the account's own layout. All of them live in the
580
+ account's `.claude/settings.json`, and a hook that is not registered there runs
581
+ never and emits nothing, so the silence reads identical to a clean account. The
582
+ same pass therefore checks the five registrations per account and reports any
583
+ absence as
584
+ `[fs-reconcile] op=hook-registration account=<id8> missing=<matcher>:<hook>,…`,
585
+ with `hooks-missing=0 hooks-unaudited=0` on the summary line as the per-cycle
586
+ proof the fence is wired everywhere. An account whose settings cannot be read
587
+ counts as unaudited rather than clean, so an install where none of them can be
588
+ read never reports itself as fenced. The refusal itself is agent-facing and lands
589
+ in the session's own child log as
590
+ `[fs-guard] blocked path=<abs> reason=cross-account target=<id8>`, not in
591
+ `server.log`.
592
+
576
593
  ### Graph
577
594
 
578
595
  | Mount | Purpose |
@@ -783,15 +800,72 @@ button** while it holds text — clicking empties the input, clears results
783
800
  | Mount | Purpose |
784
801
  |---|---|
785
802
  | `/browser` | `POST /launch` — launches Chromium on the resolved transport (native display or VNC) on demand. Backs the standalone `/browser` operator page. Lifeline tag `[admin/browser/launch]`. |
803
+ | `/browser` | `GET /screencast-targets` — the page-target list behind the screencast viewer. Server-side hop to the CDP HTTP surface, which is loopback-only; filtered to `type:'page'`. `501` off the Linux display stack, `502` when Chromium is unreachable. |
804
+ | `/browser` | `POST /screencast-event` — relay for the client half of the `[browser/screencast]` lifeline. Accepts a fixed op allowlist (`request`, `screencast-started`, `frame`, `input`, `teardown`); the server-side ops are refused so a client cannot emit a line that reads as a server decision. |
786
805
 
787
806
  The in-chat / artefact-embedded brand-VNC iframe components and the
788
807
  `/browser-iframe` event-beacon route were retired and stay
789
808
  deleted; the `/device-browser` (navigate-the-device-tab) route was also
790
809
  removed and is not restored. The standalone `/browser` page is a
791
- sanctioned operator surface peer to `/graph` and `/data`: it embeds the live
792
- VNC viewer (`/vnc-viewer.html`, popout `/vnc-popout.html`) and calls
793
- `/api/admin/browser/launch`. On darwin (no noVNC asset) it shows a "VNC surface
794
- not available" state.
810
+ sanctioned operator surface peer to `/graph` and `/data`.
811
+
812
+ **The human view is a CDP screencast, not a framebuffer.** `/browser`
813
+ renders `CdpScreencastSurface`: frames arrive as CDP `Page.screencastFrame` and
814
+ paint to a canvas, and the operator's clicks, scrolling and typing leave as
815
+ `Input.dispatch*`. Interaction therefore lands on page coordinates rather than
816
+ screen pixels, and the view is one tab chosen from a strip rather than the whole
817
+ X display. `VncSurface` and `/vnc-viewer.html` still exist and still work, but
818
+ nothing reaches them, and deleting that stack is separate work.
819
+
820
+ **The Claude sign-in screen shows the same surface.** `AuthScreen` used to frame
821
+ `/vnc-viewer.html` so the operator could complete the OAuth flow by looking at
822
+ the browser on the X display; it now mounts `CdpScreencastSurface` too. Virtual
823
+ mode runs Chromium headless (`--headless=new`, no `DISPLAY`), and a headless
824
+ Chromium does not serve the ProcessSingleton socket — so the old mechanism, in
825
+ which `claude auth login` exec'd `$BROWSER <url>` and a second Chromium handed
826
+ the URL to the running instance, aborts with exit 21 and never opens the page.
827
+ The wrapper `writeChromiumWrapper` generates therefore hands its URL to the
828
+ running browser over CDP (`PUT /json/new`) instead of launching anything. Two
829
+ details are load-bearing: the URL is percent-encoded into the query string,
830
+ because that endpoint truncates a raw URL at its first `&`, and the id of the
831
+ created target is recorded so the sign-in poll can tell the viewer which tab to
832
+ show rather than leaving it on whichever tab CDP lists first.
833
+
834
+ The transport is `/cdp-screencast` on the dashboard's own host and port, claimed
835
+ by the edge listener before its `forwardUpgrade` catch-all. It is gated by
836
+ `canAccessAdmin` and rejected on operator and public hosts (`reason` values
837
+ `origin-operator-host` and `origin-public-host`, mirroring the websockify
838
+ rejection), and it validates the target id against a fixed 32-hex charset because
839
+ that id is interpolated into the upstream request line. Before replaying the
840
+ upgrade to Chromium it drops the admin session cookie and the browser `Origin`:
841
+ Chromium is launched with no `--remote-allow-origins`, so its DevTools endpoint
842
+ has no allowlisted origin, and the proxy has already checked same-origin itself.
843
+
844
+ Chromium's debugging port is bound to `127.0.0.1` on `${CDP_PORT}` and is never
845
+ tunnelled or bound off-localhost. That port carries no authentication and total
846
+ control of the browser, which is why the proxy is the only path to it. Per-brand
847
+ isolation is the `CDP_PORT` import and nothing else, so two co-resident brands
848
+ each view their own Chromium.
849
+
850
+ Off the Linux display stack, and whenever Chromium is unreachable, the surface
851
+ renders an explicit unavailable state. That is deliberate rather than cosmetic: a
852
+ canvas that never receives a frame is indistinguishable from a black desktop,
853
+ where the iframe it replaced failed visibly.
854
+
855
+ Observability is `[browser/screencast]` correlated by `sid` across
856
+ `request → gate → cdp-connected → screencast-started → frame → input → teardown
857
+ → socket-closed`, plus `[cdp-ws-census] liveSockets=<N> sessions=<M>` on every
858
+ open and close. Diagnostic path:
859
+
860
+ ```
861
+ logs-read.sh | grep -E '\[browser/screencast\]|\[cdp-ws-census\]'
862
+ ```
863
+
864
+ then filter to one `sid` for a whole session. Frame lines are sampled, so a
865
+ frozen `seq` against a live socket is the frozen-viewer signature. `liveSockets`
866
+ climbing while `sessions` stays flat is the leak signature: an operator tab that
867
+ closes without a clean teardown emits no action log of its own, so the standing
868
+ reconcile pass closes client-dead sockets and reports `op=orphan-reap closed=<N>`.
795
869
 
796
870
  ### Diagnostics
797
871
 
@@ -1092,6 +1166,55 @@ on every admin page; double-click resets to half the available width
1092
1166
  (viewport minus sidebar), clamped to the per-pane min-width floors. The
1093
1167
  chosen width is remembered across reloads.
1094
1168
 
1169
+ **The /chat reading measure is operator-set.** `--webchat-measure` was a fixed
1170
+ 760px; it is now the FLOOR of a range the operator drags, written inline on
1171
+ `.webchat-page` by `WebchatSplitter` so the message column, the composer and the
1172
+ jump-to-latest button — all three read the same property — stay aligned. Two
1173
+ handles, one just inside each column edge, vertically centred. The column is
1174
+ centre-aligned, so one symmetric rule drives both: `measure = 2 × |pointerX −
1175
+ panelCentreX|`, which is why the two handles are interchangeable. Envelope:
1176
+ 760px ≤ measure ≤ the chat panel's own width; double-click either handle to
1177
+ revert to 760px and clear the stored value; the measure persists in
1178
+ `localStorage` under `maxy-webchat-measure-px` and re-clamps on window resize and
1179
+ on any panel-width change (sidebar drag, artefact open/close). No handle renders
1180
+ below a 640px viewport, where the media query already gives the column the full
1181
+ width. A measure wider than its panel does not overflow — the column just fills
1182
+ the panel — so that state emits nothing on its own; the standing check is
1183
+ `[admin-ui] op=webchat-measure-audit measurePx= panelPx= availPx= columnPx=
1184
+ handles= governed= fit=`, emitted on mount and on every re-clamp with identical
1185
+ consecutive readings suppressed. `columnPx` is the measured `.wa-thread-scroll`
1186
+ rect, not the property read back, so a property written to the wrong element
1187
+ shows as `measurePx=1200 columnPx=760`; `columnPx=-1` means no transcript is
1188
+ mounted (the greeting panel). `fit=false` or `handles=` disagreeing with
1189
+ `governed=` is the failure. A completed drag logs `[admin-ui] webchat-resize
1190
+ px=<final>`; a bare click logs nothing.
1191
+
1192
+ **All four resize handles draw one pill.** The `/chat` column pills,
1193
+ the composer grip, and the sidebar and artefact splitters each paint a 3px-thick,
1194
+ 48px-long rounded pill (32px long on the horizontal composer grip) in
1195
+ `--text-tertiary`, at half strength when idle and full strength on hover. Every
1196
+ box keeps its old size — 8px wide for the three vertical surfaces — so the pill
1197
+ got thinner and the grab target did not. Thickness and length come from
1198
+ `--resize-grip-thickness` / `--resize-grip-length`; the colour is read as
1199
+ `var(--text-tertiary)` on each pill rather than through an alias, because a
1200
+ `var()` inside a custom property is substituted on the element that DECLARES it,
1201
+ which would freeze the colour at the base `#9A9A9A` instead of the surface's own
1202
+ value (measured inside `.admin-shell`: `rgb(154,154,154)` through an alias,
1203
+ `rgb(138,133,122)` direct). A pill that never paints emits no event and does not
1204
+ reproduce on a re-open, and the measure audit above counts elements rather than
1205
+ pixels, so the standing check is `[admin-ui] op=resize-grip-audit
1206
+ surface=<column-left|column-right|sidebar> thicknessPx= lengthPx= color= opacity=
1207
+ boxPx= painted=`, emitted for the two column pills on mount and on every
1208
+ re-clamp, and for the sidebar splitter once per mount. `opacity=` is the strength
1209
+ the operator actually sees: the column pills carry it on the box and the two
1210
+ splitters carry it on the pill, and the line multiplies both, so a pill hidden at
1211
+ either level reports `opacity=0`.
1212
+ `painted=false` or `thicknessPx=0` means an invisible handle; `thicknessPx=8`
1213
+ means the box is painting and the pill rule never applied; a missing line for a
1214
+ surface that should be mounted is itself the alarm. `painted=false
1215
+ source=unavailable` is the expected reading wherever pseudo-element styles are
1216
+ not reported (the jsdom test environment), never a real zero.
1217
+
1095
1218
  ## Health vs version
1096
1219
 
1097
1220
  Two endpoints, two surfaces, two restart-survival roles:
@@ -201,7 +201,7 @@ The logs will show which service failed to start and why. Common causes:
201
201
  Each installed brand runs two per-brand `--user` systemd units (earlier platform fixes + — unit filenames are prefixed with the brand's `hostname` so two brands on the same device never share a unit file):
202
202
 
203
203
  - `{hostname}.service` — the admin + public HTTP server on `127.0.0.1:19201` (public port + 1). Restarted by the upgrade flow; short downtime is expected during steps 8→11 of an upgrade. An earlier fix: the unit carries two port env vars — `PORT=<public>` (canonical public port, read by the upgrade detector) and `MAXY_UI_INTERNAL_PORT=<public+1>` (the port maxy-ui actually binds).
204
- - `{hostname}-edge.service` — the always-on public listener on the configured port (default 19200). Reverse-proxies HTTP to the main brand service and handles `/websockify` (VNC) WebSocket upgrades locally. An earlier fix: also hosts `/api/admin/actions/*` and `/api/admin/version*` — the Software Update modal's own routes — so the log stream survives the brand service's restart window. Does NOT restart during an upgrade — the browser WebSocket stays connected by construction. The operator views this VNC display in the admin UI via the standalone `/browser` page (peer to `/graph` and `/data`).
204
+ - `{hostname}-edge.service` — the always-on public listener on the configured port (default 19200). Reverse-proxies HTTP to the main brand service and handles `/websockify` (VNC) WebSocket upgrades locally. An earlier fix: also hosts `/api/admin/actions/*` and `/api/admin/version*` — the Software Update modal's own routes — so the log stream survives the brand service's restart window. Does NOT restart during an upgrade — the browser WebSocket stays connected by construction. The operator views the device's Chromium in the admin UI via the standalone `/browser` page (peer to `/graph` and `/data`) and on the Claude sign-in screen; both render CDP screencast frames over `/cdp-screencast`, not the framebuffer. Virtual-mode Chromium is headless, so nothing renders onto the X display and the `/websockify` upgrade has no remaining consumer; deleting that stack is separate work.
205
205
 
206
206
  Upgrade and Cloudflare setup run as detached actions: `systemd-run --user` transient units per invocation with stdout+stderr persisted to `~/.maxy/logs/actions/<actionId>.log` and streamed to the UI via SSE. No boot-time service file exists for these.
207
207
 
@@ -560,7 +560,7 @@ For estate-agent client work surfaced on the `/tasks` operator page, `work-creat
560
560
 
561
561
  Two surfaces feed the gate. (1) **Workflow path:** `memory-write` accepts an optional `producedByTaskId` parameter. When set, an inbound `:PRODUCED` edge from that Task is composed into the write's relationships before the gate runs — the typical agent-side pattern is to call `work-create` at the start of an autonomous flow, capture `taskId`, and pass it as `producedByTaskId` on every subsequent `memory-write` for a gated label. The gate verifies Task and write share the same `accountId`; mismatch is rejected loud. (2) **Direct-ask path:** the admin server resolves the active `:AdminConversation`'s `sessionId` UUID and stamps it as `SESSION_NODE_ID` in the spawn env at PTY-spawn time. The same stamp propagates onto specialist subagent spawns the admin dispatches so listing-curator, content-producer, database-operator etc. inherit the same conversation anchor. The `contact-create` and `memory-write` wrappers call `injectConversationProvenance` (exported from [`@maxy/graph-write`](../../../lib/graph-write/src/conversation-provenance.ts)) which MATCHes `(c:Conversation {sessionId, accountId})` — account isolation is part of the natural key, not a separate gate — and prepends the synthetic `:PRODUCED` edge (composed by Neo4j elementId, which the helper reads off the MATCH). No agent-visible schema field changes. `memory-write` uses the env-stamp only as a fallback when `producedByTaskId` is unset; `contact-create` has no `producedByTaskId` parameter today and relies on the env-stamp alone. Autonomous (cron-driven) specialists with no parent conversation legitimately have no env-stamp; those must thread `producedByTaskId`.
562
562
 
563
- A task also carries a **workspace** edge, distinct from the two provenance ones above: `(t:Task)-[:WORKED_ON_IN]->(c:Conversation)` is the session an operator works the task in, written only by the `/tasks` page Session control. `RAISED_DURING` and `PART_OF` say where a task was *raised*, so neither can answer "which chat do I continue this task in" — a task raised in an unrelated conversation would resume that one. At most one such edge exists per task: the control's link route deletes any edge to a different Conversation before merging the new one, which is how a resume the session manager redirected to a live fork re-points itself rather than staying on the dead source. The `:Task` also carries `sessionSpawnRequestedAt`, stamped before the spawn and removed when the link lands, so a session that was created but never linked is countable rather than invisible.
563
+ A task also carries a **workspace** edge, distinct from the two provenance ones above: `(t:Task)-[:WORKED_ON_IN]->(c:Conversation)` is the session an operator works the task in, written only by the `/tasks` page Session control. `RAISED_DURING` and `PART_OF` say where a task was *raised*, so neither can answer "which chat do I continue this task in" — a task raised in an unrelated conversation would resume that one. At most one such edge exists per task: the control's link route deletes any edge to a different Conversation before merging the new one. The link route runs only on a first click, when the task has no session yet; a click on an already-linked task navigates straight to `/chat?session=<id>` and writes nothing, so an edge is never re-pointed after it is first written. The `:Task` also carries `sessionSpawnRequestedAt`, stamped before the spawn and removed when the link lands, so a session that was created but never linked is countable rather than invisible.
564
564
 
565
565
  Operator audit cyphers:
566
566
  - "What entities did this conversation's actions produce?" — `MATCH (c:AdminConversation {sessionId:$id})<-[:RAISED_DURING]-(t:Task)-[:PRODUCED]->(e) RETURN labels(e), e.name, t.kind, t.status`
@@ -85,7 +85,7 @@ There is no dashboard, no settings panel, no menus. Everything is done through c
85
85
 
86
86
  The chat input auto-grows as you type — it expands to fit your message and shrinks back when you delete text. You can also drag the resize handle above the input to set a custom height.
87
87
 
88
- The admin interface is a three-pane layout: a sidebar on the left with navigation (Sessions, People, Agents, Projects, Tasks, Artefacts) and your recent conversations; the chat in the middle; and an artefact pane on the right that opens when you select a document, click a project, or open Browser, Data, or Graph from the menu, holding the surface side-by-side with the conversation so the chat stays live while you work in it. At the very top of the sidebar — above the nav rows — a borderless row holds two controls: a "+ New session" button on the left that spawns a fresh Claude Code session, and a Mode trigger on the right showing the current permission mode (Ask, Accept edits, Plan, or Auto). The sidebar's vertical order is: new-session strip first, then the nav (Sessions, People, Agents, Projects, Tasks, Artefacts), then the sessions list, then the footer. Both controls render as plain text-plus-icon affordances with no surrounding rectangle. The "+ New session" button is a text-width hit target — its clickable area is exactly the icon plus label, not the whole row — and shows no hover fill; the only hover feedback is the pointer cursor. The Mode trigger is pushed flush to the right edge of the row. Clicking the Mode trigger opens a popover downward from the row whose header reads "Mode" and lists the four permission modes with the current selection check-marked. The sidebar's nav rows swap the list view in place: Sessions shows recent conversations, Projects shows your active work projects, and Artefacts lists every KnowledgeDocument plus this account's agent templates (your admin agent's IDENTITY, SOUL, and KNOWLEDGE files plus one entry per enabled specialist). Each recent session row carries a three-state indicator: three pulsing dots when the session is busy (currently processing a turn), a solid sage dot when it is idle (live PTY waiting for input), and a hollow ring when it is archived (PTY exited, JSONL on disk for audit). The list itself splits into three views via a segmented control above the rows: **Active** shows every live session, **Archived** shows every JSONL on disk whose PTY has exited, and **All** shows both. The view choice persists across reloads. An "Include subagents" toggle inside the Active view surfaces specialist spawns (database-operator, premium-plugin agents, anything spawned with a `--agent` flag) which are hidden by default so the list reflects what you started directly. Each row also carries a small uppercase badge — `admin` for operator-driven sessions, the specialist name (for example `db-op`) for background work — so the source of any row is unambiguous at a glance. The People, Agents, and Tasks rows are graph shortcuts: clicking each opens the artefact-pane Graph filtered to every Person, every public Agent, or every Task in your account respectively, with no side-list, because the graph itself is the result. Public agents become first-class graph entities the moment you create them, with edges to their IDENTITY/SOUL/KNOWLEDGE files, edges to every knowledge document they have access to, and edges from every conversation they have handled, so a single Agents click reveals the whole shape of who knows what and who has been talking to whom. Click an artefact row to open the document. KnowledgeDocuments and your admin agent's templates are editable: type in the document and changes save automatically; specialist agent templates are read-only because they ship with SiteDesk and your edits would be overwritten on the next install. PDF artefacts render inline so you can read them without leaving the pane. If your browser doesn't have a built-in PDF viewer, a Download button appears instead. Artefacts that have no readable file backing them (orphan rows, files removed from disk, unsupported content types) show a one-line banner explaining the skip instead of opening to a blank pane. Click a project row to open the Graph view focused on that project's neighbourhood; clicking a second project swaps the focus rather than stacking on top. The sidebar's right edge is drag-resizable on every shell-hosted admin page (Sessions root, Chat, Graph, Browser, and Data): drag the handle to widen or narrow the sidebar, and your chosen width is remembered across reloads and shared across all of them. AdminShell mounts the drag handle itself, so every route that wraps its content in `<AdminShell>` gets sidebar resize for free; the handle does not render in the mobile drawer. The chat and artefact divider is also drag-resizable: drag the line between the columns to make either side wider; double-click it to reset to half of the available width (viewport minus sidebar), clamped to the chat and artefact min-width floors. Your chosen width is remembered across reloads. On wider screens (>1280px) all three panes are visible. The sidebar narrows at 1280px, the artefact pane hides at 1080px (Browser, Data, and Graph then open as full-window pages instead), and the sidebar collapses to a 56px icon rail at 820px. On every viewport the chat header reads left to right as a triptych: a dedicated sidebar toggle (the panel-right icon, which swaps to panel-right-open when the sidebar is showing), the brand mark next to the title in the centre, and the menu burger on the right. This header toggle is the sole sidebar-toggle button; the sidebar itself no longer carries a duplicate. The burger opens the navigation flyout: Dashboard, Data, Graph, Browser, and Chat at the top — Dashboard routes back to `/`, so every satellite page keeps a one-click way home, and the Chat item carries the Claude mark rather than a generic icon — then Public (the agents list) between the two dividers, and below the second divider the version row, Disconnect Claude, and Log out. Tap the sidebar toggle to show or hide the sidebar: on phones (<720px) it slides the drawer in or out, on wider screens it collapses or expands the sidebar column. The brand mark in the centre is decorative; clicks go through the dedicated toggle so the affordance is unambiguous. The drawer animation only fires on tap (220ms slide in or out); resizing your window across the 720px boundary snaps the layout without animation, so you never see a half-open flash. At ≤640px the session metadata pane stacks each label above its value instead of the desktop two-column grid, and the row of action buttons (Open in new tab / Download JSONL / View JSONL / Rename / Pin / Archive / End or Purge) collapses behind a single Actions trigger that opens a popover upward from the foot of the pane. Breakpoint summary: >1280px = full sidebar + chat + artefact pane (drag-resizable divider); 1280px→1080px = sidebar narrows; 1080px→820px = artefact pane hides (Browser/Data/Graph open as full-window pages instead); 820px→720px = sidebar collapses to 56px icon rail; ≤720px = sidebar becomes off-canvas drawer (vertical stack of nav, recents list, foot, the same shape as the desktop sidebar, just on top of the chat instead of beside it).
88
+ The admin interface is a three-pane layout: a sidebar on the left with navigation (Sessions, People, Agents, Projects, Tasks, Artefacts) and your recent conversations; the chat in the middle; and an artefact pane on the right that opens when you select a document, click a project, or open Browser, Data, or Graph from the menu, holding the surface side-by-side with the conversation so the chat stays live while you work in it. At the very top of the sidebar — above the nav rows — a borderless row holds two controls: a "+ New session" button on the left that spawns a fresh Claude Code session, and a Mode trigger on the right showing the current permission mode (Ask, Accept edits, Plan, or Auto). The sidebar's vertical order is: new-session strip first, then the nav (Sessions, People, Agents, Projects, Tasks, Artefacts), then the sessions list, then the footer. Both controls render as plain text-plus-icon affordances with no surrounding rectangle. The "+ New session" button is a text-width hit target — its clickable area is exactly the icon plus label, not the whole row — and shows no hover fill; the only hover feedback is the pointer cursor. The Mode trigger is pushed flush to the right edge of the row. Clicking the Mode trigger opens a popover downward from the row whose header reads "Mode" and lists the four permission modes with the current selection check-marked. The sidebar's nav rows swap the list view in place: Sessions shows recent conversations, Projects shows your active work projects, and Artefacts lists every KnowledgeDocument plus this account's agent templates (your admin agent's IDENTITY, SOUL, and KNOWLEDGE files plus one entry per enabled specialist). Each recent session row carries a three-state indicator: three pulsing dots when the session is busy (currently processing a turn), a solid sage dot when it is idle (live PTY waiting for input), and a hollow ring when it is archived (PTY exited, JSONL on disk for audit). The list itself splits into three views via a segmented control above the rows: **Active** shows every live session, **Archived** shows every JSONL on disk whose PTY has exited, and **All** shows both. The view choice persists across reloads. An "Include subagents" toggle inside the Active view surfaces specialist spawns (database-operator, premium-plugin agents, anything spawned with a `--agent` flag) which are hidden by default so the list reflects what you started directly. Each row also carries a small uppercase badge — `admin` for operator-driven sessions, the specialist name (for example `db-op`) for background work — so the source of any row is unambiguous at a glance. The People, Agents, and Tasks rows are graph shortcuts: clicking each opens the artefact-pane Graph filtered to every Person, every public Agent, or every Task in your account respectively, with no side-list, because the graph itself is the result. Public agents become first-class graph entities the moment you create them, with edges to their IDENTITY/SOUL/KNOWLEDGE files, edges to every knowledge document they have access to, and edges from every conversation they have handled, so a single Agents click reveals the whole shape of who knows what and who has been talking to whom. Click an artefact row to open the document. KnowledgeDocuments and your admin agent's templates are editable: type in the document and changes save automatically; specialist agent templates are read-only because they ship with SiteDesk and your edits would be overwritten on the next install. PDF artefacts render inline so you can read them without leaving the pane. If your browser doesn't have a built-in PDF viewer, a Download button appears instead. Artefacts that have no readable file backing them (orphan rows, files removed from disk, unsupported content types) show a one-line banner explaining the skip instead of opening to a blank pane. Click a project row to open the Graph view focused on that project's neighbourhood; clicking a second project swaps the focus rather than stacking on top. The sidebar's right edge is drag-resizable on every shell-hosted admin page (Sessions root, Chat, Graph, Browser, and Data): drag the handle to widen or narrow the sidebar, and your chosen width is remembered across reloads and shared across all of them. AdminShell mounts the drag handle itself, so every route that wraps its content in `<AdminShell>` gets sidebar resize for free; the handle does not render in the mobile drawer. The chat and artefact divider is also drag-resizable: drag the line between the columns to make either side wider; double-click it to reset to half of the available width (viewport minus sidebar), clamped to the chat and artefact min-width floors. Your chosen width is remembered across reloads. The conversation column on the Chat page has its own width control: a small handle sits half way up the page just inside each side of the column, and dragging either one widens or narrows the reading measure. The column stays centred, so both handles do the same thing — dragging the left one out and the right one out by the same distance give the same width. It will not go below its default 760px and will not go wider than the chat panel itself; the messages, the input box and the jump-to-latest button all move together. Double-click either handle to go back to 760px. Your chosen width is remembered across reloads. The handles do not appear on a phone (below 640px), where the conversation already fills the width. On wider screens (>1280px) all three panes are visible. The sidebar narrows at 1280px, the artefact pane hides at 1080px (Browser, Data, and Graph then open as full-window pages instead), and the sidebar collapses to a 56px icon rail at 820px. On every viewport the chat header reads left to right as a triptych: a dedicated sidebar toggle (the panel-right icon, which swaps to panel-right-open when the sidebar is showing), the brand mark next to the title in the centre, and the menu burger on the right. This header toggle is the sole sidebar-toggle button; the sidebar itself no longer carries a duplicate. The burger opens the navigation flyout: Dashboard, Data, Graph, Browser, and Chat at the top — Dashboard routes back to `/`, so every satellite page keeps a one-click way home, and the Chat item carries the Claude mark rather than a generic icon — then Public (the agents list) between the two dividers, and below the second divider the version row, Disconnect Claude, and Log out. Tap the sidebar toggle to show or hide the sidebar: on phones (<720px) it slides the drawer in or out, on wider screens it collapses or expands the sidebar column. The brand mark in the centre is decorative; clicks go through the dedicated toggle so the affordance is unambiguous. The drawer animation only fires on tap (220ms slide in or out); resizing your window across the 720px boundary snaps the layout without animation, so you never see a half-open flash. At ≤640px the session metadata pane stacks each label above its value instead of the desktop two-column grid, and the row of action buttons (Open in new tab / Download JSONL / View JSONL / Rename / Pin / Archive / End or Purge) collapses behind a single Actions trigger that opens a popover upward from the foot of the pane. Breakpoint summary: >1280px = full sidebar + chat + artefact pane (drag-resizable divider); 1280px→1080px = sidebar narrows; 1080px→820px = artefact pane hides (Browser/Data/Graph open as full-window pages instead); 820px→720px = sidebar collapses to 56px icon rail; ≤720px = sidebar becomes off-canvas drawer (vertical stack of nav, recents list, foot, the same shape as the desktop sidebar, just on top of the chat instead of beside it).
89
89
 
90
90
  Page titles are brand-aware: the browser tab shows your product name (e.g. `Real Agent` instead of `SiteDesk`) on every shell — chat, graph, and data — so a non-default brand never leaks the default name in tab strips or browser history.
91
91
 
@@ -186,7 +186,8 @@ There is no per-conversation stream log that interleaves MCP stderr with agent e
186
186
 
187
187
  **Retrieve MCP diagnostic lines for a conversation:**
188
188
 
189
- - `logs-read { type: "mcp" }` → tails the most recent `mcp-<name>-*.log` (per-server, keyed by session).
189
+ - `logs-read { type: "mcp" }` → tails the most recent `mcp-<name>-*.log` under `~/.<brand>/logs`, the platform config dir the tee writes to — not the account log dir, which holds no `mcp-*` at all.
190
+ - `logs-read { type: "mcp", sessionKey }` → tails every `mcp-*.log` whose **filename** carries that key, one section per server, up to 20 files; a truncated reply names how many matched so the cap is never silent. An 8-character key prefix matches the full session id in the name. The key is never matched against file contents, because MCP log lines carry no session key.
190
191
 
191
192
  ## Failure-path observability contract
192
193