@rubytech/create-maxy-code 0.1.200 → 0.1.203

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 (106) hide show
  1. package/package.json +2 -2
  2. package/payload/platform/scripts/check-no-esm-require.mjs +3 -0
  3. package/payload/platform/scripts/check-specialist-tool-surface.mjs +323 -0
  4. package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts.map +1 -1
  5. package/payload/platform/services/claude-session-manager/dist/fs-watcher.js +7 -7
  6. package/payload/platform/services/claude-session-manager/dist/fs-watcher.js.map +1 -1
  7. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +13 -0
  8. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  9. package/payload/platform/services/claude-session-manager/dist/http-server.js +73 -10
  10. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  11. package/payload/platform/services/claude-session-manager/dist/index.js +9 -1
  12. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  13. package/payload/platform/services/claude-session-manager/dist/jsonl-enumerator.d.ts +2 -12
  14. package/payload/platform/services/claude-session-manager/dist/jsonl-enumerator.d.ts.map +1 -1
  15. package/payload/platform/services/claude-session-manager/dist/jsonl-enumerator.js +14 -67
  16. package/payload/platform/services/claude-session-manager/dist/jsonl-enumerator.js.map +1 -1
  17. package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts +6 -0
  18. package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts.map +1 -1
  19. package/payload/platform/services/claude-session-manager/dist/jsonl-path.js +30 -0
  20. package/payload/platform/services/claude-session-manager/dist/jsonl-path.js.map +1 -1
  21. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  22. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +4 -0
  23. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  24. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts +15 -3
  25. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts.map +1 -1
  26. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +66 -45
  27. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
  28. package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts +19 -0
  29. package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts.map +1 -1
  30. package/payload/platform/services/claude-session-manager/dist/session-sidecar.js +42 -0
  31. package/payload/platform/services/claude-session-manager/dist/session-sidecar.js.map +1 -1
  32. package/payload/platform/services/claude-session-manager/dist/systemd-spawn.d.ts +62 -0
  33. package/payload/platform/services/claude-session-manager/dist/systemd-spawn.d.ts.map +1 -0
  34. package/payload/platform/services/claude-session-manager/dist/systemd-spawn.js +173 -0
  35. package/payload/platform/services/claude-session-manager/dist/systemd-spawn.js.map +1 -0
  36. package/payload/platform/templates/specialists/agents/coding-assistant.md +73 -0
  37. package/payload/server/public/assets/{AdminShell-OJlDJakR.js → AdminShell-BcxEZnpu.js} +1 -1
  38. package/payload/server/public/assets/{Checkbox-DE_tsDq_.js → Checkbox-DL-HdT29.js} +1 -1
  39. package/payload/server/public/assets/{admin-DbQw1TyC.js → admin-DMo5DWKH.js} +1 -1
  40. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-DfZVWJVr.js → architectureDiagram-Q4EWVU46-BoUw4oYz.js} +1 -1
  41. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-Cd9vcTYg.js → blockDiagram-DXYQGD6D-DOscnO3m.js} +1 -1
  42. package/payload/server/public/assets/{brand-Ed5R2W5J.css → brand-SZW-27T7.css} +1 -1
  43. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-zmNCfJ5F.js → c4Diagram-AHTNJAMY-aZ1IuZ_F.js} +1 -1
  44. package/payload/server/public/assets/channel-CzcSNxDm.js +1 -0
  45. package/payload/server/public/assets/{chunk-336JU56O-DvHeoV7B.js → chunk-336JU56O-DS3ksXBG.js} +2 -2
  46. package/payload/server/public/assets/{chunk-426QAEUC-IZknbXMM.js → chunk-426QAEUC-BLRn2STO.js} +1 -1
  47. package/payload/server/public/assets/{chunk-4TB4RGXK-DN_qw6Oi.js → chunk-4TB4RGXK-BrhOvJ01.js} +1 -1
  48. package/payload/server/public/assets/{chunk-5FUZZQ4R-tt-46Rcq.js → chunk-5FUZZQ4R-BZZwZX5Q.js} +1 -1
  49. package/payload/server/public/assets/{chunk-5PVQY5BW-Bl0mxmQP.js → chunk-5PVQY5BW-YXZKnPCz.js} +1 -1
  50. package/payload/server/public/assets/{chunk-EDXVE4YY-v31HwKDb.js → chunk-EDXVE4YY-DAMCJHKQ.js} +1 -1
  51. package/payload/server/public/assets/{chunk-ENJZ2VHE-D6T1RStj.js → chunk-ENJZ2VHE-DsD95Bqn.js} +1 -1
  52. package/payload/server/public/assets/{chunk-ICPOFSXX-DVnIs_5A.js → chunk-ICPOFSXX-DxtrRClx.js} +1 -1
  53. package/payload/server/public/assets/{chunk-OYMX7WX6-DiZNprr1.js → chunk-OYMX7WX6-CN4kLK-H.js} +1 -1
  54. package/payload/server/public/assets/{chunk-U2HBQHQK-Cy0qH3H0.js → chunk-U2HBQHQK-BPTv3Oj1.js} +1 -1
  55. package/payload/server/public/assets/{chunk-X2U36JSP-wR3wBPyu.js → chunk-X2U36JSP-DxBry33v.js} +1 -1
  56. package/payload/server/public/assets/{chunk-YZCP3GAM-BGOVJLky.js → chunk-YZCP3GAM-BZ4N75oy.js} +1 -1
  57. package/payload/server/public/assets/{chunk-ZZ45TVLE-14vtIjRh.js → chunk-ZZ45TVLE-Dqr161Q1.js} +1 -1
  58. package/payload/server/public/assets/classDiagram-6PBFFD2Q-DFOM3vCn.js +1 -0
  59. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-HplDfaL1.js +1 -0
  60. package/payload/server/public/assets/clone-G-2rqnSR.js +1 -0
  61. package/payload/server/public/assets/{dagre-CG1l6rfK.js → dagre-DtZ0wKkH.js} +1 -1
  62. package/payload/server/public/assets/{dagre-KV5264BT-DKFDl1Nz.js → dagre-KV5264BT-BPKhT-ZX.js} +1 -1
  63. package/payload/server/public/assets/{data-b1v7Pjly.js → data-D6IQdm0R.js} +1 -1
  64. package/payload/server/public/assets/{diagram-5BDNPKRD-PJd29fkg.js → diagram-5BDNPKRD-CATnafi7.js} +1 -1
  65. package/payload/server/public/assets/{diagram-G4DWMVQ6-Bz7_SWJH.js → diagram-G4DWMVQ6-ChZYQfji.js} +1 -1
  66. package/payload/server/public/assets/{diagram-MMDJMWI5-CmWknm9v.js → diagram-MMDJMWI5-DHW6kYd3.js} +1 -1
  67. package/payload/server/public/assets/{diagram-TYMM5635-CLYRluM2.js → diagram-TYMM5635-CnS4Zci8.js} +1 -1
  68. package/payload/server/public/assets/{erDiagram-SMLLAGMA-EWVKGrgT.js → erDiagram-SMLLAGMA-DKYv2YWp.js} +1 -1
  69. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-CNtfJIG7.js → flowDiagram-DWJPFMVM-BWvoZWlh.js} +1 -1
  70. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-SIlymJ6A.js → ganttDiagram-T4ZO3ILL-CpCb-xKy.js} +1 -1
  71. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-DWVl6CUl.js → gitGraphDiagram-UUTBAWPF-CvHrDKQ-.js} +1 -1
  72. package/payload/server/public/assets/{graph-BOcblKu9.js → graph-PkZKVkWD.js} +1 -1
  73. package/payload/server/public/assets/{graph-labels-CH-Tffon.js → graph-labels-CWJy0O4w.js} +1 -1
  74. package/payload/server/public/assets/{graphlib-i-qJjJM7.js → graphlib-DjnyHqGy.js} +1 -1
  75. package/payload/server/public/assets/{infoDiagram-42DDH7IO-D66Yr_7b.js → infoDiagram-42DDH7IO-D_MywcVn.js} +1 -1
  76. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-C4mQi7AB.js → ishikawaDiagram-UXIWVN3A-N9m-f-Eb.js} +1 -1
  77. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-7Vp2UBlF.js → journeyDiagram-VCZTEJTY-DE0q7uSM.js} +1 -1
  78. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-nEDANSe9.js → kanban-definition-6JOO6SKY-Dj5hb9Bq.js} +1 -1
  79. package/payload/server/public/assets/{line-BxGbTwly.js → line-C6ph0i4M.js} +1 -1
  80. package/payload/server/public/assets/{mermaid-parser.core-CAG4AdDd.js → mermaid-parser.core-BrfmEvCA.js} +1 -1
  81. package/payload/server/public/assets/{mermaid.core-prtUaAsI.js → mermaid.core-DYnHKfDv.js} +3 -3
  82. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-Dvcph8zi.js → mindmap-definition-QFDTVHPH-DaSaZfhR.js} +1 -1
  83. package/payload/server/public/assets/{pieDiagram-DEJITSTG-C4qHs6Vb.js → pieDiagram-DEJITSTG-BAu9Ezbv.js} +1 -1
  84. package/payload/server/public/assets/{public-DIyn-De4.js → public-UKgkJxKv.js} +3 -3
  85. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-I9Et2l2H.js → quadrantDiagram-34T5L4WZ-DRsbL1Xd.js} +1 -1
  86. package/payload/server/public/assets/{requirementDiagram-MS252O5E-DLKlY81v.js → requirementDiagram-MS252O5E-B9QcsXV6.js} +1 -1
  87. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-dX3pgMv_.js → sankeyDiagram-XADWPNL6-DsZbvIlD.js} +1 -1
  88. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-C4qTAl3F.js → sequenceDiagram-FGHM5R23-BlT4O2N8.js} +1 -1
  89. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-DzA0NObk.js → stateDiagram-FHFEXIEX-JFgk1K3Y.js} +1 -1
  90. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-NXz27DaV.js +1 -0
  91. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-D-DPUQCU.js → timeline-definition-GMOUNBTQ-DOsHw1ip.js} +1 -1
  92. package/payload/server/public/assets/{useSelectionMode-C4HDuwDT.js → useSelectionMode-JDGvwvIk.js} +1 -1
  93. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-C_RwTsUi.js → vennDiagram-DHZGUBPP-CQWIhqZY.js} +1 -1
  94. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-BAftlsC2.js → wardleyDiagram-NUSXRM2D-D5Fh7YVL.js} +1 -1
  95. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-C_tKMCMd.js → xychartDiagram-5P7HB3ND-C-tINQEs.js} +1 -1
  96. package/payload/server/public/data.html +5 -5
  97. package/payload/server/public/graph.html +6 -6
  98. package/payload/server/public/index.html +6 -6
  99. package/payload/server/public/public.html +5 -5
  100. package/payload/server/server.js +235 -79
  101. package/payload/server/public/assets/channel-DCJza6li.js +0 -1
  102. package/payload/server/public/assets/classDiagram-6PBFFD2Q-DEo4goqG.js +0 -1
  103. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-CoAVCeH7.js +0 -1
  104. package/payload/server/public/assets/clone-CLnBlH9n.js +0 -1
  105. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Dsgd5hEe.js +0 -1
  106. /package/payload/server/public/assets/{brand-CCOPpjM4.js → brand-SzZmKKjz.js} +0 -0
@@ -5,12 +5,12 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/public-DIyn-De4.js"></script>
8
+ <script type="module" crossorigin src="/assets/public-UKgkJxKv.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-DD-I1_y5.js">
10
- <link rel="modulepreload" crossorigin href="/assets/brand-CCOPpjM4.js">
11
- <link rel="modulepreload" crossorigin href="/assets/useSelectionMode-C4HDuwDT.js">
12
- <link rel="modulepreload" crossorigin href="/assets/Checkbox-DE_tsDq_.js">
13
- <link rel="stylesheet" crossorigin href="/assets/brand-Ed5R2W5J.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/brand-SzZmKKjz.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/useSelectionMode-JDGvwvIk.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/Checkbox-DL-HdT29.js">
13
+ <link rel="stylesheet" crossorigin href="/assets/brand-SZW-27T7.css">
14
14
  <link rel="stylesheet" href="/brand-defaults.css">
15
15
  </head>
16
16
  <body>
@@ -817,7 +817,7 @@ var serveStatic = (options = { root: "" }) => {
817
817
 
818
818
  // server/index.ts
819
819
  import { readFileSync as readFileSync22, existsSync as existsSync22, watchFile } from "fs";
820
- import { resolve as resolve23, join as join17, basename as basename6 } from "path";
820
+ import { resolve as resolve24, join as join17, basename as basename6 } from "path";
821
821
  import { homedir as homedir2 } from "os";
822
822
  import { monitorEventLoopDelay } from "perf_hooks";
823
823
 
@@ -1275,7 +1275,7 @@ var credsSaveQueue = Promise.resolve();
1275
1275
  async function drainCredsSaveQueue(timeoutMs = 5e3) {
1276
1276
  console.error(`${TAG2} draining credential save queue\u2026`);
1277
1277
  const timer2 = new Promise(
1278
- (resolve24) => setTimeout(() => resolve24("timeout"), timeoutMs)
1278
+ (resolve25) => setTimeout(() => resolve25("timeout"), timeoutMs)
1279
1279
  );
1280
1280
  const result = await Promise.race([
1281
1281
  credsSaveQueue.then(() => "drained"),
@@ -1403,11 +1403,11 @@ async function createWaSocket(opts) {
1403
1403
  return sock;
1404
1404
  }
1405
1405
  async function waitForConnection(sock) {
1406
- return new Promise((resolve24, reject) => {
1406
+ return new Promise((resolve25, reject) => {
1407
1407
  const handler = (update) => {
1408
1408
  if (update.connection === "open") {
1409
1409
  sock.ev.off("connection.update", handler);
1410
- resolve24();
1410
+ resolve25();
1411
1411
  }
1412
1412
  if (update.connection === "close") {
1413
1413
  sock.ev.off("connection.update", handler);
@@ -1521,14 +1521,14 @@ ${inspected}`;
1521
1521
  return inspect2(err, INSPECT_OPTS2);
1522
1522
  }
1523
1523
  function withTimeout(label, promise, timeoutMs) {
1524
- return new Promise((resolve24, reject) => {
1524
+ return new Promise((resolve25, reject) => {
1525
1525
  const timer2 = setTimeout(() => {
1526
1526
  reject(new Error(`${label} timed out after ${timeoutMs}ms`));
1527
1527
  }, timeoutMs);
1528
1528
  promise.then(
1529
1529
  (value) => {
1530
1530
  clearTimeout(timer2);
1531
- resolve24(value);
1531
+ resolve25(value);
1532
1532
  },
1533
1533
  (err) => {
1534
1534
  clearTimeout(timer2);
@@ -2063,8 +2063,8 @@ async function persistWhatsAppMessage(input) {
2063
2063
  const { givenName, familyName } = splitName(input.pushName);
2064
2064
  const prev = sessionWriteLocks.get(input.cacheKey);
2065
2065
  let release;
2066
- const mine = new Promise((resolve24) => {
2067
- release = resolve24;
2066
+ const mine = new Promise((resolve25) => {
2067
+ release = resolve25;
2068
2068
  });
2069
2069
  const chained = (prev ?? Promise.resolve()).then(() => mine);
2070
2070
  sessionWriteLocks.set(input.cacheKey, chained);
@@ -3100,11 +3100,11 @@ async function connectWithReconnect(conn) {
3100
3100
  console.error(
3101
3101
  `${TAG12} reconnecting account=${conn.accountId} in ${delay}ms (attempt ${decision.nextAttempts}/${maxAttempts})`
3102
3102
  );
3103
- await new Promise((resolve24) => {
3104
- const timer2 = setTimeout(resolve24, delay);
3103
+ await new Promise((resolve25) => {
3104
+ const timer2 = setTimeout(resolve25, delay);
3105
3105
  conn.abortController.signal.addEventListener("abort", () => {
3106
3106
  clearTimeout(timer2);
3107
- resolve24();
3107
+ resolve25();
3108
3108
  }, { once: true });
3109
3109
  });
3110
3110
  }
@@ -3112,16 +3112,16 @@ async function connectWithReconnect(conn) {
3112
3112
  }
3113
3113
  }
3114
3114
  function waitForDisconnectEvent(conn) {
3115
- return new Promise((resolve24) => {
3115
+ return new Promise((resolve25) => {
3116
3116
  if (!conn.sock) {
3117
- resolve24();
3117
+ resolve25();
3118
3118
  return;
3119
3119
  }
3120
3120
  const sock = conn.sock;
3121
3121
  const handler = (update) => {
3122
3122
  if (update.connection === "close") {
3123
3123
  sock.ev.off("connection.update", handler);
3124
- resolve24();
3124
+ resolve25();
3125
3125
  }
3126
3126
  };
3127
3127
  sock.ev.on("connection.update", handler);
@@ -3383,8 +3383,8 @@ async function handleInboundMessage(conn, msg) {
3383
3383
  const conversationKey = isGroup ? remoteJid : senderPhone;
3384
3384
  const debounceKey = `${conn.accountId}:${conversationKey}:${senderPhone}`;
3385
3385
  let resolvePending;
3386
- const sttPending = new Promise((resolve24) => {
3387
- resolvePending = resolve24;
3386
+ const sttPending = new Promise((resolve25) => {
3387
+ resolvePending = resolve25;
3388
3388
  });
3389
3389
  if (conn.debouncer) conn.debouncer.registerPending(debounceKey, sttPending);
3390
3390
  try {
@@ -3788,20 +3788,20 @@ function buildX11Env(chromiumWrapperPath, transport = "vnc") {
3788
3788
 
3789
3789
  // server/routes/health.ts
3790
3790
  function checkPort(port2, timeoutMs = 500) {
3791
- return new Promise((resolve24) => {
3791
+ return new Promise((resolve25) => {
3792
3792
  const socket = createConnection2(port2, "127.0.0.1");
3793
3793
  socket.setTimeout(timeoutMs);
3794
3794
  socket.once("connect", () => {
3795
3795
  socket.destroy();
3796
- resolve24(true);
3796
+ resolve25(true);
3797
3797
  });
3798
3798
  socket.once("error", () => {
3799
3799
  socket.destroy();
3800
- resolve24(false);
3800
+ resolve25(false);
3801
3801
  });
3802
3802
  socket.once("timeout", () => {
3803
3803
  socket.destroy();
3804
- resolve24(false);
3804
+ resolve25(false);
3805
3805
  });
3806
3806
  });
3807
3807
  }
@@ -4537,12 +4537,12 @@ async function dispatchOnce(input) {
4537
4537
  });
4538
4538
  if (!entry) return { error: "spawn-failed" };
4539
4539
  entry.lastInboundAt = Date.now();
4540
- let resolve24;
4540
+ let resolve25;
4541
4541
  const turnPromise = new Promise((r) => {
4542
- resolve24 = r;
4542
+ resolve25 = r;
4543
4543
  });
4544
4544
  const listener = (text) => {
4545
- resolve24(text);
4545
+ resolve25(text);
4546
4546
  };
4547
4547
  entry.subscribers.add(listener);
4548
4548
  const writeOk = await writeInput(entry, input.text);
@@ -4984,8 +4984,8 @@ async function startLogin(opts) {
4984
4984
  resetActiveLogin(accountId);
4985
4985
  let resolveQr = null;
4986
4986
  let rejectQr = null;
4987
- const qrPromise = new Promise((resolve24, reject) => {
4988
- resolveQr = resolve24;
4987
+ const qrPromise = new Promise((resolve25, reject) => {
4988
+ resolveQr = resolve25;
4989
4989
  rejectQr = reject;
4990
4990
  });
4991
4991
  const qrTimer = setTimeout(
@@ -11722,10 +11722,11 @@ var sidebar_artefacts_default = app22;
11722
11722
 
11723
11723
  // server/routes/admin/sidebar-sessions.ts
11724
11724
  import { readdirSync as readdirSync8, readFileSync as readFileSync14, statSync as statSync7 } from "fs";
11725
- import { join as join13 } from "path";
11725
+ import { join as join13, resolve as resolve16 } from "path";
11726
11726
  var SESSION_ID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.jsonl$/i;
11727
11727
  var PID_FILE_RE = /^([0-9]+)\.json$/;
11728
11728
  var TITLE_MAX = 80;
11729
+ var CLI_MARKER_PREFIXES = ["<local-command-", "<command-name>", "<command-message>"];
11729
11730
  var app23 = new Hono();
11730
11731
  function claudeConfigDir() {
11731
11732
  return process.env.CLAUDE_CONFIG_DIR ?? null;
@@ -11805,7 +11806,65 @@ function sessionIdToPidMap(configDir2) {
11805
11806
  }
11806
11807
  return out;
11807
11808
  }
11808
- function firstUserMessage(body) {
11809
+ function loadUserTitles(accountDir) {
11810
+ const out = /* @__PURE__ */ new Map();
11811
+ if (!accountDir) return out;
11812
+ const path2 = join13(accountDir, "session-titles.json");
11813
+ let raw;
11814
+ try {
11815
+ raw = readFileSync14(path2, "utf8");
11816
+ } catch {
11817
+ return out;
11818
+ }
11819
+ let parsed;
11820
+ try {
11821
+ parsed = JSON.parse(raw);
11822
+ } catch {
11823
+ return out;
11824
+ }
11825
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return out;
11826
+ for (const [sessionId, value] of Object.entries(parsed)) {
11827
+ if (!sessionId) continue;
11828
+ if (!value || typeof value !== "object") continue;
11829
+ const v = value;
11830
+ if (typeof v.title !== "string") continue;
11831
+ const trimmed = v.title.trim();
11832
+ if (!trimmed) continue;
11833
+ out.set(sessionId, trimmed);
11834
+ }
11835
+ return out;
11836
+ }
11837
+ function readBridgeIds(metaPath) {
11838
+ let raw;
11839
+ try {
11840
+ raw = readFileSync14(metaPath, "utf8");
11841
+ } catch {
11842
+ return [];
11843
+ }
11844
+ let parsed;
11845
+ try {
11846
+ parsed = JSON.parse(raw);
11847
+ } catch {
11848
+ return [];
11849
+ }
11850
+ if (!parsed || typeof parsed !== "object") return [];
11851
+ const ids = parsed.bridgeIds;
11852
+ if (!Array.isArray(ids)) return [];
11853
+ return ids.filter((b) => typeof b === "string" && b.length > 0);
11854
+ }
11855
+ function startsWithCliMarker(s) {
11856
+ for (const p of CLI_MARKER_PREFIXES) if (s.startsWith(p)) return true;
11857
+ return false;
11858
+ }
11859
+ function trimToTitle(raw) {
11860
+ const trimmed = raw.trim().replace(/\s+/g, " ");
11861
+ return trimmed.length > TITLE_MAX ? trimmed.slice(0, TITLE_MAX - 1) + "\u2026" : trimmed;
11862
+ }
11863
+ function resolveTitle(body, sessionId, userTitles) {
11864
+ const userTitle = userTitles.get(sessionId);
11865
+ if (userTitle) return { title: trimToTitle(userTitle), source: "user" };
11866
+ let aiTitle = null;
11867
+ let firstUserMessage = null;
11809
11868
  for (const line of body.split("\n")) {
11810
11869
  if (!line || line[0] !== "{") continue;
11811
11870
  let parsed;
@@ -11816,14 +11875,23 @@ function firstUserMessage(body) {
11816
11875
  }
11817
11876
  if (!parsed || typeof parsed !== "object") continue;
11818
11877
  const row = parsed;
11819
- if (row.type !== "user" || !row.message || row.message.role !== "user") continue;
11820
- const content = row.message.content;
11821
- if (typeof content !== "string") continue;
11822
- const trimmed = content.trim().replace(/\s+/g, " ");
11823
- if (!trimmed) continue;
11824
- return trimmed.length > TITLE_MAX ? trimmed.slice(0, TITLE_MAX - 1) + "\u2026" : trimmed;
11878
+ if (row.type === "ai-title" && typeof row.aiTitle === "string") {
11879
+ const t = row.aiTitle.trim();
11880
+ if (t) aiTitle = t;
11881
+ continue;
11882
+ }
11883
+ if (firstUserMessage === null && row.type === "user" && row.message && row.message.role === "user") {
11884
+ const content = row.message.content;
11885
+ if (typeof content !== "string") continue;
11886
+ const trimmed = content.trim();
11887
+ if (!trimmed) continue;
11888
+ if (startsWithCliMarker(trimmed)) continue;
11889
+ firstUserMessage = trimmed;
11890
+ }
11825
11891
  }
11826
- return null;
11892
+ if (aiTitle) return { title: trimToTitle(aiTitle), source: "ai" };
11893
+ if (firstUserMessage) return { title: trimToTitle(firstUserMessage), source: "first-message" };
11894
+ return { title: sessionId.slice(0, 8), source: "prefix" };
11827
11895
  }
11828
11896
  app23.get("/", requireAdminSession, async (c) => {
11829
11897
  const accountId = process.env.ACCOUNT_ID ?? null;
@@ -11835,10 +11903,13 @@ app23.get("/", requireAdminSession, async (c) => {
11835
11903
  const projectsRoot = join13(configDir2, "projects");
11836
11904
  const jsonls = enumerateJsonls(projectsRoot);
11837
11905
  const pidsBySession = sessionIdToPidMap(configDir2);
11906
+ const accountDir = accountId ? resolve16(ACCOUNTS_DIR, accountId) : null;
11907
+ const userTitles = loadUserTitles(accountDir);
11838
11908
  const rows = [];
11839
11909
  const seenIds = /* @__PURE__ */ new Set();
11840
11910
  let liveCount = 0;
11841
11911
  let subagentCount = 0;
11912
+ const titleSourceCounts = { user: 0, ai: 0, "first-message": 0, prefix: 0 };
11842
11913
  for (const { path: path2, isSubagent } of jsonls) {
11843
11914
  const lastSlash = path2.lastIndexOf("/");
11844
11915
  const base = path2.slice(lastSlash + 1);
@@ -11859,22 +11930,26 @@ app23.get("/", requireAdminSession, async (c) => {
11859
11930
  }
11860
11931
  const pid = pidsBySession.get(sessionId) ?? null;
11861
11932
  const live = pid !== null;
11862
- const title = firstUserMessage(body) ?? sessionId.slice(0, 8);
11933
+ const resolved = resolveTitle(body, sessionId, userTitles);
11934
+ titleSourceCounts[resolved.source] += 1;
11935
+ const bridgeIds = readBridgeIds(join13(projectDir, `${sessionId}.meta.json`));
11863
11936
  rows.push({
11864
11937
  sessionId,
11865
- title,
11938
+ title: resolved.title,
11939
+ titleSource: resolved.source,
11866
11940
  startedAt: new Date(mtimeMs).toISOString(),
11867
11941
  live,
11868
11942
  isSubagent,
11869
11943
  pid,
11870
- projectDir
11944
+ projectDir,
11945
+ bridgeIds
11871
11946
  });
11872
11947
  if (live) liveCount += 1;
11873
11948
  if (isSubagent) subagentCount += 1;
11874
11949
  }
11875
11950
  rows.sort((a, b) => a.startedAt < b.startedAt ? 1 : -1);
11876
11951
  console.log(
11877
- `[admin-sessions-list] rows=${rows.length} live=${liveCount} subagents=${subagentCount} accountId=${accountId ? accountId.slice(0, 8) : "unset"}`
11952
+ `[admin-sessions-list] rows=${rows.length} live=${liveCount} subagents=${subagentCount} titles user=${titleSourceCounts.user} ai=${titleSourceCounts.ai} first=${titleSourceCounts["first-message"]} prefix=${titleSourceCounts.prefix} accountId=${accountId ? accountId.slice(0, 8) : "unset"}`
11878
11953
  );
11879
11954
  return c.json({ sessions: rows, accountId });
11880
11955
  });
@@ -11882,10 +11957,13 @@ var sidebar_sessions_default = app23;
11882
11957
 
11883
11958
  // server/routes/admin/session-delete.ts
11884
11959
  import { existsSync as existsSync17, readdirSync as readdirSync9, readFileSync as readFileSync15, unlinkSync as unlinkSync2 } from "fs";
11885
- import { join as join14, resolve as resolve16 } from "path";
11960
+ import { join as join14, resolve as resolve17 } from "path";
11886
11961
  var app24 = new Hono();
11887
11962
  var SESSION_ID_RE2 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
11888
11963
  var PID_FILE_RE2 = /^([0-9]+)\.json$/;
11964
+ var SIGTERM_WAIT_MS = 2e3;
11965
+ var SIGKILL_WAIT_MS = 1e3;
11966
+ var POLL_INTERVAL_MS = 50;
11889
11967
  function findPidForSession(configDir2, sessionId) {
11890
11968
  const sessionsDir = join14(configDir2, "sessions");
11891
11969
  let entries;
@@ -11917,14 +11995,66 @@ function findPidForSession(configDir2, sessionId) {
11917
11995
  }
11918
11996
  return null;
11919
11997
  }
11920
- function killBestEffort(pid) {
11998
+ function isPidAlive(pid) {
11921
11999
  try {
11922
- process.kill(pid, "SIGTERM");
12000
+ process.kill(pid, 0);
11923
12001
  return true;
11924
- } catch {
12002
+ } catch (err) {
12003
+ const code = err.code;
12004
+ if (code === "ESRCH") return false;
12005
+ return true;
12006
+ }
12007
+ }
12008
+ function sleep2(ms) {
12009
+ return new Promise((resolve25) => setTimeout(resolve25, ms));
12010
+ }
12011
+ function sendSignal(pid, signal) {
12012
+ try {
12013
+ process.kill(pid, signal);
12014
+ return true;
12015
+ } catch (err) {
12016
+ const code = err.code;
12017
+ if (code === "ESRCH") return true;
11925
12018
  return false;
11926
12019
  }
11927
12020
  }
12021
+ async function killAndWait(pid) {
12022
+ const startedAt = Date.now();
12023
+ let escalated = false;
12024
+ const termSent = sendSignal(pid, "SIGTERM");
12025
+ const termDeadline = Date.now() + SIGTERM_WAIT_MS;
12026
+ while (Date.now() < termDeadline) {
12027
+ if (!isPidAlive(pid)) {
12028
+ return {
12029
+ pidKilled: termSent ? "true" : "false",
12030
+ waitForExitMs: Date.now() - startedAt,
12031
+ escalatedToSIGKILL: false,
12032
+ exited: true
12033
+ };
12034
+ }
12035
+ await sleep2(POLL_INTERVAL_MS);
12036
+ }
12037
+ escalated = true;
12038
+ sendSignal(pid, "SIGKILL");
12039
+ const killDeadline = Date.now() + SIGKILL_WAIT_MS;
12040
+ while (Date.now() < killDeadline) {
12041
+ if (!isPidAlive(pid)) {
12042
+ return {
12043
+ pidKilled: "true",
12044
+ waitForExitMs: Date.now() - startedAt,
12045
+ escalatedToSIGKILL: true,
12046
+ exited: true
12047
+ };
12048
+ }
12049
+ await sleep2(POLL_INTERVAL_MS);
12050
+ }
12051
+ return {
12052
+ pidKilled: "false",
12053
+ waitForExitMs: Date.now() - startedAt,
12054
+ escalatedToSIGKILL: escalated,
12055
+ exited: false
12056
+ };
12057
+ }
11928
12058
  app24.post("/", requireAdminSession, async (c) => {
11929
12059
  let body;
11930
12060
  try {
@@ -11944,8 +12074,8 @@ app24.post("/", requireAdminSession, async (c) => {
11944
12074
  if (!configDir2) {
11945
12075
  return c.json({ error: "CLAUDE_CONFIG_DIR not set" }, 500);
11946
12076
  }
11947
- const projectsRoot = resolve16(join14(configDir2, "projects")) + "/";
11948
- const resolvedProject = resolve16(projectDir) + "/";
12077
+ const projectsRoot = resolve17(join14(configDir2, "projects")) + "/";
12078
+ const resolvedProject = resolve17(projectDir) + "/";
11949
12079
  if (!resolvedProject.startsWith(projectsRoot)) {
11950
12080
  console.error(`[sessions-delete] reject reason=projectDir-outside-tree projectDir=${projectDir}`);
11951
12081
  return c.json({ error: "projectDir is not under CLAUDE_CONFIG_DIR/projects/" }, 400);
@@ -11953,11 +12083,23 @@ app24.post("/", requireAdminSession, async (c) => {
11953
12083
  const jsonlPath = join14(projectDir, `${sessionId}.jsonl`);
11954
12084
  const sidecarPath = join14(projectDir, `${sessionId}.meta.json`);
11955
12085
  const pid = findPidForSession(configDir2, sessionId);
11956
- let pidKilled;
11957
- if (pid === null) {
11958
- pidKilled = "absent";
11959
- } else {
11960
- pidKilled = killBestEffort(pid) ? "true" : "false";
12086
+ let pidKilled = "absent";
12087
+ let waitForExitMs = 0;
12088
+ let escalatedToSIGKILL = false;
12089
+ if (pid !== null) {
12090
+ const r = await killAndWait(pid);
12091
+ pidKilled = r.pidKilled;
12092
+ waitForExitMs = r.waitForExitMs;
12093
+ escalatedToSIGKILL = r.escalatedToSIGKILL;
12094
+ if (!r.exited) {
12095
+ console.error(
12096
+ `[sessions-delete] kill-failed sessionId=${sessionId} pid=${pid} waitForExit=${waitForExitMs} escalatedToSIGKILL=${escalatedToSIGKILL}`
12097
+ );
12098
+ return c.json(
12099
+ { error: "kill-failed", pid, waitForExitMs, escalatedToSIGKILL },
12100
+ 500
12101
+ );
12102
+ }
11961
12103
  }
11962
12104
  let deleted = false;
11963
12105
  try {
@@ -11969,7 +12111,7 @@ app24.post("/", requireAdminSession, async (c) => {
11969
12111
  const msg = err instanceof Error ? err.message : String(err);
11970
12112
  console.error(`[sessions-delete] unlink-failed path=${jsonlPath} err=${msg}`);
11971
12113
  console.log(
11972
- `[sessions-delete] sessionId=${sessionId} pidKilled=${pidKilled} jsonlPath=${jsonlPath} deleted=false`
12114
+ `[sessions-delete] sessionId=${sessionId} pidKilled=${pidKilled} jsonlPath=${jsonlPath} deleted=false waitForExit=${waitForExitMs} escalatedToSIGKILL=${escalatedToSIGKILL}`
11973
12115
  );
11974
12116
  return c.json({ error: `unlink failed: ${msg}` }, 500);
11975
12117
  }
@@ -11977,10 +12119,24 @@ app24.post("/", requireAdminSession, async (c) => {
11977
12119
  if (existsSync17(sidecarPath)) unlinkSync2(sidecarPath);
11978
12120
  } catch {
11979
12121
  }
12122
+ if (pid !== null) {
12123
+ try {
12124
+ const pidFile = join14(configDir2, "sessions", `${pid}.json`);
12125
+ if (existsSync17(pidFile)) unlinkSync2(pidFile);
12126
+ } catch {
12127
+ }
12128
+ }
12129
+ if (existsSync17(jsonlPath)) {
12130
+ console.error(`[sessions-delete] resurrection jsonlPath=${jsonlPath} sessionId=${sessionId}`);
12131
+ return c.json(
12132
+ { error: "jsonl-resurrected", jsonlPath, pidKilled, waitForExitMs, escalatedToSIGKILL },
12133
+ 500
12134
+ );
12135
+ }
11980
12136
  console.log(
11981
- `[sessions-delete] sessionId=${sessionId} pidKilled=${pidKilled} jsonlPath=${jsonlPath} deleted=${deleted}`
12137
+ `[sessions-delete] sessionId=${sessionId} pidKilled=${pidKilled} jsonlPath=${jsonlPath} deleted=${deleted} waitForExit=${waitForExitMs} escalatedToSIGKILL=${escalatedToSIGKILL}`
11982
12138
  );
11983
- return c.json({ deleted, pidKilled, jsonlPath });
12139
+ return c.json({ deleted, pidKilled, jsonlPath, waitForExitMs, escalatedToSIGKILL });
11984
12140
  });
11985
12141
  var session_delete_default = app24;
11986
12142
 
@@ -12150,8 +12306,8 @@ var system_stats_default = app26;
12150
12306
 
12151
12307
  // server/routes/admin/health.ts
12152
12308
  import { existsSync as existsSync18, readFileSync as readFileSync16 } from "fs";
12153
- import { resolve as resolve17, join as join15 } from "path";
12154
- var PLATFORM_ROOT6 = process.env.MAXY_PLATFORM_ROOT ?? resolve17(process.cwd(), "..");
12309
+ import { resolve as resolve18, join as join15 } from "path";
12310
+ var PLATFORM_ROOT6 = process.env.MAXY_PLATFORM_ROOT ?? resolve18(process.cwd(), "..");
12155
12311
  var brandHostname = "maxy";
12156
12312
  var brandJsonPath = join15(PLATFORM_ROOT6, "config", "brand.json");
12157
12313
  if (existsSync18(brandJsonPath)) {
@@ -12161,7 +12317,7 @@ if (existsSync18(brandJsonPath)) {
12161
12317
  } catch {
12162
12318
  }
12163
12319
  }
12164
- var VERSION_FILE = resolve17(PLATFORM_ROOT6, `config/.${brandHostname}-version`);
12320
+ var VERSION_FILE = resolve18(PLATFORM_ROOT6, `config/.${brandHostname}-version`);
12165
12321
  var PROCESS_STARTED_AT = (/* @__PURE__ */ new Date()).toISOString();
12166
12322
  var PROBE_TIMEOUT_MS = 1e3;
12167
12323
  function readVersion() {
@@ -12677,13 +12833,13 @@ var admin_default = app33;
12677
12833
  // app/lib/access-gate.ts
12678
12834
  import neo4j4 from "neo4j-driver";
12679
12835
  import { readFileSync as readFileSync17 } from "fs";
12680
- import { resolve as resolve18 } from "path";
12836
+ import { resolve as resolve19 } from "path";
12681
12837
  import { randomUUID as randomUUID8 } from "crypto";
12682
- var PLATFORM_ROOT7 = process.env.MAXY_PLATFORM_ROOT ?? resolve18(process.cwd(), "..");
12838
+ var PLATFORM_ROOT7 = process.env.MAXY_PLATFORM_ROOT ?? resolve19(process.cwd(), "..");
12683
12839
  var driver = null;
12684
12840
  function readPassword() {
12685
12841
  if (process.env.NEO4J_PASSWORD) return process.env.NEO4J_PASSWORD;
12686
- const passwordFile = resolve18(PLATFORM_ROOT7, "config/.neo4j-password");
12842
+ const passwordFile = resolve19(PLATFORM_ROOT7, "config/.neo4j-password");
12687
12843
  try {
12688
12844
  return readFileSync17(passwordFile, "utf-8").trim();
12689
12845
  } catch {
@@ -12973,9 +13129,9 @@ var verify_token_default = app34;
12973
13129
 
12974
13130
  // app/lib/access-email.ts
12975
13131
  import { spawn as spawn2 } from "child_process";
12976
- import { resolve as resolve19 } from "path";
12977
- var PLATFORM_ROOT8 = process.env.MAXY_PLATFORM_ROOT ?? resolve19(process.cwd(), "..");
12978
- var SEND_SCRIPT = resolve19(
13132
+ import { resolve as resolve20 } from "path";
13133
+ var PLATFORM_ROOT8 = process.env.MAXY_PLATFORM_ROOT ?? resolve20(process.cwd(), "..");
13134
+ var SEND_SCRIPT = resolve20(
12979
13135
  PLATFORM_ROOT8,
12980
13136
  "plugins",
12981
13137
  "email",
@@ -13118,7 +13274,7 @@ var access_default = app36;
13118
13274
 
13119
13275
  // server/routes/sites.ts
13120
13276
  import { existsSync as existsSync19, readFileSync as readFileSync18, realpathSync as realpathSync5, statSync as statSync8 } from "fs";
13121
- import { resolve as resolve20 } from "path";
13277
+ import { resolve as resolve21 } from "path";
13122
13278
  var SAFE_SEG_RE = /^[a-z0-9_][a-z0-9_.-]{0,99}$/i;
13123
13279
  var MIME = {
13124
13280
  ".html": "text/html; charset=utf-8",
@@ -13175,8 +13331,8 @@ app37.get("/:rel{.*}", (c) => {
13175
13331
  }
13176
13332
  segments.push(seg);
13177
13333
  }
13178
- const rootDir = resolve20(account.accountDir, "sites");
13179
- let filePath = segments.length === 0 ? rootDir : resolve20(rootDir, ...segments);
13334
+ const rootDir = resolve21(account.accountDir, "sites");
13335
+ let filePath = segments.length === 0 ? rootDir : resolve21(rootDir, ...segments);
13180
13336
  if (filePath !== rootDir && !filePath.startsWith(rootDir + "/")) {
13181
13337
  console.error(`[sites] path-traversal-rejected path=${reqPath} reason=escape status=403`);
13182
13338
  return c.text("Forbidden", 403);
@@ -13196,7 +13352,7 @@ app37.get("/:rel{.*}", (c) => {
13196
13352
  return c.redirect(target, 301);
13197
13353
  }
13198
13354
  if (stat7?.isDirectory()) {
13199
- filePath = resolve20(filePath, "index.html");
13355
+ filePath = resolve21(filePath, "index.html");
13200
13356
  }
13201
13357
  if (!filePath.startsWith(rootDir + "/")) {
13202
13358
  console.error(`[sites] path-traversal-rejected path=${reqPath} reason=escape status=403`);
@@ -13915,7 +14071,7 @@ function startGraphHealthTimer() {
13915
14071
 
13916
14072
  // app/lib/file-watcher.ts
13917
14073
  import * as fsp2 from "fs/promises";
13918
- import { resolve as resolve21, sep as sep6 } from "path";
14074
+ import { resolve as resolve22, sep as sep6 } from "path";
13919
14075
  var ACCOUNT_UUID_RE2 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
13920
14076
  var DEFAULT_COALESCE_MS = 500;
13921
14077
  var ROOTS = ["uploads", "accounts"];
@@ -13934,7 +14090,7 @@ async function startFileWatcher(opts = {}) {
13934
14090
  const dropFn = opts.drop ?? dropFileIndex;
13935
14091
  for (const r of ROOTS) {
13936
14092
  try {
13937
- await fsp2.mkdir(resolve21(dataRoot, r), { recursive: true });
14093
+ await fsp2.mkdir(resolve22(dataRoot, r), { recursive: true });
13938
14094
  } catch (err) {
13939
14095
  console.error(
13940
14096
  `[file-watcher] start-failed root="${r}" err="${err.message}" \u2014 index will be maintained by the 5-min reconcile backstop only`
@@ -13955,7 +14111,7 @@ async function startFileWatcher(opts = {}) {
13955
14111
  timers.set(relativePath, t);
13956
14112
  }
13957
14113
  async function runHook(relativePath, accountId) {
13958
- const absolute = resolve21(dataRoot, relativePath);
14114
+ const absolute = resolve22(dataRoot, relativePath);
13959
14115
  let exists = false;
13960
14116
  try {
13961
14117
  const st = await fsp2.stat(absolute);
@@ -13979,7 +14135,7 @@ async function startFileWatcher(opts = {}) {
13979
14135
  }
13980
14136
  }
13981
14137
  async function watchRoot(rootName) {
13982
- const absRoot = resolve21(dataRoot, rootName);
14138
+ const absRoot = resolve22(dataRoot, rootName);
13983
14139
  try {
13984
14140
  const iter = fsp2.watch(absRoot, { recursive: true, signal: controller.signal });
13985
14141
  for await (const event of iter) {
@@ -14078,7 +14234,7 @@ function broadcastAdminShutdown(reason) {
14078
14234
  // ../lib/entitlement/src/index.ts
14079
14235
  import { createPublicKey, createHash as createHash4, verify as cryptoVerify } from "crypto";
14080
14236
  import { existsSync as existsSync21, readFileSync as readFileSync21, statSync as statSync9 } from "fs";
14081
- import { resolve as resolve22 } from "path";
14237
+ import { resolve as resolve23 } from "path";
14082
14238
 
14083
14239
  // ../lib/entitlement/src/canonicalize.ts
14084
14240
  function canonicalize(value) {
@@ -14113,7 +14269,7 @@ var PUBKEY_SHA256 = "8eee6bcb33545fd13b16d3199a5735ca5db5062834c7b49dfe4f23801d9
14113
14269
  var GRACE_DAYS = 7;
14114
14270
  var GRACE_MS = GRACE_DAYS * 24 * 60 * 60 * 1e3;
14115
14271
  function pubkeyPath(brand) {
14116
- return resolve22(brand.platformRoot, "lib", "entitlement", "rubytech-pubkey.pem");
14272
+ return resolve23(brand.platformRoot, "lib", "entitlement", "rubytech-pubkey.pem");
14117
14273
  }
14118
14274
  var memo = null;
14119
14275
  function memoKey(mtimeMs, account) {
@@ -14125,7 +14281,7 @@ function resolveEntitlement(brand, account) {
14125
14281
  if (brand.commercialMode !== true) {
14126
14282
  return logResolved(implicitTrust(account), null);
14127
14283
  }
14128
- const entitlementPath = resolve22(brand.configDir, "entitlement.json");
14284
+ const entitlementPath = resolve23(brand.configDir, "entitlement.json");
14129
14285
  if (!existsSync21(entitlementPath)) {
14130
14286
  return logResolved(anonymousFallback("missing"), { reason: "missing" });
14131
14287
  }
@@ -14710,8 +14866,8 @@ app41.get("/agent-assets/:slug/:filename", (c) => {
14710
14866
  console.error(`[agent-assets] no-account slug=${slug} file=${filename}`);
14711
14867
  return c.text("Not found", 404);
14712
14868
  }
14713
- const filePath = resolve23(account.accountDir, "agents", slug, "assets", filename);
14714
- const expectedDir = resolve23(account.accountDir, "agents", slug, "assets");
14869
+ const filePath = resolve24(account.accountDir, "agents", slug, "assets", filename);
14870
+ const expectedDir = resolve24(account.accountDir, "agents", slug, "assets");
14715
14871
  if (!filePath.startsWith(expectedDir + "/")) {
14716
14872
  console.error(`[agent-assets] path-traversal-rejected slug=${slug} file=${filename}`);
14717
14873
  return c.text("Forbidden", 403);
@@ -14740,8 +14896,8 @@ app41.get("/generated/:filename", (c) => {
14740
14896
  console.error(`[generated] serve file=${filename} status=404`);
14741
14897
  return c.text("Not found", 404);
14742
14898
  }
14743
- const filePath = resolve23(account.accountDir, "generated", filename);
14744
- const expectedDir = resolve23(account.accountDir, "generated");
14899
+ const filePath = resolve24(account.accountDir, "generated", filename);
14900
+ const expectedDir = resolve24(account.accountDir, "generated");
14745
14901
  if (!filePath.startsWith(expectedDir + "/")) {
14746
14902
  console.error(`[generated] serve file=${filename} status=403`);
14747
14903
  return c.text("Forbidden", 403);
@@ -14828,7 +14984,7 @@ var clientErrorReporterScript = `<script>
14828
14984
  function cachedHtml(file) {
14829
14985
  let html = htmlCache.get(file);
14830
14986
  if (!html) {
14831
- html = readFileSync22(resolve23(process.cwd(), "public", file), "utf-8");
14987
+ html = readFileSync22(resolve24(process.cwd(), "public", file), "utf-8");
14832
14988
  const productNameEsc = escapeHtml(BRAND.productName);
14833
14989
  html = html.replace(/<title>([^<]*)<\/title>/, (_match, inner) => `<title>${escapeHtml(inner).replace(/Maxy/g, productNameEsc)}</title>`);
14834
14990
  html = html.replace('href="/favicon.ico"', `href="${escapeHtml(brandFaviconPath)}"`);
@@ -14936,7 +15092,7 @@ app41.use("/vnc-popout.html", logViewerFetch);
14936
15092
  app41.get("/vnc-popout.html", (c) => {
14937
15093
  let html = htmlCache.get("vnc-popout.html");
14938
15094
  if (!html) {
14939
- html = readFileSync22(resolve23(process.cwd(), "public", "vnc-popout.html"), "utf-8");
15095
+ html = readFileSync22(resolve24(process.cwd(), "public", "vnc-popout.html"), "utf-8");
14940
15096
  const name = escapeHtml(BRAND.productName);
14941
15097
  html = html.replace("<title>Browser \u2014 Maxy</title>", `<title>${name}</title>`);
14942
15098
  html = html.replace("</head>", ` ${brandScript}
@@ -15157,7 +15313,7 @@ if (bootAccountConfig?.whatsapp) {
15157
15313
  }
15158
15314
  init({
15159
15315
  configDir: configDirForWhatsApp,
15160
- platformRoot: resolve23(process.env.MAXY_PLATFORM_ROOT ?? join17(__dirname, "..")),
15316
+ platformRoot: resolve24(process.env.MAXY_PLATFORM_ROOT ?? join17(__dirname, "..")),
15161
15317
  accountConfig: bootAccountConfig,
15162
15318
  onMessage: async (msg) => {
15163
15319
  if (process.env.WHATSAPP_PTY_BRIDGE_ENABLED === "true" && msg.text && !msg.isOwnerMirror) {
@@ -1 +0,0 @@
1
- import{it as e,rt as t}from"./chunk-ICPOFSXX-DVnIs_5A.js";var n=(n,r)=>e.lang.round(t.parse(n)[r]);export{n as t};