refactor: update imports to use 'type' for type-only imports across multiple files

- Changed imports to use 'type' for type-only imports in various files, improving clarity and potentially optimizing the build process.
- Adjusted imports in files related to agents, models, and types to ensure consistency in type usage.
This commit is contained in:
fullex 2025-10-09 12:45:17 +08:00
parent 767e22c58d
commit 2c102ed3b4
72 changed files with 191 additions and 164 deletions

View File

@ -9,9 +9,9 @@
*/
import Anthropic from '@anthropic-ai/sdk'
import { TextBlockParam } from '@anthropic-ai/sdk/resources'
import type { TextBlockParam } from '@anthropic-ai/sdk/resources'
import { loggerService } from '@logger'
import { Provider } from '@types'
import type { Provider } from '@types'
import type { ModelMessage } from 'ai'
const logger = loggerService.withContext('anthropic-sdk')

View File

@ -1,7 +1,7 @@
import { loggerService } from '@logger'
import { AgentModelValidationError, agentService, sessionService } from '@main/services/agents'
import { ListAgentsResponse, type ReplaceAgentRequest, type UpdateAgentRequest } from '@types'
import { Request, Response } from 'express'
import type { ListAgentsResponse, ReplaceAgentRequest, UpdateAgentRequest } from '@types'
import type { Request, Response } from 'express'
import type { ValidationRequest } from '../validators/zodValidator'

View File

@ -2,7 +2,7 @@ import { loggerService } from '@logger'
import { MESSAGE_STREAM_TIMEOUT_MS } from '@main/apiServer/config/timeouts'
import { createStreamAbortController, STREAM_TIMEOUT_REASON } from '@main/apiServer/utils/createStreamAbortController'
import { agentService, sessionMessageService, sessionService } from '@main/services/agents'
import { Request, Response } from 'express'
import type { Request, Response } from 'express'
const logger = loggerService.withContext('ApiServerMessagesHandlers')

View File

@ -1,7 +1,7 @@
import { loggerService } from '@logger'
import { AgentModelValidationError, sessionMessageService, sessionService } from '@main/services/agents'
import { ListAgentSessionsResponse, type ReplaceSessionRequest, UpdateSessionResponse } from '@types'
import { Request, Response } from 'express'
import type { ListAgentSessionsResponse, ReplaceSessionRequest, UpdateSessionResponse } from '@types'
import type { Request, Response } from 'express'
import type { ValidationRequest } from '../validators/zodValidator'

View File

@ -1,4 +1,4 @@
import { Request, Response } from 'express'
import type { Request, Response } from 'express'
import { agentService } from '../../../../services/agents'
import { loggerService } from '../../../../services/LoggerService'

View File

@ -1,5 +1,6 @@
import { NextFunction, Request, Response } from 'express'
import { ZodError, ZodType } from 'zod'
import type { NextFunction, Request, Response } from 'express'
import type { ZodType } from 'zod'
import { ZodError } from 'zod'
export interface ValidationRequest extends Request {
validatedBody?: any

View File

@ -1,7 +1,8 @@
import { MessageCreateParams } from '@anthropic-ai/sdk/resources'
import type { MessageCreateParams } from '@anthropic-ai/sdk/resources'
import { loggerService } from '@logger'
import { Provider } from '@types'
import express, { Request, Response } from 'express'
import type { Provider } from '@types'
import type { Request, Response } from 'express'
import express from 'express'
import { messagesService } from '../services/messages'
import { getProviderById, validateModelId } from '../utils'

View File

@ -1,9 +1,9 @@
import { loggerService } from '@logger'
import type { ApiModelsResponse } from '@types'
import { ApiModelsFilterSchema } from '@types'
import type { Request, Response } from 'express'
import express from 'express'
import { loggerService } from '@logger'
import { modelsService } from '../services/models'
const logger = loggerService.withContext('ApiServerModelsRoutes')

View File

@ -1,8 +1,8 @@
import { loggerService } from '@logger'
import type { Provider } from '@types'
import OpenAI from 'openai'
import type { ChatCompletionCreateParams, ChatCompletionCreateParamsStreaming } from 'openai/resources'
import { loggerService } from '@logger'
import { type ModelValidationError, validateModelId } from '../utils'
const logger = loggerService.withContext('ChatCompletionService')

View File

@ -1,10 +1,10 @@
import Anthropic from '@anthropic-ai/sdk'
import { MessageCreateParams, MessageStreamEvent } from '@anthropic-ai/sdk/resources'
import type Anthropic from '@anthropic-ai/sdk'
import type { MessageCreateParams, MessageStreamEvent } from '@anthropic-ai/sdk/resources'
import { loggerService } from '@logger'
import anthropicService from '@main/services/AnthropicService'
import { buildClaudeCodeSystemMessage, getSdkClient } from '@shared/anthropic'
import { Provider } from '@types'
import { Response } from 'express'
import type { Provider } from '@types'
import type { Response } from 'express'
const logger = loggerService.withContext('MessagesService')
const EXCLUDED_FORWARD_HEADERS: ReadonlySet<string> = new Set([

View File

@ -1,4 +1,4 @@
import { ApiModel, ApiModelsFilter, ApiModelsResponse } from '../../../renderer/src/types/apiModels'
import type { ApiModel, ApiModelsFilter, ApiModelsResponse } from '../../../renderer/src/types/apiModels'
import { loggerService } from '../../services/LoggerService'
import { getAvailableProviders, listAllAvailableModels, transformModelToOpenAI } from '../utils'

View File

@ -15,14 +15,13 @@ import { MIN_WINDOW_HEIGHT, MIN_WINDOW_WIDTH } from '@shared/config/constant'
import type { UpgradeChannel } from '@shared/data/preference/preferenceTypes'
import { IpcChannel } from '@shared/IpcChannel'
import type {
AgentPersistedMessage,
FileMetadata,
Notification,
OcrProvider,
Provider,
Shortcut,
SupportedOcrFile,
AgentPersistedMessage
} from '@types'
SupportedOcrFile} from '@types'
import checkDiskSpace from 'check-disk-space'
import type { ProxyConfig } from 'electron'
import { BrowserWindow, dialog, ipcMain, session, shell, systemPreferences, webContents } from 'electron'

View File

@ -1,8 +1,9 @@
import { type Client, createClient } from '@libsql/client'
import { loggerService } from '@logger'
import { mcpApiService } from '@main/apiServer/services/mcp'
import { ModelValidationError, validateModelId } from '@main/apiServer/utils'
import { AgentType, MCPTool, objectKeys, SlashCommand, Tool } from '@types'
import { type ModelValidationError, validateModelId } from '@main/apiServer/utils'
import type { AgentType, MCPTool, SlashCommand, Tool } from '@types'
import { objectKeys } from '@types'
import { drizzle, type LibSQLDatabase } from 'drizzle-orm/libsql'
import fs from 'fs'
import path from 'path'
@ -10,7 +11,7 @@ import path from 'path'
import { MigrationService } from './database/MigrationService'
import * as schema from './database/schema'
import { dbPath } from './drizzle.config'
import { AgentModelField, AgentModelValidationError } from './errors'
import { type AgentModelField, AgentModelValidationError } from './errors'
import { builtinSlashCommands } from './services/claudecode/commands'
import { builtinTools } from './services/claudecode/tools'

View File

@ -5,7 +5,7 @@ import { type LibSQLDatabase } from 'drizzle-orm/libsql'
import fs from 'fs'
import path from 'path'
import * as schema from './schema'
import type * as schema from './schema'
import { migrations, type NewMigration } from './schema/migrations.schema'
const logger = loggerService.withContext('MigrationService')

View File

@ -1,5 +1,5 @@
import { ModelValidationError } from '@main/apiServer/utils'
import { AgentType } from '@types'
import type { ModelValidationError } from '@main/apiServer/utils'
import type { AgentType } from '@types'
export type AgentModelField = 'model' | 'plan_model' | 'small_model'

View File

@ -1,9 +1,9 @@
// Agent-agnostic streaming interface
// This interface should be implemented by all agent services
import { EventEmitter } from 'node:events'
import type { EventEmitter } from 'node:events'
import { GetAgentSessionResponse } from '@types'
import type { GetAgentSessionResponse } from '@types'
import type { TextStreamPart } from 'ai'
// Generic agent stream event that works with any agent type

View File

@ -1,8 +1,7 @@
import path from 'node:path'
import { getDataPath } from '@main/utils'
import {
AgentBaseSchema,
import type {
AgentEntity,
CreateAgentRequest,
CreateAgentResponse,
@ -11,11 +10,12 @@ import {
UpdateAgentRequest,
UpdateAgentResponse
} from '@types'
import { AgentBaseSchema } from '@types'
import { count, eq } from 'drizzle-orm'
import { BaseService } from '../BaseService'
import { type AgentRow, agentsTable, type InsertAgentRow } from '../database/schema'
import { AgentModelField } from '../errors'
import type { AgentModelField } from '../errors'
export class AgentService extends BaseService {
private static instance: AgentService | null = null

View File

@ -5,12 +5,12 @@ import type {
GetAgentSessionResponse,
ListOptions
} from '@types'
import { TextStreamPart } from 'ai'
import type { TextStreamPart } from 'ai'
import { and, desc, eq, not } from 'drizzle-orm'
import { BaseService } from '../BaseService'
import { sessionMessagesTable } from '../database/schema'
import { AgentStreamEvent } from '../interfaces/AgentStreamInterface'
import type { AgentStreamEvent } from '../interfaces/AgentStreamInterface'
import ClaudeCodeService from './claudecode'
const logger = loggerService.withContext('SessionMessageService')

View File

@ -1,18 +1,18 @@
import {
AgentBaseSchema,
type AgentEntity,
type AgentSessionEntity,
type CreateSessionRequest,
type GetAgentSessionResponse,
type ListOptions,
type UpdateSessionRequest,
import type {
AgentEntity,
AgentSessionEntity,
CreateSessionRequest,
GetAgentSessionResponse,
ListOptions,
UpdateSessionRequest,
UpdateSessionResponse
} from '@types'
import { AgentBaseSchema } from '@types'
import { and, count, desc, eq, type SQL } from 'drizzle-orm'
import { BaseService } from '../BaseService'
import { agentsTable, type InsertSessionRow, type SessionRow, sessionsTable } from '../database/schema'
import { AgentModelField } from '../errors'
import type { AgentModelField } from '../errors'
export class SessionService extends BaseService {
private static instance: SessionService | null = null

View File

@ -1,4 +1,4 @@
import { SlashCommand } from '@types'
import type { SlashCommand } from '@types'
export const builtinSlashCommands: SlashCommand[] = [
{ command: '/add-dir', description: 'Add additional working directories' },

View File

@ -2,15 +2,16 @@
import { EventEmitter } from 'node:events'
import { createRequire } from 'node:module'
import { McpHttpServerConfig, Options, query, SDKMessage } from '@anthropic-ai/claude-agent-sdk'
import type { McpHttpServerConfig, Options, SDKMessage } from '@anthropic-ai/claude-agent-sdk'
import { query } from '@anthropic-ai/claude-agent-sdk'
import { loggerService } from '@logger'
import { config as apiConfigService } from '@main/apiServer/config'
import { validateModelId } from '@main/apiServer/utils'
import getLoginShellEnvironment from '@main/utils/shell-env'
import { app } from 'electron'
import { GetAgentSessionResponse } from '../..'
import { AgentServiceInterface, AgentStream, AgentStreamEvent } from '../../interfaces/AgentStreamInterface'
import type { GetAgentSessionResponse } from '../..'
import type { AgentServiceInterface, AgentStream, AgentStreamEvent } from '../../interfaces/AgentStreamInterface'
import { ClaudeStreamState, transformSDKMessageToStreamParts } from './transform'
const require_ = createRequire(import.meta.url)

View File

@ -1,4 +1,4 @@
import { Tool } from '@types'
import type { Tool } from '@types'
// https://docs.anthropic.com/en/docs/claude-code/settings#tools-available-to-claude
export const builtinTools: Tool[] = [

View File

@ -20,7 +20,7 @@
* emitting `text-*` parts and a synthetic `finish-step`.
*/
import { SDKMessage } from '@anthropic-ai/claude-agent-sdk'
import type { SDKMessage } from '@anthropic-ai/claude-agent-sdk'
import type { BetaStopReason } from '@anthropic-ai/sdk/resources/beta/messages/messages.mjs'
import { loggerService } from '@logger'
import type { FinishReason, LanguageModelUsage, ProviderMetadata, TextStreamPart } from 'ai'

View File

@ -1,4 +1,4 @@
import Anthropic from '@anthropic-ai/sdk'
import type Anthropic from '@anthropic-ai/sdk'
import type {
Base64ImageSource,
ImageBlockParam,

View File

@ -1,34 +1,37 @@
import { loggerService } from '@logger'
import { formatAgentServerError } from '@renderer/utils/error'
import {
import type {
AddAgentForm,
AgentServerErrorSchema,
ApiModelsFilter,
ApiModelsResponse,
ApiModelsResponseSchema,
CreateAgentRequest,
CreateAgentResponse,
CreateAgentResponseSchema,
CreateSessionForm,
CreateSessionRequest,
GetAgentResponse,
GetAgentResponseSchema,
GetAgentSessionResponse,
GetAgentSessionResponseSchema,
ListAgentSessionsResponse,
ListAgentSessionsResponseSchema,
type ListAgentsResponse,
ListAgentsResponseSchema,
objectEntries,
objectKeys,
ListAgentsResponse,
UpdateAgentForm,
UpdateAgentRequest,
UpdateAgentResponse,
UpdateAgentResponseSchema,
UpdateSessionForm,
UpdateSessionRequest
} from '@types'
import axios, { Axios, AxiosRequestConfig, isAxiosError } from 'axios'
import {
AgentServerErrorSchema,
ApiModelsResponseSchema,
CreateAgentResponseSchema,
GetAgentResponseSchema,
GetAgentSessionResponseSchema,
ListAgentSessionsResponseSchema,
ListAgentsResponseSchema,
objectEntries,
objectKeys,
UpdateAgentResponseSchema
} from '@types'
import type { Axios, AxiosRequestConfig } from 'axios'
import axios, { isAxiosError } from 'axios'
import { ZodError } from 'zod'
type ApiVersion = 'v1'

View File

@ -1,6 +1,6 @@
import { Avatar, cn } from '@heroui/react'
import { getModelLogo } from '@renderer/config/models'
import { ApiModel } from '@renderer/types'
import type { ApiModel } from '@renderer/types'
import React from 'react'
import Ellipsis from './Ellipsis'

View File

@ -7,7 +7,8 @@ import { getModelLogo } from '@renderer/config/models'
import { useApiModels } from '@renderer/hooks/agents/useModels'
import { getModelUniqId } from '@renderer/services/ModelService'
import { getProviderNameById } from '@renderer/services/ProviderService'
import { AdaptedApiModel, ApiModel, ApiModelsFilter, Model, ModelType, objectEntries } from '@renderer/types'
import type { AdaptedApiModel, ApiModel, ApiModelsFilter, Model, ModelType } from '@renderer/types'
import { objectEntries } from '@renderer/types'
import { classNames, filterModelsByKeywords } from '@renderer/utils'
import { apiModelAdapter, getModelTags } from '@renderer/utils/model'
import { Avatar, Divider, Empty, Modal } from 'antd'
@ -27,7 +28,7 @@ import styled from 'styled-components'
import { useModelTagFilter } from './filters'
import SelectModelSearchBar from './searchbar'
import TagFilterSection from './TagFilterSection'
import { FlatListApiItem, FlatListApiModel } from './types'
import type { FlatListApiItem, FlatListApiModel } from './types'
const PAGE_SIZE = 12
const ITEM_HEIGHT = 36

View File

@ -1,3 +1,4 @@
import type { SelectedItemProps } from '@heroui/react'
import {
Button,
cn,
@ -9,7 +10,6 @@ import {
ModalFooter,
ModalHeader,
Select,
SelectedItemProps,
SelectItem,
Textarea,
useDisclosure
@ -22,23 +22,24 @@ import { permissionModeCards } from '@renderer/constants/permissionModes'
import { useAgents } from '@renderer/hooks/agents/useAgents'
import { useApiModels } from '@renderer/hooks/agents/useModels'
import { useUpdateAgent } from '@renderer/hooks/agents/useUpdateAgent'
import {
import type {
AddAgentForm,
AgentConfigurationSchema,
AgentEntity,
AgentType,
BaseAgentForm,
isAgentType,
PermissionMode,
Tool,
UpdateAgentForm
} from '@renderer/types'
import { AgentConfigurationSchema, isAgentType } from '@renderer/types'
import { AlertTriangleIcon } from 'lucide-react'
import { ChangeEvent, FormEvent, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react'
import type { ChangeEvent, FormEvent, ReactNode } from 'react'
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { ErrorBoundary } from '../../ErrorBoundary'
import { BaseOption, ModelOption, Option, renderOption } from './shared'
import type { BaseOption, ModelOption } from './shared'
import { Option, renderOption } from './shared'
const logger = loggerService.withContext('AddAgentPopup')

View File

@ -17,7 +17,7 @@ import { AllowedToolsSelect } from '@renderer/components/agent'
import { useAgent } from '@renderer/hooks/agents/useAgent'
import { useSessions } from '@renderer/hooks/agents/useSessions'
import { useUpdateSession } from '@renderer/hooks/agents/useUpdateSession'
import {
import type {
AgentEntity,
AgentSessionEntity,
BaseSessionForm,
@ -25,7 +25,8 @@ import {
Tool,
UpdateSessionForm
} from '@renderer/types'
import { FormEvent, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react'
import type { FormEvent, ReactNode } from 'react'
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { ErrorBoundary } from '../../ErrorBoundary'

View File

@ -1,4 +1,5 @@
import { Avatar, SelectedItemProps, SelectedItems } from '@heroui/react'
import type { SelectedItemProps, SelectedItems } from '@heroui/react'
import { Avatar } from '@heroui/react'
import { getProviderLabel } from '@renderer/i18n/label'
import { useTranslation } from 'react-i18next'

View File

@ -1,5 +1,6 @@
import { Chip, cn, Select, SelectedItems, SelectItem, SelectProps } from '@heroui/react'
import { Tool } from '@renderer/types'
import type { SelectedItems, SelectProps } from '@heroui/react'
import { Chip, cn, Select, SelectItem } from '@heroui/react'
import type { Tool } from '@renderer/types'
import React, { useCallback } from 'react'
import { useTranslation } from 'react-i18next'

View File

@ -1,5 +1,5 @@
import ClaudeAvatar from '@renderer/assets/images/models/claude.png'
import { AgentBase, AgentType } from '@renderer/types'
import type { AgentBase, AgentType } from '@renderer/types'
// base agent config. no default config for now.
const DEFAULT_AGENT_CONFIG: Omit<AgentBase, 'model'> = {

View File

@ -1,4 +1,4 @@
import { PermissionMode } from '@renderer/types'
import type { PermissionMode } from '@renderer/types'
export type PermissionModeCard = {
mode: PermissionMode

View File

@ -1,6 +1,6 @@
import { useAppDispatch } from '@renderer/store'
import { setActiveAgentId, setActiveSessionIdAction } from '@renderer/store/runtime'
import { AddAgentForm, CreateAgentResponse } from '@renderer/types'
import type { AddAgentForm, CreateAgentResponse } from '@renderer/types'
import { formatErrorMessageWithPrefix } from '@renderer/utils/error'
import { useCallback } from 'react'
import { useTranslation } from 'react-i18next'

View File

@ -1,4 +1,4 @@
import { ApiModelsFilter } from '@renderer/types'
import type { ApiModelsFilter } from '@renderer/types'
import { useApiModels } from './useModels'

View File

@ -1,4 +1,4 @@
import { ApiModel, ApiModelsFilter } from '@renderer/types'
import type { ApiModel, ApiModelsFilter } from '@renderer/types'
import { merge } from 'lodash'
import { useCallback } from 'react'
import useSWR from 'swr'

View File

@ -1,6 +1,6 @@
import { useAppDispatch } from '@renderer/store'
import { loadTopicMessagesThunk } from '@renderer/store/thunk/messageThunk'
import { UpdateSessionForm } from '@renderer/types'
import type { UpdateSessionForm } from '@renderer/types'
import { buildAgentSessionTopicId } from '@renderer/utils/agentSession'
import { useCallback, useEffect, useMemo } from 'react'
import { useTranslation } from 'react-i18next'

View File

@ -1,4 +1,4 @@
import { CreateSessionForm } from '@renderer/types'
import type { CreateSessionForm } from '@renderer/types'
import { formatErrorMessageWithPrefix } from '@renderer/utils/error'
import { useCallback } from 'react'
import { useTranslation } from 'react-i18next'

View File

@ -1,4 +1,4 @@
import { ListAgentsResponse, UpdateAgentForm } from '@renderer/types'
import type { ListAgentsResponse, UpdateAgentForm } from '@renderer/types'
import { formatErrorMessageWithPrefix } from '@renderer/utils/error'
import { useCallback } from 'react'
import { useTranslation } from 'react-i18next'

View File

@ -1,4 +1,4 @@
import { ListAgentSessionsResponse, UpdateSessionForm } from '@renderer/types'
import type { ListAgentSessionsResponse, UpdateSessionForm } from '@renderer/types'
import { formatErrorMessageWithPrefix } from '@renderer/utils/error'
import { useCallback } from 'react'
import { useTranslation } from 'react-i18next'

View File

@ -6,7 +6,7 @@ import {
updateAssistantPreset,
updateAssistantPresetSettings
} from '@renderer/store/assistants'
import { AssistantPreset, AssistantSettings } from '@renderer/types'
import type { AssistantPreset, AssistantSettings } from '@renderer/types'
export function useAssistantPresets() {
const presets = useAppSelector((state) => state.assistants.presets)

View File

@ -9,8 +9,8 @@ import PromptPopup from '@renderer/components/Popups/PromptPopup'
import { QuickPanelProvider } from '@renderer/components/QuickPanel'
import { useAssistant } from '@renderer/hooks/useAssistant'
import { useChatContext } from '@renderer/hooks/useChatContext'
import { useRuntime } from '@renderer/hooks/useRuntime'
import { useNavbarPosition } from '@renderer/hooks/useNavbar'
import { useRuntime } from '@renderer/hooks/useRuntime'
import { useShortcut } from '@renderer/hooks/useShortcuts'
import { useShowAssistants, useShowTopics } from '@renderer/hooks/useStore'
import { useTimer } from '@renderer/hooks/useTimer'

View File

@ -20,8 +20,8 @@ import { formatErrorMessageWithPrefix } from '@renderer/utils/error'
import { t } from 'i18next'
import { Menu, PanelLeftClose, PanelRightClose, Search } from 'lucide-react'
import { AnimatePresence, motion } from 'motion/react'
import React, { useCallback } from 'react'
import type { FC, ReactNode } from 'react'
import React, { useCallback } from 'react'
import styled from 'styled-components'
import { AgentSettingsPopup } from '../settings/AgentSettings'

View File

@ -2,8 +2,8 @@ import { usePreference } from '@data/hooks/usePreference'
import { ErrorBoundary } from '@renderer/components/ErrorBoundary'
import { useAgentSessionInitializer } from '@renderer/hooks/agents/useAgentSessionInitializer'
import { useAssistants } from '@renderer/hooks/useAssistant'
import { useRuntime } from '@renderer/hooks/useRuntime'
import { useNavbarPosition } from '@renderer/hooks/useNavbar'
import { useRuntime } from '@renderer/hooks/useRuntime'
import { useActiveTopic } from '@renderer/hooks/useTopic'
import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService'
import NavigationService from '@renderer/services/NavigationService'

View File

@ -14,16 +14,17 @@ import { useAppDispatch, useAppSelector } from '@renderer/store'
import { newMessagesActions, selectMessagesForTopic } from '@renderer/store/newMessage'
import { sendMessage as dispatchSendMessage } from '@renderer/store/thunk/messageThunk'
import type { Assistant, Message, Model, Topic } from '@renderer/types'
import { MessageBlock, MessageBlockStatus } from '@renderer/types/newMessage'
import { type MessageBlock, MessageBlockStatus } from '@renderer/types/newMessage'
import { classNames } from '@renderer/utils'
import { abortCompletion } from '@renderer/utils/abortController'
import { buildAgentSessionTopicId } from '@renderer/utils/agentSession'
import { getSendMessageShortcutLabel, isSendMessageKeyPressed } from '@renderer/utils/input'
import { createMainTextBlock, createMessage } from '@renderer/utils/messageUtils/create'
import TextArea, { TextAreaRef } from 'antd/es/input/TextArea'
import TextArea, { type TextAreaRef } from 'antd/es/input/TextArea'
import { isEmpty } from 'lodash'
import { CirclePause } from 'lucide-react'
import React, { CSSProperties, FC, useCallback, useEffect, useMemo, useRef, useState } from 'react'
import type { CSSProperties, FC } from 'react'
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next'
import styled from 'styled-components'
import { v4 as uuid } from 'uuid'

View File

@ -1,6 +1,6 @@
// 通用工具组件 - 减少重复代码
import { ReactNode } from 'react'
import type { ReactNode } from 'react'
// 生成 AccordionItem 的标题
export function ToolTitle({

View File

@ -1,6 +1,6 @@
import { Accordion } from '@heroui/react'
import { loggerService } from '@logger'
import { NormalToolResponse } from '@renderer/types'
import type { NormalToolResponse } from '@renderer/types'
// 导出所有类型
export * from './types'
@ -18,7 +18,8 @@ import { ReadTool } from './ReadTool'
import { SearchTool } from './SearchTool'
import { TaskTool } from './TaskTool'
import { TodoWriteTool } from './TodoWriteTool'
import { AgentToolsType, ToolInput, ToolOutput } from './types'
import type { ToolInput, ToolOutput } from './types'
import { AgentToolsType } from './types'
import { UnknownToolRenderer } from './UnknownToolRenderer'
import { WebFetchTool } from './WebFetchTool'
import { WebSearchTool } from './WebSearchTool'

View File

@ -2,7 +2,7 @@ import { Alert, cn } from '@heroui/react'
import { useRuntime } from '@renderer/hooks/useRuntime'
import { useSettings } from '@renderer/hooks/useSettings'
import { AnimatePresence, motion } from 'framer-motion'
import { FC, memo } from 'react'
import { type FC, memo } from 'react'
import { useTranslation } from 'react-i18next'
import Sessions from './components/Sessions'

View File

@ -3,9 +3,9 @@ import { DeleteIcon, EditIcon } from '@renderer/components/Icons'
import { useSessions } from '@renderer/hooks/agents/useSessions'
import AgentSettingsPopup from '@renderer/pages/settings/AgentSettings/AgentSettingsPopup'
import { AgentLabel } from '@renderer/pages/settings/AgentSettings/shared'
import { AgentEntity } from '@renderer/types'
import type { AgentEntity } from '@renderer/types'
import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuTrigger } from '@renderer/ui/context-menu'
import { FC, memo } from 'react'
import { type FC, memo } from 'react'
import { useTranslation } from 'react-i18next'
// const logger = loggerService.withContext('AgentItem')

View File

@ -6,7 +6,7 @@ import { useRuntime } from '@renderer/hooks/useRuntime'
import { useAppDispatch } from '@renderer/store'
import { setActiveAgentId as setActiveAgentIdAction } from '@renderer/store/runtime'
import { Plus } from 'lucide-react'
import { FC, useCallback, useEffect } from 'react'
import { type FC, useCallback, useEffect } from 'react'
import { useTranslation } from 'react-i18next'
import AgentItem from './AgentItem'

View File

@ -1,14 +1,15 @@
import { DownOutlined, RightOutlined } from '@ant-design/icons'
import { Tooltip } from '@cherrystudio/ui'
import { Button } from '@heroui/react'
import { DraggableList } from '@renderer/components/DraggableList'
import { useAssistants } from '@renderer/hooks/useAssistant'
import { useAssistantPresets } from '@renderer/hooks/useAssistantPresets'
import { useAssistantsTabSortType } from '@renderer/hooks/useStore'
import { useTags } from '@renderer/hooks/useTags'
import { Assistant, AssistantsSortType } from '@renderer/types'
import { Tooltip } from 'antd'
import type { Assistant } from '@renderer/types'
import type { AssistantTabSortType } from '@shared/data/preference/preferenceTypes'
import { Plus } from 'lucide-react'
import { FC, useCallback, useMemo, useState } from 'react'
import { type FC, useCallback, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
import styled from 'styled-components'
@ -48,7 +49,7 @@ const Assistants: FC<AssistantsProps> = ({
)
const handleSortByChange = useCallback(
(sortType: AssistantsSortType) => {
(sortType: AssistantTabSortType) => {
setAssistantsTabSortType(sortType)
},
[setAssistantsTabSortType]

View File

@ -10,11 +10,11 @@ import { SessionSettingsPopup } from '@renderer/pages/settings/AgentSettings'
import { SessionLabel } from '@renderer/pages/settings/AgentSettings/shared'
import { useAppDispatch, useAppSelector } from '@renderer/store'
import { newMessagesActions } from '@renderer/store/newMessage'
import { AgentSessionEntity } from '@renderer/types'
import type { AgentSessionEntity } from '@renderer/types'
import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuTrigger } from '@renderer/ui/context-menu'
import { buildAgentSessionTopicId } from '@renderer/utils/agentSession'
import { XIcon } from 'lucide-react'
import React, { FC, memo, startTransition, useEffect, useMemo, useState } from 'react'
import React, { type FC, memo, startTransition, useEffect, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
import styled from 'styled-components'

View File

@ -10,7 +10,7 @@ import {
setActiveTopicOrSessionAction,
setSessionWaitingAction
} from '@renderer/store/runtime'
import { CreateSessionForm } from '@renderer/types'
import type { CreateSessionForm } from '@renderer/types'
import { buildAgentSessionTopicId } from '@renderer/utils/agentSession'
import { AnimatePresence, motion } from 'framer-motion'
import { Plus } from 'lucide-react'

View File

@ -1,3 +1,6 @@
import { Tooltip } from '@cherrystudio/ui'
import { useCache } from '@data/hooks/useCache'
import { usePreference } from '@data/hooks/usePreference'
import { DraggableVirtualList } from '@renderer/components/DraggableList'
import { CopyIcon, DeleteIcon, EditIcon } from '@renderer/components/Icons'
import ObsidianExportPopup from '@renderer/components/Popups/ObsidianExportPopup'
@ -6,17 +9,14 @@ import SaveToKnowledgePopup from '@renderer/components/Popups/SaveToKnowledgePop
import { isMac } from '@renderer/config/constant'
import { useAssistant, useAssistants } from '@renderer/hooks/useAssistant'
import { useInPlaceEdit } from '@renderer/hooks/useInPlaceEdit'
import { modelGenerating } from '@renderer/hooks/useModel'
import { useNotesSettings } from '@renderer/hooks/useNotesSettings'
import { modelGenerating } from '@renderer/hooks/useRuntime'
import { useSettings } from '@renderer/hooks/useSettings'
import { finishTopicRenaming, startTopicRenaming, TopicManager } from '@renderer/hooks/useTopic'
import { fetchMessagesSummary } from '@renderer/services/ApiService'
import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService'
import store from '@renderer/store'
import { RootState } from '@renderer/store'
import type { RootState } from '@renderer/store'
import { newMessagesActions } from '@renderer/store/newMessage'
import { setGenerating } from '@renderer/store/runtime'
import { Assistant, Topic } from '@renderer/types'
import type { Assistant, Topic } from '@renderer/types'
import { classNames, removeSpecialCharactersForFileName } from '@renderer/utils'
import { copyTopicAsMarkdown, copyTopicAsPlainText } from '@renderer/utils/copy'
import {
@ -28,8 +28,9 @@ import {
exportTopicToNotion,
topicToMarkdown
} from '@renderer/utils/export'
import { Dropdown, MenuProps, Tooltip } from 'antd'
import { ItemType, MenuItemType } from 'antd/es/menu/interface'
import type { MenuProps } from 'antd'
import { Dropdown } from 'antd'
import type { ItemType, MenuItemType } from 'antd/es/menu/interface'
import dayjs from 'dayjs'
import { findIndex } from 'lodash'
import {
@ -51,7 +52,6 @@ import { useCallback, useDeferredValue, useEffect, useMemo, useRef, useState } f
import { useTranslation } from 'react-i18next'
import { useDispatch, useSelector } from 'react-redux'
import styled from 'styled-components'
interface Props {
assistant: Assistant
activeTopic: Topic
@ -64,7 +64,12 @@ export const Topics: React.FC<Props> = ({ assistant: _assistant, activeTopic, se
const { notesPath } = useNotesSettings()
const { assistants } = useAssistants()
const { assistant, removeTopic, moveTopic, updateTopic, updateTopics } = useAssistant(_assistant.id)
const { showTopicTime, pinTopicsToTop, setTopicPosition, topicPosition } = useSettings()
const [showTopicTime] = usePreference('topic.tab.show_time')
const [pinTopicsToTop] = usePreference('topic.tab.pin_to_top')
const [topicPosition, setTopicPosition] = usePreference('topic.position')
const [, setGenerating] = useCache('chat.generating')
const renamingTopics = useSelector((state: RootState) => state.runtime.chat.renamingTopics)
const topicLoadingQuery = useSelector((state: RootState) => state.messages.loadingByTopic)
@ -126,11 +131,14 @@ export const Topics: React.FC<Props> = ({ assistant: _assistant, activeTopic, se
deleteTimerRef.current = setTimeout(() => setDeletingTopicId(null), 2000)
}, [])
const onClearMessages = useCallback((topic: Topic) => {
// window.keyv.set(EVENT_NAMES.CHAT_COMPLETION_PAUSED, true)
store.dispatch(setGenerating(false))
EventEmitter.emit(EVENT_NAMES.CLEAR_MESSAGES, topic)
}, [])
const onClearMessages = useCallback(
(topic: Topic) => {
// window.keyv.set(EVENT_NAMES.CHAT_COMPLETION_PAUSED, true)
setGenerating(false)
EventEmitter.emit(EVENT_NAMES.CLEAR_MESSAGES, topic)
},
[setGenerating]
)
const handleConfirmDelete = useCallback(
async (topic: Topic, e: React.MouseEvent) => {
@ -552,9 +560,9 @@ export const Topics: React.FC<Props> = ({ assistant: _assistant, activeTopic, se
{!topic.pinned && (
<Tooltip
placement="bottom"
mouseEnterDelay={0.7}
mouseLeaveDelay={0}
title={
delay={700}
closeDelay={0}
content={
<div style={{ fontSize: '12px', opacity: 0.8, fontStyle: 'italic' }}>
{t('chat.topics.delete.shortcut', { key: isMac ? '⌘' : 'Ctrl' })}
</div>

View File

@ -1,8 +1,8 @@
import { usePreference } from '@data/hooks/usePreference'
import AddAssistantPopup from '@renderer/components/Popups/AddAssistantPopup'
import { useAssistants, useDefaultAssistant } from '@renderer/hooks/useAssistant'
import { useRuntime } from '@renderer/hooks/useRuntime'
import { useNavbarPosition } from '@renderer/hooks/useNavbar'
import { useRuntime } from '@renderer/hooks/useRuntime'
import { useShowTopics } from '@renderer/hooks/useStore'
import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService'
import type { Assistant, Topic } from '@renderer/types'

View File

@ -4,11 +4,12 @@ import { SelectApiModelPopup } from '@renderer/components/Popups/SelectModelPopu
import { isEmbeddingModel, isRerankModel, isTextToImageModel } from '@renderer/config/models'
import { useApiModel } from '@renderer/hooks/agents/useModel'
import { getProviderNameById } from '@renderer/services/ProviderService'
import { AgentBaseWithId, ApiModel, isAgentEntity, Model } from '@renderer/types'
import type { AgentBaseWithId, ApiModel, Model } from '@renderer/types'
import { isAgentEntity } from '@renderer/types'
import { getModelFilterByAgentType } from '@renderer/utils/agentSession'
import { apiModelAdapter } from '@renderer/utils/model'
import { ChevronsUpDown } from 'lucide-react'
import { FC } from 'react'
import type { FC } from 'react'
import { useTranslation } from 'react-i18next'
interface Props {

View File

@ -1,6 +1,6 @@
import { Button, Tooltip } from '@heroui/react'
import { loggerService } from '@logger'
import { AgentBaseWithId, UpdateAgentBaseForm } from '@renderer/types'
import type { AgentBaseWithId, UpdateAgentBaseForm } from '@renderer/types'
import { Plus } from 'lucide-react'
import React, { useCallback } from 'react'
import { useTranslation } from 'react-i18next'

View File

@ -1,13 +1,13 @@
import { Input, Tooltip } from '@heroui/react'
import { useUpdateAgent } from '@renderer/hooks/agents/useUpdateAgent'
import { useUpdateSession } from '@renderer/hooks/agents/useUpdateSession'
import {
import type { useUpdateAgent } from '@renderer/hooks/agents/useUpdateAgent'
import type { useUpdateSession } from '@renderer/hooks/agents/useUpdateSession'
import type {
AgentConfiguration,
AgentConfigurationSchema,
GetAgentResponse,
GetAgentSessionResponse,
UpdateAgentBaseForm
} from '@renderer/types'
import { AgentConfigurationSchema } from '@renderer/types'
import { Info } from 'lucide-react'
import { useCallback, useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'

View File

@ -1,9 +1,9 @@
import { Avatar } from '@heroui/react'
import { getAgentTypeAvatar } from '@renderer/config/agent'
import { useUpdateAgent } from '@renderer/hooks/agents/useUpdateAgent'
import type { useUpdateAgent } from '@renderer/hooks/agents/useUpdateAgent'
import { getAgentTypeLabel } from '@renderer/i18n/label'
import { GetAgentResponse } from '@renderer/types'
import { FC } from 'react'
import type { GetAgentResponse } from '@renderer/types'
import type { FC } from 'react'
import { useTranslation } from 'react-i18next'
import { AccessibleDirsSetting } from './AccessibleDirsSetting'

View File

@ -1,5 +1,6 @@
import { EmojiAvatarWithPicker } from '@renderer/components/Avatar/EmojiAvatarWithPicker'
import { AgentEntity, isAgentType, UpdateAgentForm } from '@renderer/types'
import type { AgentEntity, UpdateAgentForm } from '@renderer/types'
import { isAgentType } from '@renderer/types'
import { useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next'

View File

@ -1,5 +1,5 @@
import { Textarea } from '@heroui/react'
import { AgentBaseWithId, UpdateAgentBaseForm } from '@renderer/types'
import type { AgentBaseWithId, UpdateAgentBaseForm } from '@renderer/types'
import React, { useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next'

View File

@ -1,5 +1,5 @@
import SelectAgentModelButton from '@renderer/pages/home/components/SelectAgentModelButton'
import { AgentBaseWithId, ApiModel, UpdateAgentBaseForm } from '@renderer/types'
import type { AgentBaseWithId, ApiModel, UpdateAgentBaseForm } from '@renderer/types'
import { useTranslation } from 'react-i18next'
import { SettingsItem, SettingsTitle } from './shared'

View File

@ -1,5 +1,5 @@
import { Input } from '@heroui/react'
import { AgentBaseWithId, UpdateAgentBaseForm } from '@renderer/types'
import type { AgentBaseWithId, UpdateAgentBaseForm } from '@renderer/types'
import { useState } from 'react'
import { useTranslation } from 'react-i18next'

View File

@ -1,14 +1,15 @@
import { Button } from '@cherrystudio/ui'
import CodeEditor from '@renderer/components/CodeEditor'
import { HSpaceBetweenStack } from '@renderer/components/Layout'
import { RichEditorRef } from '@renderer/components/RichEditor/types'
import { useUpdateAgent } from '@renderer/hooks/agents/useUpdateAgent'
import { useUpdateSession } from '@renderer/hooks/agents/useUpdateSession'
import type { RichEditorRef } from '@renderer/components/RichEditor/types'
import type { useUpdateAgent } from '@renderer/hooks/agents/useUpdateAgent'
import type { useUpdateSession } from '@renderer/hooks/agents/useUpdateSession'
import { usePromptProcessor } from '@renderer/hooks/usePromptProcessor'
import { estimateTextTokens } from '@renderer/services/TokenService'
import { AgentEntity, AgentSessionEntity, UpdateAgentBaseForm } from '@renderer/types'
import { Button, Popover } from 'antd'
import type { AgentEntity, AgentSessionEntity, UpdateAgentBaseForm } from '@renderer/types'
import { Popover } from 'antd'
import { Edit, HelpCircle, Save } from 'lucide-react'
import { FC, useEffect, useRef, useState } from 'react'
import { type FC, useEffect, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next'
import ReactMarkdown from 'react-markdown'
import styled from 'styled-components'
@ -92,9 +93,10 @@ const PromptSettings: FC<AgentPromptSettingsProps> = ({ agentBase, update }) =>
<HSpaceBetweenStack width="100%" justifyContent="flex-end" mt="10px">
<TokenCount>Tokens: {tokenCount}</TokenCount>
<Button
type="primary"
icon={showPreview ? <Edit size={14} /> : <Save size={14} />}
onClick={() => {
variant="solid"
color="primary"
startContent={showPreview ? <Edit size={14} /> : <Save size={14} />}
onPress={() => {
const currentScrollTop = editorRef.current?.getScrollTop?.() || 0
if (showPreview) {
setShowPreview(false)

View File

@ -1,6 +1,6 @@
import { useUpdateAgent } from '@renderer/hooks/agents/useUpdateAgent'
import { GetAgentSessionResponse } from '@renderer/types'
import { FC } from 'react'
import type { useUpdateAgent } from '@renderer/hooks/agents/useUpdateAgent'
import type { GetAgentSessionResponse } from '@renderer/types'
import type { FC } from 'react'
import { AccessibleDirsSetting } from './AccessibleDirsSetting'
import { DescriptionSetting } from './DescriptionSetting'

View File

@ -3,9 +3,8 @@ import { permissionModeCards } from '@renderer/constants/permissionModes'
import { useAgentClient } from '@renderer/hooks/agents/useAgentClient'
import { useMCPServers } from '@renderer/hooks/useMCPServers'
import useScrollPosition from '@renderer/hooks/useScrollPosition'
import {
import type {
AgentConfiguration,
AgentConfigurationSchema,
GetAgentResponse,
GetAgentSessionResponse,
PermissionMode,
@ -14,9 +13,11 @@ import {
UpdateAgentForm,
UpdateSessionForm
} from '@renderer/types'
import { AgentConfigurationSchema } from '@renderer/types'
import { Modal } from 'antd'
import { ShieldAlert, ShieldCheck, Wrench } from 'lucide-react'
import { FC, startTransition, useCallback, useEffect, useMemo, useState } from 'react'
import type { FC } from 'react'
import { startTransition, useCallback, useEffect, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { mutate } from 'swr'

View File

@ -2,9 +2,9 @@ import { cn } from '@heroui/react'
import Ellipsis from '@renderer/components/Ellipsis'
import EmojiIcon from '@renderer/components/EmojiIcon'
import { getAgentTypeLabel } from '@renderer/i18n/label'
import { AgentEntity, AgentSessionEntity } from '@renderer/types'
import type { AgentEntity, AgentSessionEntity } from '@renderer/types'
import { Menu, Modal } from 'antd'
import React, { ReactNode } from 'react'
import React, { type ReactNode } from 'react'
import styled from 'styled-components'
import { SettingDivider } from '..'

View File

@ -4,7 +4,7 @@
*
* WARNING: Any null value will be converted to undefined from api.
*/
import { ModelMessage, TextStreamPart } from 'ai'
import type { ModelMessage, TextStreamPart } from 'ai'
import { z } from 'zod'
import type { Message, MessageBlock } from './newMessage'

View File

@ -1,4 +1,4 @@
import { Model } from '@types'
import type { Model } from '@types'
import { z } from 'zod'
import { ProviderTypeSchema } from './provider'

View File

@ -1,4 +1,4 @@
import { Model } from '@types'
import type { Model } from '@types'
import z from 'zod'
export const ProviderTypeSchema = z.enum([

View File

@ -1,4 +1,4 @@
import { AgentType, ApiModelsFilter } from '@renderer/types'
import type { AgentType, ApiModelsFilter } from '@renderer/types'
const SESSION_TOPIC_PREFIX = 'agent-session:'

View File

@ -1,5 +1,5 @@
import { CLAUDE_SUPPORTED_PROVIDERS } from '@renderer/pages/code'
import { Provider } from '@renderer/types'
import type { Provider } from '@renderer/types'
export const getClaudeSupportedProviders = (providers: Provider[]) => {
return providers.filter((p) => p.type === 'anthropic' || CLAUDE_SUPPORTED_PROVIDERS.includes(p.id))