ai-code-connect 0.2.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/README.md +330 -0
- package/dist/adapters/base.d.ts +57 -0
- package/dist/adapters/base.d.ts.map +1 -0
- package/dist/adapters/base.js +28 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/claude.d.ts +45 -0
- package/dist/adapters/claude.d.ts.map +1 -0
- package/dist/adapters/claude.js +201 -0
- package/dist/adapters/claude.js.map +1 -0
- package/dist/adapters/gemini.d.ts +31 -0
- package/dist/adapters/gemini.d.ts.map +1 -0
- package/dist/adapters/gemini.js +168 -0
- package/dist/adapters/gemini.js.map +1 -0
- package/dist/adapters/index.d.ts +5 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +4 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/config.d.ts +59 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +131 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +102 -0
- package/dist/index.js.map +1 -0
- package/dist/persistent-pty.d.ts +154 -0
- package/dist/persistent-pty.d.ts.map +1 -0
- package/dist/persistent-pty.js +477 -0
- package/dist/persistent-pty.js.map +1 -0
- package/dist/sdk-session.d.ts +65 -0
- package/dist/sdk-session.d.ts.map +1 -0
- package/dist/sdk-session.js +1238 -0
- package/dist/sdk-session.js.map +1 -0
- package/dist/utils.d.ts +49 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +166 -0
- package/dist/utils.js.map +1 -0
- package/dist/version.d.ts +13 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +54 -0
- package/dist/version.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/adapters/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ToolAdapter, SendOptions } from './base.js';
|
|
2
|
+
/**
|
|
3
|
+
* Adapter for Gemini CLI
|
|
4
|
+
*
|
|
5
|
+
* Gemini CLI supports:
|
|
6
|
+
* - Non-interactive mode via positional query argument
|
|
7
|
+
* - Output formats: text, json, stream-json (via -o/--output-format)
|
|
8
|
+
* - Session resume via -r/--resume
|
|
9
|
+
* - YOLO mode via -y/--yolo for auto-approval
|
|
10
|
+
*/
|
|
11
|
+
export declare class GeminiAdapter implements ToolAdapter {
|
|
12
|
+
readonly name = "gemini";
|
|
13
|
+
readonly displayName = "Gemini CLI";
|
|
14
|
+
readonly color = "\u001B[95m";
|
|
15
|
+
readonly promptPattern: RegExp;
|
|
16
|
+
readonly idleTimeout = 1500;
|
|
17
|
+
readonly startupDelay = 8000;
|
|
18
|
+
private hasActiveSession;
|
|
19
|
+
isAvailable(): Promise<boolean>;
|
|
20
|
+
getCommand(prompt: string, options?: SendOptions): string[];
|
|
21
|
+
getInteractiveCommand(options?: SendOptions): string[];
|
|
22
|
+
getPersistentArgs(): string[];
|
|
23
|
+
cleanResponse(rawOutput: string): string;
|
|
24
|
+
send(prompt: string, options?: SendOptions): Promise<string>;
|
|
25
|
+
resetContext(): void;
|
|
26
|
+
/** Check if there's an active session */
|
|
27
|
+
hasSession(): boolean;
|
|
28
|
+
/** Mark that a session exists (for loading from persisted state) */
|
|
29
|
+
setHasSession(value: boolean): void;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=gemini.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/adapters/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGrD;;;;;;;;GAQG;AACH,qBAAa,aAAc,YAAW,WAAW;IAC/C,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,gBAAgB;IACpC,QAAQ,CAAC,KAAK,gBAAc;IAG5B,QAAQ,CAAC,aAAa,SAAa;IAGnC,QAAQ,CAAC,WAAW,QAAQ;IAG5B,QAAQ,CAAC,YAAY,QAAQ;IAE7B,OAAO,CAAC,gBAAgB,CAAS;IAE3B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAIrC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE;IAkB3D,qBAAqB,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE;IAStD,iBAAiB,IAAI,MAAM,EAAE;IAQ7B,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAsGlC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBlE,YAAY,IAAI,IAAI;IAIpB,yCAAyC;IACzC,UAAU,IAAI,OAAO;IAIrB,oEAAoE;IACpE,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;CAGpC"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { runCommand, commandExists } from '../utils.js';
|
|
2
|
+
/**
|
|
3
|
+
* Adapter for Gemini CLI
|
|
4
|
+
*
|
|
5
|
+
* Gemini CLI supports:
|
|
6
|
+
* - Non-interactive mode via positional query argument
|
|
7
|
+
* - Output formats: text, json, stream-json (via -o/--output-format)
|
|
8
|
+
* - Session resume via -r/--resume
|
|
9
|
+
* - YOLO mode via -y/--yolo for auto-approval
|
|
10
|
+
*/
|
|
11
|
+
export class GeminiAdapter {
|
|
12
|
+
name = 'gemini';
|
|
13
|
+
displayName = 'Gemini CLI';
|
|
14
|
+
color = '\x1b[95m'; // brightMagenta
|
|
15
|
+
// Gemini shows > at start of line when ready for input
|
|
16
|
+
promptPattern = /^>\s*$/m;
|
|
17
|
+
// Fallback: if no output for 1.5 seconds, assume response complete
|
|
18
|
+
idleTimeout = 1500;
|
|
19
|
+
// Gemini is slower to start (~8 seconds for first launch due to auth/loading)
|
|
20
|
+
startupDelay = 8000;
|
|
21
|
+
hasActiveSession = false;
|
|
22
|
+
async isAvailable() {
|
|
23
|
+
return commandExists('gemini');
|
|
24
|
+
}
|
|
25
|
+
getCommand(prompt, options) {
|
|
26
|
+
const args = [];
|
|
27
|
+
// Resume previous session if we've already made a call
|
|
28
|
+
const shouldContinue = options?.continueSession !== false && this.hasActiveSession;
|
|
29
|
+
if (shouldContinue) {
|
|
30
|
+
args.push('--resume', 'latest');
|
|
31
|
+
}
|
|
32
|
+
// Note: Don't use --include-directories here because it takes an array and would
|
|
33
|
+
// consume the prompt. The cwd is set when spawning the process.
|
|
34
|
+
// Add the prompt as the last argument (positional)
|
|
35
|
+
args.push(prompt);
|
|
36
|
+
return ['gemini', ...args];
|
|
37
|
+
}
|
|
38
|
+
getInteractiveCommand(options) {
|
|
39
|
+
const args = [];
|
|
40
|
+
// Resume session if we have one
|
|
41
|
+
if (options?.continueSession !== false && this.hasActiveSession) {
|
|
42
|
+
args.push('--resume', 'latest');
|
|
43
|
+
}
|
|
44
|
+
return ['gemini', ...args];
|
|
45
|
+
}
|
|
46
|
+
getPersistentArgs() {
|
|
47
|
+
// Resume previous session if we have one from regular mode
|
|
48
|
+
if (this.hasActiveSession) {
|
|
49
|
+
return ['--resume', 'latest'];
|
|
50
|
+
}
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
cleanResponse(rawOutput) {
|
|
54
|
+
let output = rawOutput;
|
|
55
|
+
// Remove all ANSI escape sequences first
|
|
56
|
+
output = output.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, '');
|
|
57
|
+
output = output.replace(/\x1b\[\??\d+[hl]/g, '');
|
|
58
|
+
output = output.replace(/\x1b\[\d* ?q/g, '');
|
|
59
|
+
output = output.replace(/\x1b\][^\x07]*\x07/g, ''); // OSC sequences
|
|
60
|
+
// Remove "Loaded cached credentials." line
|
|
61
|
+
output = output.replace(/Loaded cached credentials\.?\s*/g, '');
|
|
62
|
+
// Remove spinner frames
|
|
63
|
+
output = output.replace(/[⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏]/g, '');
|
|
64
|
+
// Remove box drawing characters and lines made of them
|
|
65
|
+
output = output.replace(/[╭╮╰╯│─┌┐└┘├┤┬┴┼║═╔╗╚╝╠╣╦╩╬]/g, '');
|
|
66
|
+
// Remove Gemini UI-specific lines
|
|
67
|
+
output = output.replace(/^\s*Using:.*MCP servers?\s*$/gm, '');
|
|
68
|
+
output = output.replace(/^\s*~\/.*\(main\*?\).*$/gm, ''); // Directory status line
|
|
69
|
+
output = output.replace(/^\s*~\/[^\n]*$/gm, ''); // Any directory path line
|
|
70
|
+
output = output.replace(/^\s*no sandbox.*$/gim, '');
|
|
71
|
+
output = output.replace(/^\s*auto\s*$/gm, '');
|
|
72
|
+
output = output.replace(/^\s*Reading.*\(esc to cancel.*\)\s*$/gm, '');
|
|
73
|
+
output = output.replace(/^\s*Type your message or @path.*$/gm, '');
|
|
74
|
+
output = output.replace(/^\s*>\s*Type your message.*$/gm, '');
|
|
75
|
+
output = output.replace(/^\s*\?\s*for shortcuts\s*$/gm, '');
|
|
76
|
+
output = output.replace(/^\s*Try ".*"\s*$/gm, ''); // Suggestion lines
|
|
77
|
+
// Remove thinking/incubating indicators
|
|
78
|
+
output = output.replace(/^\s*∴ Thought for.*$/gm, '');
|
|
79
|
+
output = output.replace(/^\s*✽ Incubating.*$/gm, '');
|
|
80
|
+
output = output.replace(/\(ctrl\+o to show thinking\)/gi, '');
|
|
81
|
+
output = output.replace(/\(esc to interrupt\)/gi, '');
|
|
82
|
+
output = output.replace(/\(esc to cancel.*\)/gi, '');
|
|
83
|
+
// Remove tool status lines (✓ ReadFolder, ✓ ReadFile, etc.)
|
|
84
|
+
output = output.replace(/^\s*[✓✗]\s+\w+.*$/gm, '');
|
|
85
|
+
// Remove the prompt character
|
|
86
|
+
output = output.replace(/^>\s*$/gm, '');
|
|
87
|
+
// Remove "... generating more ..." markers
|
|
88
|
+
output = output.replace(/\.\.\.\s*generating more\s*\.\.\./gi, '');
|
|
89
|
+
// GEMINI-SPECIFIC: Gemini streams code progressively with status indicators.
|
|
90
|
+
// Each indicator is followed by a progressively more complete code block.
|
|
91
|
+
// Unlike Claude (which streams text progressively), Gemini REDRAWS from the beginning.
|
|
92
|
+
// We need to find the LAST occurrence and keep only that final complete block.
|
|
93
|
+
const streamingPatterns = [
|
|
94
|
+
/Defining the Response Strategy/gi,
|
|
95
|
+
/Formulating\s+\w+\s+Code/gi,
|
|
96
|
+
/Formulating\s+\w+\s+Response/gi,
|
|
97
|
+
/Considering\s+the\s+Response\s+Format/gi,
|
|
98
|
+
/Presenting\s+the\s+Code/gi,
|
|
99
|
+
/Presenting\s+the\s+Response/gi,
|
|
100
|
+
/Providing\s+\w+\s+Code\s+Example/gi,
|
|
101
|
+
/Generating\s+\w+\s+Code/gi,
|
|
102
|
+
/Writing\s+the\s+Code/gi,
|
|
103
|
+
];
|
|
104
|
+
// Find the position after the LAST streaming indicator
|
|
105
|
+
let lastIndicatorEnd = 0;
|
|
106
|
+
for (const pattern of streamingPatterns) {
|
|
107
|
+
const regex = new RegExp(pattern.source, 'gi');
|
|
108
|
+
let match;
|
|
109
|
+
while ((match = regex.exec(output)) !== null) {
|
|
110
|
+
const endPos = match.index + match[0].length;
|
|
111
|
+
if (endPos > lastIndicatorEnd) {
|
|
112
|
+
lastIndicatorEnd = endPos;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// If we found streaming indicators, take only content after the last one
|
|
117
|
+
if (lastIndicatorEnd > 0) {
|
|
118
|
+
output = output.substring(lastIndicatorEnd).trim();
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
// Fallback: try the ✦ marker
|
|
122
|
+
const lastMarkerIndex = output.lastIndexOf('✦');
|
|
123
|
+
if (lastMarkerIndex >= 0) {
|
|
124
|
+
output = output.substring(lastMarkerIndex + 1).trim();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Clean up any remaining line-based garbage
|
|
128
|
+
const cleanedLines = output.split('\n').filter(line => {
|
|
129
|
+
const trimmed = line.trim();
|
|
130
|
+
// Skip empty UI elements
|
|
131
|
+
if (trimmed.match(/^[\s│─╭╮╰╯]*$/) && trimmed.length < 3)
|
|
132
|
+
return false;
|
|
133
|
+
return true;
|
|
134
|
+
});
|
|
135
|
+
output = cleanedLines.join('\n');
|
|
136
|
+
// Final cleanup
|
|
137
|
+
output = output.replace(/\n{3,}/g, '\n\n');
|
|
138
|
+
output = output.replace(/^\s+$/gm, ''); // Lines with only whitespace
|
|
139
|
+
return output.trim();
|
|
140
|
+
}
|
|
141
|
+
async send(prompt, options) {
|
|
142
|
+
// Use non-interactive runCommand to avoid messing with stdin
|
|
143
|
+
const args = this.getCommand(prompt, options).slice(1); // Remove 'gemini' from start
|
|
144
|
+
const result = await runCommand('gemini', args, {
|
|
145
|
+
cwd: options?.cwd || process.cwd(),
|
|
146
|
+
});
|
|
147
|
+
if (result.exitCode !== 0) {
|
|
148
|
+
const errorMsg = result.stderr.trim() || result.stdout.trim() || 'Unknown error';
|
|
149
|
+
throw new Error(`Gemini CLI exited with code ${result.exitCode}: ${errorMsg}`);
|
|
150
|
+
}
|
|
151
|
+
// Mark that we now have an active session
|
|
152
|
+
this.hasActiveSession = true;
|
|
153
|
+
// Return stdout
|
|
154
|
+
return result.stdout.trim();
|
|
155
|
+
}
|
|
156
|
+
resetContext() {
|
|
157
|
+
this.hasActiveSession = false;
|
|
158
|
+
}
|
|
159
|
+
/** Check if there's an active session */
|
|
160
|
+
hasSession() {
|
|
161
|
+
return this.hasActiveSession;
|
|
162
|
+
}
|
|
163
|
+
/** Mark that a session exists (for loading from persisted state) */
|
|
164
|
+
setHasSession(value) {
|
|
165
|
+
this.hasActiveSession = value;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/adapters/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export interface ToolConfig {
|
|
2
|
+
command?: string;
|
|
3
|
+
defaultFlags?: string[];
|
|
4
|
+
}
|
|
5
|
+
export interface VersionCache {
|
|
6
|
+
lastCheck: number;
|
|
7
|
+
latestVersion: string;
|
|
8
|
+
}
|
|
9
|
+
export interface Config {
|
|
10
|
+
defaultTool: string;
|
|
11
|
+
tools: {
|
|
12
|
+
[name: string]: ToolConfig;
|
|
13
|
+
};
|
|
14
|
+
versionCache?: VersionCache;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Get the config directory path
|
|
18
|
+
*/
|
|
19
|
+
export declare function getConfigDir(): string;
|
|
20
|
+
/**
|
|
21
|
+
* Get the config file path
|
|
22
|
+
*/
|
|
23
|
+
export declare function getConfigPath(): string;
|
|
24
|
+
/**
|
|
25
|
+
* Ensure the config directory exists
|
|
26
|
+
*/
|
|
27
|
+
export declare function ensureConfigDir(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Load configuration from disk, or return defaults
|
|
30
|
+
*/
|
|
31
|
+
export declare function loadConfig(): Config;
|
|
32
|
+
/**
|
|
33
|
+
* Save configuration to disk
|
|
34
|
+
*/
|
|
35
|
+
export declare function saveConfig(config: Config): void;
|
|
36
|
+
/**
|
|
37
|
+
* Get the default tool (checks env var first, then config)
|
|
38
|
+
*/
|
|
39
|
+
export declare function getDefaultTool(): string;
|
|
40
|
+
/**
|
|
41
|
+
* Set the default tool and save to config
|
|
42
|
+
*/
|
|
43
|
+
export declare function setDefaultTool(tool: string): {
|
|
44
|
+
success: boolean;
|
|
45
|
+
message: string;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Get the cached version info
|
|
49
|
+
*/
|
|
50
|
+
export declare function getVersionCache(): VersionCache | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* Save version cache to config
|
|
53
|
+
*/
|
|
54
|
+
export declare function setVersionCache(cache: VersionCache): void;
|
|
55
|
+
/**
|
|
56
|
+
* Check if we should perform a version check (based on cache age)
|
|
57
|
+
*/
|
|
58
|
+
export declare function shouldCheckVersion(): boolean;
|
|
59
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,MAAM;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE;QACL,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;KAC5B,CAAC;IACF,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAgBD;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAKtC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAsBnC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAI/C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAUvC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAmBlF;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,GAAG,SAAS,CAG1D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAIzD;AAKD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAM5C"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
|
|
2
|
+
import { homedir } from 'os';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
const DEFAULT_CONFIG = {
|
|
5
|
+
defaultTool: 'claude',
|
|
6
|
+
tools: {
|
|
7
|
+
claude: {
|
|
8
|
+
command: 'claude',
|
|
9
|
+
defaultFlags: ['-p', '--output-format', 'text'],
|
|
10
|
+
},
|
|
11
|
+
gemini: {
|
|
12
|
+
command: 'gemini',
|
|
13
|
+
defaultFlags: ['-o', 'text'],
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Get the config directory path
|
|
19
|
+
*/
|
|
20
|
+
export function getConfigDir() {
|
|
21
|
+
return join(homedir(), '.aic');
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get the config file path
|
|
25
|
+
*/
|
|
26
|
+
export function getConfigPath() {
|
|
27
|
+
return join(getConfigDir(), 'config.json');
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Ensure the config directory exists
|
|
31
|
+
*/
|
|
32
|
+
export function ensureConfigDir() {
|
|
33
|
+
const dir = getConfigDir();
|
|
34
|
+
if (!existsSync(dir)) {
|
|
35
|
+
mkdirSync(dir, { recursive: true });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Load configuration from disk, or return defaults
|
|
40
|
+
*/
|
|
41
|
+
export function loadConfig() {
|
|
42
|
+
const configPath = getConfigPath();
|
|
43
|
+
if (!existsSync(configPath)) {
|
|
44
|
+
return { ...DEFAULT_CONFIG };
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
const content = readFileSync(configPath, 'utf-8');
|
|
48
|
+
const loaded = JSON.parse(content);
|
|
49
|
+
return {
|
|
50
|
+
...DEFAULT_CONFIG,
|
|
51
|
+
...loaded,
|
|
52
|
+
tools: {
|
|
53
|
+
...DEFAULT_CONFIG.tools,
|
|
54
|
+
...loaded.tools,
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
console.warn('Failed to load config, using defaults');
|
|
60
|
+
return { ...DEFAULT_CONFIG };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Save configuration to disk
|
|
65
|
+
*/
|
|
66
|
+
export function saveConfig(config) {
|
|
67
|
+
ensureConfigDir();
|
|
68
|
+
const configPath = getConfigPath();
|
|
69
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get the default tool (checks env var first, then config)
|
|
73
|
+
*/
|
|
74
|
+
export function getDefaultTool() {
|
|
75
|
+
// Environment variable takes priority
|
|
76
|
+
const envTool = process.env.AIC_DEFAULT_TOOL;
|
|
77
|
+
if (envTool && ['claude', 'gemini'].includes(envTool.toLowerCase())) {
|
|
78
|
+
return envTool.toLowerCase();
|
|
79
|
+
}
|
|
80
|
+
// Fall back to config file
|
|
81
|
+
const config = loadConfig();
|
|
82
|
+
return config.defaultTool || 'claude';
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Set the default tool and save to config
|
|
86
|
+
*/
|
|
87
|
+
export function setDefaultTool(tool) {
|
|
88
|
+
const validTools = ['claude', 'gemini'];
|
|
89
|
+
const normalizedTool = tool.toLowerCase();
|
|
90
|
+
if (!validTools.includes(normalizedTool)) {
|
|
91
|
+
return {
|
|
92
|
+
success: false,
|
|
93
|
+
message: `Invalid tool "${tool}". Valid options: ${validTools.join(', ')}`
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const config = loadConfig();
|
|
97
|
+
config.defaultTool = normalizedTool;
|
|
98
|
+
saveConfig(config);
|
|
99
|
+
return {
|
|
100
|
+
success: true,
|
|
101
|
+
message: `Default tool set to "${normalizedTool}". Will be used on next launch.`
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get the cached version info
|
|
106
|
+
*/
|
|
107
|
+
export function getVersionCache() {
|
|
108
|
+
const config = loadConfig();
|
|
109
|
+
return config.versionCache;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Save version cache to config
|
|
113
|
+
*/
|
|
114
|
+
export function setVersionCache(cache) {
|
|
115
|
+
const config = loadConfig();
|
|
116
|
+
config.versionCache = cache;
|
|
117
|
+
saveConfig(config);
|
|
118
|
+
}
|
|
119
|
+
// Cache version checks for 24 hours
|
|
120
|
+
const VERSION_CHECK_INTERVAL = 24 * 60 * 60 * 1000;
|
|
121
|
+
/**
|
|
122
|
+
* Check if we should perform a version check (based on cache age)
|
|
123
|
+
*/
|
|
124
|
+
export function shouldCheckVersion() {
|
|
125
|
+
const cache = getVersionCache();
|
|
126
|
+
if (!cache)
|
|
127
|
+
return true;
|
|
128
|
+
const age = Date.now() - cache.lastCheck;
|
|
129
|
+
return age > VERSION_CHECK_INTERVAL;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { AdapterRegistry, ClaudeAdapter, GeminiAdapter } from './adapters/index.js';
|
|
4
|
+
import { loadConfig, getDefaultTool, setDefaultTool, getConfigPath } from './config.js';
|
|
5
|
+
import { startSDKSession } from './sdk-session.js';
|
|
6
|
+
import { VERSION } from './version.js';
|
|
7
|
+
const program = new Command();
|
|
8
|
+
// Initialize adapters
|
|
9
|
+
const registry = new AdapterRegistry();
|
|
10
|
+
registry.register(new ClaudeAdapter());
|
|
11
|
+
registry.register(new GeminiAdapter());
|
|
12
|
+
// Load config
|
|
13
|
+
const config = loadConfig();
|
|
14
|
+
const HELP_TEXT = `
|
|
15
|
+
AIC² - AI Code Connect
|
|
16
|
+
Bridge Claude Code and Gemini CLI in a single session.
|
|
17
|
+
|
|
18
|
+
Session Commands:
|
|
19
|
+
/claude Switch to Claude Code
|
|
20
|
+
/gemini Switch to Gemini CLI
|
|
21
|
+
/i Enter interactive mode (Ctrl+] to detach)
|
|
22
|
+
/forward [tool] [msg] Forward last response to another tool
|
|
23
|
+
/forward -i [tool] Forward and enter interactive mode
|
|
24
|
+
/forwardi [tool] Same as /forward -i (alias: /fwdi)
|
|
25
|
+
/history Show conversation history
|
|
26
|
+
/status Show running processes
|
|
27
|
+
/default <tool> Set default tool (saved permanently)
|
|
28
|
+
/clear Clear sessions and history
|
|
29
|
+
/quit, /cya Exit
|
|
30
|
+
|
|
31
|
+
Tool Commands:
|
|
32
|
+
//command Run /command in interactive mode (e.g., //status, //cost)
|
|
33
|
+
|
|
34
|
+
Configuration:
|
|
35
|
+
aic config default [tool] Get or set default tool
|
|
36
|
+
AIC_DEFAULT_TOOL=gemini Override via environment variable
|
|
37
|
+
|
|
38
|
+
Forward Behavior:
|
|
39
|
+
With 2 tools: /forward Auto-selects the other tool
|
|
40
|
+
With 3+ tools: /forward <tool> Target tool required
|
|
41
|
+
Use -i flag: /forward -i Enter interactive mode after forwarding
|
|
42
|
+
|
|
43
|
+
Examples:
|
|
44
|
+
aic Launch interactive session
|
|
45
|
+
aic tools List available AI tools
|
|
46
|
+
aic config default gemini Set Gemini as default tool
|
|
47
|
+
`;
|
|
48
|
+
program
|
|
49
|
+
.name('aic')
|
|
50
|
+
.description('AIC² - AI Code Connect\nBridge Claude Code and Gemini CLI')
|
|
51
|
+
.version(VERSION)
|
|
52
|
+
.addHelpText('after', HELP_TEXT);
|
|
53
|
+
// Tools command - list available tools
|
|
54
|
+
program
|
|
55
|
+
.command('tools')
|
|
56
|
+
.description('List available AI tools and their status')
|
|
57
|
+
.action(async () => {
|
|
58
|
+
console.log('Available tools:\n');
|
|
59
|
+
for (const adapter of registry.getAll()) {
|
|
60
|
+
const available = await adapter.isAvailable();
|
|
61
|
+
const status = available ? '✓ available' : '✗ not found';
|
|
62
|
+
console.log(` ${adapter.name.padEnd(10)} ${adapter.displayName.padEnd(15)} ${status}`);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
// Config command
|
|
66
|
+
const configCmd = program
|
|
67
|
+
.command('config')
|
|
68
|
+
.description('Manage AIC² configuration');
|
|
69
|
+
configCmd
|
|
70
|
+
.command('default [tool]')
|
|
71
|
+
.description('Get or set the default tool (claude, gemini)')
|
|
72
|
+
.action((tool) => {
|
|
73
|
+
if (tool) {
|
|
74
|
+
// Set default tool
|
|
75
|
+
const result = setDefaultTool(tool);
|
|
76
|
+
if (result.success) {
|
|
77
|
+
console.log(`✓ ${result.message}`);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
console.error(`✗ ${result.message}`);
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
// Show current default
|
|
86
|
+
const currentDefault = getDefaultTool();
|
|
87
|
+
const configPath = getConfigPath();
|
|
88
|
+
console.log(`Default tool: ${currentDefault}`);
|
|
89
|
+
console.log(`Config file: ${configPath}`);
|
|
90
|
+
// Check if env var is overriding
|
|
91
|
+
if (process.env.AIC_DEFAULT_TOOL) {
|
|
92
|
+
console.log(`(Overridden by AIC_DEFAULT_TOOL environment variable)`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
// Default action - start interactive session
|
|
97
|
+
program
|
|
98
|
+
.action(async () => {
|
|
99
|
+
await startSDKSession(registry);
|
|
100
|
+
});
|
|
101
|
+
program.parse();
|
|
102
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|