config.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // 启动必需配置(ADR-0011):其余运行配置都在后台 settings 中管理
  2. import os from 'node:os'
  3. import path from 'node:path'
  4. import { fileURLToPath } from 'node:url'
  5. const env = process.env
  6. const isDev = env.NODE_ENV !== 'production'
  7. /** 仓库根目录(仅开发时使用) */
  8. const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../..')
  9. export const config = {
  10. host: env.AGENT_SERVER_HOST ?? '127.0.0.1',
  11. port: Number(env.AGENT_SERVER_PORT ?? 8787),
  12. /** 服务数据目录:生产为 /srv/agent-server(属主 agentsvc);开发时默认放在仓库的 .dev-data,避免与生产服务冲突 */
  13. dataDir: path.resolve(env.AGENT_SERVER_DATA_DIR ?? (isDev ? path.join(repoRoot, '.dev-data') : '/srv/agent-server')),
  14. /** 共享只读资源(Python 运行环境、技能目录)所在目录,开发与生产共用 */
  15. sharedDir: path.resolve(env.AGENT_SERVER_SHARED_DIR ?? '/srv/agent-server'),
  16. /** 首次启动时的后台密码;未设置则随机生成并打印到日志 */
  17. adminPassword: env.AGENT_SERVER_ADMIN_PASSWORD,
  18. /** 后台静态资源目录(生产部署时由服务托管) */
  19. adminDist: env.AGENT_SERVER_ADMIN_DIST,
  20. /** 业务平台 SDK 包目录(默认为后台静态资源旁边的 sdk 目录) */
  21. sdkDist: env.AGENT_SERVER_SDK_DIST,
  22. /**
  23. * 信任哪些反向代理的 X-Forwarded-* 头:未设置或 false 为不信任;true 为信任所有来源(仅在服务只能经由代理访问时使用);
  24. * 也可以是逗号分隔的代理 IP / CIDR(推荐),只信任来自这些地址的转发信息,直接访问的客户端无法伪造
  25. */
  26. trustProxy: parseTrustProxy(env.AGENT_SERVER_TRUST_PROXY),
  27. home: os.homedir(),
  28. isDev,
  29. logLevel: env.LOG_LEVEL ?? 'info',
  30. }
  31. /** 引擎访问 MCP Gateway 的地址(引擎与服务在同一台机器上) */
  32. export const gatewayUrl = () => `http://127.0.0.1:${config.port}/mcp`
  33. /** 服务版本(概览页与 API 协议文档中显示) */
  34. export const APP_VERSION = '0.1.0'
  35. export const dbPath = () => path.join(config.dataDir, 'data', 'agent.db')
  36. /**
  37. * 服务管理的技能生效目录:服务可写、Agent 只读(ADR-0022)。单独放在顶层,不与数据库等放在 data 下;
  38. * 这里只放生效的技能,文件库、上传暂存与目录缓存仍在 data 下(Agent 不可见)
  39. */
  40. export const managedSkillsDir = () => path.join(config.dataDir, 'managed-skills')
  41. /** 第三方技能目录(Claude 插件格式,两个引擎共用,ADR-0017) */
  42. export const communitySkillsDir = () => path.join(managedSkillsDir(), 'community')
  43. /** 自定义技能:生效目录(Claude 插件格式,两个引擎共用)、按内容寻址的文件库、上传的 zip 解压目录(docs/design/12-custom-skills.md) */
  44. export const customSkillsDir = () => path.join(managedSkillsDir(), 'custom')
  45. export const customSkillStoreDir = () => path.join(config.dataDir, 'data', 'custom-skill-store')
  46. export const skillUploadsDir = () => path.join(config.dataDir, 'data', 'skill-uploads')
  47. function parseTrustProxy(v: string | undefined): boolean | string[] {
  48. if (!v || v === 'false') return false
  49. if (v === 'true') return true
  50. return v.split(',').map(s => s.trim()).filter(Boolean)
  51. }