@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.
- package/dist/__tests__/samba-provision.test.js +202 -0
- package/dist/index.js +127 -73
- package/dist/samba-provision.js +215 -0
- package/dist/uninstall.js +160 -3
- package/package.json +1 -1
- package/payload/platform/plugins/docs/references/deployment.md +20 -0
- package/payload/platform/plugins/email/references/email-reference.md +4 -4
- package/payload/platform/plugins/scheduling/PLUGIN.md +1 -1
- package/payload/platform/plugins/workflows/PLUGIN.md +2 -2
- package/payload/platform/plugins/workflows/skills/workflow-manager/SKILL.md +1 -1
- package/payload/platform/templates/agents/admin/IDENTITY.md +12 -18
- package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
- package/payload/platform/templates/specialists/agents/project-manager.md +1 -1
- package/payload/server/public/assets/{Checkbox-B79fVxpA.js → Checkbox-D1OQD43b.js} +1 -1
- package/payload/server/public/assets/admin-czNBxWor.js +216 -0
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-D8e59YJ0.js → architectureDiagram-Q4EWVU46-BcwgT80u.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-CxaDkc0A.js → blockDiagram-DXYQGD6D-BMSyZUQA.js} +1 -1
- package/payload/server/public/assets/{brand-Cg9t5U6J.css → brand-2cku8WFs.css} +1 -1
- package/payload/server/public/assets/{brand-jT16ErmC.js → brand-CSQuxS9w.js} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-D0PAvq-q.js → c4Diagram-AHTNJAMY-DPRGY1jJ.js} +1 -1
- package/payload/server/public/assets/channel-fxEghWew.js +1 -0
- package/payload/server/public/assets/{chunk-336JU56O-B-CXn-Et.js → chunk-336JU56O-B7oQ3g1c.js} +2 -2
- package/payload/server/public/assets/{chunk-426QAEUC-BLzCQHKA.js → chunk-426QAEUC-C1P0yFXw.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-Bql1UwLT.js → chunk-4TB4RGXK-LI7kOJd0.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-CQK7jBtX.js → chunk-5FUZZQ4R-CXQRGTQE.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-AJc1-lvX.js → chunk-5PVQY5BW-NSyzpXRy.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-Cf3E3THL.js → chunk-EDXVE4YY-voNwxbDs.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-BNx6z6hJ.js → chunk-ENJZ2VHE-CMEMPzYY.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-DBUEFs2-.js → chunk-ICPOFSXX-hEbwu-pe.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-Csx2p315.js → chunk-OYMX7WX6-DxskDrLs.js} +1 -1
- package/payload/server/public/assets/{chunk-U2HBQHQK-x17h7UYW.js → chunk-U2HBQHQK-D7TKgUo0.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP--Lkl5yjV.js → chunk-X2U36JSP-BvPUQEPm.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-C4GsNX8A.js → chunk-YZCP3GAM-BY-RWQUW.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-YrhUPmZc.js → chunk-ZZ45TVLE-DZvOYDY6.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-BsWzGW0N.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BGVa3h90.js +1 -0
- package/payload/server/public/assets/clone-Khvocke2.js +1 -0
- package/payload/server/public/assets/{dagre-YVALPG-M.js → dagre-Bt-fpckL.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-D6JU6DW_.js → dagre-KV5264BT-Cnj0mUZl.js} +1 -1
- package/payload/server/public/assets/data-DBd-Buhp.js +1 -0
- package/payload/server/public/assets/device-url-actions-Bjz3Xzbm.js +33 -0
- package/payload/server/public/assets/{diagram-5BDNPKRD-yeO06N5Q.js → diagram-5BDNPKRD-DjLzvOlx.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-DzbVT_BC.js → diagram-G4DWMVQ6-DTfuRd-T.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-DwYO5VZF.js → diagram-MMDJMWI5-BaL2mCnx.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-BLUcdkDS.js → diagram-TYMM5635-C5InWY5R.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-BiEUB19e.js → erDiagram-SMLLAGMA-DO7BXTpn.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-TILIKxOp.js → flowDiagram-DWJPFMVM-DDdAKfLf.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-B7cGzYqT.js → ganttDiagram-T4ZO3ILL-arJD8Utm.js} +1 -1
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-DFOxN5bc.js → gitGraphDiagram-UUTBAWPF-C55GH-OS.js} +1 -1
- package/payload/server/public/assets/graph-DUtVdnZ6.js +1 -0
- package/payload/server/public/assets/graph-labels-Dxfue-fP.js +1 -0
- package/payload/server/public/assets/{graphlib-BBibixaA.js → graphlib-DL9PM7Ex.js} +1 -1
- package/payload/server/public/assets/{infoDiagram-42DDH7IO-nH2azhY8.js → infoDiagram-42DDH7IO-BMSGqUbG.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-WD3tfqFi.js → ishikawaDiagram-UXIWVN3A-Dw6BZ6BG.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-LUkaVSqw.js → journeyDiagram-VCZTEJTY-DrywUGXw.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-Dk-lYgpJ.js → kanban-definition-6JOO6SKY-DuwtVBBc.js} +1 -1
- package/payload/server/public/assets/{line-BDv6CEnp.js → line-JAksyKHj.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-D2XsSGgp.js → mermaid-parser.core-BMq-ApBW.js} +1 -1
- package/payload/server/public/assets/{mermaid.core-FyN-UmQV.js → mermaid.core-tH4oX0Kh.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-BRAHEUIS.js → mindmap-definition-QFDTVHPH-D1OiiJga.js} +1 -1
- package/payload/server/public/assets/page-BZpoS7iR.js +1 -0
- package/payload/server/public/assets/{page-CTbSJbem.js → page-CkvBvezS.js} +2 -2
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-BqibVC2X.js → pieDiagram-DEJITSTG-Ckwm69PW.js} +1 -1
- package/payload/server/public/assets/{public-BDUZIabs.js → public-C-dTMgXu.js} +5 -5
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-DNuExGnr.js → quadrantDiagram-34T5L4WZ-COw3yZ1j.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-5JXTdydh.js → requirementDiagram-MS252O5E-DqGzM4K-.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-B_8rhvcR.js → sankeyDiagram-XADWPNL6-D-l1c_Pl.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-BznkBgjf.js → sequenceDiagram-FGHM5R23-BeIi0DtJ.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-BeAZOQfs.js → stateDiagram-FHFEXIEX-C-jgegLk.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BaMs8Znv.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-CpJAs-Vw.js → timeline-definition-GMOUNBTQ-BGFKkYmi.js} +1 -1
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-BzH3ItkG.js → vennDiagram-DHZGUBPP-5NuIhJLS.js} +1 -1
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-ax9AgwA1.js → wardleyDiagram-NUSXRM2D-Be9ytVut.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-CV6vt_tW.js → xychartDiagram-5P7HB3ND-DCyHg41R.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 +8 -8
- package/payload/server/public/public.html +5 -5
- package/payload/server/server.js +135 -85
- package/payload/server/public/assets/admin-CXLuiXFU.js +0 -216
- package/payload/server/public/assets/channel-BU_eIdRB.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-DMpM1d2b.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-D_XbuPVj.js +0 -1
- package/payload/server/public/assets/clone-BBT00JUO.js +0 -1
- package/payload/server/public/assets/data-BdwO_kv-.js +0 -1
- package/payload/server/public/assets/device-url-actions-C8dD0ydz.js +0 -33
- package/payload/server/public/assets/graph-DpgsOhUZ.js +0 -1
- package/payload/server/public/assets/graph-labels-DJ717p00.js +0 -1
- package/payload/server/public/assets/page-BWHYktEF.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-iVlXKz7S.js +0 -1
package/payload/server/server.js
CHANGED
|
@@ -650,8 +650,8 @@ var serveStatic = (options = { root: "" }) => {
|
|
|
650
650
|
};
|
|
651
651
|
|
|
652
652
|
// server/index.ts
|
|
653
|
-
import { readFileSync as readFileSync22, existsSync as
|
|
654
|
-
import { resolve as resolve25, join as
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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(`${
|
|
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(`${
|
|
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(`${
|
|
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(`${
|
|
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(`${
|
|
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(`${
|
|
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(`${
|
|
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(`${
|
|
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(`${
|
|
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(`${
|
|
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(`${
|
|
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(`${
|
|
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(`${
|
|
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
|
|
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(`${
|
|
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(`${
|
|
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(`${
|
|
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
|
-
`${
|
|
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
|
-
`${
|
|
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
|
-
`${
|
|
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
|
|
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(`${
|
|
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(`${
|
|
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
|
|
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 (!
|
|
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
|
-
|
|
9986
|
-
|
|
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
|
|
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
|
-
|
|
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:
|
|
10492
|
-
if (!
|
|
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
|
|
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(
|
|
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(
|
|
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 =
|
|
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` ?
|
|
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
|
|
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 (!
|
|
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 (
|
|
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 (
|
|
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
|
|
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 (!
|
|
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
|
|
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 (!
|
|
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
|
|
13495
|
-
import { resolve as resolve22, join as
|
|
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 =
|
|
13499
|
-
if (
|
|
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 (!
|
|
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
|
|
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 =
|
|
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 (!
|
|
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
|
|
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 (!
|
|
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 ?
|
|
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 && !
|
|
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 &&
|
|
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 =
|
|
14132
|
+
var ALIAS_DOMAINS_PATH2 = join14(homedir5(), BRAND.configDir, "alias-domains.json");
|
|
14083
14133
|
function loadAliasDomains() {
|
|
14084
14134
|
try {
|
|
14085
|
-
if (!
|
|
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 (!
|
|
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 (!
|
|
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 &&
|
|
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 =
|
|
14533
|
-
if (!
|
|
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 =
|
|
14641
|
+
const configDir2 = join14(homedir5(), BRAND.configDir);
|
|
14592
14642
|
try {
|
|
14593
|
-
const accountJsonPath =
|
|
14594
|
-
if (!
|
|
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 =
|
|
14599
|
-
if (!
|
|
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 =
|
|
14608
|
-
const accountJsonPath =
|
|
14609
|
-
if (!
|
|
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 (!
|
|
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 ??
|
|
14970
|
+
platformRoot: resolve25(process.env.MAXY_PLATFORM_ROOT ?? join14(__dirname, "..")),
|
|
14921
14971
|
accountConfig: bootAccountConfig,
|
|
14922
14972
|
onMessage: async (msg) => {
|
|
14923
14973
|
try {
|