agent-relay 1.0.7 → 1.0.8
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 +18 -6
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +344 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/daemon/agent-registry.d.ts +60 -0
- package/dist/daemon/agent-registry.d.ts.map +1 -0
- package/dist/daemon/agent-registry.js +158 -0
- package/dist/daemon/agent-registry.js.map +1 -0
- package/dist/daemon/connection.d.ts +11 -1
- package/dist/daemon/connection.d.ts.map +1 -1
- package/dist/daemon/connection.js +31 -2
- package/dist/daemon/connection.js.map +1 -1
- package/dist/daemon/index.d.ts +2 -0
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +2 -0
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/registry.d.ts +9 -0
- package/dist/daemon/registry.d.ts.map +1 -0
- package/dist/daemon/registry.js +9 -0
- package/dist/daemon/registry.js.map +1 -0
- package/dist/daemon/router.d.ts +34 -2
- package/dist/daemon/router.d.ts.map +1 -1
- package/dist/daemon/router.js +111 -1
- package/dist/daemon/router.js.map +1 -1
- package/dist/daemon/server.d.ts +1 -0
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +60 -13
- package/dist/daemon/server.js.map +1 -1
- package/dist/dashboard/public/index.html +625 -16
- package/dist/dashboard/server.d.ts +1 -1
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +125 -7
- package/dist/dashboard/server.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/protocol/types.d.ts +15 -1
- package/dist/protocol/types.d.ts.map +1 -1
- package/dist/storage/adapter.d.ts +53 -0
- package/dist/storage/adapter.d.ts.map +1 -1
- package/dist/storage/adapter.js +3 -0
- package/dist/storage/adapter.js.map +1 -1
- package/dist/storage/sqlite-adapter.d.ts +58 -1
- package/dist/storage/sqlite-adapter.d.ts.map +1 -1
- package/dist/storage/sqlite-adapter.js +374 -47
- package/dist/storage/sqlite-adapter.js.map +1 -1
- package/dist/utils/project-namespace.d.ts.map +1 -1
- package/dist/utils/project-namespace.js +22 -1
- package/dist/utils/project-namespace.js.map +1 -1
- package/dist/wrapper/client.d.ts +22 -3
- package/dist/wrapper/client.d.ts.map +1 -1
- package/dist/wrapper/client.js +59 -9
- package/dist/wrapper/client.js.map +1 -1
- package/dist/wrapper/parser.d.ts +110 -4
- package/dist/wrapper/parser.d.ts.map +1 -1
- package/dist/wrapper/parser.js +296 -84
- package/dist/wrapper/parser.js.map +1 -1
- package/dist/wrapper/tmux-wrapper.d.ts +100 -9
- package/dist/wrapper/tmux-wrapper.d.ts.map +1 -1
- package/dist/wrapper/tmux-wrapper.js +437 -77
- package/dist/wrapper/tmux-wrapper.js.map +1 -1
- package/docs/AGENTS.md +27 -27
- package/docs/CHANGELOG.md +1 -1
- package/docs/DESIGN_V2.md +1079 -0
- package/docs/INTEGRATION-GUIDE.md +926 -0
- package/docs/PROPOSAL-trajectories.md +1582 -0
- package/docs/PROTOCOL.md +3 -3
- package/docs/SCALING_ANALYSIS.md +280 -0
- package/docs/TMUX_IMPLEMENTATION_NOTES.md +9 -9
- package/docs/TMUX_IMPROVEMENTS.md +968 -0
- package/docs/competitive-analysis-mcp-agent-mail.md +389 -0
- package/package.json +6 -2
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Registry
|
|
3
|
+
* Persists agent metadata across daemon restarts.
|
|
4
|
+
*/
|
|
5
|
+
import fs from 'node:fs';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { v4 as uuid } from 'uuid';
|
|
8
|
+
export class AgentRegistry {
|
|
9
|
+
registryPath;
|
|
10
|
+
agents = new Map(); // name -> record
|
|
11
|
+
constructor(teamDir) {
|
|
12
|
+
this.registryPath = path.join(teamDir, 'agents.json');
|
|
13
|
+
this.ensureDir(teamDir);
|
|
14
|
+
this.load();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Register or update an agent (public alias for registerOrUpdate to match docs).
|
|
18
|
+
*/
|
|
19
|
+
register(agent) {
|
|
20
|
+
return this.registerOrUpdate(agent);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Register or update an agent, refreshing lastSeen and metadata.
|
|
24
|
+
*/
|
|
25
|
+
registerOrUpdate(agent) {
|
|
26
|
+
const now = new Date().toISOString();
|
|
27
|
+
const existing = this.agents.get(agent.name);
|
|
28
|
+
if (existing) {
|
|
29
|
+
const updated = {
|
|
30
|
+
...existing,
|
|
31
|
+
cli: agent.cli ?? existing.cli,
|
|
32
|
+
program: agent.program ?? existing.program,
|
|
33
|
+
model: agent.model ?? existing.model,
|
|
34
|
+
task: agent.task ?? existing.task,
|
|
35
|
+
workingDirectory: agent.workingDirectory ?? existing.workingDirectory,
|
|
36
|
+
lastSeen: now,
|
|
37
|
+
};
|
|
38
|
+
this.agents.set(agent.name, updated);
|
|
39
|
+
this.save();
|
|
40
|
+
return updated;
|
|
41
|
+
}
|
|
42
|
+
const record = {
|
|
43
|
+
id: `agent-${uuid()}`,
|
|
44
|
+
name: agent.name,
|
|
45
|
+
cli: agent.cli,
|
|
46
|
+
program: agent.program,
|
|
47
|
+
model: agent.model,
|
|
48
|
+
task: agent.task,
|
|
49
|
+
workingDirectory: agent.workingDirectory,
|
|
50
|
+
firstSeen: now,
|
|
51
|
+
lastSeen: now,
|
|
52
|
+
messagesSent: 0,
|
|
53
|
+
messagesReceived: 0,
|
|
54
|
+
};
|
|
55
|
+
this.agents.set(agent.name, record);
|
|
56
|
+
this.save();
|
|
57
|
+
return record;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Increment sent counter for an agent.
|
|
61
|
+
*/
|
|
62
|
+
recordSend(agentName) {
|
|
63
|
+
const record = this.ensureRecord(agentName);
|
|
64
|
+
record.messagesSent += 1;
|
|
65
|
+
record.lastSeen = new Date().toISOString();
|
|
66
|
+
this.agents.set(agentName, record);
|
|
67
|
+
this.save();
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Increment received counter for an agent.
|
|
71
|
+
*/
|
|
72
|
+
recordReceive(agentName) {
|
|
73
|
+
const record = this.ensureRecord(agentName);
|
|
74
|
+
record.messagesReceived += 1;
|
|
75
|
+
record.lastSeen = new Date().toISOString();
|
|
76
|
+
this.agents.set(agentName, record);
|
|
77
|
+
this.save();
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Touch lastSeen for an agent (e.g., on disconnect).
|
|
81
|
+
*/
|
|
82
|
+
touch(agentName) {
|
|
83
|
+
const record = this.ensureRecord(agentName);
|
|
84
|
+
record.lastSeen = new Date().toISOString();
|
|
85
|
+
this.agents.set(agentName, record);
|
|
86
|
+
this.save();
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get a snapshot of all agents.
|
|
90
|
+
*/
|
|
91
|
+
getAgents() {
|
|
92
|
+
return Array.from(this.agents.values());
|
|
93
|
+
}
|
|
94
|
+
ensureRecord(agentName) {
|
|
95
|
+
const existing = this.agents.get(agentName);
|
|
96
|
+
if (existing)
|
|
97
|
+
return existing;
|
|
98
|
+
const now = new Date().toISOString();
|
|
99
|
+
const record = {
|
|
100
|
+
id: `agent-${uuid()}`,
|
|
101
|
+
name: agentName,
|
|
102
|
+
firstSeen: now,
|
|
103
|
+
lastSeen: now,
|
|
104
|
+
messagesSent: 0,
|
|
105
|
+
messagesReceived: 0,
|
|
106
|
+
};
|
|
107
|
+
this.agents.set(agentName, record);
|
|
108
|
+
return record;
|
|
109
|
+
}
|
|
110
|
+
ensureDir(dir) {
|
|
111
|
+
if (!fs.existsSync(dir)) {
|
|
112
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
load() {
|
|
116
|
+
if (!fs.existsSync(this.registryPath)) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
const data = JSON.parse(fs.readFileSync(this.registryPath, 'utf-8'));
|
|
121
|
+
const rawAgents = Array.isArray(data?.agents)
|
|
122
|
+
? data.agents
|
|
123
|
+
: typeof data?.agents === 'object' && data?.agents !== null
|
|
124
|
+
? Object.values(data.agents)
|
|
125
|
+
: [];
|
|
126
|
+
for (const raw of rawAgents) {
|
|
127
|
+
if (!raw?.name)
|
|
128
|
+
continue;
|
|
129
|
+
const record = {
|
|
130
|
+
id: raw.id ?? `agent-${uuid()}`,
|
|
131
|
+
name: raw.name,
|
|
132
|
+
cli: raw.cli,
|
|
133
|
+
program: raw.program,
|
|
134
|
+
model: raw.model,
|
|
135
|
+
task: raw.task,
|
|
136
|
+
workingDirectory: raw.workingDirectory,
|
|
137
|
+
firstSeen: raw.firstSeen ?? new Date().toISOString(),
|
|
138
|
+
lastSeen: raw.lastSeen ?? new Date().toISOString(),
|
|
139
|
+
messagesSent: typeof raw.messagesSent === 'number' ? raw.messagesSent : 0,
|
|
140
|
+
messagesReceived: typeof raw.messagesReceived === 'number' ? raw.messagesReceived : 0,
|
|
141
|
+
};
|
|
142
|
+
this.agents.set(record.name, record);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
console.error('[registry] Failed to load agents.json:', err);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
save() {
|
|
150
|
+
try {
|
|
151
|
+
fs.writeFileSync(this.registryPath, JSON.stringify({ agents: this.getAgents() }, null, 2), 'utf-8');
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
console.error('[registry] Failed to write agents.json:', err);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=agent-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-registry.js","sourceRoot":"","sources":["../../src/daemon/agent-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* ERROR -------> CLOSED
|
|
9
9
|
*/
|
|
10
10
|
import net from 'node:net';
|
|
11
|
-
import { type Envelope } from '../protocol/types.js';
|
|
11
|
+
import { type Envelope, type AckPayload } from '../protocol/types.js';
|
|
12
12
|
export type ConnectionState = 'CONNECTING' | 'HANDSHAKING' | 'ACTIVE' | 'CLOSING' | 'CLOSED' | 'ERROR';
|
|
13
13
|
export interface ConnectionConfig {
|
|
14
14
|
maxFrameBytes: number;
|
|
@@ -23,6 +23,10 @@ export declare class Connection {
|
|
|
23
23
|
private _state;
|
|
24
24
|
private _agentName?;
|
|
25
25
|
private _cli?;
|
|
26
|
+
private _program?;
|
|
27
|
+
private _model?;
|
|
28
|
+
private _task?;
|
|
29
|
+
private _workingDirectory?;
|
|
26
30
|
private _sessionId;
|
|
27
31
|
private _resumeToken;
|
|
28
32
|
private heartbeatTimer?;
|
|
@@ -32,10 +36,16 @@ export declare class Connection {
|
|
|
32
36
|
onClose?: () => void;
|
|
33
37
|
onError?: (error: Error) => void;
|
|
34
38
|
onActive?: () => void;
|
|
39
|
+
onAck?: (envelope: Envelope<AckPayload>) => void;
|
|
40
|
+
onPong?: () => void;
|
|
35
41
|
constructor(socket: net.Socket, config?: Partial<ConnectionConfig>);
|
|
36
42
|
get state(): ConnectionState;
|
|
37
43
|
get agentName(): string | undefined;
|
|
38
44
|
get cli(): string | undefined;
|
|
45
|
+
get program(): string | undefined;
|
|
46
|
+
get model(): string | undefined;
|
|
47
|
+
get task(): string | undefined;
|
|
48
|
+
get workingDirectory(): string | undefined;
|
|
39
49
|
get sessionId(): string;
|
|
40
50
|
private setupSocketHandlers;
|
|
41
51
|
private handleData;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/daemon/connection.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,GAAG,MAAM,UAAU,CAAC;AAE3B,OAAO,EACL,KAAK,QAAQ,
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/daemon/connection.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,GAAG,MAAM,UAAU,CAAC;AAE3B,OAAO,EACL,KAAK,QAAQ,EAMb,KAAK,UAAU,EAEhB,MAAM,sBAAsB,CAAC;AAG9B,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEvG,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,cAAc,EAAE,gBAG5B,CAAC;AAEF,qBAAa,UAAU;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAmB;IAEjC,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,IAAI,CAAC,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,iBAAiB,CAAC,CAAS;IACnC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,gBAAgB,CAAC,CAAS;IAGlC,OAAO,CAAC,SAAS,CAAkC;IAGnD,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;IACjD,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;gBAER,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM;IAYtE,IAAI,KAAK,IAAI,eAAe,CAE3B;IAED,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,IAAI,GAAG,IAAI,MAAM,GAAG,SAAS,CAE5B;IAED,IAAI,OAAO,IAAI,MAAM,GAAG,SAAS,CAEhC;IAED,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAE9B;IAED,IAAI,IAAI,IAAI,MAAM,GAAG,SAAS,CAE7B;IAED,IAAI,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAEzC;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,YAAY;IA0BpB,OAAO,CAAC,WAAW;IAgDnB,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAO/C;;OAEG;IACH,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO;IAejC,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,OAAO;IAIf,KAAK,IAAI,IAAI;CAad"}
|
|
@@ -22,6 +22,10 @@ export class Connection {
|
|
|
22
22
|
_state = 'CONNECTING';
|
|
23
23
|
_agentName;
|
|
24
24
|
_cli;
|
|
25
|
+
_program;
|
|
26
|
+
_model;
|
|
27
|
+
_task;
|
|
28
|
+
_workingDirectory;
|
|
25
29
|
_sessionId;
|
|
26
30
|
_resumeToken;
|
|
27
31
|
heartbeatTimer;
|
|
@@ -33,6 +37,8 @@ export class Connection {
|
|
|
33
37
|
onClose;
|
|
34
38
|
onError;
|
|
35
39
|
onActive; // Fires when connection transitions to ACTIVE state
|
|
40
|
+
onAck;
|
|
41
|
+
onPong; // Fires on successful heartbeat response
|
|
36
42
|
constructor(socket, config = {}) {
|
|
37
43
|
this.id = uuid();
|
|
38
44
|
this.socket = socket;
|
|
@@ -52,6 +58,18 @@ export class Connection {
|
|
|
52
58
|
get cli() {
|
|
53
59
|
return this._cli;
|
|
54
60
|
}
|
|
61
|
+
get program() {
|
|
62
|
+
return this._program;
|
|
63
|
+
}
|
|
64
|
+
get model() {
|
|
65
|
+
return this._model;
|
|
66
|
+
}
|
|
67
|
+
get task() {
|
|
68
|
+
return this._task;
|
|
69
|
+
}
|
|
70
|
+
get workingDirectory() {
|
|
71
|
+
return this._workingDirectory;
|
|
72
|
+
}
|
|
55
73
|
get sessionId() {
|
|
56
74
|
return this._sessionId;
|
|
57
75
|
}
|
|
@@ -81,7 +99,9 @@ export class Connection {
|
|
|
81
99
|
this.handleSend(envelope);
|
|
82
100
|
break;
|
|
83
101
|
case 'ACK':
|
|
84
|
-
|
|
102
|
+
if (this.onAck) {
|
|
103
|
+
this.onAck(envelope);
|
|
104
|
+
}
|
|
85
105
|
break;
|
|
86
106
|
case 'PONG':
|
|
87
107
|
this.handlePong(envelope);
|
|
@@ -102,12 +122,19 @@ export class Connection {
|
|
|
102
122
|
}
|
|
103
123
|
this._agentName = envelope.payload.agent;
|
|
104
124
|
this._cli = envelope.payload.cli;
|
|
125
|
+
this._program = envelope.payload.program;
|
|
126
|
+
this._model = envelope.payload.model;
|
|
127
|
+
this._task = envelope.payload.task;
|
|
128
|
+
this._workingDirectory = envelope.payload.workingDirectory;
|
|
105
129
|
// Check for session resume
|
|
106
130
|
if (envelope.payload.session?.resume_token) {
|
|
107
131
|
// Resume tokens are not persisted; tell client to start a fresh session.
|
|
108
132
|
this.sendError('RESUME_TOO_OLD', 'Session resume not yet supported; starting new session', false);
|
|
109
133
|
}
|
|
110
134
|
// Send WELCOME
|
|
135
|
+
// Note: resume_token is omitted because session resume is not yet implemented.
|
|
136
|
+
// Sending a token would cause clients to attempt resume on reconnect,
|
|
137
|
+
// triggering a RESUME_TOO_OLD -> new token -> reconnect loop.
|
|
111
138
|
const welcome = {
|
|
112
139
|
v: PROTOCOL_VERSION,
|
|
113
140
|
type: 'WELCOME',
|
|
@@ -115,7 +142,6 @@ export class Connection {
|
|
|
115
142
|
ts: Date.now(),
|
|
116
143
|
payload: {
|
|
117
144
|
session_id: this._sessionId,
|
|
118
|
-
resume_token: this._resumeToken,
|
|
119
145
|
server: {
|
|
120
146
|
max_frame_bytes: this.config.maxFrameBytes,
|
|
121
147
|
heartbeat_ms: this.config.heartbeatMs,
|
|
@@ -144,6 +170,9 @@ export class Connection {
|
|
|
144
170
|
handlePong(_envelope) {
|
|
145
171
|
// Note: envelope.payload.nonce could be used for RTT calculation in the future
|
|
146
172
|
this.lastPongReceived = Date.now();
|
|
173
|
+
if (this.onPong) {
|
|
174
|
+
this.onPong();
|
|
175
|
+
}
|
|
147
176
|
}
|
|
148
177
|
startHeartbeat() {
|
|
149
178
|
this.heartbeatTimer = setInterval(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/daemon/connection.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/daemon/connection.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC"}
|
package/dist/daemon/index.js
CHANGED
package/dist/daemon/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Registry (public entrypoint)
|
|
3
|
+
* Persists agent metadata across daemon restarts.
|
|
4
|
+
*
|
|
5
|
+
* This file mirrors docs/TMUX_IMPROVEMENTS.md guidance and re-exports the
|
|
6
|
+
* implementation from agent-registry.ts so both import paths work.
|
|
7
|
+
*/
|
|
8
|
+
export { AgentRegistry, type AgentRecord } from './agent-registry.js';
|
|
9
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/daemon/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Registry (public entrypoint)
|
|
3
|
+
* Persists agent metadata across daemon restarts.
|
|
4
|
+
*
|
|
5
|
+
* This file mirrors docs/TMUX_IMPROVEMENTS.md guidance and re-exports the
|
|
6
|
+
* implementation from agent-registry.ts so both import paths work.
|
|
7
|
+
*/
|
|
8
|
+
export { AgentRegistry } from './agent-registry.js';
|
|
9
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/daemon/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,aAAa,EAAoB,MAAM,qBAAqB,CAAC"}
|
package/dist/daemon/router.d.ts
CHANGED
|
@@ -2,24 +2,42 @@
|
|
|
2
2
|
* Message router for the agent relay daemon.
|
|
3
3
|
* Handles routing messages between agents, topic subscriptions, and broadcast.
|
|
4
4
|
*/
|
|
5
|
-
import { type Envelope, type
|
|
5
|
+
import { type Envelope, type SendEnvelope, type AckPayload } from '../protocol/types.js';
|
|
6
6
|
import type { StorageAdapter } from '../storage/adapter.js';
|
|
7
|
+
import type { AgentRegistry } from './agent-registry.js';
|
|
7
8
|
export interface RoutableConnection {
|
|
8
9
|
id: string;
|
|
9
10
|
agentName?: string;
|
|
10
11
|
cli?: string;
|
|
12
|
+
program?: string;
|
|
13
|
+
model?: string;
|
|
14
|
+
task?: string;
|
|
15
|
+
workingDirectory?: string;
|
|
11
16
|
sessionId: string;
|
|
12
17
|
close(): void;
|
|
13
18
|
send(envelope: Envelope): boolean;
|
|
14
19
|
getNextSeq(topic: string, peer: string): number;
|
|
15
20
|
}
|
|
21
|
+
export interface DeliveryReliabilityOptions {
|
|
22
|
+
/** How long to wait for an ACK before retrying (ms) */
|
|
23
|
+
ackTimeoutMs: number;
|
|
24
|
+
/** Maximum attempts (initial send counts as attempt 1) */
|
|
25
|
+
maxAttempts: number;
|
|
26
|
+
/** How long to keep retrying before dropping (ms) */
|
|
27
|
+
deliveryTtlMs: number;
|
|
28
|
+
}
|
|
16
29
|
export declare class Router {
|
|
17
30
|
private storage?;
|
|
18
31
|
private connections;
|
|
19
32
|
private agents;
|
|
20
33
|
private subscriptions;
|
|
34
|
+
private pendingDeliveries;
|
|
35
|
+
private deliveryOptions;
|
|
36
|
+
private registry?;
|
|
21
37
|
constructor(options?: {
|
|
22
38
|
storage?: StorageAdapter;
|
|
39
|
+
delivery?: Partial<DeliveryReliabilityOptions>;
|
|
40
|
+
registry?: AgentRegistry;
|
|
23
41
|
});
|
|
24
42
|
/**
|
|
25
43
|
* Register a connection after successful handshake.
|
|
@@ -40,7 +58,7 @@ export declare class Router {
|
|
|
40
58
|
/**
|
|
41
59
|
* Route a SEND message to its destination(s).
|
|
42
60
|
*/
|
|
43
|
-
route(from: RoutableConnection, envelope:
|
|
61
|
+
route(from: RoutableConnection, envelope: SendEnvelope): void;
|
|
44
62
|
/**
|
|
45
63
|
* Send a direct message to a specific agent.
|
|
46
64
|
*/
|
|
@@ -69,5 +87,19 @@ export declare class Router {
|
|
|
69
87
|
* Get number of active connections.
|
|
70
88
|
*/
|
|
71
89
|
get connectionCount(): number;
|
|
90
|
+
get pendingDeliveryCount(): number;
|
|
91
|
+
/**
|
|
92
|
+
* Handle ACK for previously delivered messages.
|
|
93
|
+
*/
|
|
94
|
+
handleAck(connection: RoutableConnection, envelope: Envelope<AckPayload>): void;
|
|
95
|
+
/**
|
|
96
|
+
* Clear pending deliveries for a connection (e.g., on disconnect).
|
|
97
|
+
*/
|
|
98
|
+
clearPendingForConnection(connectionId: string): void;
|
|
99
|
+
/**
|
|
100
|
+
* Track a delivery and schedule retries until ACKed or TTL/attempts exhausted.
|
|
101
|
+
*/
|
|
102
|
+
private trackDelivery;
|
|
103
|
+
private scheduleRetry;
|
|
72
104
|
}
|
|
73
105
|
//# sourceMappingURL=router.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/daemon/router.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,KAAK,QAAQ,
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/daemon/router.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,KAAK,QAAQ,EAGb,KAAK,YAAY,EAEjB,KAAK,UAAU,EAEhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC;IAClC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CACjD;AAED,MAAM,WAAW,0BAA0B;IACzC,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,aAAa,EAAE,MAAM,CAAC;CACvB;AAgBD,qBAAa,MAAM;IACjB,OAAO,CAAC,OAAO,CAAC,CAAiB;IACjC,OAAO,CAAC,WAAW,CAA8C;IACjE,OAAO,CAAC,MAAM,CAA8C;IAC5D,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,iBAAiB,CAA2C;IACpE,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,CAAgB;gBAErB,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,cAAc,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAC;QAAC,QAAQ,CAAC,EAAE,aAAa,CAAA;KAAO;IAMhI;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI;IAsB9C;;OAEG;IACH,UAAU,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI;IAiBhD;;OAEG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IASjD;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAUnD;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI;IAuB7D;;OAEG;IACH,OAAO,CAAC,UAAU;IAsBlB;;OAEG;IACH,OAAO,CAAC,SAAS;IAyBjB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAuB7B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAsB9B;;OAEG;IACH,SAAS,IAAI,MAAM,EAAE;IAIrB;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAIhE;;OAEG;IACH,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,oBAAoB,IAAI,MAAM,CAEjC;IAED;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI;IAe/E;;OAEG;IACH,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IASrD;;OAEG;IACH,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,aAAa;CAqCtB"}
|
package/dist/daemon/router.js
CHANGED
|
@@ -4,13 +4,23 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { v4 as uuid } from 'uuid';
|
|
6
6
|
import { PROTOCOL_VERSION, } from '../protocol/types.js';
|
|
7
|
+
const DEFAULT_DELIVERY_OPTIONS = {
|
|
8
|
+
ackTimeoutMs: 2000,
|
|
9
|
+
maxAttempts: 5,
|
|
10
|
+
deliveryTtlMs: 60_000,
|
|
11
|
+
};
|
|
7
12
|
export class Router {
|
|
8
13
|
storage;
|
|
9
14
|
connections = new Map(); // connectionId -> Connection
|
|
10
15
|
agents = new Map(); // agentName -> Connection
|
|
11
16
|
subscriptions = new Map(); // topic -> Set<agentName>
|
|
17
|
+
pendingDeliveries = new Map(); // deliverId -> pending
|
|
18
|
+
deliveryOptions;
|
|
19
|
+
registry;
|
|
12
20
|
constructor(options = {}) {
|
|
13
21
|
this.storage = options.storage;
|
|
22
|
+
this.deliveryOptions = { ...DEFAULT_DELIVERY_OPTIONS, ...options.delivery };
|
|
23
|
+
this.registry = options.registry;
|
|
14
24
|
}
|
|
15
25
|
/**
|
|
16
26
|
* Register a connection after successful handshake.
|
|
@@ -25,6 +35,14 @@ export class Router {
|
|
|
25
35
|
this.connections.delete(existing.id);
|
|
26
36
|
}
|
|
27
37
|
this.agents.set(connection.agentName, connection);
|
|
38
|
+
this.registry?.registerOrUpdate({
|
|
39
|
+
name: connection.agentName,
|
|
40
|
+
cli: connection.cli,
|
|
41
|
+
program: connection.program,
|
|
42
|
+
model: connection.model,
|
|
43
|
+
task: connection.task,
|
|
44
|
+
workingDirectory: connection.workingDirectory,
|
|
45
|
+
});
|
|
28
46
|
}
|
|
29
47
|
}
|
|
30
48
|
/**
|
|
@@ -42,6 +60,7 @@ export class Router {
|
|
|
42
60
|
subscribers.delete(connection.agentName);
|
|
43
61
|
}
|
|
44
62
|
}
|
|
63
|
+
this.clearPendingForConnection(connection.id);
|
|
45
64
|
}
|
|
46
65
|
/**
|
|
47
66
|
* Subscribe an agent to a topic.
|
|
@@ -75,6 +94,7 @@ export class Router {
|
|
|
75
94
|
console.log(`[router] Dropping message - sender has no name`);
|
|
76
95
|
return;
|
|
77
96
|
}
|
|
97
|
+
this.registry?.recordSend(senderName);
|
|
78
98
|
const to = envelope.to;
|
|
79
99
|
const topic = envelope.topic;
|
|
80
100
|
console.log(`[router] ${senderName} -> ${to}: ${envelope.payload.body?.substring(0, 50)}...`);
|
|
@@ -100,6 +120,10 @@ export class Router {
|
|
|
100
120
|
const sent = target.send(deliver);
|
|
101
121
|
console.log(`[router] Delivered to ${to}: ${sent ? 'success' : 'failed'}`);
|
|
102
122
|
this.persistDeliverEnvelope(deliver);
|
|
123
|
+
if (sent) {
|
|
124
|
+
this.trackDelivery(target, deliver);
|
|
125
|
+
this.registry?.recordReceive(to);
|
|
126
|
+
}
|
|
103
127
|
return sent;
|
|
104
128
|
}
|
|
105
129
|
/**
|
|
@@ -115,8 +139,12 @@ export class Router {
|
|
|
115
139
|
const target = this.agents.get(agentName);
|
|
116
140
|
if (target) {
|
|
117
141
|
const deliver = this.createDeliverEnvelope(from, agentName, envelope, target);
|
|
118
|
-
target.send(deliver);
|
|
142
|
+
const sent = target.send(deliver);
|
|
119
143
|
this.persistDeliverEnvelope(deliver);
|
|
144
|
+
if (sent) {
|
|
145
|
+
this.trackDelivery(target, deliver);
|
|
146
|
+
this.registry?.recordReceive(agentName);
|
|
147
|
+
}
|
|
120
148
|
}
|
|
121
149
|
}
|
|
122
150
|
}
|
|
@@ -133,6 +161,7 @@ export class Router {
|
|
|
133
161
|
to,
|
|
134
162
|
topic: original.topic,
|
|
135
163
|
payload: original.payload,
|
|
164
|
+
payload_meta: original.payload_meta,
|
|
136
165
|
delivery: {
|
|
137
166
|
seq: target.getNextSeq(original.topic ?? 'default', from),
|
|
138
167
|
session_id: target.sessionId,
|
|
@@ -157,6 +186,8 @@ export class Router {
|
|
|
157
186
|
deliverySeq: envelope.delivery.seq,
|
|
158
187
|
deliverySessionId: envelope.delivery.session_id,
|
|
159
188
|
sessionId: envelope.delivery.session_id,
|
|
189
|
+
status: 'unread',
|
|
190
|
+
is_urgent: false,
|
|
160
191
|
}).catch((err) => {
|
|
161
192
|
console.error('[router] Failed to persist message', err);
|
|
162
193
|
});
|
|
@@ -179,5 +210,84 @@ export class Router {
|
|
|
179
210
|
get connectionCount() {
|
|
180
211
|
return this.connections.size;
|
|
181
212
|
}
|
|
213
|
+
get pendingDeliveryCount() {
|
|
214
|
+
return this.pendingDeliveries.size;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Handle ACK for previously delivered messages.
|
|
218
|
+
*/
|
|
219
|
+
handleAck(connection, envelope) {
|
|
220
|
+
const ackId = envelope.payload.ack_id;
|
|
221
|
+
const pending = this.pendingDeliveries.get(ackId);
|
|
222
|
+
if (!pending)
|
|
223
|
+
return;
|
|
224
|
+
// Only accept ACKs from the same connection that received the deliver
|
|
225
|
+
if (pending.connectionId !== connection.id)
|
|
226
|
+
return;
|
|
227
|
+
if (pending.timer) {
|
|
228
|
+
clearTimeout(pending.timer);
|
|
229
|
+
}
|
|
230
|
+
this.pendingDeliveries.delete(ackId);
|
|
231
|
+
console.log(`[router] ACK received for ${ackId}`);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Clear pending deliveries for a connection (e.g., on disconnect).
|
|
235
|
+
*/
|
|
236
|
+
clearPendingForConnection(connectionId) {
|
|
237
|
+
for (const [id, pending] of this.pendingDeliveries.entries()) {
|
|
238
|
+
if (pending.connectionId === connectionId) {
|
|
239
|
+
if (pending.timer)
|
|
240
|
+
clearTimeout(pending.timer);
|
|
241
|
+
this.pendingDeliveries.delete(id);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Track a delivery and schedule retries until ACKed or TTL/attempts exhausted.
|
|
247
|
+
*/
|
|
248
|
+
trackDelivery(target, deliver) {
|
|
249
|
+
const pending = {
|
|
250
|
+
envelope: deliver,
|
|
251
|
+
connectionId: target.id,
|
|
252
|
+
attempts: 1,
|
|
253
|
+
firstSentAt: Date.now(),
|
|
254
|
+
};
|
|
255
|
+
pending.timer = this.scheduleRetry(deliver.id);
|
|
256
|
+
this.pendingDeliveries.set(deliver.id, pending);
|
|
257
|
+
}
|
|
258
|
+
scheduleRetry(deliverId) {
|
|
259
|
+
return setTimeout(() => {
|
|
260
|
+
const pending = this.pendingDeliveries.get(deliverId);
|
|
261
|
+
if (!pending)
|
|
262
|
+
return;
|
|
263
|
+
const now = Date.now();
|
|
264
|
+
const elapsed = now - pending.firstSentAt;
|
|
265
|
+
if (elapsed > this.deliveryOptions.deliveryTtlMs) {
|
|
266
|
+
console.warn(`[router] Dropping ${deliverId} after TTL (${this.deliveryOptions.deliveryTtlMs}ms)`);
|
|
267
|
+
this.pendingDeliveries.delete(deliverId);
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
if (pending.attempts >= this.deliveryOptions.maxAttempts) {
|
|
271
|
+
console.warn(`[router] Dropping ${deliverId} after max attempts (${this.deliveryOptions.maxAttempts})`);
|
|
272
|
+
this.pendingDeliveries.delete(deliverId);
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
const target = this.connections.get(pending.connectionId);
|
|
276
|
+
if (!target) {
|
|
277
|
+
console.warn(`[router] Dropping ${deliverId} - connection unavailable`);
|
|
278
|
+
this.pendingDeliveries.delete(deliverId);
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
pending.attempts++;
|
|
282
|
+
const sent = target.send(pending.envelope);
|
|
283
|
+
if (!sent) {
|
|
284
|
+
console.warn(`[router] Retry failed for ${deliverId} (attempt ${pending.attempts})`);
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
console.log(`[router] Retried ${deliverId} (attempt ${pending.attempts})`);
|
|
288
|
+
}
|
|
289
|
+
pending.timer = this.scheduleRetry(deliverId);
|
|
290
|
+
}, this.deliveryOptions.ackTimeoutMs);
|
|
291
|
+
}
|
|
182
292
|
}
|
|
183
293
|
//# sourceMappingURL=router.js.map
|