@nxuss/lemma 0.2.1 ā 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/README.md +50 -5
- package/dist/cjs/api/dashboardRoutes.d.ts +28 -0
- package/dist/cjs/api/dashboardRoutes.d.ts.map +1 -0
- package/dist/cjs/api/dashboardRoutes.js +239 -0
- package/dist/cjs/api/dashboardRoutes.js.map +1 -0
- package/dist/cjs/api/server.d.ts +51 -0
- package/dist/cjs/api/server.d.ts.map +1 -0
- package/dist/cjs/api/server.js +166 -0
- package/dist/cjs/api/server.js.map +1 -0
- package/dist/cjs/core/AgentRegistry.d.ts +4 -0
- package/dist/cjs/core/AgentRegistry.d.ts.map +1 -1
- package/dist/cjs/core/AgentRegistry.js +6 -0
- package/dist/cjs/core/AgentRegistry.js.map +1 -1
- package/dist/cjs/core/DashboardWebSocketServer.d.ts +70 -0
- package/dist/cjs/core/DashboardWebSocketServer.d.ts.map +1 -0
- package/dist/cjs/core/DashboardWebSocketServer.js +211 -0
- package/dist/cjs/core/DashboardWebSocketServer.js.map +1 -0
- package/dist/cjs/core/GhostAlchemist.d.ts +18 -0
- package/dist/cjs/core/GhostAlchemist.d.ts.map +1 -0
- package/dist/cjs/core/GhostAlchemist.js +55 -0
- package/dist/cjs/core/GhostAlchemist.js.map +1 -0
- package/dist/cjs/core/GhostListener.d.ts +20 -0
- package/dist/cjs/core/GhostListener.d.ts.map +1 -0
- package/dist/cjs/core/GhostListener.js +97 -0
- package/dist/cjs/core/GhostListener.js.map +1 -0
- package/dist/cjs/core/OrchestrationEngine.d.ts +22 -0
- package/dist/cjs/core/OrchestrationEngine.d.ts.map +1 -1
- package/dist/cjs/core/OrchestrationEngine.js +98 -0
- package/dist/cjs/core/OrchestrationEngine.js.map +1 -1
- package/dist/cjs/core/SubconsciousEngine.d.ts +24 -0
- package/dist/cjs/core/SubconsciousEngine.d.ts.map +1 -1
- package/dist/cjs/core/SubconsciousEngine.js +110 -0
- package/dist/cjs/core/SubconsciousEngine.js.map +1 -1
- package/dist/cjs/core/WebSocketServer.d.ts.map +1 -1
- package/dist/cjs/core/WebSocketServer.js +4 -0
- package/dist/cjs/core/WebSocketServer.js.map +1 -1
- package/dist/cjs/db/database.d.ts +60 -0
- package/dist/cjs/db/database.d.ts.map +1 -0
- package/dist/cjs/db/database.js +297 -0
- package/dist/cjs/db/database.js.map +1 -0
- package/dist/cjs/db/migrations/001-dashboard-schema.d.ts +18 -0
- package/dist/cjs/db/migrations/001-dashboard-schema.d.ts.map +1 -0
- package/dist/cjs/db/migrations/001-dashboard-schema.js +175 -0
- package/dist/cjs/db/migrations/001-dashboard-schema.js.map +1 -0
- package/dist/cjs/embed/index.d.ts +1 -1
- package/dist/cjs/embed/index.d.ts.map +1 -1
- package/dist/cjs/embed/index.js +17 -9
- package/dist/cjs/embed/index.js.map +1 -1
- package/dist/cjs/proxy/Gatekeeper.d.ts +43 -0
- package/dist/cjs/proxy/Gatekeeper.d.ts.map +1 -0
- package/dist/cjs/proxy/Gatekeeper.js +202 -0
- package/dist/cjs/proxy/Gatekeeper.js.map +1 -0
- package/dist/cjs/proxy/KeyManager.d.ts +56 -0
- package/dist/cjs/proxy/KeyManager.d.ts.map +1 -0
- package/dist/cjs/proxy/KeyManager.js +220 -0
- package/dist/cjs/proxy/KeyManager.js.map +1 -0
- package/dist/cjs/proxy/ProjectStore.d.ts +84 -0
- package/dist/cjs/proxy/ProjectStore.d.ts.map +1 -0
- package/dist/cjs/proxy/ProjectStore.js +214 -0
- package/dist/cjs/proxy/ProjectStore.js.map +1 -0
- package/dist/cjs/proxy/SseRelay.d.ts +41 -0
- package/dist/cjs/proxy/SseRelay.d.ts.map +1 -0
- package/dist/cjs/proxy/SseRelay.js +176 -0
- package/dist/cjs/proxy/SseRelay.js.map +1 -0
- package/dist/esm/api/dashboardRoutes.d.ts +28 -0
- package/dist/esm/api/dashboardRoutes.d.ts.map +1 -0
- package/dist/esm/api/dashboardRoutes.js +236 -0
- package/dist/esm/api/dashboardRoutes.js.map +1 -0
- package/dist/esm/api/server.d.ts +51 -0
- package/dist/esm/api/server.d.ts.map +1 -0
- package/dist/esm/api/server.js +159 -0
- package/dist/esm/api/server.js.map +1 -0
- package/dist/esm/core/AgentRegistry.d.ts +4 -0
- package/dist/esm/core/AgentRegistry.d.ts.map +1 -1
- package/dist/esm/core/AgentRegistry.js +6 -0
- package/dist/esm/core/AgentRegistry.js.map +1 -1
- package/dist/esm/core/DashboardWebSocketServer.d.ts +70 -0
- package/dist/esm/core/DashboardWebSocketServer.d.ts.map +1 -0
- package/dist/esm/core/DashboardWebSocketServer.js +207 -0
- package/dist/esm/core/DashboardWebSocketServer.js.map +1 -0
- package/dist/esm/core/GhostAlchemist.d.ts +18 -0
- package/dist/esm/core/GhostAlchemist.d.ts.map +1 -0
- package/dist/esm/core/GhostAlchemist.js +48 -0
- package/dist/esm/core/GhostAlchemist.js.map +1 -0
- package/dist/esm/core/GhostListener.d.ts +20 -0
- package/dist/esm/core/GhostListener.d.ts.map +1 -0
- package/dist/esm/core/GhostListener.js +93 -0
- package/dist/esm/core/GhostListener.js.map +1 -0
- package/dist/esm/core/OrchestrationEngine.d.ts +22 -0
- package/dist/esm/core/OrchestrationEngine.d.ts.map +1 -1
- package/dist/esm/core/OrchestrationEngine.js +98 -0
- package/dist/esm/core/OrchestrationEngine.js.map +1 -1
- package/dist/esm/core/SubconsciousEngine.d.ts +24 -0
- package/dist/esm/core/SubconsciousEngine.d.ts.map +1 -1
- package/dist/esm/core/SubconsciousEngine.js +110 -0
- package/dist/esm/core/SubconsciousEngine.js.map +1 -1
- package/dist/esm/core/WebSocketServer.d.ts.map +1 -1
- package/dist/esm/core/WebSocketServer.js +4 -0
- package/dist/esm/core/WebSocketServer.js.map +1 -1
- package/dist/esm/db/database.d.ts +60 -0
- package/dist/esm/db/database.d.ts.map +1 -0
- package/dist/esm/db/database.js +293 -0
- package/dist/esm/db/database.js.map +1 -0
- package/dist/esm/db/migrations/001-dashboard-schema.d.ts +18 -0
- package/dist/esm/db/migrations/001-dashboard-schema.d.ts.map +1 -0
- package/dist/esm/db/migrations/001-dashboard-schema.js +172 -0
- package/dist/esm/db/migrations/001-dashboard-schema.js.map +1 -0
- package/dist/esm/embed/index.d.ts +1 -1
- package/dist/esm/embed/index.d.ts.map +1 -1
- package/dist/esm/embed/index.js +17 -9
- package/dist/esm/embed/index.js.map +1 -1
- package/dist/esm/proxy/Gatekeeper.d.ts +43 -0
- package/dist/esm/proxy/Gatekeeper.d.ts.map +1 -0
- package/dist/esm/proxy/Gatekeeper.js +165 -0
- package/dist/esm/proxy/Gatekeeper.js.map +1 -0
- package/dist/esm/proxy/KeyManager.d.ts +56 -0
- package/dist/esm/proxy/KeyManager.d.ts.map +1 -0
- package/dist/esm/proxy/KeyManager.js +213 -0
- package/dist/esm/proxy/KeyManager.js.map +1 -0
- package/dist/esm/proxy/ProjectStore.d.ts +84 -0
- package/dist/esm/proxy/ProjectStore.d.ts.map +1 -0
- package/dist/esm/proxy/ProjectStore.js +207 -0
- package/dist/esm/proxy/ProjectStore.js.map +1 -0
- package/dist/esm/proxy/SseRelay.d.ts +41 -0
- package/dist/esm/proxy/SseRelay.d.ts.map +1 -0
- package/dist/esm/proxy/SseRelay.js +169 -0
- package/dist/esm/proxy/SseRelay.js.map +1 -0
- package/lemma-proxy.cjs +477 -0
- package/package.json +20 -4
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard WebSocket Server
|
|
3
|
+
* Real-time event streaming for dashboard using Socket.io
|
|
4
|
+
* Emits metrics, agent updates, and cache events
|
|
5
|
+
*/
|
|
6
|
+
import { Server as SocketIOServer } from 'socket.io';
|
|
7
|
+
import http from 'http';
|
|
8
|
+
import { OrchestrationEngine } from './OrchestrationEngine';
|
|
9
|
+
export declare class DashboardWebSocketServer {
|
|
10
|
+
private io;
|
|
11
|
+
private orchestrationEngine;
|
|
12
|
+
private server;
|
|
13
|
+
private broadcastInterval;
|
|
14
|
+
private port;
|
|
15
|
+
private eventLog;
|
|
16
|
+
constructor(httpServer: http.Server, port?: number);
|
|
17
|
+
/**
|
|
18
|
+
* Setup Socket.io event handlers
|
|
19
|
+
*/
|
|
20
|
+
private setupHandlers;
|
|
21
|
+
/**
|
|
22
|
+
* Set orchestration engine reference
|
|
23
|
+
*/
|
|
24
|
+
setOrchestrationEngine(engine: OrchestrationEngine): void;
|
|
25
|
+
/**
|
|
26
|
+
* Start broadcasting metrics
|
|
27
|
+
*/
|
|
28
|
+
startBroadcasting(intervalMs?: number): void;
|
|
29
|
+
/**
|
|
30
|
+
* Stop broadcasting
|
|
31
|
+
*/
|
|
32
|
+
stopBroadcasting(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Emit agent joined event
|
|
35
|
+
*/
|
|
36
|
+
emitAgentJoined(agentId: string, agentName: string, capabilities: string[]): void;
|
|
37
|
+
/**
|
|
38
|
+
* Emit agent left event
|
|
39
|
+
*/
|
|
40
|
+
emitAgentLeft(agentId: string): void;
|
|
41
|
+
/**
|
|
42
|
+
* Emit agent error event
|
|
43
|
+
*/
|
|
44
|
+
emitAgentError(agentId: string, errorMessage: string): void;
|
|
45
|
+
/**
|
|
46
|
+
* Emit cache hit event
|
|
47
|
+
*/
|
|
48
|
+
emitCacheHit(queryHash: string, latency: number, tokensSaved: number, costSaved: number): void;
|
|
49
|
+
/**
|
|
50
|
+
* Emit cache miss event
|
|
51
|
+
*/
|
|
52
|
+
emitCacheMiss(queryHash: string, latency: number): void;
|
|
53
|
+
/**
|
|
54
|
+
* Get event log (keep last 1000 events)
|
|
55
|
+
*/
|
|
56
|
+
getEventLog(): any[];
|
|
57
|
+
/**
|
|
58
|
+
* Log event internally
|
|
59
|
+
*/
|
|
60
|
+
private logEvent;
|
|
61
|
+
/**
|
|
62
|
+
* Clear event log
|
|
63
|
+
*/
|
|
64
|
+
clearEventLog(): void;
|
|
65
|
+
/**
|
|
66
|
+
* Get Socket.io instance
|
|
67
|
+
*/
|
|
68
|
+
getIO(): SocketIOServer;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=DashboardWebSocketServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardWebSocketServer.d.ts","sourceRoot":"","sources":["../../../src/core/DashboardWebSocketServer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,IAAI,cAAc,EAAU,MAAM,WAAW,CAAC;AAC7D,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAK5D,qBAAa,wBAAwB;IACnC,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,mBAAmB,CAAoC;IAC/D,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAa;gBAEjB,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,GAAE,MAAa;IAiBxD;;OAEG;IACH,OAAO,CAAC,aAAa;IA4CrB;;OAEG;IACI,sBAAsB,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI;IAIhE;;OAEG;IACI,iBAAiB,CAAC,UAAU,GAAE,MAAa,GAAG,IAAI;IAwBzD;;OAEG;IACI,gBAAgB,IAAI,IAAI;IAQ/B;;OAEG;IACI,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI;IAcxF;;OAEG;IACI,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAY3C;;OAEG;IACI,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAalE;;OAEG;IACI,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAerG;;OAEG;IACI,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAa9D;;OAEG;IACI,WAAW,IAAI,GAAG,EAAE;IAI3B;;OAEG;IACH,OAAO,CAAC,QAAQ;IAOhB;;OAEG;IACI,aAAa,IAAI,IAAI;IAI5B;;OAEG;IACI,KAAK,IAAI,cAAc;CAG/B"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Dashboard WebSocket Server
|
|
4
|
+
* Real-time event streaming for dashboard using Socket.io
|
|
5
|
+
* Emits metrics, agent updates, and cache events
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.DashboardWebSocketServer = void 0;
|
|
9
|
+
const socket_io_1 = require("socket.io");
|
|
10
|
+
const logger_1 = require("../utils/logger");
|
|
11
|
+
const logger = (0, logger_1.createLogger)('DashboardWebSocketServer');
|
|
12
|
+
class DashboardWebSocketServer {
|
|
13
|
+
constructor(httpServer, port = 3002) {
|
|
14
|
+
this.orchestrationEngine = null;
|
|
15
|
+
this.broadcastInterval = null;
|
|
16
|
+
this.eventLog = [];
|
|
17
|
+
this.server = httpServer;
|
|
18
|
+
this.port = port;
|
|
19
|
+
// Initialize Socket.io
|
|
20
|
+
this.io = new socket_io_1.Server(httpServer, {
|
|
21
|
+
cors: {
|
|
22
|
+
origin: ['http://localhost:3000', 'http://localhost:5173', 'http://127.0.0.1:3000'],
|
|
23
|
+
methods: ['GET', 'POST'],
|
|
24
|
+
credentials: true,
|
|
25
|
+
},
|
|
26
|
+
transports: ['websocket', 'polling'],
|
|
27
|
+
});
|
|
28
|
+
this.setupHandlers();
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Setup Socket.io event handlers
|
|
32
|
+
*/
|
|
33
|
+
setupHandlers() {
|
|
34
|
+
this.io.on('connection', (socket) => {
|
|
35
|
+
logger.info('Dashboard client connected', { socketId: socket.id });
|
|
36
|
+
// Respond to client with current metrics
|
|
37
|
+
socket.emit('metrics:init', {
|
|
38
|
+
timestamp: new Date().toISOString(),
|
|
39
|
+
});
|
|
40
|
+
// Handle subscription requests
|
|
41
|
+
socket.on('subscribe:metrics', () => {
|
|
42
|
+
logger.debug('Client subscribed to metrics', { socketId: socket.id });
|
|
43
|
+
socket.join('metrics');
|
|
44
|
+
});
|
|
45
|
+
socket.on('unsubscribe:metrics', () => {
|
|
46
|
+
logger.debug('Client unsubscribed from metrics', { socketId: socket.id });
|
|
47
|
+
socket.leave('metrics');
|
|
48
|
+
});
|
|
49
|
+
// Handle debugger pause/resume
|
|
50
|
+
socket.on('debugger:pause', () => {
|
|
51
|
+
logger.info('Dashboard requested pause', { socketId: socket.id });
|
|
52
|
+
this.orchestrationEngine?.pauseProcessing?.();
|
|
53
|
+
this.io.emit('debugger:paused', {
|
|
54
|
+
timestamp: new Date().toISOString(),
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
socket.on('debugger:resume', () => {
|
|
58
|
+
logger.info('Dashboard requested resume', { socketId: socket.id });
|
|
59
|
+
this.orchestrationEngine?.resumeProcessing?.();
|
|
60
|
+
this.io.emit('debugger:resumed', {
|
|
61
|
+
timestamp: new Date().toISOString(),
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
// Disconnect handler
|
|
65
|
+
socket.on('disconnect', () => {
|
|
66
|
+
logger.info('Dashboard client disconnected', { socketId: socket.id });
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Set orchestration engine reference
|
|
72
|
+
*/
|
|
73
|
+
setOrchestrationEngine(engine) {
|
|
74
|
+
this.orchestrationEngine = engine;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Start broadcasting metrics
|
|
78
|
+
*/
|
|
79
|
+
startBroadcasting(intervalMs = 2000) {
|
|
80
|
+
logger.info('Starting dashboard WebSocket broadcasting', { intervalMs });
|
|
81
|
+
this.broadcastInterval = setInterval(() => {
|
|
82
|
+
if (!this.orchestrationEngine)
|
|
83
|
+
return;
|
|
84
|
+
const metrics = this.orchestrationEngine.getMetrics();
|
|
85
|
+
// Emit metrics to all connected clients
|
|
86
|
+
this.io.to('metrics').emit('metrics:update', {
|
|
87
|
+
timestamp: new Date().toISOString(),
|
|
88
|
+
totalRequests: metrics.totalRequests,
|
|
89
|
+
cacheHits: metrics.cacheHits,
|
|
90
|
+
cacheMisses: metrics.cacheMisses,
|
|
91
|
+
hitRate: metrics.totalRequests > 0
|
|
92
|
+
? (metrics.cacheHits / metrics.totalRequests).toFixed(4)
|
|
93
|
+
: 0,
|
|
94
|
+
averageLatency: metrics.averageLatency,
|
|
95
|
+
tokensSaved: metrics.tokensSaved,
|
|
96
|
+
costSaved: metrics.costSaved,
|
|
97
|
+
});
|
|
98
|
+
}, intervalMs);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Stop broadcasting
|
|
102
|
+
*/
|
|
103
|
+
stopBroadcasting() {
|
|
104
|
+
if (this.broadcastInterval) {
|
|
105
|
+
clearInterval(this.broadcastInterval);
|
|
106
|
+
this.broadcastInterval = null;
|
|
107
|
+
logger.info('Dashboard WebSocket broadcasting stopped');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Emit agent joined event
|
|
112
|
+
*/
|
|
113
|
+
emitAgentJoined(agentId, agentName, capabilities) {
|
|
114
|
+
const event = {
|
|
115
|
+
id: `evt-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
|
|
116
|
+
timestamp: new Date().toISOString(),
|
|
117
|
+
type: 'agent:joined',
|
|
118
|
+
agentId,
|
|
119
|
+
agentName,
|
|
120
|
+
capabilities,
|
|
121
|
+
};
|
|
122
|
+
this.logEvent(event);
|
|
123
|
+
this.io.emit('agent:joined', event);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Emit agent left event
|
|
127
|
+
*/
|
|
128
|
+
emitAgentLeft(agentId) {
|
|
129
|
+
const event = {
|
|
130
|
+
id: `evt-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
|
|
131
|
+
timestamp: new Date().toISOString(),
|
|
132
|
+
type: 'agent:left',
|
|
133
|
+
agentId,
|
|
134
|
+
};
|
|
135
|
+
this.logEvent(event);
|
|
136
|
+
this.io.emit('agent:left', event);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Emit agent error event
|
|
140
|
+
*/
|
|
141
|
+
emitAgentError(agentId, errorMessage) {
|
|
142
|
+
const event = {
|
|
143
|
+
id: `evt-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
|
|
144
|
+
timestamp: new Date().toISOString(),
|
|
145
|
+
type: 'agent:error',
|
|
146
|
+
agentId,
|
|
147
|
+
errorMessage,
|
|
148
|
+
};
|
|
149
|
+
this.logEvent(event);
|
|
150
|
+
this.io.emit('agent:error', event);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Emit cache hit event
|
|
154
|
+
*/
|
|
155
|
+
emitCacheHit(queryHash, latency, tokensSaved, costSaved) {
|
|
156
|
+
const event = {
|
|
157
|
+
id: `evt-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
|
|
158
|
+
timestamp: new Date().toISOString(),
|
|
159
|
+
type: 'cache:hit',
|
|
160
|
+
queryHash,
|
|
161
|
+
latency,
|
|
162
|
+
tokensSaved,
|
|
163
|
+
costSaved,
|
|
164
|
+
};
|
|
165
|
+
this.logEvent(event);
|
|
166
|
+
this.io.emit('cache:hit', event);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Emit cache miss event
|
|
170
|
+
*/
|
|
171
|
+
emitCacheMiss(queryHash, latency) {
|
|
172
|
+
const event = {
|
|
173
|
+
id: `evt-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
|
|
174
|
+
timestamp: new Date().toISOString(),
|
|
175
|
+
type: 'cache:miss',
|
|
176
|
+
queryHash,
|
|
177
|
+
latency,
|
|
178
|
+
};
|
|
179
|
+
this.logEvent(event);
|
|
180
|
+
this.io.emit('cache:miss', event);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get event log (keep last 1000 events)
|
|
184
|
+
*/
|
|
185
|
+
getEventLog() {
|
|
186
|
+
return [...this.eventLog];
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Log event internally
|
|
190
|
+
*/
|
|
191
|
+
logEvent(event) {
|
|
192
|
+
this.eventLog.push(event);
|
|
193
|
+
if (this.eventLog.length > 1000) {
|
|
194
|
+
this.eventLog.shift();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Clear event log
|
|
199
|
+
*/
|
|
200
|
+
clearEventLog() {
|
|
201
|
+
this.eventLog = [];
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Get Socket.io instance
|
|
205
|
+
*/
|
|
206
|
+
getIO() {
|
|
207
|
+
return this.io;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
exports.DashboardWebSocketServer = DashboardWebSocketServer;
|
|
211
|
+
//# sourceMappingURL=DashboardWebSocketServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardWebSocketServer.js","sourceRoot":"","sources":["../../../src/core/DashboardWebSocketServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface Diagnosis {
|
|
2
|
+
fix: string;
|
|
3
|
+
confidence: number;
|
|
4
|
+
}
|
|
5
|
+
export declare class GhostAlchemist {
|
|
6
|
+
private model;
|
|
7
|
+
private host;
|
|
8
|
+
constructor();
|
|
9
|
+
/**
|
|
10
|
+
* Synthesize context for token savings
|
|
11
|
+
*/
|
|
12
|
+
synthesize(context: string, goal: string): Promise<string>;
|
|
13
|
+
/**
|
|
14
|
+
* Diagnose a failure and suggest a fix
|
|
15
|
+
*/
|
|
16
|
+
diagnoseFailure(error: string, context: string): Promise<Diagnosis>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=GhostAlchemist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GhostAlchemist.d.ts","sourceRoot":"","sources":["../../../src/core/GhostAlchemist.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,IAAI,CAAS;;IAOrB;;OAEG;IACU,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBvE;;OAEG;IACU,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;CAgBjF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.GhostAlchemist = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const logger_1 = require("../utils/logger");
|
|
9
|
+
class GhostAlchemist {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.model = process.env.OLLAMA_GEN_MODEL || 'llama3';
|
|
12
|
+
this.host = process.env.OLLAMA_HOST || 'http://localhost:11434';
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Synthesize context for token savings
|
|
16
|
+
*/
|
|
17
|
+
async synthesize(context, goal) {
|
|
18
|
+
try {
|
|
19
|
+
const prompt = `TASK: Synthesize this technical context into a DENSE SEMANTIC SUMMARY for another LLM.\nGOAL: ${goal}\nCONTEXT:\n${context}`;
|
|
20
|
+
const resp = await axios_1.default.post(`${this.host}/api/generate`, {
|
|
21
|
+
model: this.model,
|
|
22
|
+
prompt,
|
|
23
|
+
stream: false,
|
|
24
|
+
options: { temperature: 0.1 }
|
|
25
|
+
});
|
|
26
|
+
return resp.data.response.trim();
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
logger_1.logger.error('Ghost synthesis failed', e);
|
|
30
|
+
return context;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Diagnose a failure and suggest a fix
|
|
35
|
+
*/
|
|
36
|
+
async diagnoseFailure(error, context) {
|
|
37
|
+
try {
|
|
38
|
+
const prompt = `DIAGNOSTIC: Analyze error and context. Return JSON { "fix": "...", "confidence": 0.0-1.0 }\nERROR: ${error}\nCONTEXT: ${context.slice(-2000)}`;
|
|
39
|
+
const resp = await axios_1.default.post(`${this.host}/api/generate`, {
|
|
40
|
+
model: this.model,
|
|
41
|
+
prompt,
|
|
42
|
+
stream: false,
|
|
43
|
+
format: 'json',
|
|
44
|
+
options: { temperature: 0 }
|
|
45
|
+
});
|
|
46
|
+
return JSON.parse(resp.data.response);
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
logger_1.logger.error('Ghost diagnostic failed', e);
|
|
50
|
+
return { fix: 'Unable to diagnose', confidence: 0 };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.GhostAlchemist = GhostAlchemist;
|
|
55
|
+
//# sourceMappingURL=GhostAlchemist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GhostAlchemist.js","sourceRoot":"","sources":["../../../src/core/GhostAlchemist.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,4CAAyC;AAOzC,MAAa,cAAc;IAIzB;QACE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,QAAQ,CAAC;QACtD,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,wBAAwB,CAAC;IAClE,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,UAAU,CAAC,OAAe,EAAE,IAAY;QACnD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,iGAAiG,IAAI,eAAe,OAAO,EAAE,CAAC;YAC7I,MAAM,IAAI,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,eAAe,EAAE;gBACzD,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM;gBACN,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE;aAC9B,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,eAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;YAC1C,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,eAAe,CAAC,KAAa,EAAE,OAAe;QACzD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,sGAAsG,KAAK,cAAc,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/J,MAAM,IAAI,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,eAAe,EAAE;gBACzD,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM;gBACN,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE;aAC5B,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,eAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC;YAC3C,OAAO,EAAE,GAAG,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;QACtD,CAAC;IACH,CAAC;CACF;AA/CD,wCA+CC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GhostListener
|
|
3
|
+
* Watches terminal output for errors and provides instant diagnostics.
|
|
4
|
+
*/
|
|
5
|
+
export declare class GhostListener {
|
|
6
|
+
private alchemist;
|
|
7
|
+
private currentProcess;
|
|
8
|
+
private outputBuffer;
|
|
9
|
+
private readonly MAX_BUFFER_LINES;
|
|
10
|
+
constructor();
|
|
11
|
+
/**
|
|
12
|
+
* Run a command and watch its output
|
|
13
|
+
*/
|
|
14
|
+
run(command: string, args: string[]): void;
|
|
15
|
+
private addToBuffer;
|
|
16
|
+
private analyzeOutput;
|
|
17
|
+
private handleDetectedError;
|
|
18
|
+
private copyToClipboard;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=GhostListener.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GhostListener.d.ts","sourceRoot":"","sources":["../../../src/core/GhostListener.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAO;;IAMxC;;OAEG;IACI,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IA+BjD,OAAO,CAAC,WAAW;YAQL,aAAa;YAUb,mBAAmB;IA2BjC,OAAO,CAAC,eAAe;CAUxB"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GhostListener = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const GhostAlchemist_1 = require("./GhostAlchemist");
|
|
6
|
+
const logger_1 = require("../utils/logger");
|
|
7
|
+
/**
|
|
8
|
+
* GhostListener
|
|
9
|
+
* Watches terminal output for errors and provides instant diagnostics.
|
|
10
|
+
*/
|
|
11
|
+
class GhostListener {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.currentProcess = null;
|
|
14
|
+
this.outputBuffer = [];
|
|
15
|
+
this.MAX_BUFFER_LINES = 100;
|
|
16
|
+
this.alchemist = new GhostAlchemist_1.GhostAlchemist();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Run a command and watch its output
|
|
20
|
+
*/
|
|
21
|
+
run(command, args) {
|
|
22
|
+
console.log(`šµļøāāļø [Ghost] Watching: ${command} ${args.join(' ')}\n`);
|
|
23
|
+
this.currentProcess = (0, child_process_1.spawn)(command, args, {
|
|
24
|
+
shell: true,
|
|
25
|
+
stdio: ['inherit', 'pipe', 'pipe'],
|
|
26
|
+
env: { ...process.env, FORCE_COLOR: 'true' } // Keep colors for better detection
|
|
27
|
+
});
|
|
28
|
+
// Handle stdout
|
|
29
|
+
this.currentProcess.stdout?.on('data', (data) => {
|
|
30
|
+
const text = data.toString();
|
|
31
|
+
process.stdout.write(data); // Pass through to user terminal
|
|
32
|
+
this.addToBuffer(text);
|
|
33
|
+
this.analyzeOutput(text);
|
|
34
|
+
});
|
|
35
|
+
// Handle stderr
|
|
36
|
+
this.currentProcess.stderr?.on('data', (data) => {
|
|
37
|
+
const text = data.toString();
|
|
38
|
+
process.stderr.write(data); // Pass through to user terminal
|
|
39
|
+
this.addToBuffer(text);
|
|
40
|
+
this.analyzeOutput(text, true);
|
|
41
|
+
});
|
|
42
|
+
this.currentProcess.on('exit', (code) => {
|
|
43
|
+
console.log(`\nš [Ghost] Process exited with code ${code}`);
|
|
44
|
+
process.exit(code || 0);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
addToBuffer(text) {
|
|
48
|
+
const lines = text.split('\n');
|
|
49
|
+
this.outputBuffer.push(...lines);
|
|
50
|
+
if (this.outputBuffer.length > this.MAX_BUFFER_LINES) {
|
|
51
|
+
this.outputBuffer = this.outputBuffer.slice(-this.MAX_BUFFER_LINES);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async analyzeOutput(text, isErrorStream = false) {
|
|
55
|
+
// Look for error patterns
|
|
56
|
+
const errorKeywords = ['Error:', 'Exception:', 'failed', '500 Internal', 'stack trace', 'FATAL'];
|
|
57
|
+
const hasError = errorKeywords.some(kw => text.includes(kw)) || isErrorStream;
|
|
58
|
+
if (hasError && text.length > 10) {
|
|
59
|
+
this.handleDetectedError(text);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async handleDetectedError(errorSnippet) {
|
|
63
|
+
console.log('\nš» [Ghost] Bug detected! Analyzing...');
|
|
64
|
+
const context = this.outputBuffer.join('\n');
|
|
65
|
+
const diagnosis = await this.alchemist.diagnoseFailure(errorSnippet, context);
|
|
66
|
+
if (diagnosis.confidence > 0.5) {
|
|
67
|
+
const promptToPaste = `GHOST DIAGNOSTIC REPORT š»
|
|
68
|
+
---
|
|
69
|
+
ERROR DETECTED IN TERMINAL:
|
|
70
|
+
${errorSnippet}
|
|
71
|
+
|
|
72
|
+
CONTEXT:
|
|
73
|
+
${context.slice(-500)}
|
|
74
|
+
|
|
75
|
+
SUGGESTED FIX:
|
|
76
|
+
${diagnosis.fix}
|
|
77
|
+
---
|
|
78
|
+
Please apply this fix to the project.`;
|
|
79
|
+
this.copyToClipboard(promptToPaste);
|
|
80
|
+
console.log('⨠[Ghost] Solution generated and copied to CLIPBOARD.');
|
|
81
|
+
console.log(`š” Suggestion: ${diagnosis.fix.substring(0, 100)}...\n`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
copyToClipboard(text) {
|
|
85
|
+
try {
|
|
86
|
+
// Use Mac native pbcopy
|
|
87
|
+
const child = (0, child_process_1.spawn)('pbcopy');
|
|
88
|
+
child.stdin.write(text);
|
|
89
|
+
child.stdin.end();
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
logger_1.logger.error('Failed to copy to clipboard', e);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.GhostListener = GhostListener;
|
|
97
|
+
//# sourceMappingURL=GhostListener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GhostListener.js","sourceRoot":"","sources":["../../../src/core/GhostListener.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,16 +9,26 @@ import { OrchestrationMetrics } from '../types';
|
|
|
9
9
|
export declare class OrchestrationEngine {
|
|
10
10
|
private wsServer;
|
|
11
11
|
private subconsciousEngine;
|
|
12
|
+
private dashboardWebSocket;
|
|
12
13
|
private metrics;
|
|
13
14
|
private requestLatencies;
|
|
14
15
|
private taskRequestors;
|
|
15
16
|
private taskDescriptions;
|
|
16
17
|
private dashboardBroadcaster;
|
|
18
|
+
private connectedAgents;
|
|
17
19
|
constructor(wsServer: WebSocketServer, subconsciousEngine: SubconsciousEngine);
|
|
18
20
|
/**
|
|
19
21
|
* Set dashboard broadcaster reference
|
|
20
22
|
*/
|
|
21
23
|
setDashboardBroadcaster(broadcaster: any): void;
|
|
24
|
+
/**
|
|
25
|
+
* Link the Dashboard WebSocket server so we can emit dashboard-specific events
|
|
26
|
+
*/
|
|
27
|
+
setDashboardWebSocket(server: any): void;
|
|
28
|
+
/**
|
|
29
|
+
* Get all connected agents
|
|
30
|
+
*/
|
|
31
|
+
getConnectedAgents(): any[];
|
|
22
32
|
/**
|
|
23
33
|
* Setup event handlers for WebSocket server
|
|
24
34
|
*/
|
|
@@ -81,5 +91,17 @@ export declare class OrchestrationEngine {
|
|
|
81
91
|
* Print metrics summary
|
|
82
92
|
*/
|
|
83
93
|
printMetrics(): void;
|
|
94
|
+
/**
|
|
95
|
+
* Reset all metrics (for cache clear)
|
|
96
|
+
*/
|
|
97
|
+
resetMetrics(): void;
|
|
98
|
+
/**
|
|
99
|
+
* Pause agent processing
|
|
100
|
+
*/
|
|
101
|
+
pauseProcessing(): void;
|
|
102
|
+
/**
|
|
103
|
+
* Resume agent processing
|
|
104
|
+
*/
|
|
105
|
+
resumeProcessing(): void;
|
|
84
106
|
}
|
|
85
107
|
//# sourceMappingURL=OrchestrationEngine.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrchestrationEngine.d.ts","sourceRoot":"","sources":["../../../src/core/OrchestrationEngine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAML,oBAAoB,EAErB,MAAM,UAAU,CAAC;AAKlB;;;;GAIG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,gBAAgB,CAAkC;IAC1D,OAAO,CAAC,oBAAoB,CAAa;
|
|
1
|
+
{"version":3,"file":"OrchestrationEngine.d.ts","sourceRoot":"","sources":["../../../src/core/OrchestrationEngine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAML,oBAAoB,EAErB,MAAM,UAAU,CAAC;AAKlB;;;;GAIG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,gBAAgB,CAAkC;IAC1D,OAAO,CAAC,oBAAoB,CAAa;IACzC,OAAO,CAAC,eAAe,CAA+B;gBAE1C,QAAQ,EAAE,eAAe,EAAE,kBAAkB,EAAE,kBAAkB;IAe7E;;OAEG;IACI,uBAAuB,CAAC,WAAW,EAAE,GAAG,GAAG,IAAI;IAItD;;OAEG;IACI,qBAAqB,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI;IAI/C;;OAEG;IACI,kBAAkB,IAAI,GAAG,EAAE;IAIlC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkC1B;;OAEG;YACW,aAAa;IAgE3B;;OAEG;YACW,eAAe;IA6C7B;;OAEG;YACW,iBAAiB;IAiK/B;;OAEG;YACW,kBAAkB;IA6FhC;;OAEG;YACW,cAAc;IAyB5B;;OAEG;IACH,OAAO,CAAC,UAAU;IAWlB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAK1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH,OAAO,CAAC,SAAS;IAWjB;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;OAEG;IACI,UAAU,IAAI,oBAAoB,GAAG;QAAE,UAAU,EAAE,GAAG,CAAA;KAAE;IAO/D;;OAEG;IACI,YAAY,IAAI,IAAI;IAa3B;;OAEG;IACI,YAAY,IAAI,IAAI;IAa3B;;OAEG;IACI,eAAe,IAAI,IAAI;IAK9B;;OAEG;IACI,gBAAgB,IAAI,IAAI;CAIhC"}
|