coder-link 0.0.9

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 (88) hide show
  1. package/README.md +200 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +684 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/index.d.ts +12 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +12 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/lib/amp-manager.d.ts +24 -0
  11. package/dist/lib/amp-manager.d.ts.map +1 -0
  12. package/dist/lib/amp-manager.js +46 -0
  13. package/dist/lib/amp-manager.js.map +1 -0
  14. package/dist/lib/claude-code-manager.d.ts +55 -0
  15. package/dist/lib/claude-code-manager.d.ts.map +1 -0
  16. package/dist/lib/claude-code-manager.js +408 -0
  17. package/dist/lib/claude-code-manager.js.map +1 -0
  18. package/dist/lib/crush-manager.d.ts +31 -0
  19. package/dist/lib/crush-manager.d.ts.map +1 -0
  20. package/dist/lib/crush-manager.js +262 -0
  21. package/dist/lib/crush-manager.js.map +1 -0
  22. package/dist/lib/factory-droid-manager.d.ts +36 -0
  23. package/dist/lib/factory-droid-manager.d.ts.map +1 -0
  24. package/dist/lib/factory-droid-manager.js +387 -0
  25. package/dist/lib/factory-droid-manager.js.map +1 -0
  26. package/dist/lib/kimi-manager.d.ts +34 -0
  27. package/dist/lib/kimi-manager.d.ts.map +1 -0
  28. package/dist/lib/kimi-manager.js +316 -0
  29. package/dist/lib/kimi-manager.js.map +1 -0
  30. package/dist/lib/opencode-manager.d.ts +31 -0
  31. package/dist/lib/opencode-manager.d.ts.map +1 -0
  32. package/dist/lib/opencode-manager.js +315 -0
  33. package/dist/lib/opencode-manager.js.map +1 -0
  34. package/dist/lib/pi-manager.d.ts +30 -0
  35. package/dist/lib/pi-manager.d.ts.map +1 -0
  36. package/dist/lib/pi-manager.js +196 -0
  37. package/dist/lib/pi-manager.js.map +1 -0
  38. package/dist/lib/tool-manager.d.ts +51 -0
  39. package/dist/lib/tool-manager.d.ts.map +1 -0
  40. package/dist/lib/tool-manager.js +113 -0
  41. package/dist/lib/tool-manager.js.map +1 -0
  42. package/dist/locales/en_US.json +49 -0
  43. package/dist/locales/zh_CN.json +49 -0
  44. package/dist/mcp-services.d.ts +3 -0
  45. package/dist/mcp-services.d.ts.map +1 -0
  46. package/dist/mcp-services.js +26 -0
  47. package/dist/mcp-services.js.map +1 -0
  48. package/dist/menu.d.ts +2 -0
  49. package/dist/menu.d.ts.map +1 -0
  50. package/dist/menu.js +1226 -0
  51. package/dist/menu.js.map +1 -0
  52. package/dist/utils/api-test.d.ts +32 -0
  53. package/dist/utils/api-test.d.ts.map +1 -0
  54. package/dist/utils/api-test.js +163 -0
  55. package/dist/utils/api-test.js.map +1 -0
  56. package/dist/utils/brand.d.ts +39 -0
  57. package/dist/utils/brand.d.ts.map +1 -0
  58. package/dist/utils/brand.js +195 -0
  59. package/dist/utils/brand.js.map +1 -0
  60. package/dist/utils/config.d.ts +100 -0
  61. package/dist/utils/config.d.ts.map +1 -0
  62. package/dist/utils/config.js +483 -0
  63. package/dist/utils/config.js.map +1 -0
  64. package/dist/utils/exec.d.ts +5 -0
  65. package/dist/utils/exec.d.ts.map +1 -0
  66. package/dist/utils/exec.js +145 -0
  67. package/dist/utils/exec.js.map +1 -0
  68. package/dist/utils/i18n.d.ts +56 -0
  69. package/dist/utils/i18n.d.ts.map +1 -0
  70. package/dist/utils/i18n.js +42 -0
  71. package/dist/utils/i18n.js.map +1 -0
  72. package/dist/utils/keyboard.d.ts +32 -0
  73. package/dist/utils/keyboard.d.ts.map +1 -0
  74. package/dist/utils/keyboard.js +109 -0
  75. package/dist/utils/keyboard.js.map +1 -0
  76. package/dist/utils/logger.d.ts +14 -0
  77. package/dist/utils/logger.d.ts.map +1 -0
  78. package/dist/utils/logger.js +55 -0
  79. package/dist/utils/logger.js.map +1 -0
  80. package/dist/utils/output.d.ts +58 -0
  81. package/dist/utils/output.d.ts.map +1 -0
  82. package/dist/utils/output.js +93 -0
  83. package/dist/utils/output.js.map +1 -0
  84. package/dist/wizard.d.ts +2 -0
  85. package/dist/wizard.d.ts.map +1 -0
  86. package/dist/wizard.js +114 -0
  87. package/dist/wizard.js.map +1 -0
  88. package/package.json +65 -0
@@ -0,0 +1,315 @@
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
+ export class OpenCodeManager {
6
+ static instance = null;
7
+ configPath;
8
+ constructor() {
9
+ // OpenCode 配置文件路径: ~/.config/opencode/opencode.json
10
+ this.configPath = join(homedir(), '.config', 'opencode', 'opencode.json');
11
+ }
12
+ static getInstance() {
13
+ if (!OpenCodeManager.instance) {
14
+ OpenCodeManager.instance = new OpenCodeManager();
15
+ }
16
+ return OpenCodeManager.instance;
17
+ }
18
+ ensureConfigDir() {
19
+ const dir = dirname(this.configPath);
20
+ if (!existsSync(dir)) {
21
+ mkdirSync(dir, { recursive: true });
22
+ }
23
+ }
24
+ getConfig() {
25
+ try {
26
+ if (existsSync(this.configPath)) {
27
+ const content = readFileSync(this.configPath, 'utf-8');
28
+ return JSON.parse(content);
29
+ }
30
+ }
31
+ catch (error) {
32
+ console.warn('Failed to read OpenCode config:', error);
33
+ logger.logError('OpenCodeManager.getConfig', error);
34
+ }
35
+ return {};
36
+ }
37
+ saveConfig(config) {
38
+ try {
39
+ this.ensureConfigDir();
40
+ writeFileSync(this.configPath, JSON.stringify(config, null, 4), 'utf-8');
41
+ }
42
+ catch (error) {
43
+ throw new Error(`Failed to save OpenCode config: ${error}`);
44
+ }
45
+ }
46
+ getProviderName(plan) {
47
+ // All kimi-like providers (kimi, openrouter, nvidia) use the moonshot-ai-coding provider
48
+ if (plan === 'kimi' || plan === 'openrouter' || plan === 'nvidia') {
49
+ return 'moonshot-ai-coding';
50
+ }
51
+ return plan === 'glm_coding_plan_global' ? 'zai-coding-plan' : 'zhipuai-coding-plan';
52
+ }
53
+ async loadConfig(plan, apiKey, options) {
54
+ const currentConfig = this.getConfig();
55
+ const providerName = this.getProviderName(plan);
56
+ // Remove old provider configuration (if exists)
57
+ const { provider: oldProvider, ...restConfig } = currentConfig;
58
+ const newProvider = {};
59
+ // Keep other providers (if any), but remove old coding-plan provider
60
+ if (oldProvider) {
61
+ for (const [key, value] of Object.entries(oldProvider)) {
62
+ if (key !== 'zhipuai-coding-plan' && key !== 'zai-coding-plan' && key !== 'moonshot-ai-coding') {
63
+ newProvider[key] = value;
64
+ }
65
+ }
66
+ }
67
+ const source = (options?.source || '').toString().trim().toLowerCase();
68
+ const baseUrl = options?.baseUrl?.trim();
69
+ const modelId = options?.model?.trim();
70
+ // Add new provider configuration
71
+ // All kimi-like providers (kimi, openrouter, nvidia) use OpenAI-compatible API
72
+ if (plan === 'kimi' || plan === 'openrouter' || plan === 'nvidia') {
73
+ // Only the native Moonshot API supports extended thinking / reasoning mode.
74
+ const supportsThinking = (source === '' || source === 'moonshot');
75
+ newProvider[providerName] = {
76
+ options: {
77
+ apiKey: apiKey,
78
+ baseUrl: baseUrl || 'https://api.moonshot.ai/v1',
79
+ ...(supportsThinking ? {} : { reasoning: false, thinking: false })
80
+ }
81
+ };
82
+ }
83
+ else {
84
+ newProvider[providerName] = {
85
+ options: {
86
+ apiKey: apiKey,
87
+ ...(baseUrl ? { baseUrl } : {})
88
+ }
89
+ };
90
+ }
91
+ // Default models if not provided
92
+ const defaultModel = (plan === 'kimi' || plan === 'openrouter' || plan === 'nvidia')
93
+ ? 'kimi-k2.5'
94
+ : (plan === 'glm_coding_plan_global' ? 'glm-4-coder' : 'glm-4-plus');
95
+ const targetModel = modelId || defaultModel;
96
+ // OpenCode model strings are typically "<provider>/<model>".
97
+ const modelRef = targetModel.includes('/') ? targetModel : `${providerName}/${targetModel}`;
98
+ const newConfig = {
99
+ $schema: 'https://opencode.ai/config.json',
100
+ ...restConfig,
101
+ provider: newProvider,
102
+ model: modelRef,
103
+ small_model: modelRef
104
+ };
105
+ this.saveConfig(newConfig);
106
+ }
107
+ async unloadConfig() {
108
+ const currentConfig = this.getConfig();
109
+ // Remove provider's coding-plan configuration
110
+ if (currentConfig.provider) {
111
+ delete currentConfig.provider['zhipuai-coding-plan'];
112
+ delete currentConfig.provider['zai-coding-plan'];
113
+ delete currentConfig.provider['moonshot-ai-coding'];
114
+ // If provider is empty, delete provider field
115
+ if (Object.keys(currentConfig.provider).length === 0) {
116
+ delete currentConfig.provider;
117
+ }
118
+ }
119
+ // Remove model and small_model (if they are coding-plan)
120
+ if (currentConfig.model?.includes('coding-plan') || currentConfig.model?.includes('moonshot-ai-coding')) {
121
+ delete currentConfig.model;
122
+ }
123
+ if (currentConfig.small_model?.includes('coding-plan') || currentConfig.small_model?.includes('moonshot-ai-coding')) {
124
+ delete currentConfig.small_model;
125
+ }
126
+ this.saveConfig(currentConfig);
127
+ }
128
+ async detectCurrentConfig() {
129
+ try {
130
+ const config = this.getConfig();
131
+ // Check provider configuration
132
+ if (!config.provider) {
133
+ return { plan: null, apiKey: null };
134
+ }
135
+ let plan = null;
136
+ let apiKey = null;
137
+ let model = undefined;
138
+ if (config.provider['zai-coding-plan']) {
139
+ plan = 'glm_coding_plan_global';
140
+ apiKey = config.provider['zai-coding-plan'].options?.apiKey || null;
141
+ }
142
+ else if (config.provider['zhipuai-coding-plan']) {
143
+ plan = 'glm_coding_plan_china';
144
+ apiKey = config.provider['zhipuai-coding-plan'].options?.apiKey || null;
145
+ }
146
+ else if (config.provider['moonshot-ai-coding']) {
147
+ apiKey = config.provider['moonshot-ai-coding'].options?.apiKey || null;
148
+ const baseUrl = config.provider['moonshot-ai-coding'].options?.baseUrl || '';
149
+ if (baseUrl.includes('openrouter.ai')) {
150
+ plan = 'openrouter';
151
+ }
152
+ else if (baseUrl.includes('nvidia.com')) {
153
+ plan = 'nvidia';
154
+ }
155
+ else {
156
+ plan = 'kimi';
157
+ }
158
+ }
159
+ // Extract model from config if present
160
+ if (config.model && typeof config.model === 'string') {
161
+ // Model format is typically "provider/model", extract the model part
162
+ const parts = config.model.split('/');
163
+ if (parts.length > 1) {
164
+ model = parts.slice(1).join('/');
165
+ }
166
+ else {
167
+ model = config.model;
168
+ }
169
+ }
170
+ return { plan, apiKey, model };
171
+ }
172
+ catch {
173
+ return { plan: null, apiKey: null };
174
+ }
175
+ }
176
+ isMCPInstalled(mcpId) {
177
+ try {
178
+ const config = this.getConfig();
179
+ if (!config.mcp) {
180
+ return false;
181
+ }
182
+ return mcpId in config.mcp;
183
+ }
184
+ catch {
185
+ return false;
186
+ }
187
+ }
188
+ async installMCP(mcp, apiKey, plan) {
189
+ try {
190
+ const config = this.getConfig();
191
+ if (!config.mcp) {
192
+ config.mcp = {};
193
+ }
194
+ let mcpConfig;
195
+ if (mcp.protocol === 'stdio') {
196
+ // Determine environment variables
197
+ let env = {};
198
+ if (mcp.envTemplate && plan) {
199
+ env = { ...(mcp.envTemplate[plan] || {}) };
200
+ }
201
+ else if (mcp.env) {
202
+ env = { ...mcp.env };
203
+ }
204
+ // Add API key if required
205
+ if (mcp.requiresAuth && apiKey) {
206
+ env.Z_AI_API_KEY = apiKey;
207
+ }
208
+ // OpenCode uses local type and command array
209
+ const commandArray = [mcp.command || 'npx', ...(mcp.args || [])];
210
+ mcpConfig = {
211
+ type: 'local',
212
+ command: commandArray,
213
+ environment: env
214
+ };
215
+ }
216
+ else if (mcp.protocol === 'streamable-http') {
217
+ // Determine URL based on plan
218
+ let url = '';
219
+ if (mcp.urlTemplate && plan) {
220
+ url = mcp.urlTemplate[plan];
221
+ }
222
+ else if (mcp.url) {
223
+ url = mcp.url;
224
+ }
225
+ else {
226
+ throw new Error(`MCP ${mcp.id} missing url or urlTemplate`);
227
+ }
228
+ // OpenCode uses remote or http type
229
+ mcpConfig = {
230
+ type: 'remote',
231
+ url: url,
232
+ headers: {
233
+ ...(mcp.headers || {})
234
+ }
235
+ };
236
+ // Add API key to headers if required
237
+ if (mcp.requiresAuth && apiKey) {
238
+ mcpConfig.headers = {
239
+ ...mcpConfig.headers,
240
+ 'Authorization': `Bearer ${apiKey}`
241
+ };
242
+ }
243
+ }
244
+ else {
245
+ throw new Error(`Unsupported protocol: ${mcp.protocol}`);
246
+ }
247
+ config.mcp[mcp.id] = mcpConfig;
248
+ this.saveConfig(config);
249
+ }
250
+ catch (error) {
251
+ throw new Error(`Failed to install MCP ${mcp.name}: ${error}`);
252
+ }
253
+ }
254
+ async uninstallMCP(mcpId) {
255
+ try {
256
+ const config = this.getConfig();
257
+ if (!config.mcp) {
258
+ return;
259
+ }
260
+ delete config.mcp[mcpId];
261
+ this.saveConfig(config);
262
+ }
263
+ catch (error) {
264
+ throw new Error(`Failed to uninstall MCP ${mcpId}: ${error}`);
265
+ }
266
+ }
267
+ getInstalledMCPs() {
268
+ try {
269
+ const config = this.getConfig();
270
+ if (!config.mcp) {
271
+ return [];
272
+ }
273
+ return Object.keys(config.mcp);
274
+ }
275
+ catch {
276
+ return [];
277
+ }
278
+ }
279
+ getMCPStatus(mcpServices) {
280
+ const status = new Map();
281
+ for (const mcp of mcpServices) {
282
+ status.set(mcp.id, this.isMCPInstalled(mcp.id));
283
+ }
284
+ return status;
285
+ }
286
+ getOtherMCPs(builtinIds) {
287
+ try {
288
+ const config = this.getConfig();
289
+ if (!config.mcp) {
290
+ return [];
291
+ }
292
+ const otherMCPs = [];
293
+ for (const [id, mcpConfig] of Object.entries(config.mcp)) {
294
+ if (!builtinIds.includes(id)) {
295
+ otherMCPs.push({ id, config: mcpConfig });
296
+ }
297
+ }
298
+ return otherMCPs;
299
+ }
300
+ catch {
301
+ return [];
302
+ }
303
+ }
304
+ getAllMCPServers() {
305
+ try {
306
+ const config = this.getConfig();
307
+ return config.mcp || {};
308
+ }
309
+ catch {
310
+ return {};
311
+ }
312
+ }
313
+ }
314
+ export const openCodeManager = OpenCodeManager.getInstance();
315
+ //# sourceMappingURL=opencode-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-manager.js","sourceRoot":"","sources":["../../src/lib/opencode-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { MCPService } from './tool-manager.js';
2
+ import type { ProviderOptions } from './tool-manager.js';
3
+ export declare class PiManager {
4
+ static instance: PiManager | null;
5
+ private configPath;
6
+ constructor();
7
+ static getInstance(): PiManager;
8
+ private ensureDir;
9
+ private readConfig;
10
+ private writeConfig;
11
+ detectCurrentConfig(): Promise<{
12
+ plan: string | null;
13
+ apiKey: string | null;
14
+ model?: string;
15
+ }>;
16
+ loadConfig(plan: string, apiKey: string, options?: ProviderOptions): Promise<void>;
17
+ unloadConfig(): Promise<void>;
18
+ isMCPInstalled(_mcpId: string): boolean;
19
+ installMCP(_mcp: MCPService, _apiKey: string, _plan: string): Promise<void>;
20
+ uninstallMCP(_mcpId: string): Promise<void>;
21
+ getInstalledMCPs(): string[];
22
+ getMCPStatus(_mcpServices: MCPService[]): Map<string, boolean>;
23
+ getOtherMCPs(_builtinIds: string[]): Array<{
24
+ id: string;
25
+ config: any;
26
+ }>;
27
+ getAllMCPServers(): Record<string, any>;
28
+ }
29
+ export declare const piManager: PiManager;
30
+ //# sourceMappingURL=pi-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-manager.d.ts","sourceRoot":"","sources":["../../src/lib/pi-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAMzD,qBAAa,SAAS;IACpB,MAAM,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAQ;IACzC,OAAO,CAAC,UAAU,CAAS;;IAO3B,MAAM,CAAC,WAAW,IAAI,SAAS;IAO/B,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,WAAW;IAUb,mBAAmB,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAkC9F,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAoFlF,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAanC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIjC,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3E,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,gBAAgB,IAAI,MAAM,EAAE;IAI5B,YAAY,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAI9D,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,GAAG,CAAA;KAAE,CAAC;IAIvE,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;CAGxC;AAED,eAAO,MAAM,SAAS,WAA0B,CAAC"}
@@ -0,0 +1,196 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
2
+ import { dirname, join } from 'path';
3
+ import { homedir } from 'os';
4
+ import { logger } from '../utils/logger.js';
5
+ const PI_PROVIDER_ID = 'moonshot';
6
+ export class PiManager {
7
+ static instance = null;
8
+ configPath;
9
+ constructor() {
10
+ // Per pi docs: custom providers/models are configured via ~/.pi/agent/models.json
11
+ this.configPath = join(homedir(), '.pi', 'agent', 'models.json');
12
+ }
13
+ static getInstance() {
14
+ if (!PiManager.instance) {
15
+ PiManager.instance = new PiManager();
16
+ }
17
+ return PiManager.instance;
18
+ }
19
+ ensureDir() {
20
+ const dir = dirname(this.configPath);
21
+ if (!existsSync(dir)) {
22
+ mkdirSync(dir, { recursive: true });
23
+ }
24
+ }
25
+ readConfig() {
26
+ try {
27
+ if (!existsSync(this.configPath))
28
+ return {};
29
+ const text = readFileSync(this.configPath, 'utf-8');
30
+ if (!text.trim())
31
+ return {};
32
+ return JSON.parse(text);
33
+ }
34
+ catch (error) {
35
+ logger.logError('PiManager.readConfig', error);
36
+ throw new Error(`Failed to parse Pi models config at ${this.configPath}`);
37
+ }
38
+ }
39
+ writeConfig(config) {
40
+ try {
41
+ this.ensureDir();
42
+ writeFileSync(this.configPath, JSON.stringify(config, null, 2), 'utf-8');
43
+ }
44
+ catch (error) {
45
+ logger.logError('PiManager.writeConfig', error);
46
+ throw new Error(`Failed to write Pi models config at ${this.configPath}`);
47
+ }
48
+ }
49
+ async detectCurrentConfig() {
50
+ try {
51
+ if (!existsSync(this.configPath))
52
+ return { plan: null, apiKey: null };
53
+ const config = this.readConfig();
54
+ const provider = config?.providers?.[PI_PROVIDER_ID];
55
+ const apiKey = provider?.apiKey;
56
+ const baseUrl = provider?.baseUrl;
57
+ const models = provider?.models;
58
+ let model = undefined;
59
+ // Extract first model id if available
60
+ if (Array.isArray(models) && models.length > 0 && models[0]?.id) {
61
+ model = models[0].id;
62
+ }
63
+ if (typeof apiKey === 'string' && apiKey.trim()) {
64
+ // Detect plan from base_url
65
+ let plan = 'kimi';
66
+ if (typeof baseUrl === 'string') {
67
+ if (baseUrl.includes('openrouter.ai')) {
68
+ plan = 'openrouter';
69
+ }
70
+ else if (baseUrl.includes('nvidia.com')) {
71
+ plan = 'nvidia';
72
+ }
73
+ }
74
+ return { plan, apiKey: apiKey.trim(), model };
75
+ }
76
+ return { plan: null, apiKey: null };
77
+ }
78
+ catch (error) {
79
+ logger.logError('PiManager.detectCurrentConfig', error);
80
+ return { plan: null, apiKey: null };
81
+ }
82
+ }
83
+ async loadConfig(plan, apiKey, options) {
84
+ if (!apiKey || !apiKey.trim()) {
85
+ throw new Error('API key cannot be empty');
86
+ }
87
+ const baseUrl = options?.baseUrl?.trim() || 'https://api.moonshot.ai/v1';
88
+ const modelId = options?.model?.trim() || 'moonshot-ai/kimi-k2.5';
89
+ const source = (options?.source || '').toString().trim().toLowerCase();
90
+ // Pi supported APIs: openai-completions/openai-responses/anthropic-messages/google-generative-ai.
91
+ // Despite the name, `openai-completions` maps to OpenAI *Chat Completions* (POST /chat/completions).
92
+ const apiMode = 'openai-completions';
93
+ // Only the native Moonshot API supports Kimi's extended-thinking / reasoning mode.
94
+ const supportsReasoning = (source === '' || source === 'moonshot');
95
+ const modelName = (() => {
96
+ if (source === 'nvidia')
97
+ return 'Kimi K2.5 (NVIDIA)';
98
+ if (source === 'openrouter')
99
+ return 'Kimi K2.5 (OpenRouter)';
100
+ if (source === 'glm-global')
101
+ return 'GLM (Global)';
102
+ if (source === 'glm-china')
103
+ return 'GLM (China)';
104
+ if (source === 'custom')
105
+ return 'Custom Model';
106
+ return 'Kimi K2.5';
107
+ })();
108
+ const config = this.readConfig();
109
+ config.providers = config.providers && typeof config.providers === 'object' ? config.providers : {};
110
+ const existing = (config.providers[PI_PROVIDER_ID] && typeof config.providers[PI_PROVIDER_ID] === 'object')
111
+ ? config.providers[PI_PROVIDER_ID]
112
+ : {};
113
+ const existingModels = Array.isArray(existing.models) ? existing.models : [];
114
+ const models = (() => {
115
+ // Preserve extra metadata if present, but ensure the configured model id is applied.
116
+ if (existingModels.length === 0) {
117
+ return [
118
+ {
119
+ id: modelId,
120
+ name: modelName,
121
+ reasoning: supportsReasoning,
122
+ input: ['text'],
123
+ contextWindow: 262144,
124
+ maxTokens: 262144,
125
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }
126
+ }
127
+ ];
128
+ }
129
+ const hasExact = existingModels.some((m) => m && typeof m === 'object' && m.id === modelId);
130
+ if (hasExact) {
131
+ // Ensure reasoning flag is updated even when the model already exists
132
+ return existingModels.map((m) => {
133
+ if (m && typeof m === 'object' && m.id === modelId) {
134
+ return { ...m, reasoning: supportsReasoning };
135
+ }
136
+ return m;
137
+ });
138
+ }
139
+ // If there is at least one model already, rewrite the first entry to match the configured model.
140
+ const [first, ...rest] = existingModels;
141
+ const firstObj = (first && typeof first === 'object') ? first : {};
142
+ const rewrittenFirst = {
143
+ ...firstObj,
144
+ id: modelId,
145
+ name: typeof firstObj.name === 'string' && firstObj.name.trim() ? firstObj.name : modelName,
146
+ reasoning: supportsReasoning
147
+ };
148
+ return [rewrittenFirst, ...rest];
149
+ })();
150
+ config.providers[PI_PROVIDER_ID] = {
151
+ ...existing,
152
+ baseUrl,
153
+ api: apiMode,
154
+ apiKey: apiKey.trim(),
155
+ authHeader: true,
156
+ models
157
+ };
158
+ this.writeConfig(config);
159
+ }
160
+ async unloadConfig() {
161
+ if (!existsSync(this.configPath))
162
+ return;
163
+ const config = this.readConfig();
164
+ if (!config?.providers?.[PI_PROVIDER_ID])
165
+ return;
166
+ const provider = config.providers[PI_PROVIDER_ID];
167
+ if (provider && typeof provider === 'object') {
168
+ provider.apiKey = '';
169
+ config.providers[PI_PROVIDER_ID] = provider;
170
+ this.writeConfig(config);
171
+ }
172
+ }
173
+ isMCPInstalled(_mcpId) {
174
+ return false;
175
+ }
176
+ async installMCP(_mcp, _apiKey, _plan) {
177
+ throw new Error('Pi does not support MCP configuration via coder-link');
178
+ }
179
+ async uninstallMCP(_mcpId) {
180
+ throw new Error('Pi does not support MCP configuration via coder-link');
181
+ }
182
+ getInstalledMCPs() {
183
+ return [];
184
+ }
185
+ getMCPStatus(_mcpServices) {
186
+ return new Map();
187
+ }
188
+ getOtherMCPs(_builtinIds) {
189
+ return [];
190
+ }
191
+ getAllMCPServers() {
192
+ return {};
193
+ }
194
+ }
195
+ export const piManager = PiManager.getInstance();
196
+ //# sourceMappingURL=pi-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-manager.js","sourceRoot":"","sources":["../../src/lib/pi-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ export interface MCPService {
2
+ id: string;
3
+ name: string;
4
+ description?: string;
5
+ protocol: 'stdio' | 'sse' | 'streamable-http';
6
+ command?: string;
7
+ args?: string[];
8
+ env?: Record<string, string>;
9
+ envTemplate?: Record<string, Record<string, string>>;
10
+ url?: string;
11
+ urlTemplate?: Record<string, string>;
12
+ headers?: Record<string, string>;
13
+ requiresAuth?: boolean;
14
+ }
15
+ export interface ProviderOptions {
16
+ baseUrl?: string;
17
+ model?: string;
18
+ providerId?: string;
19
+ source?: string;
20
+ maxContextSize?: number;
21
+ }
22
+ export declare class ToolManager {
23
+ static instance: ToolManager | null;
24
+ private managers;
25
+ constructor();
26
+ static getInstance(): ToolManager;
27
+ private getManager;
28
+ getSupportedTools(): string[];
29
+ isConfigured(tool: string): Promise<boolean>;
30
+ loadConfig(tool: string, plan: string, apiKey: string, overrides?: Partial<ProviderOptions>): Promise<void>;
31
+ unloadConfig(tool: string): Promise<void>;
32
+ installTool(tool: string): Promise<void>;
33
+ uninstallTool(tool: string): Promise<void>;
34
+ isMCPInstalled(tool: string, mcpId: string): Promise<boolean>;
35
+ installMCP(tool: string, mcp: MCPService, apiKey: string, plan: string): Promise<void>;
36
+ uninstallMCP(tool: string, mcpId: string): Promise<void>;
37
+ getInstalledMCPs(tool: string): Promise<string[]>;
38
+ getMCPStatus(tool: string, mcpServices: MCPService[]): Promise<Map<string, boolean>>;
39
+ getOtherMCPs(tool: string, builtinIds: string[]): Promise<Array<{
40
+ id: string;
41
+ config: any;
42
+ }>>;
43
+ getAllMCPServers(tool: string): Promise<Record<string, any>>;
44
+ detectCurrentConfig(tool: string): Promise<{
45
+ plan: string | null;
46
+ apiKey: string | null;
47
+ model?: string;
48
+ }>;
49
+ }
50
+ export declare const toolManager: ToolManager;
51
+ //# sourceMappingURL=tool-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-manager.d.ts","sourceRoot":"","sources":["../../src/lib/tool-manager.ts"],"names":[],"mappings":"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"}