@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.
Files changed (107) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +17 -9
  3. package/dist/{AgentCodeSnippets-637HQUXD.js → AgentCodeSnippets-N546FNNS.js} +38 -23
  4. package/dist/AgentCodeSnippets-N546FNNS.js.map +1 -0
  5. package/dist/AgentMetricChart-YWJYVYYA.js +15 -0
  6. package/dist/{AgentOverview-3FJ5EE6N.js → AgentOverview-VF74XC7I.js} +7 -7
  7. package/dist/{AgentSessionEventTimeline-VELWUYPR.js → AgentSessionEventTimeline-RFR6LQMY.js} +8 -8
  8. package/dist/{AgentSessionEventTimeline-VELWUYPR.js.map → AgentSessionEventTimeline-RFR6LQMY.js.map} +1 -1
  9. package/dist/{AgentSessionEventTimelineChart-CUKETHWM.js → AgentSessionEventTimelineChart-27CQF6FX.js} +12 -12
  10. package/dist/AgentSessionEventTimelineChart-27CQF6FX.js.map +1 -0
  11. package/dist/{AgentSessions-T7MOGOTZ.js → AgentSessions-4IVX2SGD.js} +36 -12
  12. package/dist/AgentSessions-4IVX2SGD.js.map +1 -0
  13. package/dist/{ConnectorSettings-ESZ2RSRG.js → ConnectorSettings-R5VEP7BO.js} +156 -116
  14. package/dist/ConnectorSettings-R5VEP7BO.js.map +1 -0
  15. package/dist/{DockLayout-NLFNU6F2.js → DockLayout-F44RWGEY.js} +10 -10
  16. package/dist/{DrawerLayout-PR3SMKA6.js → DrawerLayout-SQ323AVM.js} +13 -11
  17. package/dist/DrawerLayout-SQ323AVM.js.map +1 -0
  18. package/dist/{ModelSettings-LYW64IRR.js → ModelSettings-6QLS63HM.js} +10 -10
  19. package/dist/{ModelSettings-LYW64IRR.js.map → ModelSettings-6QLS63HM.js.map} +1 -1
  20. package/dist/OpenUiFenceBlock-4ROX3G4X.js +9 -0
  21. package/dist/{SandboxSettings-DF64LHYI.js → SandboxSettings-OLKDXIQS.js} +9 -9
  22. package/dist/SchedulesPage-TMOTK6DR.js +15 -0
  23. package/dist/{SettingsBuilder-LSXK2VN4.js → SettingsBuilder-GISAH2WU.js} +8 -8
  24. package/dist/{ShellRouteSync-B22IAV2W.js → ShellRouteSync-EN33DUQ7.js} +157 -22
  25. package/dist/ShellRouteSync-EN33DUQ7.js.map +1 -0
  26. package/dist/{SidebarLayout-XW6LXB7R.js → SidebarLayout-35K4AKTC.js} +74 -53
  27. package/dist/SidebarLayout-35K4AKTC.js.map +1 -0
  28. package/dist/{SkillSettings-64VXUO6J.js → SkillSettings-JSX2BTII.js} +18 -13
  29. package/dist/SkillSettings-JSX2BTII.js.map +1 -0
  30. package/dist/{TrueForgeUIWithRouter-3TSLV22Q.js → TrueForgeUIWithRouter-6VCR7ES3.js} +9 -9
  31. package/dist/{WidgetLayout-Q5P7PYSJ.js → WidgetLayout-RKBSN2FZ.js} +10 -10
  32. package/dist/{chunk-YQO2NMJ3.js → chunk-2O5EJ6QS.js} +4096 -2825
  33. package/dist/chunk-2O5EJ6QS.js.map +1 -0
  34. package/dist/chunk-6WCIL3H2.js +517 -0
  35. package/dist/chunk-6WCIL3H2.js.map +1 -0
  36. package/dist/{chunk-SQGT43Z3.js → chunk-73FQVITT.js} +21 -4
  37. package/dist/chunk-73FQVITT.js.map +1 -0
  38. package/dist/{chunk-QC42MLAK.js → chunk-7AAO4UDQ.js} +4 -3
  39. package/dist/chunk-7AAO4UDQ.js.map +1 -0
  40. package/dist/{chunk-LGRHHFHN.js → chunk-F5QVQIBH.js} +166 -45
  41. package/dist/chunk-F5QVQIBH.js.map +1 -0
  42. package/dist/{chunk-I3AL54MA.js → chunk-GIPFF6FZ.js} +28 -24
  43. package/dist/chunk-GIPFF6FZ.js.map +1 -0
  44. package/dist/{chunk-GXYAOAK5.js → chunk-GSJAYYLR.js} +219 -162
  45. package/dist/chunk-GSJAYYLR.js.map +1 -0
  46. package/dist/{chunk-VJ7BZGAF.js → chunk-J5BPHEDT.js} +2 -2
  47. package/dist/chunk-KR7WYHVF.js +195 -0
  48. package/dist/chunk-KR7WYHVF.js.map +1 -0
  49. package/dist/{chunk-VUMGMGKZ.js → chunk-LUG7E6BL.js} +52 -8
  50. package/dist/chunk-LUG7E6BL.js.map +1 -0
  51. package/dist/chunk-LXJMINS6.js +587 -0
  52. package/dist/chunk-LXJMINS6.js.map +1 -0
  53. package/dist/{chunk-FQK2XVVE.js → chunk-PT4EENB3.js} +224 -72
  54. package/dist/chunk-PT4EENB3.js.map +1 -0
  55. package/dist/{chunk-H6WTY5PM.js → chunk-Q6TCT7ZJ.js} +17 -227
  56. package/dist/chunk-Q6TCT7ZJ.js.map +1 -0
  57. package/dist/{chunk-5I2COQNL.js → chunk-XLFOXQKZ.js} +13 -11
  58. package/dist/chunk-XLFOXQKZ.js.map +1 -0
  59. package/dist/{chunk-G2TUAD65.js → chunk-XY6LZQES.js} +235 -108
  60. package/dist/chunk-XY6LZQES.js.map +1 -0
  61. package/dist/{createTrueFoundryServer-CmZnBh_l.d.ts → createTrueFoundryServer-B_FYhSdn.d.ts} +8 -5
  62. package/dist/index.d.ts +291 -89
  63. package/dist/index.js +63 -488
  64. package/dist/index.js.map +1 -1
  65. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +36 -13
  66. package/dist/plugins/trueforge-agent-server-adapter/index.js +69 -35
  67. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  68. package/dist/styles.css +1 -1
  69. package/package.json +3 -3
  70. package/dist/AgentCodeSnippets-637HQUXD.js.map +0 -1
  71. package/dist/AgentMetricChart-4FYECRIN.js +0 -15
  72. package/dist/AgentSessionEventTimelineChart-CUKETHWM.js.map +0 -1
  73. package/dist/AgentSessions-T7MOGOTZ.js.map +0 -1
  74. package/dist/ConnectorSettings-ESZ2RSRG.js.map +0 -1
  75. package/dist/DrawerLayout-PR3SMKA6.js.map +0 -1
  76. package/dist/OpenUiFenceBlock-JEPNPJ7U.js +0 -9
  77. package/dist/SchedulesPage-WQU4H25F.js +0 -15
  78. package/dist/ShellRouteSync-B22IAV2W.js.map +0 -1
  79. package/dist/SidebarLayout-XW6LXB7R.js.map +0 -1
  80. package/dist/SkillSettings-64VXUO6J.js.map +0 -1
  81. package/dist/chunk-5I2COQNL.js.map +0 -1
  82. package/dist/chunk-BWHOZFIV.js +0 -587
  83. package/dist/chunk-BWHOZFIV.js.map +0 -1
  84. package/dist/chunk-FQK2XVVE.js.map +0 -1
  85. package/dist/chunk-G2TUAD65.js.map +0 -1
  86. package/dist/chunk-GXYAOAK5.js.map +0 -1
  87. package/dist/chunk-H6WTY5PM.js.map +0 -1
  88. package/dist/chunk-I3AL54MA.js.map +0 -1
  89. package/dist/chunk-LGRHHFHN.js.map +0 -1
  90. package/dist/chunk-NHHSZB5N.js +0 -74
  91. package/dist/chunk-NHHSZB5N.js.map +0 -1
  92. package/dist/chunk-QC42MLAK.js.map +0 -1
  93. package/dist/chunk-SFZNIO6U.js +0 -18
  94. package/dist/chunk-SFZNIO6U.js.map +0 -1
  95. package/dist/chunk-SQGT43Z3.js.map +0 -1
  96. package/dist/chunk-VUMGMGKZ.js.map +0 -1
  97. package/dist/chunk-YQO2NMJ3.js.map +0 -1
  98. /package/dist/{AgentMetricChart-4FYECRIN.js.map → AgentMetricChart-YWJYVYYA.js.map} +0 -0
  99. /package/dist/{AgentOverview-3FJ5EE6N.js.map → AgentOverview-VF74XC7I.js.map} +0 -0
  100. /package/dist/{DockLayout-NLFNU6F2.js.map → DockLayout-F44RWGEY.js.map} +0 -0
  101. /package/dist/{OpenUiFenceBlock-JEPNPJ7U.js.map → OpenUiFenceBlock-4ROX3G4X.js.map} +0 -0
  102. /package/dist/{SandboxSettings-DF64LHYI.js.map → SandboxSettings-OLKDXIQS.js.map} +0 -0
  103. /package/dist/{SchedulesPage-WQU4H25F.js.map → SchedulesPage-TMOTK6DR.js.map} +0 -0
  104. /package/dist/{SettingsBuilder-LSXK2VN4.js.map → SettingsBuilder-GISAH2WU.js.map} +0 -0
  105. /package/dist/{TrueForgeUIWithRouter-3TSLV22Q.js.map → TrueForgeUIWithRouter-6VCR7ES3.js.map} +0 -0
  106. /package/dist/{WidgetLayout-Q5P7PYSJ.js.map → WidgetLayout-RKBSN2FZ.js.map} +0 -0
  107. /package/dist/{chunk-VJ7BZGAF.js.map → chunk-J5BPHEDT.js.map} +0 -0
@@ -1,10 +1,12 @@
1
1
  import {
2
- clearScheduleShareSearch
3
- } from "./chunk-NHHSZB5N.js";
2
+ clearScheduleShareSearch,
3
+ readScheduleShareSearch,
4
+ writeScheduleShareSearch
5
+ } from "./chunk-KR7WYHVF.js";
4
6
  import {
5
7
  readSessionShareSearch,
6
8
  writeSessionShareSearch
7
- } from "./chunk-FQK2XVVE.js";
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-SQGT43Z3.js.map
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":"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","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.listMcp === void 0 ? {} : { listMcp: opts.listMcp },
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-QC42MLAK.js.map
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-YQO2NMJ3.js";
25
+ } from "./chunk-2O5EJ6QS.js";
23
26
  import {
24
27
  DraftCatalogProvider,
25
28
  Spinner,
26
- getErrorMessage,
27
29
  useDraftCatalog
28
- } from "./chunk-H6WTY5PM.js";
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-FQK2XVVE.js";
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-BWHOZFIV.js";
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
- if (!connectorsHasMore) {
148
- const nextMcpServers = filterMounts(agentSpec.mcpServers, new Set(connectors.map((connector) => connector.name)));
149
- if (nextMcpServers !== agentSpec.mcpServers) {
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, connectorsHasMore, loaded, error, ensureLoaded } = useDraftCatalog();
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/LibrarySessionShareBoot.tsx
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
- useEffect2(() => {
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 useEffect3 } from "react";
321
+ import { useEffect as useEffect4 } from "react";
267
322
  function RemoteIdRouteBridge({ onRemoteIdChange }) {
268
323
  const remoteId = useAuiState((s) => s.threadListItem.remoteId);
269
- useEffect3(() => {
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 useEffect4, useState } from "react";
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 withCatalog = catalog != null ? { ...withCapabilities, catalog } : withCapabilities;
295
- if (!isAgentUIServer(withCatalog)) {
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 withCatalog;
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
- useEffect4(() => {
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 runtimeServer = await createTrueFoundryAgentUIServer({
446
+ const runtimeServer2 = await createTrueFoundryAgentUIServer({
338
447
  apiKey,
339
448
  cpURL: controlPlaneURL,
340
449
  ...gatewayPlaneURL ? { gatewayURL: gatewayPlaneURL } : {}
341
450
  });
342
- return toAgentUIServer(runtimeServer, catalog);
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-XW6LXB7R.js").then((m) => ({ default: m.SidebarLayout })));
382
- var DrawerLayout = lazy(() => import("./DrawerLayout-PR3SMKA6.js").then((m) => ({ default: m.DrawerLayout })));
383
- var DockLayout = lazy(() => import("./DockLayout-NLFNU6F2.js").then((m) => ({ default: m.DockLayout })));
384
- var WidgetLayout = lazy(() => import("./WidgetLayout-Q5P7PYSJ.js").then((m) => ({ default: m.WidgetLayout })));
385
- var ShellRouteSync = lazy(() => import("./ShellRouteSync-B22IAV2W.js").then((m) => ({ default: m.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: serverWithCreateIntent,
633
+ server: runtimeServer2,
515
634
  agent,
516
635
  listSessionsAgentId,
517
636
  initialSessionId: pendingSessionId ?? hostInitialSessionId,
518
- children: /* @__PURE__ */ jsx2(DraftCatalogProvider, { children: /* @__PURE__ */ jsxs(AgentConfigInstructionsProvider, { children: [
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-LGRHHFHN.js.map
704
+ //# sourceMappingURL=chunk-F5QVQIBH.js.map