@rubytech/create-realagent-code 0.1.31 → 0.1.32
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/index.js +37 -39
- package/package.json +1 -1
- package/payload/platform/lib/graph-trash/dist/index.d.ts +1 -1
- package/payload/platform/lib/graph-trash/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/graph-trash/dist/index.js +1 -2
- package/payload/platform/lib/graph-trash/dist/index.js.map +1 -1
- package/payload/platform/lib/graph-trash/src/index.ts +1 -2
- package/payload/platform/neo4j/schema.cypher +4 -16
- package/payload/platform/plugins/admin/PLUGIN.md +0 -4
- package/payload/platform/plugins/admin/mcp/dist/index.js +1 -533
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/cloudflare/scripts/setup-tunnel.sh +0 -47
- package/payload/platform/plugins/docs/references/cloudflare.md +0 -1
- package/payload/platform/plugins/docs/references/deployment.md +9 -18
- package/payload/platform/plugins/docs/references/internals.md +4 -4
- package/payload/platform/plugins/docs/references/platform.md +5 -1
- package/payload/platform/plugins/docs/references/troubleshooting.md +11 -7
- package/payload/platform/plugins/memory/PLUGIN.md +1 -1
- package/payload/platform/plugins/memory/mcp/dist/index.js +1 -1
- package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.d.ts +2 -3
- package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.js +2 -3
- package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-restore.d.ts +1 -1
- package/payload/platform/plugins/memory/references/graph-primitives.md +5 -5
- package/payload/platform/scripts/seed-neo4j.sh +9 -38
- 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 +1 -14
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.js +1 -1
- 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 +0 -14
- 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 +2 -9
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts +1 -28
- package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/system-prompt.js +4 -78
- package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
- package/payload/platform/templates/agents/admin/IDENTITY.md +2 -0
- package/payload/server/{chunk-NL7QLVAD.js → chunk-KVGTWNKQ.js} +1 -70
- package/payload/server/{chunk-2MRZBQMH.js → chunk-RZQMYJVY.js} +1 -1
- package/payload/server/{chunk-YPZFYTYP.js → chunk-ZGJ6CUU2.js} +1 -1
- package/payload/server/{cloudflare-task-tracker-QVOGHKWV.js → cloudflare-task-tracker-4PKOLE4H.js} +2 -2
- package/payload/server/maxy-edge.js +2 -2
- package/payload/server/public/assets/{Checkbox-YIF0payo.js → Checkbox-C6zXApx_.js} +1 -1
- package/payload/server/public/assets/{admin-Bk2eXMFD.js → admin-Cuu1QdAA.js} +53 -53
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-Bz8mlxZZ.js → architectureDiagram-Q4EWVU46-BYXgFii5.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-DwV8Z8-i.js → blockDiagram-DXYQGD6D-GIQ0eO13.js} +1 -1
- package/payload/server/public/assets/{brand-Bm671owU.js → brand-B-bNrpwc.js} +1 -1
- package/payload/server/public/assets/{brand-DqiRNMlu.css → brand-DdhkC994.css} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-DiUTejMp.js → c4Diagram-AHTNJAMY-BmyWfG-l.js} +1 -1
- package/payload/server/public/assets/channel-C76knBRO.js +1 -0
- package/payload/server/public/assets/{chunk-336JU56O-4mHZpBXe.js → chunk-336JU56O-DcWl0MQo.js} +2 -2
- package/payload/server/public/assets/{chunk-426QAEUC-Cbv0vrN9.js → chunk-426QAEUC-BIW6kq6y.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-BvLhId_2.js → chunk-4TB4RGXK-CdoHpV4X.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-bBafOTkw.js → chunk-5FUZZQ4R-bn_a4sfU.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-B0NqBKVy.js → chunk-5PVQY5BW-C_Rq8j_M.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-CFd4SqI6.js → chunk-EDXVE4YY-CWQvoVKV.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-ajf2sb6c.js → chunk-ENJZ2VHE-DBHn1kSk.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-pWg6bug7.js → chunk-ICPOFSXX-SW2Qx11O.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-OjEd-17c.js → chunk-OYMX7WX6-BvIG7tVW.js} +1 -1
- package/payload/server/public/assets/{chunk-U2HBQHQK-DbEFSPoh.js → chunk-U2HBQHQK-BiBUb0cF.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-COdNwrBb.js → chunk-X2U36JSP-Y0MKZCCh.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-CHMWuY9B.js → chunk-YZCP3GAM-DKPh06GH.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-B-uDLQOB.js → chunk-ZZ45TVLE-C2WNo-fK.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-Bohexn7P.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DVsmsAu7.js +1 -0
- package/payload/server/public/assets/clone-DUrXF4sO.js +1 -0
- package/payload/server/public/assets/{dagre-bhIG_KnW.js → dagre-CrK8E9ee.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-CMEzmhIL.js → dagre-KV5264BT-_o6uXcH8.js} +1 -1
- package/payload/server/public/assets/data-j1WNhF8t.js +1 -0
- package/payload/server/public/assets/{device-url-actions-AcOyLSeF.js → device-url-actions-BcHerWqJ.js} +1 -1
- package/payload/server/public/assets/{diagram-5BDNPKRD-6RIoQhIL.js → diagram-5BDNPKRD-FFP9DKhc.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-BSp36TVv.js → diagram-G4DWMVQ6-DpwD1jBP.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-D54fo52D.js → diagram-MMDJMWI5-C3K5agdK.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-CWL8z-Pq.js → diagram-TYMM5635-CbeDipbC.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-AnnHBo3z.js → erDiagram-SMLLAGMA-XBIFndNy.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-laWmBl5o.js → flowDiagram-DWJPFMVM-BvEgySyn.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-B94ko8ie.js → ganttDiagram-T4ZO3ILL-D7gIRKJf.js} +1 -1
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-DxzL1fxZ.js → gitGraphDiagram-UUTBAWPF-vJu_hcri.js} +1 -1
- package/payload/server/public/assets/graph-C_f_9L_7.js +1 -0
- package/payload/server/public/assets/graph-labels-BSQJHlgf.js +1 -0
- package/payload/server/public/assets/{graphlib-CY-zIElM.js → graphlib-Dp0mN6JW.js} +1 -1
- package/payload/server/public/assets/{infoDiagram-42DDH7IO-BMTajIIr.js → infoDiagram-42DDH7IO-g4Dlc5Cr.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-B_QauE5O.js → ishikawaDiagram-UXIWVN3A-D_45LXOe.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-DmlqSIih.js → journeyDiagram-VCZTEJTY-CggbHl6N.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-ZGDQT7xB.js → kanban-definition-6JOO6SKY-CysAe-Ab.js} +1 -1
- package/payload/server/public/assets/{line-D13opgep.js → line-BAxq_DSY.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-C650Sual.js → mermaid-parser.core-DbFuvkjL.js} +1 -1
- package/payload/server/public/assets/{mermaid.core-BqnQoXTp.js → mermaid.core-CehvJn5b.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-BS_8y-tY.js → mindmap-definition-QFDTVHPH-DbPbBJ9h.js} +1 -1
- package/payload/server/public/assets/page-B0BPrSE3.js +1 -0
- package/payload/server/public/assets/{page-Dk73ZO1F.js → page-Co7KCRV8.js} +2 -2
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-B5OmNvBO.js → pieDiagram-DEJITSTG-cagLL9ng.js} +1 -1
- package/payload/server/public/assets/{public-DDsYgotk.js → public-B6TEcDLx.js} +5 -5
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-DTYITdNo.js → quadrantDiagram-34T5L4WZ-Keaa1jDh.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-CRZWxH06.js → requirementDiagram-MS252O5E-BcYRyn5z.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-DazRENhe.js → sankeyDiagram-XADWPNL6--fKoG9NR.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-BcHTxmPy.js → sequenceDiagram-FGHM5R23-lKG36-Di.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-DYU7nbqg.js → stateDiagram-FHFEXIEX-BuVsrlig.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DSt88_xL.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-BKGmqkST.js → timeline-definition-GMOUNBTQ-D6X6uq17.js} +1 -1
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-BXvLPmX7.js → vennDiagram-DHZGUBPP-BgvcfRVf.js} +1 -1
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-BCclUa3Z.js → wardleyDiagram-NUSXRM2D-Cpd1xsrt.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-C-Xp-Eoc.js → xychartDiagram-5P7HB3ND-CDF5ZVFv.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 +151 -362
- package/payload/platform/plugins/admin/hooks/onboarding-skill-drift.sh +0 -103
- package/payload/platform/plugins/admin/skills/onboarding/SKILL.md +0 -240
- package/payload/platform/services/claude-session-manager/scripts/onboarding-advance.sh +0 -61
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-0.md +0 -5
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-1.md +0 -3
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-2.md +0 -3
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-3.md +0 -8
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-4.md +0 -9
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-5.md +0 -3
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-6.md +0 -5
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-7.md +0 -5
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-8.md +0 -5
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-9.md +0 -8
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-complete.md +0 -3
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-unreachable.md +0 -3
- package/payload/server/public/assets/channel-PtVtoBEL.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-RVH_SEhY.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-Cm3rAb93.js +0 -1
- package/payload/server/public/assets/clone-BjY0Wzht.js +0 -1
- package/payload/server/public/assets/data-ll_OwVNL.js +0 -1
- package/payload/server/public/assets/graph-DJ2VWioQ.js +0 -1
- package/payload/server/public/assets/graph-labels-qhU8xZDH.js +0 -1
- package/payload/server/public/assets/page-DsYsdBUK.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BgljVtlp.js +0 -1
package/payload/server/server.js
CHANGED
|
@@ -60,7 +60,7 @@ import {
|
|
|
60
60
|
vncLog,
|
|
61
61
|
waitForExit,
|
|
62
62
|
walkPremiumBundles
|
|
63
|
-
} from "./chunk-
|
|
63
|
+
} from "./chunk-ZGJ6CUU2.js";
|
|
64
64
|
import {
|
|
65
65
|
CLOUDFLARE_TASK_DIAGNOSTICS,
|
|
66
66
|
appendCloudflareSteps,
|
|
@@ -69,7 +69,7 @@ import {
|
|
|
69
69
|
openCloudflareTask,
|
|
70
70
|
readTunnelState,
|
|
71
71
|
resolveUnitGoneVerdict
|
|
72
|
-
} from "./chunk-
|
|
72
|
+
} from "./chunk-RZQMYJVY.js";
|
|
73
73
|
import {
|
|
74
74
|
GREETING_DIRECTIVE,
|
|
75
75
|
HAIKU_MODEL,
|
|
@@ -85,7 +85,6 @@ import {
|
|
|
85
85
|
getUserTimezone,
|
|
86
86
|
listAdminSessions,
|
|
87
87
|
loadAdminUserName,
|
|
88
|
-
loadOnboardingStep,
|
|
89
88
|
persistMessage,
|
|
90
89
|
projectAgent,
|
|
91
90
|
renameConversation,
|
|
@@ -93,7 +92,7 @@ import {
|
|
|
93
92
|
verifyAndGetConversationUpdatedAt,
|
|
94
93
|
verifyConversationOwnership,
|
|
95
94
|
writeAdminUserAndPerson
|
|
96
|
-
} from "./chunk-
|
|
95
|
+
} from "./chunk-KVGTWNKQ.js";
|
|
97
96
|
import {
|
|
98
97
|
__commonJS,
|
|
99
98
|
__toESM
|
|
@@ -141,7 +140,6 @@ var require_dist2 = __commonJS({
|
|
|
141
140
|
DigitalDocument: ["attachmentId"],
|
|
142
141
|
Conversation: ["conversationId"],
|
|
143
142
|
Message: ["messageId"],
|
|
144
|
-
OnboardingState: ["accountId"],
|
|
145
143
|
Workflow: ["workflowId"],
|
|
146
144
|
WorkflowStep: ["stepId"],
|
|
147
145
|
WorkflowRun: ["runId"],
|
|
@@ -618,7 +616,7 @@ var serveStatic = (options = { root: "" }) => {
|
|
|
618
616
|
|
|
619
617
|
// server/index.ts
|
|
620
618
|
import { readFileSync as readFileSync19, existsSync as existsSync22, watchFile } from "fs";
|
|
621
|
-
import { resolve as
|
|
619
|
+
import { resolve as resolve22, join as join13, basename as basename5 } from "path";
|
|
622
620
|
import { homedir as homedir5 } from "os";
|
|
623
621
|
|
|
624
622
|
// app/lib/agent-slug-pattern.ts
|
|
@@ -1600,7 +1598,7 @@ var credsSaveQueue = Promise.resolve();
|
|
|
1600
1598
|
async function drainCredsSaveQueue(timeoutMs = 5e3) {
|
|
1601
1599
|
console.error(`${TAG3} draining credential save queue\u2026`);
|
|
1602
1600
|
const timer2 = new Promise(
|
|
1603
|
-
(
|
|
1601
|
+
(resolve23) => setTimeout(() => resolve23("timeout"), timeoutMs)
|
|
1604
1602
|
);
|
|
1605
1603
|
const result = await Promise.race([
|
|
1606
1604
|
credsSaveQueue.then(() => "drained"),
|
|
@@ -1728,11 +1726,11 @@ async function createWaSocket(opts) {
|
|
|
1728
1726
|
return sock;
|
|
1729
1727
|
}
|
|
1730
1728
|
async function waitForConnection(sock) {
|
|
1731
|
-
return new Promise((
|
|
1729
|
+
return new Promise((resolve23, reject) => {
|
|
1732
1730
|
const handler = (update) => {
|
|
1733
1731
|
if (update.connection === "open") {
|
|
1734
1732
|
sock.ev.off("connection.update", handler);
|
|
1735
|
-
|
|
1733
|
+
resolve23();
|
|
1736
1734
|
}
|
|
1737
1735
|
if (update.connection === "close") {
|
|
1738
1736
|
sock.ev.off("connection.update", handler);
|
|
@@ -1846,14 +1844,14 @@ ${inspected}`;
|
|
|
1846
1844
|
return inspect2(err, INSPECT_OPTS2);
|
|
1847
1845
|
}
|
|
1848
1846
|
function withTimeout(label, promise, timeoutMs) {
|
|
1849
|
-
return new Promise((
|
|
1847
|
+
return new Promise((resolve23, reject) => {
|
|
1850
1848
|
const timer2 = setTimeout(() => {
|
|
1851
1849
|
reject(new Error(`${label} timed out after ${timeoutMs}ms`));
|
|
1852
1850
|
}, timeoutMs);
|
|
1853
1851
|
promise.then(
|
|
1854
1852
|
(value) => {
|
|
1855
1853
|
clearTimeout(timer2);
|
|
1856
|
-
|
|
1854
|
+
resolve23(value);
|
|
1857
1855
|
},
|
|
1858
1856
|
(err) => {
|
|
1859
1857
|
clearTimeout(timer2);
|
|
@@ -2388,8 +2386,8 @@ async function persistWhatsAppMessage(input) {
|
|
|
2388
2386
|
const { givenName, familyName } = splitName(input.pushName);
|
|
2389
2387
|
const prev = sessionWriteLocks.get(input.cacheKey);
|
|
2390
2388
|
let release;
|
|
2391
|
-
const mine = new Promise((
|
|
2392
|
-
release =
|
|
2389
|
+
const mine = new Promise((resolve23) => {
|
|
2390
|
+
release = resolve23;
|
|
2393
2391
|
});
|
|
2394
2392
|
const chained = (prev ?? Promise.resolve()).then(() => mine);
|
|
2395
2393
|
sessionWriteLocks.set(input.cacheKey, chained);
|
|
@@ -3426,11 +3424,11 @@ async function connectWithReconnect(conn) {
|
|
|
3426
3424
|
console.error(
|
|
3427
3425
|
`${TAG13} reconnecting account=${conn.accountId} in ${delay}ms (attempt ${decision.nextAttempts}/${maxAttempts})`
|
|
3428
3426
|
);
|
|
3429
|
-
await new Promise((
|
|
3430
|
-
const timer2 = setTimeout(
|
|
3427
|
+
await new Promise((resolve23) => {
|
|
3428
|
+
const timer2 = setTimeout(resolve23, delay);
|
|
3431
3429
|
conn.abortController.signal.addEventListener("abort", () => {
|
|
3432
3430
|
clearTimeout(timer2);
|
|
3433
|
-
|
|
3431
|
+
resolve23();
|
|
3434
3432
|
}, { once: true });
|
|
3435
3433
|
});
|
|
3436
3434
|
}
|
|
@@ -3438,16 +3436,16 @@ async function connectWithReconnect(conn) {
|
|
|
3438
3436
|
}
|
|
3439
3437
|
}
|
|
3440
3438
|
function waitForDisconnectEvent(conn) {
|
|
3441
|
-
return new Promise((
|
|
3439
|
+
return new Promise((resolve23) => {
|
|
3442
3440
|
if (!conn.sock) {
|
|
3443
|
-
|
|
3441
|
+
resolve23();
|
|
3444
3442
|
return;
|
|
3445
3443
|
}
|
|
3446
3444
|
const sock = conn.sock;
|
|
3447
3445
|
const handler = (update) => {
|
|
3448
3446
|
if (update.connection === "close") {
|
|
3449
3447
|
sock.ev.off("connection.update", handler);
|
|
3450
|
-
|
|
3448
|
+
resolve23();
|
|
3451
3449
|
}
|
|
3452
3450
|
};
|
|
3453
3451
|
sock.ev.on("connection.update", handler);
|
|
@@ -3709,8 +3707,8 @@ async function handleInboundMessage(conn, msg) {
|
|
|
3709
3707
|
const conversationKey = isGroup ? remoteJid : senderPhone;
|
|
3710
3708
|
const debounceKey = `${conn.accountId}:${conversationKey}:${senderPhone}`;
|
|
3711
3709
|
let resolvePending;
|
|
3712
|
-
const sttPending = new Promise((
|
|
3713
|
-
resolvePending =
|
|
3710
|
+
const sttPending = new Promise((resolve23) => {
|
|
3711
|
+
resolvePending = resolve23;
|
|
3714
3712
|
});
|
|
3715
3713
|
if (conn.debouncer) conn.debouncer.registerPending(debounceKey, sttPending);
|
|
3716
3714
|
try {
|
|
@@ -4127,20 +4125,20 @@ async function probeApiKey() {
|
|
|
4127
4125
|
return result.status;
|
|
4128
4126
|
}
|
|
4129
4127
|
function checkPort(port2, timeoutMs = 500) {
|
|
4130
|
-
return new Promise((
|
|
4128
|
+
return new Promise((resolve23) => {
|
|
4131
4129
|
const socket = createConnection2(port2, "127.0.0.1");
|
|
4132
4130
|
socket.setTimeout(timeoutMs);
|
|
4133
4131
|
socket.once("connect", () => {
|
|
4134
4132
|
socket.destroy();
|
|
4135
|
-
|
|
4133
|
+
resolve23(true);
|
|
4136
4134
|
});
|
|
4137
4135
|
socket.once("error", () => {
|
|
4138
4136
|
socket.destroy();
|
|
4139
|
-
|
|
4137
|
+
resolve23(false);
|
|
4140
4138
|
});
|
|
4141
4139
|
socket.once("timeout", () => {
|
|
4142
4140
|
socket.destroy();
|
|
4143
|
-
|
|
4141
|
+
resolve23(false);
|
|
4144
4142
|
});
|
|
4145
4143
|
});
|
|
4146
4144
|
}
|
|
@@ -4196,17 +4194,11 @@ app.get("/", async (c) => {
|
|
|
4196
4194
|
}
|
|
4197
4195
|
const whatsappAnyConnected = whatsappAccounts.some((a) => a.connected);
|
|
4198
4196
|
const whatsappAnyStuck = whatsappAccounts.some((a) => Boolean(a.sessionStuckReason));
|
|
4199
|
-
let onboardingComplete;
|
|
4200
4197
|
const account = resolveAccount();
|
|
4201
|
-
if (account) {
|
|
4202
|
-
const step = await loadOnboardingStep(account.accountId);
|
|
4203
|
-
if (step !== null) onboardingComplete = step >= 6;
|
|
4204
|
-
}
|
|
4205
4198
|
const missingPlugins = findMissingPlugins(account?.config.enabledPlugins);
|
|
4206
4199
|
return c.json({
|
|
4207
4200
|
pin_configured: pinConfigured,
|
|
4208
4201
|
claude_authenticated: claudeAuthenticated,
|
|
4209
|
-
...onboardingComplete !== void 0 && { onboarding_complete: onboardingComplete },
|
|
4210
4202
|
vnc_running: vncRunning,
|
|
4211
4203
|
browser_transport: browserTransport,
|
|
4212
4204
|
auth_status: authHealth.status,
|
|
@@ -5235,12 +5227,12 @@ async function dispatchOnce(input) {
|
|
|
5235
5227
|
});
|
|
5236
5228
|
if (!entry) return { error: "spawn-failed" };
|
|
5237
5229
|
entry.lastInboundAt = Date.now();
|
|
5238
|
-
let
|
|
5230
|
+
let resolve23;
|
|
5239
5231
|
const turnPromise = new Promise((r) => {
|
|
5240
|
-
|
|
5232
|
+
resolve23 = r;
|
|
5241
5233
|
});
|
|
5242
5234
|
const listener = (text) => {
|
|
5243
|
-
|
|
5235
|
+
resolve23(text);
|
|
5244
5236
|
};
|
|
5245
5237
|
entry.subscribers.add(listener);
|
|
5246
5238
|
const writeOk = await writeInput(entry, input.text);
|
|
@@ -5603,8 +5595,8 @@ async function startLogin(opts) {
|
|
|
5603
5595
|
resetActiveLogin(accountId);
|
|
5604
5596
|
let resolveQr = null;
|
|
5605
5597
|
let rejectQr = null;
|
|
5606
|
-
const qrPromise = new Promise((
|
|
5607
|
-
resolveQr =
|
|
5598
|
+
const qrPromise = new Promise((resolve23, reject) => {
|
|
5599
|
+
resolveQr = resolve23;
|
|
5608
5600
|
rejectQr = reject;
|
|
5609
5601
|
});
|
|
5610
5602
|
const qrTimer = setTimeout(
|
|
@@ -6314,8 +6306,7 @@ var whatsapp_default = app3;
|
|
|
6314
6306
|
|
|
6315
6307
|
// server/routes/onboarding.ts
|
|
6316
6308
|
import { spawn, spawnSync as spawnSync2, execFileSync as execFileSync2 } from "child_process";
|
|
6317
|
-
import { openSync, closeSync, writeFileSync as writeFileSync7, writeSync, existsSync as existsSync7,
|
|
6318
|
-
import { resolve as resolve9, dirname as dirname3 } from "path";
|
|
6309
|
+
import { openSync, closeSync, writeFileSync as writeFileSync7, writeSync, existsSync as existsSync7, readFileSync as readFileSync10, unlinkSync as unlinkSync2 } from "fs";
|
|
6319
6310
|
import { createHash, randomUUID as randomUUID5 } from "crypto";
|
|
6320
6311
|
|
|
6321
6312
|
// ../lib/admins-write/src/index.ts
|
|
@@ -6465,7 +6456,6 @@ function checkAdminAuthInvariant(input) {
|
|
|
6465
6456
|
}
|
|
6466
6457
|
|
|
6467
6458
|
// server/routes/onboarding.ts
|
|
6468
|
-
var PLATFORM_ROOT5 = process.env.MAXY_PLATFORM_ROOT || "";
|
|
6469
6459
|
function hashPin(pin) {
|
|
6470
6460
|
return createHash("sha256").update(pin).digest("hex");
|
|
6471
6461
|
}
|
|
@@ -6677,76 +6667,6 @@ app4.delete("/set-pin", async (c) => {
|
|
|
6677
6667
|
}
|
|
6678
6668
|
return c.json({ ok: true });
|
|
6679
6669
|
});
|
|
6680
|
-
app4.post("/skip", async (c) => {
|
|
6681
|
-
let body = {};
|
|
6682
|
-
try {
|
|
6683
|
-
body = await c.req.json();
|
|
6684
|
-
} catch {
|
|
6685
|
-
}
|
|
6686
|
-
if (Object.prototype.hasOwnProperty.call(body, "minimal")) {
|
|
6687
|
-
return c.json({ error: "The minimal skip mode has been removed; POST with no body to apply defaults." }, 400);
|
|
6688
|
-
}
|
|
6689
|
-
const targetStep = 6;
|
|
6690
|
-
const account = resolveAccount();
|
|
6691
|
-
if (!account) {
|
|
6692
|
-
console.error("[onboarding-skip] no account found");
|
|
6693
|
-
return c.json({ error: "No account configured." }, 500);
|
|
6694
|
-
}
|
|
6695
|
-
const { accountId, accountDir } = account;
|
|
6696
|
-
let agentName = "Maxy";
|
|
6697
|
-
const brandPath = PLATFORM_ROOT5 ? resolve9(PLATFORM_ROOT5, "config", "brand.json") : "";
|
|
6698
|
-
if (brandPath && existsSync7(brandPath)) {
|
|
6699
|
-
try {
|
|
6700
|
-
const brand = JSON.parse(readFileSync10(brandPath, "utf-8"));
|
|
6701
|
-
if (brand.productName) agentName = brand.productName;
|
|
6702
|
-
} catch (err) {
|
|
6703
|
-
console.error(`[onboarding-skip] brand.json read failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
6704
|
-
}
|
|
6705
|
-
}
|
|
6706
|
-
const soulPath = resolve9(accountDir, "agents", "admin", "SOUL.md");
|
|
6707
|
-
try {
|
|
6708
|
-
mkdirSync4(dirname3(soulPath), { recursive: true });
|
|
6709
|
-
writeFileSync7(soulPath, `You are ${agentName}, an AI operations manager.
|
|
6710
|
-
`);
|
|
6711
|
-
console.log(`[onboarding-skip] wrote SOUL.md: ${soulPath}`);
|
|
6712
|
-
} catch (err) {
|
|
6713
|
-
console.error(`[onboarding-skip] SOUL.md write failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
6714
|
-
return c.json({ error: "Failed to write default personality." }, 500);
|
|
6715
|
-
}
|
|
6716
|
-
const session = getSession();
|
|
6717
|
-
try {
|
|
6718
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
6719
|
-
await session.run(
|
|
6720
|
-
`MERGE (o:OnboardingState {accountId: $accountId})
|
|
6721
|
-
ON CREATE SET o.currentStep = $targetStep, o.createdAt = $now, o.updatedAt = $now,
|
|
6722
|
-
o.step1CompletedAt = $now, o.step2CompletedAt = $now,
|
|
6723
|
-
o.step3CompletedAt = $now, o.step4CompletedAt = $now,
|
|
6724
|
-
o.step5CompletedAt = $now, o.step6CompletedAt = $now,
|
|
6725
|
-
o.step7CompletedAt = CASE WHEN $targetStep >= 7 THEN $now ELSE null END,
|
|
6726
|
-
o.step8CompletedAt = CASE WHEN $targetStep >= 8 THEN $now ELSE null END,
|
|
6727
|
-
o.step9CompletedAt = CASE WHEN $targetStep >= 9 THEN $now ELSE null END
|
|
6728
|
-
ON MATCH SET o.currentStep = CASE WHEN $targetStep > o.currentStep THEN $targetStep ELSE o.currentStep END,
|
|
6729
|
-
o.updatedAt = $now,
|
|
6730
|
-
o.step1CompletedAt = CASE WHEN o.step1CompletedAt IS NULL THEN $now ELSE o.step1CompletedAt END,
|
|
6731
|
-
o.step2CompletedAt = CASE WHEN o.step2CompletedAt IS NULL THEN $now ELSE o.step2CompletedAt END,
|
|
6732
|
-
o.step3CompletedAt = CASE WHEN o.step3CompletedAt IS NULL THEN $now ELSE o.step3CompletedAt END,
|
|
6733
|
-
o.step4CompletedAt = CASE WHEN o.step4CompletedAt IS NULL THEN $now ELSE o.step4CompletedAt END,
|
|
6734
|
-
o.step5CompletedAt = CASE WHEN o.step5CompletedAt IS NULL THEN $now ELSE o.step5CompletedAt END,
|
|
6735
|
-
o.step6CompletedAt = CASE WHEN o.step6CompletedAt IS NULL THEN $now ELSE o.step6CompletedAt END,
|
|
6736
|
-
o.step7CompletedAt = CASE WHEN $targetStep >= 7 AND o.step7CompletedAt IS NULL THEN $now ELSE o.step7CompletedAt END,
|
|
6737
|
-
o.step8CompletedAt = CASE WHEN $targetStep >= 8 AND o.step8CompletedAt IS NULL THEN $now ELSE o.step8CompletedAt END,
|
|
6738
|
-
o.step9CompletedAt = CASE WHEN $targetStep >= 9 AND o.step9CompletedAt IS NULL THEN $now ELSE o.step9CompletedAt END`,
|
|
6739
|
-
{ accountId, now, targetStep }
|
|
6740
|
-
);
|
|
6741
|
-
console.log(`[onboarding-skip] accountId=${accountId.slice(0, 8)}\u2026 currentStep=${targetStep} mode=default`);
|
|
6742
|
-
} catch (err) {
|
|
6743
|
-
console.error(`[onboarding-skip] Neo4j update failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
6744
|
-
return c.json({ error: "Failed to update onboarding state." }, 500);
|
|
6745
|
-
} finally {
|
|
6746
|
-
await session.close();
|
|
6747
|
-
}
|
|
6748
|
-
return c.json({ ok: true });
|
|
6749
|
-
});
|
|
6750
6670
|
var onboarding_default = app4;
|
|
6751
6671
|
|
|
6752
6672
|
// server/routes/client-error.ts
|
|
@@ -6917,9 +6837,6 @@ var deprecationLogged = /* @__PURE__ */ new Set();
|
|
|
6917
6837
|
function hashPin2(pin) {
|
|
6918
6838
|
return createHash2("sha256").update(pin).digest("hex");
|
|
6919
6839
|
}
|
|
6920
|
-
function isOnboardingComplete(step) {
|
|
6921
|
-
return step !== null && step >= 9;
|
|
6922
|
-
}
|
|
6923
6840
|
function readUsersFile2() {
|
|
6924
6841
|
if (!existsSync9(USERS_FILE)) return null;
|
|
6925
6842
|
const raw = readFileSync11(USERS_FILE, "utf-8").trim();
|
|
@@ -6995,17 +6912,6 @@ async function createAdminSession(accountId, thinkingView, userId, userName, rol
|
|
|
6995
6912
|
const cacheKey = fingerprintSessionKey(signedSessionToken);
|
|
6996
6913
|
registerSession(cacheKey, "admin", accountId, void 0, userId, userName, role);
|
|
6997
6914
|
if (userId) setWantsPriorConversation(cacheKey);
|
|
6998
|
-
let onboardingComplete = false;
|
|
6999
|
-
let onboardingStepLog = "unread";
|
|
7000
|
-
try {
|
|
7001
|
-
const step = await loadOnboardingStep(accountId);
|
|
7002
|
-
onboardingComplete = isOnboardingComplete(step);
|
|
7003
|
-
onboardingStepLog = step === null ? "null" : step;
|
|
7004
|
-
} catch (err) {
|
|
7005
|
-
console.error(`[session] onboarding query failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
7006
|
-
onboardingStepLog = "error";
|
|
7007
|
-
}
|
|
7008
|
-
console.log(`[onboarding-gate] session=${cacheKey.slice(0, 8)} accountId=${accountId.slice(0, 8)} step=${onboardingStepLog} complete=${onboardingComplete} phase=create`);
|
|
7009
6915
|
let businessName;
|
|
7010
6916
|
try {
|
|
7011
6917
|
const branding = await fetchBranding(accountId);
|
|
@@ -7039,7 +6945,6 @@ async function createAdminSession(accountId, thinkingView, userId, userName, rol
|
|
|
7039
6945
|
avatar: avatar ?? null,
|
|
7040
6946
|
role: role ?? null,
|
|
7041
6947
|
thinkingView: effectiveThinkingView,
|
|
7042
|
-
onboardingComplete,
|
|
7043
6948
|
businessName,
|
|
7044
6949
|
conversationId: initialConversationId
|
|
7045
6950
|
};
|
|
@@ -7060,17 +6965,6 @@ app6.get("/", async (c) => {
|
|
|
7060
6965
|
}
|
|
7061
6966
|
const account = resolveAccount();
|
|
7062
6967
|
const thinkingView = account?.config.thinkingView ?? "default";
|
|
7063
|
-
let onboardingComplete = false;
|
|
7064
|
-
let onboardingStepLog = "unread";
|
|
7065
|
-
try {
|
|
7066
|
-
const step = await loadOnboardingStep(accountId);
|
|
7067
|
-
onboardingComplete = isOnboardingComplete(step);
|
|
7068
|
-
onboardingStepLog = step === null ? "null" : step;
|
|
7069
|
-
} catch (err) {
|
|
7070
|
-
console.error(`[session] restore onboarding query failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
7071
|
-
onboardingStepLog = "error";
|
|
7072
|
-
}
|
|
7073
|
-
console.log(`[onboarding-gate] session=${cacheKey.slice(0, 8)} accountId=${accountId.slice(0, 8)} step=${onboardingStepLog} complete=${onboardingComplete} phase=restore`);
|
|
7074
6968
|
let businessName;
|
|
7075
6969
|
try {
|
|
7076
6970
|
const branding = await fetchBranding(accountId);
|
|
@@ -7098,7 +6992,6 @@ app6.get("/", async (c) => {
|
|
|
7098
6992
|
avatar: restoredAvatar,
|
|
7099
6993
|
role: role ?? null,
|
|
7100
6994
|
thinkingView,
|
|
7101
|
-
onboardingComplete,
|
|
7102
6995
|
businessName,
|
|
7103
6996
|
conversationId: getConversationIdForSession(cacheKey) ?? null
|
|
7104
6997
|
});
|
|
@@ -7293,7 +7186,7 @@ var failure_report_default = app9;
|
|
|
7293
7186
|
|
|
7294
7187
|
// server/routes/admin/logs.ts
|
|
7295
7188
|
import { existsSync as existsSync11, readdirSync as readdirSync5, readFileSync as readFileSync12, statSync as statSync5 } from "fs";
|
|
7296
|
-
import { resolve as
|
|
7189
|
+
import { resolve as resolve9, basename as basename3 } from "path";
|
|
7297
7190
|
|
|
7298
7191
|
// app/lib/logs-read-resolve.ts
|
|
7299
7192
|
import { existsSync as existsSync10 } from "fs";
|
|
@@ -7320,7 +7213,7 @@ app10.get("/", async (c) => {
|
|
|
7320
7213
|
const cacheKeyParam = c.req.query("cacheKey");
|
|
7321
7214
|
const download = c.req.query("download") === "1";
|
|
7322
7215
|
const account = resolveAccount();
|
|
7323
|
-
const accountLogDir = account ?
|
|
7216
|
+
const accountLogDir = account ? resolve9(account.accountDir, "logs") : null;
|
|
7324
7217
|
const logDirs = [];
|
|
7325
7218
|
if (accountLogDir) logDirs.push(accountLogDir);
|
|
7326
7219
|
logDirs.push(LOG_DIR);
|
|
@@ -7328,7 +7221,7 @@ app10.get("/", async (c) => {
|
|
|
7328
7221
|
const safe = basename3(fileParam);
|
|
7329
7222
|
const searched = [];
|
|
7330
7223
|
for (const dir of logDirs) {
|
|
7331
|
-
const filePath =
|
|
7224
|
+
const filePath = resolve9(dir, safe);
|
|
7332
7225
|
searched.push(filePath);
|
|
7333
7226
|
try {
|
|
7334
7227
|
const buffer = readFileSync12(filePath);
|
|
@@ -7440,10 +7333,10 @@ app10.get("/", async (c) => {
|
|
|
7440
7333
|
console.warn(`[admin/logs] readdir-fail dir=${dir} reason=${reason}`);
|
|
7441
7334
|
continue;
|
|
7442
7335
|
}
|
|
7443
|
-
files.filter((f) => !seen.has(f)).map((f) => ({ name: f, mtime: statSync5(
|
|
7336
|
+
files.filter((f) => !seen.has(f)).map((f) => ({ name: f, mtime: statSync5(resolve9(dir, f)).mtimeMs })).sort((a, b) => b.mtime - a.mtime).forEach(({ name }) => {
|
|
7444
7337
|
seen.add(name);
|
|
7445
7338
|
try {
|
|
7446
|
-
const content = readFileSync12(
|
|
7339
|
+
const content = readFileSync12(resolve9(dir, name));
|
|
7447
7340
|
const tail = content.length > TAIL_BYTES ? content.subarray(content.length - TAIL_BYTES).toString("utf-8") : content.toString("utf-8");
|
|
7448
7341
|
logs[name] = tail.trim() || "(empty)";
|
|
7449
7342
|
} catch (err) {
|
|
@@ -7483,7 +7376,7 @@ var claude_info_default = app11;
|
|
|
7483
7376
|
// server/routes/admin/attachment.ts
|
|
7484
7377
|
import { readFile as readFile3, readdir } from "fs/promises";
|
|
7485
7378
|
import { existsSync as existsSync12 } from "fs";
|
|
7486
|
-
import { resolve as
|
|
7379
|
+
import { resolve as resolve10 } from "path";
|
|
7487
7380
|
var app12 = new Hono();
|
|
7488
7381
|
app12.get("/:attachmentId", requireAdminSession, async (c) => {
|
|
7489
7382
|
const attachmentId = c.req.param("attachmentId");
|
|
@@ -7495,11 +7388,11 @@ app12.get("/:attachmentId", requireAdminSession, async (c) => {
|
|
|
7495
7388
|
if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/.test(attachmentId)) {
|
|
7496
7389
|
return new Response("Not found", { status: 404 });
|
|
7497
7390
|
}
|
|
7498
|
-
const dir =
|
|
7391
|
+
const dir = resolve10(ATTACHMENTS_ROOT, accountId, attachmentId);
|
|
7499
7392
|
if (!existsSync12(dir)) {
|
|
7500
7393
|
return new Response("Not found", { status: 404 });
|
|
7501
7394
|
}
|
|
7502
|
-
const metaPath =
|
|
7395
|
+
const metaPath = resolve10(dir, `${attachmentId}.meta.json`);
|
|
7503
7396
|
if (!existsSync12(metaPath)) {
|
|
7504
7397
|
return new Response("Not found", { status: 404 });
|
|
7505
7398
|
}
|
|
@@ -7514,7 +7407,7 @@ app12.get("/:attachmentId", requireAdminSession, async (c) => {
|
|
|
7514
7407
|
if (!dataFile) {
|
|
7515
7408
|
return new Response("Not found", { status: 404 });
|
|
7516
7409
|
}
|
|
7517
|
-
const filePath =
|
|
7410
|
+
const filePath = resolve10(dir, dataFile);
|
|
7518
7411
|
const buffer = await readFile3(filePath);
|
|
7519
7412
|
return new Response(new Uint8Array(buffer), {
|
|
7520
7413
|
headers: {
|
|
@@ -7527,13 +7420,13 @@ app12.get("/:attachmentId", requireAdminSession, async (c) => {
|
|
|
7527
7420
|
var attachment_default = app12;
|
|
7528
7421
|
|
|
7529
7422
|
// server/routes/admin/agents.ts
|
|
7530
|
-
import { resolve as
|
|
7423
|
+
import { resolve as resolve11 } from "path";
|
|
7531
7424
|
import { readdirSync as readdirSync6, readFileSync as readFileSync13, existsSync as existsSync13, rmSync } from "fs";
|
|
7532
7425
|
var app13 = new Hono();
|
|
7533
7426
|
app13.get("/", (c) => {
|
|
7534
7427
|
const account = resolveAccount();
|
|
7535
7428
|
if (!account) return c.json({ agents: [] });
|
|
7536
|
-
const agentsDir =
|
|
7429
|
+
const agentsDir = resolve11(account.accountDir, "agents");
|
|
7537
7430
|
if (!existsSync13(agentsDir)) return c.json({ agents: [] });
|
|
7538
7431
|
const agents = [];
|
|
7539
7432
|
try {
|
|
@@ -7541,7 +7434,7 @@ app13.get("/", (c) => {
|
|
|
7541
7434
|
for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
7542
7435
|
if (!entry.isDirectory()) continue;
|
|
7543
7436
|
if (entry.name === "admin") continue;
|
|
7544
|
-
const configPath2 =
|
|
7437
|
+
const configPath2 = resolve11(agentsDir, entry.name, "config.json");
|
|
7545
7438
|
if (!existsSync13(configPath2)) continue;
|
|
7546
7439
|
try {
|
|
7547
7440
|
const config = JSON.parse(readFileSync13(configPath2, "utf-8"));
|
|
@@ -7570,7 +7463,7 @@ app13.delete("/:slug", async (c) => {
|
|
|
7570
7463
|
if (slug.includes("/") || slug.includes("..") || slug.includes("\\")) {
|
|
7571
7464
|
return c.json({ error: "Invalid agent slug" }, 400);
|
|
7572
7465
|
}
|
|
7573
|
-
const agentDir =
|
|
7466
|
+
const agentDir = resolve11(account.accountDir, "agents", slug);
|
|
7574
7467
|
if (!existsSync13(agentDir)) {
|
|
7575
7468
|
return c.json({ error: "Agent not found" }, 404);
|
|
7576
7469
|
}
|
|
@@ -7600,7 +7493,7 @@ app13.post("/:slug/project", async (c) => {
|
|
|
7600
7493
|
if (slug.includes("/") || slug.includes("..") || slug.includes("\\")) {
|
|
7601
7494
|
return c.json({ error: "Invalid agent slug" }, 400);
|
|
7602
7495
|
}
|
|
7603
|
-
const agentDir =
|
|
7496
|
+
const agentDir = resolve11(account.accountDir, "agents", slug);
|
|
7604
7497
|
if (!existsSync13(agentDir)) {
|
|
7605
7498
|
return c.json({ error: "Agent not found on disk" }, 404);
|
|
7606
7499
|
}
|
|
@@ -7617,7 +7510,7 @@ var agents_default = app13;
|
|
|
7617
7510
|
// server/routes/admin/sessions.ts
|
|
7618
7511
|
import crypto from "crypto";
|
|
7619
7512
|
import { resolve as resolvePath } from "path";
|
|
7620
|
-
import { existsSync as existsSync14, mkdirSync as
|
|
7513
|
+
import { existsSync as existsSync14, mkdirSync as mkdirSync4, createWriteStream } from "fs";
|
|
7621
7514
|
|
|
7622
7515
|
// app/lib/synthetic-marker.ts
|
|
7623
7516
|
var CLOUDFLARE_MARKER_PREFIX = "Cloudflare setup completed (actionId: ";
|
|
@@ -7643,7 +7536,7 @@ var pickComponentBytes = (..._args) => null;
|
|
|
7643
7536
|
function openResumeStreamLog(accountId, conversationId) {
|
|
7644
7537
|
const dir = resolvePath(ACCOUNTS_DIR, accountId, "resume-logs");
|
|
7645
7538
|
try {
|
|
7646
|
-
|
|
7539
|
+
mkdirSync4(dir, { recursive: true });
|
|
7647
7540
|
} catch {
|
|
7648
7541
|
}
|
|
7649
7542
|
return createWriteStream(resolvePath(dir, `${conversationId}.log`), { flags: "a" });
|
|
@@ -8200,89 +8093,19 @@ app14.put("/:id/label", requireAdminSession, async (c) => {
|
|
|
8200
8093
|
});
|
|
8201
8094
|
var sessions_default = app14;
|
|
8202
8095
|
|
|
8203
|
-
// app/lib/claude-agent/onboarding-prompt.ts
|
|
8204
|
-
var TAG18 = "[onboarding-prompt]";
|
|
8205
|
-
async function buildOnboardingPromptBlock(accountId) {
|
|
8206
|
-
const step = await loadOnboardingStep(accountId);
|
|
8207
|
-
const accountIdShort = accountId.slice(0, 8);
|
|
8208
|
-
if (step === null) {
|
|
8209
|
-
console.log(`${TAG18} graph-unreachable accountId=${accountIdShort}`);
|
|
8210
|
-
} else if (step === 9) {
|
|
8211
|
-
console.log(`${TAG18} agent=admin accountId=${accountIdShort} step=9 complete`);
|
|
8212
|
-
} else if (step === -1) {
|
|
8213
|
-
console.log(`${TAG18} agent=admin accountId=${accountIdShort} step=missing`);
|
|
8214
|
-
} else {
|
|
8215
|
-
console.log(`${TAG18} agent=admin accountId=${accountIdShort} step=${step}`);
|
|
8216
|
-
}
|
|
8217
|
-
return { step };
|
|
8218
|
-
}
|
|
8219
|
-
|
|
8220
|
-
// server/lib/onboarding-advance.ts
|
|
8221
|
-
import { execFile as execFile2 } from "child_process";
|
|
8222
|
-
import { join as join11, resolve as resolvePath2 } from "path";
|
|
8223
|
-
var TAG19 = "[claude-session-manager:wrapper]";
|
|
8224
|
-
function onboardingAdvanceScriptPath() {
|
|
8225
|
-
const platformRoot = process.env.MAXY_PLATFORM_ROOT ?? resolvePath2(process.cwd(), "..");
|
|
8226
|
-
return join11(platformRoot, "services", "claude-session-manager", "scripts", "onboarding-advance.sh");
|
|
8227
|
-
}
|
|
8228
|
-
function runOnboardingAdvance(accountId, currentStep) {
|
|
8229
|
-
const scriptPath = onboardingAdvanceScriptPath();
|
|
8230
|
-
const stepArg = currentStep === null ? "null" : String(currentStep);
|
|
8231
|
-
return new Promise((resolve24) => {
|
|
8232
|
-
execFile2(
|
|
8233
|
-
scriptPath,
|
|
8234
|
-
[accountId, stepArg],
|
|
8235
|
-
{ maxBuffer: 64 * 1024, timeout: 5e3 },
|
|
8236
|
-
(err, stdout, stderr) => {
|
|
8237
|
-
if (err) {
|
|
8238
|
-
console.error(`${TAG19} [onboarding-state] route-advance script-failed step=${stepArg} sender=${accountId}: ${err.message}`);
|
|
8239
|
-
resolve24(null);
|
|
8240
|
-
return;
|
|
8241
|
-
}
|
|
8242
|
-
if (stderr && stderr.trim()) {
|
|
8243
|
-
process.stderr.write(stderr.endsWith("\n") ? stderr : `${stderr}
|
|
8244
|
-
`);
|
|
8245
|
-
}
|
|
8246
|
-
resolve24(stdout);
|
|
8247
|
-
}
|
|
8248
|
-
);
|
|
8249
|
-
});
|
|
8250
|
-
}
|
|
8251
|
-
|
|
8252
8096
|
// server/routes/admin/claude-sessions.ts
|
|
8253
|
-
var
|
|
8097
|
+
var TAG18 = "[claude-session-manager:wrapper]";
|
|
8254
8098
|
function managerBase2() {
|
|
8255
8099
|
const port2 = Number(process.env.CLAUDE_SESSION_MANAGER_PORT ?? "19400");
|
|
8256
8100
|
return `http://127.0.0.1:${port2}`;
|
|
8257
8101
|
}
|
|
8258
|
-
async function resolveConversationIdForBanner(cacheKey, accountId, userId) {
|
|
8259
|
-
const bound = getConversationIdForSession(cacheKey);
|
|
8260
|
-
if (bound) return bound;
|
|
8261
|
-
const ensured = await ensureConversation(
|
|
8262
|
-
accountId,
|
|
8263
|
-
"admin",
|
|
8264
|
-
cacheKey,
|
|
8265
|
-
void 0,
|
|
8266
|
-
void 0,
|
|
8267
|
-
userId
|
|
8268
|
-
).catch((err) => {
|
|
8269
|
-
console.error(`${TAG20} ensureConversation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
8270
|
-
return null;
|
|
8271
|
-
});
|
|
8272
|
-
if (ensured?.conversationId) {
|
|
8273
|
-
setConversationIdForSession(cacheKey, ensured.conversationId);
|
|
8274
|
-
return ensured.conversationId;
|
|
8275
|
-
}
|
|
8276
|
-
return null;
|
|
8277
|
-
}
|
|
8278
8102
|
var app15 = new Hono();
|
|
8279
8103
|
app15.use("*", requireAdminSession);
|
|
8280
8104
|
app15.post("/", async (c) => {
|
|
8281
8105
|
const cacheKey = c.get("cacheKey") ?? "";
|
|
8282
8106
|
const senderId = getAccountIdForSession(cacheKey) ?? "";
|
|
8283
|
-
const userId = getUserIdForSession(cacheKey);
|
|
8284
8107
|
if (!senderId) {
|
|
8285
|
-
console.error(`${
|
|
8108
|
+
console.error(`${TAG18} reject reason=no-account-id`);
|
|
8286
8109
|
return c.json({ error: "admin-account-not-resolved" }, 500);
|
|
8287
8110
|
}
|
|
8288
8111
|
let body = {};
|
|
@@ -8292,59 +8115,30 @@ app15.post("/", async (c) => {
|
|
|
8292
8115
|
}
|
|
8293
8116
|
const channel = typeof body.channel === "string" ? body.channel : "browser";
|
|
8294
8117
|
const initialMessage = typeof body.initialMessage === "string" && body.initialMessage.trim() ? body.initialMessage : null;
|
|
8295
|
-
const onboardingAdvance = body.onboardingAdvance === true;
|
|
8296
8118
|
const permissionMode = typeof body.permissionMode === "string" ? body.permissionMode : void 0;
|
|
8297
|
-
let onboarding;
|
|
8298
|
-
let resolvedStep = 9;
|
|
8299
|
-
try {
|
|
8300
|
-
const outcome = await buildOnboardingPromptBlock(senderId);
|
|
8301
|
-
onboarding = { step: outcome.step };
|
|
8302
|
-
resolvedStep = outcome.step;
|
|
8303
|
-
} catch (err) {
|
|
8304
|
-
console.error(`${TAG20} onboarding-resolve failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
8305
|
-
}
|
|
8306
|
-
let scriptOutput = null;
|
|
8307
|
-
if (onboardingAdvance && resolvedStep !== 9 && onboarding) {
|
|
8308
|
-
scriptOutput = await runOnboardingAdvance(senderId, resolvedStep);
|
|
8309
|
-
if (scriptOutput && scriptOutput.trim()) {
|
|
8310
|
-
onboarding = { step: resolvedStep, resumePrompt: scriptOutput };
|
|
8311
|
-
}
|
|
8312
|
-
}
|
|
8313
8119
|
const upstream = await fetch(`${managerBase2()}/spawn`, {
|
|
8314
8120
|
method: "POST",
|
|
8315
8121
|
headers: { "content-type": "application/json" },
|
|
8316
|
-
body: JSON.stringify({ senderId, role: "admin", channel,
|
|
8122
|
+
body: JSON.stringify({ senderId, role: "admin", channel, permissionMode })
|
|
8317
8123
|
}).catch((err) => {
|
|
8318
|
-
console.error(`${
|
|
8124
|
+
console.error(`${TAG18} fetch-failed op=spawn message=${err instanceof Error ? err.message : String(err)}`);
|
|
8319
8125
|
return null;
|
|
8320
8126
|
});
|
|
8321
8127
|
if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
|
|
8322
8128
|
let spawnedSessionId = null;
|
|
8323
|
-
if (upstream.ok) {
|
|
8129
|
+
if (upstream.ok && initialMessage) {
|
|
8324
8130
|
const buffered = await upstream.clone().json().catch(() => null);
|
|
8325
8131
|
if (buffered && typeof buffered.sessionId === "string" && buffered.sessionId) {
|
|
8326
8132
|
spawnedSessionId = buffered.sessionId;
|
|
8327
8133
|
}
|
|
8328
8134
|
}
|
|
8329
|
-
if (
|
|
8330
|
-
const conversationId = await resolveConversationIdForBanner(cacheKey, senderId, userId);
|
|
8331
|
-
if (conversationId) {
|
|
8332
|
-
try {
|
|
8333
|
-
await persistMessage(conversationId, "assistant", scriptOutput.trimEnd(), senderId);
|
|
8334
|
-
} catch (err) {
|
|
8335
|
-
console.error(`${TAG20} persist initial assistant message failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
8336
|
-
}
|
|
8337
|
-
} else {
|
|
8338
|
-
console.error(`${TAG20} banner-flow no conversationId resolved \u2014 script output not persisted, only system prompt carries it`);
|
|
8339
|
-
}
|
|
8340
|
-
}
|
|
8341
|
-
if (!onboardingAdvance && initialMessage && spawnedSessionId) {
|
|
8135
|
+
if (initialMessage && spawnedSessionId) {
|
|
8342
8136
|
fetch(`${managerBase2()}/${encodeURIComponent(spawnedSessionId)}/input`, {
|
|
8343
8137
|
method: "POST",
|
|
8344
8138
|
headers: { "content-type": "application/json" },
|
|
8345
8139
|
body: JSON.stringify({ text: initialMessage })
|
|
8346
8140
|
}).catch((err) => {
|
|
8347
|
-
console.error(`${
|
|
8141
|
+
console.error(`${TAG18} fetch-failed op=initial-input message=${err instanceof Error ? err.message : String(err)}`);
|
|
8348
8142
|
});
|
|
8349
8143
|
}
|
|
8350
8144
|
return new Response(upstream.body, { status: upstream.status, headers: upstream.headers });
|
|
@@ -8356,7 +8150,7 @@ app15.get("/", async (c) => {
|
|
|
8356
8150
|
const upstream = await fetch(
|
|
8357
8151
|
`${managerBase2()}/list?senderId=${encodeURIComponent(senderId)}`
|
|
8358
8152
|
).catch((err) => {
|
|
8359
|
-
console.error(`${
|
|
8153
|
+
console.error(`${TAG18} fetch-failed op=list message=${err instanceof Error ? err.message : String(err)}`);
|
|
8360
8154
|
return null;
|
|
8361
8155
|
});
|
|
8362
8156
|
if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
|
|
@@ -8386,7 +8180,7 @@ app15.post("/resume", async (c) => {
|
|
|
8386
8180
|
claudeSessionId: body.claudeSessionId
|
|
8387
8181
|
})
|
|
8388
8182
|
}).catch((err) => {
|
|
8389
|
-
console.error(`${
|
|
8183
|
+
console.error(`${TAG18} fetch-failed op=resume message=${err instanceof Error ? err.message : String(err)}`);
|
|
8390
8184
|
return null;
|
|
8391
8185
|
});
|
|
8392
8186
|
if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
|
|
@@ -8399,7 +8193,7 @@ app15.delete("/:sessionId", async (c) => {
|
|
|
8399
8193
|
`${managerBase2()}/${encodeURIComponent(sessionId)}${purge}`,
|
|
8400
8194
|
{ method: "DELETE" }
|
|
8401
8195
|
).catch((err) => {
|
|
8402
|
-
console.error(`${
|
|
8196
|
+
console.error(`${TAG18} fetch-failed op=delete message=${err instanceof Error ? err.message : String(err)}`);
|
|
8403
8197
|
return null;
|
|
8404
8198
|
});
|
|
8405
8199
|
if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
|
|
@@ -8416,7 +8210,7 @@ app15.post("/:sessionId/archive", async (c) => {
|
|
|
8416
8210
|
body
|
|
8417
8211
|
}
|
|
8418
8212
|
).catch((err) => {
|
|
8419
|
-
console.error(`${
|
|
8213
|
+
console.error(`${TAG18} fetch-failed op=archive message=${err instanceof Error ? err.message : String(err)}`);
|
|
8420
8214
|
return null;
|
|
8421
8215
|
});
|
|
8422
8216
|
if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
|
|
@@ -8427,7 +8221,7 @@ app15.get("/:sessionId/meta", async (c) => {
|
|
|
8427
8221
|
const upstream = await fetch(
|
|
8428
8222
|
`${managerBase2()}/${encodeURIComponent(sessionId)}/meta`
|
|
8429
8223
|
).catch((err) => {
|
|
8430
|
-
console.error(`${
|
|
8224
|
+
console.error(`${TAG18} fetch-failed op=meta message=${err instanceof Error ? err.message : String(err)}`);
|
|
8431
8225
|
return null;
|
|
8432
8226
|
});
|
|
8433
8227
|
if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
|
|
@@ -8444,7 +8238,7 @@ app15.patch("/:sessionId", async (c) => {
|
|
|
8444
8238
|
body
|
|
8445
8239
|
}
|
|
8446
8240
|
).catch((err) => {
|
|
8447
|
-
console.error(`${
|
|
8241
|
+
console.error(`${TAG18} fetch-failed op=patch message=${err instanceof Error ? err.message : String(err)}`);
|
|
8448
8242
|
return null;
|
|
8449
8243
|
});
|
|
8450
8244
|
if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
|
|
@@ -8461,7 +8255,7 @@ app15.post("/:sessionId/input", async (c) => {
|
|
|
8461
8255
|
body: rawBody
|
|
8462
8256
|
}
|
|
8463
8257
|
).catch((err) => {
|
|
8464
|
-
console.error(`${
|
|
8258
|
+
console.error(`${TAG18} fetch-failed op=input message=${err instanceof Error ? err.message : String(err)}`);
|
|
8465
8259
|
return null;
|
|
8466
8260
|
});
|
|
8467
8261
|
if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
|
|
@@ -8473,7 +8267,7 @@ app15.get("/:sessionId/log", async (c) => {
|
|
|
8473
8267
|
const upstream = await fetch(
|
|
8474
8268
|
`${managerBase2()}/${encodeURIComponent(sessionId)}/log${follow}`
|
|
8475
8269
|
).catch((err) => {
|
|
8476
|
-
console.error(`${
|
|
8270
|
+
console.error(`${TAG18} fetch-failed op=log message=${err instanceof Error ? err.message : String(err)}`);
|
|
8477
8271
|
return null;
|
|
8478
8272
|
});
|
|
8479
8273
|
if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
|
|
@@ -8589,13 +8383,13 @@ async function cdpNavigateNewTab(url, opts = {}) {
|
|
|
8589
8383
|
// server/routes/admin/device-browser.ts
|
|
8590
8384
|
var app18 = new Hono();
|
|
8591
8385
|
app18.post("/navigate", async (c) => {
|
|
8592
|
-
const
|
|
8386
|
+
const TAG20 = "[device-url:click]";
|
|
8593
8387
|
let body;
|
|
8594
8388
|
try {
|
|
8595
8389
|
body = await c.req.json();
|
|
8596
8390
|
} catch (err) {
|
|
8597
8391
|
const detail = err instanceof Error ? err.message : String(err);
|
|
8598
|
-
console.error(`${
|
|
8392
|
+
console.error(`${TAG20} reject reason=body-not-json detail=${detail} browser=fallback navigateResult=error`);
|
|
8599
8393
|
return c.json(
|
|
8600
8394
|
{ ok: false, navigateResult: "error", browser: "fallback", detail: "Request body was not valid JSON" },
|
|
8601
8395
|
400
|
|
@@ -8605,7 +8399,7 @@ app18.post("/navigate", async (c) => {
|
|
|
8605
8399
|
const intent = typeof body.intent === "string" ? body.intent : "";
|
|
8606
8400
|
const hostname2 = typeof body.hostname === "string" ? body.hostname : "";
|
|
8607
8401
|
if (!url) {
|
|
8608
|
-
console.error(`${
|
|
8402
|
+
console.error(`${TAG20} reject reason=missing-url intent=${JSON.stringify(intent)} browser=fallback navigateResult=error`);
|
|
8609
8403
|
return c.json(
|
|
8610
8404
|
{ ok: false, navigateResult: "error", browser: "fallback", detail: "url field is required" },
|
|
8611
8405
|
400
|
|
@@ -8615,7 +8409,7 @@ app18.post("/navigate", async (c) => {
|
|
|
8615
8409
|
try {
|
|
8616
8410
|
parsed = new URL(url);
|
|
8617
8411
|
} catch {
|
|
8618
|
-
console.error(`${
|
|
8412
|
+
console.error(`${TAG20} reject reason=url-malformed intent=${JSON.stringify(intent)} url=${url} browser=fallback navigateResult=error`);
|
|
8619
8413
|
return c.json(
|
|
8620
8414
|
{ ok: false, navigateResult: "error", browser: "fallback", detail: "url is not a valid URL" },
|
|
8621
8415
|
400
|
|
@@ -8623,7 +8417,7 @@ app18.post("/navigate", async (c) => {
|
|
|
8623
8417
|
}
|
|
8624
8418
|
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
8625
8419
|
console.error(
|
|
8626
|
-
`${
|
|
8420
|
+
`${TAG20} reject reason=scheme-not-allowed scheme=${parsed.protocol} intent=${JSON.stringify(intent)} browser=fallback navigateResult=error`
|
|
8627
8421
|
);
|
|
8628
8422
|
return c.json(
|
|
8629
8423
|
{
|
|
@@ -8639,7 +8433,7 @@ app18.post("/navigate", async (c) => {
|
|
|
8639
8433
|
const cdpOk = await ensureCdp(transport);
|
|
8640
8434
|
if (!cdpOk) {
|
|
8641
8435
|
console.error(
|
|
8642
|
-
`${
|
|
8436
|
+
`${TAG20} intent=${JSON.stringify(intent)} browser=fallback navigateResult=cdp-unreachable hostname=${JSON.stringify(hostname2)}`
|
|
8643
8437
|
);
|
|
8644
8438
|
return c.json(
|
|
8645
8439
|
{
|
|
@@ -8655,7 +8449,7 @@ app18.post("/navigate", async (c) => {
|
|
|
8655
8449
|
const browser = outcome.result === "ok" ? "vnc" : "fallback";
|
|
8656
8450
|
const detailStr = outcome.detail ? ` detail=${JSON.stringify(outcome.detail.length > 230 ? outcome.detail.slice(0, 227) + "..." : outcome.detail)}` : "";
|
|
8657
8451
|
console.error(
|
|
8658
|
-
`${
|
|
8452
|
+
`${TAG20} intent=${JSON.stringify(intent)} browser=${browser} navigateResult=${outcome.result} hostname=${JSON.stringify(hostname2)} targetId=${outcome.targetId ?? "none"}${detailStr}`
|
|
8659
8453
|
);
|
|
8660
8454
|
if (outcome.result !== "ok") {
|
|
8661
8455
|
return c.json(
|
|
@@ -8686,18 +8480,18 @@ var ALLOWED_EVENTS2 = /* @__PURE__ */ new Set([
|
|
|
8686
8480
|
]);
|
|
8687
8481
|
var app19 = new Hono();
|
|
8688
8482
|
app19.post("/", async (c) => {
|
|
8689
|
-
const
|
|
8483
|
+
const TAG20 = "[admin:events]";
|
|
8690
8484
|
let body;
|
|
8691
8485
|
try {
|
|
8692
8486
|
body = await c.req.json();
|
|
8693
8487
|
} catch (err) {
|
|
8694
8488
|
const detail = err instanceof Error ? err.message : String(err);
|
|
8695
|
-
console.error(`${
|
|
8489
|
+
console.error(`${TAG20} reject reason=body-not-json detail=${detail}`);
|
|
8696
8490
|
return c.json({ ok: false, detail: "Request body was not valid JSON" }, 400);
|
|
8697
8491
|
}
|
|
8698
8492
|
const event = typeof body.event === "string" ? body.event : "";
|
|
8699
8493
|
if (!ALLOWED_EVENTS2.has(event)) {
|
|
8700
|
-
console.error(`${
|
|
8494
|
+
console.error(`${TAG20} reject reason=event-not-allowed event=${JSON.stringify(event)}`);
|
|
8701
8495
|
return c.json({ ok: false, detail: `Event "${event}" is not allowed` }, 400);
|
|
8702
8496
|
}
|
|
8703
8497
|
const rawFields = body.fields && typeof body.fields === "object" ? body.fields : {};
|
|
@@ -8720,7 +8514,7 @@ var events_default = app19;
|
|
|
8720
8514
|
|
|
8721
8515
|
// server/routes/admin/cloudflare.ts
|
|
8722
8516
|
import { homedir as homedir4 } from "os";
|
|
8723
|
-
import { resolve as
|
|
8517
|
+
import { resolve as resolve13 } from "path";
|
|
8724
8518
|
import { readFileSync as readFileSync15 } from "fs";
|
|
8725
8519
|
|
|
8726
8520
|
// app/lib/dns-label.ts
|
|
@@ -8737,10 +8531,10 @@ function isValidDomain(value) {
|
|
|
8737
8531
|
}
|
|
8738
8532
|
|
|
8739
8533
|
// app/lib/alias-domains.ts
|
|
8740
|
-
import { existsSync as existsSync15, mkdirSync as
|
|
8741
|
-
import { dirname as
|
|
8742
|
-
import { resolve as
|
|
8743
|
-
var ALIAS_DOMAINS_PATH =
|
|
8534
|
+
import { existsSync as existsSync15, mkdirSync as mkdirSync5, readFileSync as readFileSync14, writeFileSync as writeFileSync9 } from "fs";
|
|
8535
|
+
import { dirname as dirname3 } from "path";
|
|
8536
|
+
import { resolve as resolve12 } from "path";
|
|
8537
|
+
var ALIAS_DOMAINS_PATH = resolve12(MAXY_DIR, "alias-domains.json");
|
|
8744
8538
|
function readExisting() {
|
|
8745
8539
|
if (!existsSync15(ALIAS_DOMAINS_PATH)) return /* @__PURE__ */ new Set();
|
|
8746
8540
|
try {
|
|
@@ -8755,14 +8549,14 @@ function addAliasDomain(hostname2) {
|
|
|
8755
8549
|
const existing = readExisting();
|
|
8756
8550
|
if (existing.has(hostname2)) return;
|
|
8757
8551
|
existing.add(hostname2);
|
|
8758
|
-
|
|
8552
|
+
mkdirSync5(dirname3(ALIAS_DOMAINS_PATH), { recursive: true });
|
|
8759
8553
|
writeFileSync9(ALIAS_DOMAINS_PATH, JSON.stringify([...existing], null, 2) + "\n", "utf-8");
|
|
8760
8554
|
}
|
|
8761
8555
|
|
|
8762
8556
|
// app/lib/script-stream-tailer.ts
|
|
8763
8557
|
import * as childProcess from "child_process";
|
|
8764
|
-
import { appendFileSync as appendFileSync2, createReadStream as createReadStream2, mkdirSync as
|
|
8765
|
-
import { dirname as
|
|
8558
|
+
import { appendFileSync as appendFileSync2, createReadStream as createReadStream2, mkdirSync as mkdirSync6, statSync as statSync6 } from "fs";
|
|
8559
|
+
import { dirname as dirname4 } from "path";
|
|
8766
8560
|
import { StringDecoder } from "string_decoder";
|
|
8767
8561
|
var SCRIPT_STREAM_RE = /^\[([^\]]+)\] \[script:([a-z][a-z0-9-]*)((?::[a-z0-9:_-]+)?)\] (.*)$/;
|
|
8768
8562
|
function parseLine(line) {
|
|
@@ -8871,7 +8665,7 @@ function writeRouteMilestone(streamLogPath, scope, line) {
|
|
|
8871
8665
|
}
|
|
8872
8666
|
const ts = (/* @__PURE__ */ new Date()).toISOString();
|
|
8873
8667
|
try {
|
|
8874
|
-
|
|
8668
|
+
mkdirSync6(dirname4(streamLogPath), { recursive: true });
|
|
8875
8669
|
appendFileSync2(streamLogPath, `[${ts}] [script:${scope}] ${line}
|
|
8876
8670
|
`);
|
|
8877
8671
|
} catch (err) {
|
|
@@ -9011,7 +8805,7 @@ var CLOUDFLARE_SETUP_FORM_SCHEMA = {
|
|
|
9011
8805
|
|
|
9012
8806
|
// server/routes/admin/cloudflare.ts
|
|
9013
8807
|
function cloudflareStreamLogPath(accountId, correlationId) {
|
|
9014
|
-
return
|
|
8808
|
+
return resolve13(ACCOUNTS_DIR, accountId, "cloudflare-stream-logs", `${correlationId}.log`);
|
|
9015
8809
|
}
|
|
9016
8810
|
var SETUP_TIMEOUT_MS = 10 * 60 * 1e3;
|
|
9017
8811
|
var DOMAINS_TIMEOUT_MS = 40 * 1e3;
|
|
@@ -9041,8 +8835,8 @@ function readDiscoveryResults(accountId) {
|
|
|
9041
8835
|
return { tunnels: entry.tunnels, domains: entry.domains };
|
|
9042
8836
|
}
|
|
9043
8837
|
function loadBrandInfo() {
|
|
9044
|
-
const platformRoot = process.env.MAXY_PLATFORM_ROOT ??
|
|
9045
|
-
const brandPath =
|
|
8838
|
+
const platformRoot = process.env.MAXY_PLATFORM_ROOT ?? resolve13(process.cwd(), "..");
|
|
8839
|
+
const brandPath = resolve13(platformRoot, "config", "brand.json");
|
|
9046
8840
|
try {
|
|
9047
8841
|
const parsed = JSON.parse(readFileSync15(brandPath, "utf-8"));
|
|
9048
8842
|
const hostname2 = typeof parsed.hostname === "string" && parsed.hostname ? parsed.hostname : "maxy";
|
|
@@ -9172,7 +8966,7 @@ app20.get("/domains", requireAdminSession, async (c) => {
|
|
|
9172
8966
|
streamLogPath = cloudflareStreamLogPath(accountId, correlationId);
|
|
9173
8967
|
log(`phase=stream-log-resolved path=${streamLogPath}`);
|
|
9174
8968
|
const brand = loadBrandInfo();
|
|
9175
|
-
const scriptPath =
|
|
8969
|
+
const scriptPath = resolve13(homedir4(), "list-cf-domains.sh");
|
|
9176
8970
|
const result = await runFormSpawn({
|
|
9177
8971
|
scriptPath,
|
|
9178
8972
|
args: [brand.hostname],
|
|
@@ -9263,7 +9057,7 @@ app20.get("/tunnels", requireAdminSession, async (c) => {
|
|
|
9263
9057
|
if (!accountId) return err("session", "No account bound to session \u2014 refresh chat.");
|
|
9264
9058
|
if (!correlationId) return err("session", "No active conversation for session \u2014 refresh chat.");
|
|
9265
9059
|
streamLogPath = cloudflareStreamLogPath(accountId, correlationId);
|
|
9266
|
-
const certPath =
|
|
9060
|
+
const certPath = resolve13(homedir4(), brand.configDir, "cloudflared", "cert.pem");
|
|
9267
9061
|
const { existsSync: existsSync23 } = await import("fs");
|
|
9268
9062
|
if (!existsSync23(certPath)) {
|
|
9269
9063
|
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.`);
|
|
@@ -9589,17 +9383,17 @@ var cloudflare_default = app20;
|
|
|
9589
9383
|
import { createReadStream as createReadStream3 } from "fs";
|
|
9590
9384
|
import { readdir as readdir2, readFile as readFile4, stat as stat4, mkdir as mkdir3, writeFile as writeFile4, unlink as unlink2 } from "fs/promises";
|
|
9591
9385
|
import { realpathSync as realpathSync4 } from "fs";
|
|
9592
|
-
import { basename as basename4, dirname as
|
|
9386
|
+
import { basename as basename4, dirname as dirname5, join as join11, resolve as resolve15, sep as sep3 } from "path";
|
|
9593
9387
|
import { Readable as Readable2 } from "stream";
|
|
9594
9388
|
|
|
9595
9389
|
// app/lib/data-path.ts
|
|
9596
9390
|
import { realpathSync as realpathSync3 } from "fs";
|
|
9597
|
-
import { resolve as
|
|
9598
|
-
var
|
|
9599
|
-
var DATA_ROOT =
|
|
9391
|
+
import { resolve as resolve14, normalize, sep as sep2, relative } from "path";
|
|
9392
|
+
var PLATFORM_ROOT5 = process.env.MAXY_PLATFORM_ROOT ?? resolve14(process.cwd(), "../platform");
|
|
9393
|
+
var DATA_ROOT = resolve14(PLATFORM_ROOT5, "..", "data");
|
|
9600
9394
|
function resolveDataPath(raw) {
|
|
9601
9395
|
const cleaned = normalize("/" + (raw ?? "").replace(/\\/g, "/")).replace(/^\/+/, "");
|
|
9602
|
-
const absolute =
|
|
9396
|
+
const absolute = resolve14(DATA_ROOT, cleaned);
|
|
9603
9397
|
let dataRootReal;
|
|
9604
9398
|
try {
|
|
9605
9399
|
dataRootReal = realpathSync3(DATA_ROOT);
|
|
@@ -9645,7 +9439,6 @@ var UNIQUE_KEYS_BY_LABEL = {
|
|
|
9645
9439
|
DigitalDocument: ["attachmentId"],
|
|
9646
9440
|
Conversation: ["conversationId"],
|
|
9647
9441
|
Message: ["messageId"],
|
|
9648
|
-
OnboardingState: ["accountId"],
|
|
9649
9442
|
Workflow: ["workflowId"],
|
|
9650
9443
|
WorkflowStep: ["stepId"],
|
|
9651
9444
|
WorkflowRun: ["runId"],
|
|
@@ -9947,7 +9740,7 @@ async function cascadeDeleteDocument(params) {
|
|
|
9947
9740
|
var UUID_RE4 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
9948
9741
|
async function readMeta(absDir, baseName) {
|
|
9949
9742
|
try {
|
|
9950
|
-
const raw = await readFile4(
|
|
9743
|
+
const raw = await readFile4(join11(absDir, `${baseName}.meta.json`), "utf8");
|
|
9951
9744
|
const parsed = JSON.parse(raw);
|
|
9952
9745
|
if (typeof parsed?.filename === "string") {
|
|
9953
9746
|
return { filename: parsed.filename, mimeType: typeof parsed.mimeType === "string" ? parsed.mimeType : void 0 };
|
|
@@ -9958,7 +9751,7 @@ async function readMeta(absDir, baseName) {
|
|
|
9958
9751
|
}
|
|
9959
9752
|
async function readAccountNames() {
|
|
9960
9753
|
const map = /* @__PURE__ */ new Map();
|
|
9961
|
-
const accountsDir =
|
|
9754
|
+
const accountsDir = resolve15(DATA_ROOT, "accounts");
|
|
9962
9755
|
let names;
|
|
9963
9756
|
try {
|
|
9964
9757
|
names = await readdir2(accountsDir);
|
|
@@ -9967,7 +9760,7 @@ async function readAccountNames() {
|
|
|
9967
9760
|
}
|
|
9968
9761
|
for (const name of names) {
|
|
9969
9762
|
if (!UUID_RE4.test(name)) continue;
|
|
9970
|
-
const configPath2 =
|
|
9763
|
+
const configPath2 = resolve15(accountsDir, name, "account.json");
|
|
9971
9764
|
try {
|
|
9972
9765
|
const raw = await readFile4(configPath2, "utf8");
|
|
9973
9766
|
const parsed = JSON.parse(raw);
|
|
@@ -9985,7 +9778,7 @@ async function readAccountNames() {
|
|
|
9985
9778
|
}
|
|
9986
9779
|
async function enrich(absolute, entry, accountNames) {
|
|
9987
9780
|
if (entry.kind === "directory" && UUID_RE4.test(entry.name)) {
|
|
9988
|
-
const meta = await readMeta(
|
|
9781
|
+
const meta = await readMeta(join11(absolute, entry.name), entry.name);
|
|
9989
9782
|
if (meta?.filename) {
|
|
9990
9783
|
entry.displayName = meta.filename;
|
|
9991
9784
|
entry.mimeType = meta.mimeType;
|
|
@@ -10044,7 +9837,7 @@ app21.get("/", requireAdminSession, async (c) => {
|
|
|
10044
9837
|
continue;
|
|
10045
9838
|
}
|
|
10046
9839
|
try {
|
|
10047
|
-
const entryPath =
|
|
9840
|
+
const entryPath = join11(absolute, name);
|
|
10048
9841
|
const s = await stat4(entryPath);
|
|
10049
9842
|
entries.push({
|
|
10050
9843
|
name,
|
|
@@ -10158,8 +9951,8 @@ app21.post("/upload", requireAdminSession, async (c) => {
|
|
|
10158
9951
|
}
|
|
10159
9952
|
const safeName = basename4(file.name).replace(/[\0/\\]/g, "_");
|
|
10160
9953
|
const finalName = `${Date.now()}-${safeName}`;
|
|
10161
|
-
const destDir =
|
|
10162
|
-
const destPath =
|
|
9954
|
+
const destDir = resolve15(DATA_ROOT, "uploads", accountId);
|
|
9955
|
+
const destPath = resolve15(destDir, finalName);
|
|
10163
9956
|
try {
|
|
10164
9957
|
await mkdir3(destDir, { recursive: true });
|
|
10165
9958
|
const dataRootReal = realpathSync4(DATA_ROOT);
|
|
@@ -10217,7 +10010,7 @@ app21.delete("/", requireAdminSession, async (c) => {
|
|
|
10217
10010
|
}
|
|
10218
10011
|
const dot = base.lastIndexOf(".");
|
|
10219
10012
|
const stem = dot === -1 ? base : base.slice(0, dot);
|
|
10220
|
-
const sidecarPath = UUID_RE4.test(stem) && base !== `${stem}.meta.json` ?
|
|
10013
|
+
const sidecarPath = UUID_RE4.test(stem) && base !== `${stem}.meta.json` ? join11(dirname5(absolute), `${stem}.meta.json`) : null;
|
|
10221
10014
|
await unlink2(absolute);
|
|
10222
10015
|
if (sidecarPath) {
|
|
10223
10016
|
try {
|
|
@@ -10834,9 +10627,6 @@ var GRAPH_LABEL_COLOURS = {
|
|
|
10834
10627
|
WorkflowStep: "#5A8E96",
|
|
10835
10628
|
WorkflowRun: "#7AAAB2",
|
|
10836
10629
|
StepResult: "#9CC4CB",
|
|
10837
|
-
// Onboarding — muted violet (sits between conversation plum and
|
|
10838
|
-
// workflow teal but shares neither hue)
|
|
10839
|
-
OnboardingState: "#7A5A8A",
|
|
10840
10630
|
// Email — muted moss (hue-adjacent to Knowledge but lower-saturation
|
|
10841
10631
|
// and warmer; never co-rendered with KnowledgeDocument so visual
|
|
10842
10632
|
// confusion doesn't apply, but kept distinguishable for the legend)
|
|
@@ -10883,7 +10673,6 @@ var FILTER_TOP_LEVEL_LABELS = Object.freeze(
|
|
|
10883
10673
|
"Project",
|
|
10884
10674
|
"Event",
|
|
10885
10675
|
"Workflow",
|
|
10886
|
-
"OnboardingState",
|
|
10887
10676
|
"Email",
|
|
10888
10677
|
"EmailAccount",
|
|
10889
10678
|
"Agent"
|
|
@@ -11882,7 +11671,7 @@ var file_attach_default = app28;
|
|
|
11882
11671
|
// server/routes/admin/sidebar-artefacts.ts
|
|
11883
11672
|
import neo4j2 from "neo4j-driver";
|
|
11884
11673
|
import { readFile as readFile5, readdir as readdir3, stat as stat5 } from "fs/promises";
|
|
11885
|
-
import { resolve as
|
|
11674
|
+
import { resolve as resolve16, relative as relative2, isAbsolute } from "path";
|
|
11886
11675
|
import { existsSync as existsSync16 } from "fs";
|
|
11887
11676
|
var LIMIT = 50;
|
|
11888
11677
|
var TEXT_MIME_PREFIXES = ["text/", "application/json", "application/markdown"];
|
|
@@ -11899,7 +11688,7 @@ app29.get("/", requireAdminSession, async (c) => {
|
|
|
11899
11688
|
if (docs === null) {
|
|
11900
11689
|
return c.json({ error: "Failed to load artefacts" }, 500);
|
|
11901
11690
|
}
|
|
11902
|
-
const accountDir =
|
|
11691
|
+
const accountDir = resolve16(ACCOUNTS_DIR, accountId);
|
|
11903
11692
|
const agents = await fetchAgentTemplateRows(accountDir);
|
|
11904
11693
|
const artefacts = [...docs, ...agents].sort(
|
|
11905
11694
|
(a, b) => (b.updatedAt ?? "").localeCompare(a.updatedAt ?? "")
|
|
@@ -11962,8 +11751,8 @@ async function readArtefactContent(accountId, attachmentId, mimeType, displayNam
|
|
|
11962
11751
|
logSkip(displayName, "non-text-mime", mimeType);
|
|
11963
11752
|
return { content: "", skipReason: "non-text-mime" };
|
|
11964
11753
|
}
|
|
11965
|
-
const accountDir =
|
|
11966
|
-
const dir =
|
|
11754
|
+
const accountDir = resolve16(ATTACHMENTS_ROOT, accountId);
|
|
11755
|
+
const dir = resolve16(accountDir, attachmentId);
|
|
11967
11756
|
try {
|
|
11968
11757
|
validateFilePathInAccount(dir, accountDir);
|
|
11969
11758
|
} catch {
|
|
@@ -11977,7 +11766,7 @@ async function readArtefactContent(accountId, attachmentId, mimeType, displayNam
|
|
|
11977
11766
|
logSkip(displayName, "missing-on-disk", mimeType);
|
|
11978
11767
|
return { content: "", skipReason: "missing-on-disk" };
|
|
11979
11768
|
}
|
|
11980
|
-
return { content: await readFile5(
|
|
11769
|
+
return { content: await readFile5(resolve16(dir, dataFile), "utf-8"), skipReason: null };
|
|
11981
11770
|
} catch (err) {
|
|
11982
11771
|
const message = err instanceof Error ? err.message : String(err);
|
|
11983
11772
|
console.error(`[admin/sidebar-artefacts] read-failed attachmentId=${attachmentId.slice(0, 8)} error="${message}"`);
|
|
@@ -11993,8 +11782,8 @@ function logSkip(name, reason, mimeType) {
|
|
|
11993
11782
|
async function fetchAgentTemplateRows(accountDir) {
|
|
11994
11783
|
const rows = [];
|
|
11995
11784
|
for (const filename of ADMIN_AGENT_FILES) {
|
|
11996
|
-
const overridePath =
|
|
11997
|
-
const bundledPath =
|
|
11785
|
+
const overridePath = resolve16(accountDir, "agents", "admin", filename);
|
|
11786
|
+
const bundledPath = resolve16(PLATFORM_ROOT, "templates", "agents", "admin", filename);
|
|
11998
11787
|
const labelStem = filename.replace(/\.md$/, "");
|
|
11999
11788
|
const row = await readAgentTemplateRow({
|
|
12000
11789
|
id: `agent-template:admin:${filename}`,
|
|
@@ -12008,12 +11797,12 @@ async function fetchAgentTemplateRows(accountDir) {
|
|
|
12008
11797
|
});
|
|
12009
11798
|
if (row) rows.push(row);
|
|
12010
11799
|
}
|
|
12011
|
-
const overrideDir =
|
|
12012
|
-
const bundledDir =
|
|
11800
|
+
const overrideDir = resolve16(accountDir, "specialists", "agents");
|
|
11801
|
+
const bundledDir = resolve16(PLATFORM_ROOT, "templates", "specialists", "agents");
|
|
12013
11802
|
const specialistNames = await unionSpecialistFilenames(overrideDir, bundledDir);
|
|
12014
11803
|
for (const filename of specialistNames) {
|
|
12015
|
-
const overridePath =
|
|
12016
|
-
const bundledPath =
|
|
11804
|
+
const overridePath = resolve16(overrideDir, filename);
|
|
11805
|
+
const bundledPath = resolve16(bundledDir, filename);
|
|
12017
11806
|
const row = await readAgentTemplateRow({
|
|
12018
11807
|
id: `agent-template:specialist:${filename}`,
|
|
12019
11808
|
displayName: filename.replace(/\.md$/, ""),
|
|
@@ -12098,7 +11887,7 @@ var sidebar_artefacts_default = app29;
|
|
|
12098
11887
|
|
|
12099
11888
|
// server/routes/admin/sidebar-artefact-save.ts
|
|
12100
11889
|
import { mkdir as mkdir4, readdir as readdir4, stat as stat6, writeFile as writeFile5 } from "fs/promises";
|
|
12101
|
-
import { resolve as
|
|
11890
|
+
import { resolve as resolve17 } from "path";
|
|
12102
11891
|
import { existsSync as existsSync17 } from "fs";
|
|
12103
11892
|
var ADMIN_AGENT_FILES2 = /* @__PURE__ */ new Set(["IDENTITY.md", "SOUL.md", "KNOWLEDGE.md"]);
|
|
12104
11893
|
var UUID_RE5 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
|
|
@@ -12111,7 +11900,7 @@ app30.post("/", requireAdminSession, async (c) => {
|
|
|
12111
11900
|
if (!body || typeof body.id !== "string" || typeof body.content !== "string") {
|
|
12112
11901
|
return c.json({ error: "id and content required" }, 400);
|
|
12113
11902
|
}
|
|
12114
|
-
const accountDir =
|
|
11903
|
+
const accountDir = resolve17(ACCOUNTS_DIR, accountId);
|
|
12115
11904
|
const resolved = await resolveSavePath(body.id, accountId, accountDir);
|
|
12116
11905
|
if (resolved.kind === "heal-race") {
|
|
12117
11906
|
c.header("Retry-After", "2");
|
|
@@ -12156,17 +11945,17 @@ async function resolveSavePath(id, accountId, accountDir) {
|
|
|
12156
11945
|
if (role !== "admin" || !ADMIN_AGENT_FILES2.has(filename)) {
|
|
12157
11946
|
return { kind: "reject", status: 400, reason: "invalid-id" };
|
|
12158
11947
|
}
|
|
12159
|
-
const parent =
|
|
11948
|
+
const parent = resolve17(accountDir, "agents", "admin");
|
|
12160
11949
|
await mkdir4(parent, { recursive: true });
|
|
12161
11950
|
try {
|
|
12162
11951
|
validateFilePathInAccount(parent, accountDir);
|
|
12163
11952
|
} catch {
|
|
12164
11953
|
return { kind: "reject", status: 400, reason: "containment-rejected" };
|
|
12165
11954
|
}
|
|
12166
|
-
return { kind: "admin-template", path:
|
|
11955
|
+
return { kind: "admin-template", path: resolve17(parent, filename) };
|
|
12167
11956
|
}
|
|
12168
11957
|
if (UUID_RE5.test(id)) {
|
|
12169
|
-
const dir =
|
|
11958
|
+
const dir = resolve17(ATTACHMENTS_ROOT, accountId, id);
|
|
12170
11959
|
if (!existsSync17(dir)) {
|
|
12171
11960
|
const attShort = id.slice(0, 8);
|
|
12172
11961
|
if (isHealPending(accountId, id)) {
|
|
@@ -12199,7 +11988,7 @@ async function resolveSavePath(id, accountId, accountDir) {
|
|
|
12199
11988
|
}
|
|
12200
11989
|
}
|
|
12201
11990
|
try {
|
|
12202
|
-
validateFilePathInAccount(dir,
|
|
11991
|
+
validateFilePathInAccount(dir, resolve17(ATTACHMENTS_ROOT, accountId));
|
|
12203
11992
|
} catch {
|
|
12204
11993
|
return { kind: "reject", status: 400, reason: "containment-rejected" };
|
|
12205
11994
|
}
|
|
@@ -12208,7 +11997,7 @@ async function resolveSavePath(id, accountId, accountDir) {
|
|
|
12208
11997
|
if (!dataFile) {
|
|
12209
11998
|
return { kind: "reject", status: 400, reason: "not-found" };
|
|
12210
11999
|
}
|
|
12211
|
-
return { kind: "knowledge-doc", path:
|
|
12000
|
+
return { kind: "knowledge-doc", path: resolve17(dir, dataFile) };
|
|
12212
12001
|
}
|
|
12213
12002
|
return { kind: "reject", status: 400, reason: "invalid-id" };
|
|
12214
12003
|
}
|
|
@@ -12220,7 +12009,7 @@ var sidebar_artefact_save_default = app30;
|
|
|
12220
12009
|
// server/routes/admin/sidebar-artefact-content.ts
|
|
12221
12010
|
import { readFile as readFile6, readdir as readdir5 } from "fs/promises";
|
|
12222
12011
|
import { existsSync as existsSync18 } from "fs";
|
|
12223
|
-
import { resolve as
|
|
12012
|
+
import { resolve as resolve18 } from "path";
|
|
12224
12013
|
var UUID_RE6 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
|
|
12225
12014
|
var app31 = new Hono();
|
|
12226
12015
|
app31.get("/", requireAdminSession, async (c) => {
|
|
@@ -12232,14 +12021,14 @@ app31.get("/", requireAdminSession, async (c) => {
|
|
|
12232
12021
|
console.error(`[admin/sidebar-artefact-content] not-found id=${id.slice(0, 8)}`);
|
|
12233
12022
|
return new Response("Not found", { status: 404 });
|
|
12234
12023
|
}
|
|
12235
|
-
const dir =
|
|
12024
|
+
const dir = resolve18(ATTACHMENTS_ROOT, accountId, id);
|
|
12236
12025
|
if (!existsSync18(dir)) {
|
|
12237
12026
|
console.error(`[admin/sidebar-artefact-content] not-found id=${id.slice(0, 8)}`);
|
|
12238
12027
|
return new Response("Not found", { status: 404 });
|
|
12239
12028
|
}
|
|
12240
12029
|
let meta;
|
|
12241
12030
|
try {
|
|
12242
|
-
meta = JSON.parse(await readFile6(
|
|
12031
|
+
meta = JSON.parse(await readFile6(resolve18(dir, `${id}.meta.json`), "utf-8"));
|
|
12243
12032
|
} catch {
|
|
12244
12033
|
console.error(`[admin/sidebar-artefact-content] not-found id=${id.slice(0, 8)}`);
|
|
12245
12034
|
return new Response("Not found", { status: 404 });
|
|
@@ -12251,7 +12040,7 @@ app31.get("/", requireAdminSession, async (c) => {
|
|
|
12251
12040
|
return new Response("Not found", { status: 404 });
|
|
12252
12041
|
}
|
|
12253
12042
|
const start = Date.now();
|
|
12254
|
-
const buffer = await readFile6(
|
|
12043
|
+
const buffer = await readFile6(resolve18(dir, dataFile));
|
|
12255
12044
|
const ms = Date.now() - start;
|
|
12256
12045
|
console.log(
|
|
12257
12046
|
`[admin/sidebar-artefact-content] account=${accountId} id=${id.slice(0, 8)} mime=${meta.mimeType} bytes=${buffer.length} ms=${ms}`
|
|
@@ -12268,10 +12057,10 @@ var sidebar_artefact_content_default = app31;
|
|
|
12268
12057
|
|
|
12269
12058
|
// server/routes/admin/health.ts
|
|
12270
12059
|
import { existsSync as existsSync19, readFileSync as readFileSync16 } from "fs";
|
|
12271
|
-
import { resolve as
|
|
12272
|
-
var
|
|
12060
|
+
import { resolve as resolve19, join as join12 } from "path";
|
|
12061
|
+
var PLATFORM_ROOT6 = process.env.MAXY_PLATFORM_ROOT ?? resolve19(process.cwd(), "..");
|
|
12273
12062
|
var brandHostname = "maxy";
|
|
12274
|
-
var brandJsonPath =
|
|
12063
|
+
var brandJsonPath = join12(PLATFORM_ROOT6, "config", "brand.json");
|
|
12275
12064
|
if (existsSync19(brandJsonPath)) {
|
|
12276
12065
|
try {
|
|
12277
12066
|
const brand = JSON.parse(readFileSync16(brandJsonPath, "utf-8"));
|
|
@@ -12279,7 +12068,7 @@ if (existsSync19(brandJsonPath)) {
|
|
|
12279
12068
|
} catch {
|
|
12280
12069
|
}
|
|
12281
12070
|
}
|
|
12282
|
-
var VERSION_FILE =
|
|
12071
|
+
var VERSION_FILE = resolve19(PLATFORM_ROOT6, `config/.${brandHostname}-version`);
|
|
12283
12072
|
var PROCESS_STARTED_AT = (/* @__PURE__ */ new Date()).toISOString();
|
|
12284
12073
|
var PROBE_TIMEOUT_MS = 1e3;
|
|
12285
12074
|
function readVersion() {
|
|
@@ -12367,7 +12156,7 @@ var admin_default = app33;
|
|
|
12367
12156
|
|
|
12368
12157
|
// server/routes/sites.ts
|
|
12369
12158
|
import { existsSync as existsSync20, readFileSync as readFileSync17, realpathSync as realpathSync5, statSync as statSync7 } from "fs";
|
|
12370
|
-
import { resolve as
|
|
12159
|
+
import { resolve as resolve20 } from "path";
|
|
12371
12160
|
var SAFE_SEG_RE = /^[a-z0-9_][a-z0-9_.-]{0,99}$/i;
|
|
12372
12161
|
var MIME = {
|
|
12373
12162
|
".html": "text/html; charset=utf-8",
|
|
@@ -12424,8 +12213,8 @@ app34.get("/:rel{.*}", (c) => {
|
|
|
12424
12213
|
}
|
|
12425
12214
|
segments.push(seg);
|
|
12426
12215
|
}
|
|
12427
|
-
const rootDir =
|
|
12428
|
-
let filePath = segments.length === 0 ? rootDir :
|
|
12216
|
+
const rootDir = resolve20(account.accountDir, "sites");
|
|
12217
|
+
let filePath = segments.length === 0 ? rootDir : resolve20(rootDir, ...segments);
|
|
12429
12218
|
if (filePath !== rootDir && !filePath.startsWith(rootDir + "/")) {
|
|
12430
12219
|
console.error(`[sites] path-traversal-rejected path=${reqPath} reason=escape status=403`);
|
|
12431
12220
|
return c.text("Forbidden", 403);
|
|
@@ -12445,7 +12234,7 @@ app34.get("/:rel{.*}", (c) => {
|
|
|
12445
12234
|
return c.redirect(target, 301);
|
|
12446
12235
|
}
|
|
12447
12236
|
if (stat7?.isDirectory()) {
|
|
12448
|
-
filePath =
|
|
12237
|
+
filePath = resolve20(filePath, "index.html");
|
|
12449
12238
|
}
|
|
12450
12239
|
if (!filePath.startsWith(rootDir + "/")) {
|
|
12451
12240
|
console.error(`[sites] path-traversal-rejected path=${reqPath} reason=escape status=403`);
|
|
@@ -12586,7 +12375,7 @@ function startGraphHealthTimer() {
|
|
|
12586
12375
|
}
|
|
12587
12376
|
|
|
12588
12377
|
// app/lib/whatsapp/inbound/claude-bridge.ts
|
|
12589
|
-
var
|
|
12378
|
+
var TAG19 = "[whatsapp-adaptor]";
|
|
12590
12379
|
function whatsappTurnTimeoutMs() {
|
|
12591
12380
|
return Number(process.env.WHATSAPP_PTY_TURN_TIMEOUT_MS ?? String(5 * 6e4));
|
|
12592
12381
|
}
|
|
@@ -12607,7 +12396,7 @@ async function dispatchToClaude(input) {
|
|
|
12607
12396
|
await input.reply(result.turnText);
|
|
12608
12397
|
} catch (err) {
|
|
12609
12398
|
const m = err instanceof Error ? err.message : String(err);
|
|
12610
|
-
console.error(`${
|
|
12399
|
+
console.error(`${TAG19} reject reason=reply-failed senderId=${input.senderId} message=${m}`);
|
|
12611
12400
|
}
|
|
12612
12401
|
}
|
|
12613
12402
|
function startReaper2() {
|
|
@@ -12617,7 +12406,7 @@ function startReaper2() {
|
|
|
12617
12406
|
// ../lib/entitlement/src/index.ts
|
|
12618
12407
|
import { createPublicKey, createHash as createHash3, verify as cryptoVerify } from "crypto";
|
|
12619
12408
|
import { existsSync as existsSync21, readFileSync as readFileSync18, statSync as statSync8 } from "fs";
|
|
12620
|
-
import { resolve as
|
|
12409
|
+
import { resolve as resolve21 } from "path";
|
|
12621
12410
|
|
|
12622
12411
|
// ../lib/entitlement/src/canonicalize.ts
|
|
12623
12412
|
function canonicalize(value) {
|
|
@@ -12652,7 +12441,7 @@ var PUBKEY_SHA256 = "8eee6bcb33545fd13b16d3199a5735ca5db5062834c7b49dfe4f23801d9
|
|
|
12652
12441
|
var GRACE_DAYS = 7;
|
|
12653
12442
|
var GRACE_MS = GRACE_DAYS * 24 * 60 * 60 * 1e3;
|
|
12654
12443
|
function pubkeyPath(brand) {
|
|
12655
|
-
return
|
|
12444
|
+
return resolve21(brand.platformRoot, "lib", "entitlement", "rubytech-pubkey.pem");
|
|
12656
12445
|
}
|
|
12657
12446
|
var memo = null;
|
|
12658
12447
|
function memoKey(mtimeMs, account) {
|
|
@@ -12664,7 +12453,7 @@ function resolveEntitlement(brand, account) {
|
|
|
12664
12453
|
if (brand.commercialMode !== true) {
|
|
12665
12454
|
return logResolved(implicitTrust(account), null);
|
|
12666
12455
|
}
|
|
12667
|
-
const entitlementPath =
|
|
12456
|
+
const entitlementPath = resolve21(brand.configDir, "entitlement.json");
|
|
12668
12457
|
if (!existsSync21(entitlementPath)) {
|
|
12669
12458
|
return logResolved(anonymousFallback("missing"), { reason: "missing" });
|
|
12670
12459
|
}
|
|
@@ -12854,8 +12643,8 @@ function clientFrom(c) {
|
|
|
12854
12643
|
c.req.header("x-forwarded-for")
|
|
12855
12644
|
);
|
|
12856
12645
|
}
|
|
12857
|
-
var
|
|
12858
|
-
var BRAND_JSON_PATH =
|
|
12646
|
+
var PLATFORM_ROOT7 = process.env.MAXY_PLATFORM_ROOT || "";
|
|
12647
|
+
var BRAND_JSON_PATH = PLATFORM_ROOT7 ? join13(PLATFORM_ROOT7, "config", "brand.json") : "";
|
|
12859
12648
|
var BRAND = { productName: "Maxy", hostname: "maxy", configDir: ".maxy", domain: "getmaxy.com" };
|
|
12860
12649
|
if (BRAND_JSON_PATH && !existsSync22(BRAND_JSON_PATH)) {
|
|
12861
12650
|
console.error(`[brand] WARNING: brand.json not found at ${BRAND_JSON_PATH} \u2014 using Maxy defaults`);
|
|
@@ -12881,7 +12670,7 @@ var brandLoginOpts = {
|
|
|
12881
12670
|
bodyFont: BRAND.defaultFonts?.body,
|
|
12882
12671
|
logoContainsName: !!BRAND.logoContainsName
|
|
12883
12672
|
};
|
|
12884
|
-
var ALIAS_DOMAINS_PATH2 =
|
|
12673
|
+
var ALIAS_DOMAINS_PATH2 = join13(homedir5(), BRAND.configDir, "alias-domains.json");
|
|
12885
12674
|
function loadAliasDomains() {
|
|
12886
12675
|
try {
|
|
12887
12676
|
if (!existsSync22(ALIAS_DOMAINS_PATH2)) return null;
|
|
@@ -13255,8 +13044,8 @@ app35.get("/agent-assets/:slug/:filename", (c) => {
|
|
|
13255
13044
|
console.error(`[agent-assets] no-account slug=${slug} file=${filename}`);
|
|
13256
13045
|
return c.text("Not found", 404);
|
|
13257
13046
|
}
|
|
13258
|
-
const filePath =
|
|
13259
|
-
const expectedDir =
|
|
13047
|
+
const filePath = resolve22(account.accountDir, "agents", slug, "assets", filename);
|
|
13048
|
+
const expectedDir = resolve22(account.accountDir, "agents", slug, "assets");
|
|
13260
13049
|
if (!filePath.startsWith(expectedDir + "/")) {
|
|
13261
13050
|
console.error(`[agent-assets] path-traversal-rejected slug=${slug} file=${filename}`);
|
|
13262
13051
|
return c.text("Forbidden", 403);
|
|
@@ -13285,8 +13074,8 @@ app35.get("/generated/:filename", (c) => {
|
|
|
13285
13074
|
console.error(`[generated] serve file=${filename} status=404`);
|
|
13286
13075
|
return c.text("Not found", 404);
|
|
13287
13076
|
}
|
|
13288
|
-
const filePath =
|
|
13289
|
-
const expectedDir =
|
|
13077
|
+
const filePath = resolve22(account.accountDir, "generated", filename);
|
|
13078
|
+
const expectedDir = resolve22(account.accountDir, "generated");
|
|
13290
13079
|
if (!filePath.startsWith(expectedDir + "/")) {
|
|
13291
13080
|
console.error(`[generated] serve file=${filename} status=403`);
|
|
13292
13081
|
return c.text("Forbidden", 403);
|
|
@@ -13326,8 +13115,8 @@ var brandScript = `<script>window.__BRAND__=${JSON.stringify({
|
|
|
13326
13115
|
})}</script>`;
|
|
13327
13116
|
function readInstalledVersion() {
|
|
13328
13117
|
try {
|
|
13329
|
-
if (!
|
|
13330
|
-
const versionFile =
|
|
13118
|
+
if (!PLATFORM_ROOT7) return "unknown";
|
|
13119
|
+
const versionFile = join13(PLATFORM_ROOT7, "config", `.${BRAND.hostname}-version`);
|
|
13331
13120
|
if (!existsSync22(versionFile)) return "unknown";
|
|
13332
13121
|
const content = readFileSync19(versionFile, "utf-8").trim();
|
|
13333
13122
|
return content || "unknown";
|
|
@@ -13370,7 +13159,7 @@ var clientErrorReporterScript = `<script>
|
|
|
13370
13159
|
function cachedHtml(file) {
|
|
13371
13160
|
let html = htmlCache.get(file);
|
|
13372
13161
|
if (!html) {
|
|
13373
|
-
html = readFileSync19(
|
|
13162
|
+
html = readFileSync19(resolve22(process.cwd(), "public", file), "utf-8");
|
|
13374
13163
|
const productNameEsc = escapeHtml(BRAND.productName);
|
|
13375
13164
|
html = html.replace(/<title>([^<]*)<\/title>/, (_match, inner) => `<title>${escapeHtml(inner).replace(/Maxy/g, productNameEsc)}</title>`);
|
|
13376
13165
|
html = html.replace('href="/favicon.ico"', `href="${escapeHtml(brandFaviconPath)}"`);
|
|
@@ -13386,14 +13175,14 @@ ${clientErrorReporterScript}
|
|
|
13386
13175
|
}
|
|
13387
13176
|
var brandedHtmlCache = /* @__PURE__ */ new Map();
|
|
13388
13177
|
function loadBrandingCache(agentSlug) {
|
|
13389
|
-
const configDir2 =
|
|
13178
|
+
const configDir2 = join13(homedir5(), BRAND.configDir);
|
|
13390
13179
|
try {
|
|
13391
|
-
const accountJsonPath =
|
|
13180
|
+
const accountJsonPath = join13(configDir2, "account.json");
|
|
13392
13181
|
if (!existsSync22(accountJsonPath)) return null;
|
|
13393
13182
|
const account = JSON.parse(readFileSync19(accountJsonPath, "utf-8"));
|
|
13394
13183
|
const accountId = account.accountId;
|
|
13395
13184
|
if (!accountId) return null;
|
|
13396
|
-
const cachePath =
|
|
13185
|
+
const cachePath = join13(configDir2, "branding-cache", accountId, `${agentSlug}.json`);
|
|
13397
13186
|
if (!existsSync22(cachePath)) return null;
|
|
13398
13187
|
return JSON.parse(readFileSync19(cachePath, "utf-8"));
|
|
13399
13188
|
} catch {
|
|
@@ -13402,8 +13191,8 @@ function loadBrandingCache(agentSlug) {
|
|
|
13402
13191
|
}
|
|
13403
13192
|
function resolveDefaultSlug() {
|
|
13404
13193
|
try {
|
|
13405
|
-
const configDir2 =
|
|
13406
|
-
const accountJsonPath =
|
|
13194
|
+
const configDir2 = join13(homedir5(), BRAND.configDir);
|
|
13195
|
+
const accountJsonPath = join13(configDir2, "account.json");
|
|
13407
13196
|
if (!existsSync22(accountJsonPath)) return null;
|
|
13408
13197
|
const account = JSON.parse(readFileSync19(accountJsonPath, "utf-8"));
|
|
13409
13198
|
return account.defaultAgent || null;
|
|
@@ -13478,7 +13267,7 @@ app35.use("/vnc-popout.html", logViewerFetch);
|
|
|
13478
13267
|
app35.get("/vnc-popout.html", (c) => {
|
|
13479
13268
|
let html = htmlCache.get("vnc-popout.html");
|
|
13480
13269
|
if (!html) {
|
|
13481
|
-
html = readFileSync19(
|
|
13270
|
+
html = readFileSync19(resolve22(process.cwd(), "public", "vnc-popout.html"), "utf-8");
|
|
13482
13271
|
const name = escapeHtml(BRAND.productName);
|
|
13483
13272
|
html = html.replace("<title>Browser \u2014 Maxy</title>", `<title>${name}</title>`);
|
|
13484
13273
|
html = html.replace("</head>", ` ${brandScript}
|
|
@@ -13530,7 +13319,7 @@ app35.get("/data", (c) => {
|
|
|
13530
13319
|
app35.get("/docs/desktop-code-controls", (c) => {
|
|
13531
13320
|
const host = (c.req.header("host") ?? "").split(":")[0];
|
|
13532
13321
|
if (isPublicHost(host)) return c.text("Not found", 404);
|
|
13533
|
-
const docsPath =
|
|
13322
|
+
const docsPath = PLATFORM_ROOT7 ? resolve22(PLATFORM_ROOT7, "..", "docs", "desktop-code-controls.md") : resolve22(process.cwd(), "docs", "desktop-code-controls.md");
|
|
13534
13323
|
if (!existsSync22(docsPath)) {
|
|
13535
13324
|
console.error(`[docs] desktop-code-controls.md missing at ${docsPath}`);
|
|
13536
13325
|
return c.text(`docs/desktop-code-controls.md not found at ${docsPath}`, 404);
|
|
@@ -13665,7 +13454,7 @@ reconcileEnabledPlugins(bootAccount?.accountDir, bootAccount?.config);
|
|
|
13665
13454
|
(async () => {
|
|
13666
13455
|
if (!bootAccount) return;
|
|
13667
13456
|
try {
|
|
13668
|
-
const { recoverRunningCloudflareTasks } = await import("./cloudflare-task-tracker-
|
|
13457
|
+
const { recoverRunningCloudflareTasks } = await import("./cloudflare-task-tracker-4PKOLE4H.js");
|
|
13669
13458
|
const result = await recoverRunningCloudflareTasks(
|
|
13670
13459
|
bootAccount.accountId,
|
|
13671
13460
|
configDirForWhatsApp,
|
|
@@ -13725,7 +13514,7 @@ if (bootAccountConfig?.whatsapp) {
|
|
|
13725
13514
|
}
|
|
13726
13515
|
init({
|
|
13727
13516
|
configDir: configDirForWhatsApp,
|
|
13728
|
-
platformRoot:
|
|
13517
|
+
platformRoot: resolve22(process.env.MAXY_PLATFORM_ROOT ?? join13(__dirname, "..")),
|
|
13729
13518
|
accountConfig: bootAccountConfig,
|
|
13730
13519
|
onMessage: async (msg) => {
|
|
13731
13520
|
if (process.env.WHATSAPP_PTY_BRIDGE_ENABLED === "true" && msg.text && !msg.isOwnerMirror) {
|