@rubytech/create-realagent-code 0.1.30 → 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/lib/persistent-components/dist/index.d.ts +11 -12
- package/payload/platform/lib/persistent-components/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/persistent-components/dist/index.js +11 -12
- package/payload/platform/lib/persistent-components/dist/index.js.map +1 -1
- package/payload/platform/lib/persistent-components/src/index.ts +11 -12
- package/payload/platform/neo4j/schema.cypher +10 -19
- package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/admin/PLUGIN.md +1 -7
- package/payload/platform/plugins/admin/mcp/dist/index.js +15 -582
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/skills/access-manager/references/operations.md +7 -7
- package/payload/platform/plugins/admin/skills/public-agent-manager/SKILL.md +1 -1
- package/payload/platform/plugins/admin/skills/stream-log-review/references/analysis-patterns.md +2 -2
- package/payload/platform/plugins/anthropic/skills/get-api-key/SKILL.md +2 -4
- 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/email/references/email-reference.md +3 -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/plugins/teaching/PLUGIN.md +2 -1
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js +1 -1
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/whatsapp/skills/connect-whatsapp/SKILL.md +1 -1
- package/payload/platform/plugins/whatsapp/skills/manage-whatsapp-config/SKILL.md +2 -8
- package/payload/platform/plugins/writer-craft/PLUGIN.md +2 -1
- package/payload/platform/scripts/component-knowledgedoc-backfill.ts +1 -1
- package/payload/platform/scripts/seed-neo4j.sh +9 -38
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +1 -1
- 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 +45 -44
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/index.js +11 -0
- package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-observer.d.ts +30 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-observer.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-observer.js +175 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-observer.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts +4 -2
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.js +15 -22
- 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 +13 -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 +28 -13
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-store.d.ts +9 -0
- package/payload/platform/services/claude-session-manager/dist/session-store.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-store.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts +1 -25
- 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 +3 -54
- 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/platform/templates/agents/public/IDENTITY.md +1 -1
- package/payload/platform/templates/specialists/agents/content-producer.md +3 -3
- package/payload/platform/templates/specialists/agents/personal-assistant.md +2 -2
- package/payload/premium-plugins/teaching/PLUGIN.md +2 -1
- package/payload/premium-plugins/writer-craft/PLUGIN.md +2 -1
- 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-Cuu1QdAA.js +216 -0
- 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-qSH972X0.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 +142 -278
- package/payload/platform/plugins/admin/hooks/onboarding-skill-drift.sh +0 -102
- package/payload/platform/plugins/admin/references/contextual-ui.md +0 -109
- package/payload/platform/plugins/admin/skills/onboarding/SKILL.md +0 -240
- package/payload/platform/scripts/__tests__/admin-persist-audit.test.ts +0 -182
- package/payload/server/public/assets/admin-CDvF5de6.js +0 -216
- 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-K_kS__sL.js +0 -1
- package/payload/server/public/assets/graph-DeEigyO_.js +0 -1
- package/payload/server/public/assets/graph-labels-C7I5QvNv.js +0 -1
- package/payload/server/public/assets/page-B_rpjIRr.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" });
|
|
@@ -8024,7 +7917,7 @@ app14.post("/:id/resume", async (c) => {
|
|
|
8024
7917
|
await storeComponentArtefact(accountId, c2.artefactAttachmentId, bytesPick.mimeType, bytesPick.content, filename);
|
|
8025
7918
|
clearHealPending(accountId, c2.artefactAttachmentId);
|
|
8026
7919
|
streamLogPath.write(
|
|
8027
|
-
`[${(/* @__PURE__ */ new Date()).toISOString()}] [
|
|
7920
|
+
`[${(/* @__PURE__ */ new Date()).toISOString()}] [component-persist] heal componentName=${c2.name} attachmentId=${c2.artefactAttachmentId.slice(0, 8)} mimeType=${bytesPick.mimeType} bytes=${bytesPick.content.length} outcome=ok
|
|
8028
7921
|
`
|
|
8029
7922
|
);
|
|
8030
7923
|
return {
|
|
@@ -8037,7 +7930,7 @@ app14.post("/:id/resume", async (c) => {
|
|
|
8037
7930
|
clearHealPending(accountId, c2.artefactAttachmentId);
|
|
8038
7931
|
const reason2 = writeErr instanceof Error ? writeErr.message : String(writeErr);
|
|
8039
7932
|
streamLogPath.write(
|
|
8040
|
-
`[${(/* @__PURE__ */ new Date()).toISOString()}] [
|
|
7933
|
+
`[${(/* @__PURE__ */ new Date()).toISOString()}] [component-persist] heal componentName=${c2.name} attachmentId=${c2.artefactAttachmentId.slice(0, 8)} outcome=disk-fail reason=${JSON.stringify(reason2.slice(0, 200))}
|
|
8041
7934
|
`
|
|
8042
7935
|
);
|
|
8043
7936
|
return base;
|
|
@@ -8200,25 +8093,8 @@ 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
8096
|
// server/routes/admin/claude-sessions.ts
|
|
8221
|
-
var
|
|
8097
|
+
var TAG18 = "[claude-session-manager:wrapper]";
|
|
8222
8098
|
function managerBase2() {
|
|
8223
8099
|
const port2 = Number(process.env.CLAUDE_SESSION_MANAGER_PORT ?? "19400");
|
|
8224
8100
|
return `http://127.0.0.1:${port2}`;
|
|
@@ -8229,7 +8105,7 @@ app15.post("/", async (c) => {
|
|
|
8229
8105
|
const cacheKey = c.get("cacheKey") ?? "";
|
|
8230
8106
|
const senderId = getAccountIdForSession(cacheKey) ?? "";
|
|
8231
8107
|
if (!senderId) {
|
|
8232
|
-
console.error(`${
|
|
8108
|
+
console.error(`${TAG18} reject reason=no-account-id`);
|
|
8233
8109
|
return c.json({ error: "admin-account-not-resolved" }, 500);
|
|
8234
8110
|
}
|
|
8235
8111
|
let body = {};
|
|
@@ -8240,19 +8116,12 @@ app15.post("/", async (c) => {
|
|
|
8240
8116
|
const channel = typeof body.channel === "string" ? body.channel : "browser";
|
|
8241
8117
|
const initialMessage = typeof body.initialMessage === "string" && body.initialMessage.trim() ? body.initialMessage : null;
|
|
8242
8118
|
const permissionMode = typeof body.permissionMode === "string" ? body.permissionMode : void 0;
|
|
8243
|
-
let onboarding;
|
|
8244
|
-
try {
|
|
8245
|
-
const outcome = await buildOnboardingPromptBlock(senderId);
|
|
8246
|
-
onboarding = { step: outcome.step };
|
|
8247
|
-
} catch (err) {
|
|
8248
|
-
console.error(`${TAG19} onboarding-resolve failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
8249
|
-
}
|
|
8250
8119
|
const upstream = await fetch(`${managerBase2()}/spawn`, {
|
|
8251
8120
|
method: "POST",
|
|
8252
8121
|
headers: { "content-type": "application/json" },
|
|
8253
|
-
body: JSON.stringify({ senderId, role: "admin", channel,
|
|
8122
|
+
body: JSON.stringify({ senderId, role: "admin", channel, permissionMode })
|
|
8254
8123
|
}).catch((err) => {
|
|
8255
|
-
console.error(`${
|
|
8124
|
+
console.error(`${TAG18} fetch-failed op=spawn message=${err instanceof Error ? err.message : String(err)}`);
|
|
8256
8125
|
return null;
|
|
8257
8126
|
});
|
|
8258
8127
|
if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
|
|
@@ -8269,7 +8138,7 @@ app15.post("/", async (c) => {
|
|
|
8269
8138
|
headers: { "content-type": "application/json" },
|
|
8270
8139
|
body: JSON.stringify({ text: initialMessage })
|
|
8271
8140
|
}).catch((err) => {
|
|
8272
|
-
console.error(`${
|
|
8141
|
+
console.error(`${TAG18} fetch-failed op=initial-input message=${err instanceof Error ? err.message : String(err)}`);
|
|
8273
8142
|
});
|
|
8274
8143
|
}
|
|
8275
8144
|
return new Response(upstream.body, { status: upstream.status, headers: upstream.headers });
|
|
@@ -8281,7 +8150,7 @@ app15.get("/", async (c) => {
|
|
|
8281
8150
|
const upstream = await fetch(
|
|
8282
8151
|
`${managerBase2()}/list?senderId=${encodeURIComponent(senderId)}`
|
|
8283
8152
|
).catch((err) => {
|
|
8284
|
-
console.error(`${
|
|
8153
|
+
console.error(`${TAG18} fetch-failed op=list message=${err instanceof Error ? err.message : String(err)}`);
|
|
8285
8154
|
return null;
|
|
8286
8155
|
});
|
|
8287
8156
|
if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
|
|
@@ -8311,7 +8180,7 @@ app15.post("/resume", async (c) => {
|
|
|
8311
8180
|
claudeSessionId: body.claudeSessionId
|
|
8312
8181
|
})
|
|
8313
8182
|
}).catch((err) => {
|
|
8314
|
-
console.error(`${
|
|
8183
|
+
console.error(`${TAG18} fetch-failed op=resume message=${err instanceof Error ? err.message : String(err)}`);
|
|
8315
8184
|
return null;
|
|
8316
8185
|
});
|
|
8317
8186
|
if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
|
|
@@ -8324,7 +8193,7 @@ app15.delete("/:sessionId", async (c) => {
|
|
|
8324
8193
|
`${managerBase2()}/${encodeURIComponent(sessionId)}${purge}`,
|
|
8325
8194
|
{ method: "DELETE" }
|
|
8326
8195
|
).catch((err) => {
|
|
8327
|
-
console.error(`${
|
|
8196
|
+
console.error(`${TAG18} fetch-failed op=delete message=${err instanceof Error ? err.message : String(err)}`);
|
|
8328
8197
|
return null;
|
|
8329
8198
|
});
|
|
8330
8199
|
if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
|
|
@@ -8341,7 +8210,7 @@ app15.post("/:sessionId/archive", async (c) => {
|
|
|
8341
8210
|
body
|
|
8342
8211
|
}
|
|
8343
8212
|
).catch((err) => {
|
|
8344
|
-
console.error(`${
|
|
8213
|
+
console.error(`${TAG18} fetch-failed op=archive message=${err instanceof Error ? err.message : String(err)}`);
|
|
8345
8214
|
return null;
|
|
8346
8215
|
});
|
|
8347
8216
|
if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
|
|
@@ -8352,7 +8221,7 @@ app15.get("/:sessionId/meta", async (c) => {
|
|
|
8352
8221
|
const upstream = await fetch(
|
|
8353
8222
|
`${managerBase2()}/${encodeURIComponent(sessionId)}/meta`
|
|
8354
8223
|
).catch((err) => {
|
|
8355
|
-
console.error(`${
|
|
8224
|
+
console.error(`${TAG18} fetch-failed op=meta message=${err instanceof Error ? err.message : String(err)}`);
|
|
8356
8225
|
return null;
|
|
8357
8226
|
});
|
|
8358
8227
|
if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
|
|
@@ -8369,7 +8238,7 @@ app15.patch("/:sessionId", async (c) => {
|
|
|
8369
8238
|
body
|
|
8370
8239
|
}
|
|
8371
8240
|
).catch((err) => {
|
|
8372
|
-
console.error(`${
|
|
8241
|
+
console.error(`${TAG18} fetch-failed op=patch message=${err instanceof Error ? err.message : String(err)}`);
|
|
8373
8242
|
return null;
|
|
8374
8243
|
});
|
|
8375
8244
|
if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
|
|
@@ -8386,7 +8255,7 @@ app15.post("/:sessionId/input", async (c) => {
|
|
|
8386
8255
|
body: rawBody
|
|
8387
8256
|
}
|
|
8388
8257
|
).catch((err) => {
|
|
8389
|
-
console.error(`${
|
|
8258
|
+
console.error(`${TAG18} fetch-failed op=input message=${err instanceof Error ? err.message : String(err)}`);
|
|
8390
8259
|
return null;
|
|
8391
8260
|
});
|
|
8392
8261
|
if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
|
|
@@ -8398,7 +8267,7 @@ app15.get("/:sessionId/log", async (c) => {
|
|
|
8398
8267
|
const upstream = await fetch(
|
|
8399
8268
|
`${managerBase2()}/${encodeURIComponent(sessionId)}/log${follow}`
|
|
8400
8269
|
).catch((err) => {
|
|
8401
|
-
console.error(`${
|
|
8270
|
+
console.error(`${TAG18} fetch-failed op=log message=${err instanceof Error ? err.message : String(err)}`);
|
|
8402
8271
|
return null;
|
|
8403
8272
|
});
|
|
8404
8273
|
if (!upstream) return c.json({ error: "manager-unreachable" }, 503);
|
|
@@ -8514,13 +8383,13 @@ async function cdpNavigateNewTab(url, opts = {}) {
|
|
|
8514
8383
|
// server/routes/admin/device-browser.ts
|
|
8515
8384
|
var app18 = new Hono();
|
|
8516
8385
|
app18.post("/navigate", async (c) => {
|
|
8517
|
-
const
|
|
8386
|
+
const TAG20 = "[device-url:click]";
|
|
8518
8387
|
let body;
|
|
8519
8388
|
try {
|
|
8520
8389
|
body = await c.req.json();
|
|
8521
8390
|
} catch (err) {
|
|
8522
8391
|
const detail = err instanceof Error ? err.message : String(err);
|
|
8523
|
-
console.error(`${
|
|
8392
|
+
console.error(`${TAG20} reject reason=body-not-json detail=${detail} browser=fallback navigateResult=error`);
|
|
8524
8393
|
return c.json(
|
|
8525
8394
|
{ ok: false, navigateResult: "error", browser: "fallback", detail: "Request body was not valid JSON" },
|
|
8526
8395
|
400
|
|
@@ -8530,7 +8399,7 @@ app18.post("/navigate", async (c) => {
|
|
|
8530
8399
|
const intent = typeof body.intent === "string" ? body.intent : "";
|
|
8531
8400
|
const hostname2 = typeof body.hostname === "string" ? body.hostname : "";
|
|
8532
8401
|
if (!url) {
|
|
8533
|
-
console.error(`${
|
|
8402
|
+
console.error(`${TAG20} reject reason=missing-url intent=${JSON.stringify(intent)} browser=fallback navigateResult=error`);
|
|
8534
8403
|
return c.json(
|
|
8535
8404
|
{ ok: false, navigateResult: "error", browser: "fallback", detail: "url field is required" },
|
|
8536
8405
|
400
|
|
@@ -8540,7 +8409,7 @@ app18.post("/navigate", async (c) => {
|
|
|
8540
8409
|
try {
|
|
8541
8410
|
parsed = new URL(url);
|
|
8542
8411
|
} catch {
|
|
8543
|
-
console.error(`${
|
|
8412
|
+
console.error(`${TAG20} reject reason=url-malformed intent=${JSON.stringify(intent)} url=${url} browser=fallback navigateResult=error`);
|
|
8544
8413
|
return c.json(
|
|
8545
8414
|
{ ok: false, navigateResult: "error", browser: "fallback", detail: "url is not a valid URL" },
|
|
8546
8415
|
400
|
|
@@ -8548,7 +8417,7 @@ app18.post("/navigate", async (c) => {
|
|
|
8548
8417
|
}
|
|
8549
8418
|
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
8550
8419
|
console.error(
|
|
8551
|
-
`${
|
|
8420
|
+
`${TAG20} reject reason=scheme-not-allowed scheme=${parsed.protocol} intent=${JSON.stringify(intent)} browser=fallback navigateResult=error`
|
|
8552
8421
|
);
|
|
8553
8422
|
return c.json(
|
|
8554
8423
|
{
|
|
@@ -8564,7 +8433,7 @@ app18.post("/navigate", async (c) => {
|
|
|
8564
8433
|
const cdpOk = await ensureCdp(transport);
|
|
8565
8434
|
if (!cdpOk) {
|
|
8566
8435
|
console.error(
|
|
8567
|
-
`${
|
|
8436
|
+
`${TAG20} intent=${JSON.stringify(intent)} browser=fallback navigateResult=cdp-unreachable hostname=${JSON.stringify(hostname2)}`
|
|
8568
8437
|
);
|
|
8569
8438
|
return c.json(
|
|
8570
8439
|
{
|
|
@@ -8580,7 +8449,7 @@ app18.post("/navigate", async (c) => {
|
|
|
8580
8449
|
const browser = outcome.result === "ok" ? "vnc" : "fallback";
|
|
8581
8450
|
const detailStr = outcome.detail ? ` detail=${JSON.stringify(outcome.detail.length > 230 ? outcome.detail.slice(0, 227) + "..." : outcome.detail)}` : "";
|
|
8582
8451
|
console.error(
|
|
8583
|
-
`${
|
|
8452
|
+
`${TAG20} intent=${JSON.stringify(intent)} browser=${browser} navigateResult=${outcome.result} hostname=${JSON.stringify(hostname2)} targetId=${outcome.targetId ?? "none"}${detailStr}`
|
|
8584
8453
|
);
|
|
8585
8454
|
if (outcome.result !== "ok") {
|
|
8586
8455
|
return c.json(
|
|
@@ -8611,18 +8480,18 @@ var ALLOWED_EVENTS2 = /* @__PURE__ */ new Set([
|
|
|
8611
8480
|
]);
|
|
8612
8481
|
var app19 = new Hono();
|
|
8613
8482
|
app19.post("/", async (c) => {
|
|
8614
|
-
const
|
|
8483
|
+
const TAG20 = "[admin:events]";
|
|
8615
8484
|
let body;
|
|
8616
8485
|
try {
|
|
8617
8486
|
body = await c.req.json();
|
|
8618
8487
|
} catch (err) {
|
|
8619
8488
|
const detail = err instanceof Error ? err.message : String(err);
|
|
8620
|
-
console.error(`${
|
|
8489
|
+
console.error(`${TAG20} reject reason=body-not-json detail=${detail}`);
|
|
8621
8490
|
return c.json({ ok: false, detail: "Request body was not valid JSON" }, 400);
|
|
8622
8491
|
}
|
|
8623
8492
|
const event = typeof body.event === "string" ? body.event : "";
|
|
8624
8493
|
if (!ALLOWED_EVENTS2.has(event)) {
|
|
8625
|
-
console.error(`${
|
|
8494
|
+
console.error(`${TAG20} reject reason=event-not-allowed event=${JSON.stringify(event)}`);
|
|
8626
8495
|
return c.json({ ok: false, detail: `Event "${event}" is not allowed` }, 400);
|
|
8627
8496
|
}
|
|
8628
8497
|
const rawFields = body.fields && typeof body.fields === "object" ? body.fields : {};
|
|
@@ -8645,7 +8514,7 @@ var events_default = app19;
|
|
|
8645
8514
|
|
|
8646
8515
|
// server/routes/admin/cloudflare.ts
|
|
8647
8516
|
import { homedir as homedir4 } from "os";
|
|
8648
|
-
import { resolve as
|
|
8517
|
+
import { resolve as resolve13 } from "path";
|
|
8649
8518
|
import { readFileSync as readFileSync15 } from "fs";
|
|
8650
8519
|
|
|
8651
8520
|
// app/lib/dns-label.ts
|
|
@@ -8662,10 +8531,10 @@ function isValidDomain(value) {
|
|
|
8662
8531
|
}
|
|
8663
8532
|
|
|
8664
8533
|
// app/lib/alias-domains.ts
|
|
8665
|
-
import { existsSync as existsSync15, mkdirSync as
|
|
8666
|
-
import { dirname as
|
|
8667
|
-
import { resolve as
|
|
8668
|
-
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");
|
|
8669
8538
|
function readExisting() {
|
|
8670
8539
|
if (!existsSync15(ALIAS_DOMAINS_PATH)) return /* @__PURE__ */ new Set();
|
|
8671
8540
|
try {
|
|
@@ -8680,14 +8549,14 @@ function addAliasDomain(hostname2) {
|
|
|
8680
8549
|
const existing = readExisting();
|
|
8681
8550
|
if (existing.has(hostname2)) return;
|
|
8682
8551
|
existing.add(hostname2);
|
|
8683
|
-
|
|
8552
|
+
mkdirSync5(dirname3(ALIAS_DOMAINS_PATH), { recursive: true });
|
|
8684
8553
|
writeFileSync9(ALIAS_DOMAINS_PATH, JSON.stringify([...existing], null, 2) + "\n", "utf-8");
|
|
8685
8554
|
}
|
|
8686
8555
|
|
|
8687
8556
|
// app/lib/script-stream-tailer.ts
|
|
8688
8557
|
import * as childProcess from "child_process";
|
|
8689
|
-
import { appendFileSync as appendFileSync2, createReadStream as createReadStream2, mkdirSync as
|
|
8690
|
-
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";
|
|
8691
8560
|
import { StringDecoder } from "string_decoder";
|
|
8692
8561
|
var SCRIPT_STREAM_RE = /^\[([^\]]+)\] \[script:([a-z][a-z0-9-]*)((?::[a-z0-9:_-]+)?)\] (.*)$/;
|
|
8693
8562
|
function parseLine(line) {
|
|
@@ -8796,7 +8665,7 @@ function writeRouteMilestone(streamLogPath, scope, line) {
|
|
|
8796
8665
|
}
|
|
8797
8666
|
const ts = (/* @__PURE__ */ new Date()).toISOString();
|
|
8798
8667
|
try {
|
|
8799
|
-
|
|
8668
|
+
mkdirSync6(dirname4(streamLogPath), { recursive: true });
|
|
8800
8669
|
appendFileSync2(streamLogPath, `[${ts}] [script:${scope}] ${line}
|
|
8801
8670
|
`);
|
|
8802
8671
|
} catch (err) {
|
|
@@ -8936,7 +8805,7 @@ var CLOUDFLARE_SETUP_FORM_SCHEMA = {
|
|
|
8936
8805
|
|
|
8937
8806
|
// server/routes/admin/cloudflare.ts
|
|
8938
8807
|
function cloudflareStreamLogPath(accountId, correlationId) {
|
|
8939
|
-
return
|
|
8808
|
+
return resolve13(ACCOUNTS_DIR, accountId, "cloudflare-stream-logs", `${correlationId}.log`);
|
|
8940
8809
|
}
|
|
8941
8810
|
var SETUP_TIMEOUT_MS = 10 * 60 * 1e3;
|
|
8942
8811
|
var DOMAINS_TIMEOUT_MS = 40 * 1e3;
|
|
@@ -8966,8 +8835,8 @@ function readDiscoveryResults(accountId) {
|
|
|
8966
8835
|
return { tunnels: entry.tunnels, domains: entry.domains };
|
|
8967
8836
|
}
|
|
8968
8837
|
function loadBrandInfo() {
|
|
8969
|
-
const platformRoot = process.env.MAXY_PLATFORM_ROOT ??
|
|
8970
|
-
const brandPath =
|
|
8838
|
+
const platformRoot = process.env.MAXY_PLATFORM_ROOT ?? resolve13(process.cwd(), "..");
|
|
8839
|
+
const brandPath = resolve13(platformRoot, "config", "brand.json");
|
|
8971
8840
|
try {
|
|
8972
8841
|
const parsed = JSON.parse(readFileSync15(brandPath, "utf-8"));
|
|
8973
8842
|
const hostname2 = typeof parsed.hostname === "string" && parsed.hostname ? parsed.hostname : "maxy";
|
|
@@ -9097,7 +8966,7 @@ app20.get("/domains", requireAdminSession, async (c) => {
|
|
|
9097
8966
|
streamLogPath = cloudflareStreamLogPath(accountId, correlationId);
|
|
9098
8967
|
log(`phase=stream-log-resolved path=${streamLogPath}`);
|
|
9099
8968
|
const brand = loadBrandInfo();
|
|
9100
|
-
const scriptPath =
|
|
8969
|
+
const scriptPath = resolve13(homedir4(), "list-cf-domains.sh");
|
|
9101
8970
|
const result = await runFormSpawn({
|
|
9102
8971
|
scriptPath,
|
|
9103
8972
|
args: [brand.hostname],
|
|
@@ -9188,7 +9057,7 @@ app20.get("/tunnels", requireAdminSession, async (c) => {
|
|
|
9188
9057
|
if (!accountId) return err("session", "No account bound to session \u2014 refresh chat.");
|
|
9189
9058
|
if (!correlationId) return err("session", "No active conversation for session \u2014 refresh chat.");
|
|
9190
9059
|
streamLogPath = cloudflareStreamLogPath(accountId, correlationId);
|
|
9191
|
-
const certPath =
|
|
9060
|
+
const certPath = resolve13(homedir4(), brand.configDir, "cloudflared", "cert.pem");
|
|
9192
9061
|
const { existsSync: existsSync23 } = await import("fs");
|
|
9193
9062
|
if (!existsSync23(certPath)) {
|
|
9194
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.`);
|
|
@@ -9514,17 +9383,17 @@ var cloudflare_default = app20;
|
|
|
9514
9383
|
import { createReadStream as createReadStream3 } from "fs";
|
|
9515
9384
|
import { readdir as readdir2, readFile as readFile4, stat as stat4, mkdir as mkdir3, writeFile as writeFile4, unlink as unlink2 } from "fs/promises";
|
|
9516
9385
|
import { realpathSync as realpathSync4 } from "fs";
|
|
9517
|
-
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";
|
|
9518
9387
|
import { Readable as Readable2 } from "stream";
|
|
9519
9388
|
|
|
9520
9389
|
// app/lib/data-path.ts
|
|
9521
9390
|
import { realpathSync as realpathSync3 } from "fs";
|
|
9522
|
-
import { resolve as
|
|
9523
|
-
var
|
|
9524
|
-
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");
|
|
9525
9394
|
function resolveDataPath(raw) {
|
|
9526
9395
|
const cleaned = normalize("/" + (raw ?? "").replace(/\\/g, "/")).replace(/^\/+/, "");
|
|
9527
|
-
const absolute =
|
|
9396
|
+
const absolute = resolve14(DATA_ROOT, cleaned);
|
|
9528
9397
|
let dataRootReal;
|
|
9529
9398
|
try {
|
|
9530
9399
|
dataRootReal = realpathSync3(DATA_ROOT);
|
|
@@ -9570,7 +9439,6 @@ var UNIQUE_KEYS_BY_LABEL = {
|
|
|
9570
9439
|
DigitalDocument: ["attachmentId"],
|
|
9571
9440
|
Conversation: ["conversationId"],
|
|
9572
9441
|
Message: ["messageId"],
|
|
9573
|
-
OnboardingState: ["accountId"],
|
|
9574
9442
|
Workflow: ["workflowId"],
|
|
9575
9443
|
WorkflowStep: ["stepId"],
|
|
9576
9444
|
WorkflowRun: ["runId"],
|
|
@@ -9883,7 +9751,7 @@ async function readMeta(absDir, baseName) {
|
|
|
9883
9751
|
}
|
|
9884
9752
|
async function readAccountNames() {
|
|
9885
9753
|
const map = /* @__PURE__ */ new Map();
|
|
9886
|
-
const accountsDir =
|
|
9754
|
+
const accountsDir = resolve15(DATA_ROOT, "accounts");
|
|
9887
9755
|
let names;
|
|
9888
9756
|
try {
|
|
9889
9757
|
names = await readdir2(accountsDir);
|
|
@@ -9892,7 +9760,7 @@ async function readAccountNames() {
|
|
|
9892
9760
|
}
|
|
9893
9761
|
for (const name of names) {
|
|
9894
9762
|
if (!UUID_RE4.test(name)) continue;
|
|
9895
|
-
const configPath2 =
|
|
9763
|
+
const configPath2 = resolve15(accountsDir, name, "account.json");
|
|
9896
9764
|
try {
|
|
9897
9765
|
const raw = await readFile4(configPath2, "utf8");
|
|
9898
9766
|
const parsed = JSON.parse(raw);
|
|
@@ -10083,8 +9951,8 @@ app21.post("/upload", requireAdminSession, async (c) => {
|
|
|
10083
9951
|
}
|
|
10084
9952
|
const safeName = basename4(file.name).replace(/[\0/\\]/g, "_");
|
|
10085
9953
|
const finalName = `${Date.now()}-${safeName}`;
|
|
10086
|
-
const destDir =
|
|
10087
|
-
const destPath =
|
|
9954
|
+
const destDir = resolve15(DATA_ROOT, "uploads", accountId);
|
|
9955
|
+
const destPath = resolve15(destDir, finalName);
|
|
10088
9956
|
try {
|
|
10089
9957
|
await mkdir3(destDir, { recursive: true });
|
|
10090
9958
|
const dataRootReal = realpathSync4(DATA_ROOT);
|
|
@@ -10142,7 +10010,7 @@ app21.delete("/", requireAdminSession, async (c) => {
|
|
|
10142
10010
|
}
|
|
10143
10011
|
const dot = base.lastIndexOf(".");
|
|
10144
10012
|
const stem = dot === -1 ? base : base.slice(0, dot);
|
|
10145
|
-
const sidecarPath = UUID_RE4.test(stem) && base !== `${stem}.meta.json` ? join11(
|
|
10013
|
+
const sidecarPath = UUID_RE4.test(stem) && base !== `${stem}.meta.json` ? join11(dirname5(absolute), `${stem}.meta.json`) : null;
|
|
10146
10014
|
await unlink2(absolute);
|
|
10147
10015
|
if (sidecarPath) {
|
|
10148
10016
|
try {
|
|
@@ -10759,9 +10627,6 @@ var GRAPH_LABEL_COLOURS = {
|
|
|
10759
10627
|
WorkflowStep: "#5A8E96",
|
|
10760
10628
|
WorkflowRun: "#7AAAB2",
|
|
10761
10629
|
StepResult: "#9CC4CB",
|
|
10762
|
-
// Onboarding — muted violet (sits between conversation plum and
|
|
10763
|
-
// workflow teal but shares neither hue)
|
|
10764
|
-
OnboardingState: "#7A5A8A",
|
|
10765
10630
|
// Email — muted moss (hue-adjacent to Knowledge but lower-saturation
|
|
10766
10631
|
// and warmer; never co-rendered with KnowledgeDocument so visual
|
|
10767
10632
|
// confusion doesn't apply, but kept distinguishable for the legend)
|
|
@@ -10808,7 +10673,6 @@ var FILTER_TOP_LEVEL_LABELS = Object.freeze(
|
|
|
10808
10673
|
"Project",
|
|
10809
10674
|
"Event",
|
|
10810
10675
|
"Workflow",
|
|
10811
|
-
"OnboardingState",
|
|
10812
10676
|
"Email",
|
|
10813
10677
|
"EmailAccount",
|
|
10814
10678
|
"Agent"
|
|
@@ -11807,7 +11671,7 @@ var file_attach_default = app28;
|
|
|
11807
11671
|
// server/routes/admin/sidebar-artefacts.ts
|
|
11808
11672
|
import neo4j2 from "neo4j-driver";
|
|
11809
11673
|
import { readFile as readFile5, readdir as readdir3, stat as stat5 } from "fs/promises";
|
|
11810
|
-
import { resolve as
|
|
11674
|
+
import { resolve as resolve16, relative as relative2, isAbsolute } from "path";
|
|
11811
11675
|
import { existsSync as existsSync16 } from "fs";
|
|
11812
11676
|
var LIMIT = 50;
|
|
11813
11677
|
var TEXT_MIME_PREFIXES = ["text/", "application/json", "application/markdown"];
|
|
@@ -11824,7 +11688,7 @@ app29.get("/", requireAdminSession, async (c) => {
|
|
|
11824
11688
|
if (docs === null) {
|
|
11825
11689
|
return c.json({ error: "Failed to load artefacts" }, 500);
|
|
11826
11690
|
}
|
|
11827
|
-
const accountDir =
|
|
11691
|
+
const accountDir = resolve16(ACCOUNTS_DIR, accountId);
|
|
11828
11692
|
const agents = await fetchAgentTemplateRows(accountDir);
|
|
11829
11693
|
const artefacts = [...docs, ...agents].sort(
|
|
11830
11694
|
(a, b) => (b.updatedAt ?? "").localeCompare(a.updatedAt ?? "")
|
|
@@ -11887,8 +11751,8 @@ async function readArtefactContent(accountId, attachmentId, mimeType, displayNam
|
|
|
11887
11751
|
logSkip(displayName, "non-text-mime", mimeType);
|
|
11888
11752
|
return { content: "", skipReason: "non-text-mime" };
|
|
11889
11753
|
}
|
|
11890
|
-
const accountDir =
|
|
11891
|
-
const dir =
|
|
11754
|
+
const accountDir = resolve16(ATTACHMENTS_ROOT, accountId);
|
|
11755
|
+
const dir = resolve16(accountDir, attachmentId);
|
|
11892
11756
|
try {
|
|
11893
11757
|
validateFilePathInAccount(dir, accountDir);
|
|
11894
11758
|
} catch {
|
|
@@ -11902,7 +11766,7 @@ async function readArtefactContent(accountId, attachmentId, mimeType, displayNam
|
|
|
11902
11766
|
logSkip(displayName, "missing-on-disk", mimeType);
|
|
11903
11767
|
return { content: "", skipReason: "missing-on-disk" };
|
|
11904
11768
|
}
|
|
11905
|
-
return { content: await readFile5(
|
|
11769
|
+
return { content: await readFile5(resolve16(dir, dataFile), "utf-8"), skipReason: null };
|
|
11906
11770
|
} catch (err) {
|
|
11907
11771
|
const message = err instanceof Error ? err.message : String(err);
|
|
11908
11772
|
console.error(`[admin/sidebar-artefacts] read-failed attachmentId=${attachmentId.slice(0, 8)} error="${message}"`);
|
|
@@ -11918,8 +11782,8 @@ function logSkip(name, reason, mimeType) {
|
|
|
11918
11782
|
async function fetchAgentTemplateRows(accountDir) {
|
|
11919
11783
|
const rows = [];
|
|
11920
11784
|
for (const filename of ADMIN_AGENT_FILES) {
|
|
11921
|
-
const overridePath =
|
|
11922
|
-
const bundledPath =
|
|
11785
|
+
const overridePath = resolve16(accountDir, "agents", "admin", filename);
|
|
11786
|
+
const bundledPath = resolve16(PLATFORM_ROOT, "templates", "agents", "admin", filename);
|
|
11923
11787
|
const labelStem = filename.replace(/\.md$/, "");
|
|
11924
11788
|
const row = await readAgentTemplateRow({
|
|
11925
11789
|
id: `agent-template:admin:${filename}`,
|
|
@@ -11933,12 +11797,12 @@ async function fetchAgentTemplateRows(accountDir) {
|
|
|
11933
11797
|
});
|
|
11934
11798
|
if (row) rows.push(row);
|
|
11935
11799
|
}
|
|
11936
|
-
const overrideDir =
|
|
11937
|
-
const bundledDir =
|
|
11800
|
+
const overrideDir = resolve16(accountDir, "specialists", "agents");
|
|
11801
|
+
const bundledDir = resolve16(PLATFORM_ROOT, "templates", "specialists", "agents");
|
|
11938
11802
|
const specialistNames = await unionSpecialistFilenames(overrideDir, bundledDir);
|
|
11939
11803
|
for (const filename of specialistNames) {
|
|
11940
|
-
const overridePath =
|
|
11941
|
-
const bundledPath =
|
|
11804
|
+
const overridePath = resolve16(overrideDir, filename);
|
|
11805
|
+
const bundledPath = resolve16(bundledDir, filename);
|
|
11942
11806
|
const row = await readAgentTemplateRow({
|
|
11943
11807
|
id: `agent-template:specialist:${filename}`,
|
|
11944
11808
|
displayName: filename.replace(/\.md$/, ""),
|
|
@@ -12023,7 +11887,7 @@ var sidebar_artefacts_default = app29;
|
|
|
12023
11887
|
|
|
12024
11888
|
// server/routes/admin/sidebar-artefact-save.ts
|
|
12025
11889
|
import { mkdir as mkdir4, readdir as readdir4, stat as stat6, writeFile as writeFile5 } from "fs/promises";
|
|
12026
|
-
import { resolve as
|
|
11890
|
+
import { resolve as resolve17 } from "path";
|
|
12027
11891
|
import { existsSync as existsSync17 } from "fs";
|
|
12028
11892
|
var ADMIN_AGENT_FILES2 = /* @__PURE__ */ new Set(["IDENTITY.md", "SOUL.md", "KNOWLEDGE.md"]);
|
|
12029
11893
|
var UUID_RE5 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
|
|
@@ -12036,7 +11900,7 @@ app30.post("/", requireAdminSession, async (c) => {
|
|
|
12036
11900
|
if (!body || typeof body.id !== "string" || typeof body.content !== "string") {
|
|
12037
11901
|
return c.json({ error: "id and content required" }, 400);
|
|
12038
11902
|
}
|
|
12039
|
-
const accountDir =
|
|
11903
|
+
const accountDir = resolve17(ACCOUNTS_DIR, accountId);
|
|
12040
11904
|
const resolved = await resolveSavePath(body.id, accountId, accountDir);
|
|
12041
11905
|
if (resolved.kind === "heal-race") {
|
|
12042
11906
|
c.header("Retry-After", "2");
|
|
@@ -12081,17 +11945,17 @@ async function resolveSavePath(id, accountId, accountDir) {
|
|
|
12081
11945
|
if (role !== "admin" || !ADMIN_AGENT_FILES2.has(filename)) {
|
|
12082
11946
|
return { kind: "reject", status: 400, reason: "invalid-id" };
|
|
12083
11947
|
}
|
|
12084
|
-
const parent =
|
|
11948
|
+
const parent = resolve17(accountDir, "agents", "admin");
|
|
12085
11949
|
await mkdir4(parent, { recursive: true });
|
|
12086
11950
|
try {
|
|
12087
11951
|
validateFilePathInAccount(parent, accountDir);
|
|
12088
11952
|
} catch {
|
|
12089
11953
|
return { kind: "reject", status: 400, reason: "containment-rejected" };
|
|
12090
11954
|
}
|
|
12091
|
-
return { kind: "admin-template", path:
|
|
11955
|
+
return { kind: "admin-template", path: resolve17(parent, filename) };
|
|
12092
11956
|
}
|
|
12093
11957
|
if (UUID_RE5.test(id)) {
|
|
12094
|
-
const dir =
|
|
11958
|
+
const dir = resolve17(ATTACHMENTS_ROOT, accountId, id);
|
|
12095
11959
|
if (!existsSync17(dir)) {
|
|
12096
11960
|
const attShort = id.slice(0, 8);
|
|
12097
11961
|
if (isHealPending(accountId, id)) {
|
|
@@ -12124,7 +11988,7 @@ async function resolveSavePath(id, accountId, accountDir) {
|
|
|
12124
11988
|
}
|
|
12125
11989
|
}
|
|
12126
11990
|
try {
|
|
12127
|
-
validateFilePathInAccount(dir,
|
|
11991
|
+
validateFilePathInAccount(dir, resolve17(ATTACHMENTS_ROOT, accountId));
|
|
12128
11992
|
} catch {
|
|
12129
11993
|
return { kind: "reject", status: 400, reason: "containment-rejected" };
|
|
12130
11994
|
}
|
|
@@ -12133,7 +11997,7 @@ async function resolveSavePath(id, accountId, accountDir) {
|
|
|
12133
11997
|
if (!dataFile) {
|
|
12134
11998
|
return { kind: "reject", status: 400, reason: "not-found" };
|
|
12135
11999
|
}
|
|
12136
|
-
return { kind: "knowledge-doc", path:
|
|
12000
|
+
return { kind: "knowledge-doc", path: resolve17(dir, dataFile) };
|
|
12137
12001
|
}
|
|
12138
12002
|
return { kind: "reject", status: 400, reason: "invalid-id" };
|
|
12139
12003
|
}
|
|
@@ -12145,7 +12009,7 @@ var sidebar_artefact_save_default = app30;
|
|
|
12145
12009
|
// server/routes/admin/sidebar-artefact-content.ts
|
|
12146
12010
|
import { readFile as readFile6, readdir as readdir5 } from "fs/promises";
|
|
12147
12011
|
import { existsSync as existsSync18 } from "fs";
|
|
12148
|
-
import { resolve as
|
|
12012
|
+
import { resolve as resolve18 } from "path";
|
|
12149
12013
|
var UUID_RE6 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
|
|
12150
12014
|
var app31 = new Hono();
|
|
12151
12015
|
app31.get("/", requireAdminSession, async (c) => {
|
|
@@ -12157,14 +12021,14 @@ app31.get("/", requireAdminSession, async (c) => {
|
|
|
12157
12021
|
console.error(`[admin/sidebar-artefact-content] not-found id=${id.slice(0, 8)}`);
|
|
12158
12022
|
return new Response("Not found", { status: 404 });
|
|
12159
12023
|
}
|
|
12160
|
-
const dir =
|
|
12024
|
+
const dir = resolve18(ATTACHMENTS_ROOT, accountId, id);
|
|
12161
12025
|
if (!existsSync18(dir)) {
|
|
12162
12026
|
console.error(`[admin/sidebar-artefact-content] not-found id=${id.slice(0, 8)}`);
|
|
12163
12027
|
return new Response("Not found", { status: 404 });
|
|
12164
12028
|
}
|
|
12165
12029
|
let meta;
|
|
12166
12030
|
try {
|
|
12167
|
-
meta = JSON.parse(await readFile6(
|
|
12031
|
+
meta = JSON.parse(await readFile6(resolve18(dir, `${id}.meta.json`), "utf-8"));
|
|
12168
12032
|
} catch {
|
|
12169
12033
|
console.error(`[admin/sidebar-artefact-content] not-found id=${id.slice(0, 8)}`);
|
|
12170
12034
|
return new Response("Not found", { status: 404 });
|
|
@@ -12176,7 +12040,7 @@ app31.get("/", requireAdminSession, async (c) => {
|
|
|
12176
12040
|
return new Response("Not found", { status: 404 });
|
|
12177
12041
|
}
|
|
12178
12042
|
const start = Date.now();
|
|
12179
|
-
const buffer = await readFile6(
|
|
12043
|
+
const buffer = await readFile6(resolve18(dir, dataFile));
|
|
12180
12044
|
const ms = Date.now() - start;
|
|
12181
12045
|
console.log(
|
|
12182
12046
|
`[admin/sidebar-artefact-content] account=${accountId} id=${id.slice(0, 8)} mime=${meta.mimeType} bytes=${buffer.length} ms=${ms}`
|
|
@@ -12193,10 +12057,10 @@ var sidebar_artefact_content_default = app31;
|
|
|
12193
12057
|
|
|
12194
12058
|
// server/routes/admin/health.ts
|
|
12195
12059
|
import { existsSync as existsSync19, readFileSync as readFileSync16 } from "fs";
|
|
12196
|
-
import { resolve as
|
|
12197
|
-
var
|
|
12060
|
+
import { resolve as resolve19, join as join12 } from "path";
|
|
12061
|
+
var PLATFORM_ROOT6 = process.env.MAXY_PLATFORM_ROOT ?? resolve19(process.cwd(), "..");
|
|
12198
12062
|
var brandHostname = "maxy";
|
|
12199
|
-
var brandJsonPath = join12(
|
|
12063
|
+
var brandJsonPath = join12(PLATFORM_ROOT6, "config", "brand.json");
|
|
12200
12064
|
if (existsSync19(brandJsonPath)) {
|
|
12201
12065
|
try {
|
|
12202
12066
|
const brand = JSON.parse(readFileSync16(brandJsonPath, "utf-8"));
|
|
@@ -12204,7 +12068,7 @@ if (existsSync19(brandJsonPath)) {
|
|
|
12204
12068
|
} catch {
|
|
12205
12069
|
}
|
|
12206
12070
|
}
|
|
12207
|
-
var VERSION_FILE =
|
|
12071
|
+
var VERSION_FILE = resolve19(PLATFORM_ROOT6, `config/.${brandHostname}-version`);
|
|
12208
12072
|
var PROCESS_STARTED_AT = (/* @__PURE__ */ new Date()).toISOString();
|
|
12209
12073
|
var PROBE_TIMEOUT_MS = 1e3;
|
|
12210
12074
|
function readVersion() {
|
|
@@ -12292,7 +12156,7 @@ var admin_default = app33;
|
|
|
12292
12156
|
|
|
12293
12157
|
// server/routes/sites.ts
|
|
12294
12158
|
import { existsSync as existsSync20, readFileSync as readFileSync17, realpathSync as realpathSync5, statSync as statSync7 } from "fs";
|
|
12295
|
-
import { resolve as
|
|
12159
|
+
import { resolve as resolve20 } from "path";
|
|
12296
12160
|
var SAFE_SEG_RE = /^[a-z0-9_][a-z0-9_.-]{0,99}$/i;
|
|
12297
12161
|
var MIME = {
|
|
12298
12162
|
".html": "text/html; charset=utf-8",
|
|
@@ -12349,8 +12213,8 @@ app34.get("/:rel{.*}", (c) => {
|
|
|
12349
12213
|
}
|
|
12350
12214
|
segments.push(seg);
|
|
12351
12215
|
}
|
|
12352
|
-
const rootDir =
|
|
12353
|
-
let filePath = segments.length === 0 ? rootDir :
|
|
12216
|
+
const rootDir = resolve20(account.accountDir, "sites");
|
|
12217
|
+
let filePath = segments.length === 0 ? rootDir : resolve20(rootDir, ...segments);
|
|
12354
12218
|
if (filePath !== rootDir && !filePath.startsWith(rootDir + "/")) {
|
|
12355
12219
|
console.error(`[sites] path-traversal-rejected path=${reqPath} reason=escape status=403`);
|
|
12356
12220
|
return c.text("Forbidden", 403);
|
|
@@ -12370,7 +12234,7 @@ app34.get("/:rel{.*}", (c) => {
|
|
|
12370
12234
|
return c.redirect(target, 301);
|
|
12371
12235
|
}
|
|
12372
12236
|
if (stat7?.isDirectory()) {
|
|
12373
|
-
filePath =
|
|
12237
|
+
filePath = resolve20(filePath, "index.html");
|
|
12374
12238
|
}
|
|
12375
12239
|
if (!filePath.startsWith(rootDir + "/")) {
|
|
12376
12240
|
console.error(`[sites] path-traversal-rejected path=${reqPath} reason=escape status=403`);
|
|
@@ -12511,7 +12375,7 @@ function startGraphHealthTimer() {
|
|
|
12511
12375
|
}
|
|
12512
12376
|
|
|
12513
12377
|
// app/lib/whatsapp/inbound/claude-bridge.ts
|
|
12514
|
-
var
|
|
12378
|
+
var TAG19 = "[whatsapp-adaptor]";
|
|
12515
12379
|
function whatsappTurnTimeoutMs() {
|
|
12516
12380
|
return Number(process.env.WHATSAPP_PTY_TURN_TIMEOUT_MS ?? String(5 * 6e4));
|
|
12517
12381
|
}
|
|
@@ -12532,7 +12396,7 @@ async function dispatchToClaude(input) {
|
|
|
12532
12396
|
await input.reply(result.turnText);
|
|
12533
12397
|
} catch (err) {
|
|
12534
12398
|
const m = err instanceof Error ? err.message : String(err);
|
|
12535
|
-
console.error(`${
|
|
12399
|
+
console.error(`${TAG19} reject reason=reply-failed senderId=${input.senderId} message=${m}`);
|
|
12536
12400
|
}
|
|
12537
12401
|
}
|
|
12538
12402
|
function startReaper2() {
|
|
@@ -12542,7 +12406,7 @@ function startReaper2() {
|
|
|
12542
12406
|
// ../lib/entitlement/src/index.ts
|
|
12543
12407
|
import { createPublicKey, createHash as createHash3, verify as cryptoVerify } from "crypto";
|
|
12544
12408
|
import { existsSync as existsSync21, readFileSync as readFileSync18, statSync as statSync8 } from "fs";
|
|
12545
|
-
import { resolve as
|
|
12409
|
+
import { resolve as resolve21 } from "path";
|
|
12546
12410
|
|
|
12547
12411
|
// ../lib/entitlement/src/canonicalize.ts
|
|
12548
12412
|
function canonicalize(value) {
|
|
@@ -12577,7 +12441,7 @@ var PUBKEY_SHA256 = "8eee6bcb33545fd13b16d3199a5735ca5db5062834c7b49dfe4f23801d9
|
|
|
12577
12441
|
var GRACE_DAYS = 7;
|
|
12578
12442
|
var GRACE_MS = GRACE_DAYS * 24 * 60 * 60 * 1e3;
|
|
12579
12443
|
function pubkeyPath(brand) {
|
|
12580
|
-
return
|
|
12444
|
+
return resolve21(brand.platformRoot, "lib", "entitlement", "rubytech-pubkey.pem");
|
|
12581
12445
|
}
|
|
12582
12446
|
var memo = null;
|
|
12583
12447
|
function memoKey(mtimeMs, account) {
|
|
@@ -12589,7 +12453,7 @@ function resolveEntitlement(brand, account) {
|
|
|
12589
12453
|
if (brand.commercialMode !== true) {
|
|
12590
12454
|
return logResolved(implicitTrust(account), null);
|
|
12591
12455
|
}
|
|
12592
|
-
const entitlementPath =
|
|
12456
|
+
const entitlementPath = resolve21(brand.configDir, "entitlement.json");
|
|
12593
12457
|
if (!existsSync21(entitlementPath)) {
|
|
12594
12458
|
return logResolved(anonymousFallback("missing"), { reason: "missing" });
|
|
12595
12459
|
}
|
|
@@ -12779,8 +12643,8 @@ function clientFrom(c) {
|
|
|
12779
12643
|
c.req.header("x-forwarded-for")
|
|
12780
12644
|
);
|
|
12781
12645
|
}
|
|
12782
|
-
var
|
|
12783
|
-
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") : "";
|
|
12784
12648
|
var BRAND = { productName: "Maxy", hostname: "maxy", configDir: ".maxy", domain: "getmaxy.com" };
|
|
12785
12649
|
if (BRAND_JSON_PATH && !existsSync22(BRAND_JSON_PATH)) {
|
|
12786
12650
|
console.error(`[brand] WARNING: brand.json not found at ${BRAND_JSON_PATH} \u2014 using Maxy defaults`);
|
|
@@ -13180,8 +13044,8 @@ app35.get("/agent-assets/:slug/:filename", (c) => {
|
|
|
13180
13044
|
console.error(`[agent-assets] no-account slug=${slug} file=${filename}`);
|
|
13181
13045
|
return c.text("Not found", 404);
|
|
13182
13046
|
}
|
|
13183
|
-
const filePath =
|
|
13184
|
-
const expectedDir =
|
|
13047
|
+
const filePath = resolve22(account.accountDir, "agents", slug, "assets", filename);
|
|
13048
|
+
const expectedDir = resolve22(account.accountDir, "agents", slug, "assets");
|
|
13185
13049
|
if (!filePath.startsWith(expectedDir + "/")) {
|
|
13186
13050
|
console.error(`[agent-assets] path-traversal-rejected slug=${slug} file=${filename}`);
|
|
13187
13051
|
return c.text("Forbidden", 403);
|
|
@@ -13210,8 +13074,8 @@ app35.get("/generated/:filename", (c) => {
|
|
|
13210
13074
|
console.error(`[generated] serve file=${filename} status=404`);
|
|
13211
13075
|
return c.text("Not found", 404);
|
|
13212
13076
|
}
|
|
13213
|
-
const filePath =
|
|
13214
|
-
const expectedDir =
|
|
13077
|
+
const filePath = resolve22(account.accountDir, "generated", filename);
|
|
13078
|
+
const expectedDir = resolve22(account.accountDir, "generated");
|
|
13215
13079
|
if (!filePath.startsWith(expectedDir + "/")) {
|
|
13216
13080
|
console.error(`[generated] serve file=${filename} status=403`);
|
|
13217
13081
|
return c.text("Forbidden", 403);
|
|
@@ -13251,8 +13115,8 @@ var brandScript = `<script>window.__BRAND__=${JSON.stringify({
|
|
|
13251
13115
|
})}</script>`;
|
|
13252
13116
|
function readInstalledVersion() {
|
|
13253
13117
|
try {
|
|
13254
|
-
if (!
|
|
13255
|
-
const versionFile = join13(
|
|
13118
|
+
if (!PLATFORM_ROOT7) return "unknown";
|
|
13119
|
+
const versionFile = join13(PLATFORM_ROOT7, "config", `.${BRAND.hostname}-version`);
|
|
13256
13120
|
if (!existsSync22(versionFile)) return "unknown";
|
|
13257
13121
|
const content = readFileSync19(versionFile, "utf-8").trim();
|
|
13258
13122
|
return content || "unknown";
|
|
@@ -13295,7 +13159,7 @@ var clientErrorReporterScript = `<script>
|
|
|
13295
13159
|
function cachedHtml(file) {
|
|
13296
13160
|
let html = htmlCache.get(file);
|
|
13297
13161
|
if (!html) {
|
|
13298
|
-
html = readFileSync19(
|
|
13162
|
+
html = readFileSync19(resolve22(process.cwd(), "public", file), "utf-8");
|
|
13299
13163
|
const productNameEsc = escapeHtml(BRAND.productName);
|
|
13300
13164
|
html = html.replace(/<title>([^<]*)<\/title>/, (_match, inner) => `<title>${escapeHtml(inner).replace(/Maxy/g, productNameEsc)}</title>`);
|
|
13301
13165
|
html = html.replace('href="/favicon.ico"', `href="${escapeHtml(brandFaviconPath)}"`);
|
|
@@ -13403,7 +13267,7 @@ app35.use("/vnc-popout.html", logViewerFetch);
|
|
|
13403
13267
|
app35.get("/vnc-popout.html", (c) => {
|
|
13404
13268
|
let html = htmlCache.get("vnc-popout.html");
|
|
13405
13269
|
if (!html) {
|
|
13406
|
-
html = readFileSync19(
|
|
13270
|
+
html = readFileSync19(resolve22(process.cwd(), "public", "vnc-popout.html"), "utf-8");
|
|
13407
13271
|
const name = escapeHtml(BRAND.productName);
|
|
13408
13272
|
html = html.replace("<title>Browser \u2014 Maxy</title>", `<title>${name}</title>`);
|
|
13409
13273
|
html = html.replace("</head>", ` ${brandScript}
|
|
@@ -13455,7 +13319,7 @@ app35.get("/data", (c) => {
|
|
|
13455
13319
|
app35.get("/docs/desktop-code-controls", (c) => {
|
|
13456
13320
|
const host = (c.req.header("host") ?? "").split(":")[0];
|
|
13457
13321
|
if (isPublicHost(host)) return c.text("Not found", 404);
|
|
13458
|
-
const docsPath =
|
|
13322
|
+
const docsPath = PLATFORM_ROOT7 ? resolve22(PLATFORM_ROOT7, "..", "docs", "desktop-code-controls.md") : resolve22(process.cwd(), "docs", "desktop-code-controls.md");
|
|
13459
13323
|
if (!existsSync22(docsPath)) {
|
|
13460
13324
|
console.error(`[docs] desktop-code-controls.md missing at ${docsPath}`);
|
|
13461
13325
|
return c.text(`docs/desktop-code-controls.md not found at ${docsPath}`, 404);
|
|
@@ -13590,7 +13454,7 @@ reconcileEnabledPlugins(bootAccount?.accountDir, bootAccount?.config);
|
|
|
13590
13454
|
(async () => {
|
|
13591
13455
|
if (!bootAccount) return;
|
|
13592
13456
|
try {
|
|
13593
|
-
const { recoverRunningCloudflareTasks } = await import("./cloudflare-task-tracker-
|
|
13457
|
+
const { recoverRunningCloudflareTasks } = await import("./cloudflare-task-tracker-4PKOLE4H.js");
|
|
13594
13458
|
const result = await recoverRunningCloudflareTasks(
|
|
13595
13459
|
bootAccount.accountId,
|
|
13596
13460
|
configDirForWhatsApp,
|
|
@@ -13650,7 +13514,7 @@ if (bootAccountConfig?.whatsapp) {
|
|
|
13650
13514
|
}
|
|
13651
13515
|
init({
|
|
13652
13516
|
configDir: configDirForWhatsApp,
|
|
13653
|
-
platformRoot:
|
|
13517
|
+
platformRoot: resolve22(process.env.MAXY_PLATFORM_ROOT ?? join13(__dirname, "..")),
|
|
13654
13518
|
accountConfig: bootAccountConfig,
|
|
13655
13519
|
onMessage: async (msg) => {
|
|
13656
13520
|
if (process.env.WHATSAPP_PTY_BRIDGE_ENABLED === "true" && msg.text && !msg.isOwnerMirror) {
|