@rubytech/create-maxy-code 0.1.427 → 0.1.431
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/lib/embed-client/dist/index.d.ts +5 -1
- package/payload/platform/lib/embed-client/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/embed-client/dist/index.js +114 -36
- package/payload/platform/lib/embed-client/dist/index.js.map +1 -1
- package/payload/platform/lib/embed-client/src/index.ts +141 -34
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +72 -4
- package/payload/platform/plugins/docs/PLUGIN.md +1 -0
- package/payload/platform/plugins/docs/references/admin-ui.md +2 -0
- package/payload/platform/plugins/docs/references/internals.md +3 -3
- package/payload/platform/plugins/docs/references/workflows.md +61 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-throughput.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-throughput.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-throughput.test.js +92 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-throughput.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-timeout.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-timeout.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-timeout.test.js +56 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-timeout.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.js +56 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.js.map +1 -1
- package/payload/platform/plugins/whatsapp/mcp/dist/resolve-read-account.d.ts +8 -1
- package/payload/platform/plugins/whatsapp/mcp/dist/resolve-read-account.d.ts.map +1 -1
- package/payload/platform/plugins/whatsapp/mcp/dist/resolve-read-account.js +8 -1
- package/payload/platform/plugins/whatsapp/mcp/dist/resolve-read-account.js.map +1 -1
- package/payload/platform/plugins/work/mcp/dist/lib/embeddings.d.ts +9 -3
- package/payload/platform/plugins/work/mcp/dist/lib/embeddings.d.ts.map +1 -1
- package/payload/platform/plugins/work/mcp/dist/lib/embeddings.js +19 -15
- package/payload/platform/plugins/work/mcp/dist/lib/embeddings.js.map +1 -1
- package/payload/platform/plugins/workflows/PLUGIN.md +29 -9
- package/payload/platform/plugins/workflows/mcp/dist/index.js +34 -0
- package/payload/platform/plugins/workflows/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/lib/embeddings.d.ts +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/lib/embeddings.d.ts.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/lib/embeddings.js +7 -18
- package/payload/platform/plugins/workflows/mcp/dist/lib/embeddings.js.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/lib/step-resolver.d.ts +2 -2
- package/payload/platform/plugins/workflows/mcp/dist/lib/step-resolver.d.ts.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/lib/step-resolver.js.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-create.d.ts +25 -0
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-create.d.ts.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-create.js +14 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-create.js.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.d.ts +25 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.d.ts.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js +79 -15
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-get.d.ts +2 -0
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-get.d.ts.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-get.js +4 -0
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-get.js.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-update.d.ts +3 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-update.d.ts.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-update.js +8 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-update.js.map +1 -1
- package/payload/platform/plugins/workflows/skills/workflow-manager/SKILL.md +24 -3
- package/payload/platform/services/telegram-channel/dist/instructions.js +1 -1
- package/payload/platform/services/telegram-channel/dist/instructions.js.map +1 -1
- package/payload/platform/services/telegram-channel/dist/notification.d.ts +10 -5
- package/payload/platform/services/telegram-channel/dist/notification.d.ts.map +1 -1
- package/payload/platform/services/telegram-channel/dist/notification.js +9 -6
- package/payload/platform/services/telegram-channel/dist/notification.js.map +1 -1
- package/payload/platform/services/telegram-channel/dist/server.d.ts.map +1 -1
- package/payload/platform/services/telegram-channel/dist/server.js +15 -5
- package/payload/platform/services/telegram-channel/dist/server.js.map +1 -1
- package/payload/platform/services/webchat-channel/dist/instructions.js +1 -1
- package/payload/platform/services/webchat-channel/dist/instructions.js.map +1 -1
- package/payload/platform/services/webchat-channel/dist/notification.d.ts +12 -10
- package/payload/platform/services/webchat-channel/dist/notification.d.ts.map +1 -1
- package/payload/platform/services/webchat-channel/dist/notification.js +12 -11
- package/payload/platform/services/webchat-channel/dist/notification.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 +12 -1
- package/payload/platform/services/webchat-channel/dist/server.js.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +11 -6
- package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/notification.js +11 -8
- package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/server.js +39 -14
- package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/targets.d.ts +17 -2
- package/payload/platform/services/whatsapp-channel/dist/targets.d.ts.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/targets.js +37 -2
- package/payload/platform/services/whatsapp-channel/dist/targets.js.map +1 -1
- package/payload/server/{chunk-3Z5WE53X.js → chunk-UUG6ZSO5.js} +65 -9
- package/payload/server/maxy-edge.js +1 -1
- package/payload/server/public/assets/AdminLoginScreens-CcW3pAAZ.js +1 -0
- package/payload/server/public/assets/AdminShell-BfLQQ27Z.js +2 -0
- package/payload/server/public/assets/{Checkbox-B_lfjsqd.js → Checkbox-BC0c_gbn.js} +1 -1
- package/payload/server/public/assets/admin-Co3hOTNp.js +1 -0
- package/payload/server/public/assets/{arc-dVLpR-ec.js → arc-qKfXIt8v.js} +1 -1
- package/payload/server/public/assets/architecture-YZFGNWBL-FPHT7s-C.js +1 -0
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-C6u_CVzb.js → architectureDiagram-Q4EWVU46-DkVrGn7G.js} +1 -1
- package/payload/server/public/assets/audio-attachment-mime-CwYrV1pg.js +2 -0
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-Cy8F5b8O.js → blockDiagram-DXYQGD6D-DqavswGH.js} +1 -1
- package/payload/server/public/assets/{browser-CCWufeXr.js → browser-CvZxNdKw.js} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-DRXrlepj.js → c4Diagram-AHTNJAMY-B7fyKiXe.js} +1 -1
- package/payload/server/public/assets/calendar-DXxLMF2J.js +1 -0
- package/payload/server/public/assets/channel-j70eMvcL.js +1 -0
- package/payload/server/public/assets/chat-rxbGimwf.js +1 -0
- package/payload/server/public/assets/chevron-left-CLPxfjDV.js +1 -0
- package/payload/server/public/assets/{chunk-2KRD3SAO-fEyfhRLz.js → chunk-2KRD3SAO-DsgMtGkv.js} +1 -1
- package/payload/server/public/assets/{chunk-336JU56O-NUWO4y7q.js → chunk-336JU56O-CkdISfNt.js} +2 -2
- package/payload/server/public/assets/chunk-426QAEUC-D-NcAlTW.js +1 -0
- package/payload/server/public/assets/{chunk-4BX2VUAB-BnfiNR3l.js → chunk-4BX2VUAB-CYpiF2bl.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-Bj_aJOz8.js → chunk-4TB4RGXK-CWyc_F7v.js} +1 -1
- package/payload/server/public/assets/{chunk-55IACEB6-aK0DNSKb.js → chunk-55IACEB6-BbzKMw2Z.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-DeqAkq5C.js → chunk-5FUZZQ4R-u19Nai9e.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-SShlujAQ.js → chunk-5PVQY5BW-Ba8by6Uy.js} +1 -1
- package/payload/server/public/assets/{chunk-67CJDMHE-CZpzQ0DL.js → chunk-67CJDMHE-BwUuxtyb.js} +1 -1
- package/payload/server/public/assets/{chunk-7N4EOEYR-COnjO6jy.js → chunk-7N4EOEYR-BRH9iM9L.js} +1 -1
- package/payload/server/public/assets/{chunk-AA7GKIK3-C9V31L2z.js → chunk-AA7GKIK3-BGoztgLL.js} +1 -1
- package/payload/server/public/assets/{chunk-BSJP7CBP-DSwnSGe3.js → chunk-BSJP7CBP-C5GDAZTl.js} +1 -1
- package/payload/server/public/assets/{chunk-CIAEETIT-CnRUTuta.js → chunk-CIAEETIT-ChY32VPS.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-BexiL2LH.js → chunk-EDXVE4YY-CPSD3p6p.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-aTklWdJQ.js → chunk-ENJZ2VHE-D1oL-iUr.js} +1 -1
- package/payload/server/public/assets/{chunk-FMBD7UC4-svcEBQzs.js → chunk-FMBD7UC4-CPvYEr54.js} +1 -1
- package/payload/server/public/assets/{chunk-FOC6F5B3-CG7R7Xri.js → chunk-FOC6F5B3-9Yyj7Vbz.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-CGN7Z4x9.js → chunk-ICPOFSXX-BaYgh8FR.js} +2 -2
- package/payload/server/public/assets/{chunk-K5T4RW27-CWBh78jw.js → chunk-K5T4RW27-5ucpeRvm.js} +1 -1
- package/payload/server/public/assets/{chunk-KGLVRYIC-Ctiq4q-5.js → chunk-KGLVRYIC-DW-FHk7T.js} +1 -1
- package/payload/server/public/assets/{chunk-LIHQZDEY-BII77Q7K.js → chunk-LIHQZDEY-CGGVfAyG.js} +1 -1
- package/payload/server/public/assets/{chunk-ORNJ4GCN-DT7R01H8.js → chunk-ORNJ4GCN-Bv8EUa5d.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-y-Jkbd4C.js → chunk-OYMX7WX6-C1mXJnyw.js} +1 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-CAwbQBtf.js +1 -0
- package/payload/server/public/assets/{chunk-U2HBQHQK-DzFo6KbQ.js → chunk-U2HBQHQK-PwSQz6EP.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-CYSwgtLV.js → chunk-X2U36JSP--NPHTBlU.js} +1 -1
- package/payload/server/public/assets/{chunk-XPW4576I-DHlM4tOn.js → chunk-XPW4576I-Bbc7Da32.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-B20rTmLl.js → chunk-YZCP3GAM-D-9v8e--.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-C7hP4J8m.js → chunk-ZZ45TVLE-CMPg670Q.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-Ct6Rn0vt.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-B_2XCIFv.js +1 -0
- package/payload/server/public/assets/clone-DjPWA_NH.js +1 -0
- package/payload/server/public/assets/{cose-bilkent-S5V4N54A-nKjTv9sR.js → cose-bilkent-S5V4N54A-NVSb1Bhy.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-BNJYTnls.js → dagre-KV5264BT-V2Ai1DFl.js} +1 -1
- package/payload/server/public/assets/{dagre-Cx8LiiUZ.js → dagre-QfLcO-1j.js} +1 -1
- package/payload/server/public/assets/data-D0YFYP1i.js +1 -0
- package/payload/server/public/assets/{diagram-5BDNPKRD-CoAN5_f9.js → diagram-5BDNPKRD-Caw21693.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-pRmsN4_x.js → diagram-G4DWMVQ6-CgwVkT2q.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-CRoylyp4.js → diagram-MMDJMWI5-DFUrLZhs.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-BT3ZtG5b.js → diagram-TYMM5635-CEEiEuZJ.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-DSKws1ZV.js → erDiagram-SMLLAGMA-CG10NrT3.js} +1 -1
- package/payload/server/public/assets/file-download-B2B2DTar.js +1 -0
- package/payload/server/public/assets/{flatten-jn8bZgcI.js → flatten-DAO0sfCM.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-C2L38ZE5.js → flowDiagram-DWJPFMVM-BqkV9Okv.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-Bm2h-vjm.js → ganttDiagram-T4ZO3ILL-DRiCDQF6.js} +1 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-B8Hx7f-D.js +1 -0
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-BoowbF7u.js → gitGraphDiagram-UUTBAWPF-BZV2voyy.js} +1 -1
- package/payload/server/public/assets/graph-DRNzDBTV.js +51 -0
- package/payload/server/public/assets/{graph-labels-BLx-0vyT.js → graph-labels-DxqDdO7G.js} +1 -1
- package/payload/server/public/assets/{graphlib-BvT2s_o1.js → graphlib-DGPThX8M.js} +1 -1
- package/payload/server/public/assets/info-OMHHGYJF-BicCJTqU.js +1 -0
- package/payload/server/public/assets/infoDiagram-42DDH7IO-tf-8rOez.js +2 -0
- package/payload/server/public/assets/{isEmpty-Dkk6_L-B.js → isEmpty-Cb_U81C6.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-nxcmj-IX.js → ishikawaDiagram-UXIWVN3A-BKsAxSvp.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-q5SNIvmS.js → journeyDiagram-VCZTEJTY-CmliuOd-.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-BugG9Q1o.js → kanban-definition-6JOO6SKY-DAlElMb-.js} +1 -1
- package/payload/server/public/assets/{line-MZCQLR-q.js → line-DKZqLKAC.js} +1 -1
- package/payload/server/public/assets/{linear-DmQGNk-g.js → linear-CbSGdh1x.js} +1 -1
- package/payload/server/public/assets/{maximize-2-CnNQnj_v.js → maximize-2-DKx6OBKv.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-DvoeqLxw.js → mermaid-parser.core-DFvbao9C.js} +2 -2
- package/payload/server/public/assets/{mermaid.core-BLaw7iG4.js → mermaid.core-C0vEBxDm.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-DMkt10Vc.js → mindmap-definition-QFDTVHPH-CShASUKd.js} +1 -1
- package/payload/server/public/assets/operator-Djv3MdcL.js +1 -0
- package/payload/server/public/assets/{ordinal-DuJYM7p1.js → ordinal-H0tVmBDP.js} +1 -1
- package/payload/server/public/assets/packet-4T2RLAQJ-Ckn_5hq0.js +1 -0
- package/payload/server/public/assets/page-Ci27UrJz.js +32 -0
- package/payload/server/public/assets/page-D1EAVC_9.js +1 -0
- package/payload/server/public/assets/{pdf-render-riHufgrn.js → pdf-render-jAQU0nXt.js} +1 -1
- package/payload/server/public/assets/pie-ZZUOXDRM-DzlGQW3J.js +1 -0
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-DRp4lD2B.js → pieDiagram-DEJITSTG-CBZHpDAJ.js} +1 -1
- package/payload/server/public/assets/{play-yEkd7ouW.js → play-DHttF4fl.js} +1 -1
- package/payload/server/public/assets/public-C6k-fPfx.js +1 -0
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-DkT63Dn4.js → quadrantDiagram-34T5L4WZ-n3bB3K91.js} +1 -1
- package/payload/server/public/assets/radar-PYXPWWZC-BHo2YD8b.js +1 -0
- package/payload/server/public/assets/{reduce-COyotL2V.js → reduce-DAvwat-a.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-65GGtDkc.js → requirementDiagram-MS252O5E-DiDvQK3c.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-D1vRwLWd.js → sankeyDiagram-XADWPNL6-DWDQQZmd.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-Bp47ZSN2.js → sequenceDiagram-FGHM5R23-DmAqRlBT.js} +1 -1
- package/payload/server/public/assets/square-CHcQHtK8.js +1 -0
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-BZHHcP_e.js → stateDiagram-FHFEXIEX-D4R-n6bZ.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BcFRbGRu.js +1 -0
- package/payload/server/public/assets/tasks-ClfJU1CK.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-DZ1wUyj-.js → timeline-definition-GMOUNBTQ-CjiHGP4l.js} +1 -1
- package/payload/server/public/assets/treeView-SZITEDCU-BtRr5vXp.js +1 -0
- package/payload/server/public/assets/treemap-W4RFUUIX-D8p0sbyo.js +1 -0
- package/payload/server/public/assets/useCopyFeedback-CPEOUSGU.js +1 -0
- package/payload/server/public/assets/{useSubAccountSwitcher-ayajZz8T.css → useSubAccountSwitcher-CdS1CorH.css} +1 -1
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-CttBahsn.js → vennDiagram-DHZGUBPP-CBdDQ7c-.js} +1 -1
- package/payload/server/public/assets/wardley-RL74JXVD-DgMn-9ZJ.js +1 -0
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-Y5tWieZg.js → wardleyDiagram-NUSXRM2D-BlIQPKLb.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-C78A9qbe.js → xychartDiagram-5P7HB3ND-CslKgh9B.js} +1 -1
- package/payload/server/public/browser.html +6 -6
- package/payload/server/public/calendar.html +7 -7
- package/payload/server/public/chat.html +13 -14
- package/payload/server/public/data.html +10 -10
- package/payload/server/public/graph.html +11 -11
- package/payload/server/public/index.html +14 -15
- package/payload/server/public/operator.html +15 -16
- package/payload/server/public/public.html +13 -14
- package/payload/server/public/tasks.html +5 -5
- package/payload/server/server.js +321 -32
- package/payload/server/public/assets/AdminLoginScreens-yAIhWcGc.js +0 -1
- package/payload/server/public/assets/AdminShell-Bk1AFQ4D.js +0 -2
- package/payload/server/public/assets/Transcript-D67OZnVM.js +0 -2
- package/payload/server/public/assets/admin-DuOhkvrZ.js +0 -1
- package/payload/server/public/assets/admin-types-ClHBm0ni.js +0 -1
- package/payload/server/public/assets/architecture-YZFGNWBL-CgeA3HPD.js +0 -1
- package/payload/server/public/assets/calendar-CNk1iPrA.js +0 -1
- package/payload/server/public/assets/channel-B04VBWf7.js +0 -1
- package/payload/server/public/assets/chat-7qB-dwBq.js +0 -1
- package/payload/server/public/assets/chevron-left-CpcDbHIz.js +0 -1
- package/payload/server/public/assets/chunk-426QAEUC-DZkHcXRA.js +0 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-D9Mwgzti.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-CIo_TzfF.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-SzQYvAUZ.js +0 -1
- package/payload/server/public/assets/clone-BVjcjsBA.js +0 -1
- package/payload/server/public/assets/data-BnHcS27X.js +0 -1
- package/payload/server/public/assets/file-download-Hf_UILaA.js +0 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-DzQ18i0T.js +0 -1
- package/payload/server/public/assets/graph-klLugHEK.js +0 -51
- package/payload/server/public/assets/info-OMHHGYJF-CwsoaVzV.js +0 -1
- package/payload/server/public/assets/infoDiagram-42DDH7IO-ieNsH2bV.js +0 -2
- package/payload/server/public/assets/operator-CRcySYv9.js +0 -1
- package/payload/server/public/assets/packet-4T2RLAQJ-DxB-bO4L.js +0 -1
- package/payload/server/public/assets/page-CVo3CWIY.js +0 -1
- package/payload/server/public/assets/page-DPTbZRwl.js +0 -32
- package/payload/server/public/assets/pie-ZZUOXDRM-PSdKvB8-.js +0 -1
- package/payload/server/public/assets/public-Fi6ccYaE.js +0 -1
- package/payload/server/public/assets/radar-PYXPWWZC-D8FqRiWq.js +0 -1
- package/payload/server/public/assets/rotate-ccw-xHksz9mr.js +0 -1
- package/payload/server/public/assets/square-BZqaxg7D.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-qVtoGx56.js +0 -1
- package/payload/server/public/assets/tasks-COWmfts8.js +0 -1
- package/payload/server/public/assets/treeView-SZITEDCU-i-w4rJmQ.js +0 -1
- package/payload/server/public/assets/treemap-W4RFUUIX-Dij6AlAj.js +0 -1
- package/payload/server/public/assets/wardley-RL74JXVD-BJhOQVqW.js +0 -1
- /package/payload/server/public/assets/{_baseFor-Bjj9It3Q.js → _baseFor-D3BqAOBr.js} +0 -0
- /package/payload/server/public/assets/{array-BrrxEo12.js → array-iYP9fzJp.js} +0 -0
- /package/payload/server/public/assets/{cytoscape.esm-CTWJxUxo.js → cytoscape.esm-BQSBzPsB.js} +0 -0
- /package/payload/server/public/assets/{defaultLocale-CFDbRV4k.js → defaultLocale-BrdA1gDi.js} +0 -0
- /package/payload/server/public/assets/{dist-CRpLAnCP.js → dist-Cvgxm7qv.js} +0 -0
- /package/payload/server/public/assets/{init-dXCzGgLP.js → init-Bx0S6pkp.js} +0 -0
- /package/payload/server/public/assets/{katex-CHA1JFYJ.js → katex-BsiH_a6d.js} +0 -0
- /package/payload/server/public/assets/{path-CCRpdXhK.js → path-BLSgTy3w.js} +0 -0
- /package/payload/server/public/assets/{preload-helper-CH6UZRzu.js → preload-helper-ClBMtM1g.js} +0 -0
- /package/payload/server/public/assets/{rough.esm-Bud4g4fh.js → rough.esm-BMOtDaaS.js} +0 -0
- /package/payload/server/public/assets/{src-xN1oULc8.js → src-DV4LKv2E.js} +0 -0
- /package/payload/server/public/assets/{useSubAccountSwitcher-DADvGnr1.js → useSubAccountSwitcher-DyjTbzQR.js} +0 -0
package/payload/server/server.js
CHANGED
|
@@ -75,6 +75,7 @@ import {
|
|
|
75
75
|
loadUserProfile,
|
|
76
76
|
migrateLegacyRemotePassword,
|
|
77
77
|
persistMessage,
|
|
78
|
+
preloadEmbedModel,
|
|
78
79
|
projectAgent,
|
|
79
80
|
reconcileEnabledPlugins,
|
|
80
81
|
recordFailedAttempt,
|
|
@@ -110,7 +111,7 @@ import {
|
|
|
110
111
|
vncLog,
|
|
111
112
|
walkPremiumBundles,
|
|
112
113
|
writeAdminUserAndPerson
|
|
113
|
-
} from "./chunk-
|
|
114
|
+
} from "./chunk-UUG6ZSO5.js";
|
|
114
115
|
import {
|
|
115
116
|
__commonJS,
|
|
116
117
|
__toESM
|
|
@@ -3336,6 +3337,17 @@ var STORE_ROOT = () => join3(process.env.MAXY_DIR_OVERRIDE ?? MAXY_DIR, "data",
|
|
|
3336
3337
|
function conversationFile(platformAccountId, remoteJid) {
|
|
3337
3338
|
return join3(STORE_ROOT(), platformAccountId, `${remoteJid}.jsonl`);
|
|
3338
3339
|
}
|
|
3340
|
+
function listStoredAccountIds() {
|
|
3341
|
+
const root = STORE_ROOT();
|
|
3342
|
+
if (!existsSync3(root)) return [];
|
|
3343
|
+
return readdirSync(root).filter((name) => {
|
|
3344
|
+
try {
|
|
3345
|
+
return statSync2(join3(root, name)).isDirectory();
|
|
3346
|
+
} catch {
|
|
3347
|
+
return false;
|
|
3348
|
+
}
|
|
3349
|
+
});
|
|
3350
|
+
}
|
|
3339
3351
|
function conversationFilePath(platformAccountId, remoteJid) {
|
|
3340
3352
|
return conversationFile(platformAccountId, remoteJid);
|
|
3341
3353
|
}
|
|
@@ -4207,6 +4219,9 @@ var whatsAppConfig = {};
|
|
|
4207
4219
|
var onInboundMessage = null;
|
|
4208
4220
|
var initialized = false;
|
|
4209
4221
|
var messageStore = /* @__PURE__ */ new Map();
|
|
4222
|
+
function messageStoreKey(accountId, remoteJid) {
|
|
4223
|
+
return `${accountId}:${remoteJid}`;
|
|
4224
|
+
}
|
|
4210
4225
|
function storeMessage(storeKey, entry) {
|
|
4211
4226
|
let entries = messageStore.get(storeKey);
|
|
4212
4227
|
if (!entries) {
|
|
@@ -4360,9 +4375,12 @@ function getStatus() {
|
|
|
4360
4375
|
function getSocket(accountId) {
|
|
4361
4376
|
return connections.get(accountId)?.sock ?? null;
|
|
4362
4377
|
}
|
|
4378
|
+
function findConnectionByKey(conns, accountId) {
|
|
4379
|
+
return conns.find((c) => c.accountId === accountId) ?? conns.find((c) => c.platformAccountId === accountId);
|
|
4380
|
+
}
|
|
4363
4381
|
function selectConnection(conns, accountId) {
|
|
4364
4382
|
const presentKeys = conns.map((c) => c.accountId);
|
|
4365
|
-
const conn =
|
|
4383
|
+
const conn = findConnectionByKey(conns, accountId);
|
|
4366
4384
|
if (!conn) return { ok: false, reason: "key-miss", presentKeys };
|
|
4367
4385
|
if (!conn.sock) return { ok: false, reason: "disconnected", presentKeys };
|
|
4368
4386
|
return { ok: true, sock: conn.sock, accountId: conn.accountId };
|
|
@@ -4370,6 +4388,16 @@ function selectConnection(conns, accountId) {
|
|
|
4370
4388
|
function resolveSocket(accountId) {
|
|
4371
4389
|
return selectConnection(Array.from(connections.values()), accountId);
|
|
4372
4390
|
}
|
|
4391
|
+
function selectStoreAccountKey(conns, accountId) {
|
|
4392
|
+
const conn = findConnectionByKey(conns, accountId);
|
|
4393
|
+
return conn ? conn.platformAccountId : accountId;
|
|
4394
|
+
}
|
|
4395
|
+
function resolveReadStoreKey(accountId) {
|
|
4396
|
+
return selectStoreAccountKey(Array.from(connections.values()), accountId);
|
|
4397
|
+
}
|
|
4398
|
+
function listConnectionPlatformAccountIds() {
|
|
4399
|
+
return [...connections.values()].map((conn) => conn.platformAccountId);
|
|
4400
|
+
}
|
|
4373
4401
|
async function registerLoginSocket(accountId, sock, authDir) {
|
|
4374
4402
|
if (!configDir) throw new Error("WhatsApp manager not initialized");
|
|
4375
4403
|
let platformAccountId;
|
|
@@ -4460,11 +4488,11 @@ function reloadConfig(accountConfig) {
|
|
|
4460
4488
|
loadConfig(accountConfig);
|
|
4461
4489
|
}
|
|
4462
4490
|
function getMessages(accountId, jid, limit) {
|
|
4463
|
-
const entries = messageStore.get(
|
|
4491
|
+
const entries = messageStore.get(messageStoreKey(accountId, jid)) ?? [];
|
|
4464
4492
|
return limit ? entries.slice(-limit) : entries.slice();
|
|
4465
4493
|
}
|
|
4466
4494
|
function listConversationJids(accountId) {
|
|
4467
|
-
const prefix =
|
|
4495
|
+
const prefix = messageStoreKey(accountId, "");
|
|
4468
4496
|
const jids = [];
|
|
4469
4497
|
for (const key of messageStore.keys()) {
|
|
4470
4498
|
if (key.startsWith(prefix)) {
|
|
@@ -4473,6 +4501,14 @@ function listConversationJids(accountId) {
|
|
|
4473
4501
|
}
|
|
4474
4502
|
return jids;
|
|
4475
4503
|
}
|
|
4504
|
+
function listStoreAccountKeys() {
|
|
4505
|
+
const accounts = /* @__PURE__ */ new Set();
|
|
4506
|
+
for (const key of messageStore.keys()) {
|
|
4507
|
+
const i = key.indexOf(":");
|
|
4508
|
+
if (i > 0) accounts.add(key.slice(0, i));
|
|
4509
|
+
}
|
|
4510
|
+
return [...accounts];
|
|
4511
|
+
}
|
|
4476
4512
|
async function shutdown() {
|
|
4477
4513
|
await drainCredsSaveQueue();
|
|
4478
4514
|
const ids = Array.from(connections.keys());
|
|
@@ -4682,7 +4718,7 @@ function monitorInbound(conn) {
|
|
|
4682
4718
|
const senderJid = isGroup ? msg.key.participant ?? remoteJid : remoteJid;
|
|
4683
4719
|
const senderPhone = await resolveJidToE164(senderJid, conn.lidMapping) ?? senderJid;
|
|
4684
4720
|
const ts = msg.messageTimestamp ? Number(msg.messageTimestamp) : Math.floor(Date.now() / 1e3);
|
|
4685
|
-
const storeKey =
|
|
4721
|
+
const storeKey = messageStoreKey(conn.platformAccountId, remoteJid);
|
|
4686
4722
|
storeMessage(storeKey, {
|
|
4687
4723
|
id: msg.key.id ?? `${remoteJid}-${ts}`,
|
|
4688
4724
|
sender: senderPhone,
|
|
@@ -4694,7 +4730,7 @@ function monitorInbound(conn) {
|
|
|
4694
4730
|
});
|
|
4695
4731
|
const entries = messageStore.get(storeKey);
|
|
4696
4732
|
console.error(
|
|
4697
|
-
`${TAG13} stored message ${msg.key.id ?? "?"} for ${remoteJid} (type: ${upsert.type}, store size: ${entries?.length ?? 0}/${MESSAGE_STORE_MAX}) account=${conn.
|
|
4733
|
+
`${TAG13} stored message ${msg.key.id ?? "?"} for ${remoteJid} (type: ${upsert.type}, store size: ${entries?.length ?? 0}/${MESSAGE_STORE_MAX}) account=${conn.platformAccountId}`
|
|
4698
4734
|
);
|
|
4699
4735
|
recordActivity({
|
|
4700
4736
|
accountId: conn.accountId,
|
|
@@ -7074,6 +7110,13 @@ function listActiveLoginAccountIds() {
|
|
|
7074
7110
|
return ids;
|
|
7075
7111
|
}
|
|
7076
7112
|
|
|
7113
|
+
// app/lib/whatsapp/store-key-reconcile.ts
|
|
7114
|
+
function reconcileMessageStoreAccountKeys(input) {
|
|
7115
|
+
const reachable = new Set(input.reachableAccountIds);
|
|
7116
|
+
const orphanLiveKeys = input.liveAccountKeys.filter((k) => !reachable.has(k));
|
|
7117
|
+
return { ok: orphanLiveKeys.length === 0, orphanLiveKeys };
|
|
7118
|
+
}
|
|
7119
|
+
|
|
7077
7120
|
// app/lib/whatsapp/outbound/send-document.ts
|
|
7078
7121
|
import { realpathSync as realpathSync3 } from "fs";
|
|
7079
7122
|
import { readFile, stat as stat2 } from "fs/promises";
|
|
@@ -7454,7 +7497,17 @@ app2.get("/status", (c) => {
|
|
|
7454
7497
|
const accounts = [...live, ...reconciled];
|
|
7455
7498
|
const summary = accounts.map((a) => `${a.accountId}:${a.connected ? "up" : a.linkedUnconfigured ? "linked-unconfigured" : "down"}`).join(", ");
|
|
7456
7499
|
console.error(`${TAG21} status accounts=${accounts.length} [${summary}]`);
|
|
7457
|
-
|
|
7500
|
+
const reachableAccountIds = [
|
|
7501
|
+
.../* @__PURE__ */ new Set([...listStoredAccountIds(), ...listConnectionPlatformAccountIds()])
|
|
7502
|
+
];
|
|
7503
|
+
const storeKeyReconcile = reconcileMessageStoreAccountKeys({
|
|
7504
|
+
liveAccountKeys: listStoreAccountKeys(),
|
|
7505
|
+
reachableAccountIds
|
|
7506
|
+
});
|
|
7507
|
+
if (!storeKeyReconcile.ok) {
|
|
7508
|
+
console.warn(`${TAG21} store-key-drift orphanLiveKeys=[${storeKeyReconcile.orphanLiveKeys.join(",")}] \u2014 in-memory cache keyed by a value with no disk account; read tools will miss`);
|
|
7509
|
+
}
|
|
7510
|
+
return c.json({ accounts, storeKeyReconcile });
|
|
7458
7511
|
} catch (err) {
|
|
7459
7512
|
console.error(`${TAG21} status error: ${String(err)}`);
|
|
7460
7513
|
return c.json({ error: String(err) }, 500);
|
|
@@ -7745,9 +7798,10 @@ app2.get("/activity", (c) => {
|
|
|
7745
7798
|
});
|
|
7746
7799
|
app2.get("/conversations", (c) => {
|
|
7747
7800
|
try {
|
|
7748
|
-
const
|
|
7749
|
-
const denial = callerScopeDenial(c,
|
|
7801
|
+
const requestedAccountId = validateAccountId(c.req.query("accountId") ?? null);
|
|
7802
|
+
const denial = callerScopeDenial(c, requestedAccountId);
|
|
7750
7803
|
if (denial) return denial;
|
|
7804
|
+
const accountId = resolveReadStoreKey(requestedAccountId);
|
|
7751
7805
|
const jids = listConversationJids(accountId);
|
|
7752
7806
|
const conversations = jids.map((jid) => {
|
|
7753
7807
|
const messages = getMessages(accountId, jid);
|
|
@@ -7760,7 +7814,7 @@ app2.get("/conversations", (c) => {
|
|
|
7760
7814
|
};
|
|
7761
7815
|
});
|
|
7762
7816
|
conversations.sort((a, b) => (b.lastMessageTimestamp ?? 0) - (a.lastMessageTimestamp ?? 0));
|
|
7763
|
-
console.error(`${TAG21} conversations account=${accountId} count=${conversations.length}`);
|
|
7817
|
+
console.error(`${TAG21} conversations requested=${requestedAccountId} account=${accountId} storeKeyFound=${jids.length > 0} count=${conversations.length}`);
|
|
7764
7818
|
return c.json({ conversations });
|
|
7765
7819
|
} catch (err) {
|
|
7766
7820
|
console.error(`${TAG21} conversations error: ${String(err)}`);
|
|
@@ -7769,9 +7823,10 @@ app2.get("/conversations", (c) => {
|
|
|
7769
7823
|
});
|
|
7770
7824
|
app2.get("/messages", (c) => {
|
|
7771
7825
|
try {
|
|
7772
|
-
const
|
|
7773
|
-
const denial = callerScopeDenial(c,
|
|
7826
|
+
const requestedAccountId = validateAccountId(c.req.query("accountId") ?? null);
|
|
7827
|
+
const denial = callerScopeDenial(c, requestedAccountId);
|
|
7774
7828
|
if (denial) return denial;
|
|
7829
|
+
const accountId = resolveReadStoreKey(requestedAccountId);
|
|
7775
7830
|
const jid = c.req.query("jid");
|
|
7776
7831
|
if (!jid) {
|
|
7777
7832
|
return c.json({ error: "Missing required parameter: jid" }, 400);
|
|
@@ -7780,7 +7835,8 @@ app2.get("/messages", (c) => {
|
|
|
7780
7835
|
const limit = limitParam ? parseInt(limitParam, 10) : void 0;
|
|
7781
7836
|
const effectiveLimit = limit && !Number.isNaN(limit) && limit > 0 ? limit : void 0;
|
|
7782
7837
|
const messages = getMessages(accountId, jid, effectiveLimit);
|
|
7783
|
-
|
|
7838
|
+
const storeKeyFound = listConversationJids(accountId).length > 0;
|
|
7839
|
+
console.error(`${TAG21} messages requested=${requestedAccountId} account=${accountId} jid=${jid} storeKeyFound=${storeKeyFound} limit=${effectiveLimit ?? "all"} returned=${messages.length}`);
|
|
7784
7840
|
return c.json({ messages });
|
|
7785
7841
|
} catch (err) {
|
|
7786
7842
|
console.error(`${TAG21} messages error: ${String(err)}`);
|
|
@@ -8437,14 +8493,14 @@ function joinTextBlocks(content) {
|
|
|
8437
8493
|
}
|
|
8438
8494
|
return parts.join("");
|
|
8439
8495
|
}
|
|
8440
|
-
function assistantTurns(content, ts) {
|
|
8496
|
+
function assistantTurns(content, ts, promoteFinal = false) {
|
|
8441
8497
|
if (!Array.isArray(content)) return [];
|
|
8442
8498
|
const out = [];
|
|
8443
8499
|
for (const block of content) {
|
|
8444
8500
|
if (!block || typeof block !== "object") continue;
|
|
8445
8501
|
const b = block;
|
|
8446
8502
|
if (b.type === "text" && typeof b.text === "string") {
|
|
8447
|
-
out.push({ kind: "agent-text", text: b.text, ts });
|
|
8503
|
+
out.push(promoteFinal && b.text.trim().length > 0 ? { kind: "agent-webchat-final", text: b.text, ts } : { kind: "agent-text", text: b.text, ts });
|
|
8448
8504
|
} else if (b.type === "tool_use" && (b.name === WA_REPLY_TOOL || b.name === WEBCHAT_REPLY_TOOL || b.name === CHANNEL_REPLY_TOOL)) {
|
|
8449
8505
|
const text = b.input?.text;
|
|
8450
8506
|
out.push({ kind: "agent-reply", text: typeof text === "string" ? text : "", ts });
|
|
@@ -8495,7 +8551,7 @@ function renderOrSuppressChannelInbound(u, ts, out, queuedPendingSuppress) {
|
|
|
8495
8551
|
out.push(operatorInboundTurn(u, ts));
|
|
8496
8552
|
}
|
|
8497
8553
|
}
|
|
8498
|
-
function parseTranscript(lines, queuedPendingSuppress = /* @__PURE__ */ new Map()) {
|
|
8554
|
+
function parseTranscript(lines, queuedPendingSuppress = /* @__PURE__ */ new Map(), turnCtx = {}) {
|
|
8499
8555
|
const out = [];
|
|
8500
8556
|
for (const line of lines) {
|
|
8501
8557
|
if (!line || line[0] !== "{") continue;
|
|
@@ -8518,23 +8574,31 @@ function parseTranscript(lines, queuedPendingSuppress = /* @__PURE__ */ new Map(
|
|
|
8518
8574
|
out.push({ kind: "agent-error", code, raw, ts });
|
|
8519
8575
|
continue;
|
|
8520
8576
|
}
|
|
8521
|
-
|
|
8577
|
+
const isEnd = msg?.stop_reason === "end_turn";
|
|
8578
|
+
out.push(...assistantTurns(msg?.content, ts, isEnd && turnCtx.lastChannelSource === "webchat"));
|
|
8522
8579
|
continue;
|
|
8523
8580
|
}
|
|
8524
8581
|
if (row.type === "queue-operation" && row.operation === "enqueue") {
|
|
8525
8582
|
const content = asString(row.content);
|
|
8526
|
-
if (content !== null && CHANNEL_WRAPPER2.test(content)
|
|
8583
|
+
if (content !== null && CHANNEL_WRAPPER2.test(content)) {
|
|
8527
8584
|
const u = unwrapChannel(content);
|
|
8528
|
-
|
|
8529
|
-
|
|
8585
|
+
turnCtx.lastChannelSource = u.source;
|
|
8586
|
+
if (!isScheduleSource(content)) {
|
|
8587
|
+
out.push(operatorInboundTurn(u, ts));
|
|
8588
|
+
queuedPendingSuppress.set(u.text, (queuedPendingSuppress.get(u.text) ?? 0) + 1);
|
|
8589
|
+
}
|
|
8530
8590
|
}
|
|
8531
8591
|
continue;
|
|
8532
8592
|
}
|
|
8533
8593
|
if (row.type === "attachment") {
|
|
8534
8594
|
const att = row.attachment;
|
|
8535
8595
|
const isChannelQueued = att?.type === "queued_command" && att.isMeta === true && typeof att.origin === "object" && att.origin !== null && att.origin.kind === "channel" && typeof att.prompt === "string";
|
|
8536
|
-
if (isChannelQueued
|
|
8537
|
-
|
|
8596
|
+
if (isChannelQueued) {
|
|
8597
|
+
const u = unwrapChannel(att.prompt);
|
|
8598
|
+
turnCtx.lastChannelSource = u.source;
|
|
8599
|
+
if (!isScheduleSource(att.prompt)) {
|
|
8600
|
+
renderOrSuppressChannelInbound(u, ts, out, queuedPendingSuppress);
|
|
8601
|
+
}
|
|
8538
8602
|
}
|
|
8539
8603
|
continue;
|
|
8540
8604
|
}
|
|
@@ -8559,8 +8623,10 @@ function parseTranscript(lines, queuedPendingSuppress = /* @__PURE__ */ new Map(
|
|
|
8559
8623
|
// enqueue row AND this row both render and every channel message doubles.
|
|
8560
8624
|
CHANNEL_WRAPPER2.test(text);
|
|
8561
8625
|
if (isChannel) {
|
|
8626
|
+
const u = unwrapChannel(text);
|
|
8627
|
+
turnCtx.lastChannelSource = u.source;
|
|
8562
8628
|
if (!isScheduleSource(text)) {
|
|
8563
|
-
renderOrSuppressChannelInbound(
|
|
8629
|
+
renderOrSuppressChannelInbound(u, ts, out, queuedPendingSuppress);
|
|
8564
8630
|
}
|
|
8565
8631
|
} else if (row.isMeta === true) {
|
|
8566
8632
|
out.push({ kind: "harness-internal", text, ts });
|
|
@@ -8663,6 +8729,18 @@ function pickActivity(entries, grown, nowMs, concurrencyWindowMs) {
|
|
|
8663
8729
|
return { hex: newest.hex, lastEmitAt: newest.mtimeMs, count };
|
|
8664
8730
|
}
|
|
8665
8731
|
|
|
8732
|
+
// app/admin-types.ts
|
|
8733
|
+
var ACCEPT_MIME = "image/jpeg,image/png,image/gif,image/webp,application/pdf,text/plain,text/markdown,text/csv,text/html,text/calendar,application/zip,application/x-zip-compressed,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.oasis.opendocument.text,text/rtf,application/rtf,audio/ogg,audio/opus,audio/mp4,audio/x-m4a,audio/mpeg,audio/webm,audio/wav,video/mp4,.docx,.odt,.rtf,.opus,.ogg,.m4a,.mp4,.mp3,.wav,.webm";
|
|
8734
|
+
var SUPPORTED_MIME_SET = new Set(ACCEPT_MIME.split(",").filter((t) => !t.startsWith(".")));
|
|
8735
|
+
var MAX_ATTACHMENTS = 5;
|
|
8736
|
+
var MAX_FILE_BYTES = 50 * 1024 * 1024;
|
|
8737
|
+
|
|
8738
|
+
// app/lib/audio-attachment-mime.ts
|
|
8739
|
+
function isMimeAdmitted(mimeType, supportedSet) {
|
|
8740
|
+
const bare = mimeType.split(";")[0].trim().toLowerCase();
|
|
8741
|
+
return supportedSet.has(bare);
|
|
8742
|
+
}
|
|
8743
|
+
|
|
8666
8744
|
// server/routes/whatsapp-reader.ts
|
|
8667
8745
|
var app4 = new Hono();
|
|
8668
8746
|
app4.get("/conversations", requireAdminSession, async (c) => {
|
|
@@ -8988,6 +9066,7 @@ data: ${JSON.stringify(obj)}
|
|
|
8988
9066
|
log: (line) => console.log(line)
|
|
8989
9067
|
});
|
|
8990
9068
|
const queuedPendingSuppress = /* @__PURE__ */ new Map();
|
|
9069
|
+
const turnCtx = {};
|
|
8991
9070
|
const drain = () => {
|
|
8992
9071
|
try {
|
|
8993
9072
|
const { buf, end } = readFrom(jsonlPath, offset);
|
|
@@ -8995,7 +9074,7 @@ data: ${JSON.stringify(obj)}
|
|
|
8995
9074
|
const { lines, nextOffset } = splitNewLines(buf, offset);
|
|
8996
9075
|
offset = nextOffset;
|
|
8997
9076
|
let n = 0;
|
|
8998
|
-
for (const turn of parseTranscript(lines, queuedPendingSuppress)) {
|
|
9077
|
+
for (const turn of parseTranscript(lines, queuedPendingSuppress, turnCtx)) {
|
|
8999
9078
|
send(controller, enrichAdminAttachments(enrichDownloads(turn, scratchpadRoot)), offset);
|
|
9000
9079
|
actx.lastParentTurns.push(turn);
|
|
9001
9080
|
if (turn.kind === "agent-error") {
|
|
@@ -9015,7 +9094,7 @@ data: ${JSON.stringify(obj)}
|
|
|
9015
9094
|
const { buf, end } = readFrom(jsonlPath, 0);
|
|
9016
9095
|
offset = end;
|
|
9017
9096
|
let n = 0;
|
|
9018
|
-
for (const turn of parseTranscript(buf.toString("utf8").split("\n"), queuedPendingSuppress)) {
|
|
9097
|
+
for (const turn of parseTranscript(buf.toString("utf8").split("\n"), queuedPendingSuppress, turnCtx)) {
|
|
9019
9098
|
send(controller, enrichAdminAttachments(enrichDownloads(turn, scratchpadRoot)), offset);
|
|
9020
9099
|
actx.lastParentTurns.push(turn);
|
|
9021
9100
|
if (turn.kind === "agent-error") {
|
|
@@ -9140,7 +9219,8 @@ app4.get("/store-stream", requireAdminSession, (c) => {
|
|
|
9140
9219
|
text: r.body,
|
|
9141
9220
|
ts: r.dateSent,
|
|
9142
9221
|
fromMe: r.fromMe,
|
|
9143
|
-
senderName: r.senderName
|
|
9222
|
+
senderName: r.senderName,
|
|
9223
|
+
origin: r.origin
|
|
9144
9224
|
});
|
|
9145
9225
|
const readable = new ReadableStream({
|
|
9146
9226
|
start(controller) {
|
|
@@ -9233,6 +9313,167 @@ data: ${JSON.stringify(turn)}
|
|
|
9233
9313
|
headers: { "Content-Type": "text/event-stream", "Cache-Control": "no-cache", Connection: "keep-alive" }
|
|
9234
9314
|
});
|
|
9235
9315
|
});
|
|
9316
|
+
var MANUAL_TAG = "[wa-manual-send]";
|
|
9317
|
+
function mediaTypeForMime(mime) {
|
|
9318
|
+
if (mime.startsWith("image/")) return "image";
|
|
9319
|
+
if (mime.startsWith("audio/")) return "audio";
|
|
9320
|
+
if (mime.startsWith("video/")) return "video";
|
|
9321
|
+
return null;
|
|
9322
|
+
}
|
|
9323
|
+
app4.post("/reply", requireAdminSession, async (c) => {
|
|
9324
|
+
const sendId = process.hrtime.bigint().toString(36).slice(-8);
|
|
9325
|
+
const t0 = Date.now();
|
|
9326
|
+
const exit = (outcome) => console.log(`${MANUAL_TAG} op=exit sendId=${sendId} ranMs=${Date.now() - t0} outcome=${outcome}`);
|
|
9327
|
+
try {
|
|
9328
|
+
const ct = c.req.header("content-type") ?? "";
|
|
9329
|
+
let accountIdRaw;
|
|
9330
|
+
let remoteJid;
|
|
9331
|
+
let text;
|
|
9332
|
+
let files = [];
|
|
9333
|
+
if (ct.includes("multipart/form-data")) {
|
|
9334
|
+
const form = await c.req.formData();
|
|
9335
|
+
accountIdRaw = form.get("accountId")?.toString();
|
|
9336
|
+
remoteJid = form.get("remoteJid")?.toString();
|
|
9337
|
+
const t = form.get("text")?.toString();
|
|
9338
|
+
text = t && t.trim().length ? t : void 0;
|
|
9339
|
+
files = form.getAll("files").filter((f) => f instanceof File);
|
|
9340
|
+
} else {
|
|
9341
|
+
const body = await c.req.json().catch(() => ({}));
|
|
9342
|
+
accountIdRaw = typeof body.accountId === "string" ? body.accountId : void 0;
|
|
9343
|
+
remoteJid = typeof body.remoteJid === "string" ? body.remoteJid : void 0;
|
|
9344
|
+
text = typeof body.text === "string" && body.text.trim().length ? body.text : void 0;
|
|
9345
|
+
}
|
|
9346
|
+
console.log(`${MANUAL_TAG} op=request sendId=${sendId} accountId=${accountIdRaw ?? ""} remoteJid=${remoteJid ?? ""} textLen=${text?.length ?? 0} fileCount=${files.length}`);
|
|
9347
|
+
if (!accountIdRaw || !remoteJid) {
|
|
9348
|
+
exit("rejected");
|
|
9349
|
+
return c.json({ error: "accountId and remoteJid are required" }, 400);
|
|
9350
|
+
}
|
|
9351
|
+
if (!text && files.length === 0) {
|
|
9352
|
+
exit("rejected");
|
|
9353
|
+
return c.json({ error: "nothing to send: provide text or attachments" }, 400);
|
|
9354
|
+
}
|
|
9355
|
+
if (files.length > MAX_ATTACHMENTS) {
|
|
9356
|
+
exit("rejected");
|
|
9357
|
+
return c.json({ error: `at most ${MAX_ATTACHMENTS} attachments` }, 400);
|
|
9358
|
+
}
|
|
9359
|
+
let accountId;
|
|
9360
|
+
try {
|
|
9361
|
+
accountId = validateAccountId(accountIdRaw);
|
|
9362
|
+
} catch {
|
|
9363
|
+
exit("rejected");
|
|
9364
|
+
return c.json({ error: "invalid accountId" }, 400);
|
|
9365
|
+
}
|
|
9366
|
+
const validAccount = isValidAccountId(accountId);
|
|
9367
|
+
console.log(`${MANUAL_TAG} op=scope sendId=${sendId} accountId=${accountId} validAccount=${validAccount}`);
|
|
9368
|
+
if (!validAccount) {
|
|
9369
|
+
exit("rejected");
|
|
9370
|
+
return c.json({ error: "unknown account" }, 400);
|
|
9371
|
+
}
|
|
9372
|
+
if (isGroupJid(remoteJid)) {
|
|
9373
|
+
console.log(`${MANUAL_TAG} op=reject sendId=${sendId} reason=group-send-blocked`);
|
|
9374
|
+
exit("rejected");
|
|
9375
|
+
return c.json({ error: "group conversations are read-only", reason: "group-send-blocked" }, 403);
|
|
9376
|
+
}
|
|
9377
|
+
if (!isUserJid(remoteJid)) {
|
|
9378
|
+
exit("rejected");
|
|
9379
|
+
return c.json({ error: "invalid remoteJid" }, 400);
|
|
9380
|
+
}
|
|
9381
|
+
const convo = readConversation(accountId, remoteJid);
|
|
9382
|
+
const hasConversation = convo.length > 0;
|
|
9383
|
+
console.log(`${MANUAL_TAG} op=guard sendId=${sendId} remoteJid=${remoteJid} hasConversation=${hasConversation}`);
|
|
9384
|
+
if (!hasConversation) {
|
|
9385
|
+
console.log(`${MANUAL_TAG} op=reject sendId=${sendId} reason=no-existing-conversation`);
|
|
9386
|
+
exit("rejected");
|
|
9387
|
+
return c.json({ error: "no existing conversation with this contact", reason: "no-existing-conversation" }, 403);
|
|
9388
|
+
}
|
|
9389
|
+
const template = convo[convo.length - 1];
|
|
9390
|
+
for (const f of files) {
|
|
9391
|
+
if (!isMimeAdmitted(f.type, SUPPORTED_MIME_SET)) {
|
|
9392
|
+
exit("rejected");
|
|
9393
|
+
return c.json({ error: `unsupported file type: ${f.type}` }, 400);
|
|
9394
|
+
}
|
|
9395
|
+
if (f.size > MAX_FILE_BYTES) {
|
|
9396
|
+
exit("rejected");
|
|
9397
|
+
return c.json({ error: `"${f.name}" exceeds the 50 MB limit` }, 400);
|
|
9398
|
+
}
|
|
9399
|
+
}
|
|
9400
|
+
const res = resolveSocket(accountId);
|
|
9401
|
+
if (!res.ok) {
|
|
9402
|
+
console.log(`${MANUAL_TAG} op=socket sendId=${sendId} accountId=${accountId} result=${res.reason} presentKeys=${res.presentKeys.join(",") || "none"}`);
|
|
9403
|
+
exit("error");
|
|
9404
|
+
if (res.reason === "key-miss") return c.json({ error: `No WhatsApp socket is registered for account "${accountId}" (present: ${res.presentKeys.join(", ") || "none"}). This is an account-keying mismatch, not a dropped connection.` }, 503);
|
|
9405
|
+
return c.json({ error: `WhatsApp account "${accountId}" is registered but its socket is disconnected.` }, 503);
|
|
9406
|
+
}
|
|
9407
|
+
console.log(`${MANUAL_TAG} op=socket sendId=${sendId} accountId=${accountId} result=ok socketAccountId=${res.accountId}`);
|
|
9408
|
+
const record = (waMessageId, body) => {
|
|
9409
|
+
const nowIso = (/* @__PURE__ */ new Date()).toISOString();
|
|
9410
|
+
const rec = {
|
|
9411
|
+
messageId: `whatsapp-live:${res.accountId}:${remoteJid}:${waMessageId}`,
|
|
9412
|
+
sessionId: template.sessionId,
|
|
9413
|
+
dateSent: nowIso,
|
|
9414
|
+
body,
|
|
9415
|
+
fromMe: true,
|
|
9416
|
+
senderTelephone: template.fromMe ? template.senderTelephone : "",
|
|
9417
|
+
senderName: null,
|
|
9418
|
+
remoteJid,
|
|
9419
|
+
msgKeyId: waMessageId,
|
|
9420
|
+
quotedId: null,
|
|
9421
|
+
quotedSender: null,
|
|
9422
|
+
scope: template.scope,
|
|
9423
|
+
origin: "operator-manual",
|
|
9424
|
+
createdAt: nowIso
|
|
9425
|
+
};
|
|
9426
|
+
appendMessage(accountId, rec);
|
|
9427
|
+
const present = readConversation(accountId, remoteJid).some((r) => r.messageId === rec.messageId);
|
|
9428
|
+
console.log(`${MANUAL_TAG} op=recorded sendId=${sendId} waMessageId=${waMessageId} present=${present}`);
|
|
9429
|
+
};
|
|
9430
|
+
let sent = 0;
|
|
9431
|
+
if (text) {
|
|
9432
|
+
const r = await sendTextMessage(res.sock, remoteJid, text, { accountId: res.accountId });
|
|
9433
|
+
if (!r.success) {
|
|
9434
|
+
console.log(`${MANUAL_TAG} op=send-fail sendId=${sendId} kind=text error=${r.error ?? ""}`);
|
|
9435
|
+
exit("error");
|
|
9436
|
+
return c.json({ error: r.error ?? "send failed" }, 500);
|
|
9437
|
+
}
|
|
9438
|
+
console.log(`${MANUAL_TAG} op=sent sendId=${sendId} kind=text waMessageId=${r.messageId ?? ""}`);
|
|
9439
|
+
if (r.messageId) record(r.messageId, text);
|
|
9440
|
+
sent++;
|
|
9441
|
+
}
|
|
9442
|
+
for (let i = 0; i < files.length; i++) {
|
|
9443
|
+
const stored = await storeAttachment(accountId, files[i]);
|
|
9444
|
+
console.log(`${MANUAL_TAG} op=staged sendId=${sendId} idx=${i} bytes=${stored.sizeBytes} mime=${stored.mimeType}`);
|
|
9445
|
+
const kind = mediaTypeForMime(stored.mimeType);
|
|
9446
|
+
let mid;
|
|
9447
|
+
if (kind) {
|
|
9448
|
+
const buffer = Buffer.from(await files[i].arrayBuffer());
|
|
9449
|
+
const r = await sendMediaMessage(res.sock, remoteJid, { type: kind, buffer, mimetype: stored.mimeType, filename: stored.filename, ptt: kind === "audio" }, { accountId: res.accountId });
|
|
9450
|
+
if (!r.success) {
|
|
9451
|
+
console.log(`${MANUAL_TAG} op=send-fail sendId=${sendId} kind=${kind} idx=${i} error=${r.error ?? ""}`);
|
|
9452
|
+
exit("error");
|
|
9453
|
+
return c.json({ error: r.error ?? "media send failed" }, 500);
|
|
9454
|
+
}
|
|
9455
|
+
mid = r.messageId;
|
|
9456
|
+
} else {
|
|
9457
|
+
const r = await sendWhatsAppDocument({ to: remoteJid, filePath: stored.storagePath, accountId: res.accountId, maxyAccountId: accountId, platformRoot: PLATFORM_ROOT });
|
|
9458
|
+
if (!r.ok) {
|
|
9459
|
+
console.log(`${MANUAL_TAG} op=send-fail sendId=${sendId} kind=document idx=${i} error=${r.error}`);
|
|
9460
|
+
exit("error");
|
|
9461
|
+
return c.json({ error: r.error }, r.status);
|
|
9462
|
+
}
|
|
9463
|
+
mid = r.messageId;
|
|
9464
|
+
}
|
|
9465
|
+
console.log(`${MANUAL_TAG} op=sent sendId=${sendId} kind=${kind ?? "document"} idx=${i} waMessageId=${mid ?? ""}`);
|
|
9466
|
+
if (mid) record(mid, `[sent ${stored.filename}]`);
|
|
9467
|
+
sent++;
|
|
9468
|
+
}
|
|
9469
|
+
exit("delivered");
|
|
9470
|
+
return c.json({ success: true, sent });
|
|
9471
|
+
} catch (err) {
|
|
9472
|
+
console.error(`${MANUAL_TAG} op=error sendId=${sendId} error=${String(err)}`);
|
|
9473
|
+
exit("error");
|
|
9474
|
+
return c.json({ error: String(err) }, 500);
|
|
9475
|
+
}
|
|
9476
|
+
});
|
|
9236
9477
|
var whatsapp_reader_default = app4;
|
|
9237
9478
|
|
|
9238
9479
|
// server/routes/public-reader.ts
|
|
@@ -21855,7 +22096,24 @@ function createWaChannelRoutes(deps) {
|
|
|
21855
22096
|
if (typeof senderId !== "string" || typeof sessionId !== "string" || typeof replied !== "boolean") {
|
|
21856
22097
|
return c.json({ error: "senderId, sessionId and replied required" }, 400);
|
|
21857
22098
|
}
|
|
22099
|
+
const interactive = body?.interactive === true;
|
|
22100
|
+
const finalText = typeof body?.finalText === "string" ? body.finalText : "";
|
|
21858
22101
|
const sid = sessionId.slice(0, 8);
|
|
22102
|
+
const deliver = interactive && finalText.trim().length > 0;
|
|
22103
|
+
if (deliver) {
|
|
22104
|
+
const bytes = Buffer.byteLength(finalText, "utf8");
|
|
22105
|
+
try {
|
|
22106
|
+
await deps.sendOutbound(senderId, finalText);
|
|
22107
|
+
} catch (err) {
|
|
22108
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
22109
|
+
console.error(
|
|
22110
|
+
`[whatsapp-native] op=turn-strand-anomaly senderId=${senderId} sessionId=${sid} interactive=yes bytes=${bytes} delivered=undelivered error=${message}`
|
|
22111
|
+
);
|
|
22112
|
+
return c.json({ ok: true, delivered: "undelivered" });
|
|
22113
|
+
}
|
|
22114
|
+
console.error(`[whatsapp-native] op=turn-end sessionId=${sid} replied=${replied ? "yes" : "no"} delivered=fallback bytes=${bytes}`);
|
|
22115
|
+
return c.json({ ok: true, delivered: "fallback" });
|
|
22116
|
+
}
|
|
21859
22117
|
if (replied) {
|
|
21860
22118
|
console.error(`[whatsapp-native] op=turn-end sessionId=${sid} replied=yes delivered=reply`);
|
|
21861
22119
|
return c.json({ ok: true, delivered: "reply" });
|
|
@@ -21976,6 +22234,11 @@ var WaGateway = class {
|
|
|
21976
22234
|
console.error(
|
|
21977
22235
|
`[whatsapp-native] op=inbound senderId=${input.senderId} accountId=${input.accountId} bytes=${bytes} ${mediaField} source=${source} delivery=${willDeliverNow ? "immediate" : "queued"}`
|
|
21978
22236
|
);
|
|
22237
|
+
if (source === "schedule" && (hadSubscriber || this.spawning.has(input.senderId))) {
|
|
22238
|
+
console.error(
|
|
22239
|
+
`[whatsapp-native] op=coalesced-onto-live-session eventId=${input.scheduleProvenance?.eventId ?? "-"} senderId=${input.senderId} droppedSeat=${input.scheduledSessionId ?? "-"} reason=${hadSubscriber ? "live-subscriber" : "spawn-in-flight"}`
|
|
22240
|
+
);
|
|
22241
|
+
}
|
|
21979
22242
|
if (!hadSubscriber && !this.spawning.has(input.senderId)) {
|
|
21980
22243
|
this.spawning.add(input.senderId);
|
|
21981
22244
|
console.error(`[whatsapp-native] op=spawn-trigger senderId=${input.senderId}`);
|
|
@@ -22282,17 +22545,20 @@ function createWebchatChannelRoutes(deps) {
|
|
|
22282
22545
|
if (typeof key !== "string" || typeof sessionId !== "string" || typeof replied !== "boolean") {
|
|
22283
22546
|
return c.json({ error: "key, sessionId and replied required" }, 400);
|
|
22284
22547
|
}
|
|
22548
|
+
const interactive = body?.interactive === true;
|
|
22549
|
+
const finalBytes = typeof body?.finalBytes === "number" && Number.isFinite(body.finalBytes) ? body.finalBytes : 0;
|
|
22285
22550
|
const k = key.slice(0, 8);
|
|
22286
22551
|
const sid = sessionId.slice(0, 8);
|
|
22552
|
+
if (interactive && finalBytes > 0) {
|
|
22553
|
+
console.error(`[webchat-native] op=turn-end channel=webchat key=${k} sessionId=${sid} replied=${replied ? "yes" : "no"} delivered=fallback bytes=${finalBytes}`);
|
|
22554
|
+
return c.json({ ok: true, delivered: "fallback" });
|
|
22555
|
+
}
|
|
22287
22556
|
if (replied) {
|
|
22557
|
+
console.error(`[webchat-native] op=turn-end channel=webchat key=${k} sessionId=${sid} delivered=reply`);
|
|
22288
22558
|
return c.json({ ok: true, delivered: "reply" });
|
|
22289
22559
|
}
|
|
22290
|
-
|
|
22291
|
-
|
|
22292
|
-
return c.json({ ok: true, delivered: "none" });
|
|
22293
|
-
}
|
|
22294
|
-
console.error(`[webchat-native] op=turn-undelivered channel=webchat key=${k} sessionId=${sid} bytes=${finalBytes}`);
|
|
22295
|
-
return c.json({ ok: true, delivered: "undelivered" });
|
|
22560
|
+
console.error(`[webchat-native] op=turn-end channel=webchat key=${k} sessionId=${sid} delivered=none`);
|
|
22561
|
+
return c.json({ ok: true, delivered: "none" });
|
|
22296
22562
|
});
|
|
22297
22563
|
return app61;
|
|
22298
22564
|
}
|
|
@@ -23225,7 +23491,24 @@ function createTelegramChannelRoutes(deps) {
|
|
|
23225
23491
|
if (typeof key !== "string" || typeof sessionId !== "string" || typeof replied !== "boolean") {
|
|
23226
23492
|
return c.json({ error: "key, sessionId and replied required" }, 400);
|
|
23227
23493
|
}
|
|
23494
|
+
const interactive = body?.interactive === true;
|
|
23495
|
+
const finalText = typeof body?.finalText === "string" ? body.finalText : "";
|
|
23228
23496
|
const sid = sessionId.slice(0, 8);
|
|
23497
|
+
const deliver = interactive && finalText.trim().length > 0;
|
|
23498
|
+
if (deliver) {
|
|
23499
|
+
const bytes = Buffer.byteLength(finalText, "utf8");
|
|
23500
|
+
try {
|
|
23501
|
+
await deps.sendOutbound(key, finalText);
|
|
23502
|
+
} catch (err) {
|
|
23503
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
23504
|
+
console.error(
|
|
23505
|
+
`[telegram-native] op=turn-strand-anomaly key=${key} sessionId=${sid} interactive=yes bytes=${bytes} delivered=undelivered error=${message}`
|
|
23506
|
+
);
|
|
23507
|
+
return c.json({ ok: true, delivered: "undelivered" });
|
|
23508
|
+
}
|
|
23509
|
+
console.error(`[telegram-native] op=turn-end key=${key} sessionId=${sid} replied=${replied ? "yes" : "no"} delivered=fallback bytes=${bytes}`);
|
|
23510
|
+
return c.json({ ok: true, delivered: "fallback" });
|
|
23511
|
+
}
|
|
23229
23512
|
if (replied) {
|
|
23230
23513
|
console.error(`[telegram-native] op=turn-end key=${key} sessionId=${sid} replied=yes delivered=reply`);
|
|
23231
23514
|
return c.json({ ok: true, delivered: "reply" });
|
|
@@ -23306,6 +23589,11 @@ var TelegramGateway = class {
|
|
|
23306
23589
|
console.error(
|
|
23307
23590
|
`[telegram-native] op=inbound key=${input.senderId} accountId=${input.accountId} botType=${input.role} bytes=${bytes} source=${source} delivery=${willDeliverNow ? "immediate" : "queued"}`
|
|
23308
23591
|
);
|
|
23592
|
+
if (source === "schedule" && (hadSubscriber || this.spawning.has(input.senderId))) {
|
|
23593
|
+
console.error(
|
|
23594
|
+
`[telegram-native] op=coalesced-onto-live-session eventId=${input.scheduleProvenance?.eventId ?? "-"} senderId=${input.senderId} droppedSeat=${input.scheduledSessionId ?? "-"} reason=${hadSubscriber ? "live-subscriber" : "spawn-in-flight"}`
|
|
23595
|
+
);
|
|
23596
|
+
}
|
|
23309
23597
|
if (!hadSubscriber && !this.spawning.has(input.senderId)) {
|
|
23310
23598
|
this.spawning.add(input.senderId);
|
|
23311
23599
|
console.error(`[telegram-native] op=spawn-trigger key=${input.senderId} role=${input.role}`);
|
|
@@ -25351,6 +25639,7 @@ for (const acct of listValidAccounts()) {
|
|
|
25351
25639
|
cleanupLeakedPremiumSubs(acct.accountDir, acct.config, acct.accountId);
|
|
25352
25640
|
}
|
|
25353
25641
|
purgeNonSocketAdminPhonesAtBoot();
|
|
25642
|
+
void preloadEmbedModel();
|
|
25354
25643
|
warnOnChannelAdminBindingDrift();
|
|
25355
25644
|
var bootEnabled = Array.isArray(bootAccountConfig?.enabledPlugins) ? bootAccountConfig.enabledPlugins : [];
|
|
25356
25645
|
var bootDelivered = [];
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{o as e}from"./chunk-Ck5AOu5v.js";import{_ as t,b as n,h as r,w as i,y as a}from"./useSubAccountSwitcher-DADvGnr1.js";import{i as o}from"./admin-types-ClHBm0ni.js";import{b as s,y as c}from"./AdminShell-Bk1AFQ4D.js";import{t as l}from"./Checkbox-B_lfjsqd.js";var u=`admin-landing-redirected`,d=`/graph`;function f(e){return e.variant===`operator`?!1:e.appState===`chat`&&!e.alreadyRedirected}var p=e(i(),1);function m(e=`admin`){let[t,r]=(0,p.useState)(`loading`),[i,a]=(0,p.useState)(``),[c,l]=(0,p.useState)(``),[m,h]=(0,p.useState)(``),[g,_]=(0,p.useState)(!1),[v,y]=(0,p.useState)(!1),[b,x]=(0,p.useState)(!1),[S,C]=(0,p.useState)(!1),[w,T]=(0,p.useState)(!1),[E,D]=(0,p.useState)(null),[O,k]=(0,p.useState)(null),[A,j]=(0,p.useState)(void 0),[M,N]=(0,p.useState)(null),[P,F]=(0,p.useState)(void 0),[I,L]=(0,p.useState)(null),[R,z]=(0,p.useState)(null),[B,V]=(0,p.useState)(void 0),H=(0,p.useRef)(void 0),[U,W]=(0,p.useState)(!1),[G,K]=(0,p.useState)(!0);(0,p.useEffect)(()=>{typeof window>`u`||fetch(`/api/remote-auth/status`).then(e=>e.ok?e.json():null).then(e=>{e?.configured&&W(!0)}).catch(()=>{})},[]);let q=(0,p.useRef)(null),J=(0,p.useRef)(null);(0,p.useEffect)(()=>{async function e(){let e=null;try{e=sessionStorage.getItem(`maxy-admin-session-key`)}catch{}if(!e)return!1;try{let t=await fetch(`/api/admin/session?session_key=${encodeURIComponent(e)}`);if(t.status===401){try{sessionStorage.removeItem(`maxy-admin-session-key`)}catch{}return!1}if(!t.ok)return!1;let n=await t.json();D(n.session_key),z(n.sessionId??null),j(n.businessName),N(n.role??null),F(n.userName===void 0?null:n.userName),L(n.avatar??null);let i=o(n.thinkingView);return H.current=i,V(i),r(`chat`),!0}catch(e){return console.error(`[admin] session restore failed:`,e),!1}}async function t(n=2){try{let i=await fetch(`/api/health`);if(!i.ok){if(n>0)return await new Promise(e=>setTimeout(e,1500)),t(n-1);console.error(`[admin] health check returned ${i.status} after retries`),r(`set-pin`);return}let a=await i.json();if(!a.pin_configured){r(`set-pin`);return}K(!!a.claude_authenticated);let o=!1;try{o=new URLSearchParams(window.location.search).get(`connect`)===`claude`}catch{}if(o){try{let e=new URL(window.location.href);e.searchParams.delete(`connect`),window.history.replaceState(null,``,e.pathname+e.search+e.hash)}catch{}if(!a.claude_authenticated){r(`connect-claude`);return}}if(await e())return;r(`enter-pin`)}catch(e){if(n>0)return await new Promise(e=>setTimeout(e,1500)),t(n-1);console.error(`[admin] health check failed:`,e),r(`set-pin`)}}t()},[]),(0,p.useEffect)(()=>{t===`chat`&&fetch(`/api/admin/claude-info`).then(e=>{if(e.ok)return e.json()}).then(e=>{e&&k(e)}).catch(()=>{})},[t]),(0,p.useEffect)(()=>{if(typeof window>`u`)return;let n=!1;try{n=sessionStorage.getItem(u)===`1`}catch{}if(f({appState:t,alreadyRedirected:n,variant:e})){try{sessionStorage.setItem(u,`1`)}catch{}console.info(`[admin-ui] landing-redirect target=${d}`),window.location.replace(d)}},[t,e]);let Y=(0,p.useRef)(null);(0,p.useEffect)(()=>{if(t!==`chat`)return;let e=setInterval(async()=>{try{let e=await fetch(`/api/health`);if(e.ok){let t=await e.json();K(t.auth_status!==`dead`&&t.auth_status!==`missing`)}}catch{}if(E)try{let e=await fetch(`/api/admin/session?session_key=${encodeURIComponent(E)}`);if(e.status!==401)return;let t=(await e.clone().json().catch(()=>null))?.code??`unknown-401`;if(t===`remote-auth-required`){n(`heartbeat`,`/api/admin/session`);return}console.warn(`[admin-auth] outcome=heartbeat-detected-expiry code=${t}`),Y.current?.()}catch{}},300*1e3);return()=>clearInterval(e)},[t,E]),(0,p.useEffect)(()=>{t===`connect-claude`&&fetch(`/api/health`).then(e=>e.ok?e.json():null).then(e=>{e?.claude_authenticated&&(K(!0),r(`enter-pin`))}).catch(()=>{})},[t]);async function X(e,t){y(!0);try{let i=await fetch(`/api/admin/session`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({pin:e,...t?{accountId:t}:{}})});if(!i.ok){let e=await i.json().catch(()=>({}));if(i.status===401&&e?.code===`remote-auth-required`){n(`enter-pin`,`/api/admin/session`);return}h(e.error||`Invalid PIN`);return}let s=await i.json();D(s.session_key),z(s.sessionId??null),j(s.businessName),N(s.role??null),F(s.userName===void 0?null:s.userName),L(s.avatar??null);let c=o(s.thinkingView);H.current=c,V(c);try{sessionStorage.setItem(`maxy-admin-session-key`,s.session_key)}catch{}a(``),r(`chat`)}catch(e){console.error(`[admin] connection error:`,e),h(`Could not connect.`)}finally{y(!1)}}let Z=(0,p.useCallback)(async e=>{if(e.preventDefault(),v)return;h(``);let t=c.trim();if(!t){h(`Please enter your name.`);return}if(i.length<4){h(`PIN must be at least 4 characters.`);return}let o=i;y(!0);try{let e=await fetch(`/api/onboarding/set-pin`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({pin:o,name:t})});if(!e.ok){let t=await e.json().catch(()=>({}));if(e.status===401&&t?.code===`remote-auth-required`){n(`set-pin`,`/api/onboarding/set-pin`);return}if(e.status===409){console.log(`[admin] PIN already configured — re-checking health`);try{let e=await fetch(`/api/health`);if(e.ok){let n=await e.json();n.pin_configured&&n.claude_authenticated?r(`enter-pin`):n.pin_configured?r(`connect-claude`):h(t.error||`Failed to set PIN.`)}else r(`enter-pin`)}catch{r(`enter-pin`)}return}h(t.error||`Failed to set PIN.`);return}let i=await fetch(`/api/health`);if((i.ok?await i.json():null)?.claude_authenticated){await X(o);return}a(``),r(`connect-claude`)}catch(e){console.error(`[admin] connection error:`,e),h(`Could not connect.`)}finally{y(!1)}},[i,v,c]),Q=(0,p.useCallback)(async e=>{e.preventDefault(),h(``),await X(i)},[i]),ee=(0,p.useCallback)(async()=>{T(!0);try{if(!await s())return console.warn(`[admin-ui] claude-disconnect not verified — credentials may persist; staying put`),!1;K(!1),D(null),N(null),F(void 0),L(null);try{sessionStorage.removeItem(`maxy-admin-session-key`),sessionStorage.removeItem(u)}catch{}return r(`connect-claude`),!0}finally{T(!1)}},[]),$=(0,p.useCallback)(()=>{D(null),N(null),F(void 0),L(null);try{sessionStorage.removeItem(`maxy-admin-session-key`),sessionStorage.removeItem(u)}catch{}a(``),h(``),r(`enter-pin`)},[]);return(0,p.useEffect)(()=>{Y.current=$},[$]),{appState:t,setAppState:r,pin:i,setPin:a,operatorName:c,setOperatorName:l,pinError:m,setPinError:h,showPin:g,setShowPin:_,pinLoading:v,authPolling:b,setAuthPolling:x,authLoading:S,setAuthLoading:C,disconnecting:w,cacheKey:E,setCacheKey:D,claudeInfo:O,setClaudeInfo:k,businessName:A,role:M,userName:P,userAvatar:I,sessionId:R,setSessionId:z,expandAll:B,setExpandAll:V,expandAllDefaultRef:H,remoteAuthEnabled:U,claudeConnected:G,pinInputRef:q,setPinFormRef:J,handleSetPin:Z,handleLogin:Q,handleDisconnect:ee,handleLogout:$}}var h=a();function g({inputRef:e,value:t,onChange:n,onComplete:r,showPin:i,autoFocus:a}){let o=(0,p.useRef)([]);function s(e,r){r.key===`Backspace`?(r.preventDefault(),t[e]?n(t.slice(0,e)+t.slice(e+1)):e>0&&(n(t.slice(0,e-1)+t.slice(e)),o.current[e-1]?.focus())):r.key===`ArrowLeft`&&e>0?o.current[e-1]?.focus():r.key===`ArrowRight`&&e<5?o.current[e+1]?.focus():r.key===`Enter`&&(r.preventDefault(),r.currentTarget.form?.requestSubmit())}function c(e,i){let a=i.nativeEvent.data;if(!a||!/^\d$/.test(a))return;let s=t.split(``);for(s[e]=a;s.length<e;)s.push(``);let c=s.join(``).replace(/\D/g,``).slice(0,6);n(c),c.length===6?r?.(c):e<5&&o.current[e+1]?.focus()}function l(e){e.preventDefault();let t=e.clipboardData.getData(`text`).replace(/\D/g,``).slice(0,6);t&&(n(t),t.length===6?r?.(t):o.current[t.length]?.focus())}return(0,h.jsx)(`div`,{className:`pin-field`,children:Array.from({length:6}).map((n,r)=>(0,h.jsx)(`input`,{ref:t=>{o.current[r]=t,r===0&&e&&(e.current=t)},type:`text`,inputMode:`numeric`,className:`pin-box${t[r]?` pin-box-filled`:``}`,value:t[r]?i?t[r]:`•`:``,onKeyDown:e=>s(r,e),onInput:e=>c(r,e),onPaste:l,onFocus:e=>e.target.select(),autoFocus:a&&r===0,autoComplete:`off`,maxLength:1,"aria-label":`PIN digit ${r+1}`},r))})}function _(e){let{pin:n,setPin:i,showPin:a,setShowPin:o,pinLoading:s,pinError:u,pinInputRef:d,setPinFormRef:f,onSubmit:p,operatorName:m,setOperatorName:_}=e;return(0,h.jsx)(`div`,{className:`connect-page`,children:(0,h.jsxs)(`div`,{className:`connect-content`,children:[(0,h.jsx)(`img`,{src:t,alt:r.productName,className:`connect-logo connect-logo--maxy`}),!r.logoContainsName&&(0,h.jsxs)(`h1`,{className:`connect-title`,children:[`Welcome to `,r.productName]}),(0,h.jsxs)(`p`,{className:`connect-subtitle`,children:[`Tell `,r.productName,` who you are, then choose a PIN.`]}),(0,h.jsxs)(`form`,{ref:f,onSubmit:p,className:`connect-pin-form`,children:[(0,h.jsxs)(`div`,{className:`pin-input-row`,children:[(0,h.jsx)(`input`,{type:`text`,className:`connect-name-input`,placeholder:`Your full name`,value:m,onChange:e=>_(e.target.value),autoComplete:`name`,autoFocus:!0,required:!0,"aria-label":`Your full name`}),(0,h.jsx)(`div`,{style:{width:38,flexShrink:0},"aria-hidden":`true`})]}),(0,h.jsxs)(`div`,{className:`pin-input-row`,children:[(0,h.jsx)(g,{inputRef:d,value:n,onChange:i,onComplete:()=>{},showPin:a}),(0,h.jsx)(c,{variant:`send`,type:`submit`,disabled:!n||!m.trim(),loading:s,"aria-label":`Set PIN`,children:(0,h.jsxs)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,h.jsx)(`line`,{x1:`5`,y1:`12`,x2:`19`,y2:`12`}),(0,h.jsx)(`polyline`,{points:`12 5 19 12 12 19`})]})})]}),(0,h.jsx)(l,{checked:a,onChange:()=>o(e=>!e),label:`Show PIN`})]}),u&&(0,h.jsx)(`p`,{className:`admin-pin-error`,children:u})]})})}function v(e){let{pin:n,setPin:i,showPin:a,setShowPin:o,pinLoading:s,pinError:u,pinInputRef:d,onSubmit:f,remoteAuthEnabled:p,onSignOutRemote:m}=e;return(0,h.jsxs)(`div`,{className:`connect-page`,children:[p&&m&&(0,h.jsx)(`button`,{type:`button`,className:`connect-signout`,onClick:m,children:`Sign out`}),(0,h.jsxs)(`div`,{className:`connect-content`,children:[(0,h.jsx)(`img`,{src:t,alt:r.productName,className:`connect-logo connect-logo--maxy`}),!r.logoContainsName&&(0,h.jsx)(`h1`,{className:`connect-title`,children:r.productName}),(0,h.jsxs)(`form`,{onSubmit:f,className:`connect-pin-form`,children:[(0,h.jsxs)(`div`,{className:`pin-input-row`,children:[(0,h.jsx)(g,{inputRef:d,value:n,onChange:i,onComplete:()=>{},showPin:a,autoFocus:!0}),(0,h.jsx)(c,{variant:`send`,type:`submit`,disabled:!n,loading:s,children:(0,h.jsxs)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,h.jsx)(`line`,{x1:`5`,y1:`12`,x2:`19`,y2:`12`}),(0,h.jsx)(`polyline`,{points:`12 5 19 12 12 19`})]})})]}),(0,h.jsx)(`div`,{className:`pin-options`,children:(0,h.jsx)(l,{checked:a,onChange:()=>o(e=>!e),label:`Show PIN`})})]}),u&&(0,h.jsx)(`p`,{className:`admin-pin-error`,children:u})]})]})}function y(e){let{authPolling:n,setAuthPolling:i,authLoading:a,setAuthLoading:o,pinError:s,setPinError:l,setAppState:u}=e,[d,f]=(0,p.useState)(!1),[m,g]=(0,p.useState)(!1),[_,v]=(0,p.useState)(``),[y,b]=(0,p.useState)(``),[x,S]=(0,p.useState)(``);async function C(){S(``);try{let e=await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`paste-code`,code:y})})).json();e.accepted?(S(`Code submitted. Finishing sign-in…`),b(``)):S(e.error||`Could not submit code.`)}catch(e){console.error(`[admin] paste-code error:`,e),S(`Could not submit code.`)}}async function w(){g(!0),l(``);try{let e=await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`launch-browser`})})).json();e.launched?f(!0):e.error&&l(e.error)}catch(e){console.error(`[admin] browser launch error:`,e),l(`Could not launch browser.`)}g(!1)}async function T(){o(!0),l(``);try{let e=await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`})).json();if(e.started){i(!0),f(!0),o(!1),v(e.transport||``);for(let e=0;e<120;e++)if(await new Promise(e=>setTimeout(e,2e3)),(await(await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`wait`})})).json()).authenticated){await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`stop`})}),u(`enter-pin`);return}l(`Timed out waiting for sign-in. Try again.`),i(!1)}else e.error&&l(e.error)}catch(e){console.error(`[admin] auth flow error:`,e),l(`Could not start auth flow.`)}o(!1)}async function E(){await fetch(`/api/onboarding/claude-auth`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({action:`stop`})}),i(!1),l(``)}return n||d?(0,h.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,height:`100dvh`,overflow:`auto`},children:[(0,h.jsxs)(`header`,{className:`chat-header`,style:{paddingBottom:`12px`,flexShrink:0,position:`relative`,maxWidth:`680px`,width:`100%`,margin:`0 auto`,padding:`24px 20px 12px`},children:[n?(0,h.jsx)(`button`,{onClick:E,style:{position:`absolute`,top:`12px`,right:`12px`,background:`none`,border:`none`,color:`#999`,fontSize:`13px`,cursor:`pointer`,padding:`4px 8px`},"aria-label":`Cancel`,children:`✕`}):(0,h.jsx)(`button`,{onClick:()=>f(!1),style:{position:`absolute`,top:`12px`,right:`12px`,background:`none`,border:`none`,color:`#999`,fontSize:`13px`,cursor:`pointer`,padding:`4px 8px`},"aria-label":`Close browser`,children:`✕`}),(0,h.jsx)(`img`,{src:`/brand/claude.png`,alt:`Claude`,className:`chat-logo`}),(0,h.jsx)(`h1`,{className:`chat-tagline`,children:`Connect Claude`}),(0,h.jsx)(`p`,{className:`chat-intro`,children:n?`Sign in and authorize in the browser below.`:`Open your email or prepare your accounts, then sign in.`}),!n&&(0,h.jsx)(`div`,{style:{marginTop:`12px`},children:(0,h.jsx)(c,{variant:`primary`,onClick:T,disabled:a,children:a?(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(`span`,{className:`spin`,style:{display:`inline-block`},children:`✱`}),` Connecting…`]}):`Sign in to Claude`})}),n&&_===`native`&&(0,h.jsxs)(`div`,{style:{marginTop:`14px`,maxWidth:`420px`,margin:`14px auto 0`,display:`flex`,flexDirection:`column`,gap:`8px`},children:[(0,h.jsx)(`label`,{style:{fontSize:`12px`,color:`#999`,lineHeight:1.4},children:`If the browser didn't finish sign-in, paste the code or full redirect URL from Claude's page:`}),(0,h.jsxs)(`div`,{style:{display:`flex`,gap:`8px`},children:[(0,h.jsx)(`input`,{type:`text`,value:y,onChange:e=>b(e.target.value),placeholder:`Paste code or redirect URL`,style:{flex:1,padding:`8px 10px`,fontSize:`13px`,border:`1px solid #ccc`,borderRadius:`6px`}}),(0,h.jsx)(c,{variant:`primary`,onClick:C,disabled:!y.trim(),children:`Submit`})]}),x&&(0,h.jsx)(`p`,{style:{fontSize:`12px`,color:`#999`,margin:0},children:x})]})]}),(0,h.jsx)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`,minHeight:0,gap:`10px`,padding:`0 0 16px`},children:(0,h.jsx)(`iframe`,{src:`/vnc-viewer.html`,style:{flex:1,width:`100%`,minHeight:0,border:`none`,background:`#111`,display:`block`},title:`Claude Sign-in`})}),s&&(0,h.jsx)(`p`,{className:`admin-pin-error`,style:{textAlign:`center`,padding:`0 20px 16px`},children:s})]}):(0,h.jsx)(`div`,{className:`connect-page`,children:(0,h.jsxs)(`div`,{className:`connect-content`,children:[(0,h.jsxs)(`div`,{className:`connect-logos`,children:[(0,h.jsx)(`div`,{className:`connect-logo-wrap`,children:(0,h.jsx)(`img`,{src:`/brand/claude.png`,alt:`Claude`,className:`connect-logo`})}),(0,h.jsx)(`svg`,{className:`connect-arrow`,viewBox:`0 0 48 24`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`,children:(0,h.jsx)(`path`,{d:`M0 12h44m0 0l-8-8m8 8l-8 8`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`})}),(0,h.jsxs)(`div`,{className:`connect-logo-wrap`,children:[(0,h.jsx)(`img`,{src:t,alt:r.productName,className:`connect-logo connect-logo--maxy`}),!r.logoContainsName&&(0,h.jsx)(`span`,{className:`connect-logo-label`,children:r.productName})]})]}),(0,h.jsxs)(`h1`,{className:`connect-title`,children:[`Connect Claude to power `,r.productName]}),(0,h.jsx)(`p`,{className:`connect-subtitle`,children:`Sign in with your Anthropic account to get started.`}),(0,h.jsx)(c,{variant:`primary`,onClick:T,disabled:a,children:a?(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(`span`,{className:`spin`,style:{display:`inline-block`},children:`✱`}),` Connecting…`]}):`Sign in to Claude`}),(0,h.jsx)(`p`,{style:{marginTop:`6px`,fontSize:`11px`,color:`#999`,maxWidth:`300px`,textAlign:`center`,lineHeight:`1.4`},children:`First time? You may need to sign into your email and Anthropic account in the browser before connecting.`}),(0,h.jsx)(`button`,{onClick:w,disabled:m,style:{marginTop:`12px`,background:`none`,border:`none`,color:`var(--color-primary, #666)`,fontSize:`13px`,cursor:`pointer`,textDecoration:`underline`,textUnderlineOffset:`3px`},children:m?`Launching…`:`Open browser first`}),s&&(0,h.jsx)(`p`,{className:`admin-pin-error`,children:s})]})})}function b({auth:e}){return e.appState===`loading`?(0,h.jsx)(`div`,{className:`connect-page`}):e.appState===`set-pin`?(0,h.jsx)(_,{pin:e.pin,setPin:e.setPin,showPin:e.showPin,setShowPin:e.setShowPin,pinLoading:e.pinLoading,pinError:e.pinError,pinInputRef:e.pinInputRef,setPinFormRef:e.setPinFormRef,onSubmit:e.handleSetPin,operatorName:e.operatorName,setOperatorName:e.setOperatorName}):e.appState===`connect-claude`?(0,h.jsx)(y,{authPolling:e.authPolling,setAuthPolling:e.setAuthPolling,authLoading:e.authLoading,setAuthLoading:e.setAuthLoading,pinError:e.pinError,setPinError:e.setPinError,setAppState:e.setAppState}):e.appState===`enter-pin`?(0,h.jsx)(v,{pin:e.pin,setPin:e.setPin,showPin:e.showPin,setShowPin:e.setShowPin,pinLoading:e.pinLoading,pinError:e.pinError,pinInputRef:e.pinInputRef,onSubmit:e.handleLogin,remoteAuthEnabled:e.remoteAuthEnabled,onSignOutRemote:()=>{console.info(`[admin-ui] remote-auth sign-out → /__remote-auth/logout`),window.location.href=`/__remote-auth/logout`}}):null}export{m as n,b as t};
|