jiva-core 0.2.3 → 0.3.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.
Files changed (152) hide show
  1. package/.dockerignore +53 -0
  2. package/.gcloudignore +49 -0
  3. package/CONTRIBUTING.md +92 -0
  4. package/Dockerfile +63 -0
  5. package/README.md +250 -88
  6. package/cloud-run-deploy.yaml +135 -0
  7. package/cloud-run.yaml +135 -0
  8. package/cloud-run.yaml.template +143 -0
  9. package/deploy.sh +107 -0
  10. package/dist/core/agent-spawner.d.ts +89 -0
  11. package/dist/core/agent-spawner.d.ts.map +1 -0
  12. package/dist/core/agent-spawner.js +208 -0
  13. package/dist/core/agent-spawner.js.map +1 -0
  14. package/dist/core/agent.js +1 -1
  15. package/dist/core/agent.js.map +1 -1
  16. package/dist/core/client-agent.d.ts +103 -0
  17. package/dist/core/client-agent.d.ts.map +1 -0
  18. package/dist/core/client-agent.js +659 -0
  19. package/dist/core/client-agent.js.map +1 -0
  20. package/dist/core/config.d.ts +59 -10
  21. package/dist/core/config.d.ts.map +1 -1
  22. package/dist/core/config.js +19 -2
  23. package/dist/core/config.js.map +1 -1
  24. package/dist/core/conversation-manager.d.ts +10 -18
  25. package/dist/core/conversation-manager.d.ts.map +1 -1
  26. package/dist/core/conversation-manager.js +31 -63
  27. package/dist/core/conversation-manager.js.map +1 -1
  28. package/dist/core/dual-agent.d.ts +22 -3
  29. package/dist/core/dual-agent.d.ts.map +1 -1
  30. package/dist/core/dual-agent.js +86 -10
  31. package/dist/core/dual-agent.js.map +1 -1
  32. package/dist/core/manager-agent.d.ts +16 -1
  33. package/dist/core/manager-agent.d.ts.map +1 -1
  34. package/dist/core/manager-agent.js +127 -44
  35. package/dist/core/manager-agent.js.map +1 -1
  36. package/dist/core/worker-agent.d.ts +9 -1
  37. package/dist/core/worker-agent.d.ts.map +1 -1
  38. package/dist/core/worker-agent.js +169 -14
  39. package/dist/core/worker-agent.js.map +1 -1
  40. package/dist/core/workspace.d.ts +5 -0
  41. package/dist/core/workspace.d.ts.map +1 -1
  42. package/dist/core/workspace.js +47 -7
  43. package/dist/core/workspace.js.map +1 -1
  44. package/dist/index.d.ts +3 -0
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +4 -0
  47. package/dist/index.js.map +1 -1
  48. package/dist/interfaces/cli/index.js +349 -42
  49. package/dist/interfaces/cli/index.js.map +1 -1
  50. package/dist/interfaces/http/index.d.ts +22 -0
  51. package/dist/interfaces/http/index.d.ts.map +1 -0
  52. package/dist/interfaces/http/index.js +135 -0
  53. package/dist/interfaces/http/index.js.map +1 -0
  54. package/dist/interfaces/http/middleware/auth.d.ts +32 -0
  55. package/dist/interfaces/http/middleware/auth.d.ts.map +1 -0
  56. package/dist/interfaces/http/middleware/auth.js +176 -0
  57. package/dist/interfaces/http/middleware/auth.js.map +1 -0
  58. package/dist/interfaces/http/routes/chat.d.ts +7 -0
  59. package/dist/interfaces/http/routes/chat.d.ts.map +1 -0
  60. package/dist/interfaces/http/routes/chat.js +144 -0
  61. package/dist/interfaces/http/routes/chat.js.map +1 -0
  62. package/dist/interfaces/http/routes/health.d.ts +6 -0
  63. package/dist/interfaces/http/routes/health.d.ts.map +1 -0
  64. package/dist/interfaces/http/routes/health.js +25 -0
  65. package/dist/interfaces/http/routes/health.js.map +1 -0
  66. package/dist/interfaces/http/routes/session.d.ts +7 -0
  67. package/dist/interfaces/http/routes/session.d.ts.map +1 -0
  68. package/dist/interfaces/http/routes/session.js +114 -0
  69. package/dist/interfaces/http/routes/session.js.map +1 -0
  70. package/dist/interfaces/http/session-manager.d.ts +76 -0
  71. package/dist/interfaces/http/session-manager.d.ts.map +1 -0
  72. package/dist/interfaces/http/session-manager.js +350 -0
  73. package/dist/interfaces/http/session-manager.js.map +1 -0
  74. package/dist/interfaces/http/websocket-handler.d.ts +18 -0
  75. package/dist/interfaces/http/websocket-handler.d.ts.map +1 -0
  76. package/dist/interfaces/http/websocket-handler.js +146 -0
  77. package/dist/interfaces/http/websocket-handler.js.map +1 -0
  78. package/dist/mcp/client.d.ts +11 -2
  79. package/dist/mcp/client.d.ts.map +1 -1
  80. package/dist/mcp/client.js +44 -19
  81. package/dist/mcp/client.js.map +1 -1
  82. package/dist/mcp/server-manager.d.ts +1 -1
  83. package/dist/mcp/server-manager.d.ts.map +1 -1
  84. package/dist/mcp/server-manager.js +12 -2
  85. package/dist/mcp/server-manager.js.map +1 -1
  86. package/dist/models/krutrim.js +1 -1
  87. package/dist/models/krutrim.js.map +1 -1
  88. package/dist/personas/index.d.ts +13 -0
  89. package/dist/personas/index.d.ts.map +1 -0
  90. package/dist/personas/index.js +13 -0
  91. package/dist/personas/index.js.map +1 -0
  92. package/dist/personas/persona-loader.d.ts +30 -0
  93. package/dist/personas/persona-loader.d.ts.map +1 -0
  94. package/dist/personas/persona-loader.js +246 -0
  95. package/dist/personas/persona-loader.js.map +1 -0
  96. package/dist/personas/persona-manager.d.ts +93 -0
  97. package/dist/personas/persona-manager.d.ts.map +1 -0
  98. package/dist/personas/persona-manager.js +268 -0
  99. package/dist/personas/persona-manager.js.map +1 -0
  100. package/dist/personas/skill-loader.d.ts +35 -0
  101. package/dist/personas/skill-loader.d.ts.map +1 -0
  102. package/dist/personas/skill-loader.js +144 -0
  103. package/dist/personas/skill-loader.js.map +1 -0
  104. package/dist/personas/skill-packager.d.ts +25 -0
  105. package/dist/personas/skill-packager.d.ts.map +1 -0
  106. package/dist/personas/skill-packager.js +233 -0
  107. package/dist/personas/skill-packager.js.map +1 -0
  108. package/dist/personas/types.d.ts +134 -0
  109. package/dist/personas/types.d.ts.map +1 -0
  110. package/dist/personas/types.js +7 -0
  111. package/dist/personas/types.js.map +1 -0
  112. package/dist/personas/validator.d.ts +22 -0
  113. package/dist/personas/validator.d.ts.map +1 -0
  114. package/dist/personas/validator.js +144 -0
  115. package/dist/personas/validator.js.map +1 -0
  116. package/dist/storage/factory.d.ts +51 -0
  117. package/dist/storage/factory.d.ts.map +1 -0
  118. package/dist/storage/factory.js +154 -0
  119. package/dist/storage/factory.js.map +1 -0
  120. package/dist/storage/gcp-bucket-provider.d.ts +60 -0
  121. package/dist/storage/gcp-bucket-provider.d.ts.map +1 -0
  122. package/dist/storage/gcp-bucket-provider.js +292 -0
  123. package/dist/storage/gcp-bucket-provider.js.map +1 -0
  124. package/dist/storage/index.d.ts +33 -0
  125. package/dist/storage/index.d.ts.map +1 -0
  126. package/dist/storage/index.js +37 -0
  127. package/dist/storage/index.js.map +1 -0
  128. package/dist/storage/local-provider.d.ts +37 -0
  129. package/dist/storage/local-provider.d.ts.map +1 -0
  130. package/dist/storage/local-provider.js +228 -0
  131. package/dist/storage/local-provider.js.map +1 -0
  132. package/dist/storage/provider.d.ts +142 -0
  133. package/dist/storage/provider.d.ts.map +1 -0
  134. package/dist/storage/provider.js +136 -0
  135. package/dist/storage/provider.js.map +1 -0
  136. package/dist/storage/types.d.ts +78 -0
  137. package/dist/storage/types.d.ts.map +1 -0
  138. package/dist/storage/types.js +14 -0
  139. package/dist/storage/types.js.map +1 -0
  140. package/dist/utils/logger.d.ts +19 -0
  141. package/dist/utils/logger.d.ts.map +1 -1
  142. package/dist/utils/logger.js +49 -1
  143. package/dist/utils/logger.js.map +1 -1
  144. package/dist/utils/orchestration-logger.d.ts +27 -3
  145. package/dist/utils/orchestration-logger.d.ts.map +1 -1
  146. package/dist/utils/orchestration-logger.js +110 -6
  147. package/dist/utils/orchestration-logger.js.map +1 -1
  148. package/package.json +30 -2
  149. package/.fluen/cache/state.json +0 -7
  150. package/actions/action_registry.py +0 -75
  151. package/actions/python_coder.py +0 -470
  152. package/api/main.py +0 -269
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Session management routes
3
+ */
4
+ import { logger } from '../../../utils/logger.js';
5
+ export function setupSessionRoutes(app, sessionManager) {
6
+ /**
7
+ * Create or restore a session
8
+ * POST /api/session
9
+ */
10
+ app.post('/api/session', async (req, res) => {
11
+ try {
12
+ const { tenantId, sessionId } = req.auth;
13
+ // Get or create session
14
+ await sessionManager.getOrCreateSession(tenantId, sessionId);
15
+ const info = sessionManager.getSessionInfo(tenantId, sessionId);
16
+ res.status(200).json({
17
+ success: true,
18
+ session: info,
19
+ });
20
+ }
21
+ catch (error) {
22
+ logger.error('[API] Failed to create session:', error);
23
+ res.status(500).json({
24
+ error: 'Failed to create session',
25
+ message: error instanceof Error ? error.message : 'Unknown error'
26
+ });
27
+ }
28
+ });
29
+ /**
30
+ * Get session info
31
+ * GET /api/session/:sessionId
32
+ */
33
+ app.get('/api/session/:sessionId', async (req, res) => {
34
+ try {
35
+ const { tenantId } = req.auth;
36
+ const { sessionId } = req.params;
37
+ const info = sessionManager.getSessionInfo(tenantId, sessionId);
38
+ if (!info) {
39
+ res.status(404).json({ error: 'Session not found' });
40
+ return;
41
+ }
42
+ res.status(200).json({ success: true, session: info });
43
+ }
44
+ catch (error) {
45
+ logger.error('[API] Failed to get session:', error);
46
+ res.status(500).json({
47
+ error: 'Failed to get session',
48
+ message: error instanceof Error ? error.message : 'Unknown error'
49
+ });
50
+ }
51
+ });
52
+ /**
53
+ * List sessions for tenant
54
+ * GET /api/sessions
55
+ */
56
+ app.get('/api/sessions', async (req, res) => {
57
+ try {
58
+ const { tenantId } = req.auth;
59
+ const sessions = sessionManager.listSessions(tenantId);
60
+ res.status(200).json({
61
+ success: true,
62
+ sessions,
63
+ count: sessions.length,
64
+ });
65
+ }
66
+ catch (error) {
67
+ logger.error('[API] Failed to list sessions:', error);
68
+ res.status(500).json({
69
+ error: 'Failed to list sessions',
70
+ message: error instanceof Error ? error.message : 'Unknown error'
71
+ });
72
+ }
73
+ });
74
+ /**
75
+ * Delete session
76
+ * DELETE /api/session/:sessionId
77
+ */
78
+ app.delete('/api/session/:sessionId', async (req, res) => {
79
+ try {
80
+ const { tenantId } = req.auth;
81
+ const { sessionId } = req.params;
82
+ await sessionManager.destroySession(tenantId, sessionId);
83
+ res.status(200).json({ success: true, message: 'Session deleted' });
84
+ }
85
+ catch (error) {
86
+ logger.error('[API] Failed to delete session:', error);
87
+ res.status(500).json({
88
+ error: 'Failed to delete session',
89
+ message: error instanceof Error ? error.message : 'Unknown error'
90
+ });
91
+ }
92
+ });
93
+ /**
94
+ * Get manager stats
95
+ * GET /api/stats
96
+ */
97
+ app.get('/api/stats', async (req, res) => {
98
+ try {
99
+ const stats = sessionManager.getStats();
100
+ res.status(200).json({
101
+ success: true,
102
+ stats,
103
+ });
104
+ }
105
+ catch (error) {
106
+ logger.error('[API] Failed to get stats:', error);
107
+ res.status(500).json({
108
+ error: 'Failed to get stats',
109
+ message: error instanceof Error ? error.message : 'Unknown error'
110
+ });
111
+ }
112
+ });
113
+ }
114
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../../src/interfaces/http/routes/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Session Manager - Lifecycle management for DualAgent sessions
3
+ *
4
+ * Responsibilities:
5
+ * - Create/destroy DualAgent instances per session
6
+ * - Track active sessions and enforce limits
7
+ * - Handle idle timeouts
8
+ * - Per-session MCP server initialization
9
+ * - State persistence on shutdown
10
+ */
11
+ import { EventEmitter } from 'events';
12
+ import { DualAgent } from '../../core/dual-agent.js';
13
+ import { StorageProvider } from '../../storage/provider.js';
14
+ export interface SessionConfig {
15
+ storageProvider: StorageProvider;
16
+ maxConcurrentSessions: number;
17
+ idleTimeoutMs: number;
18
+ }
19
+ export interface SessionInfo {
20
+ sessionId: string;
21
+ tenantId: string;
22
+ createdAt: Date;
23
+ lastActivityAt: Date;
24
+ messageCount: number;
25
+ status: 'initializing' | 'active' | 'idle' | 'closing';
26
+ }
27
+ export declare class SessionManager extends EventEmitter {
28
+ private sessions;
29
+ private config;
30
+ constructor(config: SessionConfig);
31
+ /**
32
+ * Get or create a session
33
+ */
34
+ getOrCreateSession(tenantId: string, sessionId: string): Promise<DualAgent>;
35
+ /**
36
+ * Create a new session with all components
37
+ */
38
+ private createSession;
39
+ /**
40
+ * Destroy a session and persist state
41
+ */
42
+ destroySession(tenantId: string, sessionId: string): Promise<void>;
43
+ /**
44
+ * Get session info
45
+ */
46
+ getSessionInfo(tenantId: string, sessionId: string): SessionInfo | null;
47
+ /**
48
+ * List all active sessions for a tenant
49
+ */
50
+ listSessions(tenantId: string): SessionInfo[];
51
+ /**
52
+ * Update activity timestamp (call on each message)
53
+ */
54
+ updateActivity(tenantId: string, sessionId: string): void;
55
+ /**
56
+ * Reset idle timer for a session
57
+ */
58
+ private resetIdleTimer;
59
+ /**
60
+ * Cleanup idle sessions
61
+ */
62
+ private cleanupIdleSessions;
63
+ /**
64
+ * Shutdown all sessions gracefully
65
+ */
66
+ shutdown(): Promise<void>;
67
+ /**
68
+ * Get stats
69
+ */
70
+ getStats(): {
71
+ total: number;
72
+ byTenant: Record<string, number>;
73
+ };
74
+ private getSessionKey;
75
+ }
76
+ //# sourceMappingURL=session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../../src/interfaces/http/session-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAKrD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAO5D,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,eAAe,CAAC;IACjC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,cAAc,EAAE,IAAI,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,cAAc,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;CACxD;AAYD,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAAyC;IACzD,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,aAAa;IAMjC;;OAEG;IACG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAqCjF;;OAEG;YACW,aAAa;IAoK3B;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsDxE;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAMvE;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE;IAU7C;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAczD;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;YACW,mBAAmB;IAqBjC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAa/B;;OAEG;IACH,QAAQ,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE;IAc/D,OAAO,CAAC,aAAa;CAGtB"}
@@ -0,0 +1,350 @@
1
+ /**
2
+ * Session Manager - Lifecycle management for DualAgent sessions
3
+ *
4
+ * Responsibilities:
5
+ * - Create/destroy DualAgent instances per session
6
+ * - Track active sessions and enforce limits
7
+ * - Handle idle timeouts
8
+ * - Per-session MCP server initialization
9
+ * - State persistence on shutdown
10
+ */
11
+ import { EventEmitter } from 'events';
12
+ import { DualAgent } from '../../core/dual-agent.js';
13
+ import { ModelOrchestrator } from '../../models/orchestrator.js';
14
+ import { MCPServerManager } from '../../mcp/server-manager.js';
15
+ import { WorkspaceManager } from '../../core/workspace.js';
16
+ import { ConversationManager } from '../../core/conversation-manager.js';
17
+ import { logger } from '../../utils/logger.js';
18
+ import { orchestrationLogger } from '../../utils/orchestration-logger.js';
19
+ import { createKrutrimModel } from '../../models/krutrim.js';
20
+ import { PersonaManager } from '../../personas/persona-manager.js';
21
+ export class SessionManager extends EventEmitter {
22
+ sessions = new Map();
23
+ config;
24
+ constructor(config) {
25
+ super();
26
+ this.config = config;
27
+ logger.info(`[SessionManager] Initialized (max: ${config.maxConcurrentSessions}, timeout: ${config.idleTimeoutMs}ms)`);
28
+ }
29
+ /**
30
+ * Get or create a session
31
+ */
32
+ async getOrCreateSession(tenantId, sessionId) {
33
+ const key = this.getSessionKey(tenantId, sessionId);
34
+ // Return existing session
35
+ if (this.sessions.has(key)) {
36
+ const session = this.sessions.get(key);
37
+ this.resetIdleTimer(key);
38
+ session.info.lastActivityAt = new Date();
39
+ session.info.status = 'active';
40
+ logger.debug(`[SessionManager] Reusing session: ${key}`);
41
+ return session.agent;
42
+ }
43
+ // Check session limit
44
+ if (this.sessions.size >= this.config.maxConcurrentSessions) {
45
+ // Try to clean up idle sessions
46
+ await this.cleanupIdleSessions();
47
+ if (this.sessions.size >= this.config.maxConcurrentSessions) {
48
+ throw new Error(`Maximum concurrent sessions reached (${this.config.maxConcurrentSessions})`);
49
+ }
50
+ }
51
+ // Create new session
52
+ logger.info(`[SessionManager] Creating session: ${key}`);
53
+ const session = await this.createSession(tenantId, sessionId);
54
+ this.sessions.set(key, session);
55
+ this.resetIdleTimer(key);
56
+ // Configure logger and orchestration logger for this session
57
+ logger.setSessionId(sessionId);
58
+ orchestrationLogger.setStorageProvider(this.config.storageProvider, sessionId);
59
+ this.emit('sessionCreated', { tenantId, sessionId });
60
+ return session.agent;
61
+ }
62
+ /**
63
+ * Create a new session with all components
64
+ */
65
+ async createSession(tenantId, sessionId) {
66
+ const info = {
67
+ sessionId,
68
+ tenantId,
69
+ createdAt: new Date(),
70
+ lastActivityAt: new Date(),
71
+ messageCount: 0,
72
+ status: 'initializing',
73
+ };
74
+ try {
75
+ // Set storage context
76
+ this.config.storageProvider.setContext({ tenantId, sessionId });
77
+ // Load or create config
78
+ let modelConfig = await this.config.storageProvider.getConfig('models');
79
+ // Always use environment variables if set, otherwise use stored config or defaults
80
+ const envEndpoint = process.env.JIVA_MODEL_BASE_URL;
81
+ const envApiKey = process.env.JIVA_MODEL_API_KEY;
82
+ const envModel = process.env.JIVA_MODEL_NAME;
83
+ if (!modelConfig) {
84
+ // Use environment defaults
85
+ modelConfig = {
86
+ reasoning: {
87
+ provider: process.env.JIVA_MODEL_PROVIDER || 'krutrim',
88
+ apiKey: envApiKey || '',
89
+ endpoint: envEndpoint || 'https://cloud.olakrutrim.com/v1/chat/completions',
90
+ model: envModel || 'gpt-oss-120b',
91
+ },
92
+ multimodal: null, // Optional
93
+ };
94
+ await this.config.storageProvider.setConfig('models', modelConfig);
95
+ }
96
+ else {
97
+ // Override stored config with environment variables if present
98
+ if (envEndpoint)
99
+ modelConfig.reasoning.endpoint = envEndpoint;
100
+ if (envApiKey)
101
+ modelConfig.reasoning.apiKey = envApiKey;
102
+ if (envModel)
103
+ modelConfig.reasoning.model = envModel;
104
+ }
105
+ // Create model orchestrator
106
+ const reasoningModel = createKrutrimModel({
107
+ endpoint: modelConfig.reasoning.endpoint,
108
+ apiKey: modelConfig.reasoning.apiKey,
109
+ model: modelConfig.reasoning.model,
110
+ type: 'reasoning',
111
+ useHarmonyFormat: true, // gpt-oss-120b requires Harmony format
112
+ });
113
+ const orchestrator = new ModelOrchestrator({
114
+ reasoningModel,
115
+ multimodalModel: undefined,
116
+ });
117
+ // Initialize MCP servers per-session
118
+ const mcpManager = new MCPServerManager();
119
+ // Ensure base filesystem MCP server is always available
120
+ const allowedPath = process.platform === 'win32' ? 'C:\\Users' : '/Users';
121
+ const baseMcpServers = {
122
+ filesystem: {
123
+ command: 'npx',
124
+ args: ['-y', '@modelcontextprotocol/server-filesystem', allowedPath],
125
+ enabled: true,
126
+ }
127
+ };
128
+ // Load MCP server config from storage
129
+ const mcpConfig = await this.config.storageProvider.getConfig('mcpServers');
130
+ if (mcpConfig && Array.isArray(mcpConfig)) {
131
+ for (const serverConfig of mcpConfig) {
132
+ // Add to base servers (will override filesystem if configured)
133
+ baseMcpServers[serverConfig.name] = {
134
+ command: serverConfig.command,
135
+ args: serverConfig.args,
136
+ env: serverConfig.env,
137
+ enabled: true,
138
+ };
139
+ }
140
+ }
141
+ // Initialize all MCP servers (base + configured)
142
+ await mcpManager.initialize(baseMcpServers);
143
+ // Initialize workspace
144
+ const workspace = new WorkspaceManager(this.config.storageProvider);
145
+ await workspace.initialize();
146
+ // Initialize conversation manager
147
+ const conversationManager = new ConversationManager(this.config.storageProvider);
148
+ // Initialize persona manager with per-tenant storage provider
149
+ // This ensures persona config is isolated per tenant, not shared globally
150
+ const personaManager = new PersonaManager([], false, this.config.storageProvider);
151
+ await personaManager.initialize();
152
+ // Merge persona MCP servers with session MCP servers
153
+ const personaMCPServers = personaManager.getPersonaMCPServers();
154
+ if (Object.keys(personaMCPServers).length > 0) {
155
+ logger.info(`[SessionManager] Adding ${Object.keys(personaMCPServers).length} MCP servers from active persona`);
156
+ for (const [name, config] of Object.entries(personaMCPServers)) {
157
+ try {
158
+ await mcpManager.addServer(name, config);
159
+ logger.success(`[SessionManager] Added persona MCP server: ${name}`);
160
+ }
161
+ catch (error) {
162
+ logger.warn(`[SessionManager] Failed to add persona MCP server '${name}': ${error instanceof Error ? error.message : String(error)}`);
163
+ }
164
+ }
165
+ }
166
+ // Load or create conversation
167
+ const existingConversation = await this.config.storageProvider.loadConversation(sessionId);
168
+ let conversationHistory = [];
169
+ if (existingConversation) {
170
+ conversationHistory = existingConversation.messages;
171
+ info.messageCount = conversationHistory.length;
172
+ logger.info(`[SessionManager] Restored conversation: ${conversationHistory.length} messages`);
173
+ }
174
+ // Create DualAgent
175
+ const agent = new DualAgent({
176
+ orchestrator,
177
+ mcpManager,
178
+ workspace,
179
+ conversationManager,
180
+ personaManager,
181
+ maxSubtasks: 20,
182
+ maxIterations: 10,
183
+ autoSave: true, // Always auto-save in cloud mode
184
+ });
185
+ info.status = 'active';
186
+ return {
187
+ agent,
188
+ mcpManager,
189
+ workspace,
190
+ conversationManager,
191
+ personaManager,
192
+ info,
193
+ };
194
+ }
195
+ catch (error) {
196
+ logger.error(`[SessionManager] Failed to create session ${sessionId}:`, error);
197
+ throw error;
198
+ }
199
+ }
200
+ /**
201
+ * Destroy a session and persist state
202
+ */
203
+ async destroySession(tenantId, sessionId) {
204
+ const key = this.getSessionKey(tenantId, sessionId);
205
+ const session = this.sessions.get(key);
206
+ if (!session) {
207
+ logger.debug(`[SessionManager] Session not found: ${key}`);
208
+ return;
209
+ }
210
+ logger.info(`[SessionManager] Destroying session: ${key}`);
211
+ session.info.status = 'closing';
212
+ // Clear idle timer
213
+ if (session.idleTimer) {
214
+ clearTimeout(session.idleTimer);
215
+ }
216
+ try {
217
+ // Persist conversation state
218
+ const conversationHistory = session.agent.getConversationHistory();
219
+ if (conversationHistory.length > 0) {
220
+ await this.config.storageProvider.saveConversation({
221
+ metadata: {
222
+ id: sessionId,
223
+ created: session.info.createdAt.toISOString(),
224
+ updated: new Date().toISOString(),
225
+ messageCount: conversationHistory.length,
226
+ },
227
+ messages: conversationHistory,
228
+ });
229
+ logger.debug(`[SessionManager] Persisted ${conversationHistory.length} messages`);
230
+ }
231
+ // Flush orchestration logs
232
+ await orchestrationLogger.flush();
233
+ // Flush structured logs
234
+ await this.config.storageProvider.flushLogs();
235
+ // Clean up session-specific logger context
236
+ logger.clearSessionContext(sessionId);
237
+ // Cleanup MCP servers
238
+ await session.mcpManager.cleanup();
239
+ }
240
+ catch (error) {
241
+ logger.error(`[SessionManager] Error persisting session ${key}:`, error);
242
+ }
243
+ this.sessions.delete(key);
244
+ this.emit('sessionDestroyed', { tenantId, sessionId });
245
+ logger.info(`[SessionManager] Session destroyed: ${key}`);
246
+ }
247
+ /**
248
+ * Get session info
249
+ */
250
+ getSessionInfo(tenantId, sessionId) {
251
+ const key = this.getSessionKey(tenantId, sessionId);
252
+ const session = this.sessions.get(key);
253
+ return session ? { ...session.info } : null;
254
+ }
255
+ /**
256
+ * List all active sessions for a tenant
257
+ */
258
+ listSessions(tenantId) {
259
+ const sessions = [];
260
+ for (const [key, session] of this.sessions) {
261
+ if (key.startsWith(`${tenantId}:`)) {
262
+ sessions.push({ ...session.info });
263
+ }
264
+ }
265
+ return sessions;
266
+ }
267
+ /**
268
+ * Update activity timestamp (call on each message)
269
+ */
270
+ updateActivity(tenantId, sessionId) {
271
+ const key = this.getSessionKey(tenantId, sessionId);
272
+ const session = this.sessions.get(key);
273
+ if (session) {
274
+ session.info.lastActivityAt = new Date();
275
+ session.info.messageCount++;
276
+ this.resetIdleTimer(key);
277
+ // Ensure logger knows current session context
278
+ logger.setSessionId(sessionId);
279
+ }
280
+ }
281
+ /**
282
+ * Reset idle timer for a session
283
+ */
284
+ resetIdleTimer(key) {
285
+ const session = this.sessions.get(key);
286
+ if (!session)
287
+ return;
288
+ // Clear existing timer
289
+ if (session.idleTimer) {
290
+ clearTimeout(session.idleTimer);
291
+ }
292
+ // Set new timer
293
+ session.idleTimer = setTimeout(async () => {
294
+ logger.info(`[SessionManager] Session idle timeout: ${key}`);
295
+ const [tenantId, sessionId] = key.split(':');
296
+ await this.destroySession(tenantId, sessionId);
297
+ }, this.config.idleTimeoutMs);
298
+ }
299
+ /**
300
+ * Cleanup idle sessions
301
+ */
302
+ async cleanupIdleSessions() {
303
+ const now = Date.now();
304
+ const toDestroy = [];
305
+ for (const [key, session] of this.sessions) {
306
+ const idleMs = now - session.info.lastActivityAt.getTime();
307
+ if (idleMs > this.config.idleTimeoutMs) {
308
+ const [tenantId, sessionId] = key.split(':');
309
+ toDestroy.push({ tenantId, sessionId });
310
+ }
311
+ }
312
+ for (const { tenantId, sessionId } of toDestroy) {
313
+ await this.destroySession(tenantId, sessionId);
314
+ }
315
+ if (toDestroy.length > 0) {
316
+ logger.info(`[SessionManager] Cleaned up ${toDestroy.length} idle session(s)`);
317
+ }
318
+ }
319
+ /**
320
+ * Shutdown all sessions gracefully
321
+ */
322
+ async shutdown() {
323
+ logger.info(`[SessionManager] Shutting down ${this.sessions.size} session(s)...`);
324
+ const shutdownPromises = [];
325
+ for (const [key] of this.sessions) {
326
+ const [tenantId, sessionId] = key.split(':');
327
+ shutdownPromises.push(this.destroySession(tenantId, sessionId));
328
+ }
329
+ await Promise.all(shutdownPromises);
330
+ logger.info('[SessionManager] All sessions shut down');
331
+ }
332
+ /**
333
+ * Get stats
334
+ */
335
+ getStats() {
336
+ const byTenant = {};
337
+ for (const [key] of this.sessions) {
338
+ const tenantId = key.split(':')[0];
339
+ byTenant[tenantId] = (byTenant[tenantId] || 0) + 1;
340
+ }
341
+ return {
342
+ total: this.sessions.size,
343
+ byTenant,
344
+ };
345
+ }
346
+ getSessionKey(tenantId, sessionId) {
347
+ return `${tenantId}:${sessionId}`;
348
+ }
349
+ }
350
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../../src/interfaces/http/session-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEzE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AA2BnE,MAAM,OAAO,cAAe,SAAQ,YAAY;IACtC,QAAQ,GAA+B,IAAI,GAAG,EAAE,CAAC;IACjD,MAAM,CAAgB;IAE9B,YAAY,MAAqB;QAC/B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,sCAAsC,MAAM,CAAC,qBAAqB,cAAc,MAAM,CAAC,aAAa,KAAK,CAAC,CAAC;IACzH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,QAAgB,EAAE,SAAiB;QAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAEpD,0BAA0B;QAC1B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;YACxC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,qCAAqC,GAAG,EAAE,CAAC,CAAC;YACzD,OAAO,OAAO,CAAC,KAAK,CAAC;QACvB,CAAC;QAED,sBAAsB;QACtB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;YAC5D,gCAAgC;YAChC,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAEjC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;gBAC5D,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,CAAC,MAAM,CAAC,qBAAqB,GAAG,CAAC,CAAC;YAChG,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,MAAM,CAAC,IAAI,CAAC,sCAAsC,GAAG,EAAE,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAEzB,6DAA6D;QAC7D,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAC/B,mBAAmB,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;QAE/E,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;QACrD,OAAO,OAAO,CAAC,KAAK,CAAC;IACvB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CAAC,QAAgB,EAAE,SAAiB;QAC7D,MAAM,IAAI,GAAgB;YACxB,SAAS;YACT,QAAQ;YACR,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,cAAc,EAAE,IAAI,IAAI,EAAE;YAC1B,YAAY,EAAE,CAAC;YACf,MAAM,EAAE,cAAc;SACvB,CAAC;QAEF,IAAI,CAAC;YACH,sBAAsB;YACtB,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;YAEhE,wBAAwB;YACxB,IAAI,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,CAQ1D,QAAQ,CAAC,CAAC;YAEb,mFAAmF;YACnF,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;YACpD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;YACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;YAE7C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,2BAA2B;gBAC3B,WAAW,GAAG;oBACZ,SAAS,EAAE;wBACT,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,SAAS;wBACtD,MAAM,EAAE,SAAS,IAAI,EAAE;wBACvB,QAAQ,EAAE,WAAW,IAAI,kDAAkD;wBAC3E,KAAK,EAAE,QAAQ,IAAI,cAAc;qBAClC;oBACD,UAAU,EAAE,IAAI,EAAE,WAAW;iBAC9B,CAAC;gBACF,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YACrE,CAAC;iBAAM,CAAC;gBACN,+DAA+D;gBAC/D,IAAI,WAAW;oBAAE,WAAW,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW,CAAC;gBAC9D,IAAI,SAAS;oBAAE,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC;gBACxD,IAAI,QAAQ;oBAAE,WAAW,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC;YACvD,CAAC;YAED,4BAA4B;YAC5B,MAAM,cAAc,GAAG,kBAAkB,CAAC;gBACxC,QAAQ,EAAE,WAAW,CAAC,SAAS,CAAC,QAAQ;gBACxC,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,MAAM;gBACpC,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,KAAK;gBAClC,IAAI,EAAE,WAAW;gBACjB,gBAAgB,EAAE,IAAI,EAAE,uCAAuC;aAChE,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,IAAI,iBAAiB,CAAC;gBACzC,cAAc;gBACd,eAAe,EAAE,SAAS;aAC3B,CAAC,CAAC;YAEH,qCAAqC;YACrC,MAAM,UAAU,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAE1C,wDAAwD;YACxD,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC1E,MAAM,cAAc,GAAwB;gBAC1C,UAAU,EAAE;oBACV,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,CAAC,IAAI,EAAE,yCAAyC,EAAE,WAAW,CAAC;oBACpE,OAAO,EAAE,IAAI;iBACd;aACF,CAAC;YAEF,sCAAsC;YACtC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,CAKzD,YAAY,CAAC,CAAC;YAClB,IAAI,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1C,KAAK,MAAM,YAAY,IAAI,SAAS,EAAE,CAAC;oBACrC,+DAA+D;oBAC/D,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG;wBAClC,OAAO,EAAE,YAAY,CAAC,OAAO;wBAC7B,IAAI,EAAE,YAAY,CAAC,IAAI;wBACvB,GAAG,EAAE,YAAY,CAAC,GAAG;wBACrB,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,iDAAiD;YACjD,MAAM,UAAU,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YAE5C,uBAAuB;YACvB,MAAM,SAAS,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YACpE,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;YAE7B,kCAAkC;YAClC,MAAM,mBAAmB,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YAEjF,8DAA8D;YAC9D,0EAA0E;YAC1E,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YAClF,MAAM,cAAc,CAAC,UAAU,EAAE,CAAC;YAElC,qDAAqD;YACrD,MAAM,iBAAiB,GAAG,cAAc,CAAC,oBAAoB,EAAE,CAAC;YAChE,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9C,MAAM,CAAC,IAAI,CAAC,2BAA2B,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,kCAAkC,CAAC,CAAC;gBAEhH,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBAC/D,IAAI,CAAC;wBACH,MAAM,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,MAAa,CAAC,CAAC;wBAChD,MAAM,CAAC,OAAO,CAAC,8CAA8C,IAAI,EAAE,CAAC,CAAC;oBACvE,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,CAAC,IAAI,CAAC,sDAAsD,IAAI,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBACxI,CAAC;gBACH,CAAC;YACH,CAAC;YAED,8BAA8B;YAC9B,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAC3F,IAAI,mBAAmB,GAAc,EAAE,CAAC;YAExC,IAAI,oBAAoB,EAAE,CAAC;gBACzB,mBAAmB,GAAG,oBAAoB,CAAC,QAAQ,CAAC;gBACpD,IAAI,CAAC,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC;gBAC/C,MAAM,CAAC,IAAI,CAAC,2CAA2C,mBAAmB,CAAC,MAAM,WAAW,CAAC,CAAC;YAChG,CAAC;YAED,mBAAmB;YACnB,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC;gBAC1B,YAAY;gBACZ,UAAU;gBACV,SAAS;gBACT,mBAAmB;gBACnB,cAAc;gBACd,WAAW,EAAE,EAAE;gBACf,aAAa,EAAE,EAAE;gBACjB,QAAQ,EAAE,IAAI,EAAE,iCAAiC;aAClD,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;YAEvB,OAAO;gBACL,KAAK;gBACL,UAAU;gBACV,SAAS;gBACT,mBAAmB;gBACnB,cAAc;gBACd,IAAI;aACL,CAAC;QAEJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,6CAA6C,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC;YAC/E,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,QAAgB,EAAE,SAAiB;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,uCAAuC,GAAG,EAAE,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,wCAAwC,GAAG,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QAEhC,mBAAmB;QACnB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,CAAC;YACH,6BAA6B;YAC7B,MAAM,mBAAmB,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC;YACnE,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,gBAAgB,CAAC;oBACjD,QAAQ,EAAE;wBACR,EAAE,EAAE,SAAS;wBACb,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;wBAC7C,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;wBACjC,YAAY,EAAE,mBAAmB,CAAC,MAAM;qBACzC;oBACD,QAAQ,EAAE,mBAAmB;iBAC9B,CAAC,CAAC;gBACH,MAAM,CAAC,KAAK,CAAC,8BAA8B,mBAAmB,CAAC,MAAM,WAAW,CAAC,CAAC;YACpF,CAAC;YAED,2BAA2B;YAC3B,MAAM,mBAAmB,CAAC,KAAK,EAAE,CAAC;YAElC,wBAAwB;YACxB,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;YAE9C,2CAA2C;YAC3C,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;YAEtC,sBAAsB;YACtB,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAErC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,6CAA6C,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,uCAAuC,GAAG,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,QAAgB,EAAE,SAAiB;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,QAAgB;QAC3B,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3C,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,QAAgB,EAAE,SAAiB;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEvC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YAC5B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAEzB,8CAA8C;YAC9C,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,GAAW;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,uBAAuB;QACvB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;QAED,gBAAgB;QAChB,OAAO,CAAC,SAAS,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YACxC,MAAM,CAAC,IAAI,CAAC,0CAA0C,GAAG,EAAE,CAAC,CAAC;YAC7D,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7C,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACjD,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,SAAS,GAAmD,EAAE,CAAC;QAErE,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;YAC3D,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;gBACvC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC7C,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,KAAK,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,SAAS,EAAE,CAAC;YAChD,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,+BAA+B,SAAS,CAAC,MAAM,kBAAkB,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,CAAC,IAAI,CAAC,kCAAkC,IAAI,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAC;QAElF,MAAM,gBAAgB,GAAoB,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7C,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,MAAM,QAAQ,GAA2B,EAAE,CAAC;QAE5C,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACnC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACrD,CAAC;QAED,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YACzB,QAAQ;SACT,CAAC;IACJ,CAAC;IAEO,aAAa,CAAC,QAAgB,EAAE,SAAiB;QACvD,OAAO,GAAG,QAAQ,IAAI,SAAS,EAAE,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * WebSocket handler for real-time bidirectional communication
3
+ *
4
+ * Protocol:
5
+ * Client -> Server:
6
+ * { type: 'message', content: string }
7
+ * { type: 'ping' }
8
+ *
9
+ * Server -> Client:
10
+ * { type: 'response', content: string, ... }
11
+ * { type: 'status', message: string }
12
+ * { type: 'error', message: string }
13
+ * { type: 'pong' }
14
+ */
15
+ import { WebSocketServer } from 'ws';
16
+ import { SessionManager } from './session-manager.js';
17
+ export declare function setupWebSocketHandler(wss: WebSocketServer, sessionManager: SessionManager): void;
18
+ //# sourceMappingURL=websocket-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-handler.d.ts","sourceRoot":"","sources":["../../../src/interfaces/http/websocket-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,eAAe,EAAa,MAAM,IAAI,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AActD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,GAAG,IAAI,CA2GhG"}