@truefoundry/trueforge-ui 0.3.0-rc.0 → 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 (110) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +14 -6
  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-FXQ5B7TN.js → ConnectorSettings-MXFRWWR6.js} +8 -6
  15. package/dist/{ConnectorSettings-FXQ5B7TN.js.map → ConnectorSettings-MXFRWWR6.js.map} +1 -1
  16. package/dist/{DockLayout-LBNQJZNF.js → DockLayout-LM4AFMFY.js} +11 -10
  17. package/dist/{DockLayout-LBNQJZNF.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-4L4LOQJA.js → ModelSettings-G7IFNC2Y.js} +8 -6
  21. package/dist/{ModelSettings-4L4LOQJA.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-Z4ZG6ZX4.js → SandboxSettings-NXAANMAX.js} +8 -6
  25. package/dist/{SandboxSettings-Z4ZG6ZX4.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-WF7ZWKQW.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-3EPPC3IT.js → SkillSettings-FGGMSUNO.js} +8 -6
  35. package/dist/{SkillSettings-3EPPC3IT.js.map → SkillSettings-FGGMSUNO.js.map} +1 -1
  36. package/dist/{TrueForgeUIWithRouter-NZ4FGPE4.js → TrueForgeUIWithRouter-MZVJWJMB.js} +14 -10
  37. package/dist/{TrueForgeUIWithRouter-NZ4FGPE4.js.map → TrueForgeUIWithRouter-MZVJWJMB.js.map} +1 -1
  38. package/dist/{WidgetLayout-3QZ357FL.js → WidgetLayout-6QM45OQQ.js} +17 -13
  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-WREC7D54.js → chunk-CYHJDKFB.js} +115 -32
  47. package/dist/chunk-CYHJDKFB.js.map +1 -0
  48. package/dist/chunk-DJUFS2BW.js +27 -0
  49. package/dist/chunk-DJUFS2BW.js.map +1 -0
  50. package/dist/chunk-DMMZSZTN.js +252 -0
  51. package/dist/chunk-DMMZSZTN.js.map +1 -0
  52. package/dist/chunk-FJW36PD7.js +180 -0
  53. package/dist/chunk-FJW36PD7.js.map +1 -0
  54. package/dist/chunk-M62XY4NC.js +555 -0
  55. package/dist/chunk-M62XY4NC.js.map +1 -0
  56. package/dist/{chunk-B52K63AW.js → chunk-MPNSO7E6.js} +2 -2
  57. package/dist/{chunk-CFLVPV5M.js → chunk-QC42MLAK.js} +7 -2
  58. package/dist/chunk-QC42MLAK.js.map +1 -0
  59. package/dist/chunk-RDXBMTP5.js +32 -0
  60. package/dist/chunk-RDXBMTP5.js.map +1 -0
  61. package/dist/chunk-SFZNIO6U.js +18 -0
  62. package/dist/chunk-SFZNIO6U.js.map +1 -0
  63. package/dist/chunk-U7KURWW3.js +840 -0
  64. package/dist/chunk-U7KURWW3.js.map +1 -0
  65. package/dist/chunk-WVE3F724.js +200 -0
  66. package/dist/chunk-WVE3F724.js.map +1 -0
  67. package/dist/{chunk-FJ5RSSMA.js → chunk-XAU7QFG3.js} +178 -36
  68. package/dist/chunk-XAU7QFG3.js.map +1 -0
  69. package/dist/chunk-Y6S4OVVQ.js +16 -0
  70. package/dist/chunk-Y6S4OVVQ.js.map +1 -0
  71. package/dist/chunk-ZKNUMH2M.js +119 -0
  72. package/dist/chunk-ZKNUMH2M.js.map +1 -0
  73. package/dist/chunk-ZTMKFZQ3.js +13214 -0
  74. package/dist/chunk-ZTMKFZQ3.js.map +1 -0
  75. package/dist/{createTrueFoundryServer-B72bU-J7.d.ts → createTrueFoundryServer-CmZnBh_l.d.ts} +15 -4
  76. package/dist/index.d.ts +1002 -22
  77. package/dist/index.js +689 -67
  78. package/dist/index.js.map +1 -1
  79. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +552 -8
  80. package/dist/plugins/trueforge-agent-server-adapter/index.js +503 -188
  81. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  82. package/dist/styles.css +1 -1
  83. package/package.json +8 -7
  84. package/dist/DrawerLayout-Q6UK4VMI.js +0 -159
  85. package/dist/DrawerLayout-Q6UK4VMI.js.map +0 -1
  86. package/dist/OpenUiFenceBlock-6UIIAVBX.js +0 -9
  87. package/dist/SettingsBuilder-WF7ZWKQW.js.map +0 -1
  88. package/dist/ShellRouteSync-T4WLY57Q.js.map +0 -1
  89. package/dist/SidebarLayout-3WZ3CVON.js +0 -256
  90. package/dist/SidebarLayout-3WZ3CVON.js.map +0 -1
  91. package/dist/WidgetLayout-3QZ357FL.js.map +0 -1
  92. package/dist/chunk-36KOSC2J.js +0 -567
  93. package/dist/chunk-36KOSC2J.js.map +0 -1
  94. package/dist/chunk-3S6KHO7H.js +0 -2121
  95. package/dist/chunk-3S6KHO7H.js.map +0 -1
  96. package/dist/chunk-7L63OK3O.js +0 -91
  97. package/dist/chunk-7L63OK3O.js.map +0 -1
  98. package/dist/chunk-CFLVPV5M.js.map +0 -1
  99. package/dist/chunk-FJ5RSSMA.js.map +0 -1
  100. package/dist/chunk-OSV3HI5M.js +0 -6891
  101. package/dist/chunk-OSV3HI5M.js.map +0 -1
  102. package/dist/chunk-WQULF5AT.js +0 -460
  103. package/dist/chunk-WQULF5AT.js.map +0 -1
  104. package/dist/chunk-WREC7D54.js.map +0 -1
  105. package/dist/chunk-YIWUG6MC.js +0 -101
  106. package/dist/chunk-YIWUG6MC.js.map +0 -1
  107. package/dist/chunk-ZXOADNF3.js +0 -75
  108. package/dist/chunk-ZXOADNF3.js.map +0 -1
  109. /package/dist/{OpenUiFenceBlock-6UIIAVBX.js.map → AgentMetricChart-JPU3MFQ2.js.map} +0 -0
  110. /package/dist/{chunk-B52K63AW.js.map → chunk-MPNSO7E6.js.map} +0 -0
@@ -0,0 +1,555 @@
1
+ import {
2
+ ComposerBusyProvider,
3
+ useComposerBusyState,
4
+ useOptionalCustomActionRenderers
5
+ } from "./chunk-BSIPI3KV.js";
6
+ import {
7
+ ASK_USER_CUSTOM_OPTION,
8
+ AssistantMessageContainer,
9
+ Button,
10
+ ComposerAttachmentsContainer,
11
+ MessageAttachmentsContainer,
12
+ SlotsProvider,
13
+ UserMessageContainer,
14
+ isNewChatView,
15
+ preloadMarkdownOpenUI,
16
+ useMCPAuth,
17
+ useSlot,
18
+ useSlotIsDefault
19
+ } from "./chunk-ZTMKFZQ3.js";
20
+ import {
21
+ DraftCatalogProvider,
22
+ useDraftCatalog
23
+ } from "./chunk-XAU7QFG3.js";
24
+ import {
25
+ useOptionalCatalogServer,
26
+ useOptionalServer,
27
+ useOptionalShellMode
28
+ } from "./chunk-U7KURWW3.js";
29
+ import {
30
+ useAui,
31
+ useAuiState
32
+ } from "./chunk-M6MHLVSO.js";
33
+
34
+ // src/containers/AskUserContainer.tsx
35
+ import { useThreadIsRunning } from "@assistant-ui/core/react";
36
+ import { useTrueFoundryToolResponses } from "@truefoundry/assistant-ui-runtime";
37
+ import { useCallback, useEffect, useMemo, useState } from "react";
38
+ import { jsx } from "react/jsx-runtime";
39
+ var EMPTY_ANSWER = { radioValue: "", custom: "" };
40
+ function AskUserContainer() {
41
+ const AskUserPrompt = useSlot("AskUserPrompt");
42
+ const { pending, respond } = useTrueFoundryToolResponses();
43
+ const isRunning = useThreadIsRunning();
44
+ const item = pending[0];
45
+ const questions = useMemo(
46
+ () => item == null ? [] : [
47
+ {
48
+ id: item.toolCallId,
49
+ question: item.question ?? "Answer required",
50
+ options: item.options ?? []
51
+ }
52
+ ],
53
+ [item]
54
+ );
55
+ const [currentQuestionIndex, setCurrentQuestionIndex] = useState(0);
56
+ const [answers, setAnswers] = useState({});
57
+ useEffect(() => {
58
+ setCurrentQuestionIndex(0);
59
+ setAnswers({});
60
+ }, [item?.toolCallId]);
61
+ const safeIndex = Math.min(currentQuestionIndex, Math.max(questions.length - 1, 0));
62
+ const currentQuestion = questions[safeIndex];
63
+ const currentAnswer = currentQuestion == null ? EMPTY_ANSWER : answers[currentQuestion.id] ?? EMPTY_ANSWER;
64
+ const getResponseForQuestion = useCallback(
65
+ (questionId) => {
66
+ const answer = answers[questionId] ?? EMPTY_ANSWER;
67
+ return answer.radioValue === ASK_USER_CUSTOM_OPTION ? answer.custom.trim() : answer.radioValue.trim();
68
+ },
69
+ [answers]
70
+ );
71
+ const allQuestionsAnswered = useMemo(
72
+ () => questions.every((question) => getResponseForQuestion(question.id)),
73
+ [getResponseForQuestion, questions]
74
+ );
75
+ const selectedResponse = currentAnswer.radioValue === ASK_USER_CUSTOM_OPTION ? currentAnswer.custom.trim() : currentAnswer.radioValue.trim();
76
+ const isSubmitDisabled = isRunning || currentQuestion == null || selectedResponse.length === 0;
77
+ const isSubmitAllDisabled = isSubmitDisabled || !allQuestionsAnswered;
78
+ const onCurrentAnswerChange = useCallback((questionId, update) => {
79
+ setAnswers((previous) => ({
80
+ ...previous,
81
+ [questionId]: {
82
+ ...previous[questionId] ?? EMPTY_ANSWER,
83
+ ...update
84
+ }
85
+ }));
86
+ }, []);
87
+ const onSubmit = useCallback(() => {
88
+ if (item == null || !allQuestionsAnswered) return;
89
+ const content = getResponseForQuestion(item.toolCallId);
90
+ if (!content) return;
91
+ respond({ toolCallId: item.toolCallId, content });
92
+ }, [allQuestionsAnswered, getResponseForQuestion, item, respond]);
93
+ if (item == null || currentQuestion == null) return null;
94
+ return /* @__PURE__ */ jsx(
95
+ AskUserPrompt,
96
+ {
97
+ questions,
98
+ readOnly: isRunning,
99
+ currentQuestion,
100
+ currentQuestionIndex: safeIndex,
101
+ currentAnswer,
102
+ totalQuestions: questions.length,
103
+ isMultiQuestion: questions.length > 1,
104
+ isLastQuestion: safeIndex === questions.length - 1,
105
+ allQuestionsAnswered,
106
+ isSubmitDisabled,
107
+ isSubmitAllDisabled,
108
+ onCurrentQuestionIndexChange: setCurrentQuestionIndex,
109
+ onCurrentAnswerChange,
110
+ onSubmit
111
+ }
112
+ );
113
+ }
114
+
115
+ // src/hooks/useComposerPauseView.ts
116
+ import { useAuiState as useAuiState2 } from "@assistant-ui/react";
117
+ import { useTrueFoundryToolResponses as useTrueFoundryToolResponses2 } from "@truefoundry/assistant-ui-runtime";
118
+ function threadHasPendingMcpAuth(s) {
119
+ const messages = s.thread.messages;
120
+ const last = messages[messages.length - 1];
121
+ if (last?.role !== "assistant") return false;
122
+ if (last.status?.type !== "requires-action") return false;
123
+ return last.metadata?.custom?.pendingMcpAuth === true;
124
+ }
125
+ function useComposerPauseView() {
126
+ const mcpPending = useAuiState2(threadHasPendingMcpAuth);
127
+ const { pending: toolResponsesPending } = useTrueFoundryToolResponses2();
128
+ const customActionRenderers = useOptionalCustomActionRenderers();
129
+ if (mcpPending) {
130
+ return { kind: "mcp" };
131
+ }
132
+ const firstPending = toolResponsesPending[0];
133
+ if (firstPending != null) {
134
+ const toolName = firstPending.toolName;
135
+ if (toolName != null && customActionRenderers?.[toolName] != null) {
136
+ return { kind: "custom", toolName };
137
+ }
138
+ return { kind: "ask-user" };
139
+ }
140
+ return { kind: "compose" };
141
+ }
142
+
143
+ // src/containers/CustomActionContainer.tsx
144
+ import { useThreadIsRunning as useThreadIsRunning2 } from "@assistant-ui/core/react";
145
+ import { useTrueFoundryToolResponses as useTrueFoundryToolResponses3 } from "@truefoundry/assistant-ui-runtime";
146
+ import { useCallback as useCallback2 } from "react";
147
+ import { jsx as jsx2 } from "react/jsx-runtime";
148
+ function CustomActionContainer() {
149
+ const renderers = useOptionalCustomActionRenderers();
150
+ const { pending, respond } = useTrueFoundryToolResponses3();
151
+ const isRunning = useThreadIsRunning2();
152
+ const item = pending[0];
153
+ const onSubmit = useCallback2(
154
+ (content) => {
155
+ if (item == null) return;
156
+ const trimmed = content.trim();
157
+ if (!trimmed) return;
158
+ respond({ toolCallId: item.toolCallId, content: trimmed });
159
+ },
160
+ [item, respond]
161
+ );
162
+ if (item == null || item.toolName == null) return null;
163
+ const Renderer = renderers?.[item.toolName];
164
+ if (Renderer == null) return null;
165
+ return /* @__PURE__ */ jsx2(Renderer, { args: item.args ?? {}, disabled: isRunning, onSubmit });
166
+ }
167
+
168
+ // src/containers/McpAuthContainer.tsx
169
+ import { useThreadIsRunning as useThreadIsRunning3 } from "@assistant-ui/core/react";
170
+ import { useTrueFoundryMcpAuth } from "@truefoundry/assistant-ui-runtime";
171
+ import { jsx as jsx3 } from "react/jsx-runtime";
172
+ function CatalogMcpAuthPrompt({ servers, onContinue, readOnly }) {
173
+ const McpAuthPrompt = useSlot("McpAuthPrompt");
174
+ const { handleAuthorize } = useMCPAuth();
175
+ const { refreshConnectors } = useDraftCatalog();
176
+ const handleConnect = (serverId) => {
177
+ void handleAuthorize(serverId, (isSuccess) => {
178
+ if (isSuccess) {
179
+ void refreshConnectors();
180
+ }
181
+ });
182
+ };
183
+ return /* @__PURE__ */ jsx3(McpAuthPrompt, { servers, onConnect: handleConnect, onContinue, readOnly });
184
+ }
185
+ function McpAuthContainer() {
186
+ const McpAuthPrompt = useSlot("McpAuthPrompt");
187
+ const { pending, resume } = useTrueFoundryMcpAuth();
188
+ const isRunning = useThreadIsRunning3();
189
+ const catalog = useOptionalCatalogServer();
190
+ if (!pending) return null;
191
+ if (catalog) {
192
+ return /* @__PURE__ */ jsx3(CatalogMcpAuthPrompt, { servers: pending.mcpServers, onContinue: () => void resume(), readOnly: isRunning });
193
+ }
194
+ const handleConnect = (serverId) => {
195
+ const server = pending.mcpServers.find((s) => s.id === serverId);
196
+ if (server?.authUrl) {
197
+ window.open(server.authUrl, "_blank", "noopener,noreferrer");
198
+ }
199
+ };
200
+ return /* @__PURE__ */ jsx3(
201
+ McpAuthPrompt,
202
+ {
203
+ servers: pending.mcpServers,
204
+ onConnect: handleConnect,
205
+ onContinue: () => void resume(),
206
+ readOnly: isRunning
207
+ }
208
+ );
209
+ }
210
+
211
+ // src/containers/ComposerContainer.tsx
212
+ import { ComposerPrimitive, useAui as useAui2, useAuiState as useAuiState3 } from "@assistant-ui/react";
213
+ import { useTrueFoundryAgentSpec, useTrueFoundryCancel } from "@truefoundry/assistant-ui-runtime";
214
+ import { useRef } from "react";
215
+ import { Fragment, jsx as jsx4, jsxs } from "react/jsx-runtime";
216
+ function ComposerBody({ placeholder }) {
217
+ const ComposerShell = useSlot("ComposerShell");
218
+ const aui = useAui2();
219
+ const shell = useOptionalShellMode();
220
+ const hasText = useAuiState3((s) => s.composer.text.trim().length > 0);
221
+ const { agentSpec } = useTrueFoundryAgentSpec();
222
+ const requiresModel = shell == null || shell.mode.status === "active" && shell.mode.isMutable;
223
+ const hasModel = Boolean(agentSpec?.model?.name?.trim());
224
+ const { isBusy, send, resetBusy } = useComposerBusyState();
225
+ const cancel = useTrueFoundryCancel();
226
+ const fileInputRef = useRef(null);
227
+ const canSubmit = !isBusy && hasText && (!requiresModel || hasModel);
228
+ const submit = () => {
229
+ if (!canSubmit) return;
230
+ send(() => aui.composer().send());
231
+ };
232
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
233
+ /* @__PURE__ */ jsx4(
234
+ "input",
235
+ {
236
+ ref: fileInputRef,
237
+ type: "file",
238
+ multiple: true,
239
+ hidden: true,
240
+ onChange: (event) => {
241
+ const files = event.target.files;
242
+ if (files) {
243
+ for (const file of files) {
244
+ void aui.composer().addAttachment(file);
245
+ }
246
+ }
247
+ event.target.value = "";
248
+ }
249
+ }
250
+ ),
251
+ /* @__PURE__ */ jsx4(
252
+ ComposerPrimitive.AttachmentDropzone,
253
+ {
254
+ disabled: isBusy,
255
+ "data-slot": "aui_composer-attachment-dropzone",
256
+ className: "w-full rounded-[0.75rem] transition-[box-shadow] data-[dragging=true]:ring-focus-ring/20 data-[dragging=true]:ring-3",
257
+ children: /* @__PURE__ */ jsx4(
258
+ ComposerPrimitive.Root,
259
+ {
260
+ "data-slot": "aui_composer-root",
261
+ className: "w-full",
262
+ onSubmit: (event) => {
263
+ event.preventDefault();
264
+ submit();
265
+ },
266
+ children: /* @__PURE__ */ jsx4(
267
+ ComposerShell,
268
+ {
269
+ attachments: /* @__PURE__ */ jsx4(ComposerAttachmentsContainer, {}),
270
+ input: /* @__PURE__ */ jsx4(
271
+ ComposerPrimitive.Input,
272
+ {
273
+ "data-slot": "aui_composer-input",
274
+ placeholder,
275
+ disabled: isBusy,
276
+ submitMode: "enter",
277
+ "aria-label": "Message input",
278
+ className: "text-text-primary placeholder:text-text-secondary/80 max-h-[10lh] min-h-10 w-full resize-none overflow-y-auto rounded-lg border-none bg-transparent px-1 py-1 text-base leading-normal shadow-none outline-none disabled:cursor-not-allowed"
279
+ }
280
+ ),
281
+ disabled: isBusy,
282
+ canSubmit,
283
+ isRunning: isBusy,
284
+ onSubmit: submit,
285
+ onCancel: () => {
286
+ resetBusy();
287
+ void cancel();
288
+ },
289
+ onAttach: () => fileInputRef.current?.click()
290
+ }
291
+ )
292
+ }
293
+ )
294
+ }
295
+ )
296
+ ] });
297
+ }
298
+ function ComposerContainer({
299
+ placeholder = "Ask anything... (Shift+Enter for new line)"
300
+ }) {
301
+ const pauseView = useComposerPauseView();
302
+ const shell = useOptionalShellMode();
303
+ const parentLeftSection = useSlot("ComposerLeftSection");
304
+ const parentRightSection = useSlot("ComposerRightSection");
305
+ const usesDefaultLeftSection = useSlotIsDefault("ComposerLeftSection");
306
+ const usesDefaultRightSection = useSlotIsDefault("ComposerRightSection");
307
+ const DraftComposerLeftSection = useSlot("DraftComposerLeftSection");
308
+ const DraftComposerRightSection = useSlot("DraftComposerRightSection");
309
+ const canMutateSpec = shell?.mode.status === "active" && shell.mode.isMutable;
310
+ if (pauseView.kind === "mcp") {
311
+ return /* @__PURE__ */ jsx4(McpAuthContainer, {});
312
+ }
313
+ if (pauseView.kind === "custom") {
314
+ return /* @__PURE__ */ jsx4(CustomActionContainer, {});
315
+ }
316
+ if (pauseView.kind === "ask-user") {
317
+ return /* @__PURE__ */ jsx4(AskUserContainer, {});
318
+ }
319
+ if (canMutateSpec) {
320
+ return /* @__PURE__ */ jsx4(DraftCatalogProvider, { children: /* @__PURE__ */ jsx4(
321
+ SlotsProvider,
322
+ {
323
+ overrides: {
324
+ ComposerLeftSection: usesDefaultLeftSection ? DraftComposerLeftSection : parentLeftSection,
325
+ ComposerRightSection: usesDefaultRightSection ? DraftComposerRightSection : parentRightSection
326
+ },
327
+ children: /* @__PURE__ */ jsx4(ComposerBody, { placeholder })
328
+ }
329
+ ) });
330
+ }
331
+ return /* @__PURE__ */ jsx4(ComposerBody, { placeholder });
332
+ }
333
+
334
+ // src/containers/HistoryLoaderContainer.tsx
335
+ import { useTrueFoundryHistoryPagination } from "@truefoundry/assistant-ui-runtime";
336
+ import { useCallback as useCallback3, useEffect as useEffect2, useRef as useRef2, useState as useState2 } from "react";
337
+ import { jsx as jsx5 } from "react/jsx-runtime";
338
+ var TOP_THRESHOLD_PX = 200;
339
+ var VIEWPORT_SELECTOR = '[data-slot="aui_thread-viewport"]';
340
+ function HistoryLoaderContainer() {
341
+ const HistoryLoader = useSlot("HistoryLoader");
342
+ const { hasOlderHistory, isLoadingOlderHistory, loadOlderHistory } = useTrueFoundryHistoryPagination();
343
+ const [sentinel, setSentinel] = useState2(null);
344
+ const inflightRef = useRef2(false);
345
+ const maybeLoadOlder = useCallback3(async () => {
346
+ if (inflightRef.current) return;
347
+ inflightRef.current = true;
348
+ const viewport = sentinel?.closest(VIEWPORT_SELECTOR) ?? null;
349
+ const prevScrollHeight = viewport?.scrollHeight ?? 0;
350
+ const prevScrollTop = viewport?.scrollTop ?? 0;
351
+ try {
352
+ await loadOlderHistory();
353
+ requestAnimationFrame(() => {
354
+ if (viewport == null) return;
355
+ const delta = viewport.scrollHeight - prevScrollHeight;
356
+ if (delta > 0) {
357
+ viewport.scrollTo({ top: prevScrollTop + delta, behavior: "instant" });
358
+ }
359
+ });
360
+ } catch {
361
+ } finally {
362
+ inflightRef.current = false;
363
+ }
364
+ }, [sentinel, loadOlderHistory]);
365
+ useEffect2(() => {
366
+ if (sentinel == null || !hasOlderHistory) return;
367
+ const viewport = sentinel.closest(VIEWPORT_SELECTOR);
368
+ const observer = new IntersectionObserver(
369
+ (entries) => {
370
+ if (entries.some((entry) => entry.isIntersecting)) {
371
+ void maybeLoadOlder();
372
+ }
373
+ },
374
+ { root: viewport, rootMargin: `${TOP_THRESHOLD_PX}px 0px 0px 0px` }
375
+ );
376
+ observer.observe(sentinel);
377
+ return () => observer.disconnect();
378
+ }, [sentinel, hasOlderHistory, maybeLoadOlder]);
379
+ if (!hasOlderHistory) return null;
380
+ return /* @__PURE__ */ jsx5(HistoryLoader, { ref: setSentinel, isLoading: isLoadingOlderHistory });
381
+ }
382
+
383
+ // src/containers/ResumeUnavailableContainer.tsx
384
+ import { useTrueFoundryResumeUnavailable } from "@truefoundry/assistant-ui-runtime";
385
+ import { jsx as jsx6 } from "react/jsx-runtime";
386
+ function ResumeUnavailableContainer() {
387
+ const ResumeUnavailable = useSlot("ResumeUnavailable");
388
+ const resumeUnavailable = useTrueFoundryResumeUnavailable();
389
+ if (!resumeUnavailable) return null;
390
+ return /* @__PURE__ */ jsx6(ResumeUnavailable, {});
391
+ }
392
+
393
+ // src/containers/UserEditComposerContainer.tsx
394
+ import { useComposerCancel, useComposerSend, useThreadIsRunning as useThreadIsRunning4 } from "@assistant-ui/core/react";
395
+ import { ComposerPrimitive as ComposerPrimitive2, MessagePrimitive, useAuiState as useAuiState4 } from "@assistant-ui/react";
396
+ import { jsx as jsx7, jsxs as jsxs2 } from "react/jsx-runtime";
397
+ function ReadOnlyMessageAttachments() {
398
+ const hasAttachments = useAuiState4((s) => (s.message.attachments?.length ?? 0) > 0);
399
+ if (!hasAttachments) {
400
+ return null;
401
+ }
402
+ return /* @__PURE__ */ jsx7("div", { className: "pointer-events-none mb-2 opacity-90", children: /* @__PURE__ */ jsx7(MessageAttachmentsContainer, {}) });
403
+ }
404
+ function UserEditComposerContainer() {
405
+ const UserMessageEdit = useSlot("UserMessageEdit");
406
+ const MessageTimestamp = useSlot("MessageTimestamp");
407
+ const isRunning = useThreadIsRunning4();
408
+ const createdAt = useAuiState4((s) => s.message.createdAt);
409
+ const { cancel, disabled: cancelDisabled } = useComposerCancel();
410
+ const { disabled: sendDisabled } = useComposerSend();
411
+ return /* @__PURE__ */ jsx7(MessagePrimitive.Root, { "data-role": "user", children: /* @__PURE__ */ jsx7(
412
+ ComposerPrimitive2.Root,
413
+ {
414
+ "data-slot": "aui_user-edit-composer-root",
415
+ className: "fade-in slide-in-from-bottom-1 animate-in flex w-full justify-end px-2 duration-150",
416
+ children: /* @__PURE__ */ jsx7(
417
+ UserMessageEdit,
418
+ {
419
+ timestamp: /* @__PURE__ */ jsx7(MessageTimestamp, { createdAt }),
420
+ attachments: /* @__PURE__ */ jsx7(ReadOnlyMessageAttachments, {}),
421
+ input: /* @__PURE__ */ jsx7("div", { className: "mt-1 rounded border border-border bg-secondary-bg p-2 text-text-primary", children: /* @__PURE__ */ jsx7(
422
+ ComposerPrimitive2.Input,
423
+ {
424
+ "data-slot": "aui_user-edit-input",
425
+ disabled: isRunning,
426
+ submitMode: "enter",
427
+ "aria-label": "Edit message",
428
+ className: "max-h-32 min-h-10 w-full resize-none border-none bg-transparent p-0 text-base leading-[1.34] outline-none focus:shadow-none"
429
+ }
430
+ ) }),
431
+ footer: /* @__PURE__ */ jsxs2("div", { className: "flex items-center justify-end gap-2", children: [
432
+ /* @__PURE__ */ jsx7(Button, { variant: "secondary", type: "button", disabled: cancelDisabled, onClick: cancel, children: "Cancel" }),
433
+ /* @__PURE__ */ jsx7(ComposerPrimitive2.Send, { asChild: true, children: /* @__PURE__ */ jsx7(Button, { type: "submit", disabled: sendDisabled || isRunning, children: "Save & Rerun" }) })
434
+ ] })
435
+ }
436
+ )
437
+ }
438
+ ) });
439
+ }
440
+
441
+ // src/containers/ThreadContainer.tsx
442
+ import { ThreadPrimitive, useAuiState as useAuiState5 } from "@assistant-ui/react";
443
+ import { useEffect as useEffect4 } from "react";
444
+
445
+ // src/hooks/useSyncSessionTitle.ts
446
+ import { useThreadIsRunning as useThreadIsRunning5 } from "@assistant-ui/core/react";
447
+ import { useEffect as useEffect3, useRef as useRef3 } from "react";
448
+ function useSyncSessionTitle() {
449
+ const server = useOptionalServer();
450
+ const aui = useAui();
451
+ const remoteId = useAuiState((s) => s.threadListItem.remoteId);
452
+ const title = useAuiState((s) => s.threadListItem.title);
453
+ const isRunning = useThreadIsRunning5();
454
+ const wasRunningRef = useRef3(false);
455
+ const syncedRemoteIdRef = useRef3(void 0);
456
+ useEffect3(() => {
457
+ syncedRemoteIdRef.current = void 0;
458
+ }, [remoteId]);
459
+ useEffect3(() => {
460
+ const finishedTurn = wasRunningRef.current && !isRunning;
461
+ wasRunningRef.current = isRunning;
462
+ if (!finishedTurn || server == null || remoteId == null) {
463
+ return;
464
+ }
465
+ if (syncedRemoteIdRef.current === remoteId) {
466
+ return;
467
+ }
468
+ if (title != null && title.trim() !== "") {
469
+ syncedRemoteIdRef.current = remoteId;
470
+ return;
471
+ }
472
+ let cancelled = false;
473
+ void server.getSession({ sessionId: remoteId }).then((session) => {
474
+ if (cancelled) return;
475
+ const nextTitle = typeof session.title === "string" ? session.title.trim() : "";
476
+ if (nextTitle.length === 0) return;
477
+ syncedRemoteIdRef.current = remoteId;
478
+ return aui.threadListItem().rename(nextTitle);
479
+ }).catch(() => void 0);
480
+ return () => {
481
+ cancelled = true;
482
+ };
483
+ }, [aui, isRunning, remoteId, server, title]);
484
+ }
485
+
486
+ // src/containers/ThreadContainer.tsx
487
+ import { Fragment as Fragment2, jsx as jsx8, jsxs as jsxs3 } from "react/jsx-runtime";
488
+ function AnimatedMessageShell({ children }) {
489
+ return /* @__PURE__ */ jsx8("div", { className: "animate-in fade-in slide-in-from-bottom-1 fill-mode-both duration-200", children });
490
+ }
491
+ function ThreadMessage({ isEditing }) {
492
+ const role = useAuiState5((s) => s.message.role);
493
+ if (role === "user") {
494
+ if (isEditing) {
495
+ return /* @__PURE__ */ jsx8(UserEditComposerContainer, {});
496
+ }
497
+ return /* @__PURE__ */ jsx8(UserMessageContainer, {});
498
+ }
499
+ return /* @__PURE__ */ jsx8(AssistantMessageContainer, {});
500
+ }
501
+ function ThreadContainer({ composer }) {
502
+ useEffect4(() => {
503
+ void preloadMarkdownOpenUI();
504
+ }, []);
505
+ useSyncSessionTitle();
506
+ const shell = useOptionalShellMode();
507
+ const WelcomeScreen = useSlot("WelcomeScreen");
508
+ const MessageListSkeleton = useSlot("MessageListSkeleton");
509
+ const ScrollToBottomButton = useSlot("ScrollToBottomButton");
510
+ const MessageGroup = useSlot("MessageGroup");
511
+ const ThreadComposerAreaShell = useSlot("ThreadComposerAreaShell");
512
+ const ThreadRootShell = useSlot("ThreadRootShell");
513
+ const ThreadViewportShell = useSlot("ThreadViewportShell");
514
+ const isEmpty = useAuiState5(isNewChatView);
515
+ const isLoading = useAuiState5((s) => s.thread.isLoading);
516
+ const welcomeHeading = shell?.mode.status === "active" ? shell.mode.agentName != null && shell.mode.agentName.length > 0 ? shell.mode.agentName : shell.mode.isMutable && shell.mode.isCreateAgent ? "Start building a new Agent" : void 0 : void 0;
517
+ return /* @__PURE__ */ jsx8(ComposerBusyProvider, { children: /* @__PURE__ */ jsx8(ThreadPrimitive.Root, { asChild: true, children: /* @__PURE__ */ jsxs3(ThreadRootShell, { children: [
518
+ /* @__PURE__ */ jsx8(ThreadPrimitive.Viewport, { asChild: true, autoScroll: true, children: /* @__PURE__ */ jsxs3(ThreadViewportShell, { isEmpty, children: [
519
+ isEmpty && /* @__PURE__ */ jsx8(WelcomeScreen, { heading: welcomeHeading }),
520
+ isEmpty && !isLoading && composer,
521
+ isLoading ? /* @__PURE__ */ jsx8(MessageListSkeleton, {}) : !isEmpty && /* @__PURE__ */ jsxs3(Fragment2, { children: [
522
+ /* @__PURE__ */ jsx8(HistoryLoaderContainer, {}),
523
+ /* @__PURE__ */ jsxs3(MessageGroup, { children: [
524
+ /* @__PURE__ */ jsx8(ThreadPrimitive.Messages, { children: ({ message }) => /* @__PURE__ */ jsx8(AnimatedMessageShell, { children: /* @__PURE__ */ jsx8(ThreadMessage, { isEditing: message.role === "user" && message.composer.isEditing }) }) }),
525
+ /* @__PURE__ */ jsx8(ResumeUnavailableContainer, {})
526
+ ] })
527
+ ] })
528
+ ] }) }),
529
+ !isLoading && !isEmpty && /* @__PURE__ */ jsxs3(ThreadComposerAreaShell, { isEmpty, children: [
530
+ /* @__PURE__ */ jsx8(ThreadPrimitive.ScrollToBottom, { asChild: true, children: /* @__PURE__ */ jsx8(ScrollToBottomButton, {}) }),
531
+ composer
532
+ ] })
533
+ ] }) }) });
534
+ }
535
+
536
+ // src/containers/Thread.tsx
537
+ import { jsx as jsx9 } from "react/jsx-runtime";
538
+ function Thread() {
539
+ return /* @__PURE__ */ jsx9(ThreadContainer, { composer: /* @__PURE__ */ jsx9(ComposerContainer, {}) });
540
+ }
541
+
542
+ export {
543
+ AskUserContainer,
544
+ threadHasPendingMcpAuth,
545
+ useComposerPauseView,
546
+ CustomActionContainer,
547
+ McpAuthContainer,
548
+ ComposerContainer,
549
+ HistoryLoaderContainer,
550
+ ResumeUnavailableContainer,
551
+ UserEditComposerContainer,
552
+ ThreadContainer,
553
+ Thread
554
+ };
555
+ //# sourceMappingURL=chunk-M62XY4NC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/containers/AskUserContainer.tsx","../src/hooks/useComposerPauseView.ts","../src/containers/CustomActionContainer.tsx","../src/containers/McpAuthContainer.tsx","../src/containers/ComposerContainer.tsx","../src/containers/HistoryLoaderContainer.tsx","../src/containers/ResumeUnavailableContainer.tsx","../src/containers/UserEditComposerContainer.tsx","../src/containers/ThreadContainer.tsx","../src/hooks/useSyncSessionTitle.ts","../src/containers/Thread.tsx"],"sourcesContent":["'use client';\n\nimport { useThreadIsRunning } from '@assistant-ui/core/react';\nimport { useTrueFoundryToolResponses } from '@truefoundry/assistant-ui-runtime';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n ASK_USER_CUSTOM_OPTION,\n type AskUserAnswerDraft,\n type Question,\n} from '../atoms/adapters/AskUserPromptAdapter.js';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nconst EMPTY_ANSWER: AskUserAnswerDraft = { radioValue: '', custom: '' };\n\nexport function AskUserContainer() {\n const AskUserPrompt = useSlot('AskUserPrompt');\n const { pending, respond } = useTrueFoundryToolResponses();\n const isRunning = useThreadIsRunning();\n const item = pending[0];\n\n const questions = useMemo<Question[]>(\n () =>\n item == null\n ? []\n : [\n {\n id: item.toolCallId,\n question: item.question ?? 'Answer required',\n options: item.options ?? [],\n },\n ],\n [item],\n );\n const [currentQuestionIndex, setCurrentQuestionIndex] = useState(0);\n const [answers, setAnswers] = useState<Record<string, AskUserAnswerDraft>>({});\n\n useEffect(() => {\n setCurrentQuestionIndex(0);\n setAnswers({});\n }, [item?.toolCallId]);\n\n const safeIndex = Math.min(currentQuestionIndex, Math.max(questions.length - 1, 0));\n const currentQuestion = questions[safeIndex];\n const currentAnswer = currentQuestion == null ? EMPTY_ANSWER : (answers[currentQuestion.id] ?? EMPTY_ANSWER);\n const getResponseForQuestion = useCallback(\n (questionId: string) => {\n const answer = answers[questionId] ?? EMPTY_ANSWER;\n return answer.radioValue === ASK_USER_CUSTOM_OPTION ? answer.custom.trim() : answer.radioValue.trim();\n },\n [answers],\n );\n const allQuestionsAnswered = useMemo(\n () => questions.every(question => getResponseForQuestion(question.id)),\n [getResponseForQuestion, questions],\n );\n const selectedResponse =\n currentAnswer.radioValue === ASK_USER_CUSTOM_OPTION ? currentAnswer.custom.trim() : currentAnswer.radioValue.trim();\n const isSubmitDisabled = isRunning || currentQuestion == null || selectedResponse.length === 0;\n const isSubmitAllDisabled = isSubmitDisabled || !allQuestionsAnswered;\n\n const onCurrentAnswerChange = useCallback((questionId: string, update: Partial<AskUserAnswerDraft>) => {\n setAnswers(previous => ({\n ...previous,\n [questionId]: {\n ...(previous[questionId] ?? EMPTY_ANSWER),\n ...update,\n },\n }));\n }, []);\n\n const onSubmit = useCallback(() => {\n if (item == null || !allQuestionsAnswered) return;\n const content = getResponseForQuestion(item.toolCallId);\n if (!content) return;\n respond({ toolCallId: item.toolCallId, content });\n }, [allQuestionsAnswered, getResponseForQuestion, item, respond]);\n\n if (item == null || currentQuestion == null) return null;\n\n return (\n <AskUserPrompt\n questions={questions}\n readOnly={isRunning}\n currentQuestion={currentQuestion}\n currentQuestionIndex={safeIndex}\n currentAnswer={currentAnswer}\n totalQuestions={questions.length}\n isMultiQuestion={questions.length > 1}\n isLastQuestion={safeIndex === questions.length - 1}\n allQuestionsAnswered={allQuestionsAnswered}\n isSubmitDisabled={isSubmitDisabled}\n isSubmitAllDisabled={isSubmitAllDisabled}\n onCurrentQuestionIndexChange={setCurrentQuestionIndex}\n onCurrentAnswerChange={onCurrentAnswerChange}\n onSubmit={onSubmit}\n />\n );\n}\n","'use client';\n\nimport { useAuiState } from '@assistant-ui/react';\nimport { useTrueFoundryToolResponses } from '@truefoundry/assistant-ui-runtime';\n\nimport { useOptionalCustomActionRenderers } from '../server/CustomActionRenderersContext.js';\n\nexport type ThreadPauseState = {\n thread: {\n messages: readonly {\n role: string;\n status?: { type: string };\n metadata?: { custom?: unknown };\n }[];\n };\n};\n\n/** Returns true when the latest assistant message is paused for MCP authorization. */\nexport function threadHasPendingMcpAuth(s: ThreadPauseState): boolean {\n const messages = s.thread.messages;\n const last = messages[messages.length - 1];\n if (last?.role !== 'assistant') return false;\n if (last.status?.type !== 'requires-action') return false;\n return (last.metadata?.custom as { pendingMcpAuth?: boolean } | undefined)?.pendingMcpAuth === true;\n}\n\nexport type ComposerPauseView =\n { kind: 'mcp' } | { kind: 'custom'; toolName: string } | { kind: 'ask-user' } | { kind: 'compose' };\n\n/** Shared composer pause detection for default and custom composer containers. */\nexport function useComposerPauseView(): ComposerPauseView {\n const mcpPending = useAuiState(threadHasPendingMcpAuth);\n const { pending: toolResponsesPending } = useTrueFoundryToolResponses();\n const customActionRenderers = useOptionalCustomActionRenderers();\n\n if (mcpPending) {\n return { kind: 'mcp' };\n }\n\n const firstPending = toolResponsesPending[0];\n if (firstPending != null) {\n const toolName = firstPending.toolName;\n if (toolName != null && customActionRenderers?.[toolName] != null) {\n return { kind: 'custom', toolName };\n }\n return { kind: 'ask-user' };\n }\n\n return { kind: 'compose' };\n}\n","'use client';\n\nimport { useThreadIsRunning } from '@assistant-ui/core/react';\nimport { useTrueFoundryToolResponses } from '@truefoundry/assistant-ui-runtime';\nimport { useCallback } from 'react';\n\nimport { useOptionalCustomActionRenderers } from '../server/CustomActionRenderersContext.js';\n\n/** Host custom-action UI for a pending client-side tool response. */\nexport function CustomActionContainer() {\n const renderers = useOptionalCustomActionRenderers();\n const { pending, respond } = useTrueFoundryToolResponses();\n const isRunning = useThreadIsRunning();\n const item = pending[0];\n\n const onSubmit = useCallback(\n (content: string) => {\n if (item == null) return;\n const trimmed = content.trim();\n if (!trimmed) return;\n respond({ toolCallId: item.toolCallId, content: trimmed });\n },\n [item, respond],\n );\n\n if (item == null || item.toolName == null) return null;\n const Renderer = renderers?.[item.toolName];\n if (Renderer == null) return null;\n\n return <Renderer args={item.args ?? {}} disabled={isRunning} onSubmit={onSubmit} />;\n}\n","'use client';\n\nimport { useThreadIsRunning } from '@assistant-ui/core/react';\nimport { useTrueFoundryMcpAuth } from '@truefoundry/assistant-ui-runtime';\n\nimport { useDraftCatalog } from '@/atoms/draft/DraftCatalogProvider.js';\nimport { useMCPAuth } from '@/hooks/useMcpAuth.js';\nimport { useOptionalCatalogServer } from '@/server/ServerContext.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\n\ntype McpAuthPromptProps = {\n servers: NonNullable<ReturnType<typeof useTrueFoundryMcpAuth>['pending']>['mcpServers'];\n onContinue: () => void;\n readOnly: boolean;\n};\n\nfunction CatalogMcpAuthPrompt({ servers, onContinue, readOnly }: McpAuthPromptProps) {\n const McpAuthPrompt = useSlot('McpAuthPrompt');\n const { handleAuthorize } = useMCPAuth();\n const { refreshConnectors } = useDraftCatalog();\n\n const handleConnect = (serverId: string) => {\n void handleAuthorize(serverId, isSuccess => {\n if (isSuccess) {\n void refreshConnectors();\n }\n });\n };\n\n return <McpAuthPrompt servers={servers} onConnect={handleConnect} onContinue={onContinue} readOnly={readOnly} />;\n}\n\nexport function McpAuthContainer() {\n const McpAuthPrompt = useSlot('McpAuthPrompt');\n const { pending, resume } = useTrueFoundryMcpAuth();\n const isRunning = useThreadIsRunning();\n const catalog = useOptionalCatalogServer();\n\n if (!pending) return null;\n\n if (catalog) {\n return <CatalogMcpAuthPrompt servers={pending.mcpServers} onContinue={() => void resume()} readOnly={isRunning} />;\n }\n\n const handleConnect = (serverId: string) => {\n const server = pending.mcpServers.find(s => s.id === serverId);\n if (server?.authUrl) {\n window.open(server.authUrl, '_blank', 'noopener,noreferrer');\n }\n };\n\n return (\n <McpAuthPrompt\n servers={pending.mcpServers}\n onConnect={handleConnect}\n onContinue={() => void resume()}\n readOnly={isRunning}\n />\n );\n}\n","'use client';\n\nimport { ComposerPrimitive, useAui, useAuiState } from '@assistant-ui/react';\nimport { useTrueFoundryAgentSpec, useTrueFoundryCancel } from '@truefoundry/assistant-ui-runtime';\nimport { useRef } from 'react';\n\nimport { DraftCatalogProvider } from '../atoms/draft/DraftCatalogProvider.js';\nimport { useComposerBusyState } from '../hooks/useComposerBusyState.js';\nimport { useComposerPauseView } from '../hooks/useComposerPauseView.js';\nimport { useOptionalShellMode } from '../server/ShellModeContext.js';\nimport { SlotsProvider, useSlot, useSlotIsDefault } from '../theme/SlotsProvider.js';\nimport { AskUserContainer } from './AskUserContainer.js';\nimport { ComposerAttachmentsContainer } from './AttachmentsContainer.js';\nimport { CustomActionContainer } from './CustomActionContainer.js';\nimport { McpAuthContainer } from './McpAuthContainer.js';\n\nexport type ComposerContainerProps = {\n placeholder?: string;\n};\n\nfunction ComposerBody({ placeholder }: { placeholder: string }) {\n const ComposerShell = useSlot('ComposerShell');\n const aui = useAui();\n const shell = useOptionalShellMode();\n const hasText = useAuiState(s => s.composer.text.trim().length > 0);\n const { agentSpec } = useTrueFoundryAgentSpec();\n // Named (immutable) agents use a server-side model; only draft/mutable composers pick one here.\n const requiresModel = shell == null || (shell.mode.status === 'active' && shell.mode.isMutable);\n const hasModel = Boolean(agentSpec?.model?.name?.trim());\n const { isBusy, send, resetBusy } = useComposerBusyState();\n const cancel = useTrueFoundryCancel();\n const fileInputRef = useRef<HTMLInputElement>(null);\n const canSubmit = !isBusy && hasText && (!requiresModel || hasModel);\n const submit = () => {\n if (!canSubmit) return;\n send(() => aui.composer().send());\n };\n\n return (\n <>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n hidden\n onChange={event => {\n const files = event.target.files;\n if (files) {\n for (const file of files) {\n void aui.composer().addAttachment(file);\n }\n }\n event.target.value = '';\n }}\n />\n <ComposerPrimitive.AttachmentDropzone\n disabled={isBusy}\n data-slot=\"aui_composer-attachment-dropzone\"\n className=\"w-full rounded-[0.75rem] transition-[box-shadow] data-[dragging=true]:ring-focus-ring/20 data-[dragging=true]:ring-3\"\n >\n <ComposerPrimitive.Root\n data-slot=\"aui_composer-root\"\n className=\"w-full\"\n onSubmit={event => {\n // Suppresses the primitive's own send so submits route through the busy-state wrapper.\n event.preventDefault();\n submit();\n }}\n >\n <ComposerShell\n attachments={<ComposerAttachmentsContainer />}\n input={\n <ComposerPrimitive.Input\n data-slot=\"aui_composer-input\"\n placeholder={placeholder}\n disabled={isBusy}\n submitMode=\"enter\"\n aria-label=\"Message input\"\n className=\"text-text-primary placeholder:text-text-secondary/80 max-h-[10lh] min-h-10 w-full resize-none overflow-y-auto rounded-lg border-none bg-transparent px-1 py-1 text-base leading-normal shadow-none outline-none disabled:cursor-not-allowed\"\n />\n }\n disabled={isBusy}\n canSubmit={canSubmit}\n isRunning={isBusy}\n onSubmit={submit}\n onCancel={() => {\n resetBusy();\n void cancel();\n }}\n onAttach={() => fileInputRef.current?.click()}\n />\n </ComposerPrimitive.Root>\n </ComposerPrimitive.AttachmentDropzone>\n </>\n );\n}\n\nexport function ComposerContainer({\n placeholder = 'Ask anything... (Shift+Enter for new line)',\n}: ComposerContainerProps) {\n const pauseView = useComposerPauseView();\n const shell = useOptionalShellMode();\n const parentLeftSection = useSlot('ComposerLeftSection');\n const parentRightSection = useSlot('ComposerRightSection');\n const usesDefaultLeftSection = useSlotIsDefault('ComposerLeftSection');\n const usesDefaultRightSection = useSlotIsDefault('ComposerRightSection');\n const DraftComposerLeftSection = useSlot('DraftComposerLeftSection');\n const DraftComposerRightSection = useSlot('DraftComposerRightSection');\n const canMutateSpec = shell?.mode.status === 'active' && shell.mode.isMutable;\n\n if (pauseView.kind === 'mcp') {\n return <McpAuthContainer />;\n }\n if (pauseView.kind === 'custom') {\n return <CustomActionContainer />;\n }\n if (pauseView.kind === 'ask-user') {\n return <AskUserContainer />;\n }\n\n if (canMutateSpec) {\n return (\n <DraftCatalogProvider>\n <SlotsProvider\n overrides={{\n ComposerLeftSection: usesDefaultLeftSection ? DraftComposerLeftSection : parentLeftSection,\n ComposerRightSection: usesDefaultRightSection ? DraftComposerRightSection : parentRightSection,\n }}\n >\n <ComposerBody placeholder={placeholder} />\n </SlotsProvider>\n </DraftCatalogProvider>\n );\n }\n\n return <ComposerBody placeholder={placeholder} />;\n}\n","'use client';\n\nimport { useTrueFoundryHistoryPagination } from '@truefoundry/assistant-ui-runtime';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\n\n/** How close to the viewport top (px) before the next older page is fetched. */\nconst TOP_THRESHOLD_PX = 200;\n\nconst VIEWPORT_SELECTOR = '[data-slot=\"aui_thread-viewport\"]';\n\n/**\n * Renders `HistoryLoader` at the top of the message list and fetches\n * the next older history page when the user scrolls near it. Scroll position\n * is preserved across the prepend so the list doesn't jump.\n *\n * Must be rendered inside `ThreadViewportShell` (it locates the scroll root\n * via the `aui_thread-viewport` data-slot on its nearest scrollable ancestor).\n */\nexport function HistoryLoaderContainer() {\n const HistoryLoader = useSlot('HistoryLoader');\n const { hasOlderHistory, isLoadingOlderHistory, loadOlderHistory } = useTrueFoundryHistoryPagination();\n\n const [sentinel, setSentinel] = useState<HTMLDivElement | null>(null);\n const inflightRef = useRef(false);\n\n const maybeLoadOlder = useCallback(async () => {\n if (inflightRef.current) return;\n inflightRef.current = true;\n\n const viewport = sentinel?.closest<HTMLElement>(VIEWPORT_SELECTOR) ?? null;\n const prevScrollHeight = viewport?.scrollHeight ?? 0;\n const prevScrollTop = viewport?.scrollTop ?? 0;\n\n try {\n await loadOlderHistory();\n // Wait for React to commit the prepended messages, then restore the\n // user's anchor so the list doesn't jump to the oldest message.\n requestAnimationFrame(() => {\n if (viewport == null) return;\n const delta = viewport.scrollHeight - prevScrollHeight;\n if (delta > 0) {\n viewport.scrollTo({ top: prevScrollTop + delta, behavior: 'instant' });\n }\n });\n } catch {\n // Runtime surfaces the error via onError; the sentinel stays retryable.\n } finally {\n inflightRef.current = false;\n }\n }, [sentinel, loadOlderHistory]);\n\n useEffect(() => {\n if (sentinel == null || !hasOlderHistory) return;\n\n const viewport = sentinel.closest<HTMLElement>(VIEWPORT_SELECTOR);\n const observer = new IntersectionObserver(\n entries => {\n if (entries.some(entry => entry.isIntersecting)) {\n void maybeLoadOlder();\n }\n },\n { root: viewport, rootMargin: `${TOP_THRESHOLD_PX}px 0px 0px 0px` },\n );\n observer.observe(sentinel);\n return () => observer.disconnect();\n }, [sentinel, hasOlderHistory, maybeLoadOlder]);\n\n if (!hasOlderHistory) return null;\n\n return <HistoryLoader ref={setSentinel} isLoading={isLoadingOlderHistory} />;\n}\n","'use client';\n\nimport { useTrueFoundryResumeUnavailable } from '@truefoundry/assistant-ui-runtime';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nexport function ResumeUnavailableContainer() {\n const ResumeUnavailable = useSlot('ResumeUnavailable');\n const resumeUnavailable = useTrueFoundryResumeUnavailable();\n\n if (!resumeUnavailable) return null;\n\n return <ResumeUnavailable />;\n}\n","'use client';\n\nimport { useComposerCancel, useComposerSend, useThreadIsRunning } from '@assistant-ui/core/react';\nimport { ComposerPrimitive, MessagePrimitive, useAuiState } from '@assistant-ui/react';\n\nimport { Button } from '../atoms/primitives/Button.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport { MessageAttachmentsContainer } from './AttachmentsContainer.js';\n\nfunction ReadOnlyMessageAttachments() {\n const hasAttachments = useAuiState(s => (s.message.attachments?.length ?? 0) > 0);\n if (!hasAttachments) {\n return null;\n }\n return (\n <div className=\"pointer-events-none mb-2 opacity-90\">\n <MessageAttachmentsContainer />\n </div>\n );\n}\n\nexport function UserEditComposerContainer() {\n const UserMessageEdit = useSlot('UserMessageEdit');\n const MessageTimestamp = useSlot('MessageTimestamp');\n const isRunning = useThreadIsRunning();\n const createdAt = useAuiState(s => s.message.createdAt);\n const { cancel, disabled: cancelDisabled } = useComposerCancel();\n const { disabled: sendDisabled } = useComposerSend();\n\n return (\n <MessagePrimitive.Root data-role=\"user\">\n <ComposerPrimitive.Root\n data-slot=\"aui_user-edit-composer-root\"\n className=\"fade-in slide-in-from-bottom-1 animate-in flex w-full justify-end px-2 duration-150\"\n >\n <UserMessageEdit\n timestamp={<MessageTimestamp createdAt={createdAt} />}\n attachments={<ReadOnlyMessageAttachments />}\n input={\n <div className=\"mt-1 rounded border border-border bg-secondary-bg p-2 text-text-primary\">\n <ComposerPrimitive.Input\n data-slot=\"aui_user-edit-input\"\n disabled={isRunning}\n submitMode=\"enter\"\n aria-label=\"Edit message\"\n className=\"max-h-32 min-h-10 w-full resize-none border-none bg-transparent p-0 text-base leading-[1.34] outline-none focus:shadow-none\"\n />\n </div>\n }\n footer={\n <div className=\"flex items-center justify-end gap-2\">\n <Button variant=\"secondary\" type=\"button\" disabled={cancelDisabled} onClick={cancel}>\n Cancel\n </Button>\n <ComposerPrimitive.Send asChild>\n <Button type=\"submit\" disabled={sendDisabled || isRunning}>\n Save &amp; Rerun\n </Button>\n </ComposerPrimitive.Send>\n </div>\n }\n />\n </ComposerPrimitive.Root>\n </MessagePrimitive.Root>\n );\n}\n","'use client';\n\nimport { ThreadPrimitive, useAuiState } from '@assistant-ui/react';\nimport { useEffect, type ReactNode } from 'react';\nimport { preloadMarkdownOpenUI } from '../atoms/Markdown.js';\nimport { ComposerBusyProvider } from '../hooks/useComposerBusyState.js';\nimport { useSyncSessionTitle } from '../hooks/useSyncSessionTitle.js';\nimport { useOptionalShellMode } from '../server/ShellModeContext.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport { isNewChatView } from '../utils/isNewChatView.js';\nimport { AssistantMessageContainer } from './AssistantMessageContainer.js';\nimport { HistoryLoaderContainer } from './HistoryLoaderContainer.js';\nimport { ResumeUnavailableContainer } from './ResumeUnavailableContainer.js';\nimport { UserEditComposerContainer } from './UserEditComposerContainer.js';\nimport { UserMessageContainer } from './UserMessageContainer.js';\n\nexport { isNewChatView } from '../utils/isNewChatView.js';\n\n/** Mount-only lift. Keyed by message.id via ThreadPrimitive.Messages — not content (streaming). */\nfunction AnimatedMessageShell({ children }: { children: ReactNode }) {\n return <div className=\"animate-in fade-in slide-in-from-bottom-1 fill-mode-both duration-200\">{children}</div>;\n}\n\nfunction ThreadMessage({ isEditing }: { isEditing: boolean }) {\n const role = useAuiState(s => s.message.role);\n if (role === 'user') {\n if (isEditing) {\n return <UserEditComposerContainer />;\n }\n return <UserMessageContainer />;\n }\n return <AssistantMessageContainer />;\n}\n\nexport type ThreadContainerProps = {\n /** Composer for the empty-welcome and docked bottom areas. `<Thread />` passes `<ComposerContainer />`. */\n composer?: ReactNode;\n};\n\nexport function ThreadContainer({ composer }: ThreadContainerProps) {\n useEffect(() => {\n void preloadMarkdownOpenUI();\n }, []);\n useSyncSessionTitle();\n\n const shell = useOptionalShellMode();\n const WelcomeScreen = useSlot('WelcomeScreen');\n const MessageListSkeleton = useSlot('MessageListSkeleton');\n const ScrollToBottomButton = useSlot('ScrollToBottomButton');\n const MessageGroup = useSlot('MessageGroup');\n const ThreadComposerAreaShell = useSlot('ThreadComposerAreaShell');\n const ThreadRootShell = useSlot('ThreadRootShell');\n const ThreadViewportShell = useSlot('ThreadViewportShell');\n\n const isEmpty = useAuiState(isNewChatView);\n const isLoading = useAuiState(s => s.thread.isLoading);\n const welcomeHeading =\n shell?.mode.status === 'active'\n ? shell.mode.agentName != null && shell.mode.agentName.length > 0\n ? shell.mode.agentName\n : shell.mode.isMutable && shell.mode.isCreateAgent\n ? 'Start building a new Agent'\n : undefined\n : undefined;\n\n return (\n <ComposerBusyProvider>\n <ThreadPrimitive.Root asChild>\n <ThreadRootShell>\n <ThreadPrimitive.Viewport asChild autoScroll>\n <ThreadViewportShell isEmpty={isEmpty}>\n {isEmpty && <WelcomeScreen heading={welcomeHeading} />}\n {isEmpty && !isLoading && composer}\n {isLoading ? (\n <MessageListSkeleton />\n ) : (\n !isEmpty && (\n <>\n <HistoryLoaderContainer />\n <MessageGroup>\n <ThreadPrimitive.Messages>\n {({ message }) => (\n <AnimatedMessageShell>\n <ThreadMessage isEditing={message.role === 'user' && message.composer.isEditing} />\n </AnimatedMessageShell>\n )}\n </ThreadPrimitive.Messages>\n <ResumeUnavailableContainer />\n </MessageGroup>\n </>\n )\n )}\n </ThreadViewportShell>\n </ThreadPrimitive.Viewport>\n\n {!isLoading && !isEmpty && (\n <ThreadComposerAreaShell isEmpty={isEmpty}>\n <ThreadPrimitive.ScrollToBottom asChild>\n <ScrollToBottomButton />\n </ThreadPrimitive.ScrollToBottom>\n {composer}\n </ThreadComposerAreaShell>\n )}\n </ThreadRootShell>\n </ThreadPrimitive.Root>\n </ComposerBusyProvider>\n );\n}\n","'use client';\n\nimport { useThreadIsRunning } from '@assistant-ui/core/react';\nimport { useEffect, useRef } from 'react';\n\nimport { useAui, useAuiState } from '../assistant-ui.js';\nimport { useOptionalServer } from '../server/ServerContext.js';\n\n/**\n * After a turn ends, read `session.title` from GET /sessions/{id} and rename the\n * thread-list row. Initialize only stores `remoteId`, so first chats stay\n * \"New Chat\" until this runs.\n */\nexport function useSyncSessionTitle(): void {\n const server = useOptionalServer();\n const aui = useAui();\n const remoteId = useAuiState(s => s.threadListItem.remoteId);\n const title = useAuiState(s => s.threadListItem.title);\n const isRunning = useThreadIsRunning();\n const wasRunningRef = useRef(false);\n const syncedRemoteIdRef = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n syncedRemoteIdRef.current = undefined;\n }, [remoteId]);\n\n useEffect(() => {\n const finishedTurn = wasRunningRef.current && !isRunning;\n wasRunningRef.current = isRunning;\n\n if (!finishedTurn || server == null || remoteId == null) {\n return;\n }\n if (syncedRemoteIdRef.current === remoteId) {\n return;\n }\n // History rows already carry a title; only fill blank / \"new\" local rows.\n if (title != null && title.trim() !== '') {\n syncedRemoteIdRef.current = remoteId;\n return;\n }\n\n let cancelled = false;\n void server\n .getSession({ sessionId: remoteId })\n .then(session => {\n if (cancelled) return;\n const nextTitle = typeof session.title === 'string' ? session.title.trim() : '';\n if (nextTitle.length === 0) return;\n syncedRemoteIdRef.current = remoteId;\n return aui.threadListItem().rename(nextTitle);\n })\n .catch(() => undefined);\n\n return () => {\n cancelled = true;\n };\n }, [aui, isRunning, remoteId, server, title]);\n}\n","'use client';\n\nimport { ComposerContainer } from './ComposerContainer.js';\nimport { ThreadContainer } from './ThreadContainer.js';\n\n/** The full assembled thread view: message list + composer. */\nexport function Thread() {\n return <ThreadContainer composer={<ComposerContainer />} />;\n}\n"],"mappings":"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","names":["useAuiState","useTrueFoundryToolResponses","useAuiState","useTrueFoundryToolResponses","useThreadIsRunning","useTrueFoundryToolResponses","useCallback","jsx","useTrueFoundryToolResponses","useThreadIsRunning","useCallback","useThreadIsRunning","jsx","useThreadIsRunning","useAui","useAuiState","jsx","useAui","useAuiState","useCallback","useEffect","useRef","useState","jsx","useState","useRef","useCallback","useEffect","jsx","useThreadIsRunning","ComposerPrimitive","useAuiState","jsx","jsxs","useAuiState","useThreadIsRunning","ComposerPrimitive","useAuiState","useEffect","useThreadIsRunning","useEffect","useRef","useThreadIsRunning","useRef","useEffect","Fragment","jsx","jsxs","useAuiState","useEffect","jsx"]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  useOptionalContentClassNames
4
- } from "./chunk-36KOSC2J.js";
4
+ } from "./chunk-7Z2C2K7F.js";
5
5
 
6
6
  // src/atoms/OpenUiFenceBlock.tsx
7
7
  import { Renderer } from "@openuidev/react-lang";
@@ -21,4 +21,4 @@ function OpenUiFenceBlock({ content, isStreaming, darkTheme }) {
21
21
  export {
22
22
  OpenUiFenceBlock
23
23
  };
24
- //# sourceMappingURL=chunk-B52K63AW.js.map
24
+ //# sourceMappingURL=chunk-MPNSO7E6.js.map