@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,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detached process execution utility
|
|
3
|
+
*
|
|
4
|
+
* Spawns CLI processes as fully detached processes to avoid SIGTERM
|
|
5
|
+
* from parent process (e.g., Cursor) killing nested AI CLI instances.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from 'child_process';
|
|
8
|
+
import { randomUUID } from 'crypto';
|
|
9
|
+
import { existsSync, readFileSync, unlinkSync, writeFileSync } from 'fs';
|
|
10
|
+
/**
|
|
11
|
+
* Execute a command as a detached process.
|
|
12
|
+
*
|
|
13
|
+
* This spawns the command in a fully detached process that won't be
|
|
14
|
+
* killed when the parent process receives SIGTERM (e.g., from Cursor).
|
|
15
|
+
*/
|
|
16
|
+
export async function detachedExec(command, args, options = {}) {
|
|
17
|
+
const execId = randomUUID();
|
|
18
|
+
const stdoutFile = `/tmp/anastops-${execId}-stdout.txt`;
|
|
19
|
+
const stderrFile = `/tmp/anastops-${execId}-stderr.txt`;
|
|
20
|
+
const exitCodeFile = `/tmp/anastops-${execId}-exit.txt`;
|
|
21
|
+
const inputFile = `/tmp/anastops-${execId}-input.txt`;
|
|
22
|
+
const wrapperScript = `/tmp/anastops-${execId}-wrapper.sh`;
|
|
23
|
+
const cwd = options.cwd ?? process.cwd();
|
|
24
|
+
const timeout = options.timeout ?? 0; // 0 means no timeout
|
|
25
|
+
const env = options.env ?? process.env;
|
|
26
|
+
const longArgs = options.longArgs ?? new Map();
|
|
27
|
+
const longArgFiles = [];
|
|
28
|
+
// Filter out Cursor-specific env vars that may cause conflicts
|
|
29
|
+
const filteredEnv = Object.fromEntries(Object.entries(env).filter(([k]) => !k.startsWith('CURSOR_')));
|
|
30
|
+
try {
|
|
31
|
+
// Write input to file if provided
|
|
32
|
+
if (options.input !== undefined) {
|
|
33
|
+
writeFileSync(inputFile, options.input);
|
|
34
|
+
}
|
|
35
|
+
// Write long arguments to separate files
|
|
36
|
+
const argFileMap = new Map();
|
|
37
|
+
let argFileIndex = 0;
|
|
38
|
+
for (const [argName, argValue] of longArgs) {
|
|
39
|
+
const argFile = `/tmp/anastops-${execId}-arg${argFileIndex}.txt`;
|
|
40
|
+
writeFileSync(argFile, argValue);
|
|
41
|
+
argFileMap.set(argName, argFile);
|
|
42
|
+
longArgFiles.push(argFile);
|
|
43
|
+
argFileIndex++;
|
|
44
|
+
}
|
|
45
|
+
// Build the command string with proper escaping
|
|
46
|
+
// For long args, use $(cat file) substitution
|
|
47
|
+
const escapedArgs = args.map(a => {
|
|
48
|
+
const argFile = argFileMap.get(a);
|
|
49
|
+
if (argFile !== undefined) {
|
|
50
|
+
// This is a long arg - use cat substitution
|
|
51
|
+
return `"$(cat '${argFile}')"`;
|
|
52
|
+
}
|
|
53
|
+
// Regular escaping for short args
|
|
54
|
+
return `"${a.replace(/"/g, '\\"').replace(/\$/g, '\\$')}"`;
|
|
55
|
+
}).join(' ');
|
|
56
|
+
// Create wrapper script
|
|
57
|
+
let scriptContent;
|
|
58
|
+
if (options.input !== undefined) {
|
|
59
|
+
scriptContent = `#!/bin/bash
|
|
60
|
+
cd "${cwd}"
|
|
61
|
+
cat "${inputFile}" | "${command}" ${escapedArgs} > "${stdoutFile}" 2> "${stderrFile}"
|
|
62
|
+
echo $? > "${exitCodeFile}"
|
|
63
|
+
rm -f "${inputFile}"
|
|
64
|
+
`;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
scriptContent = `#!/bin/bash
|
|
68
|
+
cd "${cwd}"
|
|
69
|
+
"${command}" ${escapedArgs} > "${stdoutFile}" 2> "${stderrFile}"
|
|
70
|
+
echo $? > "${exitCodeFile}"
|
|
71
|
+
`;
|
|
72
|
+
}
|
|
73
|
+
writeFileSync(wrapperScript, scriptContent, { mode: 0o755 });
|
|
74
|
+
// Spawn as detached process
|
|
75
|
+
const child = spawn('/bin/bash', [wrapperScript], {
|
|
76
|
+
cwd,
|
|
77
|
+
detached: true,
|
|
78
|
+
stdio: 'ignore',
|
|
79
|
+
env: filteredEnv,
|
|
80
|
+
});
|
|
81
|
+
const childPid = child.pid;
|
|
82
|
+
child.unref();
|
|
83
|
+
// Poll for completion
|
|
84
|
+
const pollInterval = 250;
|
|
85
|
+
let elapsed = 0;
|
|
86
|
+
// timeout === 0 means no timeout (run forever until completion)
|
|
87
|
+
while (timeout === 0 || elapsed < timeout) {
|
|
88
|
+
await new Promise(r => setTimeout(r, pollInterval));
|
|
89
|
+
elapsed += pollInterval;
|
|
90
|
+
// Check if exit code file exists (process completed)
|
|
91
|
+
if (existsSync(exitCodeFile)) {
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
// Check abort signal
|
|
95
|
+
if (options.signal?.aborted) {
|
|
96
|
+
// Try to kill the detached process group
|
|
97
|
+
if (childPid !== undefined) {
|
|
98
|
+
try {
|
|
99
|
+
process.kill(-childPid, 'SIGTERM');
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// Process may already be dead
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
throw new Error('Aborted');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Check for timeout (only if timeout > 0)
|
|
109
|
+
if (timeout > 0 && elapsed >= timeout && !existsSync(exitCodeFile)) {
|
|
110
|
+
// Try to kill timed-out process
|
|
111
|
+
if (childPid !== undefined) {
|
|
112
|
+
try {
|
|
113
|
+
process.kill(-childPid, 'SIGTERM');
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// Process may already be dead
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
throw new Error(`Timeout after ${timeout}ms`);
|
|
120
|
+
}
|
|
121
|
+
// Read results
|
|
122
|
+
const stdout = existsSync(stdoutFile) ? readFileSync(stdoutFile, 'utf8') : '';
|
|
123
|
+
const stderr = existsSync(stderrFile) ? readFileSync(stderrFile, 'utf8') : '';
|
|
124
|
+
const exitCode = existsSync(exitCodeFile) ? parseInt(readFileSync(exitCodeFile, 'utf8').trim(), 10) : -1;
|
|
125
|
+
return {
|
|
126
|
+
exitCode,
|
|
127
|
+
stdout,
|
|
128
|
+
stderr,
|
|
129
|
+
failed: exitCode !== 0,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
// Cleanup temp files
|
|
134
|
+
const filesToClean = [stdoutFile, stderrFile, exitCodeFile, inputFile, wrapperScript, ...longArgFiles];
|
|
135
|
+
filesToClean.forEach(f => {
|
|
136
|
+
try {
|
|
137
|
+
if (existsSync(f))
|
|
138
|
+
unlinkSync(f);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// Ignore cleanup errors
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=detached-exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detached-exec.js","sourceRoot":"","sources":["../../src/base/detached-exec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClaudeAdapter - Claude Code CLI adapter
|
|
3
|
+
*
|
|
4
|
+
* Uses the Claude CLI with --print flag for headless operation.
|
|
5
|
+
* Supports detached process execution to avoid SIGTERM from Cursor.
|
|
6
|
+
* Auto-discovers skills and agents from workspace .claude/ directory.
|
|
7
|
+
* Supports: claude-opus, claude-sonnet, claude-haiku
|
|
8
|
+
*/
|
|
9
|
+
import type { AIRequest, AIResponse, ProviderType } from '@anastops/core';
|
|
10
|
+
import { BaseAdapter, type AdapterConfig } from '../base/base-adapter.js';
|
|
11
|
+
export declare class ClaudeAdapter extends BaseAdapter {
|
|
12
|
+
readonly type: ProviderType;
|
|
13
|
+
readonly name = "Claude Code CLI";
|
|
14
|
+
constructor(config?: Partial<AdapterConfig>);
|
|
15
|
+
isAuthenticated(): Promise<boolean>;
|
|
16
|
+
/**
|
|
17
|
+
* Parse agent frontmatter and body from markdown file
|
|
18
|
+
*/
|
|
19
|
+
private parseAgentFile;
|
|
20
|
+
/**
|
|
21
|
+
* Load an agent from workspace .claude/agents/ directory
|
|
22
|
+
*/
|
|
23
|
+
private loadAgent;
|
|
24
|
+
/**
|
|
25
|
+
* Load a skill's content from workspace
|
|
26
|
+
*/
|
|
27
|
+
private loadSkillContent;
|
|
28
|
+
/**
|
|
29
|
+
* Discover available skills from workspace .claude/skills/ directory
|
|
30
|
+
*/
|
|
31
|
+
private discoverSkills;
|
|
32
|
+
/**
|
|
33
|
+
* Discover available agents from workspace .claude/agents/ directory
|
|
34
|
+
*/
|
|
35
|
+
private discoverAgents;
|
|
36
|
+
/**
|
|
37
|
+
* Execute using Claude CLI with --print flag for headless operation
|
|
38
|
+
*/
|
|
39
|
+
execute(request: AIRequest, options?: {
|
|
40
|
+
workingDir?: string;
|
|
41
|
+
timeout?: number;
|
|
42
|
+
signal?: AbortSignal;
|
|
43
|
+
}): Promise<AIResponse>;
|
|
44
|
+
/**
|
|
45
|
+
* Map short model aliases (from agent configs) to standard names
|
|
46
|
+
*/
|
|
47
|
+
private resolveModelAlias;
|
|
48
|
+
/**
|
|
49
|
+
* Map short model names to full API model names (updated Jan 2026)
|
|
50
|
+
*/
|
|
51
|
+
private resolveModel;
|
|
52
|
+
protected buildArgs(_request: AIRequest): string[];
|
|
53
|
+
protected parseOutput(output: string): string;
|
|
54
|
+
protected getDefaultModel(): string;
|
|
55
|
+
protected parseVersion(output: string): string;
|
|
56
|
+
protected getAvailableModels(): string[];
|
|
57
|
+
protected getAvailableTools(): string[];
|
|
58
|
+
protected supportsPermissions(): boolean;
|
|
59
|
+
protected getAvailableModes(): string[];
|
|
60
|
+
protected supportsStreaming(): boolean;
|
|
61
|
+
protected getContextWindow(): number;
|
|
62
|
+
protected getCostPer1kInput(): number;
|
|
63
|
+
protected getCostPer1kOutput(): number;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=claude-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-adapter.d.ts","sourceRoot":"","sources":["../../src/claude/claude-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAK1E,OAAO,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAY1E,qBAAa,aAAc,SAAQ,WAAW;IAC5C,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAY;IACvC,QAAQ,CAAC,IAAI,qBAAqB;gBAEtB,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IAUrC,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IASzC;;OAEG;IACH,OAAO,CAAC,cAAc;IAuCtB;;OAEG;IACH,OAAO,CAAC,SAAS;IAYjB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,cAAc;IA2CtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAoCtB;;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;IAuHjI;;OAEG;IACH,OAAO,CAAC,iBAAiB;IASzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAoBpB,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,GAAG,MAAM,EAAE;IAIlD,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;IAUxC,SAAS,CAAC,iBAAiB,IAAI,MAAM,EAAE;IAIvC,SAAS,CAAC,mBAAmB,IAAI,OAAO;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,364 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClaudeAdapter - Claude Code CLI adapter
|
|
3
|
+
*
|
|
4
|
+
* Uses the Claude CLI with --print flag for headless operation.
|
|
5
|
+
* Supports detached process execution to avoid SIGTERM from Cursor.
|
|
6
|
+
* Auto-discovers skills and agents from workspace .claude/ directory.
|
|
7
|
+
* Supports: claude-opus, claude-sonnet, claude-haiku
|
|
8
|
+
*/
|
|
9
|
+
import { execa } from 'execa';
|
|
10
|
+
import { existsSync, readdirSync, readFileSync } from 'fs';
|
|
11
|
+
import { join } from 'path';
|
|
12
|
+
import { BaseAdapter } from '../base/base-adapter.js';
|
|
13
|
+
import { detachedExec } from '../base/detached-exec.js';
|
|
14
|
+
export class ClaudeAdapter extends BaseAdapter {
|
|
15
|
+
type = 'claude';
|
|
16
|
+
name = 'Claude Code CLI';
|
|
17
|
+
constructor(config) {
|
|
18
|
+
super({
|
|
19
|
+
command: '/usr/local/bin/claude',
|
|
20
|
+
defaultArgs: [],
|
|
21
|
+
defaultTimeout: 0, // No timeout - let tasks run as long as needed
|
|
22
|
+
useDetachedExec: true, // Required to avoid SIGTERM from Cursor
|
|
23
|
+
...config,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async isAuthenticated() {
|
|
27
|
+
try {
|
|
28
|
+
const result = await execa(this.config.command, ['--version'], { reject: false });
|
|
29
|
+
return result.exitCode === 0;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Parse agent frontmatter and body from markdown file
|
|
37
|
+
*/
|
|
38
|
+
parseAgentFile(content) {
|
|
39
|
+
const frontmatterMatch = /^---\n([\s\S]*?)\n---\n([\s\S]*)$/.exec(content);
|
|
40
|
+
if (!frontmatterMatch)
|
|
41
|
+
return null;
|
|
42
|
+
const frontmatter = frontmatterMatch[1] ?? '';
|
|
43
|
+
const body = frontmatterMatch[2] ?? '';
|
|
44
|
+
// Parse YAML-like frontmatter
|
|
45
|
+
let name = '';
|
|
46
|
+
let description = '';
|
|
47
|
+
let tools = [];
|
|
48
|
+
let model = '';
|
|
49
|
+
let skills = [];
|
|
50
|
+
const nameMatch = /^name:\s*(.+)$/m.exec(frontmatter);
|
|
51
|
+
if (nameMatch?.[1])
|
|
52
|
+
name = nameMatch[1].trim();
|
|
53
|
+
const descMatch = /^description:\s*(.+)$/m.exec(frontmatter);
|
|
54
|
+
if (descMatch?.[1])
|
|
55
|
+
description = descMatch[1].trim();
|
|
56
|
+
const toolsMatch = /^tools:\s*(.+)$/m.exec(frontmatter);
|
|
57
|
+
if (toolsMatch?.[1])
|
|
58
|
+
tools = toolsMatch[1].split(',').map(t => t.trim());
|
|
59
|
+
const modelMatch = /^model:\s*(.+)$/m.exec(frontmatter);
|
|
60
|
+
if (modelMatch?.[1])
|
|
61
|
+
model = modelMatch[1].trim();
|
|
62
|
+
// Parse skills array
|
|
63
|
+
const skillsMatch = /^skills:\n((?:\s+-\s+.+\n?)+)/m.exec(frontmatter);
|
|
64
|
+
if (skillsMatch?.[1]) {
|
|
65
|
+
skills = skillsMatch[1]
|
|
66
|
+
.split('\n')
|
|
67
|
+
.map(l => l.replace(/^\s+-\s+/, '').trim())
|
|
68
|
+
.filter(s => s.length > 0);
|
|
69
|
+
}
|
|
70
|
+
if (!name)
|
|
71
|
+
return null;
|
|
72
|
+
return { name, description, tools, model, skills, body };
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Load an agent from workspace .claude/agents/ directory
|
|
76
|
+
*/
|
|
77
|
+
loadAgent(workspaceDir, agentName) {
|
|
78
|
+
const agentFile = join(workspaceDir, '.claude', 'agents', `${agentName}.md`);
|
|
79
|
+
if (!existsSync(agentFile))
|
|
80
|
+
return null;
|
|
81
|
+
try {
|
|
82
|
+
const content = readFileSync(agentFile, 'utf8');
|
|
83
|
+
return this.parseAgentFile(content);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Load a skill's content from workspace
|
|
91
|
+
*/
|
|
92
|
+
loadSkillContent(workspaceDir, skillName) {
|
|
93
|
+
const skillFile = join(workspaceDir, '.claude', 'skills', skillName, 'SKILL.md');
|
|
94
|
+
if (!existsSync(skillFile))
|
|
95
|
+
return null;
|
|
96
|
+
try {
|
|
97
|
+
return readFileSync(skillFile, 'utf8');
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Discover available skills from workspace .claude/skills/ directory
|
|
105
|
+
*/
|
|
106
|
+
discoverSkills(workspaceDir) {
|
|
107
|
+
const skillsDir = join(workspaceDir, '.claude', 'skills');
|
|
108
|
+
if (!existsSync(skillsDir)) {
|
|
109
|
+
return '';
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
const skillFolders = readdirSync(skillsDir, { withFileTypes: true })
|
|
113
|
+
.filter(d => d.isDirectory())
|
|
114
|
+
.map(d => d.name);
|
|
115
|
+
if (skillFolders.length === 0) {
|
|
116
|
+
return '';
|
|
117
|
+
}
|
|
118
|
+
const skillDescriptions = [];
|
|
119
|
+
for (const folder of skillFolders) {
|
|
120
|
+
const skillFile = join(skillsDir, folder, 'SKILL.md');
|
|
121
|
+
if (existsSync(skillFile)) {
|
|
122
|
+
const content = readFileSync(skillFile, 'utf8');
|
|
123
|
+
const lines = content.split('\n');
|
|
124
|
+
const title = lines[0]?.replace(/^#\s*/, '').trim() ?? folder;
|
|
125
|
+
const descLine = lines.slice(1, 10).find(l => l.trim() && !l.startsWith('#'));
|
|
126
|
+
const desc = descLine?.trim() ?? '';
|
|
127
|
+
skillDescriptions.push(`- ${folder}: ${title}${desc ? ` - ${desc}` : ''}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (skillDescriptions.length === 0) {
|
|
131
|
+
return '';
|
|
132
|
+
}
|
|
133
|
+
return `
|
|
134
|
+
|
|
135
|
+
AVAILABLE SKILLS (read from .claude/skills/<name>/SKILL.md when needed):
|
|
136
|
+
${skillDescriptions.join('\n')}
|
|
137
|
+
|
|
138
|
+
To use a skill, read its SKILL.md file and follow the instructions.`;
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return '';
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Discover available agents from workspace .claude/agents/ directory
|
|
146
|
+
*/
|
|
147
|
+
discoverAgents(workspaceDir) {
|
|
148
|
+
const agentsDir = join(workspaceDir, '.claude', 'agents');
|
|
149
|
+
if (!existsSync(agentsDir)) {
|
|
150
|
+
return '';
|
|
151
|
+
}
|
|
152
|
+
try {
|
|
153
|
+
const agentFiles = readdirSync(agentsDir, { withFileTypes: true })
|
|
154
|
+
.filter(f => f.isFile() && f.name.endsWith('.md') && f.name !== 'README.md')
|
|
155
|
+
.map(f => f.name.replace('.md', ''));
|
|
156
|
+
if (agentFiles.length === 0) {
|
|
157
|
+
return '';
|
|
158
|
+
}
|
|
159
|
+
const agentDescriptions = [];
|
|
160
|
+
for (const agentName of agentFiles) {
|
|
161
|
+
const agent = this.loadAgent(workspaceDir, agentName);
|
|
162
|
+
if (agent) {
|
|
163
|
+
agentDescriptions.push(`- ${agent.name}: ${agent.description}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (agentDescriptions.length === 0) {
|
|
167
|
+
return '';
|
|
168
|
+
}
|
|
169
|
+
return `
|
|
170
|
+
|
|
171
|
+
AVAILABLE AGENTS (can be used via agent parameter):
|
|
172
|
+
${agentDescriptions.join('\n')}`;
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return '';
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Execute using Claude CLI with --print flag for headless operation
|
|
180
|
+
*/
|
|
181
|
+
async execute(request, options) {
|
|
182
|
+
const startTime = Date.now();
|
|
183
|
+
const cwd = options?.workingDir ?? request.working_dir ?? this.config.workingDir ?? process.cwd();
|
|
184
|
+
const timeout = options?.timeout ?? request.timeout ?? this.config.defaultTimeout ?? 0;
|
|
185
|
+
// Check if an agent is specified
|
|
186
|
+
const agentName = request.agent;
|
|
187
|
+
let agent = null;
|
|
188
|
+
let skillsContent = '';
|
|
189
|
+
if (agentName) {
|
|
190
|
+
agent = this.loadAgent(cwd, agentName);
|
|
191
|
+
if (agent) {
|
|
192
|
+
// Load all skills specified by the agent
|
|
193
|
+
const loadedSkills = [];
|
|
194
|
+
for (const skillName of agent.skills) {
|
|
195
|
+
const content = this.loadSkillContent(cwd, skillName);
|
|
196
|
+
if (content) {
|
|
197
|
+
loadedSkills.push(`\n\n--- SKILL: ${skillName} ---\n${content}`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (loadedSkills.length > 0) {
|
|
201
|
+
skillsContent = loadedSkills.join('');
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Resolve model - use agent's model if specified, otherwise use request model
|
|
206
|
+
const modelToUse = agent?.model ? this.resolveModelAlias(agent.model) : request.model;
|
|
207
|
+
const resolvedModel = this.resolveModel(modelToUse);
|
|
208
|
+
// Discover available skills and agents in workspace (for non-agent tasks)
|
|
209
|
+
const skillsPrompt = agent ? '' : this.discoverSkills(cwd);
|
|
210
|
+
const agentsPrompt = agent ? '' : this.discoverAgents(cwd);
|
|
211
|
+
// Build CLI arguments
|
|
212
|
+
const args = [
|
|
213
|
+
'--print', // Non-interactive headless mode
|
|
214
|
+
'--output-format', 'text', // Plain text output
|
|
215
|
+
'--dangerously-skip-permissions', // YOLO mode - skip all permission prompts
|
|
216
|
+
'--model', resolvedModel,
|
|
217
|
+
];
|
|
218
|
+
// Track long arguments that need file-based passing
|
|
219
|
+
const longArgs = new Map();
|
|
220
|
+
const SYSTEM_PROMPT_PLACEHOLDER = '__SYSTEM_PROMPT__';
|
|
221
|
+
const APPEND_PROMPT_PLACEHOLDER = '__APPEND_PROMPT__';
|
|
222
|
+
// Add agent as system prompt if specified
|
|
223
|
+
if (agent) {
|
|
224
|
+
const agentSystemPrompt = `${agent.body}\n\n--- LOADED SKILLS ---${skillsContent}`;
|
|
225
|
+
args.push('--system-prompt', SYSTEM_PROMPT_PLACEHOLDER);
|
|
226
|
+
longArgs.set(SYSTEM_PROMPT_PLACEHOLDER, agentSystemPrompt);
|
|
227
|
+
}
|
|
228
|
+
else if (request.system_prompt !== undefined) {
|
|
229
|
+
// Only use file-based for long system prompts
|
|
230
|
+
if (request.system_prompt.length > 1000) {
|
|
231
|
+
args.push('--system-prompt', SYSTEM_PROMPT_PLACEHOLDER);
|
|
232
|
+
longArgs.set(SYSTEM_PROMPT_PLACEHOLDER, request.system_prompt);
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
args.push('--system-prompt', request.system_prompt);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// Append skill/agent discovery to system prompt if not using an agent
|
|
239
|
+
const appendPrompt = `${skillsPrompt}${agentsPrompt}`.trim();
|
|
240
|
+
if (appendPrompt) {
|
|
241
|
+
if (appendPrompt.length > 1000) {
|
|
242
|
+
args.push('--append-system-prompt', APPEND_PROMPT_PLACEHOLDER);
|
|
243
|
+
longArgs.set(APPEND_PROMPT_PLACEHOLDER, appendPrompt);
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
args.push('--append-system-prompt', appendPrompt);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// Add allowed tools - use agent's tools if specified
|
|
250
|
+
const allowedTools = agent?.tools ?? request.allowed_tools ?? [
|
|
251
|
+
'Read', 'Write', 'Edit', 'MultiEdit', 'Bash', 'Glob', 'Grep', 'LS',
|
|
252
|
+
];
|
|
253
|
+
args.push('--allowedTools', ...allowedTools);
|
|
254
|
+
// Execute with detached process to avoid SIGTERM from Cursor
|
|
255
|
+
const result = await detachedExec(this.config.command, args, {
|
|
256
|
+
cwd,
|
|
257
|
+
timeout,
|
|
258
|
+
env: process.env,
|
|
259
|
+
input: request.prompt,
|
|
260
|
+
signal: options?.signal,
|
|
261
|
+
longArgs,
|
|
262
|
+
});
|
|
263
|
+
if (result.failed) {
|
|
264
|
+
const errorDetails = [
|
|
265
|
+
`Exit code: ${result.exitCode}`,
|
|
266
|
+
`Stdout: ${result.stdout.slice(0, 500) || '(empty)'}`,
|
|
267
|
+
`Stderr: ${result.stderr.slice(0, 500) || '(empty)'}`,
|
|
268
|
+
`CWD: ${cwd}`,
|
|
269
|
+
].join(' | ');
|
|
270
|
+
throw new Error(`Claude CLI failed: ${errorDetails}`);
|
|
271
|
+
}
|
|
272
|
+
const latencyMs = Date.now() - startTime;
|
|
273
|
+
const content = result.stdout.trim();
|
|
274
|
+
const usage = this.estimateUsage(request.prompt, content);
|
|
275
|
+
return {
|
|
276
|
+
content: content || 'Task completed',
|
|
277
|
+
model: resolvedModel,
|
|
278
|
+
usage,
|
|
279
|
+
finish_reason: 'stop',
|
|
280
|
+
metadata: {
|
|
281
|
+
latency_ms: latencyMs,
|
|
282
|
+
provider: this.type,
|
|
283
|
+
exit_code: result.exitCode,
|
|
284
|
+
agent: agentName,
|
|
285
|
+
},
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Map short model aliases (from agent configs) to standard names
|
|
290
|
+
*/
|
|
291
|
+
resolveModelAlias(alias) {
|
|
292
|
+
const aliasMap = {
|
|
293
|
+
'sonnet': 'claude-sonnet',
|
|
294
|
+
'haiku': 'claude-haiku',
|
|
295
|
+
'opus': 'claude-opus',
|
|
296
|
+
};
|
|
297
|
+
return aliasMap[alias.toLowerCase()] ?? alias;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Map short model names to full API model names (updated Jan 2026)
|
|
301
|
+
*/
|
|
302
|
+
resolveModel(model) {
|
|
303
|
+
if (model === undefined)
|
|
304
|
+
return this.getDefaultModel();
|
|
305
|
+
const modelMap = {
|
|
306
|
+
// Opus models
|
|
307
|
+
'claude-opus': 'claude-opus-4-1-20250805',
|
|
308
|
+
'claude-opus-4': 'claude-opus-4-20250514',
|
|
309
|
+
'claude-opus-4-1': 'claude-opus-4-1-20250805',
|
|
310
|
+
// Sonnet models
|
|
311
|
+
'claude-sonnet': 'claude-sonnet-4-5-20250929',
|
|
312
|
+
'claude-sonnet-4': 'claude-sonnet-4-20250514',
|
|
313
|
+
'claude-sonnet-4-5': 'claude-sonnet-4-5-20250929',
|
|
314
|
+
// Haiku models
|
|
315
|
+
'claude-haiku': 'claude-haiku-4-5-20251001',
|
|
316
|
+
'claude-haiku-4-5': 'claude-haiku-4-5-20251001',
|
|
317
|
+
};
|
|
318
|
+
return modelMap[model] ?? model;
|
|
319
|
+
}
|
|
320
|
+
buildArgs(_request) {
|
|
321
|
+
return [];
|
|
322
|
+
}
|
|
323
|
+
parseOutput(output) {
|
|
324
|
+
return output.trim();
|
|
325
|
+
}
|
|
326
|
+
getDefaultModel() {
|
|
327
|
+
return 'claude-sonnet-4-20250514';
|
|
328
|
+
}
|
|
329
|
+
parseVersion(output) {
|
|
330
|
+
const match = /(\d+\.\d+\.\d+)/.exec(output);
|
|
331
|
+
return match?.[1] ?? output.trim();
|
|
332
|
+
}
|
|
333
|
+
getAvailableModels() {
|
|
334
|
+
return [
|
|
335
|
+
'claude-opus-4-1-20250805',
|
|
336
|
+
'claude-opus-4-20250514',
|
|
337
|
+
'claude-sonnet-4-5-20250929',
|
|
338
|
+
'claude-sonnet-4-20250514',
|
|
339
|
+
'claude-haiku-4-5-20251001',
|
|
340
|
+
];
|
|
341
|
+
}
|
|
342
|
+
getAvailableTools() {
|
|
343
|
+
return ['Read', 'Edit', 'MultiEdit', 'Write', 'Bash', 'Glob', 'Grep', 'LS', 'NotebookRead', 'NotebookEdit', 'WebFetch', 'TodoRead', 'TodoWrite', 'WebSearch'];
|
|
344
|
+
}
|
|
345
|
+
supportsPermissions() {
|
|
346
|
+
return true;
|
|
347
|
+
}
|
|
348
|
+
getAvailableModes() {
|
|
349
|
+
return ['code', 'plan', 'ask'];
|
|
350
|
+
}
|
|
351
|
+
supportsStreaming() {
|
|
352
|
+
return true;
|
|
353
|
+
}
|
|
354
|
+
getContextWindow() {
|
|
355
|
+
return 200000;
|
|
356
|
+
}
|
|
357
|
+
getCostPer1kInput() {
|
|
358
|
+
return 0.003;
|
|
359
|
+
}
|
|
360
|
+
getCostPer1kOutput() {
|
|
361
|
+
return 0.015;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
//# sourceMappingURL=claude-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-adapter.js","sourceRoot":"","sources":["../../src/claude/claude-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
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 type { AIRequest, AIResponse, ProviderType } from '@anastops/core';
|
|
8
|
+
import { BaseAdapter, type AdapterConfig } from '../base/base-adapter.js';
|
|
9
|
+
export declare class CodexAdapter extends BaseAdapter {
|
|
10
|
+
readonly type: ProviderType;
|
|
11
|
+
readonly name = "OpenAI Codex";
|
|
12
|
+
constructor(config?: Partial<AdapterConfig>);
|
|
13
|
+
isAuthenticated(): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Execute using Codex CLI with `exec` subcommand for non-interactive operation
|
|
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=codex-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-adapter.d.ts","sourceRoot":"","sources":["../../src/codex/codex-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,YAAa,SAAQ,WAAW;IAC3C,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAW;IACtC,QAAQ,CAAC,IAAI,kBAAkB;gBAEnB,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IAU3C,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAKnC;;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;IAwDjI,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"}
|