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.
Files changed (72) hide show
  1. package/README.md +18 -6
  2. package/dist/cli/index.d.ts +2 -0
  3. package/dist/cli/index.d.ts.map +1 -1
  4. package/dist/cli/index.js +344 -3
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/daemon/agent-registry.d.ts +60 -0
  7. package/dist/daemon/agent-registry.d.ts.map +1 -0
  8. package/dist/daemon/agent-registry.js +158 -0
  9. package/dist/daemon/agent-registry.js.map +1 -0
  10. package/dist/daemon/connection.d.ts +11 -1
  11. package/dist/daemon/connection.d.ts.map +1 -1
  12. package/dist/daemon/connection.js +31 -2
  13. package/dist/daemon/connection.js.map +1 -1
  14. package/dist/daemon/index.d.ts +2 -0
  15. package/dist/daemon/index.d.ts.map +1 -1
  16. package/dist/daemon/index.js +2 -0
  17. package/dist/daemon/index.js.map +1 -1
  18. package/dist/daemon/registry.d.ts +9 -0
  19. package/dist/daemon/registry.d.ts.map +1 -0
  20. package/dist/daemon/registry.js +9 -0
  21. package/dist/daemon/registry.js.map +1 -0
  22. package/dist/daemon/router.d.ts +34 -2
  23. package/dist/daemon/router.d.ts.map +1 -1
  24. package/dist/daemon/router.js +111 -1
  25. package/dist/daemon/router.js.map +1 -1
  26. package/dist/daemon/server.d.ts +1 -0
  27. package/dist/daemon/server.d.ts.map +1 -1
  28. package/dist/daemon/server.js +60 -13
  29. package/dist/daemon/server.js.map +1 -1
  30. package/dist/dashboard/public/index.html +625 -16
  31. package/dist/dashboard/server.d.ts +1 -1
  32. package/dist/dashboard/server.d.ts.map +1 -1
  33. package/dist/dashboard/server.js +125 -7
  34. package/dist/dashboard/server.js.map +1 -1
  35. package/dist/index.d.ts +1 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/protocol/types.d.ts +15 -1
  38. package/dist/protocol/types.d.ts.map +1 -1
  39. package/dist/storage/adapter.d.ts +53 -0
  40. package/dist/storage/adapter.d.ts.map +1 -1
  41. package/dist/storage/adapter.js +3 -0
  42. package/dist/storage/adapter.js.map +1 -1
  43. package/dist/storage/sqlite-adapter.d.ts +58 -1
  44. package/dist/storage/sqlite-adapter.d.ts.map +1 -1
  45. package/dist/storage/sqlite-adapter.js +374 -47
  46. package/dist/storage/sqlite-adapter.js.map +1 -1
  47. package/dist/utils/project-namespace.d.ts.map +1 -1
  48. package/dist/utils/project-namespace.js +22 -1
  49. package/dist/utils/project-namespace.js.map +1 -1
  50. package/dist/wrapper/client.d.ts +22 -3
  51. package/dist/wrapper/client.d.ts.map +1 -1
  52. package/dist/wrapper/client.js +59 -9
  53. package/dist/wrapper/client.js.map +1 -1
  54. package/dist/wrapper/parser.d.ts +110 -4
  55. package/dist/wrapper/parser.d.ts.map +1 -1
  56. package/dist/wrapper/parser.js +296 -84
  57. package/dist/wrapper/parser.js.map +1 -1
  58. package/dist/wrapper/tmux-wrapper.d.ts +100 -9
  59. package/dist/wrapper/tmux-wrapper.d.ts.map +1 -1
  60. package/dist/wrapper/tmux-wrapper.js +437 -77
  61. package/dist/wrapper/tmux-wrapper.js.map +1 -1
  62. package/docs/AGENTS.md +27 -27
  63. package/docs/CHANGELOG.md +1 -1
  64. package/docs/DESIGN_V2.md +1079 -0
  65. package/docs/INTEGRATION-GUIDE.md +926 -0
  66. package/docs/PROPOSAL-trajectories.md +1582 -0
  67. package/docs/PROTOCOL.md +3 -3
  68. package/docs/SCALING_ANALYSIS.md +280 -0
  69. package/docs/TMUX_IMPLEMENTATION_NOTES.md +9 -9
  70. package/docs/TMUX_IMPROVEMENTS.md +968 -0
  71. package/docs/competitive-analysis-mcp-agent-mail.md +389 -0
  72. 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,EAOd,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,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;gBAEV,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,SAAS,IAAI,MAAM,CAEtB;IAED,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,WAAW;IA0CnB,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,UAAU;IAKlB,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"}
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
- // ACKs are currently accepted but not used for reliability in the daemon.
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":"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"}
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/daemon/connection.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  export * from './server.js';
2
2
  export * from './router.js';
3
3
  export * from './connection.js';
4
+ export * from './agent-registry.js';
5
+ export * from './registry.js';
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -1,4 +1,6 @@
1
1
  export * from './server.js';
2
2
  export * from './router.js';
3
3
  export * from './connection.js';
4
+ export * from './agent-registry.js';
5
+ export * from './registry.js';
4
6
  //# sourceMappingURL=index.js.map
@@ -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"}
@@ -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 SendPayload } from '../protocol/types.js';
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: Envelope<SendPayload>): void;
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,EACb,KAAK,WAAW,EAGjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,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,qBAAa,MAAM;IACjB,OAAO,CAAC,OAAO,CAAC,CAAiB;IACjC,OAAO,CAAC,WAAW,CAA8C;IACjE,OAAO,CAAC,MAAM,CAA8C;IAC5D,OAAO,CAAC,aAAa,CAAuC;gBAEhD,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,cAAc,CAAA;KAAO;IAItD;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI;IAc9C;;OAEG;IACH,UAAU,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI;IAehD;;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,QAAQ,CAAC,WAAW,CAAC,GAAG,IAAI;IAqBtE;;OAEG;IACH,OAAO,CAAC,UAAU;IAkBlB;;OAEG;IACH,OAAO,CAAC,SAAS;IAqBjB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAsB7B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoB9B;;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;CACF"}
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"}
@@ -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