@rubytech/create-realagent 1.0.642 → 1.0.644
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/graph-mcp/dist/index.js +7 -1
- package/payload/platform/lib/graph-mcp/dist/index.js.map +1 -1
- package/payload/platform/lib/graph-mcp/src/index.ts +9 -1
- package/payload/platform/plugins/admin/mcp/dist/index.js +12 -1
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/mcp/dist/lib/neo4j.d.ts.map +1 -1
- package/payload/platform/plugins/admin/mcp/dist/lib/neo4j.js +7 -1
- package/payload/platform/plugins/admin/mcp/dist/lib/neo4j.js.map +1 -1
- package/payload/platform/plugins/contacts/mcp/dist/lib/neo4j.d.ts.map +1 -1
- package/payload/platform/plugins/contacts/mcp/dist/lib/neo4j.js +7 -1
- package/payload/platform/plugins/contacts/mcp/dist/lib/neo4j.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/neo4j.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/neo4j.js +7 -1
- package/payload/platform/plugins/email/mcp/dist/lib/neo4j.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/scripts/email-auto-respond.js +8 -1
- package/payload/platform/plugins/email/mcp/dist/scripts/email-auto-respond.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.js +7 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/neo4j.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/neo4j.js +7 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/neo4j.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +14 -2
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
- package/payload/platform/plugins/tasks/mcp/dist/lib/neo4j.d.ts.map +1 -1
- package/payload/platform/plugins/tasks/mcp/dist/lib/neo4j.js +7 -1
- package/payload/platform/plugins/tasks/mcp/dist/lib/neo4j.js.map +1 -1
- package/payload/platform/plugins/waitlist/mcp/dist/lib/neo4j.d.ts.map +1 -1
- package/payload/platform/plugins/waitlist/mcp/dist/lib/neo4j.js +7 -1
- package/payload/platform/plugins/waitlist/mcp/dist/lib/neo4j.js.map +1 -1
- package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-setup.d.ts.map +1 -1
- package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-setup.js +6 -0
- package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-setup.js.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/index.js +16 -0
- package/payload/platform/plugins/workflows/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/lib/active-runs.d.ts +38 -0
- package/payload/platform/plugins/workflows/mcp/dist/lib/active-runs.d.ts.map +1 -0
- package/payload/platform/plugins/workflows/mcp/dist/lib/active-runs.js +82 -0
- package/payload/platform/plugins/workflows/mcp/dist/lib/active-runs.js.map +1 -0
- package/payload/platform/plugins/workflows/mcp/dist/lib/neo4j.d.ts.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/lib/neo4j.js +7 -1
- package/payload/platform/plugins/workflows/mcp/dist/lib/neo4j.js.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.d.ts.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js +35 -0
- package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js.map +1 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.d.ts.map +1 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.js +7 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.js.map +1 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/src/lib/neo4j.ts +9 -1
- package/payload/server/public/assets/{admin-jpGCzN83.js → admin-k3A7-7ra.js} +30 -30
- package/payload/server/public/assets/{arc-DaD1u5gI.js → arc-DcrodP5U.js} +1 -1
- package/payload/server/public/assets/architecture-YZFGNWBL-C38eyeNF.js +1 -0
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-OaixqJSY.js → architectureDiagram-Q4EWVU46-Cvo_8X6C.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-ChbWwdfi.js → blockDiagram-DXYQGD6D-CEK06TEn.js} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-6r7dvkBG.js → c4Diagram-AHTNJAMY-QjYUSwTU.js} +1 -1
- package/payload/server/public/assets/channel-D0dIwjlN.js +1 -0
- package/payload/server/public/assets/{chunk-2KRD3SAO-DNeXC6EU.js → chunk-2KRD3SAO-BBifNfFc.js} +1 -1
- package/payload/server/public/assets/{chunk-336JU56O-CZH22klX.js → chunk-336JU56O-B-N_zWuf.js} +2 -2
- package/payload/server/public/assets/chunk-426QAEUC-C8oXXITm.js +1 -0
- package/payload/server/public/assets/{chunk-4BX2VUAB-IcfD9Mfv.js → chunk-4BX2VUAB-CtDQKj9B.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-CKA9rXZu.js → chunk-4TB4RGXK-Dnu9n3p1.js} +1 -1
- package/payload/server/public/assets/{chunk-55IACEB6-B65N4qpl.js → chunk-55IACEB6-DSLoJJSj.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-u7p0S5bJ.js → chunk-5FUZZQ4R-rx-IvMNE.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-B1E88VcH.js → chunk-5PVQY5BW-B9w9AKCS.js} +1 -1
- package/payload/server/public/assets/{chunk-67CJDMHE-DIue23pI.js → chunk-67CJDMHE-C1yEjtiu.js} +1 -1
- package/payload/server/public/assets/{chunk-7N4EOEYR-BQ9OzsfS.js → chunk-7N4EOEYR-C2f3zeVH.js} +1 -1
- package/payload/server/public/assets/{chunk-AA7GKIK3-RpSCHdZM.js → chunk-AA7GKIK3-B_U-NsDK.js} +1 -1
- package/payload/server/public/assets/{chunk-BSJP7CBP-Dg2E_8Wn.js → chunk-BSJP7CBP-DM6_wafW.js} +1 -1
- package/payload/server/public/assets/{chunk-CIAEETIT-BKZA8eJP.js → chunk-CIAEETIT-DG7WkfNj.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-jDBKFDJB.js → chunk-EDXVE4YY-aS3_rdwQ.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-CAHIipTH.js → chunk-ENJZ2VHE-r1I0uoCf.js} +1 -1
- package/payload/server/public/assets/{chunk-FMBD7UC4-FHlW2hpP.js → chunk-FMBD7UC4-CTm3YRE5.js} +1 -1
- package/payload/server/public/assets/{chunk-FOC6F5B3-CAIHldV7.js → chunk-FOC6F5B3-CAIttx3K.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-C9ojfLDm.js → chunk-ICPOFSXX-DQFV4c1l.js} +2 -2
- package/payload/server/public/assets/{chunk-K5T4RW27-HA4lma0b.js → chunk-K5T4RW27-B2WCPQBa.js} +1 -1
- package/payload/server/public/assets/{chunk-KGLVRYIC-CimijL8o.js → chunk-KGLVRYIC-C6w2sUOF.js} +1 -1
- package/payload/server/public/assets/{chunk-LIHQZDEY-B5hk7dNX.js → chunk-LIHQZDEY-BT1hcDTK.js} +1 -1
- package/payload/server/public/assets/{chunk-ORNJ4GCN-BVm-YmZh.js → chunk-ORNJ4GCN-Brl32BSe.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-Bc8ZyHQH.js → chunk-OYMX7WX6-BCO6n1CX.js} +1 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-BE_lylks.js +1 -0
- package/payload/server/public/assets/{chunk-U2HBQHQK-CgwbVvji.js → chunk-U2HBQHQK-BvgC0fpb.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-D4PiRakQ.js → chunk-X2U36JSP-3yLdcqYf.js} +1 -1
- package/payload/server/public/assets/{chunk-XPW4576I-DgiaNQ32.js → chunk-XPW4576I-D876RWxK.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-jgwS2uNT.js → chunk-YZCP3GAM-CiuA4hOC.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-UdCCrEj5.js → chunk-ZZ45TVLE-COjEBPzv.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-DH37CWIF.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DNJ7bv8r.js +1 -0
- package/payload/server/public/assets/clone-rrGuX3ZR.js +1 -0
- package/payload/server/public/assets/{cose-bilkent-S5V4N54A-D8laakap.js → cose-bilkent-S5V4N54A-Dap0yL0o.js} +1 -1
- package/payload/server/public/assets/{dagre-3T6_8Ajq.js → dagre-DBbjK-Cf.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-CzjS08zx.js → dagre-KV5264BT-DEia9UJj.js} +1 -1
- package/payload/server/public/assets/data-CrTM-LA6.js +1 -0
- package/payload/server/public/assets/{diagram-5BDNPKRD-eG7XwxOn.js → diagram-5BDNPKRD-CWSP9MzJ.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-DmVrtCUt.js → diagram-G4DWMVQ6-DWRsfitL.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-ER1KP2RD.js → diagram-MMDJMWI5-n-jyzS4D.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-kH-bn3pm.js → diagram-TYMM5635-CLPTbfLq.js} +1 -1
- package/payload/server/public/assets/{dist-Dl3zB445.js → dist-Tkw8EOuG.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-Clya83Yf.js → erDiagram-SMLLAGMA-CmPC9Cnc.js} +1 -1
- package/payload/server/public/assets/{flatten-DOi5FhnR.js → flatten-Db2kUB5j.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-BG1UIazn.js → flowDiagram-DWJPFMVM-DKMNmUbX.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BF6t7cgR.js → ganttDiagram-T4ZO3ILL-C5-y3w-l.js} +1 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-CCjgA3FG.js +1 -0
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-GeyVCma5.js → gitGraphDiagram-UUTBAWPF-D9hG5kTg.js} +1 -1
- package/payload/server/public/assets/{graphlib-CvvxOMJO.js → graphlib-StP6GUhM.js} +1 -1
- package/payload/server/public/assets/info-OMHHGYJF-B65K6dQJ.js +1 -0
- package/payload/server/public/assets/infoDiagram-42DDH7IO-DUJfTICr.js +2 -0
- package/payload/server/public/assets/{isEmpty-BlYSjjLF.js → isEmpty-CXH_nKTs.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-CC_sxiqJ.js → ishikawaDiagram-UXIWVN3A--K4KOS61.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-T5_FJJp9.js → journeyDiagram-VCZTEJTY-DE-28YrW.js} +1 -1
- package/payload/server/public/assets/jsx-runtime-57sjl-2n.js +9 -0
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-DmX2Qjbn.js → kanban-definition-6JOO6SKY-CxSHjau2.js} +1 -1
- package/payload/server/public/assets/{line-N5bPNRcv.js → line-DbcqYIG0.js} +1 -1
- package/payload/server/public/assets/{linear-2x7ZHX-K.js → linear-DXHoZSN3.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-C66sw0ru.js → mermaid-parser.core-CNGUA13J.js} +2 -2
- package/payload/server/public/assets/{mermaid.core-C_cBOsxO.js → mermaid.core-IQgx_upQ.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-gBgI6iwA.js → mindmap-definition-QFDTVHPH-BT9Up6-C.js} +1 -1
- package/payload/server/public/assets/{ordinal-Crx1uav8.js → ordinal-CN3oz6oW.js} +1 -1
- package/payload/server/public/assets/packet-4T2RLAQJ-fp5ishAK.js +1 -0
- package/payload/server/public/assets/pie-ZZUOXDRM-Bc3VMuuU.js +1 -0
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-DU2SKMGa.js → pieDiagram-DEJITSTG-BuewQTi6.js} +1 -1
- package/payload/server/public/assets/public-BjWvJQTw.js +5 -0
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CfTfCdKE.js → quadrantDiagram-34T5L4WZ-Cu8y2zQL.js} +1 -1
- package/payload/server/public/assets/radar-PYXPWWZC-D9jy5QAa.js +1 -0
- package/payload/server/public/assets/{reduce-DhQ6Q49z.js → reduce-SDh8_UdG.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-CdJ1ecPK.js → requirementDiagram-MS252O5E-DiT9bo27.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-C6oTo_BW.js → sankeyDiagram-XADWPNL6-EkRnGTxM.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-DZhUqa93.js → sequenceDiagram-FGHM5R23-BUiQA3SI.js} +1 -1
- package/payload/server/public/assets/share-2-CQp5pId4.js +1 -0
- package/payload/server/public/assets/{src-CE18leCm.js → src-DQQCRlaQ.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-BHHHyE3Q.js → stateDiagram-FHFEXIEX-Fij35Tic.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DQzhSd8K.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-CO7-xxpE.js → timeline-definition-GMOUNBTQ-BMsyr7wU.js} +1 -1
- package/payload/server/public/assets/treeView-SZITEDCU-CHyRL9e4.js +1 -0
- package/payload/server/public/assets/treemap-W4RFUUIX-DpQ_FOO6.js +1 -0
- package/payload/server/public/assets/useVoiceRecorder-BMxkndFD.js +36 -0
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-CLOInE0r.js → vennDiagram-DHZGUBPP-6fegYFB3.js} +1 -1
- package/payload/server/public/assets/wardley-RL74JXVD-CWBIAatW.js +1 -0
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-BjgSwG0b.js → wardleyDiagram-NUSXRM2D-BtJ_B35h.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-B3z4BK4L.js → xychartDiagram-5P7HB3ND-DJ20B4NY.js} +1 -1
- package/payload/server/public/data.html +17 -0
- package/payload/server/public/index.html +7 -5
- package/payload/server/public/public.html +6 -5
- package/payload/server/server.js +247 -133
- package/payload/server/public/assets/architecture-YZFGNWBL-BUDIBJAP.js +0 -1
- package/payload/server/public/assets/channel-BrpIlIyG.js +0 -1
- package/payload/server/public/assets/chunk-426QAEUC-GSccNhhE.js +0 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-tM7_0fxy.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-C4ZqhHGM.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DiXqUWgc.js +0 -1
- package/payload/server/public/assets/clone-BdpG6seo.js +0 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-DDaWNf-D.js +0 -1
- package/payload/server/public/assets/info-OMHHGYJF-CzeItRxz.js +0 -1
- package/payload/server/public/assets/infoDiagram-42DDH7IO-CI_73SMs.js +0 -2
- package/payload/server/public/assets/packet-4T2RLAQJ-B22Ofvhw.js +0 -1
- package/payload/server/public/assets/pie-ZZUOXDRM-Pt4vBFsr.js +0 -1
- package/payload/server/public/assets/public-DdVq1Jag.js +0 -5
- package/payload/server/public/assets/radar-PYXPWWZC-C6F-a-Hg.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-5wdzy-za.js +0 -1
- package/payload/server/public/assets/treeView-SZITEDCU-BHz6YkPq.js +0 -1
- package/payload/server/public/assets/treemap-W4RFUUIX-qbRo1jie.js +0 -1
- package/payload/server/public/assets/useVoiceRecorder-3Qblv7wH.js +0 -44
- package/payload/server/public/assets/wardley-RL74JXVD-BVKDrbVC.js +0 -1
- /package/payload/server/public/assets/{_baseFor-DxqHO4yN.js → _baseFor-D71p92tl.js} +0 -0
- /package/payload/server/public/assets/{array-B0pZ4ajb.js → array-Bs_owIvv.js} +0 -0
- /package/payload/server/public/assets/{chunk-Be6NvmcD.js → chunk-lgnzUk6H.js} +0 -0
- /package/payload/server/public/assets/{cytoscape.esm-yP0g-0RD.js → cytoscape.esm-DLG5qhup.js} +0 -0
- /package/payload/server/public/assets/{defaultLocale-DOAzocMZ.js → defaultLocale-Du_2bjyv.js} +0 -0
- /package/payload/server/public/assets/{init-JRXXbB84.js → init-BYLBkHX_.js} +0 -0
- /package/payload/server/public/assets/{useVoiceRecorder-BNLXzSN4.css → jsx-runtime-BNLXzSN4.css} +0 -0
- /package/payload/server/public/assets/{katex-zjckjCBG.js → katex-lkho_UhZ.js} +0 -0
- /package/payload/server/public/assets/{path-DX61D_oX.js → path-BO54iFkf.js} +0 -0
- /package/payload/server/public/assets/{preload-helper-rov5CBGT.js → preload-helper-DWTEM3RW.js} +0 -0
- /package/payload/server/public/assets/{rough.esm-Cs8YDIX4.js → rough.esm-BCiZEpQC.js} +0 -0
package/payload/server/server.js
CHANGED
|
@@ -1,8 +1,28 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __commonJS = (cb, mod) => function __require() {
|
|
8
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
19
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
20
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
21
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
22
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
23
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
24
|
+
mod
|
|
25
|
+
));
|
|
6
26
|
|
|
7
27
|
// ../lib/models/dist/index.js
|
|
8
28
|
var require_dist = __commonJS({
|
|
@@ -2636,8 +2656,8 @@ var createAdaptorServer = (options) => {
|
|
|
2636
2656
|
overrideGlobalObjects: options.overrideGlobalObjects,
|
|
2637
2657
|
autoCleanupIncoming: options.autoCleanupIncoming
|
|
2638
2658
|
});
|
|
2639
|
-
const
|
|
2640
|
-
const server =
|
|
2659
|
+
const createServer = options.createServer || createServerHTTP;
|
|
2660
|
+
const server = createServer(options.serverOptions || {}, requestListener);
|
|
2641
2661
|
return server;
|
|
2642
2662
|
};
|
|
2643
2663
|
var serve = (options, listeningListener) => {
|
|
@@ -2872,7 +2892,7 @@ var serveStatic = (options = { root: "" }) => {
|
|
|
2872
2892
|
};
|
|
2873
2893
|
|
|
2874
2894
|
// server/index.ts
|
|
2875
|
-
import { readFileSync as
|
|
2895
|
+
import { readFileSync as readFileSync29, existsSync as existsSync29, watchFile } from "fs";
|
|
2876
2896
|
import { resolve as resolve32, join as join15, basename as basename8 } from "path";
|
|
2877
2897
|
import { homedir as homedir5 } from "os";
|
|
2878
2898
|
|
|
@@ -3820,23 +3840,32 @@ var HOP_BY_HOP2 = /* @__PURE__ */ new Set([
|
|
|
3820
3840
|
"transfer-encoding",
|
|
3821
3841
|
"upgrade"
|
|
3822
3842
|
]);
|
|
3843
|
+
var cachedUpstreamPort = null;
|
|
3823
3844
|
function resolveUpstreamPort() {
|
|
3824
|
-
|
|
3845
|
+
if (cachedUpstreamPort !== null) return cachedUpstreamPort;
|
|
3846
|
+
const uri = process.env.NEO4J_URI;
|
|
3847
|
+
if (!uri) {
|
|
3848
|
+
throw new Error(
|
|
3849
|
+
"[ui/graph-proxy] NEO4J_URI unset \u2014 refusing to default to bolt://localhost:7687 (Task 580)"
|
|
3850
|
+
);
|
|
3851
|
+
}
|
|
3825
3852
|
const m = uri.match(/:(\d+)$/);
|
|
3826
3853
|
const boltPort = m ? parseInt(m[1], 10) : 7687;
|
|
3827
|
-
|
|
3854
|
+
cachedUpstreamPort = boltPort - 213;
|
|
3855
|
+
console.error(`[ui/graph-proxy] resolved neo4j_uri=${uri} http_port=${cachedUpstreamPort}`);
|
|
3856
|
+
return cachedUpstreamPort;
|
|
3828
3857
|
}
|
|
3829
3858
|
var UPSTREAM_HOST = "127.0.0.1";
|
|
3830
|
-
var UPSTREAM_PORT = resolveUpstreamPort();
|
|
3831
3859
|
function attachGraphHttpRoutes(app2) {
|
|
3832
3860
|
const handler = async (c) => {
|
|
3833
3861
|
const raw2 = c.req.raw;
|
|
3834
3862
|
const url = new URL(raw2.url);
|
|
3863
|
+
const upstreamPort = resolveUpstreamPort();
|
|
3835
3864
|
const pathAfterPrefix = url.pathname.slice(GRAPH_PREFIX.length) || "/";
|
|
3836
|
-
const upstreamUrl = `http://${UPSTREAM_HOST}:${
|
|
3865
|
+
const upstreamUrl = `http://${UPSTREAM_HOST}:${upstreamPort}${pathAfterPrefix}${url.search}`;
|
|
3837
3866
|
const upstreamHeaders = new Headers(raw2.headers);
|
|
3838
3867
|
for (const h of HOP_BY_HOP2) upstreamHeaders.delete(h);
|
|
3839
|
-
upstreamHeaders.set("host", `${UPSTREAM_HOST}:${
|
|
3868
|
+
upstreamHeaders.set("host", `${UPSTREAM_HOST}:${upstreamPort}`);
|
|
3840
3869
|
try {
|
|
3841
3870
|
const upstream = await fetch(upstreamUrl, {
|
|
3842
3871
|
method: raw2.method,
|
|
@@ -3849,6 +3878,11 @@ function attachGraphHttpRoutes(app2) {
|
|
|
3849
3878
|
});
|
|
3850
3879
|
const resHeaders = new Headers(upstream.headers);
|
|
3851
3880
|
for (const h of HOP_BY_HOP2) resHeaders.delete(h);
|
|
3881
|
+
const loc = resHeaders.get("location");
|
|
3882
|
+
if (loc) {
|
|
3883
|
+
const rewritten = rewriteLocation(loc);
|
|
3884
|
+
if (rewritten !== loc) resHeaders.set("location", rewritten);
|
|
3885
|
+
}
|
|
3852
3886
|
return new Response(upstream.body, {
|
|
3853
3887
|
status: upstream.status,
|
|
3854
3888
|
statusText: upstream.statusText,
|
|
@@ -3900,13 +3934,14 @@ function attachGraphWsProxy(server, opts) {
|
|
|
3900
3934
|
}
|
|
3901
3935
|
const rewrittenPath = pathname === GRAPH_PREFIX ? "/" : pathname.slice(GRAPH_PREFIX.length);
|
|
3902
3936
|
const rewrittenUrl = qsIndex === -1 ? rewrittenPath : rewrittenPath + url.slice(qsIndex);
|
|
3903
|
-
const
|
|
3937
|
+
const upstreamPort = resolveUpstreamPort();
|
|
3938
|
+
const upstream = createConnection2({ host: UPSTREAM_HOST, port: upstreamPort });
|
|
3904
3939
|
upstream.setTimeout(UPSTREAM_TIMEOUT_MS2);
|
|
3905
3940
|
upstream.once("connect", () => {
|
|
3906
3941
|
upstream.setTimeout(0);
|
|
3907
3942
|
const lines = [];
|
|
3908
3943
|
lines.push(`${req.method ?? "GET"} ${rewrittenUrl} HTTP/${req.httpVersion}`);
|
|
3909
|
-
lines.push(`host: ${UPSTREAM_HOST}:${
|
|
3944
|
+
lines.push(`host: ${UPSTREAM_HOST}:${upstreamPort}`);
|
|
3910
3945
|
for (const [name, value] of Object.entries(req.headers)) {
|
|
3911
3946
|
if (name === "host") continue;
|
|
3912
3947
|
if (HOP_BY_HOP2.has(name)) continue;
|
|
@@ -3978,6 +4013,21 @@ function headerString2(value) {
|
|
|
3978
4013
|
if (value == null) return void 0;
|
|
3979
4014
|
return Array.isArray(value) ? value[0] : value;
|
|
3980
4015
|
}
|
|
4016
|
+
function rewriteLocation(location) {
|
|
4017
|
+
try {
|
|
4018
|
+
const parsed = new URL(location);
|
|
4019
|
+
if (parsed.hostname === UPSTREAM_HOST && parsed.port === String(resolveUpstreamPort())) {
|
|
4020
|
+
const pathWithQuery = parsed.pathname + parsed.search + parsed.hash;
|
|
4021
|
+
return pathWithQuery.startsWith(GRAPH_PREFIX) ? pathWithQuery : `${GRAPH_PREFIX}${pathWithQuery}`;
|
|
4022
|
+
}
|
|
4023
|
+
return location;
|
|
4024
|
+
} catch {
|
|
4025
|
+
if (location.startsWith("/") && !location.startsWith(`${GRAPH_PREFIX}/`) && location !== GRAPH_PREFIX) {
|
|
4026
|
+
return `${GRAPH_PREFIX}${location}`;
|
|
4027
|
+
}
|
|
4028
|
+
return location;
|
|
4029
|
+
}
|
|
4030
|
+
}
|
|
3981
4031
|
function parseOriginHost2(origin) {
|
|
3982
4032
|
if (!origin) return null;
|
|
3983
4033
|
try {
|
|
@@ -4659,9 +4709,15 @@ function readPassword() {
|
|
|
4659
4709
|
}
|
|
4660
4710
|
function getDriver() {
|
|
4661
4711
|
if (!driver) {
|
|
4662
|
-
const uri = process.env.NEO4J_URI
|
|
4712
|
+
const uri = process.env.NEO4J_URI;
|
|
4713
|
+
if (!uri) {
|
|
4714
|
+
throw new Error(
|
|
4715
|
+
"[ui/neo4j-store] NEO4J_URI unset \u2014 refusing to default to bolt://localhost:7687 (Task 580)"
|
|
4716
|
+
);
|
|
4717
|
+
}
|
|
4663
4718
|
const user = process.env.NEO4J_USER ?? "neo4j";
|
|
4664
4719
|
const password = readPassword();
|
|
4720
|
+
console.error(`[ui/neo4j-store] resolved neo4j_uri=${uri}`);
|
|
4665
4721
|
driver = neo4j.driver(uri, neo4j.auth.basic(user, password), {
|
|
4666
4722
|
maxConnectionPoolSize: 5
|
|
4667
4723
|
});
|
|
@@ -7842,12 +7898,33 @@ function readBrandHostname() {
|
|
|
7842
7898
|
}
|
|
7843
7899
|
return cachedBrandHostname;
|
|
7844
7900
|
}
|
|
7901
|
+
function requireNeo4jUri() {
|
|
7902
|
+
const uri = process.env.NEO4J_URI;
|
|
7903
|
+
if (!uri) {
|
|
7904
|
+
throw new Error(
|
|
7905
|
+
"NEO4J_URI unset \u2014 refusing to default to bolt://localhost:7687. Set NEO4J_URI in the gateway's env (systemd EnvironmentFile or shell .env). (Task 580)"
|
|
7906
|
+
);
|
|
7907
|
+
}
|
|
7908
|
+
const brand = readBrandHostname();
|
|
7909
|
+
if (brand === "realagent" && /:7687([/?]|$)/.test(uri)) {
|
|
7910
|
+
throw new Error(
|
|
7911
|
+
`NEO4J_URI=${uri} points at :7687 on a realagent install \u2014 realagent owns :7688. This would silently write into Maxy's DB (Task 577 vector). (Task 580)`
|
|
7912
|
+
);
|
|
7913
|
+
}
|
|
7914
|
+
return uri;
|
|
7915
|
+
}
|
|
7845
7916
|
function getMcpServers(accountId, conversationId, userId, enabledPlugins) {
|
|
7846
7917
|
if (!conversationId) {
|
|
7847
7918
|
throw new Error(`getMcpServers: conversationId is required (accountId=${accountId.slice(0, 8)})`);
|
|
7848
7919
|
}
|
|
7849
7920
|
const { logDir: LOG_DIR2, streamLogPath: STREAM_LOG_PATH } = streamLogPathFor(accountId, conversationId);
|
|
7850
|
-
const baseEnv = {
|
|
7921
|
+
const baseEnv = {
|
|
7922
|
+
ACCOUNT_ID: accountId,
|
|
7923
|
+
PLATFORM_ROOT: PLATFORM_ROOT4,
|
|
7924
|
+
LOG_DIR: LOG_DIR2,
|
|
7925
|
+
STREAM_LOG_PATH,
|
|
7926
|
+
NEO4J_URI: requireNeo4jUri()
|
|
7927
|
+
};
|
|
7851
7928
|
const servers = {
|
|
7852
7929
|
"memory": {
|
|
7853
7930
|
command: "node",
|
|
@@ -7918,7 +7995,6 @@ function getMcpServers(accountId, conversationId, userId, enabledPlugins) {
|
|
|
7918
7995
|
env: {
|
|
7919
7996
|
...baseEnv,
|
|
7920
7997
|
BRAND: readBrandHostname(),
|
|
7921
|
-
NEO4J_URI: process.env.NEO4J_URI ?? "bolt://localhost:7687",
|
|
7922
7998
|
NEO4J_USERNAME: process.env.NEO4J_USERNAME ?? process.env.NEO4J_USER ?? "neo4j",
|
|
7923
7999
|
NEO4J_NAMESPACE: "maxy-graph",
|
|
7924
8000
|
NEO4J_READ_ONLY: "true",
|
|
@@ -15746,9 +15822,15 @@ function readPassword2() {
|
|
|
15746
15822
|
}
|
|
15747
15823
|
function getDriver2() {
|
|
15748
15824
|
if (!driver2) {
|
|
15749
|
-
const uri = process.env.NEO4J_URI
|
|
15825
|
+
const uri = process.env.NEO4J_URI;
|
|
15826
|
+
if (!uri) {
|
|
15827
|
+
throw new Error(
|
|
15828
|
+
"[ui/access-gate] NEO4J_URI unset \u2014 refusing to default to bolt://localhost:7687 (Task 580)"
|
|
15829
|
+
);
|
|
15830
|
+
}
|
|
15750
15831
|
const user = process.env.NEO4J_USER ?? "neo4j";
|
|
15751
15832
|
const password = readPassword2();
|
|
15833
|
+
console.error(`[ui/access-gate] resolved neo4j_uri=${uri}`);
|
|
15752
15834
|
driver2 = neo4j2.driver(uri, neo4j2.auth.basic(user, password), {
|
|
15753
15835
|
maxConnectionPoolSize: 5
|
|
15754
15836
|
});
|
|
@@ -18893,9 +18975,7 @@ async function GET13() {
|
|
|
18893
18975
|
// app/api/admin/version/upgrade/route.ts
|
|
18894
18976
|
import { spawn as spawn4 } from "child_process";
|
|
18895
18977
|
import { existsSync as existsSync25, statSync as statSync10, writeFileSync as writeFileSync16, readFileSync as readFileSync24, openSync as openSync5, closeSync as closeSync5 } from "fs";
|
|
18896
|
-
import {
|
|
18897
|
-
import { resolve as resolve26, join as join12, dirname as dirname8 } from "path";
|
|
18898
|
-
import { fileURLToPath } from "url";
|
|
18978
|
+
import { resolve as resolve26, join as join12 } from "path";
|
|
18899
18979
|
var PLATFORM_ROOT10 = process.env.MAXY_PLATFORM_ROOT ?? resolve26(process.cwd(), "..");
|
|
18900
18980
|
var upgradePkg = "@rubytech/create-maxy";
|
|
18901
18981
|
var upgradeHostname = "maxy";
|
|
@@ -18928,27 +19008,6 @@ function isLockFresh() {
|
|
|
18928
19008
|
return false;
|
|
18929
19009
|
}
|
|
18930
19010
|
}
|
|
18931
|
-
function probePortFree(port2) {
|
|
18932
|
-
return new Promise((resolve33) => {
|
|
18933
|
-
const probe = createServer();
|
|
18934
|
-
probe.once("error", (err2) => {
|
|
18935
|
-
resolve33({ error: `${err2.code ?? "EADDRINUSE"} on port ${port2}` });
|
|
18936
|
-
});
|
|
18937
|
-
probe.once("listening", () => {
|
|
18938
|
-
probe.close(() => resolve33(true));
|
|
18939
|
-
});
|
|
18940
|
-
probe.listen(port2, "0.0.0.0");
|
|
18941
|
-
});
|
|
18942
|
-
}
|
|
18943
|
-
function resolveSidecarPath() {
|
|
18944
|
-
try {
|
|
18945
|
-
const here = dirname8(fileURLToPath(import.meta.url));
|
|
18946
|
-
const candidate = join12(here, "upgrade-progress-server.js");
|
|
18947
|
-
return existsSync25(candidate) ? candidate : null;
|
|
18948
|
-
} catch {
|
|
18949
|
-
return null;
|
|
18950
|
-
}
|
|
18951
|
-
}
|
|
18952
19011
|
async function POST25(req) {
|
|
18953
19012
|
let body;
|
|
18954
19013
|
try {
|
|
@@ -18966,31 +19025,12 @@ async function POST25(req) {
|
|
|
18966
19025
|
if (isLockFresh()) {
|
|
18967
19026
|
return Response.json({ ok: false, error: "upgrade already in progress" }, { status: 409 });
|
|
18968
19027
|
}
|
|
18969
|
-
const mainPort = parseInt(process.env.PORT ?? "19200", 10);
|
|
18970
|
-
const sidecarPort = mainPort + 99;
|
|
18971
|
-
const portProbe = await probePortFree(sidecarPort);
|
|
18972
|
-
if (portProbe !== true) {
|
|
18973
|
-
console.error(`[admin/version/upgrade] sidecar port probe failed: ${portProbe.error}`);
|
|
18974
|
-
return Response.json(
|
|
18975
|
-
{ ok: false, error: `upgrade progress port ${sidecarPort} is already in use (${portProbe.error})` },
|
|
18976
|
-
{ status: 500 }
|
|
18977
|
-
);
|
|
18978
|
-
}
|
|
18979
|
-
const sidecarPath = resolveSidecarPath();
|
|
18980
19028
|
const installerScope = `upgrade-${upgradeHostname}`;
|
|
18981
|
-
const sidecarScope = `upgrade-progress-${upgradeHostname}`;
|
|
18982
19029
|
try {
|
|
18983
19030
|
writeFileSync16(LOCK_FILE, String(Date.now()));
|
|
18984
19031
|
} catch (err2) {
|
|
18985
19032
|
console.error("[admin/version/upgrade] failed to write lock file:", err2);
|
|
18986
19033
|
}
|
|
18987
|
-
if (!sidecarPath) {
|
|
18988
|
-
console.error("[admin/version/upgrade] progress sidecar binary not found in dist/");
|
|
18989
|
-
return Response.json(
|
|
18990
|
-
{ ok: false, error: "progress sidecar binary missing \u2014 rebuild required" },
|
|
18991
|
-
{ status: 500 }
|
|
18992
|
-
);
|
|
18993
|
-
}
|
|
18994
19034
|
try {
|
|
18995
19035
|
writeFileSync16(LOG_FILE, "");
|
|
18996
19036
|
} catch (err2) {
|
|
@@ -19000,34 +19040,6 @@ async function POST25(req) {
|
|
|
19000
19040
|
{ status: 500 }
|
|
19001
19041
|
);
|
|
19002
19042
|
}
|
|
19003
|
-
let sidecarPid;
|
|
19004
|
-
try {
|
|
19005
|
-
const sidecarLogFd = openSync5(LOG_FILE, "a");
|
|
19006
|
-
const sidecar = spawn4("systemd-run", [
|
|
19007
|
-
"--user",
|
|
19008
|
-
"--scope",
|
|
19009
|
-
`--unit=${sidecarScope}`,
|
|
19010
|
-
"--",
|
|
19011
|
-
"node",
|
|
19012
|
-
sidecarPath,
|
|
19013
|
-
`--port=${sidecarPort}`,
|
|
19014
|
-
`--log=${LOG_FILE}`,
|
|
19015
|
-
`--scope=${installerScope}`
|
|
19016
|
-
], {
|
|
19017
|
-
detached: true,
|
|
19018
|
-
stdio: ["ignore", sidecarLogFd, sidecarLogFd]
|
|
19019
|
-
});
|
|
19020
|
-
sidecar.unref();
|
|
19021
|
-
closeSync5(sidecarLogFd);
|
|
19022
|
-
sidecarPid = sidecar.pid;
|
|
19023
|
-
console.log(`[admin/version/upgrade] spawned progress sidecar (pid ${sidecarPid} port ${sidecarPort})`);
|
|
19024
|
-
} catch (err2) {
|
|
19025
|
-
console.error("[admin/version/upgrade] failed to spawn progress sidecar:", err2);
|
|
19026
|
-
return Response.json(
|
|
19027
|
-
{ ok: false, error: err2 instanceof Error ? err2.message : "failed to spawn progress sidecar" },
|
|
19028
|
-
{ status: 500 }
|
|
19029
|
-
);
|
|
19030
|
-
}
|
|
19031
19043
|
try {
|
|
19032
19044
|
const logFd = openSync5(LOG_FILE, "a");
|
|
19033
19045
|
const child = spawn4("systemd-run", [
|
|
@@ -19046,10 +19058,8 @@ async function POST25(req) {
|
|
|
19046
19058
|
});
|
|
19047
19059
|
child.unref();
|
|
19048
19060
|
closeSync5(logFd);
|
|
19049
|
-
console.log(`[admin/version/upgrade] spawned upgrade process (pid ${child.pid})`);
|
|
19050
|
-
|
|
19051
|
-
const progressUrl = `http://${host}:${sidecarPort}/progress`;
|
|
19052
|
-
return Response.json({ ok: true, started: true, progressUrl });
|
|
19061
|
+
console.log(`[admin/version/upgrade] spawned upgrade process (pid ${child.pid} scope ${installerScope})`);
|
|
19062
|
+
return Response.json({ ok: true, started: true });
|
|
19053
19063
|
} catch (err2) {
|
|
19054
19064
|
console.error("[admin/version/upgrade] failed to spawn upgrade process:", err2);
|
|
19055
19065
|
return Response.json(
|
|
@@ -19060,14 +19070,57 @@ async function POST25(req) {
|
|
|
19060
19070
|
}
|
|
19061
19071
|
|
|
19062
19072
|
// app/api/admin/version/upgrade/progress/route.ts
|
|
19063
|
-
import { existsSync as
|
|
19073
|
+
import { existsSync as existsSync27, readFileSync as readFileSync26 } from "fs";
|
|
19064
19074
|
import { resolve as resolve27, join as join13 } from "path";
|
|
19075
|
+
|
|
19076
|
+
// app/lib/upgrade-progress-parser.ts
|
|
19077
|
+
import { existsSync as existsSync26, readFileSync as readFileSync25 } from "fs";
|
|
19078
|
+
var STEP_RE = /\[(\d+)\/(\d+)\]\s+(.+)/;
|
|
19079
|
+
var ANSI_RE = /\x1b\[[0-9;?]*[a-zA-Z]/g;
|
|
19080
|
+
var stripAnsi = (s) => s.replace(ANSI_RE, "").replace(/\r/g, "").trimEnd();
|
|
19081
|
+
var MAX_SUBSTEPS = 20;
|
|
19082
|
+
function parseUpgradeProgress(content) {
|
|
19083
|
+
const rawLines = content.split("\n");
|
|
19084
|
+
let step = 0;
|
|
19085
|
+
let total = 0;
|
|
19086
|
+
let label = "";
|
|
19087
|
+
let markerIdx = -1;
|
|
19088
|
+
for (let i = rawLines.length - 1; i >= 0; i--) {
|
|
19089
|
+
const match2 = rawLines[i].match(STEP_RE);
|
|
19090
|
+
if (match2) {
|
|
19091
|
+
step = parseInt(match2[1], 10);
|
|
19092
|
+
total = parseInt(match2[2], 10);
|
|
19093
|
+
label = match2[3].replace(/\.{3}$/, "").trim();
|
|
19094
|
+
markerIdx = i;
|
|
19095
|
+
break;
|
|
19096
|
+
}
|
|
19097
|
+
}
|
|
19098
|
+
const subSteps = markerIdx >= 0 ? rawLines.slice(markerIdx + 1).map(stripAnsi).filter((l) => l.length > 0).slice(-MAX_SUBSTEPS) : [];
|
|
19099
|
+
const tail = rawLines.slice(-20).join("\n");
|
|
19100
|
+
const finished = tail.includes("Open in your browser:");
|
|
19101
|
+
const failed = tail.includes("Setup failed:");
|
|
19102
|
+
return { step, total, label, started: true, finished, failed, subSteps };
|
|
19103
|
+
}
|
|
19104
|
+
function readProgressLog(path2) {
|
|
19105
|
+
if (!existsSync26(path2)) {
|
|
19106
|
+
return { step: 0, total: 0, label: "", started: false, subSteps: [] };
|
|
19107
|
+
}
|
|
19108
|
+
let content;
|
|
19109
|
+
try {
|
|
19110
|
+
content = readFileSync25(path2, "utf-8");
|
|
19111
|
+
} catch {
|
|
19112
|
+
return { step: 0, total: 0, label: "", started: false, subSteps: [] };
|
|
19113
|
+
}
|
|
19114
|
+
return parseUpgradeProgress(content);
|
|
19115
|
+
}
|
|
19116
|
+
|
|
19117
|
+
// app/api/admin/version/upgrade/progress/route.ts
|
|
19065
19118
|
var PLATFORM_ROOT11 = process.env.MAXY_PLATFORM_ROOT ?? resolve27(process.cwd(), "..");
|
|
19066
19119
|
var upgradeHostname2 = "maxy";
|
|
19067
19120
|
var brandPath2 = join13(PLATFORM_ROOT11, "config", "brand.json");
|
|
19068
|
-
if (
|
|
19121
|
+
if (existsSync27(brandPath2)) {
|
|
19069
19122
|
try {
|
|
19070
|
-
const brand = JSON.parse(
|
|
19123
|
+
const brand = JSON.parse(readFileSync26(brandPath2, "utf-8"));
|
|
19071
19124
|
if (brand.hostname) upgradeHostname2 = brand.hostname;
|
|
19072
19125
|
} catch {
|
|
19073
19126
|
}
|
|
@@ -19522,7 +19575,7 @@ async function POST31(req) {
|
|
|
19522
19575
|
import * as childProcess from "child_process";
|
|
19523
19576
|
import { homedir as homedir4 } from "os";
|
|
19524
19577
|
import { resolve as resolve29 } from "path";
|
|
19525
|
-
import { readFileSync as
|
|
19578
|
+
import { readFileSync as readFileSync28 } from "fs";
|
|
19526
19579
|
|
|
19527
19580
|
// app/lib/dns-label.ts
|
|
19528
19581
|
var VALID_LABEL = /^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$/;
|
|
@@ -19538,14 +19591,14 @@ function isValidDomain(value) {
|
|
|
19538
19591
|
}
|
|
19539
19592
|
|
|
19540
19593
|
// app/lib/alias-domains.ts
|
|
19541
|
-
import { existsSync as
|
|
19542
|
-
import { dirname as
|
|
19594
|
+
import { existsSync as existsSync28, mkdirSync as mkdirSync12, readFileSync as readFileSync27, writeFileSync as writeFileSync17 } from "fs";
|
|
19595
|
+
import { dirname as dirname8 } from "path";
|
|
19543
19596
|
import { resolve as resolve28 } from "path";
|
|
19544
19597
|
var ALIAS_DOMAINS_PATH = resolve28(MAXY_DIR, "alias-domains.json");
|
|
19545
19598
|
function readExisting() {
|
|
19546
|
-
if (!
|
|
19599
|
+
if (!existsSync28(ALIAS_DOMAINS_PATH)) return /* @__PURE__ */ new Set();
|
|
19547
19600
|
try {
|
|
19548
|
-
const parsed = JSON.parse(
|
|
19601
|
+
const parsed = JSON.parse(readFileSync27(ALIAS_DOMAINS_PATH, "utf-8"));
|
|
19549
19602
|
if (!Array.isArray(parsed)) return /* @__PURE__ */ new Set();
|
|
19550
19603
|
return new Set(parsed.filter((h) => typeof h === "string"));
|
|
19551
19604
|
} catch {
|
|
@@ -19556,7 +19609,7 @@ function addAliasDomain(hostname2) {
|
|
|
19556
19609
|
const existing = readExisting();
|
|
19557
19610
|
if (existing.has(hostname2)) return;
|
|
19558
19611
|
existing.add(hostname2);
|
|
19559
|
-
mkdirSync12(
|
|
19612
|
+
mkdirSync12(dirname8(ALIAS_DOMAINS_PATH), { recursive: true });
|
|
19560
19613
|
writeFileSync17(ALIAS_DOMAINS_PATH, JSON.stringify([...existing], null, 2) + "\n", "utf-8");
|
|
19561
19614
|
}
|
|
19562
19615
|
|
|
@@ -19580,7 +19633,7 @@ function loadBrandInfo() {
|
|
|
19580
19633
|
const platformRoot3 = process.env.MAXY_PLATFORM_ROOT ?? resolve29(process.cwd(), "..");
|
|
19581
19634
|
const brandPath3 = resolve29(platformRoot3, "config", "brand.json");
|
|
19582
19635
|
try {
|
|
19583
|
-
const parsed = JSON.parse(
|
|
19636
|
+
const parsed = JSON.parse(readFileSync28(brandPath3, "utf-8"));
|
|
19584
19637
|
const hostname2 = typeof parsed.hostname === "string" && parsed.hostname ? parsed.hostname : "maxy";
|
|
19585
19638
|
const configDir2 = typeof parsed.configDir === "string" && parsed.configDir ? parsed.configDir : ".maxy";
|
|
19586
19639
|
return { hostname: hostname2, configDir: configDir2 };
|
|
@@ -19759,7 +19812,7 @@ async function POST33(req) {
|
|
|
19759
19812
|
}
|
|
19760
19813
|
|
|
19761
19814
|
// app/api/admin/files/route.ts
|
|
19762
|
-
import { readdir as readdir2, stat as stat4 } from "fs/promises";
|
|
19815
|
+
import { readdir as readdir2, readFile as readFile4, stat as stat4 } from "fs/promises";
|
|
19763
19816
|
import { join as join14 } from "path";
|
|
19764
19817
|
|
|
19765
19818
|
// app/lib/data-path.ts
|
|
@@ -19805,6 +19858,39 @@ function resolveDataPath(raw2) {
|
|
|
19805
19858
|
}
|
|
19806
19859
|
|
|
19807
19860
|
// app/api/admin/files/route.ts
|
|
19861
|
+
var UUID_RE2 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
19862
|
+
async function readMeta(absDir, baseName) {
|
|
19863
|
+
try {
|
|
19864
|
+
const raw2 = await readFile4(join14(absDir, `${baseName}.meta.json`), "utf8");
|
|
19865
|
+
const parsed = JSON.parse(raw2);
|
|
19866
|
+
if (typeof parsed?.filename === "string") {
|
|
19867
|
+
return { filename: parsed.filename, mimeType: typeof parsed.mimeType === "string" ? parsed.mimeType : void 0 };
|
|
19868
|
+
}
|
|
19869
|
+
} catch {
|
|
19870
|
+
}
|
|
19871
|
+
return null;
|
|
19872
|
+
}
|
|
19873
|
+
async function enrich(absolute, entry) {
|
|
19874
|
+
if (entry.kind === "directory" && UUID_RE2.test(entry.name)) {
|
|
19875
|
+
const meta = await readMeta(join14(absolute, entry.name), entry.name);
|
|
19876
|
+
if (meta?.filename) {
|
|
19877
|
+
entry.displayName = meta.filename;
|
|
19878
|
+
entry.mimeType = meta.mimeType;
|
|
19879
|
+
}
|
|
19880
|
+
return;
|
|
19881
|
+
}
|
|
19882
|
+
if (entry.kind === "file") {
|
|
19883
|
+
const dot = entry.name.lastIndexOf(".");
|
|
19884
|
+
const base = dot === -1 ? entry.name : entry.name.slice(0, dot);
|
|
19885
|
+
if (UUID_RE2.test(base)) {
|
|
19886
|
+
const meta = await readMeta(absolute, base);
|
|
19887
|
+
if (meta?.filename) {
|
|
19888
|
+
entry.displayName = meta.filename;
|
|
19889
|
+
entry.mimeType = meta.mimeType;
|
|
19890
|
+
}
|
|
19891
|
+
}
|
|
19892
|
+
}
|
|
19893
|
+
}
|
|
19808
19894
|
async function GET17(req) {
|
|
19809
19895
|
const url = new URL(req.url);
|
|
19810
19896
|
const sessionKey = url.searchParams.get("session_key");
|
|
@@ -19837,6 +19923,9 @@ async function GET17(req) {
|
|
|
19837
19923
|
const names = await readdir2(absolute);
|
|
19838
19924
|
const entries = [];
|
|
19839
19925
|
for (const name of names) {
|
|
19926
|
+
if (UUID_RE2.test(name.replace(/\.meta\.json$/, "")) && name.endsWith(".meta.json")) {
|
|
19927
|
+
continue;
|
|
19928
|
+
}
|
|
19840
19929
|
try {
|
|
19841
19930
|
const entryPath = join14(absolute, name);
|
|
19842
19931
|
const s = await stat4(entryPath);
|
|
@@ -19850,9 +19939,12 @@ async function GET17(req) {
|
|
|
19850
19939
|
entries.push({ name, kind: "other", sizeBytes: null, modifiedAt: (/* @__PURE__ */ new Date(0)).toISOString() });
|
|
19851
19940
|
}
|
|
19852
19941
|
}
|
|
19942
|
+
await Promise.all(entries.map((e) => enrich(absolute, e)));
|
|
19853
19943
|
entries.sort((a, b) => {
|
|
19854
19944
|
if (a.kind !== b.kind) return a.kind === "directory" ? -1 : 1;
|
|
19855
|
-
|
|
19945
|
+
const aKey = a.displayName ?? a.name;
|
|
19946
|
+
const bKey = b.displayName ?? b.name;
|
|
19947
|
+
return aKey.localeCompare(bKey);
|
|
19856
19948
|
});
|
|
19857
19949
|
console.error(`[data] file-list path="${relPath}" entries=${entries.length}`);
|
|
19858
19950
|
return Response.json({ path: relPath, entries });
|
|
@@ -20044,16 +20136,19 @@ async function GET19(req) {
|
|
|
20044
20136
|
}
|
|
20045
20137
|
}
|
|
20046
20138
|
|
|
20139
|
+
// app/lib/agent-slug-pattern.ts
|
|
20140
|
+
var AGENT_SLUG_PATTERN = /^\/([a-z][a-z0-9-]{2,49})$/;
|
|
20141
|
+
|
|
20047
20142
|
// server/index.ts
|
|
20048
20143
|
var PLATFORM_ROOT13 = process.env.MAXY_PLATFORM_ROOT || "";
|
|
20049
20144
|
var BRAND_JSON_PATH = PLATFORM_ROOT13 ? join15(PLATFORM_ROOT13, "config", "brand.json") : "";
|
|
20050
20145
|
var BRAND = { productName: "Maxy", hostname: "maxy", configDir: ".maxy", domain: "getmaxy.com" };
|
|
20051
|
-
if (BRAND_JSON_PATH && !
|
|
20146
|
+
if (BRAND_JSON_PATH && !existsSync29(BRAND_JSON_PATH)) {
|
|
20052
20147
|
console.error(`[brand] WARNING: brand.json not found at ${BRAND_JSON_PATH} \u2014 using Maxy defaults`);
|
|
20053
20148
|
}
|
|
20054
|
-
if (BRAND_JSON_PATH &&
|
|
20149
|
+
if (BRAND_JSON_PATH && existsSync29(BRAND_JSON_PATH)) {
|
|
20055
20150
|
try {
|
|
20056
|
-
const parsed = JSON.parse(
|
|
20151
|
+
const parsed = JSON.parse(readFileSync29(BRAND_JSON_PATH, "utf-8"));
|
|
20057
20152
|
BRAND = { ...BRAND, ...parsed };
|
|
20058
20153
|
} catch (err2) {
|
|
20059
20154
|
console.error(`[brand] Failed to parse brand.json: ${err2.message}`);
|
|
@@ -20075,8 +20170,8 @@ var brandLoginOpts = {
|
|
|
20075
20170
|
var ALIAS_DOMAINS_PATH2 = join15(homedir5(), BRAND.configDir, "alias-domains.json");
|
|
20076
20171
|
function loadAliasDomains() {
|
|
20077
20172
|
try {
|
|
20078
|
-
if (!
|
|
20079
|
-
const parsed = JSON.parse(
|
|
20173
|
+
if (!existsSync29(ALIAS_DOMAINS_PATH2)) return null;
|
|
20174
|
+
const parsed = JSON.parse(readFileSync29(ALIAS_DOMAINS_PATH2, "utf-8"));
|
|
20080
20175
|
if (!Array.isArray(parsed)) {
|
|
20081
20176
|
console.error("[alias-domains] malformed alias-domains.json \u2014 expected array");
|
|
20082
20177
|
return null;
|
|
@@ -20124,7 +20219,6 @@ var PUBLIC_ALLOWED_PREFIXES = [
|
|
|
20124
20219
|
"/g/"
|
|
20125
20220
|
];
|
|
20126
20221
|
var PUBLIC_ALLOWED_EXACT = ["/favicon.ico"];
|
|
20127
|
-
var AGENT_SLUG_PATTERN = /^\/([a-z][a-z0-9-]{2,49})$/;
|
|
20128
20222
|
app.use("*", async (c, next) => {
|
|
20129
20223
|
const host = (c.req.header("host") ?? "").split(":")[0];
|
|
20130
20224
|
if (!isPublicHost(host)) {
|
|
@@ -20509,14 +20603,14 @@ app.get("/agent-assets/:slug/:filename", (c) => {
|
|
|
20509
20603
|
console.error(`[agent-assets] path-traversal-rejected slug=${slug} file=${filename}`);
|
|
20510
20604
|
return c.text("Forbidden", 403);
|
|
20511
20605
|
}
|
|
20512
|
-
if (!
|
|
20606
|
+
if (!existsSync29(filePath)) {
|
|
20513
20607
|
console.error(`[agent-assets] serve slug=${slug} file=${filename} status=404`);
|
|
20514
20608
|
return c.text("Not found", 404);
|
|
20515
20609
|
}
|
|
20516
20610
|
const ext = "." + filename.split(".").pop()?.toLowerCase();
|
|
20517
20611
|
const contentType = IMAGE_MIME[ext] || "application/octet-stream";
|
|
20518
20612
|
console.log(`[agent-assets] serve slug=${slug} file=${filename} status=200`);
|
|
20519
|
-
const body =
|
|
20613
|
+
const body = readFileSync29(filePath);
|
|
20520
20614
|
return c.body(body, 200, {
|
|
20521
20615
|
"Content-Type": contentType,
|
|
20522
20616
|
"Cache-Control": "public, max-age=3600"
|
|
@@ -20539,14 +20633,14 @@ app.get("/generated/:filename", (c) => {
|
|
|
20539
20633
|
console.error(`[generated] serve file=${filename} status=403`);
|
|
20540
20634
|
return c.text("Forbidden", 403);
|
|
20541
20635
|
}
|
|
20542
|
-
if (!
|
|
20636
|
+
if (!existsSync29(filePath)) {
|
|
20543
20637
|
console.error(`[generated] serve file=${filename} status=404`);
|
|
20544
20638
|
return c.text("Not found", 404);
|
|
20545
20639
|
}
|
|
20546
20640
|
const ext = "." + filename.split(".").pop()?.toLowerCase();
|
|
20547
20641
|
const contentType = IMAGE_MIME[ext] || "application/octet-stream";
|
|
20548
20642
|
console.log(`[generated] serve file=${filename} status=200`);
|
|
20549
|
-
const body =
|
|
20643
|
+
const body = readFileSync29(filePath);
|
|
20550
20644
|
return c.body(body, 200, {
|
|
20551
20645
|
"Content-Type": contentType,
|
|
20552
20646
|
"Cache-Control": "public, max-age=86400"
|
|
@@ -20555,9 +20649,9 @@ app.get("/generated/:filename", (c) => {
|
|
|
20555
20649
|
var htmlCache = /* @__PURE__ */ new Map();
|
|
20556
20650
|
var brandLogoPath = "/brand/maxy-monochrome.png";
|
|
20557
20651
|
var brandIconPath = "/brand/maxy-monochrome.png";
|
|
20558
|
-
if (BRAND_JSON_PATH &&
|
|
20652
|
+
if (BRAND_JSON_PATH && existsSync29(BRAND_JSON_PATH)) {
|
|
20559
20653
|
try {
|
|
20560
|
-
const fullBrand = JSON.parse(
|
|
20654
|
+
const fullBrand = JSON.parse(readFileSync29(BRAND_JSON_PATH, "utf-8"));
|
|
20561
20655
|
if (fullBrand.assets?.logo) brandLogoPath = `/brand/${fullBrand.assets.logo}`;
|
|
20562
20656
|
brandIconPath = fullBrand.assets?.icon ? `/brand/${fullBrand.assets.icon}` : brandLogoPath;
|
|
20563
20657
|
} catch {
|
|
@@ -20575,8 +20669,8 @@ function readInstalledVersion() {
|
|
|
20575
20669
|
try {
|
|
20576
20670
|
if (!PLATFORM_ROOT13) return "unknown";
|
|
20577
20671
|
const versionFile = join15(PLATFORM_ROOT13, "config", `.${BRAND.hostname}-version`);
|
|
20578
|
-
if (!
|
|
20579
|
-
const content =
|
|
20672
|
+
if (!existsSync29(versionFile)) return "unknown";
|
|
20673
|
+
const content = readFileSync29(versionFile, "utf-8").trim();
|
|
20580
20674
|
return content || "unknown";
|
|
20581
20675
|
} catch {
|
|
20582
20676
|
return "unknown";
|
|
@@ -20617,7 +20711,7 @@ var clientErrorReporterScript = `<script>
|
|
|
20617
20711
|
function cachedHtml(file) {
|
|
20618
20712
|
let html = htmlCache.get(file);
|
|
20619
20713
|
if (!html) {
|
|
20620
|
-
html =
|
|
20714
|
+
html = readFileSync29(resolve32(process.cwd(), "public", file), "utf-8");
|
|
20621
20715
|
html = html.replace("<title>Maxy</title>", `<title>${escapeHtml2(BRAND.productName)}</title>`);
|
|
20622
20716
|
html = html.replace('href="/favicon.ico"', `href="${escapeHtml2(brandFaviconPath)}"`);
|
|
20623
20717
|
const headInjection = file === "index.html" ? `${brandScript}
|
|
@@ -20635,13 +20729,13 @@ function loadBrandingCache(agentSlug) {
|
|
|
20635
20729
|
const configDir2 = join15(homedir5(), BRAND.configDir);
|
|
20636
20730
|
try {
|
|
20637
20731
|
const accountJsonPath = join15(configDir2, "account.json");
|
|
20638
|
-
if (!
|
|
20639
|
-
const account = JSON.parse(
|
|
20732
|
+
if (!existsSync29(accountJsonPath)) return null;
|
|
20733
|
+
const account = JSON.parse(readFileSync29(accountJsonPath, "utf-8"));
|
|
20640
20734
|
const accountId = account.accountId;
|
|
20641
20735
|
if (!accountId) return null;
|
|
20642
20736
|
const cachePath = join15(configDir2, "branding-cache", accountId, `${agentSlug}.json`);
|
|
20643
|
-
if (!
|
|
20644
|
-
return JSON.parse(
|
|
20737
|
+
if (!existsSync29(cachePath)) return null;
|
|
20738
|
+
return JSON.parse(readFileSync29(cachePath, "utf-8"));
|
|
20645
20739
|
} catch {
|
|
20646
20740
|
return null;
|
|
20647
20741
|
}
|
|
@@ -20650,8 +20744,8 @@ function resolveDefaultSlug() {
|
|
|
20650
20744
|
try {
|
|
20651
20745
|
const configDir2 = join15(homedir5(), BRAND.configDir);
|
|
20652
20746
|
const accountJsonPath = join15(configDir2, "account.json");
|
|
20653
|
-
if (!
|
|
20654
|
-
const account = JSON.parse(
|
|
20747
|
+
if (!existsSync29(accountJsonPath)) return null;
|
|
20748
|
+
const account = JSON.parse(readFileSync29(accountJsonPath, "utf-8"));
|
|
20655
20749
|
return account.defaultAgent || null;
|
|
20656
20750
|
} catch {
|
|
20657
20751
|
return null;
|
|
@@ -20724,7 +20818,7 @@ app.use("/vnc-popout.html", logViewerFetch);
|
|
|
20724
20818
|
app.get("/vnc-popout.html", (c) => {
|
|
20725
20819
|
let html = htmlCache.get("vnc-popout.html");
|
|
20726
20820
|
if (!html) {
|
|
20727
|
-
html =
|
|
20821
|
+
html = readFileSync29(resolve32(process.cwd(), "public", "vnc-popout.html"), "utf-8");
|
|
20728
20822
|
const name = escapeHtml2(BRAND.productName);
|
|
20729
20823
|
html = html.replace("<title>Browser \u2014 Maxy</title>", `<title>${name}</title>`);
|
|
20730
20824
|
html = html.replace("</head>", ` ${brandScript}
|
|
@@ -20758,16 +20852,23 @@ app.post("/api/vnc/client-event", async (c) => {
|
|
|
20758
20852
|
app.get("/g/:slug", (c) => {
|
|
20759
20853
|
return c.html(brandedPublicHtml());
|
|
20760
20854
|
});
|
|
20855
|
+
app.use("/graph/*", graphAuthMiddleware({ isPublicHost, canAccessAdmin }));
|
|
20856
|
+
app.use("/graph", graphAuthMiddleware({ isPublicHost, canAccessAdmin }));
|
|
20857
|
+
attachGraphHttpRoutes(app);
|
|
20858
|
+
app.get("/data", (c) => {
|
|
20859
|
+
const host = (c.req.header("host") ?? "").split(":")[0];
|
|
20860
|
+
if (isPublicHost(host)) return c.text("Not found", 404);
|
|
20861
|
+
return c.html(cachedHtml("data.html"));
|
|
20862
|
+
});
|
|
20761
20863
|
app.get("/:slug", async (c, next) => {
|
|
20762
20864
|
const slug = c.req.param("slug");
|
|
20763
20865
|
if (AGENT_SLUG_PATTERN.test(`/${slug}`)) {
|
|
20866
|
+
const branding = loadBrandingCache(slug);
|
|
20867
|
+
console.error(`[public-catchall] served path=/${slug} slug=${slug} branding=${branding ? "hit" : "miss"}`);
|
|
20764
20868
|
return c.html(brandedPublicHtml(slug));
|
|
20765
20869
|
}
|
|
20766
20870
|
await next();
|
|
20767
20871
|
});
|
|
20768
|
-
app.use("/graph/*", graphAuthMiddleware({ isPublicHost, canAccessAdmin }));
|
|
20769
|
-
app.use("/graph", graphAuthMiddleware({ isPublicHost, canAccessAdmin }));
|
|
20770
|
-
attachGraphHttpRoutes(app);
|
|
20771
20872
|
app.use("/*", serveStatic({ root: "./public" }));
|
|
20772
20873
|
var port = parseInt(process.env.PORT ?? "19200", 10);
|
|
20773
20874
|
var hostname = process.env.HOSTNAME ?? "0.0.0.0";
|
|
@@ -20779,11 +20880,24 @@ attachVncWsProxy(httpServer, {
|
|
|
20779
20880
|
});
|
|
20780
20881
|
attachGraphWsProxy(httpServer, { isPublicHost, canAccessAdmin });
|
|
20781
20882
|
console.log(`${BRAND.productName} listening on http://${hostname}:${port}`);
|
|
20883
|
+
try {
|
|
20884
|
+
const registered = [];
|
|
20885
|
+
for (const r of app.routes ?? []) {
|
|
20886
|
+
if (typeof r.path !== "string" || r.path.includes(":") || r.path.includes("*")) continue;
|
|
20887
|
+
if (AGENT_SLUG_PATTERN.test(r.path)) {
|
|
20888
|
+
registered.push({ method: (r.method ?? "ALL").toUpperCase(), path: r.path });
|
|
20889
|
+
}
|
|
20890
|
+
}
|
|
20891
|
+
const summary = registered.map((r) => `${r.method} ${r.path}`).join(", ") || "(none)";
|
|
20892
|
+
console.log(`[route-shadow] static-paths-matching-slug-pattern count=${registered.length} routes=${summary}`);
|
|
20893
|
+
} catch (err2) {
|
|
20894
|
+
console.error(`[route-shadow] introspection unavailable: ${err2 instanceof Error ? err2.message : String(err2)}`);
|
|
20895
|
+
}
|
|
20782
20896
|
(async () => {
|
|
20783
20897
|
try {
|
|
20784
20898
|
let userId = "";
|
|
20785
|
-
if (
|
|
20786
|
-
const users = JSON.parse(
|
|
20899
|
+
if (existsSync29(USERS_FILE)) {
|
|
20900
|
+
const users = JSON.parse(readFileSync29(USERS_FILE, "utf-8").trim() || "[]");
|
|
20787
20901
|
userId = users[0]?.userId ?? "";
|
|
20788
20902
|
}
|
|
20789
20903
|
await backfillNullUserIdConversations(userId);
|