@yu_robotics/remote-cli 1.1.13 → 1.1.20

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.
@@ -6,32 +6,25 @@ const SessionManager_1 = require("./acp/SessionManager");
6
6
  /**
7
7
  * IExecutor implementation for Gemini CLI via ACP (Agent Client Protocol).
8
8
  *
9
- * One ACP child process is maintained per working directory.
10
- * On setWorkingDirectory, the existing process is terminated and a fresh
11
- * session is created on the next execute() call.
9
+ * Each execute() call spawns a fresh Gemini CLI subprocess (vibe-kanban style).
10
+ * This ensures full isolation between turns a broken session in one turn
11
+ * cannot affect subsequent turns.
12
12
  *
13
- * Session history is persisted as JSONL and replayed as context when creating
14
- * new ACP sessions (since ACP session/resume is experimental).
15
- *
16
- * Callbacks are held as mutable references so the same AcpClient instance can
17
- * serve multiple sequential execute() calls without being recreated.
13
+ * Conversation history is persisted as JSONL via SessionManager and replayed
14
+ * as context prefix on subsequent calls within the same conversation.
18
15
  */
19
16
  class GeminiExecutor {
20
17
  directoryGuard;
21
18
  currentWorkingDirectory;
22
19
  sessionManager;
23
- active = null;
24
- isExecuting = false;
25
20
  model;
26
21
  autoApprove;
27
22
  geminiCommand;
28
23
  geminiVersion;
29
- // Mutable callback slots updated before each execute() call
30
- currentOnStream;
31
- currentOnToolUse;
32
- currentOnToolResult;
33
- currentOnPlanMode;
34
- currentAccumulate = () => { };
24
+ /** Stable ID for JSONL history file, survives across spawns. */
25
+ conversationId = null;
26
+ /** Reference to the in-flight AcpClient for abort support. */
27
+ inflightClient = null;
35
28
  constructor(directoryGuard, options = {}) {
36
29
  this.directoryGuard = directoryGuard;
37
30
  this.model = options.model ?? '';
@@ -43,36 +36,71 @@ class GeminiExecutor {
43
36
  }
44
37
  // ─── IExecutor required ─────────────────────────────────────────────────────
45
38
  async execute(prompt, options) {
46
- // Update mutable callback slots before the call
39
+ // Ensure a stable conversation ID exists for history tracking across spawns
40
+ if (!this.conversationId) {
41
+ this.conversationId = `conv-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
42
+ }
47
43
  let accumulatedOutput = '';
48
- this.currentAccumulate = (text) => { accumulatedOutput += text; };
49
- this.currentOnStream = options.onStream;
50
- this.currentOnToolUse = options.onToolUse;
51
- this.currentOnToolResult = options.onToolResult;
52
- this.currentOnPlanMode = options.onPlanMode;
53
- const { client, sessionId } = await this.ensureClient();
54
- // Prepend history context for session continuity
55
- const historyContext = this.sessionManager.buildResumeContext(sessionId);
44
+ const acpCallbacks = {
45
+ onTextChunk: (text) => {
46
+ accumulatedOutput += text;
47
+ options.onStream?.(text);
48
+ },
49
+ onToolCall: (toolCallId, title, kind) => {
50
+ options.onToolUse?.({ id: toolCallId, name: title, input: { kind } });
51
+ },
52
+ onToolResult: (toolCallId, status, output) => {
53
+ options.onToolResult?.({
54
+ tool_use_id: toolCallId,
55
+ content: output ?? '',
56
+ is_error: status !== 'completed',
57
+ });
58
+ },
59
+ onPlan: (text) => {
60
+ options.onPlanMode?.(text);
61
+ },
62
+ onPermissionRequest: this.autoApprove ? undefined : async () => 0,
63
+ };
64
+ // Prepend history context for follow-up turns within the same conversation
65
+ const historyContext = this.sessionManager.buildResumeContext(this.conversationId);
56
66
  const finalPrompt = historyContext ? `${historyContext}${prompt}` : prompt;
57
- this.sessionManager.append(sessionId, 'user', prompt);
58
- this.isExecuting = true;
67
+ this.sessionManager.append(this.conversationId, 'user', prompt);
68
+ const client = new AcpClient_1.AcpClient(this.geminiCommand, this.buildGeminiArgs(), this.currentWorkingDirectory, acpCallbacks);
69
+ this.inflightClient = client;
59
70
  try {
71
+ console.log(`[GeminiExecutor] Spawning new ACP client for cwd: ${this.currentWorkingDirectory}`);
72
+ console.log(`[GeminiExecutor] Gemini command: ${this.geminiCommand} ${this.buildGeminiArgs().join(' ')}`);
73
+ await client.initialize();
74
+ const sessionId = await client.newSession(this.currentWorkingDirectory);
75
+ console.log(`[GeminiExecutor] ACP session created: ${sessionId.slice(0, 8)}`);
76
+ if (this.autoApprove) {
77
+ console.log(`[GeminiExecutor] Switching session to YOLO mode...`);
78
+ await client.setSessionMode(sessionId, 'yolo');
79
+ }
80
+ console.log(`[GeminiExecutor] Sending prompt (length=${finalPrompt.length})...`);
60
81
  const promptResult = await client.prompt(sessionId, finalPrompt);
61
- this.sessionManager.append(sessionId, 'assistant', accumulatedOutput);
82
+ console.log(`[GeminiExecutor] Prompt completed, stopReason=${promptResult.stopReason}`);
83
+ this.sessionManager.append(this.conversationId, 'assistant', accumulatedOutput);
62
84
  return {
63
85
  success: promptResult.stopReason !== 'refusal',
64
86
  output: accumulatedOutput,
65
- sessionAbbr: sessionId.slice(0, 8),
87
+ sessionAbbr: this.conversationId.slice(0, 8),
66
88
  };
67
89
  }
68
90
  catch (error) {
91
+ console.error(`[GeminiExecutor] ❌ Execute error:`, error);
92
+ const msg = error instanceof Error ? error.message : 'Unknown error';
93
+ const friendlyMsg = msg.includes('ENOENT') || msg.includes('not found')
94
+ ? 'Gemini CLI is not installed or not found on PATH. Use /backend to switch to another AI backend.'
95
+ : msg;
69
96
  return {
70
97
  success: false,
71
- error: error instanceof Error ? error.message : 'Unknown error',
98
+ error: friendlyMsg,
72
99
  };
73
100
  }
74
101
  finally {
75
- this.isExecuting = false;
102
+ client.destroy();
103
+ this.inflightClient = null;
76
104
  }
77
105
  }
78
106
  getCurrentWorkingDirectory() {
@@ -80,86 +108,38 @@ class GeminiExecutor {
80
108
  }
81
109
  async setWorkingDirectory(targetPath) {
82
110
  const resolved = this.directoryGuard.resolveWorkingDirectory(targetPath);
83
- // Tear down current ACP process — new session will start in new directory
84
- if (this.active) {
85
- try {
86
- this.active.client.sendCancel(this.active.sessionId);
87
- }
88
- catch {
89
- // best-effort cancel
90
- }
91
- this.active.client.destroy();
92
- this.active = null;
93
- }
94
111
  this.currentWorkingDirectory = resolved;
112
+ // Changing directory resets the conversation context
113
+ this.conversationId = null;
95
114
  }
96
115
  resetContext() {
97
- if (this.active) {
98
- this.sessionManager.remove(this.active.sessionId);
99
- this.active = null;
116
+ if (this.conversationId) {
117
+ this.sessionManager.remove(this.conversationId);
118
+ this.conversationId = null;
100
119
  }
101
- // Note: does NOT destroy the child process — a new ACP session is cheaper than a new process.
102
- // However since we null active, ensureClient() will create a fresh session (and process,
103
- // because the old one has no reference anymore).
104
120
  }
105
121
  async abort() {
106
- if (!this.active)
122
+ if (!this.inflightClient)
107
123
  return false;
108
- try {
109
- this.active.client.sendCancel(this.active.sessionId);
110
- }
111
- catch {
112
- // ignore
113
- }
114
- this.active.client.destroy();
115
- this.active = null;
116
- this.isExecuting = false;
124
+ this.inflightClient.destroy();
125
+ this.inflightClient = null;
117
126
  return true;
118
127
  }
119
128
  async destroy() {
120
- if (this.active) {
121
- this.active.client.destroy();
122
- this.active = null;
129
+ if (this.inflightClient) {
130
+ this.inflightClient.destroy();
131
+ this.inflightClient = null;
123
132
  }
124
133
  }
125
134
  // ─── Internal helpers ───────────────────────────────────────────────────────
126
- async ensureClient() {
127
- if (this.active)
128
- return this.active;
129
- // Build ACP callbacks that forward to the mutable slots
130
- // Using arrow functions that close over `this` so they always call the
131
- // currently-set callbacks for the in-flight execute() call.
132
- const acpCallbacks = {
133
- onTextChunk: (text) => {
134
- this.currentAccumulate(text);
135
- this.currentOnStream?.(text);
136
- },
137
- onToolCall: (toolCallId, title, kind) => {
138
- this.currentOnToolUse?.({ id: toolCallId, name: title, input: { kind } });
139
- },
140
- onToolResult: (toolCallId, status, output) => {
141
- this.currentOnToolResult?.({
142
- tool_use_id: toolCallId,
143
- content: output ?? '',
144
- is_error: status !== 'completed',
145
- });
146
- },
147
- onPlan: (text) => {
148
- this.currentOnPlanMode?.(text);
149
- },
150
- onPermissionRequest: this.autoApprove ? undefined : async () => 0,
151
- };
152
- const client = new AcpClient_1.AcpClient(this.geminiCommand, this.buildGeminiArgs(), this.currentWorkingDirectory, acpCallbacks);
153
- await client.initialize();
154
- const sessionId = await client.newSession(this.currentWorkingDirectory);
155
- this.active = { client, sessionId };
156
- return this.active;
157
- }
158
135
  buildGeminiArgs() {
159
136
  const args = ['-y', this.geminiVersion, '--experimental-acp'];
160
137
  if (this.model) {
161
138
  args.push('--model', this.model);
162
139
  }
140
+ if (this.autoApprove) {
141
+ args.push('--yolo');
142
+ }
163
143
  return args;
164
144
  }
165
145
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GeminiExecutor.js","sourceRoot":"","sources":["../../src/executor/GeminiExecutor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GeminiExecutor.js","sourceRoot":"","sources":["../../src/executor/GeminiExecutor.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { AcpPermissionOption, AcpPromptResult } from './AcpTypes';
1
+ import type { PermissionOption } from './AcpTypes';
2
2
  export interface AcpEventCallbacks {
3
3
  onTextChunk: (text: string) => void;
4
4
  onThoughtChunk?: (text: string) => void;
@@ -6,17 +6,17 @@ export interface AcpEventCallbacks {
6
6
  onToolResult?: (toolCallId: string, status: string, output?: string) => void;
7
7
  onPlan?: (text: string) => void;
8
8
  /** Returns the index of the chosen option (0 = first = typically allow_once). */
9
- onPermissionRequest?: (title: string, options: AcpPermissionOption[]) => Promise<number>;
9
+ onPermissionRequest?: (title: string, options: PermissionOption[]) => Promise<number>;
10
10
  }
11
11
  /**
12
12
  * Bidirectional JSON-RPC 2.0 transport for Gemini CLI ACP.
13
13
  *
14
- * Manages a single Gemini CLI child process and routes messages:
15
- * - Outgoing: sendRequest / sendNotification over stdin
16
- * - Incoming: responses, notifications, server-side requests (permission) over stdout
17
- *
18
- * Permissions are auto-approved with allow_once unless a custom onPermissionRequest
19
- * callback is provided.
14
+ * Improvements over the previous version (inspired by acpx):
15
+ * - Uses canonical types from @agentclientprotocol/sdk
16
+ * - Multi-stage graceful shutdown: stdin close SIGTERM SIGKILL
17
+ * - Explicit sendCancel() for cooperative in-flight cancellation
18
+ * - Strict JSON-RPC message validation before routing
19
+ * - Handles the 'close' event in addition to 'exit' for reliable cleanup
20
20
  */
21
21
  export declare class AcpClient {
22
22
  private child;
@@ -25,11 +25,26 @@ export declare class AcpClient {
25
25
  private callbacks;
26
26
  private rl;
27
27
  private destroyed;
28
+ private killTimer;
28
29
  constructor(geminiCommand: string, geminiArgs: string[], cwd: string, callbacks: AcpEventCallbacks);
29
30
  initialize(): Promise<void>;
30
31
  newSession(cwd: string): Promise<string>;
31
- prompt(sessionId: string, text: string): Promise<AcpPromptResult>;
32
+ /** Switch a session to YOLO mode so no per-tool permission requests are sent. */
33
+ setSessionMode(sessionId: string, modeId: string): Promise<void>;
34
+ prompt(sessionId: string, text: string): Promise<{
35
+ stopReason: string;
36
+ }>;
37
+ /**
38
+ * Send a cooperative cancel notification for an in-flight prompt.
39
+ * The agent may still send final updates before replying with stopReason='cancelled'.
40
+ */
32
41
  sendCancel(sessionId: string): void;
42
+ /**
43
+ * Graceful multi-stage shutdown (mirrors acpx):
44
+ * 1. Close stdin so the agent sees EOF
45
+ * 2. Send SIGTERM and wait SIGKILL_GRACE_MS
46
+ * 3. If still alive, send SIGKILL
47
+ */
33
48
  destroy(): void;
34
49
  private sendRequest;
35
50
  private sendNotification;
@@ -43,5 +58,6 @@ export declare class AcpClient {
43
58
  private handleSessionUpdate;
44
59
  private handlePermissionRequest;
45
60
  private rejectAllPending;
61
+ private clearKillTimer;
46
62
  }
47
63
  //# sourceMappingURL=AcpClient.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AcpClient.d.ts","sourceRoot":"","sources":["../../../src/executor/acp/AcpClient.ts"],"names":[],"mappings":"AAEA,OAAO,EAQL,mBAAmB,EAGnB,eAAe,EAMhB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACxE,YAAY,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7E,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,iFAAiF;IACjF,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1F;AAOD;;;;;;;;;GASG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,EAAE,CAAqB;IAC/B,OAAO,CAAC,SAAS,CAAS;gBAGxB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAAE,EACpB,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,iBAAiB;IA4BxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKxC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAKvE,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAInC,OAAO,IAAI,IAAI;IAYf,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,UAAU;IAwBlB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,mBAAmB;YA6Cb,uBAAuB;IAkBrC,OAAO,CAAC,gBAAgB;CAMzB"}
1
+ {"version":3,"file":"AcpClient.d.ts","sourceRoot":"","sources":["../../../src/executor/acp/AcpClient.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAYjB,MAAM,YAAY,CAAC;AAKpB,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACxE,YAAY,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7E,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,iFAAiF;IACjF,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACvF;AAOD;;;;;;;;;GASG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,EAAE,CAAqB;IAC/B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAA8C;gBAG7D,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAAE,EACpB,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,iBAAiB;IAyCxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK9C,iFAAiF;IAC3E,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAQ9E;;;OAGG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAInC;;;;;OAKG;IACH,OAAO,IAAI,IAAI;IAiCf,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,UAAU;IAsClB,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,mBAAmB;YAoDb,uBAAuB;IAwBrC,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,cAAc;CAMvB"}