@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,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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AA4BzE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,IAAc,EACd,UAA+B,EAAE;IAEjC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,iBAAiB,MAAM,aAAa,CAAC;IACxD,MAAM,UAAU,GAAG,iBAAiB,MAAM,aAAa,CAAC;IACxD,MAAM,YAAY,GAAG,iBAAiB,MAAM,WAAW,CAAC;IACxD,MAAM,SAAS,GAAG,iBAAiB,MAAM,YAAY,CAAC;IACtD,MAAM,aAAa,GAAG,iBAAiB,MAAM,aAAa,CAAC;IAE3D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,qBAAqB;IAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,GAAG,EAAkB,CAAC;IAC/D,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,+DAA+D;IAC/D,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CACpC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAC9D,CAAC;IAEF,IAAI,CAAC;QACH,kCAAkC;QAClC,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAChC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;QAED,yCAAyC;QACzC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC7C,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,QAAQ,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,iBAAiB,MAAM,OAAO,YAAY,MAAM,CAAC;YACjE,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACjC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACjC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3B,YAAY,EAAE,CAAC;QACjB,CAAC;QAED,gDAAgD;QAChD,8CAA8C;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAC/B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAClC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,4CAA4C;gBAC5C,OAAO,WAAW,OAAO,KAAK,CAAC;YACjC,CAAC;YACD,kCAAkC;YAClC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC;QAC7D,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEb,wBAAwB;QACxB,IAAI,aAAqB,CAAC;QAC1B,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAChC,aAAa,GAAG;MAChB,GAAG;OACF,SAAS,QAAQ,OAAO,KAAK,WAAW,OAAO,UAAU,SAAS,UAAU;aACtE,YAAY;SAChB,SAAS;CACjB,CAAC;QACE,CAAC;aAAM,CAAC;YACN,aAAa,GAAG;MAChB,GAAG;GACN,OAAO,KAAK,WAAW,OAAO,UAAU,SAAS,UAAU;aACjD,YAAY;CACxB,CAAC;QACE,CAAC;QACD,aAAa,CAAC,aAAa,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAE7D,4BAA4B;QAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,EAAE;YAChD,GAAG;YACH,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,QAAQ;YACf,GAAG,EAAE,WAAqC;SAC3C,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC;QAC3B,KAAK,CAAC,KAAK,EAAE,CAAC;QAEd,sBAAsB;QACtB,MAAM,YAAY,GAAG,GAAG,CAAC;QACzB,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,gEAAgE;QAChE,OAAO,OAAO,KAAK,CAAC,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;YAC1C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;YACpD,OAAO,IAAI,YAAY,CAAC;YAExB,qDAAqD;YACrD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC7B,MAAM;YACR,CAAC;YAED,qBAAqB;YACrB,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;gBAC5B,yCAAyC;gBACzC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC3B,IAAI,CAAC;wBACH,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;oBACrC,CAAC;oBAAC,MAAM,CAAC;wBACP,8BAA8B;oBAChC,CAAC;gBACH,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,0CAA0C;QAC1C,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACnE,gCAAgC;YAChC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;gBACrC,CAAC;gBAAC,MAAM,CAAC;oBACP,8BAA8B;gBAChC,CAAC;YACH,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,iBAAiB,OAAO,IAAI,CAAC,CAAC;QAChD,CAAC;QAED,eAAe;QACf,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,MAAM,QAAQ,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzG,OAAO;YACL,QAAQ;YACR,MAAM;YACN,MAAM;YACN,MAAM,EAAE,QAAQ,KAAK,CAAC;SACvB,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,qBAAqB;QACrB,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,YAAY,CAAC,CAAC;QACvG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACvB,IAAI,CAAC;gBACH,IAAI,UAAU,CAAC,CAAC,CAAC;oBAAE,UAAU,CAAC,CAAC,CAAC,CAAC;YACnC,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -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"}