@rubytech/create-maxy-code 0.1.398 → 0.1.400

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 (186) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/plugins/.claude-plugin/marketplace.json +5 -0
  3. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +17 -1
  4. package/payload/platform/plugins/docs/references/graph.md +15 -0
  5. package/payload/platform/plugins/docs/references/plugins-guide.md +1 -0
  6. package/payload/platform/plugins/email/mcp/dist/__tests__/connect-timeout-observability.test.d.ts +2 -0
  7. package/payload/platform/plugins/email/mcp/dist/__tests__/connect-timeout-observability.test.d.ts.map +1 -0
  8. package/payload/platform/plugins/email/mcp/dist/__tests__/connect-timeout-observability.test.js +123 -0
  9. package/payload/platform/plugins/email/mcp/dist/__tests__/connect-timeout-observability.test.js.map +1 -0
  10. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts +9 -0
  11. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts.map +1 -1
  12. package/payload/platform/plugins/email/mcp/dist/lib/imap.js +36 -12
  13. package/payload/platform/plugins/email/mcp/dist/lib/imap.js.map +1 -1
  14. package/payload/platform/plugins/email/mcp/dist/lib/smtp.d.ts.map +1 -1
  15. package/payload/platform/plugins/email/mcp/dist/lib/smtp.js +18 -1
  16. package/payload/platform/plugins/email/mcp/dist/lib/smtp.js.map +1 -1
  17. package/payload/platform/plugins/memory/references/schema-estate-agent.md +2 -0
  18. package/payload/platform/plugins/web-designer/.claude-plugin/plugin.json +8 -0
  19. package/payload/platform/plugins/web-designer/PLUGIN.md +46 -0
  20. package/payload/platform/plugins/web-designer/bin/resolve-cf.sh +56 -0
  21. package/payload/platform/plugins/web-designer/skills/brand-extract/SKILL.md +86 -0
  22. package/payload/platform/plugins/web-designer/skills/socials/SKILL.md +139 -0
  23. package/payload/platform/plugins/web-designer/skills/socials/references/pii-strip.md +64 -0
  24. package/payload/platform/plugins/web-designer/skills/socials/references/sources.md +66 -0
  25. package/payload/platform/plugins/web-designer/skills/socials/templates/og.html +92 -0
  26. package/payload/platform/plugins/web-designer/skills/socials/templates/social-posts.md +46 -0
  27. package/payload/platform/plugins/web-designer/skills/socials/templates/socials.html +87 -0
  28. package/payload/platform/plugins/web-designer/skills/web-design/SKILL.md +98 -0
  29. package/payload/platform/plugins/web-designer/skills/web-design/references/deploy.md +59 -0
  30. package/payload/platform/plugins/web-designer/skills/web-design/references/e-sign.md +39 -0
  31. package/payload/platform/plugins/web-designer/skills/web-design/references/gating.md +55 -0
  32. package/payload/platform/plugins/web-designer/skills/web-design/references/placeholders.md +110 -0
  33. package/payload/platform/plugins/web-designer/skills/web-design/references/sections.md +52 -0
  34. package/payload/platform/plugins/web-designer/skills/web-design/templates/index.html +1004 -0
  35. package/payload/platform/plugins/web-designer/skills/web-design/templates/llms.txt +32 -0
  36. package/payload/platform/plugins/web-designer/skills/web-intake/SKILL.md +107 -0
  37. package/payload/platform/plugins/web-designer/skills/web-intake/references/intake.md +103 -0
  38. package/payload/platform/plugins/whatsapp/PLUGIN.md +7 -1
  39. package/payload/platform/scripts/merge-whatsapp-split-conversations.mjs +264 -0
  40. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  41. package/payload/platform/services/claude-session-manager/dist/http-server.js +22 -6
  42. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  43. package/payload/server/public/assets/{AdminLoginScreens-Bex48co9.js → AdminLoginScreens-rlk263u9.js} +1 -1
  44. package/payload/server/public/assets/{AdminShell-BOmS1NPG.js → AdminShell-C5vWTy2n.js} +1 -1
  45. package/payload/server/public/assets/{Checkbox-DDlXC5tq.js → Checkbox-Chz6bfy-.js} +1 -1
  46. package/payload/server/public/assets/{Transcript-CwItbNkx.js → Transcript-Bsx-bGgY.js} +2 -2
  47. package/payload/server/public/assets/{admin-n9zWE158.js → admin-BnZH758N.js} +1 -1
  48. package/payload/server/public/assets/{arc-C6-nr5UV.js → arc-DyzjCWmw.js} +1 -1
  49. package/payload/server/public/assets/architecture-YZFGNWBL-XiVs-N7Z.js +1 -0
  50. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-DIdho_T6.js → architectureDiagram-Q4EWVU46-qWfElD16.js} +1 -1
  51. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-D5rTTBSy.js → blockDiagram-DXYQGD6D-DO2fFHC3.js} +1 -1
  52. package/payload/server/public/assets/{browser-CI8DR1YG.js → browser-CIrfyZWe.js} +1 -1
  53. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-pfUVHdmy.js → c4Diagram-AHTNJAMY-Ca-q5gDe.js} +1 -1
  54. package/payload/server/public/assets/{calendar-WuIAN47H.js → calendar-D6Z8Kmrn.js} +1 -1
  55. package/payload/server/public/assets/channel-CYBkRz7E.js +1 -0
  56. package/payload/server/public/assets/chat-h7SytZHx.js +1 -0
  57. package/payload/server/public/assets/chevron-left-DSTeS1_g.js +1 -0
  58. package/payload/server/public/assets/{chunk-2KRD3SAO-EF6cdj8U.js → chunk-2KRD3SAO-CX2PxuDw.js} +1 -1
  59. package/payload/server/public/assets/{chunk-336JU56O-DE-lcZAc.js → chunk-336JU56O-D8l6U4Ne.js} +2 -2
  60. package/payload/server/public/assets/chunk-426QAEUC-CPhOHriU.js +1 -0
  61. package/payload/server/public/assets/{chunk-4BX2VUAB--ANCzzyn.js → chunk-4BX2VUAB-CG32Lkbh.js} +1 -1
  62. package/payload/server/public/assets/{chunk-4TB4RGXK-DTO_X80J.js → chunk-4TB4RGXK-BnAQbO-v.js} +1 -1
  63. package/payload/server/public/assets/{chunk-55IACEB6-4J3nrz44.js → chunk-55IACEB6-ejqRH2M5.js} +1 -1
  64. package/payload/server/public/assets/{chunk-5FUZZQ4R-jH_eqAHL.js → chunk-5FUZZQ4R-ClkicQ-T.js} +1 -1
  65. package/payload/server/public/assets/{chunk-5PVQY5BW-C-qU6p6k.js → chunk-5PVQY5BW-Be-mE_rx.js} +1 -1
  66. package/payload/server/public/assets/{chunk-67CJDMHE-DXxH9Snb.js → chunk-67CJDMHE-DPsemed2.js} +1 -1
  67. package/payload/server/public/assets/{chunk-7N4EOEYR-CCkxuP7A.js → chunk-7N4EOEYR-BQRQJETl.js} +1 -1
  68. package/payload/server/public/assets/{chunk-AA7GKIK3-CyItuM8d.js → chunk-AA7GKIK3-B1wcAVCK.js} +1 -1
  69. package/payload/server/public/assets/{chunk-BSJP7CBP-Bg7gxYNf.js → chunk-BSJP7CBP-DIua053h.js} +1 -1
  70. package/payload/server/public/assets/{chunk-CIAEETIT-BAXbOqv5.js → chunk-CIAEETIT-C9GHSCS9.js} +1 -1
  71. package/payload/server/public/assets/{chunk-EDXVE4YY-vdoErQoc.js → chunk-EDXVE4YY-C1T3l1xj.js} +1 -1
  72. package/payload/server/public/assets/{chunk-ENJZ2VHE-Cz_z_6GK.js → chunk-ENJZ2VHE-8kPcXEQC.js} +1 -1
  73. package/payload/server/public/assets/{chunk-FMBD7UC4-Ck2jvOgW.js → chunk-FMBD7UC4-Bhoeq9sD.js} +1 -1
  74. package/payload/server/public/assets/{chunk-FOC6F5B3-DucR0Qo8.js → chunk-FOC6F5B3-BIBpJi8I.js} +1 -1
  75. package/payload/server/public/assets/{chunk-ICPOFSXX-DolYDD7g.js → chunk-ICPOFSXX-DELXp6fj.js} +2 -2
  76. package/payload/server/public/assets/{chunk-K5T4RW27-FRzx7E5I.js → chunk-K5T4RW27-DdckXldP.js} +1 -1
  77. package/payload/server/public/assets/{chunk-KGLVRYIC-Bb5S4Bmc.js → chunk-KGLVRYIC-BJhXejKT.js} +1 -1
  78. package/payload/server/public/assets/{chunk-LIHQZDEY-c8VZJ-lU.js → chunk-LIHQZDEY-BSd8nyM2.js} +1 -1
  79. package/payload/server/public/assets/{chunk-ORNJ4GCN-BAeh-LZ1.js → chunk-ORNJ4GCN-CBi55uxq.js} +1 -1
  80. package/payload/server/public/assets/{chunk-OYMX7WX6-BUg7Kysh.js → chunk-OYMX7WX6-Dfbzl8xh.js} +1 -1
  81. package/payload/server/public/assets/chunk-QZHKN3VN-CDnAAZVJ.js +1 -0
  82. package/payload/server/public/assets/{chunk-U2HBQHQK-K4r17UTk.js → chunk-U2HBQHQK-BN1w8_Cq.js} +1 -1
  83. package/payload/server/public/assets/{chunk-X2U36JSP-Byh-CyxC.js → chunk-X2U36JSP-CrRay1NJ.js} +1 -1
  84. package/payload/server/public/assets/{chunk-XPW4576I-DC7lhr93.js → chunk-XPW4576I-C_ZE776O.js} +1 -1
  85. package/payload/server/public/assets/{chunk-YZCP3GAM-B2cu7AEP.js → chunk-YZCP3GAM-CUSlqWBY.js} +1 -1
  86. package/payload/server/public/assets/{chunk-ZZ45TVLE-DH_p8sFX.js → chunk-ZZ45TVLE-BdPUfSiD.js} +1 -1
  87. package/payload/server/public/assets/classDiagram-6PBFFD2Q-BdXUKVrS.js +1 -0
  88. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DAq-uJr_.js +1 -0
  89. package/payload/server/public/assets/clone-DQl28-jK.js +1 -0
  90. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-DeM6JI00.js → cose-bilkent-S5V4N54A-D4E9htTz.js} +1 -1
  91. package/payload/server/public/assets/{dagre-3drs3e4F.js → dagre-D1B5TQL1.js} +1 -1
  92. package/payload/server/public/assets/{dagre-KV5264BT-C6S-VUtN.js → dagre-KV5264BT-ByuvYV7N.js} +1 -1
  93. package/payload/server/public/assets/data-CL7CyX1C.js +1 -0
  94. package/payload/server/public/assets/{diagram-5BDNPKRD-BkvA32I3.js → diagram-5BDNPKRD-B-0KduTa.js} +1 -1
  95. package/payload/server/public/assets/{diagram-G4DWMVQ6-CVwtRMPB.js → diagram-G4DWMVQ6-CSQmo3eB.js} +1 -1
  96. package/payload/server/public/assets/{diagram-MMDJMWI5-DJ1JVMbd.js → diagram-MMDJMWI5-DK0kWiB3.js} +1 -1
  97. package/payload/server/public/assets/{diagram-TYMM5635-rfj-crtX.js → diagram-TYMM5635-CYbK2reZ.js} +1 -1
  98. package/payload/server/public/assets/{erDiagram-SMLLAGMA-TJPuweS5.js → erDiagram-SMLLAGMA-C-JQHvJF.js} +1 -1
  99. package/payload/server/public/assets/{flatten-BZkoyJ4e.js → flatten-ROVzlo1u.js} +1 -1
  100. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-LQWEUjbV.js → flowDiagram-DWJPFMVM-OTOd2czg.js} +1 -1
  101. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-DdYsxKRw.js → ganttDiagram-T4ZO3ILL-BWJ778ou.js} +1 -1
  102. package/payload/server/public/assets/gitGraph-7Q5UKJZL-BM-KaDZy.js +1 -0
  103. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-sx8-fokM.js → gitGraphDiagram-UUTBAWPF-CkNcyISe.js} +1 -1
  104. package/payload/server/public/assets/graph-XZJZHzvv.js +51 -0
  105. package/payload/server/public/assets/{graph-labels-DigwgCWY.js → graph-labels-Cabqmf35.js} +1 -1
  106. package/payload/server/public/assets/{graphlib-DixeJdCf.js → graphlib-8z59Ng6C.js} +1 -1
  107. package/payload/server/public/assets/info-OMHHGYJF-CtZajyAB.js +1 -0
  108. package/payload/server/public/assets/infoDiagram-42DDH7IO-C-_WYlmI.js +2 -0
  109. package/payload/server/public/assets/{isEmpty-VRKFml5R.js → isEmpty-DXf_sApt.js} +1 -1
  110. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-BKUCuKhZ.js → ishikawaDiagram-UXIWVN3A-Cg7pRRGp.js} +1 -1
  111. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-BafZP6pM.js → journeyDiagram-VCZTEJTY-CZT_4r_Z.js} +1 -1
  112. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-DQ4c6wRv.js → kanban-definition-6JOO6SKY-Dp1Vd5YM.js} +1 -1
  113. package/payload/server/public/assets/{line-0_x1Wivu.js → line-UPAcwY66.js} +1 -1
  114. package/payload/server/public/assets/{linear-CZrU-J2V.js → linear-BeeahLKw.js} +1 -1
  115. package/payload/server/public/assets/maximize-2-DPe-Noig.js +1 -0
  116. package/payload/server/public/assets/{mermaid-parser.core-DwJ1cyfO.js → mermaid-parser.core-CLKle8df.js} +2 -2
  117. package/payload/server/public/assets/{mermaid.core-DnUst0He.js → mermaid.core-CwRj5rL5.js} +3 -3
  118. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-oc-GwerE.js → mindmap-definition-QFDTVHPH-CNQUY9UJ.js} +1 -1
  119. package/payload/server/public/assets/{operator-D-Ad9OQ5.js → operator-BM_CDyCb.js} +1 -1
  120. package/payload/server/public/assets/{ordinal-v4prQcuq.js → ordinal-B2r5L1v4.js} +1 -1
  121. package/payload/server/public/assets/packet-4T2RLAQJ-T-SYedp7.js +1 -0
  122. package/payload/server/public/assets/{page-BjAKwjlS.js → page-CMIbXzSg.js} +3 -3
  123. package/payload/server/public/assets/{page-CpSVszGe.js → page-E7I5sEVt.js} +1 -1
  124. package/payload/server/public/assets/{pdf-render-NQmflZ7K.js → pdf-render-m08Xm2Nm.js} +1 -1
  125. package/payload/server/public/assets/pie-ZZUOXDRM-BWECFVVd.js +1 -0
  126. package/payload/server/public/assets/{pieDiagram-DEJITSTG-BnBtQNHM.js → pieDiagram-DEJITSTG-Scnq58FX.js} +1 -1
  127. package/payload/server/public/assets/{public-CbkiISZZ.js → public-CrdWCSk2.js} +1 -1
  128. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CkNqtzHI.js → quadrantDiagram-34T5L4WZ-wPfZo_vs.js} +1 -1
  129. package/payload/server/public/assets/radar-PYXPWWZC-Dx0YUklX.js +1 -0
  130. package/payload/server/public/assets/{reduce-0Mm1v1Rr.js → reduce-CFlDlJf5.js} +1 -1
  131. package/payload/server/public/assets/{requirementDiagram-MS252O5E-D7qc27KT.js → requirementDiagram-MS252O5E-yYkH12K2.js} +1 -1
  132. package/payload/server/public/assets/{rotate-ccw-BYmlylsD.js → rotate-ccw-Dwtj0NJ7.js} +1 -1
  133. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-2Y4sqRY7.js → sankeyDiagram-XADWPNL6-fVWRBzzV.js} +1 -1
  134. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-hXOiSHuT.js → sequenceDiagram-FGHM5R23-Dbap3X6h.js} +1 -1
  135. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-Dq4hhkLA.js → stateDiagram-FHFEXIEX-DkPLAqIh.js} +1 -1
  136. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DceWO1u6.js +1 -0
  137. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-Dn9wBUEw.js → timeline-definition-GMOUNBTQ-DabKBJyd.js} +1 -1
  138. package/payload/server/public/assets/treeView-SZITEDCU-C3197Rac.js +1 -0
  139. package/payload/server/public/assets/treemap-W4RFUUIX-BPrpx29h.js +1 -0
  140. package/payload/server/public/assets/{useSubAccountSwitcher-DxHQSOzT.css → useSubAccountSwitcher-BH-YjP0H.css} +1 -1
  141. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-BKVHJiIt.js → vennDiagram-DHZGUBPP-CaKT7c-c.js} +1 -1
  142. package/payload/server/public/assets/wardley-RL74JXVD-DW4Jlbhw.js +1 -0
  143. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-Bn9vvpdK.js → wardleyDiagram-NUSXRM2D-BZ5TTSOL.js} +1 -1
  144. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-FIoMdPB3.js → xychartDiagram-5P7HB3ND-CLfeklJ9.js} +1 -1
  145. package/payload/server/public/browser.html +4 -4
  146. package/payload/server/public/calendar.html +5 -5
  147. package/payload/server/public/chat.html +10 -9
  148. package/payload/server/public/data.html +9 -8
  149. package/payload/server/public/graph.html +9 -8
  150. package/payload/server/public/index.html +12 -11
  151. package/payload/server/public/operator.html +12 -11
  152. package/payload/server/public/public.html +10 -9
  153. package/payload/server/server.js +41 -6
  154. package/payload/server/public/assets/architecture-YZFGNWBL-DdgmZ93B.js +0 -1
  155. package/payload/server/public/assets/channel-Da-UUyqx.js +0 -1
  156. package/payload/server/public/assets/chat-L6IVvC9k.js +0 -1
  157. package/payload/server/public/assets/chevron-left-uJSGyCGe.js +0 -1
  158. package/payload/server/public/assets/chunk-426QAEUC-B1kFAxo1.js +0 -1
  159. package/payload/server/public/assets/chunk-QZHKN3VN-BjE-Glwf.js +0 -1
  160. package/payload/server/public/assets/classDiagram-6PBFFD2Q-Dol3Ogeh.js +0 -1
  161. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-VUMj7gWH.js +0 -1
  162. package/payload/server/public/assets/clone-m7oGrdBC.js +0 -1
  163. package/payload/server/public/assets/data-4K_negqE.js +0 -1
  164. package/payload/server/public/assets/gitGraph-7Q5UKJZL-cJEaiQq4.js +0 -1
  165. package/payload/server/public/assets/graph-UHR4Ez-V.js +0 -51
  166. package/payload/server/public/assets/info-OMHHGYJF-BUxfOTKa.js +0 -1
  167. package/payload/server/public/assets/infoDiagram-42DDH7IO-CD-d3Rgf.js +0 -2
  168. package/payload/server/public/assets/packet-4T2RLAQJ-B9U_2639.js +0 -1
  169. package/payload/server/public/assets/pie-ZZUOXDRM-Glh-lJOT.js +0 -1
  170. package/payload/server/public/assets/radar-PYXPWWZC-CTSgob8w.js +0 -1
  171. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DTj9o2vZ.js +0 -1
  172. package/payload/server/public/assets/treeView-SZITEDCU-CXApkW1l.js +0 -1
  173. package/payload/server/public/assets/treemap-W4RFUUIX-DzvTXAcT.js +0 -1
  174. package/payload/server/public/assets/wardley-RL74JXVD-BExXV4oI.js +0 -1
  175. /package/payload/server/public/assets/{_baseFor-C0Y1mc3g.js → _baseFor-BVuIxZJh.js} +0 -0
  176. /package/payload/server/public/assets/{array-DqLCdDFv.js → array-B9UHiPd-.js} +0 -0
  177. /package/payload/server/public/assets/{cytoscape.esm-Cn5b4Cdu.js → cytoscape.esm-D5_TRwB-.js} +0 -0
  178. /package/payload/server/public/assets/{defaultLocale-CrJzLgRD.js → defaultLocale-5eAKkKJC.js} +0 -0
  179. /package/payload/server/public/assets/{dist-Dlks0Bfw.js → dist-CADCHk0t.js} +0 -0
  180. /package/payload/server/public/assets/{init-C0r9Gk5G.js → init-DlZdxViB.js} +0 -0
  181. /package/payload/server/public/assets/{katex-BFwFoEts.js → katex-Xo0SyWvP.js} +0 -0
  182. /package/payload/server/public/assets/{path-DIKpVbHL.js → path-6uRLdFF7.js} +0 -0
  183. /package/payload/server/public/assets/{preload-helper-C5gCWwwF.js → preload-helper-CvXuAEud.js} +0 -0
  184. /package/payload/server/public/assets/{rough.esm-DsHEmXUZ.js → rough.esm-Djo4Abte.js} +0 -0
  185. /package/payload/server/public/assets/{src-Bv7ZWAzF.js → src-Bi0fLV9t.js} +0 -0
  186. /package/payload/server/public/assets/{useSubAccountSwitcher-BRWAIbzr.js → useSubAccountSwitcher-BVCMAnWK.js} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-maxy-code",
3
- "version": "0.1.398",
3
+ "version": "0.1.400",
4
4
  "description": "Install Maxy — AI for Productive People",
5
5
  "bin": {
6
6
  "create-maxy-code": "./dist/index.js"
@@ -149,6 +149,11 @@
149
149
  "source": "./url-get",
150
150
  "version": "0.1.0"
151
151
  },
152
+ {
153
+ "name": "web-designer",
154
+ "source": "./web-designer",
155
+ "version": "0.1.0"
156
+ },
152
157
  {
153
158
  "name": "whatsapp",
154
159
  "source": "./whatsapp",
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: platform-architecture
3
3
  description: Use when grounding any documented-surface claim about what Maxy 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:657d04765d9060aecf0d40397e31f3ed775124296ad8328ed9464578770f0479
4
+ content-hash: sha256:55075f40e6c0ae401f2b98548b0e707b2274f48553193c33a96fd2bd9a2e231b
5
5
  brand: maxy-code
6
6
  product-name: Maxy
7
7
  ---
@@ -367,6 +367,7 @@ These are enabled during onboarding and can be added or removed at any time. Som
367
367
  | `telegram` | Telegram bot — BotFather setup, messaging, channels | Personal assistant |
368
368
  | `whatsapp` | WhatsApp messaging, pairing, and conversation browsing | Personal assistant |
369
369
  | `replicate` | Image generation — three models for photorealistic, design, and fast draft images | Content producer, Research assistant |
370
+ | `web-designer` | Design and build a single-page website for any business and put it live on Cloudflare — guided intake, brand extraction from a URL, a domain-neutral builder, social tiles, and deploy with D1 form capture, gated access, and e-signing. Composes `cloudflare` deploy and `business-assistant` e-signing; adds no specialist and writes to no graph. | Content producer |
370
371
  | `linkedin-import` | Import a LinkedIn Basic Data Export — Profile and Connections today, more CSVs as references land | Database operator |
371
372
  | `notion-import` | Import a Notion workspace export (markdown + CSV) — pages, databases, hierarchy, attachments, schema-bounded relations, `@person` mentions account-filtered | Librarian |
372
373
  | `obsidian-import` | Import an extracted Obsidian vault — pages map to `:KnowledgeDocument`, wikilinks resolve to intra-vault pages or existing entities, tags become `:DefinedTerm`, embedded images become `:DigitalDocument`. Two-phase tool (dry-run → operator disambiguation → commit). | Librarian |
@@ -3072,6 +3073,21 @@ Searches reach **every textual property** of every operator-meaningful label, in
3072
3073
 
3073
3074
  Search behaves the same here, in the agent's own memory recall, and on the `/data` page: with **no filter chips selected** a search reaches **all** labels — the same scope the agent sees — and every surface applies the **same default relevance floor**, so the same query returns the same nodes everywhere. There is no longer a "select a chip first" gate; an empty chip set means "search everything". Selecting chips narrows the result to those labels.
3074
3075
 
3076
+ ## Full-screen the canvas
3077
+
3078
+ The toolbar carries a **maximize** button (the expand icon, beside Refresh).
3079
+ Clicking it lifts the toolbar and canvas out of the page and paints them over
3080
+ the whole browser window, hiding the sidebar and header so a dense
3081
+ neighbourhood gets the full screen. The button turns into a **minimize** icon
3082
+ while maximized. Press **Escape** or click minimize to return to the boxed
3083
+ view. When the filter popover is open, the first Escape closes the popover and
3084
+ the next exits full screen, so one keypress never does both, and the minimize
3085
+ button is always on screen so you can never get stuck.
3086
+
3087
+ This is an in-page overlay, so the browser tab and address bar stay put. It is
3088
+ not the operating system's full-screen mode. The maximize button shows only on
3089
+ the `/graph` page, not where the graph is embedded in another pane.
3090
+
3075
3091
  ## Conversation label tiers
3076
3092
 
3077
3093
  Conversation nodes carry the most operator-meaningful identity in the
@@ -43,6 +43,21 @@ Searches reach **every textual property** of every operator-meaningful label, in
43
43
 
44
44
  Search behaves the same here, in the agent's own memory recall, and on the `/data` page: with **no filter chips selected** a search reaches **all** labels — the same scope the agent sees — and every surface applies the **same default relevance floor**, so the same query returns the same nodes everywhere. There is no longer a "select a chip first" gate; an empty chip set means "search everything". Selecting chips narrows the result to those labels.
45
45
 
46
+ ## Full-screen the canvas
47
+
48
+ The toolbar carries a **maximize** button (the expand icon, beside Refresh).
49
+ Clicking it lifts the toolbar and canvas out of the page and paints them over
50
+ the whole browser window, hiding the sidebar and header so a dense
51
+ neighbourhood gets the full screen. The button turns into a **minimize** icon
52
+ while maximized. Press **Escape** or click minimize to return to the boxed
53
+ view. When the filter popover is open, the first Escape closes the popover and
54
+ the next exits full screen, so one keypress never does both, and the minimize
55
+ button is always on screen so you can never get stuck.
56
+
57
+ This is an in-page overlay, so the browser tab and address bar stay put. It is
58
+ not the operating system's full-screen mode. The maximize button shows only on
59
+ the `/graph` page, not where the graph is embedded in another pane.
60
+
46
61
  ## Conversation label tiers
47
62
 
48
63
  Conversation nodes carry the most operator-meaningful identity in the
@@ -43,6 +43,7 @@ These are enabled during onboarding and can be added or removed at any time. Som
43
43
  | `telegram` | Telegram bot — BotFather setup, messaging, channels | Personal assistant |
44
44
  | `whatsapp` | WhatsApp messaging, pairing, and conversation browsing | Personal assistant |
45
45
  | `replicate` | Image generation — three models for photorealistic, design, and fast draft images | Content producer, Research assistant |
46
+ | `web-designer` | Design and build a single-page website for any business and put it live on Cloudflare — guided intake, brand extraction from a URL, a domain-neutral builder, social tiles, and deploy with D1 form capture, gated access, and e-signing. Composes `cloudflare` deploy and `business-assistant` e-signing; adds no specialist and writes to no graph. | Content producer |
46
47
  | `linkedin-import` | Import a LinkedIn Basic Data Export — Profile and Connections today, more CSVs as references land | Database operator |
47
48
  | `notion-import` | Import a Notion workspace export (markdown + CSV) — pages, databases, hierarchy, attachments, schema-bounded relations, `@person` mentions account-filtered | Librarian |
48
49
  | `obsidian-import` | Import an extracted Obsidian vault — pages map to `:KnowledgeDocument`, wikilinks resolve to intra-vault pages or existing entities, tags become `:DefinedTerm`, embedded images become `:DigitalDocument`. Two-phase tool (dry-run → operator disambiguation → commit). | Librarian |
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=connect-timeout-observability.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-timeout-observability.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/connect-timeout-observability.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,123 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import { EventEmitter } from "node:events";
3
+ // Contract for task 1413: the connect budget is 30s on both transports, every
4
+ // connection-failure log line names the mailbox + host:port + classified reason,
5
+ // and a fetch cycle emits a terminal success line naming the mailbox on the way
6
+ // out. Mocks mirror imap-probe.test.ts: constructable ImapFlow, capturable
7
+ // nodemailer.createTransport.
8
+ const state = vi.hoisted(() => ({ imapClients: [], smtpTransports: [] }));
9
+ vi.mock("imapflow", () => ({ ImapFlow: vi.fn() }));
10
+ vi.mock("nodemailer", () => ({ createTransport: vi.fn() }));
11
+ const { ImapFlow } = await import("imapflow");
12
+ const nodemailer = await import("nodemailer");
13
+ const { fetchRecent } = await import("../lib/imap.js");
14
+ const { testConnection: smtpTestConnection, sendEmail } = await import("../lib/smtp.js");
15
+ function fakeImapClient(overrides = {}) {
16
+ const client = Object.assign(new EventEmitter(), {
17
+ connect: vi.fn().mockResolvedValue(undefined),
18
+ logout: vi.fn().mockResolvedValue(undefined),
19
+ close: vi.fn(),
20
+ list: vi.fn().mockResolvedValue([]),
21
+ getMailboxLock: vi.fn().mockResolvedValue({ release: vi.fn() }),
22
+ search: vi.fn().mockResolvedValue([]),
23
+ fetch: vi.fn(),
24
+ socket: new EventEmitter(),
25
+ ...overrides,
26
+ });
27
+ state.imapClients.push(client);
28
+ return client;
29
+ }
30
+ function armImapFlow(overrides = {}) {
31
+ ImapFlow.mockImplementationOnce(function () {
32
+ return fakeImapClient(overrides);
33
+ });
34
+ }
35
+ function fakeSmtpTransport(overrides = {}) {
36
+ // nodemailer's transport is an EventEmitter; trackProbe (smtp testConnection)
37
+ // attaches an 'error' listener, so the fake must carry .on().
38
+ const transport = Object.assign(new EventEmitter(), {
39
+ verify: vi.fn().mockResolvedValue(true),
40
+ sendMail: vi.fn().mockResolvedValue({ messageId: "<x@y>" }),
41
+ close: vi.fn(),
42
+ ...overrides,
43
+ });
44
+ state.smtpTransports.push(transport);
45
+ return transport;
46
+ }
47
+ function armSmtp(overrides = {}) {
48
+ nodemailer.createTransport.mockImplementationOnce(() => fakeSmtpTransport(overrides));
49
+ }
50
+ function imapErr(message, fields = {}) {
51
+ return Object.assign(new Error(message), fields);
52
+ }
53
+ const config = {
54
+ email: "ops@startmail.test", agentAddress: "ops@startmail.test",
55
+ imapHost: "imap.startmail.test", imapPort: 993, imapSecurity: "tls",
56
+ smtpHost: "smtp.startmail.test", smtpPort: 465, smtpSecurity: "tls",
57
+ };
58
+ beforeEach(() => {
59
+ state.imapClients.length = 0;
60
+ state.smtpTransports.length = 0;
61
+ ImapFlow.mockReset();
62
+ nodemailer.createTransport.mockReset();
63
+ });
64
+ describe("connect budget is 30 seconds on both transports", () => {
65
+ it("IMAP client is built with connectionTimeout and greetingTimeout = 30000", async () => {
66
+ armImapFlow();
67
+ await fetchRecent(config, "pw");
68
+ const opts = ImapFlow.mock.calls[0][0];
69
+ expect(opts.connectionTimeout).toBe(30_000);
70
+ expect(opts.greetingTimeout).toBe(30_000);
71
+ });
72
+ it("SMTP transport is built with connectionTimeout and greetingTimeout = 30000", async () => {
73
+ armSmtp();
74
+ await smtpTestConnection(config, "pw");
75
+ const opts = nodemailer.createTransport.mock.calls[0][0];
76
+ expect(opts.connectionTimeout).toBe(30_000);
77
+ expect(opts.greetingTimeout).toBe(30_000);
78
+ });
79
+ });
80
+ describe("connection-failure line is attributable", () => {
81
+ it("a connect-timeout on fetchRecent logs the mailbox, host:port, and reason=timeout", async () => {
82
+ const lines = [];
83
+ const spy = vi.spyOn(console, "error").mockImplementation((...a) => { lines.push(a.join(" ")); });
84
+ armImapFlow({
85
+ connect: vi.fn().mockRejectedValue(imapErr("Failed to establish connection in required time after 30013ms", { code: "CONNECT_TIMEOUT" })),
86
+ });
87
+ await expect(fetchRecent(config, "pw")).rejects.toThrow();
88
+ spy.mockRestore();
89
+ const failed = lines.filter((l) => l.includes("fetchRecent: FAILED"));
90
+ expect(failed).toHaveLength(1);
91
+ expect(failed[0]).toContain("account=ops@startmail.test");
92
+ expect(failed[0]).toContain("host=imap.startmail.test:993");
93
+ expect(failed[0]).toContain("reason=timeout");
94
+ });
95
+ });
96
+ describe("a successful fetch cycle emits a terminal outcome line", () => {
97
+ it("names the mailbox on the empty-result path (the recovery signal)", async () => {
98
+ const lines = [];
99
+ const spy = vi.spyOn(console, "error").mockImplementation((...a) => { lines.push(a.join(" ")); });
100
+ armImapFlow(); // search resolves to [] → empty-result success path
101
+ const result = await fetchRecent(config, "pw");
102
+ spy.mockRestore();
103
+ expect(result.messages).toEqual([]);
104
+ const ok = lines.filter((l) => l.includes("fetchRecent: OK"));
105
+ expect(ok).toHaveLength(1);
106
+ expect(ok[0]).toContain("account=ops@startmail.test");
107
+ });
108
+ });
109
+ describe("SMTP send failure is attributable", () => {
110
+ it("a send that throws logs the mailbox, host:port, and a classified reason", async () => {
111
+ const lines = [];
112
+ const spy = vi.spyOn(console, "error").mockImplementation((...a) => { lines.push(a.join(" ")); });
113
+ armSmtp({ sendMail: vi.fn().mockRejectedValue(imapErr("connect ETIMEDOUT", { code: "ETIMEDOUT" })) });
114
+ await expect(sendEmail(config, "pw", { to: "x@y.test", subject: "s", body: "b" })).rejects.toThrow();
115
+ spy.mockRestore();
116
+ const failed = lines.filter((l) => l.includes("sendEmail: FAILED"));
117
+ expect(failed).toHaveLength(1);
118
+ expect(failed[0]).toContain("account=ops@startmail.test");
119
+ expect(failed[0]).toContain("host=smtp.startmail.test:465");
120
+ expect(failed[0]).toContain("reason=timeout");
121
+ });
122
+ });
123
+ //# sourceMappingURL=connect-timeout-observability.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-timeout-observability.test.js","sourceRoot":"","sources":["../../src/__tests__/connect-timeout-observability.test.ts"],"names":[],"mappings":"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"}
@@ -134,6 +134,15 @@ export type ImapFailureKind = "auth" | "refused" | "not-found" | "tls" | "timeou
134
134
  * socket layer; TLS errors carry a cert/TLS/SSL marker in code or message.
135
135
  */
136
136
  export declare function classifyImapError(err: unknown): ImapFailureKind;
137
+ /**
138
+ * Compose the attributable detail for a connection- or send-failure diag line:
139
+ * the account it was for, the host:port it was reaching, and the classified
140
+ * reason from classifyImapError, plus the raw message and elapsed time. A reader
141
+ * of the email log can then pin a failure to one mailbox and one phase (timeout vs
142
+ * auth vs refused vs tls vs dns) without a live reproduction — the exact gap that
143
+ * let a VPN-induced connect timeout read as a lost-mailbox outage.
144
+ */
145
+ export declare function connectionFailureDetail(account: string, host: string, port: number, err: unknown, elapsedMs: number): string;
137
146
  /**
138
147
  * Test IMAP connectivity and authentication.
139
148
  * Returns null on success, error message on failure.
@@ -1 +1 @@
1
- {"version":3,"file":"imap.d.ts","sourceRoot":"","sources":["../../src/lib/imap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"imap.d.ts","sourceRoot":"","sources":["../../src/lib/imap.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,11 @@
1
1
  import { ImapFlow } from "imapflow";
2
2
  import { simpleParser } from "mailparser";
3
3
  import { trackProbe, releaseProbe, newProbeToken, containProbeSocket } from "./setup-probe.js";
4
- const CONNECT_TIMEOUT = 10_000;
4
+ // Connect budget covers TCP connect + TLS handshake + the IMAP login greeting,
5
+ // several round trips stacked. 30s (matching COMMAND_TIMEOUT) so a high-latency
6
+ // path — e.g. a VPN exit node adding ~500ms per round trip — completes instead of
7
+ // tripping the old 10s cutoff and logging a spurious connection failure.
8
+ const CONNECT_TIMEOUT = 30_000;
5
9
  const COMMAND_TIMEOUT = 30_000;
6
10
  /** Diagnostic logging to stderr (captured by claude-agent-stderr log on Pi) */
7
11
  function diag(op, step, detail) {
@@ -358,6 +362,23 @@ function imapFailureMessage(kind, config, err) {
358
362
  return `IMAP connection failed: ${err instanceof Error ? err.message : String(err)}`;
359
363
  }
360
364
  }
365
+ /**
366
+ * Compose the attributable detail for a connection- or send-failure diag line:
367
+ * the account it was for, the host:port it was reaching, and the classified
368
+ * reason from classifyImapError, plus the raw message and elapsed time. A reader
369
+ * of the email log can then pin a failure to one mailbox and one phase (timeout vs
370
+ * auth vs refused vs tls vs dns) without a live reproduction — the exact gap that
371
+ * let a VPN-induced connect timeout read as a lost-mailbox outage.
372
+ */
373
+ export function connectionFailureDetail(account, host, port, err, elapsedMs) {
374
+ const reason = classifyImapError(err);
375
+ const msg = err instanceof Error ? err.message : String(err);
376
+ return `account=${account} host=${host}:${port} reason=${reason} err=${JSON.stringify(msg)} after ${elapsedMs}ms`;
377
+ }
378
+ /** IMAP-side shorthand: fills host/port from the IMAP config. */
379
+ function imapFailureDetail(config, err, elapsedMs) {
380
+ return connectionFailureDetail(config.email, config.imapHost, config.imapPort, err, elapsedMs);
381
+ }
361
382
  /**
362
383
  * Test IMAP connectivity and authentication.
363
384
  * Returns null on success, error message on failure.
@@ -551,8 +572,10 @@ export async function fetchRecent(config, password, options = {}) {
551
572
  uids = uids.filter((uid) => uid < beforeUid);
552
573
  diag("fetchRecent", "cursor applied", `${uids.length} UIDs after beforeUid=${beforeUid} filter`);
553
574
  }
554
- if (uids.length === 0)
575
+ if (uids.length === 0) {
576
+ diag("fetchRecent", "OK", `account=${config.email} messages=0 in ${Date.now() - t0}ms`);
555
577
  return { messages: [] };
578
+ }
556
579
  // Determine if more results exist beyond what we'll return
557
580
  const totalAfterCursor = uids.length;
558
581
  // Take the most recent UIDs (over-fetched when client-side TO filtering)
@@ -645,6 +668,7 @@ export async function fetchRecent(config, password, options = {}) {
645
668
  else {
646
669
  diag("fetchRecent", "pagination", "exhausted");
647
670
  }
671
+ diag("fetchRecent", "OK", `account=${config.email} messages=${result.messages.length} in ${Date.now() - t0}ms`);
648
672
  return result;
649
673
  }
650
674
  finally {
@@ -652,7 +676,7 @@ export async function fetchRecent(config, password, options = {}) {
652
676
  }
653
677
  }
654
678
  catch (err) {
655
- diag("fetchRecent", "FAILED", `${err instanceof Error ? err.message : String(err)} after ${Date.now() - t0}ms`);
679
+ diag("fetchRecent", "FAILED", imapFailureDetail(config, err, Date.now() - t0));
656
680
  throw err;
657
681
  }
658
682
  finally {
@@ -777,7 +801,7 @@ export async function searchMessages(config, password, query) {
777
801
  }
778
802
  }
779
803
  catch (err) {
780
- diag("searchMessages", "FAILED", `${err instanceof Error ? err.message : String(err)} after ${Date.now() - t0}ms`);
804
+ diag("searchMessages", "FAILED", imapFailureDetail(config, err, Date.now() - t0));
781
805
  throw err;
782
806
  }
783
807
  finally {
@@ -883,7 +907,7 @@ export async function fetchSinceUid(config, password, sinceUid, recipients) {
883
907
  return { uidValidity, emails, maxUid };
884
908
  }
885
909
  catch (err) {
886
- diag("fetchSinceUid", "FAILED", `${err instanceof Error ? err.message : String(err)} after ${Date.now() - t0}ms`);
910
+ diag("fetchSinceUid", "FAILED", imapFailureDetail(config, err, Date.now() - t0));
887
911
  throw err;
888
912
  }
889
913
  finally {
@@ -968,7 +992,7 @@ export async function fetchEnvelopeByMessageId(config, password, messageId) {
968
992
  };
969
993
  }
970
994
  catch (err) {
971
- diag("fetchEnvelopeByMessageId", "FAILED", `${err instanceof Error ? err.message : String(err)} after ${Date.now() - t0}ms`);
995
+ diag("fetchEnvelopeByMessageId", "FAILED", imapFailureDetail(config, err, Date.now() - t0));
972
996
  throw err;
973
997
  }
974
998
  finally {
@@ -1034,7 +1058,7 @@ export async function fetchFullBody(config, password, target) {
1034
1058
  }
1035
1059
  }
1036
1060
  catch (err) {
1037
- diag("fetchFullBody", "FAILED", `${err instanceof Error ? err.message : String(err)} after ${Date.now() - t0}ms`);
1061
+ diag("fetchFullBody", "FAILED", imapFailureDetail(config, err, Date.now() - t0));
1038
1062
  throw err;
1039
1063
  }
1040
1064
  finally {
@@ -1100,7 +1124,7 @@ export async function moveToTrash(config, password, { folder = "inbox", uids = [
1100
1124
  }
1101
1125
  }
1102
1126
  catch (err) {
1103
- diag("moveToTrash", "FAILED", `${err instanceof Error ? err.message : String(err)} after ${Date.now() - t0}ms`);
1127
+ diag("moveToTrash", "FAILED", imapFailureDetail(config, err, Date.now() - t0));
1104
1128
  throw err;
1105
1129
  }
1106
1130
  finally {
@@ -1159,7 +1183,7 @@ export async function appendDraft(config, password, raw) {
1159
1183
  return { folder, uid };
1160
1184
  }
1161
1185
  catch (err) {
1162
- diag("appendDraft", "FAILED", `${err instanceof Error ? err.message : String(err)} after ${Date.now() - t0}ms`);
1186
+ diag("appendDraft", "FAILED", imapFailureDetail(config, err, Date.now() - t0));
1163
1187
  throw err;
1164
1188
  }
1165
1189
  finally {
@@ -1201,7 +1225,7 @@ export async function fetchDraftSource(config, password, uid) {
1201
1225
  }
1202
1226
  }
1203
1227
  catch (err) {
1204
- diag("fetchDraftSource", "FAILED", `${err instanceof Error ? err.message : String(err)} after ${Date.now() - t0}ms`);
1228
+ diag("fetchDraftSource", "FAILED", imapFailureDetail(config, err, Date.now() - t0));
1205
1229
  throw err;
1206
1230
  }
1207
1231
  finally {
@@ -1275,7 +1299,7 @@ async function replaceDraftOnce(config, password, oldUid, newRaw, draftMessageId
1275
1299
  }
1276
1300
  }
1277
1301
  catch (err) {
1278
- diag("draftReplace", "FAILED", `${err instanceof Error ? err.message : String(err)} after ${Date.now() - t0}ms`);
1302
+ diag("draftReplace", "FAILED", imapFailureDetail(config, err, Date.now() - t0));
1279
1303
  throw err;
1280
1304
  }
1281
1305
  finally {
@@ -1318,7 +1342,7 @@ async function deleteDraftOnce(config, password, uid) {
1318
1342
  }
1319
1343
  }
1320
1344
  catch (err) {
1321
- diag("draftDelete", "FAILED", `${err instanceof Error ? err.message : String(err)} after ${Date.now() - t0}ms`);
1345
+ diag("draftDelete", "FAILED", imapFailureDetail(config, err, Date.now() - t0));
1322
1346
  throw err;
1323
1347
  }
1324
1348
  finally {