@truefoundry/trueforge-ui 0.3.0-rc.1 → 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 (110) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/README.md +22 -7
  3. package/dist/{AgentCodeSnippets-NZOFJE57.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-EEBHJC32.js → AgentOverview-VF74XC7I.js} +7 -7
  7. package/dist/{AgentSessionEventTimeline-26Z6IB3B.js → AgentSessionEventTimeline-RFR6LQMY.js} +19 -10
  8. package/dist/AgentSessionEventTimeline-RFR6LQMY.js.map +1 -0
  9. package/dist/{AgentSessionEventTimelineChart-CGCU7WBK.js → AgentSessionEventTimelineChart-27CQF6FX.js} +144 -57
  10. package/dist/AgentSessionEventTimelineChart-27CQF6FX.js.map +1 -0
  11. package/dist/{AgentSessions-3MPDZASK.js → AgentSessions-4IVX2SGD.js} +36 -12
  12. package/dist/AgentSessions-4IVX2SGD.js.map +1 -0
  13. package/dist/{ConnectorSettings-MXFRWWR6.js → ConnectorSettings-R5VEP7BO.js} +162 -126
  14. package/dist/ConnectorSettings-R5VEP7BO.js.map +1 -0
  15. package/dist/{DockLayout-LM4AFMFY.js → DockLayout-F44RWGEY.js} +10 -10
  16. package/dist/{DrawerLayout-JR3O6RRB.js → DrawerLayout-SQ323AVM.js} +14 -12
  17. package/dist/DrawerLayout-SQ323AVM.js.map +1 -0
  18. package/dist/{ModelSettings-G7IFNC2Y.js → ModelSettings-6QLS63HM.js} +22 -28
  19. package/dist/ModelSettings-6QLS63HM.js.map +1 -0
  20. package/dist/OpenUiFenceBlock-4ROX3G4X.js +9 -0
  21. package/dist/{SandboxSettings-NXAANMAX.js → SandboxSettings-OLKDXIQS.js} +17 -21
  22. package/dist/SandboxSettings-OLKDXIQS.js.map +1 -0
  23. package/dist/SchedulesPage-TMOTK6DR.js +15 -0
  24. package/dist/{SettingsBuilder-L34IQ56S.js → SettingsBuilder-GISAH2WU.js} +8 -8
  25. package/dist/{ShellRouteSync-CEBETGEJ.js → ShellRouteSync-EN33DUQ7.js} +171 -26
  26. package/dist/ShellRouteSync-EN33DUQ7.js.map +1 -0
  27. package/dist/{SidebarLayout-A2HJPPHS.js → SidebarLayout-35K4AKTC.js} +80 -58
  28. package/dist/SidebarLayout-35K4AKTC.js.map +1 -0
  29. package/dist/{SkillSettings-FGGMSUNO.js → SkillSettings-JSX2BTII.js} +24 -22
  30. package/dist/SkillSettings-JSX2BTII.js.map +1 -0
  31. package/dist/{TrueForgeUIWithRouter-MZVJWJMB.js → TrueForgeUIWithRouter-6VCR7ES3.js} +9 -9
  32. package/dist/{WidgetLayout-6QM45OQQ.js → WidgetLayout-RKBSN2FZ.js} +10 -10
  33. package/dist/{chunk-ZTMKFZQ3.js → chunk-2O5EJ6QS.js} +4440 -3042
  34. package/dist/chunk-2O5EJ6QS.js.map +1 -0
  35. package/dist/chunk-6WCIL3H2.js +517 -0
  36. package/dist/chunk-6WCIL3H2.js.map +1 -0
  37. package/dist/{chunk-WVE3F724.js → chunk-73FQVITT.js} +21 -4
  38. package/dist/chunk-73FQVITT.js.map +1 -0
  39. package/dist/{chunk-QC42MLAK.js → chunk-7AAO4UDQ.js} +4 -3
  40. package/dist/chunk-7AAO4UDQ.js.map +1 -0
  41. package/dist/{chunk-CYHJDKFB.js → chunk-F5QVQIBH.js} +172 -46
  42. package/dist/chunk-F5QVQIBH.js.map +1 -0
  43. package/dist/{chunk-FJW36PD7.js → chunk-GIPFF6FZ.js} +28 -24
  44. package/dist/chunk-GIPFF6FZ.js.map +1 -0
  45. package/dist/{chunk-6O6FWUDW.js → chunk-GSJAYYLR.js} +233 -195
  46. package/dist/chunk-GSJAYYLR.js.map +1 -0
  47. package/dist/{chunk-MPNSO7E6.js → chunk-J5BPHEDT.js} +2 -2
  48. package/dist/chunk-KR7WYHVF.js +195 -0
  49. package/dist/chunk-KR7WYHVF.js.map +1 -0
  50. package/dist/{chunk-DMMZSZTN.js → chunk-LUG7E6BL.js} +60 -16
  51. package/dist/chunk-LUG7E6BL.js.map +1 -0
  52. package/dist/chunk-LXJMINS6.js +587 -0
  53. package/dist/chunk-LXJMINS6.js.map +1 -0
  54. package/dist/{chunk-U7KURWW3.js → chunk-PT4EENB3.js} +244 -52
  55. package/dist/chunk-PT4EENB3.js.map +1 -0
  56. package/dist/{chunk-XAU7QFG3.js → chunk-Q6TCT7ZJ.js} +68 -256
  57. package/dist/chunk-Q6TCT7ZJ.js.map +1 -0
  58. package/dist/{chunk-ZKNUMH2M.js → chunk-XLFOXQKZ.js} +13 -11
  59. package/dist/chunk-XLFOXQKZ.js.map +1 -0
  60. package/dist/{chunk-M62XY4NC.js → chunk-XY6LZQES.js} +235 -108
  61. package/dist/chunk-XY6LZQES.js.map +1 -0
  62. package/dist/{createTrueFoundryServer-CmZnBh_l.d.ts → createTrueFoundryServer-B_FYhSdn.d.ts} +8 -5
  63. package/dist/index.d.ts +316 -94
  64. package/dist/index.js +65 -488
  65. package/dist/index.js.map +1 -1
  66. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +36 -13
  67. package/dist/plugins/trueforge-agent-server-adapter/index.js +69 -34
  68. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  69. package/dist/styles.css +1 -1
  70. package/package.json +4 -4
  71. package/dist/AgentCodeSnippets-NZOFJE57.js.map +0 -1
  72. package/dist/AgentMetricChart-JPU3MFQ2.js +0 -15
  73. package/dist/AgentSessionEventTimeline-26Z6IB3B.js.map +0 -1
  74. package/dist/AgentSessionEventTimelineChart-CGCU7WBK.js.map +0 -1
  75. package/dist/AgentSessions-3MPDZASK.js.map +0 -1
  76. package/dist/ConnectorSettings-MXFRWWR6.js.map +0 -1
  77. package/dist/DrawerLayout-JR3O6RRB.js.map +0 -1
  78. package/dist/ModelSettings-G7IFNC2Y.js.map +0 -1
  79. package/dist/OpenUiFenceBlock-2TV5TQ6P.js +0 -9
  80. package/dist/SandboxSettings-NXAANMAX.js.map +0 -1
  81. package/dist/SchedulesPage-KKLUDO6B.js +0 -15
  82. package/dist/ShellRouteSync-CEBETGEJ.js.map +0 -1
  83. package/dist/SidebarLayout-A2HJPPHS.js.map +0 -1
  84. package/dist/SkillSettings-FGGMSUNO.js.map +0 -1
  85. package/dist/chunk-2XPPBEYF.js +0 -74
  86. package/dist/chunk-2XPPBEYF.js.map +0 -1
  87. package/dist/chunk-6O6FWUDW.js.map +0 -1
  88. package/dist/chunk-7Z2C2K7F.js +0 -578
  89. package/dist/chunk-7Z2C2K7F.js.map +0 -1
  90. package/dist/chunk-CYHJDKFB.js.map +0 -1
  91. package/dist/chunk-DMMZSZTN.js.map +0 -1
  92. package/dist/chunk-FJW36PD7.js.map +0 -1
  93. package/dist/chunk-M62XY4NC.js.map +0 -1
  94. package/dist/chunk-QC42MLAK.js.map +0 -1
  95. package/dist/chunk-SFZNIO6U.js +0 -18
  96. package/dist/chunk-SFZNIO6U.js.map +0 -1
  97. package/dist/chunk-U7KURWW3.js.map +0 -1
  98. package/dist/chunk-WVE3F724.js.map +0 -1
  99. package/dist/chunk-XAU7QFG3.js.map +0 -1
  100. package/dist/chunk-ZKNUMH2M.js.map +0 -1
  101. package/dist/chunk-ZTMKFZQ3.js.map +0 -1
  102. /package/dist/{AgentMetricChart-JPU3MFQ2.js.map → AgentMetricChart-YWJYVYYA.js.map} +0 -0
  103. /package/dist/{AgentOverview-EEBHJC32.js.map → AgentOverview-VF74XC7I.js.map} +0 -0
  104. /package/dist/{DockLayout-LM4AFMFY.js.map → DockLayout-F44RWGEY.js.map} +0 -0
  105. /package/dist/{OpenUiFenceBlock-2TV5TQ6P.js.map → OpenUiFenceBlock-4ROX3G4X.js.map} +0 -0
  106. /package/dist/{SchedulesPage-KKLUDO6B.js.map → SchedulesPage-TMOTK6DR.js.map} +0 -0
  107. /package/dist/{SettingsBuilder-L34IQ56S.js.map → SettingsBuilder-GISAH2WU.js.map} +0 -0
  108. /package/dist/{TrueForgeUIWithRouter-MZVJWJMB.js.map → TrueForgeUIWithRouter-6VCR7ES3.js.map} +0 -0
  109. /package/dist/{WidgetLayout-6QM45OQQ.js.map → WidgetLayout-RKBSN2FZ.js.map} +0 -0
  110. /package/dist/{chunk-MPNSO7E6.js.map → chunk-J5BPHEDT.js.map} +0 -0
@@ -1,10 +1,12 @@
1
1
  import {
2
- clearScheduleShareSearch
3
- } from "./chunk-2XPPBEYF.js";
2
+ clearScheduleShareSearch,
3
+ readScheduleShareSearch,
4
+ writeScheduleShareSearch
5
+ } from "./chunk-KR7WYHVF.js";
4
6
  import {
5
7
  readSessionShareSearch,
6
8
  writeSessionShareSearch
7
- } from "./chunk-U7KURWW3.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-WVE3F724.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":";;;;;;;;;;;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.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,46 +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-ZTMKFZQ3.js";
25
+ } from "./chunk-2O5EJ6QS.js";
23
26
  import {
24
27
  DraftCatalogProvider,
25
28
  Spinner,
26
- getErrorMessage,
27
29
  useDraftCatalog
28
- } from "./chunk-XAU7QFG3.js";
30
+ } from "./chunk-Q6TCT7ZJ.js";
29
31
  import {
30
32
  DEFAULT_AGENT_CONFIG,
31
33
  ServerProvider,
32
34
  ShellModeProvider,
35
+ getErrorMessage,
36
+ isSessionsChromeEnabled,
33
37
  readSessionShareSearch,
38
+ useOptionalAgentSessionsServer,
39
+ useOptionalShellMode,
34
40
  useServerCapabilities,
35
41
  useShellMode,
36
42
  withCapabilitiesSandbox
37
- } from "./chunk-U7KURWW3.js";
43
+ } from "./chunk-PT4EENB3.js";
38
44
  import {
45
+ useAui,
39
46
  useAuiState
40
47
  } from "./chunk-M6MHLVSO.js";
41
48
  import {
42
49
  cn
43
- } from "./chunk-7Z2C2K7F.js";
50
+ } from "./chunk-LXJMINS6.js";
44
51
 
45
52
  // src/containers/TrueFoundryChatProvider.tsx
46
- import { AssistantRuntimeProvider } from "@assistant-ui/react";
53
+ import { AssistantRuntimeProvider, useAuiState as useAuiState2 } from "@assistant-ui/react";
47
54
  import {
48
55
  trueFoundryAttachmentAdapter,
49
56
  useTrueFoundryAgentRuntime
50
57
  } from "@truefoundry/assistant-ui-runtime";
51
58
  import { useCallback, useMemo } from "react";
52
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
+ }
53
94
  function ChatRuntimeScope({
54
95
  server,
55
96
  agent,
@@ -62,6 +103,12 @@ function ChatRuntimeScope({
62
103
  }) {
63
104
  const { showError } = useToaster();
64
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
+ );
65
112
  const resolvedOnError = useCallback(
66
113
  (error) => {
67
114
  notifyComposerBusyFailure();
@@ -70,10 +117,11 @@ function ChatRuntimeScope({
70
117
  [reportError]
71
118
  );
72
119
  const runtime = useTrueFoundryAgentRuntime({
73
- server,
120
+ server: historyServer,
74
121
  agent,
75
122
  agentName,
76
123
  listSessionsAgentId,
124
+ listSessionsCreatedByMe: true,
77
125
  initialSessionId,
78
126
  onError: resolvedOnError,
79
127
  adapters: {
@@ -81,7 +129,7 @@ function ChatRuntimeScope({
81
129
  attachments: adapters?.attachments ?? trueFoundryAttachmentAdapter
82
130
  }
83
131
  });
84
- return /* @__PURE__ */ jsx(AssistantRuntimeProvider, { runtime, children });
132
+ return /* @__PURE__ */ jsx(AssistantRuntimeProvider, { runtime, children: /* @__PURE__ */ jsx(ActiveSessionPermissionScope, { locallyCreatedSessionIds, children }) });
85
133
  }
86
134
  function TrueFoundryChatProvider(props) {
87
135
  const { server, initialSessionId, adapters, onError, children, agent, agentName, listSessionsAgentId } = props;
@@ -127,7 +175,6 @@ function reconcileDraftSpecPreferences({
127
175
  models,
128
176
  skills,
129
177
  connectors,
130
- connectorsHasMore = false,
131
178
  skillsEnabled
132
179
  }) {
133
180
  const update = {};
@@ -142,11 +189,9 @@ function reconcileDraftSpecPreferences({
142
189
  );
143
190
  }
144
191
  }
145
- if (!connectorsHasMore) {
146
- const nextMcpServers = filterMounts(agentSpec.mcpServers, new Set(connectors.map((connector) => connector.name)));
147
- if (nextMcpServers !== agentSpec.mcpServers) {
148
- update.mcpServers = nextMcpServers;
149
- }
192
+ const nextMcpServers = filterMounts(agentSpec.mcpServers, new Set(connectors.map((connector) => connector.name)));
193
+ if (nextMcpServers !== agentSpec.mcpServers) {
194
+ update.mcpServers = nextMcpServers;
150
195
  }
151
196
  if (skillsEnabled === false) {
152
197
  if (agentSpec.skills !== void 0 && agentSpec.skills.length > 0) {
@@ -195,7 +240,7 @@ function DraftSpecPreferenceBridge() {
195
240
  const updateAgentSpec = useTrueFoundryUpdateAgentSpec();
196
241
  const capabilities = useServerCapabilities();
197
242
  const sandboxEnabled = capabilities?.sandbox.enabled;
198
- const { models, skills, connectors, connectorsHasMore, loaded, error, ensureLoaded } = useDraftCatalog();
243
+ const { models, skills, connectors, loaded, error, ensureLoaded } = useDraftCatalog();
199
244
  const isPlainDraft = mode.status === "active" && mode.isMutable && mode.agentId == null && pendingSessionId == null;
200
245
  const preferenceKind = mode.status === "active" && mode.isMutable && mode.isCreateAgent ? "agent" : "chat";
201
246
  useEffect(() => {
@@ -220,7 +265,6 @@ function DraftSpecPreferenceBridge() {
220
265
  models,
221
266
  skills,
222
267
  connectors,
223
- connectorsHasMore,
224
268
  skillsEnabled: capabilities?.skill.enabled
225
269
  });
226
270
  if (Object.keys(update).length > 0) {
@@ -230,7 +274,6 @@ function DraftSpecPreferenceBridge() {
230
274
  agentSpec,
231
275
  capabilities?.skill.enabled,
232
276
  connectors,
233
- connectorsHasMore,
234
277
  error,
235
278
  isPlainDraft,
236
279
  loaded,
@@ -241,11 +284,28 @@ function DraftSpecPreferenceBridge() {
241
284
  return null;
242
285
  }
243
286
 
244
- // src/routing/LibrarySessionShareBoot.tsx
287
+ // src/routing/HistorySessionSwitchBridge.tsx
245
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";
246
303
  function LibrarySessionShareBoot() {
247
304
  const { openLibraryAgent, setSessionsOpen } = useShellMode();
248
- useEffect2(() => {
305
+ const sessions = useOptionalAgentSessionsServer();
306
+ const sessionsEnabled = isSessionsChromeEnabled({ sessions });
307
+ useEffect3(() => {
308
+ if (!sessionsEnabled) return;
249
309
  const share = readSessionShareSearch(window.location.search);
250
310
  if (share.view === "sessions") {
251
311
  setSessionsOpen(true);
@@ -253,23 +313,71 @@ function LibrarySessionShareBoot() {
253
313
  }
254
314
  if (share.agentId == null) return;
255
315
  openLibraryAgent(share.agentId);
256
- }, [openLibraryAgent, setSessionsOpen]);
316
+ }, [openLibraryAgent, sessionsEnabled, setSessionsOpen]);
257
317
  return null;
258
318
  }
259
319
 
260
320
  // src/routing/RemoteIdRouteBridge.tsx
261
- import { useEffect as useEffect3 } from "react";
321
+ import { useEffect as useEffect4 } from "react";
262
322
  function RemoteIdRouteBridge({ onRemoteIdChange }) {
263
323
  const remoteId = useAuiState((s) => s.threadListItem.remoteId);
264
- useEffect3(() => {
324
+ useEffect4(() => {
265
325
  onRemoteIdChange(remoteId ?? void 0);
266
326
  }, [remoteId, onRemoteIdChange]);
267
327
  return null;
268
328
  }
269
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
+
270
378
  // src/containers/useResolvedServer.ts
271
379
  import { createTrueFoundryAgentUIServer } from "@truefoundry/assistant-ui-runtime/plugins/truefoundry-agent-server-adapter";
272
- import { useEffect as useEffect4, useState } from "react";
380
+ import { useEffect as useEffect5, useState } from "react";
273
381
  var DEFAULT_CAPABILITIES = {
274
382
  data: {
275
383
  sandbox: { enabled: true },
@@ -283,14 +391,18 @@ function isBuiltInConfig(config) {
283
391
  function hasGetCapabilities(server) {
284
392
  return typeof Reflect.get(server, "getCapabilities") === "function";
285
393
  }
286
- function toAgentUIServer(server, catalog) {
394
+ function toAgentUIServer(server, catalog, permissions) {
287
395
  const getCapabilities = hasGetCapabilities(server) ? () => server.getCapabilities() : async () => DEFAULT_CAPABILITIES;
288
396
  const withCapabilities = { ...server, getCapabilities };
289
- const withCatalog = catalog != null ? { ...withCapabilities, catalog } : withCapabilities;
290
- if (!isAgentUIServer(withCatalog)) {
397
+ const withOptionalPorts = {
398
+ ...withCapabilities,
399
+ ...catalog == null ? {} : { catalog },
400
+ ...permissions == null ? {} : { permissions }
401
+ };
402
+ if (!isAgentUIServer(withOptionalPorts)) {
291
403
  throw new Error("TrueForgeUI: runtime adapter returned an incomplete AgentUIServer");
292
404
  }
293
- return withCatalog;
405
+ return withOptionalPorts;
294
406
  }
295
407
  function isAgentUIServer(value) {
296
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";
@@ -306,13 +418,14 @@ function useResolvedServer(config, onError) {
306
418
  const trueforgeToken = builtIn?.type === "trueforge" ? builtIn.token ?? "" : "";
307
419
  const trueforgeFetch = builtIn?.type === "trueforge" ? builtIn.fetch : void 0;
308
420
  const catalog = builtIn?.catalog;
421
+ const permissions = builtIn?.permissions;
309
422
  const [state, setState] = useState(() => {
310
423
  if (directServer) {
311
424
  return { status: "ready", server: directServer, error: null };
312
425
  }
313
426
  return { status: "loading", server: null, error: null };
314
427
  });
315
- useEffect4(() => {
428
+ useEffect5(() => {
316
429
  if (directServer) {
317
430
  setState({ status: "ready", server: directServer, error: null });
318
431
  return;
@@ -326,22 +439,23 @@ function useResolvedServer(config, onError) {
326
439
  ...trueforgeBaseUrl ? { baseUrl: trueforgeBaseUrl } : {},
327
440
  ...trueforgeToken ? { token: trueforgeToken } : {},
328
441
  ...trueforgeFetch !== void 0 ? { fetch: trueforgeFetch } : {},
329
- ...catalog != null ? { catalog } : {}
442
+ ...catalog != null ? { catalog } : {},
443
+ ...permissions != null ? { permissions } : {}
330
444
  });
331
445
  }
332
- const runtimeServer = await createTrueFoundryAgentUIServer({
446
+ const runtimeServer2 = await createTrueFoundryAgentUIServer({
333
447
  apiKey,
334
448
  cpURL: controlPlaneURL,
335
449
  ...gatewayPlaneURL ? { gatewayURL: gatewayPlaneURL } : {}
336
450
  });
337
- return toAgentUIServer(runtimeServer, catalog);
451
+ return toAgentUIServer(runtimeServer2, catalog, permissions);
338
452
  };
339
453
  void resolve().then((server) => {
340
454
  if (cancelled) return;
341
455
  try {
342
456
  setState({
343
457
  status: "ready",
344
- server: type === "trueforge" ? toAgentUIServer(server, void 0) : server,
458
+ server: type === "trueforge" ? toAgentUIServer(server, void 0, void 0) : server,
345
459
  error: null
346
460
  });
347
461
  } catch (error) {
@@ -366,6 +480,7 @@ function useResolvedServer(config, onError) {
366
480
  trueforgeToken,
367
481
  trueforgeFetch,
368
482
  catalog,
483
+ permissions,
369
484
  onError
370
485
  ]);
371
486
  return state;
@@ -373,11 +488,11 @@ function useResolvedServer(config, onError) {
373
488
 
374
489
  // src/containers/TrueForgeUIShell.tsx
375
490
  import { jsx as jsx2, jsxs } from "react/jsx-runtime";
376
- var SidebarLayout = lazy(() => import("./SidebarLayout-A2HJPPHS.js").then((m) => ({ default: m.SidebarLayout })));
377
- var DrawerLayout = lazy(() => import("./DrawerLayout-JR3O6RRB.js").then((m) => ({ default: m.DrawerLayout })));
378
- var DockLayout = lazy(() => import("./DockLayout-LM4AFMFY.js").then((m) => ({ default: m.DockLayout })));
379
- var WidgetLayout = lazy(() => import("./WidgetLayout-6QM45OQQ.js").then((m) => ({ default: m.WidgetLayout })));
380
- var ShellRouteSync = lazy(() => import("./ShellRouteSync-CEBETGEJ.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 })));
381
496
  function LayoutFallback({ className }) {
382
497
  return /* @__PURE__ */ jsx2(
383
498
  "div",
@@ -455,8 +570,9 @@ function ChatProviderFromShell({
455
570
  server,
456
571
  ...providerRest
457
572
  }) {
458
- const { mode, runtimeKey, listSessionsAgentId, pendingSessionId } = useShellMode();
573
+ const { mode, runtimeKey, historyAgentFilter, listSessionsAgentId, pendingSessionId } = useShellMode();
459
574
  const isCreateAgent = mode.status === "active" && mode.isMutable && mode.isCreateAgent;
575
+ const [sessionListCache] = useState2(createSessionListCache);
460
576
  const serverWithCreateIntent = useMemo2(() => {
461
577
  return {
462
578
  ...server,
@@ -474,6 +590,14 @@ function ChatProviderFromShell({
474
590
  }
475
591
  };
476
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]);
477
601
  const draftDefaultAgentSpec = useMemo2(() => {
478
602
  if (mode.status === "active" && mode.isMutable) {
479
603
  return mode.agentSpec ?? { model: { name: "openai-main/gpt-4.1" } };
@@ -502,22 +626,23 @@ function ChatProviderFromShell({
502
626
  defaultAgentSpec: draftDefaultAgentSpec
503
627
  };
504
628
  }, [mode, draftDefaultAgentSpec, pendingSessionId]);
505
- return /* @__PURE__ */ jsx2(
629
+ return /* @__PURE__ */ jsx2(DraftCatalogProvider, { children: /* @__PURE__ */ jsx2(
506
630
  TrueFoundryChatProvider,
507
631
  {
508
632
  ...providerRest,
509
- server: serverWithCreateIntent,
633
+ server: runtimeServer2,
510
634
  agent,
511
635
  listSessionsAgentId,
512
636
  initialSessionId: pendingSessionId ?? hostInitialSessionId,
513
- children: /* @__PURE__ */ jsx2(DraftCatalogProvider, { children: /* @__PURE__ */ jsxs(AgentConfigInstructionsProvider, { children: [
637
+ children: /* @__PURE__ */ jsxs(AgentConfigInstructionsProvider, { children: [
514
638
  /* @__PURE__ */ jsx2(DraftSpecPreferenceBridge, {}),
639
+ /* @__PURE__ */ jsx2(HistorySessionSwitchBridge, {}),
515
640
  onRemoteIdChange != null ? /* @__PURE__ */ jsx2(RemoteIdRouteBridge, { onRemoteIdChange }) : null,
516
641
  children
517
- ] }) })
642
+ ] })
518
643
  },
519
644
  runtimeKey
520
- );
645
+ ) });
521
646
  }
522
647
  function TrueForgeUIShell(props) {
523
648
  const {
@@ -530,6 +655,7 @@ function TrueForgeUIShell(props) {
530
655
  server: serverConfig,
531
656
  onError,
532
657
  customActionRenderers,
658
+ currentUser,
533
659
  resolvedRoutes,
534
660
  routes: _routes,
535
661
  ...providerRest
@@ -567,7 +693,7 @@ function TrueForgeUIShell(props) {
567
693
  )
568
694
  ] });
569
695
  const visibilityTree = layout === "widget" ? /* @__PURE__ */ jsx2(WidgetVisibilityProvider, { children: shellTree }) : shellTree;
570
- 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 }) }) }) });
571
697
  }
572
698
 
573
699
  export {
@@ -575,4 +701,4 @@ export {
575
701
  ServerInitLoader,
576
702
  TrueForgeUIShell
577
703
  };
578
- //# sourceMappingURL=chunk-CYHJDKFB.js.map
704
+ //# sourceMappingURL=chunk-F5QVQIBH.js.map