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.
@@ -10,6 +10,8 @@ export declare class AcpDetector {
10
10
  private detectClaudeCode;
11
11
  private detectGeminiCli;
12
12
  private detectCodex;
13
+ private detectMiMoCode;
14
+ private detectKimiCode;
13
15
  getSpawnerConfig(serverType: string): {
14
16
  command: string;
15
17
  args: string[];
@@ -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;YAW1B,cAAc;YAUd,mBAAmB;YAUnB,gBAAgB;YAUhB,eAAe;YAUf,WAAW;IAUzB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IAgBzE,OAAO,CAAC,YAAY;CAIrB;AAED,eAAO,MAAM,WAAW,aAAoB,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"}
@@ -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'] };
@@ -1 +1 @@
1
- {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/acp/detector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/acp/detector.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-gear",
3
- "version": "1.1.4",
3
+ "version": "1.1.5",
4
4
  "description": "ZeroAsh Agent Gear - Agent controller daemon",
5
5
  "repository": {
6
6
  "type": "git",
@@ -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 5 servers when all available', async () => {
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(5);
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(5);
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(5);
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(5);
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(5);
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'] });