@truefoundry/trueforge-ui 0.3.0-rc.2 → 0.3.0-rc.3
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/CHANGELOG.md +50 -0
- package/README.md +17 -9
- package/dist/{AgentCodeSnippets-637HQUXD.js → AgentCodeSnippets-N546FNNS.js} +38 -23
- package/dist/AgentCodeSnippets-N546FNNS.js.map +1 -0
- package/dist/AgentMetricChart-YWJYVYYA.js +15 -0
- package/dist/{AgentOverview-3FJ5EE6N.js → AgentOverview-VF74XC7I.js} +7 -7
- package/dist/{AgentSessionEventTimeline-VELWUYPR.js → AgentSessionEventTimeline-RFR6LQMY.js} +8 -8
- package/dist/{AgentSessionEventTimeline-VELWUYPR.js.map → AgentSessionEventTimeline-RFR6LQMY.js.map} +1 -1
- package/dist/{AgentSessionEventTimelineChart-CUKETHWM.js → AgentSessionEventTimelineChart-27CQF6FX.js} +12 -12
- package/dist/AgentSessionEventTimelineChart-27CQF6FX.js.map +1 -0
- package/dist/{AgentSessions-T7MOGOTZ.js → AgentSessions-4IVX2SGD.js} +36 -12
- package/dist/AgentSessions-4IVX2SGD.js.map +1 -0
- package/dist/{ConnectorSettings-ESZ2RSRG.js → ConnectorSettings-R5VEP7BO.js} +156 -116
- package/dist/ConnectorSettings-R5VEP7BO.js.map +1 -0
- package/dist/{DockLayout-NLFNU6F2.js → DockLayout-F44RWGEY.js} +10 -10
- package/dist/{DrawerLayout-PR3SMKA6.js → DrawerLayout-SQ323AVM.js} +13 -11
- package/dist/DrawerLayout-SQ323AVM.js.map +1 -0
- package/dist/{ModelSettings-LYW64IRR.js → ModelSettings-6QLS63HM.js} +10 -10
- package/dist/{ModelSettings-LYW64IRR.js.map → ModelSettings-6QLS63HM.js.map} +1 -1
- package/dist/OpenUiFenceBlock-4ROX3G4X.js +9 -0
- package/dist/{SandboxSettings-DF64LHYI.js → SandboxSettings-OLKDXIQS.js} +9 -9
- package/dist/SchedulesPage-TMOTK6DR.js +15 -0
- package/dist/{SettingsBuilder-LSXK2VN4.js → SettingsBuilder-GISAH2WU.js} +8 -8
- package/dist/{ShellRouteSync-B22IAV2W.js → ShellRouteSync-EN33DUQ7.js} +157 -22
- package/dist/ShellRouteSync-EN33DUQ7.js.map +1 -0
- package/dist/{SidebarLayout-XW6LXB7R.js → SidebarLayout-35K4AKTC.js} +74 -53
- package/dist/SidebarLayout-35K4AKTC.js.map +1 -0
- package/dist/{SkillSettings-64VXUO6J.js → SkillSettings-JSX2BTII.js} +18 -13
- package/dist/SkillSettings-JSX2BTII.js.map +1 -0
- package/dist/{TrueForgeUIWithRouter-3TSLV22Q.js → TrueForgeUIWithRouter-6VCR7ES3.js} +9 -9
- package/dist/{WidgetLayout-Q5P7PYSJ.js → WidgetLayout-RKBSN2FZ.js} +10 -10
- package/dist/{chunk-YQO2NMJ3.js → chunk-2O5EJ6QS.js} +4096 -2825
- package/dist/chunk-2O5EJ6QS.js.map +1 -0
- package/dist/chunk-6WCIL3H2.js +517 -0
- package/dist/chunk-6WCIL3H2.js.map +1 -0
- package/dist/{chunk-SQGT43Z3.js → chunk-73FQVITT.js} +21 -4
- package/dist/chunk-73FQVITT.js.map +1 -0
- package/dist/{chunk-QC42MLAK.js → chunk-7AAO4UDQ.js} +4 -3
- package/dist/chunk-7AAO4UDQ.js.map +1 -0
- package/dist/{chunk-LGRHHFHN.js → chunk-F5QVQIBH.js} +166 -45
- package/dist/chunk-F5QVQIBH.js.map +1 -0
- package/dist/{chunk-I3AL54MA.js → chunk-GIPFF6FZ.js} +28 -24
- package/dist/chunk-GIPFF6FZ.js.map +1 -0
- package/dist/{chunk-GXYAOAK5.js → chunk-GSJAYYLR.js} +219 -162
- package/dist/chunk-GSJAYYLR.js.map +1 -0
- package/dist/{chunk-VJ7BZGAF.js → chunk-J5BPHEDT.js} +2 -2
- package/dist/chunk-KR7WYHVF.js +195 -0
- package/dist/chunk-KR7WYHVF.js.map +1 -0
- package/dist/{chunk-VUMGMGKZ.js → chunk-LUG7E6BL.js} +52 -8
- package/dist/chunk-LUG7E6BL.js.map +1 -0
- package/dist/chunk-LXJMINS6.js +587 -0
- package/dist/chunk-LXJMINS6.js.map +1 -0
- package/dist/{chunk-FQK2XVVE.js → chunk-PT4EENB3.js} +224 -72
- package/dist/chunk-PT4EENB3.js.map +1 -0
- package/dist/{chunk-H6WTY5PM.js → chunk-Q6TCT7ZJ.js} +17 -227
- package/dist/chunk-Q6TCT7ZJ.js.map +1 -0
- package/dist/{chunk-5I2COQNL.js → chunk-XLFOXQKZ.js} +13 -11
- package/dist/chunk-XLFOXQKZ.js.map +1 -0
- package/dist/{chunk-G2TUAD65.js → chunk-XY6LZQES.js} +235 -108
- package/dist/chunk-XY6LZQES.js.map +1 -0
- package/dist/{createTrueFoundryServer-CmZnBh_l.d.ts → createTrueFoundryServer-B_FYhSdn.d.ts} +8 -5
- package/dist/index.d.ts +291 -89
- package/dist/index.js +63 -488
- package/dist/index.js.map +1 -1
- package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +36 -13
- package/dist/plugins/trueforge-agent-server-adapter/index.js +69 -35
- package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +3 -3
- package/dist/AgentCodeSnippets-637HQUXD.js.map +0 -1
- package/dist/AgentMetricChart-4FYECRIN.js +0 -15
- package/dist/AgentSessionEventTimelineChart-CUKETHWM.js.map +0 -1
- package/dist/AgentSessions-T7MOGOTZ.js.map +0 -1
- package/dist/ConnectorSettings-ESZ2RSRG.js.map +0 -1
- package/dist/DrawerLayout-PR3SMKA6.js.map +0 -1
- package/dist/OpenUiFenceBlock-JEPNPJ7U.js +0 -9
- package/dist/SchedulesPage-WQU4H25F.js +0 -15
- package/dist/ShellRouteSync-B22IAV2W.js.map +0 -1
- package/dist/SidebarLayout-XW6LXB7R.js.map +0 -1
- package/dist/SkillSettings-64VXUO6J.js.map +0 -1
- package/dist/chunk-5I2COQNL.js.map +0 -1
- package/dist/chunk-BWHOZFIV.js +0 -587
- package/dist/chunk-BWHOZFIV.js.map +0 -1
- package/dist/chunk-FQK2XVVE.js.map +0 -1
- package/dist/chunk-G2TUAD65.js.map +0 -1
- package/dist/chunk-GXYAOAK5.js.map +0 -1
- package/dist/chunk-H6WTY5PM.js.map +0 -1
- package/dist/chunk-I3AL54MA.js.map +0 -1
- package/dist/chunk-LGRHHFHN.js.map +0 -1
- package/dist/chunk-NHHSZB5N.js +0 -74
- package/dist/chunk-NHHSZB5N.js.map +0 -1
- package/dist/chunk-QC42MLAK.js.map +0 -1
- package/dist/chunk-SFZNIO6U.js +0 -18
- package/dist/chunk-SFZNIO6U.js.map +0 -1
- package/dist/chunk-SQGT43Z3.js.map +0 -1
- package/dist/chunk-VUMGMGKZ.js.map +0 -1
- package/dist/chunk-YQO2NMJ3.js.map +0 -1
- /package/dist/{AgentMetricChart-4FYECRIN.js.map → AgentMetricChart-YWJYVYYA.js.map} +0 -0
- /package/dist/{AgentOverview-3FJ5EE6N.js.map → AgentOverview-VF74XC7I.js.map} +0 -0
- /package/dist/{DockLayout-NLFNU6F2.js.map → DockLayout-F44RWGEY.js.map} +0 -0
- /package/dist/{OpenUiFenceBlock-JEPNPJ7U.js.map → OpenUiFenceBlock-4ROX3G4X.js.map} +0 -0
- /package/dist/{SandboxSettings-DF64LHYI.js.map → SandboxSettings-OLKDXIQS.js.map} +0 -0
- /package/dist/{SchedulesPage-WQU4H25F.js.map → SchedulesPage-TMOTK6DR.js.map} +0 -0
- /package/dist/{SettingsBuilder-LSXK2VN4.js.map → SettingsBuilder-GISAH2WU.js.map} +0 -0
- /package/dist/{TrueForgeUIWithRouter-3TSLV22Q.js.map → TrueForgeUIWithRouter-6VCR7ES3.js.map} +0 -0
- /package/dist/{WidgetLayout-Q5P7PYSJ.js.map → WidgetLayout-RKBSN2FZ.js.map} +0 -0
- /package/dist/{chunk-VJ7BZGAF.js.map → chunk-J5BPHEDT.js.map} +0 -0
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
|
-
clearScheduleShareSearch
|
|
3
|
-
|
|
2
|
+
clearScheduleShareSearch,
|
|
3
|
+
readScheduleShareSearch,
|
|
4
|
+
writeScheduleShareSearch
|
|
5
|
+
} from "./chunk-KR7WYHVF.js";
|
|
4
6
|
import {
|
|
5
7
|
readSessionShareSearch,
|
|
6
8
|
writeSessionShareSearch
|
|
7
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-PT4EENB3.js";
|
|
8
10
|
|
|
9
11
|
// src/routing/paths.ts
|
|
10
12
|
var DEFAULTS = {
|
|
@@ -13,6 +15,7 @@ var DEFAULTS = {
|
|
|
13
15
|
library: "/library",
|
|
14
16
|
libraryAgent: "/library/:agentId",
|
|
15
17
|
schedules: "/schedules",
|
|
18
|
+
buildAgent: "/build-agent",
|
|
16
19
|
agent: "/agents/:agentName",
|
|
17
20
|
session: "/sessions/:sessionId",
|
|
18
21
|
sessionsBrowser: "/sessions"
|
|
@@ -35,6 +38,7 @@ function resolveRoutesConfig(routes) {
|
|
|
35
38
|
library: resolveOptional(paths?.library, DEFAULTS.library),
|
|
36
39
|
libraryAgent: resolveOptional(paths?.libraryAgent, DEFAULTS.libraryAgent),
|
|
37
40
|
schedules: resolveOptional(paths?.schedules, DEFAULTS.schedules),
|
|
41
|
+
buildAgent: resolveOptional(paths?.buildAgent, DEFAULTS.buildAgent),
|
|
38
42
|
agent: resolveOptional(paths?.agent, DEFAULTS.agent),
|
|
39
43
|
session: resolveOptional(paths?.session, DEFAULTS.session),
|
|
40
44
|
sessionsBrowser: resolveOptional(paths?.sessionsBrowser, DEFAULTS.sessionsBrowser)
|
|
@@ -58,6 +62,8 @@ function buildPath(place, routes) {
|
|
|
58
62
|
return routes.libraryAgent == null ? null : fillTemplate(routes.libraryAgent, place.agentId);
|
|
59
63
|
case "schedules":
|
|
60
64
|
return routes.schedules;
|
|
65
|
+
case "buildAgent":
|
|
66
|
+
return routes.buildAgent;
|
|
61
67
|
case "agent":
|
|
62
68
|
return routes.agent == null ? null : fillTemplate(routes.agent, place.agentName);
|
|
63
69
|
case "session":
|
|
@@ -88,12 +94,20 @@ function sanitizeSearchForPlace(place, search) {
|
|
|
88
94
|
clearScheduleShareSearch(params);
|
|
89
95
|
} else if (place.type === "libraryAgent") {
|
|
90
96
|
const share = readSessionShareSearch(search);
|
|
97
|
+
const scheduleShare = readScheduleShareSearch(search);
|
|
91
98
|
writeSessionShareSearch(params, {
|
|
92
99
|
view: null,
|
|
93
100
|
timeRange: null,
|
|
94
101
|
...share.sessionId != null && share.agentId !== place.agentId ? { sessionId: null, agentId: null } : {}
|
|
95
102
|
});
|
|
96
103
|
clearScheduleShareSearch(params);
|
|
104
|
+
if (share.tab === "schedules") {
|
|
105
|
+
writeScheduleShareSearch(params, {
|
|
106
|
+
status: scheduleShare.status,
|
|
107
|
+
q: scheduleShare.q,
|
|
108
|
+
isNew: scheduleShare.isNew
|
|
109
|
+
});
|
|
110
|
+
}
|
|
97
111
|
} else if (place.type === "schedules") {
|
|
98
112
|
writeSessionShareSearch(params, {
|
|
99
113
|
sessionId: null,
|
|
@@ -158,6 +172,9 @@ function matchPath(pathname, routes) {
|
|
|
158
172
|
if (routes.schedules != null && normalized === routes.schedules) {
|
|
159
173
|
return { type: "schedules" };
|
|
160
174
|
}
|
|
175
|
+
if (routes.buildAgent != null && normalized === routes.buildAgent) {
|
|
176
|
+
return { type: "buildAgent" };
|
|
177
|
+
}
|
|
161
178
|
if (routes.agent != null) {
|
|
162
179
|
const agentName = matchTemplate(routes.agent, segments);
|
|
163
180
|
if (agentName != null) return { type: "agent", agentName };
|
|
@@ -197,4 +214,4 @@ export {
|
|
|
197
214
|
matchLocation,
|
|
198
215
|
placesEqual
|
|
199
216
|
};
|
|
200
|
-
//# sourceMappingURL=chunk-
|
|
217
|
+
//# sourceMappingURL=chunk-73FQVITT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/routing/paths.ts"],"sourcesContent":["import {\n clearScheduleShareSearch,\n readScheduleShareSearch,\n writeScheduleShareSearch,\n} from '../utils/scheduleShareUrl.js';\nimport { readSessionShareSearch, writeSessionShareSearch } from '../utils/sessionShareUrl.js';\nimport type { ResolvedRoutes, RoutePlace, RoutesConfig } from './types.js';\n\nconst DEFAULTS = {\n root: '/',\n settings: '/settings',\n library: '/library',\n libraryAgent: '/library/:agentId',\n schedules: '/schedules',\n buildAgent: '/build-agent',\n agent: '/agents/:agentName',\n session: '/sessions/:sessionId',\n sessionsBrowser: '/sessions',\n} as const;\n\nfunction normalizePath(path: string): string {\n const trimmed = path.trim();\n const withLead = trimmed.startsWith('/') ? trimmed : `/${trimmed}`;\n // Drop a trailing slash except for the root itself.\n return withLead.length > 1 && withLead.endsWith('/') ? withLead.slice(0, -1) : withLead;\n}\n\nfunction resolveOptional(value: string | false | undefined, fallback: string): string | null {\n if (value === false) return null;\n return normalizePath(value ?? fallback);\n}\n\nexport function resolveRoutesConfig(routes?: RoutesConfig): ResolvedRoutes {\n const paths = routes?.paths;\n return {\n basename: routes?.basename ?? '',\n root: normalizePath(paths?.root ?? DEFAULTS.root),\n settings: resolveOptional(paths?.settings, DEFAULTS.settings),\n library: resolveOptional(paths?.library, DEFAULTS.library),\n libraryAgent: resolveOptional(paths?.libraryAgent, DEFAULTS.libraryAgent),\n schedules: resolveOptional(paths?.schedules, DEFAULTS.schedules),\n buildAgent: resolveOptional(paths?.buildAgent, DEFAULTS.buildAgent),\n agent: resolveOptional(paths?.agent, DEFAULTS.agent),\n session: resolveOptional(paths?.session, DEFAULTS.session),\n sessionsBrowser: resolveOptional(paths?.sessionsBrowser, DEFAULTS.sessionsBrowser),\n };\n}\n\nfunction splitSegments(path: string): string[] {\n return path.split('/').filter(segment => segment.length > 0);\n}\n\n/** Fill a single-param template (`/agents/:agentName`) with an encoded value. */\nfunction fillTemplate(template: string, value: string): string {\n return (\n '/' +\n splitSegments(template)\n .map(segment => (segment.startsWith(':') ? encodeURIComponent(value) : segment))\n .join('/')\n );\n}\n\n/** Build the URL path for a place, or `null` when that place has no configured route. */\nexport function buildPath(place: RoutePlace, routes: ResolvedRoutes): string | null {\n switch (place.type) {\n case 'root':\n return routes.root;\n case 'settings':\n return routes.settings;\n case 'library':\n return routes.library;\n case 'libraryAgent':\n return routes.libraryAgent == null ? null : fillTemplate(routes.libraryAgent, place.agentId);\n case 'schedules':\n return routes.schedules;\n case 'buildAgent':\n return routes.buildAgent;\n case 'agent':\n return routes.agent == null ? null : fillTemplate(routes.agent, place.agentName);\n case 'session':\n return routes.session == null ? null : fillTemplate(routes.session, place.sessionId);\n case 'sessionsBrowser':\n return routes.sessionsBrowser;\n }\n}\n\n/**\n * Absolute href that boots the shell on a history session (`/sessions/:id`).\n * Includes `routes.basename` and clears place-owned share query keys.\n */\nexport function buildSessionResumeHref({\n sessionId,\n routes,\n href = typeof window === 'undefined' ? 'http://localhost/' : window.location.href,\n}: {\n sessionId: string;\n routes: ResolvedRoutes;\n href?: string;\n}): string | null {\n const sessionPath = buildPath({ type: 'session', sessionId }, routes);\n if (sessionPath == null) return null;\n const url = new URL(href);\n const basename = routes.basename.endsWith('/') ? routes.basename.slice(0, -1) : routes.basename;\n url.pathname = `${basename}${sessionPath}` || '/';\n url.search = sanitizeSearchForPlace({ type: 'session', sessionId }, url.search);\n url.hash = '';\n return url.toString();\n}\n\n/**\n * Remove query state owned by a different shell place while preserving host\n * parameters. Settings is an overlay, so it retains the underlying place state.\n */\nexport function sanitizeSearchForPlace(place: RoutePlace, search: string): string {\n if (place.type === 'settings') return search;\n\n const params = new URLSearchParams(search.startsWith('?') ? search.slice(1) : search);\n if (place.type === 'sessionsBrowser') {\n writeSessionShareSearch(params, { tab: null });\n clearScheduleShareSearch(params);\n } else if (place.type === 'libraryAgent') {\n const share = readSessionShareSearch(search);\n const scheduleShare = readScheduleShareSearch(search);\n writeSessionShareSearch(params, {\n view: null,\n timeRange: null,\n ...(share.sessionId != null && share.agentId !== place.agentId ? { sessionId: null, agentId: null } : {}),\n });\n clearScheduleShareSearch(params);\n if (share.tab === 'schedules') {\n writeScheduleShareSearch(params, {\n status: scheduleShare.status,\n q: scheduleShare.q,\n isNew: scheduleShare.isNew,\n });\n }\n } else if (place.type === 'schedules') {\n writeSessionShareSearch(params, {\n sessionId: null,\n agentId: null,\n tab: null,\n view: null,\n timeRange: null,\n });\n // Keep `agent` / `status` / `q` — owned by the schedules place.\n } else {\n writeSessionShareSearch(params, {\n sessionId: null,\n agentId: null,\n tab: null,\n view: null,\n timeRange: null,\n });\n clearScheduleShareSearch(params);\n }\n const next = params.toString();\n return next.length > 0 ? `?${next}` : '';\n}\n\n/** Percent-decode a segment; `null` when the URL carries a malformed escape. */\nfunction decodeSegment(segment: string): string | null {\n try {\n return decodeURIComponent(segment);\n } catch {\n return null;\n }\n}\n\n/** Match a single-param template against concrete segments; returns the decoded param or null. */\nfunction matchTemplate(template: string, segments: string[]): string | null {\n const templateSegments = splitSegments(template);\n if (templateSegments.length !== segments.length) return null;\n let param: string | null = null;\n for (const [i, tpl] of templateSegments.entries()) {\n const seg = segments[i];\n if (seg === undefined) return null;\n if (tpl.startsWith(':')) {\n // A malformed escape is an unusable id, so the path simply does not match.\n const decoded = decodeSegment(seg);\n if (decoded == null) return null;\n param = decoded;\n } else if (tpl !== seg) {\n return null;\n }\n }\n return param;\n}\n\n/** Parse a (basename-relative) pathname into a place, or `null` when unrecognized. */\nexport function matchPath(pathname: string, routes: ResolvedRoutes): RoutePlace | null {\n const normalized = normalizePath(pathname);\n const segments = splitSegments(normalized);\n\n if (routes.settings != null && normalized === routes.settings) {\n return { type: 'settings' };\n }\n if (routes.library != null && normalized === routes.library) {\n return { type: 'library' };\n }\n if (routes.sessionsBrowser != null && normalized === routes.sessionsBrowser) {\n return { type: 'sessionsBrowser' };\n }\n if (routes.libraryAgent != null) {\n const agentId = matchTemplate(routes.libraryAgent, segments);\n if (agentId != null) return { type: 'libraryAgent', agentId };\n }\n if (routes.schedules != null && normalized === routes.schedules) {\n return { type: 'schedules' };\n }\n if (routes.buildAgent != null && normalized === routes.buildAgent) {\n return { type: 'buildAgent' };\n }\n if (routes.agent != null) {\n const agentName = matchTemplate(routes.agent, segments);\n if (agentName != null) return { type: 'agent', agentName };\n }\n if (routes.session != null) {\n const sessionId = matchTemplate(routes.session, segments);\n if (sessionId != null) return { type: 'session', sessionId };\n }\n if (normalized === routes.root) {\n return { type: 'root' };\n }\n return null;\n}\n\n/** Pathname place, or library agent from `?agentId=` when the path is root. */\nexport function matchLocation({\n pathname,\n search,\n routes,\n}: {\n pathname: string;\n search: string;\n routes: ResolvedRoutes;\n}): RoutePlace | null {\n const matched = matchPath(pathname, routes);\n if (matched == null || matched.type !== 'root') return matched;\n const { agentId } = readSessionShareSearch(search);\n return agentId != null ? { type: 'libraryAgent', agentId } : matched;\n}\n\nexport function placesEqual(a: RoutePlace, b: RoutePlace): boolean {\n if (a.type !== b.type) return false;\n if (a.type === 'agent' && b.type === 'agent') return a.agentName === b.agentName;\n if (a.type === 'libraryAgent' && b.type === 'libraryAgent') return a.agentId === b.agentId;\n if (a.type === 'session' && b.type === 'session') return a.sessionId === b.sessionId;\n return true;\n}\n"],"mappings":";;;;;;;;;;;AAQA,IAAM,WAAW;AAAA,EACf,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AAAA,EACT,cAAc;AAAA,EACd,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,SAAS;AAAA,EACT,iBAAiB;AACnB;AAEA,SAAS,cAAc,MAAsB;AAC3C,QAAM,UAAU,KAAK,KAAK;AAC1B,QAAM,WAAW,QAAQ,WAAW,GAAG,IAAI,UAAU,IAAI,OAAO;AAEhE,SAAO,SAAS,SAAS,KAAK,SAAS,SAAS,GAAG,IAAI,SAAS,MAAM,GAAG,EAAE,IAAI;AACjF;AAEA,SAAS,gBAAgB,OAAmC,UAAiC;AAC3F,MAAI,UAAU,MAAO,QAAO;AAC5B,SAAO,cAAc,SAAS,QAAQ;AACxC;AAEO,SAAS,oBAAoB,QAAuC;AACzE,QAAM,QAAQ,QAAQ;AACtB,SAAO;AAAA,IACL,UAAU,QAAQ,YAAY;AAAA,IAC9B,MAAM,cAAc,OAAO,QAAQ,SAAS,IAAI;AAAA,IAChD,UAAU,gBAAgB,OAAO,UAAU,SAAS,QAAQ;AAAA,IAC5D,SAAS,gBAAgB,OAAO,SAAS,SAAS,OAAO;AAAA,IACzD,cAAc,gBAAgB,OAAO,cAAc,SAAS,YAAY;AAAA,IACxE,WAAW,gBAAgB,OAAO,WAAW,SAAS,SAAS;AAAA,IAC/D,YAAY,gBAAgB,OAAO,YAAY,SAAS,UAAU;AAAA,IAClE,OAAO,gBAAgB,OAAO,OAAO,SAAS,KAAK;AAAA,IACnD,SAAS,gBAAgB,OAAO,SAAS,SAAS,OAAO;AAAA,IACzD,iBAAiB,gBAAgB,OAAO,iBAAiB,SAAS,eAAe;AAAA,EACnF;AACF;AAEA,SAAS,cAAc,MAAwB;AAC7C,SAAO,KAAK,MAAM,GAAG,EAAE,OAAO,aAAW,QAAQ,SAAS,CAAC;AAC7D;AAGA,SAAS,aAAa,UAAkB,OAAuB;AAC7D,SACE,MACA,cAAc,QAAQ,EACnB,IAAI,aAAY,QAAQ,WAAW,GAAG,IAAI,mBAAmB,KAAK,IAAI,OAAQ,EAC9E,KAAK,GAAG;AAEf;AAGO,SAAS,UAAU,OAAmB,QAAuC;AAClF,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AACH,aAAO,OAAO,gBAAgB,OAAO,OAAO,aAAa,OAAO,cAAc,MAAM,OAAO;AAAA,IAC7F,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AACH,aAAO,OAAO,SAAS,OAAO,OAAO,aAAa,OAAO,OAAO,MAAM,SAAS;AAAA,IACjF,KAAK;AACH,aAAO,OAAO,WAAW,OAAO,OAAO,aAAa,OAAO,SAAS,MAAM,SAAS;AAAA,IACrF,KAAK;AACH,aAAO,OAAO;AAAA,EAClB;AACF;AAMO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA,OAAO,OAAO,WAAW,cAAc,sBAAsB,OAAO,SAAS;AAC/E,GAIkB;AAChB,QAAM,cAAc,UAAU,EAAE,MAAM,WAAW,UAAU,GAAG,MAAM;AACpE,MAAI,eAAe,KAAM,QAAO;AAChC,QAAM,MAAM,IAAI,IAAI,IAAI;AACxB,QAAM,WAAW,OAAO,SAAS,SAAS,GAAG,IAAI,OAAO,SAAS,MAAM,GAAG,EAAE,IAAI,OAAO;AACvF,MAAI,WAAW,GAAG,QAAQ,GAAG,WAAW,MAAM;AAC9C,MAAI,SAAS,uBAAuB,EAAE,MAAM,WAAW,UAAU,GAAG,IAAI,MAAM;AAC9E,MAAI,OAAO;AACX,SAAO,IAAI,SAAS;AACtB;AAMO,SAAS,uBAAuB,OAAmB,QAAwB;AAChF,MAAI,MAAM,SAAS,WAAY,QAAO;AAEtC,QAAM,SAAS,IAAI,gBAAgB,OAAO,WAAW,GAAG,IAAI,OAAO,MAAM,CAAC,IAAI,MAAM;AACpF,MAAI,MAAM,SAAS,mBAAmB;AACpC,4BAAwB,QAAQ,EAAE,KAAK,KAAK,CAAC;AAC7C,6BAAyB,MAAM;AAAA,EACjC,WAAW,MAAM,SAAS,gBAAgB;AACxC,UAAM,QAAQ,uBAAuB,MAAM;AAC3C,UAAM,gBAAgB,wBAAwB,MAAM;AACpD,4BAAwB,QAAQ;AAAA,MAC9B,MAAM;AAAA,MACN,WAAW;AAAA,MACX,GAAI,MAAM,aAAa,QAAQ,MAAM,YAAY,MAAM,UAAU,EAAE,WAAW,MAAM,SAAS,KAAK,IAAI,CAAC;AAAA,IACzG,CAAC;AACD,6BAAyB,MAAM;AAC/B,QAAI,MAAM,QAAQ,aAAa;AAC7B,+BAAyB,QAAQ;AAAA,QAC/B,QAAQ,cAAc;AAAA,QACtB,GAAG,cAAc;AAAA,QACjB,OAAO,cAAc;AAAA,MACvB,CAAC;AAAA,IACH;AAAA,EACF,WAAW,MAAM,SAAS,aAAa;AACrC,4BAAwB,QAAQ;AAAA,MAC9B,WAAW;AAAA,MACX,SAAS;AAAA,MACT,KAAK;AAAA,MACL,MAAM;AAAA,MACN,WAAW;AAAA,IACb,CAAC;AAAA,EAEH,OAAO;AACL,4BAAwB,QAAQ;AAAA,MAC9B,WAAW;AAAA,MACX,SAAS;AAAA,MACT,KAAK;AAAA,MACL,MAAM;AAAA,MACN,WAAW;AAAA,IACb,CAAC;AACD,6BAAyB,MAAM;AAAA,EACjC;AACA,QAAM,OAAO,OAAO,SAAS;AAC7B,SAAO,KAAK,SAAS,IAAI,IAAI,IAAI,KAAK;AACxC;AAGA,SAAS,cAAc,SAAgC;AACrD,MAAI;AACF,WAAO,mBAAmB,OAAO;AAAA,EACnC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,SAAS,cAAc,UAAkB,UAAmC;AAC1E,QAAM,mBAAmB,cAAc,QAAQ;AAC/C,MAAI,iBAAiB,WAAW,SAAS,OAAQ,QAAO;AACxD,MAAI,QAAuB;AAC3B,aAAW,CAAC,GAAG,GAAG,KAAK,iBAAiB,QAAQ,GAAG;AACjD,UAAM,MAAM,SAAS,CAAC;AACtB,QAAI,QAAQ,OAAW,QAAO;AAC9B,QAAI,IAAI,WAAW,GAAG,GAAG;AAEvB,YAAM,UAAU,cAAc,GAAG;AACjC,UAAI,WAAW,KAAM,QAAO;AAC5B,cAAQ;AAAA,IACV,WAAW,QAAQ,KAAK;AACtB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,UAAU,UAAkB,QAA2C;AACrF,QAAM,aAAa,cAAc,QAAQ;AACzC,QAAM,WAAW,cAAc,UAAU;AAEzC,MAAI,OAAO,YAAY,QAAQ,eAAe,OAAO,UAAU;AAC7D,WAAO,EAAE,MAAM,WAAW;AAAA,EAC5B;AACA,MAAI,OAAO,WAAW,QAAQ,eAAe,OAAO,SAAS;AAC3D,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AACA,MAAI,OAAO,mBAAmB,QAAQ,eAAe,OAAO,iBAAiB;AAC3E,WAAO,EAAE,MAAM,kBAAkB;AAAA,EACnC;AACA,MAAI,OAAO,gBAAgB,MAAM;AAC/B,UAAM,UAAU,cAAc,OAAO,cAAc,QAAQ;AAC3D,QAAI,WAAW,KAAM,QAAO,EAAE,MAAM,gBAAgB,QAAQ;AAAA,EAC9D;AACA,MAAI,OAAO,aAAa,QAAQ,eAAe,OAAO,WAAW;AAC/D,WAAO,EAAE,MAAM,YAAY;AAAA,EAC7B;AACA,MAAI,OAAO,cAAc,QAAQ,eAAe,OAAO,YAAY;AACjE,WAAO,EAAE,MAAM,aAAa;AAAA,EAC9B;AACA,MAAI,OAAO,SAAS,MAAM;AACxB,UAAM,YAAY,cAAc,OAAO,OAAO,QAAQ;AACtD,QAAI,aAAa,KAAM,QAAO,EAAE,MAAM,SAAS,UAAU;AAAA,EAC3D;AACA,MAAI,OAAO,WAAW,MAAM;AAC1B,UAAM,YAAY,cAAc,OAAO,SAAS,QAAQ;AACxD,QAAI,aAAa,KAAM,QAAO,EAAE,MAAM,WAAW,UAAU;AAAA,EAC7D;AACA,MAAI,eAAe,OAAO,MAAM;AAC9B,WAAO,EAAE,MAAM,OAAO;AAAA,EACxB;AACA,SAAO;AACT;AAGO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF,GAIsB;AACpB,QAAM,UAAU,UAAU,UAAU,MAAM;AAC1C,MAAI,WAAW,QAAQ,QAAQ,SAAS,OAAQ,QAAO;AACvD,QAAM,EAAE,QAAQ,IAAI,uBAAuB,MAAM;AACjD,SAAO,WAAW,OAAO,EAAE,MAAM,gBAAgB,QAAQ,IAAI;AAC/D;AAEO,SAAS,YAAY,GAAe,GAAwB;AACjE,MAAI,EAAE,SAAS,EAAE,KAAM,QAAO;AAC9B,MAAI,EAAE,SAAS,WAAW,EAAE,SAAS,QAAS,QAAO,EAAE,cAAc,EAAE;AACvE,MAAI,EAAE,SAAS,kBAAkB,EAAE,SAAS,eAAgB,QAAO,EAAE,YAAY,EAAE;AACnF,MAAI,EAAE,SAAS,aAAa,EAAE,SAAS,UAAW,QAAO,EAAE,cAAc,EAAE;AAC3E,SAAO;AACT;","names":[]}
|
|
@@ -5,7 +5,7 @@ function createTrueFoundryServer(opts) {
|
|
|
5
5
|
getModels: opts.getModels,
|
|
6
6
|
getSkills: opts.getSkills,
|
|
7
7
|
getMcp: opts.getMcp,
|
|
8
|
-
...opts.
|
|
8
|
+
...opts.getMcpConnector === void 0 ? {} : { getMcpConnector: opts.getMcpConnector },
|
|
9
9
|
...opts.getMcpTools === void 0 ? {} : { getMcpTools: opts.getMcpTools },
|
|
10
10
|
searchAgents: opts.searchAgents,
|
|
11
11
|
saveAgent: opts.saveAgent,
|
|
@@ -23,7 +23,8 @@ function createTrueFoundryServer(opts) {
|
|
|
23
23
|
...opts.catalog != null ? { catalog: opts.catalog } : {},
|
|
24
24
|
...opts.sessions != null ? { sessions: opts.sessions } : {},
|
|
25
25
|
...opts.metrics != null ? { metrics: opts.metrics } : {},
|
|
26
|
-
...opts.schedules != null ? { schedules: opts.schedules } : {}
|
|
26
|
+
...opts.schedules != null ? { schedules: opts.schedules } : {},
|
|
27
|
+
...opts.permissions != null ? { permissions: opts.permissions } : {}
|
|
27
28
|
};
|
|
28
29
|
return server;
|
|
29
30
|
}
|
|
@@ -31,4 +32,4 @@ function createTrueFoundryServer(opts) {
|
|
|
31
32
|
export {
|
|
32
33
|
createTrueFoundryServer
|
|
33
34
|
};
|
|
34
|
-
//# sourceMappingURL=chunk-
|
|
35
|
+
//# sourceMappingURL=chunk-7AAO4UDQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/createTrueFoundryServer.ts"],"sourcesContent":["import type {\n AgentBuilderCapabilitiesResponse,\n AgentBuilderServer,\n AgentChatServer,\n AgentLibraryEntry,\n AgentMetricsServer,\n AgentSessionsServer,\n AgentSkill,\n AgentSpec,\n CatalogServer,\n ConnectorState,\n ModelSelection,\n PermissionsServer,\n SaveAgentRequest,\n SaveAgentResult,\n ScheduleServer,\n SearchAgentsParams,\n} from './types.js';\n\nexport type CreateTrueFoundryServerOptions<\n TSpec extends AgentSpec = AgentSpec,\n TModel extends ModelSelection = ModelSelection,\n TSkill extends AgentSkill = AgentSkill,\n TMcp extends ConnectorState = ConnectorState,\n TAgent extends AgentLibraryEntry = AgentLibraryEntry,\n TSave extends SaveAgentResult = SaveAgentResult,\n TCatalog extends CatalogServer = CatalogServer,\n TCapabilities extends AgentBuilderCapabilitiesResponse = AgentBuilderCapabilitiesResponse,\n TSessions extends AgentSessionsServer<TSpec> = AgentSessionsServer<TSpec>,\n TMetrics extends AgentMetricsServer = AgentMetricsServer,\n TSchedules extends ScheduleServer = ScheduleServer,\n TPermissions extends PermissionsServer = PermissionsServer,\n> = {\n /** Chat port — e.g. from `@truefoundry/agent-server-adapter`. */\n chatServer: AgentChatServer<TSpec>;\n getCapabilities: () => Promise<TCapabilities>;\n getModels: () => Promise<TModel[]>;\n getSkills: () => Promise<TSkill[]>;\n getMcp: () => Promise<TMcp[]>;\n getMcpConnector?: AgentBuilderServer<TSpec, TModel, TSkill, TMcp, TAgent, TSave, TCapabilities>['getMcpConnector'];\n getMcpTools?: AgentBuilderServer<TSpec, TModel, TSkill, TMcp, TAgent, TSave, TCapabilities>['getMcpTools'];\n searchAgents: (req?: SearchAgentsParams) => Promise<TAgent[]>;\n saveAgent: (req: SaveAgentRequest<TSpec>) => Promise<TSave>;\n deleteAgent?: (req: { agentName: string }) => Promise<void>;\n /** Settings catalog (models + connectors). Optional. */\n catalog?: TCatalog;\n /** Optional agent-detail port (Overview + Use In Code). */\n sessions?: TSessions;\n /** Optional aggregate metrics + chart port. */\n metrics?: TMetrics;\n /** Schedules listing + CRUD. Optional. */\n schedules?: TSchedules;\n /** Per-resource grants. Omit to leave actions enabled. */\n permissions?: TPermissions;\n};\n\nexport type TrueFoundryServer<\n TSpec extends AgentSpec = AgentSpec,\n TModel extends ModelSelection = ModelSelection,\n TSkill extends AgentSkill = AgentSkill,\n TMcp extends ConnectorState = ConnectorState,\n TAgent extends AgentLibraryEntry = AgentLibraryEntry,\n TSave extends SaveAgentResult = SaveAgentResult,\n TCatalog extends CatalogServer = CatalogServer,\n TCapabilities extends AgentBuilderCapabilitiesResponse = AgentBuilderCapabilitiesResponse,\n TSessions extends AgentSessionsServer<TSpec> = AgentSessionsServer<TSpec>,\n TMetrics extends AgentMetricsServer = AgentMetricsServer,\n TSchedules extends ScheduleServer = ScheduleServer,\n TPermissions extends PermissionsServer = PermissionsServer,\n> = AgentChatServer<TSpec> &\n AgentBuilderServer<TSpec, TModel, TSkill, TMcp, TAgent, TSave, TCapabilities> & {\n catalog?: TCatalog;\n sessions?: TSessions;\n metrics?: TMetrics;\n schedules?: TSchedules;\n permissions?: TPermissions;\n };\n\n/**\n * Composes an `AgentChatServer` with host-provided builder catalog callbacks\n * and an optional settings `catalog`.\n * Gateway wiring lives in the host (or `@truefoundry/agent-server-adapter`).\n */\nexport function createTrueFoundryServer<\n TSpec extends AgentSpec = AgentSpec,\n TModel extends ModelSelection = ModelSelection,\n TSkill extends AgentSkill = AgentSkill,\n TMcp extends ConnectorState = ConnectorState,\n TAgent extends AgentLibraryEntry = AgentLibraryEntry,\n TSave extends SaveAgentResult = SaveAgentResult,\n TCatalog extends CatalogServer = CatalogServer,\n TCapabilities extends AgentBuilderCapabilitiesResponse = AgentBuilderCapabilitiesResponse,\n TSessions extends AgentSessionsServer<TSpec> = AgentSessionsServer<TSpec>,\n TMetrics extends AgentMetricsServer = AgentMetricsServer,\n TSchedules extends ScheduleServer = ScheduleServer,\n TPermissions extends PermissionsServer = PermissionsServer,\n>(\n opts: CreateTrueFoundryServerOptions<\n TSpec,\n TModel,\n TSkill,\n TMcp,\n TAgent,\n TSave,\n TCatalog,\n TCapabilities,\n TSessions,\n TMetrics,\n TSchedules,\n TPermissions\n >,\n): TrueFoundryServer<\n TSpec,\n TModel,\n TSkill,\n TMcp,\n TAgent,\n TSave,\n TCatalog,\n TCapabilities,\n TSessions,\n TMetrics,\n TSchedules,\n TPermissions\n> {\n const builder: AgentBuilderServer<TSpec, TModel, TSkill, TMcp, TAgent, TSave, TCapabilities> = {\n getCapabilities: opts.getCapabilities,\n getModels: opts.getModels,\n getSkills: opts.getSkills,\n getMcp: opts.getMcp,\n ...(opts.getMcpConnector === undefined ? {} : { getMcpConnector: opts.getMcpConnector }),\n ...(opts.getMcpTools === undefined ? {} : { getMcpTools: opts.getMcpTools }),\n searchAgents: opts.searchAgents,\n saveAgent: opts.saveAgent,\n deleteAgent: async req => {\n if (opts.deleteAgent) {\n await opts.deleteAgent(req);\n return;\n }\n throw new Error('deleteAgent is host-owned. Pass deleteAgent to createTrueFoundryServer.');\n },\n };\n\n const server: TrueFoundryServer<\n TSpec,\n TModel,\n TSkill,\n TMcp,\n TAgent,\n TSave,\n TCatalog,\n TCapabilities,\n TSessions,\n TMetrics,\n TSchedules,\n TPermissions\n > = {\n ...opts.chatServer,\n ...builder,\n ...(opts.catalog != null ? { catalog: opts.catalog } : {}),\n ...(opts.sessions != null ? { sessions: opts.sessions } : {}),\n ...(opts.metrics != null ? { metrics: opts.metrics } : {}),\n ...(opts.schedules != null ? { schedules: opts.schedules } : {}),\n ...(opts.permissions != null ? { permissions: opts.permissions } : {}),\n };\n return server;\n}\n"],"mappings":";AAmFO,SAAS,wBAcd,MA2BA;AACA,QAAM,UAAyF;AAAA,IAC7F,iBAAiB,KAAK;AAAA,IACtB,WAAW,KAAK;AAAA,IAChB,WAAW,KAAK;AAAA,IAChB,QAAQ,KAAK;AAAA,IACb,GAAI,KAAK,oBAAoB,SAAY,CAAC,IAAI,EAAE,iBAAiB,KAAK,gBAAgB;AAAA,IACtF,GAAI,KAAK,gBAAgB,SAAY,CAAC,IAAI,EAAE,aAAa,KAAK,YAAY;AAAA,IAC1E,cAAc,KAAK;AAAA,IACnB,WAAW,KAAK;AAAA,IAChB,aAAa,OAAM,QAAO;AACxB,UAAI,KAAK,aAAa;AACpB,cAAM,KAAK,YAAY,GAAG;AAC1B;AAAA,MACF;AACA,YAAM,IAAI,MAAM,yEAAyE;AAAA,IAC3F;AAAA,EACF;AAEA,QAAM,SAaF;AAAA,IACF,GAAG,KAAK;AAAA,IACR,GAAG;AAAA,IACH,GAAI,KAAK,WAAW,OAAO,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,IACxD,GAAI,KAAK,YAAY,OAAO,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,IAC3D,GAAI,KAAK,WAAW,OAAO,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,IACxD,GAAI,KAAK,aAAa,OAAO,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,IAC9D,GAAI,KAAK,eAAe,OAAO,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC;AAAA,EACtE;AACA,SAAO;AACT;","names":[]}
|
|
@@ -10,48 +10,87 @@ import {
|
|
|
10
10
|
} from "./chunk-Y6S4OVVQ.js";
|
|
11
11
|
import {
|
|
12
12
|
IS_CREATE_AGENT_METADATA_KEY,
|
|
13
|
-
isCreateAgentMetadataValue
|
|
13
|
+
isCreateAgentMetadataValue,
|
|
14
|
+
sessionIsCreateAgent
|
|
14
15
|
} from "./chunk-RDXBMTP5.js";
|
|
15
16
|
import {
|
|
17
|
+
ActiveSessionPermissionsProvider,
|
|
16
18
|
AgentConfigInstructionsProvider,
|
|
19
|
+
CurrentUserProvider,
|
|
17
20
|
SlotsProvider,
|
|
18
21
|
ToasterProvider,
|
|
19
22
|
modelPatchWithReasoningEffort,
|
|
20
23
|
mountName,
|
|
21
24
|
useToaster
|
|
22
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-2O5EJ6QS.js";
|
|
23
26
|
import {
|
|
24
27
|
DraftCatalogProvider,
|
|
25
28
|
Spinner,
|
|
26
|
-
getErrorMessage,
|
|
27
29
|
useDraftCatalog
|
|
28
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-Q6TCT7ZJ.js";
|
|
29
31
|
import {
|
|
30
32
|
DEFAULT_AGENT_CONFIG,
|
|
31
33
|
ServerProvider,
|
|
32
34
|
ShellModeProvider,
|
|
35
|
+
getErrorMessage,
|
|
33
36
|
isSessionsChromeEnabled,
|
|
34
37
|
readSessionShareSearch,
|
|
35
38
|
useOptionalAgentSessionsServer,
|
|
39
|
+
useOptionalShellMode,
|
|
36
40
|
useServerCapabilities,
|
|
37
41
|
useShellMode,
|
|
38
42
|
withCapabilitiesSandbox
|
|
39
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-PT4EENB3.js";
|
|
40
44
|
import {
|
|
45
|
+
useAui,
|
|
41
46
|
useAuiState
|
|
42
47
|
} from "./chunk-M6MHLVSO.js";
|
|
43
48
|
import {
|
|
44
49
|
cn
|
|
45
|
-
} from "./chunk-
|
|
50
|
+
} from "./chunk-LXJMINS6.js";
|
|
46
51
|
|
|
47
52
|
// src/containers/TrueFoundryChatProvider.tsx
|
|
48
|
-
import { AssistantRuntimeProvider } from "@assistant-ui/react";
|
|
53
|
+
import { AssistantRuntimeProvider, useAuiState as useAuiState2 } from "@assistant-ui/react";
|
|
49
54
|
import {
|
|
50
55
|
trueFoundryAttachmentAdapter,
|
|
51
56
|
useTrueFoundryAgentRuntime
|
|
52
57
|
} from "@truefoundry/assistant-ui-runtime";
|
|
53
58
|
import { useCallback, useMemo } from "react";
|
|
54
59
|
import { jsx } from "react/jsx-runtime";
|
|
60
|
+
function ActiveSessionPermissionScope({
|
|
61
|
+
locallyCreatedSessionIds,
|
|
62
|
+
children
|
|
63
|
+
}) {
|
|
64
|
+
const remoteId = useAuiState2((state) => state.threadListItem.remoteId);
|
|
65
|
+
return /* @__PURE__ */ jsx(
|
|
66
|
+
ActiveSessionPermissionsProvider,
|
|
67
|
+
{
|
|
68
|
+
sessionId: remoteId,
|
|
69
|
+
assumeManage: remoteId != null && locallyCreatedSessionIds.has(remoteId),
|
|
70
|
+
children
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
function runtimeServer({
|
|
75
|
+
server,
|
|
76
|
+
locallyCreatedSessionIds
|
|
77
|
+
}) {
|
|
78
|
+
return {
|
|
79
|
+
...server,
|
|
80
|
+
async createSession(request) {
|
|
81
|
+
const session = await server.createSession(request);
|
|
82
|
+
locallyCreatedSessionIds.add(session.id);
|
|
83
|
+
return session;
|
|
84
|
+
},
|
|
85
|
+
async listSessions(request) {
|
|
86
|
+
const result = await server.listSessions(request);
|
|
87
|
+
return {
|
|
88
|
+
...result,
|
|
89
|
+
data: result.data.filter((session) => !sessionIsCreateAgent(session))
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
55
94
|
function ChatRuntimeScope({
|
|
56
95
|
server,
|
|
57
96
|
agent,
|
|
@@ -64,6 +103,12 @@ function ChatRuntimeScope({
|
|
|
64
103
|
}) {
|
|
65
104
|
const { showError } = useToaster();
|
|
66
105
|
const reportError = onError ?? showError;
|
|
106
|
+
const localSessionState = useMemo(() => ({ server, ids: /* @__PURE__ */ new Set() }), [server]);
|
|
107
|
+
const locallyCreatedSessionIds = localSessionState.ids;
|
|
108
|
+
const historyServer = useMemo(
|
|
109
|
+
() => runtimeServer({ server, locallyCreatedSessionIds }),
|
|
110
|
+
[locallyCreatedSessionIds, server]
|
|
111
|
+
);
|
|
67
112
|
const resolvedOnError = useCallback(
|
|
68
113
|
(error) => {
|
|
69
114
|
notifyComposerBusyFailure();
|
|
@@ -72,10 +117,11 @@ function ChatRuntimeScope({
|
|
|
72
117
|
[reportError]
|
|
73
118
|
);
|
|
74
119
|
const runtime = useTrueFoundryAgentRuntime({
|
|
75
|
-
server,
|
|
120
|
+
server: historyServer,
|
|
76
121
|
agent,
|
|
77
122
|
agentName,
|
|
78
123
|
listSessionsAgentId,
|
|
124
|
+
listSessionsCreatedByMe: true,
|
|
79
125
|
initialSessionId,
|
|
80
126
|
onError: resolvedOnError,
|
|
81
127
|
adapters: {
|
|
@@ -83,7 +129,7 @@ function ChatRuntimeScope({
|
|
|
83
129
|
attachments: adapters?.attachments ?? trueFoundryAttachmentAdapter
|
|
84
130
|
}
|
|
85
131
|
});
|
|
86
|
-
return /* @__PURE__ */ jsx(AssistantRuntimeProvider, { runtime, children });
|
|
132
|
+
return /* @__PURE__ */ jsx(AssistantRuntimeProvider, { runtime, children: /* @__PURE__ */ jsx(ActiveSessionPermissionScope, { locallyCreatedSessionIds, children }) });
|
|
87
133
|
}
|
|
88
134
|
function TrueFoundryChatProvider(props) {
|
|
89
135
|
const { server, initialSessionId, adapters, onError, children, agent, agentName, listSessionsAgentId } = props;
|
|
@@ -129,7 +175,6 @@ function reconcileDraftSpecPreferences({
|
|
|
129
175
|
models,
|
|
130
176
|
skills,
|
|
131
177
|
connectors,
|
|
132
|
-
connectorsHasMore = false,
|
|
133
178
|
skillsEnabled
|
|
134
179
|
}) {
|
|
135
180
|
const update = {};
|
|
@@ -144,11 +189,9 @@ function reconcileDraftSpecPreferences({
|
|
|
144
189
|
);
|
|
145
190
|
}
|
|
146
191
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
update.mcpServers = nextMcpServers;
|
|
151
|
-
}
|
|
192
|
+
const nextMcpServers = filterMounts(agentSpec.mcpServers, new Set(connectors.map((connector) => connector.name)));
|
|
193
|
+
if (nextMcpServers !== agentSpec.mcpServers) {
|
|
194
|
+
update.mcpServers = nextMcpServers;
|
|
152
195
|
}
|
|
153
196
|
if (skillsEnabled === false) {
|
|
154
197
|
if (agentSpec.skills !== void 0 && agentSpec.skills.length > 0) {
|
|
@@ -197,7 +240,7 @@ function DraftSpecPreferenceBridge() {
|
|
|
197
240
|
const updateAgentSpec = useTrueFoundryUpdateAgentSpec();
|
|
198
241
|
const capabilities = useServerCapabilities();
|
|
199
242
|
const sandboxEnabled = capabilities?.sandbox.enabled;
|
|
200
|
-
const { models, skills, connectors,
|
|
243
|
+
const { models, skills, connectors, loaded, error, ensureLoaded } = useDraftCatalog();
|
|
201
244
|
const isPlainDraft = mode.status === "active" && mode.isMutable && mode.agentId == null && pendingSessionId == null;
|
|
202
245
|
const preferenceKind = mode.status === "active" && mode.isMutable && mode.isCreateAgent ? "agent" : "chat";
|
|
203
246
|
useEffect(() => {
|
|
@@ -222,7 +265,6 @@ function DraftSpecPreferenceBridge() {
|
|
|
222
265
|
models,
|
|
223
266
|
skills,
|
|
224
267
|
connectors,
|
|
225
|
-
connectorsHasMore,
|
|
226
268
|
skillsEnabled: capabilities?.skill.enabled
|
|
227
269
|
});
|
|
228
270
|
if (Object.keys(update).length > 0) {
|
|
@@ -232,7 +274,6 @@ function DraftSpecPreferenceBridge() {
|
|
|
232
274
|
agentSpec,
|
|
233
275
|
capabilities?.skill.enabled,
|
|
234
276
|
connectors,
|
|
235
|
-
connectorsHasMore,
|
|
236
277
|
error,
|
|
237
278
|
isPlainDraft,
|
|
238
279
|
loaded,
|
|
@@ -243,13 +284,27 @@ function DraftSpecPreferenceBridge() {
|
|
|
243
284
|
return null;
|
|
244
285
|
}
|
|
245
286
|
|
|
246
|
-
// src/routing/
|
|
287
|
+
// src/routing/HistorySessionSwitchBridge.tsx
|
|
247
288
|
import { useEffect as useEffect2 } from "react";
|
|
289
|
+
function HistorySessionSwitchBridge() {
|
|
290
|
+
const shell = useOptionalShellMode();
|
|
291
|
+
const aui = useAui();
|
|
292
|
+
const pendingSessionId = shell?.pendingSessionId;
|
|
293
|
+
const pendingSessionEpoch = shell?.pendingSessionEpoch ?? 0;
|
|
294
|
+
useEffect2(() => {
|
|
295
|
+
if (pendingSessionId == null) return;
|
|
296
|
+
void Promise.resolve(aui.threads().switchToThread(pendingSessionId)).catch(() => void 0);
|
|
297
|
+
}, [aui, pendingSessionId, pendingSessionEpoch]);
|
|
298
|
+
return null;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// src/routing/LibrarySessionShareBoot.tsx
|
|
302
|
+
import { useEffect as useEffect3 } from "react";
|
|
248
303
|
function LibrarySessionShareBoot() {
|
|
249
304
|
const { openLibraryAgent, setSessionsOpen } = useShellMode();
|
|
250
305
|
const sessions = useOptionalAgentSessionsServer();
|
|
251
306
|
const sessionsEnabled = isSessionsChromeEnabled({ sessions });
|
|
252
|
-
|
|
307
|
+
useEffect3(() => {
|
|
253
308
|
if (!sessionsEnabled) return;
|
|
254
309
|
const share = readSessionShareSearch(window.location.search);
|
|
255
310
|
if (share.view === "sessions") {
|
|
@@ -263,18 +318,66 @@ function LibrarySessionShareBoot() {
|
|
|
263
318
|
}
|
|
264
319
|
|
|
265
320
|
// src/routing/RemoteIdRouteBridge.tsx
|
|
266
|
-
import { useEffect as
|
|
321
|
+
import { useEffect as useEffect4 } from "react";
|
|
267
322
|
function RemoteIdRouteBridge({ onRemoteIdChange }) {
|
|
268
323
|
const remoteId = useAuiState((s) => s.threadListItem.remoteId);
|
|
269
|
-
|
|
324
|
+
useEffect4(() => {
|
|
270
325
|
onRemoteIdChange(remoteId ?? void 0);
|
|
271
326
|
}, [remoteId, onRemoteIdChange]);
|
|
272
327
|
return null;
|
|
273
328
|
}
|
|
274
329
|
|
|
330
|
+
// src/server/sessionListCache.ts
|
|
331
|
+
var SESSION_LIST_TTL_MS = 3e4;
|
|
332
|
+
function createSessionListCache() {
|
|
333
|
+
return /* @__PURE__ */ new Map();
|
|
334
|
+
}
|
|
335
|
+
function cacheKey(request) {
|
|
336
|
+
const rest = { ...request };
|
|
337
|
+
delete rest.startTimestamp;
|
|
338
|
+
return JSON.stringify(rest, Object.keys(rest).sort());
|
|
339
|
+
}
|
|
340
|
+
function withSessionListCache({
|
|
341
|
+
server,
|
|
342
|
+
cache
|
|
343
|
+
}) {
|
|
344
|
+
const { deleteSession } = server;
|
|
345
|
+
return {
|
|
346
|
+
...server,
|
|
347
|
+
listSessions(request) {
|
|
348
|
+
const key = cacheKey(request);
|
|
349
|
+
const now = Date.now();
|
|
350
|
+
const entry = cache.get(key);
|
|
351
|
+
if (entry !== void 0 && now - entry.at < SESSION_LIST_TTL_MS) return entry.page;
|
|
352
|
+
const page = server.listSessions(request);
|
|
353
|
+
cache.set(key, { at: now, page });
|
|
354
|
+
void page.catch(() => {
|
|
355
|
+
if (cache.get(key)?.page === page) cache.delete(key);
|
|
356
|
+
});
|
|
357
|
+
return page;
|
|
358
|
+
},
|
|
359
|
+
async createSession(request) {
|
|
360
|
+
const result = await server.createSession(request);
|
|
361
|
+
cache.clear();
|
|
362
|
+
return result;
|
|
363
|
+
},
|
|
364
|
+
async updateSession(request) {
|
|
365
|
+
const result = await server.updateSession(request);
|
|
366
|
+
cache.clear();
|
|
367
|
+
return result;
|
|
368
|
+
},
|
|
369
|
+
...deleteSession != null ? {
|
|
370
|
+
deleteSession: async (request) => {
|
|
371
|
+
await deleteSession.call(server, request);
|
|
372
|
+
cache.clear();
|
|
373
|
+
}
|
|
374
|
+
} : {}
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
|
|
275
378
|
// src/containers/useResolvedServer.ts
|
|
276
379
|
import { createTrueFoundryAgentUIServer } from "@truefoundry/assistant-ui-runtime/plugins/truefoundry-agent-server-adapter";
|
|
277
|
-
import { useEffect as
|
|
380
|
+
import { useEffect as useEffect5, useState } from "react";
|
|
278
381
|
var DEFAULT_CAPABILITIES = {
|
|
279
382
|
data: {
|
|
280
383
|
sandbox: { enabled: true },
|
|
@@ -288,14 +391,18 @@ function isBuiltInConfig(config) {
|
|
|
288
391
|
function hasGetCapabilities(server) {
|
|
289
392
|
return typeof Reflect.get(server, "getCapabilities") === "function";
|
|
290
393
|
}
|
|
291
|
-
function toAgentUIServer(server, catalog) {
|
|
394
|
+
function toAgentUIServer(server, catalog, permissions) {
|
|
292
395
|
const getCapabilities = hasGetCapabilities(server) ? () => server.getCapabilities() : async () => DEFAULT_CAPABILITIES;
|
|
293
396
|
const withCapabilities = { ...server, getCapabilities };
|
|
294
|
-
const
|
|
295
|
-
|
|
397
|
+
const withOptionalPorts = {
|
|
398
|
+
...withCapabilities,
|
|
399
|
+
...catalog == null ? {} : { catalog },
|
|
400
|
+
...permissions == null ? {} : { permissions }
|
|
401
|
+
};
|
|
402
|
+
if (!isAgentUIServer(withOptionalPorts)) {
|
|
296
403
|
throw new Error("TrueForgeUI: runtime adapter returned an incomplete AgentUIServer");
|
|
297
404
|
}
|
|
298
|
-
return
|
|
405
|
+
return withOptionalPorts;
|
|
299
406
|
}
|
|
300
407
|
function isAgentUIServer(value) {
|
|
301
408
|
return typeof Reflect.get(value, "createSession") === "function" && typeof Reflect.get(value, "listSessions") === "function" && typeof Reflect.get(value, "getSession") === "function" && typeof Reflect.get(value, "updateSession") === "function" && typeof Reflect.get(value, "createTurn") === "function" && typeof Reflect.get(value, "cancelSession") === "function" && typeof Reflect.get(value, "listTurns") === "function" && typeof Reflect.get(value, "getTurn") === "function" && typeof Reflect.get(value, "listEvents") === "function" && typeof Reflect.get(value, "getCapabilities") === "function" && typeof Reflect.get(value, "getModels") === "function" && typeof Reflect.get(value, "getSkills") === "function" && typeof Reflect.get(value, "getMcp") === "function" && typeof Reflect.get(value, "searchAgents") === "function" && typeof Reflect.get(value, "saveAgent") === "function";
|
|
@@ -311,13 +418,14 @@ function useResolvedServer(config, onError) {
|
|
|
311
418
|
const trueforgeToken = builtIn?.type === "trueforge" ? builtIn.token ?? "" : "";
|
|
312
419
|
const trueforgeFetch = builtIn?.type === "trueforge" ? builtIn.fetch : void 0;
|
|
313
420
|
const catalog = builtIn?.catalog;
|
|
421
|
+
const permissions = builtIn?.permissions;
|
|
314
422
|
const [state, setState] = useState(() => {
|
|
315
423
|
if (directServer) {
|
|
316
424
|
return { status: "ready", server: directServer, error: null };
|
|
317
425
|
}
|
|
318
426
|
return { status: "loading", server: null, error: null };
|
|
319
427
|
});
|
|
320
|
-
|
|
428
|
+
useEffect5(() => {
|
|
321
429
|
if (directServer) {
|
|
322
430
|
setState({ status: "ready", server: directServer, error: null });
|
|
323
431
|
return;
|
|
@@ -331,22 +439,23 @@ function useResolvedServer(config, onError) {
|
|
|
331
439
|
...trueforgeBaseUrl ? { baseUrl: trueforgeBaseUrl } : {},
|
|
332
440
|
...trueforgeToken ? { token: trueforgeToken } : {},
|
|
333
441
|
...trueforgeFetch !== void 0 ? { fetch: trueforgeFetch } : {},
|
|
334
|
-
...catalog != null ? { catalog } : {}
|
|
442
|
+
...catalog != null ? { catalog } : {},
|
|
443
|
+
...permissions != null ? { permissions } : {}
|
|
335
444
|
});
|
|
336
445
|
}
|
|
337
|
-
const
|
|
446
|
+
const runtimeServer2 = await createTrueFoundryAgentUIServer({
|
|
338
447
|
apiKey,
|
|
339
448
|
cpURL: controlPlaneURL,
|
|
340
449
|
...gatewayPlaneURL ? { gatewayURL: gatewayPlaneURL } : {}
|
|
341
450
|
});
|
|
342
|
-
return toAgentUIServer(
|
|
451
|
+
return toAgentUIServer(runtimeServer2, catalog, permissions);
|
|
343
452
|
};
|
|
344
453
|
void resolve().then((server) => {
|
|
345
454
|
if (cancelled) return;
|
|
346
455
|
try {
|
|
347
456
|
setState({
|
|
348
457
|
status: "ready",
|
|
349
|
-
server: type === "trueforge" ? toAgentUIServer(server, void 0) : server,
|
|
458
|
+
server: type === "trueforge" ? toAgentUIServer(server, void 0, void 0) : server,
|
|
350
459
|
error: null
|
|
351
460
|
});
|
|
352
461
|
} catch (error) {
|
|
@@ -371,6 +480,7 @@ function useResolvedServer(config, onError) {
|
|
|
371
480
|
trueforgeToken,
|
|
372
481
|
trueforgeFetch,
|
|
373
482
|
catalog,
|
|
483
|
+
permissions,
|
|
374
484
|
onError
|
|
375
485
|
]);
|
|
376
486
|
return state;
|
|
@@ -378,11 +488,11 @@ function useResolvedServer(config, onError) {
|
|
|
378
488
|
|
|
379
489
|
// src/containers/TrueForgeUIShell.tsx
|
|
380
490
|
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
381
|
-
var SidebarLayout = lazy(() => import("./SidebarLayout-
|
|
382
|
-
var DrawerLayout = lazy(() => import("./DrawerLayout-
|
|
383
|
-
var DockLayout = lazy(() => import("./DockLayout-
|
|
384
|
-
var WidgetLayout = lazy(() => import("./WidgetLayout-
|
|
385
|
-
var ShellRouteSync = lazy(() => import("./ShellRouteSync-
|
|
491
|
+
var SidebarLayout = lazy(() => import("./SidebarLayout-35K4AKTC.js").then((m) => ({ default: m.SidebarLayout })));
|
|
492
|
+
var DrawerLayout = lazy(() => import("./DrawerLayout-SQ323AVM.js").then((m) => ({ default: m.DrawerLayout })));
|
|
493
|
+
var DockLayout = lazy(() => import("./DockLayout-F44RWGEY.js").then((m) => ({ default: m.DockLayout })));
|
|
494
|
+
var WidgetLayout = lazy(() => import("./WidgetLayout-RKBSN2FZ.js").then((m) => ({ default: m.WidgetLayout })));
|
|
495
|
+
var ShellRouteSync = lazy(() => import("./ShellRouteSync-EN33DUQ7.js").then((m) => ({ default: m.ShellRouteSync })));
|
|
386
496
|
function LayoutFallback({ className }) {
|
|
387
497
|
return /* @__PURE__ */ jsx2(
|
|
388
498
|
"div",
|
|
@@ -460,8 +570,9 @@ function ChatProviderFromShell({
|
|
|
460
570
|
server,
|
|
461
571
|
...providerRest
|
|
462
572
|
}) {
|
|
463
|
-
const { mode, runtimeKey, listSessionsAgentId, pendingSessionId } = useShellMode();
|
|
573
|
+
const { mode, runtimeKey, historyAgentFilter, listSessionsAgentId, pendingSessionId } = useShellMode();
|
|
464
574
|
const isCreateAgent = mode.status === "active" && mode.isMutable && mode.isCreateAgent;
|
|
575
|
+
const [sessionListCache] = useState2(createSessionListCache);
|
|
465
576
|
const serverWithCreateIntent = useMemo2(() => {
|
|
466
577
|
return {
|
|
467
578
|
...server,
|
|
@@ -479,6 +590,14 @@ function ChatProviderFromShell({
|
|
|
479
590
|
}
|
|
480
591
|
};
|
|
481
592
|
}, [server, isCreateAgent]);
|
|
593
|
+
const cachedRuntimeServer = useMemo2(
|
|
594
|
+
() => withSessionListCache({ server: serverWithCreateIntent, cache: sessionListCache }),
|
|
595
|
+
[serverWithCreateIntent, sessionListCache]
|
|
596
|
+
);
|
|
597
|
+
const runtimeServer2 = useMemo2(() => {
|
|
598
|
+
if (historyAgentFilter == null || historyAgentFilter.agentId != null) return cachedRuntimeServer;
|
|
599
|
+
return { ...cachedRuntimeServer, listSessions: async () => ({ data: [] }) };
|
|
600
|
+
}, [cachedRuntimeServer, historyAgentFilter]);
|
|
482
601
|
const draftDefaultAgentSpec = useMemo2(() => {
|
|
483
602
|
if (mode.status === "active" && mode.isMutable) {
|
|
484
603
|
return mode.agentSpec ?? { model: { name: "openai-main/gpt-4.1" } };
|
|
@@ -507,22 +626,23 @@ function ChatProviderFromShell({
|
|
|
507
626
|
defaultAgentSpec: draftDefaultAgentSpec
|
|
508
627
|
};
|
|
509
628
|
}, [mode, draftDefaultAgentSpec, pendingSessionId]);
|
|
510
|
-
return /* @__PURE__ */ jsx2(
|
|
629
|
+
return /* @__PURE__ */ jsx2(DraftCatalogProvider, { children: /* @__PURE__ */ jsx2(
|
|
511
630
|
TrueFoundryChatProvider,
|
|
512
631
|
{
|
|
513
632
|
...providerRest,
|
|
514
|
-
server:
|
|
633
|
+
server: runtimeServer2,
|
|
515
634
|
agent,
|
|
516
635
|
listSessionsAgentId,
|
|
517
636
|
initialSessionId: pendingSessionId ?? hostInitialSessionId,
|
|
518
|
-
children: /* @__PURE__ */
|
|
637
|
+
children: /* @__PURE__ */ jsxs(AgentConfigInstructionsProvider, { children: [
|
|
519
638
|
/* @__PURE__ */ jsx2(DraftSpecPreferenceBridge, {}),
|
|
639
|
+
/* @__PURE__ */ jsx2(HistorySessionSwitchBridge, {}),
|
|
520
640
|
onRemoteIdChange != null ? /* @__PURE__ */ jsx2(RemoteIdRouteBridge, { onRemoteIdChange }) : null,
|
|
521
641
|
children
|
|
522
|
-
] })
|
|
642
|
+
] })
|
|
523
643
|
},
|
|
524
644
|
runtimeKey
|
|
525
|
-
);
|
|
645
|
+
) });
|
|
526
646
|
}
|
|
527
647
|
function TrueForgeUIShell(props) {
|
|
528
648
|
const {
|
|
@@ -535,6 +655,7 @@ function TrueForgeUIShell(props) {
|
|
|
535
655
|
server: serverConfig,
|
|
536
656
|
onError,
|
|
537
657
|
customActionRenderers,
|
|
658
|
+
currentUser,
|
|
538
659
|
resolvedRoutes,
|
|
539
660
|
routes: _routes,
|
|
540
661
|
...providerRest
|
|
@@ -572,7 +693,7 @@ function TrueForgeUIShell(props) {
|
|
|
572
693
|
)
|
|
573
694
|
] });
|
|
574
695
|
const visibilityTree = layout === "widget" ? /* @__PURE__ */ jsx2(WidgetVisibilityProvider, { children: shellTree }) : shellTree;
|
|
575
|
-
return /* @__PURE__ */ jsx2(SlotsProvider, { overrides, theme, children: /* @__PURE__ */ jsx2(CustomActionRenderersProvider, { renderers: customActionRenderers, children: /* @__PURE__ */ jsx2(ServerProvider, { server, children: resolvedRoutes != null ? /* @__PURE__ */ jsx2(ResolvedRoutesProvider, { routes: resolvedRoutes, children: visibilityTree }) : visibilityTree }) }) });
|
|
696
|
+
return /* @__PURE__ */ jsx2(SlotsProvider, { overrides, theme, children: /* @__PURE__ */ jsx2(CurrentUserProvider, { currentUser, children: /* @__PURE__ */ jsx2(CustomActionRenderersProvider, { renderers: customActionRenderers, children: /* @__PURE__ */ jsx2(ServerProvider, { server, children: resolvedRoutes != null ? /* @__PURE__ */ jsx2(ResolvedRoutesProvider, { routes: resolvedRoutes, children: visibilityTree }) : visibilityTree }) }) }) });
|
|
576
697
|
}
|
|
577
698
|
|
|
578
699
|
export {
|
|
@@ -580,4 +701,4 @@ export {
|
|
|
580
701
|
ServerInitLoader,
|
|
581
702
|
TrueForgeUIShell
|
|
582
703
|
};
|
|
583
|
-
//# sourceMappingURL=chunk-
|
|
704
|
+
//# sourceMappingURL=chunk-F5QVQIBH.js.map
|