agent-gear 1.1.4 → 1.1.5
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.
package/dist/acp/detector.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/acp/detector.ts"],"names":[],"mappings":"AAKA,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,WAAW;IAChB,MAAM,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/acp/detector.ts"],"names":[],"mappings":"AAKA,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,WAAW;IAChB,MAAM,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAa1B,cAAc;YAUd,mBAAmB;YAUnB,gBAAgB;YAUhB,eAAe;YAUf,WAAW;YAUX,cAAc;YAUd,cAAc;IAU5B,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IAoBzE,OAAO,CAAC,YAAY;CAIrB;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|
package/dist/acp/detector.js
CHANGED
|
@@ -3,14 +3,16 @@ import { promisify } from 'util';
|
|
|
3
3
|
const execAsync = promisify(exec);
|
|
4
4
|
export class AcpDetector {
|
|
5
5
|
async detect() {
|
|
6
|
-
const [opencode, copilot, claudeCode, geminiCli, codex] = await Promise.all([
|
|
6
|
+
const [opencode, copilot, claudeCode, geminiCli, codex, mimoCode, kimiCode] = await Promise.all([
|
|
7
7
|
this.detectOpenCode(),
|
|
8
8
|
this.detectGitHubCopilot(),
|
|
9
9
|
this.detectClaudeCode(),
|
|
10
10
|
this.detectGeminiCli(),
|
|
11
11
|
this.detectCodex(),
|
|
12
|
+
this.detectMiMoCode(),
|
|
13
|
+
this.detectKimiCode(),
|
|
12
14
|
]);
|
|
13
|
-
return [opencode, copilot, claudeCode, geminiCli, codex];
|
|
15
|
+
return [opencode, copilot, claudeCode, geminiCli, codex, mimoCode, kimiCode];
|
|
14
16
|
}
|
|
15
17
|
async detectOpenCode() {
|
|
16
18
|
try {
|
|
@@ -62,6 +64,26 @@ export class AcpDetector {
|
|
|
62
64
|
return { type: 'codex', available: false };
|
|
63
65
|
}
|
|
64
66
|
}
|
|
67
|
+
async detectMiMoCode() {
|
|
68
|
+
try {
|
|
69
|
+
const { stdout } = await execAsync('mimo --version');
|
|
70
|
+
const version = this.parseVersion(stdout);
|
|
71
|
+
return { type: 'mimo_code', available: true, version };
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return { type: 'mimo_code', available: false };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async detectKimiCode() {
|
|
78
|
+
try {
|
|
79
|
+
const { stdout } = await execAsync('kimi --version');
|
|
80
|
+
const version = this.parseVersion(stdout);
|
|
81
|
+
return { type: 'kimi_code', available: true, version };
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return { type: 'kimi_code', available: false };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
65
87
|
getSpawnerConfig(serverType) {
|
|
66
88
|
switch (serverType) {
|
|
67
89
|
case 'github_copilot':
|
|
@@ -72,6 +94,10 @@ export class AcpDetector {
|
|
|
72
94
|
return { command: 'gemini', args: ['--acp'] };
|
|
73
95
|
case 'codex':
|
|
74
96
|
return { command: 'codex-acp', args: [] };
|
|
97
|
+
case 'mimo_code':
|
|
98
|
+
return { command: 'mimo', args: ['acp'] };
|
|
99
|
+
case 'kimi_code':
|
|
100
|
+
return { command: 'kimi', args: ['acp'] };
|
|
75
101
|
case 'opencode':
|
|
76
102
|
default:
|
|
77
103
|
return { command: 'opencode', args: ['acp'] };
|
package/dist/acp/detector.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/acp/detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAQlC,MAAM,OAAO,WAAW;IACtB,KAAK,CAAC,MAAM;QACV,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/acp/detector.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/acp/detector.ts
CHANGED
|
@@ -11,14 +11,16 @@ interface AcpServerInfo {
|
|
|
11
11
|
|
|
12
12
|
export class AcpDetector {
|
|
13
13
|
async detect(): Promise<AcpServerInfo[]> {
|
|
14
|
-
const [opencode, copilot, claudeCode, geminiCli, codex] = await Promise.all([
|
|
14
|
+
const [opencode, copilot, claudeCode, geminiCli, codex, mimoCode, kimiCode] = await Promise.all([
|
|
15
15
|
this.detectOpenCode(),
|
|
16
16
|
this.detectGitHubCopilot(),
|
|
17
17
|
this.detectClaudeCode(),
|
|
18
18
|
this.detectGeminiCli(),
|
|
19
19
|
this.detectCodex(),
|
|
20
|
+
this.detectMiMoCode(),
|
|
21
|
+
this.detectKimiCode(),
|
|
20
22
|
]);
|
|
21
|
-
return [opencode, copilot, claudeCode, geminiCli, codex];
|
|
23
|
+
return [opencode, copilot, claudeCode, geminiCli, codex, mimoCode, kimiCode];
|
|
22
24
|
}
|
|
23
25
|
|
|
24
26
|
private async detectOpenCode(): Promise<AcpServerInfo> {
|
|
@@ -71,6 +73,26 @@ export class AcpDetector {
|
|
|
71
73
|
}
|
|
72
74
|
}
|
|
73
75
|
|
|
76
|
+
private async detectMiMoCode(): Promise<AcpServerInfo> {
|
|
77
|
+
try {
|
|
78
|
+
const { stdout } = await execAsync('mimo --version');
|
|
79
|
+
const version = this.parseVersion(stdout);
|
|
80
|
+
return { type: 'mimo_code', available: true, version };
|
|
81
|
+
} catch {
|
|
82
|
+
return { type: 'mimo_code', available: false };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
private async detectKimiCode(): Promise<AcpServerInfo> {
|
|
87
|
+
try {
|
|
88
|
+
const { stdout } = await execAsync('kimi --version');
|
|
89
|
+
const version = this.parseVersion(stdout);
|
|
90
|
+
return { type: 'kimi_code', available: true, version };
|
|
91
|
+
} catch {
|
|
92
|
+
return { type: 'kimi_code', available: false };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
74
96
|
getSpawnerConfig(serverType: string): { command: string; args: string[] } {
|
|
75
97
|
switch (serverType) {
|
|
76
98
|
case 'github_copilot':
|
|
@@ -81,6 +103,10 @@ export class AcpDetector {
|
|
|
81
103
|
return { command: 'gemini', args: ['--acp'] };
|
|
82
104
|
case 'codex':
|
|
83
105
|
return { command: 'codex-acp', args: [] };
|
|
106
|
+
case 'mimo_code':
|
|
107
|
+
return { command: 'mimo', args: ['acp'] };
|
|
108
|
+
case 'kimi_code':
|
|
109
|
+
return { command: 'kimi', args: ['acp'] };
|
|
84
110
|
case 'opencode':
|
|
85
111
|
default:
|
|
86
112
|
return { command: 'opencode', args: ['acp'] };
|
|
@@ -32,21 +32,25 @@ describe('AcpDetector', () => {
|
|
|
32
32
|
});
|
|
33
33
|
|
|
34
34
|
describe('detect', () => {
|
|
35
|
-
it('should detect all
|
|
35
|
+
it('should detect all 7 servers when all available', async () => {
|
|
36
36
|
mockExecSuccessOnce('opencode v1.2.3\n');
|
|
37
37
|
mockExecSuccessOnce('copilot 1.0.0\n');
|
|
38
38
|
mockExecSuccessOnce('claude-agent-acp 0.1.0\n');
|
|
39
39
|
mockExecSuccessOnce('gemini 2.0.0\n');
|
|
40
40
|
mockExecSuccessOnce('codex-acp 0.5.0\n');
|
|
41
|
+
mockExecSuccessOnce('mimo 0.1.0\n');
|
|
42
|
+
mockExecSuccessOnce('kimi 1.0.0\n');
|
|
41
43
|
|
|
42
44
|
const result = await detector.detect();
|
|
43
45
|
|
|
44
|
-
expect(result).toHaveLength(
|
|
46
|
+
expect(result).toHaveLength(7);
|
|
45
47
|
expect(result[0]).toEqual({ type: 'opencode', available: true, version: '1.2.3' });
|
|
46
48
|
expect(result[1]).toEqual({ type: 'github_copilot', available: true, version: '1.0.0' });
|
|
47
49
|
expect(result[2]).toEqual({ type: 'claude_code', available: true, version: '0.1.0' });
|
|
48
50
|
expect(result[3]).toEqual({ type: 'gemini_cli', available: true, version: '2.0.0' });
|
|
49
51
|
expect(result[4]).toEqual({ type: 'codex', available: true, version: '0.5.0' });
|
|
52
|
+
expect(result[5]).toEqual({ type: 'mimo_code', available: true, version: '0.1.0' });
|
|
53
|
+
expect(result[6]).toEqual({ type: 'kimi_code', available: true, version: '1.0.0' });
|
|
50
54
|
});
|
|
51
55
|
|
|
52
56
|
it('should detect as unavailable when command fails', async () => {
|
|
@@ -55,15 +59,19 @@ describe('AcpDetector', () => {
|
|
|
55
59
|
mockExecFailureOnce();
|
|
56
60
|
mockExecFailureOnce();
|
|
57
61
|
mockExecFailureOnce();
|
|
62
|
+
mockExecFailureOnce();
|
|
63
|
+
mockExecFailureOnce();
|
|
58
64
|
|
|
59
65
|
const result = await detector.detect();
|
|
60
66
|
|
|
61
|
-
expect(result).toHaveLength(
|
|
67
|
+
expect(result).toHaveLength(7);
|
|
62
68
|
expect(result[0]).toEqual({ type: 'opencode', available: false });
|
|
63
69
|
expect(result[1]).toEqual({ type: 'github_copilot', available: false });
|
|
64
70
|
expect(result[2]).toEqual({ type: 'claude_code', available: false });
|
|
65
71
|
expect(result[3]).toEqual({ type: 'gemini_cli', available: false });
|
|
66
72
|
expect(result[4]).toEqual({ type: 'codex', available: false });
|
|
73
|
+
expect(result[5]).toEqual({ type: 'mimo_code', available: false });
|
|
74
|
+
expect(result[6]).toEqual({ type: 'kimi_code', available: false });
|
|
67
75
|
});
|
|
68
76
|
|
|
69
77
|
it('should detect claude_code only when other servers fail', async () => {
|
|
@@ -72,15 +80,19 @@ describe('AcpDetector', () => {
|
|
|
72
80
|
mockExecSuccessOnce('claude-agent-acp 0.1.0\n');
|
|
73
81
|
mockExecFailureOnce();
|
|
74
82
|
mockExecFailureOnce();
|
|
83
|
+
mockExecFailureOnce();
|
|
84
|
+
mockExecFailureOnce();
|
|
75
85
|
|
|
76
86
|
const result = await detector.detect();
|
|
77
87
|
|
|
78
|
-
expect(result).toHaveLength(
|
|
88
|
+
expect(result).toHaveLength(7);
|
|
79
89
|
expect(result[0]).toEqual({ type: 'opencode', available: false });
|
|
80
90
|
expect(result[1]).toEqual({ type: 'github_copilot', available: false });
|
|
81
91
|
expect(result[2]).toEqual({ type: 'claude_code', available: true, version: '0.1.0' });
|
|
82
92
|
expect(result[3]).toEqual({ type: 'gemini_cli', available: false });
|
|
83
93
|
expect(result[4]).toEqual({ type: 'codex', available: false });
|
|
94
|
+
expect(result[5]).toEqual({ type: 'mimo_code', available: false });
|
|
95
|
+
expect(result[6]).toEqual({ type: 'kimi_code', available: false });
|
|
84
96
|
});
|
|
85
97
|
|
|
86
98
|
it('should detect gemini_cli only when other servers fail', async () => {
|
|
@@ -89,10 +101,12 @@ describe('AcpDetector', () => {
|
|
|
89
101
|
mockExecFailureOnce();
|
|
90
102
|
mockExecSuccessOnce('gemini 2.0.0\n');
|
|
91
103
|
mockExecFailureOnce();
|
|
104
|
+
mockExecFailureOnce();
|
|
105
|
+
mockExecFailureOnce();
|
|
92
106
|
|
|
93
107
|
const result = await detector.detect();
|
|
94
108
|
|
|
95
|
-
expect(result).toHaveLength(
|
|
109
|
+
expect(result).toHaveLength(7);
|
|
96
110
|
expect(result[3]).toEqual({ type: 'gemini_cli', available: true, version: '2.0.0' });
|
|
97
111
|
});
|
|
98
112
|
|
|
@@ -102,19 +116,53 @@ describe('AcpDetector', () => {
|
|
|
102
116
|
mockExecFailureOnce();
|
|
103
117
|
mockExecFailureOnce();
|
|
104
118
|
mockExecSuccessOnce('codex-acp 0.5.0\n');
|
|
119
|
+
mockExecFailureOnce();
|
|
120
|
+
mockExecFailureOnce();
|
|
105
121
|
|
|
106
122
|
const result = await detector.detect();
|
|
107
123
|
|
|
108
|
-
expect(result).toHaveLength(
|
|
124
|
+
expect(result).toHaveLength(7);
|
|
109
125
|
expect(result[4]).toEqual({ type: 'codex', available: true, version: '0.5.0' });
|
|
110
126
|
});
|
|
111
127
|
|
|
128
|
+
it('should detect mimo_code only when other servers fail', async () => {
|
|
129
|
+
mockExecFailureOnce();
|
|
130
|
+
mockExecFailureOnce();
|
|
131
|
+
mockExecFailureOnce();
|
|
132
|
+
mockExecFailureOnce();
|
|
133
|
+
mockExecFailureOnce();
|
|
134
|
+
mockExecSuccessOnce('mimo 0.1.0\n');
|
|
135
|
+
mockExecFailureOnce();
|
|
136
|
+
|
|
137
|
+
const result = await detector.detect();
|
|
138
|
+
|
|
139
|
+
expect(result).toHaveLength(7);
|
|
140
|
+
expect(result[5]).toEqual({ type: 'mimo_code', available: true, version: '0.1.0' });
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('should detect kimi_code only when other servers fail', async () => {
|
|
144
|
+
mockExecFailureOnce();
|
|
145
|
+
mockExecFailureOnce();
|
|
146
|
+
mockExecFailureOnce();
|
|
147
|
+
mockExecFailureOnce();
|
|
148
|
+
mockExecFailureOnce();
|
|
149
|
+
mockExecFailureOnce();
|
|
150
|
+
mockExecSuccessOnce('kimi 2.0.0\n');
|
|
151
|
+
|
|
152
|
+
const result = await detector.detect();
|
|
153
|
+
|
|
154
|
+
expect(result).toHaveLength(7);
|
|
155
|
+
expect(result[6]).toEqual({ type: 'kimi_code', available: true, version: '2.0.0' });
|
|
156
|
+
});
|
|
157
|
+
|
|
112
158
|
it('should parse version with different formats', async () => {
|
|
113
159
|
mockExecSuccessOnce('OpenCode version 2.0.1\n');
|
|
114
160
|
mockExecSuccessOnce('copilot 3.0.0\n');
|
|
115
161
|
mockExecSuccessOnce('v0.1.0\n');
|
|
116
162
|
mockExecSuccessOnce('Gemini 2.0.0\n');
|
|
117
163
|
mockExecSuccessOnce('codex-acp version 0.5.0\n');
|
|
164
|
+
mockExecSuccessOnce('MiMo CLI v1.0.0\n');
|
|
165
|
+
mockExecSuccessOnce('kimi 2.0.0\n');
|
|
118
166
|
|
|
119
167
|
const result = await detector.detect();
|
|
120
168
|
|
|
@@ -123,6 +171,8 @@ describe('AcpDetector', () => {
|
|
|
123
171
|
expect(result[2].version).toBe('0.1.0');
|
|
124
172
|
expect(result[3].version).toBe('2.0.0');
|
|
125
173
|
expect(result[4].version).toBe('0.5.0');
|
|
174
|
+
expect(result[5].version).toBe('1.0.0');
|
|
175
|
+
expect(result[6].version).toBe('2.0.0');
|
|
126
176
|
});
|
|
127
177
|
});
|
|
128
178
|
|
|
@@ -152,6 +202,16 @@ describe('AcpDetector', () => {
|
|
|
152
202
|
expect(config).toEqual({ command: 'codex-acp', args: [] });
|
|
153
203
|
});
|
|
154
204
|
|
|
205
|
+
it('should return mimo_code spawner config', () => {
|
|
206
|
+
const config = detector.getSpawnerConfig('mimo_code');
|
|
207
|
+
expect(config).toEqual({ command: 'mimo', args: ['acp'] });
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it('should return kimi_code spawner config', () => {
|
|
211
|
+
const config = detector.getSpawnerConfig('kimi_code');
|
|
212
|
+
expect(config).toEqual({ command: 'kimi', args: ['acp'] });
|
|
213
|
+
});
|
|
214
|
+
|
|
155
215
|
it('should return opencode as default for unknown serverType', () => {
|
|
156
216
|
const config = detector.getSpawnerConfig('unknown_server');
|
|
157
217
|
expect(config).toEqual({ command: 'opencode', args: ['acp'] });
|