@rubytech/create-maxy-code 0.1.22 → 0.1.23

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 (90) hide show
  1. package/dist/__tests__/samba-provision.test.js +202 -0
  2. package/dist/index.js +127 -73
  3. package/dist/samba-provision.js +215 -0
  4. package/dist/uninstall.js +160 -3
  5. package/package.json +1 -1
  6. package/payload/platform/plugins/docs/references/deployment.md +20 -0
  7. package/payload/platform/plugins/email/references/email-reference.md +4 -4
  8. package/payload/platform/plugins/scheduling/PLUGIN.md +1 -1
  9. package/payload/platform/plugins/workflows/PLUGIN.md +2 -2
  10. package/payload/platform/plugins/workflows/skills/workflow-manager/SKILL.md +1 -1
  11. package/payload/platform/templates/agents/admin/IDENTITY.md +12 -18
  12. package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
  13. package/payload/platform/templates/specialists/agents/project-manager.md +1 -1
  14. package/payload/server/public/assets/{Checkbox-B79fVxpA.js → Checkbox-D1OQD43b.js} +1 -1
  15. package/payload/server/public/assets/admin-czNBxWor.js +216 -0
  16. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-D8e59YJ0.js → architectureDiagram-Q4EWVU46-BcwgT80u.js} +1 -1
  17. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-CxaDkc0A.js → blockDiagram-DXYQGD6D-BMSyZUQA.js} +1 -1
  18. package/payload/server/public/assets/{brand-Cg9t5U6J.css → brand-2cku8WFs.css} +1 -1
  19. package/payload/server/public/assets/{brand-jT16ErmC.js → brand-CSQuxS9w.js} +1 -1
  20. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-D0PAvq-q.js → c4Diagram-AHTNJAMY-DPRGY1jJ.js} +1 -1
  21. package/payload/server/public/assets/channel-fxEghWew.js +1 -0
  22. package/payload/server/public/assets/{chunk-336JU56O-B-CXn-Et.js → chunk-336JU56O-B7oQ3g1c.js} +2 -2
  23. package/payload/server/public/assets/{chunk-426QAEUC-BLzCQHKA.js → chunk-426QAEUC-C1P0yFXw.js} +1 -1
  24. package/payload/server/public/assets/{chunk-4TB4RGXK-Bql1UwLT.js → chunk-4TB4RGXK-LI7kOJd0.js} +1 -1
  25. package/payload/server/public/assets/{chunk-5FUZZQ4R-CQK7jBtX.js → chunk-5FUZZQ4R-CXQRGTQE.js} +1 -1
  26. package/payload/server/public/assets/{chunk-5PVQY5BW-AJc1-lvX.js → chunk-5PVQY5BW-NSyzpXRy.js} +1 -1
  27. package/payload/server/public/assets/{chunk-EDXVE4YY-Cf3E3THL.js → chunk-EDXVE4YY-voNwxbDs.js} +1 -1
  28. package/payload/server/public/assets/{chunk-ENJZ2VHE-BNx6z6hJ.js → chunk-ENJZ2VHE-CMEMPzYY.js} +1 -1
  29. package/payload/server/public/assets/{chunk-ICPOFSXX-DBUEFs2-.js → chunk-ICPOFSXX-hEbwu-pe.js} +1 -1
  30. package/payload/server/public/assets/{chunk-OYMX7WX6-Csx2p315.js → chunk-OYMX7WX6-DxskDrLs.js} +1 -1
  31. package/payload/server/public/assets/{chunk-U2HBQHQK-x17h7UYW.js → chunk-U2HBQHQK-D7TKgUo0.js} +1 -1
  32. package/payload/server/public/assets/{chunk-X2U36JSP--Lkl5yjV.js → chunk-X2U36JSP-BvPUQEPm.js} +1 -1
  33. package/payload/server/public/assets/{chunk-YZCP3GAM-C4GsNX8A.js → chunk-YZCP3GAM-BY-RWQUW.js} +1 -1
  34. package/payload/server/public/assets/{chunk-ZZ45TVLE-YrhUPmZc.js → chunk-ZZ45TVLE-DZvOYDY6.js} +1 -1
  35. package/payload/server/public/assets/classDiagram-6PBFFD2Q-BsWzGW0N.js +1 -0
  36. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BGVa3h90.js +1 -0
  37. package/payload/server/public/assets/clone-Khvocke2.js +1 -0
  38. package/payload/server/public/assets/{dagre-YVALPG-M.js → dagre-Bt-fpckL.js} +1 -1
  39. package/payload/server/public/assets/{dagre-KV5264BT-D6JU6DW_.js → dagre-KV5264BT-Cnj0mUZl.js} +1 -1
  40. package/payload/server/public/assets/data-DBd-Buhp.js +1 -0
  41. package/payload/server/public/assets/device-url-actions-Bjz3Xzbm.js +33 -0
  42. package/payload/server/public/assets/{diagram-5BDNPKRD-yeO06N5Q.js → diagram-5BDNPKRD-DjLzvOlx.js} +1 -1
  43. package/payload/server/public/assets/{diagram-G4DWMVQ6-DzbVT_BC.js → diagram-G4DWMVQ6-DTfuRd-T.js} +1 -1
  44. package/payload/server/public/assets/{diagram-MMDJMWI5-DwYO5VZF.js → diagram-MMDJMWI5-BaL2mCnx.js} +1 -1
  45. package/payload/server/public/assets/{diagram-TYMM5635-BLUcdkDS.js → diagram-TYMM5635-C5InWY5R.js} +1 -1
  46. package/payload/server/public/assets/{erDiagram-SMLLAGMA-BiEUB19e.js → erDiagram-SMLLAGMA-DO7BXTpn.js} +1 -1
  47. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-TILIKxOp.js → flowDiagram-DWJPFMVM-DDdAKfLf.js} +1 -1
  48. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-B7cGzYqT.js → ganttDiagram-T4ZO3ILL-arJD8Utm.js} +1 -1
  49. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-DFOxN5bc.js → gitGraphDiagram-UUTBAWPF-C55GH-OS.js} +1 -1
  50. package/payload/server/public/assets/graph-DUtVdnZ6.js +1 -0
  51. package/payload/server/public/assets/graph-labels-Dxfue-fP.js +1 -0
  52. package/payload/server/public/assets/{graphlib-BBibixaA.js → graphlib-DL9PM7Ex.js} +1 -1
  53. package/payload/server/public/assets/{infoDiagram-42DDH7IO-nH2azhY8.js → infoDiagram-42DDH7IO-BMSGqUbG.js} +1 -1
  54. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-WD3tfqFi.js → ishikawaDiagram-UXIWVN3A-Dw6BZ6BG.js} +1 -1
  55. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-LUkaVSqw.js → journeyDiagram-VCZTEJTY-DrywUGXw.js} +1 -1
  56. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-Dk-lYgpJ.js → kanban-definition-6JOO6SKY-DuwtVBBc.js} +1 -1
  57. package/payload/server/public/assets/{line-BDv6CEnp.js → line-JAksyKHj.js} +1 -1
  58. package/payload/server/public/assets/{mermaid-parser.core-D2XsSGgp.js → mermaid-parser.core-BMq-ApBW.js} +1 -1
  59. package/payload/server/public/assets/{mermaid.core-FyN-UmQV.js → mermaid.core-tH4oX0Kh.js} +3 -3
  60. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-BRAHEUIS.js → mindmap-definition-QFDTVHPH-D1OiiJga.js} +1 -1
  61. package/payload/server/public/assets/page-BZpoS7iR.js +1 -0
  62. package/payload/server/public/assets/{page-CTbSJbem.js → page-CkvBvezS.js} +2 -2
  63. package/payload/server/public/assets/{pieDiagram-DEJITSTG-BqibVC2X.js → pieDiagram-DEJITSTG-Ckwm69PW.js} +1 -1
  64. package/payload/server/public/assets/{public-BDUZIabs.js → public-C-dTMgXu.js} +5 -5
  65. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-DNuExGnr.js → quadrantDiagram-34T5L4WZ-COw3yZ1j.js} +1 -1
  66. package/payload/server/public/assets/{requirementDiagram-MS252O5E-5JXTdydh.js → requirementDiagram-MS252O5E-DqGzM4K-.js} +1 -1
  67. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-B_8rhvcR.js → sankeyDiagram-XADWPNL6-D-l1c_Pl.js} +1 -1
  68. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-BznkBgjf.js → sequenceDiagram-FGHM5R23-BeIi0DtJ.js} +1 -1
  69. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-BeAZOQfs.js → stateDiagram-FHFEXIEX-C-jgegLk.js} +1 -1
  70. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BaMs8Znv.js +1 -0
  71. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-CpJAs-Vw.js → timeline-definition-GMOUNBTQ-BGFKkYmi.js} +1 -1
  72. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-BzH3ItkG.js → vennDiagram-DHZGUBPP-5NuIhJLS.js} +1 -1
  73. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-ax9AgwA1.js → wardleyDiagram-NUSXRM2D-Be9ytVut.js} +1 -1
  74. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-CV6vt_tW.js → xychartDiagram-5P7HB3ND-DCyHg41R.js} +1 -1
  75. package/payload/server/public/data.html +5 -5
  76. package/payload/server/public/graph.html +6 -6
  77. package/payload/server/public/index.html +8 -8
  78. package/payload/server/public/public.html +5 -5
  79. package/payload/server/server.js +135 -85
  80. package/payload/server/public/assets/admin-CXLuiXFU.js +0 -216
  81. package/payload/server/public/assets/channel-BU_eIdRB.js +0 -1
  82. package/payload/server/public/assets/classDiagram-6PBFFD2Q-DMpM1d2b.js +0 -1
  83. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-D_XbuPVj.js +0 -1
  84. package/payload/server/public/assets/clone-BBT00JUO.js +0 -1
  85. package/payload/server/public/assets/data-BdwO_kv-.js +0 -1
  86. package/payload/server/public/assets/device-url-actions-C8dD0ydz.js +0 -33
  87. package/payload/server/public/assets/graph-DpgsOhUZ.js +0 -1
  88. package/payload/server/public/assets/graph-labels-DJ717p00.js +0 -1
  89. package/payload/server/public/assets/page-BWHYktEF.js +0 -1
  90. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-iVlXKz7S.js +0 -1
@@ -650,8 +650,8 @@ var serveStatic = (options = { root: "" }) => {
650
650
  };
651
651
 
652
652
  // server/index.ts
653
- import { readFileSync as readFileSync22, existsSync as existsSync25, watchFile } from "fs";
654
- import { resolve as resolve25, join as join13, basename as basename5 } from "path";
653
+ import { readFileSync as readFileSync22, existsSync as existsSync26, watchFile } from "fs";
654
+ import { resolve as resolve25, join as join14, basename as basename5 } from "path";
655
655
  import { homedir as homedir5 } from "os";
656
656
 
657
657
  // app/lib/agent-slug-pattern.ts
@@ -7410,7 +7410,7 @@ app7.get("/group-info", async (c) => {
7410
7410
  var whatsapp_default = app7;
7411
7411
 
7412
7412
  // server/routes/onboarding.ts
7413
- import { spawn, execFileSync as execFileSync2 } from "child_process";
7413
+ import { spawn, spawnSync as spawnSync2, execFileSync as execFileSync2 } from "child_process";
7414
7414
  import { openSync, closeSync, writeFileSync as writeFileSync9, writeSync, existsSync as existsSync10, mkdirSync as mkdirSync6, readFileSync as readFileSync13, unlinkSync as unlinkSync2 } from "fs";
7415
7415
  import { resolve as resolve11, dirname as dirname4 } from "path";
7416
7416
  import { createHash, randomUUID as randomUUID6 } from "crypto";
@@ -7705,6 +7705,24 @@ app8.post("/set-pin", async (c) => {
7705
7705
  return c.json({ error: "PIN saved but admin role could not be recorded. See server log." }, 500);
7706
7706
  }
7707
7707
  console.log(`[set-pin] wrote users.json + account.json admins: userId=${userId.slice(0, 8)}\u2026 role=owner`);
7708
+ if (process.platform === "linux") {
7709
+ const smbProc = spawnSync2("sudo", ["-n", "smbpasswd", "-a", "-s", "admin"], {
7710
+ input: `${body.pin}
7711
+ ${body.pin}
7712
+ `,
7713
+ stdio: ["pipe", "pipe", "pipe"],
7714
+ encoding: "utf-8",
7715
+ timeout: 1e4
7716
+ });
7717
+ if (smbProc.status === 0) {
7718
+ console.log(`[set-pin] smb-password-synced userId=${userId.slice(0, 8)}\u2026`);
7719
+ } else {
7720
+ const stderr = (smbProc.stderr ?? "").trim().slice(0, 200);
7721
+ console.error(`[set-pin] smb-password-sync-failed exit=${smbProc.status} stderr=${JSON.stringify(stderr)}`);
7722
+ }
7723
+ } else {
7724
+ console.log(`[set-pin] smb-password-sync-skipped reason=non-linux platform=${process.platform}`);
7725
+ }
7708
7726
  try {
7709
7727
  const adminBind = await writeAdminUserAndPerson({
7710
7728
  userId,
@@ -9447,32 +9465,64 @@ app21.put("/:id/label", requireAdminSession, async (c) => {
9447
9465
  var sessions_default = app21;
9448
9466
 
9449
9467
  // app/lib/claude-agent/onboarding-prompt.ts
9450
- var eligibleForInjection = /* @__PURE__ */ new Set();
9468
+ import { mkdirSync as mkdirSync7, rmSync as rmSync2, existsSync as existsSync18, writeFileSync as writeFileSync11 } from "fs";
9469
+ import { join as join11 } from "path";
9470
+ var TAG19 = "[onboarding-inject]";
9471
+ function eligibilityDir() {
9472
+ const override = process.env.MAXY_ONBOARDING_ELIGIBILITY_DIR;
9473
+ if (override && override.length > 0) return override;
9474
+ return join11(MAXY_DIR, "state", "onboarding-injection");
9475
+ }
9476
+ function markerPath(managerSessionId) {
9477
+ if (managerSessionId.includes("/") || managerSessionId.includes("\\")) {
9478
+ throw new Error(`onboarding-prompt: invalid sessionId ${managerSessionId}`);
9479
+ }
9480
+ return join11(eligibilityDir(), managerSessionId);
9481
+ }
9451
9482
  function markEligibleForInjection(managerSessionId) {
9452
- eligibleForInjection.add(managerSessionId);
9483
+ const dir = eligibilityDir();
9484
+ try {
9485
+ mkdirSync7(dir, { recursive: true });
9486
+ writeFileSync11(markerPath(managerSessionId), "", { flag: "w" });
9487
+ console.log(`${TAG19} mark sessionId=${managerSessionId.slice(0, 8)}`);
9488
+ } catch (err) {
9489
+ const msg = err instanceof Error ? err.message : String(err);
9490
+ console.error(`${TAG19} mark-failed sessionId=${managerSessionId.slice(0, 8)} reason=${msg}`);
9491
+ throw err;
9492
+ }
9453
9493
  }
9454
9494
  function consumeInjectionSlot(managerSessionId) {
9455
- return eligibleForInjection.delete(managerSessionId);
9495
+ const path2 = markerPath(managerSessionId);
9496
+ if (!existsSync18(path2)) return false;
9497
+ try {
9498
+ rmSync2(path2, { force: true });
9499
+ console.log(`${TAG19} consume sessionId=${managerSessionId.slice(0, 8)}`);
9500
+ return true;
9501
+ } catch (err) {
9502
+ const msg = err instanceof Error ? err.message : String(err);
9503
+ console.error(`${TAG19} consume-rm-failed sessionId=${managerSessionId.slice(0, 8)} reason=${msg}`);
9504
+ return true;
9505
+ }
9456
9506
  }
9457
9507
  async function buildOnboardingPromptBlock(accountId) {
9458
9508
  const step = await loadOnboardingStep(accountId);
9459
9509
  const accountIdShort = accountId.slice(0, 8);
9460
9510
  if (step === null) {
9461
9511
  const block2 = renderUnreachableBlock();
9462
- console.log(`[onboarding-inject] graph-unreachable accountId=${accountIdShort}`);
9512
+ console.log(`${TAG19} graph-unreachable accountId=${accountIdShort}`);
9463
9513
  return { injected: true, block: block2, step: "graph-unreachable" };
9464
9514
  }
9465
9515
  if (step === 9) {
9466
- console.log(`[onboarding-inject] agent=admin accountId=${accountIdShort} step=9 injected=false`);
9516
+ console.log(`${TAG19} agent=admin accountId=${accountIdShort} step=9 injected=false`);
9467
9517
  return { injected: false, reason: "complete" };
9468
9518
  }
9469
9519
  if (step === -1) {
9470
9520
  const block2 = renderIncompleteBlock(-1);
9471
- console.log(`[onboarding-inject] agent=admin accountId=${accountIdShort} step=missing injected=true`);
9521
+ console.log(`${TAG19} agent=admin accountId=${accountIdShort} step=missing injected=true`);
9472
9522
  return { injected: true, block: block2, step: "missing" };
9473
9523
  }
9474
9524
  const block = renderIncompleteBlock(step);
9475
- console.log(`[onboarding-inject] agent=admin accountId=${accountIdShort} step=${step} injected=true`);
9525
+ console.log(`${TAG19} agent=admin accountId=${accountIdShort} step=${step} injected=true`);
9476
9526
  return { injected: true, block, step };
9477
9527
  }
9478
9528
  function renderIncompleteBlock(currentStep) {
@@ -9495,7 +9545,7 @@ function renderUnreachableBlock() {
9495
9545
  }
9496
9546
 
9497
9547
  // server/routes/admin/claude-sessions.ts
9498
- var TAG19 = "[claude-session-manager:wrapper]";
9548
+ var TAG20 = "[claude-session-manager:wrapper]";
9499
9549
  function managerBase() {
9500
9550
  const port2 = Number(process.env.CLAUDE_SESSION_MANAGER_PORT ?? "19400");
9501
9551
  return `http://127.0.0.1:${port2}`;
@@ -9506,7 +9556,7 @@ app22.post("/", async (c) => {
9506
9556
  const cacheKey = c.get("cacheKey") ?? "";
9507
9557
  const senderId = getAccountIdForSession(cacheKey) ?? "";
9508
9558
  if (!senderId) {
9509
- console.error(`${TAG19} reject reason=no-account-id`);
9559
+ console.error(`${TAG20} reject reason=no-account-id`);
9510
9560
  return c.json({ error: "admin-account-not-resolved" }, 500);
9511
9561
  }
9512
9562
  let body = {};
@@ -9521,7 +9571,7 @@ app22.post("/", async (c) => {
9521
9571
  headers: { "content-type": "application/json" },
9522
9572
  body: JSON.stringify({ senderId, role: "admin", channel })
9523
9573
  }).catch((err) => {
9524
- console.error(`${TAG19} fetch-failed op=spawn message=${err instanceof Error ? err.message : String(err)}`);
9574
+ console.error(`${TAG20} fetch-failed op=spawn message=${err instanceof Error ? err.message : String(err)}`);
9525
9575
  return null;
9526
9576
  });
9527
9577
  if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
@@ -9543,14 +9593,14 @@ app22.post("/", async (c) => {
9543
9593
  consumeInjectionSlot(spawnedSessionId);
9544
9594
  }
9545
9595
  } catch (err) {
9546
- console.error(`${TAG19} initial-message-inject failed: ${err instanceof Error ? err.message : String(err)}`);
9596
+ console.error(`${TAG20} initial-message-inject failed: ${err instanceof Error ? err.message : String(err)}`);
9547
9597
  }
9548
9598
  fetch(`${managerBase()}/${encodeURIComponent(spawnedSessionId)}/input`, {
9549
9599
  method: "POST",
9550
9600
  headers: { "content-type": "application/json" },
9551
9601
  body: outboundBody
9552
9602
  }).catch((err) => {
9553
- console.error(`${TAG19} fetch-failed op=initial-input message=${err instanceof Error ? err.message : String(err)}`);
9603
+ console.error(`${TAG20} fetch-failed op=initial-input message=${err instanceof Error ? err.message : String(err)}`);
9554
9604
  });
9555
9605
  }
9556
9606
  return new Response(upstream.body, { status: upstream.status, headers: upstream.headers });
@@ -9562,7 +9612,7 @@ app22.get("/", async (c) => {
9562
9612
  const upstream = await fetch(
9563
9613
  `${managerBase()}/list?senderId=${encodeURIComponent(senderId)}`
9564
9614
  ).catch((err) => {
9565
- console.error(`${TAG19} fetch-failed op=list message=${err instanceof Error ? err.message : String(err)}`);
9615
+ console.error(`${TAG20} fetch-failed op=list message=${err instanceof Error ? err.message : String(err)}`);
9566
9616
  return null;
9567
9617
  });
9568
9618
  if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
@@ -9592,7 +9642,7 @@ app22.post("/resume", async (c) => {
9592
9642
  claudeSessionId: body.claudeSessionId
9593
9643
  })
9594
9644
  }).catch((err) => {
9595
- console.error(`${TAG19} fetch-failed op=resume message=${err instanceof Error ? err.message : String(err)}`);
9645
+ console.error(`${TAG20} fetch-failed op=resume message=${err instanceof Error ? err.message : String(err)}`);
9596
9646
  return null;
9597
9647
  });
9598
9648
  if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
@@ -9605,7 +9655,7 @@ app22.delete("/:sessionId", async (c) => {
9605
9655
  `${managerBase()}/${encodeURIComponent(sessionId)}${purge}`,
9606
9656
  { method: "DELETE" }
9607
9657
  ).catch((err) => {
9608
- console.error(`${TAG19} fetch-failed op=delete message=${err instanceof Error ? err.message : String(err)}`);
9658
+ console.error(`${TAG20} fetch-failed op=delete message=${err instanceof Error ? err.message : String(err)}`);
9609
9659
  return null;
9610
9660
  });
9611
9661
  if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
@@ -9622,7 +9672,7 @@ app22.post("/:sessionId/archive", async (c) => {
9622
9672
  body
9623
9673
  }
9624
9674
  ).catch((err) => {
9625
- console.error(`${TAG19} fetch-failed op=archive message=${err instanceof Error ? err.message : String(err)}`);
9675
+ console.error(`${TAG20} fetch-failed op=archive message=${err instanceof Error ? err.message : String(err)}`);
9626
9676
  return null;
9627
9677
  });
9628
9678
  if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
@@ -9633,7 +9683,7 @@ app22.get("/:sessionId/meta", async (c) => {
9633
9683
  const upstream = await fetch(
9634
9684
  `${managerBase()}/${encodeURIComponent(sessionId)}/meta`
9635
9685
  ).catch((err) => {
9636
- console.error(`${TAG19} fetch-failed op=meta message=${err instanceof Error ? err.message : String(err)}`);
9686
+ console.error(`${TAG20} fetch-failed op=meta message=${err instanceof Error ? err.message : String(err)}`);
9637
9687
  return null;
9638
9688
  });
9639
9689
  if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
@@ -9650,7 +9700,7 @@ app22.patch("/:sessionId", async (c) => {
9650
9700
  body
9651
9701
  }
9652
9702
  ).catch((err) => {
9653
- console.error(`${TAG19} fetch-failed op=patch message=${err instanceof Error ? err.message : String(err)}`);
9703
+ console.error(`${TAG20} fetch-failed op=patch message=${err instanceof Error ? err.message : String(err)}`);
9654
9704
  return null;
9655
9705
  });
9656
9706
  if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
@@ -9676,7 +9726,7 @@ app22.post("/:sessionId/input", async (c) => {
9676
9726
  outboundBody = JSON.stringify({ ...parsed, text: outcome.block + parsed.text });
9677
9727
  }
9678
9728
  } catch (err) {
9679
- console.error(`${TAG19} onboarding-inject failed: ${err instanceof Error ? err.message : String(err)}`);
9729
+ console.error(`${TAG20} onboarding-inject failed: ${err instanceof Error ? err.message : String(err)}`);
9680
9730
  }
9681
9731
  }
9682
9732
  }
@@ -9688,7 +9738,7 @@ app22.post("/:sessionId/input", async (c) => {
9688
9738
  body: outboundBody
9689
9739
  }
9690
9740
  ).catch((err) => {
9691
- console.error(`${TAG19} fetch-failed op=input message=${err instanceof Error ? err.message : String(err)}`);
9741
+ console.error(`${TAG20} fetch-failed op=input message=${err instanceof Error ? err.message : String(err)}`);
9692
9742
  return null;
9693
9743
  });
9694
9744
  if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
@@ -9700,7 +9750,7 @@ app22.get("/:sessionId/log", async (c) => {
9700
9750
  const upstream = await fetch(
9701
9751
  `${managerBase()}/${encodeURIComponent(sessionId)}/log${follow}`
9702
9752
  ).catch((err) => {
9703
- console.error(`${TAG19} fetch-failed op=log message=${err instanceof Error ? err.message : String(err)}`);
9753
+ console.error(`${TAG20} fetch-failed op=log message=${err instanceof Error ? err.message : String(err)}`);
9704
9754
  return null;
9705
9755
  });
9706
9756
  if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
@@ -9816,13 +9866,13 @@ async function cdpNavigateNewTab(url, opts = {}) {
9816
9866
  // server/routes/admin/device-browser.ts
9817
9867
  var app25 = new Hono();
9818
9868
  app25.post("/navigate", async (c) => {
9819
- const TAG20 = "[device-url:click]";
9869
+ const TAG21 = "[device-url:click]";
9820
9870
  let body;
9821
9871
  try {
9822
9872
  body = await c.req.json();
9823
9873
  } catch (err) {
9824
9874
  const detail = err instanceof Error ? err.message : String(err);
9825
- console.error(`${TAG20} reject reason=body-not-json detail=${detail} browser=fallback navigateResult=error`);
9875
+ console.error(`${TAG21} reject reason=body-not-json detail=${detail} browser=fallback navigateResult=error`);
9826
9876
  return c.json(
9827
9877
  { ok: false, navigateResult: "error", browser: "fallback", detail: "Request body was not valid JSON" },
9828
9878
  400
@@ -9832,7 +9882,7 @@ app25.post("/navigate", async (c) => {
9832
9882
  const intent = typeof body.intent === "string" ? body.intent : "";
9833
9883
  const hostname2 = typeof body.hostname === "string" ? body.hostname : "";
9834
9884
  if (!url) {
9835
- console.error(`${TAG20} reject reason=missing-url intent=${JSON.stringify(intent)} browser=fallback navigateResult=error`);
9885
+ console.error(`${TAG21} reject reason=missing-url intent=${JSON.stringify(intent)} browser=fallback navigateResult=error`);
9836
9886
  return c.json(
9837
9887
  { ok: false, navigateResult: "error", browser: "fallback", detail: "url field is required" },
9838
9888
  400
@@ -9842,7 +9892,7 @@ app25.post("/navigate", async (c) => {
9842
9892
  try {
9843
9893
  parsed = new URL(url);
9844
9894
  } catch {
9845
- console.error(`${TAG20} reject reason=url-malformed intent=${JSON.stringify(intent)} url=${url} browser=fallback navigateResult=error`);
9895
+ console.error(`${TAG21} reject reason=url-malformed intent=${JSON.stringify(intent)} url=${url} browser=fallback navigateResult=error`);
9846
9896
  return c.json(
9847
9897
  { ok: false, navigateResult: "error", browser: "fallback", detail: "url is not a valid URL" },
9848
9898
  400
@@ -9850,7 +9900,7 @@ app25.post("/navigate", async (c) => {
9850
9900
  }
9851
9901
  if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
9852
9902
  console.error(
9853
- `${TAG20} reject reason=scheme-not-allowed scheme=${parsed.protocol} intent=${JSON.stringify(intent)} browser=fallback navigateResult=error`
9903
+ `${TAG21} reject reason=scheme-not-allowed scheme=${parsed.protocol} intent=${JSON.stringify(intent)} browser=fallback navigateResult=error`
9854
9904
  );
9855
9905
  return c.json(
9856
9906
  {
@@ -9866,7 +9916,7 @@ app25.post("/navigate", async (c) => {
9866
9916
  const cdpOk = await ensureCdp(transport);
9867
9917
  if (!cdpOk) {
9868
9918
  console.error(
9869
- `${TAG20} intent=${JSON.stringify(intent)} browser=fallback navigateResult=cdp-unreachable hostname=${JSON.stringify(hostname2)}`
9919
+ `${TAG21} intent=${JSON.stringify(intent)} browser=fallback navigateResult=cdp-unreachable hostname=${JSON.stringify(hostname2)}`
9870
9920
  );
9871
9921
  return c.json(
9872
9922
  {
@@ -9882,7 +9932,7 @@ app25.post("/navigate", async (c) => {
9882
9932
  const browser = outcome.result === "ok" ? "vnc" : "fallback";
9883
9933
  const detailStr = outcome.detail ? ` detail=${JSON.stringify(outcome.detail.length > 230 ? outcome.detail.slice(0, 227) + "..." : outcome.detail)}` : "";
9884
9934
  console.error(
9885
- `${TAG20} intent=${JSON.stringify(intent)} browser=${browser} navigateResult=${outcome.result} hostname=${JSON.stringify(hostname2)} targetId=${outcome.targetId ?? "none"}${detailStr}`
9935
+ `${TAG21} intent=${JSON.stringify(intent)} browser=${browser} navigateResult=${outcome.result} hostname=${JSON.stringify(hostname2)} targetId=${outcome.targetId ?? "none"}${detailStr}`
9886
9936
  );
9887
9937
  if (outcome.result !== "ok") {
9888
9938
  return c.json(
@@ -9913,18 +9963,18 @@ var ALLOWED_EVENTS2 = /* @__PURE__ */ new Set([
9913
9963
  ]);
9914
9964
  var app26 = new Hono();
9915
9965
  app26.post("/", async (c) => {
9916
- const TAG20 = "[admin:events]";
9966
+ const TAG21 = "[admin:events]";
9917
9967
  let body;
9918
9968
  try {
9919
9969
  body = await c.req.json();
9920
9970
  } catch (err) {
9921
9971
  const detail = err instanceof Error ? err.message : String(err);
9922
- console.error(`${TAG20} reject reason=body-not-json detail=${detail}`);
9972
+ console.error(`${TAG21} reject reason=body-not-json detail=${detail}`);
9923
9973
  return c.json({ ok: false, detail: "Request body was not valid JSON" }, 400);
9924
9974
  }
9925
9975
  const event = typeof body.event === "string" ? body.event : "";
9926
9976
  if (!ALLOWED_EVENTS2.has(event)) {
9927
- console.error(`${TAG20} reject reason=event-not-allowed event=${JSON.stringify(event)}`);
9977
+ console.error(`${TAG21} reject reason=event-not-allowed event=${JSON.stringify(event)}`);
9928
9978
  return c.json({ ok: false, detail: `Event "${event}" is not allowed` }, 400);
9929
9979
  }
9930
9980
  const rawFields = body.fields && typeof body.fields === "object" ? body.fields : {};
@@ -9964,12 +10014,12 @@ function isValidDomain(value) {
9964
10014
  }
9965
10015
 
9966
10016
  // app/lib/alias-domains.ts
9967
- import { existsSync as existsSync18, mkdirSync as mkdirSync7, readFileSync as readFileSync17, writeFileSync as writeFileSync11 } from "fs";
10017
+ import { existsSync as existsSync19, mkdirSync as mkdirSync8, readFileSync as readFileSync17, writeFileSync as writeFileSync12 } from "fs";
9968
10018
  import { dirname as dirname5 } from "path";
9969
10019
  import { resolve as resolve15 } from "path";
9970
10020
  var ALIAS_DOMAINS_PATH = resolve15(MAXY_DIR, "alias-domains.json");
9971
10021
  function readExisting() {
9972
- if (!existsSync18(ALIAS_DOMAINS_PATH)) return /* @__PURE__ */ new Set();
10022
+ if (!existsSync19(ALIAS_DOMAINS_PATH)) return /* @__PURE__ */ new Set();
9973
10023
  try {
9974
10024
  const parsed = JSON.parse(readFileSync17(ALIAS_DOMAINS_PATH, "utf-8"));
9975
10025
  if (!Array.isArray(parsed)) return /* @__PURE__ */ new Set();
@@ -9982,13 +10032,13 @@ function addAliasDomain(hostname2) {
9982
10032
  const existing = readExisting();
9983
10033
  if (existing.has(hostname2)) return;
9984
10034
  existing.add(hostname2);
9985
- mkdirSync7(dirname5(ALIAS_DOMAINS_PATH), { recursive: true });
9986
- writeFileSync11(ALIAS_DOMAINS_PATH, JSON.stringify([...existing], null, 2) + "\n", "utf-8");
10035
+ mkdirSync8(dirname5(ALIAS_DOMAINS_PATH), { recursive: true });
10036
+ writeFileSync12(ALIAS_DOMAINS_PATH, JSON.stringify([...existing], null, 2) + "\n", "utf-8");
9987
10037
  }
9988
10038
 
9989
10039
  // app/lib/script-stream-tailer.ts
9990
10040
  import * as childProcess from "child_process";
9991
- import { appendFileSync as appendFileSync3, createReadStream as createReadStream2, mkdirSync as mkdirSync8, statSync as statSync6 } from "fs";
10041
+ import { appendFileSync as appendFileSync3, createReadStream as createReadStream2, mkdirSync as mkdirSync9, statSync as statSync6 } from "fs";
9992
10042
  import { dirname as dirname6 } from "path";
9993
10043
  import { StringDecoder } from "string_decoder";
9994
10044
  var SCRIPT_STREAM_RE = /^\[([^\]]+)\] \[script:([a-z][a-z0-9-]*)((?::[a-z0-9:_-]+)?)\] (.*)$/;
@@ -10098,7 +10148,7 @@ function writeRouteMilestone(streamLogPath, scope, line) {
10098
10148
  }
10099
10149
  const ts = (/* @__PURE__ */ new Date()).toISOString();
10100
10150
  try {
10101
- mkdirSync8(dirname6(streamLogPath), { recursive: true });
10151
+ mkdirSync9(dirname6(streamLogPath), { recursive: true });
10102
10152
  appendFileSync3(streamLogPath, `[${ts}] [script:${scope}] ${line}
10103
10153
  `);
10104
10154
  } catch (err) {
@@ -10488,8 +10538,8 @@ app27.get("/tunnels", requireAdminSession, async (c) => {
10488
10538
  if (!correlationId) return err("session", "No active conversation for session \u2014 refresh chat.");
10489
10539
  streamLogPath = streamLogPathFor(accountId, correlationId).streamLogPath;
10490
10540
  const certPath = resolve16(homedir4(), brand.configDir, "cloudflared", "cert.pem");
10491
- const { existsSync: existsSync26 } = await import("fs");
10492
- if (!existsSync26(certPath)) {
10541
+ const { existsSync: existsSync27 } = await import("fs");
10542
+ if (!existsSync27(certPath)) {
10493
10543
  return err("cert", `Cloudflare origin certificate is not on disk yet (${certPath}). Complete the Cloudflare login first by submitting the form once \u2014 the OAuth flow writes cert.pem.`);
10494
10544
  }
10495
10545
  const result = await runFormSpawn({
@@ -10813,7 +10863,7 @@ var cloudflare_default = app27;
10813
10863
  import { createReadStream as createReadStream3 } from "fs";
10814
10864
  import { readdir as readdir2, readFile as readFile4, stat as stat4, mkdir as mkdir3, writeFile as writeFile4, unlink as unlink2 } from "fs/promises";
10815
10865
  import { realpathSync as realpathSync4 } from "fs";
10816
- import { basename as basename4, dirname as dirname7, join as join11, resolve as resolve18, sep as sep3 } from "path";
10866
+ import { basename as basename4, dirname as dirname7, join as join12, resolve as resolve18, sep as sep3 } from "path";
10817
10867
  import { Readable as Readable2 } from "stream";
10818
10868
 
10819
10869
  // app/lib/data-path.ts
@@ -11171,7 +11221,7 @@ async function cascadeDeleteDocument(params) {
11171
11221
  var UUID_RE7 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
11172
11222
  async function readMeta(absDir, baseName) {
11173
11223
  try {
11174
- const raw = await readFile4(join11(absDir, `${baseName}.meta.json`), "utf8");
11224
+ const raw = await readFile4(join12(absDir, `${baseName}.meta.json`), "utf8");
11175
11225
  const parsed = JSON.parse(raw);
11176
11226
  if (typeof parsed?.filename === "string") {
11177
11227
  return { filename: parsed.filename, mimeType: typeof parsed.mimeType === "string" ? parsed.mimeType : void 0 };
@@ -11209,7 +11259,7 @@ async function readAccountNames() {
11209
11259
  }
11210
11260
  async function enrich(absolute, entry, accountNames) {
11211
11261
  if (entry.kind === "directory" && UUID_RE7.test(entry.name)) {
11212
- const meta = await readMeta(join11(absolute, entry.name), entry.name);
11262
+ const meta = await readMeta(join12(absolute, entry.name), entry.name);
11213
11263
  if (meta?.filename) {
11214
11264
  entry.displayName = meta.filename;
11215
11265
  entry.mimeType = meta.mimeType;
@@ -11268,7 +11318,7 @@ app28.get("/", requireAdminSession, async (c) => {
11268
11318
  continue;
11269
11319
  }
11270
11320
  try {
11271
- const entryPath = join11(absolute, name);
11321
+ const entryPath = join12(absolute, name);
11272
11322
  const s = await stat4(entryPath);
11273
11323
  entries.push({
11274
11324
  name,
@@ -11441,7 +11491,7 @@ app28.delete("/", requireAdminSession, async (c) => {
11441
11491
  }
11442
11492
  const dot = base.lastIndexOf(".");
11443
11493
  const stem = dot === -1 ? base : base.slice(0, dot);
11444
- const sidecarPath = UUID_RE7.test(stem) && base !== `${stem}.meta.json` ? join11(dirname7(absolute), `${stem}.meta.json`) : null;
11494
+ const sidecarPath = UUID_RE7.test(stem) && base !== `${stem}.meta.json` ? join12(dirname7(absolute), `${stem}.meta.json`) : null;
11445
11495
  await unlink2(absolute);
11446
11496
  if (sidecarPath) {
11447
11497
  try {
@@ -13107,7 +13157,7 @@ var file_attach_default = app35;
13107
13157
  import neo4j3 from "neo4j-driver";
13108
13158
  import { readFile as readFile5, readdir as readdir3, stat as stat5 } from "fs/promises";
13109
13159
  import { resolve as resolve19, relative as relative2, isAbsolute } from "path";
13110
- import { existsSync as existsSync19 } from "fs";
13160
+ import { existsSync as existsSync20 } from "fs";
13111
13161
  var LIMIT = 50;
13112
13162
  var TEXT_MIME_PREFIXES = ["text/", "application/json", "application/markdown"];
13113
13163
  var ADMIN_AGENT_FILES = ["IDENTITY.md", "SOUL.md", "KNOWLEDGE.md"];
@@ -13255,7 +13305,7 @@ async function fetchAgentTemplateRows(accountDir) {
13255
13305
  async function unionSpecialistFilenames(overrideDir, bundledDir) {
13256
13306
  const names = /* @__PURE__ */ new Set();
13257
13307
  for (const dir of [overrideDir, bundledDir]) {
13258
- if (!existsSync19(dir)) continue;
13308
+ if (!existsSync20(dir)) continue;
13259
13309
  try {
13260
13310
  const entries = await readdir3(dir);
13261
13311
  for (const entry of entries) {
@@ -13270,7 +13320,7 @@ async function unionSpecialistFilenames(overrideDir, bundledDir) {
13270
13320
  }
13271
13321
  async function readAgentTemplateRow(inp) {
13272
13322
  let chosenPath = null;
13273
- if (existsSync19(inp.overridePath)) {
13323
+ if (existsSync20(inp.overridePath)) {
13274
13324
  try {
13275
13325
  validateFilePathInAccount(inp.overridePath, inp.overrideRoot);
13276
13326
  chosenPath = inp.overridePath;
@@ -13281,7 +13331,7 @@ async function readAgentTemplateRow(inp) {
13281
13331
  );
13282
13332
  return null;
13283
13333
  }
13284
- } else if (existsSync19(inp.bundledPath)) {
13334
+ } else if (existsSync20(inp.bundledPath)) {
13285
13335
  if (!isWithin(inp.bundledPath, inp.bundledRoot)) {
13286
13336
  console.error(
13287
13337
  `[admin/sidebar-artefacts] agent-template-read-failed agent=${inp.displayName} kind=${inp.logName} error="bundled path outside PLATFORM_ROOT"`
@@ -13323,7 +13373,7 @@ var sidebar_artefacts_default = app36;
13323
13373
  // server/routes/admin/sidebar-artefact-save.ts
13324
13374
  import { mkdir as mkdir4, readdir as readdir4, stat as stat6, writeFile as writeFile5 } from "fs/promises";
13325
13375
  import { resolve as resolve20 } from "path";
13326
- import { existsSync as existsSync20 } from "fs";
13376
+ import { existsSync as existsSync21 } from "fs";
13327
13377
  var ADMIN_AGENT_FILES2 = /* @__PURE__ */ new Set(["IDENTITY.md", "SOUL.md", "KNOWLEDGE.md"]);
13328
13378
  var UUID_RE8 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
13329
13379
  var app37 = new Hono();
@@ -13391,7 +13441,7 @@ async function resolveSavePath(id, accountId, accountDir) {
13391
13441
  }
13392
13442
  if (UUID_RE8.test(id)) {
13393
13443
  const dir = resolve20(ATTACHMENTS_ROOT, accountId, id);
13394
- if (!existsSync20(dir)) {
13444
+ if (!existsSync21(dir)) {
13395
13445
  const attShort = id.slice(0, 8);
13396
13446
  if (isHealPending(accountId, id)) {
13397
13447
  console.error(`[admin/sidebar-artefact-save] heal-race attachmentId=${attShort} outcome=503-retry source=heal-pending`);
@@ -13443,7 +13493,7 @@ var sidebar_artefact_save_default = app37;
13443
13493
 
13444
13494
  // server/routes/admin/sidebar-artefact-content.ts
13445
13495
  import { readFile as readFile6, readdir as readdir5 } from "fs/promises";
13446
- import { existsSync as existsSync21 } from "fs";
13496
+ import { existsSync as existsSync22 } from "fs";
13447
13497
  import { resolve as resolve21 } from "path";
13448
13498
  var UUID_RE9 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
13449
13499
  var app38 = new Hono();
@@ -13457,7 +13507,7 @@ app38.get("/", requireAdminSession, async (c) => {
13457
13507
  return new Response("Not found", { status: 404 });
13458
13508
  }
13459
13509
  const dir = resolve21(ATTACHMENTS_ROOT, accountId, id);
13460
- if (!existsSync21(dir)) {
13510
+ if (!existsSync22(dir)) {
13461
13511
  console.error(`[admin/sidebar-artefact-content] not-found id=${id.slice(0, 8)}`);
13462
13512
  return new Response("Not found", { status: 404 });
13463
13513
  }
@@ -13491,12 +13541,12 @@ app38.get("/", requireAdminSession, async (c) => {
13491
13541
  var sidebar_artefact_content_default = app38;
13492
13542
 
13493
13543
  // server/routes/admin/health.ts
13494
- import { existsSync as existsSync22, readFileSync as readFileSync19 } from "fs";
13495
- import { resolve as resolve22, join as join12 } from "path";
13544
+ import { existsSync as existsSync23, readFileSync as readFileSync19 } from "fs";
13545
+ import { resolve as resolve22, join as join13 } from "path";
13496
13546
  var PLATFORM_ROOT8 = process.env.MAXY_PLATFORM_ROOT ?? resolve22(process.cwd(), "..");
13497
13547
  var brandHostname = "maxy";
13498
- var brandJsonPath = join12(PLATFORM_ROOT8, "config", "brand.json");
13499
- if (existsSync22(brandJsonPath)) {
13548
+ var brandJsonPath = join13(PLATFORM_ROOT8, "config", "brand.json");
13549
+ if (existsSync23(brandJsonPath)) {
13500
13550
  try {
13501
13551
  const brand = JSON.parse(readFileSync19(brandJsonPath, "utf-8"));
13502
13552
  if (brand.hostname) brandHostname = brand.hostname;
@@ -13507,7 +13557,7 @@ var VERSION_FILE = resolve22(PLATFORM_ROOT8, `config/.${brandHostname}-version`)
13507
13557
  var PROCESS_STARTED_AT = (/* @__PURE__ */ new Date()).toISOString();
13508
13558
  var PROBE_TIMEOUT_MS = 1e3;
13509
13559
  function readVersion() {
13510
- if (!existsSync22(VERSION_FILE)) return "unknown";
13560
+ if (!existsSync23(VERSION_FILE)) return "unknown";
13511
13561
  return readFileSync19(VERSION_FILE, "utf-8").trim() || "unknown";
13512
13562
  }
13513
13563
  async function probeConversationDb() {
@@ -13593,7 +13643,7 @@ app40.route("/health-brand", health_default2);
13593
13643
  var admin_default = app40;
13594
13644
 
13595
13645
  // server/routes/sites.ts
13596
- import { existsSync as existsSync23, readFileSync as readFileSync20, realpathSync as realpathSync5, statSync as statSync7 } from "fs";
13646
+ import { existsSync as existsSync24, readFileSync as readFileSync20, realpathSync as realpathSync5, statSync as statSync7 } from "fs";
13597
13647
  import { resolve as resolve23 } from "path";
13598
13648
  var SAFE_SEG_RE = /^[a-z0-9_][a-z0-9_.-]{0,99}$/i;
13599
13649
  var MIME = {
@@ -13659,7 +13709,7 @@ app41.get("/:rel{.*}", (c) => {
13659
13709
  }
13660
13710
  let stat7;
13661
13711
  try {
13662
- stat7 = existsSync23(filePath) ? statSync7(filePath) : null;
13712
+ stat7 = existsSync24(filePath) ? statSync7(filePath) : null;
13663
13713
  } catch {
13664
13714
  stat7 = null;
13665
13715
  }
@@ -13678,7 +13728,7 @@ app41.get("/:rel{.*}", (c) => {
13678
13728
  console.error(`[sites] path-traversal-rejected path=${reqPath} reason=escape status=403`);
13679
13729
  return c.text("Forbidden", 403);
13680
13730
  }
13681
- if (!existsSync23(filePath)) {
13731
+ if (!existsSync24(filePath)) {
13682
13732
  console.error(`[sites] not-found path=${reqPath} status=404`);
13683
13733
  return c.text("Not found", 404);
13684
13734
  }
@@ -13814,7 +13864,7 @@ function startGraphHealthTimer() {
13814
13864
 
13815
13865
  // ../lib/entitlement/src/index.ts
13816
13866
  import { createPublicKey, createHash as createHash3, verify as cryptoVerify } from "crypto";
13817
- import { existsSync as existsSync24, readFileSync as readFileSync21, statSync as statSync8 } from "fs";
13867
+ import { existsSync as existsSync25, readFileSync as readFileSync21, statSync as statSync8 } from "fs";
13818
13868
  import { resolve as resolve24 } from "path";
13819
13869
 
13820
13870
  // ../lib/entitlement/src/canonicalize.ts
@@ -13863,7 +13913,7 @@ function resolveEntitlement(brand, account) {
13863
13913
  return logResolved(implicitTrust(account), null);
13864
13914
  }
13865
13915
  const entitlementPath = resolve24(brand.configDir, "entitlement.json");
13866
- if (!existsSync24(entitlementPath)) {
13916
+ if (!existsSync25(entitlementPath)) {
13867
13917
  return logResolved(anonymousFallback("missing"), { reason: "missing" });
13868
13918
  }
13869
13919
  const stat7 = statSync8(entitlementPath);
@@ -14053,12 +14103,12 @@ function clientFrom(c) {
14053
14103
  );
14054
14104
  }
14055
14105
  var PLATFORM_ROOT9 = process.env.MAXY_PLATFORM_ROOT || "";
14056
- var BRAND_JSON_PATH = PLATFORM_ROOT9 ? join13(PLATFORM_ROOT9, "config", "brand.json") : "";
14106
+ var BRAND_JSON_PATH = PLATFORM_ROOT9 ? join14(PLATFORM_ROOT9, "config", "brand.json") : "";
14057
14107
  var BRAND = { productName: "Maxy", hostname: "maxy", configDir: ".maxy", domain: "getmaxy.com" };
14058
- if (BRAND_JSON_PATH && !existsSync25(BRAND_JSON_PATH)) {
14108
+ if (BRAND_JSON_PATH && !existsSync26(BRAND_JSON_PATH)) {
14059
14109
  console.error(`[brand] WARNING: brand.json not found at ${BRAND_JSON_PATH} \u2014 using Maxy defaults`);
14060
14110
  }
14061
- if (BRAND_JSON_PATH && existsSync25(BRAND_JSON_PATH)) {
14111
+ if (BRAND_JSON_PATH && existsSync26(BRAND_JSON_PATH)) {
14062
14112
  try {
14063
14113
  const parsed = JSON.parse(readFileSync22(BRAND_JSON_PATH, "utf-8"));
14064
14114
  BRAND = { ...BRAND, ...parsed };
@@ -14079,10 +14129,10 @@ var brandLoginOpts = {
14079
14129
  bodyFont: BRAND.defaultFonts?.body,
14080
14130
  logoContainsName: !!BRAND.logoContainsName
14081
14131
  };
14082
- var ALIAS_DOMAINS_PATH2 = join13(homedir5(), BRAND.configDir, "alias-domains.json");
14132
+ var ALIAS_DOMAINS_PATH2 = join14(homedir5(), BRAND.configDir, "alias-domains.json");
14083
14133
  function loadAliasDomains() {
14084
14134
  try {
14085
- if (!existsSync25(ALIAS_DOMAINS_PATH2)) return null;
14135
+ if (!existsSync26(ALIAS_DOMAINS_PATH2)) return null;
14086
14136
  const parsed = JSON.parse(readFileSync22(ALIAS_DOMAINS_PATH2, "utf-8"));
14087
14137
  if (!Array.isArray(parsed)) {
14088
14138
  console.error("[alias-domains] malformed alias-domains.json \u2014 expected array");
@@ -14463,7 +14513,7 @@ app42.get("/agent-assets/:slug/:filename", (c) => {
14463
14513
  console.error(`[agent-assets] path-traversal-rejected slug=${slug} file=${filename}`);
14464
14514
  return c.text("Forbidden", 403);
14465
14515
  }
14466
- if (!existsSync25(filePath)) {
14516
+ if (!existsSync26(filePath)) {
14467
14517
  console.error(`[agent-assets] serve slug=${slug} file=${filename} status=404`);
14468
14518
  return c.text("Not found", 404);
14469
14519
  }
@@ -14493,7 +14543,7 @@ app42.get("/generated/:filename", (c) => {
14493
14543
  console.error(`[generated] serve file=${filename} status=403`);
14494
14544
  return c.text("Forbidden", 403);
14495
14545
  }
14496
- if (!existsSync25(filePath)) {
14546
+ if (!existsSync26(filePath)) {
14497
14547
  console.error(`[generated] serve file=${filename} status=404`);
14498
14548
  return c.text("Not found", 404);
14499
14549
  }
@@ -14510,7 +14560,7 @@ app42.route("/sites", sites_default);
14510
14560
  var htmlCache = /* @__PURE__ */ new Map();
14511
14561
  var brandLogoPath = "/brand/maxy-monochrome.png";
14512
14562
  var brandIconPath = "/brand/maxy-monochrome.png";
14513
- if (BRAND_JSON_PATH && existsSync25(BRAND_JSON_PATH)) {
14563
+ if (BRAND_JSON_PATH && existsSync26(BRAND_JSON_PATH)) {
14514
14564
  try {
14515
14565
  const fullBrand = JSON.parse(readFileSync22(BRAND_JSON_PATH, "utf-8"));
14516
14566
  if (fullBrand.assets?.logo) brandLogoPath = `/brand/${fullBrand.assets.logo}`;
@@ -14529,8 +14579,8 @@ var brandScript = `<script>window.__BRAND__=${JSON.stringify({
14529
14579
  function readInstalledVersion() {
14530
14580
  try {
14531
14581
  if (!PLATFORM_ROOT9) return "unknown";
14532
- const versionFile = join13(PLATFORM_ROOT9, "config", `.${BRAND.hostname}-version`);
14533
- if (!existsSync25(versionFile)) return "unknown";
14582
+ const versionFile = join14(PLATFORM_ROOT9, "config", `.${BRAND.hostname}-version`);
14583
+ if (!existsSync26(versionFile)) return "unknown";
14534
14584
  const content = readFileSync22(versionFile, "utf-8").trim();
14535
14585
  return content || "unknown";
14536
14586
  } catch {
@@ -14588,15 +14638,15 @@ ${clientErrorReporterScript}
14588
14638
  }
14589
14639
  var brandedHtmlCache = /* @__PURE__ */ new Map();
14590
14640
  function loadBrandingCache(agentSlug) {
14591
- const configDir2 = join13(homedir5(), BRAND.configDir);
14641
+ const configDir2 = join14(homedir5(), BRAND.configDir);
14592
14642
  try {
14593
- const accountJsonPath = join13(configDir2, "account.json");
14594
- if (!existsSync25(accountJsonPath)) return null;
14643
+ const accountJsonPath = join14(configDir2, "account.json");
14644
+ if (!existsSync26(accountJsonPath)) return null;
14595
14645
  const account = JSON.parse(readFileSync22(accountJsonPath, "utf-8"));
14596
14646
  const accountId = account.accountId;
14597
14647
  if (!accountId) return null;
14598
- const cachePath = join13(configDir2, "branding-cache", accountId, `${agentSlug}.json`);
14599
- if (!existsSync25(cachePath)) return null;
14648
+ const cachePath = join14(configDir2, "branding-cache", accountId, `${agentSlug}.json`);
14649
+ if (!existsSync26(cachePath)) return null;
14600
14650
  return JSON.parse(readFileSync22(cachePath, "utf-8"));
14601
14651
  } catch {
14602
14652
  return null;
@@ -14604,9 +14654,9 @@ function loadBrandingCache(agentSlug) {
14604
14654
  }
14605
14655
  function resolveDefaultSlug() {
14606
14656
  try {
14607
- const configDir2 = join13(homedir5(), BRAND.configDir);
14608
- const accountJsonPath = join13(configDir2, "account.json");
14609
- if (!existsSync25(accountJsonPath)) return null;
14657
+ const configDir2 = join14(homedir5(), BRAND.configDir);
14658
+ const accountJsonPath = join14(configDir2, "account.json");
14659
+ if (!existsSync26(accountJsonPath)) return null;
14610
14660
  const account = JSON.parse(readFileSync22(accountJsonPath, "utf-8"));
14611
14661
  return account.defaultAgent || null;
14612
14662
  } catch {
@@ -14790,7 +14840,7 @@ try {
14790
14840
  }
14791
14841
  (async () => {
14792
14842
  try {
14793
- if (!existsSync25(USERS_FILE)) return;
14843
+ if (!existsSync26(USERS_FILE)) return;
14794
14844
  const usersRaw = readFileSync22(USERS_FILE, "utf-8").trim();
14795
14845
  if (!usersRaw) return;
14796
14846
  const users = JSON.parse(usersRaw);
@@ -14917,7 +14967,7 @@ if (bootAccountConfig?.whatsapp) {
14917
14967
  }
14918
14968
  init({
14919
14969
  configDir: configDirForWhatsApp,
14920
- platformRoot: resolve25(process.env.MAXY_PLATFORM_ROOT ?? join13(__dirname, "..")),
14970
+ platformRoot: resolve25(process.env.MAXY_PLATFORM_ROOT ?? join14(__dirname, "..")),
14921
14971
  accountConfig: bootAccountConfig,
14922
14972
  onMessage: async (msg) => {
14923
14973
  try {