@astroanywhere/agent 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/LICENSE +76 -0
- package/README.md +178 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +401 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/index.d.ts +9 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +9 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/mcp.d.ts +16 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +19 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/setup.d.ts +20 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +585 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/start.d.ts +16 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +638 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +63 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +5 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +85 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/execution/direct-strategy.d.ts +18 -0
- package/dist/execution/direct-strategy.d.ts.map +1 -0
- package/dist/execution/direct-strategy.js +156 -0
- package/dist/execution/direct-strategy.js.map +1 -0
- package/dist/execution/docker-strategy.d.ts +26 -0
- package/dist/execution/docker-strategy.d.ts.map +1 -0
- package/dist/execution/docker-strategy.js +222 -0
- package/dist/execution/docker-strategy.js.map +1 -0
- package/dist/execution/index.d.ts +14 -0
- package/dist/execution/index.d.ts.map +1 -0
- package/dist/execution/index.js +13 -0
- package/dist/execution/index.js.map +1 -0
- package/dist/execution/kubernetes-exec-strategy.d.ts +23 -0
- package/dist/execution/kubernetes-exec-strategy.d.ts.map +1 -0
- package/dist/execution/kubernetes-exec-strategy.js +232 -0
- package/dist/execution/kubernetes-exec-strategy.js.map +1 -0
- package/dist/execution/registry.d.ts +41 -0
- package/dist/execution/registry.d.ts.map +1 -0
- package/dist/execution/registry.js +84 -0
- package/dist/execution/registry.js.map +1 -0
- package/dist/execution/slurm-strategy.d.ts +22 -0
- package/dist/execution/slurm-strategy.d.ts.map +1 -0
- package/dist/execution/slurm-strategy.js +219 -0
- package/dist/execution/slurm-strategy.js.map +1 -0
- package/dist/execution/types.d.ts +72 -0
- package/dist/execution/types.d.ts.map +1 -0
- package/dist/execution/types.js +10 -0
- package/dist/execution/types.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-client.d.ts +35 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +126 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/config.d.ts +174 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +399 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/copy-worktree.d.ts +73 -0
- package/dist/lib/copy-worktree.d.ts.map +1 -0
- package/dist/lib/copy-worktree.js +374 -0
- package/dist/lib/copy-worktree.js.map +1 -0
- package/dist/lib/git-pr.d.ts +63 -0
- package/dist/lib/git-pr.d.ts.map +1 -0
- package/dist/lib/git-pr.js +224 -0
- package/dist/lib/git-pr.js.map +1 -0
- package/dist/lib/hardware-id.d.ts +25 -0
- package/dist/lib/hardware-id.d.ts.map +1 -0
- package/dist/lib/hardware-id.js +186 -0
- package/dist/lib/hardware-id.js.map +1 -0
- package/dist/lib/hpc-context.d.ts +35 -0
- package/dist/lib/hpc-context.d.ts.map +1 -0
- package/dist/lib/hpc-context.js +167 -0
- package/dist/lib/hpc-context.js.map +1 -0
- package/dist/lib/prompt-templates.d.ts +195 -0
- package/dist/lib/prompt-templates.d.ts.map +1 -0
- package/dist/lib/prompt-templates.js +353 -0
- package/dist/lib/prompt-templates.js.map +1 -0
- package/dist/lib/providers.d.ts +27 -0
- package/dist/lib/providers.d.ts.map +1 -0
- package/dist/lib/providers.js +372 -0
- package/dist/lib/providers.js.map +1 -0
- package/dist/lib/repo-context.d.ts +18 -0
- package/dist/lib/repo-context.d.ts.map +1 -0
- package/dist/lib/repo-context.js +61 -0
- package/dist/lib/repo-context.js.map +1 -0
- package/dist/lib/repo-utils.d.ts +35 -0
- package/dist/lib/repo-utils.d.ts.map +1 -0
- package/dist/lib/repo-utils.js +222 -0
- package/dist/lib/repo-utils.js.map +1 -0
- package/dist/lib/resources.d.ts +17 -0
- package/dist/lib/resources.d.ts.map +1 -0
- package/dist/lib/resources.js +227 -0
- package/dist/lib/resources.js.map +1 -0
- package/dist/lib/slurm-detect.d.ts +15 -0
- package/dist/lib/slurm-detect.d.ts.map +1 -0
- package/dist/lib/slurm-detect.js +148 -0
- package/dist/lib/slurm-detect.js.map +1 -0
- package/dist/lib/slurm-executor.d.ts +70 -0
- package/dist/lib/slurm-executor.d.ts.map +1 -0
- package/dist/lib/slurm-executor.js +402 -0
- package/dist/lib/slurm-executor.js.map +1 -0
- package/dist/lib/slurm-job-monitor.d.ts +52 -0
- package/dist/lib/slurm-job-monitor.d.ts.map +1 -0
- package/dist/lib/slurm-job-monitor.js +212 -0
- package/dist/lib/slurm-job-monitor.js.map +1 -0
- package/dist/lib/ssh-discovery.d.ts +17 -0
- package/dist/lib/ssh-discovery.d.ts.map +1 -0
- package/dist/lib/ssh-discovery.js +287 -0
- package/dist/lib/ssh-discovery.js.map +1 -0
- package/dist/lib/ssh-installer.d.ts +69 -0
- package/dist/lib/ssh-installer.d.ts.map +1 -0
- package/dist/lib/ssh-installer.js +230 -0
- package/dist/lib/ssh-installer.js.map +1 -0
- package/dist/lib/streaming-prompt.d.ts +48 -0
- package/dist/lib/streaming-prompt.d.ts.map +1 -0
- package/dist/lib/streaming-prompt.js +91 -0
- package/dist/lib/streaming-prompt.js.map +1 -0
- package/dist/lib/task-executor.d.ts +114 -0
- package/dist/lib/task-executor.d.ts.map +1 -0
- package/dist/lib/task-executor.js +753 -0
- package/dist/lib/task-executor.js.map +1 -0
- package/dist/lib/websocket-client.d.ts +200 -0
- package/dist/lib/websocket-client.d.ts.map +1 -0
- package/dist/lib/websocket-client.js +781 -0
- package/dist/lib/websocket-client.js.map +1 -0
- package/dist/lib/workdir-safety.d.ts +63 -0
- package/dist/lib/workdir-safety.d.ts.map +1 -0
- package/dist/lib/workdir-safety.js +247 -0
- package/dist/lib/workdir-safety.js.map +1 -0
- package/dist/lib/worktree-include.d.ts +14 -0
- package/dist/lib/worktree-include.d.ts.map +1 -0
- package/dist/lib/worktree-include.js +68 -0
- package/dist/lib/worktree-include.js.map +1 -0
- package/dist/lib/worktree-setup.d.ts +18 -0
- package/dist/lib/worktree-setup.d.ts.map +1 -0
- package/dist/lib/worktree-setup.js +60 -0
- package/dist/lib/worktree-setup.js.map +1 -0
- package/dist/lib/worktree.d.ts +37 -0
- package/dist/lib/worktree.d.ts.map +1 -0
- package/dist/lib/worktree.js +411 -0
- package/dist/lib/worktree.js.map +1 -0
- package/dist/mcp/index.d.ts +8 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +8 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +45 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +153 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/session-bridge.d.ts +87 -0
- package/dist/mcp/session-bridge.d.ts.map +1 -0
- package/dist/mcp/session-bridge.js +317 -0
- package/dist/mcp/session-bridge.js.map +1 -0
- package/dist/mcp/tools.d.ts +70 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +234 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/types.d.ts +197 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +16 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/providers/base-adapter.d.ts +56 -0
- package/dist/providers/base-adapter.d.ts.map +1 -0
- package/dist/providers/base-adapter.js +5 -0
- package/dist/providers/base-adapter.js.map +1 -0
- package/dist/providers/claude-code-adapter.d.ts +27 -0
- package/dist/providers/claude-code-adapter.d.ts.map +1 -0
- package/dist/providers/claude-code-adapter.js +298 -0
- package/dist/providers/claude-code-adapter.js.map +1 -0
- package/dist/providers/claude-sdk-adapter.d.ts +60 -0
- package/dist/providers/claude-sdk-adapter.d.ts.map +1 -0
- package/dist/providers/claude-sdk-adapter.js +632 -0
- package/dist/providers/claude-sdk-adapter.js.map +1 -0
- package/dist/providers/codex-adapter.d.ts +21 -0
- package/dist/providers/codex-adapter.d.ts.map +1 -0
- package/dist/providers/codex-adapter.js +197 -0
- package/dist/providers/codex-adapter.js.map +1 -0
- package/dist/providers/index.d.ts +26 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +58 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/slurm-adapter.d.ts +26 -0
- package/dist/providers/slurm-adapter.d.ts.map +1 -0
- package/dist/providers/slurm-adapter.js +146 -0
- package/dist/providers/slurm-adapter.js.map +1 -0
- package/dist/types.d.ts +592 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,632 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Agent SDK Adapter
|
|
3
|
+
*
|
|
4
|
+
* Executes tasks using the @anthropic-ai/claude-agent-sdk.
|
|
5
|
+
* Runs in-process with zero serialization overhead.
|
|
6
|
+
* Supports mid-execution steering via Query.streamInput().
|
|
7
|
+
*/
|
|
8
|
+
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
9
|
+
import { homedir } from 'node:os';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { buildHpcContext } from '../lib/hpc-context.js';
|
|
12
|
+
import { config } from '../lib/config.js';
|
|
13
|
+
/** How long to preserve completed session state for potential steering (ms) */
|
|
14
|
+
const SESSION_PRESERVE_MS = 10 * 60 * 1000; // 10 minutes
|
|
15
|
+
export class ClaudeSdkAdapter {
|
|
16
|
+
type = 'claude-sdk';
|
|
17
|
+
name = 'Claude Agent SDK';
|
|
18
|
+
activeTasks = 0;
|
|
19
|
+
maxTasks = 4; // SDK supports concurrent tasks
|
|
20
|
+
lastError;
|
|
21
|
+
isAuthenticated = false;
|
|
22
|
+
model = 'unknown';
|
|
23
|
+
/** Active Query instances per task ID for steering */
|
|
24
|
+
activeQueries = new Map();
|
|
25
|
+
/** Lazily-initialized HPC context (undefined = not checked, null = not available) */
|
|
26
|
+
hpcContext = undefined;
|
|
27
|
+
/** Optional Slurm job monitor for tracking sbatch submissions */
|
|
28
|
+
jobMonitor;
|
|
29
|
+
/**
|
|
30
|
+
* Set a SlurmJobMonitor for tracking batch job submissions.
|
|
31
|
+
* Call this before executing tasks if HPC support is desired.
|
|
32
|
+
*/
|
|
33
|
+
setJobMonitor(monitor) {
|
|
34
|
+
this.jobMonitor = monitor;
|
|
35
|
+
}
|
|
36
|
+
async isAvailable() {
|
|
37
|
+
try {
|
|
38
|
+
const abortController = new AbortController();
|
|
39
|
+
// Minimal prompt to check authentication
|
|
40
|
+
const gen = query({
|
|
41
|
+
prompt: 'respond with ok',
|
|
42
|
+
options: {
|
|
43
|
+
abortController,
|
|
44
|
+
maxTurns: 1,
|
|
45
|
+
permissionMode: 'plan',
|
|
46
|
+
tools: [],
|
|
47
|
+
persistSession: false,
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
for await (const msg of gen) {
|
|
51
|
+
if (msg.type === 'system' && msg.subtype === 'init') {
|
|
52
|
+
this.model = msg.model;
|
|
53
|
+
this.isAuthenticated = true;
|
|
54
|
+
abortController.abort();
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
if (msg.type === 'result') {
|
|
58
|
+
this.isAuthenticated = true;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return this.isAuthenticated;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
66
|
+
this.lastError = message;
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async execute(task, stream, signal) {
|
|
71
|
+
this.activeTasks++;
|
|
72
|
+
const startedAt = new Date().toISOString();
|
|
73
|
+
// Create an abort controller that respects the signal
|
|
74
|
+
const abortController = new AbortController();
|
|
75
|
+
const abortHandler = () => abortController.abort();
|
|
76
|
+
signal.addEventListener('abort', abortHandler);
|
|
77
|
+
try {
|
|
78
|
+
stream.status('running', 0, 'Starting Claude Agent SDK');
|
|
79
|
+
const result = await this.runQuery(task, stream, abortController);
|
|
80
|
+
return {
|
|
81
|
+
taskId: task.id,
|
|
82
|
+
status: result.success ? 'completed' : 'failed',
|
|
83
|
+
exitCode: result.success ? 0 : 1,
|
|
84
|
+
output: result.output,
|
|
85
|
+
error: result.error,
|
|
86
|
+
startedAt,
|
|
87
|
+
completedAt: new Date().toISOString(),
|
|
88
|
+
artifacts: result.artifacts,
|
|
89
|
+
metrics: result.metrics,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
94
|
+
this.lastError = errorMsg;
|
|
95
|
+
const isAbort = error instanceof Error && error.name === 'AbortError';
|
|
96
|
+
if (signal.aborted || isAbort) {
|
|
97
|
+
return {
|
|
98
|
+
taskId: task.id,
|
|
99
|
+
status: 'cancelled',
|
|
100
|
+
error: 'Task cancelled',
|
|
101
|
+
startedAt,
|
|
102
|
+
completedAt: new Date().toISOString(),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
taskId: task.id,
|
|
107
|
+
status: 'failed',
|
|
108
|
+
error: errorMsg,
|
|
109
|
+
startedAt,
|
|
110
|
+
completedAt: new Date().toISOString(),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
signal.removeEventListener('abort', abortHandler);
|
|
115
|
+
// Preserve session state for post-completion steering (mirrors server-side behavior).
|
|
116
|
+
// The query generator is exhausted, but the sessionId is kept so `injectMessage()`
|
|
117
|
+
// can still succeed on the SDK side and a `resumeTask()` could be implemented later.
|
|
118
|
+
const existing = this.activeQueries.get(task.id);
|
|
119
|
+
if (existing) {
|
|
120
|
+
this.activeQueries.set(task.id, {
|
|
121
|
+
query: null,
|
|
122
|
+
sessionId: existing.sessionId,
|
|
123
|
+
workingDirectory: task.workingDirectory,
|
|
124
|
+
});
|
|
125
|
+
// Auto-cleanup after a timeout to prevent memory leaks
|
|
126
|
+
setTimeout(() => {
|
|
127
|
+
const entry = this.activeQueries.get(task.id);
|
|
128
|
+
if (entry && entry.query === null) {
|
|
129
|
+
this.activeQueries.delete(task.id);
|
|
130
|
+
}
|
|
131
|
+
}, SESSION_PRESERVE_MS);
|
|
132
|
+
}
|
|
133
|
+
this.activeTasks--;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Inject a steering message into a running task's session.
|
|
138
|
+
* Uses Query.streamInput() to feed a new user message into the running query.
|
|
139
|
+
* When interrupt=true, calls Query.interrupt() first to stop the current turn.
|
|
140
|
+
* Returns true if the message was successfully injected.
|
|
141
|
+
*/
|
|
142
|
+
async injectMessage(taskId, content, interrupt = false) {
|
|
143
|
+
const active = this.activeQueries.get(taskId);
|
|
144
|
+
if (!active)
|
|
145
|
+
return false;
|
|
146
|
+
// Session completed — query is null but sessionId is preserved.
|
|
147
|
+
// Cannot inject into a completed session; caller should use resume instead.
|
|
148
|
+
if (!active.query) {
|
|
149
|
+
console.log(`[claude-sdk] Cannot inject into completed session for task ${taskId} (sessionId: ${active.sessionId})`);
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
if (interrupt) {
|
|
153
|
+
// Fire interrupt without awaiting — interrupt() may block until the
|
|
154
|
+
// current turn finishes, which can take a long time. We don't need
|
|
155
|
+
// to wait for it; the SDK will process the interrupt and streamInput
|
|
156
|
+
// in order internally.
|
|
157
|
+
active.query.interrupt().catch(() => {
|
|
158
|
+
/* agent may be idle between turns */
|
|
159
|
+
});
|
|
160
|
+
// Small delay to let the interrupt signal propagate before injecting
|
|
161
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
162
|
+
}
|
|
163
|
+
// Create a single-message async iterable with proper SDKUserMessage shape
|
|
164
|
+
const message = {
|
|
165
|
+
type: 'user',
|
|
166
|
+
message: {
|
|
167
|
+
role: 'user',
|
|
168
|
+
content,
|
|
169
|
+
},
|
|
170
|
+
parent_tool_use_id: null,
|
|
171
|
+
session_id: active.sessionId,
|
|
172
|
+
};
|
|
173
|
+
// Single-shot async iterable
|
|
174
|
+
const iterable = {
|
|
175
|
+
async *[Symbol.asyncIterator]() {
|
|
176
|
+
yield message;
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
// streamInput returns a Promise — fire and forget
|
|
180
|
+
active.query.streamInput(iterable).catch((err) => {
|
|
181
|
+
console.error(`[claude-sdk] Failed to inject steer message for task ${taskId}:`, err.message);
|
|
182
|
+
});
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Resume a completed task session to continue execution.
|
|
187
|
+
* Uses the SDK's `resume` option to reconnect to a previous session.
|
|
188
|
+
* This enables post-completion steering (follow-up questions after task finishes).
|
|
189
|
+
*/
|
|
190
|
+
async resumeTask(taskId, message, workingDirectory, sessionId, stream, signal) {
|
|
191
|
+
const abortController = new AbortController();
|
|
192
|
+
const abortHandler = () => abortController.abort();
|
|
193
|
+
signal.addEventListener('abort', abortHandler);
|
|
194
|
+
try {
|
|
195
|
+
// Ensure CLAUDE_CONFIG_DIR is set
|
|
196
|
+
if (!process.env.CLAUDE_CONFIG_DIR) {
|
|
197
|
+
process.env.CLAUDE_CONFIG_DIR = join(homedir(), '.claude');
|
|
198
|
+
}
|
|
199
|
+
const options = {
|
|
200
|
+
abortController,
|
|
201
|
+
maxTurns: 100,
|
|
202
|
+
permissionMode: 'bypassPermissions',
|
|
203
|
+
// NOTE: Do NOT pass `sandbox` option — any non-undefined value crashes Claude Code on Bedrock.
|
|
204
|
+
settingSources: ['user', 'project', 'local'],
|
|
205
|
+
persistSession: false,
|
|
206
|
+
cwd: workingDirectory,
|
|
207
|
+
additionalDirectories: [workingDirectory],
|
|
208
|
+
env: {
|
|
209
|
+
...process.env,
|
|
210
|
+
CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD: '1',
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
// Resume the previous session
|
|
214
|
+
options.resume = sessionId;
|
|
215
|
+
// Load MCP servers from config if available
|
|
216
|
+
const agentConfig = config.getConfig();
|
|
217
|
+
if (agentConfig.mcpServers && Object.keys(agentConfig.mcpServers).length > 0) {
|
|
218
|
+
const mcpServers = {};
|
|
219
|
+
for (const [name, serverConfig] of Object.entries(agentConfig.mcpServers)) {
|
|
220
|
+
const server = serverConfig;
|
|
221
|
+
mcpServers[name] = {
|
|
222
|
+
...server,
|
|
223
|
+
env: {
|
|
224
|
+
...server.env,
|
|
225
|
+
ASTRO_EXECUTION_ID: taskId,
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
options.mcpServers = mcpServers;
|
|
230
|
+
options.allowedTools = Object.keys(mcpServers).map(name => `mcp__${name}__*`);
|
|
231
|
+
}
|
|
232
|
+
const gen = query({ prompt: message, options });
|
|
233
|
+
let output = '';
|
|
234
|
+
let success = true;
|
|
235
|
+
let errorMessage;
|
|
236
|
+
let newSessionId = sessionId;
|
|
237
|
+
for await (const msg of gen) {
|
|
238
|
+
if (msg.type === 'system' && msg.subtype === 'init') {
|
|
239
|
+
newSessionId = msg.session_id ?? sessionId;
|
|
240
|
+
this.activeQueries.set(taskId, { query: gen, sessionId: newSessionId, workingDirectory });
|
|
241
|
+
stream.sessionInit(newSessionId, msg.model);
|
|
242
|
+
}
|
|
243
|
+
else if (msg.type === 'assistant') {
|
|
244
|
+
for (const block of msg.message.content) {
|
|
245
|
+
if (typeof block === 'string')
|
|
246
|
+
continue;
|
|
247
|
+
if (block.type === 'text') {
|
|
248
|
+
output += block.text;
|
|
249
|
+
stream.text(block.text);
|
|
250
|
+
}
|
|
251
|
+
else if (block.type === 'tool_use') {
|
|
252
|
+
stream.toolUse(block.name, block.input);
|
|
253
|
+
if (block.name === 'Write' || block.name === 'Edit') {
|
|
254
|
+
const input = block.input;
|
|
255
|
+
if (input.file_path) {
|
|
256
|
+
const action = block.name === 'Write' ? 'created' : 'modified';
|
|
257
|
+
stream.fileChange(String(input.file_path), action);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
else if (msg.type === 'user') {
|
|
264
|
+
for (const block of msg.message.content) {
|
|
265
|
+
if (typeof block === 'string')
|
|
266
|
+
continue;
|
|
267
|
+
if (block.type === 'tool_result') {
|
|
268
|
+
const resultContent = typeof block.content === 'string'
|
|
269
|
+
? block.content
|
|
270
|
+
: JSON.stringify(block.content);
|
|
271
|
+
const isError = block.is_error ?? false;
|
|
272
|
+
stream.toolResult(block.tool_use_id ?? 'unknown', resultContent, !isError);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
else if (msg.type === 'result') {
|
|
277
|
+
newSessionId = msg.session_id ?? newSessionId;
|
|
278
|
+
if (msg.subtype === 'success') {
|
|
279
|
+
success = true;
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
success = false;
|
|
283
|
+
errorMessage = `Resume failed: ${msg.subtype}`;
|
|
284
|
+
}
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
// Preserve context after resume completes
|
|
289
|
+
this.activeQueries.set(taskId, {
|
|
290
|
+
query: null,
|
|
291
|
+
sessionId: newSessionId,
|
|
292
|
+
workingDirectory,
|
|
293
|
+
});
|
|
294
|
+
setTimeout(() => {
|
|
295
|
+
const entry = this.activeQueries.get(taskId);
|
|
296
|
+
if (entry && entry.query === null) {
|
|
297
|
+
this.activeQueries.delete(taskId);
|
|
298
|
+
}
|
|
299
|
+
}, SESSION_PRESERVE_MS);
|
|
300
|
+
return { success, output, error: errorMessage };
|
|
301
|
+
}
|
|
302
|
+
finally {
|
|
303
|
+
signal.removeEventListener('abort', abortHandler);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Get session context for a task (active or recently completed).
|
|
308
|
+
* Returns sessionId and workingDirectory if available.
|
|
309
|
+
*/
|
|
310
|
+
getTaskContext(taskId) {
|
|
311
|
+
const active = this.activeQueries.get(taskId);
|
|
312
|
+
if (!active)
|
|
313
|
+
return null;
|
|
314
|
+
return { sessionId: active.sessionId, workingDirectory: active.workingDirectory };
|
|
315
|
+
}
|
|
316
|
+
async getStatus() {
|
|
317
|
+
const available = this.isAuthenticated || (await this.isAvailable());
|
|
318
|
+
return {
|
|
319
|
+
available,
|
|
320
|
+
version: this.model,
|
|
321
|
+
activeTasks: this.activeTasks,
|
|
322
|
+
maxTasks: this.maxTasks,
|
|
323
|
+
lastError: this.lastError,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
async runQuery(task, stream, abortController) {
|
|
327
|
+
// Ensure CLAUDE_CONFIG_DIR points to a user-writable location.
|
|
328
|
+
// The SDK derives internal storage paths from cwd, and /tmp/claude/ may be
|
|
329
|
+
// owned by another user on shared machines, causing EACCES errors.
|
|
330
|
+
if (!process.env.CLAUDE_CONFIG_DIR) {
|
|
331
|
+
process.env.CLAUDE_CONFIG_DIR = join(homedir(), '.claude');
|
|
332
|
+
}
|
|
333
|
+
// Enable SDK debug logging only when explicitly requested
|
|
334
|
+
if (process.env.ASTRO_LOG_LEVEL === 'debug') {
|
|
335
|
+
process.env.DEBUG_SDK = '1';
|
|
336
|
+
process.env.CLAUDE_CODE_DEBUG_LOGS_DIR = join(homedir(), '.astro', 'logs', 'sdk-debug');
|
|
337
|
+
}
|
|
338
|
+
// NOTE: We intentionally do NOT call process.chdir() here.
|
|
339
|
+
// process.cwd() is global state shared across concurrent tasks, so calling
|
|
340
|
+
// chdir() creates race conditions where one task captures another's worktree
|
|
341
|
+
// path as its "original cwd", then fails to restore when that worktree is
|
|
342
|
+
// cleaned up. The SDK's `cwd` option (line below) handles per-query working
|
|
343
|
+
// directory correctly without mutating global state.
|
|
344
|
+
// Remove nested-session guard: the agent runner may be launched from within
|
|
345
|
+
// a Claude Code session, and the CLAUDECODE env var prevents the SDK from
|
|
346
|
+
// starting a new session.
|
|
347
|
+
delete process.env.CLAUDECODE;
|
|
348
|
+
// Determine appropriate maxTurns based on task type
|
|
349
|
+
const defaultMaxTurns = (task.type === 'chat' || task.type === 'summarize') ? 10 : 150;
|
|
350
|
+
// Build options for the query
|
|
351
|
+
const options = {
|
|
352
|
+
abortController,
|
|
353
|
+
maxTurns: task.maxTurns ?? defaultMaxTurns,
|
|
354
|
+
permissionMode: 'bypassPermissions', // Auto-accept all tool calls
|
|
355
|
+
// NOTE: Do NOT pass `sandbox` option — any non-undefined value crashes Claude Code on Bedrock.
|
|
356
|
+
settingSources: ['user', 'project', 'local'], // Load CLAUDE.md from user home, project dir, and cwd
|
|
357
|
+
persistSession: false,
|
|
358
|
+
cwd: task.workingDirectory,
|
|
359
|
+
additionalDirectories: [task.workingDirectory], // Allow file operations in worktree
|
|
360
|
+
env: {
|
|
361
|
+
...process.env,
|
|
362
|
+
...task.environment,
|
|
363
|
+
CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD: '1', // Enable additional directories for CLAUDE.md loading
|
|
364
|
+
},
|
|
365
|
+
// Intercept built-in AskUserQuestion to handle approvals (following Cyrus pattern)
|
|
366
|
+
canUseTool: async (toolName, input, options) => {
|
|
367
|
+
if (toolName === 'AskUserQuestion') {
|
|
368
|
+
console.log(`[claude-sdk] Intercepted AskUserQuestion (toolUseID: ${options.toolUseID})`);
|
|
369
|
+
// Validate input structure
|
|
370
|
+
const askInput = input;
|
|
371
|
+
if (!askInput.questions || !Array.isArray(askInput.questions)) {
|
|
372
|
+
console.error('[claude-sdk] Invalid AskUserQuestion input: questions array missing');
|
|
373
|
+
return {
|
|
374
|
+
behavior: 'deny',
|
|
375
|
+
message: 'Invalid AskUserQuestion input: questions array is required',
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
// Only support one question at a time (following Cyrus pattern)
|
|
379
|
+
if (askInput.questions.length !== 1) {
|
|
380
|
+
console.log(`[claude-sdk] Rejecting AskUserQuestion with ${askInput.questions.length} questions (only 1 allowed)`);
|
|
381
|
+
return {
|
|
382
|
+
behavior: 'deny',
|
|
383
|
+
message: 'Only one question at a time is supported. Please ask each question separately.',
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
const question = askInput.questions[0];
|
|
387
|
+
const optionLabels = question.options.map(opt => opt.label);
|
|
388
|
+
try {
|
|
389
|
+
console.log(`[claude-sdk] Requesting approval from user: "${question.question}"`);
|
|
390
|
+
// Call the approval request handler (emits event and waits for response)
|
|
391
|
+
const result = await stream.approvalRequest(question.question, optionLabels);
|
|
392
|
+
if (result.answered && result.answer) {
|
|
393
|
+
console.log(`[claude-sdk] User approved with answer: "${result.answer}"`);
|
|
394
|
+
// Return the answer via updatedInput (SDK will see this as the tool result)
|
|
395
|
+
return {
|
|
396
|
+
behavior: 'allow',
|
|
397
|
+
updatedInput: {
|
|
398
|
+
questions: askInput.questions,
|
|
399
|
+
answers: { [question.question]: result.answer },
|
|
400
|
+
},
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
else {
|
|
404
|
+
console.log(`[claude-sdk] User denied approval: ${result.message || 'No response'}`);
|
|
405
|
+
return {
|
|
406
|
+
behavior: 'deny',
|
|
407
|
+
message: result.message || 'User did not respond to the question',
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
catch (error) {
|
|
412
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
413
|
+
console.error(`[claude-sdk] Error handling approval request: ${errorMessage}`);
|
|
414
|
+
return {
|
|
415
|
+
behavior: 'deny',
|
|
416
|
+
message: `Failed to get user approval: ${errorMessage}`,
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
// Allow all other tools
|
|
421
|
+
return { behavior: 'allow', updatedInput: input };
|
|
422
|
+
},
|
|
423
|
+
};
|
|
424
|
+
// Lazily initialize HPC context on first query
|
|
425
|
+
if (this.hpcContext === undefined) {
|
|
426
|
+
try {
|
|
427
|
+
this.hpcContext = await buildHpcContext();
|
|
428
|
+
if (this.hpcContext.available) {
|
|
429
|
+
console.log(`[claude-sdk] HPC context loaded (cluster: ${this.hpcContext.slurmInfo?.clusterName ?? 'unknown'})`);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
catch {
|
|
433
|
+
this.hpcContext = null;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
// Prepend HPC context to prompt if available
|
|
437
|
+
let effectivePrompt = task.prompt;
|
|
438
|
+
if (this.hpcContext?.available) {
|
|
439
|
+
effectivePrompt = this.hpcContext.contextString + '\n\n---\n\n' + task.prompt;
|
|
440
|
+
}
|
|
441
|
+
// Add structured output format if requested (e.g., plan generation)
|
|
442
|
+
if (task.outputFormat) {
|
|
443
|
+
options.outputFormat = task.outputFormat;
|
|
444
|
+
}
|
|
445
|
+
// Apply system prompt if provided (new relay protocol field)
|
|
446
|
+
// This keeps system instructions separate from user content.
|
|
447
|
+
if (task.systemPrompt) {
|
|
448
|
+
options.systemPrompt = task.systemPrompt;
|
|
449
|
+
}
|
|
450
|
+
// Apply explicit model selection if provided (new relay protocol field)
|
|
451
|
+
if (task.model) {
|
|
452
|
+
options.model = task.model;
|
|
453
|
+
}
|
|
454
|
+
// Load MCP servers from config if available
|
|
455
|
+
const agentConfig = config.getConfig();
|
|
456
|
+
if (agentConfig.mcpServers && Object.keys(agentConfig.mcpServers).length > 0) {
|
|
457
|
+
console.log(`[claude-sdk] Loading ${Object.keys(agentConfig.mcpServers).length} MCP server(s): ${Object.keys(agentConfig.mcpServers).join(', ')}`);
|
|
458
|
+
// Inject execution ID into MCP server environment variables
|
|
459
|
+
const mcpServers = {};
|
|
460
|
+
for (const [name, serverConfig] of Object.entries(agentConfig.mcpServers)) {
|
|
461
|
+
const server = serverConfig;
|
|
462
|
+
mcpServers[name] = {
|
|
463
|
+
...server,
|
|
464
|
+
env: {
|
|
465
|
+
...server.env,
|
|
466
|
+
ASTRO_EXECUTION_ID: task.id, // Inject current task ID for approval routing
|
|
467
|
+
},
|
|
468
|
+
};
|
|
469
|
+
}
|
|
470
|
+
options.mcpServers = mcpServers;
|
|
471
|
+
// Allow all MCP tools from configured servers
|
|
472
|
+
const allowedTools = Object.keys(mcpServers).map(name => `mcp__${name}__*`);
|
|
473
|
+
options.allowedTools = allowedTools;
|
|
474
|
+
}
|
|
475
|
+
// Build the prompt: use messages array if provided (chat tasks), otherwise flat string
|
|
476
|
+
// The messages field carries multi-turn conversation history from chat endpoints,
|
|
477
|
+
// preserving role structure (user/assistant turns) that would be lost with a flat string.
|
|
478
|
+
let queryPrompt;
|
|
479
|
+
if (task.messages && task.messages.length > 0) {
|
|
480
|
+
// For chat tasks with conversation history, build the prompt by appending
|
|
481
|
+
// the conversation history to the effective prompt. The last user message
|
|
482
|
+
// is the actual query; prior messages provide context.
|
|
483
|
+
const conversationContext = task.messages
|
|
484
|
+
.map(m => `${m.role === 'user' ? 'Human' : 'Assistant'}: ${m.content}`)
|
|
485
|
+
.join('\n\n');
|
|
486
|
+
queryPrompt = effectivePrompt
|
|
487
|
+
? `${effectivePrompt}\n\n---\n\nConversation history:\n${conversationContext}`
|
|
488
|
+
: conversationContext;
|
|
489
|
+
}
|
|
490
|
+
else {
|
|
491
|
+
queryPrompt = effectivePrompt;
|
|
492
|
+
}
|
|
493
|
+
const gen = query({
|
|
494
|
+
prompt: queryPrompt,
|
|
495
|
+
options,
|
|
496
|
+
});
|
|
497
|
+
let output = '';
|
|
498
|
+
let success = true;
|
|
499
|
+
let errorMessage;
|
|
500
|
+
const artifacts = [];
|
|
501
|
+
let progress = 0;
|
|
502
|
+
let resultMetrics;
|
|
503
|
+
for await (const msg of gen) {
|
|
504
|
+
if (msg.type === 'system' && msg.subtype === 'init') {
|
|
505
|
+
this.model = msg.model;
|
|
506
|
+
const sessionId = msg.session_id ?? '';
|
|
507
|
+
stream.status('running', 5, `Model: ${msg.model}`);
|
|
508
|
+
stream.sessionInit(sessionId, msg.model);
|
|
509
|
+
// Store the query instance for steering
|
|
510
|
+
this.activeQueries.set(task.id, { query: gen, sessionId });
|
|
511
|
+
}
|
|
512
|
+
else if (msg.type === 'assistant') {
|
|
513
|
+
// Stream assistant content blocks
|
|
514
|
+
for (const block of msg.message.content) {
|
|
515
|
+
if (typeof block === 'string')
|
|
516
|
+
continue;
|
|
517
|
+
if (block.type === 'text') {
|
|
518
|
+
output += block.text;
|
|
519
|
+
stream.text(block.text);
|
|
520
|
+
}
|
|
521
|
+
else if (block.type === 'tool_use') {
|
|
522
|
+
// Emit structured tool use
|
|
523
|
+
progress = Math.min(progress + 10, 90);
|
|
524
|
+
stream.status('running', progress, `Using tool: ${block.name}`);
|
|
525
|
+
stream.toolUse(block.name, block.input);
|
|
526
|
+
// Record file operations as artifacts
|
|
527
|
+
if (block.name === 'Write' || block.name === 'Edit') {
|
|
528
|
+
const input = block.input;
|
|
529
|
+
if (input.file_path) {
|
|
530
|
+
artifacts.push({
|
|
531
|
+
type: 'file',
|
|
532
|
+
name: String(input.file_path),
|
|
533
|
+
path: String(input.file_path),
|
|
534
|
+
metadata: { tool: block.name },
|
|
535
|
+
});
|
|
536
|
+
// Emit file change event
|
|
537
|
+
const action = block.name === 'Write' ? 'created' : 'modified';
|
|
538
|
+
stream.fileChange(String(input.file_path), action);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
else if (msg.type === 'user') {
|
|
545
|
+
// Tool results from the SDK
|
|
546
|
+
for (const block of msg.message.content) {
|
|
547
|
+
if (typeof block === 'string')
|
|
548
|
+
continue;
|
|
549
|
+
if (block.type === 'tool_result') {
|
|
550
|
+
const resultContent = typeof block.content === 'string'
|
|
551
|
+
? block.content
|
|
552
|
+
: JSON.stringify(block.content);
|
|
553
|
+
const isError = block.is_error ?? false;
|
|
554
|
+
stream.toolResult(block.tool_use_id ?? 'unknown', resultContent, !isError);
|
|
555
|
+
// Detect sbatch submissions for job tracking
|
|
556
|
+
if (this.jobMonitor && typeof resultContent === 'string') {
|
|
557
|
+
const sbatchMatch = resultContent.match(/Submitted batch job (\d+)/);
|
|
558
|
+
if (sbatchMatch) {
|
|
559
|
+
const jobId = sbatchMatch[1];
|
|
560
|
+
// Try to extract output path from sbatch script (common pattern: --output=...)
|
|
561
|
+
const outputMatch = resultContent.match(/--output[= ](\S+)/);
|
|
562
|
+
const outputPath = outputMatch?.[1]?.replace('%j', jobId);
|
|
563
|
+
this.jobMonitor.trackJob(jobId, task.id, task.planNodeId, outputPath);
|
|
564
|
+
console.log(`[claude-sdk] Detected sbatch submission: job ${jobId}`);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
else if (msg.type === 'result') {
|
|
571
|
+
// Extract metrics from SDK result (available on both success and error subtypes)
|
|
572
|
+
const msgAny = msg;
|
|
573
|
+
const usage = msgAny.usage;
|
|
574
|
+
const totalCostUsd = (msgAny.total_cost_usd ?? msgAny.cost_usd);
|
|
575
|
+
const numTurns = msgAny.num_turns;
|
|
576
|
+
const durationMs = (msgAny.duration_ms ?? msgAny.duration_api_ms);
|
|
577
|
+
// Log result message fields for debugging token extraction
|
|
578
|
+
const msgKeys = Object.keys(msgAny).filter(k => k !== 'result').sort();
|
|
579
|
+
console.log(`[claude-sdk] Result message fields: ${msgKeys.join(', ')}`);
|
|
580
|
+
if (usage) {
|
|
581
|
+
console.log(`[claude-sdk] Usage: input_tokens=${usage.input_tokens}, output_tokens=${usage.output_tokens}`);
|
|
582
|
+
}
|
|
583
|
+
else {
|
|
584
|
+
console.log(`[claude-sdk] No usage field found on result message`);
|
|
585
|
+
}
|
|
586
|
+
resultMetrics = {
|
|
587
|
+
inputTokens: usage?.input_tokens,
|
|
588
|
+
outputTokens: usage?.output_tokens,
|
|
589
|
+
totalCost: totalCostUsd,
|
|
590
|
+
numTurns,
|
|
591
|
+
durationMs,
|
|
592
|
+
model: this.model,
|
|
593
|
+
};
|
|
594
|
+
if (msg.subtype === 'success') {
|
|
595
|
+
success = true;
|
|
596
|
+
stream.status('completed', 100, 'Task completed successfully');
|
|
597
|
+
// Capture structured output (produced when outputFormat is set)
|
|
598
|
+
if (msgAny.structured_output) {
|
|
599
|
+
const jsonStr = JSON.stringify(msgAny.structured_output);
|
|
600
|
+
output += jsonStr;
|
|
601
|
+
stream.text(jsonStr);
|
|
602
|
+
}
|
|
603
|
+
else if (msgAny.result && !output) {
|
|
604
|
+
// Fallback: capture result text if no output was accumulated
|
|
605
|
+
const resultStr = typeof msgAny.result === 'string'
|
|
606
|
+
? msgAny.result
|
|
607
|
+
: JSON.stringify(msgAny.result);
|
|
608
|
+
output += resultStr;
|
|
609
|
+
stream.text(resultStr);
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
else if (msg.subtype === 'error_during_execution' ||
|
|
613
|
+
msg.subtype === 'error_max_turns' ||
|
|
614
|
+
msg.subtype === 'error_max_budget_usd' ||
|
|
615
|
+
msg.subtype === 'error_max_structured_output_retries') {
|
|
616
|
+
success = false;
|
|
617
|
+
errorMessage = `Task failed: ${msg.subtype}`;
|
|
618
|
+
stream.status('failed', progress, errorMessage);
|
|
619
|
+
}
|
|
620
|
+
break;
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
return {
|
|
624
|
+
success,
|
|
625
|
+
output,
|
|
626
|
+
error: errorMessage,
|
|
627
|
+
artifacts: artifacts.length > 0 ? artifacts : undefined,
|
|
628
|
+
metrics: resultMetrics,
|
|
629
|
+
};
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
//# sourceMappingURL=claude-sdk-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-sdk-adapter.js","sourceRoot":"","sources":["../../src/providers/claude-sdk-adapter.ts"],"names":[],"mappings":"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"}
|