@yu_robotics/remote-cli 1.1.8 → 1.1.10

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.
Files changed (39) hide show
  1. package/dist/client/MessageHandler.d.ts +17 -2
  2. package/dist/client/MessageHandler.d.ts.map +1 -1
  3. package/dist/client/MessageHandler.js +99 -5
  4. package/dist/client/MessageHandler.js.map +1 -1
  5. package/dist/commands/start.d.ts.map +1 -1
  6. package/dist/commands/start.js +2 -1
  7. package/dist/commands/start.js.map +1 -1
  8. package/dist/executor/ClaudePersistentExecutor.d.ts +13 -0
  9. package/dist/executor/ClaudePersistentExecutor.d.ts.map +1 -1
  10. package/dist/executor/ClaudePersistentExecutor.js +64 -0
  11. package/dist/executor/ClaudePersistentExecutor.js.map +1 -1
  12. package/dist/executor/GeminiExecutor.d.ts +51 -0
  13. package/dist/executor/GeminiExecutor.d.ts.map +1 -0
  14. package/dist/executor/GeminiExecutor.js +167 -0
  15. package/dist/executor/GeminiExecutor.js.map +1 -0
  16. package/dist/executor/IExecutor.d.ts +34 -0
  17. package/dist/executor/IExecutor.d.ts.map +1 -0
  18. package/dist/executor/IExecutor.js +3 -0
  19. package/dist/executor/IExecutor.js.map +1 -0
  20. package/dist/executor/acp/AcpClient.d.ts +47 -0
  21. package/dist/executor/acp/AcpClient.d.ts.map +1 -0
  22. package/dist/executor/acp/AcpClient.js +245 -0
  23. package/dist/executor/acp/AcpClient.js.map +1 -0
  24. package/dist/executor/acp/AcpTypes.d.ts +91 -0
  25. package/dist/executor/acp/AcpTypes.d.ts.map +1 -0
  26. package/dist/executor/acp/AcpTypes.js +8 -0
  27. package/dist/executor/acp/AcpTypes.js.map +1 -0
  28. package/dist/executor/acp/SessionManager.d.ts +28 -0
  29. package/dist/executor/acp/SessionManager.d.ts.map +1 -0
  30. package/dist/executor/acp/SessionManager.js +93 -0
  31. package/dist/executor/acp/SessionManager.js.map +1 -0
  32. package/dist/executor/index.d.ts +15 -1
  33. package/dist/executor/index.d.ts.map +1 -1
  34. package/dist/executor/index.js +42 -2
  35. package/dist/executor/index.js.map +1 -1
  36. package/dist/types/config.d.ts +21 -0
  37. package/dist/types/config.d.ts.map +1 -1
  38. package/dist/types/config.js.map +1 -1
  39. package/package.json +1 -1
@@ -0,0 +1,51 @@
1
+ import { DirectoryGuard } from '../security/DirectoryGuard';
2
+ import { IExecutor, ExecuteOptions, ExecuteResult } from './IExecutor';
3
+ export interface GeminiExecutorOptions {
4
+ model?: string;
5
+ /** Auto-approve all tool permission requests. Default: true. */
6
+ autoApprove?: boolean;
7
+ initialWorkingDirectory?: string;
8
+ /** CLI command to run Gemini. Default: 'npx' */
9
+ geminiCommand?: string;
10
+ /** Gemini CLI npm package version specifier. Default: '@google/gemini-cli@latest' */
11
+ geminiVersion?: string;
12
+ }
13
+ /**
14
+ * IExecutor implementation for Gemini CLI via ACP (Agent Client Protocol).
15
+ *
16
+ * One ACP child process is maintained per working directory.
17
+ * On setWorkingDirectory, the existing process is terminated and a fresh
18
+ * session is created on the next execute() call.
19
+ *
20
+ * Session history is persisted as JSONL and replayed as context when creating
21
+ * new ACP sessions (since ACP session/resume is experimental).
22
+ *
23
+ * Callbacks are held as mutable references so the same AcpClient instance can
24
+ * serve multiple sequential execute() calls without being recreated.
25
+ */
26
+ export declare class GeminiExecutor implements IExecutor {
27
+ private directoryGuard;
28
+ private currentWorkingDirectory;
29
+ private sessionManager;
30
+ private active;
31
+ private isExecuting;
32
+ private readonly model;
33
+ private readonly autoApprove;
34
+ private readonly geminiCommand;
35
+ private readonly geminiVersion;
36
+ private currentOnStream;
37
+ private currentOnToolUse;
38
+ private currentOnToolResult;
39
+ private currentOnPlanMode;
40
+ private currentAccumulate;
41
+ constructor(directoryGuard: DirectoryGuard, options?: GeminiExecutorOptions);
42
+ execute(prompt: string, options: ExecuteOptions): Promise<ExecuteResult>;
43
+ getCurrentWorkingDirectory(): string;
44
+ setWorkingDirectory(targetPath: string): Promise<void>;
45
+ resetContext(): void;
46
+ abort(): Promise<boolean>;
47
+ destroy(): Promise<void>;
48
+ private ensureClient;
49
+ private buildGeminiArgs;
50
+ }
51
+ //# sourceMappingURL=GeminiExecutor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeminiExecutor.d.ts","sourceRoot":"","sources":["../../src/executor/GeminiExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIvE,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qFAAqF;IACrF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAOD;;;;;;;;;;;;GAYG;AACH,qBAAa,cAAe,YAAW,SAAS;IAC9C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAGvC,OAAO,CAAC,eAAe,CAAwC;IAC/D,OAAO,CAAC,gBAAgB,CAAgG;IACxH,OAAO,CAAC,mBAAmB,CAA8F;IACzH,OAAO,CAAC,iBAAiB,CAA8C;IACvE,OAAO,CAAC,iBAAiB,CAAoC;gBAEjD,cAAc,EAAE,cAAc,EAAE,OAAO,GAAE,qBAA0B;IAYzE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAsC9E,0BAA0B,IAAI,MAAM;IAI9B,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB5D,YAAY,IAAI,IAAI;IAUd,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAazB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAShB,YAAY;IAyC1B,OAAO,CAAC,eAAe;CAOxB"}
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GeminiExecutor = void 0;
4
+ const AcpClient_1 = require("./acp/AcpClient");
5
+ const SessionManager_1 = require("./acp/SessionManager");
6
+ /**
7
+ * IExecutor implementation for Gemini CLI via ACP (Agent Client Protocol).
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.
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.
18
+ */
19
+ class GeminiExecutor {
20
+ directoryGuard;
21
+ currentWorkingDirectory;
22
+ sessionManager;
23
+ active = null;
24
+ isExecuting = false;
25
+ model;
26
+ autoApprove;
27
+ geminiCommand;
28
+ geminiVersion;
29
+ // Mutable callback slots — updated before each execute() call
30
+ currentOnStream;
31
+ currentOnToolUse;
32
+ currentOnToolResult;
33
+ currentOnPlanMode;
34
+ currentAccumulate = () => { };
35
+ constructor(directoryGuard, options = {}) {
36
+ this.directoryGuard = directoryGuard;
37
+ this.model = options.model ?? '';
38
+ this.autoApprove = options.autoApprove ?? true;
39
+ this.geminiCommand = options.geminiCommand ?? 'npx';
40
+ this.geminiVersion = options.geminiVersion ?? '@google/gemini-cli@latest';
41
+ this.currentWorkingDirectory = options.initialWorkingDirectory ?? process.cwd();
42
+ this.sessionManager = new SessionManager_1.SessionManager();
43
+ }
44
+ // ─── IExecutor required ─────────────────────────────────────────────────────
45
+ async execute(prompt, options) {
46
+ // Update mutable callback slots before the call
47
+ 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);
56
+ const finalPrompt = historyContext ? `${historyContext}${prompt}` : prompt;
57
+ this.sessionManager.append(sessionId, 'user', prompt);
58
+ this.isExecuting = true;
59
+ try {
60
+ const promptResult = await client.prompt(sessionId, finalPrompt);
61
+ this.sessionManager.append(sessionId, 'assistant', accumulatedOutput);
62
+ return {
63
+ success: promptResult.stopReason !== 'refusal',
64
+ output: accumulatedOutput,
65
+ sessionAbbr: sessionId.slice(0, 8),
66
+ };
67
+ }
68
+ catch (error) {
69
+ return {
70
+ success: false,
71
+ error: error instanceof Error ? error.message : 'Unknown error',
72
+ };
73
+ }
74
+ finally {
75
+ this.isExecuting = false;
76
+ }
77
+ }
78
+ getCurrentWorkingDirectory() {
79
+ return this.currentWorkingDirectory;
80
+ }
81
+ async setWorkingDirectory(targetPath) {
82
+ 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
+ this.currentWorkingDirectory = resolved;
95
+ }
96
+ resetContext() {
97
+ if (this.active) {
98
+ this.sessionManager.remove(this.active.sessionId);
99
+ this.active = null;
100
+ }
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
+ }
105
+ async abort() {
106
+ if (!this.active)
107
+ 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;
117
+ return true;
118
+ }
119
+ async destroy() {
120
+ if (this.active) {
121
+ this.active.client.destroy();
122
+ this.active = null;
123
+ }
124
+ }
125
+ // ─── 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
+ buildGeminiArgs() {
159
+ const args = ['-y', this.geminiVersion, '--experimental-acp'];
160
+ if (this.model) {
161
+ args.push('--model', this.model);
162
+ }
163
+ return args;
164
+ }
165
+ }
166
+ exports.GeminiExecutor = GeminiExecutor;
167
+ //# sourceMappingURL=GeminiExecutor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeminiExecutor.js","sourceRoot":"","sources":["../../src/executor/GeminiExecutor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { ToolUseInfo, ToolResultInfo } from '../types';
2
+ export interface ExecuteOptions {
3
+ onStream?: (chunk: string) => void;
4
+ onToolUse?: (toolUse: ToolUseInfo) => void;
5
+ onToolResult?: (toolResult: ToolResultInfo) => void;
6
+ onRedactedThinking?: () => void;
7
+ onPlanMode?: (planContent: string) => void;
8
+ timeout?: number;
9
+ }
10
+ export interface ExecuteResult {
11
+ success: boolean;
12
+ output?: string;
13
+ error?: string;
14
+ sessionAbbr?: string;
15
+ }
16
+ /**
17
+ * Shared executor interface for all AI CLI backends (Claude, Gemini, etc.)
18
+ * Uses structural typing — existing Claude executors satisfy this without modification.
19
+ */
20
+ export interface IExecutor {
21
+ execute(prompt: string, options: ExecuteOptions): Promise<ExecuteResult>;
22
+ getCurrentWorkingDirectory(): string;
23
+ setWorkingDirectory(targetPath: string): Promise<void>;
24
+ resetContext(): void;
25
+ abort(): Promise<boolean>;
26
+ destroy(): Promise<void> | void;
27
+ isWaitingInput?(): boolean;
28
+ sendInput?(input: string): boolean;
29
+ compact?(onStream?: (chunk: string) => void): Promise<ExecuteResult>;
30
+ compactWhenFull?(onStream?: (chunk: string) => void): Promise<ExecuteResult>;
31
+ isProcessRunning?(): boolean;
32
+ getSessionId?(): string | null;
33
+ }
34
+ //# sourceMappingURL=IExecutor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IExecutor.d.ts","sourceRoot":"","sources":["../../src/executor/IExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEvD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IAC3C,YAAY,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,KAAK,IAAI,CAAC;IACpD,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IAExB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACzE,0BAA0B,IAAI,MAAM,CAAC;IACrC,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,YAAY,IAAI,IAAI,CAAC;IACrB,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAGhC,cAAc,CAAC,IAAI,OAAO,CAAC;IAC3B,SAAS,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACrE,eAAe,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAC7E,gBAAgB,CAAC,IAAI,OAAO,CAAC;IAC7B,YAAY,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC;CAChC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IExecutor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IExecutor.js","sourceRoot":"","sources":["../../src/executor/IExecutor.ts"],"names":[],"mappings":""}
@@ -0,0 +1,47 @@
1
+ import { AcpPermissionOption, AcpPromptResult } from './AcpTypes';
2
+ export interface AcpEventCallbacks {
3
+ onTextChunk: (text: string) => void;
4
+ onThoughtChunk?: (text: string) => void;
5
+ onToolCall?: (toolCallId: string, title: string, kind?: string) => void;
6
+ onToolResult?: (toolCallId: string, status: string, output?: string) => void;
7
+ onPlan?: (text: string) => void;
8
+ /** Returns the index of the chosen option (0 = first = typically allow_once). */
9
+ onPermissionRequest?: (title: string, options: AcpPermissionOption[]) => Promise<number>;
10
+ }
11
+ /**
12
+ * Bidirectional JSON-RPC 2.0 transport for Gemini CLI ACP.
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.
20
+ */
21
+ export declare class AcpClient {
22
+ private child;
23
+ private pendingRequests;
24
+ private nextId;
25
+ private callbacks;
26
+ private rl;
27
+ private destroyed;
28
+ constructor(geminiCommand: string, geminiArgs: string[], cwd: string, callbacks: AcpEventCallbacks);
29
+ initialize(): Promise<void>;
30
+ newSession(cwd: string): Promise<string>;
31
+ prompt(sessionId: string, text: string): Promise<AcpPromptResult>;
32
+ sendCancel(sessionId: string): void;
33
+ destroy(): void;
34
+ private sendRequest;
35
+ private sendNotification;
36
+ private sendResponse;
37
+ private sendErrorResponse;
38
+ private writeLine;
39
+ private handleLine;
40
+ private handleResponse;
41
+ private handleNotification;
42
+ private handleServerRequest;
43
+ private handleSessionUpdate;
44
+ private handlePermissionRequest;
45
+ private rejectAllPending;
46
+ }
47
+ //# sourceMappingURL=AcpClient.d.ts.map
@@ -0,0 +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"}
@@ -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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"}