@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.
Files changed (203) hide show
  1. package/LICENSE +76 -0
  2. package/README.md +178 -0
  3. package/dist/cli.d.ts +15 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +401 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/index.d.ts +9 -0
  8. package/dist/commands/index.d.ts.map +1 -0
  9. package/dist/commands/index.js +9 -0
  10. package/dist/commands/index.js.map +1 -0
  11. package/dist/commands/mcp.d.ts +16 -0
  12. package/dist/commands/mcp.d.ts.map +1 -0
  13. package/dist/commands/mcp.js +19 -0
  14. package/dist/commands/mcp.js.map +1 -0
  15. package/dist/commands/setup.d.ts +20 -0
  16. package/dist/commands/setup.d.ts.map +1 -0
  17. package/dist/commands/setup.js +585 -0
  18. package/dist/commands/setup.js.map +1 -0
  19. package/dist/commands/start.d.ts +16 -0
  20. package/dist/commands/start.d.ts.map +1 -0
  21. package/dist/commands/start.js +638 -0
  22. package/dist/commands/start.js.map +1 -0
  23. package/dist/commands/status.d.ts +5 -0
  24. package/dist/commands/status.d.ts.map +1 -0
  25. package/dist/commands/status.js +63 -0
  26. package/dist/commands/status.js.map +1 -0
  27. package/dist/commands/stop.d.ts +5 -0
  28. package/dist/commands/stop.d.ts.map +1 -0
  29. package/dist/commands/stop.js +85 -0
  30. package/dist/commands/stop.js.map +1 -0
  31. package/dist/execution/direct-strategy.d.ts +18 -0
  32. package/dist/execution/direct-strategy.d.ts.map +1 -0
  33. package/dist/execution/direct-strategy.js +156 -0
  34. package/dist/execution/direct-strategy.js.map +1 -0
  35. package/dist/execution/docker-strategy.d.ts +26 -0
  36. package/dist/execution/docker-strategy.d.ts.map +1 -0
  37. package/dist/execution/docker-strategy.js +222 -0
  38. package/dist/execution/docker-strategy.js.map +1 -0
  39. package/dist/execution/index.d.ts +14 -0
  40. package/dist/execution/index.d.ts.map +1 -0
  41. package/dist/execution/index.js +13 -0
  42. package/dist/execution/index.js.map +1 -0
  43. package/dist/execution/kubernetes-exec-strategy.d.ts +23 -0
  44. package/dist/execution/kubernetes-exec-strategy.d.ts.map +1 -0
  45. package/dist/execution/kubernetes-exec-strategy.js +232 -0
  46. package/dist/execution/kubernetes-exec-strategy.js.map +1 -0
  47. package/dist/execution/registry.d.ts +41 -0
  48. package/dist/execution/registry.d.ts.map +1 -0
  49. package/dist/execution/registry.js +84 -0
  50. package/dist/execution/registry.js.map +1 -0
  51. package/dist/execution/slurm-strategy.d.ts +22 -0
  52. package/dist/execution/slurm-strategy.d.ts.map +1 -0
  53. package/dist/execution/slurm-strategy.js +219 -0
  54. package/dist/execution/slurm-strategy.js.map +1 -0
  55. package/dist/execution/types.d.ts +72 -0
  56. package/dist/execution/types.d.ts.map +1 -0
  57. package/dist/execution/types.js +10 -0
  58. package/dist/execution/types.js.map +1 -0
  59. package/dist/index.d.ts +22 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +22 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/lib/api-client.d.ts +35 -0
  64. package/dist/lib/api-client.d.ts.map +1 -0
  65. package/dist/lib/api-client.js +126 -0
  66. package/dist/lib/api-client.js.map +1 -0
  67. package/dist/lib/config.d.ts +174 -0
  68. package/dist/lib/config.d.ts.map +1 -0
  69. package/dist/lib/config.js +399 -0
  70. package/dist/lib/config.js.map +1 -0
  71. package/dist/lib/copy-worktree.d.ts +73 -0
  72. package/dist/lib/copy-worktree.d.ts.map +1 -0
  73. package/dist/lib/copy-worktree.js +374 -0
  74. package/dist/lib/copy-worktree.js.map +1 -0
  75. package/dist/lib/git-pr.d.ts +63 -0
  76. package/dist/lib/git-pr.d.ts.map +1 -0
  77. package/dist/lib/git-pr.js +224 -0
  78. package/dist/lib/git-pr.js.map +1 -0
  79. package/dist/lib/hardware-id.d.ts +25 -0
  80. package/dist/lib/hardware-id.d.ts.map +1 -0
  81. package/dist/lib/hardware-id.js +186 -0
  82. package/dist/lib/hardware-id.js.map +1 -0
  83. package/dist/lib/hpc-context.d.ts +35 -0
  84. package/dist/lib/hpc-context.d.ts.map +1 -0
  85. package/dist/lib/hpc-context.js +167 -0
  86. package/dist/lib/hpc-context.js.map +1 -0
  87. package/dist/lib/prompt-templates.d.ts +195 -0
  88. package/dist/lib/prompt-templates.d.ts.map +1 -0
  89. package/dist/lib/prompt-templates.js +353 -0
  90. package/dist/lib/prompt-templates.js.map +1 -0
  91. package/dist/lib/providers.d.ts +27 -0
  92. package/dist/lib/providers.d.ts.map +1 -0
  93. package/dist/lib/providers.js +372 -0
  94. package/dist/lib/providers.js.map +1 -0
  95. package/dist/lib/repo-context.d.ts +18 -0
  96. package/dist/lib/repo-context.d.ts.map +1 -0
  97. package/dist/lib/repo-context.js +61 -0
  98. package/dist/lib/repo-context.js.map +1 -0
  99. package/dist/lib/repo-utils.d.ts +35 -0
  100. package/dist/lib/repo-utils.d.ts.map +1 -0
  101. package/dist/lib/repo-utils.js +222 -0
  102. package/dist/lib/repo-utils.js.map +1 -0
  103. package/dist/lib/resources.d.ts +17 -0
  104. package/dist/lib/resources.d.ts.map +1 -0
  105. package/dist/lib/resources.js +227 -0
  106. package/dist/lib/resources.js.map +1 -0
  107. package/dist/lib/slurm-detect.d.ts +15 -0
  108. package/dist/lib/slurm-detect.d.ts.map +1 -0
  109. package/dist/lib/slurm-detect.js +148 -0
  110. package/dist/lib/slurm-detect.js.map +1 -0
  111. package/dist/lib/slurm-executor.d.ts +70 -0
  112. package/dist/lib/slurm-executor.d.ts.map +1 -0
  113. package/dist/lib/slurm-executor.js +402 -0
  114. package/dist/lib/slurm-executor.js.map +1 -0
  115. package/dist/lib/slurm-job-monitor.d.ts +52 -0
  116. package/dist/lib/slurm-job-monitor.d.ts.map +1 -0
  117. package/dist/lib/slurm-job-monitor.js +212 -0
  118. package/dist/lib/slurm-job-monitor.js.map +1 -0
  119. package/dist/lib/ssh-discovery.d.ts +17 -0
  120. package/dist/lib/ssh-discovery.d.ts.map +1 -0
  121. package/dist/lib/ssh-discovery.js +287 -0
  122. package/dist/lib/ssh-discovery.js.map +1 -0
  123. package/dist/lib/ssh-installer.d.ts +69 -0
  124. package/dist/lib/ssh-installer.d.ts.map +1 -0
  125. package/dist/lib/ssh-installer.js +230 -0
  126. package/dist/lib/ssh-installer.js.map +1 -0
  127. package/dist/lib/streaming-prompt.d.ts +48 -0
  128. package/dist/lib/streaming-prompt.d.ts.map +1 -0
  129. package/dist/lib/streaming-prompt.js +91 -0
  130. package/dist/lib/streaming-prompt.js.map +1 -0
  131. package/dist/lib/task-executor.d.ts +114 -0
  132. package/dist/lib/task-executor.d.ts.map +1 -0
  133. package/dist/lib/task-executor.js +753 -0
  134. package/dist/lib/task-executor.js.map +1 -0
  135. package/dist/lib/websocket-client.d.ts +200 -0
  136. package/dist/lib/websocket-client.d.ts.map +1 -0
  137. package/dist/lib/websocket-client.js +781 -0
  138. package/dist/lib/websocket-client.js.map +1 -0
  139. package/dist/lib/workdir-safety.d.ts +63 -0
  140. package/dist/lib/workdir-safety.d.ts.map +1 -0
  141. package/dist/lib/workdir-safety.js +247 -0
  142. package/dist/lib/workdir-safety.js.map +1 -0
  143. package/dist/lib/worktree-include.d.ts +14 -0
  144. package/dist/lib/worktree-include.d.ts.map +1 -0
  145. package/dist/lib/worktree-include.js +68 -0
  146. package/dist/lib/worktree-include.js.map +1 -0
  147. package/dist/lib/worktree-setup.d.ts +18 -0
  148. package/dist/lib/worktree-setup.d.ts.map +1 -0
  149. package/dist/lib/worktree-setup.js +60 -0
  150. package/dist/lib/worktree-setup.js.map +1 -0
  151. package/dist/lib/worktree.d.ts +37 -0
  152. package/dist/lib/worktree.d.ts.map +1 -0
  153. package/dist/lib/worktree.js +411 -0
  154. package/dist/lib/worktree.js.map +1 -0
  155. package/dist/mcp/index.d.ts +8 -0
  156. package/dist/mcp/index.d.ts.map +1 -0
  157. package/dist/mcp/index.js +8 -0
  158. package/dist/mcp/index.js.map +1 -0
  159. package/dist/mcp/server.d.ts +45 -0
  160. package/dist/mcp/server.d.ts.map +1 -0
  161. package/dist/mcp/server.js +153 -0
  162. package/dist/mcp/server.js.map +1 -0
  163. package/dist/mcp/session-bridge.d.ts +87 -0
  164. package/dist/mcp/session-bridge.d.ts.map +1 -0
  165. package/dist/mcp/session-bridge.js +317 -0
  166. package/dist/mcp/session-bridge.js.map +1 -0
  167. package/dist/mcp/tools.d.ts +70 -0
  168. package/dist/mcp/tools.d.ts.map +1 -0
  169. package/dist/mcp/tools.js +234 -0
  170. package/dist/mcp/tools.js.map +1 -0
  171. package/dist/mcp/types.d.ts +197 -0
  172. package/dist/mcp/types.d.ts.map +1 -0
  173. package/dist/mcp/types.js +16 -0
  174. package/dist/mcp/types.js.map +1 -0
  175. package/dist/providers/base-adapter.d.ts +56 -0
  176. package/dist/providers/base-adapter.d.ts.map +1 -0
  177. package/dist/providers/base-adapter.js +5 -0
  178. package/dist/providers/base-adapter.js.map +1 -0
  179. package/dist/providers/claude-code-adapter.d.ts +27 -0
  180. package/dist/providers/claude-code-adapter.d.ts.map +1 -0
  181. package/dist/providers/claude-code-adapter.js +298 -0
  182. package/dist/providers/claude-code-adapter.js.map +1 -0
  183. package/dist/providers/claude-sdk-adapter.d.ts +60 -0
  184. package/dist/providers/claude-sdk-adapter.d.ts.map +1 -0
  185. package/dist/providers/claude-sdk-adapter.js +632 -0
  186. package/dist/providers/claude-sdk-adapter.js.map +1 -0
  187. package/dist/providers/codex-adapter.d.ts +21 -0
  188. package/dist/providers/codex-adapter.d.ts.map +1 -0
  189. package/dist/providers/codex-adapter.js +197 -0
  190. package/dist/providers/codex-adapter.js.map +1 -0
  191. package/dist/providers/index.d.ts +26 -0
  192. package/dist/providers/index.d.ts.map +1 -0
  193. package/dist/providers/index.js +58 -0
  194. package/dist/providers/index.js.map +1 -0
  195. package/dist/providers/slurm-adapter.d.ts +26 -0
  196. package/dist/providers/slurm-adapter.d.ts.map +1 -0
  197. package/dist/providers/slurm-adapter.js +146 -0
  198. package/dist/providers/slurm-adapter.js.map +1 -0
  199. package/dist/types.d.ts +592 -0
  200. package/dist/types.d.ts.map +1 -0
  201. package/dist/types.js +5 -0
  202. package/dist/types.js.map +1 -0
  203. 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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"}