2024-12-19 13:04:48 -05:00
|
|
|
import React, { useMemo } from 'react';
|
2025-09-18 14:44:55 -04:00
|
|
|
import { useRecoilValue } from 'recoil';
|
📦 feat: Move Shared Components to `@librechat/client` (#8685)
* feat: init @librechat/client
* feat: Add common types and interfaces for accessibility, agents, artifacts, assistants, and tools
* feat: Add jotai as a peer dependency
* fix build client package
* feat: cleanup unused types from common/index.ts
- Remove 104 unused type exports from packages/client/src/common/index.ts
- Keep only 7 actually used exports (93% reduction)
- Add cleanup script with enhanced import pattern detection
- Support both named imports and namespace imports (* as t)
- Create automatic backups and comprehensive documentation
- Maintain type safety with build verification
- No breaking changes to existing code
Kept exports:
- TShowToast, Option, OptionWithIcon, DropdownValueSetter
- MentionOption, NotificationSeverity, MenuItemProps
Scripts: cleanup-common-types-safe.js, README-CLEANUP.md
* fix: cleanup
* fix: package; refactor: tsconfig
* feat: add back `recoil`
* fix: move dependencies to peerDependencies in client package
* feat: add @librechat/client as a dependency in package.json and package-lock.json
* feat: update client package configuration and dependencies
- Added new dependencies for Rollup plugins and updated existing ones in package.json and package-lock.json.
- Introduced a new Rollup configuration file for building the client package.
- Refactored build scripts to include a dedicated build command for the client.
- Updated TypeScript configuration for improved module resolution and type declaration output.
- Integrated a Toast component from the client package into the main App component.
* feat: enhance Rollup configuration for client package
- Updated terser plugin settings to preserve directives like 'use client'.
- Added custom warning handler to ignore "use client" directive warnings during the build process.
* chore: rename package/client build script command
* feat: update client package dependencies and Rollup configuration
- Added rollup-plugin-postcss to package.json and updated package-lock.json.
- Enhanced Rollup configuration to include postcss plugin for CSS handling.
- Updated index.ts to export all components from the components directory for better modularity.
* feat: add client package directory to update configuration
- Included the 'client' package directory in the update.js configuration to ensure it is recognized during updates.
* feat: export Toast component in client package
- Added export for the Toast component in index.ts to enhance modularity and accessibility of components.
* feat: /client transition to @librechat/client
* chore: fixed formatting issues
* fix: update peer dependencies in @librechat/client to prevent bundling them
* fix: correct useSprings implementation in SplitText component
* fix: circular dependencies in DataTable
* fix: add remaining peer dependencies and match actual versions previously used in `client/package.json`
* fix: correct frontend:ci script to include client package build
* chore: enhance unused package detection for @librechat/client and improve dependency extraction
* fix: add missing peer dependency for @radix-ui/react-collapsible
* chore: include "packages/client" in unused i18next keys detection
* test: update AgentFooter tests to use document.querySelector for spinner checks
test: mock window.matchMedia in setupTests.js for consistent test environment
* feat: add react-hook-form dependency and update FormInput component to use its types
* chore: linting
* refactor: remove unused defaultSelectedValues prop from MCPSelect and MultiSelect components
* chore: linting
* feat: update GitHub Actions workflow to publish @librechat/client
* chore: update GitHub Actions workflow to install and build data-provider and client dependencies
* chore: add missing @testing-library/react dependency to client package
* chore: update tsconfig.json to exclude additional test files
* chore: fix build issues, resolve latest LC changes
* chore: move MCP components outside of `~/components/ui`
* feat: implement dynamic theme system with environment variable support and Tailwind CSS integration
* chore: remove unnecessary logging of sttExternal and ttsExternal in Speech component
* chore: squashed cleanup commits
chore: move @tanstack/react-virtual to dependencies and remove recoil from package.json
chore: move dependencies to peerDependencies in package.json
feat: update package.json and rollup.config.js to include jotai and enhance bundling configuration
feat: update package.json and rollup.config.js to include jotai and enhance bundling configuration
refactor: reorganize exports in index.ts for improved clarity
refactor: remove unused types and interfaces from common files
refactor: update peer dependencies and improve component typings
- Removed duplicate peer dependencies from package.json and organized them.
- Updated rollup.config.js to disable TypeScript checking during the build process.
- Modified AnimatedTabs component to use React.ReactNode for label and content types, and added TypeScript workarounds for compatibility.
- Enhanced Label and Separator components to accept an optional className prop and improved prop spreading.
- Updated Slider component to include an optional className prop and refined prop handling for better type safety.
refactor: clean up client workflow and update package dependencies
refactor: update package dependencies and improve PostCSS and Rollup configurations
chore: bump version to 0.1.2 in package.json
chore: bump client version to 0.1.2 in package-lock.json
chore: bump client version to 0.1.3 and update dependencies
chore: bump client version to 0.1.4 and update @react-spring dependencies
chore: update package version to 0.1.5 and adjust peer dependencies
- Bump version in package.json from 0.1.4 to 0.1.5.
- Update peer dependency for @tanstack/react-query to allow version 5.0.0.
- Add @tanstack/react-table and @tanstack/react-virtual as dependencies.
- Update various dependencies to their latest compatible versions.
- Simplify postcss.config.js by removing unnecessary options.
- Clean up rollup.config.js by removing ignored PostCSS warnings.
- Update CheckboxButton component to cast icon as React JSX element.
- Adjust Combobox component's class names for better styling.
- Change DropdownPopup component to use React's namespace import.
- Modify InputOTP component to use 'any' type for OTPInputContext.
- Ensure displayLabel and value in ModelParameters are converted to strings.
- Update MultiSearch component's placeholder to ensure it's a string.
- Cast selectIcon in MultiSelect as React JSX element for consistency.
- Update OGDialogTemplate to cast selectText as React JSX element.
- Initialize animationRef in PixelCard with undefined for clarity.
- Add TypeScript ignore comments in Select and SelectDropDown components for Radix UI type conflicts.
- Ensure title in SelectDropDown is a string and adjust rendering of options.
- Update useLocalize hook to cast options as any for compatibility.
refactor: code structure; chore: translations cleanup
chore: remove unused imports and clean up code in NewChat component
refactor: enhance Menu component to support custom render functions for menu items
style: update itemClassName in ToolsDropdown for improved UI consistency
fix: merge conflicts
chore: update @radix-ui/react-accordion to version 1.2.11
* refactor: remove unnecessary TypeScript type assertions in AnimatedTabs, Label, Separator, and Slider components
* feat: enhance theme system with localStorage persistence and new theme atoms
* chore: bump version of @librechat/client to 0.1.7
* chore: fix ci/cd warnings/errors related to linting and unused localization keys
* chore: update dependencies for class-variance-authority, clsx, and match-sorter
* chore: bump @librechat/client to v0.1.8
* feat: add utility colors for theme customization and remove unused tailwindConfig
* v0.1.9
---------
Co-authored-by: Marco Beretta <81851188+berry-13@users.noreply.github.com>
2025-07-27 12:19:01 -04:00
|
|
|
import { OGDialog, OGDialogTemplate } from '@librechat/client';
|
2025-10-06 17:30:16 -04:00
|
|
|
import {
|
|
|
|
|
EToolResources,
|
|
|
|
|
defaultAgentCapabilities,
|
|
|
|
|
isDocumentSupportedProvider,
|
|
|
|
|
} from 'librechat-data-provider';
|
|
|
|
|
import {
|
|
|
|
|
ImageUpIcon,
|
|
|
|
|
FileSearch,
|
|
|
|
|
FileType2Icon,
|
|
|
|
|
FileImageIcon,
|
|
|
|
|
TerminalSquareIcon,
|
|
|
|
|
} from 'lucide-react';
|
2025-09-09 20:48:29 -04:00
|
|
|
import {
|
|
|
|
|
useAgentToolPermissions,
|
|
|
|
|
useAgentCapabilities,
|
|
|
|
|
useGetAgentsConfig,
|
|
|
|
|
useLocalize,
|
|
|
|
|
} from '~/hooks';
|
2025-09-18 14:44:55 -04:00
|
|
|
import { ephemeralAgentByConvoId } from '~/store';
|
|
|
|
|
import { useDragDropContext } from '~/Providers';
|
2024-12-19 13:04:48 -05:00
|
|
|
|
|
|
|
|
interface DragDropModalProps {
|
🤖 feat: Streamline Endpoints to Agent Framework (#8013)
* refactor(buildEndpointOption): Improve error logging in middleware, consolidate `isAgents` builder logic, remove adding `modelsConfig` to `endpointOption`
* refactor: parameter extraction and organization in agent services, minimize redundancy of shared fields across objects, make clear distinction of parameters processed uniquely by LibreChat vs LLM Provider Configs
* refactor(createPayload): streamline all endpoints to agent route
* fix: add `modelLabel` to response sender options for agent initialization
* chore: correct log message context in EditController abort controller cleanup
* chore: remove unused abortRequest hook
* chore: remove unused addToCache module and its dependencies
* refactor: remove AskController and related routes, update endpoint URLs (now all streamlined to agents route)
* chore: remove unused bedrock route and its related imports
* refactor: simplify response sender logic for Google endpoint
* chore: add `modelDisplayLabel` handling for agents endpoint
* feat: add file search capability to ephemeral agents, update code interpreter selection based of file upload, consolidate main upload menu for all endpoints
* feat: implement useToolToggle hook for managing tool toggle state, refactor CodeInterpreter and WebSearch components to utilize new hook
* feat: add ToolsDropdown component to BadgeRow for enhanced tool options
* feat: introduce BadgeRowContext and BadgeRowProvider for managing conversation state, refactor related components to utilize context
* feat: implement useMCPSelect hook for managing MCP selection state, refactor MCPSelect component to utilize new hook
* feat: enhance BadgeRowContext with MCPSelect and tool toggle functionality, refactor related components to utilize updated context and hooks
* refactor: streamline useToolToggle hook by integrating setEphemeralAgent directly into toggle logic and removing redundant setValue function
* refactor: consolidate codeApiKeyForm and searchApiKeyForm from CodeInterpreter and WebSearch to utilize new context properties
* refactor: update CheckboxButton to support controlled state and enhance ToolsDropdown with permission-based toggles for web search and code interpreter
* refactor: conditionally render CheckboxButton in CodeInterpreter and WebSearch components for improved UI responsiveness
* chore: add jotai dependency to package.json and package-lock.json
* chore: update brace-expansion package to version 2.0.2 in package-lock.json due to CVE-2025-5889
* Revert "chore: add jotai dependency to package.json and package-lock.json"
This reverts commit 69b699739671e740820f570ddb83d1caa0dbd6e4.
* refactor: add pinning functionality to CodeInterpreter and WebSearch components, and enhance ToolsDropdown with pin toggle for web search and code interpreter
* chore: move MCPIcon to correct location, remove duplicate
* fix: update MCP import to use type-only import from librechat-data-provider
* feat: implement MCPSubMenu component and integrate pinning functionality into ToolsDropdown
* fix: cycling to submenu by using parent menu context
* feat: add FileSearch component and integrate it into BadgeRow and ToolsDropdown
* chore: import order
* chore: remove agent specific logic that would block functionality for streamlined endpoints
* chore: linting for `createContextHandlers`
* chore: ensure ToolsDropdown doesn't show up for agents
* chore: ensure tool resource is selected when dragged to UI
* chore: update file search behavior to simulate legacy functionality
* feat: ToolDialogs with multiple trigger references, add settings to tool dropdown
* refactor: simplify web search and code interpreter settings checks
* chore: simplify local storage key for pinned state in useToolToggle
* refactor: reinstate agent check in AttachFileChat component, as individual providers will ahve different file configurations
* ci: increase timeout for MongoDB connection in Agent tests
2025-06-23 09:59:05 -04:00
|
|
|
onOptionSelect: (option: EToolResources | undefined) => void;
|
2024-12-19 13:04:48 -05:00
|
|
|
files: File[];
|
|
|
|
|
isVisible: boolean;
|
|
|
|
|
setShowModal: (showModal: boolean) => void;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface FileOption {
|
|
|
|
|
label: string;
|
|
|
|
|
value?: EToolResources;
|
|
|
|
|
icon: React.JSX.Element;
|
|
|
|
|
condition?: boolean;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const DragDropModal = ({ onOptionSelect, setShowModal, files, isVisible }: DragDropModalProps) => {
|
|
|
|
|
const localize = useLocalize();
|
2025-07-10 08:38:55 -04:00
|
|
|
const { agentsConfig } = useGetAgentsConfig();
|
|
|
|
|
/** TODO: Ephemeral Agent Capabilities
|
|
|
|
|
* Allow defining agent capabilities on a per-endpoint basis
|
|
|
|
|
* Use definition for agents endpoint for ephemeral agents
|
|
|
|
|
* */
|
|
|
|
|
const capabilities = useAgentCapabilities(agentsConfig?.capabilities ?? defaultAgentCapabilities);
|
2025-10-06 17:30:16 -04:00
|
|
|
const { conversationId, agentId, endpoint, endpointType } = useDragDropContext();
|
2025-09-18 14:44:55 -04:00
|
|
|
const ephemeralAgent = useRecoilValue(ephemeralAgentByConvoId(conversationId ?? ''));
|
2025-10-06 17:30:16 -04:00
|
|
|
const { fileSearchAllowedByAgent, codeAllowedByAgent, provider } = useAgentToolPermissions(
|
2025-09-18 14:44:55 -04:00
|
|
|
agentId,
|
|
|
|
|
ephemeralAgent,
|
2025-09-09 20:48:29 -04:00
|
|
|
);
|
|
|
|
|
|
2024-12-19 13:04:48 -05:00
|
|
|
const options = useMemo(() => {
|
2025-10-06 17:30:16 -04:00
|
|
|
const _options: FileOption[] = [];
|
|
|
|
|
const currentProvider = provider || endpoint;
|
|
|
|
|
|
|
|
|
|
// Check if provider supports document upload
|
2025-10-10 04:43:56 -07:00
|
|
|
if (isDocumentSupportedProvider(currentProvider || endpointType)) {
|
2025-10-06 17:30:16 -04:00
|
|
|
_options.push({
|
|
|
|
|
label: localize('com_ui_upload_provider'),
|
|
|
|
|
value: undefined,
|
|
|
|
|
icon: <FileImageIcon className="icon-md" />,
|
|
|
|
|
condition: true, // Allow for both images and documents
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
// Only show image upload option if all files are images and provider doesn't support documents
|
|
|
|
|
_options.push({
|
2024-12-19 13:04:48 -05:00
|
|
|
label: localize('com_ui_upload_image_input'),
|
|
|
|
|
value: undefined,
|
|
|
|
|
icon: <ImageUpIcon className="icon-md" />,
|
🧭 refactor: Modernize Nav/Header (#7094)
* refactor: streamline model preset handling in conversation setup
* refactor: integrate navigation and location hooks in chat functions and event handlers, prevent cache from fetching on final event handling
* fix: prevent adding code interpreter non-image output to file list on message attachment event, fix all unhandled edge cases when this is done (treating the file download as an image attachment, undefined fields, message tokenCount issues, use of `startsWith` on undefined "text") although it is now prevent altogether
* chore: remove unused jailbreak prop from MinimalIcon component in EndpointIcon
* feat: add new SVG icons (MobileSidebar, Sidebar, XAIcon), fix: xAI styling in dark vs. light modes, adjust styling of Landing icons
* fix: open conversation in new tab on navigation with ctrl/meta key
* refactor: update Nav & Header to use close/open sidebar buttons, as well as redesign "New Chat"/"Bookmarks" buttons to the top of the Nav, matching the latest design of ChatGPT for simplicity and to free up space
* chore: remove unused isToggleHovering state and simplify opacity logic in Nav component
* style: match mobile nav to mobile header
2025-04-27 14:03:25 -04:00
|
|
|
condition: files.every((file) => file.type?.startsWith('image/')),
|
2025-10-06 17:30:16 -04:00
|
|
|
});
|
|
|
|
|
}
|
2025-09-09 20:48:29 -04:00
|
|
|
if (capabilities.fileSearchEnabled && fileSearchAllowedByAgent) {
|
2025-07-10 08:38:55 -04:00
|
|
|
_options.push({
|
|
|
|
|
label: localize('com_ui_upload_file_search'),
|
|
|
|
|
value: EToolResources.file_search,
|
|
|
|
|
icon: <FileSearch className="icon-md" />,
|
|
|
|
|
});
|
|
|
|
|
}
|
2025-09-09 20:48:29 -04:00
|
|
|
if (capabilities.codeEnabled && codeAllowedByAgent) {
|
2025-07-10 08:38:55 -04:00
|
|
|
_options.push({
|
|
|
|
|
label: localize('com_ui_upload_code_files'),
|
|
|
|
|
value: EToolResources.execute_code,
|
|
|
|
|
icon: <TerminalSquareIcon className="icon-md" />,
|
|
|
|
|
});
|
|
|
|
|
}
|
2025-09-18 20:06:59 -04:00
|
|
|
if (capabilities.contextEnabled) {
|
2025-07-10 08:38:55 -04:00
|
|
|
_options.push({
|
|
|
|
|
label: localize('com_ui_upload_ocr_text'),
|
2025-09-18 20:06:59 -04:00
|
|
|
value: EToolResources.context,
|
2025-07-10 08:38:55 -04:00
|
|
|
icon: <FileType2Icon className="icon-md" />,
|
|
|
|
|
});
|
2024-12-19 13:04:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return _options;
|
2025-10-06 17:30:16 -04:00
|
|
|
}, [
|
|
|
|
|
files,
|
|
|
|
|
localize,
|
|
|
|
|
provider,
|
|
|
|
|
endpoint,
|
|
|
|
|
endpointType,
|
|
|
|
|
capabilities,
|
|
|
|
|
codeAllowedByAgent,
|
|
|
|
|
fileSearchAllowedByAgent,
|
|
|
|
|
]);
|
2024-12-19 13:04:48 -05:00
|
|
|
|
|
|
|
|
if (!isVisible) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<OGDialog open={isVisible} onOpenChange={setShowModal}>
|
|
|
|
|
<OGDialogTemplate
|
|
|
|
|
title={localize('com_ui_upload_type')}
|
|
|
|
|
className="w-11/12 sm:w-[440px] md:w-[400px] lg:w-[360px]"
|
|
|
|
|
main={
|
|
|
|
|
<div className="flex flex-col gap-2">
|
|
|
|
|
{options.map(
|
|
|
|
|
(option, index) =>
|
|
|
|
|
option.condition !== false && (
|
|
|
|
|
<button
|
|
|
|
|
key={index}
|
|
|
|
|
onClick={() => onOptionSelect(option.value)}
|
|
|
|
|
className="flex items-center gap-2 rounded-lg p-2 hover:bg-surface-active-alt"
|
|
|
|
|
>
|
|
|
|
|
{option.icon}
|
|
|
|
|
<span>{option.label}</span>
|
|
|
|
|
</button>
|
|
|
|
|
),
|
|
|
|
|
)}
|
|
|
|
|
</div>
|
|
|
|
|
}
|
|
|
|
|
/>
|
|
|
|
|
</OGDialog>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default DragDropModal;
|