@rubytech/create-realagent 1.0.775 → 1.0.791

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 (32) hide show
  1. package/dist/index.js +30 -39
  2. package/package.json +1 -1
  3. package/payload/platform/plugins/admin/mcp/dist/index.js +79 -6
  4. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  5. package/payload/platform/plugins/admin/skills/onboarding/SKILL.md +2 -0
  6. package/payload/platform/plugins/docs/references/troubleshooting.md +1 -1
  7. package/payload/platform/scripts/wifi-provision-server/server.js +157 -59
  8. package/payload/platform/scripts/wifi-provision.sh +88 -8
  9. package/payload/server/chunk-FEEKJZOY.js +9841 -0
  10. package/payload/server/chunk-H5F4S42X.js +9850 -0
  11. package/payload/server/maxy-edge.js +80 -24
  12. package/payload/server/public/assets/{Checkbox-C_KxaLc-.js → Checkbox-DHsoNPeM.js} +1 -1
  13. package/payload/server/public/assets/admin-gOk3qrFw.js +352 -0
  14. package/payload/server/public/assets/data-bIkywng-.js +1 -0
  15. package/payload/server/public/assets/graph-CT4W30GR.js +1 -0
  16. package/payload/server/public/assets/jsx-runtime-lOmSwjvd.css +1 -0
  17. package/payload/server/public/assets/{page-CjTfZ3O6.js → page-Cs2i--Z2.js} +18 -18
  18. package/payload/server/public/assets/{page-DEWgk_nR.js → page-DU8F3OGU.js} +1 -1
  19. package/payload/server/public/assets/{public-CehiL-qZ.js → public-Bn-gEWOv.js} +1 -1
  20. package/payload/server/public/assets/{share-2-BG1VXt3z.js → share-2-0IDKUUq9.js} +1 -1
  21. package/payload/server/public/assets/{useVoiceRecorder-1Dvb-yHn.js → useVoiceRecorder-B1S_t3Hq.js} +1 -1
  22. package/payload/server/public/data.html +5 -5
  23. package/payload/server/public/graph.html +6 -6
  24. package/payload/server/public/index.html +8 -8
  25. package/payload/server/public/public.html +5 -5
  26. package/payload/server/server.js +68 -74
  27. package/payload/platform/scripts/embed-backfill.sh +0 -382
  28. package/payload/server/public/assets/admin-xbKPR6ZI.js +0 -352
  29. package/payload/server/public/assets/data-D23IzpJ2.js +0 -1
  30. package/payload/server/public/assets/graph-D2AS9zFS.js +0 -1
  31. package/payload/server/public/assets/jsx-runtime-BZtBxBng.css +0 -1
  32. /package/payload/server/public/assets/{jsx-runtime-DrneHL3t.js → jsx-runtime-Br2bU3EJ.js} +0 -0
@@ -16,7 +16,7 @@ import {
16
16
  sanitizeClientCorrId,
17
17
  streamActionEvents,
18
18
  vncLog
19
- } from "./chunk-TM3EQSID.js";
19
+ } from "./chunk-H5F4S42X.js";
20
20
  import "./chunk-MIP54X7Q.js";
21
21
 
22
22
  // server/edge.ts
@@ -24,7 +24,7 @@ import { createServer, request as httpRequest } from "http";
24
24
  import { createConnection as createConnection2 } from "net";
25
25
  import { readFileSync as readFileSync4, existsSync as existsSync5, watchFile } from "fs";
26
26
  import { homedir } from "os";
27
- import { join as join3 } from "path";
27
+ import { join as join4 } from "path";
28
28
 
29
29
  // server/ws-proxy.ts
30
30
  import { createConnection } from "net";
@@ -668,14 +668,50 @@ function createEdgeAdminApp(opts) {
668
668
 
669
669
  // server/edge-fallback.ts
670
670
  import { existsSync as existsSync4, readFileSync as readFileSync3 } from "fs";
671
- var BRAND_DEFAULTS = { configDir: ".maxy", productName: "Maxy" };
672
- function loadBrand(path) {
673
- if (!path || !existsSync4(path)) return { ...BRAND_DEFAULTS };
671
+ import { extname, join as join3 } from "path";
672
+ var BRAND_DEFAULTS = {
673
+ configDir: ".maxy",
674
+ productName: "Maxy",
675
+ background: "#FAFAF8",
676
+ textColor: "#2A2A2A",
677
+ displayFont: "'Cormorant', Georgia, serif",
678
+ bodyFont: "'DM Sans', -apple-system, BlinkMacSystemFont, sans-serif",
679
+ logoContainsName: false,
680
+ logoDataUri: null
681
+ };
682
+ var MIME_BY_EXT = {
683
+ ".png": "image/png",
684
+ ".jpg": "image/jpeg",
685
+ ".jpeg": "image/jpeg",
686
+ ".svg": "image/svg+xml",
687
+ ".webp": "image/webp",
688
+ ".gif": "image/gif"
689
+ };
690
+ function inlineAsset(filePath) {
691
+ if (!existsSync4(filePath)) return null;
692
+ const mime = MIME_BY_EXT[extname(filePath).toLowerCase()];
693
+ if (!mime) return null;
694
+ const bytes = readFileSync3(filePath);
695
+ return `data:${mime};base64,${bytes.toString("base64")}`;
696
+ }
697
+ function readString(value, fallback) {
698
+ return typeof value === "string" && value.length > 0 ? value : fallback;
699
+ }
700
+ function loadBrand(brandJsonPath2, assetsDir = "") {
701
+ if (!brandJsonPath2 || !existsSync4(brandJsonPath2)) return { ...BRAND_DEFAULTS };
674
702
  try {
675
- const parsed = JSON.parse(readFileSync3(path, "utf-8"));
703
+ const parsed = JSON.parse(readFileSync3(brandJsonPath2, "utf-8"));
704
+ const logoFile = typeof parsed.assets?.logo === "string" ? parsed.assets.logo : null;
705
+ const logoDataUri = logoFile && assetsDir ? inlineAsset(join3(assetsDir, logoFile)) : null;
676
706
  return {
677
- configDir: typeof parsed.configDir === "string" ? parsed.configDir : BRAND_DEFAULTS.configDir,
678
- productName: typeof parsed.productName === "string" ? parsed.productName : BRAND_DEFAULTS.productName
707
+ configDir: readString(parsed.configDir, BRAND_DEFAULTS.configDir),
708
+ productName: readString(parsed.productName, BRAND_DEFAULTS.productName),
709
+ background: readString(parsed.defaultColors?.background, BRAND_DEFAULTS.background),
710
+ textColor: BRAND_DEFAULTS.textColor,
711
+ displayFont: readString(parsed.defaultFonts?.display, BRAND_DEFAULTS.displayFont),
712
+ bodyFont: readString(parsed.defaultFonts?.body, BRAND_DEFAULTS.bodyFont),
713
+ logoContainsName: parsed.logoContainsName === true,
714
+ logoDataUri
679
715
  };
680
716
  } catch (err) {
681
717
  console.error(`[edge] brand.json parse error: ${err.message}`);
@@ -689,40 +725,59 @@ var HTML_ESCAPES = { "<": "&lt;", ">": "&gt;", "&": "&amp;", '"': "&quot;", "'":
689
725
  function escapeHtml(s) {
690
726
  return String(s).replace(/[<>&"']/g, (c) => HTML_ESCAPES[c] ?? c);
691
727
  }
692
- function buildHoldingPage(productName) {
693
- const safeName = escapeHtml(productName);
728
+ function firstFontFamily(stack) {
729
+ const match = stack.match(/^\s*['"]([^'"]+)['"]/);
730
+ return match ? match[1] : null;
731
+ }
732
+ function googleFontsHref(displayFont, bodyFont) {
733
+ const families = [firstFontFamily(displayFont), firstFontFamily(bodyFont)].filter((f) => f !== null);
734
+ if (families.length === 0) return null;
735
+ const params = families.map((name) => `family=${encodeURIComponent(name)}:wght@400;500;600`).join("&");
736
+ return `https://fonts.googleapis.com/css2?${params}&display=swap`;
737
+ }
738
+ function buildHoldingPage(brand) {
739
+ const safeName = escapeHtml(brand.productName);
740
+ const fontsHref = googleFontsHref(brand.displayFont, brand.bodyFont);
741
+ const fontsLink = fontsHref ? `<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link rel="stylesheet" href="${escapeHtml(fontsHref)}">` : "";
742
+ const logoBlock = brand.logoDataUri ? `<img class="logo" src="${brand.logoDataUri}" alt="${safeName}">` : "";
743
+ const headline = brand.logoContainsName && brand.logoDataUri ? '<p class="sub">Starting</p>' : `<p class="name">${safeName} is starting</p>`;
694
744
  return `<!doctype html>
695
745
  <html lang="en">
696
746
  <head>
697
747
  <meta charset="utf-8">
698
748
  <meta name="viewport" content="width=device-width,initial-scale=1">
699
749
  <title>${safeName}</title>
750
+ ${fontsLink}
700
751
  <style>
701
752
  html, body { margin: 0; padding: 0; height: 100%; }
702
753
  body {
703
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
704
- background: #fafaf8;
705
- color: #2a2a2a;
754
+ font-family: ${brand.bodyFont};
755
+ background: ${brand.background};
756
+ color: ${brand.textColor};
706
757
  display: flex;
707
758
  align-items: center;
708
759
  justify-content: center;
709
760
  flex-direction: column;
761
+ gap: 1.25rem;
710
762
  }
711
- .name { font-size: 1.4rem; font-weight: 500; margin: 0 0 0.5rem; }
712
- .sub { font-size: 0.95rem; color: #888; margin: 0; }
763
+ .logo { display: block; max-width: 240px; max-height: 120px; width: auto; height: auto; }
764
+ .name { font-family: ${brand.displayFont}; font-size: 2rem; font-weight: 500; margin: 0; letter-spacing: -0.01em; }
765
+ .sub { font-family: ${brand.bodyFont}; font-size: 0.95rem; color: ${brand.textColor}; opacity: 0.55; margin: 0; letter-spacing: 0.04em; text-transform: uppercase; }
766
+ .dots { display: flex; gap: 6px; align-items: center; }
713
767
  .dot {
714
768
  display: inline-block; width: 6px; height: 6px; border-radius: 50%;
715
- background: currentColor; margin: 0 2px; opacity: 0.3;
769
+ background: currentColor; opacity: 0.3;
716
770
  animation: pulse 1.4s infinite ease-in-out;
717
771
  }
718
772
  .dot:nth-child(2) { animation-delay: 0.2s; }
719
773
  .dot:nth-child(3) { animation-delay: 0.4s; }
720
- @keyframes pulse { 0%, 80%, 100% { opacity: 0.3; } 40% { opacity: 1; } }
774
+ @keyframes pulse { 0%, 80%, 100% { opacity: 0.25; } 40% { opacity: 0.85; } }
721
775
  </style>
722
776
  </head>
723
777
  <body>
724
- <p class="name">${safeName} is starting</p>
725
- <p class="sub"><span class="dot"></span><span class="dot"></span><span class="dot"></span></p>
778
+ ${logoBlock}
779
+ ${headline}
780
+ <p class="dots"><span class="dot"></span><span class="dot"></span><span class="dot"></span></p>
726
781
  <script>
727
782
  (function () {
728
783
  var attempts = 0;
@@ -743,9 +798,10 @@ function buildHoldingPage(productName) {
743
798
 
744
799
  // server/edge.ts
745
800
  var PLATFORM_ROOT2 = process.env.MAXY_PLATFORM_ROOT || "";
746
- var BRAND_JSON_PATH = PLATFORM_ROOT2 ? join3(PLATFORM_ROOT2, "config", "brand.json") : "";
747
- var BRAND = loadBrand(BRAND_JSON_PATH);
748
- var ALIAS_DOMAINS_PATH = join3(homedir(), BRAND.configDir, "alias-domains.json");
801
+ var BRAND_JSON_PATH = PLATFORM_ROOT2 ? join4(PLATFORM_ROOT2, "config", "brand.json") : "";
802
+ var BRAND_ASSETS_DIR = PLATFORM_ROOT2 ? join4(PLATFORM_ROOT2, "..", "server", "public", "brand") : "";
803
+ var BRAND = loadBrand(BRAND_JSON_PATH, BRAND_ASSETS_DIR);
804
+ var ALIAS_DOMAINS_PATH = join4(homedir(), BRAND.configDir, "alias-domains.json");
749
805
  function loadAliasDomains() {
750
806
  try {
751
807
  if (!existsSync5(ALIAS_DOMAINS_PATH)) return /* @__PURE__ */ new Set();
@@ -814,7 +870,7 @@ function forwardHttp(clientReq, clientRes) {
814
870
  const isHtmlNavigation = errClass === "econnrefused-coldstart" && clientReq.method === "GET" && accept.includes("text/html");
815
871
  if (isHtmlNavigation) {
816
872
  clientRes.writeHead(200, { "content-type": "text/html; charset=utf-8", "cache-control": "no-store" });
817
- clientRes.end(buildHoldingPage(BRAND.productName));
873
+ clientRes.end(buildHoldingPage(BRAND));
818
874
  } else {
819
875
  clientRes.writeHead(502, { "content-type": "text/plain" });
820
876
  clientRes.end(`Bad Gateway (${BRAND.productName} unavailable)`);
@@ -904,7 +960,7 @@ server.on("upgrade", (req, socket, head) => {
904
960
  });
905
961
  server.listen(EDGE_PORT, EDGE_HOSTNAME, () => {
906
962
  console.log(`[edge] listening on http://${EDGE_HOSTNAME}:${EDGE_PORT}`);
907
- console.log(`[edge] brand=${BRAND.productName}`);
963
+ console.log(`[edge] brand=${BRAND.productName} holding-logo=${BRAND.logoDataUri ? "inlined" : "missing"} assets-dir=${BRAND_ASSETS_DIR || "(none)"}`);
908
964
  console.log(`[edge] /websockify \u2192 ${WEBSOCKIFY_HOST}:${WEBSOCKIFY_PORT}`);
909
965
  console.log(`[edge] everything else \u2192 ${UPSTREAM_HOST}:${UPSTREAM_PORT}`);
910
966
  });
@@ -1 +1 @@
1
- import{t as e}from"./jsx-runtime-DrneHL3t.js";var t=e();function n({checked:e,onChange:n,label:r,disabled:i}){return(0,t.jsxs)(`label`,{className:`maxy-checkbox${i?` maxy-checkbox--disabled`:``}`,children:[(0,t.jsx)(`input`,{type:`checkbox`,checked:e,onChange:e=>n(e.target.checked),disabled:i}),(0,t.jsx)(`span`,{className:`maxy-checkbox__box`,children:`✱`}),r&&(0,t.jsx)(`span`,{className:`maxy-checkbox__label`,children:r})]})}export{n as t};
1
+ import{t as e}from"./jsx-runtime-Br2bU3EJ.js";var t=e();function n({checked:e,onChange:n,label:r,disabled:i}){return(0,t.jsxs)(`label`,{className:`maxy-checkbox${i?` maxy-checkbox--disabled`:``}`,children:[(0,t.jsx)(`input`,{type:`checkbox`,checked:e,onChange:e=>n(e.target.checked),disabled:i}),(0,t.jsx)(`span`,{className:`maxy-checkbox__box`,children:`✱`}),r&&(0,t.jsx)(`span`,{className:`maxy-checkbox__label`,children:r})]})}export{n as t};