@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
@@ -56,9 +56,25 @@ function useComposerBusyState() {
56
56
  return value;
57
57
  }
58
58
 
59
+ // src/server/CustomActionRenderersContext.tsx
60
+ import { createContext as createContext2, useContext as useContext2 } from "react";
61
+ import { jsx } from "react/jsx-runtime";
62
+ var CustomActionRenderersContext = createContext2(void 0);
63
+ function CustomActionRenderersProvider({
64
+ renderers,
65
+ children
66
+ }) {
67
+ return /* @__PURE__ */ jsx(CustomActionRenderersContext.Provider, { value: renderers, children });
68
+ }
69
+ function useOptionalCustomActionRenderers() {
70
+ return useContext2(CustomActionRenderersContext);
71
+ }
72
+
59
73
  export {
60
74
  notifyComposerBusyFailure,
61
75
  ComposerBusyProvider,
62
- useComposerBusyState
76
+ useComposerBusyState,
77
+ CustomActionRenderersProvider,
78
+ useOptionalCustomActionRenderers
63
79
  };
64
- //# sourceMappingURL=chunk-FXCYLEFB.js.map
80
+ //# sourceMappingURL=chunk-BSIPI3KV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useComposerBusyState.ts","../src/server/CustomActionRenderersContext.tsx"],"sourcesContent":["'use client';\n\nimport { useThreadIsRunning } from '@assistant-ui/core/react';\nimport { createContext, createElement, useCallback, useContext, useEffect, useState, type ReactNode } from 'react';\n\nexport type ComposerBusyState = {\n /** True while submitting or while the turn stream is active. */\n isBusy: boolean;\n isRunning: boolean;\n isSubmitting: boolean;\n send: (sendFn: () => void | Promise<void>) => void;\n resetBusy: () => void;\n};\n\nconst ComposerBusyContext = createContext<ComposerBusyState | null>(null);\n\n/**\n * `aui.composer().send()` returns void and swallows `onNew` rejections, so the\n * optimistic submitting flag cannot clear via Promise.catch. First-message\n * failures (e.g. createSession) also never flip `useThreadIsRunning()`. Chat\n * runtime `onError` calls this so the Cancel/spinner state does not stick.\n */\nconst busyFailureListeners = new Set<() => void>();\n\nexport function notifyComposerBusyFailure(): void {\n for (const listener of busyFailureListeners) {\n listener();\n }\n}\n\nfunction useComposerBusyStateValue(): ComposerBusyState {\n const isRunning = useThreadIsRunning();\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n useEffect(() => {\n if (!isRunning) {\n setIsSubmitting(false);\n }\n }, [isRunning]);\n\n useEffect(() => {\n const clearSubmitting = () => {\n setIsSubmitting(false);\n };\n busyFailureListeners.add(clearSubmitting);\n return () => {\n busyFailureListeners.delete(clearSubmitting);\n };\n }, []);\n\n const isBusy = isRunning || isSubmitting;\n\n const resetBusy = useCallback(() => {\n setIsSubmitting(false);\n }, []);\n\n const send = useCallback((sendFn: () => void | Promise<void>) => {\n setIsSubmitting(true);\n try {\n const result = sendFn();\n if (result != null && typeof result.then === 'function') {\n void result.catch(() => {\n setIsSubmitting(false);\n });\n }\n } catch {\n setIsSubmitting(false);\n }\n }, []);\n\n return { isBusy, isRunning, isSubmitting, send, resetBusy };\n}\n\nexport function ComposerBusyProvider({ children }: { children: ReactNode }) {\n const value = useComposerBusyStateValue();\n return createElement(ComposerBusyContext.Provider, { value }, children);\n}\n\n/**\n * Optimistic composer busy state shared across the thread. `useThreadIsRunning()`\n * only becomes true once the turn stream starts; this hook flips to busy\n * immediately on submit so the send button shows loading before session setup /\n * turn API work finishes.\n *\n * Must be used within `<ComposerBusyProvider>` (wired by default in `<Thread />`).\n */\nexport function useComposerBusyState(): ComposerBusyState {\n const value = useContext(ComposerBusyContext);\n if (value == null) {\n throw new Error('useComposerBusyState must be used within ComposerBusyProvider');\n }\n return value;\n}\n","'use client';\n\nimport { createContext, useContext, type ComponentType, type ReactNode } from 'react';\n\n/** Props Trueforge passes to a host-registered custom action renderer. */\nexport type CustomActionRendererProps = {\n args: Record<string, unknown>;\n disabled: boolean;\n /** Resume the paused client-side tool with a non-empty string result. */\n onSubmit: (content: string) => void;\n};\n\n/** Map of client-side tool name → host UI for composer pause. */\nexport type CustomActionRenderers = Record<string, ComponentType<CustomActionRendererProps>>;\n\nconst CustomActionRenderersContext = createContext<CustomActionRenderers | undefined>(undefined);\n\nexport function CustomActionRenderersProvider({\n renderers,\n children,\n}: {\n renderers?: CustomActionRenderers;\n children: ReactNode;\n}) {\n return <CustomActionRenderersContext.Provider value={renderers}>{children}</CustomActionRenderersContext.Provider>;\n}\n\n/** Host-registered custom action renderers, or `undefined` when none were provided. */\nexport function useOptionalCustomActionRenderers(): CustomActionRenderers | undefined {\n return useContext(CustomActionRenderersContext);\n}\n"],"mappings":";AAEA,SAAS,0BAA0B;AACnC,SAAS,eAAe,eAAe,aAAa,YAAY,WAAW,gBAAgC;AAW3G,IAAM,sBAAsB,cAAwC,IAAI;AAQxE,IAAM,uBAAuB,oBAAI,IAAgB;AAE1C,SAAS,4BAAkC;AAChD,aAAW,YAAY,sBAAsB;AAC3C,aAAS;AAAA,EACX;AACF;AAEA,SAAS,4BAA+C;AACtD,QAAM,YAAY,mBAAmB;AACrC,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AAEtD,YAAU,MAAM;AACd,QAAI,CAAC,WAAW;AACd,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAEd,YAAU,MAAM;AACd,UAAM,kBAAkB,MAAM;AAC5B,sBAAgB,KAAK;AAAA,IACvB;AACA,yBAAqB,IAAI,eAAe;AACxC,WAAO,MAAM;AACX,2BAAqB,OAAO,eAAe;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,SAAS,aAAa;AAE5B,QAAM,YAAY,YAAY,MAAM;AAClC,oBAAgB,KAAK;AAAA,EACvB,GAAG,CAAC,CAAC;AAEL,QAAM,OAAO,YAAY,CAAC,WAAuC;AAC/D,oBAAgB,IAAI;AACpB,QAAI;AACF,YAAM,SAAS,OAAO;AACtB,UAAI,UAAU,QAAQ,OAAO,OAAO,SAAS,YAAY;AACvD,aAAK,OAAO,MAAM,MAAM;AACtB,0BAAgB,KAAK;AAAA,QACvB,CAAC;AAAA,MACH;AAAA,IACF,QAAQ;AACN,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,QAAQ,WAAW,cAAc,MAAM,UAAU;AAC5D;AAEO,SAAS,qBAAqB,EAAE,SAAS,GAA4B;AAC1E,QAAM,QAAQ,0BAA0B;AACxC,SAAO,cAAc,oBAAoB,UAAU,EAAE,MAAM,GAAG,QAAQ;AACxE;AAUO,SAAS,uBAA0C;AACxD,QAAM,QAAQ,WAAW,mBAAmB;AAC5C,MAAI,SAAS,MAAM;AACjB,UAAM,IAAI,MAAM,+DAA+D;AAAA,EACjF;AACA,SAAO;AACT;;;AC1FA,SAAS,iBAAAA,gBAAe,cAAAC,mBAAsD;AAsBrE;AATT,IAAM,+BAA+BD,eAAiD,MAAS;AAExF,SAAS,8BAA8B;AAAA,EAC5C;AAAA,EACA;AACF,GAGG;AACD,SAAO,oBAAC,6BAA6B,UAA7B,EAAsC,OAAO,WAAY,UAAS;AAC5E;AAGO,SAAS,mCAAsE;AACpF,SAAOC,YAAW,4BAA4B;AAChD;","names":["createContext","useContext"]}
@@ -1,32 +1,46 @@
1
1
  import {
2
+ WidgetVisibilityProvider
3
+ } from "./chunk-DJUFS2BW.js";
4
+ import {
5
+ CustomActionRenderersProvider,
2
6
  notifyComposerBusyFailure
3
- } from "./chunk-FXCYLEFB.js";
7
+ } from "./chunk-BSIPI3KV.js";
4
8
  import {
5
- useAuiState
6
- } from "./chunk-M6MHLVSO.js";
9
+ ResolvedRoutesProvider
10
+ } from "./chunk-Y6S4OVVQ.js";
11
+ import {
12
+ IS_CREATE_AGENT_METADATA_KEY,
13
+ isCreateAgentMetadataValue
14
+ } from "./chunk-RDXBMTP5.js";
7
15
  import {
16
+ AgentConfigInstructionsProvider,
8
17
  SlotsProvider,
9
18
  ToasterProvider,
10
19
  modelPatchWithReasoningEffort,
20
+ mountName,
11
21
  useToaster
12
- } from "./chunk-XRTTKGKN.js";
22
+ } from "./chunk-ZTMKFZQ3.js";
13
23
  import {
14
24
  DraftCatalogProvider,
15
25
  Spinner,
16
26
  getErrorMessage,
17
27
  useDraftCatalog
18
- } from "./chunk-IFLE7OMM.js";
28
+ } from "./chunk-XAU7QFG3.js";
19
29
  import {
20
30
  DEFAULT_AGENT_CONFIG,
21
31
  ServerProvider,
22
32
  ShellModeProvider,
33
+ readSessionShareSearch,
23
34
  useServerCapabilities,
24
35
  useShellMode,
25
36
  withCapabilitiesSandbox
26
- } from "./chunk-WQULF5AT.js";
37
+ } from "./chunk-U7KURWW3.js";
38
+ import {
39
+ useAuiState
40
+ } from "./chunk-M6MHLVSO.js";
27
41
  import {
28
42
  cn
29
- } from "./chunk-72LC2M3R.js";
43
+ } from "./chunk-7Z2C2K7F.js";
30
44
 
31
45
  // src/containers/TrueFoundryChatProvider.tsx
32
46
  import { AssistantRuntimeProvider } from "@assistant-ui/react";
@@ -93,9 +107,12 @@ import { lazy, Suspense, useCallback as useCallback2, useMemo as useMemo2, useSt
93
107
  // src/atoms/draft/DraftSpecPreferenceBridge.tsx
94
108
  import { useTrueFoundryAgentSpec, useTrueFoundryUpdateAgentSpec } from "@truefoundry/assistant-ui-runtime";
95
109
  import { useEffect } from "react";
96
- function mountName(mount) {
97
- const name = Reflect.get(mount, "name");
98
- return typeof name === "string" ? name : null;
110
+ function readDraftSandboxEnabled(spec) {
111
+ if (spec.config === void 0) return void 0;
112
+ const sandbox = Reflect.get(spec.config, "sandbox");
113
+ if (typeof sandbox !== "object" || sandbox === null) return void 0;
114
+ const enabled = Reflect.get(sandbox, "enabled");
115
+ return typeof enabled === "boolean" ? enabled : void 0;
99
116
  }
100
117
  function filterMounts(mounts, availableNames) {
101
118
  if (mounts === void 0) return void 0;
@@ -110,6 +127,7 @@ function reconcileDraftSpecPreferences({
110
127
  models,
111
128
  skills,
112
129
  connectors,
130
+ connectorsHasMore = false,
113
131
  skillsEnabled
114
132
  }) {
115
133
  const update = {};
@@ -124,9 +142,11 @@ function reconcileDraftSpecPreferences({
124
142
  );
125
143
  }
126
144
  }
127
- const nextMcpServers = filterMounts(agentSpec.mcpServers, new Set(connectors.map((connector) => connector.name)));
128
- if (nextMcpServers !== agentSpec.mcpServers) {
129
- update.mcpServers = nextMcpServers;
145
+ if (!connectorsHasMore) {
146
+ const nextMcpServers = filterMounts(agentSpec.mcpServers, new Set(connectors.map((connector) => connector.name)));
147
+ if (nextMcpServers !== agentSpec.mcpServers) {
148
+ update.mcpServers = nextMcpServers;
149
+ }
130
150
  }
131
151
  if (skillsEnabled === false) {
132
152
  if (agentSpec.skills !== void 0 && agentSpec.skills.length > 0) {
@@ -142,8 +162,30 @@ function reconcileDraftSpecPreferences({
142
162
  }
143
163
  function reconcileDraftSandbox({
144
164
  agentSpec,
145
- sandboxEnabled
165
+ sandboxEnabled,
166
+ kind = "agent"
146
167
  }) {
168
+ if (kind === "chat") {
169
+ if (sandboxEnabled == null) return {};
170
+ const current = readDraftSandboxEnabled(agentSpec);
171
+ if (sandboxEnabled === true && current !== true) {
172
+ return {
173
+ config: {
174
+ ...agentSpec.config,
175
+ sandbox: { ...agentSpec.config?.sandbox, enabled: true }
176
+ }
177
+ };
178
+ }
179
+ if (sandboxEnabled === false && current === true) {
180
+ return {
181
+ config: {
182
+ ...agentSpec.config,
183
+ sandbox: { ...agentSpec.config?.sandbox, enabled: false }
184
+ }
185
+ };
186
+ }
187
+ return {};
188
+ }
147
189
  const nextSpec = withCapabilitiesSandbox(agentSpec, sandboxEnabled);
148
190
  return nextSpec === agentSpec ? {} : { config: nextSpec.config };
149
191
  }
@@ -153,23 +195,24 @@ function DraftSpecPreferenceBridge() {
153
195
  const updateAgentSpec = useTrueFoundryUpdateAgentSpec();
154
196
  const capabilities = useServerCapabilities();
155
197
  const sandboxEnabled = capabilities?.sandbox.enabled;
156
- const { models, skills, connectors, loaded, error, ensureLoaded } = useDraftCatalog();
198
+ const { models, skills, connectors, connectorsHasMore, loaded, error, ensureLoaded } = useDraftCatalog();
157
199
  const isPlainDraft = mode.status === "active" && mode.isMutable && mode.agentId == null && pendingSessionId == null;
200
+ const preferenceKind = mode.status === "active" && mode.isMutable && mode.isCreateAgent ? "agent" : "chat";
158
201
  useEffect(() => {
159
202
  if (isPlainDraft) ensureLoaded();
160
203
  }, [ensureLoaded, isPlainDraft]);
161
204
  useEffect(() => {
162
205
  if (isPlainDraft && agentSpec != null) {
163
- rememberDraftSpec(agentSpec);
206
+ rememberDraftSpec(agentSpec, preferenceKind);
164
207
  }
165
- }, [agentSpec, isPlainDraft, rememberDraftSpec]);
208
+ }, [agentSpec, isPlainDraft, preferenceKind, rememberDraftSpec]);
166
209
  useEffect(() => {
167
210
  if (!isPlainDraft || agentSpec == null || updateAgentSpec == null) return;
168
- const update = reconcileDraftSandbox({ agentSpec, sandboxEnabled });
211
+ const update = reconcileDraftSandbox({ agentSpec, sandboxEnabled, kind: preferenceKind });
169
212
  if (Object.keys(update).length > 0) {
170
213
  updateAgentSpec(update);
171
214
  }
172
- }, [agentSpec, isPlainDraft, sandboxEnabled, updateAgentSpec]);
215
+ }, [agentSpec, isPlainDraft, preferenceKind, sandboxEnabled, updateAgentSpec]);
173
216
  useEffect(() => {
174
217
  if (!isPlainDraft || agentSpec == null || updateAgentSpec == null || !loaded || error != null) return;
175
218
  const update = reconcileDraftSpecPreferences({
@@ -177,6 +220,7 @@ function DraftSpecPreferenceBridge() {
177
220
  models,
178
221
  skills,
179
222
  connectors,
223
+ connectorsHasMore,
180
224
  skillsEnabled: capabilities?.skill.enabled
181
225
  });
182
226
  if (Object.keys(update).length > 0) {
@@ -186,6 +230,7 @@ function DraftSpecPreferenceBridge() {
186
230
  agentSpec,
187
231
  capabilities?.skill.enabled,
188
232
  connectors,
233
+ connectorsHasMore,
189
234
  error,
190
235
  isPlainDraft,
191
236
  loaded,
@@ -196,11 +241,27 @@ function DraftSpecPreferenceBridge() {
196
241
  return null;
197
242
  }
198
243
 
199
- // src/routing/RemoteIdRouteBridge.tsx
244
+ // src/routing/LibrarySessionShareBoot.tsx
200
245
  import { useEffect as useEffect2 } from "react";
246
+ function LibrarySessionShareBoot() {
247
+ const { openLibraryAgent, setSessionsOpen } = useShellMode();
248
+ useEffect2(() => {
249
+ const share = readSessionShareSearch(window.location.search);
250
+ if (share.view === "sessions") {
251
+ setSessionsOpen(true);
252
+ return;
253
+ }
254
+ if (share.agentId == null) return;
255
+ openLibraryAgent(share.agentId);
256
+ }, [openLibraryAgent, setSessionsOpen]);
257
+ return null;
258
+ }
259
+
260
+ // src/routing/RemoteIdRouteBridge.tsx
261
+ import { useEffect as useEffect3 } from "react";
201
262
  function RemoteIdRouteBridge({ onRemoteIdChange }) {
202
263
  const remoteId = useAuiState((s) => s.threadListItem.remoteId);
203
- useEffect2(() => {
264
+ useEffect3(() => {
204
265
  onRemoteIdChange(remoteId ?? void 0);
205
266
  }, [remoteId, onRemoteIdChange]);
206
267
  return null;
@@ -208,7 +269,7 @@ function RemoteIdRouteBridge({ onRemoteIdChange }) {
208
269
 
209
270
  // src/containers/useResolvedServer.ts
210
271
  import { createTrueFoundryAgentUIServer } from "@truefoundry/assistant-ui-runtime/plugins/truefoundry-agent-server-adapter";
211
- import { useEffect as useEffect3, useState } from "react";
272
+ import { useEffect as useEffect4, useState } from "react";
212
273
  var DEFAULT_CAPABILITIES = {
213
274
  data: {
214
275
  sandbox: { enabled: true },
@@ -251,7 +312,7 @@ function useResolvedServer(config, onError) {
251
312
  }
252
313
  return { status: "loading", server: null, error: null };
253
314
  });
254
- useEffect3(() => {
315
+ useEffect4(() => {
255
316
  if (directServer) {
256
317
  setState({ status: "ready", server: directServer, error: null });
257
318
  return;
@@ -312,11 +373,11 @@ function useResolvedServer(config, onError) {
312
373
 
313
374
  // src/containers/TrueForgeUIShell.tsx
314
375
  import { jsx as jsx2, jsxs } from "react/jsx-runtime";
315
- var SidebarLayout = lazy(() => import("./SidebarLayout-6MHQYW45.js").then((m) => ({ default: m.SidebarLayout })));
316
- var DrawerLayout = lazy(() => import("./DrawerLayout-2JOQ4EDZ.js").then((m) => ({ default: m.DrawerLayout })));
317
- var DockLayout = lazy(() => import("./DockLayout-TEOWEMSV.js").then((m) => ({ default: m.DockLayout })));
318
- var WidgetLayout = lazy(() => import("./WidgetLayout-4ZIG3RXV.js").then((m) => ({ default: m.WidgetLayout })));
319
- var ShellRouteSync = lazy(() => import("./ShellRouteSync-T4WLY57Q.js").then((m) => ({ default: m.ShellRouteSync })));
376
+ var SidebarLayout = lazy(() => import("./SidebarLayout-A2HJPPHS.js").then((m) => ({ default: m.SidebarLayout })));
377
+ var DrawerLayout = lazy(() => import("./DrawerLayout-JR3O6RRB.js").then((m) => ({ default: m.DrawerLayout })));
378
+ var DockLayout = lazy(() => import("./DockLayout-LM4AFMFY.js").then((m) => ({ default: m.DockLayout })));
379
+ var WidgetLayout = lazy(() => import("./WidgetLayout-6QM45OQQ.js").then((m) => ({ default: m.WidgetLayout })));
380
+ var ShellRouteSync = lazy(() => import("./ShellRouteSync-CEBETGEJ.js").then((m) => ({ default: m.ShellRouteSync })));
320
381
  function LayoutFallback({ className }) {
321
382
  return /* @__PURE__ */ jsx2(
322
383
  "div",
@@ -391,9 +452,28 @@ function ChatProviderFromShell({
391
452
  children,
392
453
  initialSessionId: hostInitialSessionId,
393
454
  onRemoteIdChange,
455
+ server,
394
456
  ...providerRest
395
457
  }) {
396
458
  const { mode, runtimeKey, listSessionsAgentId, pendingSessionId } = useShellMode();
459
+ const isCreateAgent = mode.status === "active" && mode.isMutable && mode.isCreateAgent;
460
+ const serverWithCreateIntent = useMemo2(() => {
461
+ return {
462
+ ...server,
463
+ createSession: (request) => {
464
+ if (request.agentSpec === void 0) {
465
+ return server.createSession(request);
466
+ }
467
+ const withMetadata = {
468
+ ...request,
469
+ metadata: {
470
+ [IS_CREATE_AGENT_METADATA_KEY]: isCreateAgentMetadataValue(isCreateAgent)
471
+ }
472
+ };
473
+ return server.createSession(withMetadata);
474
+ }
475
+ };
476
+ }, [server, isCreateAgent]);
397
477
  const draftDefaultAgentSpec = useMemo2(() => {
398
478
  if (mode.status === "active" && mode.isMutable) {
399
479
  return mode.agentSpec ?? { model: { name: "openai-main/gpt-4.1" } };
@@ -426,14 +506,15 @@ function ChatProviderFromShell({
426
506
  TrueFoundryChatProvider,
427
507
  {
428
508
  ...providerRest,
509
+ server: serverWithCreateIntent,
429
510
  agent,
430
511
  listSessionsAgentId,
431
512
  initialSessionId: pendingSessionId ?? hostInitialSessionId,
432
- children: /* @__PURE__ */ jsxs(DraftCatalogProvider, { children: [
513
+ children: /* @__PURE__ */ jsx2(DraftCatalogProvider, { children: /* @__PURE__ */ jsxs(AgentConfigInstructionsProvider, { children: [
433
514
  /* @__PURE__ */ jsx2(DraftSpecPreferenceBridge, {}),
434
515
  onRemoteIdChange != null ? /* @__PURE__ */ jsx2(RemoteIdRouteBridge, { onRemoteIdChange }) : null,
435
516
  children
436
- ] })
517
+ ] }) })
437
518
  },
438
519
  runtimeKey
439
520
  );
@@ -448,6 +529,7 @@ function TrueForgeUIShell(props) {
448
529
  initialSettingsOpen = false,
449
530
  server: serverConfig,
450
531
  onError,
532
+ customActionRenderers,
451
533
  resolvedRoutes,
452
534
  routes: _routes,
453
535
  ...providerRest
@@ -463,7 +545,8 @@ function TrueForgeUIShell(props) {
463
545
  }
464
546
  const server = resolved.server;
465
547
  const layoutTree = /* @__PURE__ */ jsx2(LayoutChildren, { layout, className });
466
- return /* @__PURE__ */ jsx2(SlotsProvider, { overrides, theme, children: /* @__PURE__ */ jsx2(ServerProvider, { server, children: /* @__PURE__ */ jsxs(ShellModeProvider, { agentConfig, initialSettingsOpen, children: [
548
+ const shellTree = /* @__PURE__ */ jsxs(ShellModeProvider, { agentConfig, initialSettingsOpen, children: [
549
+ /* @__PURE__ */ jsx2(LibrarySessionShareBoot, {}),
467
550
  resolvedRoutes != null ? /* @__PURE__ */ jsx2(Suspense, { fallback: null, children: /* @__PURE__ */ jsx2(
468
551
  ShellRouteSync,
469
552
  {
@@ -482,7 +565,9 @@ function TrueForgeUIShell(props) {
482
565
  children: layoutTree
483
566
  }
484
567
  )
485
- ] }) }) });
568
+ ] });
569
+ const visibilityTree = layout === "widget" ? /* @__PURE__ */ jsx2(WidgetVisibilityProvider, { children: shellTree }) : shellTree;
570
+ return /* @__PURE__ */ jsx2(SlotsProvider, { overrides, theme, children: /* @__PURE__ */ jsx2(CustomActionRenderersProvider, { renderers: customActionRenderers, children: /* @__PURE__ */ jsx2(ServerProvider, { server, children: resolvedRoutes != null ? /* @__PURE__ */ jsx2(ResolvedRoutesProvider, { routes: resolvedRoutes, children: visibilityTree }) : visibilityTree }) }) });
486
571
  }
487
572
 
488
573
  export {
@@ -490,4 +575,4 @@ export {
490
575
  ServerInitLoader,
491
576
  TrueForgeUIShell
492
577
  };
493
- //# sourceMappingURL=chunk-255AE5NI.js.map
578
+ //# sourceMappingURL=chunk-CYHJDKFB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/containers/TrueFoundryChatProvider.tsx","../src/containers/TrueForgeUIShell.tsx","../src/atoms/draft/DraftSpecPreferenceBridge.tsx","../src/routing/LibrarySessionShareBoot.tsx","../src/routing/RemoteIdRouteBridge.tsx","../src/containers/useResolvedServer.ts"],"sourcesContent":["'use client';\n\nimport { AssistantRuntimeProvider } from '@assistant-ui/react';\nimport {\n trueFoundryAttachmentAdapter,\n useTrueFoundryAgentRuntime,\n type TrueFoundryAgentConfig,\n type UseTrueFoundryAgentRuntimeOptions,\n} from '@truefoundry/assistant-ui-runtime';\nimport { useCallback, useMemo, type ReactNode } from 'react';\n\nimport { notifyComposerBusyFailure } from '../hooks/useComposerBusyState.js';\nimport type { AgentUIServer } from '../server/types.js';\nimport { ToasterProvider, useToaster } from './ToasterContainer.js';\n\ntype RuntimeAdapters = NonNullable<UseTrueFoundryAgentRuntimeOptions['adapters']>;\n\nexport type TrueFoundryChatProviderProps = {\n server: AgentUIServer;\n initialSessionId?: string;\n adapters?: RuntimeAdapters;\n onError?: (error: unknown) => void;\n children: ReactNode;\n /** Discriminated agent source. Prefer over legacy `agentName`. */\n agent?: TrueFoundryAgentConfig;\n /** Legacy named-agent shorthand. Prefer `agent: { mode: \"named\", agentName }`. */\n agentName?: string;\n /** Forwarded to `listSessions({ agentId })` for history filtering. */\n listSessionsAgentId?: string;\n};\n\nfunction ChatRuntimeScope({\n server,\n agent,\n agentName,\n listSessionsAgentId,\n initialSessionId,\n adapters,\n onError,\n children,\n}: {\n server: AgentUIServer;\n agent?: TrueFoundryAgentConfig;\n agentName?: string;\n listSessionsAgentId?: string;\n initialSessionId?: string;\n adapters?: RuntimeAdapters;\n onError?: (error: unknown) => void;\n children: ReactNode;\n}) {\n const { showError } = useToaster();\n const reportError = onError ?? showError;\n // composer().send() is void and swallows onNew rejections; clear optimistic\n // busy when the runtime reports a pre-stream failure (e.g. createSession).\n const resolvedOnError = useCallback(\n (error: unknown) => {\n notifyComposerBusyFailure();\n reportError(error);\n },\n [reportError],\n );\n\n const runtime = useTrueFoundryAgentRuntime({\n server: server as never,\n agent,\n agentName,\n listSessionsAgentId,\n initialSessionId,\n onError: resolvedOnError,\n adapters: {\n ...adapters,\n attachments: adapters?.attachments ?? trueFoundryAttachmentAdapter,\n },\n });\n\n return <AssistantRuntimeProvider runtime={runtime as never}>{children}</AssistantRuntimeProvider>;\n}\n\n/**\n * Chat shell: wires `useTrueFoundryAgentRuntime` from `server` and provides\n * assistant-ui + error toasts.\n */\nexport function TrueFoundryChatProvider(props: TrueFoundryChatProviderProps) {\n const { server, initialSessionId, adapters, onError, children, agent, agentName, listSessionsAgentId } = props;\n\n const stableServer = useMemo(() => server, [server]);\n\n return (\n <ToasterProvider>\n <ChatRuntimeScope\n server={stableServer}\n agent={agent}\n agentName={agentName}\n listSessionsAgentId={listSessionsAgentId}\n initialSessionId={initialSessionId}\n adapters={adapters}\n onError={onError}\n >\n {children}\n </ChatRuntimeScope>\n </ToasterProvider>\n );\n}\n","'use client';\n\nimport type { TrueFoundryAgentConfig, UseTrueFoundryAgentRuntimeOptions } from '@truefoundry/assistant-ui-runtime';\nimport { lazy, Suspense, useCallback, useMemo, useState, type ReactNode } from 'react';\n\nimport { AgentConfigInstructionsProvider } from '../atoms/draft/AgentConfigInstructionsContext.js';\nimport { DraftCatalogProvider } from '../atoms/draft/DraftCatalogProvider.js';\nimport { DraftSpecPreferenceBridge } from '../atoms/draft/DraftSpecPreferenceBridge.js';\nimport { cn } from '../atoms/lib/cn.js';\nimport { IS_CREATE_AGENT_METADATA_KEY, isCreateAgentMetadataValue } from '../atoms/lib/sessionCreateAgent.js';\nimport { Spinner } from '../atoms/primitives/Spinner.js';\nimport { WidgetVisibilityProvider } from '../layouts/WidgetVisibilityContext.js';\nimport { LibrarySessionShareBoot } from '../routing/LibrarySessionShareBoot.js';\nimport { RemoteIdRouteBridge } from '../routing/RemoteIdRouteBridge.js';\nimport { ResolvedRoutesProvider } from '../routing/ResolvedRoutesContext.js';\nimport type { ResolvedRoutes, RoutesConfig } from '../routing/types.js';\nimport { CustomActionRenderersProvider, type CustomActionRenderers } from '../server/CustomActionRenderersContext.js';\nimport { ServerProvider } from '../server/ServerContext.js';\nimport { DEFAULT_AGENT_CONFIG, ShellModeProvider, useShellMode, type AgentConfig } from '../server/ShellModeContext.js';\nimport type { TrueForgeServerConfig } from '../server/TrueForgeServerConfig.js';\nimport type { AgentUIServer, CreateSessionRequest } from '../server/types.js';\nimport { SlotsProvider, type SlotOverrides } from '../theme/SlotsProvider.js';\nimport type { LayoutProp, ThemeConfig } from '../theme/types.js';\nimport { getErrorMessage } from '../utils/getErrorMessage.js';\nimport { TrueFoundryChatProvider, type TrueFoundryChatProviderProps } from './TrueFoundryChatProvider.js';\nimport { useResolvedServer } from './useResolvedServer.js';\n\nconst SidebarLayout = lazy(() => import('../layouts/SidebarLayout.js').then(m => ({ default: m.SidebarLayout })));\nconst DrawerLayout = lazy(() => import('../layouts/DrawerLayout.js').then(m => ({ default: m.DrawerLayout })));\nconst DockLayout = lazy(() => import('../layouts/DockLayout.js').then(m => ({ default: m.DockLayout })));\nconst WidgetLayout = lazy(() => import('../layouts/WidgetLayout.js').then(m => ({ default: m.WidgetLayout })));\nconst ShellRouteSync = lazy(() => import('../routing/ShellRouteSync.js').then(m => ({ default: m.ShellRouteSync })));\n\nexport type ChatLayout = 'sidebar' | 'drawer' | 'dock' | 'widget';\n\ntype RuntimeAdapters = NonNullable<UseTrueFoundryAgentRuntimeOptions['adapters']>;\n\nexport type TrueForgeUIProps = {\n server: TrueForgeServerConfig;\n /** Built-in layout string or a custom layout component. Defaults to `\"sidebar\"`. */\n layout?: LayoutProp;\n overrides?: SlotOverrides;\n theme?: ThemeConfig;\n className?: string;\n initialSessionId?: string;\n adapters?: RuntimeAdapters;\n onError?: (error: unknown) => void;\n /**\n * Agent / library / composer shell mode.\n * Defaults to `{ mode: \"AgentLibraryWithComposer\" }`.\n */\n agentConfig?: AgentConfig;\n /** Open settings on first paint only (host boot with no models configured). */\n initialSettingsOpen?: boolean;\n /**\n * Host UI for pending client-side tools, keyed by tool name.\n * When a pending tool matches, the composer mounts that component instead of Ask User.\n */\n customActionRenderers?: CustomActionRenderers;\n /**\n * Sync shell navigation to the browser URL via react-router (opt-in).\n * Requires `react-router-dom` in the host. Leave off for dock/widget embeds\n * and hosts that own their own router. Defaults to `false`.\n */\n withRouter?: boolean;\n /** URL path customization; only honored when `withRouter`. */\n routes?: RoutesConfig;\n};\n\nexport type TrueForgeUIShellProps = Omit<TrueForgeUIProps, 'withRouter'> & { resolvedRoutes?: ResolvedRoutes };\n\nfunction LayoutFallback({ className }: { className?: string }) {\n return (\n <div\n className={className}\n style={{\n height: '100%',\n minHeight: '12rem',\n background:\n 'linear-gradient(90deg, color-mix(in oklab, var(--secondary-bg) 55%, transparent) 25%, color-mix(in oklab, var(--secondary-bg) 25%, transparent) 50%, color-mix(in oklab, var(--secondary-bg) 55%, transparent) 75%)',\n backgroundSize: '200% 100%',\n animation: 'tfy-aui-pulse 1.2s ease-in-out infinite',\n }}\n aria-hidden\n />\n );\n}\n\n/** Shown while `type: \"truefoundry\"` resolves the agent UI server. */\nexport function ServerInitLoader({ className }: { className?: string }) {\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n className={cn(\n 'flex h-full min-h-48 w-full flex-1 items-center justify-center bg-primary-bg text-text-secondary',\n className,\n )}\n >\n <Spinner size={28} className=\"text-text-primary\" />\n <span className=\"sr-only\">Loading</span>\n </div>\n );\n}\n\nfunction ServerInitError({ error, className }: { error: unknown; className?: string }) {\n const message = getErrorMessage(error, 'Failed to initialize server');\n return (\n <div\n role=\"alert\"\n className={cn(\n 'flex h-full min-h-48 items-center justify-center bg-primary-bg px-6 text-center text-sm text-failure-bg',\n className,\n )}\n >\n {message}\n </div>\n );\n}\n\nfunction isBuiltInLayout(layout: LayoutProp): layout is ChatLayout {\n return layout === 'sidebar' || layout === 'drawer' || layout === 'dock' || layout === 'widget';\n}\n\nfunction BuiltInLayoutView({ layout, className }: { layout: ChatLayout; className?: string }) {\n switch (layout) {\n case 'sidebar':\n return <SidebarLayout className={className} />;\n case 'drawer':\n return <DrawerLayout className={className} />;\n case 'dock':\n return <DockLayout className={className} />;\n case 'widget':\n return <WidgetLayout className={className} />;\n }\n}\n\nfunction LayoutChildren({ layout, className }: { layout: LayoutProp; className?: string }) {\n if (isBuiltInLayout(layout)) {\n return (\n <Suspense fallback={<LayoutFallback className={className} />}>\n <BuiltInLayoutView layout={layout} className={className} />\n </Suspense>\n );\n }\n const HostLayout = layout;\n return <HostLayout className={className} />;\n}\n\nfunction ChatProviderFromShell({\n children,\n initialSessionId: hostInitialSessionId,\n onRemoteIdChange,\n server,\n ...providerRest\n}: {\n children: ReactNode;\n /** When routing, reports the active thread's remote id up to `ShellRouteSync`. */\n onRemoteIdChange?: (id: string | undefined) => void;\n} & Omit<TrueFoundryChatProviderProps, 'agent' | 'agentName' | 'listSessionsAgentId' | 'children'>) {\n const { mode, runtimeKey, listSessionsAgentId, pendingSessionId } = useShellMode();\n\n const isCreateAgent = mode.status === 'active' && mode.isMutable && mode.isCreateAgent;\n\n const serverWithCreateIntent = useMemo((): AgentUIServer => {\n return {\n ...server,\n createSession: request => {\n if (request.agentSpec === undefined) {\n return server.createSession(request);\n }\n const withMetadata: CreateSessionRequest & { metadata: Record<string, string> } = {\n ...request,\n metadata: {\n [IS_CREATE_AGENT_METADATA_KEY]: isCreateAgentMetadataValue(isCreateAgent),\n },\n };\n return server.createSession(withMetadata);\n },\n };\n }, [server, isCreateAgent]);\n\n // Freeze draft seed for the life of this runtimeKey so bindMutableAgent (identity /\n // instructions on shell) does not push a new defaultAgentSpec into the runtime.\n const draftDefaultAgentSpec = useMemo(() => {\n if (mode.status === 'active' && mode.isMutable) {\n return mode.agentSpec ?? { model: { name: 'openai-main/gpt-4.1' } };\n }\n return { model: { name: 'openai-main/gpt-4.1' } };\n // runtimeKey is the remount boundary for mutable chats.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- intentionally keyed on runtimeKey only\n }, [runtimeKey]);\n\n const agent: TrueFoundryAgentConfig = useMemo(() => {\n // idle uses a placeholder draft so layout chrome (useAui) still mounts;\n // layouts render an empty CTA instead of the thread.\n if (mode.status === 'idle') {\n return {\n mode: 'draft',\n defaultAgentSpec: { model: { name: 'openai-main/gpt-4.1' } },\n };\n }\n // Runtime still uses named|draft; shell mutability maps onto that adapter.\n if (!mode.isMutable) {\n const agentName = mode.agentName ?? mode.agentId ?? pendingSessionId;\n if (agentName == null) {\n // Active immutable without identity should not happen; keep chrome mounted.\n return {\n mode: 'draft',\n defaultAgentSpec: { model: { name: 'openai-main/gpt-4.1' } },\n };\n }\n return { mode: 'named', agentName };\n }\n return {\n mode: 'draft',\n defaultAgentSpec: draftDefaultAgentSpec,\n };\n }, [mode, draftDefaultAgentSpec, pendingSessionId]);\n\n return (\n <TrueFoundryChatProvider\n key={runtimeKey}\n {...providerRest}\n server={serverWithCreateIntent}\n agent={agent}\n listSessionsAgentId={listSessionsAgentId}\n initialSessionId={pendingSessionId ?? hostInitialSessionId}\n >\n <DraftCatalogProvider>\n <AgentConfigInstructionsProvider>\n <DraftSpecPreferenceBridge />\n {onRemoteIdChange != null ? <RemoteIdRouteBridge onRemoteIdChange={onRemoteIdChange} /> : null}\n {children}\n </AgentConfigInstructionsProvider>\n </DraftCatalogProvider>\n </TrueFoundryChatProvider>\n );\n}\n\n/** Internal shell. `resolvedRoutes` present iff mounted under `TrueForgeUIWithRouter`. */\nexport function TrueForgeUIShell(props: TrueForgeUIShellProps) {\n const {\n layout = 'sidebar',\n overrides,\n theme,\n className,\n agentConfig = DEFAULT_AGENT_CONFIG,\n initialSettingsOpen = false,\n server: serverConfig,\n onError,\n customActionRenderers,\n resolvedRoutes,\n routes: _routes,\n ...providerRest\n } = props;\n\n const resolved = useResolvedServer(serverConfig, onError);\n const [activeRemoteId, setActiveRemoteId] = useState<string | undefined>(undefined);\n const handleRemoteIdChange = useCallback((id: string | undefined) => setActiveRemoteId(id), []);\n\n if (resolved.status === 'loading') {\n return (\n <SlotsProvider overrides={overrides} theme={theme}>\n <ServerInitLoader className={className} />\n </SlotsProvider>\n );\n }\n\n if (resolved.status === 'error') {\n return (\n <SlotsProvider overrides={overrides} theme={theme}>\n <ServerInitError error={resolved.error} className={className} />\n </SlotsProvider>\n );\n }\n\n const server = resolved.server;\n const layoutTree = <LayoutChildren layout={layout} className={className} />;\n\n const shellTree = (\n <ShellModeProvider agentConfig={agentConfig} initialSettingsOpen={initialSettingsOpen}>\n <LibrarySessionShareBoot />\n {resolvedRoutes != null ? (\n <Suspense fallback={null}>\n <ShellRouteSync\n routes={resolvedRoutes}\n activeRemoteId={activeRemoteId}\n initialSettingsOpen={initialSettingsOpen}\n />\n </Suspense>\n ) : null}\n <ChatProviderFromShell\n server={server}\n onError={onError}\n onRemoteIdChange={resolvedRoutes != null ? handleRemoteIdChange : undefined}\n {...providerRest}\n >\n {layoutTree}\n </ChatProviderFromShell>\n </ShellModeProvider>\n );\n // Widget visibility provider is used to control the visibility of the widget with isolated state\n const visibilityTree =\n layout === 'widget' ? <WidgetVisibilityProvider>{shellTree}</WidgetVisibilityProvider> : shellTree;\n\n return (\n <SlotsProvider overrides={overrides} theme={theme}>\n <CustomActionRenderersProvider renderers={customActionRenderers}>\n <ServerProvider server={server}>\n {resolvedRoutes != null ? (\n <ResolvedRoutesProvider routes={resolvedRoutes}>{visibilityTree}</ResolvedRoutesProvider>\n ) : (\n visibilityTree\n )}\n </ServerProvider>\n </CustomActionRenderersProvider>\n </SlotsProvider>\n );\n}\n","'use client';\n\nimport { useTrueFoundryAgentSpec, useTrueFoundryUpdateAgentSpec } from '@truefoundry/assistant-ui-runtime';\nimport { useEffect } from 'react';\n\nimport { type DraftPreferenceKind, withCapabilitiesSandbox } from '../../server/draftSpecPreferences.js';\nimport { useServerCapabilities } from '../../server/ServerContext.js';\nimport { useShellMode } from '../../server/ShellModeContext.js';\nimport type { AgentSkill, AgentSpec, ConnectorState, ModelSelection } from '../../server/types.js';\nimport { mountName } from '../lib/mountName.js';\nimport { useDraftCatalog } from './DraftCatalogProvider.js';\nimport { modelPatchWithReasoningEffort } from './reasoningEffort.js';\n\nfunction readDraftSandboxEnabled(spec: AgentSpec): boolean | undefined {\n if (spec.config === undefined) return undefined;\n // `sandbox` is draft runtime config and may be absent from AgentRuntimeConfig typings.\n const sandbox = Reflect.get(spec.config, 'sandbox');\n if (typeof sandbox !== 'object' || sandbox === null) return undefined;\n const enabled = Reflect.get(sandbox, 'enabled');\n return typeof enabled === 'boolean' ? enabled : undefined;\n}\n\nfunction filterMounts<T extends object>(mounts: T[] | undefined, availableNames: Set<string>): T[] | undefined {\n if (mounts === undefined) return undefined;\n const filtered = mounts.filter(mount => {\n const name = mountName(mount);\n return name !== null && availableNames.has(name);\n });\n return filtered.length === mounts.length ? mounts : filtered;\n}\n\nexport function reconcileDraftSpecPreferences({\n agentSpec,\n models,\n skills,\n connectors,\n connectorsHasMore = false,\n skillsEnabled,\n}: {\n agentSpec: AgentSpec;\n models: ModelSelection[];\n skills: AgentSkill[];\n connectors: ConnectorState[];\n /** When more MCP pages remain, off-page selections must not be treated as deleted. */\n connectorsHasMore?: boolean;\n skillsEnabled: boolean | undefined;\n}): Partial<AgentSpec> {\n const update: Partial<AgentSpec> = {};\n const selectedModel = agentSpec.model.name.trim();\n if (!models.some(model => model.name === selectedModel)) {\n const fallback = models[0];\n if (fallback !== undefined) {\n update.model = modelPatchWithReasoningEffort(\n fallback.name,\n agentSpec.model.params,\n fallback.properties.reasoningEfforts,\n );\n }\n }\n\n // Paginated catalogs only include loaded pages — prune MCP only once the full list is known.\n if (!connectorsHasMore) {\n const nextMcpServers = filterMounts(agentSpec.mcpServers, new Set(connectors.map(connector => connector.name)));\n if (nextMcpServers !== agentSpec.mcpServers) {\n update.mcpServers = nextMcpServers;\n }\n }\n\n if (skillsEnabled === false) {\n // Only clear when there is something to clear — a fresh `[]` each call would\n // fail reference equality and loop `updateAgentSpec` forever.\n if (agentSpec.skills !== undefined && agentSpec.skills.length > 0) {\n update.skills = [];\n }\n } else {\n const nextSkills = filterMounts(agentSpec.skills, new Set(skills.map(skill => skill.name)));\n if (nextSkills !== agentSpec.skills) {\n update.skills = nextSkills;\n }\n }\n\n return update;\n}\n\nexport function reconcileDraftSandbox({\n agentSpec,\n sandboxEnabled,\n kind = 'agent',\n}: {\n agentSpec: AgentSpec;\n sandboxEnabled: boolean | null | undefined;\n kind?: DraftPreferenceKind;\n}): Partial<AgentSpec> {\n if (kind === 'chat') {\n if (sandboxEnabled == null) return {};\n const current = readDraftSandboxEnabled(agentSpec);\n if (sandboxEnabled === true && current !== true) {\n return {\n config: {\n ...agentSpec.config,\n sandbox: { ...agentSpec.config?.sandbox, enabled: true },\n },\n };\n }\n if (sandboxEnabled === false && current === true) {\n return {\n config: {\n ...agentSpec.config,\n sandbox: { ...agentSpec.config?.sandbox, enabled: false },\n },\n };\n }\n return {};\n }\n\n const nextSpec = withCapabilitiesSandbox(agentSpec, sandboxEnabled);\n return nextSpec === agentSpec ? {} : { config: nextSpec.config };\n}\n\n/**\n * Mirrors plain-draft composer choices into the shell seed and removes catalog\n * entries that disappeared since those choices were stored.\n * New Chat and New Agent keep separate seeds; chat never persists runtime config.\n */\nexport function DraftSpecPreferenceBridge() {\n const { mode, pendingSessionId, rememberDraftSpec } = useShellMode();\n const { agentSpec } = useTrueFoundryAgentSpec();\n const updateAgentSpec = useTrueFoundryUpdateAgentSpec();\n const capabilities = useServerCapabilities();\n const sandboxEnabled = capabilities?.sandbox.enabled;\n const { models, skills, connectors, connectorsHasMore, loaded, error, ensureLoaded } = useDraftCatalog();\n const isPlainDraft = mode.status === 'active' && mode.isMutable && mode.agentId == null && pendingSessionId == null;\n const preferenceKind = mode.status === 'active' && mode.isMutable && mode.isCreateAgent ? 'agent' : 'chat';\n\n useEffect(() => {\n if (isPlainDraft) ensureLoaded();\n }, [ensureLoaded, isPlainDraft]);\n\n useEffect(() => {\n if (isPlainDraft && agentSpec != null) {\n rememberDraftSpec(agentSpec, preferenceKind);\n }\n }, [agentSpec, isPlainDraft, preferenceKind, rememberDraftSpec]);\n\n useEffect(() => {\n // New Chat mirrors capabilities onto the live draft; New Agent only disables when unavailable.\n if (!isPlainDraft || agentSpec == null || updateAgentSpec == null) return;\n const update = reconcileDraftSandbox({ agentSpec, sandboxEnabled, kind: preferenceKind });\n if (Object.keys(update).length > 0) {\n updateAgentSpec(update);\n }\n }, [agentSpec, isPlainDraft, preferenceKind, sandboxEnabled, updateAgentSpec]);\n\n useEffect(() => {\n if (!isPlainDraft || agentSpec == null || updateAgentSpec == null || !loaded || error != null) return;\n\n const update = reconcileDraftSpecPreferences({\n agentSpec,\n models,\n skills,\n connectors,\n connectorsHasMore,\n skillsEnabled: capabilities?.skill.enabled,\n });\n if (Object.keys(update).length > 0) {\n updateAgentSpec(update);\n }\n }, [\n agentSpec,\n capabilities?.skill.enabled,\n connectors,\n connectorsHasMore,\n error,\n isPlainDraft,\n loaded,\n models,\n skills,\n updateAgentSpec,\n ]);\n\n return null;\n}\n","'use client';\n\nimport { useEffect } from 'react';\n\nimport { useShellMode } from '../server/ShellModeContext.js';\nimport { readSessionShareSearch } from '../utils/sessionShareUrl.js';\n\n/** Open the sessions browser or a library agent from the share query — with or without `withRouter`. */\nexport function LibrarySessionShareBoot() {\n const { openLibraryAgent, setSessionsOpen } = useShellMode();\n\n useEffect(() => {\n const share = readSessionShareSearch(window.location.search);\n if (share.view === 'sessions') {\n setSessionsOpen(true);\n return;\n }\n if (share.agentId == null) return;\n openLibraryAgent(share.agentId);\n }, [openLibraryAgent, setSessionsOpen]);\n\n return null;\n}\n","'use client';\n\nimport { useEffect } from 'react';\n\nimport { useAuiState } from '../assistant-ui.js';\n\n/**\n * Observes the active thread's remote id (assigned once a fresh chat persists)\n * and lifts it to the parent so `ShellRouteSync` can mirror it to `/sessions/:id`.\n * Lives inside the chat runtime, so it remounts with `runtimeKey`; reporting is\n * idempotent, so that is harmless. Carries no react-router dependency.\n */\nexport function RemoteIdRouteBridge({ onRemoteIdChange }: { onRemoteIdChange: (id: string | undefined) => void }) {\n const remoteId = useAuiState(s => s.threadListItem.remoteId);\n useEffect(() => {\n onRemoteIdChange(remoteId ?? undefined);\n }, [remoteId, onRemoteIdChange]);\n return null;\n}\n","'use client';\n\nimport { createTrueFoundryAgentUIServer } from '@truefoundry/assistant-ui-runtime/plugins/truefoundry-agent-server-adapter';\nimport { useEffect, useState } from 'react';\n\nimport type { TrueForgeBuiltInServerConfig, TrueForgeServerConfig } from '../server/TrueForgeServerConfig.js';\nimport type { AgentBuilderCapabilitiesResponse, AgentUIServer, CatalogServer } from '../server/types.js';\n\nexport type ResolvedServerState =\n | { status: 'loading'; server: null; error: null }\n | { status: 'ready'; server: AgentUIServer; error: null }\n | { status: 'error'; server: null; error: unknown };\n\n/** Fallback when an older runtime adapter omits `getCapabilities`. */\nconst DEFAULT_CAPABILITIES = {\n data: {\n sandbox: { enabled: true },\n skill: { enabled: true },\n settings: { enabled: true },\n },\n} satisfies AgentBuilderCapabilitiesResponse;\n\nfunction isBuiltInConfig(config: TrueForgeServerConfig): config is TrueForgeBuiltInServerConfig {\n return (\n typeof config === 'object' &&\n config !== null &&\n 'type' in config &&\n (config.type === 'truefoundry' || config.type === 'trueforge')\n );\n}\n\nfunction hasGetCapabilities(\n server: object,\n): server is { getCapabilities: () => Promise<AgentBuilderCapabilitiesResponse> } {\n return typeof Reflect.get(server, 'getCapabilities') === 'function';\n}\n\n/**\n * Attach optional catalog and ensure `getCapabilities` exists on the composed port.\n */\nfunction toAgentUIServer(server: object, catalog: CatalogServer | undefined): AgentUIServer {\n const getCapabilities = hasGetCapabilities(server)\n ? () => server.getCapabilities()\n : async () => DEFAULT_CAPABILITIES;\n const withCapabilities = { ...server, getCapabilities };\n const withCatalog = catalog != null ? { ...withCapabilities, catalog } : withCapabilities;\n if (!isAgentUIServer(withCatalog)) {\n throw new Error('TrueForgeUI: runtime adapter returned an incomplete AgentUIServer');\n }\n return withCatalog;\n}\n\nfunction isAgentUIServer(value: object): value is AgentUIServer {\n return (\n typeof Reflect.get(value, 'createSession') === 'function' &&\n typeof Reflect.get(value, 'listSessions') === 'function' &&\n typeof Reflect.get(value, 'getSession') === 'function' &&\n typeof Reflect.get(value, 'updateSession') === 'function' &&\n typeof Reflect.get(value, 'createTurn') === 'function' &&\n typeof Reflect.get(value, 'cancelSession') === 'function' &&\n typeof Reflect.get(value, 'listTurns') === 'function' &&\n typeof Reflect.get(value, 'getTurn') === 'function' &&\n typeof Reflect.get(value, 'listEvents') === 'function' &&\n typeof Reflect.get(value, 'getCapabilities') === 'function' &&\n typeof Reflect.get(value, 'getModels') === 'function' &&\n typeof Reflect.get(value, 'getSkills') === 'function' &&\n typeof Reflect.get(value, 'getMcp') === 'function' &&\n typeof Reflect.get(value, 'searchAgents') === 'function' &&\n typeof Reflect.get(value, 'saveAgent') === 'function'\n );\n}\n\n/**\n * Resolves a {@link TrueForgeServerConfig} to an {@link AgentUIServer}.\n * - `AgentUIServer` — sync passthrough\n * - `truefoundry` — async via `createTrueFoundryAgentUIServer`\n * - `trueforge` — via dynamic import of the Harness plugin adapter\n */\nexport function useResolvedServer(\n config: TrueForgeServerConfig,\n onError?: (error: unknown) => void,\n): ResolvedServerState {\n const builtIn = isBuiltInConfig(config) ? config : null;\n const directServer: AgentUIServer | null = isBuiltInConfig(config) ? null : config;\n const type = builtIn?.type;\n const apiKey = builtIn?.type === 'truefoundry' ? builtIn.apiKey : '';\n const controlPlaneURL = builtIn?.type === 'truefoundry' ? builtIn.controlPlaneURL : '';\n const gatewayPlaneURL = builtIn?.type === 'truefoundry' ? (builtIn.gatewayPlaneURL ?? '') : '';\n const trueforgeBaseUrl = builtIn?.type === 'trueforge' ? (builtIn.baseUrl ?? '') : '';\n const trueforgeToken = builtIn?.type === 'trueforge' ? (builtIn.token ?? '') : '';\n const trueforgeFetch = builtIn?.type === 'trueforge' ? builtIn.fetch : undefined;\n const catalog = builtIn?.catalog;\n\n const [state, setState] = useState<ResolvedServerState>(() => {\n if (directServer) {\n return { status: 'ready', server: directServer, error: null };\n }\n return { status: 'loading', server: null, error: null };\n });\n\n useEffect(() => {\n if (directServer) {\n setState({ status: 'ready', server: directServer, error: null });\n return;\n }\n\n let cancelled = false;\n setState({ status: 'loading', server: null, error: null });\n\n const resolve = async (): Promise<AgentUIServer> => {\n if (type === 'trueforge') {\n const { createTrueForgeAgentUIServer } = await import('../plugins/trueforge-agent-server-adapter/index.js');\n return createTrueForgeAgentUIServer({\n ...(trueforgeBaseUrl ? { baseUrl: trueforgeBaseUrl } : {}),\n ...(trueforgeToken ? { token: trueforgeToken } : {}),\n ...(trueforgeFetch !== undefined ? { fetch: trueforgeFetch } : {}),\n ...(catalog != null ? { catalog } : {}),\n });\n }\n\n const runtimeServer = await createTrueFoundryAgentUIServer({\n apiKey,\n cpURL: controlPlaneURL,\n ...(gatewayPlaneURL ? { gatewayURL: gatewayPlaneURL } : {}),\n });\n // TrueFoundry adapter may omit catalog; attach host-supplied catalog here.\n return toAgentUIServer(runtimeServer, catalog);\n };\n\n void resolve()\n .then(server => {\n if (cancelled) return;\n try {\n // trueforge factory already includes catalog; still normalize capabilities.\n setState({\n status: 'ready',\n server: type === 'trueforge' ? toAgentUIServer(server, undefined) : server,\n error: null,\n });\n } catch (error: unknown) {\n onError?.(error);\n setState({ status: 'error', server: null, error });\n }\n })\n .catch((error: unknown) => {\n if (cancelled) return;\n onError?.(error);\n setState({ status: 'error', server: null, error });\n });\n\n return () => {\n cancelled = true;\n };\n }, [\n type,\n directServer,\n apiKey,\n controlPlaneURL,\n gatewayPlaneURL,\n trueforgeBaseUrl,\n trueforgeToken,\n trueforgeFetch,\n catalog,\n onError,\n ]);\n\n return state;\n}\n"],"mappings":"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","names":["useCallback","useMemo","useState","useEffect","useEffect","useEffect","useEffect","useEffect","jsx","useMemo","useState","useCallback"]}
@@ -0,0 +1,27 @@
1
+ // src/layouts/WidgetVisibilityContext.tsx
2
+ import {
3
+ createContext,
4
+ useContext,
5
+ useMemo,
6
+ useState
7
+ } from "react";
8
+ import { jsx } from "react/jsx-runtime";
9
+ var WidgetVisibilityContext = createContext(null);
10
+ function WidgetVisibilityProvider({ children }) {
11
+ const [open, setOpen] = useState(false);
12
+ const value = useMemo(() => ({ open, setOpen }), [open]);
13
+ return /* @__PURE__ */ jsx(WidgetVisibilityContext.Provider, { value, children });
14
+ }
15
+ function useWidgetVisibility() {
16
+ const value = useContext(WidgetVisibilityContext);
17
+ if (value === null) {
18
+ throw new Error("useWidgetVisibility must be used within WidgetVisibilityProvider");
19
+ }
20
+ return value;
21
+ }
22
+
23
+ export {
24
+ WidgetVisibilityProvider,
25
+ useWidgetVisibility
26
+ };
27
+ //# sourceMappingURL=chunk-DJUFS2BW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/layouts/WidgetVisibilityContext.tsx"],"sourcesContent":["'use client';\n\nimport {\n createContext,\n useContext,\n useMemo,\n useState,\n type Dispatch,\n type ReactNode,\n type SetStateAction,\n} from 'react';\n\ntype WidgetVisibilityContextValue = {\n open: boolean;\n setOpen: Dispatch<SetStateAction<boolean>>;\n};\n\nconst WidgetVisibilityContext = createContext<WidgetVisibilityContextValue | null>(null);\n\nexport function WidgetVisibilityProvider({ children }: { children: ReactNode }) {\n const [open, setOpen] = useState(false);\n const value = useMemo(() => ({ open, setOpen }), [open]);\n\n return <WidgetVisibilityContext.Provider value={value}>{children}</WidgetVisibilityContext.Provider>;\n}\n\nexport function useWidgetVisibility(): WidgetVisibilityContextValue {\n const value = useContext(WidgetVisibilityContext);\n if (value === null) {\n throw new Error('useWidgetVisibility must be used within WidgetVisibilityProvider');\n }\n return value;\n}\n"],"mappings":";AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAaE;AANT,IAAM,0BAA0B,cAAmD,IAAI;AAEhF,SAAS,yBAAyB,EAAE,SAAS,GAA4B;AAC9E,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,QAAQ,QAAQ,OAAO,EAAE,MAAM,QAAQ,IAAI,CAAC,IAAI,CAAC;AAEvD,SAAO,oBAAC,wBAAwB,UAAxB,EAAiC,OAAe,UAAS;AACnE;AAEO,SAAS,sBAAoD;AAClE,QAAM,QAAQ,WAAW,uBAAuB;AAChD,MAAI,UAAU,MAAM;AAClB,UAAM,IAAI,MAAM,kEAAkE;AAAA,EACpF;AACA,SAAO;AACT;","names":[]}