@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.
Files changed (136) hide show
  1. package/dist/index.js +37 -39
  2. package/package.json +1 -1
  3. package/payload/platform/lib/graph-trash/dist/index.d.ts +1 -1
  4. package/payload/platform/lib/graph-trash/dist/index.d.ts.map +1 -1
  5. package/payload/platform/lib/graph-trash/dist/index.js +1 -2
  6. package/payload/platform/lib/graph-trash/dist/index.js.map +1 -1
  7. package/payload/platform/lib/graph-trash/src/index.ts +1 -2
  8. package/payload/platform/neo4j/schema.cypher +4 -16
  9. package/payload/platform/plugins/admin/PLUGIN.md +0 -4
  10. package/payload/platform/plugins/admin/mcp/dist/index.js +1 -533
  11. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  12. package/payload/platform/plugins/cloudflare/scripts/setup-tunnel.sh +0 -47
  13. package/payload/platform/plugins/docs/references/cloudflare.md +0 -1
  14. package/payload/platform/plugins/docs/references/deployment.md +9 -18
  15. package/payload/platform/plugins/docs/references/internals.md +4 -4
  16. package/payload/platform/plugins/docs/references/platform.md +5 -1
  17. package/payload/platform/plugins/docs/references/troubleshooting.md +11 -7
  18. package/payload/platform/plugins/memory/PLUGIN.md +1 -1
  19. package/payload/platform/plugins/memory/mcp/dist/index.js +1 -1
  20. package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
  21. package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.d.ts +2 -3
  22. package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.d.ts.map +1 -1
  23. package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.js +2 -3
  24. package/payload/platform/plugins/memory/mcp/dist/lib/graph-prune.js.map +1 -1
  25. package/payload/platform/plugins/memory/mcp/dist/tools/memory-restore.d.ts +1 -1
  26. package/payload/platform/plugins/memory/references/graph-primitives.md +5 -5
  27. package/payload/platform/scripts/seed-neo4j.sh +9 -38
  28. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  29. package/payload/platform/services/claude-session-manager/dist/http-server.js +1 -14
  30. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  31. package/payload/platform/services/claude-session-manager/dist/jsonl-path.js +1 -1
  32. package/payload/platform/services/claude-session-manager/dist/jsonl-path.js.map +1 -1
  33. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +0 -14
  34. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  35. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +2 -9
  36. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  37. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts +1 -28
  38. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
  39. package/payload/platform/services/claude-session-manager/dist/system-prompt.js +4 -78
  40. package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
  41. package/payload/platform/templates/agents/admin/IDENTITY.md +2 -0
  42. package/payload/server/{chunk-NL7QLVAD.js → chunk-KVGTWNKQ.js} +1 -70
  43. package/payload/server/{chunk-2MRZBQMH.js → chunk-RZQMYJVY.js} +1 -1
  44. package/payload/server/{chunk-YPZFYTYP.js → chunk-ZGJ6CUU2.js} +1 -1
  45. package/payload/server/{cloudflare-task-tracker-QVOGHKWV.js → cloudflare-task-tracker-4PKOLE4H.js} +2 -2
  46. package/payload/server/maxy-edge.js +2 -2
  47. package/payload/server/public/assets/{Checkbox-YIF0payo.js → Checkbox-C6zXApx_.js} +1 -1
  48. package/payload/server/public/assets/{admin-Bk2eXMFD.js → admin-Cuu1QdAA.js} +53 -53
  49. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-Bz8mlxZZ.js → architectureDiagram-Q4EWVU46-BYXgFii5.js} +1 -1
  50. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-DwV8Z8-i.js → blockDiagram-DXYQGD6D-GIQ0eO13.js} +1 -1
  51. package/payload/server/public/assets/{brand-Bm671owU.js → brand-B-bNrpwc.js} +1 -1
  52. package/payload/server/public/assets/{brand-DqiRNMlu.css → brand-DdhkC994.css} +1 -1
  53. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-DiUTejMp.js → c4Diagram-AHTNJAMY-BmyWfG-l.js} +1 -1
  54. package/payload/server/public/assets/channel-C76knBRO.js +1 -0
  55. package/payload/server/public/assets/{chunk-336JU56O-4mHZpBXe.js → chunk-336JU56O-DcWl0MQo.js} +2 -2
  56. package/payload/server/public/assets/{chunk-426QAEUC-Cbv0vrN9.js → chunk-426QAEUC-BIW6kq6y.js} +1 -1
  57. package/payload/server/public/assets/{chunk-4TB4RGXK-BvLhId_2.js → chunk-4TB4RGXK-CdoHpV4X.js} +1 -1
  58. package/payload/server/public/assets/{chunk-5FUZZQ4R-bBafOTkw.js → chunk-5FUZZQ4R-bn_a4sfU.js} +1 -1
  59. package/payload/server/public/assets/{chunk-5PVQY5BW-B0NqBKVy.js → chunk-5PVQY5BW-C_Rq8j_M.js} +1 -1
  60. package/payload/server/public/assets/{chunk-EDXVE4YY-CFd4SqI6.js → chunk-EDXVE4YY-CWQvoVKV.js} +1 -1
  61. package/payload/server/public/assets/{chunk-ENJZ2VHE-ajf2sb6c.js → chunk-ENJZ2VHE-DBHn1kSk.js} +1 -1
  62. package/payload/server/public/assets/{chunk-ICPOFSXX-pWg6bug7.js → chunk-ICPOFSXX-SW2Qx11O.js} +1 -1
  63. package/payload/server/public/assets/{chunk-OYMX7WX6-OjEd-17c.js → chunk-OYMX7WX6-BvIG7tVW.js} +1 -1
  64. package/payload/server/public/assets/{chunk-U2HBQHQK-DbEFSPoh.js → chunk-U2HBQHQK-BiBUb0cF.js} +1 -1
  65. package/payload/server/public/assets/{chunk-X2U36JSP-COdNwrBb.js → chunk-X2U36JSP-Y0MKZCCh.js} +1 -1
  66. package/payload/server/public/assets/{chunk-YZCP3GAM-CHMWuY9B.js → chunk-YZCP3GAM-DKPh06GH.js} +1 -1
  67. package/payload/server/public/assets/{chunk-ZZ45TVLE-B-uDLQOB.js → chunk-ZZ45TVLE-C2WNo-fK.js} +1 -1
  68. package/payload/server/public/assets/classDiagram-6PBFFD2Q-Bohexn7P.js +1 -0
  69. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DVsmsAu7.js +1 -0
  70. package/payload/server/public/assets/clone-DUrXF4sO.js +1 -0
  71. package/payload/server/public/assets/{dagre-bhIG_KnW.js → dagre-CrK8E9ee.js} +1 -1
  72. package/payload/server/public/assets/{dagre-KV5264BT-CMEzmhIL.js → dagre-KV5264BT-_o6uXcH8.js} +1 -1
  73. package/payload/server/public/assets/data-j1WNhF8t.js +1 -0
  74. package/payload/server/public/assets/{device-url-actions-AcOyLSeF.js → device-url-actions-BcHerWqJ.js} +1 -1
  75. package/payload/server/public/assets/{diagram-5BDNPKRD-6RIoQhIL.js → diagram-5BDNPKRD-FFP9DKhc.js} +1 -1
  76. package/payload/server/public/assets/{diagram-G4DWMVQ6-BSp36TVv.js → diagram-G4DWMVQ6-DpwD1jBP.js} +1 -1
  77. package/payload/server/public/assets/{diagram-MMDJMWI5-D54fo52D.js → diagram-MMDJMWI5-C3K5agdK.js} +1 -1
  78. package/payload/server/public/assets/{diagram-TYMM5635-CWL8z-Pq.js → diagram-TYMM5635-CbeDipbC.js} +1 -1
  79. package/payload/server/public/assets/{erDiagram-SMLLAGMA-AnnHBo3z.js → erDiagram-SMLLAGMA-XBIFndNy.js} +1 -1
  80. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-laWmBl5o.js → flowDiagram-DWJPFMVM-BvEgySyn.js} +1 -1
  81. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-B94ko8ie.js → ganttDiagram-T4ZO3ILL-D7gIRKJf.js} +1 -1
  82. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-DxzL1fxZ.js → gitGraphDiagram-UUTBAWPF-vJu_hcri.js} +1 -1
  83. package/payload/server/public/assets/graph-C_f_9L_7.js +1 -0
  84. package/payload/server/public/assets/graph-labels-BSQJHlgf.js +1 -0
  85. package/payload/server/public/assets/{graphlib-CY-zIElM.js → graphlib-Dp0mN6JW.js} +1 -1
  86. package/payload/server/public/assets/{infoDiagram-42DDH7IO-BMTajIIr.js → infoDiagram-42DDH7IO-g4Dlc5Cr.js} +1 -1
  87. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-B_QauE5O.js → ishikawaDiagram-UXIWVN3A-D_45LXOe.js} +1 -1
  88. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-DmlqSIih.js → journeyDiagram-VCZTEJTY-CggbHl6N.js} +1 -1
  89. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-ZGDQT7xB.js → kanban-definition-6JOO6SKY-CysAe-Ab.js} +1 -1
  90. package/payload/server/public/assets/{line-D13opgep.js → line-BAxq_DSY.js} +1 -1
  91. package/payload/server/public/assets/{mermaid-parser.core-C650Sual.js → mermaid-parser.core-DbFuvkjL.js} +1 -1
  92. package/payload/server/public/assets/{mermaid.core-BqnQoXTp.js → mermaid.core-CehvJn5b.js} +3 -3
  93. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-BS_8y-tY.js → mindmap-definition-QFDTVHPH-DbPbBJ9h.js} +1 -1
  94. package/payload/server/public/assets/page-B0BPrSE3.js +1 -0
  95. package/payload/server/public/assets/{page-Dk73ZO1F.js → page-Co7KCRV8.js} +2 -2
  96. package/payload/server/public/assets/{pieDiagram-DEJITSTG-B5OmNvBO.js → pieDiagram-DEJITSTG-cagLL9ng.js} +1 -1
  97. package/payload/server/public/assets/{public-DDsYgotk.js → public-B6TEcDLx.js} +5 -5
  98. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-DTYITdNo.js → quadrantDiagram-34T5L4WZ-Keaa1jDh.js} +1 -1
  99. package/payload/server/public/assets/{requirementDiagram-MS252O5E-CRZWxH06.js → requirementDiagram-MS252O5E-BcYRyn5z.js} +1 -1
  100. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-DazRENhe.js → sankeyDiagram-XADWPNL6--fKoG9NR.js} +1 -1
  101. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-BcHTxmPy.js → sequenceDiagram-FGHM5R23-lKG36-Di.js} +1 -1
  102. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-DYU7nbqg.js → stateDiagram-FHFEXIEX-BuVsrlig.js} +1 -1
  103. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DSt88_xL.js +1 -0
  104. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-BKGmqkST.js → timeline-definition-GMOUNBTQ-D6X6uq17.js} +1 -1
  105. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-BXvLPmX7.js → vennDiagram-DHZGUBPP-BgvcfRVf.js} +1 -1
  106. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-BCclUa3Z.js → wardleyDiagram-NUSXRM2D-Cpd1xsrt.js} +1 -1
  107. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-C-Xp-Eoc.js → xychartDiagram-5P7HB3ND-CDF5ZVFv.js} +1 -1
  108. package/payload/server/public/data.html +5 -5
  109. package/payload/server/public/graph.html +6 -6
  110. package/payload/server/public/index.html +8 -8
  111. package/payload/server/public/public.html +5 -5
  112. package/payload/server/server.js +151 -362
  113. package/payload/platform/plugins/admin/hooks/onboarding-skill-drift.sh +0 -103
  114. package/payload/platform/plugins/admin/skills/onboarding/SKILL.md +0 -240
  115. package/payload/platform/services/claude-session-manager/scripts/onboarding-advance.sh +0 -61
  116. package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-0.md +0 -5
  117. package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-1.md +0 -3
  118. package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-2.md +0 -3
  119. package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-3.md +0 -8
  120. package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-4.md +0 -9
  121. package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-5.md +0 -3
  122. package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-6.md +0 -5
  123. package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-7.md +0 -5
  124. package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-8.md +0 -5
  125. package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-9.md +0 -8
  126. package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-complete.md +0 -3
  127. package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-unreachable.md +0 -3
  128. package/payload/server/public/assets/channel-PtVtoBEL.js +0 -1
  129. package/payload/server/public/assets/classDiagram-6PBFFD2Q-RVH_SEhY.js +0 -1
  130. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-Cm3rAb93.js +0 -1
  131. package/payload/server/public/assets/clone-BjY0Wzht.js +0 -1
  132. package/payload/server/public/assets/data-ll_OwVNL.js +0 -1
  133. package/payload/server/public/assets/graph-DJ2VWioQ.js +0 -1
  134. package/payload/server/public/assets/graph-labels-qhU8xZDH.js +0 -1
  135. package/payload/server/public/assets/page-DsYsdBUK.js +0 -1
  136. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BgljVtlp.js +0 -1
@@ -60,7 +60,7 @@ import {
60
60
  vncLog,
61
61
  waitForExit,
62
62
  walkPremiumBundles
63
- } from "./chunk-YPZFYTYP.js";
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-2MRZBQMH.js";
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-NL7QLVAD.js";
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 resolve23, join as join14, basename as basename5 } from "path";
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
- (resolve24) => setTimeout(() => resolve24("timeout"), timeoutMs)
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((resolve24, reject) => {
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
- resolve24();
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((resolve24, reject) => {
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
- resolve24(value);
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((resolve24) => {
2392
- release = resolve24;
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((resolve24) => {
3430
- const timer2 = setTimeout(resolve24, delay);
3427
+ await new Promise((resolve23) => {
3428
+ const timer2 = setTimeout(resolve23, delay);
3431
3429
  conn.abortController.signal.addEventListener("abort", () => {
3432
3430
  clearTimeout(timer2);
3433
- resolve24();
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((resolve24) => {
3439
+ return new Promise((resolve23) => {
3442
3440
  if (!conn.sock) {
3443
- resolve24();
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
- resolve24();
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((resolve24) => {
3713
- resolvePending = resolve24;
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((resolve24) => {
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
- resolve24(true);
4133
+ resolve23(true);
4136
4134
  });
4137
4135
  socket.once("error", () => {
4138
4136
  socket.destroy();
4139
- resolve24(false);
4137
+ resolve23(false);
4140
4138
  });
4141
4139
  socket.once("timeout", () => {
4142
4140
  socket.destroy();
4143
- resolve24(false);
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 resolve24;
5230
+ let resolve23;
5239
5231
  const turnPromise = new Promise((r) => {
5240
- resolve24 = r;
5232
+ resolve23 = r;
5241
5233
  });
5242
5234
  const listener = (text) => {
5243
- resolve24(text);
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((resolve24, reject) => {
5607
- resolveQr = resolve24;
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, mkdirSync as mkdirSync4, readFileSync as readFileSync10, unlinkSync as unlinkSync2 } from "fs";
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 resolve10, basename as basename3 } from "path";
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 ? resolve10(account.accountDir, "logs") : null;
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 = resolve10(dir, safe);
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(resolve10(dir, f)).mtimeMs })).sort((a, b) => b.mtime - a.mtime).forEach(({ name }) => {
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(resolve10(dir, name));
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 resolve11 } from "path";
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 = resolve11(ATTACHMENTS_ROOT, accountId, attachmentId);
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 = resolve11(dir, `${attachmentId}.meta.json`);
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 = resolve11(dir, dataFile);
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 resolve12 } from "path";
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 = resolve12(account.accountDir, "agents");
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 = resolve12(agentsDir, entry.name, "config.json");
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 = resolve12(account.accountDir, "agents", slug);
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 = resolve12(account.accountDir, "agents", slug);
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 mkdirSync5, createWriteStream } from "fs";
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
- mkdirSync5(dir, { recursive: true });
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 TAG20 = "[claude-session-manager:wrapper]";
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(`${TAG20} reject reason=no-account-id`);
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, accountId: senderId, onboarding, permissionMode })
8122
+ body: JSON.stringify({ senderId, role: "admin", channel, permissionMode })
8317
8123
  }).catch((err) => {
8318
- console.error(`${TAG20} fetch-failed op=spawn message=${err instanceof Error ? err.message : String(err)}`);
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 (onboardingAdvance && spawnedSessionId && scriptOutput && scriptOutput.trim()) {
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(`${TAG20} fetch-failed op=initial-input message=${err instanceof Error ? err.message : String(err)}`);
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(`${TAG20} fetch-failed op=list message=${err instanceof Error ? err.message : String(err)}`);
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(`${TAG20} fetch-failed op=resume message=${err instanceof Error ? err.message : String(err)}`);
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(`${TAG20} fetch-failed op=delete message=${err instanceof Error ? err.message : String(err)}`);
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(`${TAG20} fetch-failed op=archive message=${err instanceof Error ? err.message : String(err)}`);
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(`${TAG20} fetch-failed op=meta message=${err instanceof Error ? err.message : String(err)}`);
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(`${TAG20} fetch-failed op=patch message=${err instanceof Error ? err.message : String(err)}`);
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(`${TAG20} fetch-failed op=input message=${err instanceof Error ? err.message : String(err)}`);
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(`${TAG20} fetch-failed op=log message=${err instanceof Error ? err.message : String(err)}`);
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 TAG22 = "[device-url:click]";
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(`${TAG22} reject reason=body-not-json detail=${detail} browser=fallback navigateResult=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(`${TAG22} reject reason=missing-url intent=${JSON.stringify(intent)} browser=fallback navigateResult=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(`${TAG22} reject reason=url-malformed intent=${JSON.stringify(intent)} url=${url} browser=fallback navigateResult=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
- `${TAG22} reject reason=scheme-not-allowed scheme=${parsed.protocol} intent=${JSON.stringify(intent)} browser=fallback navigateResult=error`
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
- `${TAG22} intent=${JSON.stringify(intent)} browser=fallback navigateResult=cdp-unreachable hostname=${JSON.stringify(hostname2)}`
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
- `${TAG22} intent=${JSON.stringify(intent)} browser=${browser} navigateResult=${outcome.result} hostname=${JSON.stringify(hostname2)} targetId=${outcome.targetId ?? "none"}${detailStr}`
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 TAG22 = "[admin:events]";
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(`${TAG22} reject reason=body-not-json detail=${detail}`);
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(`${TAG22} reject reason=event-not-allowed event=${JSON.stringify(event)}`);
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 resolve14 } from "path";
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 mkdirSync6, readFileSync as readFileSync14, writeFileSync as writeFileSync9 } from "fs";
8741
- import { dirname as dirname4 } from "path";
8742
- import { resolve as resolve13 } from "path";
8743
- var ALIAS_DOMAINS_PATH = resolve13(MAXY_DIR, "alias-domains.json");
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
- mkdirSync6(dirname4(ALIAS_DOMAINS_PATH), { recursive: true });
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 mkdirSync7, statSync as statSync6 } from "fs";
8765
- import { dirname as dirname5 } from "path";
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
- mkdirSync7(dirname5(streamLogPath), { recursive: true });
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 resolve14(ACCOUNTS_DIR, accountId, "cloudflare-stream-logs", `${correlationId}.log`);
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 ?? resolve14(process.cwd(), "..");
9045
- const brandPath = resolve14(platformRoot, "config", "brand.json");
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 = resolve14(homedir4(), "list-cf-domains.sh");
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 = resolve14(homedir4(), brand.configDir, "cloudflared", "cert.pem");
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 dirname6, join as join12, resolve as resolve16, sep as sep3 } from "path";
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 resolve15, normalize, sep as sep2, relative } from "path";
9598
- var PLATFORM_ROOT6 = process.env.MAXY_PLATFORM_ROOT ?? resolve15(process.cwd(), "../platform");
9599
- var DATA_ROOT = resolve15(PLATFORM_ROOT6, "..", "data");
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 = resolve15(DATA_ROOT, cleaned);
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(join12(absDir, `${baseName}.meta.json`), "utf8");
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 = resolve16(DATA_ROOT, "accounts");
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 = resolve16(accountsDir, name, "account.json");
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(join12(absolute, entry.name), entry.name);
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 = join12(absolute, name);
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 = resolve16(DATA_ROOT, "uploads", accountId);
10162
- const destPath = resolve16(destDir, finalName);
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` ? join12(dirname6(absolute), `${stem}.meta.json`) : null;
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 resolve17, relative as relative2, isAbsolute } from "path";
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 = resolve17(ACCOUNTS_DIR, accountId);
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 = resolve17(ATTACHMENTS_ROOT, accountId);
11966
- const dir = resolve17(accountDir, attachmentId);
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(resolve17(dir, dataFile), "utf-8"), skipReason: null };
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 = resolve17(accountDir, "agents", "admin", filename);
11997
- const bundledPath = resolve17(PLATFORM_ROOT, "templates", "agents", "admin", filename);
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 = resolve17(accountDir, "specialists", "agents");
12012
- const bundledDir = resolve17(PLATFORM_ROOT, "templates", "specialists", "agents");
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 = resolve17(overrideDir, filename);
12016
- const bundledPath = resolve17(bundledDir, filename);
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 resolve18 } from "path";
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 = resolve18(ACCOUNTS_DIR, accountId);
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 = resolve18(accountDir, "agents", "admin");
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: resolve18(parent, filename) };
11955
+ return { kind: "admin-template", path: resolve17(parent, filename) };
12167
11956
  }
12168
11957
  if (UUID_RE5.test(id)) {
12169
- const dir = resolve18(ATTACHMENTS_ROOT, accountId, id);
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, resolve18(ATTACHMENTS_ROOT, accountId));
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: resolve18(dir, dataFile) };
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 resolve19 } from "path";
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 = resolve19(ATTACHMENTS_ROOT, accountId, id);
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(resolve19(dir, `${id}.meta.json`), "utf-8"));
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(resolve19(dir, dataFile));
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 resolve20, join as join13 } from "path";
12272
- var PLATFORM_ROOT7 = process.env.MAXY_PLATFORM_ROOT ?? resolve20(process.cwd(), "..");
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 = join13(PLATFORM_ROOT7, "config", "brand.json");
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 = resolve20(PLATFORM_ROOT7, `config/.${brandHostname}-version`);
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 resolve21 } from "path";
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 = resolve21(account.accountDir, "sites");
12428
- let filePath = segments.length === 0 ? rootDir : resolve21(rootDir, ...segments);
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 = resolve21(filePath, "index.html");
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 TAG21 = "[whatsapp-adaptor]";
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(`${TAG21} reject reason=reply-failed senderId=${input.senderId} message=${m}`);
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 resolve22 } from "path";
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 resolve22(brand.platformRoot, "lib", "entitlement", "rubytech-pubkey.pem");
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 = resolve22(brand.configDir, "entitlement.json");
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 PLATFORM_ROOT8 = process.env.MAXY_PLATFORM_ROOT || "";
12858
- var BRAND_JSON_PATH = PLATFORM_ROOT8 ? join14(PLATFORM_ROOT8, "config", "brand.json") : "";
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 = join14(homedir5(), BRAND.configDir, "alias-domains.json");
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 = resolve23(account.accountDir, "agents", slug, "assets", filename);
13259
- const expectedDir = resolve23(account.accountDir, "agents", slug, "assets");
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 = resolve23(account.accountDir, "generated", filename);
13289
- const expectedDir = resolve23(account.accountDir, "generated");
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 (!PLATFORM_ROOT8) return "unknown";
13330
- const versionFile = join14(PLATFORM_ROOT8, "config", `.${BRAND.hostname}-version`);
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(resolve23(process.cwd(), "public", file), "utf-8");
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 = join14(homedir5(), BRAND.configDir);
13178
+ const configDir2 = join13(homedir5(), BRAND.configDir);
13390
13179
  try {
13391
- const accountJsonPath = join14(configDir2, "account.json");
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 = join14(configDir2, "branding-cache", accountId, `${agentSlug}.json`);
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 = join14(homedir5(), BRAND.configDir);
13406
- const accountJsonPath = join14(configDir2, "account.json");
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(resolve23(process.cwd(), "public", "vnc-popout.html"), "utf-8");
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 = PLATFORM_ROOT8 ? resolve23(PLATFORM_ROOT8, "..", "docs", "desktop-code-controls.md") : resolve23(process.cwd(), "docs", "desktop-code-controls.md");
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-QVOGHKWV.js");
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: resolve23(process.env.MAXY_PLATFORM_ROOT ?? join14(__dirname, "..")),
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) {