@truefoundry/trueforge-ui 0.2.3 → 0.3.0-rc.0

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 (58) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +41 -17
  3. package/dist/{ConnectorSettings-ODC3LVHN.js → ConnectorSettings-FXQ5B7TN.js} +5 -5
  4. package/dist/{DockLayout-2RWDSUKE.js → DockLayout-LBNQJZNF.js} +9 -9
  5. package/dist/{DrawerLayout-CZLJYMIN.js → DrawerLayout-Q6UK4VMI.js} +9 -9
  6. package/dist/{ModelSettings-CKQ5CVAC.js → ModelSettings-4L4LOQJA.js} +5 -5
  7. package/dist/OpenUiFenceBlock-6UIIAVBX.js +9 -0
  8. package/dist/{SandboxSettings-HSCPYUOC.js → SandboxSettings-Z4ZG6ZX4.js} +5 -5
  9. package/dist/{SettingsBuilder-MYWRFXRI.js → SettingsBuilder-WF7ZWKQW.js} +7 -7
  10. package/dist/{SidebarLayout-WVY54TGZ.js → SidebarLayout-3WZ3CVON.js} +31 -14
  11. package/dist/SidebarLayout-3WZ3CVON.js.map +1 -0
  12. package/dist/{SkillSettings-ECH6SHZ7.js → SkillSettings-3EPPC3IT.js} +5 -5
  13. package/dist/{TrueForgeUIWithRouter-RKZ2E7PV.js → TrueForgeUIWithRouter-NZ4FGPE4.js} +7 -7
  14. package/dist/{WidgetLayout-NWWB2SXI.js → WidgetLayout-3QZ357FL.js} +10 -10
  15. package/dist/{WidgetLayout-NWWB2SXI.js.map → WidgetLayout-3QZ357FL.js.map} +1 -1
  16. package/dist/chunk-36KOSC2J.js +567 -0
  17. package/dist/chunk-36KOSC2J.js.map +1 -0
  18. package/dist/{chunk-HVSUPYX2.js → chunk-3S6KHO7H.js} +311 -238
  19. package/dist/chunk-3S6KHO7H.js.map +1 -0
  20. package/dist/{chunk-TCAVLWYL.js → chunk-7L63OK3O.js} +7 -7
  21. package/dist/{chunk-JRRCAKEP.js → chunk-B52K63AW.js} +2 -2
  22. package/dist/{chunk-FXCYLEFB.js → chunk-BSIPI3KV.js} +18 -2
  23. package/dist/chunk-BSIPI3KV.js.map +1 -0
  24. package/dist/{chunk-IFLE7OMM.js → chunk-FJ5RSSMA.js} +4 -4
  25. package/dist/{chunk-IFLE7OMM.js.map → chunk-FJ5RSSMA.js.map} +1 -1
  26. package/dist/{chunk-XRTTKGKN.js → chunk-OSV3HI5M.js} +746 -680
  27. package/dist/chunk-OSV3HI5M.js.map +1 -0
  28. package/dist/{chunk-KFUBFJR5.js → chunk-WREC7D54.js} +13 -11
  29. package/dist/chunk-WREC7D54.js.map +1 -0
  30. package/dist/{chunk-OZTNBS6V.js → chunk-ZXOADNF3.js} +4 -4
  31. package/dist/index.d.ts +179 -121
  32. package/dist/index.js +17 -9
  33. package/dist/index.js.map +1 -1
  34. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +1 -5
  35. package/dist/plugins/trueforge-agent-server-adapter/index.js +3 -0
  36. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  37. package/dist/styles.css +1 -1
  38. package/package.json +6 -6
  39. package/dist/OpenUiFenceBlock-3EFPY4JW.js +0 -9
  40. package/dist/SidebarLayout-WVY54TGZ.js.map +0 -1
  41. package/dist/chunk-72LC2M3R.js +0 -567
  42. package/dist/chunk-72LC2M3R.js.map +0 -1
  43. package/dist/chunk-FXCYLEFB.js.map +0 -1
  44. package/dist/chunk-HVSUPYX2.js.map +0 -1
  45. package/dist/chunk-KFUBFJR5.js.map +0 -1
  46. package/dist/chunk-XRTTKGKN.js.map +0 -1
  47. /package/dist/{ConnectorSettings-ODC3LVHN.js.map → ConnectorSettings-FXQ5B7TN.js.map} +0 -0
  48. /package/dist/{DockLayout-2RWDSUKE.js.map → DockLayout-LBNQJZNF.js.map} +0 -0
  49. /package/dist/{DrawerLayout-CZLJYMIN.js.map → DrawerLayout-Q6UK4VMI.js.map} +0 -0
  50. /package/dist/{ModelSettings-CKQ5CVAC.js.map → ModelSettings-4L4LOQJA.js.map} +0 -0
  51. /package/dist/{OpenUiFenceBlock-3EFPY4JW.js.map → OpenUiFenceBlock-6UIIAVBX.js.map} +0 -0
  52. /package/dist/{SandboxSettings-HSCPYUOC.js.map → SandboxSettings-Z4ZG6ZX4.js.map} +0 -0
  53. /package/dist/{SettingsBuilder-MYWRFXRI.js.map → SettingsBuilder-WF7ZWKQW.js.map} +0 -0
  54. /package/dist/{SkillSettings-ECH6SHZ7.js.map → SkillSettings-3EPPC3IT.js.map} +0 -0
  55. /package/dist/{TrueForgeUIWithRouter-RKZ2E7PV.js.map → TrueForgeUIWithRouter-NZ4FGPE4.js.map} +0 -0
  56. /package/dist/{chunk-TCAVLWYL.js.map → chunk-7L63OK3O.js.map} +0 -0
  57. /package/dist/{chunk-JRRCAKEP.js.map → chunk-B52K63AW.js.map} +0 -0
  58. /package/dist/{chunk-OZTNBS6V.js.map → chunk-ZXOADNF3.js.map} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@truefoundry/trueforge-ui",
3
- "version": "0.2.3",
3
+ "version": "0.3.0-rc.0",
4
4
  "description": "TrueForge Agent Chat UI (atoms + containers) built on assistant-ui, with owned theming, presets, and swappable slots.",
5
5
  "author": "TrueFoundry",
6
6
  "license": "MIT",
@@ -75,12 +75,12 @@
75
75
  }
76
76
  },
77
77
  "dependencies": {
78
- "@assistant-ui/core": "^0.2.22",
79
- "@assistant-ui/react": "^0.14.24",
78
+ "@assistant-ui/core": "0.2.22",
79
+ "@assistant-ui/react": "0.14.27",
80
80
  "@openuidev/react-headless": "^0.9.4",
81
81
  "@openuidev/react-lang": "^0.2.9",
82
82
  "@openuidev/react-ui": "^0.13.2",
83
- "@truefoundry/assistant-ui-runtime": "0.1.20",
83
+ "@truefoundry/assistant-ui-runtime": "0.1.21",
84
84
  "clsx": "^2.1.1",
85
85
  "lucide-react": "^0.562.0",
86
86
  "monaco-editor": "^0.56.0",
@@ -90,9 +90,9 @@
90
90
  "react-syntax-highlighter": "^16.1.1",
91
91
  "remark-gfm": "^4.0.1",
92
92
  "tailwind-merge": "^3.6.0",
93
- "truefoundry-gateway-sdk": "^0.4.0",
93
+ "truefoundry-gateway-sdk": "^0.4.2",
94
94
  "zod": "^4.4.3",
95
- "@truefoundry/trueforge-sdk": "0.1.3"
95
+ "@truefoundry/trueforge-sdk": "0.1.4-rc.0"
96
96
  },
97
97
  "devDependencies": {
98
98
  "@eslint/js": "^9.39.0",
@@ -1,9 +0,0 @@
1
- "use client";
2
- import {
3
- OpenUiFenceBlock
4
- } from "./chunk-JRRCAKEP.js";
5
- import "./chunk-72LC2M3R.js";
6
- export {
7
- OpenUiFenceBlock
8
- };
9
- //# sourceMappingURL=OpenUiFenceBlock-3EFPY4JW.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/layouts/SidebarLayout.tsx"],"sourcesContent":["'use client';\n\nimport { lazy, Suspense, useEffect, useRef, useState } from 'react';\n\nimport { useAui } from '../assistant-ui.js';\nimport { auiButtonClass } from '../atoms/lib/buttonClasses.js';\nimport { cn } from '../atoms/lib/cn.js';\nimport { NamedAgentHeaderLabel } from '../atoms/NamedAgentHeaderLabel.js';\nimport { Spinner } from '../atoms/primitives/Spinner.js';\nimport { ShellActions } from '../atoms/ShellActions.js';\nimport { Thread } from '../containers/Thread.js';\nimport { ThreadListContainer } from '../containers/ThreadListContainer.js';\nimport { useChatHeaderContentVisible } from '../hooks/useChatChromeActionsVisible.js';\nimport { Icon } from '../icons/Icon.js';\nimport { useOptionalShellMode } from '../server/ShellModeContext.js';\nimport { useBrandName } from '../theme/brand.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nconst TruefoundrySettingsBuilder = lazy(() => import('../containers/SettingsBuilder/index.js'));\n\n// Survives ChatProvider remounts when openDraft / selectAgent bumps runtimeKey.\nlet desktopCollapsed = false;\n\nexport function SidebarLayout({ className }: { className?: string }) {\n const aui = useAui();\n const shell = useOptionalShellMode();\n const brandName = useBrandName();\n const BrandLogo = useSlot('BrandLogo');\n const AgentsLibraryButton = useSlot('AgentsLibraryButton');\n const ClearChatButton = useSlot('ClearChatButton');\n const SaveAgentButton = useSlot('SaveAgentButton');\n const SelectAgentEmptyState = useSlot('SelectAgentEmptyState');\n const [collapsed, setCollapsed] = useState(desktopCollapsed);\n const setDesktopCollapsed = (value: boolean | ((prev: boolean) => boolean)) => {\n setCollapsed(prev => {\n const next = typeof value === 'function' ? value(prev) : value;\n desktopCollapsed = next;\n return next;\n });\n };\n const [mobileNavOpen, setMobileNavOpen] = useState(false);\n const menuBtnRef = useRef<HTMLButtonElement>(null);\n const dialogRef = useRef<HTMLDivElement>(null);\n const mainRef = useRef<HTMLDivElement>(null);\n const wasOpen = useRef(false);\n const isIdle = shell?.mode.status === 'idle';\n const settingsOpen = shell?.settingsOpen === true;\n const hasChatHeaderContent = useChatHeaderContentVisible();\n\n useEffect(() => {\n if (!mobileNavOpen) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setMobileNavOpen(false);\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [mobileNavOpen]);\n\n useEffect(() => {\n const main = mainRef.current;\n if (mobileNavOpen) {\n wasOpen.current = true;\n if (main) main.inert = true;\n dialogRef.current?.focus();\n return;\n }\n if (wasOpen.current) {\n if (main) main.inert = false;\n menuBtnRef.current?.focus();\n wasOpen.current = false;\n }\n }, [mobileNavOpen]);\n\n const handleNewChat = () => {\n if (shell?.isComposerEnabled) {\n shell.openDraft();\n return;\n }\n shell?.setSettingsOpen(false);\n void Promise.resolve(aui.threads().switchToNewThread()).catch(() => undefined);\n };\n\n return (\n <div className={cn('relative flex h-full min-h-0 w-full min-w-0', className)}>\n {/* Desktop sidebar */}\n <aside\n className={cn(\n 'hidden min-h-0 shrink-0 flex-col border-r border-border bg-sidebar-bg transition-[width] duration-300 ease-in-out md:flex',\n collapsed ? 'w-16' : 'w-64',\n )}\n >\n <div\n className={cn('flex shrink-0 items-center px-3 py-3', collapsed ? 'flex-col gap-3' : 'justify-between gap-2')}\n >\n <div className={cn('flex min-w-0 items-center text-text-primary', collapsed ? 'justify-center' : 'gap-2')}>\n <BrandLogo className=\"size-5 shrink-0 object-contain\" />\n {!collapsed ? <span className=\"truncate text-lg font-semibold tracking-tight\">{brandName}</span> : null}\n </div>\n <button\n type=\"button\"\n aria-label={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n title={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n aria-expanded={!collapsed}\n className={auiButtonClass({ variant: 'ghost', size: 'icon' })}\n onClick={() => setDesktopCollapsed(value => !value)}\n >\n <Icon name={collapsed ? 'panel-left-open' : 'panel-left-close'} />\n </button>\n </div>\n\n {/* Keep both trees mounted; toggle with `hidden` so AgentsLibraryButton does not remount. */}\n <nav className=\"flex min-h-0 flex-1 flex-col items-center gap-2 px-3\" hidden={!collapsed} aria-label=\"Sidebar\">\n {shell?.isNewChatEnabled !== false ? (\n <button\n type=\"button\"\n aria-label=\"Start new chat\"\n title=\"New chat\"\n className={auiButtonClass({ variant: 'ghost', size: 'icon' })}\n onClick={handleNewChat}\n >\n <Icon name=\"square-pen\" />\n </button>\n ) : null}\n <AgentsLibraryButton compact />\n </nav>\n <div className=\"flex min-h-0 flex-1 flex-col overflow-hidden\" hidden={collapsed}>\n <ThreadListContainer />\n </div>\n\n <footer\n className={cn(\n 'flex shrink-0 border-t border-border px-3 py-2',\n collapsed ? 'flex-col items-center gap-2' : 'items-center gap-1',\n )}\n >\n <ShellActions className={collapsed ? 'flex-col' : undefined} />\n </footer>\n </aside>\n\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col bg-primary-bg\">\n {/* Mobile ShellActions stay mounted while Settings is open so host overrides (e.g. logout) do not remount.\n Desktop keeps shell chrome in the aside footer (always mounted). */}\n <header\n className={cn(\n 'flex shrink-0 items-center gap-1 border-b border-border bg-topbar-bg px-2 py-1.5',\n // Desktop: hide when settings/idle or the thread header has nothing to show\n // (empty untitled draft). Mobile still needs Sessions + ShellActions.\n (settingsOpen || isIdle || !hasChatHeaderContent) && 'md:hidden',\n )}\n >\n {!settingsOpen ? (\n <>\n <button\n ref={menuBtnRef}\n type=\"button\"\n aria-label=\"Sessions\"\n aria-expanded={mobileNavOpen}\n className={cn(auiButtonClass({ variant: 'ghost', size: 'icon' }), 'md:hidden')}\n onClick={() => setMobileNavOpen(true)}\n >\n <Icon name=\"bars\" />\n </button>\n <NamedAgentHeaderLabel />\n <span className=\"min-w-0 flex-1\" />\n <ClearChatButton />\n <SaveAgentButton />\n </>\n ) : (\n <span className=\"min-w-0 flex-1\" />\n )}\n <div key=\"mobile-shell-actions\" className=\"md:hidden\">\n <ShellActions />\n </div>\n </header>\n\n <div ref={mainRef} className=\"min-h-0 min-w-0 flex-1\">\n {settingsOpen ? (\n <Suspense\n fallback={\n <div\n className=\"flex h-full items-center justify-center\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n >\n <Spinner size={28} className=\"text-text-primary\" />\n <span className=\"sr-only\">Loading</span>\n </div>\n }\n >\n <TruefoundrySettingsBuilder />\n </Suspense>\n ) : isIdle ? (\n <SelectAgentEmptyState />\n ) : (\n <Thread />\n )}\n </div>\n </div>\n\n {/* Mobile sessions drawer */}\n {mobileNavOpen ? (\n <>\n <button\n type=\"button\"\n aria-label=\"Close sessions\"\n className=\"absolute inset-0 z-[9] cursor-pointer bg-[var(--overlay)] md:hidden\"\n onClick={() => setMobileNavOpen(false)}\n />\n <div\n ref={dialogRef}\n className=\"absolute inset-y-0 left-0 z-10 flex w-full max-w-80 flex-col border-r border-border bg-sidebar-bg shadow-lg outline-none md:hidden\"\n role=\"dialog\"\n aria-label=\"Sessions\"\n tabIndex={-1}\n >\n <div className=\"flex shrink-0 items-center gap-2 border-b border-border px-3 py-3 text-text-primary\">\n <BrandLogo className=\"size-5 shrink-0 object-contain\" />\n <span className=\"truncate text-lg font-semibold tracking-tight\">{brandName}</span>\n </div>\n <ThreadListContainer onThreadOpen={() => setMobileNavOpen(false)} />\n </div>\n </>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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","names":[]}