@rubytech/create-maxy-code 0.1.200 → 0.1.204
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/payload/platform/scripts/check-no-esm-require.mjs +3 -0
- package/payload/platform/scripts/check-specialist-tool-surface.mjs +323 -0
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.js +7 -7
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +13 -0
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js +73 -10
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/index.js +17 -2
- package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-enumerator.d.ts +2 -12
- package/payload/platform/services/claude-session-manager/dist/jsonl-enumerator.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-enumerator.js +14 -67
- package/payload/platform/services/claude-session-manager/dist/jsonl-enumerator.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts +6 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.js +30 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +4 -0
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts +15 -3
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +66 -45
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts +19 -0
- package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-sidecar.js +42 -0
- package/payload/platform/services/claude-session-manager/dist/session-sidecar.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/systemd-scope.d.ts +15 -0
- package/payload/platform/services/claude-session-manager/dist/systemd-scope.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/systemd-scope.js +34 -0
- package/payload/platform/services/claude-session-manager/dist/systemd-scope.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/systemd-spawn.d.ts +68 -0
- package/payload/platform/services/claude-session-manager/dist/systemd-spawn.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/systemd-spawn.js +277 -0
- package/payload/platform/services/claude-session-manager/dist/systemd-spawn.js.map +1 -0
- package/payload/platform/templates/specialists/agents/coding-assistant.md +73 -0
- package/payload/server/public/assets/{AdminShell-OJlDJakR.js → AdminShell-BcxEZnpu.js} +1 -1
- package/payload/server/public/assets/{Checkbox-DE_tsDq_.js → Checkbox-DL-HdT29.js} +1 -1
- package/payload/server/public/assets/{admin-DbQw1TyC.js → admin-DMo5DWKH.js} +1 -1
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-DfZVWJVr.js → architectureDiagram-Q4EWVU46-BoUw4oYz.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-Cd9vcTYg.js → blockDiagram-DXYQGD6D-DOscnO3m.js} +1 -1
- package/payload/server/public/assets/{brand-Ed5R2W5J.css → brand-SZW-27T7.css} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-zmNCfJ5F.js → c4Diagram-AHTNJAMY-aZ1IuZ_F.js} +1 -1
- package/payload/server/public/assets/channel-CzcSNxDm.js +1 -0
- package/payload/server/public/assets/{chunk-336JU56O-DvHeoV7B.js → chunk-336JU56O-DS3ksXBG.js} +2 -2
- package/payload/server/public/assets/{chunk-426QAEUC-IZknbXMM.js → chunk-426QAEUC-BLRn2STO.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-DN_qw6Oi.js → chunk-4TB4RGXK-BrhOvJ01.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-tt-46Rcq.js → chunk-5FUZZQ4R-BZZwZX5Q.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-Bl0mxmQP.js → chunk-5PVQY5BW-YXZKnPCz.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-v31HwKDb.js → chunk-EDXVE4YY-DAMCJHKQ.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-D6T1RStj.js → chunk-ENJZ2VHE-DsD95Bqn.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-DVnIs_5A.js → chunk-ICPOFSXX-DxtrRClx.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-DiZNprr1.js → chunk-OYMX7WX6-CN4kLK-H.js} +1 -1
- package/payload/server/public/assets/{chunk-U2HBQHQK-Cy0qH3H0.js → chunk-U2HBQHQK-BPTv3Oj1.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-wR3wBPyu.js → chunk-X2U36JSP-DxBry33v.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-BGOVJLky.js → chunk-YZCP3GAM-BZ4N75oy.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-14vtIjRh.js → chunk-ZZ45TVLE-Dqr161Q1.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-DFOM3vCn.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-HplDfaL1.js +1 -0
- package/payload/server/public/assets/clone-G-2rqnSR.js +1 -0
- package/payload/server/public/assets/{dagre-CG1l6rfK.js → dagre-DtZ0wKkH.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-DKFDl1Nz.js → dagre-KV5264BT-BPKhT-ZX.js} +1 -1
- package/payload/server/public/assets/{data-b1v7Pjly.js → data-D6IQdm0R.js} +1 -1
- package/payload/server/public/assets/{diagram-5BDNPKRD-PJd29fkg.js → diagram-5BDNPKRD-CATnafi7.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-Bz7_SWJH.js → diagram-G4DWMVQ6-ChZYQfji.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-CmWknm9v.js → diagram-MMDJMWI5-DHW6kYd3.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-CLYRluM2.js → diagram-TYMM5635-CnS4Zci8.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-EWVKGrgT.js → erDiagram-SMLLAGMA-DKYv2YWp.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-CNtfJIG7.js → flowDiagram-DWJPFMVM-BWvoZWlh.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-SIlymJ6A.js → ganttDiagram-T4ZO3ILL-CpCb-xKy.js} +1 -1
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-DWVl6CUl.js → gitGraphDiagram-UUTBAWPF-CvHrDKQ-.js} +1 -1
- package/payload/server/public/assets/{graph-BOcblKu9.js → graph-PkZKVkWD.js} +1 -1
- package/payload/server/public/assets/{graph-labels-CH-Tffon.js → graph-labels-CWJy0O4w.js} +1 -1
- package/payload/server/public/assets/{graphlib-i-qJjJM7.js → graphlib-DjnyHqGy.js} +1 -1
- package/payload/server/public/assets/{infoDiagram-42DDH7IO-D66Yr_7b.js → infoDiagram-42DDH7IO-D_MywcVn.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-C4mQi7AB.js → ishikawaDiagram-UXIWVN3A-N9m-f-Eb.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-7Vp2UBlF.js → journeyDiagram-VCZTEJTY-DE0q7uSM.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-nEDANSe9.js → kanban-definition-6JOO6SKY-Dj5hb9Bq.js} +1 -1
- package/payload/server/public/assets/{line-BxGbTwly.js → line-C6ph0i4M.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-CAG4AdDd.js → mermaid-parser.core-BrfmEvCA.js} +1 -1
- package/payload/server/public/assets/{mermaid.core-prtUaAsI.js → mermaid.core-DYnHKfDv.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-Dvcph8zi.js → mindmap-definition-QFDTVHPH-DaSaZfhR.js} +1 -1
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-C4qHs6Vb.js → pieDiagram-DEJITSTG-BAu9Ezbv.js} +1 -1
- package/payload/server/public/assets/{public-DIyn-De4.js → public-UKgkJxKv.js} +3 -3
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-I9Et2l2H.js → quadrantDiagram-34T5L4WZ-DRsbL1Xd.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-DLKlY81v.js → requirementDiagram-MS252O5E-B9QcsXV6.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-dX3pgMv_.js → sankeyDiagram-XADWPNL6-DsZbvIlD.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-C4qTAl3F.js → sequenceDiagram-FGHM5R23-BlT4O2N8.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-DzA0NObk.js → stateDiagram-FHFEXIEX-JFgk1K3Y.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-NXz27DaV.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-D-DPUQCU.js → timeline-definition-GMOUNBTQ-DOsHw1ip.js} +1 -1
- package/payload/server/public/assets/{useSelectionMode-C4HDuwDT.js → useSelectionMode-JDGvwvIk.js} +1 -1
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-C_RwTsUi.js → vennDiagram-DHZGUBPP-CQWIhqZY.js} +1 -1
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-BAftlsC2.js → wardleyDiagram-NUSXRM2D-D5Fh7YVL.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-C_tKMCMd.js → xychartDiagram-5P7HB3ND-C-tINQEs.js} +1 -1
- package/payload/server/public/data.html +5 -5
- package/payload/server/public/graph.html +6 -6
- package/payload/server/public/index.html +6 -6
- package/payload/server/public/public.html +5 -5
- package/payload/server/server.js +235 -79
- package/payload/server/public/assets/channel-DCJza6li.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-DEo4goqG.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-CoAVCeH7.js +0 -1
- package/payload/server/public/assets/clone-CLnBlH9n.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Dsgd5hEe.js +0 -1
- /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-
|
|
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-
|
|
11
|
-
<link rel="modulepreload" crossorigin href="/assets/useSelectionMode-
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/Checkbox-
|
|
13
|
-
<link rel="stylesheet" crossorigin href="/assets/brand-
|
|
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>
|
package/payload/server/server.js
CHANGED
|
@@ -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
|
|
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
|
-
(
|
|
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((
|
|
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
|
-
|
|
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((
|
|
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
|
-
|
|
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((
|
|
2067
|
-
release =
|
|
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((
|
|
3104
|
-
const timer2 = setTimeout(
|
|
3103
|
+
await new Promise((resolve25) => {
|
|
3104
|
+
const timer2 = setTimeout(resolve25, delay);
|
|
3105
3105
|
conn.abortController.signal.addEventListener("abort", () => {
|
|
3106
3106
|
clearTimeout(timer2);
|
|
3107
|
-
|
|
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((
|
|
3115
|
+
return new Promise((resolve25) => {
|
|
3116
3116
|
if (!conn.sock) {
|
|
3117
|
-
|
|
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
|
-
|
|
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((
|
|
3387
|
-
resolvePending =
|
|
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((
|
|
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
|
-
|
|
3796
|
+
resolve25(true);
|
|
3797
3797
|
});
|
|
3798
3798
|
socket.once("error", () => {
|
|
3799
3799
|
socket.destroy();
|
|
3800
|
-
|
|
3800
|
+
resolve25(false);
|
|
3801
3801
|
});
|
|
3802
3802
|
socket.once("timeout", () => {
|
|
3803
3803
|
socket.destroy();
|
|
3804
|
-
|
|
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
|
|
4540
|
+
let resolve25;
|
|
4541
4541
|
const turnPromise = new Promise((r) => {
|
|
4542
|
-
|
|
4542
|
+
resolve25 = r;
|
|
4543
4543
|
});
|
|
4544
4544
|
const listener = (text) => {
|
|
4545
|
-
|
|
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((
|
|
4988
|
-
resolveQr =
|
|
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
|
|
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
|
|
11820
|
-
|
|
11821
|
-
|
|
11822
|
-
|
|
11823
|
-
|
|
11824
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
11998
|
+
function isPidAlive(pid) {
|
|
11921
11999
|
try {
|
|
11922
|
-
process.kill(pid,
|
|
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 =
|
|
11948
|
-
const resolvedProject =
|
|
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
|
-
|
|
11958
|
-
|
|
11959
|
-
|
|
11960
|
-
|
|
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
|
|
12154
|
-
var PLATFORM_ROOT6 = process.env.MAXY_PLATFORM_ROOT ??
|
|
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 =
|
|
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
|
|
12836
|
+
import { resolve as resolve19 } from "path";
|
|
12681
12837
|
import { randomUUID as randomUUID8 } from "crypto";
|
|
12682
|
-
var PLATFORM_ROOT7 = process.env.MAXY_PLATFORM_ROOT ??
|
|
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 =
|
|
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
|
|
12977
|
-
var PLATFORM_ROOT8 = process.env.MAXY_PLATFORM_ROOT ??
|
|
12978
|
-
var SEND_SCRIPT =
|
|
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
|
|
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 =
|
|
13179
|
-
let filePath = segments.length === 0 ? rootDir :
|
|
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 =
|
|
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
|
|
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(
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
14714
|
-
const expectedDir =
|
|
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 =
|
|
14744
|
-
const expectedDir =
|
|
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(
|
|
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(
|
|
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:
|
|
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};
|