@rubytech/create-sitedesk-code 0.1.527 → 0.1.529
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/account-ingest-token/dist/index.d.ts +21 -0
- package/payload/platform/lib/account-ingest-token/dist/index.d.ts.map +1 -0
- package/payload/platform/lib/account-ingest-token/dist/index.js +128 -0
- package/payload/platform/lib/account-ingest-token/dist/index.js.map +1 -0
- package/payload/platform/lib/account-ingest-token/src/index.ts +137 -0
- package/payload/platform/lib/account-ingest-token/tsconfig.json +8 -0
- package/payload/platform/lib/agent-dispatch-rule/dist/index.d.ts +5 -0
- package/payload/platform/lib/agent-dispatch-rule/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/agent-dispatch-rule/dist/index.js.map +1 -1
- package/payload/platform/lib/agent-dispatch-rule/src/index.ts +5 -0
- package/payload/platform/package.json +2 -2
- package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/admin/PLUGIN.md +5 -1
- package/payload/platform/plugins/admin/hooks/__tests__/fs-schema-guard.test.sh +82 -1
- package/payload/platform/plugins/admin/hooks/fs-schema-guard.sh +45 -13
- package/payload/platform/plugins/admin/mcp/dist/index.js +55 -4
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/mcp/dist/tools/linkedin-ingest-token.d.ts +10 -0
- package/payload/platform/plugins/admin/mcp/dist/tools/linkedin-ingest-token.d.ts.map +1 -0
- package/payload/platform/plugins/admin/mcp/dist/tools/linkedin-ingest-token.js +22 -0
- package/payload/platform/plugins/admin/mcp/dist/tools/linkedin-ingest-token.js.map +1 -0
- package/payload/platform/plugins/admin/mcp/dist/tools/logs-read-mcp.d.ts +16 -0
- package/payload/platform/plugins/admin/mcp/dist/tools/logs-read-mcp.d.ts.map +1 -0
- package/payload/platform/plugins/admin/mcp/dist/tools/logs-read-mcp.js +69 -0
- package/payload/platform/plugins/admin/mcp/dist/tools/logs-read-mcp.js.map +1 -0
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +86 -7
- package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +13 -0
- package/payload/platform/plugins/docs/references/admin-ui.md +80 -2
- package/payload/platform/plugins/docs/references/deployment.md +1 -1
- package/payload/platform/plugins/docs/references/linkedin-extension.md +2 -2
- package/payload/platform/plugins/docs/references/plugins-guide.md +2 -1
- package/payload/platform/plugins/email/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/email/PLUGIN.md +8 -3
- package/payload/platform/plugins/email/mcp/dist/__tests__/compose-signature.test.js +61 -4
- package/payload/platform/plugins/email/mcp/dist/__tests__/compose-signature.test.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft-edit.test.js +41 -0
- 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 +47 -1
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-draft.test.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-sending-identity-set.test.d.ts +2 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-sending-identity-set.test.d.ts.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-sending-identity-set.test.js +184 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-sending-identity-set.test.js.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-signature-set.test.js +8 -5
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-signature-set.test.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-status.test.js +64 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/email-status.test.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/__tests__/mailbox-resolve.test.js +132 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/mailbox-resolve.test.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/__tests__/signature.test.js +93 -11
- package/payload/platform/plugins/email/mcp/dist/__tests__/signature.test.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/index.js +34 -3
- package/payload/platform/plugins/email/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/compose.d.ts +2 -1
- package/payload/platform/plugins/email/mcp/dist/lib/compose.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/compose.js +13 -2
- package/payload/platform/plugins/email/mcp/dist/lib/compose.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/credentials.d.ts +47 -2
- package/payload/platform/plugins/email/mcp/dist/lib/credentials.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/credentials.js +92 -5
- package/payload/platform/plugins/email/mcp/dist/lib/credentials.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/signature.d.ts +55 -7
- package/payload/platform/plugins/email/mcp/dist/lib/signature.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/signature.js +72 -9
- package/payload/platform/plugins/email/mcp/dist/lib/signature.js.map +1 -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 +5 -2
- 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 +6 -3
- package/payload/platform/plugins/email/mcp/dist/tools/email-draft.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/tools/email-sending-identity-set.d.ts +20 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-sending-identity-set.d.ts.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-sending-identity-set.js +32 -0
- package/payload/platform/plugins/email/mcp/dist/tools/email-sending-identity-set.js.map +1 -0
- 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 +22 -2
- package/payload/platform/plugins/email/mcp/dist/tools/email-status.js.map +1 -1
- package/payload/platform/plugins/email/references/email-reference.md +11 -3
- package/payload/platform/plugins/email/skills/email-composition/SKILL.md +3 -0
- package/payload/platform/plugins/email/skills/email-signature/SKILL.md +27 -9
- package/payload/platform/plugins/linkedin-extension/extension/README.md +3 -3
- package/payload/platform/plugins/linkedin-extension/extension/background/sw.js +12 -7
- package/payload/platform/plugins/linkedin-extension/extension/content/profile.js +4 -1
- package/payload/platform/plugins/linkedin-extension/extension/content/thread.js +4 -1
- package/payload/platform/plugins/linkedin-extension/extension/options/options.html +3 -3
- package/payload/platform/plugins/linkedin-extension/extension/options/options.js +24 -16
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/suspension-census.test.js +45 -2
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/suspension-census.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js +15 -2
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js.map +1 -1
- package/payload/platform/scripts/__tests__/vnc-cdp-liveness.test.sh +25 -2
- package/payload/platform/scripts/vnc.sh +34 -26
- package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.d.ts +24 -1
- package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.js +84 -3
- package/payload/platform/services/claude-session-manager/dist/account-dir-schema-reconcile.js.map +1 -1
- 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 +2 -0
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
- package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
- package/payload/server/{chunk-XCR5D2G3.js → chunk-BP7LH7MC.js} +0 -1
- package/payload/server/{chunk-KY3BBT67.js → chunk-DLG7XSLA.js} +1 -1
- package/payload/server/{chunk-7MGR5M6G.js → chunk-UTIHI6KV.js} +1 -1
- package/payload/server/{manager-6XOWHREK.js → manager-B4LRDZKC.js} +2 -2
- package/payload/server/maxy-edge.js +2 -2
- package/payload/server/public/activity.html +5 -5
- package/payload/server/public/agents.html +4 -4
- package/payload/server/public/assets/AdminLoginScreens-zfexKfbT.js +1 -0
- package/payload/server/public/assets/AdminLoginScreens-zfexKfbT.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-zfexKfbT.js.gz +0 -0
- package/payload/server/public/assets/AdminShell-Cbk0TL1B.js +2 -0
- package/payload/server/public/assets/AdminShell-Cbk0TL1B.js.br +0 -0
- package/payload/server/public/assets/AdminShell-Cbk0TL1B.js.gz +0 -0
- package/payload/server/public/assets/CdpScreencastSurface-CLSQHh4e.js +1 -0
- package/payload/server/public/assets/CdpScreencastSurface-CLSQHh4e.js.br +0 -0
- package/payload/server/public/assets/CdpScreencastSurface-CLSQHh4e.js.gz +0 -0
- package/payload/server/public/assets/{activity-aVvbaVd4.js → activity-u275Oc-u.js} +1 -1
- package/payload/server/public/assets/activity-u275Oc-u.js.br +0 -0
- package/payload/server/public/assets/activity-u275Oc-u.js.gz +0 -0
- package/payload/server/public/assets/admin-Du1nR_hP.js +1 -0
- package/payload/server/public/assets/admin-Du1nR_hP.js.br +0 -0
- package/payload/server/public/assets/admin-Du1nR_hP.js.gz +0 -0
- package/payload/server/public/assets/{agents-CrpVTPRG.js → agents-DJTxRLLU.js} +1 -1
- package/payload/server/public/assets/agents-DJTxRLLU.js.br +0 -0
- package/payload/server/public/assets/agents-DJTxRLLU.js.gz +0 -0
- package/payload/server/public/assets/{arc-DaudCnXg.js → arc-CHoXZR2f.js} +1 -1
- package/payload/server/public/assets/arc-CHoXZR2f.js.br +0 -0
- package/payload/server/public/assets/arc-CHoXZR2f.js.gz +0 -0
- package/payload/server/public/assets/architecture-YZFGNWBL-CQyo9W6E.js +1 -0
- package/payload/server/public/assets/architecture-YZFGNWBL-CQyo9W6E.js.br +0 -0
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-BEEC3s7i.js → architectureDiagram-Q4EWVU46-B8SCI0AR.js} +1 -1
- package/payload/server/public/assets/architectureDiagram-Q4EWVU46-B8SCI0AR.js.br +0 -0
- package/payload/server/public/assets/architectureDiagram-Q4EWVU46-B8SCI0AR.js.gz +0 -0
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-BIWyfb18.js → blockDiagram-DXYQGD6D-CsJmhz5D.js} +1 -1
- package/payload/server/public/assets/blockDiagram-DXYQGD6D-CsJmhz5D.js.br +0 -0
- package/payload/server/public/assets/blockDiagram-DXYQGD6D-CsJmhz5D.js.gz +0 -0
- package/payload/server/public/assets/browser-Bft6zVkX.js +1 -0
- package/payload/server/public/assets/browser-Bft6zVkX.js.br +0 -0
- package/payload/server/public/assets/browser-Bft6zVkX.js.gz +0 -0
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY--h6oE2cv.js → c4Diagram-AHTNJAMY-CzaSNqcs.js} +1 -1
- package/payload/server/public/assets/c4Diagram-AHTNJAMY-CzaSNqcs.js.br +0 -0
- package/payload/server/public/assets/c4Diagram-AHTNJAMY-CzaSNqcs.js.gz +0 -0
- package/payload/server/public/assets/{calendar-4IWQpwYv.js → calendar-Ct-DCCqY.js} +1 -1
- package/payload/server/public/assets/calendar-Ct-DCCqY.js.br +0 -0
- package/payload/server/public/assets/calendar-Ct-DCCqY.js.gz +0 -0
- package/payload/server/public/assets/channel-Dg_Rah6O.js +1 -0
- package/payload/server/public/assets/channel-Dg_Rah6O.js.br +0 -0
- package/payload/server/public/assets/chat-pqasbAg8.js +1 -0
- package/payload/server/public/assets/chat-pqasbAg8.js.br +0 -0
- package/payload/server/public/assets/chat-pqasbAg8.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-C8LTc7lb.js +1 -0
- package/payload/server/public/assets/chevron-right-Lz9t7Hed.js +1 -0
- package/payload/server/public/assets/chevron-right-Lz9t7Hed.js.br +0 -0
- package/payload/server/public/assets/{chunk-2KRD3SAO-BwEVlnxo.js → chunk-2KRD3SAO-DAN3KCZc.js} +1 -1
- package/payload/server/public/assets/chunk-2KRD3SAO-DAN3KCZc.js.br +0 -0
- package/payload/server/public/assets/chunk-2KRD3SAO-DAN3KCZc.js.gz +0 -0
- package/payload/server/public/assets/{chunk-336JU56O-DQddTATH.js → chunk-336JU56O-Dm-0_lIT.js} +2 -2
- package/payload/server/public/assets/chunk-336JU56O-Dm-0_lIT.js.br +0 -0
- package/payload/server/public/assets/chunk-336JU56O-Dm-0_lIT.js.gz +0 -0
- package/payload/server/public/assets/chunk-426QAEUC-Rh8qTRZB.js +1 -0
- package/payload/server/public/assets/chunk-426QAEUC-Rh8qTRZB.js.br +0 -0
- package/payload/server/public/assets/chunk-426QAEUC-Rh8qTRZB.js.gz +0 -0
- package/payload/server/public/assets/{chunk-4BX2VUAB-C5p3xTC6.js → chunk-4BX2VUAB-C2l9bAlo.js} +1 -1
- package/payload/server/public/assets/chunk-4BX2VUAB-C2l9bAlo.js.br +0 -0
- package/payload/server/public/assets/chunk-4BX2VUAB-C2l9bAlo.js.gz +0 -0
- package/payload/server/public/assets/{chunk-4TB4RGXK-gClfNc1w.js → chunk-4TB4RGXK-BMXDzU09.js} +1 -1
- package/payload/server/public/assets/chunk-4TB4RGXK-BMXDzU09.js.br +0 -0
- package/payload/server/public/assets/chunk-4TB4RGXK-BMXDzU09.js.gz +0 -0
- package/payload/server/public/assets/{chunk-55IACEB6-DDU_m1ra.js → chunk-55IACEB6-CbMYAZon.js} +1 -1
- package/payload/server/public/assets/chunk-55IACEB6-CbMYAZon.js.br +0 -0
- package/payload/server/public/assets/chunk-55IACEB6-CbMYAZon.js.gz +0 -0
- package/payload/server/public/assets/{chunk-5FUZZQ4R-CZ2jQWNR.js → chunk-5FUZZQ4R-DjdsuxLA.js} +1 -1
- package/payload/server/public/assets/chunk-5FUZZQ4R-DjdsuxLA.js.br +0 -0
- package/payload/server/public/assets/chunk-5FUZZQ4R-DjdsuxLA.js.gz +0 -0
- package/payload/server/public/assets/{chunk-5PVQY5BW-kcZ5kfTg.js → chunk-5PVQY5BW-CGSBzsF6.js} +1 -1
- package/payload/server/public/assets/chunk-5PVQY5BW-CGSBzsF6.js.br +0 -0
- package/payload/server/public/assets/chunk-5PVQY5BW-CGSBzsF6.js.gz +0 -0
- package/payload/server/public/assets/{chunk-67CJDMHE-9W0Qv0jm.js → chunk-67CJDMHE-ClOLWser.js} +1 -1
- package/payload/server/public/assets/chunk-67CJDMHE-ClOLWser.js.br +0 -0
- package/payload/server/public/assets/chunk-67CJDMHE-ClOLWser.js.gz +0 -0
- package/payload/server/public/assets/{chunk-7N4EOEYR-B3gqydR3.js → chunk-7N4EOEYR-BzC1dzY0.js} +1 -1
- package/payload/server/public/assets/chunk-7N4EOEYR-BzC1dzY0.js.br +0 -0
- package/payload/server/public/assets/chunk-7N4EOEYR-BzC1dzY0.js.gz +0 -0
- package/payload/server/public/assets/{chunk-AA7GKIK3-DW8a-2NK.js → chunk-AA7GKIK3-R_pjI1kw.js} +1 -1
- package/payload/server/public/assets/chunk-AA7GKIK3-R_pjI1kw.js.br +0 -0
- package/payload/server/public/assets/chunk-AA7GKIK3-R_pjI1kw.js.gz +0 -0
- package/payload/server/public/assets/{chunk-BSJP7CBP-DqXIO_5R.js → chunk-BSJP7CBP-D2KRAq3U.js} +1 -1
- package/payload/server/public/assets/chunk-BSJP7CBP-D2KRAq3U.js.br +0 -0
- package/payload/server/public/assets/chunk-BSJP7CBP-D2KRAq3U.js.gz +0 -0
- package/payload/server/public/assets/{chunk-CIAEETIT-BMJfgj2u.js → chunk-CIAEETIT-BPGWtrKR.js} +1 -1
- package/payload/server/public/assets/chunk-CIAEETIT-BPGWtrKR.js.br +0 -0
- package/payload/server/public/assets/chunk-CIAEETIT-BPGWtrKR.js.gz +0 -0
- package/payload/server/public/assets/{chunk-EDXVE4YY-BxdLPk0b.js → chunk-EDXVE4YY-tqt7wueu.js} +1 -1
- package/payload/server/public/assets/chunk-EDXVE4YY-tqt7wueu.js.br +3 -0
- package/payload/server/public/assets/chunk-EDXVE4YY-tqt7wueu.js.gz +0 -0
- package/payload/server/public/assets/{chunk-ENJZ2VHE-Cfe2DCjQ.js → chunk-ENJZ2VHE-DJG3cA6E.js} +1 -1
- package/payload/server/public/assets/chunk-ENJZ2VHE-DJG3cA6E.js.br +0 -0
- package/payload/server/public/assets/chunk-ENJZ2VHE-DJG3cA6E.js.gz +0 -0
- package/payload/server/public/assets/{chunk-FMBD7UC4-CdPjwbtf.js → chunk-FMBD7UC4-DO1xgCDf.js} +1 -1
- package/payload/server/public/assets/chunk-FMBD7UC4-DO1xgCDf.js.br +2 -0
- package/payload/server/public/assets/chunk-FMBD7UC4-DO1xgCDf.js.gz +0 -0
- package/payload/server/public/assets/{chunk-FOC6F5B3-Dl6l1KAh.js → chunk-FOC6F5B3-BhWAbCUG.js} +1 -1
- package/payload/server/public/assets/chunk-FOC6F5B3-BhWAbCUG.js.br +0 -0
- package/payload/server/public/assets/chunk-FOC6F5B3-BhWAbCUG.js.gz +0 -0
- package/payload/server/public/assets/{chunk-ICPOFSXX-PnsGrqtx.js → chunk-ICPOFSXX-BhUzt35c.js} +2 -2
- package/payload/server/public/assets/chunk-ICPOFSXX-BhUzt35c.js.br +0 -0
- package/payload/server/public/assets/chunk-ICPOFSXX-BhUzt35c.js.gz +0 -0
- package/payload/server/public/assets/{chunk-K5T4RW27--g29_wjW.js → chunk-K5T4RW27-Boj-qHrX.js} +1 -1
- package/payload/server/public/assets/chunk-K5T4RW27-Boj-qHrX.js.br +0 -0
- package/payload/server/public/assets/chunk-K5T4RW27-Boj-qHrX.js.gz +0 -0
- package/payload/server/public/assets/{chunk-KGLVRYIC-CI77ENeO.js → chunk-KGLVRYIC-3cBRDk1b.js} +1 -1
- package/payload/server/public/assets/chunk-KGLVRYIC-3cBRDk1b.js.br +2 -0
- package/payload/server/public/assets/chunk-KGLVRYIC-3cBRDk1b.js.gz +0 -0
- package/payload/server/public/assets/{chunk-LIHQZDEY-CE-XByg6.js → chunk-LIHQZDEY-CgkLKaII.js} +1 -1
- package/payload/server/public/assets/chunk-LIHQZDEY-CgkLKaII.js.br +0 -0
- package/payload/server/public/assets/chunk-LIHQZDEY-CgkLKaII.js.gz +0 -0
- package/payload/server/public/assets/{chunk-ORNJ4GCN-DkjJQQSm.js → chunk-ORNJ4GCN-Dl449r_k.js} +1 -1
- package/payload/server/public/assets/chunk-ORNJ4GCN-Dl449r_k.js.br +0 -0
- package/payload/server/public/assets/chunk-ORNJ4GCN-Dl449r_k.js.gz +0 -0
- package/payload/server/public/assets/{chunk-OYMX7WX6-DhogFeD7.js → chunk-OYMX7WX6-Dzkj67n6.js} +1 -1
- package/payload/server/public/assets/chunk-OYMX7WX6-Dzkj67n6.js.br +0 -0
- package/payload/server/public/assets/chunk-OYMX7WX6-Dzkj67n6.js.gz +0 -0
- package/payload/server/public/assets/chunk-QZHKN3VN-BDoCtU0N.js +1 -0
- package/payload/server/public/assets/chunk-QZHKN3VN-BDoCtU0N.js.br +0 -0
- package/payload/server/public/assets/chunk-QZHKN3VN-BDoCtU0N.js.gz +0 -0
- package/payload/server/public/assets/{chunk-U2HBQHQK-CeaRXuiO.js → chunk-U2HBQHQK-Dyz9Kbir.js} +1 -1
- package/payload/server/public/assets/chunk-U2HBQHQK-Dyz9Kbir.js.br +0 -0
- package/payload/server/public/assets/chunk-U2HBQHQK-Dyz9Kbir.js.gz +0 -0
- package/payload/server/public/assets/{chunk-X2U36JSP-BqxXeOqf.js → chunk-X2U36JSP-ag0VVCw6.js} +1 -1
- package/payload/server/public/assets/chunk-X2U36JSP-ag0VVCw6.js.br +0 -0
- package/payload/server/public/assets/chunk-X2U36JSP-ag0VVCw6.js.gz +0 -0
- package/payload/server/public/assets/{chunk-XPW4576I-DtqJwn2x.js → chunk-XPW4576I-B-vhDYPE.js} +1 -1
- package/payload/server/public/assets/chunk-XPW4576I-B-vhDYPE.js.br +0 -0
- package/payload/server/public/assets/chunk-XPW4576I-B-vhDYPE.js.gz +0 -0
- package/payload/server/public/assets/{chunk-YZCP3GAM-COBlEwQw.js → chunk-YZCP3GAM-C4COviPb.js} +1 -1
- package/payload/server/public/assets/chunk-YZCP3GAM-C4COviPb.js.br +0 -0
- package/payload/server/public/assets/chunk-YZCP3GAM-C4COviPb.js.gz +0 -0
- package/payload/server/public/assets/{chunk-ZZ45TVLE-CcL088y6.js → chunk-ZZ45TVLE-8dGsCp5b.js} +1 -1
- package/payload/server/public/assets/chunk-ZZ45TVLE-8dGsCp5b.js.br +0 -0
- package/payload/server/public/assets/chunk-ZZ45TVLE-8dGsCp5b.js.gz +0 -0
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-qevfwy5C.js +1 -0
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-qevfwy5C.js.br +0 -0
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-qevfwy5C.js.gz +0 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-CxOR3aao.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-CxOR3aao.js.br +0 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-CxOR3aao.js.gz +0 -0
- package/payload/server/public/assets/clock-D6QQFHwJ.js +1 -0
- package/payload/server/public/assets/clock-D6QQFHwJ.js.br +0 -0
- package/payload/server/public/assets/clock-D6QQFHwJ.js.gz +0 -0
- package/payload/server/public/assets/clone-CJmzeWWZ.js +1 -0
- package/payload/server/public/assets/clone-CJmzeWWZ.js.br +0 -0
- package/payload/server/public/assets/{cose-bilkent-S5V4N54A-kEHVkDNn.js → cose-bilkent-S5V4N54A-qM4Q4TuE.js} +1 -1
- package/payload/server/public/assets/cose-bilkent-S5V4N54A-qM4Q4TuE.js.br +0 -0
- package/payload/server/public/assets/cose-bilkent-S5V4N54A-qM4Q4TuE.js.gz +0 -0
- package/payload/server/public/assets/{dagre-D2wUw1zC.js → dagre-DRvHdusQ.js} +1 -1
- package/payload/server/public/assets/dagre-DRvHdusQ.js.br +0 -0
- package/payload/server/public/assets/dagre-DRvHdusQ.js.gz +0 -0
- package/payload/server/public/assets/{dagre-KV5264BT-BWfTDwEs.js → dagre-KV5264BT-CGqSVVTn.js} +1 -1
- package/payload/server/public/assets/dagre-KV5264BT-CGqSVVTn.js.br +0 -0
- package/payload/server/public/assets/dagre-KV5264BT-CGqSVVTn.js.gz +0 -0
- package/payload/server/public/assets/data-B1JJ3Y1T.js +1 -0
- package/payload/server/public/assets/data-B1JJ3Y1T.js.br +0 -0
- package/payload/server/public/assets/data-B1JJ3Y1T.js.gz +0 -0
- package/payload/server/public/assets/{diagram-5BDNPKRD-Tl9dS8w0.js → diagram-5BDNPKRD-DfFgeApz.js} +1 -1
- package/payload/server/public/assets/diagram-5BDNPKRD-DfFgeApz.js.br +0 -0
- package/payload/server/public/assets/diagram-5BDNPKRD-DfFgeApz.js.gz +0 -0
- package/payload/server/public/assets/{diagram-G4DWMVQ6-CeSe6TMu.js → diagram-G4DWMVQ6-DPXc3Q8e.js} +1 -1
- package/payload/server/public/assets/diagram-G4DWMVQ6-DPXc3Q8e.js.br +0 -0
- package/payload/server/public/assets/diagram-G4DWMVQ6-DPXc3Q8e.js.gz +0 -0
- package/payload/server/public/assets/{diagram-MMDJMWI5-DYBNJCmk.js → diagram-MMDJMWI5-V8RCddvy.js} +1 -1
- package/payload/server/public/assets/diagram-MMDJMWI5-V8RCddvy.js.br +0 -0
- package/payload/server/public/assets/diagram-MMDJMWI5-V8RCddvy.js.gz +0 -0
- package/payload/server/public/assets/{diagram-TYMM5635-BmpUGltx.js → diagram-TYMM5635-CrvfIf-m.js} +1 -1
- package/payload/server/public/assets/diagram-TYMM5635-CrvfIf-m.js.br +0 -0
- package/payload/server/public/assets/diagram-TYMM5635-CrvfIf-m.js.gz +0 -0
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-DuwuNGqx.js → erDiagram-SMLLAGMA-DClMgmBB.js} +1 -1
- package/payload/server/public/assets/erDiagram-SMLLAGMA-DClMgmBB.js.br +0 -0
- package/payload/server/public/assets/erDiagram-SMLLAGMA-DClMgmBB.js.gz +0 -0
- package/payload/server/public/assets/{file-download-DayBHhKS.js → file-download-C_fSe4dm.js} +1 -1
- package/payload/server/public/assets/file-download-C_fSe4dm.js.br +0 -0
- package/payload/server/public/assets/file-download-C_fSe4dm.js.gz +0 -0
- package/payload/server/public/assets/{file-text-BSyhVH0m.js → file-text-D7GbEcqj.js} +1 -1
- package/payload/server/public/assets/file-text-D7GbEcqj.js.br +0 -0
- package/payload/server/public/assets/file-text-D7GbEcqj.js.gz +0 -0
- package/payload/server/public/assets/{flatten-Bu-b1uTY.js → flatten-UdUTbm8v.js} +1 -1
- package/payload/server/public/assets/flatten-UdUTbm8v.js.br +0 -0
- package/payload/server/public/assets/flatten-UdUTbm8v.js.gz +0 -0
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-Bpp8P6Ba.js → flowDiagram-DWJPFMVM-D29Ou09P.js} +1 -1
- package/payload/server/public/assets/flowDiagram-DWJPFMVM-D29Ou09P.js.br +0 -0
- package/payload/server/public/assets/flowDiagram-DWJPFMVM-D29Ou09P.js.gz +0 -0
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-CE6ppjB4.js → ganttDiagram-T4ZO3ILL-CoAK7W_V.js} +1 -1
- package/payload/server/public/assets/ganttDiagram-T4ZO3ILL-CoAK7W_V.js.br +0 -0
- package/payload/server/public/assets/ganttDiagram-T4ZO3ILL-CoAK7W_V.js.gz +0 -0
- package/payload/server/public/assets/gitGraph-7Q5UKJZL--JSoLMoH.js +1 -0
- package/payload/server/public/assets/gitGraph-7Q5UKJZL--JSoLMoH.js.br +0 -0
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-BdK1GjPr.js → gitGraphDiagram-UUTBAWPF-DMEc_1aX.js} +1 -1
- package/payload/server/public/assets/gitGraphDiagram-UUTBAWPF-DMEc_1aX.js.br +0 -0
- package/payload/server/public/assets/gitGraphDiagram-UUTBAWPF-DMEc_1aX.js.gz +0 -0
- package/payload/server/public/assets/{graph-labels-DegLKGdx.js → graph-labels-Dlcb6cW7.js} +1 -1
- package/payload/server/public/assets/graph-labels-Dlcb6cW7.js.br +0 -0
- package/payload/server/public/assets/graph-labels-Dlcb6cW7.js.gz +0 -0
- package/payload/server/public/assets/{graph-Bjv3Tc3B.js → graph-yl5qU1kO.js} +3 -3
- package/payload/server/public/assets/graph-yl5qU1kO.js.br +0 -0
- package/payload/server/public/assets/graph-yl5qU1kO.js.gz +0 -0
- package/payload/server/public/assets/{graphlib-CHEXylyU.js → graphlib-ihSLgqUG.js} +1 -1
- package/payload/server/public/assets/graphlib-ihSLgqUG.js.br +0 -0
- package/payload/server/public/assets/graphlib-ihSLgqUG.js.gz +0 -0
- package/payload/server/public/assets/info-OMHHGYJF-CY4gsXn4.js +1 -0
- package/payload/server/public/assets/info-OMHHGYJF-CY4gsXn4.js.br +0 -0
- package/payload/server/public/assets/infoDiagram-42DDH7IO-CpWSNS3C.js +2 -0
- package/payload/server/public/assets/infoDiagram-42DDH7IO-CpWSNS3C.js.br +0 -0
- package/payload/server/public/assets/infoDiagram-42DDH7IO-CpWSNS3C.js.gz +0 -0
- package/payload/server/public/assets/{isEmpty-CjH0UASp.js → isEmpty-DY_Xp9Na.js} +1 -1
- package/payload/server/public/assets/isEmpty-DY_Xp9Na.js.br +0 -0
- package/payload/server/public/assets/isEmpty-DY_Xp9Na.js.gz +0 -0
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-CgkVZ4-3.js → ishikawaDiagram-UXIWVN3A-w8fVIbxy.js} +1 -1
- package/payload/server/public/assets/ishikawaDiagram-UXIWVN3A-w8fVIbxy.js.br +0 -0
- package/payload/server/public/assets/ishikawaDiagram-UXIWVN3A-w8fVIbxy.js.gz +0 -0
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-ByUPv8q6.js → journeyDiagram-VCZTEJTY-BRTPKDT5.js} +1 -1
- package/payload/server/public/assets/journeyDiagram-VCZTEJTY-BRTPKDT5.js.br +0 -0
- package/payload/server/public/assets/journeyDiagram-VCZTEJTY-BRTPKDT5.js.gz +0 -0
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-CFinqhpu.js → kanban-definition-6JOO6SKY-Ls3VaFZ_.js} +1 -1
- package/payload/server/public/assets/kanban-definition-6JOO6SKY-Ls3VaFZ_.js.br +0 -0
- package/payload/server/public/assets/kanban-definition-6JOO6SKY-Ls3VaFZ_.js.gz +0 -0
- package/payload/server/public/assets/{line-Y4ns5Ghi.js → line-BwhAIh8u.js} +1 -1
- package/payload/server/public/assets/line-BwhAIh8u.js.br +0 -0
- package/payload/server/public/assets/line-BwhAIh8u.js.gz +0 -0
- package/payload/server/public/assets/{linear-l39GooQ5.js → linear-USiZPFN4.js} +1 -1
- package/payload/server/public/assets/linear-USiZPFN4.js.br +0 -0
- package/payload/server/public/assets/linear-USiZPFN4.js.gz +0 -0
- package/payload/server/public/assets/{maximize-2-DJFG2EXJ.js → maximize-2-BS689r4W.js} +1 -1
- package/payload/server/public/assets/maximize-2-BS689r4W.js.br +0 -0
- package/payload/server/public/assets/maximize-2-BS689r4W.js.gz +0 -0
- package/payload/server/public/assets/{mermaid-parser.core-5w0T1dRj.js → mermaid-parser.core-Bq--iC2w.js} +2 -2
- package/payload/server/public/assets/mermaid-parser.core-Bq--iC2w.js.br +0 -0
- package/payload/server/public/assets/mermaid-parser.core-Bq--iC2w.js.gz +0 -0
- package/payload/server/public/assets/{mermaid.core-DBADY5VW.js → mermaid.core-oYX-FxVa.js} +3 -3
- package/payload/server/public/assets/mermaid.core-oYX-FxVa.js.br +0 -0
- package/payload/server/public/assets/mermaid.core-oYX-FxVa.js.gz +0 -0
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-rHz37loq.js → mindmap-definition-QFDTVHPH-ByZjL4Bs.js} +1 -1
- package/payload/server/public/assets/mindmap-definition-QFDTVHPH-ByZjL4Bs.js.br +0 -0
- package/payload/server/public/assets/mindmap-definition-QFDTVHPH-ByZjL4Bs.js.gz +0 -0
- package/payload/server/public/assets/operator-CvapnpIW.js +1 -0
- package/payload/server/public/assets/operator-CvapnpIW.js.br +0 -0
- package/payload/server/public/assets/operator-CvapnpIW.js.gz +0 -0
- package/payload/server/public/assets/{ordinal-D6D6WcTC.js → ordinal-gnpqfIHn.js} +1 -1
- package/payload/server/public/assets/ordinal-gnpqfIHn.js.br +0 -0
- package/payload/server/public/assets/ordinal-gnpqfIHn.js.gz +0 -0
- package/payload/server/public/assets/packet-4T2RLAQJ-DczCn3uj.js +1 -0
- package/payload/server/public/assets/packet-4T2RLAQJ-DczCn3uj.js.br +0 -0
- package/payload/server/public/assets/page-987y4JbQ.js +32 -0
- package/payload/server/public/assets/page-987y4JbQ.js.br +0 -0
- package/payload/server/public/assets/page-987y4JbQ.js.gz +0 -0
- package/payload/server/public/assets/page-DWkUH4Z_.js +1 -0
- package/payload/server/public/assets/page-DWkUH4Z_.js.br +0 -0
- package/payload/server/public/assets/page-DWkUH4Z_.js.gz +0 -0
- package/payload/server/public/assets/{pdf-render-BSgBp8Fr.js → pdf-render-gEryZmeC.js} +1 -1
- package/payload/server/public/assets/pdf-render-gEryZmeC.js.br +0 -0
- package/payload/server/public/assets/pdf-render-gEryZmeC.js.gz +0 -0
- package/payload/server/public/assets/pie-ZZUOXDRM-CbvZUaof.js +1 -0
- package/payload/server/public/assets/pie-ZZUOXDRM-CbvZUaof.js.br +0 -0
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-as0e_DSH.js → pieDiagram-DEJITSTG-BGFms5bU.js} +1 -1
- package/payload/server/public/assets/pieDiagram-DEJITSTG-BGFms5bU.js.br +0 -0
- package/payload/server/public/assets/pieDiagram-DEJITSTG-BGFms5bU.js.gz +0 -0
- package/payload/server/public/assets/{public-CNVEM-Bx.js → public-D5pi-VFn.js} +1 -1
- package/payload/server/public/assets/public-D5pi-VFn.js.br +0 -0
- package/payload/server/public/assets/public-D5pi-VFn.js.gz +0 -0
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-B4t8HO9J.js → quadrantDiagram-34T5L4WZ-_ymoz8bQ.js} +1 -1
- package/payload/server/public/assets/quadrantDiagram-34T5L4WZ-_ymoz8bQ.js.br +0 -0
- package/payload/server/public/assets/quadrantDiagram-34T5L4WZ-_ymoz8bQ.js.gz +0 -0
- package/payload/server/public/assets/radar-PYXPWWZC-XmuabQlO.js +1 -0
- package/payload/server/public/assets/radar-PYXPWWZC-XmuabQlO.js.br +0 -0
- package/payload/server/public/assets/{reduce-BtXXK8Ma.js → reduce-BvezuHIe.js} +1 -1
- package/payload/server/public/assets/reduce-BvezuHIe.js.br +0 -0
- package/payload/server/public/assets/reduce-BvezuHIe.js.gz +0 -0
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-yxh30zHX.js → requirementDiagram-MS252O5E-lrOmOxIA.js} +1 -1
- package/payload/server/public/assets/requirementDiagram-MS252O5E-lrOmOxIA.js.br +0 -0
- package/payload/server/public/assets/requirementDiagram-MS252O5E-lrOmOxIA.js.gz +0 -0
- package/payload/server/public/assets/{rotate-ccw-DQCaky8_.js → rotate-ccw-zNxnK36R.js} +1 -1
- package/payload/server/public/assets/rotate-ccw-zNxnK36R.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-zNxnK36R.js.gz +0 -0
- package/payload/server/public/assets/routines-mZzrGA5y.js +2 -0
- package/payload/server/public/assets/routines-mZzrGA5y.js.br +0 -0
- package/payload/server/public/assets/routines-mZzrGA5y.js.gz +0 -0
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-j-k9Wfty.js → sankeyDiagram-XADWPNL6-CdUQThXU.js} +1 -1
- package/payload/server/public/assets/sankeyDiagram-XADWPNL6-CdUQThXU.js.br +0 -0
- package/payload/server/public/assets/sankeyDiagram-XADWPNL6-CdUQThXU.js.gz +0 -0
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-DGLgcLhC.js → sequenceDiagram-FGHM5R23-DqnEEldq.js} +1 -1
- package/payload/server/public/assets/sequenceDiagram-FGHM5R23-DqnEEldq.js.br +0 -0
- package/payload/server/public/assets/sequenceDiagram-FGHM5R23-DqnEEldq.js.gz +0 -0
- package/payload/server/public/assets/{skills-CosN3uA4.js → skills-5A8PockT.js} +1 -1
- package/payload/server/public/assets/skills-5A8PockT.js.br +0 -0
- package/payload/server/public/assets/skills-5A8PockT.js.gz +0 -0
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-C9p1OUMI.js → stateDiagram-FHFEXIEX-KEdtxqdq.js} +1 -1
- package/payload/server/public/assets/stateDiagram-FHFEXIEX-KEdtxqdq.js.br +0 -0
- package/payload/server/public/assets/stateDiagram-FHFEXIEX-KEdtxqdq.js.gz +0 -0
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Cs85Ewtt.js +1 -0
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Cs85Ewtt.js.br +0 -0
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Cs85Ewtt.js.gz +0 -0
- package/payload/server/public/assets/{tasks-f0QikHmw.js → tasks-B1_2wc6L.js} +2 -2
- package/payload/server/public/assets/tasks-B1_2wc6L.js.br +0 -0
- package/payload/server/public/assets/tasks-B1_2wc6L.js.gz +0 -0
- package/payload/server/public/assets/{time-entry-format-DLTdS35_.js → time-entry-format-CJ2FSSQt.js} +1 -1
- package/payload/server/public/assets/time-entry-format-CJ2FSSQt.js.br +0 -0
- package/payload/server/public/assets/time-entry-format-CJ2FSSQt.js.gz +0 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-B1g7pgkH.js → timeline-definition-GMOUNBTQ-BRXdCMau.js} +1 -1
- package/payload/server/public/assets/timeline-definition-GMOUNBTQ-BRXdCMau.js.br +0 -0
- package/payload/server/public/assets/timeline-definition-GMOUNBTQ-BRXdCMau.js.gz +0 -0
- package/payload/server/public/assets/treeView-SZITEDCU-B-SYhqwK.js +1 -0
- package/payload/server/public/assets/treeView-SZITEDCU-B-SYhqwK.js.br +0 -0
- package/payload/server/public/assets/treemap-W4RFUUIX-DpZmFNM9.js +1 -0
- package/payload/server/public/assets/treemap-W4RFUUIX-DpZmFNM9.js.br +0 -0
- package/payload/server/public/assets/{triangle-alert-CpwrbdYq.js → triangle-alert-CedsrgME.js} +1 -1
- package/payload/server/public/assets/triangle-alert-CedsrgME.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-CedsrgME.js.gz +0 -0
- package/payload/server/public/assets/{useCopyFeedback-D01gSp36.js → useCopyFeedback-zjZZUC2-.js} +1 -1
- package/payload/server/public/assets/useCopyFeedback-zjZZUC2-.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-zjZZUC2-.js.gz +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-72THldvm.css +1 -0
- package/payload/server/public/assets/useSubAccountSwitcher-72THldvm.css.br +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-72THldvm.css.gz +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-HjQZjJBr.js +14 -0
- package/payload/server/public/assets/useSubAccountSwitcher-HjQZjJBr.js.br +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-HjQZjJBr.js.gz +0 -0
- package/payload/server/public/assets/{useVoiceRecorder-DiPgyDUy.js → useVoiceRecorder-CJecnefX.js} +2 -2
- package/payload/server/public/assets/useVoiceRecorder-CJecnefX.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-CJecnefX.js.gz +0 -0
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-D2ZjFfh4.js → vennDiagram-DHZGUBPP-8nc7NUVQ.js} +1 -1
- package/payload/server/public/assets/vennDiagram-DHZGUBPP-8nc7NUVQ.js.br +0 -0
- package/payload/server/public/assets/vennDiagram-DHZGUBPP-8nc7NUVQ.js.gz +0 -0
- package/payload/server/public/assets/wardley-RL74JXVD-D2FCCV4-.js +1 -0
- package/payload/server/public/assets/wardley-RL74JXVD-D2FCCV4-.js.br +0 -0
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-BFAhfkD8.js → wardleyDiagram-NUSXRM2D-Cjjiap8M.js} +1 -1
- package/payload/server/public/assets/wardleyDiagram-NUSXRM2D-Cjjiap8M.js.br +0 -0
- package/payload/server/public/assets/wardleyDiagram-NUSXRM2D-Cjjiap8M.js.gz +0 -0
- package/payload/server/public/assets/{wrench-C5SJreEu.js → wrench-D8BH20W8.js} +1 -1
- package/payload/server/public/assets/wrench-D8BH20W8.js.br +0 -0
- package/payload/server/public/assets/wrench-D8BH20W8.js.gz +0 -0
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-Dt94h2RQ.js → xychartDiagram-5P7HB3ND-DEzDNw_i.js} +1 -1
- package/payload/server/public/assets/xychartDiagram-5P7HB3ND-DEzDNw_i.js.br +0 -0
- package/payload/server/public/assets/xychartDiagram-5P7HB3ND-DEzDNw_i.js.gz +0 -0
- package/payload/server/public/browser.html +5 -4
- package/payload/server/public/calendar.html +7 -7
- package/payload/server/public/chat.html +14 -14
- package/payload/server/public/data.html +13 -13
- package/payload/server/public/graph.html +9 -9
- package/payload/server/public/index.html +17 -16
- package/payload/server/public/operator.html +16 -15
- package/payload/server/public/public.html +14 -14
- package/payload/server/public/routines.html +7 -7
- package/payload/server/public/skills.html +5 -5
- package/payload/server/public/tasks.html +6 -6
- package/payload/server/server.js +403 -277
- package/payload/server/public/assets/AdminLoginScreens-DSt9DYZZ.js +0 -1
- package/payload/server/public/assets/AdminLoginScreens-DSt9DYZZ.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-DSt9DYZZ.js.gz +0 -0
- package/payload/server/public/assets/AdminShell-MM3_yp3N.js +0 -2
- package/payload/server/public/assets/AdminShell-MM3_yp3N.js.br +0 -0
- package/payload/server/public/assets/AdminShell-MM3_yp3N.js.gz +0 -0
- package/payload/server/public/assets/activity-aVvbaVd4.js.br +0 -0
- package/payload/server/public/assets/activity-aVvbaVd4.js.gz +0 -0
- package/payload/server/public/assets/admin-B0lQnkH-.js +0 -1
- package/payload/server/public/assets/admin-B0lQnkH-.js.br +0 -0
- package/payload/server/public/assets/admin-B0lQnkH-.js.gz +0 -0
- package/payload/server/public/assets/agents-CrpVTPRG.js.br +0 -0
- package/payload/server/public/assets/agents-CrpVTPRG.js.gz +0 -0
- package/payload/server/public/assets/arc-DaudCnXg.js.br +0 -0
- package/payload/server/public/assets/arc-DaudCnXg.js.gz +0 -0
- package/payload/server/public/assets/architecture-YZFGNWBL-DPFsm5jD.js +0 -1
- package/payload/server/public/assets/architecture-YZFGNWBL-DPFsm5jD.js.br +0 -0
- package/payload/server/public/assets/architectureDiagram-Q4EWVU46-BEEC3s7i.js.br +0 -0
- package/payload/server/public/assets/architectureDiagram-Q4EWVU46-BEEC3s7i.js.gz +0 -0
- package/payload/server/public/assets/blockDiagram-DXYQGD6D-BIWyfb18.js.br +0 -0
- package/payload/server/public/assets/blockDiagram-DXYQGD6D-BIWyfb18.js.gz +0 -0
- package/payload/server/public/assets/browser-CYHUzTop.js +0 -1
- package/payload/server/public/assets/browser-CYHUzTop.js.br +0 -0
- package/payload/server/public/assets/browser-CYHUzTop.js.gz +0 -0
- package/payload/server/public/assets/c4Diagram-AHTNJAMY--h6oE2cv.js.br +0 -0
- package/payload/server/public/assets/c4Diagram-AHTNJAMY--h6oE2cv.js.gz +0 -0
- package/payload/server/public/assets/calendar-4IWQpwYv.js.br +0 -0
- package/payload/server/public/assets/calendar-4IWQpwYv.js.gz +0 -0
- package/payload/server/public/assets/channel-TwxCDSpK.js +0 -1
- package/payload/server/public/assets/channel-TwxCDSpK.js.br +0 -0
- package/payload/server/public/assets/chat-DmjZTqnV.js +0 -1
- package/payload/server/public/assets/chat-DmjZTqnV.js.br +0 -0
- package/payload/server/public/assets/chat-DmjZTqnV.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-CIl-s3LZ.js +0 -1
- package/payload/server/public/assets/chevron-left-CIl-s3LZ.js.br +0 -0
- package/payload/server/public/assets/chevron-right-DpAi2BsF.js +0 -1
- package/payload/server/public/assets/chevron-right-DpAi2BsF.js.br +0 -0
- package/payload/server/public/assets/chunk-2KRD3SAO-BwEVlnxo.js.br +0 -0
- package/payload/server/public/assets/chunk-2KRD3SAO-BwEVlnxo.js.gz +0 -0
- package/payload/server/public/assets/chunk-336JU56O-DQddTATH.js.br +0 -0
- package/payload/server/public/assets/chunk-336JU56O-DQddTATH.js.gz +0 -0
- package/payload/server/public/assets/chunk-426QAEUC-BDC8wptW.js +0 -1
- package/payload/server/public/assets/chunk-426QAEUC-BDC8wptW.js.br +0 -0
- package/payload/server/public/assets/chunk-426QAEUC-BDC8wptW.js.gz +0 -0
- package/payload/server/public/assets/chunk-4BX2VUAB-C5p3xTC6.js.br +0 -0
- package/payload/server/public/assets/chunk-4BX2VUAB-C5p3xTC6.js.gz +0 -0
- package/payload/server/public/assets/chunk-4TB4RGXK-gClfNc1w.js.br +0 -0
- package/payload/server/public/assets/chunk-4TB4RGXK-gClfNc1w.js.gz +0 -0
- package/payload/server/public/assets/chunk-55IACEB6-DDU_m1ra.js.br +0 -0
- package/payload/server/public/assets/chunk-55IACEB6-DDU_m1ra.js.gz +0 -0
- package/payload/server/public/assets/chunk-5FUZZQ4R-CZ2jQWNR.js.br +0 -0
- package/payload/server/public/assets/chunk-5FUZZQ4R-CZ2jQWNR.js.gz +0 -0
- package/payload/server/public/assets/chunk-5PVQY5BW-kcZ5kfTg.js.br +0 -0
- package/payload/server/public/assets/chunk-5PVQY5BW-kcZ5kfTg.js.gz +0 -0
- package/payload/server/public/assets/chunk-67CJDMHE-9W0Qv0jm.js.br +0 -0
- package/payload/server/public/assets/chunk-67CJDMHE-9W0Qv0jm.js.gz +0 -0
- package/payload/server/public/assets/chunk-7N4EOEYR-B3gqydR3.js.br +0 -0
- package/payload/server/public/assets/chunk-7N4EOEYR-B3gqydR3.js.gz +0 -0
- package/payload/server/public/assets/chunk-AA7GKIK3-DW8a-2NK.js.br +0 -4
- package/payload/server/public/assets/chunk-AA7GKIK3-DW8a-2NK.js.gz +0 -0
- package/payload/server/public/assets/chunk-BSJP7CBP-DqXIO_5R.js.br +0 -0
- package/payload/server/public/assets/chunk-BSJP7CBP-DqXIO_5R.js.gz +0 -0
- package/payload/server/public/assets/chunk-CIAEETIT-BMJfgj2u.js.br +0 -0
- package/payload/server/public/assets/chunk-CIAEETIT-BMJfgj2u.js.gz +0 -0
- package/payload/server/public/assets/chunk-EDXVE4YY-BxdLPk0b.js.br +0 -0
- package/payload/server/public/assets/chunk-EDXVE4YY-BxdLPk0b.js.gz +0 -0
- package/payload/server/public/assets/chunk-ENJZ2VHE-Cfe2DCjQ.js.br +0 -0
- package/payload/server/public/assets/chunk-ENJZ2VHE-Cfe2DCjQ.js.gz +0 -0
- package/payload/server/public/assets/chunk-FMBD7UC4-CdPjwbtf.js.br +0 -0
- package/payload/server/public/assets/chunk-FMBD7UC4-CdPjwbtf.js.gz +0 -0
- package/payload/server/public/assets/chunk-FOC6F5B3-Dl6l1KAh.js.br +0 -0
- package/payload/server/public/assets/chunk-FOC6F5B3-Dl6l1KAh.js.gz +0 -0
- package/payload/server/public/assets/chunk-ICPOFSXX-PnsGrqtx.js.br +0 -0
- package/payload/server/public/assets/chunk-ICPOFSXX-PnsGrqtx.js.gz +0 -0
- package/payload/server/public/assets/chunk-K5T4RW27--g29_wjW.js.br +0 -0
- package/payload/server/public/assets/chunk-K5T4RW27--g29_wjW.js.gz +0 -0
- package/payload/server/public/assets/chunk-KGLVRYIC-CI77ENeO.js.br +0 -3
- package/payload/server/public/assets/chunk-KGLVRYIC-CI77ENeO.js.gz +0 -0
- package/payload/server/public/assets/chunk-LIHQZDEY-CE-XByg6.js.br +0 -0
- package/payload/server/public/assets/chunk-LIHQZDEY-CE-XByg6.js.gz +0 -0
- package/payload/server/public/assets/chunk-ORNJ4GCN-DkjJQQSm.js.br +0 -0
- package/payload/server/public/assets/chunk-ORNJ4GCN-DkjJQQSm.js.gz +0 -0
- package/payload/server/public/assets/chunk-OYMX7WX6-DhogFeD7.js.br +0 -0
- package/payload/server/public/assets/chunk-OYMX7WX6-DhogFeD7.js.gz +0 -0
- package/payload/server/public/assets/chunk-QZHKN3VN-DnqqL1de.js +0 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-DnqqL1de.js.br +0 -0
- package/payload/server/public/assets/chunk-QZHKN3VN-DnqqL1de.js.gz +0 -0
- package/payload/server/public/assets/chunk-U2HBQHQK-CeaRXuiO.js.br +0 -0
- package/payload/server/public/assets/chunk-U2HBQHQK-CeaRXuiO.js.gz +0 -0
- package/payload/server/public/assets/chunk-X2U36JSP-BqxXeOqf.js.br +0 -0
- package/payload/server/public/assets/chunk-X2U36JSP-BqxXeOqf.js.gz +0 -0
- package/payload/server/public/assets/chunk-XPW4576I-DtqJwn2x.js.br +0 -0
- package/payload/server/public/assets/chunk-XPW4576I-DtqJwn2x.js.gz +0 -0
- package/payload/server/public/assets/chunk-YZCP3GAM-COBlEwQw.js.br +0 -0
- package/payload/server/public/assets/chunk-YZCP3GAM-COBlEwQw.js.gz +0 -0
- package/payload/server/public/assets/chunk-ZZ45TVLE-CcL088y6.js.br +0 -0
- package/payload/server/public/assets/chunk-ZZ45TVLE-CcL088y6.js.gz +0 -0
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-Bc3P4dpc.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-Bc3P4dpc.js.br +0 -0
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-Bc3P4dpc.js.gz +0 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DgEF_rR_.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DgEF_rR_.js.br +0 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DgEF_rR_.js.gz +0 -0
- package/payload/server/public/assets/clock-CGuM9VRx.js +0 -1
- package/payload/server/public/assets/clock-CGuM9VRx.js.br +0 -0
- package/payload/server/public/assets/clone-B3vq32j7.js +0 -1
- package/payload/server/public/assets/cose-bilkent-S5V4N54A-kEHVkDNn.js.br +0 -0
- package/payload/server/public/assets/cose-bilkent-S5V4N54A-kEHVkDNn.js.gz +0 -0
- package/payload/server/public/assets/dagre-D2wUw1zC.js.br +0 -0
- package/payload/server/public/assets/dagre-D2wUw1zC.js.gz +0 -0
- package/payload/server/public/assets/dagre-KV5264BT-BWfTDwEs.js.br +0 -0
- package/payload/server/public/assets/dagre-KV5264BT-BWfTDwEs.js.gz +0 -0
- package/payload/server/public/assets/data-BpdFiZKH.js +0 -1
- package/payload/server/public/assets/data-BpdFiZKH.js.br +0 -2
- package/payload/server/public/assets/data-BpdFiZKH.js.gz +0 -0
- package/payload/server/public/assets/diagram-5BDNPKRD-Tl9dS8w0.js.br +0 -0
- package/payload/server/public/assets/diagram-5BDNPKRD-Tl9dS8w0.js.gz +0 -0
- package/payload/server/public/assets/diagram-G4DWMVQ6-CeSe6TMu.js.br +0 -0
- package/payload/server/public/assets/diagram-G4DWMVQ6-CeSe6TMu.js.gz +0 -0
- package/payload/server/public/assets/diagram-MMDJMWI5-DYBNJCmk.js.br +0 -0
- package/payload/server/public/assets/diagram-MMDJMWI5-DYBNJCmk.js.gz +0 -0
- package/payload/server/public/assets/diagram-TYMM5635-BmpUGltx.js.br +0 -0
- package/payload/server/public/assets/diagram-TYMM5635-BmpUGltx.js.gz +0 -0
- package/payload/server/public/assets/erDiagram-SMLLAGMA-DuwuNGqx.js.br +0 -0
- package/payload/server/public/assets/erDiagram-SMLLAGMA-DuwuNGqx.js.gz +0 -0
- package/payload/server/public/assets/file-download-DayBHhKS.js.br +0 -0
- package/payload/server/public/assets/file-download-DayBHhKS.js.gz +0 -0
- package/payload/server/public/assets/file-text-BSyhVH0m.js.br +0 -0
- package/payload/server/public/assets/file-text-BSyhVH0m.js.gz +0 -0
- package/payload/server/public/assets/flatten-Bu-b1uTY.js.br +0 -0
- package/payload/server/public/assets/flatten-Bu-b1uTY.js.gz +0 -0
- package/payload/server/public/assets/flowDiagram-DWJPFMVM-Bpp8P6Ba.js.br +0 -0
- package/payload/server/public/assets/flowDiagram-DWJPFMVM-Bpp8P6Ba.js.gz +0 -0
- package/payload/server/public/assets/ganttDiagram-T4ZO3ILL-CE6ppjB4.js.br +0 -0
- package/payload/server/public/assets/ganttDiagram-T4ZO3ILL-CE6ppjB4.js.gz +0 -0
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-B0OUwOUx.js +0 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-B0OUwOUx.js.br +0 -0
- package/payload/server/public/assets/gitGraphDiagram-UUTBAWPF-BdK1GjPr.js.br +0 -0
- package/payload/server/public/assets/gitGraphDiagram-UUTBAWPF-BdK1GjPr.js.gz +0 -0
- package/payload/server/public/assets/graph-Bjv3Tc3B.js.br +0 -0
- package/payload/server/public/assets/graph-Bjv3Tc3B.js.gz +0 -0
- package/payload/server/public/assets/graph-labels-DegLKGdx.js.br +0 -0
- package/payload/server/public/assets/graph-labels-DegLKGdx.js.gz +0 -0
- package/payload/server/public/assets/graphlib-CHEXylyU.js.br +0 -0
- package/payload/server/public/assets/graphlib-CHEXylyU.js.gz +0 -0
- package/payload/server/public/assets/info-OMHHGYJF-C_8TwPDe.js +0 -1
- package/payload/server/public/assets/info-OMHHGYJF-C_8TwPDe.js.br +0 -0
- package/payload/server/public/assets/infoDiagram-42DDH7IO-msfwyvbV.js +0 -2
- package/payload/server/public/assets/infoDiagram-42DDH7IO-msfwyvbV.js.br +0 -0
- package/payload/server/public/assets/infoDiagram-42DDH7IO-msfwyvbV.js.gz +0 -0
- package/payload/server/public/assets/isEmpty-CjH0UASp.js.br +0 -0
- package/payload/server/public/assets/isEmpty-CjH0UASp.js.gz +0 -0
- package/payload/server/public/assets/ishikawaDiagram-UXIWVN3A-CgkVZ4-3.js.br +0 -0
- package/payload/server/public/assets/ishikawaDiagram-UXIWVN3A-CgkVZ4-3.js.gz +0 -0
- package/payload/server/public/assets/journeyDiagram-VCZTEJTY-ByUPv8q6.js.br +0 -0
- package/payload/server/public/assets/journeyDiagram-VCZTEJTY-ByUPv8q6.js.gz +0 -0
- package/payload/server/public/assets/kanban-definition-6JOO6SKY-CFinqhpu.js.br +0 -0
- package/payload/server/public/assets/kanban-definition-6JOO6SKY-CFinqhpu.js.gz +0 -0
- package/payload/server/public/assets/line-Y4ns5Ghi.js.br +0 -0
- package/payload/server/public/assets/line-Y4ns5Ghi.js.gz +0 -0
- package/payload/server/public/assets/linear-l39GooQ5.js.br +0 -0
- package/payload/server/public/assets/linear-l39GooQ5.js.gz +0 -0
- package/payload/server/public/assets/maximize-2-DJFG2EXJ.js.br +0 -0
- package/payload/server/public/assets/maximize-2-DJFG2EXJ.js.gz +0 -0
- package/payload/server/public/assets/mermaid-parser.core-5w0T1dRj.js.br +0 -0
- package/payload/server/public/assets/mermaid-parser.core-5w0T1dRj.js.gz +0 -0
- package/payload/server/public/assets/mermaid.core-DBADY5VW.js.br +0 -0
- package/payload/server/public/assets/mermaid.core-DBADY5VW.js.gz +0 -0
- package/payload/server/public/assets/mindmap-definition-QFDTVHPH-rHz37loq.js.br +0 -0
- package/payload/server/public/assets/mindmap-definition-QFDTVHPH-rHz37loq.js.gz +0 -0
- package/payload/server/public/assets/operator-Du9Ve_PR.js +0 -1
- package/payload/server/public/assets/operator-Du9Ve_PR.js.br +0 -0
- package/payload/server/public/assets/operator-Du9Ve_PR.js.gz +0 -0
- package/payload/server/public/assets/ordinal-D6D6WcTC.js.br +0 -0
- package/payload/server/public/assets/ordinal-D6D6WcTC.js.gz +0 -0
- package/payload/server/public/assets/packet-4T2RLAQJ-CCQdbIqO.js +0 -1
- package/payload/server/public/assets/packet-4T2RLAQJ-CCQdbIqO.js.br +0 -0
- package/payload/server/public/assets/page-DgHYxG3M.js +0 -1
- package/payload/server/public/assets/page-DgHYxG3M.js.br +0 -0
- package/payload/server/public/assets/page-DgHYxG3M.js.gz +0 -0
- package/payload/server/public/assets/page-qV1ypb6i.js +0 -32
- package/payload/server/public/assets/page-qV1ypb6i.js.br +0 -0
- package/payload/server/public/assets/page-qV1ypb6i.js.gz +0 -0
- package/payload/server/public/assets/pdf-render-BSgBp8Fr.js.br +0 -0
- package/payload/server/public/assets/pdf-render-BSgBp8Fr.js.gz +0 -0
- package/payload/server/public/assets/pie-ZZUOXDRM-Bdw3Iqs7.js +0 -1
- package/payload/server/public/assets/pie-ZZUOXDRM-Bdw3Iqs7.js.br +0 -0
- package/payload/server/public/assets/pieDiagram-DEJITSTG-as0e_DSH.js.br +0 -0
- package/payload/server/public/assets/pieDiagram-DEJITSTG-as0e_DSH.js.gz +0 -0
- package/payload/server/public/assets/public-CNVEM-Bx.js.br +0 -0
- package/payload/server/public/assets/public-CNVEM-Bx.js.gz +0 -0
- package/payload/server/public/assets/quadrantDiagram-34T5L4WZ-B4t8HO9J.js.br +0 -0
- package/payload/server/public/assets/quadrantDiagram-34T5L4WZ-B4t8HO9J.js.gz +0 -0
- package/payload/server/public/assets/radar-PYXPWWZC-D3FUdA3r.js +0 -1
- package/payload/server/public/assets/radar-PYXPWWZC-D3FUdA3r.js.br +0 -0
- package/payload/server/public/assets/reduce-BtXXK8Ma.js.br +0 -0
- package/payload/server/public/assets/reduce-BtXXK8Ma.js.gz +0 -0
- package/payload/server/public/assets/requirementDiagram-MS252O5E-yxh30zHX.js.br +0 -0
- package/payload/server/public/assets/requirementDiagram-MS252O5E-yxh30zHX.js.gz +0 -0
- package/payload/server/public/assets/rotate-ccw-DQCaky8_.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-DQCaky8_.js.gz +0 -0
- package/payload/server/public/assets/routines-DwK5FeLm.js +0 -1
- package/payload/server/public/assets/routines-DwK5FeLm.js.br +0 -0
- package/payload/server/public/assets/routines-DwK5FeLm.js.gz +0 -0
- package/payload/server/public/assets/sankeyDiagram-XADWPNL6-j-k9Wfty.js.br +0 -0
- package/payload/server/public/assets/sankeyDiagram-XADWPNL6-j-k9Wfty.js.gz +0 -0
- package/payload/server/public/assets/sequenceDiagram-FGHM5R23-DGLgcLhC.js.br +0 -0
- package/payload/server/public/assets/sequenceDiagram-FGHM5R23-DGLgcLhC.js.gz +0 -0
- package/payload/server/public/assets/skills-CosN3uA4.js.br +0 -0
- package/payload/server/public/assets/skills-CosN3uA4.js.gz +0 -0
- package/payload/server/public/assets/stateDiagram-FHFEXIEX-C9p1OUMI.js.br +0 -0
- package/payload/server/public/assets/stateDiagram-FHFEXIEX-C9p1OUMI.js.gz +0 -0
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Bf808Apk.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Bf808Apk.js.br +0 -0
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Bf808Apk.js.gz +0 -0
- package/payload/server/public/assets/tasks-f0QikHmw.js.br +0 -0
- package/payload/server/public/assets/tasks-f0QikHmw.js.gz +0 -0
- package/payload/server/public/assets/time-entry-format-DLTdS35_.js.br +0 -0
- package/payload/server/public/assets/time-entry-format-DLTdS35_.js.gz +0 -0
- package/payload/server/public/assets/timeline-definition-GMOUNBTQ-B1g7pgkH.js.br +0 -0
- package/payload/server/public/assets/timeline-definition-GMOUNBTQ-B1g7pgkH.js.gz +0 -0
- package/payload/server/public/assets/treeView-SZITEDCU-DetKw0D0.js +0 -1
- package/payload/server/public/assets/treeView-SZITEDCU-DetKw0D0.js.br +0 -0
- package/payload/server/public/assets/treemap-W4RFUUIX-zQkIANxW.js +0 -1
- package/payload/server/public/assets/treemap-W4RFUUIX-zQkIANxW.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-CpwrbdYq.js.br +0 -3
- package/payload/server/public/assets/triangle-alert-CpwrbdYq.js.gz +0 -0
- package/payload/server/public/assets/useCopyFeedback-D01gSp36.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-D01gSp36.js.gz +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-BRHYXwGO.js +0 -14
- package/payload/server/public/assets/useSubAccountSwitcher-BRHYXwGO.js.br +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-BRHYXwGO.js.gz +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-CJzJ9xV3.css +0 -1
- package/payload/server/public/assets/useSubAccountSwitcher-CJzJ9xV3.css.br +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-CJzJ9xV3.css.gz +0 -0
- package/payload/server/public/assets/useVoiceRecorder-DiPgyDUy.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-DiPgyDUy.js.gz +0 -0
- package/payload/server/public/assets/vennDiagram-DHZGUBPP-D2ZjFfh4.js.br +0 -0
- package/payload/server/public/assets/vennDiagram-DHZGUBPP-D2ZjFfh4.js.gz +0 -0
- package/payload/server/public/assets/wardley-RL74JXVD-DkQV3DvB.js +0 -1
- package/payload/server/public/assets/wardley-RL74JXVD-DkQV3DvB.js.br +0 -0
- package/payload/server/public/assets/wardleyDiagram-NUSXRM2D-BFAhfkD8.js.br +0 -0
- package/payload/server/public/assets/wardleyDiagram-NUSXRM2D-BFAhfkD8.js.gz +0 -0
- package/payload/server/public/assets/wrench-C5SJreEu.js.br +0 -1
- package/payload/server/public/assets/wrench-C5SJreEu.js.gz +0 -0
- package/payload/server/public/assets/xychartDiagram-5P7HB3ND-Dt94h2RQ.js.br +0 -0
- package/payload/server/public/assets/xychartDiagram-5P7HB3ND-Dt94h2RQ.js.gz +0 -0
- /package/payload/server/public/assets/{_baseFor-B12He5Rp.js → _baseFor-BApe6Tla.js} +0 -0
- /package/payload/server/public/assets/{_baseFor-B12He5Rp.js.br → _baseFor-BApe6Tla.js.br} +0 -0
- /package/payload/server/public/assets/{_baseFor-B12He5Rp.js.gz → _baseFor-BApe6Tla.js.gz} +0 -0
- /package/payload/server/public/assets/{array-DO1uCttT.js → array-eiH4WfvY.js} +0 -0
- /package/payload/server/public/assets/{array-DO1uCttT.js.br → array-eiH4WfvY.js.br} +0 -0
- /package/payload/server/public/assets/{cytoscape.esm-DFn2foqy.js → cytoscape.esm-BZ6NYo0w.js} +0 -0
- /package/payload/server/public/assets/{cytoscape.esm-DFn2foqy.js.br → cytoscape.esm-BZ6NYo0w.js.br} +0 -0
- /package/payload/server/public/assets/{cytoscape.esm-DFn2foqy.js.gz → cytoscape.esm-BZ6NYo0w.js.gz} +0 -0
- /package/payload/server/public/assets/{defaultLocale-ieI3yFoA.js → defaultLocale-DWHqsa6O.js} +0 -0
- /package/payload/server/public/assets/{defaultLocale-ieI3yFoA.js.br → defaultLocale-DWHqsa6O.js.br} +0 -0
- /package/payload/server/public/assets/{defaultLocale-ieI3yFoA.js.gz → defaultLocale-DWHqsa6O.js.gz} +0 -0
- /package/payload/server/public/assets/{dist-DlU7AEeD.js → dist-IoQuidkp.js} +0 -0
- /package/payload/server/public/assets/{dist-DlU7AEeD.js.br → dist-IoQuidkp.js.br} +0 -0
- /package/payload/server/public/assets/{dist-DlU7AEeD.js.gz → dist-IoQuidkp.js.gz} +0 -0
- /package/payload/server/public/assets/{init-BCRlEgNP.js → init-BdkYWjJJ.js} +0 -0
- /package/payload/server/public/assets/{init-BCRlEgNP.js.br → init-BdkYWjJJ.js.br} +0 -0
- /package/payload/server/public/assets/{init-BCRlEgNP.js.gz → init-BdkYWjJJ.js.gz} +0 -0
- /package/payload/server/public/assets/{katex-gkTaZgi6.js → katex-BCzoGtFh.js} +0 -0
- /package/payload/server/public/assets/{katex-gkTaZgi6.js.br → katex-BCzoGtFh.js.br} +0 -0
- /package/payload/server/public/assets/{katex-gkTaZgi6.js.gz → katex-BCzoGtFh.js.gz} +0 -0
- /package/payload/server/public/assets/{path-DTmzQFjQ.js → path-DY2qBuPM.js} +0 -0
- /package/payload/server/public/assets/{path-DTmzQFjQ.js.br → path-DY2qBuPM.js.br} +0 -0
- /package/payload/server/public/assets/{path-DTmzQFjQ.js.gz → path-DY2qBuPM.js.gz} +0 -0
- /package/payload/server/public/assets/{preload-helper-eAV8hweq.js → preload-helper-3YNEDsJZ.js} +0 -0
- /package/payload/server/public/assets/{preload-helper-eAV8hweq.js.br → preload-helper-3YNEDsJZ.js.br} +0 -0
- /package/payload/server/public/assets/{preload-helper-eAV8hweq.js.gz → preload-helper-3YNEDsJZ.js.gz} +0 -0
- /package/payload/server/public/assets/{rough.esm-BFJ-MgcB.js → rough.esm-ec8xsRC7.js} +0 -0
- /package/payload/server/public/assets/{rough.esm-BFJ-MgcB.js.br → rough.esm-ec8xsRC7.js.br} +0 -0
- /package/payload/server/public/assets/{rough.esm-BFJ-MgcB.js.gz → rough.esm-ec8xsRC7.js.gz} +0 -0
- /package/payload/server/public/assets/{src-9CNk4JU0.js → src-C-STKunZ.js} +0 -0
- /package/payload/server/public/assets/{src-9CNk4JU0.js.br → src-C-STKunZ.js.br} +0 -0
- /package/payload/server/public/assets/{src-9CNk4JU0.js.gz → src-C-STKunZ.js.gz} +0 -0
package/payload/server/server.js
CHANGED
|
@@ -59,7 +59,7 @@ import {
|
|
|
59
59
|
verifyRemotePassword,
|
|
60
60
|
vncLog,
|
|
61
61
|
walkPremiumBundles
|
|
62
|
-
} from "./chunk-
|
|
62
|
+
} from "./chunk-DLG7XSLA.js";
|
|
63
63
|
import {
|
|
64
64
|
DATA_ROOT,
|
|
65
65
|
EXTRACTED_TEXT_SUFFIX,
|
|
@@ -183,13 +183,12 @@ import {
|
|
|
183
183
|
waitForConnection,
|
|
184
184
|
warnNonUuidAccount,
|
|
185
185
|
writeChatMetadataMerged
|
|
186
|
-
} from "./chunk-
|
|
186
|
+
} from "./chunk-UTIHI6KV.js";
|
|
187
187
|
import {
|
|
188
188
|
ACCOUNTS_DIR,
|
|
189
189
|
BIN_DIR,
|
|
190
190
|
BRAND_NAME,
|
|
191
191
|
CDP_PORT,
|
|
192
|
-
CHROMIUM_PROFILE_DIR,
|
|
193
192
|
CLAUDE_CREDENTIALS_FILE,
|
|
194
193
|
COMMERCIAL_MODE,
|
|
195
194
|
GREETING_DIRECTIVE,
|
|
@@ -245,7 +244,7 @@ import {
|
|
|
245
244
|
verifyAndGetConversationUpdatedAt,
|
|
246
245
|
verifyConversationOwnership,
|
|
247
246
|
writeAdminUserAndPerson
|
|
248
|
-
} from "./chunk-
|
|
247
|
+
} from "./chunk-BP7LH7MC.js";
|
|
249
248
|
import {
|
|
250
249
|
D1_MAX_SQL_STATEMENT_BYTES,
|
|
251
250
|
D1_QUERY_MAX_BODY_BYTES,
|
|
@@ -1801,10 +1800,10 @@ var require_dist5 = __commonJS({
|
|
|
1801
1800
|
});
|
|
1802
1801
|
|
|
1803
1802
|
// server/index.ts
|
|
1804
|
-
import { readFileSync as
|
|
1803
|
+
import { readFileSync as readFileSync46, existsSync as existsSync49, watchFile, readdirSync as readdirSync29, statSync as statSync25 } from "fs";
|
|
1805
1804
|
import { spawn as spawn3 } from "child_process";
|
|
1806
1805
|
import { createHash as createHash7 } from "crypto";
|
|
1807
|
-
import { resolve as
|
|
1806
|
+
import { resolve as resolve45, join as join52, basename as basename16 } from "path";
|
|
1808
1807
|
import { homedir as homedir4 } from "os";
|
|
1809
1808
|
|
|
1810
1809
|
// server/lib/route-cache-watchers.ts
|
|
@@ -3008,7 +3007,7 @@ function getLanIp() {
|
|
|
3008
3007
|
// app/lib/vnc.ts
|
|
3009
3008
|
import { spawnSync, execFileSync } from "child_process";
|
|
3010
3009
|
import { createConnection } from "net";
|
|
3011
|
-
import { mkdirSync, readFileSync as readFileSync3, writeFileSync as writeFileSync2 } from "fs";
|
|
3010
|
+
import { mkdirSync, readFileSync as readFileSync3, rmSync, writeFileSync as writeFileSync2 } from "fs";
|
|
3012
3011
|
import { resolve as resolve3 } from "path";
|
|
3013
3012
|
var PLATFORM_ROOT2 = process.env.MAXY_PLATFORM_ROOT ?? resolve3(process.cwd(), "..");
|
|
3014
3013
|
var VNC_SCRIPT = resolve3(PLATFORM_ROOT2, "scripts/vnc.sh");
|
|
@@ -3209,71 +3208,60 @@ async function ensureCdp(transport = "vnc") {
|
|
|
3209
3208
|
function killChromium() {
|
|
3210
3209
|
spawnSync("pkill", ["-f", "chromium"], { stdio: "pipe" });
|
|
3211
3210
|
}
|
|
3211
|
+
var AUTH_TARGET_ID_FILE = resolve3(LOG_DIR, "claude-auth-target.id");
|
|
3212
|
+
function readAuthTargetId() {
|
|
3213
|
+
try {
|
|
3214
|
+
const id = readFileSync3(AUTH_TARGET_ID_FILE, "utf8").trim();
|
|
3215
|
+
return id.length > 0 ? id : null;
|
|
3216
|
+
} catch {
|
|
3217
|
+
return null;
|
|
3218
|
+
}
|
|
3219
|
+
}
|
|
3212
3220
|
function writeChromiumWrapper() {
|
|
3213
3221
|
mkdirSync(BIN_DIR, { recursive: true });
|
|
3222
|
+
rmSync(AUTH_TARGET_ID_FILE, { force: true });
|
|
3214
3223
|
const wrapperPath = resolve3(BIN_DIR, "chromium");
|
|
3215
3224
|
writeFileSync2(wrapperPath, `#!/bin/bash
|
|
3216
|
-
|
|
3217
|
-
|
|
3218
|
-
|
|
3225
|
+
# Generated by writeChromiumWrapper (app/lib/vnc.ts) \u2014 Task 1562.
|
|
3226
|
+
# Hands its URL argument to the brand's running Chromium over CDP.
|
|
3227
|
+
LOG_DIR="${LOG_DIR}"
|
|
3228
|
+
LOG="$LOG_DIR/chromium.log"
|
|
3229
|
+
TARGET_ID_FILE="$LOG_DIR/claude-auth-target.id"
|
|
3230
|
+
CDP="http://127.0.0.1:${CDP_PORT}/json/new"
|
|
3231
|
+
|
|
3232
|
+
mkdir -p "$LOG_DIR"
|
|
3233
|
+
echo "==== [$(date)] chromium wrapper (cdp-handover) ====" >> "$LOG"
|
|
3219
3234
|
echo " args: $*" >> "$LOG"
|
|
3220
3235
|
|
|
3221
|
-
|
|
3222
|
-
|
|
3223
|
-
|
|
3224
|
-
echo "
|
|
3225
|
-
|
|
3226
|
-
echo " xdpyinfo ${VNC_DISPLAY} FAILED \u2014 display not ready" >> "$LOG"
|
|
3236
|
+
URL="$1"
|
|
3237
|
+
if [ -z "$URL" ]; then
|
|
3238
|
+
echo " ERROR: no URL argument" >> "$LOG"
|
|
3239
|
+
echo "[chromium-wrapper] op=cdp-handover outcome=failed reason=no-url" >> "$LOG"
|
|
3240
|
+
exit 64
|
|
3227
3241
|
fi
|
|
3228
3242
|
|
|
3229
|
-
#
|
|
3230
|
-
#
|
|
3231
|
-
|
|
3232
|
-
|
|
3233
|
-
|
|
3234
|
-
|
|
3235
|
-
|
|
3236
|
-
|
|
3237
|
-
if [ ! -r "$PATH_FILE" ]; then
|
|
3238
|
-
echo " ERROR: $PATH_FILE missing \u2014 re-run installer" >> "$LOG"
|
|
3239
|
-
exit 1
|
|
3243
|
+
# -f so an HTTP error status is a non-zero exit rather than an error body
|
|
3244
|
+
# written to the id file; -G moves the urlencoded data into the query string.
|
|
3245
|
+
RESPONSE="$(curl -sf --max-time 10 -X PUT -G --data-urlencode "=$URL" "$CDP" 2>>"$LOG")"
|
|
3246
|
+
CURL_STATUS=$?
|
|
3247
|
+
if [ "$CURL_STATUS" -ne 0 ]; then
|
|
3248
|
+
echo " ERROR: CDP handover failed (curl exit $CURL_STATUS) \u2014 is Chromium running on ${CDP_PORT}?" >> "$LOG"
|
|
3249
|
+
echo "[chromium-wrapper] op=cdp-handover outcome=failed reason=cdp-unreachable curlExit=$CURL_STATUS" >> "$LOG"
|
|
3250
|
+
exit "$CURL_STATUS"
|
|
3240
3251
|
fi
|
|
3241
|
-
|
|
3242
|
-
|
|
3243
|
-
|
|
3244
|
-
|
|
3252
|
+
|
|
3253
|
+
# Chromium answers with the created target; pretty-printed on the real endpoint
|
|
3254
|
+
# and compact from some clients, so match the key rather than a line shape.
|
|
3255
|
+
TARGET_ID="$(printf '%s' "$RESPONSE" | grep -o '"id"[[:space:]]*:[[:space:]]*"[^"]*"' | head -n1 | sed 's/.*"\\([^"]*\\)"$/\\1/')"
|
|
3256
|
+
if [ -z "$TARGET_ID" ]; then
|
|
3257
|
+
echo " ERROR: CDP accepted the URL but named no target id" >> "$LOG"
|
|
3258
|
+
echo "[chromium-wrapper] op=cdp-handover outcome=failed reason=no-target-id" >> "$LOG"
|
|
3259
|
+
exit 65
|
|
3245
3260
|
fi
|
|
3246
|
-
|
|
3247
|
-
|
|
3248
|
-
|
|
3249
|
-
|
|
3250
|
-
exit 1
|
|
3251
|
-
;;
|
|
3252
|
-
esac
|
|
3253
|
-
echo " launching $BIN (realpath=$RESOLVED)" >> "$LOG"
|
|
3254
|
-
|
|
3255
|
-
# nohup detaches chromium from this wrapper's process group so it outlives
|
|
3256
|
-
# claude auth login exiting (e.g. on timeout). --user-data-dir is brand-scoped
|
|
3257
|
-
# so a wrapper-spawned chromium attaches to the same per-brand
|
|
3258
|
-
# profile that vnc.sh's start_chrome targets \u2014 no shared cookies across brands.
|
|
3259
|
-
nohup "$BIN" \\
|
|
3260
|
-
--user-data-dir=${CHROMIUM_PROFILE_DIR} \\
|
|
3261
|
-
--no-sandbox \\
|
|
3262
|
-
--test-type \\
|
|
3263
|
-
--disable-dev-shm-usage \\
|
|
3264
|
-
--disable-gpu \\
|
|
3265
|
-
--password-store=basic \\
|
|
3266
|
-
--use-mock-keychain \\
|
|
3267
|
-
--ozone-platform=x11 \\
|
|
3268
|
-
--no-first-run \\
|
|
3269
|
-
--no-default-browser-check \\
|
|
3270
|
-
--disable-session-crashed-bubble \\
|
|
3271
|
-
--hide-crash-restore-bubble \\
|
|
3272
|
-
--noerrdialogs \\
|
|
3273
|
-
--window-size=1280,800 \\
|
|
3274
|
-
--window-position=0,0 \\
|
|
3275
|
-
"$@" >> "$LOG" 2>&1 &
|
|
3276
|
-
echo " chromium PID: $!" >> "$LOG"
|
|
3261
|
+
|
|
3262
|
+
printf '%s' "$TARGET_ID" > "$TARGET_ID_FILE"
|
|
3263
|
+
echo " opened target $TARGET_ID" >> "$LOG"
|
|
3264
|
+
echo "[chromium-wrapper] op=cdp-handover outcome=ready targetId=$TARGET_ID" >> "$LOG"
|
|
3277
3265
|
`, { mode: 493 });
|
|
3278
3266
|
return wrapperPath;
|
|
3279
3267
|
}
|
|
@@ -3311,20 +3299,20 @@ function buildX11Env(chromiumWrapperPath, transport = "vnc") {
|
|
|
3311
3299
|
|
|
3312
3300
|
// server/routes/health.ts
|
|
3313
3301
|
function checkPort(port2, timeoutMs = 500) {
|
|
3314
|
-
return new Promise((
|
|
3302
|
+
return new Promise((resolve46) => {
|
|
3315
3303
|
const socket = createConnection2(port2, "127.0.0.1");
|
|
3316
3304
|
socket.setTimeout(timeoutMs);
|
|
3317
3305
|
socket.once("connect", () => {
|
|
3318
3306
|
socket.destroy();
|
|
3319
|
-
|
|
3307
|
+
resolve46(true);
|
|
3320
3308
|
});
|
|
3321
3309
|
socket.once("error", () => {
|
|
3322
3310
|
socket.destroy();
|
|
3323
|
-
|
|
3311
|
+
resolve46(false);
|
|
3324
3312
|
});
|
|
3325
3313
|
socket.once("timeout", () => {
|
|
3326
3314
|
socket.destroy();
|
|
3327
|
-
|
|
3315
|
+
resolve46(false);
|
|
3328
3316
|
});
|
|
3329
3317
|
});
|
|
3330
3318
|
}
|
|
@@ -4912,7 +4900,7 @@ function createScheduleInjectRoutes(deps) {
|
|
|
4912
4900
|
var import_dist9 = __toESM(require_dist(), 1);
|
|
4913
4901
|
|
|
4914
4902
|
// app/lib/whatsapp/avatar-store.ts
|
|
4915
|
-
import { existsSync as existsSync5, mkdirSync as mkdirSync2, readFileSync as readFileSync7, writeFileSync as writeFileSync3, readdirSync as readdirSync5, statSync as statSync6, rmSync } from "fs";
|
|
4903
|
+
import { existsSync as existsSync5, mkdirSync as mkdirSync2, readFileSync as readFileSync7, writeFileSync as writeFileSync3, readdirSync as readdirSync5, statSync as statSync6, rmSync as rmSync2 } from "fs";
|
|
4916
4904
|
import { join as join11 } from "path";
|
|
4917
4905
|
function safeName(jid) {
|
|
4918
4906
|
if (jid.length === 0 || jid.includes("/") || jid.includes("\\") || jid.includes("..")) {
|
|
@@ -4957,14 +4945,14 @@ function writeAvatarAbsent(accountId, jid) {
|
|
|
4957
4945
|
const dir = dirFor(accountId);
|
|
4958
4946
|
const base = join11(dir, safeName(jid));
|
|
4959
4947
|
mkdirSync2(dir, { recursive: true });
|
|
4960
|
-
|
|
4948
|
+
rmSync2(`${base}.bin`, { force: true });
|
|
4961
4949
|
const meta = { jid, state: "absent", fetchedAt: (/* @__PURE__ */ new Date()).toISOString() };
|
|
4962
4950
|
writeFileSync3(`${base}.json`, JSON.stringify(meta));
|
|
4963
4951
|
}
|
|
4964
4952
|
function removeAvatar(accountId, jid) {
|
|
4965
4953
|
const base = join11(dirFor(accountId), safeName(jid));
|
|
4966
|
-
|
|
4967
|
-
|
|
4954
|
+
rmSync2(`${base}.bin`, { force: true });
|
|
4955
|
+
rmSync2(`${base}.json`, { force: true });
|
|
4968
4956
|
}
|
|
4969
4957
|
function listAvatarEntries(accountId) {
|
|
4970
4958
|
const dir = dirFor(accountId);
|
|
@@ -5011,11 +4999,11 @@ async function defaultHttpGet(url) {
|
|
|
5011
4999
|
}
|
|
5012
5000
|
}
|
|
5013
5001
|
async function defaultResolve(accountId) {
|
|
5014
|
-
const { resolveSocket: resolveSocket2 } = await import("./manager-
|
|
5002
|
+
const { resolveSocket: resolveSocket2 } = await import("./manager-B4LRDZKC.js");
|
|
5015
5003
|
return resolveSocket2(accountId);
|
|
5016
5004
|
}
|
|
5017
5005
|
async function fetchAvatar(accountId, jid, deps = {}) {
|
|
5018
|
-
const
|
|
5006
|
+
const resolve46 = deps.resolve;
|
|
5019
5007
|
const httpGet = deps.httpGet ?? defaultHttpGet;
|
|
5020
5008
|
const maxAgeMs = deps.maxAgeMs ?? DEFAULT_MAX_AGE_MS;
|
|
5021
5009
|
const cached3 = readAvatar(accountId, jid);
|
|
@@ -5025,7 +5013,7 @@ async function fetchAvatar(accountId, jid, deps = {}) {
|
|
|
5025
5013
|
return "fresh";
|
|
5026
5014
|
}
|
|
5027
5015
|
console.log(`${TAG6} op=cache jid=${jid} hit=false ageMs=${ageMs2}`);
|
|
5028
|
-
const res =
|
|
5016
|
+
const res = resolve46 ? resolve46(accountId) : await defaultResolve(accountId);
|
|
5029
5017
|
if (!res.ok) {
|
|
5030
5018
|
console.log(`${TAG6} op=no-socket jid=${jid} account=${accountId.slice(0, 8)} reason=${res.reason}`);
|
|
5031
5019
|
return "no-socket";
|
|
@@ -5994,8 +5982,8 @@ async function startLogin(opts) {
|
|
|
5994
5982
|
await clearAuth(authDir);
|
|
5995
5983
|
let resolveCode = null;
|
|
5996
5984
|
let rejectCode = null;
|
|
5997
|
-
const codePromise = new Promise((
|
|
5998
|
-
resolveCode =
|
|
5985
|
+
const codePromise = new Promise((resolve46, reject) => {
|
|
5986
|
+
resolveCode = resolve46;
|
|
5999
5987
|
rejectCode = reject;
|
|
6000
5988
|
});
|
|
6001
5989
|
const codeTimer = setTimeout(
|
|
@@ -6741,10 +6729,10 @@ app3.post("/config", async (c) => {
|
|
|
6741
6729
|
const entries2 = readdirSync7(agentsDir, { withFileTypes: true });
|
|
6742
6730
|
for (const entry of entries2.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
6743
6731
|
if (!entry.isDirectory() || entry.name === "admin") continue;
|
|
6744
|
-
const
|
|
6745
|
-
if (!existsSync7(
|
|
6732
|
+
const configPath3 = resolve7(agentsDir, entry.name, "config.json");
|
|
6733
|
+
if (!existsSync7(configPath3)) continue;
|
|
6746
6734
|
try {
|
|
6747
|
-
const config = JSON.parse(readFileSync9(
|
|
6735
|
+
const config = JSON.parse(readFileSync9(configPath3, "utf-8"));
|
|
6748
6736
|
agents.push({ slug: entry.name, displayName: config.displayName ?? entry.name });
|
|
6749
6737
|
} catch {
|
|
6750
6738
|
console.error(`${TAG14} config action=list-public-agents error="failed to parse config.json for agent ${entry.name}" \u2014 skipping`);
|
|
@@ -7917,10 +7905,10 @@ function discoverPortalAccounts(accountsDir, shared = null) {
|
|
|
7917
7905
|
if (!existsSync8(accountsDir)) return [];
|
|
7918
7906
|
const found = [];
|
|
7919
7907
|
for (const accountId of readdirSync8(accountsDir)) {
|
|
7920
|
-
const
|
|
7921
|
-
if (!existsSync8(
|
|
7908
|
+
const configPath3 = join15(accountsDir, accountId, "data-portal.json");
|
|
7909
|
+
if (!existsSync8(configPath3)) continue;
|
|
7922
7910
|
try {
|
|
7923
|
-
const cfg = JSON.parse(readFileSync10(
|
|
7911
|
+
const cfg = JSON.parse(readFileSync10(configPath3, "utf-8"));
|
|
7924
7912
|
if (typeof cfg.portalDbName === "string" && cfg.portalDbName.length > 0 && typeof cfg.bucketName === "string" && cfg.bucketName.length > 0) {
|
|
7925
7913
|
found.push({
|
|
7926
7914
|
accountId,
|
|
@@ -12086,7 +12074,7 @@ var telegram_default = app10;
|
|
|
12086
12074
|
|
|
12087
12075
|
// server/routes/quickbooks.ts
|
|
12088
12076
|
import { join as join29 } from "path";
|
|
12089
|
-
import { existsSync as existsSync21, readFileSync as readFileSync23, writeFileSync as writeFileSync9, mkdirSync as mkdirSync4, rmSync as
|
|
12077
|
+
import { existsSync as existsSync21, readFileSync as readFileSync23, writeFileSync as writeFileSync9, mkdirSync as mkdirSync4, rmSync as rmSync3, renameSync as renameSync5 } from "fs";
|
|
12090
12078
|
var TAG19 = "[quickbooks]";
|
|
12091
12079
|
var INTUIT_TOKEN_URL = "https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer";
|
|
12092
12080
|
var STATE_RE = /^[A-Za-z0-9_-]+$/;
|
|
@@ -12167,7 +12155,7 @@ async function completeConsent(args) {
|
|
|
12167
12155
|
console.error(`${TAG19} op=token-exchange realmId=${realmId} persisted=${persisted}`);
|
|
12168
12156
|
return { ok: persisted, status: persisted ? 200 : 500, message: persisted ? `Connected company ${realmId}.` : "Failed to persist the connection.", stateValid: true };
|
|
12169
12157
|
} finally {
|
|
12170
|
-
|
|
12158
|
+
rmSync3(claimFile, { force: true });
|
|
12171
12159
|
}
|
|
12172
12160
|
}
|
|
12173
12161
|
function page(title, detail) {
|
|
@@ -12579,7 +12567,7 @@ app12.post("/claude-auth", async (c) => {
|
|
|
12579
12567
|
}
|
|
12580
12568
|
if (body.action === "wait") {
|
|
12581
12569
|
const authenticated = await checkAuthStatus();
|
|
12582
|
-
return c.json({ completed: authenticated, authenticated });
|
|
12570
|
+
return c.json({ completed: authenticated, authenticated, authTargetId: readAuthTargetId() });
|
|
12583
12571
|
}
|
|
12584
12572
|
if (body.action === "paste-code") {
|
|
12585
12573
|
const code = typeof body.code === "string" ? body.code : "";
|
|
@@ -13049,7 +13037,7 @@ app13.post("/", async (c) => {
|
|
|
13049
13037
|
const safe = typeof v === "string" ? truncate(v, 200) : typeof v === "number" || typeof v === "boolean" ? String(v) : JSON.stringify(v).slice(0, 200);
|
|
13050
13038
|
return `${k}=${safe}`;
|
|
13051
13039
|
}).join(" ");
|
|
13052
|
-
const TAGGED_PREFIX_SOURCES = /* @__PURE__ */ new Set(["stream-log-click", "pwa", "graph-settle", "dashboard-load"]);
|
|
13040
|
+
const TAGGED_PREFIX_SOURCES = /* @__PURE__ */ new Set(["stream-log-click", "pwa", "graph-settle", "dashboard-load", "routines"]);
|
|
13053
13041
|
if (TAGGED_PREFIX_SOURCES.has(source)) {
|
|
13054
13042
|
console.log(
|
|
13055
13043
|
`[${source}] ts=${ts} ip=${ip} version=${version || "unknown"}${extra ? " " + extra : ""}`
|
|
@@ -13148,15 +13136,15 @@ function operatorRoleFor(config, userId) {
|
|
|
13148
13136
|
async function buildAccountOptionList(accounts, userId) {
|
|
13149
13137
|
const houseAccount = accounts.find((a) => a.config.role === "house");
|
|
13150
13138
|
console.log(`[admin-accounts] op=list count=${accounts.length} house=${houseAccount?.accountId ?? "none"}`);
|
|
13151
|
-
const
|
|
13139
|
+
const resolve46 = async (a) => {
|
|
13152
13140
|
const businessName = await fetchAccountName(a.accountId) || void 0;
|
|
13153
13141
|
return { accountId: a.accountId, businessName, role: operatorRoleFor(a.config, userId), isHouse: a.config.role === "house" };
|
|
13154
13142
|
};
|
|
13155
13143
|
const houseOptions = await Promise.all(
|
|
13156
|
-
accounts.filter((a) => a.config.role === "house").map(
|
|
13144
|
+
accounts.filter((a) => a.config.role === "house").map(resolve46)
|
|
13157
13145
|
);
|
|
13158
13146
|
const nonHouseOptions = await Promise.all(
|
|
13159
|
-
accounts.filter((a) => a.config.role !== "house").map(
|
|
13147
|
+
accounts.filter((a) => a.config.role !== "house").map(resolve46)
|
|
13160
13148
|
);
|
|
13161
13149
|
const sortKey = (o) => (o.businessName || o.accountId).toLowerCase();
|
|
13162
13150
|
nonHouseOptions.sort((x, y) => {
|
|
@@ -13602,7 +13590,7 @@ var session_upload_default = app19;
|
|
|
13602
13590
|
|
|
13603
13591
|
// server/routes/admin/agents.ts
|
|
13604
13592
|
import { resolve as resolve20 } from "path";
|
|
13605
|
-
import { readdirSync as readdirSync21, readFileSync as readFileSync28, existsSync as existsSync30, rmSync as
|
|
13593
|
+
import { readdirSync as readdirSync21, readFileSync as readFileSync28, existsSync as existsSync30, rmSync as rmSync4, renameSync as renameSync9, mkdirSync as mkdirSync6, writeFileSync as writeFileSync12, chmodSync } from "fs";
|
|
13606
13594
|
import { execFileSync as execFileSync6 } from "child_process";
|
|
13607
13595
|
|
|
13608
13596
|
// ../services/claude-session-manager/src/tool-surface.ts
|
|
@@ -14281,10 +14269,10 @@ app20.get("/", requireAdminSession, (c) => {
|
|
|
14281
14269
|
for (const entry of entries2.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
14282
14270
|
if (!entry.isDirectory()) continue;
|
|
14283
14271
|
if (entry.name === "admin") continue;
|
|
14284
|
-
const
|
|
14285
|
-
if (!existsSync30(
|
|
14272
|
+
const configPath3 = resolve20(agentsDir, entry.name, "config.json");
|
|
14273
|
+
if (!existsSync30(configPath3)) continue;
|
|
14286
14274
|
try {
|
|
14287
|
-
const config = JSON.parse(readFileSync28(
|
|
14275
|
+
const config = JSON.parse(readFileSync28(configPath3, "utf-8"));
|
|
14288
14276
|
agents.push({
|
|
14289
14277
|
slug: entry.name,
|
|
14290
14278
|
displayName: config.displayName ?? entry.name,
|
|
@@ -14418,11 +14406,11 @@ app20.get("/:slug", requireAdminSession, (c) => {
|
|
|
14418
14406
|
});
|
|
14419
14407
|
}
|
|
14420
14408
|
const agentDir = resolve20(account.accountDir, "agents", slug);
|
|
14421
|
-
const
|
|
14422
|
-
if (!existsSync30(
|
|
14409
|
+
const configPath3 = resolve20(agentDir, "config.json");
|
|
14410
|
+
if (!existsSync30(configPath3)) return c.json({ error: "Agent not found" }, 404);
|
|
14423
14411
|
let config;
|
|
14424
14412
|
try {
|
|
14425
|
-
config = JSON.parse(readFileSync28(
|
|
14413
|
+
config = JSON.parse(readFileSync28(configPath3, "utf-8"));
|
|
14426
14414
|
} catch {
|
|
14427
14415
|
console.error(`[admin/agents] op=detail slug=${slug} error="config.json parse failed"`);
|
|
14428
14416
|
return c.json({ error: "Agent config unreadable" }, 500);
|
|
@@ -14618,7 +14606,7 @@ app20.delete("/:slug", async (c) => {
|
|
|
14618
14606
|
return c.json({ error: `Graph cleanup failed: ${msg}` }, 500);
|
|
14619
14607
|
}
|
|
14620
14608
|
try {
|
|
14621
|
-
|
|
14609
|
+
rmSync4(agentDir, { recursive: true, force: true });
|
|
14622
14610
|
console.log(`[admin/agents] op=delete accountId=${account.accountId.slice(0, 8)} slug=${slug} outcome=ok`);
|
|
14623
14611
|
return c.json({ ok: true });
|
|
14624
14612
|
} catch (err) {
|
|
@@ -16919,9 +16907,9 @@ async function readAccountNames() {
|
|
|
16919
16907
|
}
|
|
16920
16908
|
for (const name of names) {
|
|
16921
16909
|
if (!UUID_RE3.test(name)) continue;
|
|
16922
|
-
const
|
|
16910
|
+
const configPath3 = resolve24(accountsDir, name, "account.json");
|
|
16923
16911
|
try {
|
|
16924
|
-
const raw = await readFile9(
|
|
16912
|
+
const raw = await readFile9(configPath3, "utf8");
|
|
16925
16913
|
const parsed = JSON.parse(raw);
|
|
16926
16914
|
if (typeof parsed?.name === "string" && parsed.name.length > 0) {
|
|
16927
16915
|
map.set(name, parsed.name);
|
|
@@ -21271,6 +21259,56 @@ var health_default2 = app41;
|
|
|
21271
21259
|
// server/routes/admin/linkedin-ingest.ts
|
|
21272
21260
|
import { randomUUID as randomUUID9 } from "crypto";
|
|
21273
21261
|
|
|
21262
|
+
// ../lib/account-ingest-token/src/index.ts
|
|
21263
|
+
import { randomBytes, timingSafeEqual } from "crypto";
|
|
21264
|
+
import { existsSync as existsSync37, readdirSync as readdirSync24, readFileSync as readFileSync34, writeFileSync as writeFileSync14 } from "fs";
|
|
21265
|
+
import { resolve as resolve30 } from "path";
|
|
21266
|
+
var UUID_RE4 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
21267
|
+
var INGEST_TOKEN_FIELD = "ingestToken";
|
|
21268
|
+
var TOKEN_RE = /^[0-9a-f]{64}$/;
|
|
21269
|
+
function configPath2(accountsDir, accountId) {
|
|
21270
|
+
return resolve30(accountsDir, accountId, "account.json");
|
|
21271
|
+
}
|
|
21272
|
+
function readConfig2(accountsDir, accountId) {
|
|
21273
|
+
const path = configPath2(accountsDir, accountId);
|
|
21274
|
+
if (!existsSync37(path)) return null;
|
|
21275
|
+
try {
|
|
21276
|
+
const parsed = JSON.parse(readFileSync34(path, "utf-8"));
|
|
21277
|
+
return parsed !== null && typeof parsed === "object" ? parsed : null;
|
|
21278
|
+
} catch {
|
|
21279
|
+
return null;
|
|
21280
|
+
}
|
|
21281
|
+
}
|
|
21282
|
+
function readIngestToken(accountsDir, accountId) {
|
|
21283
|
+
const value = readConfig2(accountsDir, accountId)?.[INGEST_TOKEN_FIELD];
|
|
21284
|
+
return typeof value === "string" && TOKEN_RE.test(value) ? value : null;
|
|
21285
|
+
}
|
|
21286
|
+
function listAccountIdsOnDisk(accountsDir) {
|
|
21287
|
+
if (!existsSync37(accountsDir)) return [];
|
|
21288
|
+
let entries2;
|
|
21289
|
+
try {
|
|
21290
|
+
entries2 = readdirSync24(accountsDir);
|
|
21291
|
+
} catch {
|
|
21292
|
+
return [];
|
|
21293
|
+
}
|
|
21294
|
+
return entries2.filter(
|
|
21295
|
+
(name) => UUID_RE4.test(name) && existsSync37(resolve30(accountsDir, name, "account.json"))
|
|
21296
|
+
);
|
|
21297
|
+
}
|
|
21298
|
+
function resolveAccountIdByIngestToken(accountsDir, token) {
|
|
21299
|
+
if (typeof token !== "string" || !TOKEN_RE.test(token)) return null;
|
|
21300
|
+
const probe = Buffer.from(token, "utf-8");
|
|
21301
|
+
for (const accountId of listAccountIdsOnDisk(accountsDir)) {
|
|
21302
|
+
const stored = readIngestToken(accountsDir, accountId);
|
|
21303
|
+
if (!stored) continue;
|
|
21304
|
+
const candidate = Buffer.from(stored, "utf-8");
|
|
21305
|
+
if (candidate.length === probe.length && timingSafeEqual(candidate, probe)) {
|
|
21306
|
+
return accountId;
|
|
21307
|
+
}
|
|
21308
|
+
}
|
|
21309
|
+
return null;
|
|
21310
|
+
}
|
|
21311
|
+
|
|
21274
21312
|
// app/lib/channel-pty-bridge/manager-client.ts
|
|
21275
21313
|
function managerBase2() {
|
|
21276
21314
|
const port2 = requirePortEnv("CLAUDE_SESSION_MANAGER_PORT", { tag: "channel-pty-bridge:manager-client" });
|
|
@@ -21495,8 +21533,29 @@ function buildInitialMessage(env) {
|
|
|
21495
21533
|
}
|
|
21496
21534
|
return header;
|
|
21497
21535
|
}
|
|
21536
|
+
var AUTH_TAG = "[linkedin-ingest-auth]";
|
|
21537
|
+
var requireIngestToken = async (c, next) => {
|
|
21538
|
+
let token = "";
|
|
21539
|
+
try {
|
|
21540
|
+
const body = await c.req.json();
|
|
21541
|
+
if (body && typeof body.ingest_token === "string") token = body.ingest_token;
|
|
21542
|
+
} catch {
|
|
21543
|
+
}
|
|
21544
|
+
if (!token) {
|
|
21545
|
+
console.error(`${AUTH_TAG} outcome=reject status=400 code=token-missing path=${c.req.path}`);
|
|
21546
|
+
return c.json({ ok: false, error: "auth", code: "token-missing" }, 400);
|
|
21547
|
+
}
|
|
21548
|
+
const accountId = resolveAccountIdByIngestToken(ACCOUNTS_DIR, token);
|
|
21549
|
+
if (!accountId) {
|
|
21550
|
+
console.error(`${AUTH_TAG} outcome=reject status=401 code=token-unknown path=${c.req.path}`);
|
|
21551
|
+
return c.json({ ok: false, error: "auth", code: "token-unknown" }, 401);
|
|
21552
|
+
}
|
|
21553
|
+
c.set("ingestAccountId", accountId);
|
|
21554
|
+
console.log(`${AUTH_TAG} outcome=accept accountId=${accountId.slice(0, 8)} path=${c.req.path}`);
|
|
21555
|
+
await next();
|
|
21556
|
+
};
|
|
21498
21557
|
var app42 = new Hono();
|
|
21499
|
-
app42.post("/",
|
|
21558
|
+
app42.post("/", requireIngestToken, async (c) => {
|
|
21500
21559
|
let body;
|
|
21501
21560
|
try {
|
|
21502
21561
|
body = await c.req.json();
|
|
@@ -21510,8 +21569,7 @@ app42.post("/", requireAdminSession, async (c) => {
|
|
|
21510
21569
|
return c.json({ ok: false, error: v.error, reason: v.reason, missing: v.missing }, v.status);
|
|
21511
21570
|
}
|
|
21512
21571
|
const envelope = v.envelope;
|
|
21513
|
-
const
|
|
21514
|
-
const senderId = getAccountIdForSession(cacheKey) ?? "";
|
|
21572
|
+
const senderId = c.var.ingestAccountId ?? "";
|
|
21515
21573
|
if (!senderId) {
|
|
21516
21574
|
console.error(TAG22 + " rejected status=500 reason=admin-account-not-resolved");
|
|
21517
21575
|
return c.json({ ok: false, error: "admin-account-not-resolved" }, 500);
|
|
@@ -22021,7 +22079,7 @@ app48.post("/screencast-event", requireAdminSession, async (c) => {
|
|
|
22021
22079
|
var browser_default = app48;
|
|
22022
22080
|
|
|
22023
22081
|
// server/routes/admin/calendar.ts
|
|
22024
|
-
import { existsSync as
|
|
22082
|
+
import { existsSync as existsSync38 } from "fs";
|
|
22025
22083
|
import { join as join44 } from "path";
|
|
22026
22084
|
|
|
22027
22085
|
// server/lib/calendar-ics.ts
|
|
@@ -22121,7 +22179,7 @@ function countVEvents(ics) {
|
|
|
22121
22179
|
}
|
|
22122
22180
|
|
|
22123
22181
|
// server/lib/calendar-availability.ts
|
|
22124
|
-
import { readFileSync as
|
|
22182
|
+
import { readFileSync as readFileSync35 } from "fs";
|
|
22125
22183
|
import { join as join43 } from "path";
|
|
22126
22184
|
var AVAILABILITY_FILENAME = "calendar-availability.json";
|
|
22127
22185
|
var REQUIRED_KEYS = [
|
|
@@ -22134,7 +22192,7 @@ function readAvailabilityConfig(accountDir) {
|
|
|
22134
22192
|
const path = join43(accountDir, AVAILABILITY_FILENAME);
|
|
22135
22193
|
let raw;
|
|
22136
22194
|
try {
|
|
22137
|
-
raw =
|
|
22195
|
+
raw = readFileSync35(path, "utf-8");
|
|
22138
22196
|
} catch {
|
|
22139
22197
|
throw new Error(`availability not configured: ${path} not found`);
|
|
22140
22198
|
}
|
|
@@ -22494,7 +22552,7 @@ app49.get("/booking-link", requireAdminSession, (c) => {
|
|
|
22494
22552
|
}
|
|
22495
22553
|
const id82 = account.accountId.slice(0, 8);
|
|
22496
22554
|
try {
|
|
22497
|
-
if (!
|
|
22555
|
+
if (!existsSync38(join44(account.accountDir, AVAILABILITY_FILENAME))) {
|
|
22498
22556
|
console.log(`[calendar] op=booking-link accountId=${id82} bookingDomain=none source=availability-config`);
|
|
22499
22557
|
return c.json({ bookingDomain: null });
|
|
22500
22558
|
}
|
|
@@ -22513,7 +22571,7 @@ app49.get("/booking-link", requireAdminSession, (c) => {
|
|
|
22513
22571
|
var calendar_default = app49;
|
|
22514
22572
|
|
|
22515
22573
|
// server/routes/admin/data-portal.ts
|
|
22516
|
-
import { existsSync as
|
|
22574
|
+
import { existsSync as existsSync39, readFileSync as readFileSync36 } from "fs";
|
|
22517
22575
|
import { join as join45 } from "path";
|
|
22518
22576
|
var app50 = new Hono();
|
|
22519
22577
|
var PORTAL_FILENAME = "data-portal.json";
|
|
@@ -22526,11 +22584,11 @@ app50.get("/portal-link", requireAdminSession, (c) => {
|
|
|
22526
22584
|
const id82 = account.accountId.slice(0, 8);
|
|
22527
22585
|
try {
|
|
22528
22586
|
const path = join45(account.accountDir, PORTAL_FILENAME);
|
|
22529
|
-
if (!
|
|
22587
|
+
if (!existsSync39(path)) {
|
|
22530
22588
|
console.log(`[data-portal] op=portal-link accountId=${id82} portalDomain=none source=data-portal-config`);
|
|
22531
22589
|
return c.json({ portalDomain: null });
|
|
22532
22590
|
}
|
|
22533
|
-
const cfg = JSON.parse(
|
|
22591
|
+
const cfg = JSON.parse(readFileSync36(path, "utf-8"));
|
|
22534
22592
|
const portalDomain = typeof cfg.portalDomain === "string" && cfg.portalDomain.trim() ? cfg.portalDomain.trim() : null;
|
|
22535
22593
|
console.log(`[data-portal] op=portal-link accountId=${id82} portalDomain=${portalDomain ?? "none"} source=data-portal-config`);
|
|
22536
22594
|
return c.json({ portalDomain });
|
|
@@ -22547,8 +22605,8 @@ import cronParser from "cron-parser";
|
|
|
22547
22605
|
import { int as int2 } from "neo4j-driver";
|
|
22548
22606
|
|
|
22549
22607
|
// ../lib/agent-dispatch-rule/src/index.ts
|
|
22550
|
-
import { readFileSync as
|
|
22551
|
-
import { resolve as
|
|
22608
|
+
import { readFileSync as readFileSync37 } from "fs";
|
|
22609
|
+
import { resolve as resolve31 } from "path";
|
|
22552
22610
|
function normalizeE1642(value) {
|
|
22553
22611
|
let candidate = value.trim().replace(/[\s\-().]/g, "");
|
|
22554
22612
|
candidate = candidate.replace(/^whatsapp:/i, "");
|
|
@@ -22565,7 +22623,7 @@ function phonesMatch2(a, b) {
|
|
|
22565
22623
|
function readChannelAdmins(accountDir, channel) {
|
|
22566
22624
|
let config = {};
|
|
22567
22625
|
try {
|
|
22568
|
-
config = JSON.parse(
|
|
22626
|
+
config = JSON.parse(readFileSync37(resolve31(accountDir, "account.json"), "utf-8"));
|
|
22569
22627
|
} catch {
|
|
22570
22628
|
config = {};
|
|
22571
22629
|
}
|
|
@@ -22597,9 +22655,16 @@ function registeredAccountForDestination(houseDir, houseAccountId, destination)
|
|
|
22597
22655
|
if (adminPhones.some((p) => phonesMatch2(p, destination))) return houseAccountId;
|
|
22598
22656
|
return null;
|
|
22599
22657
|
}
|
|
22658
|
+
function boundSubAccountFor(accountDir, destination) {
|
|
22659
|
+
const { accountManagers } = readChannelAdmins(accountDir, "whatsapp");
|
|
22660
|
+
for (const [managerPhone, subAccountId] of Object.entries(accountManagers)) {
|
|
22661
|
+
if (subAccountId && phonesMatch2(managerPhone, destination)) return subAccountId;
|
|
22662
|
+
}
|
|
22663
|
+
return null;
|
|
22664
|
+
}
|
|
22600
22665
|
function validateAgentDestination(accountsDir, houseAccountId, creatingAccountId, channel, destination) {
|
|
22601
22666
|
if (channel === "whatsapp") {
|
|
22602
|
-
const houseDir =
|
|
22667
|
+
const houseDir = resolve31(accountsDir, houseAccountId);
|
|
22603
22668
|
const registered = registeredAccountForDestination(houseDir, houseAccountId, destination);
|
|
22604
22669
|
if (registered === null) return { valid: false, reason: "not-registered" };
|
|
22605
22670
|
if (creatingAccountId === houseAccountId) return { valid: true };
|
|
@@ -22611,7 +22676,7 @@ function validateAgentDestination(accountsDir, houseAccountId, creatingAccountId
|
|
|
22611
22676
|
scheduleAccount: creatingAccountId
|
|
22612
22677
|
};
|
|
22613
22678
|
}
|
|
22614
|
-
const { adminUsers } = readChannelAdmins(
|
|
22679
|
+
const { adminUsers } = readChannelAdmins(resolve31(accountsDir, creatingAccountId), "telegram");
|
|
22615
22680
|
const asNumber = Number(destination);
|
|
22616
22681
|
const ok = Number.isInteger(asNumber) && adminUsers.includes(asNumber);
|
|
22617
22682
|
return ok ? { valid: true } : { valid: false, reason: "not-registered" };
|
|
@@ -22621,7 +22686,7 @@ function listDispatchDestinations(input) {
|
|
|
22621
22686
|
const managers = [];
|
|
22622
22687
|
const admins = [];
|
|
22623
22688
|
if (houseAccountId !== null) {
|
|
22624
|
-
const houseDir =
|
|
22689
|
+
const houseDir = resolve31(accountsDir, houseAccountId);
|
|
22625
22690
|
const { adminPhones, accountManagers } = readChannelAdmins(houseDir, "whatsapp");
|
|
22626
22691
|
const seen = /* @__PURE__ */ new Set();
|
|
22627
22692
|
for (const [phone, subAccountId] of Object.entries(accountManagers)) {
|
|
@@ -22639,7 +22704,7 @@ function listDispatchDestinations(input) {
|
|
|
22639
22704
|
admins.push({ channel: "whatsapp", destination: phone, label: "House admin" });
|
|
22640
22705
|
}
|
|
22641
22706
|
}
|
|
22642
|
-
const { adminUsers } = readChannelAdmins(
|
|
22707
|
+
const { adminUsers } = readChannelAdmins(resolve31(accountsDir, accountId), "telegram");
|
|
22643
22708
|
const telegram = [...adminUsers].sort((a, b) => a - b).map((id) => ({ channel: "telegram", destination: String(id), label: "Telegram admin" }));
|
|
22644
22709
|
const byDestination = (a, b) => a.destination.localeCompare(b.destination);
|
|
22645
22710
|
return [...managers.sort(byDestination), ...admins.sort(byDestination), ...telegram];
|
|
@@ -23306,8 +23371,8 @@ app51.delete("/:eventId", requireAdminSession, async (c) => {
|
|
|
23306
23371
|
var routines_default = app51;
|
|
23307
23372
|
|
|
23308
23373
|
// server/routes/admin/skills.ts
|
|
23309
|
-
import { existsSync as
|
|
23310
|
-
import { resolve as
|
|
23374
|
+
import { existsSync as existsSync40, readdirSync as readdirSync25, readFileSync as readFileSync38, rmSync as rmSync5 } from "fs";
|
|
23375
|
+
import { resolve as resolve32 } from "path";
|
|
23311
23376
|
var app52 = new Hono();
|
|
23312
23377
|
var NAME_RE = /^[a-z0-9][a-z0-9-]*$/;
|
|
23313
23378
|
function splitSkillMd(text) {
|
|
@@ -23330,9 +23395,9 @@ function stripQuotes(s) {
|
|
|
23330
23395
|
return s;
|
|
23331
23396
|
}
|
|
23332
23397
|
function subdirs2(dir) {
|
|
23333
|
-
if (!
|
|
23398
|
+
if (!existsSync40(dir)) return [];
|
|
23334
23399
|
try {
|
|
23335
|
-
return
|
|
23400
|
+
return readdirSync25(dir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name);
|
|
23336
23401
|
} catch {
|
|
23337
23402
|
return [];
|
|
23338
23403
|
}
|
|
@@ -23345,19 +23410,19 @@ app52.get("/", requireAdminSession, async (c) => {
|
|
|
23345
23410
|
}
|
|
23346
23411
|
ensureAccountWatchers(acct.accountId, acct.accountDir);
|
|
23347
23412
|
const { value, state } = await getOrCompute("skills", acct.accountId, async () => {
|
|
23348
|
-
const pluginsDir =
|
|
23413
|
+
const pluginsDir = resolve32(acct.accountDir, "plugins");
|
|
23349
23414
|
const skills = [];
|
|
23350
23415
|
let pluginCount = 0;
|
|
23351
23416
|
for (const plugin of subdirs2(pluginsDir)) {
|
|
23352
23417
|
pluginCount++;
|
|
23353
|
-
const skillsDir =
|
|
23418
|
+
const skillsDir = resolve32(pluginsDir, plugin, "skills");
|
|
23354
23419
|
for (const skill of subdirs2(skillsDir)) {
|
|
23355
|
-
const skillMd =
|
|
23356
|
-
if (!
|
|
23420
|
+
const skillMd = resolve32(skillsDir, skill, "SKILL.md");
|
|
23421
|
+
if (!existsSync40(skillMd)) continue;
|
|
23357
23422
|
try {
|
|
23358
|
-
const { frontmatter } = splitSkillMd(
|
|
23359
|
-
const refsDir =
|
|
23360
|
-
const refCount =
|
|
23423
|
+
const { frontmatter } = splitSkillMd(readFileSync38(skillMd, "utf-8"));
|
|
23424
|
+
const refsDir = resolve32(skillsDir, skill, "references");
|
|
23425
|
+
const refCount = existsSync40(refsDir) ? readdirSync25(refsDir, { withFileTypes: true }).filter((e) => e.isFile()).length : 0;
|
|
23361
23426
|
skills.push({ plugin, skill, description: frontmatter.description, refCount });
|
|
23362
23427
|
} catch (err) {
|
|
23363
23428
|
console.error(`[admin:skills] op=list-skip plugin=${plugin} skill=${skill} reason="${err instanceof Error ? err.message : String(err)}"`);
|
|
@@ -23379,15 +23444,15 @@ app52.get("/:plugin/:skill", requireAdminSession, async (c) => {
|
|
|
23379
23444
|
console.error(`[admin:skills] op=get outcome=rejected reason=invalid-name plugin="${plugin}" skill="${skill}"`);
|
|
23380
23445
|
return c.json({ error: "Invalid plugin or skill name" }, 400);
|
|
23381
23446
|
}
|
|
23382
|
-
const skillDir =
|
|
23383
|
-
const skillMd =
|
|
23384
|
-
const found =
|
|
23447
|
+
const skillDir = resolve32(acct.accountDir, "plugins", plugin, "skills", skill);
|
|
23448
|
+
const skillMd = resolve32(skillDir, "SKILL.md");
|
|
23449
|
+
const found = existsSync40(skillMd);
|
|
23385
23450
|
console.log(`[admin:skills] op=get plugin=${plugin} skill=${skill} found=${found}`);
|
|
23386
23451
|
if (!found) return c.json({ error: "Skill not found" }, 404);
|
|
23387
23452
|
try {
|
|
23388
|
-
const { frontmatter, body } = splitSkillMd(
|
|
23389
|
-
const refsDir =
|
|
23390
|
-
const references =
|
|
23453
|
+
const { frontmatter, body } = splitSkillMd(readFileSync38(skillMd, "utf-8"));
|
|
23454
|
+
const refsDir = resolve32(skillDir, "references");
|
|
23455
|
+
const references = existsSync40(refsDir) ? readdirSync25(refsDir, { withFileTypes: true }).filter((e) => e.isFile()).map((e) => e.name).sort() : [];
|
|
23391
23456
|
return c.json({ skill: { plugin, skill, frontmatter, body, references } });
|
|
23392
23457
|
} catch (err) {
|
|
23393
23458
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -23404,18 +23469,18 @@ app52.delete("/:plugin/:skill", requireAdminSession, async (c) => {
|
|
|
23404
23469
|
console.error(`[admin:skills] op=delete outcome=rejected reason=invalid-name plugin="${plugin}" skill="${skill}"`);
|
|
23405
23470
|
return c.json({ error: "Invalid plugin or skill name" }, 400);
|
|
23406
23471
|
}
|
|
23407
|
-
const pluginDir =
|
|
23408
|
-
const skillsDir =
|
|
23409
|
-
const skillDir =
|
|
23410
|
-
if (!
|
|
23472
|
+
const pluginDir = resolve32(acct.accountDir, "plugins", plugin);
|
|
23473
|
+
const skillsDir = resolve32(pluginDir, "skills");
|
|
23474
|
+
const skillDir = resolve32(skillsDir, skill);
|
|
23475
|
+
if (!existsSync40(resolve32(skillDir, "SKILL.md"))) {
|
|
23411
23476
|
console.error(`[admin:skills] op=delete outcome=rejected reason=not-found plugin=${plugin} skill=${skill}`);
|
|
23412
23477
|
return c.json({ error: "Skill not found" }, 404);
|
|
23413
23478
|
}
|
|
23414
23479
|
try {
|
|
23415
|
-
|
|
23480
|
+
rmSync5(skillDir, { recursive: true, force: true });
|
|
23416
23481
|
const pluginDirRemoved = subdirs2(skillsDir).length === 0;
|
|
23417
|
-
if (pluginDirRemoved)
|
|
23418
|
-
const skillDirGone = !
|
|
23482
|
+
if (pluginDirRemoved) rmSync5(pluginDir, { recursive: true, force: true });
|
|
23483
|
+
const skillDirGone = !existsSync40(skillDir);
|
|
23419
23484
|
if (!skillDirGone) {
|
|
23420
23485
|
console.error(`[admin:skills] op=delete plugin=${plugin} skill=${skill} outcome=rejected reason=rm-incomplete skillDirGone=false`);
|
|
23421
23486
|
return c.json({ error: "Delete did not remove the skill directory" }, 503);
|
|
@@ -23887,20 +23952,20 @@ app57.post("/", requireAdminSession, async (c) => {
|
|
|
23887
23952
|
var task_time_adjust_default = app57;
|
|
23888
23953
|
|
|
23889
23954
|
// app/lib/admin-roster.ts
|
|
23890
|
-
import { existsSync as
|
|
23891
|
-
import { resolve as
|
|
23955
|
+
import { existsSync as existsSync41, readdirSync as readdirSync26, readFileSync as readFileSync39 } from "fs";
|
|
23956
|
+
import { resolve as resolve33 } from "path";
|
|
23892
23957
|
function readHouseAdminUserIds(accountsDir = ACCOUNTS_DIR) {
|
|
23893
23958
|
let entries2;
|
|
23894
23959
|
try {
|
|
23895
|
-
entries2 =
|
|
23960
|
+
entries2 = readdirSync26(accountsDir);
|
|
23896
23961
|
} catch {
|
|
23897
23962
|
return [];
|
|
23898
23963
|
}
|
|
23899
23964
|
for (const entry of entries2) {
|
|
23900
|
-
const cfgPath =
|
|
23901
|
-
if (!
|
|
23965
|
+
const cfgPath = resolve33(accountsDir, entry, "account.json");
|
|
23966
|
+
if (!existsSync41(cfgPath)) continue;
|
|
23902
23967
|
try {
|
|
23903
|
-
const cfg = JSON.parse(
|
|
23968
|
+
const cfg = JSON.parse(readFileSync39(cfgPath, "utf-8"));
|
|
23904
23969
|
if (cfg.role !== "house") continue;
|
|
23905
23970
|
if (!Array.isArray(cfg.admins)) return [];
|
|
23906
23971
|
return cfg.admins.map(
|
|
@@ -24230,7 +24295,21 @@ app61.get("/", requireAdminSession, async (c) => {
|
|
|
24230
24295
|
var admin_users_list_default = app61;
|
|
24231
24296
|
|
|
24232
24297
|
// server/routes/admin/dispatch-destinations.ts
|
|
24298
|
+
import { resolve as resolve34 } from "path";
|
|
24233
24299
|
var TAG37 = "[admin:routines]";
|
|
24300
|
+
function scopeFor(d, houseDir, houseAccountId) {
|
|
24301
|
+
if (d.channel !== "whatsapp") return null;
|
|
24302
|
+
if (d.label === "Account manager") return boundSubAccountFor(houseDir, d.destination);
|
|
24303
|
+
return houseAccountId;
|
|
24304
|
+
}
|
|
24305
|
+
function telephoneVariants(destination) {
|
|
24306
|
+
const digits = normalizeE1642(destination);
|
|
24307
|
+
if (digits.length === 0) return [destination];
|
|
24308
|
+
return [.../* @__PURE__ */ new Set([destination, digits, `+${digits}`])];
|
|
24309
|
+
}
|
|
24310
|
+
function scrubDigitRuns(message) {
|
|
24311
|
+
return message.replace(/\d{7,}/g, "<redacted>");
|
|
24312
|
+
}
|
|
24234
24313
|
var app62 = new Hono();
|
|
24235
24314
|
app62.get("/", requireAdminSession, async (c) => {
|
|
24236
24315
|
const accountId = getAccountIdForSession(c.var.cacheKey);
|
|
@@ -24246,15 +24325,62 @@ app62.get("/", requireAdminSession, async (c) => {
|
|
|
24246
24325
|
console.error(`${TAG37} op=destinations account=${accountId.slice(0, 8)} outcome=house-unresolved reason="${message}"`);
|
|
24247
24326
|
}
|
|
24248
24327
|
const destinations = listDispatchDestinations({ accountsDir: ACCOUNTS_DIR, houseAccountId, accountId });
|
|
24328
|
+
const houseDir = houseAccountId === null ? null : resolve34(ACCOUNTS_DIR, houseAccountId);
|
|
24329
|
+
const byScope = /* @__PURE__ */ new Map();
|
|
24330
|
+
for (const d of destinations) {
|
|
24331
|
+
const scope = houseDir === null || houseAccountId === null ? null : scopeFor(d, houseDir, houseAccountId);
|
|
24332
|
+
if (scope === null) continue;
|
|
24333
|
+
const list = byScope.get(scope);
|
|
24334
|
+
if (list) list.push(d);
|
|
24335
|
+
else byScope.set(scope, [d]);
|
|
24336
|
+
}
|
|
24337
|
+
let namesUnresolved = null;
|
|
24338
|
+
let named = 0;
|
|
24339
|
+
if (byScope.size > 0) {
|
|
24340
|
+
let session = null;
|
|
24341
|
+
try {
|
|
24342
|
+
session = getSession();
|
|
24343
|
+
for (const [scopeAccountId, rows] of byScope) {
|
|
24344
|
+
const telephones = [...new Set(rows.flatMap((d) => telephoneVariants(d.destination)))];
|
|
24345
|
+
const result = await session.run(
|
|
24346
|
+
`MATCH (p:Person {accountId: $accountId}) WHERE p.telephone IN $telephones
|
|
24347
|
+
RETURN p.telephone AS telephone, p.givenName AS givenName, p.familyName AS familyName`,
|
|
24348
|
+
{ accountId: scopeAccountId, telephones }
|
|
24349
|
+
);
|
|
24350
|
+
const found = /* @__PURE__ */ new Map();
|
|
24351
|
+
for (const rec of result.records) {
|
|
24352
|
+
const tel = rec.get("telephone");
|
|
24353
|
+
if (!tel) continue;
|
|
24354
|
+
const name = [rec.get("givenName"), rec.get("familyName")].filter(Boolean).join(" ");
|
|
24355
|
+
if (name.length > 0) found.set(normalizeE1642(tel), name);
|
|
24356
|
+
}
|
|
24357
|
+
for (const d of rows) {
|
|
24358
|
+
const hit = found.get(normalizeE1642(d.destination));
|
|
24359
|
+
if (hit) {
|
|
24360
|
+
d.name = hit;
|
|
24361
|
+
named += 1;
|
|
24362
|
+
}
|
|
24363
|
+
}
|
|
24364
|
+
}
|
|
24365
|
+
} catch (err) {
|
|
24366
|
+
namesUnresolved = scrubDigitRuns(err instanceof Error ? err.message : String(err));
|
|
24367
|
+
for (const d of destinations) delete d.name;
|
|
24368
|
+
named = 0;
|
|
24369
|
+
} finally {
|
|
24370
|
+
if (session) await session.close();
|
|
24371
|
+
}
|
|
24372
|
+
}
|
|
24373
|
+
const scopes = [...byScope.keys()];
|
|
24374
|
+
const nameScope = scopes.length === 0 ? "none" : scopes.every((s) => s === houseAccountId) ? "house" : scopes.some((s) => s === houseAccountId) ? "mixed" : "account";
|
|
24249
24375
|
console.log(
|
|
24250
|
-
`${TAG37} op=destinations account=${accountId.slice(0, 8)} count=${destinations.length}` + (houseAccountId === null ? " outcome=house-unresolved" : "")
|
|
24376
|
+
`${TAG37} op=destinations account=${accountId.slice(0, 8)} count=${destinations.length} named=${named} unnamed=${destinations.length - named} nameScope=${nameScope}` + (houseAccountId === null ? " outcome=house-unresolved" : "") + (namesUnresolved === null ? "" : ` outcome=names-unresolved reason="${namesUnresolved}"`)
|
|
24251
24377
|
);
|
|
24252
24378
|
return c.json({ destinations });
|
|
24253
24379
|
});
|
|
24254
24380
|
var dispatch_destinations_default = app62;
|
|
24255
24381
|
|
|
24256
24382
|
// server/routes/admin/activity.ts
|
|
24257
|
-
import { readdirSync as
|
|
24383
|
+
import { readdirSync as readdirSync27 } from "fs";
|
|
24258
24384
|
var app63 = new Hono();
|
|
24259
24385
|
var TAG38 = "[activity]";
|
|
24260
24386
|
function resolveHouseAccountId(accounts) {
|
|
@@ -24270,7 +24396,7 @@ function requestToken() {
|
|
|
24270
24396
|
var short = (id) => id ? id.slice(0, 8) : "unset";
|
|
24271
24397
|
function countAccountDirsOnDisk() {
|
|
24272
24398
|
try {
|
|
24273
|
-
return
|
|
24399
|
+
return readdirSync27(ACCOUNTS_DIR, { withFileTypes: true }).filter(
|
|
24274
24400
|
(e) => e.isDirectory() && !e.name.startsWith(".")
|
|
24275
24401
|
).length;
|
|
24276
24402
|
} catch {
|
|
@@ -24534,9 +24660,9 @@ var verify_token_default = app65;
|
|
|
24534
24660
|
|
|
24535
24661
|
// app/lib/access-email.ts
|
|
24536
24662
|
import { spawn as spawn2 } from "child_process";
|
|
24537
|
-
import { resolve as
|
|
24538
|
-
var PLATFORM_ROOT5 = process.env.MAXY_PLATFORM_ROOT ??
|
|
24539
|
-
var SEND_SCRIPT =
|
|
24663
|
+
import { resolve as resolve35 } from "path";
|
|
24664
|
+
var PLATFORM_ROOT5 = process.env.MAXY_PLATFORM_ROOT ?? resolve35(process.cwd(), "..");
|
|
24665
|
+
var SEND_SCRIPT = resolve35(
|
|
24540
24666
|
PLATFORM_ROOT5,
|
|
24541
24667
|
"plugins",
|
|
24542
24668
|
"email",
|
|
@@ -24678,8 +24804,8 @@ app67.route("/request-magic-link", request_magic_link_default);
|
|
|
24678
24804
|
var access_default = app67;
|
|
24679
24805
|
|
|
24680
24806
|
// server/routes/sites.ts
|
|
24681
|
-
import { existsSync as
|
|
24682
|
-
import { resolve as
|
|
24807
|
+
import { existsSync as existsSync42, readFileSync as readFileSync40, realpathSync as realpathSync8, statSync as statSync22 } from "fs";
|
|
24808
|
+
import { resolve as resolve36 } from "path";
|
|
24683
24809
|
var SAFE_SEG_RE = /^[a-z0-9_][a-z0-9_.-]{0,99}$/i;
|
|
24684
24810
|
var MIME = {
|
|
24685
24811
|
".html": "text/html; charset=utf-8",
|
|
@@ -24736,15 +24862,15 @@ app68.get("/:rel{.*}", (c) => {
|
|
|
24736
24862
|
}
|
|
24737
24863
|
segments.push(seg);
|
|
24738
24864
|
}
|
|
24739
|
-
const rootDir =
|
|
24740
|
-
let filePath = segments.length === 0 ? rootDir :
|
|
24865
|
+
const rootDir = resolve36(account.accountDir, "sites");
|
|
24866
|
+
let filePath = segments.length === 0 ? rootDir : resolve36(rootDir, ...segments);
|
|
24741
24867
|
if (filePath !== rootDir && !filePath.startsWith(rootDir + "/")) {
|
|
24742
24868
|
console.error(`[sites] path-traversal-rejected path=${reqPath} reason=escape status=403`);
|
|
24743
24869
|
return c.text("Forbidden", 403);
|
|
24744
24870
|
}
|
|
24745
24871
|
let stat11;
|
|
24746
24872
|
try {
|
|
24747
|
-
stat11 =
|
|
24873
|
+
stat11 = existsSync42(filePath) ? statSync22(filePath) : null;
|
|
24748
24874
|
} catch {
|
|
24749
24875
|
stat11 = null;
|
|
24750
24876
|
}
|
|
@@ -24757,13 +24883,13 @@ app68.get("/:rel{.*}", (c) => {
|
|
|
24757
24883
|
return c.redirect(target, 301);
|
|
24758
24884
|
}
|
|
24759
24885
|
if (stat11?.isDirectory()) {
|
|
24760
|
-
filePath =
|
|
24886
|
+
filePath = resolve36(filePath, "index.html");
|
|
24761
24887
|
}
|
|
24762
24888
|
if (!filePath.startsWith(rootDir + "/")) {
|
|
24763
24889
|
console.error(`[sites] path-traversal-rejected path=${reqPath} reason=escape status=403`);
|
|
24764
24890
|
return c.text("Forbidden", 403);
|
|
24765
24891
|
}
|
|
24766
|
-
if (!
|
|
24892
|
+
if (!existsSync42(filePath)) {
|
|
24767
24893
|
console.error(`[sites] not-found path=${reqPath} status=404`);
|
|
24768
24894
|
return c.text("Not found", 404);
|
|
24769
24895
|
}
|
|
@@ -24782,7 +24908,7 @@ app68.get("/:rel{.*}", (c) => {
|
|
|
24782
24908
|
}
|
|
24783
24909
|
let body;
|
|
24784
24910
|
try {
|
|
24785
|
-
body =
|
|
24911
|
+
body = readFileSync40(realPath);
|
|
24786
24912
|
} catch (err) {
|
|
24787
24913
|
const code = err?.code;
|
|
24788
24914
|
if (code === "EISDIR") {
|
|
@@ -24817,8 +24943,8 @@ app68.get("/:rel{.*}", (c) => {
|
|
|
24817
24943
|
var sites_default = app68;
|
|
24818
24944
|
|
|
24819
24945
|
// app/lib/visitor-token.ts
|
|
24820
|
-
import { createHmac, randomBytes, timingSafeEqual } from "crypto";
|
|
24821
|
-
import { mkdirSync as mkdirSync8, readFileSync as
|
|
24946
|
+
import { createHmac, randomBytes as randomBytes2, timingSafeEqual as timingSafeEqual2 } from "crypto";
|
|
24947
|
+
import { mkdirSync as mkdirSync8, readFileSync as readFileSync41, writeFileSync as writeFileSync15 } from "fs";
|
|
24822
24948
|
import { dirname as dirname15 } from "path";
|
|
24823
24949
|
var TOKEN_PREFIX = "v1.";
|
|
24824
24950
|
var SECRET_BYTES = 32;
|
|
@@ -24827,21 +24953,21 @@ var cachedSecret = null;
|
|
|
24827
24953
|
function getSecret() {
|
|
24828
24954
|
if (cachedSecret) return cachedSecret;
|
|
24829
24955
|
try {
|
|
24830
|
-
const hex2 =
|
|
24956
|
+
const hex2 = readFileSync41(VISITOR_TOKEN_SECRET_FILE, "utf-8").trim();
|
|
24831
24957
|
if (hex2.length === SECRET_BYTES * 2) {
|
|
24832
24958
|
cachedSecret = Buffer.from(hex2, "hex");
|
|
24833
24959
|
return cachedSecret;
|
|
24834
24960
|
}
|
|
24835
24961
|
} catch {
|
|
24836
24962
|
}
|
|
24837
|
-
const fresh =
|
|
24963
|
+
const fresh = randomBytes2(SECRET_BYTES).toString("hex");
|
|
24838
24964
|
try {
|
|
24839
24965
|
mkdirSync8(dirname15(VISITOR_TOKEN_SECRET_FILE), { recursive: true, mode: 448 });
|
|
24840
|
-
|
|
24966
|
+
writeFileSync15(VISITOR_TOKEN_SECRET_FILE, fresh, { mode: 384, flag: "wx" });
|
|
24841
24967
|
console.log(`[visitor-token] secret minted path=${VISITOR_TOKEN_SECRET_FILE}`);
|
|
24842
24968
|
} catch {
|
|
24843
24969
|
}
|
|
24844
|
-
const hex =
|
|
24970
|
+
const hex = readFileSync41(VISITOR_TOKEN_SECRET_FILE, "utf-8").trim();
|
|
24845
24971
|
cachedSecret = Buffer.from(hex, "hex");
|
|
24846
24972
|
return cachedSecret;
|
|
24847
24973
|
}
|
|
@@ -24874,7 +25000,7 @@ function verifyVisitorToken(token, now = Date.now()) {
|
|
|
24874
25000
|
const expected = signPayload(payloadJson, getSecret());
|
|
24875
25001
|
const expectedBuf = Buffer.from(expected, "utf-8");
|
|
24876
25002
|
const provBuf = Buffer.from(sigB64, "utf-8");
|
|
24877
|
-
if (expectedBuf.length !== provBuf.length || !
|
|
25003
|
+
if (expectedBuf.length !== provBuf.length || !timingSafeEqual2(expectedBuf, provBuf)) {
|
|
24878
25004
|
return { ok: false, reason: "bad-sig" };
|
|
24879
25005
|
}
|
|
24880
25006
|
let payload;
|
|
@@ -24894,7 +25020,7 @@ var VISITOR_COOKIE_NAME = "mxy_v";
|
|
|
24894
25020
|
var VISITOR_COOKIE_MAX_AGE_SECONDS = Math.floor(DEFAULT_TTL_MS / 1e3);
|
|
24895
25021
|
|
|
24896
25022
|
// app/lib/brand-config.ts
|
|
24897
|
-
import { existsSync as
|
|
25023
|
+
import { existsSync as existsSync43, readFileSync as readFileSync42 } from "fs";
|
|
24898
25024
|
import { join as join47 } from "path";
|
|
24899
25025
|
var cached2 = null;
|
|
24900
25026
|
var cachedAttempted = false;
|
|
@@ -24904,9 +25030,9 @@ function readBrandConfig() {
|
|
|
24904
25030
|
const platformRoot5 = process.env.MAXY_PLATFORM_ROOT;
|
|
24905
25031
|
if (!platformRoot5) return null;
|
|
24906
25032
|
const brandPath = join47(platformRoot5, "config", "brand.json");
|
|
24907
|
-
if (!
|
|
25033
|
+
if (!existsSync43(brandPath)) return null;
|
|
24908
25034
|
try {
|
|
24909
|
-
cached2 = JSON.parse(
|
|
25035
|
+
cached2 = JSON.parse(readFileSync42(brandPath, "utf-8"));
|
|
24910
25036
|
return cached2;
|
|
24911
25037
|
} catch {
|
|
24912
25038
|
return null;
|
|
@@ -25403,14 +25529,14 @@ async function writeEvent(opts) {
|
|
|
25403
25529
|
var visitor_event_default = app71;
|
|
25404
25530
|
|
|
25405
25531
|
// server/routes/session.ts
|
|
25406
|
-
import { resolve as
|
|
25407
|
-
import { existsSync as
|
|
25408
|
-
var
|
|
25532
|
+
import { resolve as resolve37 } from "path";
|
|
25533
|
+
import { existsSync as existsSync44, writeFileSync as writeFileSync16, mkdirSync as mkdirSync9 } from "fs";
|
|
25534
|
+
var UUID_RE5 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
25409
25535
|
function writeBrandingCache(accountId, agentSlug, branding) {
|
|
25410
25536
|
try {
|
|
25411
|
-
const cacheDir =
|
|
25537
|
+
const cacheDir = resolve37(MAXY_DIR, "branding-cache", accountId);
|
|
25412
25538
|
mkdirSync9(cacheDir, { recursive: true });
|
|
25413
|
-
|
|
25539
|
+
writeFileSync16(resolve37(cacheDir, `${agentSlug}.json`), JSON.stringify(branding), "utf-8");
|
|
25414
25540
|
} catch (err) {
|
|
25415
25541
|
console.error(`[branding] cache write failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
25416
25542
|
}
|
|
@@ -25420,7 +25546,7 @@ function parseVisitorCookie2(cookieHeader) {
|
|
|
25420
25546
|
const match = cookieHeader.match(/(?:^|;\s*)maxy_visitor=([^;]*)/);
|
|
25421
25547
|
if (!match) return null;
|
|
25422
25548
|
const value = decodeURIComponent(match[1]).trim();
|
|
25423
|
-
return
|
|
25549
|
+
return UUID_RE5.test(value) ? value : null;
|
|
25424
25550
|
}
|
|
25425
25551
|
function parseAccessSessionId2(cookieHeader) {
|
|
25426
25552
|
if (!cookieHeader) return null;
|
|
@@ -25487,8 +25613,8 @@ app72.post("/", async (c) => {
|
|
|
25487
25613
|
}
|
|
25488
25614
|
let agentConfig = null;
|
|
25489
25615
|
if (account) {
|
|
25490
|
-
const agentDir =
|
|
25491
|
-
if (!
|
|
25616
|
+
const agentDir = resolve37(account.accountDir, "agents", agentSlug);
|
|
25617
|
+
if (!existsSync44(agentDir) || !existsSync44(resolve37(agentDir, "config.json"))) {
|
|
25492
25618
|
return c.json({ error: "Agent not found" }, 404);
|
|
25493
25619
|
}
|
|
25494
25620
|
agentConfig = resolveAgentConfig(account.accountDir, agentSlug);
|
|
@@ -25518,7 +25644,7 @@ app72.post("/", async (c) => {
|
|
|
25518
25644
|
);
|
|
25519
25645
|
}
|
|
25520
25646
|
}
|
|
25521
|
-
if (body.session_key && typeof body.session_key === "string" &&
|
|
25647
|
+
if (body.session_key && typeof body.session_key === "string" && UUID_RE5.test(body.session_key)) {
|
|
25522
25648
|
if (visitorId) {
|
|
25523
25649
|
const recent = await findRecentConversation(visitorId, accountId, agentSlug).catch(() => null);
|
|
25524
25650
|
if (recent) {
|
|
@@ -25748,7 +25874,7 @@ var calendar_public_default = app73;
|
|
|
25748
25874
|
// server/routes/portal-fetch.ts
|
|
25749
25875
|
import { createReadStream as createReadStream3 } from "fs";
|
|
25750
25876
|
import { stat as stat8, readFile as readFile11, realpath } from "fs/promises";
|
|
25751
|
-
import { join as join48, resolve as
|
|
25877
|
+
import { join as join48, resolve as resolve38, sep as sep11 } from "path";
|
|
25752
25878
|
import { Readable as Readable3 } from "stream";
|
|
25753
25879
|
var app74 = new Hono();
|
|
25754
25880
|
var TAG41 = "[portal-fetch]";
|
|
@@ -25801,7 +25927,7 @@ ${expiresAtMs}`)
|
|
|
25801
25927
|
return diff === 0;
|
|
25802
25928
|
}
|
|
25803
25929
|
async function readAccountSecret(accountId) {
|
|
25804
|
-
const path =
|
|
25930
|
+
const path = resolve38(DATA_ROOT, "accounts", accountId, "secrets", "data-portal.env");
|
|
25805
25931
|
let text;
|
|
25806
25932
|
try {
|
|
25807
25933
|
text = await readFile11(path, "utf8");
|
|
@@ -25837,7 +25963,7 @@ async function resolveFetchTarget(accountDir, relPath, ownerId) {
|
|
|
25837
25963
|
const exposeFolders = await readExposeFolders2(accountDir);
|
|
25838
25964
|
const { exposed } = resolveExposedDirs(schemaText, exposeFolders);
|
|
25839
25965
|
if (exposed.length === 0 && !ownerId) return { ok: false, reason: "not-exposed" };
|
|
25840
|
-
const lexical =
|
|
25966
|
+
const lexical = resolve38(accountDir, relPath);
|
|
25841
25967
|
let root;
|
|
25842
25968
|
let absolute;
|
|
25843
25969
|
try {
|
|
@@ -25886,7 +26012,7 @@ async function handle(c, headOnly) {
|
|
|
25886
26012
|
return c.json({ ok: false, error: "denied" }, 401);
|
|
25887
26013
|
}
|
|
25888
26014
|
const target = await resolveFetchTarget(
|
|
25889
|
-
|
|
26015
|
+
resolve38(DATA_ROOT, "accounts", accountId),
|
|
25890
26016
|
relPath,
|
|
25891
26017
|
owner || void 0
|
|
25892
26018
|
);
|
|
@@ -26000,7 +26126,7 @@ function startTimeEntryCensus(openSession, opts = {}) {
|
|
|
26000
26126
|
}
|
|
26001
26127
|
|
|
26002
26128
|
// app/lib/ledger-census.ts
|
|
26003
|
-
import { readdirSync as
|
|
26129
|
+
import { readdirSync as readdirSync28, readFileSync as readFileSync43, statSync as statSync23 } from "fs";
|
|
26004
26130
|
import { join as join49 } from "path";
|
|
26005
26131
|
|
|
26006
26132
|
// ../lib/ledger-core/dist/reconcile.js
|
|
@@ -26049,7 +26175,7 @@ var DAY_MS = 864e5;
|
|
|
26049
26175
|
function countWriteRejects24h(logDir, now) {
|
|
26050
26176
|
let entries2;
|
|
26051
26177
|
try {
|
|
26052
|
-
entries2 =
|
|
26178
|
+
entries2 = readdirSync28(logDir).filter((f) => f.startsWith("mcp-ledger-") && f.endsWith(".log"));
|
|
26053
26179
|
} catch {
|
|
26054
26180
|
return 0;
|
|
26055
26181
|
}
|
|
@@ -26058,7 +26184,7 @@ function countWriteRejects24h(logDir, now) {
|
|
|
26058
26184
|
const path = join49(logDir, name);
|
|
26059
26185
|
try {
|
|
26060
26186
|
if (now - statSync23(path).mtimeMs > DAY_MS) continue;
|
|
26061
|
-
for (const line of
|
|
26187
|
+
for (const line of readFileSync43(path, "utf8").split("\n")) {
|
|
26062
26188
|
if (line.includes("[graph-write] reject")) total += 1;
|
|
26063
26189
|
}
|
|
26064
26190
|
} catch {
|
|
@@ -26327,7 +26453,7 @@ function startGraphHealthTimer() {
|
|
|
26327
26453
|
|
|
26328
26454
|
// app/lib/file-watcher.ts
|
|
26329
26455
|
import * as fsp2 from "fs/promises";
|
|
26330
|
-
import { resolve as
|
|
26456
|
+
import { resolve as resolve39, sep as sep12 } from "path";
|
|
26331
26457
|
var ACCOUNT_UUID_RE3 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
26332
26458
|
var DEFAULT_COALESCE_MS = 500;
|
|
26333
26459
|
var ROOTS = ["accounts"];
|
|
@@ -26346,7 +26472,7 @@ async function startFileWatcher(opts = {}) {
|
|
|
26346
26472
|
const dropFn = opts.drop ?? dropFileIndex;
|
|
26347
26473
|
for (const r of ROOTS) {
|
|
26348
26474
|
try {
|
|
26349
|
-
await fsp2.mkdir(
|
|
26475
|
+
await fsp2.mkdir(resolve39(dataRoot, r), { recursive: true });
|
|
26350
26476
|
} catch (err) {
|
|
26351
26477
|
console.error(
|
|
26352
26478
|
`[file-watcher] start-failed root="${r}" err="${err.message}" \u2014 index will be maintained by the 5-min reconcile backstop only`
|
|
@@ -26367,7 +26493,7 @@ async function startFileWatcher(opts = {}) {
|
|
|
26367
26493
|
timers.set(relativePath, t);
|
|
26368
26494
|
}
|
|
26369
26495
|
async function runHook(relativePath, accountId) {
|
|
26370
|
-
const absolute =
|
|
26496
|
+
const absolute = resolve39(dataRoot, relativePath);
|
|
26371
26497
|
let exists = false;
|
|
26372
26498
|
try {
|
|
26373
26499
|
const st = await fsp2.stat(absolute);
|
|
@@ -26391,7 +26517,7 @@ async function startFileWatcher(opts = {}) {
|
|
|
26391
26517
|
}
|
|
26392
26518
|
}
|
|
26393
26519
|
async function watchRoot(rootName) {
|
|
26394
|
-
const absRoot =
|
|
26520
|
+
const absRoot = resolve39(dataRoot, rootName);
|
|
26395
26521
|
try {
|
|
26396
26522
|
const iter = fsp2.watch(absRoot, { recursive: true, signal: controller.signal });
|
|
26397
26523
|
for await (const event of iter) {
|
|
@@ -26430,7 +26556,7 @@ async function startFileWatcher(opts = {}) {
|
|
|
26430
26556
|
|
|
26431
26557
|
// app/lib/migrate-uploads.ts
|
|
26432
26558
|
import { mkdir as mkdir4, readdir as readdir6, rename as rename4, rm as rm3 } from "fs/promises";
|
|
26433
|
-
import { dirname as dirname16, relative as relative8, resolve as
|
|
26559
|
+
import { dirname as dirname16, relative as relative8, resolve as resolve40 } from "path";
|
|
26434
26560
|
var ACCOUNT_UUID_RE4 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
26435
26561
|
async function walkFiles(dir) {
|
|
26436
26562
|
const out = [];
|
|
@@ -26441,7 +26567,7 @@ async function walkFiles(dir) {
|
|
|
26441
26567
|
return out;
|
|
26442
26568
|
}
|
|
26443
26569
|
for (const e of entries2) {
|
|
26444
|
-
const abs =
|
|
26570
|
+
const abs = resolve40(dir, e.name);
|
|
26445
26571
|
if (e.isDirectory()) {
|
|
26446
26572
|
out.push(...await walkFiles(abs));
|
|
26447
26573
|
} else if (e.isFile()) {
|
|
@@ -26461,7 +26587,7 @@ async function relocateTree(srcDir, destDir, dataRoot, accountId, session) {
|
|
|
26461
26587
|
let moved = 0;
|
|
26462
26588
|
for (const oldAbs of files) {
|
|
26463
26589
|
const suffix = relative8(srcDir, oldAbs);
|
|
26464
|
-
const newAbs =
|
|
26590
|
+
const newAbs = resolve40(destDir, suffix);
|
|
26465
26591
|
await mkdir4(dirname16(newAbs), { recursive: true });
|
|
26466
26592
|
await rename4(oldAbs, newAbs);
|
|
26467
26593
|
moved++;
|
|
@@ -26488,7 +26614,7 @@ async function relocateTree(srcDir, destDir, dataRoot, accountId, session) {
|
|
|
26488
26614
|
}
|
|
26489
26615
|
async function migrateUploads(opts = {}) {
|
|
26490
26616
|
const dataRoot = opts.dataRoot ?? DATA_ROOT;
|
|
26491
|
-
const oldRoot =
|
|
26617
|
+
const oldRoot = resolve40(dataRoot, "uploads");
|
|
26492
26618
|
let topEntries;
|
|
26493
26619
|
try {
|
|
26494
26620
|
topEntries = await readdir6(oldRoot, { withFileTypes: true });
|
|
@@ -26509,8 +26635,8 @@ async function migrateUploads(opts = {}) {
|
|
|
26509
26635
|
const name = entry.name;
|
|
26510
26636
|
if (ACCOUNT_UUID_RE4.test(name)) {
|
|
26511
26637
|
moved += await relocateTree(
|
|
26512
|
-
|
|
26513
|
-
|
|
26638
|
+
resolve40(oldRoot, name),
|
|
26639
|
+
resolve40(dataRoot, "accounts", name, "uploads"),
|
|
26514
26640
|
dataRoot,
|
|
26515
26641
|
name,
|
|
26516
26642
|
session
|
|
@@ -26522,8 +26648,8 @@ async function migrateUploads(opts = {}) {
|
|
|
26522
26648
|
continue;
|
|
26523
26649
|
}
|
|
26524
26650
|
moved += await relocateTree(
|
|
26525
|
-
|
|
26526
|
-
|
|
26651
|
+
resolve40(oldRoot, "public"),
|
|
26652
|
+
resolve40(dataRoot, "accounts", installAccountId, "uploads", "public"),
|
|
26527
26653
|
dataRoot,
|
|
26528
26654
|
null,
|
|
26529
26655
|
// public uploads carry no graph nodes
|
|
@@ -26553,7 +26679,7 @@ async function migrateUploads(opts = {}) {
|
|
|
26553
26679
|
|
|
26554
26680
|
// app/lib/migrate-admin-webchat-sidecars.ts
|
|
26555
26681
|
import { readdir as readdir7, readFile as readFile12, rename as rename5, writeFile as writeFile4, unlink as unlink4 } from "fs/promises";
|
|
26556
|
-
import { existsSync as
|
|
26682
|
+
import { existsSync as existsSync45 } from "fs";
|
|
26557
26683
|
import { join as join50 } from "path";
|
|
26558
26684
|
var ADMIN_ROLE2 = "admin";
|
|
26559
26685
|
var WEBCHAT_CHANNEL2 = "webchat";
|
|
@@ -26583,7 +26709,7 @@ async function writeRaw(path, obj) {
|
|
|
26583
26709
|
await rename5(tmp, path);
|
|
26584
26710
|
} catch (err) {
|
|
26585
26711
|
try {
|
|
26586
|
-
if (
|
|
26712
|
+
if (existsSync45(tmp)) await unlink4(tmp);
|
|
26587
26713
|
} catch {
|
|
26588
26714
|
}
|
|
26589
26715
|
throw err;
|
|
@@ -26706,7 +26832,7 @@ async function migrateAdminWebchatSidecars(opts = {}) {
|
|
|
26706
26832
|
|
|
26707
26833
|
// app/lib/migrate-sidecar-account-ids.ts
|
|
26708
26834
|
import { readdir as readdir8, readFile as readFile13, rename as rename6, writeFile as writeFile5, unlink as unlink5 } from "fs/promises";
|
|
26709
|
-
import { existsSync as
|
|
26835
|
+
import { existsSync as existsSync46 } from "fs";
|
|
26710
26836
|
import { join as join51 } from "path";
|
|
26711
26837
|
var SESSION_META_RE2 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.meta\.json$/i;
|
|
26712
26838
|
function projectSlugForCwd(cwd) {
|
|
@@ -26733,7 +26859,7 @@ async function writeRaw2(path, obj) {
|
|
|
26733
26859
|
await rename6(tmp, path);
|
|
26734
26860
|
} catch (err) {
|
|
26735
26861
|
try {
|
|
26736
|
-
if (
|
|
26862
|
+
if (existsSync46(tmp)) await unlink5(tmp);
|
|
26737
26863
|
} catch {
|
|
26738
26864
|
}
|
|
26739
26865
|
throw err;
|
|
@@ -27909,16 +28035,16 @@ var WebchatGateway = class _WebchatGateway {
|
|
|
27909
28035
|
* The public /api/chat route awaits this to return the reply on the same SSE
|
|
27910
28036
|
* response, preserving the pre-756 POST→single-blob browser contract. */
|
|
27911
28037
|
awaitReply(key, timeoutMs) {
|
|
27912
|
-
return new Promise((
|
|
28038
|
+
return new Promise((resolve46) => {
|
|
27913
28039
|
const timer = setTimeout(() => {
|
|
27914
28040
|
this.replyAwaiters.delete(key);
|
|
27915
|
-
|
|
28041
|
+
resolve46({ timeout: true });
|
|
27916
28042
|
}, timeoutMs);
|
|
27917
28043
|
if (timer.unref) timer.unref();
|
|
27918
28044
|
this.replyAwaiters.set(key, (r) => {
|
|
27919
28045
|
clearTimeout(timer);
|
|
27920
28046
|
this.replyAwaiters.delete(key);
|
|
27921
|
-
|
|
28047
|
+
resolve46(r);
|
|
27922
28048
|
});
|
|
27923
28049
|
});
|
|
27924
28050
|
}
|
|
@@ -27929,11 +28055,11 @@ var WebchatGateway = class _WebchatGateway {
|
|
|
27929
28055
|
* terminal dialog stays answerable). */
|
|
27930
28056
|
awaitPermissionVerdict(p, timeoutMs) {
|
|
27931
28057
|
const k = _WebchatGateway.promptKey(p.key, p.requestId);
|
|
27932
|
-
return new Promise((
|
|
28058
|
+
return new Promise((resolve46) => {
|
|
27933
28059
|
this.pendingPrompts.get(k)?.resolve({ timeout: true });
|
|
27934
28060
|
const timer = setTimeout(() => {
|
|
27935
28061
|
this.pendingPrompts.delete(k);
|
|
27936
|
-
|
|
28062
|
+
resolve46({ timeout: true });
|
|
27937
28063
|
}, timeoutMs);
|
|
27938
28064
|
if (timer.unref) timer.unref();
|
|
27939
28065
|
this.pendingPrompts.set(k, {
|
|
@@ -27943,7 +28069,7 @@ var WebchatGateway = class _WebchatGateway {
|
|
|
27943
28069
|
clearTimeout(timer);
|
|
27944
28070
|
this.pendingPrompts.delete(k);
|
|
27945
28071
|
this.deps.onPointerChange?.(p.key);
|
|
27946
|
-
|
|
28072
|
+
resolve46(r);
|
|
27947
28073
|
}
|
|
27948
28074
|
});
|
|
27949
28075
|
console.error(`[webchat:perm] op=open key=${keyDisplay(p.key)} id=${p.requestId} tool=${p.toolName}`);
|
|
@@ -28519,7 +28645,7 @@ async function fanOut(subscribers, text, onError, tag) {
|
|
|
28519
28645
|
|
|
28520
28646
|
// app/lib/webchat/file-delivery.ts
|
|
28521
28647
|
import { realpathSync as realpathSync9 } from "fs";
|
|
28522
|
-
import { resolve as
|
|
28648
|
+
import { resolve as resolve41 } from "path";
|
|
28523
28649
|
|
|
28524
28650
|
// app/lib/channel-pty-bridge/file-delivery.ts
|
|
28525
28651
|
var SEND_USER_FILE = "SendUserFile";
|
|
@@ -28620,7 +28746,7 @@ function makeWebchatSendFile(entry) {
|
|
|
28620
28746
|
console.error(`${TAG45} file-delivery reject reason=no-account sender=${entry.senderId}`);
|
|
28621
28747
|
return { ok: false, error: "no-account" };
|
|
28622
28748
|
}
|
|
28623
|
-
const accountDir =
|
|
28749
|
+
const accountDir = resolve41(platformRoot2(), "..", "data/accounts", entry.accountId);
|
|
28624
28750
|
try {
|
|
28625
28751
|
const resolved = realpathSync9(filePath);
|
|
28626
28752
|
const accountResolved = realpathSync9(accountDir);
|
|
@@ -29184,7 +29310,7 @@ function buildTelegramSpawnRequest(input) {
|
|
|
29184
29310
|
// app/lib/telegram/outbound/send-document.ts
|
|
29185
29311
|
import { realpathSync as realpathSync10 } from "fs";
|
|
29186
29312
|
import { readFile as readFile14, stat as stat10 } from "fs/promises";
|
|
29187
|
-
import { resolve as
|
|
29313
|
+
import { resolve as resolve42, basename as basename15 } from "path";
|
|
29188
29314
|
var TAG47 = "[telegram:outbound]";
|
|
29189
29315
|
var TELEGRAM_DOCUMENT_MAX_BYTES = 50 * 1024 * 1024;
|
|
29190
29316
|
async function sendTelegramDocument(input) {
|
|
@@ -29195,7 +29321,7 @@ async function sendTelegramDocument(input) {
|
|
|
29195
29321
|
if (!maxyAccountId || !platformRoot5) {
|
|
29196
29322
|
return { ok: false, status: 400, error: "Cannot validate file path: missing account or platform context" };
|
|
29197
29323
|
}
|
|
29198
|
-
const accountDir =
|
|
29324
|
+
const accountDir = resolve42(platformRoot5, "..", "data/accounts", maxyAccountId);
|
|
29199
29325
|
let accountResolved;
|
|
29200
29326
|
try {
|
|
29201
29327
|
accountResolved = realpathSync10(accountDir);
|
|
@@ -29603,14 +29729,14 @@ function resolveScheduledEffectiveAccountForInstall(accountDir, destination) {
|
|
|
29603
29729
|
}
|
|
29604
29730
|
|
|
29605
29731
|
// server/lib/booking-site-accounts.ts
|
|
29606
|
-
import { existsSync as
|
|
29607
|
-
import { resolve as
|
|
29732
|
+
import { existsSync as existsSync47, readFileSync as readFileSync44 } from "fs";
|
|
29733
|
+
import { resolve as resolve43 } from "path";
|
|
29608
29734
|
function listBookingSiteAccounts(accounts) {
|
|
29609
29735
|
return accounts.filter((a) => {
|
|
29610
|
-
const availPath =
|
|
29611
|
-
if (!
|
|
29736
|
+
const availPath = resolve43(a.accountDir, "calendar-availability.json");
|
|
29737
|
+
if (!existsSync47(availPath)) return false;
|
|
29612
29738
|
try {
|
|
29613
|
-
const cfg = JSON.parse(
|
|
29739
|
+
const cfg = JSON.parse(readFileSync44(availPath, "utf-8"));
|
|
29614
29740
|
return typeof cfg.bookingDbName === "string" && cfg.bookingDbName.length > 0;
|
|
29615
29741
|
} catch {
|
|
29616
29742
|
return false;
|
|
@@ -29648,8 +29774,8 @@ function broadcastAdminShutdown(reason) {
|
|
|
29648
29774
|
|
|
29649
29775
|
// ../lib/entitlement/src/index.ts
|
|
29650
29776
|
import { createPublicKey, createHash as createHash6, verify as cryptoVerify } from "crypto";
|
|
29651
|
-
import { existsSync as
|
|
29652
|
-
import { resolve as
|
|
29777
|
+
import { existsSync as existsSync48, readFileSync as readFileSync45, statSync as statSync24 } from "fs";
|
|
29778
|
+
import { resolve as resolve44 } from "path";
|
|
29653
29779
|
|
|
29654
29780
|
// ../lib/entitlement/src/canonicalize.ts
|
|
29655
29781
|
function canonicalize(value) {
|
|
@@ -29684,7 +29810,7 @@ var PUBKEY_SHA256 = "8eee6bcb33545fd13b16d3199a5735ca5db5062834c7b49dfe4f23801d9
|
|
|
29684
29810
|
var GRACE_DAYS = 7;
|
|
29685
29811
|
var GRACE_MS = GRACE_DAYS * 24 * 60 * 60 * 1e3;
|
|
29686
29812
|
function pubkeyPath(brand) {
|
|
29687
|
-
return
|
|
29813
|
+
return resolve44(brand.platformRoot, "lib", "entitlement", "rubytech-pubkey.pem");
|
|
29688
29814
|
}
|
|
29689
29815
|
var memo = null;
|
|
29690
29816
|
function memoKey(mtimeMs, account) {
|
|
@@ -29696,8 +29822,8 @@ function resolveEntitlement(brand, account) {
|
|
|
29696
29822
|
if (brand.commercialMode !== true) {
|
|
29697
29823
|
return logResolved(implicitTrust(account), null);
|
|
29698
29824
|
}
|
|
29699
|
-
const entitlementPath =
|
|
29700
|
-
if (!
|
|
29825
|
+
const entitlementPath = resolve44(brand.configDir, "entitlement.json");
|
|
29826
|
+
if (!existsSync48(entitlementPath)) {
|
|
29701
29827
|
return logResolved(anonymousFallback("missing"), { reason: "missing" });
|
|
29702
29828
|
}
|
|
29703
29829
|
const stat11 = statSync24(entitlementPath);
|
|
@@ -29712,7 +29838,7 @@ function resolveEntitlement(brand, account) {
|
|
|
29712
29838
|
function verifyAndResolve(brand, entitlementPath, account) {
|
|
29713
29839
|
let pubkeyPem;
|
|
29714
29840
|
try {
|
|
29715
|
-
pubkeyPem =
|
|
29841
|
+
pubkeyPem = readFileSync45(pubkeyPath(brand), "utf-8");
|
|
29716
29842
|
} catch (err) {
|
|
29717
29843
|
return logResolved(anonymousFallback("pubkey-missing"), {
|
|
29718
29844
|
reason: "pubkey-missing"
|
|
@@ -29726,7 +29852,7 @@ function verifyAndResolve(brand, entitlementPath, account) {
|
|
|
29726
29852
|
}
|
|
29727
29853
|
let envelope;
|
|
29728
29854
|
try {
|
|
29729
|
-
envelope = JSON.parse(
|
|
29855
|
+
envelope = JSON.parse(readFileSync45(entitlementPath, "utf-8"));
|
|
29730
29856
|
} catch {
|
|
29731
29857
|
return logResolved(anonymousFallback("malformed"), { reason: "malformed" });
|
|
29732
29858
|
}
|
|
@@ -29890,12 +30016,12 @@ installMediaDownloadGuard();
|
|
|
29890
30016
|
var PLATFORM_ROOT6 = process.env.MAXY_PLATFORM_ROOT || "";
|
|
29891
30017
|
var BRAND_JSON_PATH = PLATFORM_ROOT6 ? join52(PLATFORM_ROOT6, "config", "brand.json") : "";
|
|
29892
30018
|
var BRAND = { productName: "Maxy", hostname: "maxy", configDir: ".maxy", marketingUrl: "https://getmaxy.com" };
|
|
29893
|
-
if (BRAND_JSON_PATH && !
|
|
30019
|
+
if (BRAND_JSON_PATH && !existsSync49(BRAND_JSON_PATH)) {
|
|
29894
30020
|
console.error(`[brand] WARNING: brand.json not found at ${BRAND_JSON_PATH} \u2014 using Maxy defaults`);
|
|
29895
30021
|
}
|
|
29896
|
-
if (BRAND_JSON_PATH &&
|
|
30022
|
+
if (BRAND_JSON_PATH && existsSync49(BRAND_JSON_PATH)) {
|
|
29897
30023
|
try {
|
|
29898
|
-
const parsed = JSON.parse(
|
|
30024
|
+
const parsed = JSON.parse(readFileSync46(BRAND_JSON_PATH, "utf-8"));
|
|
29899
30025
|
BRAND = { ...BRAND, ...parsed };
|
|
29900
30026
|
} catch (err) {
|
|
29901
30027
|
console.error(`[brand] Failed to parse brand.json: ${err.message}`);
|
|
@@ -29930,8 +30056,8 @@ var brandLoginOpts = {
|
|
|
29930
30056
|
var ALIAS_DOMAINS_PATH = join52(homedir4(), BRAND.configDir, "alias-domains.json");
|
|
29931
30057
|
function loadAliasDomains() {
|
|
29932
30058
|
try {
|
|
29933
|
-
if (!
|
|
29934
|
-
const parsed = JSON.parse(
|
|
30059
|
+
if (!existsSync49(ALIAS_DOMAINS_PATH)) return null;
|
|
30060
|
+
const parsed = JSON.parse(readFileSync46(ALIAS_DOMAINS_PATH, "utf-8"));
|
|
29935
30061
|
if (!Array.isArray(parsed)) {
|
|
29936
30062
|
console.error("[alias-domains] malformed alias-domains.json \u2014 expected array");
|
|
29937
30063
|
return null;
|
|
@@ -30006,7 +30132,7 @@ var waGateway = new WaGateway({
|
|
|
30006
30132
|
fetchStandingRules: fetchAccountStandingRules,
|
|
30007
30133
|
resolveSessionOverride: (accountId, senderId) => resolveChannelOverride(accountId, "whatsapp", senderId),
|
|
30008
30134
|
gatewayUrl: `http://127.0.0.1:${process.env.MAXY_UI_INTERNAL_PORT ?? ""}`,
|
|
30009
|
-
serverPath: process.env.MAXY_WA_CHANNEL_SERVER_PATH ??
|
|
30135
|
+
serverPath: process.env.MAXY_WA_CHANNEL_SERVER_PATH ?? resolve45(process.env.MAXY_PLATFORM_ROOT ?? join52(__dirname, ".."), "services/whatsapp-channel/dist/server.js"),
|
|
30010
30136
|
// Task 751 / 1390 — file delivery on the native channel. `maxyAccountId` (the
|
|
30011
30137
|
// path-validation scope) is the sender's effective SESSION account, resolved
|
|
30012
30138
|
// once at the inbound gate and threaded here via the gateway's per-sender doc
|
|
@@ -30021,7 +30147,7 @@ var waGateway = new WaGateway({
|
|
|
30021
30147
|
caption,
|
|
30022
30148
|
accountId,
|
|
30023
30149
|
maxyAccountId,
|
|
30024
|
-
platformRoot:
|
|
30150
|
+
platformRoot: resolve45(process.env.MAXY_PLATFORM_ROOT ?? join52(__dirname, ".."))
|
|
30025
30151
|
});
|
|
30026
30152
|
return result.ok ? { ok: true, messageId: result.messageId } : { ok: false, error: result.error };
|
|
30027
30153
|
},
|
|
@@ -30723,20 +30849,20 @@ app75.get("/agent-assets/:slug/:filename", (c) => {
|
|
|
30723
30849
|
console.error(`[agent-assets] no-account slug=${slug} file=${filename}`);
|
|
30724
30850
|
return c.text("Not found", 404);
|
|
30725
30851
|
}
|
|
30726
|
-
const filePath =
|
|
30727
|
-
const expectedDir =
|
|
30852
|
+
const filePath = resolve45(account.accountDir, "agents", slug, "assets", filename);
|
|
30853
|
+
const expectedDir = resolve45(account.accountDir, "agents", slug, "assets");
|
|
30728
30854
|
if (!filePath.startsWith(expectedDir + "/")) {
|
|
30729
30855
|
console.error(`[agent-assets] path-traversal-rejected slug=${slug} file=${filename}`);
|
|
30730
30856
|
return c.text("Forbidden", 403);
|
|
30731
30857
|
}
|
|
30732
|
-
if (!
|
|
30858
|
+
if (!existsSync49(filePath)) {
|
|
30733
30859
|
console.error(`[agent-assets] serve slug=${slug} file=${filename} status=404`);
|
|
30734
30860
|
return c.text("Not found", 404);
|
|
30735
30861
|
}
|
|
30736
30862
|
const ext = "." + filename.split(".").pop()?.toLowerCase();
|
|
30737
30863
|
const contentType = IMAGE_MIME[ext] || "application/octet-stream";
|
|
30738
30864
|
console.log(`[agent-assets] serve slug=${slug} file=${filename} status=200`);
|
|
30739
|
-
const body =
|
|
30865
|
+
const body = readFileSync46(filePath);
|
|
30740
30866
|
return c.body(body, 200, {
|
|
30741
30867
|
"Content-Type": contentType,
|
|
30742
30868
|
"Cache-Control": "public, max-age=3600"
|
|
@@ -30753,20 +30879,20 @@ app75.get("/generated/:filename", (c) => {
|
|
|
30753
30879
|
console.error(`[generated] serve file=${filename} status=404`);
|
|
30754
30880
|
return c.text("Not found", 404);
|
|
30755
30881
|
}
|
|
30756
|
-
const filePath =
|
|
30757
|
-
const expectedDir =
|
|
30882
|
+
const filePath = resolve45(account.accountDir, "generated", filename);
|
|
30883
|
+
const expectedDir = resolve45(account.accountDir, "generated");
|
|
30758
30884
|
if (!filePath.startsWith(expectedDir + "/")) {
|
|
30759
30885
|
console.error(`[generated] serve file=${filename} status=403`);
|
|
30760
30886
|
return c.text("Forbidden", 403);
|
|
30761
30887
|
}
|
|
30762
|
-
if (!
|
|
30888
|
+
if (!existsSync49(filePath)) {
|
|
30763
30889
|
console.error(`[generated] serve file=${filename} status=404`);
|
|
30764
30890
|
return c.text("Not found", 404);
|
|
30765
30891
|
}
|
|
30766
30892
|
const ext = "." + filename.split(".").pop()?.toLowerCase();
|
|
30767
30893
|
const contentType = IMAGE_MIME[ext] || "application/octet-stream";
|
|
30768
30894
|
console.log(`[generated] serve file=${filename} status=200`);
|
|
30769
|
-
const body =
|
|
30895
|
+
const body = readFileSync46(filePath);
|
|
30770
30896
|
return c.body(body, 200, {
|
|
30771
30897
|
"Content-Type": contentType,
|
|
30772
30898
|
"Cache-Control": "public, max-age=86400"
|
|
@@ -30779,9 +30905,9 @@ app75.route("/v", visitor_consent_default);
|
|
|
30779
30905
|
var htmlCache = /* @__PURE__ */ new Map();
|
|
30780
30906
|
var brandLogoPath = "/brand/maxy-monochrome.png";
|
|
30781
30907
|
var brandIconPath = "/brand/maxy-monochrome.png";
|
|
30782
|
-
if (BRAND_JSON_PATH &&
|
|
30908
|
+
if (BRAND_JSON_PATH && existsSync49(BRAND_JSON_PATH)) {
|
|
30783
30909
|
try {
|
|
30784
|
-
const fullBrand = JSON.parse(
|
|
30910
|
+
const fullBrand = JSON.parse(readFileSync46(BRAND_JSON_PATH, "utf-8"));
|
|
30785
30911
|
if (fullBrand.assets?.logo) brandLogoPath = `/brand/${fullBrand.assets.logo}`;
|
|
30786
30912
|
brandIconPath = fullBrand.assets?.icon ? `/brand/${fullBrand.assets.icon}` : brandLogoPath;
|
|
30787
30913
|
} catch {
|
|
@@ -30808,11 +30934,11 @@ var brandScript = `<script>window.__BRAND__=${JSON.stringify({
|
|
|
30808
30934
|
var brandThemeColor = BRAND.defaultColors?.primary ?? "#000000";
|
|
30809
30935
|
var brandBackgroundColor = BRAND.defaultColors?.background ?? "#ffffff";
|
|
30810
30936
|
var brandAppIconsExist = [brandAppIcon192Path, brandAppIcon512Path, brandMaskableIconPath].every(
|
|
30811
|
-
(p) =>
|
|
30937
|
+
(p) => existsSync49(resolve45(process.cwd(), "public", p.replace(/^\//, "")))
|
|
30812
30938
|
);
|
|
30813
30939
|
var SW_SOURCE = (() => {
|
|
30814
30940
|
try {
|
|
30815
|
-
return
|
|
30941
|
+
return readFileSync46(resolve45(process.cwd(), "public", "sw.js"), "utf-8");
|
|
30816
30942
|
} catch {
|
|
30817
30943
|
return null;
|
|
30818
30944
|
}
|
|
@@ -30821,8 +30947,8 @@ function readInstalledVersion() {
|
|
|
30821
30947
|
try {
|
|
30822
30948
|
if (!PLATFORM_ROOT6) return "unknown";
|
|
30823
30949
|
const versionFile = join52(PLATFORM_ROOT6, "config", `.${BRAND.hostname}-version`);
|
|
30824
|
-
if (!
|
|
30825
|
-
const content =
|
|
30950
|
+
if (!existsSync49(versionFile)) return "unknown";
|
|
30951
|
+
const content = readFileSync46(versionFile, "utf-8").trim();
|
|
30826
30952
|
return content || "unknown";
|
|
30827
30953
|
} catch {
|
|
30828
30954
|
return "unknown";
|
|
@@ -30833,7 +30959,7 @@ var versionScript = `<script>window.__MAXY_VERSION__=${JSON.stringify(INSTALLED_
|
|
|
30833
30959
|
function cachedHtml(file) {
|
|
30834
30960
|
let html = htmlCache.get(file);
|
|
30835
30961
|
if (!html) {
|
|
30836
|
-
html =
|
|
30962
|
+
html = readFileSync46(resolve45(process.cwd(), "public", file), "utf-8");
|
|
30837
30963
|
const productNameEsc = escapeHtml(BRAND.productName);
|
|
30838
30964
|
html = html.replace(/<title>([^<]*)<\/title>/, (_match, inner) => `<title>${escapeHtml(inner).replace(/Maxy/g, productNameEsc)}</title>`);
|
|
30839
30965
|
html = html.replace('href="/favicon.ico"', `href="${escapeHtml(brandFaviconPath)}"`);
|
|
@@ -30855,8 +30981,8 @@ function loadBrandingCache(agentSlug) {
|
|
|
30855
30981
|
const accountId = getDefaultAccountId();
|
|
30856
30982
|
if (!accountId) return null;
|
|
30857
30983
|
const cachePath = join52(configDir, "branding-cache", accountId, `${agentSlug}.json`);
|
|
30858
|
-
if (!
|
|
30859
|
-
return JSON.parse(
|
|
30984
|
+
if (!existsSync49(cachePath)) return null;
|
|
30985
|
+
return JSON.parse(readFileSync46(cachePath, "utf-8"));
|
|
30860
30986
|
} catch {
|
|
30861
30987
|
return null;
|
|
30862
30988
|
}
|
|
@@ -30951,7 +31077,7 @@ app75.use("/vnc-popout.html", logViewerFetch);
|
|
|
30951
31077
|
app75.get("/vnc-popout.html", (c) => {
|
|
30952
31078
|
let html = htmlCache.get("vnc-popout.html");
|
|
30953
31079
|
if (!html) {
|
|
30954
|
-
html =
|
|
31080
|
+
html = readFileSync46(resolve45(process.cwd(), "public", "vnc-popout.html"), "utf-8");
|
|
30955
31081
|
const name = escapeHtml(BRAND.productName);
|
|
30956
31082
|
html = html.replace("<title>Browser \u2014 Maxy</title>", `<title>${name}</title>`);
|
|
30957
31083
|
html = html.replace("</head>", ` ${brandScript}
|
|
@@ -31104,9 +31230,9 @@ var httpServer = serve({ fetch: app75.fetch, port, hostname });
|
|
|
31104
31230
|
console.log(`${BRAND.productName} listening on http://${hostname}:${port}`);
|
|
31105
31231
|
{
|
|
31106
31232
|
const reconcilePlatformRoot = process.env.MAXY_PLATFORM_ROOT ?? join52(__dirname, "..");
|
|
31107
|
-
const reconcileScript =
|
|
31233
|
+
const reconcileScript = resolve45(reconcilePlatformRoot, "plugins/scheduling/mcp/dist/scripts/reconcile-bookings.js");
|
|
31108
31234
|
const runReconcile = (ctx) => {
|
|
31109
|
-
if (!
|
|
31235
|
+
if (!existsSync49(reconcileScript)) return;
|
|
31110
31236
|
try {
|
|
31111
31237
|
const child = spawn3(process.execPath, [reconcileScript], {
|
|
31112
31238
|
env: { ...process.env, PLATFORM_ROOT: reconcilePlatformRoot },
|
|
@@ -31145,14 +31271,14 @@ console.log(`${BRAND.productName} listening on http://${hostname}:${port}`);
|
|
|
31145
31271
|
{
|
|
31146
31272
|
const DREAM_CYCLE_SWEEP_INTERVAL_MS = 36e5;
|
|
31147
31273
|
const dreamPlatformRoot = process.env.MAXY_PLATFORM_ROOT ?? join52(__dirname, "..");
|
|
31148
|
-
const dreamSweepScript =
|
|
31274
|
+
const dreamSweepScript = resolve45(dreamPlatformRoot, "plugins/memory/mcp/dist/scripts/dream-cycle-sweep.js");
|
|
31149
31275
|
registerLoop({
|
|
31150
31276
|
name: "dream-cycle-sweep",
|
|
31151
31277
|
intervalMs: DREAM_CYCLE_SWEEP_INTERVAL_MS,
|
|
31152
31278
|
firstRunDelayMs: 3e4,
|
|
31153
31279
|
detached: true,
|
|
31154
31280
|
run: (ctx) => {
|
|
31155
|
-
if (!
|
|
31281
|
+
if (!existsSync49(dreamSweepScript)) return;
|
|
31156
31282
|
try {
|
|
31157
31283
|
const child = spawn3(process.execPath, [dreamSweepScript], {
|
|
31158
31284
|
env: { ...process.env, PLATFORM_ROOT: dreamPlatformRoot },
|
|
@@ -31169,10 +31295,10 @@ console.log(`${BRAND.productName} listening on http://${hostname}:${port}`);
|
|
|
31169
31295
|
}
|
|
31170
31296
|
{
|
|
31171
31297
|
const outlookPlatformRoot = process.env.MAXY_PLATFORM_ROOT ?? join52(__dirname, "..");
|
|
31172
|
-
const outlookScript =
|
|
31298
|
+
const outlookScript = resolve45(outlookPlatformRoot, "plugins/outlook/mcp/dist/scripts/complete-registration.js");
|
|
31173
31299
|
const OUTLOOK_COMPLETE_INTERVAL_MS = 3e4;
|
|
31174
31300
|
const runOutlookComplete = (ctx) => {
|
|
31175
|
-
if (!
|
|
31301
|
+
if (!existsSync49(outlookScript)) return;
|
|
31176
31302
|
try {
|
|
31177
31303
|
const child = spawn3(process.execPath, [outlookScript], {
|
|
31178
31304
|
env: { ...process.env, PLATFORM_ROOT: outlookPlatformRoot },
|
|
@@ -31195,18 +31321,18 @@ console.log(`${BRAND.productName} listening on http://${hostname}:${port}`);
|
|
|
31195
31321
|
}
|
|
31196
31322
|
{
|
|
31197
31323
|
const auditRoot = process.env.MAXY_PLATFORM_ROOT ?? join52(__dirname, "..");
|
|
31198
|
-
const strandedAccountsDir =
|
|
31324
|
+
const strandedAccountsDir = resolve45(auditRoot, "..", "data/accounts");
|
|
31199
31325
|
const STRANDED_AUDIT_INTERVAL_MS = 3e5;
|
|
31200
31326
|
const STRANDED_AGE_MS = 16 * 6e4;
|
|
31201
31327
|
const STRANDED_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
31202
31328
|
const runStrandedAudit = () => {
|
|
31203
31329
|
try {
|
|
31204
|
-
if (!
|
|
31330
|
+
if (!existsSync49(strandedAccountsDir)) return;
|
|
31205
31331
|
const now = Date.now();
|
|
31206
|
-
for (const name of
|
|
31332
|
+
for (const name of readdirSync29(strandedAccountsDir)) {
|
|
31207
31333
|
if (!STRANDED_UUID_RE.test(name)) continue;
|
|
31208
|
-
const pendingPath2 =
|
|
31209
|
-
if (!
|
|
31334
|
+
const pendingPath2 = resolve45(strandedAccountsDir, name, "secrets/outlook/pending-devicecode.enc");
|
|
31335
|
+
if (!existsSync49(pendingPath2)) continue;
|
|
31210
31336
|
const ageMs2 = now - statSync25(pendingPath2).mtimeMs;
|
|
31211
31337
|
if (ageMs2 > STRANDED_AGE_MS) {
|
|
31212
31338
|
console.error(`[outlook-mcp] devicecode-stranded account=${name} ageSec=${Math.floor(ageMs2 / 1e3)}`);
|
|
@@ -31225,7 +31351,7 @@ console.log(`${BRAND.productName} listening on http://${hostname}:${port}`);
|
|
|
31225
31351
|
}
|
|
31226
31352
|
{
|
|
31227
31353
|
const googleRoot = process.env.MAXY_PLATFORM_ROOT ?? join52(__dirname, "..");
|
|
31228
|
-
const googleAccountsDir =
|
|
31354
|
+
const googleAccountsDir = resolve45(googleRoot, "..", "data/accounts");
|
|
31229
31355
|
const GOOGLE_PENDING_AUDIT_INTERVAL_MS = 3e5;
|
|
31230
31356
|
const runGooglePendingAuditSafe = () => {
|
|
31231
31357
|
try {
|
|
@@ -31240,10 +31366,10 @@ console.log(`${BRAND.productName} listening on http://${hostname}:${port}`);
|
|
|
31240
31366
|
firstRunDelayMs: 27e3,
|
|
31241
31367
|
run: runGooglePendingAuditSafe
|
|
31242
31368
|
});
|
|
31243
|
-
const googleAuditScript =
|
|
31369
|
+
const googleAuditScript = resolve45(googleRoot, "plugins/google/mcp/dist/scripts/account-audit.js");
|
|
31244
31370
|
const GOOGLE_ACCOUNT_AUDIT_INTERVAL_MS = 36e5;
|
|
31245
31371
|
const runGoogleAccountAudit = (ctx) => {
|
|
31246
|
-
if (!
|
|
31372
|
+
if (!existsSync49(googleAuditScript)) return;
|
|
31247
31373
|
try {
|
|
31248
31374
|
const child = spawn3(process.execPath, [googleAuditScript], {
|
|
31249
31375
|
env: { ...process.env, PLATFORM_ROOT: googleRoot },
|
|
@@ -31336,7 +31462,7 @@ console.log(`${BRAND.productName} listening on http://${hostname}:${port}`);
|
|
|
31336
31462
|
}
|
|
31337
31463
|
{
|
|
31338
31464
|
const publishPlatformRoot = process.env.MAXY_PLATFORM_ROOT ?? join52(__dirname, "..");
|
|
31339
|
-
const publishScript =
|
|
31465
|
+
const publishScript = resolve45(publishPlatformRoot, "plugins/scheduling/mcp/dist/scripts/publish-availability.js");
|
|
31340
31466
|
const PUBLISH_INTERVAL_MS = 3e5;
|
|
31341
31467
|
const bookingAccounts = () => {
|
|
31342
31468
|
try {
|
|
@@ -31347,7 +31473,7 @@ console.log(`${BRAND.productName} listening on http://${hostname}:${port}`);
|
|
|
31347
31473
|
}
|
|
31348
31474
|
};
|
|
31349
31475
|
const spawnPublish = (account, ctx) => {
|
|
31350
|
-
if (!
|
|
31476
|
+
if (!existsSync49(publishScript)) return;
|
|
31351
31477
|
try {
|
|
31352
31478
|
const child = spawn3(process.execPath, [publishScript], {
|
|
31353
31479
|
env: {
|
|
@@ -31366,21 +31492,21 @@ console.log(`${BRAND.productName} listening on http://${hostname}:${port}`);
|
|
|
31366
31492
|
}
|
|
31367
31493
|
};
|
|
31368
31494
|
const auditSnapshotAge = (account) => {
|
|
31369
|
-
const availPath =
|
|
31495
|
+
const availPath = resolve45(account.accountDir, "calendar-availability.json");
|
|
31370
31496
|
let hasBookingSite = false;
|
|
31371
31497
|
try {
|
|
31372
|
-
if (
|
|
31373
|
-
const cfg = JSON.parse(
|
|
31498
|
+
if (existsSync49(availPath)) {
|
|
31499
|
+
const cfg = JSON.parse(readFileSync46(availPath, "utf-8"));
|
|
31374
31500
|
hasBookingSite = typeof cfg.bookingDbName === "string" && cfg.bookingDbName.length > 0;
|
|
31375
31501
|
}
|
|
31376
31502
|
} catch {
|
|
31377
31503
|
}
|
|
31378
31504
|
if (!hasBookingSite) return;
|
|
31379
|
-
const statePath =
|
|
31505
|
+
const statePath = resolve45(account.accountDir, "state", "booking-availability", "last-publish.json");
|
|
31380
31506
|
let lastSuccessAt = null;
|
|
31381
|
-
if (
|
|
31507
|
+
if (existsSync49(statePath)) {
|
|
31382
31508
|
try {
|
|
31383
|
-
const rec = JSON.parse(
|
|
31509
|
+
const rec = JSON.parse(readFileSync46(statePath, "utf-8"));
|
|
31384
31510
|
lastSuccessAt = rec.lastSuccessAt ?? null;
|
|
31385
31511
|
} catch {
|
|
31386
31512
|
console.error(`[calendar-availability] op=audit accountId=${account.accountId} snapshotAgeMs=na reason=bad-state-file`);
|
|
@@ -31413,11 +31539,11 @@ startTimeEntryCensus(() => getSession());
|
|
|
31413
31539
|
startLedgerCensus(() => getSession());
|
|
31414
31540
|
{
|
|
31415
31541
|
const auditPlatformRoot = process.env.MAXY_PLATFORM_ROOT ?? join52(__dirname, "..");
|
|
31416
|
-
const auditScript =
|
|
31542
|
+
const auditScript = resolve45(auditPlatformRoot, "plugins/connector/mcp/dist/scripts/audit-connectors.js");
|
|
31417
31543
|
const auditLogDir = process.env.LOG_DIR ?? LOG_DIR;
|
|
31418
31544
|
const CONNECTOR_AUDIT_INTERVAL_MS = 3e5;
|
|
31419
31545
|
const runConnectorAudit = (ctx) => {
|
|
31420
|
-
if (!
|
|
31546
|
+
if (!existsSync49(auditScript)) return;
|
|
31421
31547
|
try {
|
|
31422
31548
|
const child = spawn3(process.execPath, [auditScript], {
|
|
31423
31549
|
env: { ...process.env, PLATFORM_ROOT: auditPlatformRoot, LOG_DIR: auditLogDir },
|
|
@@ -31537,11 +31663,11 @@ try {
|
|
|
31537
31663
|
var ADMINUSER_RECONCILE_INTERVAL_MS = 60 * 60 * 1e3;
|
|
31538
31664
|
async function runAdminUserReconcileTick() {
|
|
31539
31665
|
try {
|
|
31540
|
-
if (!
|
|
31666
|
+
if (!existsSync49(USERS_FILE)) {
|
|
31541
31667
|
console.error("[adminuser-self-heal] skip reason=no-users-file");
|
|
31542
31668
|
return;
|
|
31543
31669
|
}
|
|
31544
|
-
const usersRaw =
|
|
31670
|
+
const usersRaw = readFileSync46(USERS_FILE, "utf-8").trim();
|
|
31545
31671
|
if (!usersRaw) {
|
|
31546
31672
|
console.error("[adminuser-self-heal] skip reason=empty-users-file");
|
|
31547
31673
|
return;
|
|
@@ -31593,8 +31719,8 @@ registerLoop({
|
|
|
31593
31719
|
});
|
|
31594
31720
|
var USERS_RECONCILE_INTERVAL_MS = 60 * 60 * 1e3;
|
|
31595
31721
|
function countUsersRows() {
|
|
31596
|
-
if (!
|
|
31597
|
-
const raw =
|
|
31722
|
+
if (!existsSync49(USERS_FILE)) return 0;
|
|
31723
|
+
const raw = readFileSync46(USERS_FILE, "utf-8").trim();
|
|
31598
31724
|
if (!raw) return 0;
|
|
31599
31725
|
const users = JSON.parse(raw);
|
|
31600
31726
|
return users.filter((u) => typeof u.userId === "string").length;
|
|
@@ -31728,7 +31854,7 @@ if (bootAccountConfig?.whatsapp) {
|
|
|
31728
31854
|
}
|
|
31729
31855
|
init({
|
|
31730
31856
|
configDir: configDirForWhatsApp,
|
|
31731
|
-
platformRoot:
|
|
31857
|
+
platformRoot: resolve45(process.env.MAXY_PLATFORM_ROOT ?? join52(__dirname, "..")),
|
|
31732
31858
|
accountConfig: bootAccountConfig,
|
|
31733
31859
|
// Task 2074 — enrich with the sub-account name and fan out to every open
|
|
31734
31860
|
// admin SSE stream. Fire-and-forget: the manager's persist path must not
|