@rubytech/create-maxy 1.0.643 → 1.0.644
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/payload/platform/lib/graph-mcp/dist/index.js +7 -1
- package/payload/platform/lib/graph-mcp/dist/index.js.map +1 -1
- package/payload/platform/lib/graph-mcp/src/index.ts +9 -1
- package/payload/platform/plugins/admin/mcp/dist/index.js +12 -1
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/mcp/dist/lib/neo4j.d.ts.map +1 -1
- package/payload/platform/plugins/admin/mcp/dist/lib/neo4j.js +7 -1
- package/payload/platform/plugins/admin/mcp/dist/lib/neo4j.js.map +1 -1
- package/payload/platform/plugins/contacts/mcp/dist/lib/neo4j.d.ts.map +1 -1
- package/payload/platform/plugins/contacts/mcp/dist/lib/neo4j.js +7 -1
- package/payload/platform/plugins/contacts/mcp/dist/lib/neo4j.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/neo4j.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/neo4j.js +7 -1
- package/payload/platform/plugins/email/mcp/dist/lib/neo4j.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/scripts/email-auto-respond.js +8 -1
- package/payload/platform/plugins/email/mcp/dist/scripts/email-auto-respond.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.js +7 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/neo4j.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/neo4j.js +7 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/neo4j.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +8 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
- package/payload/platform/plugins/tasks/mcp/dist/lib/neo4j.d.ts.map +1 -1
- package/payload/platform/plugins/tasks/mcp/dist/lib/neo4j.js +7 -1
- package/payload/platform/plugins/tasks/mcp/dist/lib/neo4j.js.map +1 -1
- package/payload/platform/plugins/telegram/mcp/dist/tools/message-history.d.ts.map +1 -1
- package/payload/platform/plugins/telegram/mcp/dist/tools/message-history.js +7 -1
- package/payload/platform/plugins/telegram/mcp/dist/tools/message-history.js.map +1 -1
- package/payload/platform/plugins/waitlist/mcp/dist/lib/neo4j.d.ts.map +1 -1
- package/payload/platform/plugins/waitlist/mcp/dist/lib/neo4j.js +7 -1
- package/payload/platform/plugins/waitlist/mcp/dist/lib/neo4j.js.map +1 -1
- package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-setup.d.ts.map +1 -1
- package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-setup.js +4 -7
- package/payload/platform/plugins/waitlist/mcp/dist/tools/waitlist-setup.js.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/lib/neo4j.d.ts.map +1 -1
- package/payload/platform/plugins/workflows/mcp/dist/lib/neo4j.js +7 -1
- package/payload/platform/plugins/workflows/mcp/dist/lib/neo4j.js.map +1 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.d.ts.map +1 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.js +7 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.js.map +1 -1
- package/payload/premium-plugins/real-agency/plugins/loop/mcp/src/lib/neo4j.ts +9 -1
- package/payload/server/public/assets/admin-k3A7-7ra.js +352 -0
- package/payload/server/public/assets/data-CrTM-LA6.js +1 -0
- package/payload/server/public/assets/{jsx-runtime-SjVUZj3J.js → jsx-runtime-57sjl-2n.js} +3 -3
- package/payload/server/public/assets/public-BjWvJQTw.js +5 -0
- package/payload/server/public/assets/share-2-CQp5pId4.js +1 -0
- package/payload/server/public/assets/useVoiceRecorder-BMxkndFD.js +36 -0
- package/payload/server/public/data.html +3 -3
- package/payload/server/public/index.html +4 -4
- package/payload/server/public/public.html +3 -3
- package/payload/server/server.js +114 -13
- package/payload/server/public/assets/admin-BTfeGAIg.js +0 -352
- package/payload/server/public/assets/data-DHhDRGaC.js +0 -1
- package/payload/server/public/assets/public-C-nsHZgC.js +0 -5
- package/payload/server/public/assets/search-BzKUsdMm.js +0 -1
- package/payload/server/public/assets/useVoiceRecorder-t2l8eU6m.js +0 -36
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<title>Maxy</title>
|
|
7
7
|
<link rel="icon" href="/favicon.ico">
|
|
8
|
-
<script type="module" crossorigin src="/assets/admin-
|
|
8
|
+
<script type="module" crossorigin src="/assets/admin-k3A7-7ra.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/chunk-lgnzUk6H.js">
|
|
10
|
-
<link rel="modulepreload" crossorigin href="/assets/jsx-runtime-
|
|
10
|
+
<link rel="modulepreload" crossorigin href="/assets/jsx-runtime-57sjl-2n.js">
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-DWTEM3RW.js">
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-
|
|
13
|
-
<link rel="modulepreload" crossorigin href="/assets/
|
|
12
|
+
<link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-BMxkndFD.js">
|
|
13
|
+
<link rel="modulepreload" crossorigin href="/assets/share-2-CQp5pId4.js">
|
|
14
14
|
<link rel="stylesheet" crossorigin href="/assets/jsx-runtime-BNLXzSN4.css">
|
|
15
15
|
<link rel="stylesheet" href="/brand-defaults.css">
|
|
16
16
|
</head>
|
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<title>Maxy</title>
|
|
7
7
|
<link rel="icon" href="/favicon.ico">
|
|
8
|
-
<script type="module" crossorigin src="/assets/public-
|
|
8
|
+
<script type="module" crossorigin src="/assets/public-BjWvJQTw.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/chunk-lgnzUk6H.js">
|
|
10
|
-
<link rel="modulepreload" crossorigin href="/assets/jsx-runtime-
|
|
10
|
+
<link rel="modulepreload" crossorigin href="/assets/jsx-runtime-57sjl-2n.js">
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-DWTEM3RW.js">
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-
|
|
12
|
+
<link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-BMxkndFD.js">
|
|
13
13
|
<link rel="stylesheet" crossorigin href="/assets/jsx-runtime-BNLXzSN4.css">
|
|
14
14
|
<link rel="stylesheet" href="/brand-defaults.css">
|
|
15
15
|
</head>
|
package/payload/server/server.js
CHANGED
|
@@ -3840,23 +3840,32 @@ var HOP_BY_HOP2 = /* @__PURE__ */ new Set([
|
|
|
3840
3840
|
"transfer-encoding",
|
|
3841
3841
|
"upgrade"
|
|
3842
3842
|
]);
|
|
3843
|
+
var cachedUpstreamPort = null;
|
|
3843
3844
|
function resolveUpstreamPort() {
|
|
3844
|
-
|
|
3845
|
+
if (cachedUpstreamPort !== null) return cachedUpstreamPort;
|
|
3846
|
+
const uri = process.env.NEO4J_URI;
|
|
3847
|
+
if (!uri) {
|
|
3848
|
+
throw new Error(
|
|
3849
|
+
"[ui/graph-proxy] NEO4J_URI unset \u2014 refusing to default to bolt://localhost:7687 (Task 580)"
|
|
3850
|
+
);
|
|
3851
|
+
}
|
|
3845
3852
|
const m = uri.match(/:(\d+)$/);
|
|
3846
3853
|
const boltPort = m ? parseInt(m[1], 10) : 7687;
|
|
3847
|
-
|
|
3854
|
+
cachedUpstreamPort = boltPort - 213;
|
|
3855
|
+
console.error(`[ui/graph-proxy] resolved neo4j_uri=${uri} http_port=${cachedUpstreamPort}`);
|
|
3856
|
+
return cachedUpstreamPort;
|
|
3848
3857
|
}
|
|
3849
3858
|
var UPSTREAM_HOST = "127.0.0.1";
|
|
3850
|
-
var UPSTREAM_PORT = resolveUpstreamPort();
|
|
3851
3859
|
function attachGraphHttpRoutes(app2) {
|
|
3852
3860
|
const handler = async (c) => {
|
|
3853
3861
|
const raw2 = c.req.raw;
|
|
3854
3862
|
const url = new URL(raw2.url);
|
|
3863
|
+
const upstreamPort = resolveUpstreamPort();
|
|
3855
3864
|
const pathAfterPrefix = url.pathname.slice(GRAPH_PREFIX.length) || "/";
|
|
3856
|
-
const upstreamUrl = `http://${UPSTREAM_HOST}:${
|
|
3865
|
+
const upstreamUrl = `http://${UPSTREAM_HOST}:${upstreamPort}${pathAfterPrefix}${url.search}`;
|
|
3857
3866
|
const upstreamHeaders = new Headers(raw2.headers);
|
|
3858
3867
|
for (const h of HOP_BY_HOP2) upstreamHeaders.delete(h);
|
|
3859
|
-
upstreamHeaders.set("host", `${UPSTREAM_HOST}:${
|
|
3868
|
+
upstreamHeaders.set("host", `${UPSTREAM_HOST}:${upstreamPort}`);
|
|
3860
3869
|
try {
|
|
3861
3870
|
const upstream = await fetch(upstreamUrl, {
|
|
3862
3871
|
method: raw2.method,
|
|
@@ -3869,6 +3878,11 @@ function attachGraphHttpRoutes(app2) {
|
|
|
3869
3878
|
});
|
|
3870
3879
|
const resHeaders = new Headers(upstream.headers);
|
|
3871
3880
|
for (const h of HOP_BY_HOP2) resHeaders.delete(h);
|
|
3881
|
+
const loc = resHeaders.get("location");
|
|
3882
|
+
if (loc) {
|
|
3883
|
+
const rewritten = rewriteLocation(loc);
|
|
3884
|
+
if (rewritten !== loc) resHeaders.set("location", rewritten);
|
|
3885
|
+
}
|
|
3872
3886
|
return new Response(upstream.body, {
|
|
3873
3887
|
status: upstream.status,
|
|
3874
3888
|
statusText: upstream.statusText,
|
|
@@ -3920,13 +3934,14 @@ function attachGraphWsProxy(server, opts) {
|
|
|
3920
3934
|
}
|
|
3921
3935
|
const rewrittenPath = pathname === GRAPH_PREFIX ? "/" : pathname.slice(GRAPH_PREFIX.length);
|
|
3922
3936
|
const rewrittenUrl = qsIndex === -1 ? rewrittenPath : rewrittenPath + url.slice(qsIndex);
|
|
3923
|
-
const
|
|
3937
|
+
const upstreamPort = resolveUpstreamPort();
|
|
3938
|
+
const upstream = createConnection2({ host: UPSTREAM_HOST, port: upstreamPort });
|
|
3924
3939
|
upstream.setTimeout(UPSTREAM_TIMEOUT_MS2);
|
|
3925
3940
|
upstream.once("connect", () => {
|
|
3926
3941
|
upstream.setTimeout(0);
|
|
3927
3942
|
const lines = [];
|
|
3928
3943
|
lines.push(`${req.method ?? "GET"} ${rewrittenUrl} HTTP/${req.httpVersion}`);
|
|
3929
|
-
lines.push(`host: ${UPSTREAM_HOST}:${
|
|
3944
|
+
lines.push(`host: ${UPSTREAM_HOST}:${upstreamPort}`);
|
|
3930
3945
|
for (const [name, value] of Object.entries(req.headers)) {
|
|
3931
3946
|
if (name === "host") continue;
|
|
3932
3947
|
if (HOP_BY_HOP2.has(name)) continue;
|
|
@@ -3998,6 +4013,21 @@ function headerString2(value) {
|
|
|
3998
4013
|
if (value == null) return void 0;
|
|
3999
4014
|
return Array.isArray(value) ? value[0] : value;
|
|
4000
4015
|
}
|
|
4016
|
+
function rewriteLocation(location) {
|
|
4017
|
+
try {
|
|
4018
|
+
const parsed = new URL(location);
|
|
4019
|
+
if (parsed.hostname === UPSTREAM_HOST && parsed.port === String(resolveUpstreamPort())) {
|
|
4020
|
+
const pathWithQuery = parsed.pathname + parsed.search + parsed.hash;
|
|
4021
|
+
return pathWithQuery.startsWith(GRAPH_PREFIX) ? pathWithQuery : `${GRAPH_PREFIX}${pathWithQuery}`;
|
|
4022
|
+
}
|
|
4023
|
+
return location;
|
|
4024
|
+
} catch {
|
|
4025
|
+
if (location.startsWith("/") && !location.startsWith(`${GRAPH_PREFIX}/`) && location !== GRAPH_PREFIX) {
|
|
4026
|
+
return `${GRAPH_PREFIX}${location}`;
|
|
4027
|
+
}
|
|
4028
|
+
return location;
|
|
4029
|
+
}
|
|
4030
|
+
}
|
|
4001
4031
|
function parseOriginHost2(origin) {
|
|
4002
4032
|
if (!origin) return null;
|
|
4003
4033
|
try {
|
|
@@ -4679,9 +4709,15 @@ function readPassword() {
|
|
|
4679
4709
|
}
|
|
4680
4710
|
function getDriver() {
|
|
4681
4711
|
if (!driver) {
|
|
4682
|
-
const uri = process.env.NEO4J_URI
|
|
4712
|
+
const uri = process.env.NEO4J_URI;
|
|
4713
|
+
if (!uri) {
|
|
4714
|
+
throw new Error(
|
|
4715
|
+
"[ui/neo4j-store] NEO4J_URI unset \u2014 refusing to default to bolt://localhost:7687 (Task 580)"
|
|
4716
|
+
);
|
|
4717
|
+
}
|
|
4683
4718
|
const user = process.env.NEO4J_USER ?? "neo4j";
|
|
4684
4719
|
const password = readPassword();
|
|
4720
|
+
console.error(`[ui/neo4j-store] resolved neo4j_uri=${uri}`);
|
|
4685
4721
|
driver = neo4j.driver(uri, neo4j.auth.basic(user, password), {
|
|
4686
4722
|
maxConnectionPoolSize: 5
|
|
4687
4723
|
});
|
|
@@ -7862,12 +7898,33 @@ function readBrandHostname() {
|
|
|
7862
7898
|
}
|
|
7863
7899
|
return cachedBrandHostname;
|
|
7864
7900
|
}
|
|
7901
|
+
function requireNeo4jUri() {
|
|
7902
|
+
const uri = process.env.NEO4J_URI;
|
|
7903
|
+
if (!uri) {
|
|
7904
|
+
throw new Error(
|
|
7905
|
+
"NEO4J_URI unset \u2014 refusing to default to bolt://localhost:7687. Set NEO4J_URI in the gateway's env (systemd EnvironmentFile or shell .env). (Task 580)"
|
|
7906
|
+
);
|
|
7907
|
+
}
|
|
7908
|
+
const brand = readBrandHostname();
|
|
7909
|
+
if (brand === "realagent" && /:7687([/?]|$)/.test(uri)) {
|
|
7910
|
+
throw new Error(
|
|
7911
|
+
`NEO4J_URI=${uri} points at :7687 on a realagent install \u2014 realagent owns :7688. This would silently write into Maxy's DB (Task 577 vector). (Task 580)`
|
|
7912
|
+
);
|
|
7913
|
+
}
|
|
7914
|
+
return uri;
|
|
7915
|
+
}
|
|
7865
7916
|
function getMcpServers(accountId, conversationId, userId, enabledPlugins) {
|
|
7866
7917
|
if (!conversationId) {
|
|
7867
7918
|
throw new Error(`getMcpServers: conversationId is required (accountId=${accountId.slice(0, 8)})`);
|
|
7868
7919
|
}
|
|
7869
7920
|
const { logDir: LOG_DIR2, streamLogPath: STREAM_LOG_PATH } = streamLogPathFor(accountId, conversationId);
|
|
7870
|
-
const baseEnv = {
|
|
7921
|
+
const baseEnv = {
|
|
7922
|
+
ACCOUNT_ID: accountId,
|
|
7923
|
+
PLATFORM_ROOT: PLATFORM_ROOT4,
|
|
7924
|
+
LOG_DIR: LOG_DIR2,
|
|
7925
|
+
STREAM_LOG_PATH,
|
|
7926
|
+
NEO4J_URI: requireNeo4jUri()
|
|
7927
|
+
};
|
|
7871
7928
|
const servers = {
|
|
7872
7929
|
"memory": {
|
|
7873
7930
|
command: "node",
|
|
@@ -7938,7 +7995,6 @@ function getMcpServers(accountId, conversationId, userId, enabledPlugins) {
|
|
|
7938
7995
|
env: {
|
|
7939
7996
|
...baseEnv,
|
|
7940
7997
|
BRAND: readBrandHostname(),
|
|
7941
|
-
NEO4J_URI: process.env.NEO4J_URI ?? "bolt://localhost:7687",
|
|
7942
7998
|
NEO4J_USERNAME: process.env.NEO4J_USERNAME ?? process.env.NEO4J_USER ?? "neo4j",
|
|
7943
7999
|
NEO4J_NAMESPACE: "maxy-graph",
|
|
7944
8000
|
NEO4J_READ_ONLY: "true",
|
|
@@ -15766,9 +15822,15 @@ function readPassword2() {
|
|
|
15766
15822
|
}
|
|
15767
15823
|
function getDriver2() {
|
|
15768
15824
|
if (!driver2) {
|
|
15769
|
-
const uri = process.env.NEO4J_URI
|
|
15825
|
+
const uri = process.env.NEO4J_URI;
|
|
15826
|
+
if (!uri) {
|
|
15827
|
+
throw new Error(
|
|
15828
|
+
"[ui/access-gate] NEO4J_URI unset \u2014 refusing to default to bolt://localhost:7687 (Task 580)"
|
|
15829
|
+
);
|
|
15830
|
+
}
|
|
15770
15831
|
const user = process.env.NEO4J_USER ?? "neo4j";
|
|
15771
15832
|
const password = readPassword2();
|
|
15833
|
+
console.error(`[ui/access-gate] resolved neo4j_uri=${uri}`);
|
|
15772
15834
|
driver2 = neo4j2.driver(uri, neo4j2.auth.basic(user, password), {
|
|
15773
15835
|
maxConnectionPoolSize: 5
|
|
15774
15836
|
});
|
|
@@ -19750,7 +19812,7 @@ async function POST33(req) {
|
|
|
19750
19812
|
}
|
|
19751
19813
|
|
|
19752
19814
|
// app/api/admin/files/route.ts
|
|
19753
|
-
import { readdir as readdir2, stat as stat4 } from "fs/promises";
|
|
19815
|
+
import { readdir as readdir2, readFile as readFile4, stat as stat4 } from "fs/promises";
|
|
19754
19816
|
import { join as join14 } from "path";
|
|
19755
19817
|
|
|
19756
19818
|
// app/lib/data-path.ts
|
|
@@ -19796,6 +19858,39 @@ function resolveDataPath(raw2) {
|
|
|
19796
19858
|
}
|
|
19797
19859
|
|
|
19798
19860
|
// app/api/admin/files/route.ts
|
|
19861
|
+
var UUID_RE2 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
19862
|
+
async function readMeta(absDir, baseName) {
|
|
19863
|
+
try {
|
|
19864
|
+
const raw2 = await readFile4(join14(absDir, `${baseName}.meta.json`), "utf8");
|
|
19865
|
+
const parsed = JSON.parse(raw2);
|
|
19866
|
+
if (typeof parsed?.filename === "string") {
|
|
19867
|
+
return { filename: parsed.filename, mimeType: typeof parsed.mimeType === "string" ? parsed.mimeType : void 0 };
|
|
19868
|
+
}
|
|
19869
|
+
} catch {
|
|
19870
|
+
}
|
|
19871
|
+
return null;
|
|
19872
|
+
}
|
|
19873
|
+
async function enrich(absolute, entry) {
|
|
19874
|
+
if (entry.kind === "directory" && UUID_RE2.test(entry.name)) {
|
|
19875
|
+
const meta = await readMeta(join14(absolute, entry.name), entry.name);
|
|
19876
|
+
if (meta?.filename) {
|
|
19877
|
+
entry.displayName = meta.filename;
|
|
19878
|
+
entry.mimeType = meta.mimeType;
|
|
19879
|
+
}
|
|
19880
|
+
return;
|
|
19881
|
+
}
|
|
19882
|
+
if (entry.kind === "file") {
|
|
19883
|
+
const dot = entry.name.lastIndexOf(".");
|
|
19884
|
+
const base = dot === -1 ? entry.name : entry.name.slice(0, dot);
|
|
19885
|
+
if (UUID_RE2.test(base)) {
|
|
19886
|
+
const meta = await readMeta(absolute, base);
|
|
19887
|
+
if (meta?.filename) {
|
|
19888
|
+
entry.displayName = meta.filename;
|
|
19889
|
+
entry.mimeType = meta.mimeType;
|
|
19890
|
+
}
|
|
19891
|
+
}
|
|
19892
|
+
}
|
|
19893
|
+
}
|
|
19799
19894
|
async function GET17(req) {
|
|
19800
19895
|
const url = new URL(req.url);
|
|
19801
19896
|
const sessionKey = url.searchParams.get("session_key");
|
|
@@ -19828,6 +19923,9 @@ async function GET17(req) {
|
|
|
19828
19923
|
const names = await readdir2(absolute);
|
|
19829
19924
|
const entries = [];
|
|
19830
19925
|
for (const name of names) {
|
|
19926
|
+
if (UUID_RE2.test(name.replace(/\.meta\.json$/, "")) && name.endsWith(".meta.json")) {
|
|
19927
|
+
continue;
|
|
19928
|
+
}
|
|
19831
19929
|
try {
|
|
19832
19930
|
const entryPath = join14(absolute, name);
|
|
19833
19931
|
const s = await stat4(entryPath);
|
|
@@ -19841,9 +19939,12 @@ async function GET17(req) {
|
|
|
19841
19939
|
entries.push({ name, kind: "other", sizeBytes: null, modifiedAt: (/* @__PURE__ */ new Date(0)).toISOString() });
|
|
19842
19940
|
}
|
|
19843
19941
|
}
|
|
19942
|
+
await Promise.all(entries.map((e) => enrich(absolute, e)));
|
|
19844
19943
|
entries.sort((a, b) => {
|
|
19845
19944
|
if (a.kind !== b.kind) return a.kind === "directory" ? -1 : 1;
|
|
19846
|
-
|
|
19945
|
+
const aKey = a.displayName ?? a.name;
|
|
19946
|
+
const bKey = b.displayName ?? b.name;
|
|
19947
|
+
return aKey.localeCompare(bKey);
|
|
19847
19948
|
});
|
|
19848
19949
|
console.error(`[data] file-list path="${relPath}" entries=${entries.length}`);
|
|
19849
19950
|
return Response.json({ path: relPath, entries });
|