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.
Files changed (86) hide show
  1. package/README.md +56 -730
  2. package/dist/cli/index.d.ts +6 -1
  3. package/dist/cli/index.d.ts.map +1 -1
  4. package/dist/cli/index.js +109 -1521
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/daemon/server.d.ts +8 -1
  7. package/dist/daemon/server.d.ts.map +1 -1
  8. package/dist/daemon/server.js +23 -7
  9. package/dist/daemon/server.js.map +1 -1
  10. package/dist/index.d.ts +0 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +0 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/storage/adapter.d.ts +43 -0
  15. package/dist/storage/adapter.d.ts.map +1 -1
  16. package/dist/storage/adapter.js +105 -1
  17. package/dist/storage/adapter.js.map +1 -1
  18. package/dist/storage/sqlite-adapter.d.ts +1 -0
  19. package/dist/storage/sqlite-adapter.d.ts.map +1 -1
  20. package/dist/storage/sqlite-adapter.js +26 -0
  21. package/dist/storage/sqlite-adapter.js.map +1 -1
  22. package/dist/utils/project-namespace.d.ts +46 -0
  23. package/dist/utils/project-namespace.d.ts.map +1 -0
  24. package/dist/utils/project-namespace.js +111 -0
  25. package/dist/utils/project-namespace.js.map +1 -0
  26. package/dist/wrapper/client.d.ts +1 -1
  27. package/dist/wrapper/client.d.ts.map +1 -1
  28. package/dist/wrapper/client.js +1 -1
  29. package/dist/wrapper/client.js.map +1 -1
  30. package/dist/wrapper/index.d.ts +0 -1
  31. package/dist/wrapper/index.d.ts.map +1 -1
  32. package/dist/wrapper/index.js +2 -3
  33. package/dist/wrapper/index.js.map +1 -1
  34. package/dist/wrapper/tmux-wrapper.d.ts +5 -0
  35. package/dist/wrapper/tmux-wrapper.d.ts.map +1 -1
  36. package/dist/wrapper/tmux-wrapper.js +94 -19
  37. package/dist/wrapper/tmux-wrapper.js.map +1 -1
  38. package/docs/AGENTS.md +386 -0
  39. package/docs/CLI-SIMPLIFICATION-COMPLETE.md +48 -0
  40. package/docs/CONTRIBUTING.md +151 -0
  41. package/docs/TMUX_IMPLEMENTATION_NOTES.md +364 -0
  42. package/docs/removable-code-analysis.md +24 -0
  43. package/install.sh +10 -2
  44. package/package.json +3 -4
  45. package/dist/games/index.d.ts +0 -2
  46. package/dist/games/index.d.ts.map +0 -1
  47. package/dist/games/index.js +0 -2
  48. package/dist/games/index.js.map +0 -1
  49. package/dist/games/tictactoe.d.ts +0 -24
  50. package/dist/games/tictactoe.d.ts.map +0 -1
  51. package/dist/games/tictactoe.js +0 -160
  52. package/dist/games/tictactoe.js.map +0 -1
  53. package/dist/supervisor/inbox.d.ts +0 -38
  54. package/dist/supervisor/inbox.d.ts.map +0 -1
  55. package/dist/supervisor/inbox.js +0 -162
  56. package/dist/supervisor/inbox.js.map +0 -1
  57. package/dist/supervisor/index.d.ts +0 -10
  58. package/dist/supervisor/index.d.ts.map +0 -1
  59. package/dist/supervisor/index.js +0 -10
  60. package/dist/supervisor/index.js.map +0 -1
  61. package/dist/supervisor/spawner.d.ts +0 -54
  62. package/dist/supervisor/spawner.d.ts.map +0 -1
  63. package/dist/supervisor/spawner.js +0 -282
  64. package/dist/supervisor/spawner.js.map +0 -1
  65. package/dist/supervisor/state.d.ts +0 -132
  66. package/dist/supervisor/state.d.ts.map +0 -1
  67. package/dist/supervisor/state.js +0 -465
  68. package/dist/supervisor/state.js.map +0 -1
  69. package/dist/supervisor/supervisor.d.ts +0 -67
  70. package/dist/supervisor/supervisor.d.ts.map +0 -1
  71. package/dist/supervisor/supervisor.js +0 -263
  72. package/dist/supervisor/supervisor.js.map +0 -1
  73. package/dist/supervisor/types.d.ts +0 -139
  74. package/dist/supervisor/types.d.ts.map +0 -1
  75. package/dist/supervisor/types.js +0 -12
  76. package/dist/supervisor/types.js.map +0 -1
  77. package/dist/webhook/spawner.d.ts +0 -79
  78. package/dist/webhook/spawner.d.ts.map +0 -1
  79. package/dist/webhook/spawner.js +0 -288
  80. package/dist/webhook/spawner.js.map +0 -1
  81. package/dist/wrapper/pty-wrapper.d.ts +0 -125
  82. package/dist/wrapper/pty-wrapper.d.ts.map +0 -1
  83. package/dist/wrapper/pty-wrapper.js +0 -494
  84. package/dist/wrapper/pty-wrapper.js.map +0 -1
  85. /package/{CHANGELOG.md → docs/CHANGELOG.md} +0 -0
  86. /package/{PROTOCOL.md → docs/PROTOCOL.md} +0 -0
@@ -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"}