@rubytech/create-maxy-code 0.1.356 → 0.1.358
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/dist/__tests__/claude-ptys-slice.test.js +36 -1
- package/dist/port-resolution.js +18 -1
- package/package.json +1 -1
- package/payload/platform/package-lock.json +237 -0
- package/payload/platform/plugins/admin/mcp/dist/__tests__/capabilities-here.test.js +79 -1
- package/payload/platform/plugins/admin/mcp/dist/__tests__/capabilities-here.test.js.map +1 -1
- package/payload/platform/plugins/admin/mcp/dist/index.js +17 -3
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/mcp/dist/tools/capabilities-here.d.ts +16 -0
- package/payload/platform/plugins/admin/mcp/dist/tools/capabilities-here.d.ts.map +1 -1
- package/payload/platform/plugins/admin/mcp/dist/tools/capabilities-here.js +52 -0
- package/payload/platform/plugins/admin/mcp/dist/tools/capabilities-here.js.map +1 -1
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +59 -1
- package/payload/platform/plugins/cloudflare/PLUGIN.md +7 -1
- package/payload/platform/plugins/cloudflare/bin/__tests__/cf-token.test.sh +195 -0
- package/payload/platform/plugins/cloudflare/bin/cf-token.sh +157 -0
- package/payload/platform/plugins/cloudflare/references/api.md +2 -0
- package/payload/platform/plugins/cloudflare/skills/cloudflare/SKILL.md +14 -0
- package/payload/platform/plugins/cloudflare/skills/site-deploy/SKILL.md +10 -1
- package/payload/platform/plugins/docs/PLUGIN.md +2 -0
- package/payload/platform/plugins/docs/references/claudeai-connectors.md +45 -0
- package/payload/platform/plugins/docs/references/cloudflare.md +6 -0
- package/payload/platform/plugins/docs/references/troubleshooting.md +2 -0
- package/payload/platform/plugins/email/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/email/PLUGIN.md +7 -3
- package/payload/platform/plugins/email/mcp/dist/__tests__/body-extract.test.d.ts +2 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/body-extract.test.d.ts.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/body-extract.test.js +99 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/body-extract.test.js.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/compose-draft-id.test.d.ts +2 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/compose-draft-id.test.d.ts.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/compose-draft-id.test.js +32 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/compose-draft-id.test.js.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/credentials.test.d.ts +2 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/credentials.test.d.ts.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/credentials.test.js +109 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/credentials.test.js.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft-edit.test.js +64 -6
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft-edit.test.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft.test.js +12 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft.test.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-setup.test.js +22 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-setup.test.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/__tests__/imap-drafts.test.js +94 -9
- package/payload/platform/plugins/email/mcp/dist/__tests__/imap-drafts.test.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/__tests__/mail-options.test.js +4 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/mail-options.test.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/index.js +39 -2
- package/payload/platform/plugins/email/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/compose.d.ts +5 -0
- package/payload/platform/plugins/email/mcp/dist/lib/compose.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/compose.js +8 -1
- package/payload/platform/plugins/email/mcp/dist/lib/compose.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/credentials.d.ts +14 -7
- package/payload/platform/plugins/email/mcp/dist/lib/credentials.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/credentials.js +87 -31
- package/payload/platform/plugins/email/mcp/dist/lib/credentials.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts +68 -33
- package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/imap.js +253 -97
- package/payload/platform/plugins/email/mcp/dist/lib/imap.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.d.ts +6 -0
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.js +4 -0
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-draft-edit.d.ts +8 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-draft-edit.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-draft-edit.js +10 -6
- package/payload/platform/plugins/email/mcp/dist/tools/email-draft-edit.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-draft.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-draft.js +4 -2
- package/payload/platform/plugins/email/mcp/dist/tools/email-draft.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-fetch-body.d.ts +15 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-fetch-body.d.ts.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-fetch-body.js +29 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-fetch-body.js.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-setup.js +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-setup.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-status.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-status.js +2 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-status.js.map +1 -1
- package/payload/platform/plugins/email/mcp/package.json +2 -0
- package/payload/platform/plugins/email/references/email-reference.md +21 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-bootstrap.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-bootstrap.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-bootstrap.test.js +60 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/profile-update-bootstrap.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js +11 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js.map +1 -1
- package/payload/platform/scripts/rss-sampler.sh +21 -0
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +1 -0
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/connector-auth.d.ts +31 -0
- package/payload/platform/services/claude-session-manager/dist/connector-auth.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/connector-auth.js +49 -0
- package/payload/platform/services/claude-session-manager/dist/connector-auth.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +24 -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 +214 -17
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts +2 -1
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +24 -4
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
- package/payload/platform/services/webchat-channel/dist/instructions.d.ts +1 -0
- package/payload/platform/services/webchat-channel/dist/instructions.d.ts.map +1 -1
- package/payload/platform/services/webchat-channel/dist/instructions.js +28 -0
- package/payload/platform/services/webchat-channel/dist/instructions.js.map +1 -1
- package/payload/platform/services/webchat-channel/dist/server.d.ts.map +1 -1
- package/payload/platform/services/webchat-channel/dist/server.js +75 -5
- package/payload/platform/services/webchat-channel/dist/server.js.map +1 -1
- package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
- package/payload/server/{chunk-25UVZNFA.js → chunk-CXEC5RWB.js} +26 -3
- package/payload/server/maxy-edge.js +1 -1
- package/payload/server/public/assets/{AdminLoginScreens-4I5CdIWl.js → AdminLoginScreens-Ro_RUTDh.js} +1 -1
- package/payload/server/public/assets/{AdminShell-Bc9F7X_N.js → AdminShell-CmqhpAPU.js} +1 -1
- package/payload/server/public/assets/{Checkbox-DoQV18Ow.js → Checkbox-dYLaMEdh.js} +1 -1
- package/payload/server/public/assets/OperatorConversations-2zJh7qnO.css +1 -0
- package/payload/server/public/assets/OperatorConversations-Cei12sSK.js +9 -0
- package/payload/server/public/assets/{admin-DLsMA09F.js → admin-BldZQrJF.js} +1 -1
- package/payload/server/public/assets/{arc-DpkSQNto.js → arc-Crkz45LN.js} +1 -1
- package/payload/server/public/assets/architecture-YZFGNWBL-Dma4Bgha.js +1 -0
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-Bw7Yq8O9.js → architectureDiagram-Q4EWVU46-C9JThHgP.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-BBtJQFSz.js → blockDiagram-DXYQGD6D-DpsV_HXT.js} +1 -1
- package/payload/server/public/assets/{browser-w6rY_KAO.js → browser-DrXZ4wpy.js} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-JAMgxzOr.js → c4Diagram-AHTNJAMY-CTm_6aKi.js} +1 -1
- package/payload/server/public/assets/{calendar-CvEdDFYd.js → calendar-CQ4TCbO7.js} +1 -1
- package/payload/server/public/assets/channel-B_-5bau1.js +1 -0
- package/payload/server/public/assets/chat-D7w6_NE1.js +1 -0
- package/payload/server/public/assets/{chunk-2KRD3SAO-eDugsc2L.js → chunk-2KRD3SAO-1KSJW1q6.js} +1 -1
- package/payload/server/public/assets/{chunk-336JU56O-BXfECwdC.js → chunk-336JU56O-C3t08Ip-.js} +2 -2
- package/payload/server/public/assets/chunk-426QAEUC-Dirxdwjh.js +1 -0
- package/payload/server/public/assets/{chunk-4BX2VUAB-CByVeKCY.js → chunk-4BX2VUAB-kl1ze33n.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-CpY0DcUB.js → chunk-4TB4RGXK-DxpoDoHg.js} +1 -1
- package/payload/server/public/assets/{chunk-55IACEB6-C3YxgyIb.js → chunk-55IACEB6-WM9VJzha.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-Bc0d7j8A.js → chunk-5FUZZQ4R-CLH63ZH3.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-CTUGMRIa.js → chunk-5PVQY5BW-DCTb8IAT.js} +1 -1
- package/payload/server/public/assets/{chunk-67CJDMHE-CbdPnpLd.js → chunk-67CJDMHE-BSYzyaoH.js} +1 -1
- package/payload/server/public/assets/{chunk-7N4EOEYR-Cjl2kevz.js → chunk-7N4EOEYR-CarJ7O2P.js} +1 -1
- package/payload/server/public/assets/{chunk-AA7GKIK3-BgozIh5p.js → chunk-AA7GKIK3-DTNLyBpH.js} +1 -1
- package/payload/server/public/assets/{chunk-BSJP7CBP-6Ufq45NW.js → chunk-BSJP7CBP-BFmHflHY.js} +1 -1
- package/payload/server/public/assets/{chunk-CIAEETIT-BhhYuMnA.js → chunk-CIAEETIT-BpjG0IzU.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-BfaJ3yDD.js → chunk-EDXVE4YY-2fSowhlW.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-C7-hIGVC.js → chunk-ENJZ2VHE-ClcranGV.js} +1 -1
- package/payload/server/public/assets/{chunk-FMBD7UC4-BQvvyocF.js → chunk-FMBD7UC4-DLq4BItQ.js} +1 -1
- package/payload/server/public/assets/{chunk-FOC6F5B3-C6rBDOxH.js → chunk-FOC6F5B3-B9QI3Guz.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-BjOJvkVa.js → chunk-ICPOFSXX-BAr-Mv1Z.js} +2 -2
- package/payload/server/public/assets/{chunk-K5T4RW27-kKowRHhn.js → chunk-K5T4RW27-8PvAHasY.js} +1 -1
- package/payload/server/public/assets/{chunk-KGLVRYIC-bAEV_5eH.js → chunk-KGLVRYIC--aGaDRH5.js} +1 -1
- package/payload/server/public/assets/{chunk-LIHQZDEY-BLvsQAfg.js → chunk-LIHQZDEY-BrWj7mw2.js} +1 -1
- package/payload/server/public/assets/{chunk-ORNJ4GCN-BzYZfPZ7.js → chunk-ORNJ4GCN-kYQmkMTi.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-CL7WRw42.js → chunk-OYMX7WX6-CIsryCWH.js} +1 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-Duipo1kI.js +1 -0
- package/payload/server/public/assets/{chunk-U2HBQHQK-BdcVGjau.js → chunk-U2HBQHQK-68X653e3.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-C0CL_Jin.js → chunk-X2U36JSP-v3v9soX3.js} +1 -1
- package/payload/server/public/assets/{chunk-XPW4576I-CsV7CUxH.js → chunk-XPW4576I-CW5DPpop.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-Cj0_fLkR.js → chunk-YZCP3GAM-B1VP7Rl2.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-DLuquyoY.js → chunk-ZZ45TVLE-DiJrujNY.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-B3kX5SuB.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-D761c7Lr.js +1 -0
- package/payload/server/public/assets/clone-BrhFv6Tb.js +1 -0
- package/payload/server/public/assets/{cose-bilkent-S5V4N54A-BU3EOLXX.js → cose-bilkent-S5V4N54A-BscXxLMc.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-CoCAYhFc.js → dagre-KV5264BT-DVgGlTQ1.js} +1 -1
- package/payload/server/public/assets/{dagre-BRq8C9NU.js → dagre-MBv6WlCS.js} +1 -1
- package/payload/server/public/assets/data-Dc5XNWgF.js +1 -0
- package/payload/server/public/assets/{diagram-5BDNPKRD-DBy5GNaQ.js → diagram-5BDNPKRD-BmhCaO0a.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-l93MsBLv.js → diagram-G4DWMVQ6-ChU9L8vz.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-BIfXkVlL.js → diagram-MMDJMWI5-Oy409Zc_.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-BuTJLBny.js → diagram-TYMM5635-Cn1YByqk.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-BwPxWDbP.js → erDiagram-SMLLAGMA-e17yfLvr.js} +1 -1
- package/payload/server/public/assets/{flatten-DtM0XAMt.js → flatten-Cl1Bc3dR.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-BhPtHXMR.js → flowDiagram-DWJPFMVM-Dqt7sCVZ.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BlXjprdD.js → ganttDiagram-T4ZO3ILL-B4IhwS2r.js} +1 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-BCQAqtLy.js +1 -0
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-BW36BDiu.js → gitGraphDiagram-UUTBAWPF-BDw-PKcI.js} +1 -1
- package/payload/server/public/assets/{graph-BrwfYOr3.js → graph-l_3_j3I9.js} +3 -3
- package/payload/server/public/assets/{graph-labels-BNZ8u8TE.js → graph-labels-CJj55nHk.js} +1 -1
- package/payload/server/public/assets/{graphlib-Bjg3Tq-k.js → graphlib-DPIYk_sg.js} +1 -1
- package/payload/server/public/assets/info-OMHHGYJF-qU7hK50T.js +1 -0
- package/payload/server/public/assets/infoDiagram-42DDH7IO-KGdcJeTs.js +2 -0
- package/payload/server/public/assets/{isEmpty-D__iH1WQ.js → isEmpty-D1pGOD1J.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-CmB-bA_O.js → ishikawaDiagram-UXIWVN3A-BRIHsB3G.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-Bt1fJKmc.js → journeyDiagram-VCZTEJTY-aKNgmoHd.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-DVbksz_J.js → kanban-definition-6JOO6SKY-cwBwT-nm.js} +1 -1
- package/payload/server/public/assets/{line-BX2Ugx3B.js → line-DVtVRzUA.js} +1 -1
- package/payload/server/public/assets/{linear-Bdc-QJWI.js → linear-DtoOFPO2.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-qv1e-J5x.js → mermaid-parser.core-G7YD_zO3.js} +2 -2
- package/payload/server/public/assets/{mermaid.core-C_d9YQX_.js → mermaid.core-DpFyndHm.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-DwKGvF14.js → mindmap-definition-QFDTVHPH-CYXK_Pvz.js} +1 -1
- package/payload/server/public/assets/{operator-BNY1P_mH.js → operator-CKmOgXNa.js} +1 -1
- package/payload/server/public/assets/{ordinal-BRQ5CzZY.js → ordinal-CBZeH4Yp.js} +1 -1
- package/payload/server/public/assets/packet-4T2RLAQJ-DiU2yS9m.js +1 -0
- package/payload/server/public/assets/page-hG7xTrcO.js +32 -0
- package/payload/server/public/assets/pie-ZZUOXDRM-zHUKKlVv.js +1 -0
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-dUvQC_4S.js → pieDiagram-DEJITSTG-DFo4N6WH.js} +1 -1
- package/payload/server/public/assets/{public-CDzw6yjH.js → public-smrhkkxD.js} +1 -1
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CebX_oPa.js → quadrantDiagram-34T5L4WZ-BlH5iIhl.js} +1 -1
- package/payload/server/public/assets/radar-PYXPWWZC-BUnVoaPg.js +1 -0
- package/payload/server/public/assets/{reduce-CkcXOmmJ.js → reduce-PuPlFPRX.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-h2euIqGj.js → requirementDiagram-MS252O5E-D5WLty8A.js} +1 -1
- package/payload/server/public/assets/rotate-ccw-Dd8aAvU7.js +1 -0
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-DCii3fkF.js → sankeyDiagram-XADWPNL6-vB85IxHG.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-CQSGYmlq.js → sequenceDiagram-FGHM5R23-Cxraa0Ee.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-CVtU0iXH.js → stateDiagram-FHFEXIEX-BBPssYBx.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BWmmUwDt.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-ChvsBltI.js → timeline-definition-GMOUNBTQ-Bgk6PT62.js} +1 -1
- package/payload/server/public/assets/treeView-SZITEDCU-C3Y-Q52h.js +1 -0
- package/payload/server/public/assets/treemap-W4RFUUIX-Dk0qZpAg.js +1 -0
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-e-EZiiba.js → vennDiagram-DHZGUBPP-B-APTs3L.js} +1 -1
- package/payload/server/public/assets/wardley-RL74JXVD-BAWI02OA.js +1 -0
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-4JaRn1s5.js → wardleyDiagram-NUSXRM2D-CkXJSs_i.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-kxwmCNuM.js → xychartDiagram-5P7HB3ND-BkyshPMV.js} +1 -1
- package/payload/server/public/browser.html +4 -4
- package/payload/server/public/calendar.html +4 -4
- package/payload/server/public/chat.html +7 -6
- package/payload/server/public/data.html +4 -4
- package/payload/server/public/graph.html +7 -6
- package/payload/server/public/index.html +6 -6
- package/payload/server/public/operator.html +9 -8
- package/payload/server/public/public.html +7 -6
- package/payload/server/server.js +255 -26
- package/payload/server/userprofile-reconcile-GLGKDVQQ.js +48 -0
- package/payload/server/public/assets/OperatorConversations-BJY9FZbr.js +0 -9
- package/payload/server/public/assets/OperatorConversations-C1I78hON.css +0 -1
- package/payload/server/public/assets/architecture-YZFGNWBL-Csj53u5T.js +0 -1
- package/payload/server/public/assets/channel-BUQUAUts.js +0 -1
- package/payload/server/public/assets/chat-BlOWMUVI.js +0 -1
- package/payload/server/public/assets/chunk-426QAEUC-CdknReB2.js +0 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-8tHoEDE9.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-BEGZ3DLg.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DsLxnm5U.js +0 -1
- package/payload/server/public/assets/clone-uiXbH_kh.js +0 -1
- package/payload/server/public/assets/data-p3T_EZFq.js +0 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-D_2KrZoP.js +0 -1
- package/payload/server/public/assets/info-OMHHGYJF-BP2TNwQ4.js +0 -1
- package/payload/server/public/assets/infoDiagram-42DDH7IO-D1kDtBOY.js +0 -2
- package/payload/server/public/assets/packet-4T2RLAQJ-BDg8fde8.js +0 -1
- package/payload/server/public/assets/page-CtygoIXt.js +0 -32
- package/payload/server/public/assets/pie-ZZUOXDRM-CXDyYMkZ.js +0 -1
- package/payload/server/public/assets/radar-PYXPWWZC-xen_zv8F.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BywcXjtb.js +0 -1
- package/payload/server/public/assets/treeView-SZITEDCU-2FBf_1It.js +0 -1
- package/payload/server/public/assets/treemap-W4RFUUIX-BDdb30P-.js +0 -1
- package/payload/server/public/assets/wardley-RL74JXVD-BLq5MxjR.js +0 -1
- /package/payload/server/public/assets/{_baseFor-SRtUHe7G.js → _baseFor-brRjpUOX.js} +0 -0
- /package/payload/server/public/assets/{array-BpsnM-Py.js → array-BGFCBI0e.js} +0 -0
- /package/payload/server/public/assets/{cytoscape.esm-D4Rl1H5h.js → cytoscape.esm-TvRJ2tGX.js} +0 -0
- /package/payload/server/public/assets/{defaultLocale-C7sQPl-O.js → defaultLocale-CRZydyG6.js} +0 -0
- /package/payload/server/public/assets/{dist-CtUNt3w8.js → dist-B0CkUodR.js} +0 -0
- /package/payload/server/public/assets/{init-BydxaDEV.js → init-B8gtcn7T.js} +0 -0
- /package/payload/server/public/assets/{katex-B0fVeDx4.js → katex-RxgSu_dy.js} +0 -0
- /package/payload/server/public/assets/{path-jlWYQ2i9.js → path-DZF-JdEe.js} +0 -0
- /package/payload/server/public/assets/{preload-helper-uTix4PVD.js → preload-helper-CQ36nxok.js} +0 -0
- /package/payload/server/public/assets/{rough.esm-c4PR5shF.js → rough.esm-6CnTHTkH.js} +0 -0
- /package/payload/server/public/assets/{src-48kCpScq.js → src-CR_MU8uy.js} +0 -0
package/payload/server/server.js
CHANGED
|
@@ -87,6 +87,7 @@ import {
|
|
|
87
87
|
resolveClientIp,
|
|
88
88
|
resolveDefaultAgentSlug,
|
|
89
89
|
runAdminUserSelfHeal,
|
|
90
|
+
runUserProfileReconcile,
|
|
90
91
|
safeJson,
|
|
91
92
|
sanitizeClientCorrId,
|
|
92
93
|
serve,
|
|
@@ -106,7 +107,7 @@ import {
|
|
|
106
107
|
vncLog,
|
|
107
108
|
walkPremiumBundles,
|
|
108
109
|
writeAdminUserAndPerson
|
|
109
|
-
} from "./chunk-
|
|
110
|
+
} from "./chunk-CXEC5RWB.js";
|
|
110
111
|
import {
|
|
111
112
|
__commonJS,
|
|
112
113
|
__toESM
|
|
@@ -7271,6 +7272,8 @@ var SOURCE_ATTR2 = /\bsource="([^"]+)"/;
|
|
|
7271
7272
|
var SOURCE_MAP = {
|
|
7272
7273
|
whatsapp: "whatsapp",
|
|
7273
7274
|
"whatsapp-channel": "whatsapp",
|
|
7275
|
+
telegram: "telegram",
|
|
7276
|
+
"telegram-channel": "telegram",
|
|
7274
7277
|
webchat: "webchat",
|
|
7275
7278
|
"webchat-channel": "webchat"
|
|
7276
7279
|
};
|
|
@@ -7442,7 +7445,12 @@ function parseTranscript(lines, queuedPendingSuppress = /* @__PURE__ */ new Map(
|
|
|
7442
7445
|
if (text === null) continue;
|
|
7443
7446
|
if (CLI_MARKER_PREFIXES2.some((p) => text.startsWith(p))) continue;
|
|
7444
7447
|
if (HARNESS_LIFECYCLE_PREFIXES.some((p) => text.startsWith(p))) continue;
|
|
7445
|
-
const isChannel = row.isMeta === true && typeof row.origin === "object" && row.origin !== null && row.origin.kind === "channel"
|
|
7448
|
+
const isChannel = row.isMeta === true && typeof row.origin === "object" && row.origin !== null && row.origin.kind === "channel" || // Native Claude Code channels (maxy-lite) journal the delivery twin as a PLAIN
|
|
7449
|
+
// `type:"user"` row whose content is the `<channel source="…">` wrapper, with no
|
|
7450
|
+
// `isMeta`/`origin` stamp. Detect it by the wrapper so it is treated as the
|
|
7451
|
+
// channel twin and consumes the enqueue row's suppression — otherwise the
|
|
7452
|
+
// enqueue row AND this row both render and every channel message doubles.
|
|
7453
|
+
CHANNEL_WRAPPER2.test(text);
|
|
7446
7454
|
if (isChannel) {
|
|
7447
7455
|
renderOrSuppressChannelInbound(unwrapChannel(text), ts, out, queuedPendingSuppress);
|
|
7448
7456
|
} else {
|
|
@@ -8529,6 +8537,7 @@ function conflictingBinding(channel) {
|
|
|
8529
8537
|
}
|
|
8530
8538
|
var NO_INDICATORS = {
|
|
8531
8539
|
activity: null,
|
|
8540
|
+
turnAborted: false,
|
|
8532
8541
|
permissionMode: null,
|
|
8533
8542
|
effectivePermissionMode: null,
|
|
8534
8543
|
model: null,
|
|
@@ -8560,6 +8569,7 @@ async function fetchComposerIndicators(sessionId) {
|
|
|
8560
8569
|
console.log(`[webchat-session] op=context-usage key=${sessionId} turns=${turnCount} used=${usedTokens ?? "absent"} window=${window} pct=${pct ?? "absent"}`);
|
|
8561
8570
|
return {
|
|
8562
8571
|
activity: typeof body.activity === "string" ? body.activity : null,
|
|
8572
|
+
turnAborted: body.turnAborted === true,
|
|
8563
8573
|
permissionMode: typeof body.permissionMode === "string" ? body.permissionMode : null,
|
|
8564
8574
|
effectivePermissionMode: typeof body.effectivePermissionMode === "string" ? body.effectivePermissionMode : null,
|
|
8565
8575
|
model,
|
|
@@ -8598,7 +8608,7 @@ async function managerInterrupt(sessionId, trigger) {
|
|
|
8598
8608
|
try {
|
|
8599
8609
|
port2 = requirePortEnv("CLAUDE_SESSION_MANAGER_PORT", { tag: "webchat:interrupt" });
|
|
8600
8610
|
} catch {
|
|
8601
|
-
return { ok: false, stopped: false, intId: null };
|
|
8611
|
+
return { ok: false, stopped: false, intId: null, deadChild: false };
|
|
8602
8612
|
}
|
|
8603
8613
|
try {
|
|
8604
8614
|
const res = await fetch(`http://127.0.0.1:${port2}/${sessionId}/interrupt`, {
|
|
@@ -8607,15 +8617,16 @@ async function managerInterrupt(sessionId, trigger) {
|
|
|
8607
8617
|
body: JSON.stringify({ byte: "esc", trigger }),
|
|
8608
8618
|
signal: AbortSignal.timeout(INTERRUPT_TIMEOUT_MS)
|
|
8609
8619
|
});
|
|
8610
|
-
if (!res.ok) return { ok: false, stopped: false, intId: null };
|
|
8620
|
+
if (!res.ok) return { ok: false, stopped: false, intId: null, deadChild: false };
|
|
8611
8621
|
const body = await res.json();
|
|
8612
8622
|
return {
|
|
8613
8623
|
ok: true,
|
|
8614
8624
|
stopped: body.stopped === true,
|
|
8615
|
-
intId: typeof body.intId === "string" ? body.intId : null
|
|
8625
|
+
intId: typeof body.intId === "string" ? body.intId : null,
|
|
8626
|
+
deadChild: body.deadChild === true
|
|
8616
8627
|
};
|
|
8617
8628
|
} catch {
|
|
8618
|
-
return { ok: false, stopped: false, intId: null };
|
|
8629
|
+
return { ok: false, stopped: false, intId: null, deadChild: false };
|
|
8619
8630
|
}
|
|
8620
8631
|
}
|
|
8621
8632
|
var MODEL_ID_PATTERN = /^claude-[a-z0-9][a-z0-9.-]*(\[1m\])?$/;
|
|
@@ -8918,7 +8929,7 @@ ${note}` : note;
|
|
|
8918
8929
|
if (!outcome.ok) {
|
|
8919
8930
|
return c.json({ error: "interrupt-failed" }, 502);
|
|
8920
8931
|
}
|
|
8921
|
-
return c.json({ ok: true, stopped: outcome.stopped, intId: outcome.intId }, 200);
|
|
8932
|
+
return c.json({ ok: true, stopped: outcome.stopped, intId: outcome.intId, deadChild: outcome.deadChild }, 200);
|
|
8922
8933
|
});
|
|
8923
8934
|
app55.post("/settings", requireAdminSession, async (c) => {
|
|
8924
8935
|
const body = await c.req.json().catch(() => null);
|
|
@@ -13132,18 +13143,10 @@ function dataUploadCeiling() {
|
|
|
13132
13143
|
const override = Number(process.env.MAXY_DATA_UPLOAD_MAX_BYTES);
|
|
13133
13144
|
return Number.isFinite(override) && override > 0 ? override : MAX_DATA_UPLOAD_BYTES;
|
|
13134
13145
|
}
|
|
13135
|
-
|
|
13136
|
-
const cacheKey = c.var.cacheKey;
|
|
13137
|
-
const accountId = getAccountIdForSession(cacheKey);
|
|
13138
|
-
if (!accountId) {
|
|
13139
|
-
console.error(`[data-upload] op=auth-reject reason="no account for session"`);
|
|
13140
|
-
return c.json({ error: "Account not found for session" }, 401);
|
|
13141
|
-
}
|
|
13146
|
+
async function resolveUploadTarget(c, accountId, uid) {
|
|
13142
13147
|
const rawName = c.req.query("filename") ?? "";
|
|
13143
13148
|
const safeName = basename7(rawName).replace(/[\0/\\]/g, "_");
|
|
13144
|
-
if (!safeName) return
|
|
13145
|
-
const uid = `${Date.now()}-${randomUUID9().slice(0, 8)}`;
|
|
13146
|
-
const declaredBytes = c.req.header("content-length") ?? "unknown";
|
|
13149
|
+
if (!safeName) return { ok: false, status: 400, error: "filename query param required" };
|
|
13147
13150
|
const rawRelpath = c.req.query("relpath") ?? "";
|
|
13148
13151
|
const relpath = rawRelpath !== "" ? rawRelpath : null;
|
|
13149
13152
|
const token = c.req.query("token") ?? "";
|
|
@@ -13151,22 +13154,20 @@ app20.post("/upload", requireAdminSession, async (c) => {
|
|
|
13151
13154
|
const mimeType = (c.req.header("content-type") ?? "").split(";")[0].trim();
|
|
13152
13155
|
if (!SUPPORTED_MIME_TYPES.has(mimeType)) {
|
|
13153
13156
|
console.error(`[data-upload] op=reject-mime uid=${uid} mime="${mimeType}" token=${token} rel="${relpath ?? ""}"`);
|
|
13154
|
-
return
|
|
13155
|
-
error: `Unsupported file type: "${mimeType}". Supported: ${[...SUPPORTED_MIME_TYPES].join(", ")}.`
|
|
13156
|
-
}, 422);
|
|
13157
|
+
return { ok: false, status: 422, error: `Unsupported file type: "${mimeType}". Supported: ${[...SUPPORTED_MIME_TYPES].join(", ")}.` };
|
|
13157
13158
|
}
|
|
13158
13159
|
const rawDir = c.req.query("path") ?? "";
|
|
13159
13160
|
const base = resolveOwnAccountWrite(rawDir, accountId, "POST /api/admin/files/upload");
|
|
13160
|
-
if (!base.ok) return
|
|
13161
|
+
if (!base.ok) return { ok: false, status: base.status, error: base.error };
|
|
13161
13162
|
const relDir = relpath ? dirname6(relpath) : ".";
|
|
13162
13163
|
const destRel = relDir === "." ? base.relative : join25(base.relative, relDir);
|
|
13163
13164
|
if (crossesForeignAccountPartition(destRel, accountId)) {
|
|
13164
13165
|
console.error(`[data] account-scope-blocked endpoint="POST /api/admin/files/upload" path="${destRel}" account=${accountId.slice(0, 8)}\u2026`);
|
|
13165
|
-
return
|
|
13166
|
+
return { ok: false, status: 404, error: "Not found" };
|
|
13166
13167
|
}
|
|
13167
13168
|
if (!isWithinOwnAccountPartition(destRel, accountId)) {
|
|
13168
13169
|
console.error(`[data] write-scope-blocked endpoint="POST /api/admin/files/upload" path="${destRel}" account=${accountId.slice(0, 8)}\u2026`);
|
|
13169
|
-
return
|
|
13170
|
+
return { ok: false, status: 403, error: "Path is outside your account folder" };
|
|
13170
13171
|
}
|
|
13171
13172
|
const destDir = relDir === "." ? base.absolute : resolve21(base.absolute, relDir);
|
|
13172
13173
|
const destPath = resolve21(destDir, finalName);
|
|
@@ -13175,14 +13176,40 @@ app20.post("/upload", requireAdminSession, async (c) => {
|
|
|
13175
13176
|
if (firstCreated) console.error(`[data-upload] op=mkdir uid=${uid} token=${token} dir="${destRel}"`);
|
|
13176
13177
|
} else {
|
|
13177
13178
|
const info = await stat4(destDir).catch(() => null);
|
|
13178
|
-
if (!info || !info.isDirectory()) return
|
|
13179
|
+
if (!info || !info.isDirectory()) return { ok: false, status: 400, error: "Upload destination is not a directory" };
|
|
13179
13180
|
}
|
|
13180
13181
|
const dataRootReal = realpathSync4(DATA_ROOT);
|
|
13181
13182
|
const destDirReal = realpathSync4(destDir);
|
|
13182
13183
|
if (destDirReal !== dataRootReal && !destDirReal.startsWith(dataRootReal + sep6)) {
|
|
13183
13184
|
console.error(`[data-upload] op=path-traversal-blocked uid=${uid} requested="${destRel}" resolved="${destDirReal}"`);
|
|
13184
|
-
return
|
|
13185
|
+
return { ok: false, status: 403, error: "Upload destination escapes DATA_ROOT" };
|
|
13186
|
+
}
|
|
13187
|
+
return { ok: true, destDir, destPath, destRel, finalName, mimeType, relpath, token };
|
|
13188
|
+
}
|
|
13189
|
+
async function logUploadsTmpCensus(accountId) {
|
|
13190
|
+
const tmpDir = resolve21(DATA_ROOT, "accounts", accountId, UPLOAD_TMP_DIR);
|
|
13191
|
+
let live = 0;
|
|
13192
|
+
try {
|
|
13193
|
+
live = (await readdir3(tmpDir)).length;
|
|
13194
|
+
} catch {
|
|
13185
13195
|
}
|
|
13196
|
+
console.error(`[uploads-tmp-census] dir=${accountId} live=${live}`);
|
|
13197
|
+
}
|
|
13198
|
+
app20.post("/upload", requireAdminSession, async (c) => {
|
|
13199
|
+
const cacheKey = c.var.cacheKey;
|
|
13200
|
+
const accountId = getAccountIdForSession(cacheKey);
|
|
13201
|
+
if (!accountId) {
|
|
13202
|
+
console.error(`[data-upload] op=auth-reject reason="no account for session"`);
|
|
13203
|
+
return c.json({ error: "Account not found for session" }, 401);
|
|
13204
|
+
}
|
|
13205
|
+
if (c.req.query("uploadId") !== void 0) {
|
|
13206
|
+
return handleChunkUpload(c, accountId);
|
|
13207
|
+
}
|
|
13208
|
+
const uid = `${Date.now()}-${randomUUID9().slice(0, 8)}`;
|
|
13209
|
+
const declaredBytes = c.req.header("content-length") ?? "unknown";
|
|
13210
|
+
const target = await resolveUploadTarget(c, accountId, uid);
|
|
13211
|
+
if (!target.ok) return c.json({ error: target.error }, target.status);
|
|
13212
|
+
const { destPath, destRel, finalName, mimeType, relpath, token } = target;
|
|
13186
13213
|
const body = c.req.raw.body;
|
|
13187
13214
|
if (!body) return c.json({ error: "Empty request body" }, 400);
|
|
13188
13215
|
console.error(`[data-upload] op=request uid=${uid} account=${accountId} dir="${destRel}" token=${token} rel="${relpath ?? ""}" declaredBytes=${declaredBytes}`);
|
|
@@ -13263,6 +13290,7 @@ app20.post("/upload", requireAdminSession, async (c) => {
|
|
|
13263
13290
|
void indexFile(accountId, relativeDest).catch((err) => {
|
|
13264
13291
|
console.error(`[data-upload] op=index-failed uid=${uid} dest="${relativeDest}" err="${err instanceof Error ? err.message : String(err)}"`);
|
|
13265
13292
|
});
|
|
13293
|
+
void logUploadsTmpCensus(accountId);
|
|
13266
13294
|
return c.json({
|
|
13267
13295
|
path: relativeDest,
|
|
13268
13296
|
filename: finalName,
|
|
@@ -13270,6 +13298,178 @@ app20.post("/upload", requireAdminSession, async (c) => {
|
|
|
13270
13298
|
mimeType
|
|
13271
13299
|
});
|
|
13272
13300
|
});
|
|
13301
|
+
var chunkUploads = /* @__PURE__ */ new Map();
|
|
13302
|
+
async function discardChunkUpload(uploadId, state) {
|
|
13303
|
+
chunkUploads.delete(uploadId);
|
|
13304
|
+
await new Promise((res) => {
|
|
13305
|
+
if (state.out.closed) return res();
|
|
13306
|
+
state.out.once("close", () => res());
|
|
13307
|
+
state.out.destroy();
|
|
13308
|
+
});
|
|
13309
|
+
await unlink2(state.tmpPath).catch(() => {
|
|
13310
|
+
});
|
|
13311
|
+
const tempRemoved = !existsSync23(state.tmpPath);
|
|
13312
|
+
console.error(`[data-upload] op=cleanup uid=${uploadId} tempRemoved=${tempRemoved}`);
|
|
13313
|
+
}
|
|
13314
|
+
async function writeChunkBody(body, out, alreadyReceived, ceiling) {
|
|
13315
|
+
const reader = body.getReader();
|
|
13316
|
+
let written = 0;
|
|
13317
|
+
for (; ; ) {
|
|
13318
|
+
const { done, value } = await reader.read();
|
|
13319
|
+
if (done) break;
|
|
13320
|
+
if (!value) continue;
|
|
13321
|
+
if (alreadyReceived + written + value.byteLength > ceiling) {
|
|
13322
|
+
written += value.byteLength;
|
|
13323
|
+
await reader.cancel().catch(() => {
|
|
13324
|
+
});
|
|
13325
|
+
return { written, overCeiling: true };
|
|
13326
|
+
}
|
|
13327
|
+
written += value.byteLength;
|
|
13328
|
+
if (!out.write(value)) {
|
|
13329
|
+
await new Promise((res, rej) => {
|
|
13330
|
+
const onDrain = () => {
|
|
13331
|
+
out.off("error", onErr);
|
|
13332
|
+
res();
|
|
13333
|
+
};
|
|
13334
|
+
const onErr = (e) => {
|
|
13335
|
+
out.off("drain", onDrain);
|
|
13336
|
+
rej(e);
|
|
13337
|
+
};
|
|
13338
|
+
out.once("drain", onDrain);
|
|
13339
|
+
out.once("error", onErr);
|
|
13340
|
+
});
|
|
13341
|
+
}
|
|
13342
|
+
}
|
|
13343
|
+
return { written, overCeiling: false };
|
|
13344
|
+
}
|
|
13345
|
+
async function handleChunkUpload(c, accountId) {
|
|
13346
|
+
const uploadId = c.req.query("uploadId") ?? "";
|
|
13347
|
+
const seq = Number(c.req.query("seq"));
|
|
13348
|
+
const total = Number(c.req.query("total"));
|
|
13349
|
+
if (!uploadId || !Number.isInteger(seq) || !Number.isInteger(total) || seq < 0 || total < 1 || seq >= total) {
|
|
13350
|
+
return c.json({ error: "Invalid chunk parameters" }, 400);
|
|
13351
|
+
}
|
|
13352
|
+
const body = c.req.raw.body;
|
|
13353
|
+
if (!body) return c.json({ error: "Empty request body" }, 400);
|
|
13354
|
+
const ceiling = dataUploadCeiling();
|
|
13355
|
+
if (seq === 0) {
|
|
13356
|
+
const existing = chunkUploads.get(uploadId);
|
|
13357
|
+
if (existing) {
|
|
13358
|
+
if (existing.accountId !== accountId) {
|
|
13359
|
+
console.error(`[data-upload] op=chunk-gap uid=${uploadId} reason=foreign-seq0`);
|
|
13360
|
+
return c.json({ error: "Chunk out of order \u2014 restart the upload" }, 409);
|
|
13361
|
+
}
|
|
13362
|
+
await discardChunkUpload(uploadId, existing);
|
|
13363
|
+
}
|
|
13364
|
+
const target = await resolveUploadTarget(c, accountId, uploadId);
|
|
13365
|
+
if (!target.ok) return c.json({ error: target.error }, target.status);
|
|
13366
|
+
const tmpDir = resolve21(DATA_ROOT, "accounts", accountId, UPLOAD_TMP_DIR);
|
|
13367
|
+
await mkdir3(tmpDir, { recursive: true });
|
|
13368
|
+
const tmpPath = resolve21(tmpDir, `${uploadId}.part`);
|
|
13369
|
+
const out = createWriteStream2(tmpPath);
|
|
13370
|
+
const state2 = {
|
|
13371
|
+
accountId,
|
|
13372
|
+
destPath: target.destPath,
|
|
13373
|
+
destRel: target.destRel,
|
|
13374
|
+
finalName: target.finalName,
|
|
13375
|
+
tmpPath,
|
|
13376
|
+
out,
|
|
13377
|
+
writeError: null,
|
|
13378
|
+
busy: false,
|
|
13379
|
+
received: 0,
|
|
13380
|
+
nextSeq: 0,
|
|
13381
|
+
total,
|
|
13382
|
+
mimeType: target.mimeType,
|
|
13383
|
+
token: target.token,
|
|
13384
|
+
relpath: target.relpath,
|
|
13385
|
+
t0: Date.now(),
|
|
13386
|
+
lastActivityMs: Date.now()
|
|
13387
|
+
};
|
|
13388
|
+
out.on("error", (e) => {
|
|
13389
|
+
state2.writeError = e;
|
|
13390
|
+
});
|
|
13391
|
+
chunkUploads.set(uploadId, state2);
|
|
13392
|
+
console.error(`[data-upload] op=request uid=${uploadId} account=${accountId} dir="${target.destRel}" token=${target.token} rel="${target.relpath ?? ""}" declaredBytes=chunked total=${total}`);
|
|
13393
|
+
return acceptChunk(c, uploadId, state2, seq, body, ceiling);
|
|
13394
|
+
}
|
|
13395
|
+
const state = chunkUploads.get(uploadId);
|
|
13396
|
+
if (!state || state.accountId !== accountId || seq !== state.nextSeq) {
|
|
13397
|
+
console.error(`[data-upload] op=chunk-gap uid=${uploadId} expected=${state ? state.nextSeq : "none"} got=${seq}`);
|
|
13398
|
+
if (state && state.accountId === accountId) await discardChunkUpload(uploadId, state);
|
|
13399
|
+
return c.json({ error: "Chunk out of order \u2014 restart the upload" }, 409);
|
|
13400
|
+
}
|
|
13401
|
+
return acceptChunk(c, uploadId, state, seq, body, ceiling);
|
|
13402
|
+
}
|
|
13403
|
+
async function acceptChunk(c, uploadId, state, seq, body, ceiling) {
|
|
13404
|
+
if (state.busy) {
|
|
13405
|
+
console.error(`[data-upload] op=chunk-gap uid=${uploadId} expected=${state.nextSeq} got=${seq} reason=busy`);
|
|
13406
|
+
return c.json({ error: "Chunk out of order \u2014 restart the upload" }, 409);
|
|
13407
|
+
}
|
|
13408
|
+
state.busy = true;
|
|
13409
|
+
try {
|
|
13410
|
+
try {
|
|
13411
|
+
const { written, overCeiling } = await writeChunkBody(body, state.out, state.received, ceiling);
|
|
13412
|
+
if (state.writeError) throw state.writeError;
|
|
13413
|
+
state.received += written;
|
|
13414
|
+
if (overCeiling || state.received > ceiling) {
|
|
13415
|
+
console.error(`[data-upload] op=reject-size uid=${uploadId} received=${state.received} ceiling=${ceiling}`);
|
|
13416
|
+
await discardChunkUpload(uploadId, state);
|
|
13417
|
+
return c.json({ error: `File exceeds the ${Math.floor(ceiling / 1024 / 1024)} MB limit.` }, 413);
|
|
13418
|
+
}
|
|
13419
|
+
state.nextSeq = seq + 1;
|
|
13420
|
+
state.lastActivityMs = Date.now();
|
|
13421
|
+
console.error(`[data-upload] op=chunk uid=${uploadId} token=${state.token} seq=${seq}/${state.total} bytes=${written} received=${state.received}`);
|
|
13422
|
+
} catch (err) {
|
|
13423
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
13424
|
+
console.error(`[data-upload] op=error uid=${uploadId} err="${message}" token=${state.token} rel="${state.relpath ?? ""}"`);
|
|
13425
|
+
await discardChunkUpload(uploadId, state);
|
|
13426
|
+
return c.json({ error: message }, 500);
|
|
13427
|
+
}
|
|
13428
|
+
if (seq < state.total - 1) {
|
|
13429
|
+
return c.json({ ok: true, received: state.received, seq, total: state.total });
|
|
13430
|
+
}
|
|
13431
|
+
chunkUploads.delete(uploadId);
|
|
13432
|
+
try {
|
|
13433
|
+
await new Promise((res, rej) => {
|
|
13434
|
+
state.out.once("error", rej);
|
|
13435
|
+
state.out.end(() => res());
|
|
13436
|
+
});
|
|
13437
|
+
await rename(state.tmpPath, state.destPath);
|
|
13438
|
+
} catch (err) {
|
|
13439
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
13440
|
+
console.error(`[data-upload] op=error uid=${uploadId} err="${message}" token=${state.token} rel="${state.relpath ?? ""}"`);
|
|
13441
|
+
await unlink2(state.tmpPath).catch(() => {
|
|
13442
|
+
});
|
|
13443
|
+
return c.json({ error: message }, 500);
|
|
13444
|
+
}
|
|
13445
|
+
const relativeDest = `${state.destRel}/${state.finalName}`;
|
|
13446
|
+
console.error(`[data-upload] op=assemble uid=${uploadId} chunks=${state.total} totalBytes=${state.received} path="${relativeDest}" token=${state.token} ms=${Date.now() - state.t0}`);
|
|
13447
|
+
void indexFile(state.accountId, relativeDest).catch((err) => {
|
|
13448
|
+
console.error(`[data-upload] op=index-failed uid=${uploadId} dest="${relativeDest}" err="${err instanceof Error ? err.message : String(err)}"`);
|
|
13449
|
+
});
|
|
13450
|
+
void logUploadsTmpCensus(state.accountId);
|
|
13451
|
+
return c.json({
|
|
13452
|
+
path: relativeDest,
|
|
13453
|
+
filename: state.finalName,
|
|
13454
|
+
sizeBytes: state.received,
|
|
13455
|
+
mimeType: state.mimeType
|
|
13456
|
+
});
|
|
13457
|
+
} finally {
|
|
13458
|
+
state.busy = false;
|
|
13459
|
+
}
|
|
13460
|
+
}
|
|
13461
|
+
async function evictStaleChunkUploads(ttlMs) {
|
|
13462
|
+
const now = Date.now();
|
|
13463
|
+
let evicted = 0;
|
|
13464
|
+
for (const [uploadId, state] of [...chunkUploads.entries()]) {
|
|
13465
|
+
if (now - state.lastActivityMs > ttlMs) {
|
|
13466
|
+
console.error(`[data-upload] op=cleanup uid=${uploadId} reason=idle-ttl`);
|
|
13467
|
+
await discardChunkUpload(uploadId, state);
|
|
13468
|
+
evicted++;
|
|
13469
|
+
}
|
|
13470
|
+
}
|
|
13471
|
+
return evicted;
|
|
13472
|
+
}
|
|
13273
13473
|
async function sweepStaleUploadTemps() {
|
|
13274
13474
|
const accountsRoot = resolve21(DATA_ROOT, "accounts");
|
|
13275
13475
|
let accounts;
|
|
@@ -16232,6 +16432,16 @@ function managerBase2() {
|
|
|
16232
16432
|
const port2 = requirePortEnv("CLAUDE_SESSION_MANAGER_PORT", { tag: "channel-pty-bridge:manager-client" });
|
|
16233
16433
|
return `http://127.0.0.1:${port2}`;
|
|
16234
16434
|
}
|
|
16435
|
+
async function connectorAuthLogin(opts) {
|
|
16436
|
+
const res = await fetch(`${managerBase2()}/connector-auth-login`, {
|
|
16437
|
+
method: "POST",
|
|
16438
|
+
headers: { "content-type": "application/json" },
|
|
16439
|
+
body: JSON.stringify(opts)
|
|
16440
|
+
});
|
|
16441
|
+
const body = await res.json().catch(() => null);
|
|
16442
|
+
if (!res.ok || !body) return { error: `manager-${res.status}` };
|
|
16443
|
+
return body;
|
|
16444
|
+
}
|
|
16235
16445
|
async function managerSpawn(opts) {
|
|
16236
16446
|
const auth = await ensureAuth();
|
|
16237
16447
|
if (auth.status === "dead" || auth.status === "missing") {
|
|
@@ -19951,6 +20161,19 @@ function createWebchatChannelRoutes(deps) {
|
|
|
19951
20161
|
deps.onReply?.(key, text);
|
|
19952
20162
|
return c.json({ ok: true });
|
|
19953
20163
|
});
|
|
20164
|
+
app55.post("/webchat-channel/connector-auth", async (c) => {
|
|
20165
|
+
const body = await c.req.json().catch(() => null);
|
|
20166
|
+
const key = body?.key;
|
|
20167
|
+
const sessionId = body?.sessionId;
|
|
20168
|
+
const name = body?.name;
|
|
20169
|
+
const completed = body?.completed === true;
|
|
20170
|
+
if (typeof key !== "string" || typeof sessionId !== "string" || typeof name !== "string" || !name.trim()) {
|
|
20171
|
+
return c.json({ error: "key, sessionId and name required" }, 400);
|
|
20172
|
+
}
|
|
20173
|
+
if (!deps.onConnectorAuth) return c.json({ error: "connector-auth-unavailable" }, 503);
|
|
20174
|
+
const result = await deps.onConnectorAuth({ key, sessionId, name, completed });
|
|
20175
|
+
return c.json(result);
|
|
20176
|
+
});
|
|
19954
20177
|
app55.post("/webchat-channel/ready", async (c) => {
|
|
19955
20178
|
const body = await c.req.json().catch(() => null);
|
|
19956
20179
|
const key = body?.key;
|
|
@@ -20230,7 +20453,8 @@ var WebchatGateway = class _WebchatGateway {
|
|
|
20230
20453
|
}
|
|
20231
20454
|
},
|
|
20232
20455
|
onReply: (key, text) => this.handleReply(key, text),
|
|
20233
|
-
awaitPermissionVerdict: (p) => this.awaitPermissionVerdict(p, permissionVerdictTtlMs())
|
|
20456
|
+
awaitPermissionVerdict: (p) => this.awaitPermissionVerdict(p, permissionVerdictTtlMs()),
|
|
20457
|
+
onConnectorAuth: ({ sessionId, name, completed }) => connectorAuthLogin({ sessionId, name, completed })
|
|
20234
20458
|
});
|
|
20235
20459
|
}
|
|
20236
20460
|
/** Run one reconciliation pass: log every terminal delivery event the sweep
|
|
@@ -22800,6 +23024,7 @@ async function runAdminUserReconcileTick() {
|
|
|
22800
23024
|
return;
|
|
22801
23025
|
}
|
|
22802
23026
|
await runAdminUserSelfHeal({ userId, accountId: account.accountId });
|
|
23027
|
+
await runUserProfileReconcile();
|
|
22803
23028
|
} catch (err) {
|
|
22804
23029
|
console.error(`[adminuser-self-heal] rejected: ${err instanceof Error ? err.message : String(err)}`);
|
|
22805
23030
|
}
|
|
@@ -22845,6 +23070,10 @@ void migrateUploads().catch((err) => console.error(`[uploads-migrate] failed err
|
|
|
22845
23070
|
});
|
|
22846
23071
|
});
|
|
22847
23072
|
void sweepStaleUploadTemps().catch((err) => console.error(`[data-upload] op=sweep-failed err="${err instanceof Error ? err.message : String(err)}"`));
|
|
23073
|
+
var CHUNK_IDLE_TTL_MS = 30 * 60 * 1e3;
|
|
23074
|
+
setInterval(() => {
|
|
23075
|
+
void evictStaleChunkUploads(CHUNK_IDLE_TTL_MS).catch((err) => console.error(`[data-upload] op=evict-failed err="${err instanceof Error ? err.message : String(err)}"`));
|
|
23076
|
+
}, 10 * 60 * 1e3).unref();
|
|
22848
23077
|
void migrateAdminWebchatSidecars().catch((err) => console.error(`[sidecar-backfill] failed err="${err instanceof Error ? err.message : String(err)}"`));
|
|
22849
23078
|
try {
|
|
22850
23079
|
const accounts = enumerateValidAccountIds(getAccountsDirFromEnv());
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
|
|
2
|
+
import "./chunk-PFF6I7KP.js";
|
|
3
|
+
|
|
4
|
+
// app/lib/userprofile-reconcile.ts
|
|
5
|
+
function toNum(raw) {
|
|
6
|
+
if (typeof raw === "number") return raw;
|
|
7
|
+
if (raw && typeof raw.toNumber === "function") {
|
|
8
|
+
return raw.toNumber();
|
|
9
|
+
}
|
|
10
|
+
return 0;
|
|
11
|
+
}
|
|
12
|
+
async function reconcileUserProfiles(args) {
|
|
13
|
+
const { driver } = args;
|
|
14
|
+
const serverTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
15
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
16
|
+
const session = driver.session();
|
|
17
|
+
try {
|
|
18
|
+
const provResult = await session.run(
|
|
19
|
+
`MATCH (au:AdminUser)
|
|
20
|
+
WHERE au.accountId IS NOT NULL AND au.userId IS NOT NULL
|
|
21
|
+
AND NOT (au)-[:HAS_PROFILE]->(:UserProfile)
|
|
22
|
+
MERGE (au)-[:HAS_PROFILE]->(up:UserProfile {accountId: au.accountId, userId: au.userId})
|
|
23
|
+
ON CREATE SET
|
|
24
|
+
up.createdAt = $now,
|
|
25
|
+
up.updatedAt = $now,
|
|
26
|
+
up.profileVersion = 0,
|
|
27
|
+
up.scope = 'admin',
|
|
28
|
+
up.timezone = $serverTimezone
|
|
29
|
+
RETURN count(up) AS provisioned`,
|
|
30
|
+
{ now, serverTimezone }
|
|
31
|
+
);
|
|
32
|
+
const provisioned = toNum(provResult.records[0]?.get("provisioned"));
|
|
33
|
+
console.error(`[userprofile-reconcile] provisioned=${provisioned}`);
|
|
34
|
+
const residualResult = await session.run(
|
|
35
|
+
`MATCH (au:AdminUser)
|
|
36
|
+
WHERE NOT (au)-[:HAS_PROFILE]->(:UserProfile)
|
|
37
|
+
RETURN count(au) AS residual`
|
|
38
|
+
);
|
|
39
|
+
const residual = toNum(residualResult.records[0]?.get("residual"));
|
|
40
|
+
console.error(`[userprofile-reconcile] residual=${residual}`);
|
|
41
|
+
return { provisioned, residual };
|
|
42
|
+
} finally {
|
|
43
|
+
await session.close();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
reconcileUserProfiles
|
|
48
|
+
};
|