agent-relay 0.1.0 → 1.0.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/README.md +56 -730
- package/dist/cli/index.d.ts +6 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +109 -1521
- package/dist/cli/index.js.map +1 -1
- package/dist/daemon/server.d.ts +8 -1
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +23 -7
- package/dist/daemon/server.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/storage/adapter.d.ts +43 -0
- package/dist/storage/adapter.d.ts.map +1 -1
- package/dist/storage/adapter.js +105 -1
- package/dist/storage/adapter.js.map +1 -1
- package/dist/storage/sqlite-adapter.d.ts +1 -0
- package/dist/storage/sqlite-adapter.d.ts.map +1 -1
- package/dist/storage/sqlite-adapter.js +26 -0
- package/dist/storage/sqlite-adapter.js.map +1 -1
- package/dist/utils/project-namespace.d.ts +46 -0
- package/dist/utils/project-namespace.d.ts.map +1 -0
- package/dist/utils/project-namespace.js +111 -0
- package/dist/utils/project-namespace.js.map +1 -0
- package/dist/wrapper/client.d.ts +1 -1
- package/dist/wrapper/client.d.ts.map +1 -1
- package/dist/wrapper/client.js +1 -1
- package/dist/wrapper/client.js.map +1 -1
- package/dist/wrapper/index.d.ts +0 -1
- package/dist/wrapper/index.d.ts.map +1 -1
- package/dist/wrapper/index.js +2 -3
- package/dist/wrapper/index.js.map +1 -1
- package/dist/wrapper/tmux-wrapper.d.ts +5 -0
- package/dist/wrapper/tmux-wrapper.d.ts.map +1 -1
- package/dist/wrapper/tmux-wrapper.js +94 -19
- package/dist/wrapper/tmux-wrapper.js.map +1 -1
- package/docs/AGENTS.md +386 -0
- package/docs/CLI-SIMPLIFICATION-COMPLETE.md +48 -0
- package/docs/CONTRIBUTING.md +151 -0
- package/docs/TMUX_IMPLEMENTATION_NOTES.md +364 -0
- package/docs/removable-code-analysis.md +24 -0
- package/install.sh +10 -2
- package/package.json +3 -4
- package/dist/games/index.d.ts +0 -2
- package/dist/games/index.d.ts.map +0 -1
- package/dist/games/index.js +0 -2
- package/dist/games/index.js.map +0 -1
- package/dist/games/tictactoe.d.ts +0 -24
- package/dist/games/tictactoe.d.ts.map +0 -1
- package/dist/games/tictactoe.js +0 -160
- package/dist/games/tictactoe.js.map +0 -1
- package/dist/supervisor/inbox.d.ts +0 -38
- package/dist/supervisor/inbox.d.ts.map +0 -1
- package/dist/supervisor/inbox.js +0 -162
- package/dist/supervisor/inbox.js.map +0 -1
- package/dist/supervisor/index.d.ts +0 -10
- package/dist/supervisor/index.d.ts.map +0 -1
- package/dist/supervisor/index.js +0 -10
- package/dist/supervisor/index.js.map +0 -1
- package/dist/supervisor/spawner.d.ts +0 -54
- package/dist/supervisor/spawner.d.ts.map +0 -1
- package/dist/supervisor/spawner.js +0 -282
- package/dist/supervisor/spawner.js.map +0 -1
- package/dist/supervisor/state.d.ts +0 -132
- package/dist/supervisor/state.d.ts.map +0 -1
- package/dist/supervisor/state.js +0 -465
- package/dist/supervisor/state.js.map +0 -1
- package/dist/supervisor/supervisor.d.ts +0 -67
- package/dist/supervisor/supervisor.d.ts.map +0 -1
- package/dist/supervisor/supervisor.js +0 -263
- package/dist/supervisor/supervisor.js.map +0 -1
- package/dist/supervisor/types.d.ts +0 -139
- package/dist/supervisor/types.d.ts.map +0 -1
- package/dist/supervisor/types.js +0 -12
- package/dist/supervisor/types.js.map +0 -1
- package/dist/webhook/spawner.d.ts +0 -79
- package/dist/webhook/spawner.d.ts.map +0 -1
- package/dist/webhook/spawner.js +0 -288
- package/dist/webhook/spawner.js.map +0 -1
- package/dist/wrapper/pty-wrapper.d.ts +0 -125
- package/dist/wrapper/pty-wrapper.d.ts.map +0 -1
- package/dist/wrapper/pty-wrapper.js +0 -494
- package/dist/wrapper/pty-wrapper.js.map +0 -1
- /package/{CHANGELOG.md → docs/CHANGELOG.md} +0 -0
- /package/{PROTOCOL.md → docs/PROTOCOL.md} +0 -0
package/dist/webhook/spawner.js
DELETED
|
@@ -1,288 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Webhook Spawner - Spawns agent CLIs when messages arrive
|
|
3
|
-
*
|
|
4
|
-
* Supports: claude, codex, gemini, cursor
|
|
5
|
-
*/
|
|
6
|
-
import { spawn } from 'child_process';
|
|
7
|
-
import * as fs from 'fs';
|
|
8
|
-
import * as path from 'path';
|
|
9
|
-
import * as chokidar from 'chokidar';
|
|
10
|
-
/**
|
|
11
|
-
* Get the spawn command for a CLI type
|
|
12
|
-
*/
|
|
13
|
-
function getSpawnCommand(cli) {
|
|
14
|
-
switch (cli.toLowerCase()) {
|
|
15
|
-
case 'claude':
|
|
16
|
-
return { cmd: 'claude', args: ['--dangerously-skip-permissions'] };
|
|
17
|
-
case 'codex':
|
|
18
|
-
return { cmd: 'codex', args: [] };
|
|
19
|
-
case 'gemini':
|
|
20
|
-
return { cmd: 'gemini', args: [] };
|
|
21
|
-
case 'cursor':
|
|
22
|
-
return { cmd: 'cursor', args: ['--cli'] };
|
|
23
|
-
default:
|
|
24
|
-
return { cmd: cli, args: [] };
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Spawn an agent CLI to check their inbox
|
|
29
|
-
*/
|
|
30
|
-
export function spawnAgent(config) {
|
|
31
|
-
const { cmd, args } = getSpawnCommand(config.cli);
|
|
32
|
-
const instructionsPath = path.join(config.dataDir, config.name, 'INSTRUCTIONS.md');
|
|
33
|
-
// Create a prompt that tells the agent to check inbox
|
|
34
|
-
const prompt = `You have new messages! Read ${instructionsPath} and check your inbox immediately using the team-check command. Respond to any messages, then continue your work loop.`;
|
|
35
|
-
try {
|
|
36
|
-
const child = spawn(cmd, [...args, '-p', prompt], {
|
|
37
|
-
cwd: config.projectDir,
|
|
38
|
-
stdio: 'inherit',
|
|
39
|
-
detached: true,
|
|
40
|
-
});
|
|
41
|
-
child.unref();
|
|
42
|
-
return {
|
|
43
|
-
agent: config.name,
|
|
44
|
-
pid: child.pid,
|
|
45
|
-
success: true,
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
catch (error) {
|
|
49
|
-
return {
|
|
50
|
-
agent: config.name,
|
|
51
|
-
success: false,
|
|
52
|
-
error: error instanceof Error ? error.message : String(error),
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Spawn agent in background and capture output
|
|
58
|
-
*/
|
|
59
|
-
export function spawnAgentBackground(config, onOutput, onExit) {
|
|
60
|
-
const { cmd, args } = getSpawnCommand(config.cli);
|
|
61
|
-
const instructionsPath = path.join(config.dataDir, config.name, 'INSTRUCTIONS.md');
|
|
62
|
-
const prompt = `You have new messages! Read ${instructionsPath} and check your inbox using team-check --no-wait. Respond to messages, do one task step, broadcast status, then exit.`;
|
|
63
|
-
try {
|
|
64
|
-
const child = spawn(cmd, [...args, '-p', prompt], {
|
|
65
|
-
cwd: config.projectDir,
|
|
66
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
67
|
-
});
|
|
68
|
-
if (onOutput) {
|
|
69
|
-
child.stdout?.on('data', (data) => onOutput(data.toString()));
|
|
70
|
-
child.stderr?.on('data', (data) => onOutput(data.toString()));
|
|
71
|
-
}
|
|
72
|
-
if (onExit) {
|
|
73
|
-
child.on('exit', onExit);
|
|
74
|
-
}
|
|
75
|
-
return child;
|
|
76
|
-
}
|
|
77
|
-
catch (error) {
|
|
78
|
-
console.error(`Failed to spawn ${config.name}:`, error);
|
|
79
|
-
return null;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Watch for inbox changes and spawn agents
|
|
84
|
-
*/
|
|
85
|
-
export class InboxWatcher {
|
|
86
|
-
watcher = null;
|
|
87
|
-
agents = new Map();
|
|
88
|
-
activeAgents = new Map();
|
|
89
|
-
debounceTimers = new Map();
|
|
90
|
-
dataDir;
|
|
91
|
-
debounceMs;
|
|
92
|
-
constructor(dataDir, debounceMs = 2000) {
|
|
93
|
-
this.dataDir = dataDir;
|
|
94
|
-
this.debounceMs = debounceMs;
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Register an agent to watch
|
|
98
|
-
*/
|
|
99
|
-
registerAgent(config) {
|
|
100
|
-
this.agents.set(config.name, { ...config, enabled: config.enabled ?? true });
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Load agents from team.json
|
|
104
|
-
*/
|
|
105
|
-
loadFromTeamConfig() {
|
|
106
|
-
const configPath = path.join(this.dataDir, 'team.json');
|
|
107
|
-
if (!fs.existsSync(configPath)) {
|
|
108
|
-
throw new Error(`Team config not found: ${configPath}`);
|
|
109
|
-
}
|
|
110
|
-
const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
111
|
-
for (const agent of config.agents) {
|
|
112
|
-
this.registerAgent({
|
|
113
|
-
name: agent.name,
|
|
114
|
-
cli: agent.cli,
|
|
115
|
-
projectDir: config.projectDir,
|
|
116
|
-
dataDir: this.dataDir,
|
|
117
|
-
enabled: agent.webhook !== false, // enabled by default
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Start watching for inbox changes
|
|
123
|
-
*/
|
|
124
|
-
start(onSpawn) {
|
|
125
|
-
const inboxPattern = path.join(this.dataDir, '*/inbox.md');
|
|
126
|
-
this.watcher = chokidar.watch(inboxPattern, {
|
|
127
|
-
persistent: true,
|
|
128
|
-
ignoreInitial: true,
|
|
129
|
-
awaitWriteFinish: {
|
|
130
|
-
stabilityThreshold: 500,
|
|
131
|
-
pollInterval: 100,
|
|
132
|
-
},
|
|
133
|
-
});
|
|
134
|
-
this.watcher.on('change', (filePath) => {
|
|
135
|
-
const agentName = path.basename(path.dirname(filePath));
|
|
136
|
-
this.handleInboxChange(agentName, onSpawn);
|
|
137
|
-
});
|
|
138
|
-
this.watcher.on('add', (filePath) => {
|
|
139
|
-
const agentName = path.basename(path.dirname(filePath));
|
|
140
|
-
// Only trigger if file has content
|
|
141
|
-
const stats = fs.statSync(filePath);
|
|
142
|
-
if (stats.size > 0) {
|
|
143
|
-
this.handleInboxChange(agentName, onSpawn);
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
console.log(`Watching for inbox changes in ${this.dataDir}`);
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Handle inbox change with debouncing
|
|
150
|
-
*/
|
|
151
|
-
handleInboxChange(agentName, onSpawn) {
|
|
152
|
-
const agent = this.agents.get(agentName);
|
|
153
|
-
if (!agent || !agent.enabled) {
|
|
154
|
-
return;
|
|
155
|
-
}
|
|
156
|
-
// Check if agent is already active
|
|
157
|
-
if (this.activeAgents.has(agentName)) {
|
|
158
|
-
console.log(`${agentName} already active, skipping spawn`);
|
|
159
|
-
return;
|
|
160
|
-
}
|
|
161
|
-
// Check if inbox actually has content
|
|
162
|
-
const inboxPath = path.join(this.dataDir, agentName, 'inbox.md');
|
|
163
|
-
if (!fs.existsSync(inboxPath) || fs.statSync(inboxPath).size === 0) {
|
|
164
|
-
return;
|
|
165
|
-
}
|
|
166
|
-
// Debounce rapid changes
|
|
167
|
-
const existingTimer = this.debounceTimers.get(agentName);
|
|
168
|
-
if (existingTimer) {
|
|
169
|
-
clearTimeout(existingTimer);
|
|
170
|
-
}
|
|
171
|
-
const timer = setTimeout(() => {
|
|
172
|
-
this.debounceTimers.delete(agentName);
|
|
173
|
-
this.spawnForAgent(agentName, onSpawn);
|
|
174
|
-
}, this.debounceMs);
|
|
175
|
-
this.debounceTimers.set(agentName, timer);
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Spawn agent and track it
|
|
179
|
-
*/
|
|
180
|
-
spawnForAgent(agentName, onSpawn) {
|
|
181
|
-
const agent = this.agents.get(agentName);
|
|
182
|
-
if (!agent)
|
|
183
|
-
return;
|
|
184
|
-
console.log(`Spawning ${agentName} (${agent.cli})...`);
|
|
185
|
-
const child = spawnAgentBackground(agent, (output) => {
|
|
186
|
-
process.stdout.write(`[${agentName}] ${output}`);
|
|
187
|
-
}, (code) => {
|
|
188
|
-
console.log(`${agentName} exited with code ${code}`);
|
|
189
|
-
this.activeAgents.delete(agentName);
|
|
190
|
-
});
|
|
191
|
-
if (child) {
|
|
192
|
-
this.activeAgents.set(agentName, child);
|
|
193
|
-
onSpawn?.({
|
|
194
|
-
agent: agentName,
|
|
195
|
-
pid: child.pid,
|
|
196
|
-
success: true,
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
else {
|
|
200
|
-
onSpawn?.({
|
|
201
|
-
agent: agentName,
|
|
202
|
-
success: false,
|
|
203
|
-
error: 'Failed to spawn',
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* Stop watching
|
|
209
|
-
*/
|
|
210
|
-
stop() {
|
|
211
|
-
this.watcher?.close();
|
|
212
|
-
this.watcher = null;
|
|
213
|
-
// Clear all debounce timers
|
|
214
|
-
for (const timer of this.debounceTimers.values()) {
|
|
215
|
-
clearTimeout(timer);
|
|
216
|
-
}
|
|
217
|
-
this.debounceTimers.clear();
|
|
218
|
-
// Kill active agents
|
|
219
|
-
for (const [name, child] of this.activeAgents) {
|
|
220
|
-
console.log(`Stopping ${name}...`);
|
|
221
|
-
child.kill();
|
|
222
|
-
}
|
|
223
|
-
this.activeAgents.clear();
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Get status of all agents
|
|
227
|
-
*/
|
|
228
|
-
getStatus() {
|
|
229
|
-
return Array.from(this.agents.values()).map((agent) => ({
|
|
230
|
-
name: agent.name,
|
|
231
|
-
enabled: agent.enabled ?? true,
|
|
232
|
-
active: this.activeAgents.has(agent.name),
|
|
233
|
-
}));
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Trigger webhook for a specific agent (called after team-send)
|
|
238
|
-
*/
|
|
239
|
-
export async function triggerWebhook(agentName, dataDir, options) {
|
|
240
|
-
const configPath = path.join(dataDir, 'team.json');
|
|
241
|
-
if (!fs.existsSync(configPath)) {
|
|
242
|
-
return { agent: agentName, success: false, error: 'Team config not found' };
|
|
243
|
-
}
|
|
244
|
-
const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
245
|
-
const agent = config.agents.find((a) => a.name === agentName);
|
|
246
|
-
if (!agent) {
|
|
247
|
-
return { agent: agentName, success: false, error: 'Agent not found' };
|
|
248
|
-
}
|
|
249
|
-
// HTTP webhook if configured
|
|
250
|
-
if (options?.http || agent.webhookUrl) {
|
|
251
|
-
const url = options?.http || agent.webhookUrl;
|
|
252
|
-
try {
|
|
253
|
-
const response = await fetch(url, {
|
|
254
|
-
method: 'POST',
|
|
255
|
-
headers: { 'Content-Type': 'application/json' },
|
|
256
|
-
body: JSON.stringify({
|
|
257
|
-
agent: agentName,
|
|
258
|
-
event: 'new_message',
|
|
259
|
-
timestamp: new Date().toISOString(),
|
|
260
|
-
inboxPath: path.join(dataDir, agentName, 'inbox.md'),
|
|
261
|
-
}),
|
|
262
|
-
});
|
|
263
|
-
return {
|
|
264
|
-
agent: agentName,
|
|
265
|
-
success: response.ok,
|
|
266
|
-
error: response.ok ? undefined : `HTTP ${response.status}`,
|
|
267
|
-
};
|
|
268
|
-
}
|
|
269
|
-
catch (error) {
|
|
270
|
-
return {
|
|
271
|
-
agent: agentName,
|
|
272
|
-
success: false,
|
|
273
|
-
error: error instanceof Error ? error.message : String(error),
|
|
274
|
-
};
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
// Spawn CLI if requested
|
|
278
|
-
if (options?.spawn !== false) {
|
|
279
|
-
return spawnAgent({
|
|
280
|
-
name: agentName,
|
|
281
|
-
cli: agent.cli,
|
|
282
|
-
projectDir: config.projectDir,
|
|
283
|
-
dataDir,
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
|
-
return { agent: agentName, success: true };
|
|
287
|
-
}
|
|
288
|
-
//# sourceMappingURL=spawner.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spawner.js","sourceRoot":"","sources":["../../src/webhook/spawner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PTY Wrapper
|
|
3
|
-
* Wraps an agent CLI command in a pseudo-terminal and intercepts
|
|
4
|
-
* relay commands from output while injecting incoming messages.
|
|
5
|
-
*/
|
|
6
|
-
export interface WrapperConfig {
|
|
7
|
-
name: string;
|
|
8
|
-
command: string;
|
|
9
|
-
args?: string[];
|
|
10
|
-
socketPath?: string;
|
|
11
|
-
cols?: number;
|
|
12
|
-
rows?: number;
|
|
13
|
-
cwd?: string;
|
|
14
|
-
env?: Record<string, string>;
|
|
15
|
-
/** Raw mode - bypass all parsing for terminal-heavy CLIs */
|
|
16
|
-
raw?: boolean;
|
|
17
|
-
/** Use tmux for message injection (more reliable) */
|
|
18
|
-
useTmux?: boolean;
|
|
19
|
-
/** Use osascript for OS-level keyboard simulation (macOS only) */
|
|
20
|
-
useOsascript?: boolean;
|
|
21
|
-
/** Use file-based inbox instead of stdin injection */
|
|
22
|
-
useInbox?: boolean;
|
|
23
|
-
/** Custom inbox directory */
|
|
24
|
-
inboxDir?: string;
|
|
25
|
-
}
|
|
26
|
-
export declare class PtyWrapper {
|
|
27
|
-
private config;
|
|
28
|
-
private ptyProcess?;
|
|
29
|
-
private client;
|
|
30
|
-
private parser;
|
|
31
|
-
private inbox?;
|
|
32
|
-
private running;
|
|
33
|
-
private lastOutputTime;
|
|
34
|
-
private messageQueue;
|
|
35
|
-
private processingMessage;
|
|
36
|
-
private recentlySentMessages;
|
|
37
|
-
private tmuxSessionName?;
|
|
38
|
-
private pendingRelayMessages;
|
|
39
|
-
private outputBuffer;
|
|
40
|
-
private lastOutputFlush;
|
|
41
|
-
constructor(config: WrapperConfig);
|
|
42
|
-
/**
|
|
43
|
-
* Start the wrapped agent process.
|
|
44
|
-
*/
|
|
45
|
-
start(): Promise<void>;
|
|
46
|
-
/**
|
|
47
|
-
* Start with tmux for message injection.
|
|
48
|
-
*/
|
|
49
|
-
private startWithTmux;
|
|
50
|
-
/**
|
|
51
|
-
* Start directly without tmux.
|
|
52
|
-
*/
|
|
53
|
-
private startDirect;
|
|
54
|
-
/**
|
|
55
|
-
* Set up PTY event handlers.
|
|
56
|
-
*/
|
|
57
|
-
private setupPtyHandlers;
|
|
58
|
-
/**
|
|
59
|
-
* Stop the wrapped process.
|
|
60
|
-
*/
|
|
61
|
-
stop(): void;
|
|
62
|
-
/**
|
|
63
|
-
* Handle output from the PTY process.
|
|
64
|
-
*/
|
|
65
|
-
private handlePtyOutput;
|
|
66
|
-
/**
|
|
67
|
-
* Schedule message injection after output settles.
|
|
68
|
-
* We inject messages when there's been a pause in output (tool finished).
|
|
69
|
-
*/
|
|
70
|
-
private scheduleMessageInjection;
|
|
71
|
-
/**
|
|
72
|
-
* Inject pending relay messages into the output stream.
|
|
73
|
-
* Claude will see these as part of the terminal output.
|
|
74
|
-
* Then send a minimal trigger to stdin to prompt processing.
|
|
75
|
-
*/
|
|
76
|
-
private injectPendingMessages;
|
|
77
|
-
/**
|
|
78
|
-
* Send a parsed relay command to the daemon.
|
|
79
|
-
* Includes deduplication to prevent sending the same message multiple times.
|
|
80
|
-
*/
|
|
81
|
-
private sendRelayCommand;
|
|
82
|
-
/**
|
|
83
|
-
* Handle incoming message from relay.
|
|
84
|
-
*
|
|
85
|
-
* Strategy:
|
|
86
|
-
* - Always show notification in terminal (real-time visual cue)
|
|
87
|
-
* - If inbox mode: also write to inbox file (for hook polling)
|
|
88
|
-
* - No stdin injection (unreliable after a few rounds)
|
|
89
|
-
*/
|
|
90
|
-
private handleIncomingMessage;
|
|
91
|
-
/**
|
|
92
|
-
* Process the next message in the queue when Claude is idle.
|
|
93
|
-
*/
|
|
94
|
-
private processNextMessage;
|
|
95
|
-
/**
|
|
96
|
-
* Inject message using osascript (macOS keyboard simulation).
|
|
97
|
-
* This sends keystrokes at the OS level to the frontmost application.
|
|
98
|
-
*/
|
|
99
|
-
private injectViaOsascript;
|
|
100
|
-
/**
|
|
101
|
-
* Inject message using tmux send-keys.
|
|
102
|
-
*/
|
|
103
|
-
private injectViaTmux;
|
|
104
|
-
/**
|
|
105
|
-
* Inject message using direct PTY write.
|
|
106
|
-
*/
|
|
107
|
-
private injectViaPty;
|
|
108
|
-
/**
|
|
109
|
-
* Wait until Claude has been idle (no output) for a period.
|
|
110
|
-
*/
|
|
111
|
-
private waitForIdle;
|
|
112
|
-
/**
|
|
113
|
-
* Simulate human typing by sending characters one at a time.
|
|
114
|
-
*/
|
|
115
|
-
private simulateTyping;
|
|
116
|
-
/**
|
|
117
|
-
* Check if wrapper is running.
|
|
118
|
-
*/
|
|
119
|
-
get isRunning(): boolean;
|
|
120
|
-
/**
|
|
121
|
-
* Get agent name.
|
|
122
|
-
*/
|
|
123
|
-
get name(): string;
|
|
124
|
-
}
|
|
125
|
-
//# sourceMappingURL=pty-wrapper.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pty-wrapper.d.ts","sourceRoot":"","sources":["../../src/wrapper/pty-wrapper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,4DAA4D;IAC5D,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,qDAAqD;IACrD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kEAAkE;IAClE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAAC,CAAW;IAC9B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,KAAK,CAAC,CAAe;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,YAAY,CAAqD;IACzE,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,oBAAoB,CAAkC;IAC9D,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,oBAAoB,CAA6C;IACzE,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,eAAe,CAAK;gBAEhB,MAAM,EAAE,aAAa;IAiCjC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC5B;;OAEG;YACW,aAAa;IAwC3B;;OAEG;YACW,WAAW;IAkBzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA4CxB;;OAEG;IACH,IAAI,IAAI,IAAI;IAYZ;;OAEG;IACH,OAAO,CAAC,eAAe;IA0BvB;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAahC;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAkC7B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAyBxB;;;;;;;OAOG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA2C1B;;;OAGG;YACW,kBAAkB;IA6BhC;;OAEG;YACW,aAAa;IA2B3B;;OAEG;YACW,YAAY;IAqB1B;;OAEG;IACH,OAAO,CAAC,WAAW;IAkCnB;;OAEG;YACW,cAAc;IAQ5B;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
|