From a6c1e792fa179823f5fa37ae927f1781ca7e19d1 Mon Sep 17 00:00:00 2001 From: kurihada Date: Tue, 16 Dec 2025 10:23:28 +0800 Subject: [PATCH] =?UTF-8?q?refactor(core,server):=20=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=8A=A0=E8=BD=BD=EF=BC=8C=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=20workdir=20=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Provider 和 Agent 配置统一从全局目录加载,无需传递 workdir: - ProviderRegistry.init() 不再需要 workdir 参数 - AgentRegistry.init() 不再需要 workdir 参数 - 配置文件路径统一使用 ~/.ai-terminal-assistant/ --- packages/core/src/agent/registry.ts | 6 ++--- packages/core/src/provider/config.ts | 30 ++++++++----------------- packages/core/src/provider/index.ts | 1 - packages/core/src/provider/registry.ts | 19 ++++++---------- packages/server/src/agent/adapter.ts | 16 +++++-------- packages/server/src/routes/agents.ts | 5 ++--- packages/server/src/routes/providers.ts | 10 ++++----- 7 files changed, 32 insertions(+), 55 deletions(-) diff --git a/packages/core/src/agent/registry.ts b/packages/core/src/agent/registry.ts index fbd5ebe..843fce9 100644 --- a/packages/core/src/agent/registry.ts +++ b/packages/core/src/agent/registry.ts @@ -31,11 +31,11 @@ export class AgentRegistry { * 完整初始化 - 加载用户配置 * 用户配置可以覆盖预设 Agent 的设置 */ - async init(workdir: string): Promise { + async init(): Promise { if (this.initialized) return; - // 加载用户配置 - this.userConfig = await loadAgentConfig(workdir); + // 加载用户配置(从 ~/.ai-terminal-assistant/agents.json) + this.userConfig = await loadAgentConfig(''); if (this.userConfig) { this.globalConfig = this.userConfig.defaults ?? null; diff --git a/packages/core/src/provider/config.ts b/packages/core/src/provider/config.ts index 924a04a..16fb083 100644 --- a/packages/core/src/provider/config.ts +++ b/packages/core/src/provider/config.ts @@ -7,34 +7,25 @@ import { existsSync } from 'node:fs'; import { readFile, writeFile, mkdir } from 'node:fs/promises'; import { join } from 'node:path'; -import { homedir } from 'node:os'; import type { ProvidersConfigFile, CustomProviderDefinition, ProviderConfig } from './types.js'; - -/** 配置目录名 */ -const CONFIG_DIR = '.ai-terminal-assistant'; +import { getConfigDir as getGlobalConfigDir } from '../constants/paths.js'; /** 配置文件名 */ const CONFIG_FILE = 'providers.json'; -/** - * 获取配置目录路径 - */ -export function getConfigDir(workdir?: string): string { - return workdir ? join(workdir, CONFIG_DIR) : join(homedir(), CONFIG_DIR); -} - /** * 获取配置文件路径 + * 始终使用全局配置目录 ~/.ai-terminal-assistant/ */ -export function getConfigPath(workdir?: string): string { - return join(getConfigDir(workdir), CONFIG_FILE); +export function getConfigPath(): string { + return join(getGlobalConfigDir(), CONFIG_FILE); } /** * 加载提供商配置 */ -export async function loadProvidersConfig(workdir?: string): Promise { - const configPath = getConfigPath(workdir); +export async function loadProvidersConfig(): Promise { + const configPath = getConfigPath(); if (!existsSync(configPath)) { return { providers: {}, configs: {} }; @@ -56,12 +47,9 @@ export async function loadProvidersConfig(workdir?: string): Promise { - const configDir = getConfigDir(workdir); - const configPath = getConfigPath(workdir); +export async function saveProvidersConfig(config: ProvidersConfigFile): Promise { + const configDir = getGlobalConfigDir(); + const configPath = getConfigPath(); // 确保目录存在 if (!existsSync(configDir)) { diff --git a/packages/core/src/provider/index.ts b/packages/core/src/provider/index.ts index 4b720ae..1132b95 100644 --- a/packages/core/src/provider/index.ts +++ b/packages/core/src/provider/index.ts @@ -41,7 +41,6 @@ export { loadProvidersConfig, saveProvidersConfig, resolveApiKey, - getConfigDir, getConfigPath, } from './config.js'; diff --git a/packages/core/src/provider/registry.ts b/packages/core/src/provider/registry.ts index 19559bb..e21d923 100644 --- a/packages/core/src/provider/registry.ts +++ b/packages/core/src/provider/registry.ts @@ -46,9 +46,6 @@ export class ProviderRegistry { /** 是否已完全初始化(包括用户配置) */ private fullyInitialized = false; - /** 工作目录 */ - private workdir?: string; - constructor() { // 同步初始化内置提供商(不需要异步加载) this.initBuiltinProviders(); @@ -70,13 +67,11 @@ export class ProviderRegistry { * 完整初始化 Registry * 加载用户配置(自定义提供商和配置) */ - async init(workdir?: string): Promise { + async init(): Promise { if (this.fullyInitialized) return; - this.workdir = workdir; - - // 加载用户配置 - const config = await loadProvidersConfig(workdir); + // 加载用户配置(从 ~/.ai-terminal-assistant/providers.json) + const config = await loadProvidersConfig(); // 加载自定义提供商 if (config.providers) { @@ -414,7 +409,7 @@ export class ProviderRegistry { /** * 保存配置到文件 */ - async saveConfig(workdir?: string): Promise { + async saveConfig(): Promise { this.ensureInitialized(); const config = { @@ -422,13 +417,13 @@ export class ProviderRegistry { configs: Object.fromEntries(this.configs), }; - await saveProvidersConfig(config, workdir ?? this.workdir); + await saveProvidersConfig(config); } /** * 重新加载配置 */ - async reloadConfig(workdir?: string): Promise { + async reloadConfig(): Promise { this.fullyInitialized = false; this.configs.clear(); this.customDefinitions.clear(); @@ -440,7 +435,7 @@ export class ProviderRegistry { } } - await this.init(workdir ?? this.workdir); + await this.init(); } } diff --git a/packages/server/src/agent/adapter.ts b/packages/server/src/agent/adapter.ts index 91af6ec..a8e171e 100644 --- a/packages/server/src/agent/adapter.ts +++ b/packages/server/src/agent/adapter.ts @@ -156,7 +156,7 @@ interface PermissionManager { * Provider Registry 接口 */ interface ProviderRegistryInterface { - init(workdir?: string): Promise; + init(): Promise; isInitialized(): boolean; } @@ -164,7 +164,7 @@ interface ProviderRegistryInterface { * Agent Registry 接口 */ interface AgentRegistryInterface { - init(workdir: string): Promise; + init(): Promise; isInitialized(): boolean; } @@ -221,22 +221,18 @@ export async function initCore(): Promise { return false; } - // 获取服务器配置的工作目录 - const config = getConfig(); - const workdir = config.workdir; - // 初始化 ProviderRegistry(加载用户配置) const providerRegistry = core.getProviderRegistry(); if (!providerRegistry.isInitialized()) { - await providerRegistry.init(workdir); - console.log('[Agent] ProviderRegistry initialized with workdir:', workdir); + await providerRegistry.init(); + console.log('[Agent] ProviderRegistry initialized'); } // 初始化 AgentRegistry(加载用户自定义 Agent 配置) const agentRegistry = core.agentRegistry; if (!agentRegistry.isInitialized()) { - await agentRegistry.init(workdir); - console.log('[Agent] AgentRegistry initialized with workdir:', workdir); + await agentRegistry.init(); + console.log('[Agent] AgentRegistry initialized'); } coreModule = core; diff --git a/packages/server/src/routes/agents.ts b/packages/server/src/routes/agents.ts index ce7dbe7..b123355 100644 --- a/packages/server/src/routes/agents.ts +++ b/packages/server/src/routes/agents.ts @@ -74,7 +74,7 @@ interface AgentConfigFile { // Core Agent 模块类型 interface AgentModule { agentRegistry: { - init: (workdir: string) => Promise; + init: () => Promise; get: (name: string) => AgentInfo | undefined; list: () => AgentInfo[]; }; @@ -152,8 +152,7 @@ async function ensureRegistryInitialized(): Promise { if (!module) return false; if (!initialized) { - const config = getConfig(); - await module.agentRegistry.init(config.workdir); + await module.agentRegistry.init(); initialized = true; } diff --git a/packages/server/src/routes/providers.ts b/packages/server/src/routes/providers.ts index 98cb4dd..0196273 100644 --- a/packages/server/src/routes/providers.ts +++ b/packages/server/src/routes/providers.ts @@ -247,7 +247,7 @@ providersRouter.post('/', async (c) => { const registry = core.getProviderRegistry(); registry.registerCustom(body); - await registry.saveConfig(getConfig().workdir); + await registry.saveConfig(); return c.json({ success: true, @@ -285,7 +285,7 @@ providersRouter.put('/:id', async (c) => { } registry.setConfig(id, { ...body, id }); - await registry.saveConfig(getConfig().workdir); + await registry.saveConfig(); return c.json({ success: true, @@ -321,7 +321,7 @@ providersRouter.delete('/:id', async (c) => { return c.json({ success: false, error: `Provider not found: ${id}` }, 404); } - await registry.saveConfig(getConfig().workdir); + await registry.saveConfig(); return c.json({ success: true, @@ -365,7 +365,7 @@ providersRouter.post('/:id/models', async (c) => { const registry = core.getProviderRegistry(); registry.addCustomModel(providerId, body); - await registry.saveConfig(getConfig().workdir); + await registry.saveConfig(); return c.json({ success: true, @@ -408,7 +408,7 @@ providersRouter.delete('/:id/models/:modelId', async (c) => { ); } - await registry.saveConfig(getConfig().workdir); + await registry.saveConfig(); return c.json({ success: true,