agent-relay 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/LICENSE +22 -0
- package/PROTOCOL.md +319 -0
- package/README.md +791 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +1591 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/daemon/connection.d.ts +60 -0
- package/dist/daemon/connection.d.ts.map +1 -0
- package/dist/daemon/connection.js +245 -0
- package/dist/daemon/connection.js.map +1 -0
- package/dist/daemon/index.d.ts +4 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +4 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/router.d.ts +72 -0
- package/dist/daemon/router.d.ts.map +1 -0
- package/dist/daemon/router.js +183 -0
- package/dist/daemon/router.js.map +1 -0
- package/dist/daemon/server.d.ts +52 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +186 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/dashboard/public/index.html +690 -0
- package/dist/dashboard/server.d.ts +2 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +220 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/games/index.d.ts +2 -0
- package/dist/games/index.d.ts.map +1 -0
- package/dist/games/index.js +2 -0
- package/dist/games/index.js.map +1 -0
- package/dist/games/tictactoe.d.ts +24 -0
- package/dist/games/tictactoe.d.ts.map +1 -0
- package/dist/games/tictactoe.js +160 -0
- package/dist/games/tictactoe.js.map +1 -0
- package/dist/hooks/inbox-check/hook.d.ts +28 -0
- package/dist/hooks/inbox-check/hook.d.ts.map +1 -0
- package/dist/hooks/inbox-check/hook.js +97 -0
- package/dist/hooks/inbox-check/hook.js.map +1 -0
- package/dist/hooks/inbox-check/index.d.ts +8 -0
- package/dist/hooks/inbox-check/index.d.ts.map +1 -0
- package/dist/hooks/inbox-check/index.js +8 -0
- package/dist/hooks/inbox-check/index.js.map +1 -0
- package/dist/hooks/inbox-check/types.d.ts +31 -0
- package/dist/hooks/inbox-check/types.d.ts.map +1 -0
- package/dist/hooks/inbox-check/types.js +5 -0
- package/dist/hooks/inbox-check/types.js.map +1 -0
- package/dist/hooks/inbox-check/utils.d.ts +44 -0
- package/dist/hooks/inbox-check/utils.d.ts.map +1 -0
- package/dist/hooks/inbox-check/utils.js +107 -0
- package/dist/hooks/inbox-check/utils.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol/framing.d.ts +32 -0
- package/dist/protocol/framing.d.ts.map +1 -0
- package/dist/protocol/framing.js +71 -0
- package/dist/protocol/framing.js.map +1 -0
- package/dist/protocol/index.d.ts +3 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +3 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/types.d.ts +104 -0
- package/dist/protocol/types.d.ts.map +1 -0
- package/dist/protocol/types.js +6 -0
- package/dist/protocol/types.js.map +1 -0
- package/dist/state/agent-state.d.ts +40 -0
- package/dist/state/agent-state.d.ts.map +1 -0
- package/dist/state/agent-state.js +120 -0
- package/dist/state/agent-state.js.map +1 -0
- package/dist/storage/adapter.d.ts +29 -0
- package/dist/storage/adapter.d.ts.map +1 -0
- package/dist/storage/adapter.js +2 -0
- package/dist/storage/adapter.js.map +1 -0
- package/dist/storage/sqlite-adapter.d.ts +15 -0
- package/dist/storage/sqlite-adapter.d.ts.map +1 -0
- package/dist/storage/sqlite-adapter.js +116 -0
- package/dist/storage/sqlite-adapter.js.map +1 -0
- package/dist/supervisor/inbox.d.ts +38 -0
- package/dist/supervisor/inbox.d.ts.map +1 -0
- package/dist/supervisor/inbox.js +162 -0
- package/dist/supervisor/inbox.js.map +1 -0
- package/dist/supervisor/index.d.ts +10 -0
- package/dist/supervisor/index.d.ts.map +1 -0
- package/dist/supervisor/index.js +10 -0
- package/dist/supervisor/index.js.map +1 -0
- package/dist/supervisor/spawner.d.ts +54 -0
- package/dist/supervisor/spawner.d.ts.map +1 -0
- package/dist/supervisor/spawner.js +282 -0
- package/dist/supervisor/spawner.js.map +1 -0
- package/dist/supervisor/state.d.ts +132 -0
- package/dist/supervisor/state.d.ts.map +1 -0
- package/dist/supervisor/state.js +465 -0
- package/dist/supervisor/state.js.map +1 -0
- package/dist/supervisor/supervisor.d.ts +67 -0
- package/dist/supervisor/supervisor.d.ts.map +1 -0
- package/dist/supervisor/supervisor.js +263 -0
- package/dist/supervisor/supervisor.js.map +1 -0
- package/dist/supervisor/types.d.ts +139 -0
- package/dist/supervisor/types.d.ts.map +1 -0
- package/dist/supervisor/types.js +12 -0
- package/dist/supervisor/types.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/name-generator.d.ts +17 -0
- package/dist/utils/name-generator.d.ts.map +1 -0
- package/dist/utils/name-generator.js +52 -0
- package/dist/utils/name-generator.js.map +1 -0
- package/dist/webhook/spawner.d.ts +79 -0
- package/dist/webhook/spawner.d.ts.map +1 -0
- package/dist/webhook/spawner.js +288 -0
- package/dist/webhook/spawner.js.map +1 -0
- package/dist/wrapper/client.d.ts +72 -0
- package/dist/wrapper/client.d.ts.map +1 -0
- package/dist/wrapper/client.js +306 -0
- package/dist/wrapper/client.js.map +1 -0
- package/dist/wrapper/inbox.d.ts +37 -0
- package/dist/wrapper/inbox.d.ts.map +1 -0
- package/dist/wrapper/inbox.js +73 -0
- package/dist/wrapper/inbox.js.map +1 -0
- package/dist/wrapper/index.d.ts +4 -0
- package/dist/wrapper/index.d.ts.map +1 -0
- package/dist/wrapper/index.js +7 -0
- package/dist/wrapper/index.js.map +1 -0
- package/dist/wrapper/parser.d.ts +94 -0
- package/dist/wrapper/parser.d.ts.map +1 -0
- package/dist/wrapper/parser.js +360 -0
- package/dist/wrapper/parser.js.map +1 -0
- package/dist/wrapper/pty-wrapper.d.ts +125 -0
- package/dist/wrapper/pty-wrapper.d.ts.map +1 -0
- package/dist/wrapper/pty-wrapper.js +494 -0
- package/dist/wrapper/pty-wrapper.js.map +1 -0
- package/dist/wrapper/tmux-wrapper.d.ts +131 -0
- package/dist/wrapper/tmux-wrapper.d.ts.map +1 -0
- package/dist/wrapper/tmux-wrapper.js +427 -0
- package/dist/wrapper/tmux-wrapper.js.map +1 -0
- package/install.sh +69 -0
- package/package.json +82 -0
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent State Management
|
|
3
|
+
*
|
|
4
|
+
* Handles persistent state for spawn-per-message architecture.
|
|
5
|
+
* Each agent has a state.json that maintains context across spawns.
|
|
6
|
+
*/
|
|
7
|
+
import fs from 'node:fs';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import { parseInboxMarkdown } from './inbox.js';
|
|
10
|
+
/** Current state schema version */
|
|
11
|
+
const STATE_VERSION = 1;
|
|
12
|
+
/**
|
|
13
|
+
* State Manager for a single agent
|
|
14
|
+
*/
|
|
15
|
+
export class StateManager {
|
|
16
|
+
statePath;
|
|
17
|
+
lockPath;
|
|
18
|
+
config;
|
|
19
|
+
agentName;
|
|
20
|
+
constructor(agentName, config) {
|
|
21
|
+
this.agentName = agentName;
|
|
22
|
+
this.config = config;
|
|
23
|
+
const agentDir = path.join(config.dataDir, agentName);
|
|
24
|
+
this.statePath = path.join(agentDir, 'state.json');
|
|
25
|
+
this.lockPath = path.join(agentDir, 'agent.lock');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Initialize state directory
|
|
29
|
+
*/
|
|
30
|
+
ensureDir() {
|
|
31
|
+
const dir = path.dirname(this.statePath);
|
|
32
|
+
if (!fs.existsSync(dir)) {
|
|
33
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if state file exists
|
|
38
|
+
*/
|
|
39
|
+
exists() {
|
|
40
|
+
return fs.existsSync(this.statePath);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Load agent state from disk
|
|
44
|
+
*/
|
|
45
|
+
load() {
|
|
46
|
+
if (!this.exists()) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const content = fs.readFileSync(this.statePath, 'utf-8');
|
|
51
|
+
const state = JSON.parse(content);
|
|
52
|
+
// Migrate older state formats
|
|
53
|
+
return this.migrateState(state);
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
console.error(`[state] Failed to load state for ${this.agentName}:`, err);
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Save agent state to disk
|
|
62
|
+
*/
|
|
63
|
+
save(state) {
|
|
64
|
+
this.ensureDir();
|
|
65
|
+
const tmpPath = `${this.statePath}.tmp`;
|
|
66
|
+
fs.writeFileSync(tmpPath, JSON.stringify(state, null, 2), 'utf-8');
|
|
67
|
+
fs.renameSync(tmpPath, this.statePath);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Create initial state for a new agent
|
|
71
|
+
*/
|
|
72
|
+
create(cli, cwd, customCommand) {
|
|
73
|
+
const now = new Date().toISOString();
|
|
74
|
+
const state = {
|
|
75
|
+
version: STATE_VERSION,
|
|
76
|
+
name: this.agentName,
|
|
77
|
+
cli,
|
|
78
|
+
summary: '',
|
|
79
|
+
recentMessages: [],
|
|
80
|
+
cwd,
|
|
81
|
+
customCommand,
|
|
82
|
+
lastActiveTs: now,
|
|
83
|
+
createdTs: now,
|
|
84
|
+
status: 'idle',
|
|
85
|
+
decisions: [],
|
|
86
|
+
openTodos: [],
|
|
87
|
+
filesModified: [],
|
|
88
|
+
externalRefs: [],
|
|
89
|
+
};
|
|
90
|
+
this.save(state);
|
|
91
|
+
return state;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Update state with a new relay exchange
|
|
95
|
+
*/
|
|
96
|
+
addExchange(state, exchange) {
|
|
97
|
+
const updated = { ...state };
|
|
98
|
+
updated.recentMessages = [
|
|
99
|
+
...state.recentMessages,
|
|
100
|
+
exchange,
|
|
101
|
+
].slice(-this.config.maxRecentMessages);
|
|
102
|
+
updated.lastActiveTs = new Date().toISOString();
|
|
103
|
+
this.save(updated);
|
|
104
|
+
return updated;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Update the rolling summary
|
|
108
|
+
*/
|
|
109
|
+
updateSummary(state, newSummary) {
|
|
110
|
+
const updated = { ...state };
|
|
111
|
+
// Truncate if too long
|
|
112
|
+
updated.summary = newSummary.length > this.config.maxSummaryLength
|
|
113
|
+
? newSummary.substring(0, this.config.maxSummaryLength) + '...'
|
|
114
|
+
: newSummary;
|
|
115
|
+
updated.lastActiveTs = new Date().toISOString();
|
|
116
|
+
this.save(updated);
|
|
117
|
+
return updated;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Update supervisor-tracked status for the agent.
|
|
121
|
+
*/
|
|
122
|
+
setStatus(state, status) {
|
|
123
|
+
const updated = { ...state, status };
|
|
124
|
+
updated.lastActiveTs = new Date().toISOString();
|
|
125
|
+
this.save(updated);
|
|
126
|
+
return updated;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Parse inbox content and record received exchanges into state.
|
|
130
|
+
*/
|
|
131
|
+
recordInboxReceived(state, inboxContent) {
|
|
132
|
+
const messages = parseInboxMarkdown(inboxContent);
|
|
133
|
+
let updated = state;
|
|
134
|
+
for (const msg of messages) {
|
|
135
|
+
updated = this.addExchange(updated, {
|
|
136
|
+
direction: 'received',
|
|
137
|
+
peer: msg.from,
|
|
138
|
+
body: msg.body,
|
|
139
|
+
timestamp: msg.timestamp || new Date().toISOString(),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return updated;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Mark inbox as processed (for restart deduplication)
|
|
146
|
+
*/
|
|
147
|
+
markInboxProcessed(state, timestamp) {
|
|
148
|
+
const updated = { ...state };
|
|
149
|
+
updated.lastProcessedInboxTs = timestamp || new Date().toISOString();
|
|
150
|
+
updated.lastActiveTs = new Date().toISOString();
|
|
151
|
+
this.save(updated);
|
|
152
|
+
return updated;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Check if messages should be skipped based on timestamp
|
|
156
|
+
* Returns true if the message timestamp is older than lastProcessedInboxTs
|
|
157
|
+
*/
|
|
158
|
+
shouldSkipMessage(state, messageTs) {
|
|
159
|
+
if (!state.lastProcessedInboxTs)
|
|
160
|
+
return false;
|
|
161
|
+
return new Date(messageTs) <= new Date(state.lastProcessedInboxTs);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Add a decision (append-only)
|
|
165
|
+
*/
|
|
166
|
+
addDecision(state, what, why) {
|
|
167
|
+
const updated = { ...state };
|
|
168
|
+
updated.decisions = [
|
|
169
|
+
...state.decisions,
|
|
170
|
+
{
|
|
171
|
+
what,
|
|
172
|
+
why,
|
|
173
|
+
timestamp: new Date().toISOString(),
|
|
174
|
+
},
|
|
175
|
+
];
|
|
176
|
+
updated.lastActiveTs = new Date().toISOString();
|
|
177
|
+
this.save(updated);
|
|
178
|
+
return updated;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Add a TODO item
|
|
182
|
+
*/
|
|
183
|
+
addTodo(state, task, priority = 'normal', owner) {
|
|
184
|
+
const updated = { ...state };
|
|
185
|
+
updated.openTodos = [
|
|
186
|
+
...state.openTodos,
|
|
187
|
+
{
|
|
188
|
+
task,
|
|
189
|
+
owner,
|
|
190
|
+
priority,
|
|
191
|
+
addedTs: new Date().toISOString(),
|
|
192
|
+
},
|
|
193
|
+
];
|
|
194
|
+
updated.lastActiveTs = new Date().toISOString();
|
|
195
|
+
this.save(updated);
|
|
196
|
+
return updated;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Complete (remove) a TODO item by task text match
|
|
200
|
+
*/
|
|
201
|
+
completeTodo(state, taskMatch) {
|
|
202
|
+
const updated = { ...state };
|
|
203
|
+
updated.openTodos = state.openTodos.filter((todo) => !todo.task.toLowerCase().includes(taskMatch.toLowerCase()));
|
|
204
|
+
updated.lastActiveTs = new Date().toISOString();
|
|
205
|
+
this.save(updated);
|
|
206
|
+
return updated;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Record a file modification
|
|
210
|
+
*/
|
|
211
|
+
addFileModification(state, filePath, intent) {
|
|
212
|
+
const updated = { ...state };
|
|
213
|
+
// Replace existing entry for same path or append
|
|
214
|
+
const existing = state.filesModified.findIndex((f) => f.path === filePath);
|
|
215
|
+
if (existing >= 0) {
|
|
216
|
+
updated.filesModified = [...state.filesModified];
|
|
217
|
+
updated.filesModified[existing] = {
|
|
218
|
+
path: filePath,
|
|
219
|
+
intent,
|
|
220
|
+
timestamp: new Date().toISOString(),
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
updated.filesModified = [
|
|
225
|
+
...state.filesModified,
|
|
226
|
+
{
|
|
227
|
+
path: filePath,
|
|
228
|
+
intent,
|
|
229
|
+
timestamp: new Date().toISOString(),
|
|
230
|
+
},
|
|
231
|
+
];
|
|
232
|
+
}
|
|
233
|
+
updated.lastActiveTs = new Date().toISOString();
|
|
234
|
+
this.save(updated);
|
|
235
|
+
return updated;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Record an external command/reference
|
|
239
|
+
*/
|
|
240
|
+
addExternalRef(state, command, resultSummary, logPath) {
|
|
241
|
+
const updated = { ...state };
|
|
242
|
+
const maxRefs = 20; // Keep bounded
|
|
243
|
+
updated.externalRefs = [
|
|
244
|
+
...state.externalRefs.slice(-maxRefs + 1),
|
|
245
|
+
{
|
|
246
|
+
command,
|
|
247
|
+
resultSummary,
|
|
248
|
+
timestamp: new Date().toISOString(),
|
|
249
|
+
logPath,
|
|
250
|
+
},
|
|
251
|
+
];
|
|
252
|
+
updated.lastActiveTs = new Date().toISOString();
|
|
253
|
+
this.save(updated);
|
|
254
|
+
return updated;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Migrate old state to current version
|
|
258
|
+
*/
|
|
259
|
+
migrateState(state) {
|
|
260
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
261
|
+
const s = state;
|
|
262
|
+
if (!s.version || s.version < STATE_VERSION) {
|
|
263
|
+
// Add missing fields from v1
|
|
264
|
+
s.version = STATE_VERSION;
|
|
265
|
+
s.status = s.status || 'idle';
|
|
266
|
+
s.decisions = s.decisions || [];
|
|
267
|
+
s.openTodos = s.openTodos || [];
|
|
268
|
+
s.filesModified = s.filesModified || [];
|
|
269
|
+
s.externalRefs = s.externalRefs || [];
|
|
270
|
+
this.save(s);
|
|
271
|
+
}
|
|
272
|
+
return s;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Try to acquire lock for this agent
|
|
276
|
+
* Returns true if lock acquired, false if already locked
|
|
277
|
+
*/
|
|
278
|
+
tryLock() {
|
|
279
|
+
this.ensureDir();
|
|
280
|
+
try {
|
|
281
|
+
// Try to create lock file exclusively
|
|
282
|
+
const fd = fs.openSync(this.lockPath, 'wx');
|
|
283
|
+
fs.writeSync(fd, `${process.pid}\n${new Date().toISOString()}\n`);
|
|
284
|
+
fs.closeSync(fd);
|
|
285
|
+
return true;
|
|
286
|
+
}
|
|
287
|
+
catch (err) {
|
|
288
|
+
if (err.code === 'EEXIST') {
|
|
289
|
+
// Lock exists, check if stale (older than 5 minutes)
|
|
290
|
+
try {
|
|
291
|
+
const stat = fs.statSync(this.lockPath);
|
|
292
|
+
const age = Date.now() - stat.mtimeMs;
|
|
293
|
+
if (age > 5 * 60 * 1000) {
|
|
294
|
+
// Stale lock, remove and retry
|
|
295
|
+
fs.unlinkSync(this.lockPath);
|
|
296
|
+
return this.tryLock();
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
// Ignore stat errors
|
|
301
|
+
}
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
throw err;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Release lock for this agent
|
|
309
|
+
*/
|
|
310
|
+
releaseLock() {
|
|
311
|
+
try {
|
|
312
|
+
if (fs.existsSync(this.lockPath)) {
|
|
313
|
+
fs.unlinkSync(this.lockPath);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
catch (err) {
|
|
317
|
+
console.error(`[state] Failed to release lock for ${this.agentName}:`, err);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Check if agent is currently locked
|
|
322
|
+
*/
|
|
323
|
+
isLocked() {
|
|
324
|
+
if (!fs.existsSync(this.lockPath)) {
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
// Check for stale lock
|
|
328
|
+
try {
|
|
329
|
+
const stat = fs.statSync(this.lockPath);
|
|
330
|
+
const age = Date.now() - stat.mtimeMs;
|
|
331
|
+
if (age > 5 * 60 * 1000) {
|
|
332
|
+
// Stale, consider unlocked
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
return true;
|
|
336
|
+
}
|
|
337
|
+
catch {
|
|
338
|
+
return false;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Get the inbox path for this agent
|
|
343
|
+
*/
|
|
344
|
+
getInboxPath() {
|
|
345
|
+
return path.join(this.config.dataDir, this.agentName, 'inbox.md');
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Get the state.json path for this agent
|
|
349
|
+
*/
|
|
350
|
+
getStatePath() {
|
|
351
|
+
return this.statePath;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Get the lock path for this agent
|
|
355
|
+
*/
|
|
356
|
+
getLockPath() {
|
|
357
|
+
return this.lockPath;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Build the initial prompt for a spawn including state context
|
|
361
|
+
*/
|
|
362
|
+
buildSpawnPrompt(state, inboxContent) {
|
|
363
|
+
let prompt = '';
|
|
364
|
+
prompt += `You are ${state.name}, an AI agent collaborating with other CLI agents via agent-relay.\n`;
|
|
365
|
+
prompt += `Your job: read new relay messages and respond using @relay:AgentName <message>.\n`;
|
|
366
|
+
prompt += `\nCRITICAL: Do not wait for additional input. Process ALL messages and then exit.\n\n`;
|
|
367
|
+
// Add summary if present
|
|
368
|
+
if (state.summary) {
|
|
369
|
+
prompt += `## Context\n${state.summary}\n\n`;
|
|
370
|
+
}
|
|
371
|
+
// Add key decisions (stable context)
|
|
372
|
+
if (state.decisions.length > 0) {
|
|
373
|
+
prompt += `## Key Decisions Made\n`;
|
|
374
|
+
for (const decision of state.decisions.slice(-10)) {
|
|
375
|
+
prompt += `- **${decision.what}**: ${decision.why}\n`;
|
|
376
|
+
}
|
|
377
|
+
prompt += '\n';
|
|
378
|
+
}
|
|
379
|
+
// Add open TODOs
|
|
380
|
+
if (state.openTodos.length > 0) {
|
|
381
|
+
prompt += `## Open TODOs\n`;
|
|
382
|
+
for (const todo of state.openTodos) {
|
|
383
|
+
const priority = todo.priority === 'high' ? '[HIGH]' : todo.priority === 'low' ? '[low]' : '';
|
|
384
|
+
const owner = todo.owner ? ` (${todo.owner})` : '';
|
|
385
|
+
prompt += `- ${priority} ${todo.task}${owner}\n`;
|
|
386
|
+
}
|
|
387
|
+
prompt += '\n';
|
|
388
|
+
}
|
|
389
|
+
// Add files modified (for context on what we've touched)
|
|
390
|
+
if (state.filesModified.length > 0) {
|
|
391
|
+
prompt += `## Files Modified This Session\n`;
|
|
392
|
+
for (const file of state.filesModified.slice(-10)) {
|
|
393
|
+
prompt += `- \`${file.path}\`: ${file.intent}\n`;
|
|
394
|
+
}
|
|
395
|
+
prompt += '\n';
|
|
396
|
+
}
|
|
397
|
+
// Add recent external command references
|
|
398
|
+
if (state.externalRefs.length > 0) {
|
|
399
|
+
prompt += `## Recent Commands/Outputs\n`;
|
|
400
|
+
for (const ref of state.externalRefs.slice(-5)) {
|
|
401
|
+
prompt += `- \`${ref.command}\`: ${ref.resultSummary}\n`;
|
|
402
|
+
}
|
|
403
|
+
prompt += '\n';
|
|
404
|
+
}
|
|
405
|
+
// Add recent exchanges
|
|
406
|
+
if (state.recentMessages.length > 0) {
|
|
407
|
+
prompt += `## Recent Conversation\n`;
|
|
408
|
+
for (const exchange of state.recentMessages.slice(-10)) {
|
|
409
|
+
const direction = exchange.direction === 'sent' ? '→' : '←';
|
|
410
|
+
prompt += `[${exchange.timestamp}] ${direction} ${exchange.peer}: ${exchange.body}\n`;
|
|
411
|
+
}
|
|
412
|
+
prompt += '\n';
|
|
413
|
+
}
|
|
414
|
+
// Add inbox content
|
|
415
|
+
prompt += `## New Messages To Process\n${inboxContent}\n\n`;
|
|
416
|
+
// Add instructions
|
|
417
|
+
prompt += `## Instructions\n`;
|
|
418
|
+
prompt += `1. Read and understand each new message\n`;
|
|
419
|
+
prompt += `2. Respond using: @relay:AgentName Your reply\n`;
|
|
420
|
+
prompt += `3. When finished processing all messages, EXIT (do not wait)\n\n`;
|
|
421
|
+
prompt += `## Context Preservation\n`;
|
|
422
|
+
prompt += `After you respond, output an updated compact summary so future spawns keep context:\n`;
|
|
423
|
+
prompt += `[[SUMMARY]]<~1-2k chars: current goals, key decisions, current state, next steps>[[/SUMMARY]]\n\n`;
|
|
424
|
+
prompt += `Optional structured markers (only if helpful):\n`;
|
|
425
|
+
prompt += `- [[DECISION]]{\"what\":\"...\",\"why\":\"...\"}[[/DECISION]]\n`;
|
|
426
|
+
prompt += `- [[TODO]]{\"task\":\"...\",\"priority\":\"high|normal|low\",\"owner\":\"?\"}[[/TODO]]\n`;
|
|
427
|
+
prompt += `- [[DONE]]task substring[[/DONE]]\n`;
|
|
428
|
+
return prompt;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Global state registry for all agents
|
|
433
|
+
*/
|
|
434
|
+
export class StateRegistry {
|
|
435
|
+
config;
|
|
436
|
+
managers = new Map();
|
|
437
|
+
constructor(config) {
|
|
438
|
+
this.config = config;
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Get or create state manager for an agent
|
|
442
|
+
*/
|
|
443
|
+
getManager(agentName) {
|
|
444
|
+
let manager = this.managers.get(agentName);
|
|
445
|
+
if (!manager) {
|
|
446
|
+
manager = new StateManager(agentName, this.config);
|
|
447
|
+
this.managers.set(agentName, manager);
|
|
448
|
+
}
|
|
449
|
+
return manager;
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* List all registered agents (from disk)
|
|
453
|
+
*/
|
|
454
|
+
listAgents() {
|
|
455
|
+
if (!fs.existsSync(this.config.dataDir)) {
|
|
456
|
+
return [];
|
|
457
|
+
}
|
|
458
|
+
const entries = fs.readdirSync(this.config.dataDir, { withFileTypes: true });
|
|
459
|
+
return entries
|
|
460
|
+
.filter(e => e.isDirectory())
|
|
461
|
+
.filter(e => fs.existsSync(path.join(this.config.dataDir, e.name, 'state.json')))
|
|
462
|
+
.map(e => e.name);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/supervisor/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Relay Supervisor
|
|
3
|
+
*
|
|
4
|
+
* Main supervisor loop that:
|
|
5
|
+
* 1. Watches registered agents for inbox messages
|
|
6
|
+
* 2. Spawns fresh CLI runs when messages arrive
|
|
7
|
+
* 3. Captures output and routes relay commands
|
|
8
|
+
* 4. Updates agent state for context preservation
|
|
9
|
+
*/
|
|
10
|
+
import type { SupervisorConfig, AgentRegistration, AgentState } from './types.js';
|
|
11
|
+
export declare class Supervisor {
|
|
12
|
+
private config;
|
|
13
|
+
private registry;
|
|
14
|
+
private spawner;
|
|
15
|
+
private client;
|
|
16
|
+
private running;
|
|
17
|
+
private pollTimer?;
|
|
18
|
+
constructor(config?: Partial<SupervisorConfig>);
|
|
19
|
+
/**
|
|
20
|
+
* Start the supervisor
|
|
21
|
+
*/
|
|
22
|
+
start(): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Stop the supervisor
|
|
25
|
+
*/
|
|
26
|
+
stop(): void;
|
|
27
|
+
/**
|
|
28
|
+
* Register a new agent
|
|
29
|
+
*/
|
|
30
|
+
registerAgent(registration: AgentRegistration): AgentState;
|
|
31
|
+
/**
|
|
32
|
+
* Unregister an agent
|
|
33
|
+
*/
|
|
34
|
+
unregisterAgent(name: string): void;
|
|
35
|
+
/**
|
|
36
|
+
* Schedule next poll
|
|
37
|
+
*/
|
|
38
|
+
private schedulePoll;
|
|
39
|
+
/**
|
|
40
|
+
* Poll all agents for new messages
|
|
41
|
+
*/
|
|
42
|
+
private poll;
|
|
43
|
+
/**
|
|
44
|
+
* Process a single agent's inbox
|
|
45
|
+
*/
|
|
46
|
+
private processAgent;
|
|
47
|
+
/**
|
|
48
|
+
* Get list of registered agents
|
|
49
|
+
*/
|
|
50
|
+
getAgents(): string[];
|
|
51
|
+
/**
|
|
52
|
+
* Get agent state
|
|
53
|
+
*/
|
|
54
|
+
getAgentState(name: string): AgentState | null;
|
|
55
|
+
/**
|
|
56
|
+
* Get lightweight diagnostics for CLI display.
|
|
57
|
+
*/
|
|
58
|
+
getAgentDiagnostics(name: string): {
|
|
59
|
+
state: AgentState | null;
|
|
60
|
+
locked: boolean;
|
|
61
|
+
inboxPath: string;
|
|
62
|
+
statePath: string;
|
|
63
|
+
lockPath: string;
|
|
64
|
+
hasUnreadInbox: boolean;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=supervisor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/supervisor/supervisor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAC,CAAiB;gBAEvB,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM;IAmBlD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB5B;;OAEG;IACH,IAAI,IAAI,IAAI;IAgBZ;;OAEG;IACH,aAAa,CAAC,YAAY,EAAE,iBAAiB,GAAG,UAAU;IA2B1D;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQnC;;OAEG;IACH,OAAO,CAAC,YAAY;IASpB;;OAEG;YACW,IAAI;IAYlB;;OAEG;YACW,YAAY;IAkH1B;;OAEG;IACH,SAAS,IAAI,MAAM,EAAE;IAIrB;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAI9C;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG;QACjC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;QACzB,MAAM,EAAE,OAAO,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,OAAO,CAAC;KACzB;CAmBF"}
|