@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.
- package/CHANGELOG.md +85 -0
- package/README.md +55 -23
- package/dist/AgentCodeSnippets-NZOFJE57.js +74 -0
- package/dist/AgentCodeSnippets-NZOFJE57.js.map +1 -0
- package/dist/AgentMetricChart-JPU3MFQ2.js +15 -0
- package/dist/AgentOverview-EEBHJC32.js +167 -0
- package/dist/AgentOverview-EEBHJC32.js.map +1 -0
- package/dist/AgentSessionEventTimeline-26Z6IB3B.js +79 -0
- package/dist/AgentSessionEventTimeline-26Z6IB3B.js.map +1 -0
- package/dist/AgentSessionEventTimelineChart-CGCU7WBK.js +504 -0
- package/dist/AgentSessionEventTimelineChart-CGCU7WBK.js.map +1 -0
- package/dist/AgentSessions-3MPDZASK.js +275 -0
- package/dist/AgentSessions-3MPDZASK.js.map +1 -0
- package/dist/{ConnectorSettings-ODC3LVHN.js → ConnectorSettings-MXFRWWR6.js} +8 -6
- package/dist/{ConnectorSettings-ODC3LVHN.js.map → ConnectorSettings-MXFRWWR6.js.map} +1 -1
- package/dist/{DockLayout-TEOWEMSV.js → DockLayout-LM4AFMFY.js} +12 -11
- package/dist/{DockLayout-TEOWEMSV.js.map → DockLayout-LM4AFMFY.js.map} +1 -1
- package/dist/DrawerLayout-JR3O6RRB.js +184 -0
- package/dist/DrawerLayout-JR3O6RRB.js.map +1 -0
- package/dist/{ModelSettings-CKQ5CVAC.js → ModelSettings-G7IFNC2Y.js} +8 -6
- package/dist/{ModelSettings-CKQ5CVAC.js.map → ModelSettings-G7IFNC2Y.js.map} +1 -1
- package/dist/OpenUiFenceBlock-2TV5TQ6P.js +9 -0
- package/dist/OpenUiFenceBlock-2TV5TQ6P.js.map +1 -0
- package/dist/{SandboxSettings-HSCPYUOC.js → SandboxSettings-NXAANMAX.js} +8 -6
- package/dist/{SandboxSettings-HSCPYUOC.js.map → SandboxSettings-NXAANMAX.js.map} +1 -1
- package/dist/SchedulesPage-KKLUDO6B.js +15 -0
- package/dist/SchedulesPage-KKLUDO6B.js.map +1 -0
- package/dist/{SettingsBuilder-MYWRFXRI.js → SettingsBuilder-L34IQ56S.js} +26 -22
- package/dist/SettingsBuilder-L34IQ56S.js.map +1 -0
- package/dist/{ShellRouteSync-T4WLY57Q.js → ShellRouteSync-CEBETGEJ.js} +95 -22
- package/dist/ShellRouteSync-CEBETGEJ.js.map +1 -0
- package/dist/SidebarLayout-A2HJPPHS.js +308 -0
- package/dist/SidebarLayout-A2HJPPHS.js.map +1 -0
- package/dist/{SkillSettings-ECH6SHZ7.js → SkillSettings-FGGMSUNO.js} +8 -6
- package/dist/{SkillSettings-ECH6SHZ7.js.map → SkillSettings-FGGMSUNO.js.map} +1 -1
- package/dist/{TrueForgeUIWithRouter-KMHPOKLN.js → TrueForgeUIWithRouter-MZVJWJMB.js} +15 -11
- package/dist/{TrueForgeUIWithRouter-KMHPOKLN.js.map → TrueForgeUIWithRouter-MZVJWJMB.js.map} +1 -1
- package/dist/{WidgetLayout-4ZIG3RXV.js → WidgetLayout-6QM45OQQ.js} +19 -15
- package/dist/WidgetLayout-6QM45OQQ.js.map +1 -0
- package/dist/chunk-2XPPBEYF.js +74 -0
- package/dist/chunk-2XPPBEYF.js.map +1 -0
- package/dist/chunk-6O6FWUDW.js +1376 -0
- package/dist/chunk-6O6FWUDW.js.map +1 -0
- package/dist/chunk-7Z2C2K7F.js +578 -0
- package/dist/chunk-7Z2C2K7F.js.map +1 -0
- package/dist/{chunk-FXCYLEFB.js → chunk-BSIPI3KV.js} +18 -2
- package/dist/chunk-BSIPI3KV.js.map +1 -0
- package/dist/{chunk-255AE5NI.js → chunk-CYHJDKFB.js} +118 -33
- package/dist/chunk-CYHJDKFB.js.map +1 -0
- package/dist/chunk-DJUFS2BW.js +27 -0
- package/dist/chunk-DJUFS2BW.js.map +1 -0
- package/dist/chunk-DMMZSZTN.js +252 -0
- package/dist/chunk-DMMZSZTN.js.map +1 -0
- package/dist/chunk-FJW36PD7.js +180 -0
- package/dist/chunk-FJW36PD7.js.map +1 -0
- package/dist/chunk-M62XY4NC.js +555 -0
- package/dist/chunk-M62XY4NC.js.map +1 -0
- package/dist/{chunk-JRRCAKEP.js → chunk-MPNSO7E6.js} +2 -2
- package/dist/{chunk-CFLVPV5M.js → chunk-QC42MLAK.js} +7 -2
- package/dist/chunk-QC42MLAK.js.map +1 -0
- package/dist/chunk-RDXBMTP5.js +32 -0
- package/dist/chunk-RDXBMTP5.js.map +1 -0
- package/dist/chunk-SFZNIO6U.js +18 -0
- package/dist/chunk-SFZNIO6U.js.map +1 -0
- package/dist/chunk-U7KURWW3.js +840 -0
- package/dist/chunk-U7KURWW3.js.map +1 -0
- package/dist/chunk-WVE3F724.js +200 -0
- package/dist/chunk-WVE3F724.js.map +1 -0
- package/dist/{chunk-IFLE7OMM.js → chunk-XAU7QFG3.js} +180 -38
- package/dist/chunk-XAU7QFG3.js.map +1 -0
- package/dist/chunk-Y6S4OVVQ.js +16 -0
- package/dist/chunk-Y6S4OVVQ.js.map +1 -0
- package/dist/chunk-ZKNUMH2M.js +119 -0
- package/dist/chunk-ZKNUMH2M.js.map +1 -0
- package/dist/chunk-ZTMKFZQ3.js +13214 -0
- package/dist/chunk-ZTMKFZQ3.js.map +1 -0
- package/dist/{createTrueFoundryServer-B72bU-J7.d.ts → createTrueFoundryServer-CmZnBh_l.d.ts} +15 -4
- package/dist/index.d.ts +1199 -161
- package/dist/index.js +699 -69
- package/dist/index.js.map +1 -1
- package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +552 -12
- package/dist/plugins/trueforge-agent-server-adapter/index.js +506 -188
- package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +11 -10
- package/dist/DrawerLayout-2JOQ4EDZ.js +0 -159
- package/dist/DrawerLayout-2JOQ4EDZ.js.map +0 -1
- package/dist/OpenUiFenceBlock-3EFPY4JW.js +0 -9
- package/dist/SettingsBuilder-MYWRFXRI.js.map +0 -1
- package/dist/ShellRouteSync-T4WLY57Q.js.map +0 -1
- package/dist/SidebarLayout-6MHQYW45.js +0 -239
- package/dist/SidebarLayout-6MHQYW45.js.map +0 -1
- package/dist/WidgetLayout-4ZIG3RXV.js.map +0 -1
- package/dist/chunk-255AE5NI.js.map +0 -1
- package/dist/chunk-72LC2M3R.js +0 -567
- package/dist/chunk-72LC2M3R.js.map +0 -1
- package/dist/chunk-CFLVPV5M.js.map +0 -1
- package/dist/chunk-FXCYLEFB.js.map +0 -1
- package/dist/chunk-IFLE7OMM.js.map +0 -1
- package/dist/chunk-IWPDSPVA.js +0 -2068
- package/dist/chunk-IWPDSPVA.js.map +0 -1
- package/dist/chunk-OZTNBS6V.js +0 -75
- package/dist/chunk-OZTNBS6V.js.map +0 -1
- package/dist/chunk-PUFYHFND.js +0 -91
- package/dist/chunk-PUFYHFND.js.map +0 -1
- package/dist/chunk-WQULF5AT.js +0 -460
- package/dist/chunk-WQULF5AT.js.map +0 -1
- package/dist/chunk-XRTTKGKN.js +0 -6825
- package/dist/chunk-XRTTKGKN.js.map +0 -1
- package/dist/chunk-YIWUG6MC.js +0 -101
- package/dist/chunk-YIWUG6MC.js.map +0 -1
- /package/dist/{OpenUiFenceBlock-3EFPY4JW.js.map → AgentMetricChart-JPU3MFQ2.js.map} +0 -0
- /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-
|
|
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-
|
|
7
|
+
} from "./chunk-BSIPI3KV.js";
|
|
4
8
|
import {
|
|
5
|
-
|
|
6
|
-
} from "./chunk-
|
|
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-
|
|
22
|
+
} from "./chunk-ZTMKFZQ3.js";
|
|
13
23
|
import {
|
|
14
24
|
DraftCatalogProvider,
|
|
15
25
|
Spinner,
|
|
16
26
|
getErrorMessage,
|
|
17
27
|
useDraftCatalog
|
|
18
|
-
} from "./chunk-
|
|
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-
|
|
37
|
+
} from "./chunk-U7KURWW3.js";
|
|
38
|
+
import {
|
|
39
|
+
useAuiState
|
|
40
|
+
} from "./chunk-M6MHLVSO.js";
|
|
27
41
|
import {
|
|
28
42
|
cn
|
|
29
|
-
} from "./chunk-
|
|
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
|
|
97
|
-
|
|
98
|
-
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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/
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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-
|
|
316
|
-
var DrawerLayout = lazy(() => import("./DrawerLayout-
|
|
317
|
-
var DockLayout = lazy(() => import("./DockLayout-
|
|
318
|
-
var WidgetLayout = lazy(() => import("./WidgetLayout-
|
|
319
|
-
var ShellRouteSync = lazy(() => import("./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__ */
|
|
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
|
-
|
|
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-
|
|
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":[]}
|