@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.
Files changed (129) hide show
  1. package/README.md +50 -5
  2. package/dist/cjs/api/dashboardRoutes.d.ts +28 -0
  3. package/dist/cjs/api/dashboardRoutes.d.ts.map +1 -0
  4. package/dist/cjs/api/dashboardRoutes.js +239 -0
  5. package/dist/cjs/api/dashboardRoutes.js.map +1 -0
  6. package/dist/cjs/api/server.d.ts +51 -0
  7. package/dist/cjs/api/server.d.ts.map +1 -0
  8. package/dist/cjs/api/server.js +166 -0
  9. package/dist/cjs/api/server.js.map +1 -0
  10. package/dist/cjs/core/AgentRegistry.d.ts +4 -0
  11. package/dist/cjs/core/AgentRegistry.d.ts.map +1 -1
  12. package/dist/cjs/core/AgentRegistry.js +6 -0
  13. package/dist/cjs/core/AgentRegistry.js.map +1 -1
  14. package/dist/cjs/core/DashboardWebSocketServer.d.ts +70 -0
  15. package/dist/cjs/core/DashboardWebSocketServer.d.ts.map +1 -0
  16. package/dist/cjs/core/DashboardWebSocketServer.js +211 -0
  17. package/dist/cjs/core/DashboardWebSocketServer.js.map +1 -0
  18. package/dist/cjs/core/GhostAlchemist.d.ts +18 -0
  19. package/dist/cjs/core/GhostAlchemist.d.ts.map +1 -0
  20. package/dist/cjs/core/GhostAlchemist.js +55 -0
  21. package/dist/cjs/core/GhostAlchemist.js.map +1 -0
  22. package/dist/cjs/core/GhostListener.d.ts +20 -0
  23. package/dist/cjs/core/GhostListener.d.ts.map +1 -0
  24. package/dist/cjs/core/GhostListener.js +97 -0
  25. package/dist/cjs/core/GhostListener.js.map +1 -0
  26. package/dist/cjs/core/OrchestrationEngine.d.ts +22 -0
  27. package/dist/cjs/core/OrchestrationEngine.d.ts.map +1 -1
  28. package/dist/cjs/core/OrchestrationEngine.js +98 -0
  29. package/dist/cjs/core/OrchestrationEngine.js.map +1 -1
  30. package/dist/cjs/core/SubconsciousEngine.d.ts +24 -0
  31. package/dist/cjs/core/SubconsciousEngine.d.ts.map +1 -1
  32. package/dist/cjs/core/SubconsciousEngine.js +110 -0
  33. package/dist/cjs/core/SubconsciousEngine.js.map +1 -1
  34. package/dist/cjs/core/WebSocketServer.d.ts.map +1 -1
  35. package/dist/cjs/core/WebSocketServer.js +4 -0
  36. package/dist/cjs/core/WebSocketServer.js.map +1 -1
  37. package/dist/cjs/db/database.d.ts +60 -0
  38. package/dist/cjs/db/database.d.ts.map +1 -0
  39. package/dist/cjs/db/database.js +297 -0
  40. package/dist/cjs/db/database.js.map +1 -0
  41. package/dist/cjs/db/migrations/001-dashboard-schema.d.ts +18 -0
  42. package/dist/cjs/db/migrations/001-dashboard-schema.d.ts.map +1 -0
  43. package/dist/cjs/db/migrations/001-dashboard-schema.js +175 -0
  44. package/dist/cjs/db/migrations/001-dashboard-schema.js.map +1 -0
  45. package/dist/cjs/embed/index.d.ts +1 -1
  46. package/dist/cjs/embed/index.d.ts.map +1 -1
  47. package/dist/cjs/embed/index.js +17 -9
  48. package/dist/cjs/embed/index.js.map +1 -1
  49. package/dist/cjs/proxy/Gatekeeper.d.ts +43 -0
  50. package/dist/cjs/proxy/Gatekeeper.d.ts.map +1 -0
  51. package/dist/cjs/proxy/Gatekeeper.js +202 -0
  52. package/dist/cjs/proxy/Gatekeeper.js.map +1 -0
  53. package/dist/cjs/proxy/KeyManager.d.ts +56 -0
  54. package/dist/cjs/proxy/KeyManager.d.ts.map +1 -0
  55. package/dist/cjs/proxy/KeyManager.js +220 -0
  56. package/dist/cjs/proxy/KeyManager.js.map +1 -0
  57. package/dist/cjs/proxy/ProjectStore.d.ts +84 -0
  58. package/dist/cjs/proxy/ProjectStore.d.ts.map +1 -0
  59. package/dist/cjs/proxy/ProjectStore.js +214 -0
  60. package/dist/cjs/proxy/ProjectStore.js.map +1 -0
  61. package/dist/cjs/proxy/SseRelay.d.ts +41 -0
  62. package/dist/cjs/proxy/SseRelay.d.ts.map +1 -0
  63. package/dist/cjs/proxy/SseRelay.js +176 -0
  64. package/dist/cjs/proxy/SseRelay.js.map +1 -0
  65. package/dist/esm/api/dashboardRoutes.d.ts +28 -0
  66. package/dist/esm/api/dashboardRoutes.d.ts.map +1 -0
  67. package/dist/esm/api/dashboardRoutes.js +236 -0
  68. package/dist/esm/api/dashboardRoutes.js.map +1 -0
  69. package/dist/esm/api/server.d.ts +51 -0
  70. package/dist/esm/api/server.d.ts.map +1 -0
  71. package/dist/esm/api/server.js +159 -0
  72. package/dist/esm/api/server.js.map +1 -0
  73. package/dist/esm/core/AgentRegistry.d.ts +4 -0
  74. package/dist/esm/core/AgentRegistry.d.ts.map +1 -1
  75. package/dist/esm/core/AgentRegistry.js +6 -0
  76. package/dist/esm/core/AgentRegistry.js.map +1 -1
  77. package/dist/esm/core/DashboardWebSocketServer.d.ts +70 -0
  78. package/dist/esm/core/DashboardWebSocketServer.d.ts.map +1 -0
  79. package/dist/esm/core/DashboardWebSocketServer.js +207 -0
  80. package/dist/esm/core/DashboardWebSocketServer.js.map +1 -0
  81. package/dist/esm/core/GhostAlchemist.d.ts +18 -0
  82. package/dist/esm/core/GhostAlchemist.d.ts.map +1 -0
  83. package/dist/esm/core/GhostAlchemist.js +48 -0
  84. package/dist/esm/core/GhostAlchemist.js.map +1 -0
  85. package/dist/esm/core/GhostListener.d.ts +20 -0
  86. package/dist/esm/core/GhostListener.d.ts.map +1 -0
  87. package/dist/esm/core/GhostListener.js +93 -0
  88. package/dist/esm/core/GhostListener.js.map +1 -0
  89. package/dist/esm/core/OrchestrationEngine.d.ts +22 -0
  90. package/dist/esm/core/OrchestrationEngine.d.ts.map +1 -1
  91. package/dist/esm/core/OrchestrationEngine.js +98 -0
  92. package/dist/esm/core/OrchestrationEngine.js.map +1 -1
  93. package/dist/esm/core/SubconsciousEngine.d.ts +24 -0
  94. package/dist/esm/core/SubconsciousEngine.d.ts.map +1 -1
  95. package/dist/esm/core/SubconsciousEngine.js +110 -0
  96. package/dist/esm/core/SubconsciousEngine.js.map +1 -1
  97. package/dist/esm/core/WebSocketServer.d.ts.map +1 -1
  98. package/dist/esm/core/WebSocketServer.js +4 -0
  99. package/dist/esm/core/WebSocketServer.js.map +1 -1
  100. package/dist/esm/db/database.d.ts +60 -0
  101. package/dist/esm/db/database.d.ts.map +1 -0
  102. package/dist/esm/db/database.js +293 -0
  103. package/dist/esm/db/database.js.map +1 -0
  104. package/dist/esm/db/migrations/001-dashboard-schema.d.ts +18 -0
  105. package/dist/esm/db/migrations/001-dashboard-schema.d.ts.map +1 -0
  106. package/dist/esm/db/migrations/001-dashboard-schema.js +172 -0
  107. package/dist/esm/db/migrations/001-dashboard-schema.js.map +1 -0
  108. package/dist/esm/embed/index.d.ts +1 -1
  109. package/dist/esm/embed/index.d.ts.map +1 -1
  110. package/dist/esm/embed/index.js +17 -9
  111. package/dist/esm/embed/index.js.map +1 -1
  112. package/dist/esm/proxy/Gatekeeper.d.ts +43 -0
  113. package/dist/esm/proxy/Gatekeeper.d.ts.map +1 -0
  114. package/dist/esm/proxy/Gatekeeper.js +165 -0
  115. package/dist/esm/proxy/Gatekeeper.js.map +1 -0
  116. package/dist/esm/proxy/KeyManager.d.ts +56 -0
  117. package/dist/esm/proxy/KeyManager.d.ts.map +1 -0
  118. package/dist/esm/proxy/KeyManager.js +213 -0
  119. package/dist/esm/proxy/KeyManager.js.map +1 -0
  120. package/dist/esm/proxy/ProjectStore.d.ts +84 -0
  121. package/dist/esm/proxy/ProjectStore.d.ts.map +1 -0
  122. package/dist/esm/proxy/ProjectStore.js +207 -0
  123. package/dist/esm/proxy/ProjectStore.js.map +1 -0
  124. package/dist/esm/proxy/SseRelay.d.ts +41 -0
  125. package/dist/esm/proxy/SseRelay.d.ts.map +1 -0
  126. package/dist/esm/proxy/SseRelay.js +169 -0
  127. package/dist/esm/proxy/SseRelay.js.map +1 -0
  128. package/lemma-proxy.cjs +477 -0
  129. package/package.json +20 -4
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ /**
3
+ * Lemma SseRelay
4
+ *
5
+ * Handles Server-Sent Events (SSE) streaming in two modes:
6
+ *
7
+ * MISS mode: Pipes upstream SSE response from OpenAI/Anthropic to the client
8
+ * in real-time (transparent relay).
9
+ *
10
+ * HIT mode: Simulates an SSE stream from a cached response by chunking the
11
+ * text into ~5-word pieces and emitting them with a small delay.
12
+ * Visually identical to a real stream for IDEs like Cursor.
13
+ *
14
+ * Both modes:
15
+ * - Set correct SSE headers (text/event-stream, no-cache)
16
+ * - Inject X-Lemma-Cache, X-Lemma-Similarity, X-Lemma-Tier headers
17
+ * - Append the `data: [DONE]` sentinel
18
+ * - Support both OpenAI and Anthropic SSE envelope formats
19
+ */
20
+ var __importDefault = (this && this.__importDefault) || function (mod) {
21
+ return (mod && mod.__esModule) ? mod : { "default": mod };
22
+ };
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.SseRelay = void 0;
25
+ const http_1 = __importDefault(require("http"));
26
+ const https_1 = __importDefault(require("https"));
27
+ // ─── Constants ────────────────────────────────────────────────────────────────
28
+ const CHUNK_WORDS = 5; // words per simulated chunk
29
+ const CHUNK_DELAY_MS = 15; // ms between simulated chunks
30
+ // ─── SseRelay ─────────────────────────────────────────────────────────────────
31
+ class SseRelay {
32
+ /**
33
+ * Simulate an SSE stream from a cached response.
34
+ */
35
+ static async simulateHit(res, cachedResponse, opts) {
36
+ SseRelay.setSseHeaders(res, opts);
37
+ const text = SseRelay.extractTextFromResponse(cachedResponse, opts.provider);
38
+ const model = cachedResponse?.model || (opts.provider === 'openai' ? 'gpt-4' : 'claude-3-5-sonnet-20241022');
39
+ const id = `lemma-hit-${Date.now()}`;
40
+ const words = text.split(' ');
41
+ // Emit chunks
42
+ for (let i = 0; i < words.length; i += CHUNK_WORDS) {
43
+ const chunk = words.slice(i, i + CHUNK_WORDS).join(' ');
44
+ const sseData = SseRelay.buildChunkEvent(chunk, id, model, opts.provider, false);
45
+ res.write(`data: ${JSON.stringify(sseData)}\n\n`);
46
+ await sleep(CHUNK_DELAY_MS);
47
+ }
48
+ // Emit final chunk (finish_reason: stop)
49
+ const stopEvent = SseRelay.buildChunkEvent('', id, model, opts.provider, true);
50
+ res.write(`data: ${JSON.stringify(stopEvent)}\n\n`);
51
+ res.write('data: [DONE]\n\n');
52
+ res.end();
53
+ }
54
+ /**
55
+ * Relay a live upstream SSE stream transparently.
56
+ */
57
+ static async relayMiss(req, res, upstreamBody, provider, opts) {
58
+ SseRelay.setSseHeaders(res, opts);
59
+ const apiKey = provider === 'openai'
60
+ ? process.env.OPENAI_API_KEY
61
+ : process.env.ANTHROPIC_API_KEY;
62
+ if (!apiKey) {
63
+ res.write(`data: ${JSON.stringify({ error: `${provider.toUpperCase()}_API_KEY not set` })}\n\n`);
64
+ res.write('data: [DONE]\n\n');
65
+ res.end();
66
+ return;
67
+ }
68
+ const { hostname, path, headers } = SseRelay.buildUpstreamRequest(provider, apiKey);
69
+ const body = JSON.stringify({ ...upstreamBody, stream: true });
70
+ await new Promise((resolve, reject) => {
71
+ const lib = hostname.startsWith('localhost') ? http_1.default : https_1.default;
72
+ const reqOpts = {
73
+ hostname,
74
+ port: hostname.startsWith('localhost') ? 80 : 443,
75
+ path,
76
+ method: 'POST',
77
+ headers: {
78
+ ...headers,
79
+ 'Content-Type': 'application/json',
80
+ 'Content-Length': Buffer.byteLength(body),
81
+ },
82
+ };
83
+ const upstreamReq = lib.request(reqOpts, (upstreamRes) => {
84
+ upstreamRes.on('data', (chunk) => {
85
+ res.write(chunk);
86
+ });
87
+ upstreamRes.on('end', () => {
88
+ res.write('data: [DONE]\n\n');
89
+ res.end();
90
+ resolve();
91
+ });
92
+ upstreamRes.on('error', reject);
93
+ });
94
+ upstreamReq.on('error', (err) => {
95
+ res.write(`data: ${JSON.stringify({ error: err.message })}\n\n`);
96
+ res.write('data: [DONE]\n\n');
97
+ res.end();
98
+ resolve();
99
+ });
100
+ upstreamReq.write(body);
101
+ upstreamReq.end();
102
+ });
103
+ }
104
+ // ── Private helpers ─────────────────────────────────────────────────────────
105
+ static setSseHeaders(res, opts) {
106
+ res.setHeader('Content-Type', 'text/event-stream');
107
+ res.setHeader('Cache-Control', 'no-cache');
108
+ res.setHeader('Connection', 'keep-alive');
109
+ res.setHeader('X-Accel-Buffering', 'no');
110
+ res.setHeader('X-Lemma-Cache', 'HIT');
111
+ res.setHeader('X-Lemma-Similarity', (opts.similarity ?? 1.0).toFixed(3));
112
+ res.setHeader('X-Lemma-Tier', opts.tier);
113
+ if (opts.latencyMs !== undefined) {
114
+ res.setHeader('X-Lemma-Latency', `${opts.latencyMs}ms`);
115
+ }
116
+ }
117
+ static buildUpstreamRequest(provider, apiKey) {
118
+ if (provider === 'openai') {
119
+ return {
120
+ hostname: 'api.openai.com',
121
+ path: '/v1/chat/completions',
122
+ headers: { Authorization: `Bearer ${apiKey}` },
123
+ };
124
+ }
125
+ return {
126
+ hostname: 'api.anthropic.com',
127
+ path: '/v1/messages',
128
+ headers: { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01' },
129
+ };
130
+ }
131
+ static buildChunkEvent(text, id, model, provider, isStop) {
132
+ if (provider === 'openai') {
133
+ return {
134
+ id,
135
+ object: 'chat.completion.chunk',
136
+ created: Math.floor(Date.now() / 1000),
137
+ model,
138
+ choices: [{
139
+ index: 0,
140
+ delta: isStop ? {} : { content: text },
141
+ finish_reason: isStop ? 'stop' : null,
142
+ }],
143
+ };
144
+ }
145
+ // Anthropic format
146
+ if (isStop) {
147
+ return { type: 'message_stop' };
148
+ }
149
+ return {
150
+ type: 'content_block_delta',
151
+ index: 0,
152
+ delta: { type: 'text_delta', text },
153
+ };
154
+ }
155
+ static extractTextFromResponse(response, provider) {
156
+ try {
157
+ if (provider === 'openai') {
158
+ return response?.choices?.[0]?.message?.content || '';
159
+ }
160
+ // Anthropic
161
+ const content = response?.content;
162
+ if (Array.isArray(content)) {
163
+ return content.map((c) => c.text || '').join('');
164
+ }
165
+ return String(content || '');
166
+ }
167
+ catch {
168
+ return '';
169
+ }
170
+ }
171
+ }
172
+ exports.SseRelay = SseRelay;
173
+ function sleep(ms) {
174
+ return new Promise((resolve) => setTimeout(resolve, ms));
175
+ }
176
+ //# sourceMappingURL=SseRelay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SseRelay.js","sourceRoot":"","sources":["../../../src/proxy/SseRelay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Dashboard REST API Routes
3
+ * Provides real-time metrics and analytics endpoints for the Phase 2 dashboard
4
+ *
5
+ * Endpoints:
6
+ * GET /api/metrics - System-wide metrics
7
+ * GET /api/agents - Active agents with capabilities
8
+ * GET /api/events - Paginated event log
9
+ * GET /api/cache-stats - Cache statistics and top queries
10
+ * POST /api/cache/clear - Clear cache (admin)
11
+ * POST /api/debugger/pause - Pause all agents
12
+ * POST /api/debugger/resume - Resume agents
13
+ * POST /api/debugger/rewind - Rewind to event state
14
+ */
15
+ import { Router } from 'express';
16
+ import { OrchestrationEngine } from '../core/OrchestrationEngine';
17
+ import { AgentRegistry } from '../core/AgentRegistry';
18
+ import { SubconsciousEngine } from '../core/SubconsciousEngine';
19
+ interface DashboardAPIContext {
20
+ eventLog: any[];
21
+ orchestrationEngine: OrchestrationEngine;
22
+ agentRegistry: AgentRegistry;
23
+ eventSource: any;
24
+ cacheStore: SubconsciousEngine;
25
+ }
26
+ export declare function createDashboardRouter(context: DashboardAPIContext): Router;
27
+ export {};
28
+ //# sourceMappingURL=dashboardRoutes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboardRoutes.d.ts","sourceRoot":"","sources":["../../../src/api/dashboardRoutes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAKhE,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,GAAG,EAAE,CAAC;IAChB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,GAAG,CAAC;IACjB,UAAU,EAAE,kBAAkB,CAAC;CAChC;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CA8O1E"}
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Dashboard REST API Routes
3
+ * Provides real-time metrics and analytics endpoints for the Phase 2 dashboard
4
+ *
5
+ * Endpoints:
6
+ * GET /api/metrics - System-wide metrics
7
+ * GET /api/agents - Active agents with capabilities
8
+ * GET /api/events - Paginated event log
9
+ * GET /api/cache-stats - Cache statistics and top queries
10
+ * POST /api/cache/clear - Clear cache (admin)
11
+ * POST /api/debugger/pause - Pause all agents
12
+ * POST /api/debugger/resume - Resume agents
13
+ * POST /api/debugger/rewind - Rewind to event state
14
+ */
15
+ import { Router } from 'express';
16
+ import { createLogger } from '../utils/logger';
17
+ const logger = createLogger('DashboardAPI');
18
+ export function createDashboardRouter(context) {
19
+ const router = Router();
20
+ /**
21
+ * GET /api/metrics
22
+ * Returns current system metrics
23
+ */
24
+ router.get('/metrics', (req, res) => {
25
+ try {
26
+ const metrics = context.orchestrationEngine.getMetrics();
27
+ const connectedAgents = context.orchestrationEngine.getConnectedAgents?.() || [];
28
+ res.json({
29
+ timestamp: new Date().toISOString(),
30
+ totalRequests: metrics.totalRequests,
31
+ cacheHits: metrics.cacheHits,
32
+ cacheMisses: metrics.cacheMisses,
33
+ hitRate: metrics.totalRequests > 0
34
+ ? (metrics.cacheHits / metrics.totalRequests).toFixed(4)
35
+ : 0,
36
+ averageLatency: metrics.averageLatency,
37
+ tokensSaved: metrics.tokensSaved,
38
+ costSaved: metrics.costSaved,
39
+ costSavedCurrency: 'USD',
40
+ activeAgents: connectedAgents.length,
41
+ totalAgents: connectedAgents.length,
42
+ uptime: Math.floor(Date.now() / 1000),
43
+ });
44
+ }
45
+ catch (error) {
46
+ logger.error('Error fetching metrics:', error);
47
+ res.status(500).json({ error: 'Internal server error', details: error.message });
48
+ }
49
+ });
50
+ /**
51
+ * GET /api/agents
52
+ * Returns all agents with their capabilities and status
53
+ */
54
+ router.get('/agents', (req, res) => {
55
+ try {
56
+ // Get agents from orchestration engine (real-time connected agents)
57
+ const agents = context.orchestrationEngine.getConnectedAgents?.() || [];
58
+ const formattedAgents = agents.map((agent) => {
59
+ const tasksCompleted = agent.tasksCompleted || 0;
60
+ const cacheHits = agent.cacheHits || 0;
61
+ const cacheHitRate = tasksCompleted > 0 ? cacheHits / tasksCompleted : 0;
62
+ return {
63
+ id: agent.agentId || agent.id,
64
+ name: agent.name || `Agent-${(agent.agentId || agent.id).slice(0, 8)}`,
65
+ status: agent.status || 'unknown',
66
+ capabilities: (agent.capabilities || []).map((c) => typeof c === 'string' ? c : (c.name || String(c))),
67
+ tasksCompleted,
68
+ tasksFailed: agent.tasksFailed || 0,
69
+ cacheHits,
70
+ cacheHitRate,
71
+ lastSeen: new Date(agent.lastSeen || Date.now()).toISOString(),
72
+ connectedAt: new Date(agent.connectedAt || Date.now()).toISOString(),
73
+ };
74
+ });
75
+ res.json({ agents: formattedAgents });
76
+ }
77
+ catch (error) {
78
+ logger.error('Error fetching agents:', error);
79
+ res.status(500).json({ error: 'Internal server error', details: error.message });
80
+ }
81
+ });
82
+ /**
83
+ * GET /api/events
84
+ * Returns paginated event log
85
+ * Query params: page=1, limit=50
86
+ */
87
+ router.get('/events', (req, res) => {
88
+ try {
89
+ const page = Math.max(1, parseInt(req.query.page) || 1);
90
+ const limit = Math.min(100, parseInt(req.query.limit) || 50);
91
+ const type = req.query.type;
92
+ // Get all events from the event source, optionally filtered by type
93
+ let events = [...(context.eventSource?.getEventLog?.() || [])];
94
+ if (type) {
95
+ events = events.filter((e) => e.type === type);
96
+ }
97
+ // Reverse chronological order (newest first)
98
+ events = events.reverse();
99
+ // Pagination
100
+ const total = events.length;
101
+ const startIdx = (page - 1) * limit;
102
+ const endIdx = startIdx + limit;
103
+ const paginatedEvents = events.slice(startIdx, endIdx);
104
+ res.json({
105
+ events: paginatedEvents,
106
+ pagination: {
107
+ page,
108
+ limit,
109
+ total,
110
+ hasMore: endIdx < total,
111
+ },
112
+ });
113
+ }
114
+ catch (error) {
115
+ logger.error('Error fetching events:', error);
116
+ res.status(500).json({ error: 'Internal server error', details: error.message });
117
+ }
118
+ });
119
+ /**
120
+ * GET /api/cache-stats
121
+ * Returns cache statistics and top cached queries
122
+ */
123
+ router.get('/cache-stats', async (req, res) => {
124
+ try {
125
+ const topQueries = await context.cacheStore.getCacheEntries(10);
126
+ const totalCached = await context.cacheStore.getCacheCount();
127
+ // Latency percentiles
128
+ const allEvents = (context.eventSource && typeof context.eventSource.getEventLog === 'function') ? context.eventSource.getEventLog() : (context.eventLog || []);
129
+ const events = allEvents.filter((e) => e.latency);
130
+ const latencies = events.map((e) => e.latency).sort((a, b) => a - b);
131
+ const latencyPercentiles = {
132
+ p50: latencies[Math.floor(latencies.length * 0.5)] || 0,
133
+ p95: latencies[Math.floor(latencies.length * 0.95)] || 0,
134
+ p99: latencies[Math.floor(latencies.length * 0.99)] || 0,
135
+ };
136
+ res.json({
137
+ topQueries,
138
+ latencyPercentiles,
139
+ totalCached,
140
+ });
141
+ }
142
+ catch (error) {
143
+ logger.error('Error fetching cache stats:', error);
144
+ res.status(500).json({ error: 'Internal server error', details: error.message });
145
+ }
146
+ });
147
+ /**
148
+ * POST /api/cache/clear
149
+ * Clear all cache and reset metrics (admin only)
150
+ */
151
+ router.post('/cache/clear', (req, res) => {
152
+ try {
153
+ const clearedCount = context.cacheStore.clear?.() || 0;
154
+ context.orchestrationEngine.resetMetrics?.();
155
+ res.json({
156
+ success: true,
157
+ clearedEntries: clearedCount,
158
+ message: 'Cache cleared successfully',
159
+ });
160
+ }
161
+ catch (error) {
162
+ logger.error('Error clearing cache:', error);
163
+ res.status(500).json({ error: 'Internal server error', details: error.message });
164
+ }
165
+ });
166
+ /**
167
+ * POST /api/debugger/pause
168
+ * Pause all agent processing
169
+ */
170
+ router.post('/debugger/pause', (req, res) => {
171
+ try {
172
+ context.orchestrationEngine.pauseProcessing?.();
173
+ res.json({
174
+ paused: true,
175
+ timestamp: new Date().toISOString(),
176
+ activeRequests: context.eventLog.length,
177
+ });
178
+ }
179
+ catch (error) {
180
+ logger.error('Error pausing debugger:', error);
181
+ res.status(500).json({ error: 'Internal server error', details: error.message });
182
+ }
183
+ });
184
+ /**
185
+ * POST /api/debugger/resume
186
+ * Resume agent processing
187
+ */
188
+ router.post('/debugger/resume', (req, res) => {
189
+ try {
190
+ context.orchestrationEngine.resumeProcessing?.();
191
+ res.json({
192
+ resumed: true,
193
+ timestamp: new Date().toISOString(),
194
+ });
195
+ }
196
+ catch (error) {
197
+ logger.error('Error resuming debugger:', error);
198
+ res.status(500).json({ error: 'Internal server error', details: error.message });
199
+ }
200
+ });
201
+ /**
202
+ * POST /api/debugger/rewind
203
+ * Rewind to a specific event and restore state
204
+ * Body: { eventId: string }
205
+ */
206
+ router.post('/debugger/rewind', async (req, res) => {
207
+ try {
208
+ const { eventId } = req.body;
209
+ if (!eventId) {
210
+ return res.status(400).json({ error: 'Missing eventId' });
211
+ }
212
+ // Find event in log
213
+ const event = context.eventLog.find((e) => e.id === eventId);
214
+ if (!event) {
215
+ return res.status(404).json({ error: 'Event not found' });
216
+ }
217
+ // Get state snapshot at that event
218
+ const state = {
219
+ agents: context.agentRegistry.getAgents(),
220
+ metrics: context.orchestrationEngine.getMetrics(),
221
+ cache: await context.cacheStore.getCacheEntries(1000),
222
+ };
223
+ res.json({
224
+ success: true,
225
+ eventId,
226
+ state,
227
+ });
228
+ }
229
+ catch (error) {
230
+ logger.error('Error rewinding debugger:', error);
231
+ res.status(500).json({ error: 'Internal server error', details: error.message });
232
+ }
233
+ });
234
+ return router;
235
+ }
236
+ //# sourceMappingURL=dashboardRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboardRoutes.js","sourceRoot":"","sources":["../../../src/api/dashboardRoutes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Dashboard API Server
3
+ * Express server for dashboard metrics and analytics endpoints
4
+ * Runs on port 3001 by default
5
+ */
6
+ import { DashboardWebSocketServer } from '../core/DashboardWebSocketServer';
7
+ import { OrchestrationEngine } from '../core/OrchestrationEngine';
8
+ import { AgentRegistry } from '../core/AgentRegistry';
9
+ import { SubconsciousEngine } from '../core/SubconsciousEngine';
10
+ export interface ServerConfig {
11
+ port?: number;
12
+ host?: string;
13
+ }
14
+ export declare class DashboardAPIServer {
15
+ private app;
16
+ private port;
17
+ private host;
18
+ private httpServer;
19
+ private wsServer;
20
+ private orchestrationEngine;
21
+ private agentRegistry;
22
+ private eventLog;
23
+ private cacheStore;
24
+ private server;
25
+ constructor(config?: ServerConfig);
26
+ /**
27
+ * Setup Express middleware
28
+ */
29
+ private setupMiddleware;
30
+ /**
31
+ * Setup health check endpoint
32
+ */
33
+ private setupHealthCheck;
34
+ /**
35
+ * Register the orchestration components
36
+ */
37
+ setOrchestrationContext(orchestrationEngine: OrchestrationEngine, agentRegistry: AgentRegistry, cacheStore: SubconsciousEngine): void;
38
+ /**
39
+ * Start server
40
+ */
41
+ start(): Promise<void>;
42
+ /**
43
+ * Stop server
44
+ */
45
+ stop(): Promise<void>;
46
+ /**
47
+ * Get WebSocket server for emitting events
48
+ */
49
+ getWebSocketServer(): DashboardWebSocketServer;
50
+ }
51
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/api/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAKhE,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,mBAAmB,CAAoC;IAC/D,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,GAAE,YAAiB;IAWrC;;OAEG;IACH,OAAO,CAAC,eAAe;IA6BvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;OAEG;IACI,uBAAuB,CAC5B,mBAAmB,EAAE,mBAAmB,EACxC,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,kBAAkB,GAC7B,IAAI;IAqCP;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BnC;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBlC;;OAEG;IACI,kBAAkB,IAAI,wBAAwB;CAGtD"}