jiva-core 0.2.2 → 0.3.1
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/.dockerignore +53 -0
- package/.gcloudignore +49 -0
- package/CONTRIBUTING.md +92 -0
- package/Dockerfile +63 -0
- package/LICENSE +21 -0
- package/README.md +248 -102
- package/cloud-run-deploy.yaml +135 -0
- package/cloud-run.yaml +135 -0
- package/cloud-run.yaml.template +143 -0
- package/deploy.sh +107 -0
- package/dist/core/agent-spawner.d.ts +89 -0
- package/dist/core/agent-spawner.d.ts.map +1 -0
- package/dist/core/agent-spawner.js +195 -0
- package/dist/core/agent-spawner.js.map +1 -0
- package/dist/core/client-agent.d.ts +82 -0
- package/dist/core/client-agent.d.ts.map +1 -0
- package/dist/core/client-agent.js +406 -0
- package/dist/core/client-agent.js.map +1 -0
- package/dist/core/config.d.ts +59 -10
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +19 -2
- package/dist/core/config.js.map +1 -1
- package/dist/core/conversation-manager.d.ts +10 -18
- package/dist/core/conversation-manager.d.ts.map +1 -1
- package/dist/core/conversation-manager.js +28 -60
- package/dist/core/conversation-manager.js.map +1 -1
- package/dist/core/dual-agent.d.ts +24 -3
- package/dist/core/dual-agent.d.ts.map +1 -1
- package/dist/core/dual-agent.js +112 -19
- package/dist/core/dual-agent.js.map +1 -1
- package/dist/core/manager-agent.d.ts +3 -1
- package/dist/core/manager-agent.d.ts.map +1 -1
- package/dist/core/manager-agent.js +66 -14
- package/dist/core/manager-agent.js.map +1 -1
- package/dist/core/worker-agent.d.ts +15 -1
- package/dist/core/worker-agent.d.ts.map +1 -1
- package/dist/core/worker-agent.js +244 -11
- package/dist/core/worker-agent.js.map +1 -1
- package/dist/core/workspace.d.ts +5 -0
- package/dist/core/workspace.d.ts.map +1 -1
- package/dist/core/workspace.js +47 -7
- package/dist/core/workspace.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/cli/index.js +376 -44
- package/dist/interfaces/cli/index.js.map +1 -1
- package/dist/interfaces/cli/repl.d.ts.map +1 -1
- package/dist/interfaces/cli/repl.js +6 -0
- package/dist/interfaces/cli/repl.js.map +1 -1
- package/dist/interfaces/http/index.d.ts +22 -0
- package/dist/interfaces/http/index.d.ts.map +1 -0
- package/dist/interfaces/http/index.js +135 -0
- package/dist/interfaces/http/index.js.map +1 -0
- package/dist/interfaces/http/middleware/auth.d.ts +32 -0
- package/dist/interfaces/http/middleware/auth.d.ts.map +1 -0
- package/dist/interfaces/http/middleware/auth.js +176 -0
- package/dist/interfaces/http/middleware/auth.js.map +1 -0
- package/dist/interfaces/http/routes/chat.d.ts +7 -0
- package/dist/interfaces/http/routes/chat.d.ts.map +1 -0
- package/dist/interfaces/http/routes/chat.js +144 -0
- package/dist/interfaces/http/routes/chat.js.map +1 -0
- package/dist/interfaces/http/routes/health.d.ts +6 -0
- package/dist/interfaces/http/routes/health.d.ts.map +1 -0
- package/dist/interfaces/http/routes/health.js +25 -0
- package/dist/interfaces/http/routes/health.js.map +1 -0
- package/dist/interfaces/http/routes/session.d.ts +7 -0
- package/dist/interfaces/http/routes/session.d.ts.map +1 -0
- package/dist/interfaces/http/routes/session.js +114 -0
- package/dist/interfaces/http/routes/session.js.map +1 -0
- package/dist/interfaces/http/session-manager.d.ts +76 -0
- package/dist/interfaces/http/session-manager.d.ts.map +1 -0
- package/dist/interfaces/http/session-manager.js +339 -0
- package/dist/interfaces/http/session-manager.js.map +1 -0
- package/dist/interfaces/http/websocket-handler.d.ts +18 -0
- package/dist/interfaces/http/websocket-handler.d.ts.map +1 -0
- package/dist/interfaces/http/websocket-handler.js +146 -0
- package/dist/interfaces/http/websocket-handler.js.map +1 -0
- package/dist/mcp/client.d.ts +11 -2
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +44 -19
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/server-manager.d.ts +1 -1
- package/dist/mcp/server-manager.d.ts.map +1 -1
- package/dist/mcp/server-manager.js +12 -2
- package/dist/mcp/server-manager.js.map +1 -1
- package/dist/personas/index.d.ts +13 -0
- package/dist/personas/index.d.ts.map +1 -0
- package/dist/personas/index.js +13 -0
- package/dist/personas/index.js.map +1 -0
- package/dist/personas/persona-loader.d.ts +30 -0
- package/dist/personas/persona-loader.d.ts.map +1 -0
- package/dist/personas/persona-loader.js +246 -0
- package/dist/personas/persona-loader.js.map +1 -0
- package/dist/personas/persona-manager.d.ts +82 -0
- package/dist/personas/persona-manager.d.ts.map +1 -0
- package/dist/personas/persona-manager.js +211 -0
- package/dist/personas/persona-manager.js.map +1 -0
- package/dist/personas/skill-loader.d.ts +35 -0
- package/dist/personas/skill-loader.d.ts.map +1 -0
- package/dist/personas/skill-loader.js +144 -0
- package/dist/personas/skill-loader.js.map +1 -0
- package/dist/personas/skill-packager.d.ts +25 -0
- package/dist/personas/skill-packager.d.ts.map +1 -0
- package/dist/personas/skill-packager.js +233 -0
- package/dist/personas/skill-packager.js.map +1 -0
- package/dist/personas/types.d.ts +134 -0
- package/dist/personas/types.d.ts.map +1 -0
- package/dist/personas/types.js +7 -0
- package/dist/personas/types.js.map +1 -0
- package/dist/personas/validator.d.ts +22 -0
- package/dist/personas/validator.d.ts.map +1 -0
- package/dist/personas/validator.js +144 -0
- package/dist/personas/validator.js.map +1 -0
- package/dist/storage/factory.d.ts +51 -0
- package/dist/storage/factory.d.ts.map +1 -0
- package/dist/storage/factory.js +154 -0
- package/dist/storage/factory.js.map +1 -0
- package/dist/storage/gcp-bucket-provider.d.ts +59 -0
- package/dist/storage/gcp-bucket-provider.d.ts.map +1 -0
- package/dist/storage/gcp-bucket-provider.js +275 -0
- package/dist/storage/gcp-bucket-provider.js.map +1 -0
- package/dist/storage/index.d.ts +33 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +37 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/local-provider.d.ts +36 -0
- package/dist/storage/local-provider.d.ts.map +1 -0
- package/dist/storage/local-provider.js +219 -0
- package/dist/storage/local-provider.js.map +1 -0
- package/dist/storage/provider.d.ts +137 -0
- package/dist/storage/provider.d.ts.map +1 -0
- package/dist/storage/provider.js +136 -0
- package/dist/storage/provider.js.map +1 -0
- package/dist/storage/types.d.ts +78 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +14 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/utils/orchestration-logger.d.ts +36 -0
- package/dist/utils/orchestration-logger.d.ts.map +1 -0
- package/dist/utils/orchestration-logger.js +224 -0
- package/dist/utils/orchestration-logger.js.map +1 -0
- package/jiva-new-demo.gif +0 -0
- package/package.json +30 -2
- package/.fluen/cache/state.json +0 -7
- package/actions/action_registry.py +0 -75
- package/actions/python_coder.py +0 -470
- package/api/main.py +0 -269
- package/downloaded_image.avif +0 -0
- package/downloads/snipping_tool.avif +0 -0
- package/image.avif +0 -0
- package/ms_image.avif +0 -0
- package/screenshot.png +0 -0
- package/snipping_tool.avif +0 -0
- package/tmp_image.avif +0 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health check routes for Cloud Run
|
|
3
|
+
*/
|
|
4
|
+
export function setupHealthRoutes(app) {
|
|
5
|
+
/**
|
|
6
|
+
* Liveness probe - is the server running?
|
|
7
|
+
*/
|
|
8
|
+
app.get('/health', (req, res) => {
|
|
9
|
+
res.status(200).json({ status: 'ok', timestamp: new Date().toISOString() });
|
|
10
|
+
});
|
|
11
|
+
/**
|
|
12
|
+
* Readiness probe - is the server ready to accept traffic?
|
|
13
|
+
*/
|
|
14
|
+
app.get('/ready', (req, res) => {
|
|
15
|
+
// Could check database connections, model availability, etc.
|
|
16
|
+
res.status(200).json({ status: 'ready', timestamp: new Date().toISOString() });
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Startup probe - has the server finished initialization?
|
|
20
|
+
*/
|
|
21
|
+
app.get('/startup', (req, res) => {
|
|
22
|
+
res.status(200).json({ status: 'started', timestamp: new Date().toISOString() });
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../../../src/interfaces/http/routes/health.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C;;OAEG;IACH,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;QACjD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH;;OAEG;IACH,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;QAChD,6DAA6D;QAC7D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH;;OAEG;IACH,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;QAClD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session management routes
|
|
3
|
+
*/
|
|
4
|
+
import { Express } from 'express';
|
|
5
|
+
import { SessionManager } from '../session-manager.js';
|
|
6
|
+
export declare function setupSessionRoutes(app: Express, sessionManager: SessionManager): void;
|
|
7
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/http/routes/session.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAqB,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,GAAG,IAAI,CAsHrF"}
|
|
@@ -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;AAM5D,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;IAiCjF;;OAEG;YACW,aAAa;IAmK3B;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgDxE;;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;IAWzD;;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,339 @@
|
|
|
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 { createKrutrimModel } from '../../models/krutrim.js';
|
|
19
|
+
import { PersonaManager } from '../../personas/persona-manager.js';
|
|
20
|
+
export class SessionManager extends EventEmitter {
|
|
21
|
+
sessions = new Map();
|
|
22
|
+
config;
|
|
23
|
+
constructor(config) {
|
|
24
|
+
super();
|
|
25
|
+
this.config = config;
|
|
26
|
+
logger.info(`[SessionManager] Initialized (max: ${config.maxConcurrentSessions}, timeout: ${config.idleTimeoutMs}ms)`);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get or create a session
|
|
30
|
+
*/
|
|
31
|
+
async getOrCreateSession(tenantId, sessionId) {
|
|
32
|
+
const key = this.getSessionKey(tenantId, sessionId);
|
|
33
|
+
// Return existing session
|
|
34
|
+
if (this.sessions.has(key)) {
|
|
35
|
+
const session = this.sessions.get(key);
|
|
36
|
+
this.resetIdleTimer(key);
|
|
37
|
+
session.info.lastActivityAt = new Date();
|
|
38
|
+
session.info.status = 'active';
|
|
39
|
+
logger.debug(`[SessionManager] Reusing session: ${key}`);
|
|
40
|
+
return session.agent;
|
|
41
|
+
}
|
|
42
|
+
// Check session limit
|
|
43
|
+
if (this.sessions.size >= this.config.maxConcurrentSessions) {
|
|
44
|
+
// Try to clean up idle sessions
|
|
45
|
+
await this.cleanupIdleSessions();
|
|
46
|
+
if (this.sessions.size >= this.config.maxConcurrentSessions) {
|
|
47
|
+
throw new Error(`Maximum concurrent sessions reached (${this.config.maxConcurrentSessions})`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Create new session
|
|
51
|
+
logger.info(`[SessionManager] Creating session: ${key}`);
|
|
52
|
+
const session = await this.createSession(tenantId, sessionId);
|
|
53
|
+
this.sessions.set(key, session);
|
|
54
|
+
this.resetIdleTimer(key);
|
|
55
|
+
this.emit('sessionCreated', { tenantId, sessionId });
|
|
56
|
+
return session.agent;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Create a new session with all components
|
|
60
|
+
*/
|
|
61
|
+
async createSession(tenantId, sessionId) {
|
|
62
|
+
const info = {
|
|
63
|
+
sessionId,
|
|
64
|
+
tenantId,
|
|
65
|
+
createdAt: new Date(),
|
|
66
|
+
lastActivityAt: new Date(),
|
|
67
|
+
messageCount: 0,
|
|
68
|
+
status: 'initializing',
|
|
69
|
+
};
|
|
70
|
+
try {
|
|
71
|
+
// Set storage context
|
|
72
|
+
this.config.storageProvider.setContext({ tenantId, sessionId });
|
|
73
|
+
// Load or create config
|
|
74
|
+
let modelConfig = await this.config.storageProvider.getConfig('models');
|
|
75
|
+
// Always use environment variables if set, otherwise use stored config or defaults
|
|
76
|
+
const envEndpoint = process.env.JIVA_MODEL_BASE_URL;
|
|
77
|
+
const envApiKey = process.env.JIVA_MODEL_API_KEY;
|
|
78
|
+
const envModel = process.env.JIVA_MODEL_NAME;
|
|
79
|
+
if (!modelConfig) {
|
|
80
|
+
// Use environment defaults
|
|
81
|
+
modelConfig = {
|
|
82
|
+
reasoning: {
|
|
83
|
+
provider: process.env.JIVA_MODEL_PROVIDER || 'krutrim',
|
|
84
|
+
apiKey: envApiKey || '',
|
|
85
|
+
endpoint: envEndpoint || 'https://cloud.olakrutrim.com/v1/chat/completions',
|
|
86
|
+
model: envModel || 'gpt-oss-120b',
|
|
87
|
+
},
|
|
88
|
+
multimodal: null, // Optional
|
|
89
|
+
};
|
|
90
|
+
await this.config.storageProvider.setConfig('models', modelConfig);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
// Override stored config with environment variables if present
|
|
94
|
+
if (envEndpoint)
|
|
95
|
+
modelConfig.reasoning.endpoint = envEndpoint;
|
|
96
|
+
if (envApiKey)
|
|
97
|
+
modelConfig.reasoning.apiKey = envApiKey;
|
|
98
|
+
if (envModel)
|
|
99
|
+
modelConfig.reasoning.model = envModel;
|
|
100
|
+
}
|
|
101
|
+
// Create model orchestrator
|
|
102
|
+
const reasoningModel = createKrutrimModel({
|
|
103
|
+
endpoint: modelConfig.reasoning.endpoint,
|
|
104
|
+
apiKey: modelConfig.reasoning.apiKey,
|
|
105
|
+
model: modelConfig.reasoning.model,
|
|
106
|
+
type: 'reasoning',
|
|
107
|
+
useHarmonyFormat: true, // gpt-oss-120b requires Harmony format
|
|
108
|
+
});
|
|
109
|
+
const orchestrator = new ModelOrchestrator({
|
|
110
|
+
reasoningModel,
|
|
111
|
+
multimodalModel: undefined,
|
|
112
|
+
});
|
|
113
|
+
// Initialize MCP servers per-session
|
|
114
|
+
const mcpManager = new MCPServerManager();
|
|
115
|
+
// Ensure base filesystem MCP server is always available
|
|
116
|
+
const allowedPath = process.platform === 'win32' ? 'C:\\Users' : '/Users';
|
|
117
|
+
const baseMcpServers = {
|
|
118
|
+
filesystem: {
|
|
119
|
+
command: 'npx',
|
|
120
|
+
args: ['-y', '@modelcontextprotocol/server-filesystem', allowedPath],
|
|
121
|
+
enabled: true,
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
// Load MCP server config from storage
|
|
125
|
+
const mcpConfig = await this.config.storageProvider.getConfig('mcpServers');
|
|
126
|
+
if (mcpConfig && Array.isArray(mcpConfig)) {
|
|
127
|
+
for (const serverConfig of mcpConfig) {
|
|
128
|
+
// Add to base servers (will override filesystem if configured)
|
|
129
|
+
baseMcpServers[serverConfig.name] = {
|
|
130
|
+
command: serverConfig.command,
|
|
131
|
+
args: serverConfig.args,
|
|
132
|
+
env: serverConfig.env,
|
|
133
|
+
enabled: true,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Initialize all MCP servers (base + configured)
|
|
138
|
+
await mcpManager.initialize(baseMcpServers);
|
|
139
|
+
// Initialize workspace
|
|
140
|
+
const workspace = new WorkspaceManager(this.config.storageProvider);
|
|
141
|
+
await workspace.initialize();
|
|
142
|
+
// Initialize conversation manager
|
|
143
|
+
const conversationManager = new ConversationManager(this.config.storageProvider);
|
|
144
|
+
// Initialize persona manager
|
|
145
|
+
const personaManager = new PersonaManager();
|
|
146
|
+
await personaManager.initialize();
|
|
147
|
+
// Merge persona MCP servers with session MCP servers
|
|
148
|
+
const personaMCPServers = personaManager.getPersonaMCPServers();
|
|
149
|
+
if (Object.keys(personaMCPServers).length > 0) {
|
|
150
|
+
logger.info(`[SessionManager] Adding ${Object.keys(personaMCPServers).length} MCP servers from active persona`);
|
|
151
|
+
for (const [name, config] of Object.entries(personaMCPServers)) {
|
|
152
|
+
try {
|
|
153
|
+
await mcpManager.addServer(name, config);
|
|
154
|
+
logger.success(`[SessionManager] Added persona MCP server: ${name}`);
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
logger.warn(`[SessionManager] Failed to add persona MCP server '${name}': ${error instanceof Error ? error.message : String(error)}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Load or create conversation
|
|
162
|
+
const existingConversation = await this.config.storageProvider.loadConversation(sessionId);
|
|
163
|
+
let conversationHistory = [];
|
|
164
|
+
if (existingConversation) {
|
|
165
|
+
conversationHistory = existingConversation.messages;
|
|
166
|
+
info.messageCount = conversationHistory.length;
|
|
167
|
+
logger.info(`[SessionManager] Restored conversation: ${conversationHistory.length} messages`);
|
|
168
|
+
}
|
|
169
|
+
// Create DualAgent
|
|
170
|
+
const agent = new DualAgent({
|
|
171
|
+
orchestrator,
|
|
172
|
+
mcpManager,
|
|
173
|
+
workspace,
|
|
174
|
+
conversationManager,
|
|
175
|
+
personaManager,
|
|
176
|
+
maxSubtasks: 20,
|
|
177
|
+
maxIterations: 10,
|
|
178
|
+
autoSave: true, // Always auto-save in cloud mode
|
|
179
|
+
});
|
|
180
|
+
info.status = 'active';
|
|
181
|
+
return {
|
|
182
|
+
agent,
|
|
183
|
+
mcpManager,
|
|
184
|
+
workspace,
|
|
185
|
+
conversationManager,
|
|
186
|
+
personaManager,
|
|
187
|
+
info,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
logger.error(`[SessionManager] Failed to create session ${sessionId}:`, error);
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Destroy a session and persist state
|
|
197
|
+
*/
|
|
198
|
+
async destroySession(tenantId, sessionId) {
|
|
199
|
+
const key = this.getSessionKey(tenantId, sessionId);
|
|
200
|
+
const session = this.sessions.get(key);
|
|
201
|
+
if (!session) {
|
|
202
|
+
logger.debug(`[SessionManager] Session not found: ${key}`);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
logger.info(`[SessionManager] Destroying session: ${key}`);
|
|
206
|
+
session.info.status = 'closing';
|
|
207
|
+
// Clear idle timer
|
|
208
|
+
if (session.idleTimer) {
|
|
209
|
+
clearTimeout(session.idleTimer);
|
|
210
|
+
}
|
|
211
|
+
try {
|
|
212
|
+
// Persist conversation state
|
|
213
|
+
const conversationHistory = session.agent.getConversationHistory();
|
|
214
|
+
if (conversationHistory.length > 0) {
|
|
215
|
+
await this.config.storageProvider.saveConversation({
|
|
216
|
+
metadata: {
|
|
217
|
+
id: sessionId,
|
|
218
|
+
created: session.info.createdAt.toISOString(),
|
|
219
|
+
updated: new Date().toISOString(),
|
|
220
|
+
messageCount: conversationHistory.length,
|
|
221
|
+
},
|
|
222
|
+
messages: conversationHistory,
|
|
223
|
+
});
|
|
224
|
+
logger.debug(`[SessionManager] Persisted ${conversationHistory.length} messages`);
|
|
225
|
+
}
|
|
226
|
+
// Flush logs
|
|
227
|
+
await this.config.storageProvider.flushLogs();
|
|
228
|
+
// Cleanup MCP servers
|
|
229
|
+
await session.mcpManager.cleanup();
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
logger.error(`[SessionManager] Error persisting session ${key}:`, error);
|
|
233
|
+
}
|
|
234
|
+
this.sessions.delete(key);
|
|
235
|
+
this.emit('sessionDestroyed', { tenantId, sessionId });
|
|
236
|
+
logger.info(`[SessionManager] Session destroyed: ${key}`);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Get session info
|
|
240
|
+
*/
|
|
241
|
+
getSessionInfo(tenantId, sessionId) {
|
|
242
|
+
const key = this.getSessionKey(tenantId, sessionId);
|
|
243
|
+
const session = this.sessions.get(key);
|
|
244
|
+
return session ? { ...session.info } : null;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* List all active sessions for a tenant
|
|
248
|
+
*/
|
|
249
|
+
listSessions(tenantId) {
|
|
250
|
+
const sessions = [];
|
|
251
|
+
for (const [key, session] of this.sessions) {
|
|
252
|
+
if (key.startsWith(`${tenantId}:`)) {
|
|
253
|
+
sessions.push({ ...session.info });
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return sessions;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Update activity timestamp (call on each message)
|
|
260
|
+
*/
|
|
261
|
+
updateActivity(tenantId, sessionId) {
|
|
262
|
+
const key = this.getSessionKey(tenantId, sessionId);
|
|
263
|
+
const session = this.sessions.get(key);
|
|
264
|
+
if (session) {
|
|
265
|
+
session.info.lastActivityAt = new Date();
|
|
266
|
+
session.info.messageCount++;
|
|
267
|
+
this.resetIdleTimer(key);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Reset idle timer for a session
|
|
272
|
+
*/
|
|
273
|
+
resetIdleTimer(key) {
|
|
274
|
+
const session = this.sessions.get(key);
|
|
275
|
+
if (!session)
|
|
276
|
+
return;
|
|
277
|
+
// Clear existing timer
|
|
278
|
+
if (session.idleTimer) {
|
|
279
|
+
clearTimeout(session.idleTimer);
|
|
280
|
+
}
|
|
281
|
+
// Set new timer
|
|
282
|
+
session.idleTimer = setTimeout(async () => {
|
|
283
|
+
logger.info(`[SessionManager] Session idle timeout: ${key}`);
|
|
284
|
+
const [tenantId, sessionId] = key.split(':');
|
|
285
|
+
await this.destroySession(tenantId, sessionId);
|
|
286
|
+
}, this.config.idleTimeoutMs);
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Cleanup idle sessions
|
|
290
|
+
*/
|
|
291
|
+
async cleanupIdleSessions() {
|
|
292
|
+
const now = Date.now();
|
|
293
|
+
const toDestroy = [];
|
|
294
|
+
for (const [key, session] of this.sessions) {
|
|
295
|
+
const idleMs = now - session.info.lastActivityAt.getTime();
|
|
296
|
+
if (idleMs > this.config.idleTimeoutMs) {
|
|
297
|
+
const [tenantId, sessionId] = key.split(':');
|
|
298
|
+
toDestroy.push({ tenantId, sessionId });
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
for (const { tenantId, sessionId } of toDestroy) {
|
|
302
|
+
await this.destroySession(tenantId, sessionId);
|
|
303
|
+
}
|
|
304
|
+
if (toDestroy.length > 0) {
|
|
305
|
+
logger.info(`[SessionManager] Cleaned up ${toDestroy.length} idle session(s)`);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Shutdown all sessions gracefully
|
|
310
|
+
*/
|
|
311
|
+
async shutdown() {
|
|
312
|
+
logger.info(`[SessionManager] Shutting down ${this.sessions.size} session(s)...`);
|
|
313
|
+
const shutdownPromises = [];
|
|
314
|
+
for (const [key] of this.sessions) {
|
|
315
|
+
const [tenantId, sessionId] = key.split(':');
|
|
316
|
+
shutdownPromises.push(this.destroySession(tenantId, sessionId));
|
|
317
|
+
}
|
|
318
|
+
await Promise.all(shutdownPromises);
|
|
319
|
+
logger.info('[SessionManager] All sessions shut down');
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Get stats
|
|
323
|
+
*/
|
|
324
|
+
getStats() {
|
|
325
|
+
const byTenant = {};
|
|
326
|
+
for (const [key] of this.sessions) {
|
|
327
|
+
const tenantId = key.split(':')[0];
|
|
328
|
+
byTenant[tenantId] = (byTenant[tenantId] || 0) + 1;
|
|
329
|
+
}
|
|
330
|
+
return {
|
|
331
|
+
total: this.sessions.size,
|
|
332
|
+
byTenant,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
getSessionKey(tenantId, sessionId) {
|
|
336
|
+
return `${tenantId}:${sessionId}`;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
//# 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":"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"}
|
|
@@ -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"}
|