@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.
- package/dist/aider/aider-adapter.d.ts +25 -0
- package/dist/aider/aider-adapter.d.ts.map +1 -0
- package/dist/aider/aider-adapter.js +99 -0
- package/dist/aider/aider-adapter.js.map +1 -0
- package/dist/base/base-adapter.d.ts +113 -0
- package/dist/base/base-adapter.d.ts.map +1 -0
- package/dist/base/base-adapter.js +227 -0
- package/dist/base/base-adapter.js.map +1 -0
- package/dist/base/detached-exec.d.ts +38 -0
- package/dist/base/detached-exec.d.ts.map +1 -0
- package/dist/base/detached-exec.js +146 -0
- package/dist/base/detached-exec.js.map +1 -0
- package/dist/claude/claude-adapter.d.ts +65 -0
- package/dist/claude/claude-adapter.d.ts.map +1 -0
- package/dist/claude/claude-adapter.js +364 -0
- package/dist/claude/claude-adapter.js.map +1 -0
- package/dist/codex/codex-adapter.d.ts +33 -0
- package/dist/codex/codex-adapter.d.ts.map +1 -0
- package/dist/codex/codex-adapter.js +108 -0
- package/dist/codex/codex-adapter.js.map +1 -0
- package/dist/copilot/copilot-adapter.d.ts +26 -0
- package/dist/copilot/copilot-adapter.d.ts.map +1 -0
- package/dist/copilot/copilot-adapter.js +92 -0
- package/dist/copilot/copilot-adapter.js.map +1 -0
- package/dist/cursor/cursor-adapter.d.ts +33 -0
- package/dist/cursor/cursor-adapter.d.ts.map +1 -0
- package/dist/cursor/cursor-adapter.js +120 -0
- package/dist/cursor/cursor-adapter.js.map +1 -0
- package/dist/gemini/gemini-adapter.d.ts +33 -0
- package/dist/gemini/gemini-adapter.d.ts.map +1 -0
- package/dist/gemini/gemini-adapter.js +111 -0
- package/dist/gemini/gemini-adapter.js.map +1 -0
- package/dist/grok/grok-adapter.d.ts +32 -0
- package/dist/grok/grok-adapter.d.ts.map +1 -0
- package/dist/grok/grok-adapter.js +101 -0
- package/dist/grok/grok-adapter.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/local/local-adapter.d.ts +91 -0
- package/dist/local/local-adapter.d.ts.map +1 -0
- package/dist/local/local-adapter.js +165 -0
- package/dist/local/local-adapter.js.map +1 -0
- package/dist/registry.d.ts +57 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +152 -0
- package/dist/registry.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,101 @@
|
|
|
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 { BaseAdapter } from '../base/base-adapter.js';
|
|
8
|
+
import { detachedExec } from '../base/detached-exec.js';
|
|
9
|
+
export class GrokAdapter extends BaseAdapter {
|
|
10
|
+
type = 'grok';
|
|
11
|
+
name = 'xAI Grok';
|
|
12
|
+
constructor(config) {
|
|
13
|
+
super({
|
|
14
|
+
command: '/Users/yishai.tamir/.nvm/versions/node/v20.19.4/bin/grok',
|
|
15
|
+
defaultArgs: [],
|
|
16
|
+
defaultTimeout: 600000, // 10 minutes
|
|
17
|
+
useDetachedExec: true,
|
|
18
|
+
...config,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
isAuthenticated() {
|
|
22
|
+
return Promise.resolve(process.env['GROK_API_KEY'] !== undefined || process.env['XAI_API_KEY'] !== undefined);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Execute using Grok CLI with --prompt for headless mode
|
|
26
|
+
*/
|
|
27
|
+
async execute(request, options) {
|
|
28
|
+
const startTime = Date.now();
|
|
29
|
+
const cwd = options?.workingDir ?? request.working_dir ?? this.config.workingDir ?? process.cwd();
|
|
30
|
+
const timeout = options?.timeout ?? request.timeout ?? this.config.defaultTimeout ?? 600000;
|
|
31
|
+
// Build CLI arguments for headless mode
|
|
32
|
+
const args = [
|
|
33
|
+
'--prompt', request.prompt, // Headless mode
|
|
34
|
+
'--directory', cwd,
|
|
35
|
+
];
|
|
36
|
+
// Model selection
|
|
37
|
+
const model = request.model ?? this.getDefaultModel();
|
|
38
|
+
if (model !== 'grok-default') {
|
|
39
|
+
args.push('--model', model);
|
|
40
|
+
}
|
|
41
|
+
// Execute with detached process
|
|
42
|
+
const result = await detachedExec(this.config.command, args, {
|
|
43
|
+
cwd,
|
|
44
|
+
timeout,
|
|
45
|
+
env: process.env,
|
|
46
|
+
signal: options?.signal,
|
|
47
|
+
});
|
|
48
|
+
if (result.failed) {
|
|
49
|
+
const errorDetails = [
|
|
50
|
+
`Exit code: ${result.exitCode}`,
|
|
51
|
+
`Stdout: ${result.stdout.slice(0, 500) || '(empty)'}`,
|
|
52
|
+
`Stderr: ${result.stderr.slice(0, 500) || '(empty)'}`,
|
|
53
|
+
].join(' | ');
|
|
54
|
+
throw new Error(`Grok CLI failed: ${errorDetails}`);
|
|
55
|
+
}
|
|
56
|
+
const latencyMs = Date.now() - startTime;
|
|
57
|
+
const content = result.stdout.trim();
|
|
58
|
+
const usage = this.estimateUsage(request.prompt, content);
|
|
59
|
+
return {
|
|
60
|
+
content: content || 'Task completed',
|
|
61
|
+
model,
|
|
62
|
+
usage,
|
|
63
|
+
finish_reason: 'stop',
|
|
64
|
+
metadata: {
|
|
65
|
+
latency_ms: latencyMs,
|
|
66
|
+
provider: this.type,
|
|
67
|
+
exit_code: result.exitCode,
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
buildArgs(_request) {
|
|
72
|
+
// Not used - we override execute() directly
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
parseOutput(output) {
|
|
76
|
+
return output.trim();
|
|
77
|
+
}
|
|
78
|
+
getDefaultModel() {
|
|
79
|
+
return 'grok-4-latest';
|
|
80
|
+
}
|
|
81
|
+
parseVersion(output) {
|
|
82
|
+
const match = /(\d+\.\d+\.\d+)/.exec(output);
|
|
83
|
+
return match?.[1] ?? output.trim();
|
|
84
|
+
}
|
|
85
|
+
getAvailableModels() {
|
|
86
|
+
return ['grok-4-latest', 'grok-code-fast-1', 'grok-2'];
|
|
87
|
+
}
|
|
88
|
+
supportsStreaming() {
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
getContextWindow() {
|
|
92
|
+
return 128000;
|
|
93
|
+
}
|
|
94
|
+
getCostPer1kInput() {
|
|
95
|
+
return 0.005;
|
|
96
|
+
}
|
|
97
|
+
getCostPer1kOutput() {
|
|
98
|
+
return 0.015;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=grok-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grok-adapter.js","sourceRoot":"","sources":["../../src/grok/grok-adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @anastops/adapters
|
|
3
|
+
*
|
|
4
|
+
* AI provider adapters for Anastops
|
|
5
|
+
* Supports: Claude, Cursor, Codex, Gemini, Grok, Copilot, Aider
|
|
6
|
+
*/
|
|
7
|
+
export { BaseAdapter } from './base/base-adapter.js';
|
|
8
|
+
export type { AIProviderAdapter, AdapterConfig, ExecuteOptions } from './base/base-adapter.js';
|
|
9
|
+
export { detachedExec } from './base/detached-exec.js';
|
|
10
|
+
export type { DetachedExecOptions, DetachedExecResult } from './base/detached-exec.js';
|
|
11
|
+
export { ClaudeAdapter } from './claude/claude-adapter.js';
|
|
12
|
+
export { CursorAdapter } from './cursor/cursor-adapter.js';
|
|
13
|
+
export { CodexAdapter } from './codex/codex-adapter.js';
|
|
14
|
+
export { GeminiAdapter } from './gemini/gemini-adapter.js';
|
|
15
|
+
export { GrokAdapter } from './grok/grok-adapter.js';
|
|
16
|
+
export { CopilotAdapter } from './copilot/copilot-adapter.js';
|
|
17
|
+
export { AiderAdapter } from './aider/aider-adapter.js';
|
|
18
|
+
export { LocalAdapter } from './local/local-adapter.js';
|
|
19
|
+
export { AdapterRegistry, getAdapter, listAdapters } from './registry.js';
|
|
20
|
+
export type { ProviderType, AIRequest, AIResponse, AIChunk, ProviderCapabilities, HealthStatus, } from '@anastops/core';
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG/F,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAGvF,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG1E,YAAY,EACV,YAAY,EACZ,SAAS,EACT,UAAU,EACV,OAAO,EACP,oBAAoB,EACpB,YAAY,GACb,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @anastops/adapters
|
|
3
|
+
*
|
|
4
|
+
* AI provider adapters for Anastops
|
|
5
|
+
* Supports: Claude, Cursor, Codex, Gemini, Grok, Copilot, Aider
|
|
6
|
+
*/
|
|
7
|
+
// Base adapter
|
|
8
|
+
export { BaseAdapter } from './base/base-adapter.js';
|
|
9
|
+
// Detached process execution utility (for running CLI without SIGTERM from Cursor)
|
|
10
|
+
export { detachedExec } from './base/detached-exec.js';
|
|
11
|
+
// Provider adapters
|
|
12
|
+
export { ClaudeAdapter } from './claude/claude-adapter.js';
|
|
13
|
+
export { CursorAdapter } from './cursor/cursor-adapter.js';
|
|
14
|
+
export { CodexAdapter } from './codex/codex-adapter.js';
|
|
15
|
+
export { GeminiAdapter } from './gemini/gemini-adapter.js';
|
|
16
|
+
export { GrokAdapter } from './grok/grok-adapter.js';
|
|
17
|
+
export { CopilotAdapter } from './copilot/copilot-adapter.js';
|
|
18
|
+
export { AiderAdapter } from './aider/aider-adapter.js';
|
|
19
|
+
export { LocalAdapter } from './local/local-adapter.js';
|
|
20
|
+
// Adapter registry
|
|
21
|
+
export { AdapterRegistry, getAdapter, listAdapters } from './registry.js';
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,mFAAmF;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGvD,oBAAoB;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,mBAAmB;AACnB,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LocalAdapter - In-memory local execution adapter
|
|
3
|
+
*
|
|
4
|
+
* Provides simple in-memory execution for Tier 1 tasks:
|
|
5
|
+
* - Basic text transformations
|
|
6
|
+
* - Simple formatting operations
|
|
7
|
+
* - Variable renaming
|
|
8
|
+
* - Lightweight operations that don't require external CLIs
|
|
9
|
+
*
|
|
10
|
+
* No external dependencies or authentication required.
|
|
11
|
+
*/
|
|
12
|
+
import type { AIRequest, ProviderType, AIResponse } from '@anastops/core';
|
|
13
|
+
import { BaseAdapter, type AdapterConfig, type ExecuteOptions } from '../base/base-adapter.js';
|
|
14
|
+
export declare class LocalAdapter extends BaseAdapter {
|
|
15
|
+
readonly type: ProviderType;
|
|
16
|
+
readonly name = "Local (In-Memory)";
|
|
17
|
+
constructor(config?: Partial<AdapterConfig>);
|
|
18
|
+
/**
|
|
19
|
+
* Local execution always authenticated (no auth needed)
|
|
20
|
+
*/
|
|
21
|
+
isAuthenticated(): Promise<boolean>;
|
|
22
|
+
/**
|
|
23
|
+
* Override execute for in-memory processing
|
|
24
|
+
* No CLI execution - pure JavaScript/TypeScript transforms
|
|
25
|
+
*/
|
|
26
|
+
execute(request: AIRequest, _options?: ExecuteOptions): Promise<AIResponse>;
|
|
27
|
+
/**
|
|
28
|
+
* Process prompt locally in-memory
|
|
29
|
+
* MVP: Simple echo with prefix
|
|
30
|
+
* Future: Implement actual transforms
|
|
31
|
+
*/
|
|
32
|
+
private processLocally;
|
|
33
|
+
/**
|
|
34
|
+
* Build args - not used for local execution
|
|
35
|
+
*/
|
|
36
|
+
protected buildArgs(): string[];
|
|
37
|
+
/**
|
|
38
|
+
* Parse output - identity function for local
|
|
39
|
+
*/
|
|
40
|
+
protected parseOutput(output: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Default model name for local execution
|
|
43
|
+
*/
|
|
44
|
+
protected getDefaultModel(): string;
|
|
45
|
+
/**
|
|
46
|
+
* Parse version - local has no version
|
|
47
|
+
*/
|
|
48
|
+
protected parseVersion(): string;
|
|
49
|
+
/**
|
|
50
|
+
* Available models for local execution
|
|
51
|
+
*/
|
|
52
|
+
protected getAvailableModels(): string[];
|
|
53
|
+
/**
|
|
54
|
+
* Local execution has no external tools
|
|
55
|
+
*/
|
|
56
|
+
protected getAvailableTools(): string[];
|
|
57
|
+
/**
|
|
58
|
+
* Local execution doesn't support permissions
|
|
59
|
+
*/
|
|
60
|
+
protected supportsPermissions(): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Available modes for local execution
|
|
63
|
+
*/
|
|
64
|
+
protected getAvailableModes(): string[];
|
|
65
|
+
/**
|
|
66
|
+
* Local execution doesn't support streaming
|
|
67
|
+
*/
|
|
68
|
+
protected supportsStreaming(): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Context window for local execution
|
|
71
|
+
* Smaller than external providers
|
|
72
|
+
*/
|
|
73
|
+
protected getContextWindow(): number;
|
|
74
|
+
/**
|
|
75
|
+
* Local execution is free
|
|
76
|
+
*/
|
|
77
|
+
protected getCostPer1kInput(): number;
|
|
78
|
+
/**
|
|
79
|
+
* Local execution is free
|
|
80
|
+
*/
|
|
81
|
+
protected getCostPer1kOutput(): number;
|
|
82
|
+
/**
|
|
83
|
+
* Override isInstalled - local is always "installed"
|
|
84
|
+
*/
|
|
85
|
+
isInstalled(): Promise<boolean>;
|
|
86
|
+
/**
|
|
87
|
+
* Override getVersion - return static version
|
|
88
|
+
*/
|
|
89
|
+
getVersion(): Promise<string | null>;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=local-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-adapter.d.ts","sourceRoot":"","sources":["../../src/local/local-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE1E,OAAO,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE/F,qBAAa,YAAa,SAAQ,WAAW;IAC3C,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAW;IACtC,QAAQ,CAAC,IAAI,uBAAuB;gBAExB,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IAS3C;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAIzC;;;OAGG;IACG,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;IAkCjF;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAYtB;;OAEG;IACH,SAAS,CAAC,SAAS,IAAI,MAAM,EAAE;IAI/B;;OAEG;IACH,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAI7C;;OAEG;IACH,SAAS,CAAC,eAAe,IAAI,MAAM;IAInC;;OAEG;IACH,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhC;;OAEG;IACH,SAAS,CAAC,kBAAkB,IAAI,MAAM,EAAE;IAIxC;;OAEG;IACH,SAAS,CAAC,iBAAiB,IAAI,MAAM,EAAE;IAIvC;;OAEG;IACH,SAAS,CAAC,mBAAmB,IAAI,OAAO;IAIxC;;OAEG;IACH,SAAS,CAAC,iBAAiB,IAAI,MAAM,EAAE;IAIvC;;OAEG;IACH,SAAS,CAAC,iBAAiB,IAAI,OAAO;IAItC;;;OAGG;IACH,SAAS,CAAC,gBAAgB,IAAI,MAAM;IAIpC;;OAEG;IACH,SAAS,CAAC,iBAAiB,IAAI,MAAM;IAIrC;;OAEG;IACH,SAAS,CAAC,kBAAkB,IAAI,MAAM;IAItC;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAIrC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAG3C"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LocalAdapter - In-memory local execution adapter
|
|
3
|
+
*
|
|
4
|
+
* Provides simple in-memory execution for Tier 1 tasks:
|
|
5
|
+
* - Basic text transformations
|
|
6
|
+
* - Simple formatting operations
|
|
7
|
+
* - Variable renaming
|
|
8
|
+
* - Lightweight operations that don't require external CLIs
|
|
9
|
+
*
|
|
10
|
+
* No external dependencies or authentication required.
|
|
11
|
+
*/
|
|
12
|
+
import { BaseAdapter } from '../base/base-adapter.js';
|
|
13
|
+
export class LocalAdapter extends BaseAdapter {
|
|
14
|
+
type = 'local';
|
|
15
|
+
name = 'Local (In-Memory)';
|
|
16
|
+
constructor(config) {
|
|
17
|
+
super({
|
|
18
|
+
command: 'echo', // Dummy command, not actually used
|
|
19
|
+
defaultArgs: [],
|
|
20
|
+
defaultTimeout: 5000, // Fast timeout for local execution
|
|
21
|
+
...config,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Local execution always authenticated (no auth needed)
|
|
26
|
+
*/
|
|
27
|
+
async isAuthenticated() {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Override execute for in-memory processing
|
|
32
|
+
* No CLI execution - pure JavaScript/TypeScript transforms
|
|
33
|
+
*/
|
|
34
|
+
async execute(request, _options) {
|
|
35
|
+
const startTime = Date.now();
|
|
36
|
+
try {
|
|
37
|
+
// Simple in-memory execution for tier 1 tasks
|
|
38
|
+
const { prompt } = request;
|
|
39
|
+
// For MVP: Echo back with prefix
|
|
40
|
+
// Future: Implement actual WASM/JS transforms for:
|
|
41
|
+
// - Code formatting
|
|
42
|
+
// - Variable renaming
|
|
43
|
+
// - Simple refactoring
|
|
44
|
+
const content = this.processLocally(prompt);
|
|
45
|
+
const latencyMs = Date.now() - startTime;
|
|
46
|
+
const usage = this.estimateUsage(request.prompt, content);
|
|
47
|
+
return {
|
|
48
|
+
content,
|
|
49
|
+
model: request.model ?? this.getDefaultModel(),
|
|
50
|
+
usage,
|
|
51
|
+
finish_reason: 'stop',
|
|
52
|
+
metadata: {
|
|
53
|
+
latency_ms: latencyMs,
|
|
54
|
+
provider: this.type,
|
|
55
|
+
execution_mode: 'in-memory',
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
61
|
+
throw new Error(`Local execution failed: ${errorMsg}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Process prompt locally in-memory
|
|
66
|
+
* MVP: Simple echo with prefix
|
|
67
|
+
* Future: Implement actual transforms
|
|
68
|
+
*/
|
|
69
|
+
processLocally(prompt) {
|
|
70
|
+
// MVP implementation: Echo back with prefix
|
|
71
|
+
// This satisfies Tier 1 routing requirements
|
|
72
|
+
return `Local execution: ${prompt}`;
|
|
73
|
+
// Future implementations could include:
|
|
74
|
+
// - Code formatting via Prettier/ESLint
|
|
75
|
+
// - Variable renaming via AST transforms
|
|
76
|
+
// - Simple text transformations
|
|
77
|
+
// - Template expansions
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Build args - not used for local execution
|
|
81
|
+
*/
|
|
82
|
+
buildArgs() {
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Parse output - identity function for local
|
|
87
|
+
*/
|
|
88
|
+
parseOutput(output) {
|
|
89
|
+
return output.trim();
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Default model name for local execution
|
|
93
|
+
*/
|
|
94
|
+
getDefaultModel() {
|
|
95
|
+
return 'agent-booster';
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Parse version - local has no version
|
|
99
|
+
*/
|
|
100
|
+
parseVersion() {
|
|
101
|
+
return '1.0.0-local';
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Available models for local execution
|
|
105
|
+
*/
|
|
106
|
+
getAvailableModels() {
|
|
107
|
+
return ['agent-booster'];
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Local execution has no external tools
|
|
111
|
+
*/
|
|
112
|
+
getAvailableTools() {
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Local execution doesn't support permissions
|
|
117
|
+
*/
|
|
118
|
+
supportsPermissions() {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Available modes for local execution
|
|
123
|
+
*/
|
|
124
|
+
getAvailableModes() {
|
|
125
|
+
return ['transform', 'format', 'rename'];
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Local execution doesn't support streaming
|
|
129
|
+
*/
|
|
130
|
+
supportsStreaming() {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Context window for local execution
|
|
135
|
+
* Smaller than external providers
|
|
136
|
+
*/
|
|
137
|
+
getContextWindow() {
|
|
138
|
+
return 4096;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Local execution is free
|
|
142
|
+
*/
|
|
143
|
+
getCostPer1kInput() {
|
|
144
|
+
return 0;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Local execution is free
|
|
148
|
+
*/
|
|
149
|
+
getCostPer1kOutput() {
|
|
150
|
+
return 0;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Override isInstalled - local is always "installed"
|
|
154
|
+
*/
|
|
155
|
+
async isInstalled() {
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Override getVersion - return static version
|
|
160
|
+
*/
|
|
161
|
+
async getVersion() {
|
|
162
|
+
return '1.0.0-local';
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=local-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-adapter.js","sourceRoot":"","sources":["../../src/local/local-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter Registry - Central registry for all provider adapters
|
|
3
|
+
*/
|
|
4
|
+
import type { ProviderType, ProviderCapabilities } from '@anastops/core';
|
|
5
|
+
import type { AIProviderAdapter } from './base/base-adapter.js';
|
|
6
|
+
export declare class AdapterRegistry {
|
|
7
|
+
private adapters;
|
|
8
|
+
private static instance;
|
|
9
|
+
private constructor();
|
|
10
|
+
static getInstance(): AdapterRegistry;
|
|
11
|
+
/**
|
|
12
|
+
* Register an adapter
|
|
13
|
+
*/
|
|
14
|
+
register(adapter: AIProviderAdapter): void;
|
|
15
|
+
/**
|
|
16
|
+
* Get an adapter by type
|
|
17
|
+
*/
|
|
18
|
+
get(type: ProviderType): AIProviderAdapter | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* List all registered adapters
|
|
21
|
+
*/
|
|
22
|
+
list(): AIProviderAdapter[];
|
|
23
|
+
/**
|
|
24
|
+
* List all adapter types
|
|
25
|
+
*/
|
|
26
|
+
listTypes(): ProviderType[];
|
|
27
|
+
/**
|
|
28
|
+
* Get capabilities for all adapters
|
|
29
|
+
*/
|
|
30
|
+
getAllCapabilities(): Promise<Map<ProviderType, ProviderCapabilities>>;
|
|
31
|
+
/**
|
|
32
|
+
* Health check timeout in milliseconds
|
|
33
|
+
*/
|
|
34
|
+
private static readonly HEALTH_CHECK_TIMEOUT;
|
|
35
|
+
/**
|
|
36
|
+
* Get all healthy adapters with timeout protection
|
|
37
|
+
*/
|
|
38
|
+
getHealthyAdapters(): Promise<AIProviderAdapter[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Find best adapter for a task based on requirements
|
|
41
|
+
*/
|
|
42
|
+
findBestAdapter(requirements: {
|
|
43
|
+
minContextWindow?: number;
|
|
44
|
+
needsStreaming?: boolean;
|
|
45
|
+
maxCostPer1k?: number;
|
|
46
|
+
preferredType?: ProviderType;
|
|
47
|
+
}): Promise<AIProviderAdapter | null>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get an adapter by type (convenience function)
|
|
51
|
+
*/
|
|
52
|
+
export declare function getAdapter(type: ProviderType): AIProviderAdapter | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* List all adapters (convenience function)
|
|
55
|
+
*/
|
|
56
|
+
export declare function listAdapters(): AIProviderAdapter[];
|
|
57
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAShE,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAmD;IACnE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgC;IAEvD,OAAO;IAYP,MAAM,CAAC,WAAW,IAAI,eAAe;IAOrC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAI1C;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,YAAY,GAAG,iBAAiB,GAAG,SAAS;IAItD;;OAEG;IACH,IAAI,IAAI,iBAAiB,EAAE;IAI3B;;OAEG;IACH,SAAS,IAAI,YAAY,EAAE;IAI3B;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,oBAAoB,CAAC,CAAC;IAW5E;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAQ;IAEpD;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAqBxD;;OAEG;IACG,eAAe,CAAC,YAAY,EAAE;QAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,aAAa,CAAC,EAAE,YAAY,CAAC;KAC9B,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;CAkEtC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,iBAAiB,GAAG,SAAS,CAE5E;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,iBAAiB,EAAE,CAElD"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter Registry - Central registry for all provider adapters
|
|
3
|
+
*/
|
|
4
|
+
import { AiderAdapter } from './aider/aider-adapter.js';
|
|
5
|
+
import { ClaudeAdapter } from './claude/claude-adapter.js';
|
|
6
|
+
import { CodexAdapter } from './codex/codex-adapter.js';
|
|
7
|
+
import { CopilotAdapter } from './copilot/copilot-adapter.js';
|
|
8
|
+
import { CursorAdapter } from './cursor/cursor-adapter.js';
|
|
9
|
+
import { GeminiAdapter } from './gemini/gemini-adapter.js';
|
|
10
|
+
import { GrokAdapter } from './grok/grok-adapter.js';
|
|
11
|
+
import { LocalAdapter } from './local/local-adapter.js';
|
|
12
|
+
export class AdapterRegistry {
|
|
13
|
+
adapters = new Map();
|
|
14
|
+
static instance = null;
|
|
15
|
+
constructor() {
|
|
16
|
+
// Register default adapters
|
|
17
|
+
this.register(new ClaudeAdapter());
|
|
18
|
+
this.register(new CursorAdapter());
|
|
19
|
+
this.register(new CodexAdapter());
|
|
20
|
+
this.register(new GeminiAdapter());
|
|
21
|
+
this.register(new GrokAdapter());
|
|
22
|
+
this.register(new CopilotAdapter());
|
|
23
|
+
this.register(new AiderAdapter());
|
|
24
|
+
this.register(new LocalAdapter());
|
|
25
|
+
}
|
|
26
|
+
static getInstance() {
|
|
27
|
+
if (AdapterRegistry.instance === null) {
|
|
28
|
+
AdapterRegistry.instance = new AdapterRegistry();
|
|
29
|
+
}
|
|
30
|
+
return AdapterRegistry.instance;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Register an adapter
|
|
34
|
+
*/
|
|
35
|
+
register(adapter) {
|
|
36
|
+
this.adapters.set(adapter.type, adapter);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get an adapter by type
|
|
40
|
+
*/
|
|
41
|
+
get(type) {
|
|
42
|
+
return this.adapters.get(type);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* List all registered adapters
|
|
46
|
+
*/
|
|
47
|
+
list() {
|
|
48
|
+
return Array.from(this.adapters.values());
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* List all adapter types
|
|
52
|
+
*/
|
|
53
|
+
listTypes() {
|
|
54
|
+
return Array.from(this.adapters.keys());
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get capabilities for all adapters
|
|
58
|
+
*/
|
|
59
|
+
async getAllCapabilities() {
|
|
60
|
+
const capabilities = new Map();
|
|
61
|
+
for (const [type, adapter] of this.adapters) {
|
|
62
|
+
const caps = await adapter.getCapabilities();
|
|
63
|
+
capabilities.set(type, caps);
|
|
64
|
+
}
|
|
65
|
+
return capabilities;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Health check timeout in milliseconds
|
|
69
|
+
*/
|
|
70
|
+
static HEALTH_CHECK_TIMEOUT = 5000;
|
|
71
|
+
/**
|
|
72
|
+
* Get all healthy adapters with timeout protection
|
|
73
|
+
*/
|
|
74
|
+
async getHealthyAdapters() {
|
|
75
|
+
const adaptersArray = Array.from(this.adapters.values());
|
|
76
|
+
const results = await Promise.allSettled(adaptersArray.map(async (adapter) => {
|
|
77
|
+
const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Health check timeout')), AdapterRegistry.HEALTH_CHECK_TIMEOUT));
|
|
78
|
+
const status = await Promise.race([adapter.healthCheck(), timeoutPromise]);
|
|
79
|
+
return { adapter, healthy: status.healthy };
|
|
80
|
+
}));
|
|
81
|
+
return results
|
|
82
|
+
.filter((result) => result.status === 'fulfilled' && result.value.healthy)
|
|
83
|
+
.map((result) => result.value.adapter);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Find best adapter for a task based on requirements
|
|
87
|
+
*/
|
|
88
|
+
async findBestAdapter(requirements) {
|
|
89
|
+
// If preferred type is specified and healthy, use it
|
|
90
|
+
if (requirements.preferredType !== undefined) {
|
|
91
|
+
const preferred = this.adapters.get(requirements.preferredType);
|
|
92
|
+
if (preferred !== undefined) {
|
|
93
|
+
const status = await preferred.healthCheck();
|
|
94
|
+
if (status.healthy) {
|
|
95
|
+
return preferred;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Find matching adapters
|
|
100
|
+
const candidates = [];
|
|
101
|
+
for (const adapter of this.adapters.values()) {
|
|
102
|
+
const [status, caps] = await Promise.all([
|
|
103
|
+
adapter.healthCheck(),
|
|
104
|
+
adapter.getCapabilities(),
|
|
105
|
+
]);
|
|
106
|
+
if (!status.healthy || !caps.installed || !caps.authenticated) {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
// Check requirements
|
|
110
|
+
if (requirements.minContextWindow !== undefined &&
|
|
111
|
+
caps.context_window < requirements.minContextWindow) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (requirements.needsStreaming === true && !caps.streaming) {
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
if (requirements.maxCostPer1k !== undefined &&
|
|
118
|
+
caps.cost_per_1k_input > requirements.maxCostPer1k) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
candidates.push(adapter);
|
|
122
|
+
}
|
|
123
|
+
if (candidates.length === 0) {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
// Return cheapest option by default
|
|
127
|
+
const caps = await Promise.all(candidates.map((a) => a.getCapabilities()));
|
|
128
|
+
let bestIdx = 0;
|
|
129
|
+
let bestCost = caps[0]?.cost_per_1k_input ?? Infinity;
|
|
130
|
+
for (let i = 1; i < caps.length; i++) {
|
|
131
|
+
const cost = caps[i]?.cost_per_1k_input ?? Infinity;
|
|
132
|
+
if (cost < bestCost) {
|
|
133
|
+
bestCost = cost;
|
|
134
|
+
bestIdx = i;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return candidates[bestIdx] ?? null;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get an adapter by type (convenience function)
|
|
142
|
+
*/
|
|
143
|
+
export function getAdapter(type) {
|
|
144
|
+
return AdapterRegistry.getInstance().get(type);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* List all adapters (convenience function)
|
|
148
|
+
*/
|
|
149
|
+
export function listAdapters() {
|
|
150
|
+
return AdapterRegistry.getInstance().list();
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|