@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,230 @@
1
+ /**
2
+ * Remote SSH installation utilities for local dev.
3
+ *
4
+ * Packs the agent-runner locally, SCPs it to the target host,
5
+ * installs via npm, and pushes pre-provisioned tokens so the
6
+ * remote host skips its own device auth entirely.
7
+ */
8
+ import { execFile as execFileCb } from 'node:child_process';
9
+ import { promisify } from 'node:util';
10
+ import { networkInterfaces } from 'node:os';
11
+ import { resolve, dirname } from 'node:path';
12
+ import { fileURLToPath } from 'node:url';
13
+ const execFile = promisify(execFileCb);
14
+ // ============================================================================
15
+ // Network helpers
16
+ // ============================================================================
17
+ /**
18
+ * Detect the LAN IP of this machine so remote hosts can reach the dev server.
19
+ * Returns the first non-internal IPv4 address found.
20
+ */
21
+ export function detectLocalIP() {
22
+ const nets = networkInterfaces();
23
+ for (const ifaces of Object.values(nets)) {
24
+ if (!ifaces)
25
+ continue;
26
+ for (const iface of ifaces) {
27
+ if (iface.family === 'IPv4' && !iface.internal) {
28
+ return iface.address;
29
+ }
30
+ }
31
+ }
32
+ return '127.0.0.1';
33
+ }
34
+ // ============================================================================
35
+ // Remote checks
36
+ // ============================================================================
37
+ /**
38
+ * SSH to a host and check whether Node.js ≥ 18 is available.
39
+ * Returns { available, version } or throws on SSH failure.
40
+ */
41
+ export async function checkRemoteNode(host) {
42
+ try {
43
+ const { stdout } = await sshExec(host, 'node --version');
44
+ const ver = stdout.trim(); // e.g. "v20.11.0"
45
+ const major = parseInt(ver.replace(/^v/, ''), 10);
46
+ return { available: major >= 18, version: ver };
47
+ }
48
+ catch {
49
+ return { available: false, version: null };
50
+ }
51
+ }
52
+ /**
53
+ * Pack the local agent-runner, SCP it to the remote host, install, and configure.
54
+ *
55
+ * Steps:
56
+ * 1. `npm pack` in the agent-runner directory → tarball
57
+ * 2. `scp` tarball to remote ~/
58
+ * 3. `ssh npm install -g <tarball>` on remote
59
+ * 4. `ssh astro-agent setup --non-interactive --skip-auth` on remote
60
+ * 5. Push tokens via `ssh astro-agent config --set` commands
61
+ */
62
+ export async function packAndInstall(opts, onProgress) {
63
+ const { host, apiUrl, relayUrl, accessToken, refreshToken, wsToken, machineId } = opts;
64
+ const log = onProgress ?? (() => { });
65
+ // 1. npm pack
66
+ const agentRunnerDir = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..');
67
+ log('Packing agent-runner...');
68
+ const { stdout: packOut } = await execFile('npm', ['pack', '--pack-destination', '/tmp'], {
69
+ cwd: agentRunnerDir,
70
+ });
71
+ const tarball = `/tmp/${packOut.trim().split('\n').pop()}`;
72
+ // 2. SCP tarball to remote
73
+ log(`Copying to ${host.name}...`);
74
+ const scpArgs = buildScpArgs(host, tarball, '~/astro-agent.tgz');
75
+ await execFile('scp', scpArgs);
76
+ // 3. Install to user-local prefix to avoid EACCES on system dirs
77
+ log(`Installing on ${host.name}...`);
78
+ const npmPrefix = '~/.local';
79
+ await sshExec(host, `mkdir -p ${npmPrefix} && npm install -g --prefix ${npmPrefix} ~/astro-agent.tgz`);
80
+ // 4. Ensure ~/.local/bin is on PATH for this session and future logins
81
+ const binDir = `${npmPrefix}/bin`;
82
+ const pathExport = `export PATH="${binDir}:$PATH"`;
83
+ const pathSetup = [
84
+ `grep -qxF '${pathExport}' ~/.bashrc 2>/dev/null || echo '${pathExport}' >> ~/.bashrc`,
85
+ `grep -qxF '${pathExport}' ~/.profile 2>/dev/null || echo '${pathExport}' >> ~/.profile`,
86
+ ].join(' && ');
87
+ await sshExec(host, pathSetup);
88
+ // 5. Run setup --non-interactive --skip-auth (with binDir on PATH)
89
+ log(`Running setup on ${host.name}...`);
90
+ await sshExec(host, `${pathExport} && astro-agent setup --non-interactive --skip-auth --api ${apiUrl} --relay ${relayUrl}`);
91
+ // 6. Push tokens via stdin to avoid exposing them in ps output
92
+ log(`Configuring tokens on ${host.name}...`);
93
+ const configJson = JSON.stringify({
94
+ apiUrl,
95
+ relayUrl,
96
+ accessToken,
97
+ refreshToken,
98
+ wsToken,
99
+ machineId,
100
+ });
101
+ // Pipe config as JSON via stdin to avoid shell argument exposure on shared machines
102
+ const configCmd = `${pathExport} && cat > /tmp/.astro-config-$$.json && ` +
103
+ `astro-agent config --import /tmp/.astro-config-$$.json && ` +
104
+ `rm -f /tmp/.astro-config-$$.json`;
105
+ const sshArgs = buildSshArgs(host, configCmd);
106
+ const { execFile: execFileCbInner } = await import('node:child_process');
107
+ const child = execFileCbInner('ssh', sshArgs);
108
+ child.stdin?.write(configJson);
109
+ child.stdin?.end();
110
+ await new Promise((resolve, reject) => {
111
+ child.on('close', (code) => code === 0 ? resolve() : reject(new Error(`ssh config push exited with code ${code}`)));
112
+ child.on('error', reject);
113
+ });
114
+ // Clean up remote tarball
115
+ await sshExec(host, 'rm -f ~/astro-agent.tgz').catch(() => { });
116
+ log(`Done — ${host.name} is configured`);
117
+ }
118
+ // ============================================================================
119
+ // SSH / SCP helpers
120
+ // ============================================================================
121
+ export function buildSshArgs(host, command) {
122
+ const args = [];
123
+ if (host.port && host.port !== 22) {
124
+ args.push('-p', String(host.port));
125
+ }
126
+ if (host.identityFile) {
127
+ args.push('-i', host.identityFile);
128
+ }
129
+ if (host.proxyJump) {
130
+ args.push('-J', host.proxyJump);
131
+ }
132
+ // Batch mode to avoid password prompts hanging
133
+ args.push('-o', 'BatchMode=yes', '-o', 'ConnectTimeout=10');
134
+ const target = host.user ? `${host.user}@${host.hostname}` : host.hostname;
135
+ args.push(target, command);
136
+ return args;
137
+ }
138
+ function buildScpArgs(host, localPath, remotePath) {
139
+ const args = [];
140
+ if (host.port && host.port !== 22) {
141
+ args.push('-P', String(host.port));
142
+ }
143
+ if (host.identityFile) {
144
+ args.push('-i', host.identityFile);
145
+ }
146
+ if (host.proxyJump) {
147
+ args.push('-o', `ProxyJump=${host.proxyJump}`);
148
+ }
149
+ args.push('-o', 'BatchMode=yes', '-o', 'ConnectTimeout=10');
150
+ const target = host.user ? `${host.user}@${host.hostname}` : host.hostname;
151
+ args.push(localPath, `${target}:${remotePath}`);
152
+ return args;
153
+ }
154
+ export async function sshExec(host, command) {
155
+ const args = buildSshArgs(host, command);
156
+ return execFile('ssh', args, { timeout: 60_000 });
157
+ }
158
+ /**
159
+ * Start agent runners on remote hosts.
160
+ *
161
+ * For each host:
162
+ * 1. Check if an agent is already running (pgrep)
163
+ * 2. Start via nohup + disown
164
+ * 3. Verify after 2s with pgrep
165
+ *
166
+ * One failure does not block others.
167
+ */
168
+ export async function startRemoteAgents(hosts, options = {}, onProgress) {
169
+ const results = [];
170
+ const log = (host, msg) => onProgress?.(host, msg);
171
+ for (const host of hosts) {
172
+ log(host.name, 'Checking for running agent...');
173
+ // 1. Check if already running
174
+ try {
175
+ const { stdout } = await sshExec(host, 'pgrep -f "astro-agent start"');
176
+ if (stdout.trim()) {
177
+ log(host.name, 'Agent already running');
178
+ results.push({ host, success: true, message: 'Already running', alreadyRunning: true });
179
+ continue;
180
+ }
181
+ }
182
+ catch {
183
+ // pgrep returns exit code 1 when no match — that's fine
184
+ }
185
+ // 2. Build start command with forwarded options
186
+ const binDir = '~/.local/bin';
187
+ const pathExport = `export PATH="${binDir}:$PATH"`;
188
+ const flags = ['--foreground'];
189
+ if (options.maxTasks)
190
+ flags.push(`--max-tasks ${options.maxTasks}`);
191
+ if (options.logLevel)
192
+ flags.push(`--log-level ${options.logLevel}`);
193
+ if (options.preserveWorktrees)
194
+ flags.push('--preserve-worktrees');
195
+ const startCmd = `astro-agent start ${flags.join(' ')}`;
196
+ log(host.name, 'Starting agent...');
197
+ try {
198
+ await sshExec(host, `${pathExport} && mkdir -p ~/.astro/logs && nohup ${startCmd} > ~/.astro/logs/agent-runner.log 2>&1 & disown`);
199
+ }
200
+ catch (err) {
201
+ const msg = err instanceof Error ? err.message : String(err);
202
+ results.push({ host, success: false, message: `Failed to start: ${msg}` });
203
+ continue;
204
+ }
205
+ // 3. Verify after 2s
206
+ await new Promise((r) => setTimeout(r, 2000));
207
+ try {
208
+ const { stdout } = await sshExec(host, 'pgrep -f "astro-agent start"');
209
+ if (stdout.trim()) {
210
+ log(host.name, 'Agent started successfully');
211
+ results.push({ host, success: true, message: 'Started' });
212
+ }
213
+ else {
214
+ // Fallback: check log tail
215
+ try {
216
+ const { stdout: logTail } = await sshExec(host, 'tail -5 ~/.astro/logs/agent-runner.log 2>/dev/null');
217
+ results.push({ host, success: false, message: `Process not found after start. Log tail:\n${logTail}` });
218
+ }
219
+ catch {
220
+ results.push({ host, success: false, message: 'Process not found after start (no logs available)' });
221
+ }
222
+ }
223
+ }
224
+ catch {
225
+ results.push({ host, success: false, message: 'Could not verify agent start (pgrep failed)' });
226
+ }
227
+ }
228
+ return results;
229
+ }
230
+ //# sourceMappingURL=ssh-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh-installer.js","sourceRoot":"","sources":["../../src/lib/ssh-installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * StreamingPrompt - Async iterator queue for injecting messages into a running SDK session.
3
+ *
4
+ * Ported from Cyrus's StreamingPrompt pattern. Enables mid-execution steering
5
+ * by allowing new user messages to be pushed into a running `query()` call.
6
+ *
7
+ * Usage:
8
+ * const prompt = new StreamingPrompt('initial task prompt');
9
+ * const gen = query({ prompt, options });
10
+ * // Later, inject a steer message:
11
+ * prompt.addMessage('Please also fix the tests');
12
+ * // When done:
13
+ * prompt.complete();
14
+ */
15
+ interface SDKUserMessage {
16
+ role: 'user';
17
+ content: string;
18
+ }
19
+ export declare class StreamingPrompt {
20
+ private queue;
21
+ private resolve;
22
+ private done;
23
+ private sessionId?;
24
+ constructor(initialPrompt: string);
25
+ /**
26
+ * Add a new user message to the running session.
27
+ * The SDK will pick this up as the next turn's input.
28
+ */
29
+ addMessage(content: string): void;
30
+ /**
31
+ * Signal that no more messages will be sent.
32
+ */
33
+ complete(): void;
34
+ /**
35
+ * Update the session ID (called after first SDK init message).
36
+ */
37
+ updateSessionId(id: string): void;
38
+ /**
39
+ * Get the current session ID.
40
+ */
41
+ getSessionId(): string | undefined;
42
+ /**
43
+ * Async iterator protocol — used by the SDK's `query()` to consume messages.
44
+ */
45
+ [Symbol.asyncIterator](): AsyncIterator<SDKUserMessage>;
46
+ }
47
+ export {};
48
+ //# sourceMappingURL=streaming-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-prompt.d.ts","sourceRoot":"","sources":["../../src/lib/streaming-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,OAAO,CAAmE;IAClF,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAC,CAAS;gBAEf,aAAa,EAAE,MAAM;IAOjC;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAgBjC;;OAEG;IACH,QAAQ,IAAI,IAAI;IAShB;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIjC;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,SAAS;IAIlC;;OAEG;IACH,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,cAAc,CAAC;CAqBxD"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * StreamingPrompt - Async iterator queue for injecting messages into a running SDK session.
3
+ *
4
+ * Ported from Cyrus's StreamingPrompt pattern. Enables mid-execution steering
5
+ * by allowing new user messages to be pushed into a running `query()` call.
6
+ *
7
+ * Usage:
8
+ * const prompt = new StreamingPrompt('initial task prompt');
9
+ * const gen = query({ prompt, options });
10
+ * // Later, inject a steer message:
11
+ * prompt.addMessage('Please also fix the tests');
12
+ * // When done:
13
+ * prompt.complete();
14
+ */
15
+ export class StreamingPrompt {
16
+ queue = [];
17
+ resolve = null;
18
+ done = false;
19
+ sessionId;
20
+ constructor(initialPrompt) {
21
+ // Seed the queue with the initial prompt as the first user message
22
+ this.queue.push({
23
+ value: { role: 'user', content: initialPrompt },
24
+ });
25
+ }
26
+ /**
27
+ * Add a new user message to the running session.
28
+ * The SDK will pick this up as the next turn's input.
29
+ */
30
+ addMessage(content) {
31
+ if (this.done)
32
+ return;
33
+ const message = { role: 'user', content };
34
+ if (this.resolve) {
35
+ // Consumer is waiting — deliver immediately
36
+ const r = this.resolve;
37
+ this.resolve = null;
38
+ r({ value: message, done: false });
39
+ }
40
+ else {
41
+ // Consumer hasn't asked yet — buffer
42
+ this.queue.push({ value: message });
43
+ }
44
+ }
45
+ /**
46
+ * Signal that no more messages will be sent.
47
+ */
48
+ complete() {
49
+ this.done = true;
50
+ if (this.resolve) {
51
+ const r = this.resolve;
52
+ this.resolve = null;
53
+ r({ value: undefined, done: true });
54
+ }
55
+ }
56
+ /**
57
+ * Update the session ID (called after first SDK init message).
58
+ */
59
+ updateSessionId(id) {
60
+ this.sessionId = id;
61
+ }
62
+ /**
63
+ * Get the current session ID.
64
+ */
65
+ getSessionId() {
66
+ return this.sessionId;
67
+ }
68
+ /**
69
+ * Async iterator protocol — used by the SDK's `query()` to consume messages.
70
+ */
71
+ [Symbol.asyncIterator]() {
72
+ return {
73
+ next: () => {
74
+ // If there's buffered data, return it immediately
75
+ if (this.queue.length > 0) {
76
+ const item = this.queue.shift();
77
+ return Promise.resolve({ value: item.value, done: false });
78
+ }
79
+ // If stream is complete, signal done
80
+ if (this.done) {
81
+ return Promise.resolve({ value: undefined, done: true });
82
+ }
83
+ // Otherwise, wait for the next message
84
+ return new Promise((resolve) => {
85
+ this.resolve = resolve;
86
+ });
87
+ },
88
+ };
89
+ }
90
+ }
91
+ //# sourceMappingURL=streaming-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-prompt.js","sourceRoot":"","sources":["../../src/lib/streaming-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAWH,MAAM,OAAO,eAAe;IAClB,KAAK,GAAgB,EAAE,CAAC;IACxB,OAAO,GAA8D,IAAI,CAAC;IAC1E,IAAI,GAAG,KAAK,CAAC;IACb,SAAS,CAAU;IAE3B,YAAY,aAAqB;QAC/B,mEAAmE;QACnE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACd,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE;SAChD,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,OAAe;QACxB,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO;QAEtB,MAAM,OAAO,GAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAE1D,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,4CAA4C;YAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,qCAAqC;YACrC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,CAAC,CAAC,EAAE,KAAK,EAAE,SAAsC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,EAAU;QACxB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,CAAC,MAAM,CAAC,aAAa,CAAC;QACpB,OAAO;YACL,IAAI,EAAE,GAA4C,EAAE;gBAClD,kDAAkD;gBAClD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC;oBACjC,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC7D,CAAC;gBAED,qCAAqC;gBACrC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAsC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxF,CAAC;gBAED,uCAAuC;gBACvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;gBACzB,CAAC,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Task executor with multiplexing support
3
+ *
4
+ * Handles concurrent task execution, routing to providers,
5
+ * and streaming output back over WebSocket
6
+ */
7
+ import type { Task } from '../types.js';
8
+ import type { WebSocketClient } from './websocket-client.js';
9
+ export interface TaskExecutorOptions {
10
+ wsClient: WebSocketClient;
11
+ maxConcurrentTasks?: number;
12
+ defaultTimeout?: number;
13
+ useWorktree?: boolean;
14
+ worktreeRoot?: string;
15
+ preserveWorktrees?: boolean;
16
+ allowNonGit?: boolean;
17
+ useSandbox?: boolean;
18
+ maxSandboxSize?: number;
19
+ }
20
+ export declare class TaskExecutor {
21
+ private wsClient;
22
+ private runningTasks;
23
+ private taskQueue;
24
+ private maxConcurrentTasks;
25
+ private defaultTimeout;
26
+ private adapters;
27
+ private useWorktree;
28
+ private worktreeRoot?;
29
+ private preserveWorktrees;
30
+ private jobMonitor;
31
+ private allowNonGit;
32
+ private useSandbox;
33
+ private maxSandboxSize;
34
+ private gitAvailable;
35
+ private tasksByDirectory;
36
+ private pendingSafetyChecks;
37
+ constructor(options: TaskExecutorOptions);
38
+ /**
39
+ * Submit a task for execution (with safety checks)
40
+ */
41
+ submitTask(task: Task): Promise<void>;
42
+ /**
43
+ * Handle safety decision from user (via server)
44
+ */
45
+ handleSafetyDecision(taskId: string, decision: 'proceed' | 'init-git' | 'sandbox' | 'cancel'): Promise<void>;
46
+ /**
47
+ * Cancel a running or queued task
48
+ */
49
+ cancelTask(taskId: string): boolean;
50
+ /**
51
+ * Get current task counts
52
+ */
53
+ getTaskCounts(): {
54
+ running: number;
55
+ queued: number;
56
+ };
57
+ /**
58
+ * Cancel all tasks and clear queue
59
+ */
60
+ cancelAll(): void;
61
+ /**
62
+ * Update max concurrent tasks
63
+ */
64
+ setMaxConcurrentTasks(max: number): void;
65
+ /**
66
+ * Steer a running task by injecting a message into the agent session.
67
+ * When interrupt=true, interrupts the current turn before injecting.
68
+ *
69
+ * For completed tasks with a preserved session, this triggers a full
70
+ * resume via the SDK's `resume` option for post-completion follow-up.
71
+ */
72
+ steerTask(taskId: string, message: string, interrupt?: boolean): Promise<{
73
+ accepted: boolean;
74
+ reason?: string;
75
+ }>;
76
+ /**
77
+ * Find the ClaudeSdkAdapter that has a preserved session for the given task.
78
+ */
79
+ private findAdapterWithSession;
80
+ /**
81
+ * Resume a completed task session for post-completion steering.
82
+ * Runs in the background, streaming output back through the WebSocket.
83
+ */
84
+ private resumeCompletedTask;
85
+ /**
86
+ * Perform safety check on working directory
87
+ */
88
+ private performSafetyCheck;
89
+ /**
90
+ * Request safety decision from user
91
+ */
92
+ private requestSafetyDecision;
93
+ /**
94
+ * Initialize git repository in a directory
95
+ */
96
+ private initializeGit;
97
+ /**
98
+ * Track task by directory for parallel execution safety
99
+ */
100
+ private trackTaskDirectory;
101
+ /**
102
+ * Untrack task from directory
103
+ */
104
+ private untrackTaskDirectory;
105
+ /**
106
+ * Get count of active tasks in a directory
107
+ */
108
+ private getActiveTasksInDirectory;
109
+ private executeTask;
110
+ private prepareTaskWorkspace;
111
+ private getAdapter;
112
+ private processQueue;
113
+ }
114
+ //# sourceMappingURL=task-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-executor.d.ts","sourceRoot":"","sources":["../../src/lib/task-executor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAA4B,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AA6B7D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,eAAe,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAiD;IACjE,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,YAAY,CAAkB;IAGtC,OAAO,CAAC,gBAAgB,CAAuC;IAC/D,OAAO,CAAC,mBAAmB,CAA8C;gBAE7D,OAAO,EAAE,mBAAmB;IAqBxC;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA8C3C;;OAEG;IACG,oBAAoB,CACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GACtD,OAAO,CAAC,IAAI,CAAC;IAWhB;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAuBnC;;OAEG;IACH,aAAa,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAOpD;;OAEG;IACH,SAAS,IAAI,IAAI;IA0BjB;;OAEG;IACH,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAMxC;;;;;;OAMG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,UAAQ,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA6BpH;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;;OAGG;YACW,mBAAmB;IA2EjC;;OAEG;YACW,kBAAkB;IAKhC;;OAEG;YACW,qBAAqB;IA8FnC;;OAEG;YACW,aAAa;IAU3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAM1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;OAEG;IACH,OAAO,CAAC,yBAAyB;YAKnB,WAAW;YA4OX,oBAAoB;YAkEpB,UAAU;IA6BxB,OAAO,CAAC,YAAY;CAUrB"}