@truefoundry/trueforge-ui 0.2.4 → 0.3.0-rc.1

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 (113) hide show
  1. package/CHANGELOG.md +85 -0
  2. package/README.md +55 -23
  3. package/dist/AgentCodeSnippets-NZOFJE57.js +74 -0
  4. package/dist/AgentCodeSnippets-NZOFJE57.js.map +1 -0
  5. package/dist/AgentMetricChart-JPU3MFQ2.js +15 -0
  6. package/dist/AgentOverview-EEBHJC32.js +167 -0
  7. package/dist/AgentOverview-EEBHJC32.js.map +1 -0
  8. package/dist/AgentSessionEventTimeline-26Z6IB3B.js +79 -0
  9. package/dist/AgentSessionEventTimeline-26Z6IB3B.js.map +1 -0
  10. package/dist/AgentSessionEventTimelineChart-CGCU7WBK.js +504 -0
  11. package/dist/AgentSessionEventTimelineChart-CGCU7WBK.js.map +1 -0
  12. package/dist/AgentSessions-3MPDZASK.js +275 -0
  13. package/dist/AgentSessions-3MPDZASK.js.map +1 -0
  14. package/dist/{ConnectorSettings-ODC3LVHN.js → ConnectorSettings-MXFRWWR6.js} +8 -6
  15. package/dist/{ConnectorSettings-ODC3LVHN.js.map → ConnectorSettings-MXFRWWR6.js.map} +1 -1
  16. package/dist/{DockLayout-TEOWEMSV.js → DockLayout-LM4AFMFY.js} +12 -11
  17. package/dist/{DockLayout-TEOWEMSV.js.map → DockLayout-LM4AFMFY.js.map} +1 -1
  18. package/dist/DrawerLayout-JR3O6RRB.js +184 -0
  19. package/dist/DrawerLayout-JR3O6RRB.js.map +1 -0
  20. package/dist/{ModelSettings-CKQ5CVAC.js → ModelSettings-G7IFNC2Y.js} +8 -6
  21. package/dist/{ModelSettings-CKQ5CVAC.js.map → ModelSettings-G7IFNC2Y.js.map} +1 -1
  22. package/dist/OpenUiFenceBlock-2TV5TQ6P.js +9 -0
  23. package/dist/OpenUiFenceBlock-2TV5TQ6P.js.map +1 -0
  24. package/dist/{SandboxSettings-HSCPYUOC.js → SandboxSettings-NXAANMAX.js} +8 -6
  25. package/dist/{SandboxSettings-HSCPYUOC.js.map → SandboxSettings-NXAANMAX.js.map} +1 -1
  26. package/dist/SchedulesPage-KKLUDO6B.js +15 -0
  27. package/dist/SchedulesPage-KKLUDO6B.js.map +1 -0
  28. package/dist/{SettingsBuilder-MYWRFXRI.js → SettingsBuilder-L34IQ56S.js} +26 -22
  29. package/dist/SettingsBuilder-L34IQ56S.js.map +1 -0
  30. package/dist/{ShellRouteSync-T4WLY57Q.js → ShellRouteSync-CEBETGEJ.js} +95 -22
  31. package/dist/ShellRouteSync-CEBETGEJ.js.map +1 -0
  32. package/dist/SidebarLayout-A2HJPPHS.js +308 -0
  33. package/dist/SidebarLayout-A2HJPPHS.js.map +1 -0
  34. package/dist/{SkillSettings-ECH6SHZ7.js → SkillSettings-FGGMSUNO.js} +8 -6
  35. package/dist/{SkillSettings-ECH6SHZ7.js.map → SkillSettings-FGGMSUNO.js.map} +1 -1
  36. package/dist/{TrueForgeUIWithRouter-KMHPOKLN.js → TrueForgeUIWithRouter-MZVJWJMB.js} +15 -11
  37. package/dist/{TrueForgeUIWithRouter-KMHPOKLN.js.map → TrueForgeUIWithRouter-MZVJWJMB.js.map} +1 -1
  38. package/dist/{WidgetLayout-4ZIG3RXV.js → WidgetLayout-6QM45OQQ.js} +19 -15
  39. package/dist/WidgetLayout-6QM45OQQ.js.map +1 -0
  40. package/dist/chunk-2XPPBEYF.js +74 -0
  41. package/dist/chunk-2XPPBEYF.js.map +1 -0
  42. package/dist/chunk-6O6FWUDW.js +1376 -0
  43. package/dist/chunk-6O6FWUDW.js.map +1 -0
  44. package/dist/chunk-7Z2C2K7F.js +578 -0
  45. package/dist/chunk-7Z2C2K7F.js.map +1 -0
  46. package/dist/{chunk-FXCYLEFB.js → chunk-BSIPI3KV.js} +18 -2
  47. package/dist/chunk-BSIPI3KV.js.map +1 -0
  48. package/dist/{chunk-255AE5NI.js → chunk-CYHJDKFB.js} +118 -33
  49. package/dist/chunk-CYHJDKFB.js.map +1 -0
  50. package/dist/chunk-DJUFS2BW.js +27 -0
  51. package/dist/chunk-DJUFS2BW.js.map +1 -0
  52. package/dist/chunk-DMMZSZTN.js +252 -0
  53. package/dist/chunk-DMMZSZTN.js.map +1 -0
  54. package/dist/chunk-FJW36PD7.js +180 -0
  55. package/dist/chunk-FJW36PD7.js.map +1 -0
  56. package/dist/chunk-M62XY4NC.js +555 -0
  57. package/dist/chunk-M62XY4NC.js.map +1 -0
  58. package/dist/{chunk-JRRCAKEP.js → chunk-MPNSO7E6.js} +2 -2
  59. package/dist/{chunk-CFLVPV5M.js → chunk-QC42MLAK.js} +7 -2
  60. package/dist/chunk-QC42MLAK.js.map +1 -0
  61. package/dist/chunk-RDXBMTP5.js +32 -0
  62. package/dist/chunk-RDXBMTP5.js.map +1 -0
  63. package/dist/chunk-SFZNIO6U.js +18 -0
  64. package/dist/chunk-SFZNIO6U.js.map +1 -0
  65. package/dist/chunk-U7KURWW3.js +840 -0
  66. package/dist/chunk-U7KURWW3.js.map +1 -0
  67. package/dist/chunk-WVE3F724.js +200 -0
  68. package/dist/chunk-WVE3F724.js.map +1 -0
  69. package/dist/{chunk-IFLE7OMM.js → chunk-XAU7QFG3.js} +180 -38
  70. package/dist/chunk-XAU7QFG3.js.map +1 -0
  71. package/dist/chunk-Y6S4OVVQ.js +16 -0
  72. package/dist/chunk-Y6S4OVVQ.js.map +1 -0
  73. package/dist/chunk-ZKNUMH2M.js +119 -0
  74. package/dist/chunk-ZKNUMH2M.js.map +1 -0
  75. package/dist/chunk-ZTMKFZQ3.js +13214 -0
  76. package/dist/chunk-ZTMKFZQ3.js.map +1 -0
  77. package/dist/{createTrueFoundryServer-B72bU-J7.d.ts → createTrueFoundryServer-CmZnBh_l.d.ts} +15 -4
  78. package/dist/index.d.ts +1199 -161
  79. package/dist/index.js +699 -69
  80. package/dist/index.js.map +1 -1
  81. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +552 -12
  82. package/dist/plugins/trueforge-agent-server-adapter/index.js +506 -188
  83. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  84. package/dist/styles.css +1 -1
  85. package/package.json +11 -10
  86. package/dist/DrawerLayout-2JOQ4EDZ.js +0 -159
  87. package/dist/DrawerLayout-2JOQ4EDZ.js.map +0 -1
  88. package/dist/OpenUiFenceBlock-3EFPY4JW.js +0 -9
  89. package/dist/SettingsBuilder-MYWRFXRI.js.map +0 -1
  90. package/dist/ShellRouteSync-T4WLY57Q.js.map +0 -1
  91. package/dist/SidebarLayout-6MHQYW45.js +0 -239
  92. package/dist/SidebarLayout-6MHQYW45.js.map +0 -1
  93. package/dist/WidgetLayout-4ZIG3RXV.js.map +0 -1
  94. package/dist/chunk-255AE5NI.js.map +0 -1
  95. package/dist/chunk-72LC2M3R.js +0 -567
  96. package/dist/chunk-72LC2M3R.js.map +0 -1
  97. package/dist/chunk-CFLVPV5M.js.map +0 -1
  98. package/dist/chunk-FXCYLEFB.js.map +0 -1
  99. package/dist/chunk-IFLE7OMM.js.map +0 -1
  100. package/dist/chunk-IWPDSPVA.js +0 -2068
  101. package/dist/chunk-IWPDSPVA.js.map +0 -1
  102. package/dist/chunk-OZTNBS6V.js +0 -75
  103. package/dist/chunk-OZTNBS6V.js.map +0 -1
  104. package/dist/chunk-PUFYHFND.js +0 -91
  105. package/dist/chunk-PUFYHFND.js.map +0 -1
  106. package/dist/chunk-WQULF5AT.js +0 -460
  107. package/dist/chunk-WQULF5AT.js.map +0 -1
  108. package/dist/chunk-XRTTKGKN.js +0 -6825
  109. package/dist/chunk-XRTTKGKN.js.map +0 -1
  110. package/dist/chunk-YIWUG6MC.js +0 -101
  111. package/dist/chunk-YIWUG6MC.js.map +0 -1
  112. /package/dist/{OpenUiFenceBlock-3EFPY4JW.js.map → AgentMetricChart-JPU3MFQ2.js.map} +0 -0
  113. /package/dist/{chunk-JRRCAKEP.js.map → chunk-MPNSO7E6.js.map} +0 -0
@@ -0,0 +1,252 @@
1
+ import {
2
+ Tooltip,
3
+ useAgentConfigInstructions,
4
+ useNamedAgentHeaderState,
5
+ useSlot,
6
+ withInitialUserMessages
7
+ } from "./chunk-ZTMKFZQ3.js";
8
+ import {
9
+ Icon,
10
+ auiButtonClass,
11
+ pageHeaderTitleClassName,
12
+ useDraftCatalog
13
+ } from "./chunk-XAU7QFG3.js";
14
+ import {
15
+ isSettingsChromeEnabled,
16
+ shellIsCreateAgent,
17
+ useOptionalCatalogServer,
18
+ useOptionalServer,
19
+ useOptionalShellMode,
20
+ useServerCapabilities,
21
+ useShellMode
22
+ } from "./chunk-U7KURWW3.js";
23
+ import {
24
+ useAuiState
25
+ } from "./chunk-M6MHLVSO.js";
26
+ import {
27
+ cn,
28
+ useTheme
29
+ } from "./chunk-7Z2C2K7F.js";
30
+
31
+ // src/atoms/NamedAgentHeaderLabel.tsx
32
+ import { jsx, jsxs } from "react/jsx-runtime";
33
+ function NamedAgentHeaderLabel({ className }) {
34
+ const state = useNamedAgentHeaderState();
35
+ const threadTitle = useAuiState((s) => s.threadListItem.title);
36
+ if (state === null) return null;
37
+ const syncedTitle = threadTitle?.trim() ?? "";
38
+ const displayName = state.allowThreadTitle && syncedTitle.length > 0 ? syncedTitle : state.name;
39
+ return /* @__PURE__ */ jsxs("h1", { className: cn("flex min-w-0 items-center gap-1.5", pageHeaderTitleClassName, className), children: [
40
+ /* @__PURE__ */ jsx("span", { className: "truncate", title: displayName, children: displayName }),
41
+ state.isEditing ? /* @__PURE__ */ jsx(Tooltip, { content: "Try changes here, then choose Update agent to save.", side: "bottom", children: /* @__PURE__ */ jsxs("span", { className: "border-warning-bg/40 bg-warning-bg/10 text-warning-bg inline-flex shrink-0 items-center gap-1 rounded-full border px-2 py-0.5 text-xs font-medium", children: [
42
+ /* @__PURE__ */ jsx(Icon, { name: "pencil", className: "size-3" }),
43
+ "Editing"
44
+ ] }) }) : null
45
+ ] });
46
+ }
47
+
48
+ // src/atoms/ShellActions.tsx
49
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
50
+ function ShellActions({ className, labeled = false }) {
51
+ const shell = useOptionalShellMode();
52
+ const catalog = useOptionalCatalogServer();
53
+ const capabilities = useServerCapabilities();
54
+ const { mode, setTheme } = useTheme();
55
+ const ActionSlot = useSlot("ShellActionsActionSlot");
56
+ const isDark = mode === "dark";
57
+ const themeLabel = isDark ? "Light" : "Dark";
58
+ const settingsChromeEnabled = isSettingsChromeEnabled({ catalog, capabilities });
59
+ const labeledButtonClass = "h-auto w-full flex-col gap-1.5 whitespace-normal px-1 py-3 text-[0.625rem] leading-tight !justify-center";
60
+ const hoverClass = "hover:bg-secondary-button-hover hover:text-ghost-button-text";
61
+ return /* @__PURE__ */ jsxs2(
62
+ "div",
63
+ {
64
+ className: cn(
65
+ "flex shrink-0 items-center gap-1 text-text-primary",
66
+ labeled && "w-full flex-col gap-1",
67
+ className
68
+ ),
69
+ children: [
70
+ /* @__PURE__ */ jsxs2(
71
+ "button",
72
+ {
73
+ type: "button",
74
+ "aria-label": isDark ? "Switch to light theme" : "Switch to dark theme",
75
+ title: isDark ? "Light theme" : "Dark theme",
76
+ className: auiButtonClass({
77
+ variant: "ghost",
78
+ size: labeled ? void 0 : "icon",
79
+ className: cn(hoverClass, labeled && labeledButtonClass)
80
+ }),
81
+ onClick: () => setTheme(isDark ? "light" : "dark"),
82
+ children: [
83
+ /* @__PURE__ */ jsx2(Icon, { name: isDark ? "sun" : "moon", size: labeled ? 16 : void 0 }),
84
+ labeled ? /* @__PURE__ */ jsx2("span", { className: "text-center", children: themeLabel }) : null
85
+ ]
86
+ }
87
+ ),
88
+ shell != null && settingsChromeEnabled ? /* @__PURE__ */ jsxs2(
89
+ "button",
90
+ {
91
+ type: "button",
92
+ "aria-label": "Settings",
93
+ title: "Settings",
94
+ "aria-expanded": shell.settingsOpen,
95
+ "aria-current": shell.settingsOpen ? "page" : void 0,
96
+ className: auiButtonClass({
97
+ variant: "ghost",
98
+ size: labeled ? void 0 : "icon",
99
+ className: cn(
100
+ hoverClass,
101
+ labeled && labeledButtonClass,
102
+ shell.settingsOpen && "bg-primary-button-bg text-primary-button-text hover:bg-primary-button-hover hover:text-primary-button-text"
103
+ )
104
+ }),
105
+ onClick: () => shell.setSettingsOpen(true),
106
+ children: [
107
+ /* @__PURE__ */ jsx2(Icon, { name: "settings", size: labeled ? 16 : void 0 }),
108
+ labeled ? /* @__PURE__ */ jsx2("span", { className: "text-center", children: "Settings" }) : null
109
+ ]
110
+ }
111
+ ) : null,
112
+ /* @__PURE__ */ jsx2(ActionSlot, {})
113
+ ]
114
+ }
115
+ );
116
+ }
117
+
118
+ // src/containers/AgentConfigDrawerContainer.tsx
119
+ import {
120
+ useTrueFoundryAgentSpec,
121
+ useTrueFoundryFlushAgentSpec,
122
+ useTrueFoundryUpdateAgentSpec
123
+ } from "@truefoundry/assistant-ui-runtime";
124
+ import { useCallback, useEffect, useState } from "react";
125
+ import { Fragment, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
126
+ function AgentConfigDrawerContainer({ showClose = false }) {
127
+ const { agentSpec } = useTrueFoundryAgentSpec();
128
+ const updateAgentSpec = useTrueFoundryUpdateAgentSpec();
129
+ const flushAgentSpec = useTrueFoundryFlushAgentSpec();
130
+ const shell = useShellMode();
131
+ const server = useOptionalServer();
132
+ const capabilities = useServerCapabilities();
133
+ const catalog = useDraftCatalog();
134
+ const AgentConfigPanel = useSlot("AgentConfigPanel");
135
+ const AgentConfigEditors = useSlot("AgentConfigEditors");
136
+ const [editor, setEditor] = useState(null);
137
+ const isBuilder = shellIsCreateAgent(shell.mode);
138
+ const { draft: instructionDraft, flush: flushInstructions } = useAgentConfigInstructions();
139
+ const closeDrawer = useCallback(() => {
140
+ flushInstructions();
141
+ void flushAgentSpec();
142
+ shell.setAgentConfigOpen(false);
143
+ }, [flushAgentSpec, flushInstructions, shell]);
144
+ useEffect(() => {
145
+ if (isBuilder) catalog.ensureLoaded();
146
+ }, [catalog, isBuilder]);
147
+ useEffect(() => {
148
+ if (!showClose || !shell.agentConfigOpen) return;
149
+ const onKeyDown = (event) => {
150
+ if (event.key === "Escape" && editor === null && document.querySelector("dialog[open]") === null) {
151
+ closeDrawer();
152
+ }
153
+ };
154
+ window.addEventListener("keydown", onKeyDown);
155
+ return () => window.removeEventListener("keydown", onKeyDown);
156
+ }, [closeDrawer, editor, shell.agentConfigOpen, showClose]);
157
+ useEffect(
158
+ () => () => {
159
+ flushInstructions();
160
+ try {
161
+ void flushAgentSpec();
162
+ } catch {
163
+ }
164
+ },
165
+ [flushAgentSpec, flushInstructions]
166
+ );
167
+ const commitSpec = useCallback(
168
+ ({ next, instructions }) => {
169
+ if (next.skills && next.skills.length > 0 && capabilities?.sandbox.enabled === true) {
170
+ updateAgentSpec?.({
171
+ ...next,
172
+ instructions: instructions || void 0,
173
+ config: {
174
+ ...next.config,
175
+ sandbox: { ...next.config?.sandbox, enabled: true }
176
+ }
177
+ });
178
+ return;
179
+ }
180
+ updateAgentSpec?.({ ...next, instructions: instructions || void 0 });
181
+ },
182
+ [capabilities?.sandbox.enabled, updateAgentSpec]
183
+ );
184
+ const updateSpec = useCallback(
185
+ (next) => {
186
+ commitSpec({ next, instructions: instructionDraft });
187
+ },
188
+ [commitSpec, instructionDraft]
189
+ );
190
+ const saveInstructions = useCallback(
191
+ (draft) => {
192
+ if (agentSpec === null) return;
193
+ commitSpec({
194
+ next: withInitialUserMessages({ spec: agentSpec, messages: draft.messages }),
195
+ instructions: draft.instructions
196
+ });
197
+ },
198
+ [agentSpec, commitSpec]
199
+ );
200
+ const loadMcpTools = useCallback(
201
+ async (connectorId) => {
202
+ if (server?.getMcpTools === void 0) return [];
203
+ return server.getMcpTools({ connectorId });
204
+ },
205
+ [server]
206
+ );
207
+ if (!isBuilder || agentSpec === null || showClose && !shell.agentConfigOpen) {
208
+ return null;
209
+ }
210
+ const model = catalog.models.find((item) => item.name === agentSpec.model.name);
211
+ return /* @__PURE__ */ jsxs3(Fragment, { children: [
212
+ /* @__PURE__ */ jsx3(
213
+ AgentConfigPanel,
214
+ {
215
+ spec: agentSpec,
216
+ model,
217
+ skillsAvailable: capabilities?.skill.enabled === true,
218
+ instructions: instructionDraft,
219
+ onOpenEditor: setEditor,
220
+ onChange: updateSpec,
221
+ onClose: showClose ? closeDrawer : void 0
222
+ }
223
+ ),
224
+ /* @__PURE__ */ jsx3(
225
+ AgentConfigEditors,
226
+ {
227
+ editor,
228
+ spec: agentSpec,
229
+ models: catalog.models,
230
+ connectors: catalog.connectors,
231
+ skills: catalog.skills,
232
+ loading: catalog.loading,
233
+ error: catalog.error,
234
+ skillsDisabled: capabilities?.skill.enabled !== true,
235
+ sandboxAvailable: capabilities?.sandbox.enabled === true,
236
+ instructions: instructionDraft,
237
+ onInstructionsSave: saveInstructions,
238
+ loadMcpTools,
239
+ onRefreshConnectors: catalog.refreshConnectors,
240
+ onChange: updateSpec,
241
+ onClose: () => setEditor(null)
242
+ }
243
+ )
244
+ ] });
245
+ }
246
+
247
+ export {
248
+ NamedAgentHeaderLabel,
249
+ ShellActions,
250
+ AgentConfigDrawerContainer
251
+ };
252
+ //# sourceMappingURL=chunk-DMMZSZTN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/atoms/NamedAgentHeaderLabel.tsx","../src/atoms/ShellActions.tsx","../src/containers/AgentConfigDrawerContainer.tsx"],"sourcesContent":["'use client';\n\nimport { useAuiState } from '../assistant-ui.js';\nimport { useNamedAgentHeaderState } from '../hooks/useChatChromeActionsVisible.js';\nimport { Icon } from '../icons/Icon.js';\nimport { cn } from './lib/cn.js';\nimport { pageHeaderTitleClassName } from './PageHeader.js';\nimport { Tooltip } from './primitives/Tooltip.js';\n\n/** Dynamic chat title for named agents and New Chat / New Agent drafts. */\nexport function NamedAgentHeaderLabel({ className }: { className?: string }) {\n const state = useNamedAgentHeaderState();\n const threadTitle = useAuiState(s => s.threadListItem.title);\n if (state === null) return null;\n\n const syncedTitle = threadTitle?.trim() ?? '';\n const displayName = state.allowThreadTitle && syncedTitle.length > 0 ? syncedTitle : state.name;\n\n return (\n <h1 className={cn('flex min-w-0 items-center gap-1.5', pageHeaderTitleClassName, className)}>\n <span className=\"truncate\" title={displayName}>\n {displayName}\n </span>\n {state.isEditing ? (\n <Tooltip content=\"Try changes here, then choose Update agent to save.\" side=\"bottom\">\n <span className=\"border-warning-bg/40 bg-warning-bg/10 text-warning-bg inline-flex shrink-0 items-center gap-1 rounded-full border px-2 py-0.5 text-xs font-medium\">\n <Icon name=\"pencil\" className=\"size-3\" />\n Editing\n </span>\n </Tooltip>\n ) : null}\n </h1>\n );\n}\n","'use client';\n\nimport { Icon } from '../icons/Icon.js';\nimport { useOptionalCatalogServer, useServerCapabilities } from '../server/ServerContext.js';\nimport { useOptionalShellMode } from '../server/ShellModeContext.js';\nimport { isSettingsChromeEnabled } from '../server/settingsChrome.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport { useTheme } from '../theme/ThemeProvider.js';\nimport { auiButtonClass } from './lib/buttonClasses.js';\nimport { cn } from './lib/cn.js';\n\nexport function ShellActions({ className, labeled = false }: { className?: string; labeled?: boolean }) {\n const shell = useOptionalShellMode();\n const catalog = useOptionalCatalogServer();\n const capabilities = useServerCapabilities();\n const { mode, setTheme } = useTheme();\n const ActionSlot = useSlot('ShellActionsActionSlot');\n const isDark = mode === 'dark';\n const themeLabel = isDark ? 'Light' : 'Dark';\n const settingsChromeEnabled = isSettingsChromeEnabled({ catalog, capabilities });\n\n const labeledButtonClass =\n 'h-auto w-full flex-col gap-1.5 whitespace-normal px-1 py-3 text-[0.625rem] leading-tight !justify-center';\n const hoverClass = 'hover:bg-secondary-button-hover hover:text-ghost-button-text';\n\n return (\n <div\n className={cn(\n 'flex shrink-0 items-center gap-1 text-text-primary',\n labeled && 'w-full flex-col gap-1',\n className,\n )}\n >\n <button\n type=\"button\"\n aria-label={isDark ? 'Switch to light theme' : 'Switch to dark theme'}\n title={isDark ? 'Light theme' : 'Dark theme'}\n className={auiButtonClass({\n variant: 'ghost',\n size: labeled ? undefined : 'icon',\n className: cn(hoverClass, labeled && labeledButtonClass),\n })}\n onClick={() => setTheme(isDark ? 'light' : 'dark')}\n >\n <Icon name={isDark ? 'sun' : 'moon'} size={labeled ? 16 : undefined} />\n {labeled ? <span className=\"text-center\">{themeLabel}</span> : null}\n </button>\n {shell != null && settingsChromeEnabled ? (\n <button\n type=\"button\"\n aria-label=\"Settings\"\n title=\"Settings\"\n aria-expanded={shell.settingsOpen}\n aria-current={shell.settingsOpen ? 'page' : undefined}\n className={auiButtonClass({\n variant: 'ghost',\n size: labeled ? undefined : 'icon',\n className: cn(\n hoverClass,\n labeled && labeledButtonClass,\n shell.settingsOpen &&\n 'bg-primary-button-bg text-primary-button-text hover:bg-primary-button-hover hover:text-primary-button-text',\n ),\n })}\n onClick={() => shell.setSettingsOpen(true)}\n >\n <Icon name=\"settings\" size={labeled ? 16 : undefined} />\n {labeled ? <span className=\"text-center\">Settings</span> : null}\n </button>\n ) : null}\n <ActionSlot />\n </div>\n );\n}\n","'use client';\n\nimport {\n useTrueFoundryAgentSpec,\n useTrueFoundryFlushAgentSpec,\n useTrueFoundryUpdateAgentSpec,\n} from '@truefoundry/assistant-ui-runtime';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport type { AgentConfigEditor } from '../atoms/draft/AgentConfigEditors.js';\nimport { useAgentConfigInstructions } from '../atoms/draft/AgentConfigInstructionsContext.js';\nimport type { AgentInstructionsDraft } from '../atoms/draft/AgentInstructionsDrawer.js';\nimport { useDraftCatalog } from '../atoms/draft/DraftCatalogProvider.js';\nimport { withInitialUserMessages } from '../atoms/draft/agentConfigMessages.js';\nimport { useOptionalServer, useServerCapabilities } from '../server/ServerContext.js';\nimport { shellIsCreateAgent, useShellMode } from '../server/ShellModeContext.js';\nimport type { AgentSpec, McpToolSelection } from '../server/types.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nexport function AgentConfigDrawerContainer({ showClose = false }: { showClose?: boolean }) {\n const { agentSpec } = useTrueFoundryAgentSpec();\n const updateAgentSpec = useTrueFoundryUpdateAgentSpec();\n const flushAgentSpec = useTrueFoundryFlushAgentSpec();\n const shell = useShellMode();\n const server = useOptionalServer();\n const capabilities = useServerCapabilities();\n const catalog = useDraftCatalog();\n const AgentConfigPanel = useSlot('AgentConfigPanel');\n const AgentConfigEditors = useSlot('AgentConfigEditors');\n const [editor, setEditor] = useState<AgentConfigEditor | null>(null);\n const isBuilder = shellIsCreateAgent(shell.mode);\n const { draft: instructionDraft, flush: flushInstructions } = useAgentConfigInstructions();\n const closeDrawer = useCallback(() => {\n flushInstructions();\n void flushAgentSpec();\n shell.setAgentConfigOpen(false);\n }, [flushAgentSpec, flushInstructions, shell]);\n\n useEffect(() => {\n if (isBuilder) catalog.ensureLoaded();\n }, [catalog, isBuilder]);\n\n useEffect(() => {\n if (!showClose || !shell.agentConfigOpen) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && editor === null && document.querySelector('dialog[open]') === null) {\n closeDrawer();\n }\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [closeDrawer, editor, shell.agentConfigOpen, showClose]);\n\n // Flush pending edits on unmount. ChatProvider remount (runtimeKey) tears the\n // runtime down first — flush then throws; ignore so the new draft can mount.\n useEffect(\n () => () => {\n flushInstructions();\n try {\n void flushAgentSpec();\n } catch {\n // Runtime already gone.\n }\n },\n [flushAgentSpec, flushInstructions],\n );\n\n const commitSpec = useCallback(\n ({ next, instructions }: { next: AgentSpec; instructions: string }) => {\n if (next.skills && next.skills.length > 0 && capabilities?.sandbox.enabled === true) {\n updateAgentSpec?.({\n ...next,\n instructions: instructions || undefined,\n config: {\n ...next.config,\n sandbox: { ...next.config?.sandbox, enabled: true },\n },\n });\n return;\n }\n updateAgentSpec?.({ ...next, instructions: instructions || undefined });\n },\n [capabilities?.sandbox.enabled, updateAgentSpec],\n );\n\n const updateSpec = useCallback(\n (next: AgentSpec) => {\n commitSpec({ next, instructions: instructionDraft });\n },\n [commitSpec, instructionDraft],\n );\n\n const saveInstructions = useCallback(\n (draft: AgentInstructionsDraft) => {\n if (agentSpec === null) return;\n commitSpec({\n next: withInitialUserMessages({ spec: agentSpec, messages: draft.messages }),\n instructions: draft.instructions,\n });\n },\n [agentSpec, commitSpec],\n );\n\n const loadMcpTools = useCallback(\n async (connectorId: string): Promise<McpToolSelection[]> => {\n if (server?.getMcpTools === undefined) return [];\n return server.getMcpTools({ connectorId });\n },\n [server],\n );\n\n if (!isBuilder || agentSpec === null || (showClose && !shell.agentConfigOpen)) {\n return null;\n }\n\n const model = catalog.models.find(item => item.name === agentSpec.model.name);\n\n return (\n <>\n <AgentConfigPanel\n spec={agentSpec}\n model={model}\n skillsAvailable={capabilities?.skill.enabled === true}\n instructions={instructionDraft}\n onOpenEditor={setEditor}\n onChange={updateSpec}\n onClose={showClose ? closeDrawer : undefined}\n />\n <AgentConfigEditors\n editor={editor}\n spec={agentSpec}\n models={catalog.models}\n connectors={catalog.connectors}\n skills={catalog.skills}\n loading={catalog.loading}\n error={catalog.error}\n skillsDisabled={capabilities?.skill.enabled !== true}\n sandboxAvailable={capabilities?.sandbox.enabled === true}\n instructions={instructionDraft}\n onInstructionsSave={saveInstructions}\n loadMcpTools={loadMcpTools}\n onRefreshConnectors={catalog.refreshConnectors}\n onChange={updateSpec}\n onClose={() => setEditor(null)}\n />\n </>\n );\n}\n"],"mappings":"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","names":["jsx","jsxs","jsx","jsxs"]}
@@ -0,0 +1,180 @@
1
+ import {
2
+ AgentConfigDrawerContainer,
3
+ NamedAgentHeaderLabel,
4
+ ShellActions
5
+ } from "./chunk-DMMZSZTN.js";
6
+ import {
7
+ Thread
8
+ } from "./chunk-M62XY4NC.js";
9
+ import {
10
+ useSlot
11
+ } from "./chunk-ZTMKFZQ3.js";
12
+ import {
13
+ Icon,
14
+ PageHeader,
15
+ Spinner,
16
+ auiButtonClass
17
+ } from "./chunk-XAU7QFG3.js";
18
+ import {
19
+ useOptionalShellMode
20
+ } from "./chunk-U7KURWW3.js";
21
+ import {
22
+ useAui
23
+ } from "./chunk-M6MHLVSO.js";
24
+ import {
25
+ cn
26
+ } from "./chunk-7Z2C2K7F.js";
27
+
28
+ // src/layouts/StackChatPanel.tsx
29
+ import { lazy, Suspense, useEffect } from "react";
30
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
31
+ var TruefoundrySettingsBuilder = lazy(() => import("./SettingsBuilder-L34IQ56S.js"));
32
+ var SchedulesPage = lazy(
33
+ () => import("./SchedulesPage-KKLUDO6B.js").then((m) => ({ default: m.SchedulesPage }))
34
+ );
35
+ function StackChatPanel({ className, threadHeaderEnd }) {
36
+ const aui = useAui();
37
+ const shell = useOptionalShellMode();
38
+ const ClearChatButton = useSlot("ClearChatButton");
39
+ const AgentDetailsPage = useSlot("AgentDetailsPage");
40
+ const AgentsLibrary = useSlot("AgentsLibrary");
41
+ const SessionsPage = useSlot("SessionsPage");
42
+ const SaveAgentButton = useSlot("SaveAgentButton");
43
+ const SelectAgentEmptyState = useSlot("SelectAgentEmptyState");
44
+ const isIdle = shell?.mode.status === "idle";
45
+ const settingsOpen = shell?.settingsOpen === true;
46
+ const libraryOpen = shell?.libraryOpen === true;
47
+ const sessionsOpen = shell?.sessionsOpen === true;
48
+ const schedulesOpen = shell?.schedulesOpen === true;
49
+ const showNewActions = shell?.isNewChatEnabled !== false;
50
+ useEffect(() => {
51
+ if (isIdle) return;
52
+ void Promise.resolve(aui.threads().switchToNewThread()).catch(() => void 0);
53
+ }, [aui, isIdle]);
54
+ const handleNewChat = () => {
55
+ shell?.setLibraryOpen(false);
56
+ shell?.setSessionsOpen(false);
57
+ if (shell?.isComposerEnabled) {
58
+ shell.openDraft();
59
+ return;
60
+ }
61
+ shell?.setSettingsOpen(false);
62
+ shell?.setSchedulesOpen(false);
63
+ void Promise.resolve(aui.threads().switchToNewThread()).catch(() => void 0);
64
+ };
65
+ const handleNewAgent = () => {
66
+ shell?.setLibraryOpen(false);
67
+ shell?.setSessionsOpen(false);
68
+ if (shell?.isComposerEnabled) {
69
+ shell.openAgentBuilder();
70
+ }
71
+ };
72
+ return /* @__PURE__ */ jsxs("div", { className: cn("relative flex h-full min-h-0 flex-col", className), children: [
73
+ settingsOpen ? /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsx(
74
+ Suspense,
75
+ {
76
+ fallback: /* @__PURE__ */ jsxs(
77
+ "div",
78
+ {
79
+ className: "flex h-full items-center justify-center",
80
+ role: "status",
81
+ "aria-live": "polite",
82
+ "aria-busy": "true",
83
+ children: [
84
+ /* @__PURE__ */ jsx(Spinner, { size: 28, className: "text-text-primary" }),
85
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Loading" })
86
+ ]
87
+ }
88
+ ),
89
+ children: /* @__PURE__ */ jsx(TruefoundrySettingsBuilder, {})
90
+ }
91
+ ) }) : sessionsOpen ? /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsx(SessionsPage, {}) }) : libraryOpen && shell?.libraryAgentId != null ? /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsx(AgentDetailsPage, { agentId: shell.libraryAgentId }, shell.libraryAgentId) }) : libraryOpen ? /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsx(AgentsLibrary, {}) }) : schedulesOpen ? /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsx(
92
+ Suspense,
93
+ {
94
+ fallback: /* @__PURE__ */ jsxs(
95
+ "div",
96
+ {
97
+ className: "flex h-full items-center justify-center",
98
+ role: "status",
99
+ "aria-live": "polite",
100
+ "aria-busy": "true",
101
+ children: [
102
+ /* @__PURE__ */ jsx(Spinner, { size: 28, className: "text-text-primary" }),
103
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Loading" })
104
+ ]
105
+ }
106
+ ),
107
+ children: /* @__PURE__ */ jsx(SchedulesPage, {})
108
+ }
109
+ ) }) : /* @__PURE__ */ jsxs(Fragment, { children: [
110
+ /* @__PURE__ */ jsx(
111
+ PageHeader,
112
+ {
113
+ start: /* @__PURE__ */ jsxs(Fragment, { children: [
114
+ showNewActions ? /* @__PURE__ */ jsx(
115
+ "button",
116
+ {
117
+ type: "button",
118
+ "aria-label": "New Chat",
119
+ title: "New Chat",
120
+ className: auiButtonClass({ variant: "ghost", size: "icon" }),
121
+ onClick: handleNewChat,
122
+ children: /* @__PURE__ */ jsx(Icon, { name: "square-pen" })
123
+ }
124
+ ) : null,
125
+ showNewActions && shell?.isComposerEnabled ? /* @__PURE__ */ jsx(
126
+ "button",
127
+ {
128
+ type: "button",
129
+ "aria-label": "New Agent",
130
+ title: "New Agent",
131
+ className: auiButtonClass({ variant: "ghost", size: "icon" }),
132
+ onClick: handleNewAgent,
133
+ children: /* @__PURE__ */ jsx(Icon, { name: "agent-2" })
134
+ }
135
+ ) : null
136
+ ] }),
137
+ title: /* @__PURE__ */ jsx(NamedAgentHeaderLabel, {}),
138
+ end: /* @__PURE__ */ jsxs(Fragment, { children: [
139
+ /* @__PURE__ */ jsx(ClearChatButton, {}),
140
+ /* @__PURE__ */ jsx(SaveAgentButton, {}),
141
+ threadHeaderEnd
142
+ ] })
143
+ }
144
+ ),
145
+ /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1", children: isIdle ? /* @__PURE__ */ jsx(SelectAgentEmptyState, {}) : /* @__PURE__ */ jsx(Thread, {}) })
146
+ ] }),
147
+ /* @__PURE__ */ jsxs("footer", { className: "flex shrink-0 items-center justify-between border-t border-border px-2 py-1.5", children: [
148
+ libraryOpen || schedulesOpen ? /* @__PURE__ */ jsxs(
149
+ "button",
150
+ {
151
+ type: "button",
152
+ className: auiButtonClass({ variant: "ghost", size: "sm" }),
153
+ onClick: () => {
154
+ shell?.setLibraryOpen(false);
155
+ shell?.setSchedulesOpen(false);
156
+ },
157
+ children: [
158
+ /* @__PURE__ */ jsx(Icon, { name: "arrow-left" }),
159
+ "Back to chat"
160
+ ]
161
+ }
162
+ ) : /* @__PURE__ */ jsx("span", {}),
163
+ /* @__PURE__ */ jsx(ShellActions, {}, "shell-actions")
164
+ ] }),
165
+ shell?.agentConfigOpen ? /* @__PURE__ */ jsx(
166
+ "aside",
167
+ {
168
+ role: "dialog",
169
+ "aria-label": "Agent Config",
170
+ className: "absolute inset-0 z-20 border-l border-border shadow-xl",
171
+ children: /* @__PURE__ */ jsx(AgentConfigDrawerContainer, { showClose: true })
172
+ }
173
+ ) : null
174
+ ] });
175
+ }
176
+
177
+ export {
178
+ StackChatPanel
179
+ };
180
+ //# sourceMappingURL=chunk-FJW36PD7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/layouts/StackChatPanel.tsx"],"sourcesContent":["'use client';\n\nimport { lazy, Suspense, useEffect, type ReactNode } from 'react';\n\nimport { useAui } from '../assistant-ui.js';\nimport { NamedAgentHeaderLabel } from '../atoms/NamedAgentHeaderLabel.js';\nimport { PageHeader } from '../atoms/PageHeader.js';\nimport { ShellActions } from '../atoms/ShellActions.js';\nimport { auiButtonClass } from '../atoms/lib/buttonClasses.js';\nimport { cn } from '../atoms/lib/cn.js';\nimport { Spinner } from '../atoms/primitives/Spinner.js';\nimport { AgentConfigDrawerContainer } from '../containers/AgentConfigDrawerContainer.js';\nimport { Thread } from '../containers/Thread.js';\nimport { Icon } from '../icons/Icon.js';\nimport { useOptionalShellMode } from '../server/ShellModeContext.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nconst TruefoundrySettingsBuilder = lazy(() => import('../containers/SettingsBuilder/index.js'));\nconst SchedulesPage = lazy(() =>\n import('../atoms/schedules/SchedulesPage.js').then(m => ({ default: m.SchedulesPage })),\n);\n\nexport type StackChatPanelProps = {\n className?: string;\n /** Extra actions in the thread header (e.g. close for widget). */\n threadHeaderEnd?: ReactNode;\n};\n\n/**\n * Thread stack used by `dock` and `widget` layouts.\n * New Chat / New Agent replace the former in-panel recent-session list.\n */\nexport function StackChatPanel({ className, threadHeaderEnd }: StackChatPanelProps) {\n const aui = useAui();\n const shell = useOptionalShellMode();\n const ClearChatButton = useSlot('ClearChatButton');\n const AgentDetailsPage = useSlot('AgentDetailsPage');\n const AgentsLibrary = useSlot('AgentsLibrary');\n const SessionsPage = useSlot('SessionsPage');\n const SaveAgentButton = useSlot('SaveAgentButton');\n const SelectAgentEmptyState = useSlot('SelectAgentEmptyState');\n const isIdle = shell?.mode.status === 'idle';\n const settingsOpen = shell?.settingsOpen === true;\n const libraryOpen = shell?.libraryOpen === true;\n const sessionsOpen = shell?.sessionsOpen === true;\n const schedulesOpen = shell?.schedulesOpen === true;\n const showNewActions = shell?.isNewChatEnabled !== false;\n\n useEffect(() => {\n if (isIdle) return;\n void Promise.resolve(aui.threads().switchToNewThread()).catch(() => undefined);\n }, [aui, isIdle]);\n\n const handleNewChat = () => {\n shell?.setLibraryOpen(false);\n shell?.setSessionsOpen(false);\n if (shell?.isComposerEnabled) {\n shell.openDraft();\n return;\n }\n shell?.setSettingsOpen(false);\n shell?.setSchedulesOpen(false);\n void Promise.resolve(aui.threads().switchToNewThread()).catch(() => undefined);\n };\n\n const handleNewAgent = () => {\n shell?.setLibraryOpen(false);\n shell?.setSessionsOpen(false);\n if (shell?.isComposerEnabled) {\n shell.openAgentBuilder();\n }\n };\n\n return (\n <div className={cn('relative flex h-full min-h-0 flex-col', className)}>\n {settingsOpen ? (\n <div className=\"min-h-0 flex-1\">\n <Suspense\n fallback={\n <div\n className=\"flex h-full items-center justify-center\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n >\n <Spinner size={28} className=\"text-text-primary\" />\n <span className=\"sr-only\">Loading</span>\n </div>\n }\n >\n <TruefoundrySettingsBuilder />\n </Suspense>\n </div>\n ) : sessionsOpen ? (\n <div className=\"min-h-0 flex-1\">\n <SessionsPage />\n </div>\n ) : libraryOpen && shell?.libraryAgentId != null ? (\n <div className=\"min-h-0 flex-1\">\n <AgentDetailsPage key={shell.libraryAgentId} agentId={shell.libraryAgentId} />\n </div>\n ) : libraryOpen ? (\n <div className=\"min-h-0 flex-1\">\n <AgentsLibrary />\n </div>\n ) : schedulesOpen ? (\n <div className=\"min-h-0 flex-1\">\n <Suspense\n fallback={\n <div\n className=\"flex h-full items-center justify-center\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n >\n <Spinner size={28} className=\"text-text-primary\" />\n <span className=\"sr-only\">Loading</span>\n </div>\n }\n >\n <SchedulesPage />\n </Suspense>\n </div>\n ) : (\n <>\n <PageHeader\n start={\n <>\n {showNewActions ? (\n <button\n type=\"button\"\n aria-label=\"New Chat\"\n title=\"New Chat\"\n className={auiButtonClass({ variant: 'ghost', size: 'icon' })}\n onClick={handleNewChat}\n >\n <Icon name=\"square-pen\" />\n </button>\n ) : null}\n {showNewActions && shell?.isComposerEnabled ? (\n <button\n type=\"button\"\n aria-label=\"New Agent\"\n title=\"New Agent\"\n className={auiButtonClass({ variant: 'ghost', size: 'icon' })}\n onClick={handleNewAgent}\n >\n <Icon name=\"agent-2\" />\n </button>\n ) : null}\n </>\n }\n title={<NamedAgentHeaderLabel />}\n end={\n <>\n <ClearChatButton />\n <SaveAgentButton />\n {threadHeaderEnd}\n </>\n }\n />\n <div className=\"min-h-0 flex-1\">{isIdle ? <SelectAgentEmptyState /> : <Thread />}</div>\n </>\n )}\n {/* Stable mount: only ShellActions needs to survive Settings / list / thread; host end chrome stays in the thread header. */}\n <footer className=\"flex shrink-0 items-center justify-between border-t border-border px-2 py-1.5\">\n {libraryOpen || schedulesOpen ? (\n <button\n type=\"button\"\n className={auiButtonClass({ variant: 'ghost', size: 'sm' })}\n onClick={() => {\n shell?.setLibraryOpen(false);\n shell?.setSchedulesOpen(false);\n }}\n >\n <Icon name=\"arrow-left\" />\n Back to chat\n </button>\n ) : (\n <span />\n )}\n <ShellActions key=\"shell-actions\" />\n </footer>\n {shell?.agentConfigOpen ? (\n <aside\n role=\"dialog\"\n aria-label=\"Agent Config\"\n className=\"absolute inset-0 z-20 border-l border-border shadow-xl\"\n >\n <AgentConfigDrawerContainer showClose />\n </aside>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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","names":[]}