@agentex/agent 0.0.1
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/README.md +167 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/claude/codec.d.ts +3 -0
- package/dist/providers/claude/codec.d.ts.map +1 -0
- package/dist/providers/claude/codec.js +43 -0
- package/dist/providers/claude/codec.js.map +1 -0
- package/dist/providers/claude/execute.d.ts +3 -0
- package/dist/providers/claude/execute.d.ts.map +1 -0
- package/dist/providers/claude/execute.js +224 -0
- package/dist/providers/claude/execute.js.map +1 -0
- package/dist/providers/claude/index.d.ts +3 -0
- package/dist/providers/claude/index.d.ts.map +1 -0
- package/dist/providers/claude/index.js +47 -0
- package/dist/providers/claude/index.js.map +1 -0
- package/dist/providers/claude/parse.d.ts +21 -0
- package/dist/providers/claude/parse.d.ts.map +1 -0
- package/dist/providers/claude/parse.js +247 -0
- package/dist/providers/claude/parse.js.map +1 -0
- package/dist/providers/claude/test.d.ts +3 -0
- package/dist/providers/claude/test.d.ts.map +1 -0
- package/dist/providers/claude/test.js +140 -0
- package/dist/providers/claude/test.js.map +1 -0
- package/dist/providers/codex/codec.d.ts +3 -0
- package/dist/providers/codex/codec.d.ts.map +1 -0
- package/dist/providers/codex/codec.js +47 -0
- package/dist/providers/codex/codec.js.map +1 -0
- package/dist/providers/codex/execute.d.ts +3 -0
- package/dist/providers/codex/execute.d.ts.map +1 -0
- package/dist/providers/codex/execute.js +215 -0
- package/dist/providers/codex/execute.js.map +1 -0
- package/dist/providers/codex/index.d.ts +3 -0
- package/dist/providers/codex/index.d.ts.map +1 -0
- package/dist/providers/codex/index.js +10 -0
- package/dist/providers/codex/index.js.map +1 -0
- package/dist/providers/codex/parse.d.ts +20 -0
- package/dist/providers/codex/parse.d.ts.map +1 -0
- package/dist/providers/codex/parse.js +202 -0
- package/dist/providers/codex/parse.js.map +1 -0
- package/dist/providers/codex/test.d.ts +3 -0
- package/dist/providers/codex/test.d.ts.map +1 -0
- package/dist/providers/codex/test.js +58 -0
- package/dist/providers/codex/test.js.map +1 -0
- package/dist/providers/openclaw/codec.d.ts +3 -0
- package/dist/providers/openclaw/codec.d.ts.map +1 -0
- package/dist/providers/openclaw/codec.js +41 -0
- package/dist/providers/openclaw/codec.js.map +1 -0
- package/dist/providers/openclaw/execute.d.ts +3 -0
- package/dist/providers/openclaw/execute.d.ts.map +1 -0
- package/dist/providers/openclaw/execute.js +138 -0
- package/dist/providers/openclaw/execute.js.map +1 -0
- package/dist/providers/openclaw/index.d.ts +3 -0
- package/dist/providers/openclaw/index.d.ts.map +1 -0
- package/dist/providers/openclaw/index.js +10 -0
- package/dist/providers/openclaw/index.js.map +1 -0
- package/dist/providers/openclaw/test.d.ts +3 -0
- package/dist/providers/openclaw/test.d.ts.map +1 -0
- package/dist/providers/openclaw/test.js +50 -0
- package/dist/providers/openclaw/test.js.map +1 -0
- package/dist/providers/process/execute.d.ts +3 -0
- package/dist/providers/process/execute.d.ts.map +1 -0
- package/dist/providers/process/execute.js +105 -0
- package/dist/providers/process/execute.js.map +1 -0
- package/dist/providers/process/index.d.ts +3 -0
- package/dist/providers/process/index.d.ts.map +1 -0
- package/dist/providers/process/index.js +49 -0
- package/dist/providers/process/index.js.map +1 -0
- package/dist/registry.d.ts +5 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +25 -0
- package/dist/registry.js.map +1 -0
- package/dist/types.d.ts +121 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/binary.d.ts +9 -0
- package/dist/utils/binary.d.ts.map +1 -0
- package/dist/utils/binary.js +137 -0
- package/dist/utils/binary.js.map +1 -0
- package/dist/utils/env.d.ts +4 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +39 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/process.d.ts +23 -0
- package/dist/utils/process.d.ts.map +1 -0
- package/dist/utils/process.js +144 -0
- package/dist/utils/process.js.map +1 -0
- package/dist/utils/skills.d.ts +4 -0
- package/dist/utils/skills.d.ts.map +1 -0
- package/dist/utils/skills.js +33 -0
- package/dist/utils/skills.js.map +1 -0
- package/dist/utils/template.d.ts +3 -0
- package/dist/utils/template.d.ts.map +1 -0
- package/dist/utils/template.js +17 -0
- package/dist/utils/template.js.map +1 -0
- package/dist/utils/uuid.d.ts +2 -0
- package/dist/utils/uuid.d.ts.map +1 -0
- package/dist/utils/uuid.js +2 -0
- package/dist/utils/uuid.js.map +1 -0
- package/package.json +48 -0
package/README.md
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# @agentex/agent
|
|
2
|
+
|
|
3
|
+
Programmatic execution of AI coding agents. Spawn and manage Claude Code, Codex, OpenClaw, or any CLI-based agent as a child process with streaming output, session resume, and a unified interface.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @agentex/agent
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { getProvider } from "@agentex/agent";
|
|
15
|
+
|
|
16
|
+
const claude = getProvider("claude");
|
|
17
|
+
|
|
18
|
+
const result = await claude.execute({
|
|
19
|
+
prompt: "Add error handling to server.ts",
|
|
20
|
+
config: {
|
|
21
|
+
skipPermissions: true,
|
|
22
|
+
maxTurns: 5,
|
|
23
|
+
timeoutSec: 120,
|
|
24
|
+
},
|
|
25
|
+
onEvent: (event) => {
|
|
26
|
+
if (event.type === "assistant") process.stdout.write(event.text);
|
|
27
|
+
if (event.type === "tool_call") console.log(`Tool: ${event.name}`);
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
console.log(result.exitCode); // 0
|
|
32
|
+
console.log(result.summary); // "Added try/catch to all route handlers..."
|
|
33
|
+
console.log(result.durationMs); // 12340
|
|
34
|
+
console.log(result.costUsd); // 0.0342
|
|
35
|
+
console.log(result.usage); // { inputTokens: 1200, outputTokens: 350, cachedInputTokens: 800 }
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Built-in Providers
|
|
39
|
+
|
|
40
|
+
| Provider | CLI | Description |
|
|
41
|
+
| ---------- | ---------------- | ----------------------------------- |
|
|
42
|
+
| `claude` | `claude` | Claude Code (Anthropic) |
|
|
43
|
+
| `codex` | `codex` | Codex CLI (OpenAI) |
|
|
44
|
+
| `openclaw` | `openclaw` | OpenClaw agent |
|
|
45
|
+
| `process` | any executable | Generic process executor |
|
|
46
|
+
|
|
47
|
+
## Custom Providers
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import { registerProvider } from "@agentex/agent";
|
|
51
|
+
import type { ProviderModule } from "@agentex/agent";
|
|
52
|
+
|
|
53
|
+
const myProvider: ProviderModule = {
|
|
54
|
+
type: "my-agent",
|
|
55
|
+
async execute(ctx) {
|
|
56
|
+
const startedAt = new Date().toISOString();
|
|
57
|
+
// Spawn your agent, stream events via ctx.onEvent...
|
|
58
|
+
return {
|
|
59
|
+
runId: ctx.runId ?? "generated-id",
|
|
60
|
+
exitCode: 0,
|
|
61
|
+
signal: null,
|
|
62
|
+
timedOut: false,
|
|
63
|
+
startedAt,
|
|
64
|
+
completedAt: new Date().toISOString(),
|
|
65
|
+
durationMs: 0,
|
|
66
|
+
errorMessage: null,
|
|
67
|
+
errorCode: null,
|
|
68
|
+
costUsd: null,
|
|
69
|
+
model: null,
|
|
70
|
+
summary: "Done",
|
|
71
|
+
sessionParams: null,
|
|
72
|
+
sessionDisplayId: null,
|
|
73
|
+
clearSession: false,
|
|
74
|
+
billingType: null,
|
|
75
|
+
};
|
|
76
|
+
},
|
|
77
|
+
async testEnvironment(ctx) {
|
|
78
|
+
return { providerType: ctx.providerType, status: "pass", checks: [], testedAt: new Date().toISOString() };
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
registerProvider(myProvider);
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## API
|
|
86
|
+
|
|
87
|
+
### `getProvider(type: string): ProviderModule`
|
|
88
|
+
|
|
89
|
+
Returns a registered provider by name. Throws if not found.
|
|
90
|
+
|
|
91
|
+
### `listProviders(): string[]`
|
|
92
|
+
|
|
93
|
+
Returns all registered provider type names.
|
|
94
|
+
|
|
95
|
+
### `registerProvider(provider: ProviderModule): void`
|
|
96
|
+
|
|
97
|
+
Registers a custom provider, making it available via `getProvider()`.
|
|
98
|
+
|
|
99
|
+
### `renderTemplate(template: string, context: Record<string, string>): string`
|
|
100
|
+
|
|
101
|
+
Renders a template string with `{{variable}}` interpolation.
|
|
102
|
+
|
|
103
|
+
### `redactEnvForLogs(env: Record<string, string>): Record<string, string>`
|
|
104
|
+
|
|
105
|
+
Returns a copy of env vars with sensitive values redacted for safe logging.
|
|
106
|
+
|
|
107
|
+
## Execution Context
|
|
108
|
+
|
|
109
|
+
Only `prompt` is required. Everything else has sensible defaults.
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
interface ExecutionContext {
|
|
113
|
+
prompt: string; // The task to execute
|
|
114
|
+
model?: string; // Model override (e.g. "claude-sonnet-4-20250514")
|
|
115
|
+
runId?: string; // Auto-generated UUIDv7 if omitted
|
|
116
|
+
cwd?: string; // Defaults to process.cwd()
|
|
117
|
+
env?: Record<string, string>;
|
|
118
|
+
sessionParams?: Record<string, unknown> | null;
|
|
119
|
+
config?: ProviderConfig;
|
|
120
|
+
onOutput?: (stream: "stdout" | "stderr", chunk: string) => void;
|
|
121
|
+
onEvent?: (event: StreamEvent) => void;
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Execution Result
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
interface ExecutionResult {
|
|
129
|
+
runId: string;
|
|
130
|
+
exitCode: number | null;
|
|
131
|
+
signal: string | null;
|
|
132
|
+
timedOut: boolean;
|
|
133
|
+
startedAt: string; // ISO timestamp
|
|
134
|
+
completedAt: string; // ISO timestamp
|
|
135
|
+
durationMs: number; // Wall-clock duration
|
|
136
|
+
errorMessage: string | null;
|
|
137
|
+
errorCode: string | null;
|
|
138
|
+
usage?: { inputTokens: number; outputTokens: number; cachedInputTokens?: number };
|
|
139
|
+
costUsd: number | null;
|
|
140
|
+
model: string | null;
|
|
141
|
+
summary: string | null;
|
|
142
|
+
sessionParams: Record<string, unknown> | null;
|
|
143
|
+
sessionDisplayId: string | null;
|
|
144
|
+
clearSession: boolean;
|
|
145
|
+
billingType: "api" | "subscription" | null;
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Stream Events
|
|
150
|
+
|
|
151
|
+
Events emitted during execution via `onEvent`. All events include a `timestamp` field.
|
|
152
|
+
|
|
153
|
+
- `system` — Session init (`event.sessionId`, `event.model`)
|
|
154
|
+
- `assistant` — Text output from the agent (`event.text`)
|
|
155
|
+
- `thinking` — Agent's internal reasoning (`event.text`)
|
|
156
|
+
- `tool_call` — Agent invoked a tool (`event.name`, `event.input`)
|
|
157
|
+
- `tool_result` — Tool returned a result (`event.content`, `event.isError`)
|
|
158
|
+
- `result` — Final result (`event.text`, `event.cost`)
|
|
159
|
+
|
|
160
|
+
## Requirements
|
|
161
|
+
|
|
162
|
+
- Node.js >= 18
|
|
163
|
+
- The CLI for each provider must be installed and on `$PATH` (e.g., `claude` for the Claude provider)
|
|
164
|
+
|
|
165
|
+
## License
|
|
166
|
+
|
|
167
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { getProvider, listProviders, registerProvider } from "./registry.js";
|
|
2
|
+
export { renderTemplate } from "./utils/template.js";
|
|
3
|
+
export { redactEnvForLogs } from "./utils/env.js";
|
|
4
|
+
export type { ProviderModule, ExecutionContext, ExecutionResult, ProviderConfig, McpServerConfig, StreamEvent, SessionCodec, EnvironmentTestContext, EnvironmentTestResult, EnvironmentCheck, ProviderModel, } from "./types.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGlD,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,eAAe,EACf,WAAW,EACX,YAAY,EACZ,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,GACd,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY;AACZ,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/codec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAWnD,eAAO,MAAM,kBAAkB,EAAE,YA+BhC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
function readNonEmptyString(value) {
|
|
2
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
3
|
+
}
|
|
4
|
+
function parseAsObject(raw) {
|
|
5
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw))
|
|
6
|
+
return null;
|
|
7
|
+
return raw;
|
|
8
|
+
}
|
|
9
|
+
export const claudeSessionCodec = {
|
|
10
|
+
deserialize(raw) {
|
|
11
|
+
const obj = parseAsObject(raw);
|
|
12
|
+
if (!obj)
|
|
13
|
+
return null;
|
|
14
|
+
const sessionId = readNonEmptyString(obj["sessionId"]) ?? readNonEmptyString(obj["session_id"]);
|
|
15
|
+
if (!sessionId)
|
|
16
|
+
return null;
|
|
17
|
+
const cwd = readNonEmptyString(obj["cwd"]) ??
|
|
18
|
+
readNonEmptyString(obj["workdir"]) ??
|
|
19
|
+
readNonEmptyString(obj["folder"]);
|
|
20
|
+
return {
|
|
21
|
+
sessionId,
|
|
22
|
+
...(cwd ? { cwd } : {}),
|
|
23
|
+
};
|
|
24
|
+
},
|
|
25
|
+
serialize(params) {
|
|
26
|
+
if (!params)
|
|
27
|
+
return null;
|
|
28
|
+
const sessionId = readNonEmptyString(params["sessionId"]) ?? readNonEmptyString(params["session_id"]);
|
|
29
|
+
if (!sessionId)
|
|
30
|
+
return null;
|
|
31
|
+
const cwd = readNonEmptyString(params["cwd"]);
|
|
32
|
+
return {
|
|
33
|
+
sessionId,
|
|
34
|
+
...(cwd ? { cwd } : {}),
|
|
35
|
+
};
|
|
36
|
+
},
|
|
37
|
+
getDisplayId(params) {
|
|
38
|
+
if (!params)
|
|
39
|
+
return null;
|
|
40
|
+
return readNonEmptyString(params["sessionId"]) ?? readNonEmptyString(params["session_id"]);
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../../src/providers/claude/codec.ts"],"names":[],"mappings":"AAEA,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACpF,CAAC;AAED,SAAS,aAAa,CAAC,GAAY;IACjC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/E,OAAO,GAA8B,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAiB;IAC9C,WAAW,CAAC,GAAY;QACtB,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;QAChG,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAC5B,MAAM,GAAG,GACP,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC9B,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAClC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QACpC,OAAO;YACL,SAAS;YACT,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxB,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,MAAsC;QAC9C,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;QACtG,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAC5B,MAAM,GAAG,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,OAAO;YACL,SAAS;YACT,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxB,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,MAAsC;QACjD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IAC7F,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/execute.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAaxE,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CA4M1F"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import * as path from "node:path";
|
|
2
|
+
import { findBinary } from "../../utils/binary.js";
|
|
3
|
+
import { buildEnv, ensurePathInEnv } from "../../utils/env.js";
|
|
4
|
+
import { runChildProcess, deriveErrorCode } from "../../utils/process.js";
|
|
5
|
+
import { buildSkillsDir, cleanupSkillsDir } from "../../utils/skills.js";
|
|
6
|
+
import { uuidv7 } from "../../utils/uuid.js";
|
|
7
|
+
import { parseClaudeStreamJson, parseStreamLine, isClaudeUnknownSessionError, isClaudeAuthRequired } from "./parse.js";
|
|
8
|
+
function hasNonEmptyEnvValue(env, key) {
|
|
9
|
+
const raw = env[key];
|
|
10
|
+
return typeof raw === "string" && raw.trim().length > 0;
|
|
11
|
+
}
|
|
12
|
+
export async function executeClaudeAdapter(ctx) {
|
|
13
|
+
const runId = ctx.runId ?? uuidv7();
|
|
14
|
+
const cwd = ctx.cwd ?? process.cwd();
|
|
15
|
+
const model = ctx.model ?? ctx.config?.model;
|
|
16
|
+
const config = ctx.config ?? {};
|
|
17
|
+
const startedAt = new Date().toISOString();
|
|
18
|
+
// 1. Resolve binary
|
|
19
|
+
let resolvedBinary;
|
|
20
|
+
try {
|
|
21
|
+
resolvedBinary = await findBinary("claude", config.command);
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
return {
|
|
25
|
+
runId,
|
|
26
|
+
exitCode: null,
|
|
27
|
+
signal: null,
|
|
28
|
+
timedOut: false,
|
|
29
|
+
startedAt,
|
|
30
|
+
completedAt: new Date().toISOString(),
|
|
31
|
+
durationMs: Date.now() - new Date(startedAt).getTime(),
|
|
32
|
+
errorMessage: err instanceof Error ? err.message : "Binary not found",
|
|
33
|
+
errorCode: "binary_not_found",
|
|
34
|
+
costUsd: null,
|
|
35
|
+
model: null,
|
|
36
|
+
summary: null,
|
|
37
|
+
sessionParams: null,
|
|
38
|
+
sessionDisplayId: null,
|
|
39
|
+
clearSession: false,
|
|
40
|
+
billingType: null,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// 2. Build env & detect billing
|
|
44
|
+
const env = buildEnv(ctx.env);
|
|
45
|
+
ensurePathInEnv(env);
|
|
46
|
+
const billingType = hasNonEmptyEnvValue(env, "ANTHROPIC_API_KEY") ? "api" : "subscription";
|
|
47
|
+
// 3. Build skills dir
|
|
48
|
+
let skillsDir = null;
|
|
49
|
+
if (config.skillDirs && config.skillDirs.length > 0) {
|
|
50
|
+
try {
|
|
51
|
+
skillsDir = await buildSkillsDir(config.skillDirs, "claude");
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Skill injection failure is non-fatal
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// 4. Build args
|
|
58
|
+
const buildArgs = (resumeSessionId) => {
|
|
59
|
+
const args = [...resolvedBinary.prefixArgs, "--print", "-", "--output-format", "stream-json", "--verbose"];
|
|
60
|
+
if (resumeSessionId)
|
|
61
|
+
args.push("--resume", resumeSessionId);
|
|
62
|
+
if (config.skipPermissions)
|
|
63
|
+
args.push("--dangerously-skip-permissions");
|
|
64
|
+
if (model)
|
|
65
|
+
args.push("--model", model);
|
|
66
|
+
if (config.effort)
|
|
67
|
+
args.push("--effort", config.effort);
|
|
68
|
+
if (config.maxTurns && config.maxTurns > 0)
|
|
69
|
+
args.push("--max-turns", String(config.maxTurns));
|
|
70
|
+
if (config.instructionsFile)
|
|
71
|
+
args.push("--append-system-prompt-file", config.instructionsFile);
|
|
72
|
+
if (skillsDir)
|
|
73
|
+
args.push("--add-dir", skillsDir);
|
|
74
|
+
if (config.mcpServers) {
|
|
75
|
+
for (const mcp of config.mcpServers) {
|
|
76
|
+
args.push("--mcp-server", mcp.name, "--", mcp.command, ...(mcp.args ?? []));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (config.extraArgs)
|
|
80
|
+
args.push(...config.extraArgs);
|
|
81
|
+
return args;
|
|
82
|
+
};
|
|
83
|
+
// 5. Determine session resume
|
|
84
|
+
const sessionParams = ctx.sessionParams ?? null;
|
|
85
|
+
const sessionId = (() => {
|
|
86
|
+
if (!sessionParams)
|
|
87
|
+
return null;
|
|
88
|
+
const id = sessionParams["sessionId"] ?? sessionParams["session_id"];
|
|
89
|
+
if (!id || typeof id !== "string")
|
|
90
|
+
return null;
|
|
91
|
+
const sessionCwd = sessionParams["cwd"];
|
|
92
|
+
if (sessionCwd && path.resolve(sessionCwd) !== path.resolve(cwd))
|
|
93
|
+
return null;
|
|
94
|
+
return id;
|
|
95
|
+
})();
|
|
96
|
+
// 6. Run attempt
|
|
97
|
+
const runAttempt = async (resumeSessionId) => {
|
|
98
|
+
const args = buildArgs(resumeSessionId);
|
|
99
|
+
// stdout line buffer for real-time event parsing
|
|
100
|
+
let lineBuffer = "";
|
|
101
|
+
const proc = await runChildProcess({
|
|
102
|
+
runId,
|
|
103
|
+
command: resolvedBinary.bin,
|
|
104
|
+
args,
|
|
105
|
+
cwd,
|
|
106
|
+
env,
|
|
107
|
+
stdin: ctx.prompt,
|
|
108
|
+
timeoutSec: config.timeoutSec,
|
|
109
|
+
graceSec: config.graceSec,
|
|
110
|
+
onOutput: async (stream, chunk) => {
|
|
111
|
+
// Forward raw output
|
|
112
|
+
if (ctx.onOutput) {
|
|
113
|
+
try {
|
|
114
|
+
await ctx.onOutput(stream, chunk);
|
|
115
|
+
}
|
|
116
|
+
catch { /* swallow */ }
|
|
117
|
+
}
|
|
118
|
+
// Parse stdout lines for stream events
|
|
119
|
+
if (stream === "stdout" && ctx.onEvent) {
|
|
120
|
+
lineBuffer += chunk;
|
|
121
|
+
const lines = lineBuffer.split("\n");
|
|
122
|
+
// Keep the last (possibly incomplete) line in the buffer
|
|
123
|
+
lineBuffer = lines.pop() ?? "";
|
|
124
|
+
for (const line of lines) {
|
|
125
|
+
const trimmed = line.trim();
|
|
126
|
+
if (!trimmed)
|
|
127
|
+
continue;
|
|
128
|
+
for (const event of parseStreamLine(trimmed)) {
|
|
129
|
+
try {
|
|
130
|
+
await ctx.onEvent(event);
|
|
131
|
+
}
|
|
132
|
+
catch { /* swallow */ }
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
// Parse remaining buffer
|
|
139
|
+
if (lineBuffer.trim() && ctx.onEvent) {
|
|
140
|
+
for (const event of parseStreamLine(lineBuffer.trim())) {
|
|
141
|
+
try {
|
|
142
|
+
await ctx.onEvent(event);
|
|
143
|
+
}
|
|
144
|
+
catch { /* swallow */ }
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return proc;
|
|
148
|
+
};
|
|
149
|
+
try {
|
|
150
|
+
// 7. Initial attempt
|
|
151
|
+
let proc = await runAttempt(sessionId);
|
|
152
|
+
let clearSession = false;
|
|
153
|
+
// 8. Check for unknown session — retry once
|
|
154
|
+
if (sessionId &&
|
|
155
|
+
!proc.timedOut &&
|
|
156
|
+
(proc.exitCode ?? 0) !== 0 &&
|
|
157
|
+
isClaudeUnknownSessionError(proc.stdout, proc.stderr)) {
|
|
158
|
+
proc = await runAttempt(null);
|
|
159
|
+
clearSession = true;
|
|
160
|
+
}
|
|
161
|
+
// 9. Parse result
|
|
162
|
+
const parsed = parseClaudeStreamJson(proc.stdout);
|
|
163
|
+
const processErrorCode = deriveErrorCode(proc);
|
|
164
|
+
// Determine error code: process-level errors take precedence, then adapter-specific
|
|
165
|
+
let errorCode = processErrorCode;
|
|
166
|
+
if (!errorCode && parsed.errorCode) {
|
|
167
|
+
errorCode = parsed.errorCode;
|
|
168
|
+
}
|
|
169
|
+
if (!errorCode && isClaudeAuthRequired(proc.stdout, proc.stderr)) {
|
|
170
|
+
errorCode = "auth_required";
|
|
171
|
+
}
|
|
172
|
+
const errorMessage = (() => {
|
|
173
|
+
if (proc.timedOut)
|
|
174
|
+
return `Timed out after ${config.timeoutSec ?? 0}s`;
|
|
175
|
+
if (errorCode === "auth_required")
|
|
176
|
+
return "Claude requires authentication. Run `claude login`.";
|
|
177
|
+
if ((proc.exitCode ?? 0) !== 0 && !parsed.summary) {
|
|
178
|
+
const stderrLine = proc.stderr.split(/\r?\n/).map((l) => l.trim()).find(Boolean);
|
|
179
|
+
return stderrLine ?? `Claude exited with code ${proc.exitCode ?? -1}`;
|
|
180
|
+
}
|
|
181
|
+
if (parsed.isError)
|
|
182
|
+
return parsed.summary;
|
|
183
|
+
return null;
|
|
184
|
+
})();
|
|
185
|
+
const resolvedSessionId = parsed.sessionId;
|
|
186
|
+
const resultSessionParams = resolvedSessionId
|
|
187
|
+
? { sessionId: resolvedSessionId, cwd }
|
|
188
|
+
: null;
|
|
189
|
+
const completedAt = new Date().toISOString();
|
|
190
|
+
return {
|
|
191
|
+
runId,
|
|
192
|
+
exitCode: proc.exitCode,
|
|
193
|
+
signal: proc.signal ?? null,
|
|
194
|
+
timedOut: proc.timedOut,
|
|
195
|
+
startedAt,
|
|
196
|
+
completedAt,
|
|
197
|
+
durationMs: new Date(completedAt).getTime() - new Date(startedAt).getTime(),
|
|
198
|
+
errorMessage,
|
|
199
|
+
errorCode,
|
|
200
|
+
usage: parsed.usage
|
|
201
|
+
? {
|
|
202
|
+
inputTokens: parsed.usage.inputTokens,
|
|
203
|
+
outputTokens: parsed.usage.outputTokens,
|
|
204
|
+
cachedInputTokens: parsed.usage.cachedInputTokens,
|
|
205
|
+
}
|
|
206
|
+
: undefined,
|
|
207
|
+
costUsd: parsed.costUsd,
|
|
208
|
+
model: parsed.model,
|
|
209
|
+
summary: parsed.summary,
|
|
210
|
+
sessionParams: resultSessionParams,
|
|
211
|
+
sessionDisplayId: resolvedSessionId,
|
|
212
|
+
clearSession,
|
|
213
|
+
billingType,
|
|
214
|
+
raw: null,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
finally {
|
|
218
|
+
// 10. Clean up skills dir
|
|
219
|
+
if (skillsDir) {
|
|
220
|
+
await cleanupSkillsDir(skillsDir);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/providers/claude/execute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvH,SAAS,mBAAmB,CAAC,GAA2B,EAAE,GAAW;IACnE,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAqB;IAC9D,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC;IACpC,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC;IAC7C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE3C,oBAAoB;IACpB,IAAI,cAAc,CAAC;IACnB,IAAI,CAAC;QACH,cAAc,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,KAAK;YACL,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,KAAK;YACf,SAAS;YACT,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;YACtD,YAAY,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB;YACrE,SAAS,EAAE,kBAAkB;YAC7B,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,IAAI;YACnB,gBAAgB,EAAE,IAAI;YACtB,YAAY,EAAE,KAAK;YACnB,WAAW,EAAE,IAAI;SAClB,CAAC;IACJ,CAAC;IAED,gCAAgC;IAChC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,eAAe,CAAC,GAAG,CAAC,CAAC;IACrB,MAAM,WAAW,GAAG,mBAAmB,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAAc,CAAC,CAAC,CAAC,cAAuB,CAAC;IAE7G,sBAAsB;IACtB,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,MAAM,SAAS,GAAG,CAAC,eAA8B,EAAY,EAAE;QAC7D,MAAM,IAAI,GAAG,CAAC,GAAG,cAAc,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,EAAE,iBAAiB,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;QAC3G,IAAI,eAAe;YAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAC5D,IAAI,MAAM,CAAC,eAAe;YAAE,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QACxE,IAAI,KAAK;YAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACvC,IAAI,MAAM,CAAC,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9F,IAAI,MAAM,CAAC,gBAAgB;YAAE,IAAI,CAAC,IAAI,CAAC,6BAA6B,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC/F,IAAI,SAAS;YAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACjD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACpC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,SAAS;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,8BAA8B;IAC9B,MAAM,aAAa,GAAG,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC;IAChD,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE;QACtB,IAAI,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC;QAChC,MAAM,EAAE,GAAG,aAAa,CAAC,WAAW,CAAuB,IAAI,aAAa,CAAC,YAAY,CAAuB,CAAC;QACjH,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC/C,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAuB,CAAC;QAC9D,IAAI,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9E,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,EAAE,CAAC;IAEL,iBAAiB;IACjB,MAAM,UAAU,GAAG,KAAK,EAAE,eAA8B,EAAE,EAAE;QAC1D,MAAM,IAAI,GAAG,SAAS,CAAC,eAAe,CAAC,CAAC;QAExC,iDAAiD;QACjD,IAAI,UAAU,GAAG,EAAE,CAAC;QAEpB,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC;YACjC,KAAK;YACL,OAAO,EAAE,cAAc,CAAC,GAAG;YAC3B,IAAI;YACJ,GAAG;YACH,GAAG;YACH,KAAK,EAAE,GAAG,CAAC,MAAM;YACjB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;gBAChC,qBAAqB;gBACrB,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;oBACjB,IAAI,CAAC;wBAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;gBACpE,CAAC;gBAED,uCAAuC;gBACvC,IAAI,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;oBACvC,UAAU,IAAI,KAAK,CAAC;oBACpB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACrC,yDAAyD;oBACzD,UAAU,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;oBAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;wBAC5B,IAAI,CAAC,OAAO;4BAAE,SAAS;wBACvB,KAAK,MAAM,KAAK,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;4BAC7C,IAAI,CAAC;gCAAC,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;4BAAC,CAAC;4BAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;wBAC3D,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QAEH,yBAAyB;QACzB,IAAI,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YACrC,KAAK,MAAM,KAAK,IAAI,eAAe,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBACvD,IAAI,CAAC;oBAAC,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,qBAAqB;QACrB,IAAI,IAAI,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,YAAY,GAAG,KAAK,CAAC;QAEzB,4CAA4C;QAC5C,IACE,SAAS;YACT,CAAC,IAAI,CAAC,QAAQ;YACd,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC;YAC1B,2BAA2B,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EACrD,CAAC;YACD,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YAC9B,YAAY,GAAG,IAAI,CAAC;QACtB,CAAC;QAED,kBAAkB;QAClB,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,gBAAgB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAE/C,oFAAoF;QACpF,IAAI,SAAS,GAAG,gBAAgB,CAAC;QACjC,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACnC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAC/B,CAAC;QACD,IAAI,CAAC,SAAS,IAAI,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACjE,SAAS,GAAG,eAAe,CAAC;QAC9B,CAAC;QAED,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE;YACzB,IAAI,IAAI,CAAC,QAAQ;gBAAE,OAAO,mBAAmB,MAAM,CAAC,UAAU,IAAI,CAAC,GAAG,CAAC;YACvE,IAAI,SAAS,KAAK,eAAe;gBAAE,OAAO,qDAAqD,CAAC;YAChG,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACjF,OAAO,UAAU,IAAI,2BAA2B,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC;YACxE,CAAC;YACD,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,MAAM,CAAC,OAAO,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,iBAAiB,GAAG,MAAM,CAAC,SAAS,CAAC;QAC3C,MAAM,mBAAmB,GAAG,iBAAiB;YAC3C,CAAC,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,EAAE;YACvC,CAAC,CAAC,IAAI,CAAC;QAET,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,OAAO;YACL,KAAK;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;YAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS;YACT,WAAW;YACX,UAAU,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;YAC3E,YAAY;YACZ,SAAS;YACT,KAAK,EAAE,MAAM,CAAC,KAAK;gBACjB,CAAC,CAAC;oBACE,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW;oBACrC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY;oBACvC,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,iBAAiB;iBAClD;gBACH,CAAC,CAAC,SAAS;YACb,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,aAAa,EAAE,mBAAmB;YAClC,gBAAgB,EAAE,iBAAiB;YACnC,YAAY;YACZ,WAAW;YACX,GAAG,EAAE,IAAI;SACV,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,0BAA0B;QAC1B,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,gBAAgB,CAAC;AA2CpE,eAAO,MAAM,aAAa,EAAE,cAM3B,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { executeClaudeAdapter } from "./execute.js";
|
|
2
|
+
import { testClaudeEnvironment } from "./test.js";
|
|
3
|
+
import { claudeSessionCodec } from "./codec.js";
|
|
4
|
+
import { findBinary } from "../../utils/binary.js";
|
|
5
|
+
import { buildEnv, ensurePathInEnv } from "../../utils/env.js";
|
|
6
|
+
import { runChildProcess } from "../../utils/process.js";
|
|
7
|
+
async function listModels() {
|
|
8
|
+
try {
|
|
9
|
+
const resolved = await findBinary("claude");
|
|
10
|
+
const env = buildEnv();
|
|
11
|
+
ensurePathInEnv(env);
|
|
12
|
+
const proc = await runChildProcess({
|
|
13
|
+
runId: "list-models",
|
|
14
|
+
command: resolved.bin,
|
|
15
|
+
args: [...resolved.prefixArgs, "--list-models"],
|
|
16
|
+
cwd: process.cwd(),
|
|
17
|
+
env,
|
|
18
|
+
timeoutSec: 10,
|
|
19
|
+
});
|
|
20
|
+
if ((proc.exitCode ?? 1) === 0 && proc.stdout.trim()) {
|
|
21
|
+
return proc.stdout
|
|
22
|
+
.trim()
|
|
23
|
+
.split(/\r?\n/)
|
|
24
|
+
.filter((line) => line.trim())
|
|
25
|
+
.map((line) => {
|
|
26
|
+
const id = line.trim();
|
|
27
|
+
return { id, name: id, provider: "anthropic" };
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Fallback to hardcoded list
|
|
33
|
+
}
|
|
34
|
+
return [
|
|
35
|
+
{ id: "claude-sonnet-4-20250514", name: "Claude Sonnet 4", provider: "anthropic" },
|
|
36
|
+
{ id: "claude-opus-4-20250514", name: "Claude Opus 4", provider: "anthropic" },
|
|
37
|
+
{ id: "claude-haiku-3-5-20241022", name: "Claude Haiku 3.5", provider: "anthropic" },
|
|
38
|
+
];
|
|
39
|
+
}
|
|
40
|
+
export const claudeAdapter = {
|
|
41
|
+
type: "claude",
|
|
42
|
+
execute: executeClaudeAdapter,
|
|
43
|
+
testEnvironment: testClaudeEnvironment,
|
|
44
|
+
sessionCodec: claudeSessionCodec,
|
|
45
|
+
listModels,
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/claude/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,KAAK,UAAU,UAAU;IACvB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;QACvB,eAAe,CAAC,GAAG,CAAC,CAAC;QACrB,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC;YACjC,KAAK,EAAE,aAAa;YACpB,OAAO,EAAE,QAAQ,CAAC,GAAG;YACrB,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;YAC/C,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,GAAG;YACH,UAAU,EAAE,EAAE;SACf,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC,MAAM;iBACf,IAAI,EAAE;iBACN,KAAK,CAAC,OAAO,CAAC;iBACd,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBAC7B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACZ,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBACvB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;YACjD,CAAC,CAAC,CAAC;QACP,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;IAED,OAAO;QACL,EAAE,EAAE,EAAE,0BAA0B,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,WAAW,EAAE;QAClF,EAAE,EAAE,EAAE,wBAAwB,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,WAAW,EAAE;QAC9E,EAAE,EAAE,EAAE,2BAA2B,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,WAAW,EAAE;KACrF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,oBAAoB;IAC7B,eAAe,EAAE,qBAAqB;IACtC,YAAY,EAAE,kBAAkB;IAChC,UAAU;CACX,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { StreamEvent } from "../../types.js";
|
|
2
|
+
export interface ClaudeParsedResult {
|
|
3
|
+
sessionId: string | null;
|
|
4
|
+
model: string | null;
|
|
5
|
+
usage: {
|
|
6
|
+
inputTokens: number;
|
|
7
|
+
outputTokens: number;
|
|
8
|
+
cachedInputTokens: number;
|
|
9
|
+
} | null;
|
|
10
|
+
costUsd: number | null;
|
|
11
|
+
summary: string | null;
|
|
12
|
+
isError: boolean;
|
|
13
|
+
errorCode: string | null;
|
|
14
|
+
}
|
|
15
|
+
export declare function parseClaudeStreamJson(stdout: string): ClaudeParsedResult;
|
|
16
|
+
export declare function toStreamEvents(stdout: string): StreamEvent[];
|
|
17
|
+
export declare function parseStreamLine(line: string): StreamEvent[];
|
|
18
|
+
export declare function isClaudeUnknownSessionError(stdout: string, stderr: string): boolean;
|
|
19
|
+
export declare function isClaudeAuthRequired(stdout: string, stderr: string): boolean;
|
|
20
|
+
export declare function isClaudeMaxTurns(stdout: string): boolean;
|
|
21
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/parse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACvF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AA6BD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CA+ExE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE,CA0D5D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAuD3D;AAKD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnF;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAE5E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAcxD"}
|