@anastops/adapters 0.1.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 (49) hide show
  1. package/dist/aider/aider-adapter.d.ts +25 -0
  2. package/dist/aider/aider-adapter.d.ts.map +1 -0
  3. package/dist/aider/aider-adapter.js +99 -0
  4. package/dist/aider/aider-adapter.js.map +1 -0
  5. package/dist/base/base-adapter.d.ts +113 -0
  6. package/dist/base/base-adapter.d.ts.map +1 -0
  7. package/dist/base/base-adapter.js +227 -0
  8. package/dist/base/base-adapter.js.map +1 -0
  9. package/dist/base/detached-exec.d.ts +38 -0
  10. package/dist/base/detached-exec.d.ts.map +1 -0
  11. package/dist/base/detached-exec.js +146 -0
  12. package/dist/base/detached-exec.js.map +1 -0
  13. package/dist/claude/claude-adapter.d.ts +65 -0
  14. package/dist/claude/claude-adapter.d.ts.map +1 -0
  15. package/dist/claude/claude-adapter.js +364 -0
  16. package/dist/claude/claude-adapter.js.map +1 -0
  17. package/dist/codex/codex-adapter.d.ts +33 -0
  18. package/dist/codex/codex-adapter.d.ts.map +1 -0
  19. package/dist/codex/codex-adapter.js +108 -0
  20. package/dist/codex/codex-adapter.js.map +1 -0
  21. package/dist/copilot/copilot-adapter.d.ts +26 -0
  22. package/dist/copilot/copilot-adapter.d.ts.map +1 -0
  23. package/dist/copilot/copilot-adapter.js +92 -0
  24. package/dist/copilot/copilot-adapter.js.map +1 -0
  25. package/dist/cursor/cursor-adapter.d.ts +33 -0
  26. package/dist/cursor/cursor-adapter.d.ts.map +1 -0
  27. package/dist/cursor/cursor-adapter.js +120 -0
  28. package/dist/cursor/cursor-adapter.js.map +1 -0
  29. package/dist/gemini/gemini-adapter.d.ts +33 -0
  30. package/dist/gemini/gemini-adapter.d.ts.map +1 -0
  31. package/dist/gemini/gemini-adapter.js +111 -0
  32. package/dist/gemini/gemini-adapter.js.map +1 -0
  33. package/dist/grok/grok-adapter.d.ts +32 -0
  34. package/dist/grok/grok-adapter.d.ts.map +1 -0
  35. package/dist/grok/grok-adapter.js +101 -0
  36. package/dist/grok/grok-adapter.js.map +1 -0
  37. package/dist/index.d.ts +21 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +22 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/local/local-adapter.d.ts +91 -0
  42. package/dist/local/local-adapter.d.ts.map +1 -0
  43. package/dist/local/local-adapter.js +165 -0
  44. package/dist/local/local-adapter.js.map +1 -0
  45. package/dist/registry.d.ts +57 -0
  46. package/dist/registry.d.ts.map +1 -0
  47. package/dist/registry.js +152 -0
  48. package/dist/registry.js.map +1 -0
  49. package/package.json +65 -0
@@ -0,0 +1,108 @@
1
+ /**
2
+ * CodexAdapter - OpenAI Codex CLI adapter
3
+ *
4
+ * Integrates with OpenAI's Codex CLI for code generation.
5
+ * Uses `codex exec` for non-interactive execution.
6
+ */
7
+ import { BaseAdapter } from '../base/base-adapter.js';
8
+ import { detachedExec } from '../base/detached-exec.js';
9
+ export class CodexAdapter extends BaseAdapter {
10
+ type = 'codex';
11
+ name = 'OpenAI Codex';
12
+ constructor(config) {
13
+ super({
14
+ command: '/usr/local/bin/codex',
15
+ defaultArgs: [],
16
+ defaultTimeout: 600000, // 10 minutes
17
+ useDetachedExec: true,
18
+ ...config,
19
+ });
20
+ }
21
+ isAuthenticated() {
22
+ // Check for OPENAI_API_KEY
23
+ return Promise.resolve(process.env['OPENAI_API_KEY'] !== undefined);
24
+ }
25
+ /**
26
+ * Execute using Codex CLI with `exec` subcommand for non-interactive operation
27
+ */
28
+ async execute(request, options) {
29
+ const startTime = Date.now();
30
+ const cwd = options?.workingDir ?? request.working_dir ?? this.config.workingDir ?? process.cwd();
31
+ const timeout = options?.timeout ?? request.timeout ?? this.config.defaultTimeout ?? 600000;
32
+ // Build CLI arguments for non-interactive exec mode
33
+ const args = [
34
+ 'exec', // Non-interactive execution
35
+ '--dangerously-bypass-approvals-and-sandbox', // Skip confirmation prompts (YOLO mode)
36
+ ];
37
+ // Model selection - use proper model name, not 'codex-default'
38
+ let model = request.model ?? this.getDefaultModel();
39
+ if (model === 'codex-default') {
40
+ model = 'gpt-5-codex'; // Default to gpt-5-codex for fast execution
41
+ }
42
+ args.push('--model', model);
43
+ // Add the prompt
44
+ args.push(request.prompt);
45
+ // Execute with detached process
46
+ const result = await detachedExec(this.config.command, args, {
47
+ cwd,
48
+ timeout,
49
+ env: process.env,
50
+ signal: options?.signal,
51
+ });
52
+ if (result.failed) {
53
+ const errorDetails = [
54
+ `Exit code: ${result.exitCode}`,
55
+ `Stdout: ${result.stdout.slice(0, 500) || '(empty)'}`,
56
+ `Stderr: ${result.stderr.slice(0, 500) || '(empty)'}`,
57
+ ].join(' | ');
58
+ throw new Error(`Codex CLI failed: ${errorDetails}`);
59
+ }
60
+ const latencyMs = Date.now() - startTime;
61
+ const content = result.stdout.trim();
62
+ const usage = this.estimateUsage(request.prompt, content);
63
+ return {
64
+ content: content || 'Task completed',
65
+ model,
66
+ usage,
67
+ finish_reason: 'stop',
68
+ metadata: {
69
+ latency_ms: latencyMs,
70
+ provider: this.type,
71
+ exit_code: result.exitCode,
72
+ },
73
+ };
74
+ }
75
+ buildArgs(_request) {
76
+ // Not used - we override execute() directly
77
+ return [];
78
+ }
79
+ parseOutput(output) {
80
+ return output.trim();
81
+ }
82
+ getDefaultModel() {
83
+ return 'o3';
84
+ }
85
+ parseVersion(output) {
86
+ const match = /(\d+\.\d+\.\d+)/.exec(output);
87
+ return match?.[1] ?? output.trim();
88
+ }
89
+ getAvailableModels() {
90
+ return ['gpt-5-codex', 'gpt-5-codex low', 'gpt-5-codex medium', 'gpt-5-codex high', 'gpt-5 minimal', 'gpt-5 low', 'gpt-5 medium', 'gpt-5 high'];
91
+ }
92
+ getAvailableTools() {
93
+ return ['shell', 'file_edit', 'file_read'];
94
+ }
95
+ supportsStreaming() {
96
+ return true;
97
+ }
98
+ getContextWindow() {
99
+ return 128000;
100
+ }
101
+ getCostPer1kInput() {
102
+ return 0.01;
103
+ }
104
+ getCostPer1kOutput() {
105
+ return 0.03;
106
+ }
107
+ }
108
+ //# sourceMappingURL=codex-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-adapter.js","sourceRoot":"","sources":["../../src/codex/codex-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * CopilotAdapter - GitHub Copilot CLI adapter
3
+ *
4
+ * Integrates with GitHub Copilot CLI.
5
+ */
6
+ import type { AIRequest, ProviderType } from '@anastops/core';
7
+ import { BaseAdapter, type AdapterConfig } from '../base/base-adapter.js';
8
+ export declare class CopilotAdapter extends BaseAdapter {
9
+ readonly type: ProviderType;
10
+ readonly name = "GitHub Copilot";
11
+ constructor(config?: Partial<AdapterConfig>);
12
+ isAuthenticated(): Promise<boolean>;
13
+ protected buildArgs(request: AIRequest): string[];
14
+ protected parseOutput(output: string): string;
15
+ protected getDefaultModel(): string;
16
+ protected parseVersion(output: string): string;
17
+ getVersion(): Promise<string | null>;
18
+ isInstalled(): Promise<boolean>;
19
+ protected getAvailableModels(): string[];
20
+ protected getAvailableTools(): string[];
21
+ protected supportsStreaming(): boolean;
22
+ protected getContextWindow(): number;
23
+ protected getCostPer1kInput(): number;
24
+ protected getCostPer1kOutput(): number;
25
+ }
26
+ //# sourceMappingURL=copilot-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-adapter.d.ts","sourceRoot":"","sources":["../../src/copilot/copilot-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAI9D,OAAO,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE1E,qBAAa,cAAe,SAAQ,WAAW;IAC7C,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAa;IACxC,QAAQ,CAAC,IAAI,oBAAoB;gBAErB,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IASrC,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IASzC,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,EAAE;IAYjD,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAK7C,SAAS,CAAC,eAAe,IAAI,MAAM;IAInC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAKxC,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAYpC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAcrC,SAAS,CAAC,kBAAkB,IAAI,MAAM,EAAE;IAIxC,SAAS,CAAC,iBAAiB,IAAI,MAAM,EAAE;IAIvC,SAAS,CAAC,iBAAiB,IAAI,OAAO;IAItC,SAAS,CAAC,gBAAgB,IAAI,MAAM;IAIpC,SAAS,CAAC,iBAAiB,IAAI,MAAM;IAIrC,SAAS,CAAC,kBAAkB,IAAI,MAAM;CAGvC"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * CopilotAdapter - GitHub Copilot CLI adapter
3
+ *
4
+ * Integrates with GitHub Copilot CLI.
5
+ */
6
+ import { execa } from 'execa';
7
+ import { BaseAdapter } from '../base/base-adapter.js';
8
+ export class CopilotAdapter extends BaseAdapter {
9
+ type = 'copilot';
10
+ name = 'GitHub Copilot';
11
+ constructor(config) {
12
+ super({
13
+ command: 'gh',
14
+ defaultArgs: ['copilot', 'suggest'],
15
+ defaultTimeout: 600000, // 10 minutes
16
+ ...config,
17
+ });
18
+ }
19
+ async isAuthenticated() {
20
+ try {
21
+ const result = await execa('gh', ['auth', 'status'], { reject: false });
22
+ return result.exitCode === 0;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ buildArgs(request) {
29
+ const args = [...(this.config.defaultArgs ?? [])];
30
+ // Copilot suggest types
31
+ args.push('-t', 'shell'); // or 'git', 'gh'
32
+ // Add prompt
33
+ args.push(request.prompt);
34
+ return args;
35
+ }
36
+ parseOutput(output) {
37
+ // Copilot CLI outputs suggestions in a specific format
38
+ return output.trim();
39
+ }
40
+ getDefaultModel() {
41
+ return 'copilot';
42
+ }
43
+ parseVersion(output) {
44
+ const match = /(\d+\.\d+\.\d+)/.exec(output);
45
+ return match?.[1] ?? output.trim();
46
+ }
47
+ async getVersion() {
48
+ try {
49
+ const result = await execa('gh', ['copilot', '--version'], { reject: false });
50
+ if (result.exitCode === 0) {
51
+ return this.parseVersion(result.stdout);
52
+ }
53
+ return null;
54
+ }
55
+ catch {
56
+ return null;
57
+ }
58
+ }
59
+ async isInstalled() {
60
+ try {
61
+ // Check if gh CLI is installed
62
+ const ghResult = await execa('which', ['gh'], { reject: false });
63
+ if (ghResult.exitCode !== 0)
64
+ return false;
65
+ // Check if copilot extension is available
66
+ const copilotResult = await execa('gh', ['copilot', '--help'], { reject: false });
67
+ return copilotResult.exitCode === 0;
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ }
73
+ getAvailableModels() {
74
+ return ['copilot'];
75
+ }
76
+ getAvailableTools() {
77
+ return ['suggest', 'explain'];
78
+ }
79
+ supportsStreaming() {
80
+ return false;
81
+ }
82
+ getContextWindow() {
83
+ return 8000;
84
+ }
85
+ getCostPer1kInput() {
86
+ return 0; // Included in subscription
87
+ }
88
+ getCostPer1kOutput() {
89
+ return 0; // Included in subscription
90
+ }
91
+ }
92
+ //# sourceMappingURL=copilot-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-adapter.js","sourceRoot":"","sources":["../../src/copilot/copilot-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * CursorAdapter - Cursor Agent CLI adapter
3
+ *
4
+ * Integrates with Cursor's AI capabilities via cursor-agent CLI.
5
+ * Uses `--print` for headless/non-interactive mode.
6
+ */
7
+ import type { AIRequest, AIResponse, ProviderType } from '@anastops/core';
8
+ import { BaseAdapter, type AdapterConfig } from '../base/base-adapter.js';
9
+ export declare class CursorAdapter extends BaseAdapter {
10
+ readonly type: ProviderType;
11
+ readonly name = "Cursor Agent";
12
+ constructor(config?: Partial<AdapterConfig>);
13
+ isAuthenticated(): Promise<boolean>;
14
+ /**
15
+ * Execute using cursor-agent CLI with --print for headless mode
16
+ */
17
+ execute(request: AIRequest, options?: {
18
+ workingDir?: string;
19
+ timeout?: number;
20
+ signal?: AbortSignal;
21
+ }): Promise<AIResponse>;
22
+ protected buildArgs(_request: AIRequest): string[];
23
+ protected parseOutput(output: string): string;
24
+ protected getDefaultModel(): string;
25
+ protected parseVersion(output: string): string;
26
+ protected getAvailableModels(): string[];
27
+ protected getAvailableTools(): string[];
28
+ protected supportsStreaming(): boolean;
29
+ protected getContextWindow(): number;
30
+ protected getCostPer1kInput(): number;
31
+ protected getCostPer1kOutput(): number;
32
+ }
33
+ //# sourceMappingURL=cursor-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-adapter.d.ts","sourceRoot":"","sources":["../../src/cursor/cursor-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG1E,OAAO,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG1E,qBAAa,aAAc,SAAQ,WAAW;IAC5C,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAY;IACvC,QAAQ,CAAC,IAAI,kBAAkB;gBAEnB,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IAUrC,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAazC;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IA0DjI,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,GAAG,MAAM,EAAE;IAKlD,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAI7C,SAAS,CAAC,eAAe,IAAI,MAAM;IAInC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAK9C,SAAS,CAAC,kBAAkB,IAAI,MAAM,EAAE;IAIxC,SAAS,CAAC,iBAAiB,IAAI,MAAM,EAAE;IAIvC,SAAS,CAAC,iBAAiB,IAAI,OAAO;IAItC,SAAS,CAAC,gBAAgB,IAAI,MAAM;IAIpC,SAAS,CAAC,iBAAiB,IAAI,MAAM;IAIrC,SAAS,CAAC,kBAAkB,IAAI,MAAM;CAGvC"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * CursorAdapter - Cursor Agent CLI adapter
3
+ *
4
+ * Integrates with Cursor's AI capabilities via cursor-agent CLI.
5
+ * Uses `--print` for headless/non-interactive mode.
6
+ */
7
+ import { execa } from 'execa';
8
+ import { BaseAdapter } from '../base/base-adapter.js';
9
+ import { detachedExec } from '../base/detached-exec.js';
10
+ export class CursorAdapter extends BaseAdapter {
11
+ type = 'cursor';
12
+ name = 'Cursor Agent';
13
+ constructor(config) {
14
+ super({
15
+ command: '/Users/yishai.tamir/.local/bin/cursor-agent',
16
+ defaultArgs: [],
17
+ defaultTimeout: 600000, // 10 minutes
18
+ useDetachedExec: true,
19
+ ...config,
20
+ });
21
+ }
22
+ async isAuthenticated() {
23
+ // Check for CURSOR_API_KEY or if cursor-agent is logged in
24
+ if (process.env['CURSOR_API_KEY'] !== undefined) {
25
+ return true;
26
+ }
27
+ try {
28
+ const result = await execa('cursor-agent', ['--version'], { reject: false });
29
+ return result.exitCode === 0;
30
+ }
31
+ catch {
32
+ return false;
33
+ }
34
+ }
35
+ /**
36
+ * Execute using cursor-agent CLI with --print for headless mode
37
+ */
38
+ async execute(request, options) {
39
+ const startTime = Date.now();
40
+ const cwd = options?.workingDir ?? request.working_dir ?? this.config.workingDir ?? process.cwd();
41
+ const timeout = options?.timeout ?? request.timeout ?? this.config.defaultTimeout ?? 600000;
42
+ // Build CLI arguments for headless mode
43
+ const args = [
44
+ '--print', // Headless mode with full tool access
45
+ '--output-format', 'text', // Plain text output
46
+ '--force', // Force allow commands (YOLO mode)
47
+ '--workspace', cwd,
48
+ ];
49
+ // Model selection - use cursor-agent compatible model name
50
+ let model = request.model ?? this.getDefaultModel();
51
+ if (model === 'cursor-default') {
52
+ model = 'sonnet-4.5'; // Default to Sonnet 4.5 for cursor-agent
53
+ }
54
+ args.push('--model', model);
55
+ // Add the prompt
56
+ args.push(request.prompt);
57
+ // Execute with detached process
58
+ const result = await detachedExec(this.config.command, args, {
59
+ cwd,
60
+ timeout,
61
+ env: process.env,
62
+ signal: options?.signal,
63
+ });
64
+ if (result.failed) {
65
+ const errorDetails = [
66
+ `Exit code: ${result.exitCode}`,
67
+ `Stdout: ${result.stdout.slice(0, 500) || '(empty)'}`,
68
+ `Stderr: ${result.stderr.slice(0, 500) || '(empty)'}`,
69
+ ].join(' | ');
70
+ throw new Error(`Cursor Agent CLI failed: ${errorDetails}`);
71
+ }
72
+ const latencyMs = Date.now() - startTime;
73
+ const content = result.stdout.trim();
74
+ const usage = this.estimateUsage(request.prompt, content);
75
+ return {
76
+ content: content || 'Task completed',
77
+ model,
78
+ usage,
79
+ finish_reason: 'stop',
80
+ metadata: {
81
+ latency_ms: latencyMs,
82
+ provider: this.type,
83
+ exit_code: result.exitCode,
84
+ },
85
+ };
86
+ }
87
+ buildArgs(_request) {
88
+ // Not used - we override execute() directly
89
+ return [];
90
+ }
91
+ parseOutput(output) {
92
+ return output.trim();
93
+ }
94
+ getDefaultModel() {
95
+ return 'sonnet-4';
96
+ }
97
+ parseVersion(output) {
98
+ const match = /(\d+\.\d+\.\d+)/.exec(output);
99
+ return match?.[1] ?? output.trim();
100
+ }
101
+ getAvailableModels() {
102
+ return ['auto', 'sonnet-4.5', 'sonnet-4.5-thinking', 'opus-4.5', 'opus-4.5-thinking', 'gpt-5.2', 'gemini-3-pro', 'gemini-3-flash'];
103
+ }
104
+ getAvailableTools() {
105
+ return ['edit', 'read', 'search', 'terminal', 'browser'];
106
+ }
107
+ supportsStreaming() {
108
+ return true;
109
+ }
110
+ getContextWindow() {
111
+ return 100000;
112
+ }
113
+ getCostPer1kInput() {
114
+ return 0; // Included in subscription
115
+ }
116
+ getCostPer1kOutput() {
117
+ return 0; // Included in subscription
118
+ }
119
+ }
120
+ //# sourceMappingURL=cursor-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-adapter.js","sourceRoot":"","sources":["../../src/cursor/cursor-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * GeminiAdapter - Google Gemini CLI adapter
3
+ *
4
+ * Integrates with Google's Gemini CLI for AI assistance.
5
+ * Uses positional prompt with --yolo for non-interactive execution.
6
+ */
7
+ import type { AIRequest, AIResponse, ProviderType } from '@anastops/core';
8
+ import { BaseAdapter, type AdapterConfig } from '../base/base-adapter.js';
9
+ export declare class GeminiAdapter extends BaseAdapter {
10
+ readonly type: ProviderType;
11
+ readonly name = "Google Gemini";
12
+ constructor(config?: Partial<AdapterConfig>);
13
+ isAuthenticated(): Promise<boolean>;
14
+ /**
15
+ * Execute using Gemini CLI with --yolo for auto-approve
16
+ */
17
+ execute(request: AIRequest, options?: {
18
+ workingDir?: string;
19
+ timeout?: number;
20
+ signal?: AbortSignal;
21
+ }): Promise<AIResponse>;
22
+ protected buildArgs(_request: AIRequest): string[];
23
+ protected parseOutput(output: string): string;
24
+ protected getDefaultModel(): string;
25
+ protected parseVersion(output: string): string;
26
+ protected getAvailableModels(): string[];
27
+ protected getAvailableTools(): string[];
28
+ protected supportsStreaming(): boolean;
29
+ protected getContextWindow(): number;
30
+ protected getCostPer1kInput(): number;
31
+ protected getCostPer1kOutput(): number;
32
+ }
33
+ //# sourceMappingURL=gemini-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-adapter.d.ts","sourceRoot":"","sources":["../../src/gemini/gemini-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG1E,OAAO,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG1E,qBAAa,aAAc,SAAQ,WAAW;IAC5C,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAY;IACvC,QAAQ,CAAC,IAAI,mBAAmB;gBAEpB,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IAUrC,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAczC;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IA+CjI,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,GAAG,MAAM,EAAE;IAKlD,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAI7C,SAAS,CAAC,eAAe,IAAI,MAAM;IAInC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAK9C,SAAS,CAAC,kBAAkB,IAAI,MAAM,EAAE;IAIxC,SAAS,CAAC,iBAAiB,IAAI,MAAM,EAAE;IAIvC,SAAS,CAAC,iBAAiB,IAAI,OAAO;IAItC,SAAS,CAAC,gBAAgB,IAAI,MAAM;IAIpC,SAAS,CAAC,iBAAiB,IAAI,MAAM;IAIrC,SAAS,CAAC,kBAAkB,IAAI,MAAM;CAGvC"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * GeminiAdapter - Google Gemini CLI adapter
3
+ *
4
+ * Integrates with Google's Gemini CLI for AI assistance.
5
+ * Uses positional prompt with --yolo for non-interactive execution.
6
+ */
7
+ import { execa } from 'execa';
8
+ import { BaseAdapter } from '../base/base-adapter.js';
9
+ import { detachedExec } from '../base/detached-exec.js';
10
+ export class GeminiAdapter extends BaseAdapter {
11
+ type = 'gemini';
12
+ name = 'Google Gemini';
13
+ constructor(config) {
14
+ super({
15
+ command: '/usr/local/bin/gemini',
16
+ defaultArgs: [],
17
+ defaultTimeout: 600000, // 10 minutes
18
+ useDetachedExec: true,
19
+ ...config,
20
+ });
21
+ }
22
+ async isAuthenticated() {
23
+ // Check for GOOGLE_API_KEY or gcloud auth
24
+ if (process.env['GOOGLE_API_KEY'] !== undefined) {
25
+ return true;
26
+ }
27
+ try {
28
+ const result = await execa('gcloud', ['auth', 'print-access-token'], { reject: false });
29
+ return result.exitCode === 0;
30
+ }
31
+ catch {
32
+ return false;
33
+ }
34
+ }
35
+ /**
36
+ * Execute using Gemini CLI with --yolo for auto-approve
37
+ */
38
+ async execute(request, options) {
39
+ const startTime = Date.now();
40
+ const cwd = options?.workingDir ?? request.working_dir ?? this.config.workingDir ?? process.cwd();
41
+ const timeout = options?.timeout ?? request.timeout ?? this.config.defaultTimeout ?? 600000;
42
+ // Build CLI arguments
43
+ const args = [
44
+ '--yolo', // Auto-approve all actions
45
+ '--output-format', 'text', // Plain text output
46
+ request.prompt, // Positional prompt
47
+ ];
48
+ // Execute with detached process
49
+ const result = await detachedExec(this.config.command, args, {
50
+ cwd,
51
+ timeout,
52
+ env: process.env,
53
+ signal: options?.signal,
54
+ });
55
+ if (result.failed) {
56
+ const errorDetails = [
57
+ `Exit code: ${result.exitCode}`,
58
+ `Stdout: ${result.stdout.slice(0, 500) || '(empty)'}`,
59
+ `Stderr: ${result.stderr.slice(0, 500) || '(empty)'}`,
60
+ ].join(' | ');
61
+ throw new Error(`Gemini CLI failed: ${errorDetails}`);
62
+ }
63
+ const latencyMs = Date.now() - startTime;
64
+ const content = result.stdout.trim();
65
+ const usage = this.estimateUsage(request.prompt, content);
66
+ return {
67
+ content: content || 'Task completed',
68
+ model: 'gemini-default',
69
+ usage,
70
+ finish_reason: 'stop',
71
+ metadata: {
72
+ latency_ms: latencyMs,
73
+ provider: this.type,
74
+ exit_code: result.exitCode,
75
+ },
76
+ };
77
+ }
78
+ buildArgs(_request) {
79
+ // Not used - we override execute() directly
80
+ return [];
81
+ }
82
+ parseOutput(output) {
83
+ return output.trim();
84
+ }
85
+ getDefaultModel() {
86
+ return 'gemini-default';
87
+ }
88
+ parseVersion(output) {
89
+ const match = /(\d+\.\d+\.\d+)/.exec(output);
90
+ return match?.[1] ?? output.trim();
91
+ }
92
+ getAvailableModels() {
93
+ return ['gemini-2.5-pro', 'gemini-2.5-flash', 'gemini-2.5-flash-lite'];
94
+ }
95
+ getAvailableTools() {
96
+ return ['code_execution', 'google_search', 'file_edit', 'shell'];
97
+ }
98
+ supportsStreaming() {
99
+ return true;
100
+ }
101
+ getContextWindow() {
102
+ return 1000000;
103
+ }
104
+ getCostPer1kInput() {
105
+ return 0.000075;
106
+ }
107
+ getCostPer1kOutput() {
108
+ return 0.0003;
109
+ }
110
+ }
111
+ //# sourceMappingURL=gemini-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-adapter.js","sourceRoot":"","sources":["../../src/gemini/gemini-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * GrokAdapter - xAI Grok CLI adapter
3
+ *
4
+ * Integrates with xAI's Grok for AI assistance.
5
+ * Uses `-p, --prompt` for headless mode execution.
6
+ */
7
+ import type { AIRequest, AIResponse, ProviderType } from '@anastops/core';
8
+ import { BaseAdapter, type AdapterConfig } from '../base/base-adapter.js';
9
+ export declare class GrokAdapter extends BaseAdapter {
10
+ readonly type: ProviderType;
11
+ readonly name = "xAI Grok";
12
+ constructor(config?: Partial<AdapterConfig>);
13
+ isAuthenticated(): Promise<boolean>;
14
+ /**
15
+ * Execute using Grok CLI with --prompt for headless mode
16
+ */
17
+ execute(request: AIRequest, options?: {
18
+ workingDir?: string;
19
+ timeout?: number;
20
+ signal?: AbortSignal;
21
+ }): Promise<AIResponse>;
22
+ protected buildArgs(_request: AIRequest): string[];
23
+ protected parseOutput(output: string): string;
24
+ protected getDefaultModel(): string;
25
+ protected parseVersion(output: string): string;
26
+ protected getAvailableModels(): string[];
27
+ protected supportsStreaming(): boolean;
28
+ protected getContextWindow(): number;
29
+ protected getCostPer1kInput(): number;
30
+ protected getCostPer1kOutput(): number;
31
+ }
32
+ //# sourceMappingURL=grok-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grok-adapter.d.ts","sourceRoot":"","sources":["../../src/grok/grok-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE1E,OAAO,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG1E,qBAAa,WAAY,SAAQ,WAAW;IAC1C,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAU;IACrC,QAAQ,CAAC,IAAI,cAAc;gBAEf,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IAU3C,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAInC;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAoDjI,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,GAAG,MAAM,EAAE;IAKlD,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAI7C,SAAS,CAAC,eAAe,IAAI,MAAM;IAInC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAK9C,SAAS,CAAC,kBAAkB,IAAI,MAAM,EAAE;IAIxC,SAAS,CAAC,iBAAiB,IAAI,OAAO;IAItC,SAAS,CAAC,gBAAgB,IAAI,MAAM;IAIpC,SAAS,CAAC,iBAAiB,IAAI,MAAM;IAIrC,SAAS,CAAC,kBAAkB,IAAI,MAAM;CAGvC"}