diff --git a/src/main/services/agents/services/claudecode/index.ts b/src/main/services/agents/services/claudecode/index.ts index 32509acb61..99000d9b33 100644 --- a/src/main/services/agents/services/claudecode/index.ts +++ b/src/main/services/agents/services/claudecode/index.ts @@ -86,7 +86,8 @@ class ClaudeCodeService implements AgentServiceInterface { }, appendSystemPrompt: session.instructions, permissionMode: session.configuration?.permission_mode, - maxTurns: session.configuration?.max_turns + maxTurns: session.configuration?.max_turns, + allowedTools: session.allowed_tools } if (session.accessible_paths.length > 1) { diff --git a/src/preload/index.ts b/src/preload/index.ts index af1cac21a1..d302b08441 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -166,7 +166,8 @@ const api = { openPath: (path: string) => ipcRenderer.invoke(IpcChannel.File_OpenPath, path), save: (path: string, content: string | NodeJS.ArrayBufferView, options?: any) => ipcRenderer.invoke(IpcChannel.File_Save, path, content, options), - selectFolder: (options?: OpenDialogOptions) => ipcRenderer.invoke(IpcChannel.File_SelectFolder, options), + selectFolder: (options?: OpenDialogOptions): Promise => + ipcRenderer.invoke(IpcChannel.File_SelectFolder, options), saveImage: (name: string, data: string) => ipcRenderer.invoke(IpcChannel.File_SaveImage, name, data), binaryImage: (fileId: string) => ipcRenderer.invoke(IpcChannel.File_BinaryImage, fileId), base64Image: (fileId: string): Promise<{ mime: string; base64: string; data: string }> => diff --git a/src/renderer/src/assets/styles/index.css b/src/renderer/src/assets/styles/index.css index 0c6bee69d2..960d28061d 100644 --- a/src/renderer/src/assets/styles/index.css +++ b/src/renderer/src/assets/styles/index.css @@ -11,12 +11,14 @@ @import '../fonts/ubuntu/ubuntu.css'; @import '../fonts/country-flag-fonts/flag.css'; -*, -*::before, -*::after { - box-sizing: border-box; - /* margin: 0; */ - font-weight: normal; +@layer base { + *, + *::before, + *::after { + box-sizing: border-box; + /* margin: 0; */ + font-weight: normal; + } } *:focus { diff --git a/src/renderer/src/components/ApiModelLabel.tsx b/src/renderer/src/components/ApiModelLabel.tsx new file mode 100644 index 0000000000..e9c78deb48 --- /dev/null +++ b/src/renderer/src/components/ApiModelLabel.tsx @@ -0,0 +1,19 @@ +import { Avatar, cn } from '@heroui/react' +import { getModelLogo } from '@renderer/config/models' +import { ApiModel } from '@renderer/types' +import React from 'react' + +export interface ModelLabelProps extends Omit, 'children'> { + model?: ApiModel +} + +export const ApiModelLabel: React.FC = ({ model, className, ...props }) => { + return ( +
+ + + {model?.name} | {model?.provider_name} + +
+ ) +} diff --git a/src/renderer/src/components/Avatar/ModelAvatar.tsx b/src/renderer/src/components/Avatar/ModelAvatar.tsx index d1a6f98be9..22fafcd98f 100644 --- a/src/renderer/src/components/Avatar/ModelAvatar.tsx +++ b/src/renderer/src/components/Avatar/ModelAvatar.tsx @@ -5,7 +5,7 @@ import { first } from 'lodash' import { FC } from 'react' interface Props { - model: Model + model?: Model size: number props?: AvatarProps className?: string diff --git a/src/renderer/src/components/Popups/agent/AgentModal.tsx b/src/renderer/src/components/Popups/agent/AgentModal.tsx index c19640c12d..76ddfa2ee9 100644 --- a/src/renderer/src/components/Popups/agent/AgentModal.tsx +++ b/src/renderer/src/components/Popups/agent/AgentModal.tsx @@ -18,7 +18,7 @@ import { loggerService } from '@logger' import ClaudeIcon from '@renderer/assets/images/models/claude.png' import { getModelLogo } from '@renderer/config/models' import { useAgents } from '@renderer/hooks/agents/useAgents' -import { useModels } from '@renderer/hooks/agents/useModels' +import { useApiModels } from '@renderer/hooks/agents/useModels' import { useUpdateAgent } from '@renderer/hooks/agents/useUpdateAgent' import { AddAgentForm, AgentEntity, AgentType, BaseAgentForm, isAgentType, UpdateAgentForm } from '@renderer/types' import { ChangeEvent, FormEvent, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react' @@ -82,7 +82,7 @@ export const AgentModal: React.FC = ({ agent, trigger, isOpen: _isOpen, o const { addAgent } = useAgents() const updateAgent = useUpdateAgent() // hard-coded. We only support anthropic for now. - const { models } = useModels({ providerType: 'anthropic' }) + const { models } = useApiModels({ providerType: 'anthropic' }) const isEditing = (agent?: AgentEntity) => agent !== undefined const [form, setForm] = useState(() => buildAgentForm(agent)) @@ -317,7 +317,7 @@ export const AgentModal: React.FC = ({ agent, trigger, isOpen: _isOpen, o selectedKeys={[form.type]} onChange={onAgentTypeChange} items={agentOptions} - label={t('agent.add.type.label')} + label={t('agent.type.label')} placeholder={t('agent.add.type.placeholder')} renderValue={renderOption}> {(option) => ( @@ -327,7 +327,6 @@ export const AgentModal: React.FC = ({ agent, trigger, isOpen: _isOpen, o )} - {/* FIXME: Model type definition is string. It cannot be related to provider. Just mock a model now. */} setName(e.target.value)} onBlur={() => { if (name !== agent.name) { - onUpdate() + updateName(name) } }} - style={{ flex: 1 }} + className="max-w-80 flex-1" /> - - - - {t('common.prompt')} - - - - - - - {showPreview ? ( - { - const currentScrollTop = editorRef.current?.getScrollTop?.() || 0 - setShowPreview(false) - requestAnimationFrame(() => editorRef.current?.setScrollTop?.(currentScrollTop)) - }}> - {processedPrompt || instructions} - - ) : ( - - )} - - - - Tokens: {tokenCount} - - - + + + {t('common.model')} +