* wip: Add Instructions component for agent configuration * ✨ feat: Implement DropdownPopup for variable insertion in instructions * refactor: Enhance variable handling by exporting specialVariables and updating Markdown components * feat: Add special variable support for current date and user in Instructions component * refactor: Update handleAddVariable to include localized label * feat: replace special variables in instructions presets * chore: update parameter type for user in getListAgents function * refactor: integrate dayjs for date handling and move replaceSpecialVars function to data-provider * feat: enhance replaceSpecialVars to include day number in current date format * feat: integrate replaceSpecialVars for processing agent instructions * feat: add support for current date & time in replaceSpecialVars function * feat: add iso_datetime support in replaceSpecialVars function * fix: enforce text parameter to be a required field in replaceSpecialVars function * feat: add ISO datetime support in translation file * fix: disable eslint warning for autoFocus in TextareaAutosize component * feat: add VariablesDropdown component and integrate it into CreatePromptForm and PromptEditor; update translation for special variables * fix: CategorySelector and related localizations * fix: add z-index class to LanguageSTTDropdown for proper stacking context * fix: add max-height and overflow styles to OGDialogContent in VariableDialog and PreviewPrompt components * fix: update variable detection logic to exclude special variables and improve regex matching * fix: improve accessibility text for actions menu in ChatGroupItem component * fix: adjust max-width and height styles for dialog components and improve markdown rendering for light vs. dark, height/widths, etc. * fix: remove commented-out code for better readability in PromptVariableGfm component * fix: handle undefined input parameter in setParams function call * fix: update variable label types to use TSpecialVarLabel for consistency * fix: remove outdated information from special variables description in translation file * fix: enhance unused i18next keys detection for special variable keys * fix: update color classes for consistency/a11y in category and prompt variable components * fix: update PromptVariableGfm component and special variable styles for consistency * fix: improve variable highlighting logic in VariableForm component * fix: update background color classes for consistency in VariableForm component * fix: add missing ref parameter to Dialog component in OriginalDialog * refactor: move navigate call for new conversation to after setConversation update * refactor: move message query hook to client workspace; fix: handle edge case for navigation from finalHandler creating race condition for response message DB save * chore: bump librechat-data-provider to 0.7.793 * ci: add unit tests for replaceSpecialVars function * fix: implement getToolkitKey function for image_gen_oai toolkit filtering/including * ci: enhance dayjs mock for consistent date/time values in tests * fix: MCP stdio server fail to start when passing env property * fix: use optional chaining for clientRef dereferencing in AskController and EditController feat: add context to saveMessage call in streamResponse utility * fix: only save error messages if the userMessageId was initialized * refactor: add isNotAppendable check to disable inputs in ChatForm and useTextarea * feat: enhance error handling in useEventHandlers and update conversation state in useNewConvo * refactor: prepend underscore to conversationId in newConversation template * feat: log aborted conversations with minimal messages and use consistent conversationId generation --------- Co-authored-by: Olivier Schiavo <olivier.schiavo@wengo.com> Co-authored-by: aka012 <aka012@neowiz.com> Co-authored-by: jiasheng <jiashengguo@outlook.com>
76 lines
2.5 KiB
TypeScript
76 lines
2.5 KiB
TypeScript
import { useState, useId } from 'react';
|
|
import { PlusCircle } from 'lucide-react';
|
|
import * as Menu from '@ariakit/react/menu';
|
|
import { useFormContext } from 'react-hook-form';
|
|
import { specialVariables } from 'librechat-data-provider';
|
|
import type { TSpecialVarLabel } from 'librechat-data-provider';
|
|
import { DropdownPopup } from '~/components';
|
|
import { useLocalize } from '~/hooks';
|
|
|
|
interface VariableOption {
|
|
label: TSpecialVarLabel;
|
|
value: string;
|
|
}
|
|
|
|
const variableOptions: VariableOption[] = Object.keys(specialVariables).map((key) => ({
|
|
label: `com_ui_special_var_${key}` as TSpecialVarLabel,
|
|
value: `{{${key}}}`,
|
|
}));
|
|
|
|
interface VariablesDropdownProps {
|
|
fieldName?: string;
|
|
className?: string;
|
|
}
|
|
|
|
export default function VariablesDropdown({
|
|
fieldName = 'prompt',
|
|
className = '',
|
|
}: VariablesDropdownProps) {
|
|
const menuId = useId();
|
|
const localize = useLocalize();
|
|
const methods = useFormContext();
|
|
const { setValue, getValues } = methods;
|
|
|
|
const [isMenuOpen, setIsMenuOpen] = useState(false);
|
|
|
|
const handleAddVariable = (label: TSpecialVarLabel, value: string) => {
|
|
const currentText = getValues(fieldName) || '';
|
|
const spacer = currentText.length > 0 ? '\n\n' : '';
|
|
const prefix = localize(label);
|
|
setValue(fieldName, currentText + spacer + prefix + ': ' + value);
|
|
setIsMenuOpen(false);
|
|
};
|
|
|
|
return (
|
|
<div
|
|
className={className}
|
|
title={`${localize('com_ui_add')} ${localize('com_ui_special_variables')}`}
|
|
>
|
|
<DropdownPopup
|
|
portal={true}
|
|
mountByState={true}
|
|
unmountOnHide={true}
|
|
preserveTabOrder={true}
|
|
isOpen={isMenuOpen}
|
|
setIsOpen={setIsMenuOpen}
|
|
trigger={
|
|
<Menu.MenuButton
|
|
id="variables-menu-button"
|
|
aria-label={`${localize('com_ui_add')} ${localize('com_ui_special_variables')}`}
|
|
className="flex h-8 items-center gap-1 rounded-md border border-border-medium bg-surface-secondary px-2 py-0 text-sm text-text-primary transition-colors duration-200 hover:bg-surface-tertiary"
|
|
>
|
|
<PlusCircle className="mr-1 h-3 w-3 text-text-secondary" aria-hidden={true} />
|
|
{localize('com_ui_special_variables')}
|
|
</Menu.MenuButton>
|
|
}
|
|
items={variableOptions.map((option) => ({
|
|
label: localize(option.label) || option.label,
|
|
onClick: () => handleAddVariable(option.label, option.value),
|
|
}))}
|
|
menuId={menuId}
|
|
className="z-30"
|
|
/>
|
|
</div>
|
|
);
|
|
}
|