@rubytech/create-maxy-code 0.1.398 → 0.1.401
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.
- package/package.json +1 -1
- package/payload/platform/config/brand.json +1 -1
- package/payload/platform/plugins/.claude-plugin/marketplace.json +5 -0
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +17 -1
- package/payload/platform/plugins/docs/references/graph.md +15 -0
- package/payload/platform/plugins/docs/references/plugins-guide.md +1 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/connect-timeout-observability.test.d.ts +2 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/connect-timeout-observability.test.d.ts.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/connect-timeout-observability.test.js +123 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/connect-timeout-observability.test.js.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts +9 -0
- package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/imap.js +36 -12
- package/payload/platform/plugins/email/mcp/dist/lib/imap.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.js +18 -1
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.js.map +1 -1
- package/payload/platform/plugins/memory/references/schema-estate-agent.md +2 -0
- package/payload/platform/plugins/web-designer/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/web-designer/PLUGIN.md +55 -0
- package/payload/platform/plugins/web-designer/bin/resolve-cf.sh +56 -0
- package/payload/platform/plugins/web-designer/commands/website.md +61 -0
- package/payload/platform/plugins/web-designer/skills/brand-extract/SKILL.md +86 -0
- package/payload/platform/plugins/web-designer/skills/socials/SKILL.md +139 -0
- package/payload/platform/plugins/web-designer/skills/socials/references/pii-strip.md +64 -0
- package/payload/platform/plugins/web-designer/skills/socials/references/sources.md +66 -0
- package/payload/platform/plugins/web-designer/skills/socials/templates/og.html +92 -0
- package/payload/platform/plugins/web-designer/skills/socials/templates/social-posts.md +46 -0
- package/payload/platform/plugins/web-designer/skills/socials/templates/socials.html +87 -0
- package/payload/platform/plugins/web-designer/skills/web-design/SKILL.md +98 -0
- package/payload/platform/plugins/web-designer/skills/web-design/references/deploy.md +59 -0
- package/payload/platform/plugins/web-designer/skills/web-design/references/e-sign.md +39 -0
- package/payload/platform/plugins/web-designer/skills/web-design/references/gating.md +55 -0
- package/payload/platform/plugins/web-designer/skills/web-design/references/placeholders.md +110 -0
- package/payload/platform/plugins/web-designer/skills/web-design/references/sections.md +52 -0
- package/payload/platform/plugins/web-designer/skills/web-design/templates/index.html +1004 -0
- package/payload/platform/plugins/web-designer/skills/web-design/templates/llms.txt +32 -0
- package/payload/platform/plugins/web-designer/skills/web-intake/SKILL.md +107 -0
- package/payload/platform/plugins/web-designer/skills/web-intake/references/intake.md +103 -0
- package/payload/platform/plugins/whatsapp/PLUGIN.md +7 -1
- package/payload/platform/scripts/merge-whatsapp-split-conversations.mjs +264 -0
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js +22 -6
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/server/public/assets/{AdminLoginScreens-Bex48co9.js → AdminLoginScreens-rlk263u9.js} +1 -1
- package/payload/server/public/assets/{AdminShell-BOmS1NPG.js → AdminShell-C5vWTy2n.js} +1 -1
- package/payload/server/public/assets/{Checkbox-DDlXC5tq.js → Checkbox-Chz6bfy-.js} +1 -1
- package/payload/server/public/assets/{Transcript-CwItbNkx.js → Transcript-Bsx-bGgY.js} +2 -2
- package/payload/server/public/assets/{admin-n9zWE158.js → admin-BnZH758N.js} +1 -1
- package/payload/server/public/assets/{arc-C6-nr5UV.js → arc-DyzjCWmw.js} +1 -1
- package/payload/server/public/assets/architecture-YZFGNWBL-XiVs-N7Z.js +1 -0
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-DIdho_T6.js → architectureDiagram-Q4EWVU46-qWfElD16.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-D5rTTBSy.js → blockDiagram-DXYQGD6D-DO2fFHC3.js} +1 -1
- package/payload/server/public/assets/{browser-CI8DR1YG.js → browser-CIrfyZWe.js} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-pfUVHdmy.js → c4Diagram-AHTNJAMY-Ca-q5gDe.js} +1 -1
- package/payload/server/public/assets/{calendar-WuIAN47H.js → calendar-D6Z8Kmrn.js} +1 -1
- package/payload/server/public/assets/channel-CYBkRz7E.js +1 -0
- package/payload/server/public/assets/chat-h7SytZHx.js +1 -0
- package/payload/server/public/assets/chevron-left-DSTeS1_g.js +1 -0
- package/payload/server/public/assets/{chunk-2KRD3SAO-EF6cdj8U.js → chunk-2KRD3SAO-CX2PxuDw.js} +1 -1
- package/payload/server/public/assets/{chunk-336JU56O-DE-lcZAc.js → chunk-336JU56O-D8l6U4Ne.js} +2 -2
- package/payload/server/public/assets/chunk-426QAEUC-CPhOHriU.js +1 -0
- package/payload/server/public/assets/{chunk-4BX2VUAB--ANCzzyn.js → chunk-4BX2VUAB-CG32Lkbh.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-DTO_X80J.js → chunk-4TB4RGXK-BnAQbO-v.js} +1 -1
- package/payload/server/public/assets/{chunk-55IACEB6-4J3nrz44.js → chunk-55IACEB6-ejqRH2M5.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-jH_eqAHL.js → chunk-5FUZZQ4R-ClkicQ-T.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-C-qU6p6k.js → chunk-5PVQY5BW-Be-mE_rx.js} +1 -1
- package/payload/server/public/assets/{chunk-67CJDMHE-DXxH9Snb.js → chunk-67CJDMHE-DPsemed2.js} +1 -1
- package/payload/server/public/assets/{chunk-7N4EOEYR-CCkxuP7A.js → chunk-7N4EOEYR-BQRQJETl.js} +1 -1
- package/payload/server/public/assets/{chunk-AA7GKIK3-CyItuM8d.js → chunk-AA7GKIK3-B1wcAVCK.js} +1 -1
- package/payload/server/public/assets/{chunk-BSJP7CBP-Bg7gxYNf.js → chunk-BSJP7CBP-DIua053h.js} +1 -1
- package/payload/server/public/assets/{chunk-CIAEETIT-BAXbOqv5.js → chunk-CIAEETIT-C9GHSCS9.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-vdoErQoc.js → chunk-EDXVE4YY-C1T3l1xj.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-Cz_z_6GK.js → chunk-ENJZ2VHE-8kPcXEQC.js} +1 -1
- package/payload/server/public/assets/{chunk-FMBD7UC4-Ck2jvOgW.js → chunk-FMBD7UC4-Bhoeq9sD.js} +1 -1
- package/payload/server/public/assets/{chunk-FOC6F5B3-DucR0Qo8.js → chunk-FOC6F5B3-BIBpJi8I.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-DolYDD7g.js → chunk-ICPOFSXX-DELXp6fj.js} +2 -2
- package/payload/server/public/assets/{chunk-K5T4RW27-FRzx7E5I.js → chunk-K5T4RW27-DdckXldP.js} +1 -1
- package/payload/server/public/assets/{chunk-KGLVRYIC-Bb5S4Bmc.js → chunk-KGLVRYIC-BJhXejKT.js} +1 -1
- package/payload/server/public/assets/{chunk-LIHQZDEY-c8VZJ-lU.js → chunk-LIHQZDEY-BSd8nyM2.js} +1 -1
- package/payload/server/public/assets/{chunk-ORNJ4GCN-BAeh-LZ1.js → chunk-ORNJ4GCN-CBi55uxq.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-BUg7Kysh.js → chunk-OYMX7WX6-Dfbzl8xh.js} +1 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-CDnAAZVJ.js +1 -0
- package/payload/server/public/assets/{chunk-U2HBQHQK-K4r17UTk.js → chunk-U2HBQHQK-BN1w8_Cq.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-Byh-CyxC.js → chunk-X2U36JSP-CrRay1NJ.js} +1 -1
- package/payload/server/public/assets/{chunk-XPW4576I-DC7lhr93.js → chunk-XPW4576I-C_ZE776O.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-B2cu7AEP.js → chunk-YZCP3GAM-CUSlqWBY.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-DH_p8sFX.js → chunk-ZZ45TVLE-BdPUfSiD.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-BdXUKVrS.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DAq-uJr_.js +1 -0
- package/payload/server/public/assets/clone-DQl28-jK.js +1 -0
- package/payload/server/public/assets/{cose-bilkent-S5V4N54A-DeM6JI00.js → cose-bilkent-S5V4N54A-D4E9htTz.js} +1 -1
- package/payload/server/public/assets/{dagre-3drs3e4F.js → dagre-D1B5TQL1.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-C6S-VUtN.js → dagre-KV5264BT-ByuvYV7N.js} +1 -1
- package/payload/server/public/assets/data-CL7CyX1C.js +1 -0
- package/payload/server/public/assets/{diagram-5BDNPKRD-BkvA32I3.js → diagram-5BDNPKRD-B-0KduTa.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-CVwtRMPB.js → diagram-G4DWMVQ6-CSQmo3eB.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-DJ1JVMbd.js → diagram-MMDJMWI5-DK0kWiB3.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-rfj-crtX.js → diagram-TYMM5635-CYbK2reZ.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-TJPuweS5.js → erDiagram-SMLLAGMA-C-JQHvJF.js} +1 -1
- package/payload/server/public/assets/{flatten-BZkoyJ4e.js → flatten-ROVzlo1u.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-LQWEUjbV.js → flowDiagram-DWJPFMVM-OTOd2czg.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-DdYsxKRw.js → ganttDiagram-T4ZO3ILL-BWJ778ou.js} +1 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-BM-KaDZy.js +1 -0
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-sx8-fokM.js → gitGraphDiagram-UUTBAWPF-CkNcyISe.js} +1 -1
- package/payload/server/public/assets/graph-XZJZHzvv.js +51 -0
- package/payload/server/public/assets/{graph-labels-DigwgCWY.js → graph-labels-Cabqmf35.js} +1 -1
- package/payload/server/public/assets/{graphlib-DixeJdCf.js → graphlib-8z59Ng6C.js} +1 -1
- package/payload/server/public/assets/info-OMHHGYJF-CtZajyAB.js +1 -0
- package/payload/server/public/assets/infoDiagram-42DDH7IO-C-_WYlmI.js +2 -0
- package/payload/server/public/assets/{isEmpty-VRKFml5R.js → isEmpty-DXf_sApt.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-BKUCuKhZ.js → ishikawaDiagram-UXIWVN3A-Cg7pRRGp.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-BafZP6pM.js → journeyDiagram-VCZTEJTY-CZT_4r_Z.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-DQ4c6wRv.js → kanban-definition-6JOO6SKY-Dp1Vd5YM.js} +1 -1
- package/payload/server/public/assets/{line-0_x1Wivu.js → line-UPAcwY66.js} +1 -1
- package/payload/server/public/assets/{linear-CZrU-J2V.js → linear-BeeahLKw.js} +1 -1
- package/payload/server/public/assets/maximize-2-DPe-Noig.js +1 -0
- package/payload/server/public/assets/{mermaid-parser.core-DwJ1cyfO.js → mermaid-parser.core-CLKle8df.js} +2 -2
- package/payload/server/public/assets/{mermaid.core-DnUst0He.js → mermaid.core-CwRj5rL5.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-oc-GwerE.js → mindmap-definition-QFDTVHPH-CNQUY9UJ.js} +1 -1
- package/payload/server/public/assets/{operator-D-Ad9OQ5.js → operator-BM_CDyCb.js} +1 -1
- package/payload/server/public/assets/{ordinal-v4prQcuq.js → ordinal-B2r5L1v4.js} +1 -1
- package/payload/server/public/assets/packet-4T2RLAQJ-T-SYedp7.js +1 -0
- package/payload/server/public/assets/{page-BjAKwjlS.js → page-CMIbXzSg.js} +3 -3
- package/payload/server/public/assets/{page-CpSVszGe.js → page-E7I5sEVt.js} +1 -1
- package/payload/server/public/assets/{pdf-render-NQmflZ7K.js → pdf-render-m08Xm2Nm.js} +1 -1
- package/payload/server/public/assets/pie-ZZUOXDRM-BWECFVVd.js +1 -0
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-BnBtQNHM.js → pieDiagram-DEJITSTG-Scnq58FX.js} +1 -1
- package/payload/server/public/assets/{public-CbkiISZZ.js → public-CrdWCSk2.js} +1 -1
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CkNqtzHI.js → quadrantDiagram-34T5L4WZ-wPfZo_vs.js} +1 -1
- package/payload/server/public/assets/radar-PYXPWWZC-Dx0YUklX.js +1 -0
- package/payload/server/public/assets/{reduce-0Mm1v1Rr.js → reduce-CFlDlJf5.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-D7qc27KT.js → requirementDiagram-MS252O5E-yYkH12K2.js} +1 -1
- package/payload/server/public/assets/{rotate-ccw-BYmlylsD.js → rotate-ccw-Dwtj0NJ7.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-2Y4sqRY7.js → sankeyDiagram-XADWPNL6-fVWRBzzV.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-hXOiSHuT.js → sequenceDiagram-FGHM5R23-Dbap3X6h.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-Dq4hhkLA.js → stateDiagram-FHFEXIEX-DkPLAqIh.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DceWO1u6.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-Dn9wBUEw.js → timeline-definition-GMOUNBTQ-DabKBJyd.js} +1 -1
- package/payload/server/public/assets/treeView-SZITEDCU-C3197Rac.js +1 -0
- package/payload/server/public/assets/treemap-W4RFUUIX-BPrpx29h.js +1 -0
- package/payload/server/public/assets/{useSubAccountSwitcher-DxHQSOzT.css → useSubAccountSwitcher-BH-YjP0H.css} +1 -1
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-BKVHJiIt.js → vennDiagram-DHZGUBPP-CaKT7c-c.js} +1 -1
- package/payload/server/public/assets/wardley-RL74JXVD-DW4Jlbhw.js +1 -0
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-Bn9vvpdK.js → wardleyDiagram-NUSXRM2D-BZ5TTSOL.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-FIoMdPB3.js → xychartDiagram-5P7HB3ND-CLfeklJ9.js} +1 -1
- package/payload/server/public/browser.html +4 -4
- package/payload/server/public/calendar.html +5 -5
- package/payload/server/public/chat.html +10 -9
- package/payload/server/public/data.html +9 -8
- package/payload/server/public/graph.html +9 -8
- package/payload/server/public/index.html +12 -11
- package/payload/server/public/operator.html +12 -11
- package/payload/server/public/public.html +10 -9
- package/payload/server/server.js +41 -6
- package/payload/server/public/assets/architecture-YZFGNWBL-DdgmZ93B.js +0 -1
- package/payload/server/public/assets/channel-Da-UUyqx.js +0 -1
- package/payload/server/public/assets/chat-L6IVvC9k.js +0 -1
- package/payload/server/public/assets/chevron-left-uJSGyCGe.js +0 -1
- package/payload/server/public/assets/chunk-426QAEUC-B1kFAxo1.js +0 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-BjE-Glwf.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-Dol3Ogeh.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-VUMj7gWH.js +0 -1
- package/payload/server/public/assets/clone-m7oGrdBC.js +0 -1
- package/payload/server/public/assets/data-4K_negqE.js +0 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-cJEaiQq4.js +0 -1
- package/payload/server/public/assets/graph-UHR4Ez-V.js +0 -51
- package/payload/server/public/assets/info-OMHHGYJF-BUxfOTKa.js +0 -1
- package/payload/server/public/assets/infoDiagram-42DDH7IO-CD-d3Rgf.js +0 -2
- package/payload/server/public/assets/packet-4T2RLAQJ-B9U_2639.js +0 -1
- package/payload/server/public/assets/pie-ZZUOXDRM-Glh-lJOT.js +0 -1
- package/payload/server/public/assets/radar-PYXPWWZC-CTSgob8w.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DTj9o2vZ.js +0 -1
- package/payload/server/public/assets/treeView-SZITEDCU-CXApkW1l.js +0 -1
- package/payload/server/public/assets/treemap-W4RFUUIX-DzvTXAcT.js +0 -1
- package/payload/server/public/assets/wardley-RL74JXVD-BExXV4oI.js +0 -1
- /package/payload/server/public/assets/{_baseFor-C0Y1mc3g.js → _baseFor-BVuIxZJh.js} +0 -0
- /package/payload/server/public/assets/{array-DqLCdDFv.js → array-B9UHiPd-.js} +0 -0
- /package/payload/server/public/assets/{cytoscape.esm-Cn5b4Cdu.js → cytoscape.esm-D5_TRwB-.js} +0 -0
- /package/payload/server/public/assets/{defaultLocale-CrJzLgRD.js → defaultLocale-5eAKkKJC.js} +0 -0
- /package/payload/server/public/assets/{dist-Dlks0Bfw.js → dist-CADCHk0t.js} +0 -0
- /package/payload/server/public/assets/{init-C0r9Gk5G.js → init-DlZdxViB.js} +0 -0
- /package/payload/server/public/assets/{katex-BFwFoEts.js → katex-Xo0SyWvP.js} +0 -0
- /package/payload/server/public/assets/{path-DIKpVbHL.js → path-6uRLdFF7.js} +0 -0
- /package/payload/server/public/assets/{preload-helper-C5gCWwwF.js → preload-helper-CvXuAEud.js} +0 -0
- /package/payload/server/public/assets/{rough.esm-DsHEmXUZ.js → rough.esm-Djo4Abte.js} +0 -0
- /package/payload/server/public/assets/{src-Bv7ZWAzF.js → src-Bi0fLV9t.js} +0 -0
- /package/payload/server/public/assets/{useSubAccountSwitcher-BRWAIbzr.js → useSubAccountSwitcher-BVCMAnWK.js} +0 -0
package/package.json
CHANGED
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
|
|
55
55
|
"plugins": {
|
|
56
56
|
"core": ["admin", "memory", "docs", "cloudflare", "anthropic", "workflows", "work", "scheduling", "email", "contacts", "projects", "prompt-optimiser", "browser"],
|
|
57
|
-
"defaultEnabled": ["business-assistant", "sales"],
|
|
57
|
+
"defaultEnabled": ["business-assistant", "sales", "web-designer"],
|
|
58
58
|
"available": ["connector", "telegram", "deep-research", "whatsapp", "replicate", "linkedin-import", "notion-import", "obsidian-import", "x-import", "slides"],
|
|
59
59
|
"excluded": ["joblogic"]
|
|
60
60
|
},
|
|
@@ -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:
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"connect-timeout-observability.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/connect-timeout-observability.test.ts"],"names":[],"mappings":""}
|
package/payload/platform/plugins/email/mcp/dist/__tests__/connect-timeout-observability.test.js
ADDED
|
@@ -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
|
package/payload/platform/plugins/email/mcp/dist/__tests__/connect-timeout-observability.test.js.map
ADDED
|
@@ -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":"AAAA,OAAO,EAAE,QAAQ,EAA2B,MAAM,UAAU,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
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
|
-
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
1345
|
+
diag("draftDelete", "FAILED", imapFailureDetail(config, err, Date.now() - t0));
|
|
1322
1346
|
throw err;
|
|
1323
1347
|
}
|
|
1324
1348
|
finally {
|