@vibeapi/api-helper 0.0.15 → 0.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/cli.js +1 -17
  2. package/dist/commands/auth.js +1 -119
  3. package/dist/commands/auth.js.map +1 -1
  4. package/dist/commands/config.js +1 -130
  5. package/dist/commands/doctor.js +1 -105
  6. package/dist/commands/doctor.js.map +1 -1
  7. package/dist/commands/index.js +1 -5
  8. package/dist/commands/lang.js +1 -28
  9. package/dist/index.js +1 -10
  10. package/dist/lib/api-validator.js +1 -79
  11. package/dist/lib/claude-code-manager.js +1 -269
  12. package/dist/lib/claude-code-manager.js.map +1 -1
  13. package/dist/lib/command.js +1 -175
  14. package/dist/lib/config.d.ts +1 -6
  15. package/dist/lib/config.js +1 -233
  16. package/dist/lib/config.js.map +1 -1
  17. package/dist/lib/i18n.js +1 -149
  18. package/dist/lib/model-registry.d.ts +20 -0
  19. package/dist/lib/model-registry.js +1 -0
  20. package/dist/lib/model-registry.js.map +1 -0
  21. package/dist/lib/opencode-manager.js +1 -134
  22. package/dist/lib/settings-template.d.ts +6 -0
  23. package/dist/lib/settings-template.js +1 -0
  24. package/dist/lib/settings-template.js.map +1 -0
  25. package/dist/lib/tool-manager.js +1 -280
  26. package/dist/lib/tool-manager.js.map +1 -1
  27. package/dist/lib/wizard.d.ts +3 -3
  28. package/dist/lib/wizard.js +1 -625
  29. package/dist/lib/wizard.js.map +1 -1
  30. package/dist/locales/en_US.json +9 -7
  31. package/dist/locales/zh_CN.json +8 -6
  32. package/dist/models.json +44 -0
  33. package/dist/settings-template.json +12 -0
  34. package/dist/utils/logger.js +1 -202
  35. package/dist/utils/string-width.js +1 -131
  36. package/models.json +44 -0
  37. package/package.json +75 -73
  38. package/settings-template.json +12 -0
@@ -1,233 +1 @@
1
- import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync, unlinkSync, readdirSync, statSync } from 'fs';
2
- import { join } from 'path';
3
- import { homedir } from 'os';
4
- import * as yaml from 'js-yaml';
5
- import { logger } from '../utils/logger.js';
6
- export const DEFAULT_BASE_URL = 'https://www.vibeapi.cn';
7
- export const DEFAULT_MODELS = {
8
- haiku: 'claude-haiku-4-5-20251001',
9
- sonnet: 'claude-sonnet-4-6',
10
- opus: 'claude-opus-4-6',
11
- reasoning: 'claude-opus-4-6'
12
- };
13
- export class ConfigManager {
14
- static instance;
15
- configDir;
16
- configPath;
17
- config;
18
- runtimeBaseUrl;
19
- constructor() {
20
- // chelper 配置文件路径(跨平台支持)
21
- // - macOS/Linux: ~/.chelper/config.yaml
22
- // - Windows: %USERPROFILE%\.chelper\config.yaml
23
- // (例如: C:\Users\username\.chelper\config.yaml)
24
- this.configDir = this.getConfigDir();
25
- this.configPath = join(this.configDir, 'config.yaml');
26
- this.config = this.loadConfig();
27
- }
28
- /**
29
- * 获取配置目录路径,支持环境变量覆盖
30
- */
31
- getConfigDir() {
32
- // 支持环境变量覆盖
33
- const customDir = process.env.CHELPER_CONFIG_DIR;
34
- if (customDir && customDir.trim()) {
35
- return customDir.trim();
36
- }
37
- // 支持测试环境
38
- const testHome = process.env.CHELPER_TEST_HOME;
39
- if (testHome && testHome.trim()) {
40
- return join(testHome.trim(), '.chelper');
41
- }
42
- return join(homedir(), '.chelper');
43
- }
44
- static getInstance() {
45
- if (!ConfigManager.instance) {
46
- ConfigManager.instance = new ConfigManager();
47
- }
48
- return ConfigManager.instance;
49
- }
50
- ensureConfigDir() {
51
- if (!existsSync(this.configDir)) {
52
- mkdirSync(this.configDir, { recursive: true });
53
- }
54
- }
55
- loadConfig() {
56
- try {
57
- if (existsSync(this.configPath)) {
58
- const fileContent = readFileSync(this.configPath, 'utf-8');
59
- const config = yaml.load(fileContent);
60
- const migratedConfig = this.migrateOldConfig(config || { lang: 'en_US' });
61
- // 如果配置被迁移,保存新配置
62
- if (this.needsMigration(config)) {
63
- this.backupConfig();
64
- this.atomicWrite(this.configPath, yaml.dump(migratedConfig));
65
- }
66
- return migratedConfig;
67
- }
68
- }
69
- catch (error) {
70
- console.warn('Failed to load config, using defaults:', error);
71
- logger.logError('ConfigManager.loadConfig', error);
72
- }
73
- return { lang: 'en_US' };
74
- }
75
- /**
76
- * 检查配置是否需要迁移
77
- */
78
- needsMigration(config) {
79
- return config && 'plan' in config;
80
- }
81
- /**
82
- * 迁移旧配置格式
83
- */
84
- migrateOldConfig(config) {
85
- if (config.plan) {
86
- // 迁移旧配置,删除 plan 字段,添加 models 默认值
87
- const { plan, ...rest } = config;
88
- return {
89
- ...rest,
90
- lang: config.lang || 'en_US',
91
- api_key: config.api_key,
92
- models: DEFAULT_MODELS
93
- };
94
- }
95
- return config;
96
- }
97
- /**
98
- * 原子写入文件
99
- */
100
- atomicWrite(path, content) {
101
- const tempPath = `${path}.tmp`;
102
- try {
103
- writeFileSync(tempPath, content, 'utf-8');
104
- renameSync(tempPath, path);
105
- }
106
- catch (error) {
107
- // 清理临时文件
108
- if (existsSync(tempPath)) {
109
- try {
110
- unlinkSync(tempPath);
111
- }
112
- catch {
113
- // 忽略清理错误
114
- }
115
- }
116
- throw error;
117
- }
118
- }
119
- /**
120
- * 备份当前配置
121
- */
122
- backupConfig() {
123
- if (!existsSync(this.configPath)) {
124
- return;
125
- }
126
- const backupDir = join(this.configDir, 'backups');
127
- if (!existsSync(backupDir)) {
128
- mkdirSync(backupDir, { recursive: true });
129
- }
130
- const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
131
- const backupPath = join(backupDir, `config-${timestamp}.yaml`);
132
- try {
133
- const content = readFileSync(this.configPath, 'utf-8');
134
- writeFileSync(backupPath, content, 'utf-8');
135
- // 保留最近 10 个备份
136
- this.rotateBackups(backupDir, 10);
137
- }
138
- catch (error) {
139
- logger.logError('ConfigManager.backupConfig', error);
140
- }
141
- }
142
- /**
143
- * 轮转备份文件,保留最近的 N 个
144
- */
145
- rotateBackups(backupDir, maxBackups) {
146
- try {
147
- const files = readdirSync(backupDir)
148
- .filter(f => f.startsWith('config-') && f.endsWith('.yaml'))
149
- .map(f => ({
150
- name: f,
151
- path: join(backupDir, f),
152
- mtime: statSync(join(backupDir, f)).mtime
153
- }))
154
- .sort((a, b) => b.mtime.getTime() - a.mtime.getTime());
155
- // 删除超出数量的旧备份
156
- files.slice(maxBackups).forEach(file => {
157
- try {
158
- unlinkSync(file.path);
159
- }
160
- catch (error) {
161
- logger.logError('ConfigManager.rotateBackups', error);
162
- }
163
- });
164
- }
165
- catch (error) {
166
- logger.logError('ConfigManager.rotateBackups', error);
167
- }
168
- }
169
- saveConfig(config) {
170
- try {
171
- this.ensureConfigDir();
172
- this.backupConfig(); // 保存前先备份
173
- const configToSave = config || this.config;
174
- const yamlContent = yaml.dump(configToSave);
175
- this.atomicWrite(this.configPath, yamlContent);
176
- this.config = configToSave;
177
- }
178
- catch (error) {
179
- console.error('Failed to save config:', error);
180
- logger.logError('ConfigManager.saveConfig', error);
181
- throw error;
182
- }
183
- }
184
- getConfig() {
185
- return { ...this.config };
186
- }
187
- updateConfig(updates) {
188
- this.config = { ...this.config, ...updates };
189
- this.saveConfig();
190
- }
191
- isFirstRun() {
192
- return !existsSync(this.configPath);
193
- }
194
- getLang() {
195
- return this.config.lang || 'en_US';
196
- }
197
- setLang(lang) {
198
- this.updateConfig({ lang });
199
- }
200
- getApiKey() {
201
- return this.config.api_key;
202
- }
203
- setApiKey(apiKey) {
204
- this.updateConfig({ api_key: apiKey });
205
- }
206
- revokeApiKey() {
207
- this.updateConfig({ api_key: undefined });
208
- }
209
- getModels() {
210
- return this.config.models || DEFAULT_MODELS;
211
- }
212
- setModels(models) {
213
- this.updateConfig({ models });
214
- }
215
- updateModels(partial) {
216
- const currentModels = this.getModels();
217
- const updatedModels = {
218
- haiku: partial.haiku ?? currentModels.haiku,
219
- sonnet: partial.sonnet ?? currentModels.sonnet,
220
- opus: partial.opus ?? currentModels.opus,
221
- reasoning: partial.reasoning ?? currentModels.reasoning
222
- };
223
- this.updateConfig({ models: updatedModels });
224
- }
225
- getBaseUrl() {
226
- return this.runtimeBaseUrl || DEFAULT_BASE_URL;
227
- }
228
- setBaseUrl(url) {
229
- this.runtimeBaseUrl = url;
230
- }
231
- }
232
- export const configManager = ConfigManager.getInstance();
233
- //# sourceMappingURL=config.js.map
1
+ import{existsSync as t,mkdirSync as i,readFileSync as n,writeFileSync as o,renameSync as e,unlinkSync as r,readdirSync as a,statSync as s}from"fs";import{join as g}from"path";import{homedir as c}from"os";import*as f from"js-yaml";import{logger as h}from"../utils/logger.js";import{getDefaultModels as u}from"./model-registry.js";export const DEFAULT_BASE_URL="https://www.vibeapi.cn";export const DEFAULT_MODELS=u();export class ConfigManager{static instance;configDir;configPath;config;runtimeBaseUrl;constructor(){this.configDir=this.getConfigDir(),this.configPath=g(this.configDir,"config.yaml"),this.config=this.loadConfig()}getConfigDir(){const t=process.env.CHELPER_CONFIG_DIR;if(t&&t.trim())return t.trim();const i=process.env.CHELPER_TEST_HOME;return i&&i.trim()?g(i.trim(),".chelper"):g(c(),".chelper")}static getInstance(){return ConfigManager.instance||(ConfigManager.instance=new ConfigManager),ConfigManager.instance}ensureConfigDir(){t(this.configDir)||i(this.configDir,{recursive:!0})}loadConfig(){try{if(t(this.configPath)){const t=n(this.configPath,"utf-8"),i=f.load(t),o=this.migrateOldConfig(i||{lang:"en_US"});return this.needsMigration(i)&&(this.backupConfig(),this.atomicWrite(this.configPath,f.dump(o))),o}}catch(t){console.warn("Failed to load config, using defaults:",t),h.logError("ConfigManager.loadConfig",t)}return{lang:"en_US"}}needsMigration(t){return t&&"plan"in t}migrateOldConfig(t){if(t.plan){const{plan:i,...n}=t;return{...n,lang:t.lang||"en_US",api_key:t.api_key,models:DEFAULT_MODELS}}return t}atomicWrite(i,n){const a=`${i}.tmp`;try{o(a,n,"utf-8"),e(a,i)}catch(i){if(t(a))try{r(a)}catch{}throw i}}backupConfig(){if(!t(this.configPath))return;const e=g(this.configDir,"backups");t(e)||i(e,{recursive:!0});const r=(new Date).toISOString().replace(/[:.]/g,"-"),a=g(e,`config-${r}.yaml`);try{const t=n(this.configPath,"utf-8");o(a,t,"utf-8"),this.rotateBackups(e,10)}catch(t){h.logError("ConfigManager.backupConfig",t)}}rotateBackups(t,i){try{a(t).filter(t=>t.startsWith("config-")&&t.endsWith(".yaml")).map(i=>({name:i,path:g(t,i),mtime:s(g(t,i)).mtime})).sort((t,i)=>i.mtime.getTime()-t.mtime.getTime()).slice(i).forEach(t=>{try{r(t.path)}catch(t){h.logError("ConfigManager.rotateBackups",t)}})}catch(t){h.logError("ConfigManager.rotateBackups",t)}}saveConfig(t){try{this.ensureConfigDir(),this.backupConfig();const i=t||this.config,n=f.dump(i);this.atomicWrite(this.configPath,n),this.config=i}catch(t){throw console.error("Failed to save config:",t),h.logError("ConfigManager.saveConfig",t),t}}getConfig(){return{...this.config}}updateConfig(t){this.config={...this.config,...t},this.saveConfig()}isFirstRun(){return!t(this.configPath)}getLang(){return this.config.lang||"en_US"}setLang(t){this.updateConfig({lang:t})}getApiKey(){return this.config.api_key}setApiKey(t){this.updateConfig({api_key:t})}revokeApiKey(){this.updateConfig({api_key:void 0})}getModels(){return this.config.models||DEFAULT_MODELS}setModels(t){this.updateConfig({models:t})}updateModels(t){const i=this.getModels(),n={haiku:t.haiku??i.haiku,sonnet:t.sonnet??i.sonnet,opus:t.opus??i.opus,reasoning:t.reasoning??i.reasoning};this.updateConfig({models:n})}getBaseUrl(){return this.runtimeBaseUrl||DEFAULT_BASE_URL}setBaseUrl(t){this.runtimeBaseUrl=t}}export const configManager=ConfigManager.getInstance();
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
package/dist/lib/i18n.js CHANGED
@@ -1,149 +1 @@
1
- import { readFileSync, existsSync, readdirSync } from 'fs';
2
- import { join, dirname } from 'path';
3
- import { fileURLToPath } from 'url';
4
- class I18n {
5
- static instance;
6
- currentLocale = 'en_US';
7
- translations = new Map();
8
- fallbackLocale = 'en_US';
9
- localesDir;
10
- constructor() {
11
- // Determine the locales directory path
12
- const __filename = fileURLToPath(import.meta.url);
13
- const __dirname = dirname(__filename);
14
- // Both in development (src/lib/i18n.ts) and production (dist/lib/i18n.js),
15
- // locales is at the same relative path: lib -> parent -> locales
16
- this.localesDir = join(__dirname, '..', 'locales');
17
- this.loadTranslations();
18
- this.loadSavedLocale();
19
- }
20
- static getInstance() {
21
- if (!I18n.instance) {
22
- I18n.instance = new I18n();
23
- }
24
- return I18n.instance;
25
- }
26
- loadTranslations() {
27
- try {
28
- // Check if locales directory exists
29
- if (!existsSync(this.localesDir)) {
30
- console.warn(`Locales directory not found at ${this.localesDir}`);
31
- return;
32
- }
33
- // Get all JSON files in the locales directory
34
- const files = readdirSync(this.localesDir);
35
- const localeFiles = files.filter(file => file.endsWith('.json'));
36
- if (localeFiles.length === 0) {
37
- console.warn('No locale files found in locales directory');
38
- return;
39
- }
40
- // Load each locale file
41
- for (const file of localeFiles) {
42
- const locale = file.replace('.json', '');
43
- const filePath = join(this.localesDir, file);
44
- try {
45
- const fileContent = readFileSync(filePath, 'utf-8');
46
- const translations = JSON.parse(fileContent);
47
- this.translations.set(locale, translations);
48
- }
49
- catch (error) {
50
- console.warn(`Failed to load locale file ${file}:`, error);
51
- }
52
- }
53
- // Try to detect locale from environment
54
- const envLocale = process.env.LANG || process.env.LC_ALL || process.env.LC_MESSAGES;
55
- if (envLocale) {
56
- const localeCode = envLocale.split('.')[0].replace('_', '-');
57
- // First try exact match
58
- if (this.translations.has(localeCode)) {
59
- this.currentLocale = localeCode;
60
- }
61
- else {
62
- // Try language-only match (e.g., 'en' from 'en-US')
63
- const langOnly = localeCode.split('-')[0];
64
- const matchingLocale = Array.from(this.translations.keys()).find(key => key.startsWith(langOnly + '_'));
65
- if (matchingLocale) {
66
- this.currentLocale = matchingLocale;
67
- }
68
- else if (langOnly === 'zh') {
69
- // Fallback to zh_CN for Chinese
70
- this.currentLocale = 'zh_CN';
71
- }
72
- else if (langOnly === 'en') {
73
- // Fallback to en_US for English
74
- this.currentLocale = 'en_US';
75
- }
76
- }
77
- }
78
- }
79
- catch (error) {
80
- console.warn('Failed to load translations:', error);
81
- }
82
- }
83
- setLocale(locale) {
84
- if (this.translations.has(locale)) {
85
- this.currentLocale = locale;
86
- this.saveLocale();
87
- }
88
- else {
89
- console.warn(`Locale '${locale}' not supported, falling back to '${this.currentLocale}'`);
90
- }
91
- }
92
- getLocale() {
93
- return this.currentLocale;
94
- }
95
- getAvailableLocales() {
96
- return Array.from(this.translations.keys());
97
- }
98
- translate(key, params) {
99
- const keys = key.split('.');
100
- let translation = this.translations.get(this.currentLocale);
101
- for (const k of keys) {
102
- if (translation && typeof translation === 'object' && k in translation) {
103
- translation = translation[k];
104
- }
105
- else {
106
- // Fallback to fallback locale
107
- translation = this.translations.get(this.fallbackLocale);
108
- for (const fallbackKey of keys) {
109
- if (translation && typeof translation === 'object' && fallbackKey in translation) {
110
- translation = translation[fallbackKey];
111
- }
112
- else {
113
- return key; // Return key if translation not found
114
- }
115
- }
116
- break;
117
- }
118
- }
119
- if (typeof translation !== 'string') {
120
- return key;
121
- }
122
- // Replace parameters in the translation string
123
- if (params) {
124
- return translation.replace(/\{\{(\w+)\}\}/g, (match, param) => {
125
- return params[param] || match;
126
- });
127
- }
128
- return translation;
129
- }
130
- t(key, params) {
131
- return this.translate(key, params);
132
- }
133
- saveLocale() {
134
- // Language is now saved via ConfigManager
135
- // This method is kept for compatibility
136
- }
137
- loadSavedLocale() {
138
- // Language is now loaded via ConfigManager
139
- // This method is kept for compatibility
140
- }
141
- loadFromConfig(locale) {
142
- if (this.translations.has(locale)) {
143
- this.currentLocale = locale;
144
- }
145
- }
146
- }
147
- export const i18n = I18n.getInstance();
148
- export { i18n as I18n };
149
- //# sourceMappingURL=i18n.js.map
1
+ import{readFileSync as t,existsSync as s,readdirSync as e}from"fs";import{join as o,dirname as a}from"path";import{fileURLToPath as n}from"url";class r{static instance;currentLocale="en_US";translations=new Map;fallbackLocale="en_US";localesDir;constructor(){const t=n(import.meta.url),s=a(t);this.localesDir=o(s,"..","locales"),this.loadTranslations(),this.loadSavedLocale()}static getInstance(){return r.instance||(r.instance=new r),r.instance}loadTranslations(){try{if(!s(this.localesDir))return void console.warn(`Locales directory not found at ${this.localesDir}`);const a=e(this.localesDir).filter(t=>t.endsWith(".json"));if(0===a.length)return void console.warn("No locale files found in locales directory");for(const s of a){const e=s.replace(".json",""),a=o(this.localesDir,s);try{const s=t(a,"utf-8"),o=JSON.parse(s);this.translations.set(e,o)}catch(t){console.warn(`Failed to load locale file ${s}:`,t)}}const n=process.env.LANG||process.env.LC_ALL||process.env.LC_MESSAGES;if(n){const t=n.split(".")[0].replace("_","-");if(this.translations.has(t))this.currentLocale=t;else{const s=t.split("-")[0],e=Array.from(this.translations.keys()).find(t=>t.startsWith(s+"_"));e?this.currentLocale=e:"zh"===s?this.currentLocale="zh_CN":"en"===s&&(this.currentLocale="en_US")}}}catch(t){console.warn("Failed to load translations:",t)}}setLocale(t){this.translations.has(t)?(this.currentLocale=t,this.saveLocale()):console.warn(`Locale '${t}' not supported, falling back to '${this.currentLocale}'`)}getLocale(){return this.currentLocale}getAvailableLocales(){return Array.from(this.translations.keys())}translate(t,s){const e=t.split(".");let o=this.translations.get(this.currentLocale);for(const s of e){if(!o||"object"!=typeof o||!(s in o)){o=this.translations.get(this.fallbackLocale);for(const s of e){if(!o||"object"!=typeof o||!(s in o))return t;o=o[s]}break}o=o[s]}return"string"!=typeof o?t:s?o.replace(/\{\{(\w+)\}\}/g,(t,e)=>s[e]||t):o}t(t,s){return this.translate(t,s)}saveLocale(){}loadSavedLocale(){}loadFromConfig(t){this.translations.has(t)&&(this.currentLocale=t)}}export const i18n=r.getInstance();export{i18n as I18n};
@@ -0,0 +1,20 @@
1
+ export interface Models {
2
+ haiku: string;
3
+ sonnet: string;
4
+ opus: string;
5
+ reasoning: string;
6
+ }
7
+ export interface ModelPreset {
8
+ name: string;
9
+ model?: string;
10
+ models?: Models;
11
+ recommended?: boolean;
12
+ }
13
+ export interface ModelRegistryData {
14
+ defaultModels: Models;
15
+ presets: ModelPreset[];
16
+ }
17
+ export declare function getDefaultModels(): Models;
18
+ export declare function getPresets(): ModelPreset[];
19
+ export declare function resolvePreset(preset: ModelPreset): Models;
20
+ export declare function reloadRegistry(): void;
@@ -0,0 +1 @@
1
+ import{dirname as o,join as e}from"path";import{fileURLToPath as t}from"url";import{existsSync as r,readFileSync as n}from"fs";const s=o(t(import.meta.url));let l=null;function u(){return l||(l=function(){const o=[e(s,"..","..","models.json"),e(s,"..","models.json"),e(s,"models.json")];for(const e of o)if(r(e))return JSON.parse(n(e,"utf-8"));throw new Error(`models.json not found, searched: ${o.join(", ")}`)}()),l}export function getDefaultModels(){return{...u().defaultModels}}export function getPresets(){return[...u().presets]}export function resolvePreset(o){return o.models?{...o.models}:o.model?{haiku:o.model,sonnet:o.model,opus:o.model,reasoning:o.model}:getDefaultModels()}export function reloadRegistry(){l=null}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-registry.js","sourceRoot":"","sources":["../../src/lib/model-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAE9C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAqBtC,SAAS,gBAAgB;IACrB,MAAM,UAAU,GAAG;QACf,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC;QAC1C,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,aAAa,CAAC;QACpC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC;KACjC,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QACzB,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAChD,CAAC;IACL,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,oCAAoC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,IAAI,UAAU,GAA6B,IAAI,CAAC;AAEhD,SAAS,OAAO;IACZ,IAAI,CAAC,UAAU,EAAE,CAAC;QACd,UAAU,GAAG,gBAAgB,EAAE,CAAC;IACpC,CAAC;IACD,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC5B,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC,aAAa,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,UAAU;IACtB,OAAO,CAAC,GAAG,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAmB;IAC7C,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;IAChC,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,OAAO;YACH,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,KAAK;YACpB,IAAI,EAAE,MAAM,CAAC,KAAK;YAClB,SAAS,EAAE,MAAM,CAAC,KAAK;SAC1B,CAAC;IACN,CAAC;IACD,OAAO,gBAAgB,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,cAAc;IAC1B,UAAU,GAAG,IAAI,CAAC;AACtB,CAAC"}
@@ -1,134 +1 @@
1
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
2
- import { join, dirname } from 'path';
3
- import { homedir } from 'os';
4
- import { logger } from '../utils/logger.js';
5
- import { configManager, DEFAULT_MODELS } from './config.js';
6
- export class OpenCodeManager {
7
- static instance;
8
- configPath;
9
- constructor() {
10
- // OpenCode 配置文件路径
11
- // ~/.config/opencode/opencode.json
12
- this.configPath = join(homedir(), '.config', 'opencode', 'opencode.json');
13
- }
14
- static getInstance() {
15
- if (!OpenCodeManager.instance) {
16
- OpenCodeManager.instance = new OpenCodeManager();
17
- }
18
- return OpenCodeManager.instance;
19
- }
20
- /**
21
- * 确保配置目录存在
22
- */
23
- ensureConfigDir() {
24
- const dir = dirname(this.configPath);
25
- if (!existsSync(dir)) {
26
- mkdirSync(dir, { recursive: true });
27
- }
28
- }
29
- /**
30
- * 读取配置
31
- */
32
- getConfig() {
33
- try {
34
- if (existsSync(this.configPath)) {
35
- const content = readFileSync(this.configPath, 'utf-8');
36
- return JSON.parse(content);
37
- }
38
- }
39
- catch (error) {
40
- console.warn('Failed to read OpenCode config:', error);
41
- logger.logError('OpenCodeManager.getConfig', error);
42
- }
43
- return {};
44
- }
45
- /**
46
- * 保存配置
47
- */
48
- saveConfig(config) {
49
- try {
50
- this.ensureConfigDir();
51
- writeFileSync(this.configPath, JSON.stringify(config, null, 4), 'utf-8');
52
- }
53
- catch (error) {
54
- throw new Error(`Failed to save OpenCode config: ${error}`);
55
- }
56
- }
57
- /**
58
- * 加载私有 NewAPI 配置到 OpenCode
59
- */
60
- loadPrivateConfig(apiKey, models) {
61
- const currentConfig = this.getConfig();
62
- // 移除旧的 provider 配置(如果存在)
63
- const { provider: oldProvider, ...restConfig } = currentConfig;
64
- const newProvider = {};
65
- // 保留其他 provider(如果有的话),但移除旧的配置
66
- if (oldProvider) {
67
- for (const [key, value] of Object.entries(oldProvider)) {
68
- if (key !== 'private-newapi') {
69
- newProvider[key] = value;
70
- }
71
- }
72
- }
73
- // 添加新的 provider 配置
74
- newProvider['private-newapi'] = {
75
- options: {
76
- apiKey: apiKey,
77
- baseURL: configManager.getBaseUrl()
78
- }
79
- };
80
- const newConfig = {
81
- $schema: 'https://opencode.ai/config.json',
82
- ...restConfig,
83
- provider: newProvider,
84
- model: `private-newapi/${models.opus || DEFAULT_MODELS.opus}`,
85
- small_model: `private-newapi/${models.haiku || DEFAULT_MODELS.haiku}`
86
- };
87
- this.saveConfig(newConfig);
88
- }
89
- /**
90
- * 卸载私有配置
91
- */
92
- unloadPrivateConfig() {
93
- const currentConfig = this.getConfig();
94
- // 移除 provider 中的 private-newapi 配置
95
- if (currentConfig.provider) {
96
- delete currentConfig.provider['private-newapi'];
97
- // 如果 provider 为空,删除 provider 字段
98
- if (Object.keys(currentConfig.provider).length === 0) {
99
- delete currentConfig.provider;
100
- }
101
- }
102
- // 移除 model 和 small_model(如果是 private-newapi 的)
103
- if (currentConfig.model?.includes('private-newapi')) {
104
- delete currentConfig.model;
105
- }
106
- if (currentConfig.small_model?.includes('private-newapi')) {
107
- delete currentConfig.small_model;
108
- }
109
- this.saveConfig(currentConfig);
110
- }
111
- /**
112
- * 检测当前 OpenCode 配置的 API Key
113
- */
114
- detectCurrentConfig() {
115
- try {
116
- const config = this.getConfig();
117
- // 检查 provider 配置
118
- if (!config.provider) {
119
- return { apiKey: null };
120
- }
121
- // 检查是否有 private-newapi
122
- let apiKey = null;
123
- if (config.provider['private-newapi']) {
124
- apiKey = config.provider['private-newapi'].options?.apiKey || null;
125
- }
126
- return { apiKey };
127
- }
128
- catch {
129
- return { apiKey: null };
130
- }
131
- }
132
- }
133
- export const openCodeManager = OpenCodeManager.getInstance();
134
- //# sourceMappingURL=opencode-manager.js.map
1
+ import{existsSync as e,mkdirSync as n,readFileSync as o,writeFileSync as i}from"fs";import{join as t,dirname as r}from"path";import{homedir as a}from"os";import{logger as s}from"../utils/logger.js";import{configManager as p,DEFAULT_MODELS as c}from"./config.js";export class OpenCodeManager{static instance;configPath;constructor(){this.configPath=t(a(),".config","opencode","opencode.json")}static getInstance(){return OpenCodeManager.instance||(OpenCodeManager.instance=new OpenCodeManager),OpenCodeManager.instance}ensureConfigDir(){const o=r(this.configPath);e(o)||n(o,{recursive:!0})}getConfig(){try{if(e(this.configPath)){const e=o(this.configPath,"utf-8");return JSON.parse(e)}}catch(e){console.warn("Failed to read OpenCode config:",e),s.logError("OpenCodeManager.getConfig",e)}return{}}saveConfig(e){try{this.ensureConfigDir(),i(this.configPath,JSON.stringify(e,null,4),"utf-8")}catch(e){throw new Error(`Failed to save OpenCode config: ${e}`)}}loadPrivateConfig(e,n){const o=this.getConfig(),{provider:i,...t}=o,r={};if(i)for(const[e,n]of Object.entries(i))"private-newapi"!==e&&(r[e]=n);r["private-newapi"]={options:{apiKey:e,baseURL:p.getBaseUrl()}};const a={$schema:"https://opencode.ai/config.json",...t,provider:r,model:`private-newapi/${n.opus||c.opus}`,small_model:`private-newapi/${n.haiku||c.haiku}`};this.saveConfig(a)}unloadPrivateConfig(){const e=this.getConfig();e.provider&&(delete e.provider["private-newapi"],0===Object.keys(e.provider).length&&delete e.provider),e.model?.includes("private-newapi")&&delete e.model,e.small_model?.includes("private-newapi")&&delete e.small_model,this.saveConfig(e)}detectCurrentConfig(){try{const e=this.getConfig();if(!e.provider)return{apiKey:null};let n=null;return e.provider["private-newapi"]&&(n=e.provider["private-newapi"].options?.apiKey||null),{apiKey:n}}catch{return{apiKey:null}}}}export const openCodeManager=OpenCodeManager.getInstance();
@@ -0,0 +1,6 @@
1
+ export interface SettingsTemplate {
2
+ env?: Record<string, string | number>;
3
+ [key: string]: any;
4
+ }
5
+ export declare function loadSettingsTemplate(): SettingsTemplate;
6
+ export declare function reloadTemplate(): void;
@@ -0,0 +1 @@
1
+ import{existsSync as t,readFileSync as r}from"fs";import{dirname as e,join as n}from"path";import{fileURLToPath as o}from"url";const l=e(o(import.meta.url));let s=null;export function loadSettingsTemplate(){if(s)return s;const e=function(){const r=[n(l,"..","..","settings-template.json"),n(l,"..","settings-template.json"),n(l,"settings-template.json")];for(const e of r)if(t(e))return e;return null}();if(!e)return s={},s;try{return s=JSON.parse(r(e,"utf-8")),s}catch{return s={},s}}export function reloadTemplate(){s=null}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-template.js","sourceRoot":"","sources":["../../src/lib/settings-template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAOtC,SAAS,gBAAgB;IACrB,MAAM,UAAU,GAAG;QACf,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,wBAAwB,CAAC;QACrD,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,wBAAwB,CAAC;QAC/C,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC;KAC5C,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QACzB,IAAI,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,IAAI,cAAc,GAA4B,IAAI,CAAC;AAEnD,MAAM,UAAU,oBAAoB;IAChC,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAE1C,MAAM,YAAY,GAAG,gBAAgB,EAAE,CAAC;IACxC,IAAI,CAAC,YAAY,EAAE,CAAC;QAChB,cAAc,GAAG,EAAE,CAAC;QACpB,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC;QACD,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;QACjE,OAAO,cAAe,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACL,cAAc,GAAG,EAAE,CAAC;QACpB,OAAO,cAAc,CAAC;IAC1B,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc;IAC1B,cAAc,GAAG,IAAI,CAAC;AAC1B,CAAC"}