@affectively/aeon 1.0.0 → 1.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.
Files changed (60) hide show
  1. package/README.md +10 -0
  2. package/dist/compression/index.cjs +580 -0
  3. package/dist/compression/index.cjs.map +1 -0
  4. package/dist/compression/index.d.cts +189 -0
  5. package/dist/compression/index.d.ts +189 -0
  6. package/dist/compression/index.js +573 -0
  7. package/dist/compression/index.js.map +1 -0
  8. package/dist/crypto/index.cjs +100 -0
  9. package/dist/crypto/index.cjs.map +1 -0
  10. package/dist/crypto/index.d.cts +407 -0
  11. package/dist/crypto/index.d.ts +407 -0
  12. package/dist/crypto/index.js +96 -0
  13. package/dist/crypto/index.js.map +1 -0
  14. package/dist/distributed/index.cjs +420 -23
  15. package/dist/distributed/index.cjs.map +1 -1
  16. package/dist/distributed/index.d.cts +901 -2
  17. package/dist/distributed/index.d.ts +901 -2
  18. package/dist/distributed/index.js +420 -23
  19. package/dist/distributed/index.js.map +1 -1
  20. package/dist/index.cjs +1071 -55
  21. package/dist/index.cjs.map +1 -1
  22. package/dist/index.d.cts +11 -811
  23. package/dist/index.d.ts +11 -811
  24. package/dist/index.js +1070 -56
  25. package/dist/index.js.map +1 -1
  26. package/dist/offline/index.cjs +419 -0
  27. package/dist/offline/index.cjs.map +1 -0
  28. package/dist/offline/index.d.cts +148 -0
  29. package/dist/offline/index.d.ts +148 -0
  30. package/dist/offline/index.js +415 -0
  31. package/dist/offline/index.js.map +1 -0
  32. package/dist/optimization/index.cjs +797 -0
  33. package/dist/optimization/index.cjs.map +1 -0
  34. package/dist/optimization/index.d.cts +347 -0
  35. package/dist/optimization/index.d.ts +347 -0
  36. package/dist/optimization/index.js +787 -0
  37. package/dist/optimization/index.js.map +1 -0
  38. package/dist/persistence/index.cjs +145 -0
  39. package/dist/persistence/index.cjs.map +1 -0
  40. package/dist/persistence/index.d.cts +63 -0
  41. package/dist/persistence/index.d.ts +63 -0
  42. package/dist/persistence/index.js +142 -0
  43. package/dist/persistence/index.js.map +1 -0
  44. package/dist/presence/index.cjs +338 -0
  45. package/dist/presence/index.cjs.map +1 -0
  46. package/dist/presence/index.d.cts +168 -0
  47. package/dist/presence/index.d.ts +168 -0
  48. package/dist/presence/index.js +334 -0
  49. package/dist/presence/index.js.map +1 -0
  50. package/dist/types-CMxO7QF0.d.cts +33 -0
  51. package/dist/types-CMxO7QF0.d.ts +33 -0
  52. package/dist/versioning/index.cjs +296 -14
  53. package/dist/versioning/index.cjs.map +1 -1
  54. package/dist/versioning/index.d.cts +66 -1
  55. package/dist/versioning/index.d.ts +66 -1
  56. package/dist/versioning/index.js +296 -14
  57. package/dist/versioning/index.js.map +1 -1
  58. package/package.json +51 -1
  59. package/dist/index-C_4CMV5c.d.cts +0 -1207
  60. package/dist/index-C_4CMV5c.d.ts +0 -1207
@@ -0,0 +1,338 @@
1
+ 'use strict';
2
+
3
+ var eventemitter3 = require('eventemitter3');
4
+
5
+ // src/presence/AgentPresenceManager.ts
6
+
7
+ // src/utils/logger.ts
8
+ var consoleLogger = {
9
+ debug: (...args) => {
10
+ console.debug("[AEON:DEBUG]", ...args);
11
+ },
12
+ info: (...args) => {
13
+ console.info("[AEON:INFO]", ...args);
14
+ },
15
+ warn: (...args) => {
16
+ console.warn("[AEON:WARN]", ...args);
17
+ },
18
+ error: (...args) => {
19
+ console.error("[AEON:ERROR]", ...args);
20
+ }
21
+ };
22
+ var currentLogger = consoleLogger;
23
+ function getLogger() {
24
+ return currentLogger;
25
+ }
26
+
27
+ // src/presence/AgentPresenceManager.ts
28
+ var logger = getLogger();
29
+ var AgentPresenceManager = class extends eventemitter3.EventEmitter {
30
+ presences = /* @__PURE__ */ new Map();
31
+ sessionId;
32
+ heartbeatInterval = null;
33
+ heartbeatTimeout = 3e4;
34
+ inactivityThreshold = 6e4;
35
+ constructor(sessionId) {
36
+ super();
37
+ this.sessionId = sessionId;
38
+ this.startHeartbeatCheck();
39
+ logger.debug("[AgentPresenceManager] Initialized", { sessionId });
40
+ }
41
+ /**
42
+ * Add or update agent presence
43
+ */
44
+ updatePresence(agentId, presence) {
45
+ const existing = this.presences.get(agentId);
46
+ const now = (/* @__PURE__ */ new Date()).toISOString();
47
+ const updated = {
48
+ ...existing,
49
+ ...presence,
50
+ agentId,
51
+ joinedAt: existing?.joinedAt ?? now,
52
+ lastSeen: now
53
+ };
54
+ this.presences.set(agentId, updated);
55
+ this.emit("presence_updated", {
56
+ agentId,
57
+ presence: updated
58
+ });
59
+ }
60
+ /**
61
+ * Agent joined
62
+ */
63
+ agentJoined(agentId, name, role = "user", metadata) {
64
+ const now = (/* @__PURE__ */ new Date()).toISOString();
65
+ const presence = {
66
+ agentId,
67
+ name,
68
+ role,
69
+ status: "online",
70
+ joinedAt: now,
71
+ lastSeen: now,
72
+ metadata
73
+ };
74
+ this.presences.set(agentId, presence);
75
+ this.emit("agent_joined", { agentId, presence });
76
+ logger.debug("[AgentPresenceManager] Agent joined", {
77
+ agentId,
78
+ name,
79
+ role
80
+ });
81
+ }
82
+ /**
83
+ * Agent left
84
+ */
85
+ agentLeft(agentId) {
86
+ const presence = this.presences.get(agentId);
87
+ if (presence) {
88
+ presence.status = "offline";
89
+ presence.lastSeen = (/* @__PURE__ */ new Date()).toISOString();
90
+ this.presences.set(agentId, presence);
91
+ this.emit("agent_left", { agentId, presence });
92
+ logger.debug("[AgentPresenceManager] Agent left", { agentId });
93
+ }
94
+ }
95
+ /**
96
+ * Update cursor position
97
+ */
98
+ updateCursor(agentId, x, y, path) {
99
+ const presence = this.presences.get(agentId);
100
+ if (presence) {
101
+ presence.cursorPosition = { x, y, path };
102
+ presence.lastSeen = (/* @__PURE__ */ new Date()).toISOString();
103
+ this.presences.set(agentId, presence);
104
+ this.emit("cursor_updated", {
105
+ agentId,
106
+ cursorPosition: presence.cursorPosition
107
+ });
108
+ }
109
+ }
110
+ /**
111
+ * Update active section
112
+ */
113
+ updateActiveSection(agentId, section) {
114
+ const presence = this.presences.get(agentId);
115
+ if (presence) {
116
+ presence.activeSection = section;
117
+ presence.lastSeen = (/* @__PURE__ */ new Date()).toISOString();
118
+ this.presences.set(agentId, presence);
119
+ this.emit("section_updated", {
120
+ agentId,
121
+ activeSection: section
122
+ });
123
+ }
124
+ }
125
+ /**
126
+ * Update status
127
+ */
128
+ updateStatus(agentId, status) {
129
+ const presence = this.presences.get(agentId);
130
+ if (presence) {
131
+ presence.status = status;
132
+ presence.lastSeen = (/* @__PURE__ */ new Date()).toISOString();
133
+ this.presences.set(agentId, presence);
134
+ this.emit("status_updated", { agentId, status });
135
+ }
136
+ }
137
+ /**
138
+ * Heartbeat from agent (keeps them online)
139
+ */
140
+ heartbeat(agentId) {
141
+ const presence = this.presences.get(agentId);
142
+ if (presence) {
143
+ if (presence.status === "reconnecting") {
144
+ presence.status = "online";
145
+ this.emit("status_updated", { agentId, status: "online" });
146
+ }
147
+ presence.lastSeen = (/* @__PURE__ */ new Date()).toISOString();
148
+ this.presences.set(agentId, presence);
149
+ }
150
+ }
151
+ /**
152
+ * Get presence for agent
153
+ */
154
+ getPresence(agentId) {
155
+ return this.presences.get(agentId);
156
+ }
157
+ /**
158
+ * Get all online agents
159
+ */
160
+ getOnlineAgents() {
161
+ return Array.from(this.presences.values()).filter(
162
+ (p) => p.status === "online"
163
+ );
164
+ }
165
+ /**
166
+ * Get all agents
167
+ */
168
+ getAllAgents() {
169
+ return Array.from(this.presences.values());
170
+ }
171
+ /**
172
+ * Get all presences
173
+ */
174
+ getAllPresences() {
175
+ return Array.from(this.presences.values());
176
+ }
177
+ /**
178
+ * Get agent count
179
+ */
180
+ getAgentCount() {
181
+ const counts = {
182
+ online: 0,
183
+ away: 0,
184
+ offline: 0,
185
+ reconnecting: 0
186
+ };
187
+ this.presences.forEach((p) => {
188
+ counts[p.status]++;
189
+ });
190
+ return counts;
191
+ }
192
+ /**
193
+ * Get statistics
194
+ */
195
+ getStats() {
196
+ return {
197
+ totalAgents: this.presences.size,
198
+ onlineAgents: Array.from(this.presences.values()).filter(
199
+ (p) => p.status === "online"
200
+ ).length,
201
+ offlineAgents: Array.from(this.presences.values()).filter(
202
+ (p) => p.status === "offline"
203
+ ).length,
204
+ awayAgents: Array.from(this.presences.values()).filter(
205
+ (p) => p.status === "away"
206
+ ).length,
207
+ reconnectingAgents: Array.from(this.presences.values()).filter(
208
+ (p) => p.status === "reconnecting"
209
+ ).length
210
+ };
211
+ }
212
+ /**
213
+ * Clear expired presences
214
+ */
215
+ clearExpiredPresences(maxAgeMs) {
216
+ const now = Date.now();
217
+ const toRemove = [];
218
+ this.presences.forEach((presence, agentId) => {
219
+ const lastSeenTime = new Date(presence.lastSeen).getTime();
220
+ const ageMs = now - lastSeenTime;
221
+ if (ageMs > maxAgeMs && presence.status === "offline") {
222
+ toRemove.push(agentId);
223
+ }
224
+ });
225
+ toRemove.forEach((agentId) => {
226
+ this.presences.delete(agentId);
227
+ });
228
+ if (toRemove.length > 0) {
229
+ logger.debug("[AgentPresenceManager] Cleared expired presences", {
230
+ count: toRemove.length
231
+ });
232
+ }
233
+ }
234
+ /**
235
+ * Get agents by role
236
+ */
237
+ getByRole(role) {
238
+ return Array.from(this.presences.values()).filter((p) => p.role === role);
239
+ }
240
+ /**
241
+ * Get agents in active section
242
+ */
243
+ getInSection(section) {
244
+ return Array.from(this.presences.values()).filter(
245
+ (p) => p.activeSection === section && p.status === "online"
246
+ );
247
+ }
248
+ /**
249
+ * Get presence timeline
250
+ */
251
+ getPresenceStats() {
252
+ const stats = {
253
+ total: this.presences.size,
254
+ online: 0,
255
+ away: 0,
256
+ offline: 0,
257
+ reconnecting: 0,
258
+ byRole: {}
259
+ };
260
+ this.presences.forEach((p) => {
261
+ stats[p.status]++;
262
+ stats.byRole[p.role] = (stats.byRole[p.role] ?? 0) + 1;
263
+ });
264
+ return stats;
265
+ }
266
+ /**
267
+ * Start heartbeat check (mark inactive agents as away)
268
+ */
269
+ startHeartbeatCheck() {
270
+ this.heartbeatInterval = setInterval(() => {
271
+ const now = Date.now();
272
+ this.presences.forEach((presence) => {
273
+ const lastSeenTime = new Date(presence.lastSeen).getTime();
274
+ const timeSinceLastSeen = now - lastSeenTime;
275
+ if (timeSinceLastSeen > this.inactivityThreshold && presence.status === "online") {
276
+ presence.status = "away";
277
+ this.emit("status_updated", {
278
+ agentId: presence.agentId,
279
+ status: "away"
280
+ });
281
+ }
282
+ if (timeSinceLastSeen > this.heartbeatTimeout && presence.status !== "offline") {
283
+ presence.status = "reconnecting";
284
+ this.emit("status_updated", {
285
+ agentId: presence.agentId,
286
+ status: "reconnecting"
287
+ });
288
+ }
289
+ });
290
+ }, 1e4);
291
+ }
292
+ /**
293
+ * Stop heartbeat monitoring
294
+ */
295
+ stopHeartbeatMonitoring() {
296
+ if (this.heartbeatInterval) {
297
+ clearInterval(this.heartbeatInterval);
298
+ this.heartbeatInterval = null;
299
+ }
300
+ }
301
+ /**
302
+ * Clear all presences
303
+ */
304
+ clear() {
305
+ this.presences.clear();
306
+ }
307
+ /**
308
+ * Destroy the manager
309
+ */
310
+ destroy() {
311
+ this.stopHeartbeatMonitoring();
312
+ this.presences.clear();
313
+ this.removeAllListeners();
314
+ logger.debug("[AgentPresenceManager] Destroyed", {
315
+ sessionId: this.sessionId
316
+ });
317
+ }
318
+ };
319
+ var instances = /* @__PURE__ */ new Map();
320
+ function getAgentPresenceManager(sessionId) {
321
+ if (!instances.has(sessionId)) {
322
+ instances.set(sessionId, new AgentPresenceManager(sessionId));
323
+ }
324
+ return instances.get(sessionId);
325
+ }
326
+ function clearAgentPresenceManager(sessionId) {
327
+ const instance = instances.get(sessionId);
328
+ if (instance) {
329
+ instance.destroy();
330
+ instances.delete(sessionId);
331
+ }
332
+ }
333
+
334
+ exports.AgentPresenceManager = AgentPresenceManager;
335
+ exports.clearAgentPresenceManager = clearAgentPresenceManager;
336
+ exports.getAgentPresenceManager = getAgentPresenceManager;
337
+ //# sourceMappingURL=index.cjs.map
338
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/logger.ts","../../src/presence/AgentPresenceManager.ts"],"names":["EventEmitter"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Aeon Logger Interface\n *\n * Provides a pluggable logging interface that can be configured\n * by consumers to integrate with their preferred logging solution.\n */\n\n/**\n * Logger interface that consumers can implement\n */\nexport interface Logger {\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n}\n\n/**\n * Default console logger implementation\n */\nconst consoleLogger: Logger = {\n debug: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.debug('[AEON:DEBUG]', ...args);\n },\n info: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.info('[AEON:INFO]', ...args);\n },\n warn: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.warn('[AEON:WARN]', ...args);\n },\n error: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.error('[AEON:ERROR]', ...args);\n },\n};\n\n/**\n * No-op logger for production or when logging is disabled\n */\nconst noopLogger: Logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n\n/**\n * Current logger instance\n */\nlet currentLogger: Logger = consoleLogger;\n\n/**\n * Get the current logger instance\n */\nexport function getLogger(): Logger {\n return currentLogger;\n}\n\n/**\n * Set a custom logger implementation\n */\nexport function setLogger(logger: Logger): void {\n currentLogger = logger;\n}\n\n/**\n * Reset to the default console logger\n */\nexport function resetLogger(): void {\n currentLogger = consoleLogger;\n}\n\n/**\n * Disable all logging\n */\nexport function disableLogging(): void {\n currentLogger = noopLogger;\n}\n\n/**\n * Create a namespaced logger\n */\nexport function createNamespacedLogger(namespace: string): Logger {\n const logger = getLogger();\n return {\n debug: (...args: unknown[]) => logger.debug(`[${namespace}]`, ...args),\n info: (...args: unknown[]) => logger.info(`[${namespace}]`, ...args),\n warn: (...args: unknown[]) => logger.warn(`[${namespace}]`, ...args),\n error: (...args: unknown[]) => logger.error(`[${namespace}]`, ...args),\n };\n}\n\n// Export default logger for convenience\nexport const logger: Logger = {\n debug: (...args: unknown[]) => getLogger().debug(...args),\n info: (...args: unknown[]) => getLogger().info(...args),\n warn: (...args: unknown[]) => getLogger().warn(...args),\n error: (...args: unknown[]) => getLogger().error(...args),\n};\n","/**\n * Agent Presence Manager (Phase 14)\n *\n * Tracks real-time presence of all agents in a session.\n * Provides status updates, cursor tracking, and activity monitoring.\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport { getLogger } from '../utils/logger';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface AgentPresence {\n agentId: string;\n name: string;\n role: 'user' | 'assistant' | 'monitor' | 'admin';\n status: 'online' | 'away' | 'offline' | 'reconnecting';\n joinedAt: string;\n lastSeen: string;\n cursorPosition?: { x: number; y: number; path: string };\n activeSection?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface PresenceUpdate {\n agentId: string;\n changes: Partial<AgentPresence>;\n timestamp: string;\n}\n\nexport interface PresenceEvents {\n presence_updated: (data: {\n agentId: string;\n presence: AgentPresence;\n }) => void;\n agent_joined: (data: { agentId: string; presence: AgentPresence }) => void;\n agent_left: (data: { agentId: string; presence: AgentPresence }) => void;\n cursor_updated: (data: {\n agentId: string;\n cursorPosition: { x: number; y: number; path: string };\n }) => void;\n section_updated: (data: { agentId: string; activeSection: string }) => void;\n status_updated: (data: {\n agentId: string;\n status: AgentPresence['status'];\n }) => void;\n}\n\n// ============================================================================\n// Agent Presence Manager\n// ============================================================================\n\nexport class AgentPresenceManager extends EventEmitter<PresenceEvents> {\n private presences: Map<string, AgentPresence> = new Map();\n private sessionId: string;\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n private heartbeatTimeout = 30000;\n private inactivityThreshold = 60000;\n\n constructor(sessionId: string) {\n super();\n this.sessionId = sessionId;\n this.startHeartbeatCheck();\n logger.debug('[AgentPresenceManager] Initialized', { sessionId });\n }\n\n /**\n * Add or update agent presence\n */\n updatePresence(\n agentId: string,\n presence: Omit<AgentPresence, 'joinedAt' | 'lastSeen'>,\n ): void {\n const existing = this.presences.get(agentId);\n const now = new Date().toISOString();\n\n const updated: AgentPresence = {\n ...existing,\n ...presence,\n agentId,\n joinedAt: existing?.joinedAt ?? now,\n lastSeen: now,\n };\n\n this.presences.set(agentId, updated);\n\n this.emit('presence_updated', {\n agentId,\n presence: updated,\n });\n }\n\n /**\n * Agent joined\n */\n agentJoined(\n agentId: string,\n name: string,\n role: AgentPresence['role'] = 'user',\n metadata?: Record<string, unknown>,\n ): void {\n const now = new Date().toISOString();\n\n const presence: AgentPresence = {\n agentId,\n name,\n role,\n status: 'online',\n joinedAt: now,\n lastSeen: now,\n metadata,\n };\n\n this.presences.set(agentId, presence);\n this.emit('agent_joined', { agentId, presence });\n\n logger.debug('[AgentPresenceManager] Agent joined', {\n agentId,\n name,\n role,\n });\n }\n\n /**\n * Agent left\n */\n agentLeft(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.status = 'offline';\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('agent_left', { agentId, presence });\n\n logger.debug('[AgentPresenceManager] Agent left', { agentId });\n }\n }\n\n /**\n * Update cursor position\n */\n updateCursor(agentId: string, x: number, y: number, path: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.cursorPosition = { x, y, path };\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('cursor_updated', {\n agentId,\n cursorPosition: presence.cursorPosition,\n });\n }\n }\n\n /**\n * Update active section\n */\n updateActiveSection(agentId: string, section: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.activeSection = section;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('section_updated', {\n agentId,\n activeSection: section,\n });\n }\n }\n\n /**\n * Update status\n */\n updateStatus(agentId: string, status: AgentPresence['status']): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.status = status;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('status_updated', { agentId, status });\n }\n }\n\n /**\n * Heartbeat from agent (keeps them online)\n */\n heartbeat(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n if (presence.status === 'reconnecting') {\n presence.status = 'online';\n this.emit('status_updated', { agentId, status: 'online' });\n }\n\n presence.lastSeen = new Date().toISOString();\n this.presences.set(agentId, presence);\n }\n }\n\n /**\n * Get presence for agent\n */\n getPresence(agentId: string): AgentPresence | undefined {\n return this.presences.get(agentId);\n }\n\n /**\n * Get all online agents\n */\n getOnlineAgents(): AgentPresence[] {\n return Array.from(this.presences.values()).filter(\n (p) => p.status === 'online',\n );\n }\n\n /**\n * Get all agents\n */\n getAllAgents(): AgentPresence[] {\n return Array.from(this.presences.values());\n }\n\n /**\n * Get all presences\n */\n getAllPresences(): AgentPresence[] {\n return Array.from(this.presences.values());\n }\n\n /**\n * Get agent count\n */\n getAgentCount(): Record<AgentPresence['status'], number> {\n const counts = {\n online: 0,\n away: 0,\n offline: 0,\n reconnecting: 0,\n };\n\n this.presences.forEach((p) => {\n counts[p.status]++;\n });\n\n return counts;\n }\n\n /**\n * Get statistics\n */\n getStats() {\n return {\n totalAgents: this.presences.size,\n onlineAgents: Array.from(this.presences.values()).filter(\n (p) => p.status === 'online',\n ).length,\n offlineAgents: Array.from(this.presences.values()).filter(\n (p) => p.status === 'offline',\n ).length,\n awayAgents: Array.from(this.presences.values()).filter(\n (p) => p.status === 'away',\n ).length,\n reconnectingAgents: Array.from(this.presences.values()).filter(\n (p) => p.status === 'reconnecting',\n ).length,\n };\n }\n\n /**\n * Clear expired presences\n */\n clearExpiredPresences(maxAgeMs: number): void {\n const now = Date.now();\n const toRemove: string[] = [];\n\n this.presences.forEach((presence, agentId) => {\n const lastSeenTime = new Date(presence.lastSeen).getTime();\n const ageMs = now - lastSeenTime;\n\n if (ageMs > maxAgeMs && presence.status === 'offline') {\n toRemove.push(agentId);\n }\n });\n\n toRemove.forEach((agentId) => {\n this.presences.delete(agentId);\n });\n\n if (toRemove.length > 0) {\n logger.debug('[AgentPresenceManager] Cleared expired presences', {\n count: toRemove.length,\n });\n }\n }\n\n /**\n * Get agents by role\n */\n getByRole(role: AgentPresence['role']): AgentPresence[] {\n return Array.from(this.presences.values()).filter((p) => p.role === role);\n }\n\n /**\n * Get agents in active section\n */\n getInSection(section: string): AgentPresence[] {\n return Array.from(this.presences.values()).filter(\n (p) => p.activeSection === section && p.status === 'online',\n );\n }\n\n /**\n * Get presence timeline\n */\n getPresenceStats() {\n const stats = {\n total: this.presences.size,\n online: 0,\n away: 0,\n offline: 0,\n reconnecting: 0,\n byRole: {} as Record<string, number>,\n };\n\n this.presences.forEach((p) => {\n stats[p.status]++;\n stats.byRole[p.role] = (stats.byRole[p.role] ?? 0) + 1;\n });\n\n return stats;\n }\n\n /**\n * Start heartbeat check (mark inactive agents as away)\n */\n private startHeartbeatCheck(): void {\n this.heartbeatInterval = setInterval(() => {\n const now = Date.now();\n\n this.presences.forEach((presence) => {\n const lastSeenTime = new Date(presence.lastSeen).getTime();\n const timeSinceLastSeen = now - lastSeenTime;\n\n if (\n timeSinceLastSeen > this.inactivityThreshold &&\n presence.status === 'online'\n ) {\n presence.status = 'away';\n this.emit('status_updated', {\n agentId: presence.agentId,\n status: 'away',\n });\n }\n\n if (\n timeSinceLastSeen > this.heartbeatTimeout &&\n presence.status !== 'offline'\n ) {\n presence.status = 'reconnecting';\n this.emit('status_updated', {\n agentId: presence.agentId,\n status: 'reconnecting',\n });\n }\n });\n }, 10000);\n }\n\n /**\n * Stop heartbeat monitoring\n */\n stopHeartbeatMonitoring(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n }\n\n /**\n * Clear all presences\n */\n clear(): void {\n this.presences.clear();\n }\n\n /**\n * Destroy the manager\n */\n destroy(): void {\n this.stopHeartbeatMonitoring();\n this.presences.clear();\n this.removeAllListeners();\n logger.debug('[AgentPresenceManager] Destroyed', {\n sessionId: this.sessionId,\n });\n }\n}\n\n// ============================================================================\n// Singleton Instance Map\n// ============================================================================\n\nconst instances = new Map<string, AgentPresenceManager>();\n\nexport function getAgentPresenceManager(\n sessionId: string,\n): AgentPresenceManager {\n if (!instances.has(sessionId)) {\n instances.set(sessionId, new AgentPresenceManager(sessionId));\n }\n return instances.get(sessionId)!;\n}\n\nexport function clearAgentPresenceManager(sessionId: string): void {\n const instance = instances.get(sessionId);\n if (instance) {\n instance.destroy();\n instances.delete(sessionId);\n }\n}\n"]}
@@ -0,0 +1,168 @@
1
+ import { EventEmitter } from 'eventemitter3';
2
+
3
+ /**
4
+ * Agent Presence Manager (Phase 14)
5
+ *
6
+ * Tracks real-time presence of all agents in a session.
7
+ * Provides status updates, cursor tracking, and activity monitoring.
8
+ */
9
+
10
+ interface AgentPresence {
11
+ agentId: string;
12
+ name: string;
13
+ role: 'user' | 'assistant' | 'monitor' | 'admin';
14
+ status: 'online' | 'away' | 'offline' | 'reconnecting';
15
+ joinedAt: string;
16
+ lastSeen: string;
17
+ cursorPosition?: {
18
+ x: number;
19
+ y: number;
20
+ path: string;
21
+ };
22
+ activeSection?: string;
23
+ metadata?: Record<string, unknown>;
24
+ }
25
+ interface PresenceUpdate {
26
+ agentId: string;
27
+ changes: Partial<AgentPresence>;
28
+ timestamp: string;
29
+ }
30
+ interface PresenceEvents {
31
+ presence_updated: (data: {
32
+ agentId: string;
33
+ presence: AgentPresence;
34
+ }) => void;
35
+ agent_joined: (data: {
36
+ agentId: string;
37
+ presence: AgentPresence;
38
+ }) => void;
39
+ agent_left: (data: {
40
+ agentId: string;
41
+ presence: AgentPresence;
42
+ }) => void;
43
+ cursor_updated: (data: {
44
+ agentId: string;
45
+ cursorPosition: {
46
+ x: number;
47
+ y: number;
48
+ path: string;
49
+ };
50
+ }) => void;
51
+ section_updated: (data: {
52
+ agentId: string;
53
+ activeSection: string;
54
+ }) => void;
55
+ status_updated: (data: {
56
+ agentId: string;
57
+ status: AgentPresence['status'];
58
+ }) => void;
59
+ }
60
+ declare class AgentPresenceManager extends EventEmitter<PresenceEvents> {
61
+ private presences;
62
+ private sessionId;
63
+ private heartbeatInterval;
64
+ private heartbeatTimeout;
65
+ private inactivityThreshold;
66
+ constructor(sessionId: string);
67
+ /**
68
+ * Add or update agent presence
69
+ */
70
+ updatePresence(agentId: string, presence: Omit<AgentPresence, 'joinedAt' | 'lastSeen'>): void;
71
+ /**
72
+ * Agent joined
73
+ */
74
+ agentJoined(agentId: string, name: string, role?: AgentPresence['role'], metadata?: Record<string, unknown>): void;
75
+ /**
76
+ * Agent left
77
+ */
78
+ agentLeft(agentId: string): void;
79
+ /**
80
+ * Update cursor position
81
+ */
82
+ updateCursor(agentId: string, x: number, y: number, path: string): void;
83
+ /**
84
+ * Update active section
85
+ */
86
+ updateActiveSection(agentId: string, section: string): void;
87
+ /**
88
+ * Update status
89
+ */
90
+ updateStatus(agentId: string, status: AgentPresence['status']): void;
91
+ /**
92
+ * Heartbeat from agent (keeps them online)
93
+ */
94
+ heartbeat(agentId: string): void;
95
+ /**
96
+ * Get presence for agent
97
+ */
98
+ getPresence(agentId: string): AgentPresence | undefined;
99
+ /**
100
+ * Get all online agents
101
+ */
102
+ getOnlineAgents(): AgentPresence[];
103
+ /**
104
+ * Get all agents
105
+ */
106
+ getAllAgents(): AgentPresence[];
107
+ /**
108
+ * Get all presences
109
+ */
110
+ getAllPresences(): AgentPresence[];
111
+ /**
112
+ * Get agent count
113
+ */
114
+ getAgentCount(): Record<AgentPresence['status'], number>;
115
+ /**
116
+ * Get statistics
117
+ */
118
+ getStats(): {
119
+ totalAgents: number;
120
+ onlineAgents: number;
121
+ offlineAgents: number;
122
+ awayAgents: number;
123
+ reconnectingAgents: number;
124
+ };
125
+ /**
126
+ * Clear expired presences
127
+ */
128
+ clearExpiredPresences(maxAgeMs: number): void;
129
+ /**
130
+ * Get agents by role
131
+ */
132
+ getByRole(role: AgentPresence['role']): AgentPresence[];
133
+ /**
134
+ * Get agents in active section
135
+ */
136
+ getInSection(section: string): AgentPresence[];
137
+ /**
138
+ * Get presence timeline
139
+ */
140
+ getPresenceStats(): {
141
+ total: number;
142
+ online: number;
143
+ away: number;
144
+ offline: number;
145
+ reconnecting: number;
146
+ byRole: Record<string, number>;
147
+ };
148
+ /**
149
+ * Start heartbeat check (mark inactive agents as away)
150
+ */
151
+ private startHeartbeatCheck;
152
+ /**
153
+ * Stop heartbeat monitoring
154
+ */
155
+ stopHeartbeatMonitoring(): void;
156
+ /**
157
+ * Clear all presences
158
+ */
159
+ clear(): void;
160
+ /**
161
+ * Destroy the manager
162
+ */
163
+ destroy(): void;
164
+ }
165
+ declare function getAgentPresenceManager(sessionId: string): AgentPresenceManager;
166
+ declare function clearAgentPresenceManager(sessionId: string): void;
167
+
168
+ export { type AgentPresence, AgentPresenceManager, type PresenceEvents, type PresenceUpdate, clearAgentPresenceManager, getAgentPresenceManager };