@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.
Files changed (174) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/graph-mcp/dist/index.js +7 -1
  3. package/payload/platform/lib/graph-mcp/dist/index.js.map +1 -1
  4. package/payload/platform/lib/graph-mcp/src/index.ts +9 -1
  5. package/payload/platform/plugins/admin/mcp/dist/index.js +12 -1
  6. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  7. package/payload/platform/plugins/admin/mcp/dist/lib/neo4j.d.ts.map +1 -1
  8. package/payload/platform/plugins/admin/mcp/dist/lib/neo4j.js +7 -1
  9. package/payload/platform/plugins/admin/mcp/dist/lib/neo4j.js.map +1 -1
  10. package/payload/platform/plugins/contacts/mcp/dist/lib/neo4j.d.ts.map +1 -1
  11. package/payload/platform/plugins/contacts/mcp/dist/lib/neo4j.js +7 -1
  12. package/payload/platform/plugins/contacts/mcp/dist/lib/neo4j.js.map +1 -1
  13. package/payload/platform/plugins/email/mcp/dist/lib/neo4j.d.ts.map +1 -1
  14. package/payload/platform/plugins/email/mcp/dist/lib/neo4j.js +7 -1
  15. package/payload/platform/plugins/email/mcp/dist/lib/neo4j.js.map +1 -1
  16. package/payload/platform/plugins/email/mcp/dist/scripts/email-auto-respond.js +8 -1
  17. package/payload/platform/plugins/email/mcp/dist/scripts/email-auto-respond.js.map +1 -1
  18. package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.d.ts.map +1 -1
  19. package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.js +7 -1
  20. package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.js.map +1 -1
  21. package/payload/platform/plugins/scheduling/mcp/dist/lib/neo4j.d.ts.map +1 -1
  22. package/payload/platform/plugins/scheduling/mcp/dist/lib/neo4j.js +7 -1
  23. package/payload/platform/plugins/scheduling/mcp/dist/lib/neo4j.js.map +1 -1
  24. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +14 -2
  25. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
  26. package/payload/platform/plugins/tasks/mcp/dist/lib/neo4j.d.ts.map +1 -1
  27. package/payload/platform/plugins/tasks/mcp/dist/lib/neo4j.js +7 -1
  28. package/payload/platform/plugins/tasks/mcp/dist/lib/neo4j.js.map +1 -1
  29. package/payload/platform/plugins/waitlist/mcp/dist/lib/neo4j.d.ts.map +1 -1
  30. package/payload/platform/plugins/waitlist/mcp/dist/lib/neo4j.js +7 -1
  31. package/payload/platform/plugins/waitlist/mcp/dist/lib/neo4j.js.map +1 -1
  32. package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-setup.d.ts.map +1 -1
  33. package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-setup.js +6 -0
  34. package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-setup.js.map +1 -1
  35. package/payload/platform/plugins/workflows/mcp/dist/index.js +16 -0
  36. package/payload/platform/plugins/workflows/mcp/dist/index.js.map +1 -1
  37. package/payload/platform/plugins/workflows/mcp/dist/lib/active-runs.d.ts +38 -0
  38. package/payload/platform/plugins/workflows/mcp/dist/lib/active-runs.d.ts.map +1 -0
  39. package/payload/platform/plugins/workflows/mcp/dist/lib/active-runs.js +82 -0
  40. package/payload/platform/plugins/workflows/mcp/dist/lib/active-runs.js.map +1 -0
  41. package/payload/platform/plugins/workflows/mcp/dist/lib/neo4j.d.ts.map +1 -1
  42. package/payload/platform/plugins/workflows/mcp/dist/lib/neo4j.js +7 -1
  43. package/payload/platform/plugins/workflows/mcp/dist/lib/neo4j.js.map +1 -1
  44. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.d.ts.map +1 -1
  45. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js +35 -0
  46. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js.map +1 -1
  47. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.d.ts.map +1 -1
  48. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.js +7 -1
  49. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.js.map +1 -1
  50. package/payload/premium-plugins/real-agency/plugins/loop/mcp/src/lib/neo4j.ts +9 -1
  51. package/payload/server/public/assets/{admin-jpGCzN83.js → admin-k3A7-7ra.js} +30 -30
  52. package/payload/server/public/assets/{arc-DaD1u5gI.js → arc-DcrodP5U.js} +1 -1
  53. package/payload/server/public/assets/architecture-YZFGNWBL-C38eyeNF.js +1 -0
  54. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-OaixqJSY.js → architectureDiagram-Q4EWVU46-Cvo_8X6C.js} +1 -1
  55. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-ChbWwdfi.js → blockDiagram-DXYQGD6D-CEK06TEn.js} +1 -1
  56. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-6r7dvkBG.js → c4Diagram-AHTNJAMY-QjYUSwTU.js} +1 -1
  57. package/payload/server/public/assets/channel-D0dIwjlN.js +1 -0
  58. package/payload/server/public/assets/{chunk-2KRD3SAO-DNeXC6EU.js → chunk-2KRD3SAO-BBifNfFc.js} +1 -1
  59. package/payload/server/public/assets/{chunk-336JU56O-CZH22klX.js → chunk-336JU56O-B-N_zWuf.js} +2 -2
  60. package/payload/server/public/assets/chunk-426QAEUC-C8oXXITm.js +1 -0
  61. package/payload/server/public/assets/{chunk-4BX2VUAB-IcfD9Mfv.js → chunk-4BX2VUAB-CtDQKj9B.js} +1 -1
  62. package/payload/server/public/assets/{chunk-4TB4RGXK-CKA9rXZu.js → chunk-4TB4RGXK-Dnu9n3p1.js} +1 -1
  63. package/payload/server/public/assets/{chunk-55IACEB6-B65N4qpl.js → chunk-55IACEB6-DSLoJJSj.js} +1 -1
  64. package/payload/server/public/assets/{chunk-5FUZZQ4R-u7p0S5bJ.js → chunk-5FUZZQ4R-rx-IvMNE.js} +1 -1
  65. package/payload/server/public/assets/{chunk-5PVQY5BW-B1E88VcH.js → chunk-5PVQY5BW-B9w9AKCS.js} +1 -1
  66. package/payload/server/public/assets/{chunk-67CJDMHE-DIue23pI.js → chunk-67CJDMHE-C1yEjtiu.js} +1 -1
  67. package/payload/server/public/assets/{chunk-7N4EOEYR-BQ9OzsfS.js → chunk-7N4EOEYR-C2f3zeVH.js} +1 -1
  68. package/payload/server/public/assets/{chunk-AA7GKIK3-RpSCHdZM.js → chunk-AA7GKIK3-B_U-NsDK.js} +1 -1
  69. package/payload/server/public/assets/{chunk-BSJP7CBP-Dg2E_8Wn.js → chunk-BSJP7CBP-DM6_wafW.js} +1 -1
  70. package/payload/server/public/assets/{chunk-CIAEETIT-BKZA8eJP.js → chunk-CIAEETIT-DG7WkfNj.js} +1 -1
  71. package/payload/server/public/assets/{chunk-EDXVE4YY-jDBKFDJB.js → chunk-EDXVE4YY-aS3_rdwQ.js} +1 -1
  72. package/payload/server/public/assets/{chunk-ENJZ2VHE-CAHIipTH.js → chunk-ENJZ2VHE-r1I0uoCf.js} +1 -1
  73. package/payload/server/public/assets/{chunk-FMBD7UC4-FHlW2hpP.js → chunk-FMBD7UC4-CTm3YRE5.js} +1 -1
  74. package/payload/server/public/assets/{chunk-FOC6F5B3-CAIHldV7.js → chunk-FOC6F5B3-CAIttx3K.js} +1 -1
  75. package/payload/server/public/assets/{chunk-ICPOFSXX-C9ojfLDm.js → chunk-ICPOFSXX-DQFV4c1l.js} +2 -2
  76. package/payload/server/public/assets/{chunk-K5T4RW27-HA4lma0b.js → chunk-K5T4RW27-B2WCPQBa.js} +1 -1
  77. package/payload/server/public/assets/{chunk-KGLVRYIC-CimijL8o.js → chunk-KGLVRYIC-C6w2sUOF.js} +1 -1
  78. package/payload/server/public/assets/{chunk-LIHQZDEY-B5hk7dNX.js → chunk-LIHQZDEY-BT1hcDTK.js} +1 -1
  79. package/payload/server/public/assets/{chunk-ORNJ4GCN-BVm-YmZh.js → chunk-ORNJ4GCN-Brl32BSe.js} +1 -1
  80. package/payload/server/public/assets/{chunk-OYMX7WX6-Bc8ZyHQH.js → chunk-OYMX7WX6-BCO6n1CX.js} +1 -1
  81. package/payload/server/public/assets/chunk-QZHKN3VN-BE_lylks.js +1 -0
  82. package/payload/server/public/assets/{chunk-U2HBQHQK-CgwbVvji.js → chunk-U2HBQHQK-BvgC0fpb.js} +1 -1
  83. package/payload/server/public/assets/{chunk-X2U36JSP-D4PiRakQ.js → chunk-X2U36JSP-3yLdcqYf.js} +1 -1
  84. package/payload/server/public/assets/{chunk-XPW4576I-DgiaNQ32.js → chunk-XPW4576I-D876RWxK.js} +1 -1
  85. package/payload/server/public/assets/{chunk-YZCP3GAM-jgwS2uNT.js → chunk-YZCP3GAM-CiuA4hOC.js} +1 -1
  86. package/payload/server/public/assets/{chunk-ZZ45TVLE-UdCCrEj5.js → chunk-ZZ45TVLE-COjEBPzv.js} +1 -1
  87. package/payload/server/public/assets/classDiagram-6PBFFD2Q-DH37CWIF.js +1 -0
  88. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DNJ7bv8r.js +1 -0
  89. package/payload/server/public/assets/clone-rrGuX3ZR.js +1 -0
  90. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-D8laakap.js → cose-bilkent-S5V4N54A-Dap0yL0o.js} +1 -1
  91. package/payload/server/public/assets/{dagre-3T6_8Ajq.js → dagre-DBbjK-Cf.js} +1 -1
  92. package/payload/server/public/assets/{dagre-KV5264BT-CzjS08zx.js → dagre-KV5264BT-DEia9UJj.js} +1 -1
  93. package/payload/server/public/assets/data-CrTM-LA6.js +1 -0
  94. package/payload/server/public/assets/{diagram-5BDNPKRD-eG7XwxOn.js → diagram-5BDNPKRD-CWSP9MzJ.js} +1 -1
  95. package/payload/server/public/assets/{diagram-G4DWMVQ6-DmVrtCUt.js → diagram-G4DWMVQ6-DWRsfitL.js} +1 -1
  96. package/payload/server/public/assets/{diagram-MMDJMWI5-ER1KP2RD.js → diagram-MMDJMWI5-n-jyzS4D.js} +1 -1
  97. package/payload/server/public/assets/{diagram-TYMM5635-kH-bn3pm.js → diagram-TYMM5635-CLPTbfLq.js} +1 -1
  98. package/payload/server/public/assets/{dist-Dl3zB445.js → dist-Tkw8EOuG.js} +1 -1
  99. package/payload/server/public/assets/{erDiagram-SMLLAGMA-Clya83Yf.js → erDiagram-SMLLAGMA-CmPC9Cnc.js} +1 -1
  100. package/payload/server/public/assets/{flatten-DOi5FhnR.js → flatten-Db2kUB5j.js} +1 -1
  101. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-BG1UIazn.js → flowDiagram-DWJPFMVM-DKMNmUbX.js} +1 -1
  102. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BF6t7cgR.js → ganttDiagram-T4ZO3ILL-C5-y3w-l.js} +1 -1
  103. package/payload/server/public/assets/gitGraph-7Q5UKJZL-CCjgA3FG.js +1 -0
  104. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-GeyVCma5.js → gitGraphDiagram-UUTBAWPF-D9hG5kTg.js} +1 -1
  105. package/payload/server/public/assets/{graphlib-CvvxOMJO.js → graphlib-StP6GUhM.js} +1 -1
  106. package/payload/server/public/assets/info-OMHHGYJF-B65K6dQJ.js +1 -0
  107. package/payload/server/public/assets/infoDiagram-42DDH7IO-DUJfTICr.js +2 -0
  108. package/payload/server/public/assets/{isEmpty-BlYSjjLF.js → isEmpty-CXH_nKTs.js} +1 -1
  109. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-CC_sxiqJ.js → ishikawaDiagram-UXIWVN3A--K4KOS61.js} +1 -1
  110. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-T5_FJJp9.js → journeyDiagram-VCZTEJTY-DE-28YrW.js} +1 -1
  111. package/payload/server/public/assets/jsx-runtime-57sjl-2n.js +9 -0
  112. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-DmX2Qjbn.js → kanban-definition-6JOO6SKY-CxSHjau2.js} +1 -1
  113. package/payload/server/public/assets/{line-N5bPNRcv.js → line-DbcqYIG0.js} +1 -1
  114. package/payload/server/public/assets/{linear-2x7ZHX-K.js → linear-DXHoZSN3.js} +1 -1
  115. package/payload/server/public/assets/{mermaid-parser.core-C66sw0ru.js → mermaid-parser.core-CNGUA13J.js} +2 -2
  116. package/payload/server/public/assets/{mermaid.core-C_cBOsxO.js → mermaid.core-IQgx_upQ.js} +3 -3
  117. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-gBgI6iwA.js → mindmap-definition-QFDTVHPH-BT9Up6-C.js} +1 -1
  118. package/payload/server/public/assets/{ordinal-Crx1uav8.js → ordinal-CN3oz6oW.js} +1 -1
  119. package/payload/server/public/assets/packet-4T2RLAQJ-fp5ishAK.js +1 -0
  120. package/payload/server/public/assets/pie-ZZUOXDRM-Bc3VMuuU.js +1 -0
  121. package/payload/server/public/assets/{pieDiagram-DEJITSTG-DU2SKMGa.js → pieDiagram-DEJITSTG-BuewQTi6.js} +1 -1
  122. package/payload/server/public/assets/public-BjWvJQTw.js +5 -0
  123. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CfTfCdKE.js → quadrantDiagram-34T5L4WZ-Cu8y2zQL.js} +1 -1
  124. package/payload/server/public/assets/radar-PYXPWWZC-D9jy5QAa.js +1 -0
  125. package/payload/server/public/assets/{reduce-DhQ6Q49z.js → reduce-SDh8_UdG.js} +1 -1
  126. package/payload/server/public/assets/{requirementDiagram-MS252O5E-CdJ1ecPK.js → requirementDiagram-MS252O5E-DiT9bo27.js} +1 -1
  127. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-C6oTo_BW.js → sankeyDiagram-XADWPNL6-EkRnGTxM.js} +1 -1
  128. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-DZhUqa93.js → sequenceDiagram-FGHM5R23-BUiQA3SI.js} +1 -1
  129. package/payload/server/public/assets/share-2-CQp5pId4.js +1 -0
  130. package/payload/server/public/assets/{src-CE18leCm.js → src-DQQCRlaQ.js} +1 -1
  131. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-BHHHyE3Q.js → stateDiagram-FHFEXIEX-Fij35Tic.js} +1 -1
  132. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DQzhSd8K.js +1 -0
  133. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-CO7-xxpE.js → timeline-definition-GMOUNBTQ-BMsyr7wU.js} +1 -1
  134. package/payload/server/public/assets/treeView-SZITEDCU-CHyRL9e4.js +1 -0
  135. package/payload/server/public/assets/treemap-W4RFUUIX-DpQ_FOO6.js +1 -0
  136. package/payload/server/public/assets/useVoiceRecorder-BMxkndFD.js +36 -0
  137. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-CLOInE0r.js → vennDiagram-DHZGUBPP-6fegYFB3.js} +1 -1
  138. package/payload/server/public/assets/wardley-RL74JXVD-CWBIAatW.js +1 -0
  139. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-BjgSwG0b.js → wardleyDiagram-NUSXRM2D-BtJ_B35h.js} +1 -1
  140. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-B3z4BK4L.js → xychartDiagram-5P7HB3ND-DJ20B4NY.js} +1 -1
  141. package/payload/server/public/data.html +17 -0
  142. package/payload/server/public/index.html +7 -5
  143. package/payload/server/public/public.html +6 -5
  144. package/payload/server/server.js +247 -133
  145. package/payload/server/public/assets/architecture-YZFGNWBL-BUDIBJAP.js +0 -1
  146. package/payload/server/public/assets/channel-BrpIlIyG.js +0 -1
  147. package/payload/server/public/assets/chunk-426QAEUC-GSccNhhE.js +0 -1
  148. package/payload/server/public/assets/chunk-QZHKN3VN-tM7_0fxy.js +0 -1
  149. package/payload/server/public/assets/classDiagram-6PBFFD2Q-C4ZqhHGM.js +0 -1
  150. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DiXqUWgc.js +0 -1
  151. package/payload/server/public/assets/clone-BdpG6seo.js +0 -1
  152. package/payload/server/public/assets/gitGraph-7Q5UKJZL-DDaWNf-D.js +0 -1
  153. package/payload/server/public/assets/info-OMHHGYJF-CzeItRxz.js +0 -1
  154. package/payload/server/public/assets/infoDiagram-42DDH7IO-CI_73SMs.js +0 -2
  155. package/payload/server/public/assets/packet-4T2RLAQJ-B22Ofvhw.js +0 -1
  156. package/payload/server/public/assets/pie-ZZUOXDRM-Pt4vBFsr.js +0 -1
  157. package/payload/server/public/assets/public-DdVq1Jag.js +0 -5
  158. package/payload/server/public/assets/radar-PYXPWWZC-C6F-a-Hg.js +0 -1
  159. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-5wdzy-za.js +0 -1
  160. package/payload/server/public/assets/treeView-SZITEDCU-BHz6YkPq.js +0 -1
  161. package/payload/server/public/assets/treemap-W4RFUUIX-qbRo1jie.js +0 -1
  162. package/payload/server/public/assets/useVoiceRecorder-3Qblv7wH.js +0 -44
  163. package/payload/server/public/assets/wardley-RL74JXVD-BVKDrbVC.js +0 -1
  164. /package/payload/server/public/assets/{_baseFor-DxqHO4yN.js → _baseFor-D71p92tl.js} +0 -0
  165. /package/payload/server/public/assets/{array-B0pZ4ajb.js → array-Bs_owIvv.js} +0 -0
  166. /package/payload/server/public/assets/{chunk-Be6NvmcD.js → chunk-lgnzUk6H.js} +0 -0
  167. /package/payload/server/public/assets/{cytoscape.esm-yP0g-0RD.js → cytoscape.esm-DLG5qhup.js} +0 -0
  168. /package/payload/server/public/assets/{defaultLocale-DOAzocMZ.js → defaultLocale-Du_2bjyv.js} +0 -0
  169. /package/payload/server/public/assets/{init-JRXXbB84.js → init-BYLBkHX_.js} +0 -0
  170. /package/payload/server/public/assets/{useVoiceRecorder-BNLXzSN4.css → jsx-runtime-BNLXzSN4.css} +0 -0
  171. /package/payload/server/public/assets/{katex-zjckjCBG.js → katex-lkho_UhZ.js} +0 -0
  172. /package/payload/server/public/assets/{path-DX61D_oX.js → path-BO54iFkf.js} +0 -0
  173. /package/payload/server/public/assets/{preload-helper-rov5CBGT.js → preload-helper-DWTEM3RW.js} +0 -0
  174. /package/payload/server/public/assets/{rough.esm-Cs8YDIX4.js → rough.esm-BCiZEpQC.js} +0 -0
@@ -1,8 +1,28 @@
1
- import {
2
- __commonJS,
3
- __toESM,
4
- readProgressLog
5
- } from "./chunk-B54KBAK4.js";
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 createServer2 = options.createServer || createServerHTTP;
2640
- const server = createServer2(options.serverOptions || {}, requestListener);
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 readFileSync28, existsSync as existsSync28, watchFile } from "fs";
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
- const uri = process.env.NEO4J_URI ?? "bolt://localhost:7687";
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
- return boltPort - 213;
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}:${UPSTREAM_PORT}${pathAfterPrefix}${url.search}`;
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}:${UPSTREAM_PORT}`);
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 upstream = createConnection2({ host: UPSTREAM_HOST, port: UPSTREAM_PORT });
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}:${UPSTREAM_PORT}`);
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 ?? "bolt://localhost:7687";
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 = { ACCOUNT_ID: accountId, PLATFORM_ROOT: PLATFORM_ROOT4, LOG_DIR: LOG_DIR2, STREAM_LOG_PATH };
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 ?? "bolt://localhost:7687";
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 { createServer } from "net";
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
- const host = new URL(req.url).hostname;
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 existsSync26, readFileSync as readFileSync25 } from "fs";
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 (existsSync26(brandPath2)) {
19121
+ if (existsSync27(brandPath2)) {
19069
19122
  try {
19070
- const brand = JSON.parse(readFileSync25(brandPath2, "utf-8"));
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 readFileSync27 } from "fs";
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 existsSync27, mkdirSync as mkdirSync12, readFileSync as readFileSync26, writeFileSync as writeFileSync17 } from "fs";
19542
- import { dirname as dirname9 } from "path";
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 (!existsSync27(ALIAS_DOMAINS_PATH)) return /* @__PURE__ */ new Set();
19599
+ if (!existsSync28(ALIAS_DOMAINS_PATH)) return /* @__PURE__ */ new Set();
19547
19600
  try {
19548
- const parsed = JSON.parse(readFileSync26(ALIAS_DOMAINS_PATH, "utf-8"));
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(dirname9(ALIAS_DOMAINS_PATH), { recursive: true });
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(readFileSync27(brandPath3, "utf-8"));
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
- return a.name.localeCompare(b.name);
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 && !existsSync28(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 && existsSync28(BRAND_JSON_PATH)) {
20149
+ if (BRAND_JSON_PATH && existsSync29(BRAND_JSON_PATH)) {
20055
20150
  try {
20056
- const parsed = JSON.parse(readFileSync28(BRAND_JSON_PATH, "utf-8"));
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 (!existsSync28(ALIAS_DOMAINS_PATH2)) return null;
20079
- const parsed = JSON.parse(readFileSync28(ALIAS_DOMAINS_PATH2, "utf-8"));
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 (!existsSync28(filePath)) {
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 = readFileSync28(filePath);
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 (!existsSync28(filePath)) {
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 = readFileSync28(filePath);
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 && existsSync28(BRAND_JSON_PATH)) {
20652
+ if (BRAND_JSON_PATH && existsSync29(BRAND_JSON_PATH)) {
20559
20653
  try {
20560
- const fullBrand = JSON.parse(readFileSync28(BRAND_JSON_PATH, "utf-8"));
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 (!existsSync28(versionFile)) return "unknown";
20579
- const content = readFileSync28(versionFile, "utf-8").trim();
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 = readFileSync28(resolve32(process.cwd(), "public", file), "utf-8");
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 (!existsSync28(accountJsonPath)) return null;
20639
- const account = JSON.parse(readFileSync28(accountJsonPath, "utf-8"));
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 (!existsSync28(cachePath)) return null;
20644
- return JSON.parse(readFileSync28(cachePath, "utf-8"));
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 (!existsSync28(accountJsonPath)) return null;
20654
- const account = JSON.parse(readFileSync28(accountJsonPath, "utf-8"));
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 = readFileSync28(resolve32(process.cwd(), "public", "vnc-popout.html"), "utf-8");
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 (existsSync28(USERS_FILE)) {
20786
- const users = JSON.parse(readFileSync28(USERS_FILE, "utf-8").trim() || "[]");
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);