@yu_robotics/remote-cli 1.1.9 → 1.1.11
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/client/MessageHandler.d.ts +17 -2
- package/dist/client/MessageHandler.d.ts.map +1 -1
- package/dist/client/MessageHandler.js +85 -0
- package/dist/client/MessageHandler.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +2 -1
- package/dist/commands/start.js.map +1 -1
- package/dist/executor/GeminiExecutor.d.ts +51 -0
- package/dist/executor/GeminiExecutor.d.ts.map +1 -0
- package/dist/executor/GeminiExecutor.js +167 -0
- package/dist/executor/GeminiExecutor.js.map +1 -0
- package/dist/executor/IExecutor.d.ts +34 -0
- package/dist/executor/IExecutor.d.ts.map +1 -0
- package/dist/executor/IExecutor.js +3 -0
- package/dist/executor/IExecutor.js.map +1 -0
- package/dist/executor/acp/AcpClient.d.ts +47 -0
- package/dist/executor/acp/AcpClient.d.ts.map +1 -0
- package/dist/executor/acp/AcpClient.js +245 -0
- package/dist/executor/acp/AcpClient.js.map +1 -0
- package/dist/executor/acp/AcpTypes.d.ts +91 -0
- package/dist/executor/acp/AcpTypes.d.ts.map +1 -0
- package/dist/executor/acp/AcpTypes.js +8 -0
- package/dist/executor/acp/AcpTypes.js.map +1 -0
- package/dist/executor/acp/SessionManager.d.ts +28 -0
- package/dist/executor/acp/SessionManager.d.ts.map +1 -0
- package/dist/executor/acp/SessionManager.js +93 -0
- package/dist/executor/acp/SessionManager.js.map +1 -0
- package/dist/executor/index.d.ts +15 -1
- package/dist/executor/index.d.ts.map +1 -1
- package/dist/executor/index.js +42 -2
- package/dist/executor/index.js.map +1 -1
- package/dist/types/config.d.ts +21 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.AcpClient = void 0;
|
|
37
|
+
const child_process_1 = require("child_process");
|
|
38
|
+
const readline = __importStar(require("readline"));
|
|
39
|
+
/**
|
|
40
|
+
* Bidirectional JSON-RPC 2.0 transport for Gemini CLI ACP.
|
|
41
|
+
*
|
|
42
|
+
* Manages a single Gemini CLI child process and routes messages:
|
|
43
|
+
* - Outgoing: sendRequest / sendNotification over stdin
|
|
44
|
+
* - Incoming: responses, notifications, server-side requests (permission) over stdout
|
|
45
|
+
*
|
|
46
|
+
* Permissions are auto-approved with allow_once unless a custom onPermissionRequest
|
|
47
|
+
* callback is provided.
|
|
48
|
+
*/
|
|
49
|
+
class AcpClient {
|
|
50
|
+
child;
|
|
51
|
+
pendingRequests = new Map();
|
|
52
|
+
nextId = 1;
|
|
53
|
+
callbacks;
|
|
54
|
+
rl;
|
|
55
|
+
destroyed = false;
|
|
56
|
+
constructor(geminiCommand, geminiArgs, cwd, callbacks) {
|
|
57
|
+
this.callbacks = callbacks;
|
|
58
|
+
this.child = (0, child_process_1.spawn)(geminiCommand, geminiArgs, {
|
|
59
|
+
cwd,
|
|
60
|
+
stdio: ['pipe', 'pipe', 'inherit'],
|
|
61
|
+
env: process.env,
|
|
62
|
+
});
|
|
63
|
+
this.rl = readline.createInterface({ input: this.child.stdout });
|
|
64
|
+
this.rl.on('line', (line) => this.handleLine(line));
|
|
65
|
+
this.child.on('error', (err) => {
|
|
66
|
+
console.error('[AcpClient] Child process error:', err.message);
|
|
67
|
+
this.rejectAllPending(err);
|
|
68
|
+
});
|
|
69
|
+
this.child.on('exit', (code, signal) => {
|
|
70
|
+
if (!this.destroyed) {
|
|
71
|
+
console.warn(`[AcpClient] Child exited unexpectedly: code=${code} signal=${signal}`);
|
|
72
|
+
this.rejectAllPending(new Error(`Gemini CLI exited: code=${code} signal=${signal}`));
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// ─── ACP lifecycle ──────────────────────────────────────────────────────────
|
|
77
|
+
async initialize() {
|
|
78
|
+
const result = await this.sendRequest('initialize', { protocolVersion: 1 });
|
|
79
|
+
console.log(`[AcpClient] Initialized, server protocol version: ${result.protocolVersion}`);
|
|
80
|
+
}
|
|
81
|
+
async newSession(cwd) {
|
|
82
|
+
const result = await this.sendRequest('session/new', { cwd });
|
|
83
|
+
return result.sessionId;
|
|
84
|
+
}
|
|
85
|
+
async prompt(sessionId, text) {
|
|
86
|
+
const result = await this.sendRequest('session/prompt', { sessionId, prompt: text });
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
sendCancel(sessionId) {
|
|
90
|
+
this.sendNotification('session/cancel', { sessionId });
|
|
91
|
+
}
|
|
92
|
+
destroy() {
|
|
93
|
+
if (this.destroyed)
|
|
94
|
+
return;
|
|
95
|
+
this.destroyed = true;
|
|
96
|
+
this.rl.close();
|
|
97
|
+
if (!this.child.killed) {
|
|
98
|
+
this.child.kill('SIGTERM');
|
|
99
|
+
}
|
|
100
|
+
this.rejectAllPending(new Error('AcpClient destroyed'));
|
|
101
|
+
}
|
|
102
|
+
// ─── Internal message routing ───────────────────────────────────────────────
|
|
103
|
+
sendRequest(method, params) {
|
|
104
|
+
return new Promise((resolve, reject) => {
|
|
105
|
+
const id = this.nextId++;
|
|
106
|
+
const msg = { jsonrpc: '2.0', id, method, params };
|
|
107
|
+
this.pendingRequests.set(id, { resolve, reject });
|
|
108
|
+
this.writeLine(msg);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
sendNotification(method, params) {
|
|
112
|
+
const msg = { jsonrpc: '2.0', method, params };
|
|
113
|
+
this.writeLine(msg);
|
|
114
|
+
}
|
|
115
|
+
sendResponse(id, result) {
|
|
116
|
+
const msg = { jsonrpc: '2.0', id, result };
|
|
117
|
+
this.writeLine(msg);
|
|
118
|
+
}
|
|
119
|
+
sendErrorResponse(id, code, message) {
|
|
120
|
+
const msg = { jsonrpc: '2.0', id, error: { code, message } };
|
|
121
|
+
this.writeLine(msg);
|
|
122
|
+
}
|
|
123
|
+
writeLine(msg) {
|
|
124
|
+
if (this.destroyed || !this.child.stdin)
|
|
125
|
+
return;
|
|
126
|
+
this.child.stdin.write(JSON.stringify(msg) + '\n');
|
|
127
|
+
}
|
|
128
|
+
handleLine(line) {
|
|
129
|
+
if (!line.trim())
|
|
130
|
+
return;
|
|
131
|
+
let msg;
|
|
132
|
+
try {
|
|
133
|
+
msg = JSON.parse(line);
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// Non-JSON output from Gemini CLI — ignore (e.g. startup logs)
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const obj = msg;
|
|
140
|
+
if (typeof obj['id'] === 'number' && obj['method']) {
|
|
141
|
+
// Server-side request (e.g. session/request_permission)
|
|
142
|
+
this.handleServerRequest(obj);
|
|
143
|
+
}
|
|
144
|
+
else if (typeof obj['id'] === 'number') {
|
|
145
|
+
// Response to one of our requests
|
|
146
|
+
this.handleResponse(obj);
|
|
147
|
+
}
|
|
148
|
+
else if (obj['method']) {
|
|
149
|
+
// Notification from server
|
|
150
|
+
this.handleNotification(obj);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
handleResponse(msg) {
|
|
154
|
+
const pending = this.pendingRequests.get(msg.id);
|
|
155
|
+
if (!pending)
|
|
156
|
+
return;
|
|
157
|
+
this.pendingRequests.delete(msg.id);
|
|
158
|
+
if ('error' in msg) {
|
|
159
|
+
pending.reject(new Error(`ACP error ${msg.error.code}: ${msg.error.message}`));
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
pending.resolve(msg.result);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
handleNotification(msg) {
|
|
166
|
+
if (msg.method === 'session/update') {
|
|
167
|
+
this.handleSessionUpdate(msg.params);
|
|
168
|
+
}
|
|
169
|
+
// Other notifications are silently ignored
|
|
170
|
+
}
|
|
171
|
+
handleServerRequest(msg) {
|
|
172
|
+
if (msg.method === 'session/request_permission') {
|
|
173
|
+
void this.handlePermissionRequest(msg.id, msg.params);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
// Unsupported method — return method_not_found (Gemini falls back to local filesystem ops)
|
|
177
|
+
this.sendErrorResponse(msg.id, -32601, 'Method not found');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
handleSessionUpdate(params) {
|
|
181
|
+
const { update } = params;
|
|
182
|
+
switch (update.sessionUpdate) {
|
|
183
|
+
case 'agent_message_chunk': {
|
|
184
|
+
const text = update.content.text;
|
|
185
|
+
if (text)
|
|
186
|
+
this.callbacks.onTextChunk(text);
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
case 'agent_thought_chunk': {
|
|
190
|
+
const text = update.content.text;
|
|
191
|
+
if (text && this.callbacks.onThoughtChunk) {
|
|
192
|
+
this.callbacks.onThoughtChunk(text);
|
|
193
|
+
}
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
case 'tool_call': {
|
|
197
|
+
const u = update;
|
|
198
|
+
if (this.callbacks.onToolCall) {
|
|
199
|
+
this.callbacks.onToolCall(u.toolCallId, u.title, u.kind);
|
|
200
|
+
}
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
203
|
+
case 'tool_call_update': {
|
|
204
|
+
const u = update;
|
|
205
|
+
if (u.status === 'completed' && this.callbacks.onToolResult) {
|
|
206
|
+
this.callbacks.onToolResult(u.toolCallId, u.status, u.rawOutput);
|
|
207
|
+
}
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
case 'plan': {
|
|
211
|
+
if (this.callbacks.onPlan) {
|
|
212
|
+
const text = update.content
|
|
213
|
+
.map((b) => b.text ?? '')
|
|
214
|
+
.join('');
|
|
215
|
+
this.callbacks.onPlan(text);
|
|
216
|
+
}
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
default:
|
|
220
|
+
// Unknown update type — ignore
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
async handlePermissionRequest(id, params) {
|
|
225
|
+
let chosenIndex = 0; // default: first option = allow_once
|
|
226
|
+
if (this.callbacks.onPermissionRequest) {
|
|
227
|
+
try {
|
|
228
|
+
chosenIndex = await this.callbacks.onPermissionRequest(params.toolCall.title, params.options);
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
chosenIndex = 0;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
const chosen = params.options[chosenIndex] ?? params.options[0];
|
|
235
|
+
this.sendResponse(id, { selectedOptionKind: chosen.kind });
|
|
236
|
+
}
|
|
237
|
+
rejectAllPending(error) {
|
|
238
|
+
for (const [id, pending] of this.pendingRequests) {
|
|
239
|
+
pending.reject(error);
|
|
240
|
+
this.pendingRequests.delete(id);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
exports.AcpClient = AcpClient;
|
|
245
|
+
//# sourceMappingURL=AcpClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AcpClient.js","sourceRoot":"","sources":["../../../src/executor/acp/AcpClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ACP wire format type definitions (subset needed for our client role).
|
|
3
|
+
* Gemini CLI exposes Agent Client Protocol (ACP) via --experimental-acp.
|
|
4
|
+
* ACP is JSON-RPC 2.0 over stdio (newline-delimited).
|
|
5
|
+
*/
|
|
6
|
+
export interface JsonRpcRequest {
|
|
7
|
+
jsonrpc: '2.0';
|
|
8
|
+
id: number;
|
|
9
|
+
method: string;
|
|
10
|
+
params: unknown;
|
|
11
|
+
}
|
|
12
|
+
export interface JsonRpcNotification {
|
|
13
|
+
jsonrpc: '2.0';
|
|
14
|
+
method: string;
|
|
15
|
+
params: unknown;
|
|
16
|
+
}
|
|
17
|
+
export interface JsonRpcSuccessResponse {
|
|
18
|
+
jsonrpc: '2.0';
|
|
19
|
+
id: number;
|
|
20
|
+
result: unknown;
|
|
21
|
+
}
|
|
22
|
+
export interface JsonRpcErrorResponse {
|
|
23
|
+
jsonrpc: '2.0';
|
|
24
|
+
id: number;
|
|
25
|
+
error: {
|
|
26
|
+
code: number;
|
|
27
|
+
message: string;
|
|
28
|
+
data?: unknown;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export type JsonRpcResponse = JsonRpcSuccessResponse | JsonRpcErrorResponse;
|
|
32
|
+
export interface AcpContentBlock {
|
|
33
|
+
type: 'text' | 'image' | 'resource_link' | 'resource';
|
|
34
|
+
text?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface AcpUpdateAgentMessageChunk {
|
|
37
|
+
sessionUpdate: 'agent_message_chunk';
|
|
38
|
+
content: AcpContentBlock;
|
|
39
|
+
}
|
|
40
|
+
export interface AcpUpdateAgentThoughtChunk {
|
|
41
|
+
sessionUpdate: 'agent_thought_chunk';
|
|
42
|
+
content: AcpContentBlock;
|
|
43
|
+
}
|
|
44
|
+
export interface AcpUpdateToolCall {
|
|
45
|
+
sessionUpdate: 'tool_call';
|
|
46
|
+
toolCallId: string;
|
|
47
|
+
title: string;
|
|
48
|
+
kind?: string;
|
|
49
|
+
status?: string;
|
|
50
|
+
}
|
|
51
|
+
export interface AcpUpdateToolCallUpdate {
|
|
52
|
+
sessionUpdate: 'tool_call_update';
|
|
53
|
+
toolCallId: string;
|
|
54
|
+
status: string;
|
|
55
|
+
rawOutput?: string;
|
|
56
|
+
}
|
|
57
|
+
export interface AcpUpdatePlan {
|
|
58
|
+
sessionUpdate: 'plan';
|
|
59
|
+
content: AcpContentBlock[];
|
|
60
|
+
}
|
|
61
|
+
export interface AcpUpdateUnknown {
|
|
62
|
+
sessionUpdate: string;
|
|
63
|
+
[key: string]: unknown;
|
|
64
|
+
}
|
|
65
|
+
export type AcpSessionUpdate = AcpUpdateAgentMessageChunk | AcpUpdateAgentThoughtChunk | AcpUpdateToolCall | AcpUpdateToolCallUpdate | AcpUpdatePlan | AcpUpdateUnknown;
|
|
66
|
+
export interface AcpSessionUpdateParams {
|
|
67
|
+
sessionId: string;
|
|
68
|
+
update: AcpSessionUpdate;
|
|
69
|
+
}
|
|
70
|
+
export interface AcpPermissionOption {
|
|
71
|
+
kind: 'allow_once' | 'allow_always' | 'reject_once' | 'reject_always';
|
|
72
|
+
}
|
|
73
|
+
export interface AcpRequestPermissionParams {
|
|
74
|
+
sessionId: string;
|
|
75
|
+
toolCall: {
|
|
76
|
+
toolCallId: string;
|
|
77
|
+
title: string;
|
|
78
|
+
};
|
|
79
|
+
options: AcpPermissionOption[];
|
|
80
|
+
}
|
|
81
|
+
export interface AcpInitializeResult {
|
|
82
|
+
protocolVersion: number;
|
|
83
|
+
}
|
|
84
|
+
export interface AcpNewSessionResult {
|
|
85
|
+
sessionId: string;
|
|
86
|
+
}
|
|
87
|
+
export interface AcpPromptResult {
|
|
88
|
+
sessionId: string;
|
|
89
|
+
stopReason: 'end_turn' | 'max_tokens' | 'cancelled' | 'refusal' | 'max_turn_requests';
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=AcpTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AcpTypes.d.ts","sourceRoot":"","sources":["../../../src/executor/acp/AcpTypes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CAEjB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1D;AAED,MAAM,MAAM,eAAe,GAAG,sBAAsB,GAAG,oBAAoB,CAAC;AAI5E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,eAAe,GAAG,UAAU,CAAC;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,qBAAqB,CAAC;IACrC,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,qBAAqB,CAAC;IACrC,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,WAAW,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,kBAAkB,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,gBAAgB,GACxB,0BAA0B,GAC1B,0BAA0B,GAC1B,iBAAiB,GACjB,uBAAuB,GACvB,aAAa,GACb,gBAAgB,CAAC;AAErB,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAID,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,YAAY,GAAG,cAAc,GAAG,aAAa,GAAG,eAAe,CAAC;CACvE;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC;AAID,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,SAAS,GAAG,mBAAmB,CAAC;CACvF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ACP wire format type definitions (subset needed for our client role).
|
|
4
|
+
* Gemini CLI exposes Agent Client Protocol (ACP) via --experimental-acp.
|
|
5
|
+
* ACP is JSON-RPC 2.0 over stdio (newline-delimited).
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
//# sourceMappingURL=AcpTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AcpTypes.js","sourceRoot":"","sources":["../../../src/executor/acp/AcpTypes.ts"],"names":[],"mappings":";AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface SessionEntry {
|
|
2
|
+
role: 'user' | 'assistant';
|
|
3
|
+
text: string;
|
|
4
|
+
ts: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Persists Gemini conversation history as JSONL files for multi-turn context replay.
|
|
8
|
+
*
|
|
9
|
+
* Storage: ~/.remote-cli/gemini-sessions/{sessionId}.jsonl
|
|
10
|
+
* Each line: {"role":"user"|"assistant","text":"...","ts":1234567890}
|
|
11
|
+
*
|
|
12
|
+
* ACP's session/resume is experimental, so we use history replay instead —
|
|
13
|
+
* the same approach used by vibe-kanban.
|
|
14
|
+
*/
|
|
15
|
+
export declare class SessionManager {
|
|
16
|
+
private baseDir;
|
|
17
|
+
constructor(baseDir?: string);
|
|
18
|
+
private filePath;
|
|
19
|
+
append(sessionId: string, role: 'user' | 'assistant', text: string): void;
|
|
20
|
+
/**
|
|
21
|
+
* Build a context prefix that replays prior conversation history.
|
|
22
|
+
* Returns empty string if no history exists yet.
|
|
23
|
+
*/
|
|
24
|
+
buildResumeContext(sessionId: string): string;
|
|
25
|
+
clear(sessionId: string): void;
|
|
26
|
+
remove(sessionId: string): void;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=SessionManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../../src/executor/acp/SessionManager.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;;GAQG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,CAAC,EAAE,MAAM;IAK5B,OAAO,CAAC,QAAQ;IAIhB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAKzE;;;OAGG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAgB7C,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAO9B,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAMhC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.SessionManager = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const os = __importStar(require("os"));
|
|
40
|
+
/**
|
|
41
|
+
* Persists Gemini conversation history as JSONL files for multi-turn context replay.
|
|
42
|
+
*
|
|
43
|
+
* Storage: ~/.remote-cli/gemini-sessions/{sessionId}.jsonl
|
|
44
|
+
* Each line: {"role":"user"|"assistant","text":"...","ts":1234567890}
|
|
45
|
+
*
|
|
46
|
+
* ACP's session/resume is experimental, so we use history replay instead —
|
|
47
|
+
* the same approach used by vibe-kanban.
|
|
48
|
+
*/
|
|
49
|
+
class SessionManager {
|
|
50
|
+
baseDir;
|
|
51
|
+
constructor(baseDir) {
|
|
52
|
+
this.baseDir = baseDir ?? path.join(os.homedir(), '.remote-cli', 'gemini-sessions');
|
|
53
|
+
fs.mkdirSync(this.baseDir, { recursive: true });
|
|
54
|
+
}
|
|
55
|
+
filePath(sessionId) {
|
|
56
|
+
return path.join(this.baseDir, `${sessionId}.jsonl`);
|
|
57
|
+
}
|
|
58
|
+
append(sessionId, role, text) {
|
|
59
|
+
const entry = { role, text, ts: Date.now() };
|
|
60
|
+
fs.appendFileSync(this.filePath(sessionId), JSON.stringify(entry) + '\n', 'utf8');
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Build a context prefix that replays prior conversation history.
|
|
64
|
+
* Returns empty string if no history exists yet.
|
|
65
|
+
*/
|
|
66
|
+
buildResumeContext(sessionId) {
|
|
67
|
+
const file = this.filePath(sessionId);
|
|
68
|
+
if (!fs.existsSync(file))
|
|
69
|
+
return '';
|
|
70
|
+
const lines = fs.readFileSync(file, 'utf8').trim().split('\n').filter(Boolean);
|
|
71
|
+
if (lines.length === 0)
|
|
72
|
+
return '';
|
|
73
|
+
const entries = lines.map((l) => JSON.parse(l));
|
|
74
|
+
const formatted = entries
|
|
75
|
+
.map((e) => (e.role === 'user' ? `[User]: ${e.text}` : `[Assistant]: ${e.text}`))
|
|
76
|
+
.join('\n');
|
|
77
|
+
return `=== PREVIOUS CONVERSATION ===\n${formatted}\n=== NEW REQUEST ===\n`;
|
|
78
|
+
}
|
|
79
|
+
clear(sessionId) {
|
|
80
|
+
const file = this.filePath(sessionId);
|
|
81
|
+
if (fs.existsSync(file)) {
|
|
82
|
+
fs.writeFileSync(file, '', 'utf8');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
remove(sessionId) {
|
|
86
|
+
const file = this.filePath(sessionId);
|
|
87
|
+
if (fs.existsSync(file)) {
|
|
88
|
+
fs.unlinkSync(file);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.SessionManager = SessionManager;
|
|
93
|
+
//# sourceMappingURL=SessionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../../../src/executor/acp/SessionManager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAQzB;;;;;;;;GAQG;AACH,MAAa,cAAc;IACjB,OAAO,CAAS;IAExB,YAAY,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,iBAAiB,CAAC,CAAC;QACpF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAEO,QAAQ,CAAC,SAAiB;QAChC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,SAAS,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,SAAiB,EAAE,IAA0B,EAAE,IAAY;QAChE,MAAM,KAAK,GAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC3D,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IACpF,CAAC;IAED;;;OAGG;IACH,kBAAkB,CAAC,SAAiB;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QAEpC,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAElC,MAAM,OAAO,GAAmB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAiB,CAAC,CAAC;QAEhF,MAAM,SAAS,GAAG,OAAO;aACtB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;aAChF,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,OAAO,kCAAkC,SAAS,yBAAyB,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,SAAiB;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,SAAiB;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;CACF;AAlDD,wCAkDC"}
|
package/dist/executor/index.d.ts
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
import { DirectoryGuard } from '../security/DirectoryGuard';
|
|
2
2
|
import { ClaudeExecutor } from './ClaudeExecutor';
|
|
3
3
|
import { ClaudePersistentExecutor } from './ClaudePersistentExecutor';
|
|
4
|
+
import type { IExecutor } from './IExecutor';
|
|
5
|
+
import type { ExecutorConfig } from '../types/config';
|
|
4
6
|
export type { ClaudeExecuteOptions, ClaudeExecuteResult } from './ClaudeExecutor';
|
|
5
7
|
export type { PersistentClaudeOptions, PersistentClaudeResult } from './ClaudePersistentExecutor';
|
|
6
8
|
export { ClaudeExecutor } from './ClaudeExecutor';
|
|
7
9
|
export { ClaudePersistentExecutor } from './ClaudePersistentExecutor';
|
|
10
|
+
export { GeminiExecutor } from './GeminiExecutor';
|
|
11
|
+
export type { IExecutor } from './IExecutor';
|
|
8
12
|
/**
|
|
9
13
|
* Executor type
|
|
10
14
|
*/
|
|
11
15
|
export type ExecutorType = 'persistent' | 'spawn' | 'auto';
|
|
12
16
|
/**
|
|
13
|
-
* Create an appropriate Claude executor
|
|
17
|
+
* Create an appropriate Claude executor (legacy API — preserved for backward compatibility)
|
|
14
18
|
*
|
|
15
19
|
* @param directoryGuard Directory guard instance
|
|
16
20
|
* @param type Executor type: 'persistent' (long-running process), 'spawn' (one-shot process), or 'auto' (choose based on environment)
|
|
@@ -18,4 +22,14 @@ export type ExecutorType = 'persistent' | 'spawn' | 'auto';
|
|
|
18
22
|
* @returns Executor instance
|
|
19
23
|
*/
|
|
20
24
|
export declare function createClaudeExecutor(directoryGuard: DirectoryGuard, type?: ExecutorType, initialWorkingDirectory?: string): ClaudeExecutor | ClaudePersistentExecutor;
|
|
25
|
+
/**
|
|
26
|
+
* Create an executor based on the executor config.
|
|
27
|
+
* Supports Claude (persistent / spawn / auto) and Gemini (via ACP).
|
|
28
|
+
*
|
|
29
|
+
* @param directoryGuard Directory guard instance
|
|
30
|
+
* @param executorConfig Executor config from remote-cli config (defaults to auto)
|
|
31
|
+
* @param initialWorkingDirectory Optional initial working directory
|
|
32
|
+
* @returns IExecutor instance
|
|
33
|
+
*/
|
|
34
|
+
export declare function createExecutor(directoryGuard: DirectoryGuard, executorConfig?: ExecutorConfig, initialWorkingDirectory?: string): IExecutor;
|
|
21
35
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/executor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAClF,YAAY,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAClG,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/executor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAClF,YAAY,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAClG,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAmB7C;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,OAAO,GAAG,MAAM,CAAC;AAE3D;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,cAAc,EAC9B,IAAI,GAAE,YAAqB,EAC3B,uBAAuB,CAAC,EAAE,MAAM,GAC/B,cAAc,GAAG,wBAAwB,CAiB3C;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,cAAc,EAAE,cAAc,EAC9B,cAAc,GAAE,cAAiC,EACjD,uBAAuB,CAAC,EAAE,MAAM,GAC/B,SAAS,CA6BX"}
|
package/dist/executor/index.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ClaudePersistentExecutor = exports.ClaudeExecutor = void 0;
|
|
3
|
+
exports.GeminiExecutor = exports.ClaudePersistentExecutor = exports.ClaudeExecutor = void 0;
|
|
4
4
|
exports.createClaudeExecutor = createClaudeExecutor;
|
|
5
|
+
exports.createExecutor = createExecutor;
|
|
5
6
|
const ClaudeExecutor_1 = require("./ClaudeExecutor");
|
|
6
7
|
const ClaudePersistentExecutor_1 = require("./ClaudePersistentExecutor");
|
|
8
|
+
const GeminiExecutor_1 = require("./GeminiExecutor");
|
|
7
9
|
var ClaudeExecutor_2 = require("./ClaudeExecutor");
|
|
8
10
|
Object.defineProperty(exports, "ClaudeExecutor", { enumerable: true, get: function () { return ClaudeExecutor_2.ClaudeExecutor; } });
|
|
9
11
|
var ClaudePersistentExecutor_2 = require("./ClaudePersistentExecutor");
|
|
10
12
|
Object.defineProperty(exports, "ClaudePersistentExecutor", { enumerable: true, get: function () { return ClaudePersistentExecutor_2.ClaudePersistentExecutor; } });
|
|
13
|
+
var GeminiExecutor_2 = require("./GeminiExecutor");
|
|
14
|
+
Object.defineProperty(exports, "GeminiExecutor", { enumerable: true, get: function () { return GeminiExecutor_2.GeminiExecutor; } });
|
|
11
15
|
/**
|
|
12
16
|
* Check if we're running inside a Claude Code session
|
|
13
17
|
*/
|
|
@@ -23,7 +27,7 @@ function isRunningInsideClaudeCode() {
|
|
|
23
27
|
return false;
|
|
24
28
|
}
|
|
25
29
|
/**
|
|
26
|
-
* Create an appropriate Claude executor
|
|
30
|
+
* Create an appropriate Claude executor (legacy API — preserved for backward compatibility)
|
|
27
31
|
*
|
|
28
32
|
* @param directoryGuard Directory guard instance
|
|
29
33
|
* @param type Executor type: 'persistent' (long-running process), 'spawn' (one-shot process), or 'auto' (choose based on environment)
|
|
@@ -46,4 +50,40 @@ function createClaudeExecutor(directoryGuard, type = 'auto', initialWorkingDirec
|
|
|
46
50
|
}
|
|
47
51
|
return new ClaudeExecutor_1.ClaudeExecutor(directoryGuard);
|
|
48
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Create an executor based on the executor config.
|
|
55
|
+
* Supports Claude (persistent / spawn / auto) and Gemini (via ACP).
|
|
56
|
+
*
|
|
57
|
+
* @param directoryGuard Directory guard instance
|
|
58
|
+
* @param executorConfig Executor config from remote-cli config (defaults to auto)
|
|
59
|
+
* @param initialWorkingDirectory Optional initial working directory
|
|
60
|
+
* @returns IExecutor instance
|
|
61
|
+
*/
|
|
62
|
+
function createExecutor(directoryGuard, executorConfig = { type: 'auto' }, initialWorkingDirectory) {
|
|
63
|
+
switch (executorConfig.type) {
|
|
64
|
+
case 'gemini':
|
|
65
|
+
console.log('[ExecutorFactory] Using Gemini CLI executor (ACP)');
|
|
66
|
+
return new GeminiExecutor_1.GeminiExecutor(directoryGuard, {
|
|
67
|
+
model: executorConfig.gemini?.model,
|
|
68
|
+
autoApprove: executorConfig.gemini?.autoApprove ?? true,
|
|
69
|
+
initialWorkingDirectory,
|
|
70
|
+
geminiCommand: executorConfig.gemini?.command,
|
|
71
|
+
geminiVersion: executorConfig.gemini?.version,
|
|
72
|
+
});
|
|
73
|
+
case 'claude-persistent':
|
|
74
|
+
console.log('[ExecutorFactory] Using Claude persistent executor');
|
|
75
|
+
return new ClaudePersistentExecutor_1.ClaudePersistentExecutor(directoryGuard, initialWorkingDirectory);
|
|
76
|
+
case 'claude-spawn':
|
|
77
|
+
console.log('[ExecutorFactory] Using Claude spawn executor');
|
|
78
|
+
return new ClaudeExecutor_1.ClaudeExecutor(directoryGuard);
|
|
79
|
+
case 'auto':
|
|
80
|
+
default:
|
|
81
|
+
if (isRunningInsideClaudeCode()) {
|
|
82
|
+
console.log('[ExecutorFactory] Detected nested Claude Code session, using spawn mode');
|
|
83
|
+
return new ClaudeExecutor_1.ClaudeExecutor(directoryGuard);
|
|
84
|
+
}
|
|
85
|
+
console.log('[ExecutorFactory] Using Claude persistent executor (auto)');
|
|
86
|
+
return new ClaudePersistentExecutor_1.ClaudePersistentExecutor(directoryGuard, initialWorkingDirectory);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
49
89
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/executor/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/executor/index.ts"],"names":[],"mappings":";;;AA4CA,oDAqBC;AAWD,wCAiCC;AA5GD,qDAAkD;AAClD,yEAAsE;AACtE,qDAAkD;AAMlD,mDAAkD;AAAzC,gHAAA,cAAc,OAAA;AACvB,uEAAsE;AAA7D,oIAAA,wBAAwB,OAAA;AACjC,mDAAkD;AAAzC,gHAAA,cAAc,OAAA;AAGvB;;GAEG;AACH,SAAS,yBAAyB;IAChC,4CAA4C;IAC5C,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6BAA6B;IAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAOD;;;;;;;GAOG;AACH,SAAgB,oBAAoB,CAClC,cAA8B,EAC9B,OAAqB,MAAM,EAC3B,uBAAgC;IAEhC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,0FAA0F;QAC1F,IAAI,yBAAyB,EAAE,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;YACvF,OAAO,IAAI,+BAAc,CAAC,cAAc,CAAC,CAAC;QAC5C,CAAC;QACD,gCAAgC;QAChC,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;QAC9E,OAAO,IAAI,mDAAwB,CAAC,cAAc,EAAE,uBAAuB,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,OAAO,IAAI,mDAAwB,CAAC,cAAc,EAAE,uBAAuB,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO,IAAI,+BAAc,CAAC,cAAc,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,cAAc,CAC5B,cAA8B,EAC9B,iBAAiC,EAAE,IAAI,EAAE,MAAM,EAAE,EACjD,uBAAgC;IAEhC,QAAQ,cAAc,CAAC,IAAI,EAAE,CAAC;QAC5B,KAAK,QAAQ;YACX,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;YACjE,OAAO,IAAI,+BAAc,CAAC,cAAc,EAAE;gBACxC,KAAK,EAAE,cAAc,CAAC,MAAM,EAAE,KAAK;gBACnC,WAAW,EAAE,cAAc,CAAC,MAAM,EAAE,WAAW,IAAI,IAAI;gBACvD,uBAAuB;gBACvB,aAAa,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO;gBAC7C,aAAa,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO;aAC9C,CAAC,CAAC;QAEL,KAAK,mBAAmB;YACtB,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;YAClE,OAAO,IAAI,mDAAwB,CAAC,cAAc,EAAE,uBAAuB,CAAC,CAAC;QAE/E,KAAK,cAAc;YACjB,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;YAC7D,OAAO,IAAI,+BAAc,CAAC,cAAc,CAAC,CAAC;QAE5C,KAAK,MAAM,CAAC;QACZ;YACE,IAAI,yBAAyB,EAAE,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;gBACvF,OAAO,IAAI,+BAAc,CAAC,cAAc,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;YACzE,OAAO,IAAI,mDAAwB,CAAC,cAAc,EAAE,uBAAuB,CAAC,CAAC;IACjF,CAAC;AACH,CAAC"}
|
package/dist/types/config.d.ts
CHANGED
|
@@ -23,6 +23,25 @@ export interface ServerConfig {
|
|
|
23
23
|
/** Heartbeat interval (milliseconds) */
|
|
24
24
|
heartbeatInterval: number;
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Gemini executor configuration
|
|
28
|
+
*/
|
|
29
|
+
export interface GeminiExecutorConfig {
|
|
30
|
+
model?: string;
|
|
31
|
+
/** Auto-approve all tool permissions. Default: true. False = future Feishu approval flow. */
|
|
32
|
+
autoApprove?: boolean;
|
|
33
|
+
/** Override CLI command (default: 'npx') */
|
|
34
|
+
command?: string;
|
|
35
|
+
/** Pin gemini-cli version (default: '@google/gemini-cli@latest') */
|
|
36
|
+
version?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Executor configuration — controls which AI CLI backend is used
|
|
40
|
+
*/
|
|
41
|
+
export interface ExecutorConfig {
|
|
42
|
+
type: 'auto' | 'claude-persistent' | 'claude-spawn' | 'gemini';
|
|
43
|
+
gemini?: GeminiExecutorConfig;
|
|
44
|
+
}
|
|
26
45
|
/**
|
|
27
46
|
* Complete configuration
|
|
28
47
|
*/
|
|
@@ -39,6 +58,8 @@ export interface Config {
|
|
|
39
58
|
stoppedAt?: number;
|
|
40
59
|
pid?: number;
|
|
41
60
|
};
|
|
61
|
+
/** Executor backend selection. Defaults to 'auto' (Claude persistent or spawn). */
|
|
62
|
+
executor?: ExecutorConfig;
|
|
42
63
|
}
|
|
43
64
|
/**
|
|
44
65
|
* Default configuration
|