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.
Files changed (42) hide show
  1. package/README.md +330 -0
  2. package/dist/adapters/base.d.ts +57 -0
  3. package/dist/adapters/base.d.ts.map +1 -0
  4. package/dist/adapters/base.js +28 -0
  5. package/dist/adapters/base.js.map +1 -0
  6. package/dist/adapters/claude.d.ts +45 -0
  7. package/dist/adapters/claude.d.ts.map +1 -0
  8. package/dist/adapters/claude.js +201 -0
  9. package/dist/adapters/claude.js.map +1 -0
  10. package/dist/adapters/gemini.d.ts +31 -0
  11. package/dist/adapters/gemini.d.ts.map +1 -0
  12. package/dist/adapters/gemini.js +168 -0
  13. package/dist/adapters/gemini.js.map +1 -0
  14. package/dist/adapters/index.d.ts +5 -0
  15. package/dist/adapters/index.d.ts.map +1 -0
  16. package/dist/adapters/index.js +4 -0
  17. package/dist/adapters/index.js.map +1 -0
  18. package/dist/config.d.ts +59 -0
  19. package/dist/config.d.ts.map +1 -0
  20. package/dist/config.js +131 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/index.d.ts +3 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +102 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/persistent-pty.d.ts +154 -0
  27. package/dist/persistent-pty.d.ts.map +1 -0
  28. package/dist/persistent-pty.js +477 -0
  29. package/dist/persistent-pty.js.map +1 -0
  30. package/dist/sdk-session.d.ts +65 -0
  31. package/dist/sdk-session.d.ts.map +1 -0
  32. package/dist/sdk-session.js +1238 -0
  33. package/dist/sdk-session.js.map +1 -0
  34. package/dist/utils.d.ts +49 -0
  35. package/dist/utils.d.ts.map +1 -0
  36. package/dist/utils.js +166 -0
  37. package/dist/utils.js.map +1 -0
  38. package/dist/version.d.ts +13 -0
  39. package/dist/version.d.ts.map +1 -0
  40. package/dist/version.js +54 -0
  41. package/dist/version.js.map +1 -0
  42. 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,5 @@
1
+ export type { ToolAdapter, SendOptions } from './base.js';
2
+ export { AdapterRegistry } from './base.js';
3
+ export { ClaudeAdapter } from './claude.js';
4
+ export { GeminiAdapter } from './gemini.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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,4 @@
1
+ export { AdapterRegistry } from './base.js';
2
+ export { ClaudeAdapter } from './claude.js';
3
+ export { GeminiAdapter } from './gemini.js';
4
+ //# sourceMappingURL=index.js.map
@@ -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"}
@@ -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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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,sBAAsB;AACtB,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;AACvC,QAAQ,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;AACvC,QAAQ,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;AAEvC,cAAc;AACd,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAE5B,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCjB,CAAC;AAEF,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,2DAA2D,CAAC;KACxE,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAEnC,uCAAuC;AACvC,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,iBAAiB;AACjB,MAAM,SAAS,GAAG,OAAO;KACtB,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,2BAA2B,CAAC,CAAC;AAE5C,SAAS;KACN,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,8CAA8C,CAAC;KAC3D,MAAM,CAAC,CAAC,IAAa,EAAE,EAAE;IACxB,IAAI,IAAI,EAAE,CAAC;QACT,mBAAmB;QACnB,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,uBAAuB;QACvB,MAAM,cAAc,GAAG,cAAc,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,iBAAiB,cAAc,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,gBAAgB,UAAU,EAAE,CAAC,CAAC;QAE1C,iCAAiC;QACjC,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,6CAA6C;AAC7C,OAAO;KACJ,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}