@yu_robotics/remote-cli 1.1.47 → 1.4.0
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 +26 -1
- package/dist/client/MessageHandler.d.ts.map +1 -1
- package/dist/client/MessageHandler.js +81 -9
- package/dist/client/MessageHandler.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +6 -4
- package/dist/commands/start.js.map +1 -1
- package/dist/executor/AgyExecutor.d.ts +125 -0
- package/dist/executor/AgyExecutor.d.ts.map +1 -0
- package/dist/executor/AgyExecutor.js +637 -0
- package/dist/executor/AgyExecutor.js.map +1 -0
- package/dist/executor/ClaudePersistentExecutor.d.ts +2 -0
- package/dist/executor/ClaudePersistentExecutor.d.ts.map +1 -1
- package/dist/executor/ClaudePersistentExecutor.js +27 -0
- package/dist/executor/ClaudePersistentExecutor.js.map +1 -1
- package/dist/executor/CodexExecutor.d.ts +127 -0
- package/dist/executor/CodexExecutor.d.ts.map +1 -0
- package/dist/executor/CodexExecutor.js +696 -0
- package/dist/executor/CodexExecutor.js.map +1 -0
- package/dist/executor/IExecutor.d.ts +1 -1
- package/dist/executor/compactHandoff.d.ts +26 -0
- package/dist/executor/compactHandoff.d.ts.map +1 -0
- package/dist/executor/compactHandoff.js +48 -0
- package/dist/executor/compactHandoff.js.map +1 -0
- package/dist/executor/index.d.ts +9 -2
- package/dist/executor/index.d.ts.map +1 -1
- package/dist/executor/index.js +47 -12
- package/dist/executor/index.js.map +1 -1
- package/dist/hooks/ClaudeCodeHooks.d.ts +32 -0
- package/dist/hooks/ClaudeCodeHooks.d.ts.map +1 -1
- package/dist/hooks/ClaudeCodeHooks.js +14 -0
- package/dist/hooks/ClaudeCodeHooks.js.map +1 -1
- package/dist/hooks/FeishuNotificationAdapter.d.ts +16 -0
- package/dist/hooks/FeishuNotificationAdapter.d.ts.map +1 -1
- package/dist/hooks/FeishuNotificationAdapter.js +52 -0
- package/dist/hooks/FeishuNotificationAdapter.js.map +1 -1
- package/dist/security/HooksConfigurator.d.ts.map +1 -1
- package/dist/security/HooksConfigurator.js +13 -3
- package/dist/security/HooksConfigurator.js.map +1 -1
- package/dist/thread/ThreadManager.d.ts +1 -1
- package/dist/thread/ThreadManager.js +1 -1
- package/dist/types/config.d.ts +33 -5
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/dist/types/index.d.ts +22 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,637 @@
|
|
|
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.AgyExecutor = void 0;
|
|
37
|
+
const child_process_1 = require("child_process");
|
|
38
|
+
const string_decoder_1 = require("string_decoder");
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const os = __importStar(require("os"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const compactHandoff_1 = require("./compactHandoff");
|
|
43
|
+
/** Default inactivity timeout (ms) — a silent agy process fails the command. */
|
|
44
|
+
const DEFAULT_INACTIVITY_TIMEOUT_MS = 10 * 60 * 1000;
|
|
45
|
+
/** Default grace period (ms) before SIGTERM escalates to SIGKILL. */
|
|
46
|
+
const DEFAULT_KILL_ESCALATION_MS = 3_000;
|
|
47
|
+
/**
|
|
48
|
+
* Map an AGY tool call to a Claude-compatible { name, input } shape so the
|
|
49
|
+
* router's ToolFormatter renders it with the same card style as Claude tools.
|
|
50
|
+
* Unknown tools keep their raw name and parameters (generic rendering).
|
|
51
|
+
*
|
|
52
|
+
* AGY parameter keys are PascalCase (e.g. run_command takes `CommandLine`).
|
|
53
|
+
*/
|
|
54
|
+
function mapAgyTool(toolName, parameters) {
|
|
55
|
+
switch (toolName) {
|
|
56
|
+
case 'run_command':
|
|
57
|
+
return { name: 'Bash', input: { command: parameters.CommandLine ?? '' } };
|
|
58
|
+
case 'view_file':
|
|
59
|
+
return { name: 'Read', input: { file_path: parameters.AbsolutePath ?? parameters.Path ?? '' } };
|
|
60
|
+
case 'write_to_file':
|
|
61
|
+
return { name: 'Write', input: { file_path: parameters.AbsolutePath ?? parameters.Path ?? '' } };
|
|
62
|
+
case 'replace_file_content':
|
|
63
|
+
case 'multi_replace_file_content':
|
|
64
|
+
case 'sed_file':
|
|
65
|
+
return { name: 'Edit', input: { file_path: parameters.AbsolutePath ?? parameters.Path ?? '' } };
|
|
66
|
+
case 'grep_search':
|
|
67
|
+
return { name: 'Grep', input: parameters };
|
|
68
|
+
case 'find_by_name':
|
|
69
|
+
return { name: 'Glob', input: parameters };
|
|
70
|
+
case 'search_web':
|
|
71
|
+
return { name: 'WebSearch', input: { query: parameters.Query ?? '' } };
|
|
72
|
+
case 'read_url_content':
|
|
73
|
+
return { name: 'WebFetch', input: { url: parameters.Url ?? '' } };
|
|
74
|
+
default:
|
|
75
|
+
return { name: toolName, input: parameters };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** Result statuses that mean the turn was aborted rather than failed. */
|
|
79
|
+
const ABORTED_STATUSES = new Set(['INTERRUPTED', 'CANCELED']);
|
|
80
|
+
/**
|
|
81
|
+
* IExecutor implementation for the Antigravity CLI (`agy`) — Google's
|
|
82
|
+
* agentic CLI from the Antigravity suite.
|
|
83
|
+
*
|
|
84
|
+
* agy speaks a Claude-Code-style stream-json protocol: one persistent
|
|
85
|
+
* process per conversation, NDJSON prompts in on stdin
|
|
86
|
+
* ({"event":"user","message":{"content":"..."}}), NDJSON events out on
|
|
87
|
+
* stdout (init / step_update / result). Conversations survive process
|
|
88
|
+
* restarts via `--conversation <id>`, which we persist per thread.
|
|
89
|
+
*
|
|
90
|
+
* The process is respawned (resuming the conversation) when:
|
|
91
|
+
* - setWorkingDirectory() changes cwd
|
|
92
|
+
* - the process exits unexpectedly
|
|
93
|
+
* - abort() kills it mid-command
|
|
94
|
+
* resetContext()/compactWhenFull() additionally drop the conversation id,
|
|
95
|
+
* so the next command starts a fresh session (agy has no /compact).
|
|
96
|
+
*
|
|
97
|
+
* Note: agy stream-json input supports text blocks only — image
|
|
98
|
+
* attachments are silently dropped (with a log line).
|
|
99
|
+
*/
|
|
100
|
+
class AgyExecutor {
|
|
101
|
+
directoryGuard;
|
|
102
|
+
currentWorkingDirectory;
|
|
103
|
+
/** Model for the next spawn. Mutable: setModel() updates it in place. */
|
|
104
|
+
model;
|
|
105
|
+
autoApprove;
|
|
106
|
+
agyCommand;
|
|
107
|
+
threadId;
|
|
108
|
+
proc = null;
|
|
109
|
+
conversationId = null;
|
|
110
|
+
sessionFilePath;
|
|
111
|
+
commandQueue = [];
|
|
112
|
+
isProcessing = false;
|
|
113
|
+
isDestroyed = false;
|
|
114
|
+
activeCommand = null;
|
|
115
|
+
currentOutputBuffer = [];
|
|
116
|
+
stdoutBuffer = '';
|
|
117
|
+
decoder = new string_decoder_1.StringDecoder('utf8');
|
|
118
|
+
inactivityTimer = null;
|
|
119
|
+
inactivityTimeoutMs;
|
|
120
|
+
killEscalationMs;
|
|
121
|
+
attachmentWarningShown = false;
|
|
122
|
+
/** Model switch requested while a command was running — respawn when it finishes. */
|
|
123
|
+
pendingModelChange = false;
|
|
124
|
+
/** Handoff summary from compactWhenFull, wrapped into the next prompt (consumed once). */
|
|
125
|
+
pendingContextSeed = null;
|
|
126
|
+
constructor(directoryGuard, options = {}) {
|
|
127
|
+
this.directoryGuard = directoryGuard;
|
|
128
|
+
this.model = options.model;
|
|
129
|
+
this.autoApprove = options.autoApprove ?? true;
|
|
130
|
+
this.agyCommand = options.agyCommand ?? 'agy';
|
|
131
|
+
this.threadId = options.threadId;
|
|
132
|
+
this.inactivityTimeoutMs = options.inactivityTimeoutMs ?? DEFAULT_INACTIVITY_TIMEOUT_MS;
|
|
133
|
+
this.killEscalationMs = options.killEscalationMs ?? DEFAULT_KILL_ESCALATION_MS;
|
|
134
|
+
if (options.initialWorkingDirectory) {
|
|
135
|
+
try {
|
|
136
|
+
this.currentWorkingDirectory = this.directoryGuard.resolveWorkingDirectory(options.initialWorkingDirectory);
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
console.warn(`[AgyExecutor] Failed to use initial working directory: ${options.initialWorkingDirectory}`, error);
|
|
140
|
+
this.currentWorkingDirectory = process.cwd();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
this.currentWorkingDirectory = process.cwd();
|
|
145
|
+
}
|
|
146
|
+
if (this.threadId) {
|
|
147
|
+
const sessionsDir = path.join(os.homedir(), '.remote-cli', 'agy-sessions');
|
|
148
|
+
fs.mkdirSync(sessionsDir, { recursive: true });
|
|
149
|
+
this.sessionFilePath = path.join(sessionsDir, `${this.threadId}.json`);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
// Legacy: session file in working directory
|
|
153
|
+
this.sessionFilePath = path.join(this.currentWorkingDirectory, '.agy-session');
|
|
154
|
+
}
|
|
155
|
+
this.loadConversationId();
|
|
156
|
+
}
|
|
157
|
+
// ─── IExecutor required ───────────────────────────────────────────────────
|
|
158
|
+
async execute(prompt, options = {}) {
|
|
159
|
+
if (this.isDestroyed) {
|
|
160
|
+
return Promise.reject(new Error('Executor has been destroyed'));
|
|
161
|
+
}
|
|
162
|
+
return new Promise((resolve, reject) => {
|
|
163
|
+
this.commandQueue.push({ prompt, options, resolve, reject });
|
|
164
|
+
void this.processQueue();
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
getCurrentWorkingDirectory() {
|
|
168
|
+
return this.currentWorkingDirectory;
|
|
169
|
+
}
|
|
170
|
+
async setWorkingDirectory(targetPath) {
|
|
171
|
+
const resolved = this.directoryGuard.resolveWorkingDirectory(targetPath);
|
|
172
|
+
// Changing cwd requires a respawn (tools run relative to the process cwd).
|
|
173
|
+
// The conversation id is kept, so the respawn resumes context.
|
|
174
|
+
const needsRestart = this.currentWorkingDirectory !== resolved && this.proc !== null;
|
|
175
|
+
this.currentWorkingDirectory = resolved;
|
|
176
|
+
if (needsRestart) {
|
|
177
|
+
console.log(`[AgyExecutor] Restarting process in new directory: ${resolved}`);
|
|
178
|
+
this.killProcess();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
resetContext() {
|
|
182
|
+
this.killProcess();
|
|
183
|
+
this.clearConversationId();
|
|
184
|
+
// /clear means a real fresh start — drop any carried-over compact seed
|
|
185
|
+
this.pendingContextSeed = null;
|
|
186
|
+
}
|
|
187
|
+
async abort() {
|
|
188
|
+
if (!this.proc || !this.activeCommand)
|
|
189
|
+
return false;
|
|
190
|
+
// agy's stream-json protocol has no cancel request (control_request is
|
|
191
|
+
// explicitly unsupported), so abort = kill the process. The conversation
|
|
192
|
+
// id survives, so the next command resumes context.
|
|
193
|
+
console.log('[AgyExecutor] Aborting: killing agy process');
|
|
194
|
+
this.killProcess('Aborted by user');
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
async destroy() {
|
|
198
|
+
if (this.isDestroyed)
|
|
199
|
+
return;
|
|
200
|
+
this.isDestroyed = true;
|
|
201
|
+
// Reject everything still queued — nothing may respawn after destroy
|
|
202
|
+
const queued = this.commandQueue.splice(0);
|
|
203
|
+
for (const command of queued) {
|
|
204
|
+
command.reject(new Error('Executor has been destroyed'));
|
|
205
|
+
}
|
|
206
|
+
const proc = this.proc;
|
|
207
|
+
if (proc) {
|
|
208
|
+
try {
|
|
209
|
+
proc.stdin?.end();
|
|
210
|
+
}
|
|
211
|
+
catch { /* already closed */ }
|
|
212
|
+
}
|
|
213
|
+
this.killProcess('Executor destroyed');
|
|
214
|
+
}
|
|
215
|
+
// ─── IExecutor optional ───────────────────────────────────────────────────
|
|
216
|
+
isProcessRunning() {
|
|
217
|
+
return this.proc !== null;
|
|
218
|
+
}
|
|
219
|
+
getSessionId() {
|
|
220
|
+
return this.conversationId;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Switch the model. agy takes --model at process start, so the process must
|
|
224
|
+
* respawn for the change to take effect — the conversation id survives, so
|
|
225
|
+
* context is preserved. If a command is in flight, the respawn is deferred
|
|
226
|
+
* until it finishes (the running turn keeps the old model).
|
|
227
|
+
* MessageHandler persists the choice on the thread; ThreadExecutorPool
|
|
228
|
+
* passes it back via the factory on restarts.
|
|
229
|
+
*/
|
|
230
|
+
async setModel(model, _onStream) {
|
|
231
|
+
this.model = model;
|
|
232
|
+
if (this.proc && !this.activeCommand) {
|
|
233
|
+
console.log(`[AgyExecutor] Model set to ${model} — recycling idle process (conversation preserved)`);
|
|
234
|
+
this.killProcess();
|
|
235
|
+
}
|
|
236
|
+
else if (this.proc) {
|
|
237
|
+
console.log(`[AgyExecutor] Model set to ${model} — will respawn after the current command`);
|
|
238
|
+
this.pendingModelChange = true;
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
console.log(`[AgyExecutor] Model set to ${model} (applies from the next command)`);
|
|
242
|
+
}
|
|
243
|
+
return {
|
|
244
|
+
success: true,
|
|
245
|
+
output: `Model set to ${model}. Takes effect on the next command (the agy process restarts; conversation context is preserved).`,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Compact via summarize-then-reset. agy has compaction only in its
|
|
250
|
+
* interactive TUI — over stream-json a '/compact' message reaches the model
|
|
251
|
+
* as plain text (verified live against agy 1.1.9: the model role-played a
|
|
252
|
+
* compaction and the transcript kept the full history). So we:
|
|
253
|
+
* 1. ask the current conversation for a dense handoff summary,
|
|
254
|
+
* 2. reset the conversation,
|
|
255
|
+
* 3. wrap the summary into the next user prompt (consumed once).
|
|
256
|
+
* If the summary turn fails (e.g. context already too full), fall back to
|
|
257
|
+
* a plain reset and say so honestly.
|
|
258
|
+
*/
|
|
259
|
+
async compactWhenFull(onStream) {
|
|
260
|
+
if (!this.proc && !this.conversationId) {
|
|
261
|
+
return { success: true, output: 'No active conversation to compact.' };
|
|
262
|
+
}
|
|
263
|
+
onStream?.('Summarizing the conversation before resetting...\n');
|
|
264
|
+
let summary = null;
|
|
265
|
+
try {
|
|
266
|
+
const r = await this.execute(compactHandoff_1.COMPACT_HANDOFF_PROMPT, onStream ? { onStream } : {});
|
|
267
|
+
if (r.success && r.output?.trim())
|
|
268
|
+
summary = r.output.trim();
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
console.warn('[AgyExecutor] Handoff summary failed, falling back to plain reset:', error);
|
|
272
|
+
}
|
|
273
|
+
this.resetContext();
|
|
274
|
+
if (summary) {
|
|
275
|
+
this.pendingContextSeed = summary;
|
|
276
|
+
return {
|
|
277
|
+
success: true,
|
|
278
|
+
output: '✅ Context compacted: the conversation was summarized and carried over to a fresh session.',
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
return {
|
|
282
|
+
success: true,
|
|
283
|
+
output: '⚠️ Handoff summary failed — the conversation was reset without carryover. Context starts fresh.',
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Delete per-thread conversation state. Only removes OUR stored
|
|
288
|
+
* conversation id mapping — agy's own conversation store
|
|
289
|
+
* (~/.gemini/antigravity-cli/conversations) is left untouched.
|
|
290
|
+
*/
|
|
291
|
+
async deleteThreadData(_threadId) {
|
|
292
|
+
await this.destroy();
|
|
293
|
+
this.clearConversationId();
|
|
294
|
+
}
|
|
295
|
+
// ─── Queue processing ─────────────────────────────────────────────────────
|
|
296
|
+
async processQueue() {
|
|
297
|
+
if (this.isProcessing || this.isDestroyed || this.commandQueue.length === 0)
|
|
298
|
+
return;
|
|
299
|
+
const command = this.commandQueue.shift();
|
|
300
|
+
if (!command)
|
|
301
|
+
return;
|
|
302
|
+
this.isProcessing = true;
|
|
303
|
+
try {
|
|
304
|
+
const result = await this.executeQueued(command.prompt, command.options);
|
|
305
|
+
command.resolve(result);
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
command.reject(error instanceof Error ? error : new Error(String(error)));
|
|
309
|
+
}
|
|
310
|
+
finally {
|
|
311
|
+
this.isProcessing = false;
|
|
312
|
+
void this.processQueue();
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
executeQueued(prompt, options) {
|
|
316
|
+
return new Promise((resolve) => {
|
|
317
|
+
if (options.attachments?.length && !this.attachmentWarningShown) {
|
|
318
|
+
this.attachmentWarningShown = true;
|
|
319
|
+
console.warn('[AgyExecutor] agy stream-json input supports text only — attachments were dropped');
|
|
320
|
+
}
|
|
321
|
+
let proc;
|
|
322
|
+
try {
|
|
323
|
+
proc = this.ensureProcess();
|
|
324
|
+
}
|
|
325
|
+
catch (error) {
|
|
326
|
+
resolve({
|
|
327
|
+
success: false,
|
|
328
|
+
error: error instanceof Error ? error.message : String(error),
|
|
329
|
+
});
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
const active = { options, resolve };
|
|
333
|
+
if (options.timeout && options.timeout > 0) {
|
|
334
|
+
active.timeoutTimer = setTimeout(() => {
|
|
335
|
+
console.warn(`[AgyExecutor] Command timed out after ${options.timeout}ms, killing process`);
|
|
336
|
+
this.killProcess(`Command timed out after ${options.timeout}ms`);
|
|
337
|
+
}, options.timeout);
|
|
338
|
+
}
|
|
339
|
+
this.activeCommand = active;
|
|
340
|
+
this.currentOutputBuffer = [];
|
|
341
|
+
this.armInactivityTimer();
|
|
342
|
+
// A carried-over compact summary wraps the first prompt after a reset
|
|
343
|
+
const finalPrompt = this.pendingContextSeed
|
|
344
|
+
? (0, compactHandoff_1.seedPromptWithHandoff)(this.pendingContextSeed, prompt)
|
|
345
|
+
: prompt;
|
|
346
|
+
this.pendingContextSeed = null;
|
|
347
|
+
const line = JSON.stringify({
|
|
348
|
+
event: 'user',
|
|
349
|
+
message: { content: finalPrompt },
|
|
350
|
+
}) + '\n';
|
|
351
|
+
try {
|
|
352
|
+
proc.stdin.write(line);
|
|
353
|
+
}
|
|
354
|
+
catch (error) {
|
|
355
|
+
this.completeActiveCommand({
|
|
356
|
+
success: false,
|
|
357
|
+
error: `Failed to send prompt to agy: ${error instanceof Error ? error.message : String(error)}`,
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
completeActiveCommand(result) {
|
|
363
|
+
const active = this.activeCommand;
|
|
364
|
+
if (!active)
|
|
365
|
+
return;
|
|
366
|
+
this.activeCommand = null;
|
|
367
|
+
this.clearInactivityTimer();
|
|
368
|
+
if (active.timeoutTimer)
|
|
369
|
+
clearTimeout(active.timeoutTimer);
|
|
370
|
+
if (result.success && result.output === undefined) {
|
|
371
|
+
result.output = this.currentOutputBuffer.join('');
|
|
372
|
+
}
|
|
373
|
+
if (result.success) {
|
|
374
|
+
result.sessionAbbr = this.conversationId?.slice(0, 8);
|
|
375
|
+
}
|
|
376
|
+
active.resolve(result);
|
|
377
|
+
// A model switch requested mid-command takes effect now that the
|
|
378
|
+
// command has finished — recycle the process (conversation preserved).
|
|
379
|
+
if (this.pendingModelChange) {
|
|
380
|
+
this.pendingModelChange = false;
|
|
381
|
+
if (this.proc)
|
|
382
|
+
this.killProcess();
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Arm the inactivity watchdog: any stdout line counts as activity. If agy
|
|
387
|
+
* goes silent mid-command for longer than the limit, fail the command and
|
|
388
|
+
* kill the process (the conversation resumes on the next command).
|
|
389
|
+
*/
|
|
390
|
+
armInactivityTimer() {
|
|
391
|
+
this.clearInactivityTimer();
|
|
392
|
+
this.inactivityTimer = setTimeout(() => {
|
|
393
|
+
console.warn(`[AgyExecutor] No output for ${this.inactivityTimeoutMs}ms, killing process`);
|
|
394
|
+
this.killProcess(`No output from agy for ${this.inactivityTimeoutMs}ms (inactivity timeout)`);
|
|
395
|
+
}, this.inactivityTimeoutMs);
|
|
396
|
+
}
|
|
397
|
+
clearInactivityTimer() {
|
|
398
|
+
if (this.inactivityTimer !== null) {
|
|
399
|
+
clearTimeout(this.inactivityTimer);
|
|
400
|
+
this.inactivityTimer = null;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
// ─── Process lifecycle ────────────────────────────────────────────────────
|
|
404
|
+
ensureProcess() {
|
|
405
|
+
if (this.proc)
|
|
406
|
+
return this.proc;
|
|
407
|
+
if (this.isDestroyed) {
|
|
408
|
+
throw new Error('Executor has been destroyed');
|
|
409
|
+
}
|
|
410
|
+
const args = this.buildArgs();
|
|
411
|
+
console.log(`[AgyExecutor] Spawning: ${this.agyCommand} ${args.join(' ')} (cwd: ${this.currentWorkingDirectory})`);
|
|
412
|
+
// Fresh stream state for the new process
|
|
413
|
+
this.stdoutBuffer = '';
|
|
414
|
+
this.decoder = new string_decoder_1.StringDecoder('utf8');
|
|
415
|
+
const proc = (0, child_process_1.spawn)(this.agyCommand, args, {
|
|
416
|
+
cwd: this.currentWorkingDirectory,
|
|
417
|
+
env: { ...process.env },
|
|
418
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
419
|
+
});
|
|
420
|
+
proc.stdout.on('data', (data) => this.handleStdout(proc, data));
|
|
421
|
+
proc.stderr.on('data', (data) => {
|
|
422
|
+
// Diagnostics (progress, permission notices) — log only
|
|
423
|
+
console.log(`[AgyExecutor stderr] ${data.toString().trim().slice(0, 300)}`);
|
|
424
|
+
});
|
|
425
|
+
// Async stdin socket errors (e.g. EPIPE if agy exits mid-write) must not
|
|
426
|
+
// crash the whole CLI process — the exit/error handler reports the failure.
|
|
427
|
+
proc.stdin.on('error', (error) => {
|
|
428
|
+
console.warn(`[AgyExecutor] stdin error: ${error.message}`);
|
|
429
|
+
});
|
|
430
|
+
proc.on('error', (error) => {
|
|
431
|
+
if (proc !== this.proc)
|
|
432
|
+
return;
|
|
433
|
+
console.error('[AgyExecutor] Process error:', error);
|
|
434
|
+
this.proc = null;
|
|
435
|
+
const friendly = error.message.includes('ENOENT')
|
|
436
|
+
? 'AGY CLI (agy) is not installed or not found on PATH. Install it from https://antigravity.google/cli, or use /backend to switch to another backend.'
|
|
437
|
+
: `agy process error: ${error.message}`;
|
|
438
|
+
this.completeActiveCommand({ success: false, error: friendly });
|
|
439
|
+
});
|
|
440
|
+
proc.on('exit', (code, signal) => {
|
|
441
|
+
if (proc !== this.proc)
|
|
442
|
+
return;
|
|
443
|
+
this.proc = null;
|
|
444
|
+
if (this.activeCommand) {
|
|
445
|
+
console.error(`[AgyExecutor] Process exited unexpectedly (code=${code}, signal=${signal})`);
|
|
446
|
+
this.completeActiveCommand({
|
|
447
|
+
success: false,
|
|
448
|
+
error: `agy process exited unexpectedly (code ${code ?? signal}). The conversation will resume on the next command.`,
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
});
|
|
452
|
+
this.proc = proc;
|
|
453
|
+
return proc;
|
|
454
|
+
}
|
|
455
|
+
buildArgs() {
|
|
456
|
+
const args = ['--input-format=stream-json', '--output-format=stream-json'];
|
|
457
|
+
if (this.autoApprove) {
|
|
458
|
+
args.push('--dangerously-skip-permissions');
|
|
459
|
+
}
|
|
460
|
+
if (this.model) {
|
|
461
|
+
args.push('--model', this.model);
|
|
462
|
+
}
|
|
463
|
+
if (this.conversationId) {
|
|
464
|
+
args.push('--conversation', this.conversationId);
|
|
465
|
+
}
|
|
466
|
+
return args;
|
|
467
|
+
}
|
|
468
|
+
killProcess(reason) {
|
|
469
|
+
const proc = this.proc;
|
|
470
|
+
this.proc = null;
|
|
471
|
+
if (proc) {
|
|
472
|
+
let exited = false;
|
|
473
|
+
proc.once('exit', () => { exited = true; });
|
|
474
|
+
proc.kill(); // SIGTERM
|
|
475
|
+
// Escalate to SIGKILL if the process ignores SIGTERM — a lingering
|
|
476
|
+
// process would share the conversation store with the next respawn.
|
|
477
|
+
const escalate = setTimeout(() => {
|
|
478
|
+
if (!exited) {
|
|
479
|
+
console.warn('[AgyExecutor] Process ignored SIGTERM, escalating to SIGKILL');
|
|
480
|
+
proc.kill('SIGKILL');
|
|
481
|
+
}
|
|
482
|
+
}, this.killEscalationMs);
|
|
483
|
+
// Never let the watchdog hold the event loop open by itself
|
|
484
|
+
if (typeof escalate.unref === 'function')
|
|
485
|
+
escalate.unref();
|
|
486
|
+
}
|
|
487
|
+
// Never leave an in-flight command hanging when its process dies.
|
|
488
|
+
if (this.activeCommand) {
|
|
489
|
+
this.completeActiveCommand({
|
|
490
|
+
success: false,
|
|
491
|
+
error: reason ?? 'agy process was terminated mid-command',
|
|
492
|
+
});
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
// ─── Wire protocol parsing ────────────────────────────────────────────────
|
|
496
|
+
handleStdout(proc, data) {
|
|
497
|
+
if (proc !== this.proc)
|
|
498
|
+
return; // stale process
|
|
499
|
+
// StringDecoder handles multi-byte UTF-8 characters split across chunks
|
|
500
|
+
this.stdoutBuffer += this.decoder.write(data);
|
|
501
|
+
const lines = this.stdoutBuffer.split('\n');
|
|
502
|
+
this.stdoutBuffer = lines.pop() ?? '';
|
|
503
|
+
for (const line of lines) {
|
|
504
|
+
if (line.trim())
|
|
505
|
+
this.handleLine(line);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
handleLine(line) {
|
|
509
|
+
let message;
|
|
510
|
+
try {
|
|
511
|
+
message = JSON.parse(line);
|
|
512
|
+
}
|
|
513
|
+
catch {
|
|
514
|
+
console.warn(`[AgyExecutor] Skipping malformed NDJSON line: ${line.slice(0, 120)}`);
|
|
515
|
+
return;
|
|
516
|
+
}
|
|
517
|
+
// Any valid line counts as activity for the inactivity watchdog
|
|
518
|
+
if (this.activeCommand)
|
|
519
|
+
this.armInactivityTimer();
|
|
520
|
+
switch (message.event) {
|
|
521
|
+
case 'init': {
|
|
522
|
+
const conversationId = message.conversation_id;
|
|
523
|
+
if (typeof conversationId === 'string' && conversationId) {
|
|
524
|
+
console.log(`[AgyExecutor] Conversation initialized: ${conversationId}`);
|
|
525
|
+
this.setConversationId(conversationId);
|
|
526
|
+
}
|
|
527
|
+
break;
|
|
528
|
+
}
|
|
529
|
+
case 'step_update':
|
|
530
|
+
this.handleStepUpdate(message.step_update);
|
|
531
|
+
break;
|
|
532
|
+
case 'result':
|
|
533
|
+
this.handleResult(message.result);
|
|
534
|
+
break;
|
|
535
|
+
default:
|
|
536
|
+
// Unknown events are safely ignored (agy may add new ones)
|
|
537
|
+
console.warn(`[AgyExecutor] Ignoring unknown event: ${message.event}`);
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
handleStepUpdate(step) {
|
|
541
|
+
if (!step || !this.activeCommand)
|
|
542
|
+
return;
|
|
543
|
+
const { options } = this.activeCommand;
|
|
544
|
+
if (step.step_type === 'agent_response') {
|
|
545
|
+
const delta = step.text_delta;
|
|
546
|
+
if (typeof delta === 'string' && delta.length > 0) {
|
|
547
|
+
this.currentOutputBuffer.push(delta);
|
|
548
|
+
options.onStream?.(delta);
|
|
549
|
+
}
|
|
550
|
+
return;
|
|
551
|
+
}
|
|
552
|
+
if (step.step_type === 'tool' && typeof step.tool_name === 'string') {
|
|
553
|
+
const toolUseId = `agy-step-${step.step_index}`;
|
|
554
|
+
const toolInfo = step.tool_info ?? {};
|
|
555
|
+
const parameters = (toolInfo.parameters ?? {});
|
|
556
|
+
if (step.state === 'ACTIVE') {
|
|
557
|
+
const { name, input } = mapAgyTool(step.tool_name, parameters);
|
|
558
|
+
options.onToolUse?.({ id: toolUseId, name, input });
|
|
559
|
+
}
|
|
560
|
+
else if (step.state === 'DONE') {
|
|
561
|
+
const isError = !!toolInfo.error;
|
|
562
|
+
const content = typeof toolInfo.output === 'string'
|
|
563
|
+
? toolInfo.output
|
|
564
|
+
: (toolInfo.error?.message ?? '');
|
|
565
|
+
options.onToolResult?.({ tool_use_id: toolUseId, content, is_error: isError });
|
|
566
|
+
}
|
|
567
|
+
return;
|
|
568
|
+
}
|
|
569
|
+
// user_input / system_message / checkpoint / unknown step types: ignore
|
|
570
|
+
}
|
|
571
|
+
handleResult(result) {
|
|
572
|
+
if (!result || !this.activeCommand) {
|
|
573
|
+
// Late result from an aborted/killed turn — nothing to complete
|
|
574
|
+
return;
|
|
575
|
+
}
|
|
576
|
+
const conversationId = result.conversation_id;
|
|
577
|
+
if (typeof conversationId === 'string' && conversationId && conversationId !== this.conversationId) {
|
|
578
|
+
this.setConversationId(conversationId);
|
|
579
|
+
}
|
|
580
|
+
if (result.status === 'SUCCESS') {
|
|
581
|
+
const accumulated = this.currentOutputBuffer.join('');
|
|
582
|
+
this.completeActiveCommand({
|
|
583
|
+
success: true,
|
|
584
|
+
output: accumulated || result.response || '',
|
|
585
|
+
});
|
|
586
|
+
return;
|
|
587
|
+
}
|
|
588
|
+
if (ABORTED_STATUSES.has(result.status)) {
|
|
589
|
+
this.completeActiveCommand({ success: false, error: `Command ${String(result.status).toLowerCase()}` });
|
|
590
|
+
return;
|
|
591
|
+
}
|
|
592
|
+
this.completeActiveCommand({
|
|
593
|
+
success: false,
|
|
594
|
+
error: result.error || `agy command failed with status ${result.status}`,
|
|
595
|
+
});
|
|
596
|
+
}
|
|
597
|
+
// ─── Conversation persistence ─────────────────────────────────────────────
|
|
598
|
+
loadConversationId() {
|
|
599
|
+
try {
|
|
600
|
+
if (fs.existsSync(this.sessionFilePath)) {
|
|
601
|
+
const data = fs.readFileSync(this.sessionFilePath, 'utf-8');
|
|
602
|
+
const session = JSON.parse(data);
|
|
603
|
+
if (session.id) {
|
|
604
|
+
this.conversationId = session.id;
|
|
605
|
+
console.log(`[AgyExecutor] Loaded conversation ID: ${this.conversationId}`);
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
catch (error) {
|
|
610
|
+
console.error('[AgyExecutor] Failed to load conversation ID:', error);
|
|
611
|
+
this.conversationId = null;
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
setConversationId(conversationId) {
|
|
615
|
+
this.conversationId = conversationId;
|
|
616
|
+
try {
|
|
617
|
+
const data = JSON.stringify({ id: conversationId, savedAt: new Date().toISOString() });
|
|
618
|
+
fs.writeFileSync(this.sessionFilePath, data, 'utf-8');
|
|
619
|
+
}
|
|
620
|
+
catch (error) {
|
|
621
|
+
console.error('[AgyExecutor] Failed to save conversation ID:', error);
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
clearConversationId() {
|
|
625
|
+
this.conversationId = null;
|
|
626
|
+
try {
|
|
627
|
+
if (fs.existsSync(this.sessionFilePath)) {
|
|
628
|
+
fs.unlinkSync(this.sessionFilePath);
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
catch (error) {
|
|
632
|
+
console.error('[AgyExecutor] Failed to delete conversation file:', error);
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
exports.AgyExecutor = AgyExecutor;
|
|
637
|
+
//# sourceMappingURL=AgyExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgyExecutor.js","sourceRoot":"","sources":["../../src/executor/AgyExecutor.ts"],"names":[],"mappings":"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"}
|