@a0n/aeon 5.0.1 → 5.0.2
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/dist/AeonEventEmitter-B1DzaYFk.d.cts +23 -0
- package/dist/AeonEventEmitter-B1DzaYFk.d.ts +23 -0
- package/dist/compression/index.d.cts +1 -1
- package/dist/compression/index.d.ts +1 -1
- package/dist/core/index.cjs +89 -0
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.cts +2 -212
- package/dist/core/index.d.ts +2 -212
- package/dist/core/index.js +88 -0
- package/dist/core/index.js.map +1 -1
- package/dist/distributed/index.cjs +88 -4
- package/dist/distributed/index.cjs.map +1 -1
- package/dist/distributed/index.d.cts +2 -2
- package/dist/distributed/index.d.ts +2 -2
- package/dist/distributed/index.js +88 -4
- package/dist/distributed/index.js.map +1 -1
- package/dist/index.cjs +98 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +98 -5
- package/dist/index.js.map +1 -1
- package/dist/offline/index.cjs +88 -4
- package/dist/offline/index.cjs.map +1 -1
- package/dist/offline/index.d.cts +3 -3
- package/dist/offline/index.d.ts +3 -3
- package/dist/offline/index.js +88 -4
- package/dist/offline/index.js.map +1 -1
- package/dist/optimization/index.d.cts +1 -1
- package/dist/optimization/index.d.ts +1 -1
- package/dist/presence/index.cjs +88 -4
- package/dist/presence/index.cjs.map +1 -1
- package/dist/presence/index.d.cts +2 -2
- package/dist/presence/index.d.ts +2 -2
- package/dist/presence/index.js +88 -4
- package/dist/presence/index.js.map +1 -1
- package/dist/types-Bj5EbkSK.d.cts +212 -0
- package/dist/types-Bj5EbkSK.d.ts +212 -0
- package/package.json +15 -17
package/dist/presence/index.cjs
CHANGED
|
@@ -1,8 +1,92 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
// src/core/AeonEventEmitter.ts
|
|
4
|
+
var AeonEventEmitter = class {
|
|
5
|
+
listenerMap = /* @__PURE__ */ new Map();
|
|
6
|
+
on(event, fn, context) {
|
|
7
|
+
return this.registerListener(event, fn, context, false);
|
|
8
|
+
}
|
|
9
|
+
addListener(event, fn, context) {
|
|
10
|
+
return this.registerListener(event, fn, context, false);
|
|
11
|
+
}
|
|
12
|
+
once(event, fn, context) {
|
|
13
|
+
return this.registerListener(event, fn, context, true);
|
|
14
|
+
}
|
|
15
|
+
off(event, fn, context, once) {
|
|
16
|
+
return this.removeListener(event, fn, context, once);
|
|
17
|
+
}
|
|
18
|
+
removeListener(event, fn, context, once) {
|
|
19
|
+
const listeners = this.listenerMap.get(event);
|
|
20
|
+
if (!listeners) {
|
|
21
|
+
return this;
|
|
22
|
+
}
|
|
23
|
+
if (!fn) {
|
|
24
|
+
this.listenerMap.delete(event);
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
const retained = listeners.filter(
|
|
28
|
+
(listener) => listener.fn !== fn || once === true && listener.once !== true || context !== void 0 && listener.context !== context
|
|
29
|
+
);
|
|
30
|
+
if (retained.length === 0) {
|
|
31
|
+
this.listenerMap.delete(event);
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
this.listenerMap.set(
|
|
35
|
+
event,
|
|
36
|
+
retained
|
|
37
|
+
);
|
|
38
|
+
return this;
|
|
39
|
+
}
|
|
40
|
+
removeAllListeners(event) {
|
|
41
|
+
if (event === void 0) {
|
|
42
|
+
this.listenerMap.clear();
|
|
43
|
+
return this;
|
|
44
|
+
}
|
|
45
|
+
this.listenerMap.delete(event);
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
emit(event, ...args) {
|
|
49
|
+
const listeners = this.listenerMap.get(event);
|
|
50
|
+
if (!listeners || listeners.length === 0) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
for (const listener of [...listeners]) {
|
|
54
|
+
if (listener.once) {
|
|
55
|
+
this.removeListener(event, listener.fn, listener.context, true);
|
|
56
|
+
}
|
|
57
|
+
listener.fn.apply(listener.context, args);
|
|
58
|
+
}
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
eventNames() {
|
|
62
|
+
return Array.from(this.listenerMap.keys());
|
|
63
|
+
}
|
|
64
|
+
listeners(event) {
|
|
65
|
+
return this.listenerMap.get(event)?.map((listener) => listener.fn) ?? [];
|
|
66
|
+
}
|
|
67
|
+
listenerCount(event) {
|
|
68
|
+
return this.listenerMap.get(event)?.length ?? 0;
|
|
69
|
+
}
|
|
70
|
+
subscribe(event, fn, context) {
|
|
71
|
+
this.on(event, fn, context);
|
|
72
|
+
return () => {
|
|
73
|
+
this.off(event, fn, context);
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
registerListener(event, fn, context, once) {
|
|
77
|
+
if (typeof fn !== "function") {
|
|
78
|
+
throw new TypeError("The listener must be a function");
|
|
79
|
+
}
|
|
80
|
+
const listeners = this.listenerMap.get(event) ?? [];
|
|
81
|
+
listeners.push({
|
|
82
|
+
fn,
|
|
83
|
+
context: context || this,
|
|
84
|
+
once
|
|
85
|
+
});
|
|
86
|
+
this.listenerMap.set(event, listeners);
|
|
87
|
+
return this;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
6
90
|
|
|
7
91
|
// src/utils/logger.ts
|
|
8
92
|
var consoleLogger = {
|
|
@@ -26,7 +110,7 @@ function getLogger() {
|
|
|
26
110
|
|
|
27
111
|
// src/presence/AgentPresenceManager.ts
|
|
28
112
|
var logger = getLogger();
|
|
29
|
-
var AgentPresenceManager = class extends
|
|
113
|
+
var AgentPresenceManager = class extends AeonEventEmitter {
|
|
30
114
|
presences = /* @__PURE__ */ new Map();
|
|
31
115
|
sessionId;
|
|
32
116
|
heartbeatInterval = null;
|
|
@@ -1 +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 focusNode?: string;\n selectionRange?: AgentSelectionRange;\n typingState?: AgentTypingState;\n scrollState?: AgentScrollState;\n viewport?: AgentViewportState;\n inputState?: AgentInputState;\n emotionState?: AgentEmotionState;\n metadata?: Record<string, unknown>;\n}\n\nexport interface AgentSelectionRange {\n start: number;\n end: number;\n direction?: 'forward' | 'backward' | 'none';\n path?: string;\n}\n\nexport interface AgentTypingState {\n isTyping: boolean;\n field?: string;\n isComposing?: boolean;\n startedAt?: string;\n stoppedAt?: string;\n}\n\nexport interface AgentScrollState {\n depth: number;\n y?: number;\n viewportHeight?: number;\n documentHeight?: number;\n path?: string;\n}\n\nexport interface AgentViewportState {\n width: number;\n height: number;\n}\n\nexport interface AgentInputState {\n field: string;\n hasFocus: boolean;\n valueLength?: number;\n selectionStart?: number;\n selectionEnd?: number;\n isComposing?: boolean;\n inputMode?: string;\n}\n\nexport interface AgentEmotionState {\n primary?: string;\n secondary?: string;\n confidence?: number;\n intensity?: number;\n valence?: number;\n arousal?: number;\n dominance?: number;\n source?: 'self-report' | 'inferred' | 'sensor' | 'hybrid';\n updatedAt?: string;\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 focus_updated: (data: { agentId: string; focusNode: string }) => void;\n selection_updated: (data: {\n agentId: string;\n selectionRange: AgentSelectionRange;\n }) => void;\n typing_updated: (data: {\n agentId: string;\n typingState: AgentTypingState;\n }) => void;\n scroll_updated: (data: {\n agentId: string;\n scrollState: AgentScrollState;\n }) => void;\n viewport_updated: (data: {\n agentId: string;\n viewport: AgentViewportState;\n }) => void;\n input_state_updated: (data: {\n agentId: string;\n inputState?: AgentInputState;\n }) => void;\n emotion_updated: (data: {\n agentId: string;\n emotionState?: AgentEmotionState;\n }) => 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 focused node path\n */\n updateFocusNode(agentId: string, nodePath: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.focusNode = nodePath;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('focus_updated', {\n agentId,\n focusNode: nodePath,\n });\n }\n }\n\n /**\n * Update text selection range\n */\n updateSelection(agentId: string, selectionRange: AgentSelectionRange): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.selectionRange = selectionRange;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('selection_updated', {\n agentId,\n selectionRange,\n });\n }\n }\n\n /**\n * Update typing state\n */\n updateTyping(\n agentId: string,\n isTyping: boolean,\n field?: string,\n isComposing = false\n ): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n const now = new Date().toISOString();\n const previous = presence.typingState;\n const typingState: AgentTypingState = {\n isTyping,\n field,\n isComposing,\n startedAt:\n isTyping && !previous?.isTyping\n ? now\n : isTyping\n ? previous?.startedAt\n : undefined,\n stoppedAt: isTyping ? undefined : now,\n };\n\n presence.typingState = typingState;\n presence.lastSeen = now;\n\n this.presences.set(agentId, presence);\n this.emit('typing_updated', {\n agentId,\n typingState,\n });\n }\n }\n\n /**\n * Update scroll state\n */\n updateScroll(agentId: string, scrollState: AgentScrollState): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.scrollState = {\n ...scrollState,\n depth: Math.max(0, Math.min(1, scrollState.depth)),\n };\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('scroll_updated', {\n agentId,\n scrollState: presence.scrollState,\n });\n }\n }\n\n /**\n * Update viewport size\n */\n updateViewport(agentId: string, width: number, height: number): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.viewport = { width, height };\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('viewport_updated', {\n agentId,\n viewport: presence.viewport,\n });\n }\n }\n\n /**\n * Update input state\n */\n updateInputState(agentId: string, inputState: AgentInputState): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.inputState = inputState;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('input_state_updated', {\n agentId,\n inputState,\n });\n }\n }\n\n /**\n * Clear input state\n */\n clearInputState(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.inputState = undefined;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('input_state_updated', {\n agentId,\n inputState: undefined,\n });\n }\n }\n\n /**\n * Update emotional state\n */\n updateEmotionState(\n agentId: string,\n emotionState: Omit<AgentEmotionState, 'updatedAt'>\n ): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n const enrichedState: AgentEmotionState = {\n ...emotionState,\n updatedAt: new Date().toISOString(),\n };\n presence.emotionState = enrichedState;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('emotion_updated', {\n agentId,\n emotionState: enrichedState,\n });\n }\n }\n\n /**\n * Clear emotional state\n */\n clearEmotionState(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.emotionState = undefined;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('emotion_updated', {\n agentId,\n emotionState: undefined,\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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/AeonEventEmitter.ts","../../src/utils/logger.ts","../../src/presence/AgentPresenceManager.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Aeon Event Emitter\n *\n * Aeon's control-plane events are low-volume observation surfaces, not\n * throughput-critical data planes. This implementation favors a small, typed,\n * dependency-free API with deterministic snapshot delivery over micro-optimized\n * special cases.\n */\n\ntype EventListener = (...args: any[]) => void;\n\nexport type AeonEventMap = Record<PropertyKey, EventListener>;\n\ntype EventShape = Record<string, EventListener>;\ntype EventKey<Events extends object> = keyof Events;\ntype ListenerRecord<Fn extends EventListener> = {\n fn: Fn;\n context: unknown;\n once: boolean;\n};\n\nexport class AeonEventEmitter<\n Events extends { [K in keyof Events]: EventListener } = EventShape\n> {\n private readonly listenerMap = new Map<\n EventKey<Events>,\n Array<ListenerRecord<Events[EventKey<Events>]>>\n >();\n\n on<K extends EventKey<Events>>(\n event: K,\n fn: Events[K],\n context?: unknown\n ): this {\n return this.registerListener(event, fn, context, false);\n }\n\n addListener<K extends EventKey<Events>>(\n event: K,\n fn: Events[K],\n context?: unknown\n ): this {\n return this.registerListener(event, fn, context, false);\n }\n\n once<K extends EventKey<Events>>(\n event: K,\n fn: Events[K],\n context?: unknown\n ): this {\n return this.registerListener(event, fn, context, true);\n }\n\n off<K extends EventKey<Events>>(\n event: K,\n fn?: Events[K],\n context?: unknown,\n once?: boolean\n ): this {\n return this.removeListener(event, fn, context, once);\n }\n\n removeListener<K extends EventKey<Events>>(\n event: K,\n fn?: Events[K],\n context?: unknown,\n once?: boolean\n ): this {\n const listeners = this.listenerMap.get(event);\n if (!listeners) {\n return this;\n }\n\n if (!fn) {\n this.listenerMap.delete(event);\n return this;\n }\n\n const retained = listeners.filter(\n (listener) =>\n listener.fn !== fn ||\n (once === true && listener.once !== true) ||\n (context !== undefined && listener.context !== context)\n );\n\n if (retained.length === 0) {\n this.listenerMap.delete(event);\n return this;\n }\n\n this.listenerMap.set(\n event,\n retained as Array<ListenerRecord<Events[EventKey<Events>]>>\n );\n\n return this;\n }\n\n removeAllListeners<K extends EventKey<Events>>(event?: K): this {\n if (event === undefined) {\n this.listenerMap.clear();\n return this;\n }\n\n this.listenerMap.delete(event);\n return this;\n }\n\n emit<K extends EventKey<Events>>(\n event: K,\n ...args: Parameters<Events[K]>\n ): boolean {\n const listeners = this.listenerMap.get(event);\n if (!listeners || listeners.length === 0) {\n return false;\n }\n\n // Emit against a point-in-time snapshot so registration churn during\n // delivery affects only future folds.\n for (const listener of [...listeners]) {\n if (listener.once) {\n this.removeListener(event, listener.fn, listener.context, true);\n }\n\n listener.fn.apply(listener.context, args);\n }\n\n return true;\n }\n\n eventNames(): Array<EventKey<Events>> {\n return Array.from(this.listenerMap.keys());\n }\n\n listeners<K extends EventKey<Events>>(event: K): Events[K][] {\n return (\n this.listenerMap.get(event)?.map((listener) => listener.fn as Events[K]) ??\n []\n );\n }\n\n listenerCount<K extends EventKey<Events>>(event: K): number {\n return this.listenerMap.get(event)?.length ?? 0;\n }\n\n subscribe<K extends EventKey<Events>>(\n event: K,\n fn: Events[K],\n context?: unknown\n ): () => void {\n this.on(event, fn, context);\n\n return () => {\n this.off(event, fn, context);\n };\n }\n\n private registerListener<K extends EventKey<Events>>(\n event: K,\n fn: Events[K],\n context: unknown,\n once: boolean\n ): this {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n const listeners =\n this.listenerMap.get(event) ??\n ([] as Array<ListenerRecord<Events[EventKey<Events>]>>);\n\n listeners.push({\n fn,\n context: context || this,\n once,\n });\n\n this.listenerMap.set(event, listeners);\n\n return this;\n }\n}\n","/**\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 { AeonEventEmitter } from '../core/AeonEventEmitter';\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 focusNode?: string;\n selectionRange?: AgentSelectionRange;\n typingState?: AgentTypingState;\n scrollState?: AgentScrollState;\n viewport?: AgentViewportState;\n inputState?: AgentInputState;\n emotionState?: AgentEmotionState;\n metadata?: Record<string, unknown>;\n}\n\nexport interface AgentSelectionRange {\n start: number;\n end: number;\n direction?: 'forward' | 'backward' | 'none';\n path?: string;\n}\n\nexport interface AgentTypingState {\n isTyping: boolean;\n field?: string;\n isComposing?: boolean;\n startedAt?: string;\n stoppedAt?: string;\n}\n\nexport interface AgentScrollState {\n depth: number;\n y?: number;\n viewportHeight?: number;\n documentHeight?: number;\n path?: string;\n}\n\nexport interface AgentViewportState {\n width: number;\n height: number;\n}\n\nexport interface AgentInputState {\n field: string;\n hasFocus: boolean;\n valueLength?: number;\n selectionStart?: number;\n selectionEnd?: number;\n isComposing?: boolean;\n inputMode?: string;\n}\n\nexport interface AgentEmotionState {\n primary?: string;\n secondary?: string;\n confidence?: number;\n intensity?: number;\n valence?: number;\n arousal?: number;\n dominance?: number;\n source?: 'self-report' | 'inferred' | 'sensor' | 'hybrid';\n updatedAt?: string;\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 focus_updated: (data: { agentId: string; focusNode: string }) => void;\n selection_updated: (data: {\n agentId: string;\n selectionRange: AgentSelectionRange;\n }) => void;\n typing_updated: (data: {\n agentId: string;\n typingState: AgentTypingState;\n }) => void;\n scroll_updated: (data: {\n agentId: string;\n scrollState: AgentScrollState;\n }) => void;\n viewport_updated: (data: {\n agentId: string;\n viewport: AgentViewportState;\n }) => void;\n input_state_updated: (data: {\n agentId: string;\n inputState?: AgentInputState;\n }) => void;\n emotion_updated: (data: {\n agentId: string;\n emotionState?: AgentEmotionState;\n }) => 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 AeonEventEmitter<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 focused node path\n */\n updateFocusNode(agentId: string, nodePath: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.focusNode = nodePath;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('focus_updated', {\n agentId,\n focusNode: nodePath,\n });\n }\n }\n\n /**\n * Update text selection range\n */\n updateSelection(agentId: string, selectionRange: AgentSelectionRange): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.selectionRange = selectionRange;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('selection_updated', {\n agentId,\n selectionRange,\n });\n }\n }\n\n /**\n * Update typing state\n */\n updateTyping(\n agentId: string,\n isTyping: boolean,\n field?: string,\n isComposing = false\n ): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n const now = new Date().toISOString();\n const previous = presence.typingState;\n const typingState: AgentTypingState = {\n isTyping,\n field,\n isComposing,\n startedAt:\n isTyping && !previous?.isTyping\n ? now\n : isTyping\n ? previous?.startedAt\n : undefined,\n stoppedAt: isTyping ? undefined : now,\n };\n\n presence.typingState = typingState;\n presence.lastSeen = now;\n\n this.presences.set(agentId, presence);\n this.emit('typing_updated', {\n agentId,\n typingState,\n });\n }\n }\n\n /**\n * Update scroll state\n */\n updateScroll(agentId: string, scrollState: AgentScrollState): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.scrollState = {\n ...scrollState,\n depth: Math.max(0, Math.min(1, scrollState.depth)),\n };\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('scroll_updated', {\n agentId,\n scrollState: presence.scrollState,\n });\n }\n }\n\n /**\n * Update viewport size\n */\n updateViewport(agentId: string, width: number, height: number): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.viewport = { width, height };\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('viewport_updated', {\n agentId,\n viewport: presence.viewport,\n });\n }\n }\n\n /**\n * Update input state\n */\n updateInputState(agentId: string, inputState: AgentInputState): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.inputState = inputState;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('input_state_updated', {\n agentId,\n inputState,\n });\n }\n }\n\n /**\n * Clear input state\n */\n clearInputState(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.inputState = undefined;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('input_state_updated', {\n agentId,\n inputState: undefined,\n });\n }\n }\n\n /**\n * Update emotional state\n */\n updateEmotionState(\n agentId: string,\n emotionState: Omit<AgentEmotionState, 'updatedAt'>\n ): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n const enrichedState: AgentEmotionState = {\n ...emotionState,\n updatedAt: new Date().toISOString(),\n };\n presence.emotionState = enrichedState;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('emotion_updated', {\n agentId,\n emotionState: enrichedState,\n });\n }\n }\n\n /**\n * Clear emotional state\n */\n clearEmotionState(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.emotionState = undefined;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('emotion_updated', {\n agentId,\n emotionState: undefined,\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"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { A as AeonEventEmitter } from '../AeonEventEmitter-B1DzaYFk.cjs';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Agent Presence Manager (Phase 14)
|
|
@@ -136,7 +136,7 @@ interface PresenceEvents {
|
|
|
136
136
|
status: AgentPresence['status'];
|
|
137
137
|
}) => void;
|
|
138
138
|
}
|
|
139
|
-
declare class AgentPresenceManager extends
|
|
139
|
+
declare class AgentPresenceManager extends AeonEventEmitter<PresenceEvents> {
|
|
140
140
|
private presences;
|
|
141
141
|
private sessionId;
|
|
142
142
|
private heartbeatInterval;
|
package/dist/presence/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { A as AeonEventEmitter } from '../AeonEventEmitter-B1DzaYFk.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Agent Presence Manager (Phase 14)
|
|
@@ -136,7 +136,7 @@ interface PresenceEvents {
|
|
|
136
136
|
status: AgentPresence['status'];
|
|
137
137
|
}) => void;
|
|
138
138
|
}
|
|
139
|
-
declare class AgentPresenceManager extends
|
|
139
|
+
declare class AgentPresenceManager extends AeonEventEmitter<PresenceEvents> {
|
|
140
140
|
private presences;
|
|
141
141
|
private sessionId;
|
|
142
142
|
private heartbeatInterval;
|
package/dist/presence/index.js
CHANGED
|
@@ -1,6 +1,90 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
// src/core/AeonEventEmitter.ts
|
|
2
|
+
var AeonEventEmitter = class {
|
|
3
|
+
listenerMap = /* @__PURE__ */ new Map();
|
|
4
|
+
on(event, fn, context) {
|
|
5
|
+
return this.registerListener(event, fn, context, false);
|
|
6
|
+
}
|
|
7
|
+
addListener(event, fn, context) {
|
|
8
|
+
return this.registerListener(event, fn, context, false);
|
|
9
|
+
}
|
|
10
|
+
once(event, fn, context) {
|
|
11
|
+
return this.registerListener(event, fn, context, true);
|
|
12
|
+
}
|
|
13
|
+
off(event, fn, context, once) {
|
|
14
|
+
return this.removeListener(event, fn, context, once);
|
|
15
|
+
}
|
|
16
|
+
removeListener(event, fn, context, once) {
|
|
17
|
+
const listeners = this.listenerMap.get(event);
|
|
18
|
+
if (!listeners) {
|
|
19
|
+
return this;
|
|
20
|
+
}
|
|
21
|
+
if (!fn) {
|
|
22
|
+
this.listenerMap.delete(event);
|
|
23
|
+
return this;
|
|
24
|
+
}
|
|
25
|
+
const retained = listeners.filter(
|
|
26
|
+
(listener) => listener.fn !== fn || once === true && listener.once !== true || context !== void 0 && listener.context !== context
|
|
27
|
+
);
|
|
28
|
+
if (retained.length === 0) {
|
|
29
|
+
this.listenerMap.delete(event);
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
this.listenerMap.set(
|
|
33
|
+
event,
|
|
34
|
+
retained
|
|
35
|
+
);
|
|
36
|
+
return this;
|
|
37
|
+
}
|
|
38
|
+
removeAllListeners(event) {
|
|
39
|
+
if (event === void 0) {
|
|
40
|
+
this.listenerMap.clear();
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
this.listenerMap.delete(event);
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
emit(event, ...args) {
|
|
47
|
+
const listeners = this.listenerMap.get(event);
|
|
48
|
+
if (!listeners || listeners.length === 0) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
for (const listener of [...listeners]) {
|
|
52
|
+
if (listener.once) {
|
|
53
|
+
this.removeListener(event, listener.fn, listener.context, true);
|
|
54
|
+
}
|
|
55
|
+
listener.fn.apply(listener.context, args);
|
|
56
|
+
}
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
eventNames() {
|
|
60
|
+
return Array.from(this.listenerMap.keys());
|
|
61
|
+
}
|
|
62
|
+
listeners(event) {
|
|
63
|
+
return this.listenerMap.get(event)?.map((listener) => listener.fn) ?? [];
|
|
64
|
+
}
|
|
65
|
+
listenerCount(event) {
|
|
66
|
+
return this.listenerMap.get(event)?.length ?? 0;
|
|
67
|
+
}
|
|
68
|
+
subscribe(event, fn, context) {
|
|
69
|
+
this.on(event, fn, context);
|
|
70
|
+
return () => {
|
|
71
|
+
this.off(event, fn, context);
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
registerListener(event, fn, context, once) {
|
|
75
|
+
if (typeof fn !== "function") {
|
|
76
|
+
throw new TypeError("The listener must be a function");
|
|
77
|
+
}
|
|
78
|
+
const listeners = this.listenerMap.get(event) ?? [];
|
|
79
|
+
listeners.push({
|
|
80
|
+
fn,
|
|
81
|
+
context: context || this,
|
|
82
|
+
once
|
|
83
|
+
});
|
|
84
|
+
this.listenerMap.set(event, listeners);
|
|
85
|
+
return this;
|
|
86
|
+
}
|
|
87
|
+
};
|
|
4
88
|
|
|
5
89
|
// src/utils/logger.ts
|
|
6
90
|
var consoleLogger = {
|
|
@@ -24,7 +108,7 @@ function getLogger() {
|
|
|
24
108
|
|
|
25
109
|
// src/presence/AgentPresenceManager.ts
|
|
26
110
|
var logger = getLogger();
|
|
27
|
-
var AgentPresenceManager = class extends
|
|
111
|
+
var AgentPresenceManager = class extends AeonEventEmitter {
|
|
28
112
|
presences = /* @__PURE__ */ new Map();
|
|
29
113
|
sessionId;
|
|
30
114
|
heartbeatInterval = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/logger.ts","../../src/presence/AgentPresenceManager.ts"],"names":[],"mappings":"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","file":"index.js","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 focusNode?: string;\n selectionRange?: AgentSelectionRange;\n typingState?: AgentTypingState;\n scrollState?: AgentScrollState;\n viewport?: AgentViewportState;\n inputState?: AgentInputState;\n emotionState?: AgentEmotionState;\n metadata?: Record<string, unknown>;\n}\n\nexport interface AgentSelectionRange {\n start: number;\n end: number;\n direction?: 'forward' | 'backward' | 'none';\n path?: string;\n}\n\nexport interface AgentTypingState {\n isTyping: boolean;\n field?: string;\n isComposing?: boolean;\n startedAt?: string;\n stoppedAt?: string;\n}\n\nexport interface AgentScrollState {\n depth: number;\n y?: number;\n viewportHeight?: number;\n documentHeight?: number;\n path?: string;\n}\n\nexport interface AgentViewportState {\n width: number;\n height: number;\n}\n\nexport interface AgentInputState {\n field: string;\n hasFocus: boolean;\n valueLength?: number;\n selectionStart?: number;\n selectionEnd?: number;\n isComposing?: boolean;\n inputMode?: string;\n}\n\nexport interface AgentEmotionState {\n primary?: string;\n secondary?: string;\n confidence?: number;\n intensity?: number;\n valence?: number;\n arousal?: number;\n dominance?: number;\n source?: 'self-report' | 'inferred' | 'sensor' | 'hybrid';\n updatedAt?: string;\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 focus_updated: (data: { agentId: string; focusNode: string }) => void;\n selection_updated: (data: {\n agentId: string;\n selectionRange: AgentSelectionRange;\n }) => void;\n typing_updated: (data: {\n agentId: string;\n typingState: AgentTypingState;\n }) => void;\n scroll_updated: (data: {\n agentId: string;\n scrollState: AgentScrollState;\n }) => void;\n viewport_updated: (data: {\n agentId: string;\n viewport: AgentViewportState;\n }) => void;\n input_state_updated: (data: {\n agentId: string;\n inputState?: AgentInputState;\n }) => void;\n emotion_updated: (data: {\n agentId: string;\n emotionState?: AgentEmotionState;\n }) => 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 focused node path\n */\n updateFocusNode(agentId: string, nodePath: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.focusNode = nodePath;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('focus_updated', {\n agentId,\n focusNode: nodePath,\n });\n }\n }\n\n /**\n * Update text selection range\n */\n updateSelection(agentId: string, selectionRange: AgentSelectionRange): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.selectionRange = selectionRange;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('selection_updated', {\n agentId,\n selectionRange,\n });\n }\n }\n\n /**\n * Update typing state\n */\n updateTyping(\n agentId: string,\n isTyping: boolean,\n field?: string,\n isComposing = false\n ): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n const now = new Date().toISOString();\n const previous = presence.typingState;\n const typingState: AgentTypingState = {\n isTyping,\n field,\n isComposing,\n startedAt:\n isTyping && !previous?.isTyping\n ? now\n : isTyping\n ? previous?.startedAt\n : undefined,\n stoppedAt: isTyping ? undefined : now,\n };\n\n presence.typingState = typingState;\n presence.lastSeen = now;\n\n this.presences.set(agentId, presence);\n this.emit('typing_updated', {\n agentId,\n typingState,\n });\n }\n }\n\n /**\n * Update scroll state\n */\n updateScroll(agentId: string, scrollState: AgentScrollState): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.scrollState = {\n ...scrollState,\n depth: Math.max(0, Math.min(1, scrollState.depth)),\n };\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('scroll_updated', {\n agentId,\n scrollState: presence.scrollState,\n });\n }\n }\n\n /**\n * Update viewport size\n */\n updateViewport(agentId: string, width: number, height: number): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.viewport = { width, height };\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('viewport_updated', {\n agentId,\n viewport: presence.viewport,\n });\n }\n }\n\n /**\n * Update input state\n */\n updateInputState(agentId: string, inputState: AgentInputState): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.inputState = inputState;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('input_state_updated', {\n agentId,\n inputState,\n });\n }\n }\n\n /**\n * Clear input state\n */\n clearInputState(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.inputState = undefined;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('input_state_updated', {\n agentId,\n inputState: undefined,\n });\n }\n }\n\n /**\n * Update emotional state\n */\n updateEmotionState(\n agentId: string,\n emotionState: Omit<AgentEmotionState, 'updatedAt'>\n ): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n const enrichedState: AgentEmotionState = {\n ...emotionState,\n updatedAt: new Date().toISOString(),\n };\n presence.emotionState = enrichedState;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('emotion_updated', {\n agentId,\n emotionState: enrichedState,\n });\n }\n }\n\n /**\n * Clear emotional state\n */\n clearEmotionState(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.emotionState = undefined;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('emotion_updated', {\n agentId,\n emotionState: undefined,\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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/AeonEventEmitter.ts","../../src/utils/logger.ts","../../src/presence/AgentPresenceManager.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Aeon Event Emitter\n *\n * Aeon's control-plane events are low-volume observation surfaces, not\n * throughput-critical data planes. This implementation favors a small, typed,\n * dependency-free API with deterministic snapshot delivery over micro-optimized\n * special cases.\n */\n\ntype EventListener = (...args: any[]) => void;\n\nexport type AeonEventMap = Record<PropertyKey, EventListener>;\n\ntype EventShape = Record<string, EventListener>;\ntype EventKey<Events extends object> = keyof Events;\ntype ListenerRecord<Fn extends EventListener> = {\n fn: Fn;\n context: unknown;\n once: boolean;\n};\n\nexport class AeonEventEmitter<\n Events extends { [K in keyof Events]: EventListener } = EventShape\n> {\n private readonly listenerMap = new Map<\n EventKey<Events>,\n Array<ListenerRecord<Events[EventKey<Events>]>>\n >();\n\n on<K extends EventKey<Events>>(\n event: K,\n fn: Events[K],\n context?: unknown\n ): this {\n return this.registerListener(event, fn, context, false);\n }\n\n addListener<K extends EventKey<Events>>(\n event: K,\n fn: Events[K],\n context?: unknown\n ): this {\n return this.registerListener(event, fn, context, false);\n }\n\n once<K extends EventKey<Events>>(\n event: K,\n fn: Events[K],\n context?: unknown\n ): this {\n return this.registerListener(event, fn, context, true);\n }\n\n off<K extends EventKey<Events>>(\n event: K,\n fn?: Events[K],\n context?: unknown,\n once?: boolean\n ): this {\n return this.removeListener(event, fn, context, once);\n }\n\n removeListener<K extends EventKey<Events>>(\n event: K,\n fn?: Events[K],\n context?: unknown,\n once?: boolean\n ): this {\n const listeners = this.listenerMap.get(event);\n if (!listeners) {\n return this;\n }\n\n if (!fn) {\n this.listenerMap.delete(event);\n return this;\n }\n\n const retained = listeners.filter(\n (listener) =>\n listener.fn !== fn ||\n (once === true && listener.once !== true) ||\n (context !== undefined && listener.context !== context)\n );\n\n if (retained.length === 0) {\n this.listenerMap.delete(event);\n return this;\n }\n\n this.listenerMap.set(\n event,\n retained as Array<ListenerRecord<Events[EventKey<Events>]>>\n );\n\n return this;\n }\n\n removeAllListeners<K extends EventKey<Events>>(event?: K): this {\n if (event === undefined) {\n this.listenerMap.clear();\n return this;\n }\n\n this.listenerMap.delete(event);\n return this;\n }\n\n emit<K extends EventKey<Events>>(\n event: K,\n ...args: Parameters<Events[K]>\n ): boolean {\n const listeners = this.listenerMap.get(event);\n if (!listeners || listeners.length === 0) {\n return false;\n }\n\n // Emit against a point-in-time snapshot so registration churn during\n // delivery affects only future folds.\n for (const listener of [...listeners]) {\n if (listener.once) {\n this.removeListener(event, listener.fn, listener.context, true);\n }\n\n listener.fn.apply(listener.context, args);\n }\n\n return true;\n }\n\n eventNames(): Array<EventKey<Events>> {\n return Array.from(this.listenerMap.keys());\n }\n\n listeners<K extends EventKey<Events>>(event: K): Events[K][] {\n return (\n this.listenerMap.get(event)?.map((listener) => listener.fn as Events[K]) ??\n []\n );\n }\n\n listenerCount<K extends EventKey<Events>>(event: K): number {\n return this.listenerMap.get(event)?.length ?? 0;\n }\n\n subscribe<K extends EventKey<Events>>(\n event: K,\n fn: Events[K],\n context?: unknown\n ): () => void {\n this.on(event, fn, context);\n\n return () => {\n this.off(event, fn, context);\n };\n }\n\n private registerListener<K extends EventKey<Events>>(\n event: K,\n fn: Events[K],\n context: unknown,\n once: boolean\n ): this {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n const listeners =\n this.listenerMap.get(event) ??\n ([] as Array<ListenerRecord<Events[EventKey<Events>]>>);\n\n listeners.push({\n fn,\n context: context || this,\n once,\n });\n\n this.listenerMap.set(event, listeners);\n\n return this;\n }\n}\n","/**\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 { AeonEventEmitter } from '../core/AeonEventEmitter';\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 focusNode?: string;\n selectionRange?: AgentSelectionRange;\n typingState?: AgentTypingState;\n scrollState?: AgentScrollState;\n viewport?: AgentViewportState;\n inputState?: AgentInputState;\n emotionState?: AgentEmotionState;\n metadata?: Record<string, unknown>;\n}\n\nexport interface AgentSelectionRange {\n start: number;\n end: number;\n direction?: 'forward' | 'backward' | 'none';\n path?: string;\n}\n\nexport interface AgentTypingState {\n isTyping: boolean;\n field?: string;\n isComposing?: boolean;\n startedAt?: string;\n stoppedAt?: string;\n}\n\nexport interface AgentScrollState {\n depth: number;\n y?: number;\n viewportHeight?: number;\n documentHeight?: number;\n path?: string;\n}\n\nexport interface AgentViewportState {\n width: number;\n height: number;\n}\n\nexport interface AgentInputState {\n field: string;\n hasFocus: boolean;\n valueLength?: number;\n selectionStart?: number;\n selectionEnd?: number;\n isComposing?: boolean;\n inputMode?: string;\n}\n\nexport interface AgentEmotionState {\n primary?: string;\n secondary?: string;\n confidence?: number;\n intensity?: number;\n valence?: number;\n arousal?: number;\n dominance?: number;\n source?: 'self-report' | 'inferred' | 'sensor' | 'hybrid';\n updatedAt?: string;\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 focus_updated: (data: { agentId: string; focusNode: string }) => void;\n selection_updated: (data: {\n agentId: string;\n selectionRange: AgentSelectionRange;\n }) => void;\n typing_updated: (data: {\n agentId: string;\n typingState: AgentTypingState;\n }) => void;\n scroll_updated: (data: {\n agentId: string;\n scrollState: AgentScrollState;\n }) => void;\n viewport_updated: (data: {\n agentId: string;\n viewport: AgentViewportState;\n }) => void;\n input_state_updated: (data: {\n agentId: string;\n inputState?: AgentInputState;\n }) => void;\n emotion_updated: (data: {\n agentId: string;\n emotionState?: AgentEmotionState;\n }) => 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 AeonEventEmitter<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 focused node path\n */\n updateFocusNode(agentId: string, nodePath: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.focusNode = nodePath;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('focus_updated', {\n agentId,\n focusNode: nodePath,\n });\n }\n }\n\n /**\n * Update text selection range\n */\n updateSelection(agentId: string, selectionRange: AgentSelectionRange): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.selectionRange = selectionRange;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('selection_updated', {\n agentId,\n selectionRange,\n });\n }\n }\n\n /**\n * Update typing state\n */\n updateTyping(\n agentId: string,\n isTyping: boolean,\n field?: string,\n isComposing = false\n ): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n const now = new Date().toISOString();\n const previous = presence.typingState;\n const typingState: AgentTypingState = {\n isTyping,\n field,\n isComposing,\n startedAt:\n isTyping && !previous?.isTyping\n ? now\n : isTyping\n ? previous?.startedAt\n : undefined,\n stoppedAt: isTyping ? undefined : now,\n };\n\n presence.typingState = typingState;\n presence.lastSeen = now;\n\n this.presences.set(agentId, presence);\n this.emit('typing_updated', {\n agentId,\n typingState,\n });\n }\n }\n\n /**\n * Update scroll state\n */\n updateScroll(agentId: string, scrollState: AgentScrollState): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.scrollState = {\n ...scrollState,\n depth: Math.max(0, Math.min(1, scrollState.depth)),\n };\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('scroll_updated', {\n agentId,\n scrollState: presence.scrollState,\n });\n }\n }\n\n /**\n * Update viewport size\n */\n updateViewport(agentId: string, width: number, height: number): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.viewport = { width, height };\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('viewport_updated', {\n agentId,\n viewport: presence.viewport,\n });\n }\n }\n\n /**\n * Update input state\n */\n updateInputState(agentId: string, inputState: AgentInputState): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.inputState = inputState;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('input_state_updated', {\n agentId,\n inputState,\n });\n }\n }\n\n /**\n * Clear input state\n */\n clearInputState(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.inputState = undefined;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('input_state_updated', {\n agentId,\n inputState: undefined,\n });\n }\n }\n\n /**\n * Update emotional state\n */\n updateEmotionState(\n agentId: string,\n emotionState: Omit<AgentEmotionState, 'updatedAt'>\n ): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n const enrichedState: AgentEmotionState = {\n ...emotionState,\n updatedAt: new Date().toISOString(),\n };\n presence.emotionState = enrichedState;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('emotion_updated', {\n agentId,\n emotionState: enrichedState,\n });\n }\n }\n\n /**\n * Clear emotional state\n */\n clearEmotionState(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.emotionState = undefined;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('emotion_updated', {\n agentId,\n emotionState: undefined,\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"]}
|