{"_id":"@ai-configs/core","_rev":"5-bbc671f89e33e3fd4ab76d8c2662ccee","name":"@ai-configs/core","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"name":"@ai-configs/core","version":"0.1.0","keywords":["ai","llm","openai","anthropic","claude","deepseek","multimodal","browser"],"license":"MIT","_id":"@ai-configs/core@0.1.0","maintainers":[{"name":"spacex110","email":"my.coin.110.110@gmail.com"}],"dist":{"shasum":"d1b19a8e50c4a9e614a74fb102447e1d725dcd4c","tarball":"https://registry.npmjs.org/@ai-configs/core/-/core-0.1.0.tgz","fileCount":89,"integrity":"sha512-wsvJYeZwzEZHfK3etq9cPRt+QXsRvNzOwcb/woTlwDeU+msc+bXnayalQdlyBNkaz/IqavfPaCXJ7sn0mg/aLQ==","signatures":[{"sig":"MEUCIQCQuKvS2TqZWV2DcW3UUsAGY5VgZZzlr/1iizS7MohuSQIgCQbTrb9R87I7DgPRWa1cERXa8IOM5dM1NIBlZdH+KwE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":893842},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./ui":{"types":"./dist/ui.d.ts","import":"./dist/ui.js"},"./styles.css":"./dist/styles.css"},"gitHead":"1b3b15866bb4b42d82d3d1068c9e34d672e38643","scripts":{"dev":"vite","test":"vitest run","build":"vite build","build:lib":"vite build --mode lib","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"spacex110","email":"my.coin.110.110@gmail.com"},"_npmVersion":"10.9.8","description":"浏览器端 AI 大模型统一配置与调用库（多模态）","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^3.23.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","vite":"^6.0.0","vitest":"^2.1.0","happy-dom":"^16.0.0","typescript":"^5.7.0","@types/node":"^22.10.0","vite-plugin-dts":"^4.4.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.0_1783675354979_0.3168993211830602","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@ai-configs/core","version":"0.1.1","keywords":["ai","llm","openai","anthropic","claude","deepseek","multimodal","browser"],"license":"MIT","_id":"@ai-configs/core@0.1.1","maintainers":[{"name":"spacex110","email":"my.coin.110.110@gmail.com"}],"dist":{"shasum":"14d05ebff451f210ce9181a2379a47137c5344a1","tarball":"https://registry.npmjs.org/@ai-configs/core/-/core-0.1.1.tgz","fileCount":89,"integrity":"sha512-ayumTroEhjvnUFwzItCluIk5T5HdnYFfN+hg4JxXQHYytNxgtDFPrqUdbWlEsPW8mYWbdk3DsnDipv7SckR5KA==","signatures":[{"sig":"MEUCIQDRThCdXI99WUAtUvY6+9SjE/bwcqZ+xivnm+suAuonDwIgQfb9zH1ix37kZTByGI85vzp8zfwPpMyORin3X8PdWiA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":893729},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./ui":{"types":"./dist/ui.d.ts","import":"./dist/ui.js"},"./styles.css":"./dist/styles.css"},"gitHead":"1b3b15866bb4b42d82d3d1068c9e34d672e38643","scripts":{"dev":"vite","test":"vitest run","build":"vite build","build:lib":"vite build --mode lib","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"spacex110","email":"my.coin.110.110@gmail.com"},"_npmVersion":"10.9.8","description":"浏览器端 AI 大模型统一配置与调用库（多模态）","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^3.23.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","vite":"^6.0.0","vitest":"^2.1.0","happy-dom":"^16.0.0","typescript":"^5.7.0","@types/node":"^22.10.0","vite-plugin-dts":"^4.4.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.1_1783846928182_0.37051990662284284","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@ai-configs/core","version":"0.1.2","keywords":["ai","llm","openai","anthropic","claude","deepseek","multimodal","browser"],"license":"MIT","_id":"@ai-configs/core@0.1.2","maintainers":[{"name":"spacex110","email":"my.coin.110.110@gmail.com"}],"dist":{"shasum":"5c54a58ae91acec7dc732f7575b3d89aaa495b98","tarball":"https://registry.npmjs.org/@ai-configs/core/-/core-0.1.2.tgz","fileCount":89,"integrity":"sha512-O9yWQZa3n7KT6MVHX19uPOBYinJFxkQtqUw7KllP/Pj46uO9DyXWkk5iAIuJrP32RvllMhMIou5vIvNilgL+LA==","signatures":[{"sig":"MEYCIQDs2IMD8j5IVilQQ7XQNhZfsYJsmMsTZRc68F5UBuzj0QIhAN+Be3G9dGrpK/BYpwn+PIkYesWQ1jVcwkt+QquppDWg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":893829},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./ui":{"types":"./dist/ui.d.ts","import":"./dist/ui.js"},"./styles.css":"./dist/styles.css"},"gitHead":"1b3b15866bb4b42d82d3d1068c9e34d672e38643","scripts":{"dev":"vite","test":"vitest run","build":"vite build","build:lib":"vite build --mode lib","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"spacex110","email":"my.coin.110.110@gmail.com"},"_npmVersion":"10.9.8","description":"浏览器端 AI 大模型统一配置与调用库（多模态）","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^3.23.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","vite":"^6.0.0","vitest":"^2.1.0","happy-dom":"^16.0.0","typescript":"^5.7.0","@types/node":"^22.10.0","vite-plugin-dts":"^4.4.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.2_1783847490551_0.8103009558262451","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@ai-configs/core","version":"0.1.3","keywords":["ai","llm","openai","anthropic","claude","deepseek","multimodal","browser"],"license":"MIT","_id":"@ai-configs/core@0.1.3","maintainers":[{"name":"spacex110","email":"my.coin.110.110@gmail.com"}],"dist":{"shasum":"acd206c0e5aff70c380427b03b9ff13dc8e2fadc","tarball":"https://registry.npmjs.org/@ai-configs/core/-/core-0.1.3.tgz","fileCount":89,"integrity":"sha512-GDLyIlyKCIh2dygElC8SrV3uzd44/FIR26bJ6F2eOG9ibqO0iCTRJwG8O3XSqVIyA5B3vQYGS4G6L+5LsXuJdw==","signatures":[{"sig":"MEUCIEPTlqJ2mv1jxMh2Zjra6ssW86ADnMTpIkc/sY+09kEZAiEA+R6mwJ8nU+5M0/+HRpLvSNVv9bMpv5Y373lkB35X2/0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":894507},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./ui":{"types":"./dist/ui.d.ts","import":"./dist/ui.js"},"./styles.css":"./dist/styles.css"},"gitHead":"1b3b15866bb4b42d82d3d1068c9e34d672e38643","scripts":{"dev":"vite","test":"vitest run","build":"vite build","build:lib":"vite build --mode lib","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"spacex110","email":"my.coin.110.110@gmail.com"},"_npmVersion":"10.9.8","description":"浏览器端 AI 大模型统一配置与调用库（多模态）","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^3.23.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","vite":"^6.0.0","vitest":"^2.1.0","happy-dom":"^16.0.0","typescript":"^5.7.0","@types/node":"^22.10.0","vite-plugin-dts":"^4.4.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.3_1783847663974_0.2652861054108482","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@ai-configs/core","version":"0.1.4","description":"浏览器端 AI 大模型统一配置与调用库（多模态）","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./ui":{"types":"./dist/ui.d.ts","import":"./dist/ui.js"},"./styles.css":"./dist/styles.css"},"scripts":{"dev":"vite","build":"vite build","build:lib":"vite build --mode lib","test":"vitest run","test:watch":"vitest","typecheck":"tsc --noEmit"},"keywords":["ai","llm","openai","anthropic","claude","deepseek","multimodal","browser"],"license":"MIT","devDependencies":{"@types/node":"^22.10.0","@vitest/coverage-v8":"^2.1.0","happy-dom":"^16.0.0","typescript":"^5.7.0","vite":"^6.0.0","vite-plugin-dts":"^4.4.0","vitest":"^2.1.0","zod":"^3.23.0"},"dependencies":{"zod":"^3.23.0"},"_id":"@ai-configs/core@0.1.4","gitHead":"1b3b15866bb4b42d82d3d1068c9e34d672e38643","_nodeVersion":"22.22.3","_npmVersion":"10.9.8","dist":{"integrity":"sha512-mnEi5Srhgi/097WUVh9ZVxFo7HzEJK6HF9zo/DCcZNf+7Lyq/bSEMjsyZhR27kC4cLZ3Un4mM+POiPoO+fPT2g==","shasum":"827dad6c2402092b364837c6fdf27bc7dce71711","tarball":"https://registry.npmjs.org/@ai-configs/core/-/core-0.1.4.tgz","fileCount":89,"unpackedSize":895826,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIB7+VNmOi+E4eLexqk19vUxBKh1yOGqKCxaxT7PS2EFdAiBnvJkmoa+Air7hXLBrAHZKJwUpvnzowJtZFQCPNo5xZw=="}]},"_npmUser":{"name":"spacex110","email":"my.coin.110.110@gmail.com"},"directories":{},"maintainers":[{"name":"spacex110","email":"my.coin.110.110@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/core_0.1.4_1783847914563_0.35687530873190654"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-10T09:22:34.793Z","modified":"2026-07-12T09:18:34.863Z","0.1.0":"2026-07-10T09:22:35.133Z","0.1.1":"2026-07-12T09:02:08.309Z","0.1.2":"2026-07-12T09:11:30.721Z","0.1.3":"2026-07-12T09:14:24.172Z","0.1.4":"2026-07-12T09:18:34.715Z"},"license":"MIT","keywords":["ai","llm","openai","anthropic","claude","deepseek","multimodal","browser"],"description":"浏览器端 AI 大模型统一配置与调用库（多模态）","maintainers":[{"name":"spacex110","email":"my.coin.110.110@gmail.com"}],"readme":"# @ai-configs/core\n\n浏览器端 AI 大模型统一配置与调用库，支持多 Provider（OpenAI / Anthropic / DeepSeek / MiniMax 等）、多模型、多模态能力（聊天、文生图、图生图、TTS、STT、Vision），开箱即用的可视化配置面板。\n\n---\n\n## 安装\n\n```bash\nnpm install @ai-configs/core\n# 或\npnpm add @ai-configs/core\n```\n\n---\n\n## 快速开始\n\n### 1. 初始化客户端\n\n```ts\nimport { createAIClient } from '@ai-configs/core';\n\nconst ai = createAIClient({ projectId: 'my-app' });\n```\n\n**AIClientOptions：**\n\n| 选项 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `projectId` | `string` | `''` | 项目 ID，多项目时用于切换配置 |\n| `defaultModel` | `string` | `''` | 默认模型，不填则使用项目配置的默认模型 |\n| `proxyUrl` | `string` | `''` | 全局 CORS 代理前缀（如 `https://your-proxy.com/`），适配浏览器直接调用各 Provider |\n| `encryptionKey` | `string` | - | API Key 加密密码，开启后敏感信息会本地 AES-GCM 加密存储 |\n| `cacheTtlMs` | `number` | `5 * 60_000` | 适配器缓存 TTL（毫秒），避免频繁重建 |\n| `fetchImpl` | `typeof fetch` | `globalThis.fetch` | 自定义 fetch，可注入测试桩或中间件 |\n\n### 2. 发起聊天\n\n```ts\n// 单次对话\nconst res = await ai.chat({\n  model: 'gpt-4o-mini',         // 模型名，不填使用 defaultModel\n  messages: [\n    { role: 'user', content: '你好' },\n  ],\n});\nconsole.log(res.content);\n\n// 流式对话\nfor await (const chunk of ai.streamChat({\n  model: 'claude-3-5-sonnet',\n  messages: [{ role: 'user', content: '讲个故事' }],\n})) {\n  process.stdout.write(chunk.content);  // chunk.content 为增量内容\n}\n```\n\n### 3. 多模态能力\n\n```ts\n// 图片生成\nconst imgRes = await ai.generateImage({\n  model: 'minimax/Image-01',\n  prompt: 'A cat in space, oil painting',\n  n: 1,\n  size: '1024x1024',\n});\nconsole.log(imgRes.images[0].url);\n\n// 图生图（主体参考）\nconst i2iRes = await ai.generateImage({\n  model: 'minimax/Image-01',\n  prompt: '去掉图片中的手写文字',\n  subjectReference: [{ type: 'character', imageFile: 'https://example.com/input.jpg' }],\n});\n\n// TTS（语音合成）\nconst ttsRes = await ai.speech({\n  model: 'speech-02-hd',\n  input: '今天是不是很开心呀(laughs)',\n  voice: 'alloy',\n  speed: 1.0,\n  extra: { emotion: 'happy' },  // MiniMax 模型支持情感参数\n});\nconst audioUrl = URL.createObjectURL(ttsRes.audio);\n\n// STT（语音转写）\nconst sttRes = await ai.transcribe({\n  model: 'speech-01',\n  file: audioFile,  // File 对象或 Blob\n});\nconsole.log(sttRes.text);\n\n// Vision（图片理解）\nconst visionRes = await ai.chat({\n  model: 'gpt-4o-mini',\n  messages: [{\n    role: 'user',\n    content: [\n      { type: 'text', text: '请用一句话描述这张图片。' },\n      { type: 'image_url', image_url: { url: 'https://example.com/photo.jpg' } },\n    ],\n  }],\n});\nconsole.log(visionRes.content);\n```\n\n---\n\n## 配置面板\n\n内置可视化配置面板，无需手动调用配置 API。\n\n```ts\nimport { showConfigPanel } from '@ai-configs/core';\n\n// 方式一：在页面任意位置渲染浮动按钮，点击展开面板\nshowConfigPanel({ trigger: 'floating-button' });\n\n// 方式二：直接渲染面板到指定 DOM 节点（不创建浮动按钮）\nshowConfigPanel({ trigger: 'inline', mount: document.getElementById('my-panel') });\n\n// 方式三：直接展开面板（跳过按钮）\nshowConfigPanel({ initialOpen: true });\n```\n\n面板支持：\n- 添加 / 编辑 / 删除 Provider（API Key、Base URL）\n- 添加 / 编辑 / 删除 Model（模型 ID、上下文窗口、价格等）\n- 设置默认模型、限流策略\n- 导入 / 导出配置 JSON\n- 一键从预设添加 Provider（OpenAI / DeepSeek / MiniMax / Ollama 等）\n\n---\n\n## 配置管理 API\n\n所有配置变更实时自动持久化到 `localStorage`。\n\n```ts\n// 切换项目\nai.config.switchProject('project-id');\n\n// 添加 Provider（手动）\nconst provider = await ai.config.addProvider({\n  name: 'openai',\n  displayName: 'OpenAI',\n  baseUrl: 'https://api.openai.com/v1',\n  apiKey: 'sk-...',\n  enabled: true,\n});\n\n// 从预设快速添加（自动拉取推荐模型）\nconst p = await ai.config.addProviderFromPreset('openai', 'sk-...');\n// addProviderFromPreset 会自动：\n//   1. 创建 Provider\n//   2. 添加预设推荐模型\n//   3. 尝试同步远程模型（失败静默，不阻塞）\n\n// 同步远程模型列表（拉取 Provider 上的完整模型清单）\nconst result = await ai.config.syncRemoteModels(provider.id);\n// result.added    新增模型\n// result.skipped  已存在跳过\n\n// 列出所有模型（过滤禁用）\nconst models = ai.config.listModels().filter(m => m.enabled);\n\n// 导出 / 导入配置\nconst json = ai.config.exportJson();\nai.config.importJson(json);\n\n// 设置加密密码（启用后所有 API Key 会 AES-GCM 加密存储）\nai.config.setEncryptionKey('your-password');\n\n// 数据迁移（幂等，自动修复已知历史问题如旧 baseUrl）\nconst migration = ai.config.migrateStore();\nif (migration.migrated > 0) {\n  console.log('迁移详情:', migration.details);\n}\n```\n\n---\n\n## 高级：自定义 Provider 适配器\n\n如需接入本库未支持的 Provider，可通过 `CustomAdapter` 实现任意 HTTP 接口：\n\n```ts\nimport { createAIClient, CustomAdapter } from '@ai-configs/core';\nimport { registerAdapter } from '@ai-configs/core/adapters/registry';\n\nconst ai = createAIClient();\n\n// 注册自定义适配器（注册后可通过模型名自动路由）\nregisterAdapter('my-provider', 'my-model', async (ctx) => ({\n  chat: async (params) => {\n    const response = await fetch('https://your-api.com/chat', {\n      method: 'POST',\n      headers: {\n        'Authorization': `Bearer ${ctx.provider.apiKey}`,\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({\n        model: params.model,\n        messages: params.messages,\n        stream: params.stream,\n      }),\n    });\n\n    if (params.stream) {\n      // 返回流式 chunks\n      return (async function* () {\n        const reader = response.body!.getReader();\n        const decoder = new TextDecoder();\n        while (true) {\n          const { done, value } = await reader.read();\n          if (done) break;\n          const chunk = decoder.decode(value);\n          // 解析 SSE / data: ... 格式，按 Provider 实际格式实现\n          yield { content: parseChunk(chunk), usage: null, finishReason: null };\n        }\n      })();\n    }\n\n    const data = await response.json();\n    return { content: data.choices[0].message.content, usage: null, finishReason: null };\n  },\n}));\n```\n\n`CustomAdapter` 返回的对象结构请参考 [src/adapters/base.ts](./src/adapters/base.ts) 中的 `AdapterInstance` 接口。\n\n---\n\n## 错误处理\n\n所有 API 抛出的错误为 `AIError` 类型：\n\n```ts\nimport { createAIClient, AIError } from '@ai-configs/core';\n\ntry {\n  await ai.chat({ model: 'nonexistent', messages: [] });\n} catch (err) {\n  if (err instanceof AIError) {\n    console.error(err.code, err.message);\n    // 常见错误码：\n    // MODEL_NOT_FOUND   模型不存在或已禁用\n    // PROVIDER_NOT_FOUND Provider 已禁用\n    // RATE_LIMITED      触发 RPM/RPD 限流\n    // INVALID_PARAMS    参数错误（如未指定模型且无默认模型）\n    // NETWORK_ERROR     网络错误（可能需要配置 proxyUrl）\n  }\n}\n```\n\n---\n\n## 在 React/Vue 等框架中使用\n\n本库**纯 ESM，无框架依赖**，可在任何现代前端项目中直接使用。\n\n```ts\n// React 示例\nimport { createAIClient } from '@ai-configs/core';\nimport { useState, useEffect } from 'react';\n\nconst ai = createAIClient({ projectId: 'my-react-app' });\n\nfunction ChatComponent() {\n  const [messages, setMessages] = useState([]);\n  const [input, setInput] = useState('');\n\n  const send = async () => {\n    const res = await ai.chat({\n      model: 'gpt-4o-mini',\n      messages: [...messages, { role: 'user', content: input }],\n    });\n    setMessages(prev => [...prev, { role: 'user', content: input }, { role: 'assistant', content: res.content }]);\n    setInput('');\n  };\n\n  return (\n    <div>\n      {/* 实现略 */}\n    </div>\n  );\n}\n```\n\n---\n\n## 打包与发布（库模式）\n\n如果要将本库作为独立 npm 包发布：\n\n```bash\nnpm run build:lib\n```\n\n输出：\n- `dist/index.js` — ESM\n- `dist/index.cjs` — CommonJS\n- `dist/index.d.ts` — TypeScript 声明\n- `dist/ui.js` — UI 模块（按需引入，不打入主包）\n- `dist/styles.css` — UI 样式\n\n---\n\n## 目录结构\n\n```\nsrc/\n├── client.ts          # AIClient 主类，唯一业务入口\n├── index.ts           # 主入口，导出所有公开 API\n├── errors.ts          # AIError 错误类\n├── adapters/          # Provider 适配器\n│   ├── base.ts        # 适配器基类\n│   ├── openai.ts      # OpenAI 兼容格式适配器\n│   ├── anthropic.ts   # Anthropic 格式适配器\n│   ├── minimax.ts     # MiniMax 格式适配器\n│   ├── custom.ts      # 自定义 HTTP 适配器\n│   ├── presets.ts     # Provider 预设配置\n│   └── registry.ts    # 适配器注册表\n├── config/            # 配置管理\n│   ├── manager.ts     # 配置增删改查 API\n│   ├── store.ts       # localStorage 持久化\n│   ├── schema.ts      # 配置 schema 校验\n│   └── migrate.ts     # 历史数据迁移\n├── crypto/            # AES-GCM 加密（API Key 敏感信息）\n├── http/              # HTTP 请求封装（带代理支持）\n├── types/             # TypeScript 类型定义\n│   ├── chat.ts        # 聊天 / 图片 / TTS / STT 等 API 类型\n│   ├── store.ts       # 配置存储类型（Provider / Model / Project）\n│   └── tool.ts        # Tool / Function calling 类型\n└── ui/                # 可视化配置面板\n    └── panel.ts       # 面板入口\n```\n","readmeFilename":"README.md"}