@agent-e/server 1.4.0 → 1.4.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/dist/AgentEServer-VDZJAOQ6.mjs +7 -0
- package/dist/{chunk-VNNX52KX.mjs → chunk-W7GXJB2K.mjs} +13 -2
- package/dist/chunk-W7GXJB2K.mjs.map +1 -0
- package/dist/index.js +13 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/package.json +2 -1
- package/dist/AgentEServer-IF7QK2SK.mjs +0 -7
- package/dist/chunk-VNNX52KX.mjs.map +0 -1
- /package/dist/{AgentEServer-IF7QK2SK.mjs.map → AgentEServer-VDZJAOQ6.mjs.map} +0 -0
|
@@ -16,10 +16,20 @@ function json(res, status, data) {
|
|
|
16
16
|
res.writeHead(status, { "Content-Type": "application/json" });
|
|
17
17
|
res.end(JSON.stringify(data));
|
|
18
18
|
}
|
|
19
|
+
var MAX_BODY_BYTES = 1048576;
|
|
19
20
|
function readBody(req) {
|
|
20
21
|
return new Promise((resolve, reject) => {
|
|
21
22
|
const chunks = [];
|
|
22
|
-
|
|
23
|
+
let totalBytes = 0;
|
|
24
|
+
req.on("data", (chunk) => {
|
|
25
|
+
totalBytes += chunk.length;
|
|
26
|
+
if (totalBytes > MAX_BODY_BYTES) {
|
|
27
|
+
req.destroy();
|
|
28
|
+
reject(new Error("Request body too large"));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
chunks.push(chunk);
|
|
32
|
+
});
|
|
23
33
|
req.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
|
|
24
34
|
req.on("error", reject);
|
|
25
35
|
});
|
|
@@ -195,6 +205,7 @@ function createRouteHandler(server) {
|
|
|
195
205
|
}
|
|
196
206
|
json(res, 404, { error: "Not found" });
|
|
197
207
|
} catch (err) {
|
|
208
|
+
console.error("[AgentE Server] Unhandled route error:", err);
|
|
198
209
|
json(res, 500, { error: "Internal server error" });
|
|
199
210
|
}
|
|
200
211
|
};
|
|
@@ -465,4 +476,4 @@ var AgentEServer = class {
|
|
|
465
476
|
export {
|
|
466
477
|
AgentEServer
|
|
467
478
|
};
|
|
468
|
-
//# sourceMappingURL=chunk-
|
|
479
|
+
//# sourceMappingURL=chunk-W7GXJB2K.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/AgentEServer.ts","../src/routes.ts","../src/websocket.ts"],"sourcesContent":["// AgentEServer — HTTP + WebSocket transport for AgentE\n\nimport * as http from 'node:http';\nimport {\n AgentE,\n validateEconomyState,\n type AgentEConfig,\n type EconomyAdapter,\n type EconomyState,\n type EconomicEvent,\n type Diagnosis,\n type AgentEMode,\n} from '@agent-e/core';\nimport { createRouteHandler } from './routes.js';\nimport { createWebSocketHandler } from './websocket.js';\n\nexport interface ServerConfig {\n port?: number;\n host?: string;\n agentEConfig?: Partial<Omit<AgentEConfig, 'adapter'>>;\n}\n\ninterface QueuedAdjustment {\n key: string;\n value: number;\n currency?: string;\n}\n\nexport class AgentEServer {\n private readonly agentE: AgentE;\n private readonly server: http.Server;\n private lastState: EconomyState | null = null;\n private adjustmentQueue: QueuedAdjustment[] = [];\n private alerts: Diagnosis[] = [];\n private readonly port: number;\n private readonly host: string;\n private readonly startedAt = Date.now();\n private cleanupWs: (() => void) | null = null;\n\n constructor(config: ServerConfig = {}) {\n this.port = config.port ?? 3000;\n this.host = config.host ?? '0.0.0.0';\n\n // Build a \"remote\" adapter — state comes from HTTP/WS, not polled\n const adapter: EconomyAdapter = {\n getState: () => {\n if (!this.lastState) {\n return {\n tick: 0,\n roles: [],\n resources: [],\n currencies: ['default'],\n agentBalances: {},\n agentRoles: {},\n agentInventories: {},\n marketPrices: {},\n recentTransactions: [],\n };\n }\n return this.lastState;\n },\n setParam: (key: string, value: number) => {\n this.adjustmentQueue.push({ key, value });\n },\n };\n\n const agentEConfig: AgentEConfig = {\n adapter,\n mode: config.agentEConfig?.mode ?? 'autonomous',\n gracePeriod: config.agentEConfig?.gracePeriod ?? 0,\n checkInterval: config.agentEConfig?.checkInterval ?? 1,\n ...(config.agentEConfig?.dominantRoles ? { dominantRoles: config.agentEConfig.dominantRoles } : {}),\n ...(config.agentEConfig?.idealDistribution ? { idealDistribution: config.agentEConfig.idealDistribution } : {}),\n ...(config.agentEConfig?.maxAdjustmentPercent !== undefined ? { maxAdjustmentPercent: config.agentEConfig.maxAdjustmentPercent } : {}),\n ...(config.agentEConfig?.cooldownTicks !== undefined ? { cooldownTicks: config.agentEConfig.cooldownTicks } : {}),\n ...(config.agentEConfig?.thresholds ? { thresholds: config.agentEConfig.thresholds } : {}),\n };\n\n this.agentE = new AgentE(agentEConfig);\n\n // Capture alerts during tick\n this.agentE.on('alert', (diagnosis: unknown) => {\n this.alerts.push(diagnosis as Diagnosis);\n });\n\n this.agentE.connect(adapter).start();\n\n // Create HTTP server\n const routeHandler = createRouteHandler(this);\n this.server = http.createServer(routeHandler);\n }\n\n async start(): Promise<void> {\n // Wire up WebSocket upgrade\n this.cleanupWs = createWebSocketHandler(this.server, this);\n\n return new Promise((resolve) => {\n this.server.listen(this.port, this.host, () => {\n resolve();\n });\n });\n }\n\n async stop(): Promise<void> {\n this.agentE.stop();\n if (this.cleanupWs) this.cleanupWs();\n return new Promise((resolve, reject) => {\n this.server.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n\n getAgentE(): AgentE {\n return this.agentE;\n }\n\n getAddress(): { port: number; host: string } {\n const addr = this.server.address();\n if (addr && typeof addr === 'object') {\n return { port: addr.port, host: addr.address };\n }\n return { port: this.port, host: this.host };\n }\n\n getUptime(): number {\n return Date.now() - this.startedAt;\n }\n\n /**\n * Process a tick with the given state.\n * 1. Clear adjustment queue\n * 2. Set state\n * 3. Ingest events\n * 4. Run agentE.tick(state)\n * 5. Drain adjustment queue\n * 6. Return response\n */\n async processTick(\n state: EconomyState,\n events?: EconomicEvent[],\n ): Promise<{\n adjustments: QueuedAdjustment[];\n alerts: Diagnosis[];\n health: number;\n decisions: ReturnType<AgentE['getDecisions']>;\n }> {\n // Clear queues\n this.adjustmentQueue = [];\n this.alerts = [];\n\n // Set state\n this.lastState = state;\n\n // Ingest events\n if (events) {\n for (const event of events) {\n this.agentE.ingest(event);\n }\n }\n\n // Run tick\n await this.agentE.tick(state);\n\n // Drain adjustments\n const adjustments = [...this.adjustmentQueue];\n this.adjustmentQueue = [];\n\n // Cross-reference with decision log\n const decisions = this.agentE.getDecisions({ since: state.tick, until: state.tick });\n\n return {\n adjustments,\n alerts: [...this.alerts],\n health: this.agentE.getHealth(),\n decisions,\n };\n }\n\n /**\n * Run Observer + Diagnoser without side effects (no execution)\n */\n diagnoseOnly(state: EconomyState): {\n diagnoses: ReturnType<AgentE['diagnoseNow']>;\n health: number;\n } {\n // Temporarily save and restore state\n const prevState = this.lastState;\n this.lastState = state;\n\n // Run diagnosis without ticking\n const diagnoser = this.agentE;\n const diagnoses = diagnoser.diagnoseNow();\n const health = diagnoser.getHealth();\n\n this.lastState = prevState;\n return { diagnoses, health };\n }\n\n setMode(mode: AgentEMode): void {\n this.agentE.setMode(mode);\n }\n\n lock(param: string): void {\n this.agentE.lock(param);\n }\n\n unlock(param: string): void {\n this.agentE.unlock(param);\n }\n\n constrain(param: string, bounds: { min: number; max: number }): void {\n this.agentE.constrain(param, bounds);\n }\n}\n","// HTTP routes for AgentE Server\n// Node http module with manual body parsing. CORS on all responses.\n\nimport type * as http from 'node:http';\nimport { validateEconomyState } from '@agent-e/core';\nimport type { AgentEServer } from './AgentEServer.js';\n\nfunction setCorsHeaders(res: http.ServerResponse): void {\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n}\n\nfunction json(res: http.ServerResponse, status: number, data: unknown): void {\n setCorsHeaders(res);\n res.writeHead(status, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(data));\n}\n\nconst MAX_BODY_BYTES = 1_048_576; // 1 MB\n\nfunction readBody(req: http.IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n let totalBytes = 0;\n req.on('data', (chunk: Buffer) => {\n totalBytes += chunk.length;\n if (totalBytes > MAX_BODY_BYTES) {\n req.destroy();\n reject(new Error('Request body too large'));\n return;\n }\n chunks.push(chunk);\n });\n req.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));\n req.on('error', reject);\n });\n}\n\nexport function createRouteHandler(\n server: AgentEServer,\n): (req: http.IncomingMessage, res: http.ServerResponse) => void {\n return async (req, res) => {\n const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);\n const path = url.pathname;\n const method = req.method?.toUpperCase() ?? 'GET';\n\n // CORS preflight\n if (method === 'OPTIONS') {\n setCorsHeaders(res);\n res.writeHead(204);\n res.end();\n return;\n }\n\n try {\n // POST /tick — validate state, run tick, return adjustments/alerts/health\n if (path === '/tick' && method === 'POST') {\n const body = await readBody(req);\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n json(res, 400, { error: 'Invalid JSON' });\n return;\n }\n\n if (!parsed || typeof parsed !== 'object') {\n json(res, 400, { error: 'Body must be a JSON object' });\n return;\n }\n\n const payload = parsed as Record<string, unknown>;\n const state = payload['state'] ?? parsed;\n const events = payload['events'];\n\n // Validate state\n const validation = validateEconomyState(state);\n if (!validation.valid) {\n json(res, 400, {\n error: 'Invalid state',\n validation,\n });\n return;\n }\n\n const result = await server.processTick(\n state as import('@agent-e/core').EconomyState,\n Array.isArray(events) ? events as import('@agent-e/core').EconomicEvent[] : undefined,\n );\n\n json(res, 200, {\n adjustments: result.adjustments,\n alerts: result.alerts.map(a => ({\n principle: a.principle.id,\n name: a.principle.name,\n severity: a.violation.severity,\n evidence: a.violation.evidence,\n suggestedAction: a.violation.suggestedAction,\n })),\n health: result.health,\n decisions: result.decisions.map(d => ({\n id: d.id,\n tick: d.tick,\n principle: d.diagnosis.principle.id,\n parameter: d.plan.parameter,\n result: d.result,\n reasoning: d.reasoning,\n })),\n });\n return;\n }\n\n // GET /health — health, tick, mode, activePlans, uptime\n if (path === '/health' && method === 'GET') {\n const agentE = server.getAgentE();\n json(res, 200, {\n health: agentE.getHealth(),\n tick: agentE.metrics.latest()?.tick ?? 0,\n mode: agentE.getMode(),\n activePlans: agentE.getActivePlans().length,\n uptime: server.getUptime(),\n });\n return;\n }\n\n // GET /decisions — decision log with optional ?limit and ?since\n if (path === '/decisions' && method === 'GET') {\n const limit = parseInt(url.searchParams.get('limit') ?? '50', 10);\n const since = url.searchParams.get('since');\n const agentE = server.getAgentE();\n\n let decisions;\n if (since) {\n decisions = agentE.getDecisions({ since: parseInt(since, 10) });\n } else {\n decisions = agentE.log.latest(limit);\n }\n\n json(res, 200, {\n decisions: decisions.map(d => ({\n id: d.id,\n tick: d.tick,\n timestamp: d.timestamp,\n principle: d.diagnosis.principle.id,\n principeName: d.diagnosis.principle.name,\n parameter: d.plan.parameter,\n currentValue: d.plan.currentValue,\n targetValue: d.plan.targetValue,\n result: d.result,\n reasoning: d.reasoning,\n })),\n });\n return;\n }\n\n // POST /config — lock/unlock/constrain/mode\n if (path === '/config' && method === 'POST') {\n const body = await readBody(req);\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n json(res, 400, { error: 'Invalid JSON' });\n return;\n }\n\n const config = parsed as Record<string, unknown>;\n\n if (config['action'] === 'lock' && typeof config['param'] === 'string') {\n server.lock(config['param']);\n json(res, 200, { ok: true, action: 'lock', param: config['param'] });\n } else if (config['action'] === 'unlock' && typeof config['param'] === 'string') {\n server.unlock(config['param']);\n json(res, 200, { ok: true, action: 'unlock', param: config['param'] });\n } else if (\n config['action'] === 'constrain' &&\n typeof config['param'] === 'string' &&\n typeof config['min'] === 'number' &&\n typeof config['max'] === 'number'\n ) {\n server.constrain(config['param'], { min: config['min'], max: config['max'] });\n json(res, 200, { ok: true, action: 'constrain', param: config['param'] });\n } else if (\n config['action'] === 'mode' &&\n (config['mode'] === 'autonomous' || config['mode'] === 'advisor')\n ) {\n server.setMode(config['mode']);\n json(res, 200, { ok: true, action: 'mode', mode: config['mode'] });\n } else {\n json(res, 400, {\n error: 'Invalid config action. Use: lock, unlock, constrain, or mode',\n });\n }\n return;\n }\n\n // GET /principles — list all principles\n if (path === '/principles' && method === 'GET') {\n const principles = server.getAgentE().getPrinciples();\n json(res, 200, {\n count: principles.length,\n principles: principles.map(p => ({\n id: p.id,\n name: p.name,\n category: p.category,\n description: p.description,\n })),\n });\n return;\n }\n\n // POST /diagnose — standalone Observer+Diagnoser (no side effects)\n if (path === '/diagnose' && method === 'POST') {\n const body = await readBody(req);\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n json(res, 400, { error: 'Invalid JSON' });\n return;\n }\n\n const payload = parsed as Record<string, unknown>;\n const state = payload['state'] ?? parsed;\n\n const validation = validateEconomyState(state);\n if (!validation.valid) {\n json(res, 400, { error: 'Invalid state', validation });\n return;\n }\n\n const result = server.diagnoseOnly(state as import('@agent-e/core').EconomyState);\n\n json(res, 200, {\n health: result.health,\n diagnoses: result.diagnoses.map(d => ({\n principle: d.principle.id,\n name: d.principle.name,\n severity: d.violation.severity,\n evidence: d.violation.evidence,\n suggestedAction: d.violation.suggestedAction,\n })),\n });\n return;\n }\n\n // 404\n json(res, 404, { error: 'Not found' });\n } catch (err) {\n console.error('[AgentE Server] Unhandled route error:', err);\n json(res, 500, { error: 'Internal server error' });\n }\n };\n}\n","// WebSocket handler for AgentE Server\n// Same port via HTTP upgrade. JSON messages with `type` field.\n\nimport type * as http from 'node:http';\nimport { WebSocketServer, WebSocket } from 'ws';\nimport { validateEconomyState, type EconomyState, type EconomicEvent } from '@agent-e/core';\nimport type { AgentEServer } from './AgentEServer.js';\n\ninterface IncomingMessage {\n type: string;\n [key: string]: unknown;\n}\n\nfunction send(ws: WebSocket, data: Record<string, unknown>): void {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify(data));\n }\n}\n\nexport function createWebSocketHandler(\n httpServer: http.Server,\n server: AgentEServer,\n): () => void {\n const wss = new WebSocketServer({ server: httpServer });\n\n // Heartbeat: ping every 30s\n const heartbeatInterval = setInterval(() => {\n for (const ws of wss.clients) {\n if (ws.readyState === WebSocket.OPEN) {\n ws.ping();\n }\n }\n }, 30_000);\n\n wss.on('connection', (ws) => {\n ws.on('message', async (raw) => {\n let msg: IncomingMessage;\n try {\n msg = JSON.parse(raw.toString()) as IncomingMessage;\n } catch {\n send(ws, { type: 'error', error: 'Invalid JSON' });\n return;\n }\n\n if (!msg.type || typeof msg.type !== 'string') {\n send(ws, { type: 'error', error: 'Missing \"type\" field' });\n return;\n }\n\n switch (msg.type) {\n case 'tick': {\n const state = msg['state'];\n const events = msg['events'];\n\n const validation = validateEconomyState(state);\n if (!validation.valid) {\n send(ws, { type: 'validation_error', validation });\n // Also send individual warnings\n for (const w of validation.warnings) {\n send(ws, { type: 'validation_warning', warning: w });\n }\n return;\n }\n\n // Forward warnings even if valid\n for (const w of validation.warnings) {\n send(ws, { type: 'validation_warning', warning: w });\n }\n\n try {\n const result = await server.processTick(\n state as EconomyState,\n Array.isArray(events) ? events as EconomicEvent[] : undefined,\n );\n\n send(ws, {\n type: 'tick_result',\n adjustments: result.adjustments,\n alerts: result.alerts.map(a => ({\n principle: a.principle.id,\n name: a.principle.name,\n severity: a.violation.severity,\n suggestedAction: a.violation.suggestedAction,\n })),\n health: result.health,\n decisions: result.decisions.map(d => ({\n id: d.id,\n tick: d.tick,\n principle: d.diagnosis.principle.id,\n parameter: d.plan.parameter,\n result: d.result,\n })),\n });\n } catch (err) {\n send(ws, { type: 'error', error: 'Tick processing failed' });\n }\n break;\n }\n\n case 'event': {\n const event = msg['event'] as EconomicEvent | undefined;\n if (event) {\n server.getAgentE().ingest(event);\n send(ws, { type: 'event_ack' });\n } else {\n send(ws, { type: 'error', error: 'Missing \"event\" field' });\n }\n break;\n }\n\n case 'health': {\n const agentE = server.getAgentE();\n send(ws, {\n type: 'health_result',\n health: agentE.getHealth(),\n tick: agentE.metrics.latest()?.tick ?? 0,\n mode: agentE.getMode(),\n activePlans: agentE.getActivePlans().length,\n uptime: server.getUptime(),\n });\n break;\n }\n\n case 'diagnose': {\n const state = msg['state'];\n const validation = validateEconomyState(state);\n if (!validation.valid) {\n send(ws, { type: 'validation_error', validation });\n return;\n }\n\n const result = server.diagnoseOnly(state as EconomyState);\n send(ws, {\n type: 'diagnose_result',\n health: result.health,\n diagnoses: result.diagnoses.map(d => ({\n principle: d.principle.id,\n name: d.principle.name,\n severity: d.violation.severity,\n suggestedAction: d.violation.suggestedAction,\n })),\n });\n break;\n }\n\n default:\n send(ws, { type: 'error', error: `Unknown message type: \"${msg.type}\"` });\n }\n });\n });\n\n // Return cleanup function\n return () => {\n clearInterval(heartbeatInterval);\n wss.close();\n };\n}\n"],"mappings":"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","names":["validateEconomyState"]}
|
package/dist/index.js
CHANGED
|
@@ -44,7 +44,16 @@ function json(res, status, data) {
|
|
|
44
44
|
function readBody(req) {
|
|
45
45
|
return new Promise((resolve, reject) => {
|
|
46
46
|
const chunks = [];
|
|
47
|
-
|
|
47
|
+
let totalBytes = 0;
|
|
48
|
+
req.on("data", (chunk) => {
|
|
49
|
+
totalBytes += chunk.length;
|
|
50
|
+
if (totalBytes > MAX_BODY_BYTES) {
|
|
51
|
+
req.destroy();
|
|
52
|
+
reject(new Error("Request body too large"));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
chunks.push(chunk);
|
|
56
|
+
});
|
|
48
57
|
req.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
|
|
49
58
|
req.on("error", reject);
|
|
50
59
|
});
|
|
@@ -220,15 +229,17 @@ function createRouteHandler(server) {
|
|
|
220
229
|
}
|
|
221
230
|
json(res, 404, { error: "Not found" });
|
|
222
231
|
} catch (err) {
|
|
232
|
+
console.error("[AgentE Server] Unhandled route error:", err);
|
|
223
233
|
json(res, 500, { error: "Internal server error" });
|
|
224
234
|
}
|
|
225
235
|
};
|
|
226
236
|
}
|
|
227
|
-
var import_core;
|
|
237
|
+
var import_core, MAX_BODY_BYTES;
|
|
228
238
|
var init_routes = __esm({
|
|
229
239
|
"src/routes.ts"() {
|
|
230
240
|
"use strict";
|
|
231
241
|
import_core = require("@agent-e/core");
|
|
242
|
+
MAX_BODY_BYTES = 1048576;
|
|
232
243
|
}
|
|
233
244
|
});
|
|
234
245
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/routes.ts","../src/websocket.ts","../src/AgentEServer.ts","../src/index.ts"],"sourcesContent":["// HTTP routes for AgentE Server\n// Node http module with manual body parsing. CORS on all responses.\n\nimport type * as http from 'node:http';\nimport { validateEconomyState } from '@agent-e/core';\nimport type { AgentEServer } from './AgentEServer.js';\n\nfunction setCorsHeaders(res: http.ServerResponse): void {\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n}\n\nfunction json(res: http.ServerResponse, status: number, data: unknown): void {\n setCorsHeaders(res);\n res.writeHead(status, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(data));\n}\n\nfunction readBody(req: http.IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on('data', (chunk: Buffer) => chunks.push(chunk));\n req.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));\n req.on('error', reject);\n });\n}\n\nexport function createRouteHandler(\n server: AgentEServer,\n): (req: http.IncomingMessage, res: http.ServerResponse) => void {\n return async (req, res) => {\n const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);\n const path = url.pathname;\n const method = req.method?.toUpperCase() ?? 'GET';\n\n // CORS preflight\n if (method === 'OPTIONS') {\n setCorsHeaders(res);\n res.writeHead(204);\n res.end();\n return;\n }\n\n try {\n // POST /tick — validate state, run tick, return adjustments/alerts/health\n if (path === '/tick' && method === 'POST') {\n const body = await readBody(req);\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n json(res, 400, { error: 'Invalid JSON' });\n return;\n }\n\n if (!parsed || typeof parsed !== 'object') {\n json(res, 400, { error: 'Body must be a JSON object' });\n return;\n }\n\n const payload = parsed as Record<string, unknown>;\n const state = payload['state'] ?? parsed;\n const events = payload['events'];\n\n // Validate state\n const validation = validateEconomyState(state);\n if (!validation.valid) {\n json(res, 400, {\n error: 'Invalid state',\n validation,\n });\n return;\n }\n\n const result = await server.processTick(\n state as import('@agent-e/core').EconomyState,\n Array.isArray(events) ? events as import('@agent-e/core').EconomicEvent[] : undefined,\n );\n\n json(res, 200, {\n adjustments: result.adjustments,\n alerts: result.alerts.map(a => ({\n principle: a.principle.id,\n name: a.principle.name,\n severity: a.violation.severity,\n evidence: a.violation.evidence,\n suggestedAction: a.violation.suggestedAction,\n })),\n health: result.health,\n decisions: result.decisions.map(d => ({\n id: d.id,\n tick: d.tick,\n principle: d.diagnosis.principle.id,\n parameter: d.plan.parameter,\n result: d.result,\n reasoning: d.reasoning,\n })),\n });\n return;\n }\n\n // GET /health — health, tick, mode, activePlans, uptime\n if (path === '/health' && method === 'GET') {\n const agentE = server.getAgentE();\n json(res, 200, {\n health: agentE.getHealth(),\n tick: agentE.metrics.latest()?.tick ?? 0,\n mode: agentE.getMode(),\n activePlans: agentE.getActivePlans().length,\n uptime: server.getUptime(),\n });\n return;\n }\n\n // GET /decisions — decision log with optional ?limit and ?since\n if (path === '/decisions' && method === 'GET') {\n const limit = parseInt(url.searchParams.get('limit') ?? '50', 10);\n const since = url.searchParams.get('since');\n const agentE = server.getAgentE();\n\n let decisions;\n if (since) {\n decisions = agentE.getDecisions({ since: parseInt(since, 10) });\n } else {\n decisions = agentE.log.latest(limit);\n }\n\n json(res, 200, {\n decisions: decisions.map(d => ({\n id: d.id,\n tick: d.tick,\n timestamp: d.timestamp,\n principle: d.diagnosis.principle.id,\n principeName: d.diagnosis.principle.name,\n parameter: d.plan.parameter,\n currentValue: d.plan.currentValue,\n targetValue: d.plan.targetValue,\n result: d.result,\n reasoning: d.reasoning,\n })),\n });\n return;\n }\n\n // POST /config — lock/unlock/constrain/mode\n if (path === '/config' && method === 'POST') {\n const body = await readBody(req);\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n json(res, 400, { error: 'Invalid JSON' });\n return;\n }\n\n const config = parsed as Record<string, unknown>;\n\n if (config['action'] === 'lock' && typeof config['param'] === 'string') {\n server.lock(config['param']);\n json(res, 200, { ok: true, action: 'lock', param: config['param'] });\n } else if (config['action'] === 'unlock' && typeof config['param'] === 'string') {\n server.unlock(config['param']);\n json(res, 200, { ok: true, action: 'unlock', param: config['param'] });\n } else if (\n config['action'] === 'constrain' &&\n typeof config['param'] === 'string' &&\n typeof config['min'] === 'number' &&\n typeof config['max'] === 'number'\n ) {\n server.constrain(config['param'], { min: config['min'], max: config['max'] });\n json(res, 200, { ok: true, action: 'constrain', param: config['param'] });\n } else if (\n config['action'] === 'mode' &&\n (config['mode'] === 'autonomous' || config['mode'] === 'advisor')\n ) {\n server.setMode(config['mode']);\n json(res, 200, { ok: true, action: 'mode', mode: config['mode'] });\n } else {\n json(res, 400, {\n error: 'Invalid config action. Use: lock, unlock, constrain, or mode',\n });\n }\n return;\n }\n\n // GET /principles — list all principles\n if (path === '/principles' && method === 'GET') {\n const principles = server.getAgentE().getPrinciples();\n json(res, 200, {\n count: principles.length,\n principles: principles.map(p => ({\n id: p.id,\n name: p.name,\n category: p.category,\n description: p.description,\n })),\n });\n return;\n }\n\n // POST /diagnose — standalone Observer+Diagnoser (no side effects)\n if (path === '/diagnose' && method === 'POST') {\n const body = await readBody(req);\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n json(res, 400, { error: 'Invalid JSON' });\n return;\n }\n\n const payload = parsed as Record<string, unknown>;\n const state = payload['state'] ?? parsed;\n\n const validation = validateEconomyState(state);\n if (!validation.valid) {\n json(res, 400, { error: 'Invalid state', validation });\n return;\n }\n\n const result = server.diagnoseOnly(state as import('@agent-e/core').EconomyState);\n\n json(res, 200, {\n health: result.health,\n diagnoses: result.diagnoses.map(d => ({\n principle: d.principle.id,\n name: d.principle.name,\n severity: d.violation.severity,\n evidence: d.violation.evidence,\n suggestedAction: d.violation.suggestedAction,\n })),\n });\n return;\n }\n\n // 404\n json(res, 404, { error: 'Not found' });\n } catch (err) {\n json(res, 500, { error: 'Internal server error' });\n }\n };\n}\n","// WebSocket handler for AgentE Server\n// Same port via HTTP upgrade. JSON messages with `type` field.\n\nimport type * as http from 'node:http';\nimport { WebSocketServer, WebSocket } from 'ws';\nimport { validateEconomyState, type EconomyState, type EconomicEvent } from '@agent-e/core';\nimport type { AgentEServer } from './AgentEServer.js';\n\ninterface IncomingMessage {\n type: string;\n [key: string]: unknown;\n}\n\nfunction send(ws: WebSocket, data: Record<string, unknown>): void {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify(data));\n }\n}\n\nexport function createWebSocketHandler(\n httpServer: http.Server,\n server: AgentEServer,\n): () => void {\n const wss = new WebSocketServer({ server: httpServer });\n\n // Heartbeat: ping every 30s\n const heartbeatInterval = setInterval(() => {\n for (const ws of wss.clients) {\n if (ws.readyState === WebSocket.OPEN) {\n ws.ping();\n }\n }\n }, 30_000);\n\n wss.on('connection', (ws) => {\n ws.on('message', async (raw) => {\n let msg: IncomingMessage;\n try {\n msg = JSON.parse(raw.toString()) as IncomingMessage;\n } catch {\n send(ws, { type: 'error', error: 'Invalid JSON' });\n return;\n }\n\n if (!msg.type || typeof msg.type !== 'string') {\n send(ws, { type: 'error', error: 'Missing \"type\" field' });\n return;\n }\n\n switch (msg.type) {\n case 'tick': {\n const state = msg['state'];\n const events = msg['events'];\n\n const validation = validateEconomyState(state);\n if (!validation.valid) {\n send(ws, { type: 'validation_error', validation });\n // Also send individual warnings\n for (const w of validation.warnings) {\n send(ws, { type: 'validation_warning', warning: w });\n }\n return;\n }\n\n // Forward warnings even if valid\n for (const w of validation.warnings) {\n send(ws, { type: 'validation_warning', warning: w });\n }\n\n try {\n const result = await server.processTick(\n state as EconomyState,\n Array.isArray(events) ? events as EconomicEvent[] : undefined,\n );\n\n send(ws, {\n type: 'tick_result',\n adjustments: result.adjustments,\n alerts: result.alerts.map(a => ({\n principle: a.principle.id,\n name: a.principle.name,\n severity: a.violation.severity,\n suggestedAction: a.violation.suggestedAction,\n })),\n health: result.health,\n decisions: result.decisions.map(d => ({\n id: d.id,\n tick: d.tick,\n principle: d.diagnosis.principle.id,\n parameter: d.plan.parameter,\n result: d.result,\n })),\n });\n } catch (err) {\n send(ws, { type: 'error', error: 'Tick processing failed' });\n }\n break;\n }\n\n case 'event': {\n const event = msg['event'] as EconomicEvent | undefined;\n if (event) {\n server.getAgentE().ingest(event);\n send(ws, { type: 'event_ack' });\n } else {\n send(ws, { type: 'error', error: 'Missing \"event\" field' });\n }\n break;\n }\n\n case 'health': {\n const agentE = server.getAgentE();\n send(ws, {\n type: 'health_result',\n health: agentE.getHealth(),\n tick: agentE.metrics.latest()?.tick ?? 0,\n mode: agentE.getMode(),\n activePlans: agentE.getActivePlans().length,\n uptime: server.getUptime(),\n });\n break;\n }\n\n case 'diagnose': {\n const state = msg['state'];\n const validation = validateEconomyState(state);\n if (!validation.valid) {\n send(ws, { type: 'validation_error', validation });\n return;\n }\n\n const result = server.diagnoseOnly(state as EconomyState);\n send(ws, {\n type: 'diagnose_result',\n health: result.health,\n diagnoses: result.diagnoses.map(d => ({\n principle: d.principle.id,\n name: d.principle.name,\n severity: d.violation.severity,\n suggestedAction: d.violation.suggestedAction,\n })),\n });\n break;\n }\n\n default:\n send(ws, { type: 'error', error: `Unknown message type: \"${msg.type}\"` });\n }\n });\n });\n\n // Return cleanup function\n return () => {\n clearInterval(heartbeatInterval);\n wss.close();\n };\n}\n","// AgentEServer — HTTP + WebSocket transport for AgentE\n\nimport * as http from 'node:http';\nimport {\n AgentE,\n validateEconomyState,\n type AgentEConfig,\n type EconomyAdapter,\n type EconomyState,\n type EconomicEvent,\n type Diagnosis,\n type AgentEMode,\n} from '@agent-e/core';\nimport { createRouteHandler } from './routes.js';\nimport { createWebSocketHandler } from './websocket.js';\n\nexport interface ServerConfig {\n port?: number;\n host?: string;\n agentEConfig?: Partial<Omit<AgentEConfig, 'adapter'>>;\n}\n\ninterface QueuedAdjustment {\n key: string;\n value: number;\n currency?: string;\n}\n\nexport class AgentEServer {\n private readonly agentE: AgentE;\n private readonly server: http.Server;\n private lastState: EconomyState | null = null;\n private adjustmentQueue: QueuedAdjustment[] = [];\n private alerts: Diagnosis[] = [];\n private readonly port: number;\n private readonly host: string;\n private readonly startedAt = Date.now();\n private cleanupWs: (() => void) | null = null;\n\n constructor(config: ServerConfig = {}) {\n this.port = config.port ?? 3000;\n this.host = config.host ?? '0.0.0.0';\n\n // Build a \"remote\" adapter — state comes from HTTP/WS, not polled\n const adapter: EconomyAdapter = {\n getState: () => {\n if (!this.lastState) {\n return {\n tick: 0,\n roles: [],\n resources: [],\n currencies: ['default'],\n agentBalances: {},\n agentRoles: {},\n agentInventories: {},\n marketPrices: {},\n recentTransactions: [],\n };\n }\n return this.lastState;\n },\n setParam: (key: string, value: number) => {\n this.adjustmentQueue.push({ key, value });\n },\n };\n\n const agentEConfig: AgentEConfig = {\n adapter,\n mode: config.agentEConfig?.mode ?? 'autonomous',\n gracePeriod: config.agentEConfig?.gracePeriod ?? 0,\n checkInterval: config.agentEConfig?.checkInterval ?? 1,\n ...(config.agentEConfig?.dominantRoles ? { dominantRoles: config.agentEConfig.dominantRoles } : {}),\n ...(config.agentEConfig?.idealDistribution ? { idealDistribution: config.agentEConfig.idealDistribution } : {}),\n ...(config.agentEConfig?.maxAdjustmentPercent !== undefined ? { maxAdjustmentPercent: config.agentEConfig.maxAdjustmentPercent } : {}),\n ...(config.agentEConfig?.cooldownTicks !== undefined ? { cooldownTicks: config.agentEConfig.cooldownTicks } : {}),\n ...(config.agentEConfig?.thresholds ? { thresholds: config.agentEConfig.thresholds } : {}),\n };\n\n this.agentE = new AgentE(agentEConfig);\n\n // Capture alerts during tick\n this.agentE.on('alert', (diagnosis: unknown) => {\n this.alerts.push(diagnosis as Diagnosis);\n });\n\n this.agentE.connect(adapter).start();\n\n // Create HTTP server\n const routeHandler = createRouteHandler(this);\n this.server = http.createServer(routeHandler);\n }\n\n async start(): Promise<void> {\n // Wire up WebSocket upgrade\n this.cleanupWs = createWebSocketHandler(this.server, this);\n\n return new Promise((resolve) => {\n this.server.listen(this.port, this.host, () => {\n resolve();\n });\n });\n }\n\n async stop(): Promise<void> {\n this.agentE.stop();\n if (this.cleanupWs) this.cleanupWs();\n return new Promise((resolve, reject) => {\n this.server.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n\n getAgentE(): AgentE {\n return this.agentE;\n }\n\n getAddress(): { port: number; host: string } {\n const addr = this.server.address();\n if (addr && typeof addr === 'object') {\n return { port: addr.port, host: addr.address };\n }\n return { port: this.port, host: this.host };\n }\n\n getUptime(): number {\n return Date.now() - this.startedAt;\n }\n\n /**\n * Process a tick with the given state.\n * 1. Clear adjustment queue\n * 2. Set state\n * 3. Ingest events\n * 4. Run agentE.tick(state)\n * 5. Drain adjustment queue\n * 6. Return response\n */\n async processTick(\n state: EconomyState,\n events?: EconomicEvent[],\n ): Promise<{\n adjustments: QueuedAdjustment[];\n alerts: Diagnosis[];\n health: number;\n decisions: ReturnType<AgentE['getDecisions']>;\n }> {\n // Clear queues\n this.adjustmentQueue = [];\n this.alerts = [];\n\n // Set state\n this.lastState = state;\n\n // Ingest events\n if (events) {\n for (const event of events) {\n this.agentE.ingest(event);\n }\n }\n\n // Run tick\n await this.agentE.tick(state);\n\n // Drain adjustments\n const adjustments = [...this.adjustmentQueue];\n this.adjustmentQueue = [];\n\n // Cross-reference with decision log\n const decisions = this.agentE.getDecisions({ since: state.tick, until: state.tick });\n\n return {\n adjustments,\n alerts: [...this.alerts],\n health: this.agentE.getHealth(),\n decisions,\n };\n }\n\n /**\n * Run Observer + Diagnoser without side effects (no execution)\n */\n diagnoseOnly(state: EconomyState): {\n diagnoses: ReturnType<AgentE['diagnoseNow']>;\n health: number;\n } {\n // Temporarily save and restore state\n const prevState = this.lastState;\n this.lastState = state;\n\n // Run diagnosis without ticking\n const diagnoser = this.agentE;\n const diagnoses = diagnoser.diagnoseNow();\n const health = diagnoser.getHealth();\n\n this.lastState = prevState;\n return { diagnoses, health };\n }\n\n setMode(mode: AgentEMode): void {\n this.agentE.setMode(mode);\n }\n\n lock(param: string): void {\n this.agentE.lock(param);\n }\n\n unlock(param: string): void {\n this.agentE.unlock(param);\n }\n\n constrain(param: string, bounds: { min: number; max: number }): void {\n this.agentE.constrain(param, bounds);\n }\n}\n","export { AgentEServer } from './AgentEServer.js';\nexport type { ServerConfig } from './AgentEServer.js';\n\n/**\n * Quick-start helper — creates and starts an AgentE server.\n *\n * @example\n * ```ts\n * import { startServer } from '@agent-e/server';\n * const server = await startServer({ port: 3000 });\n * // POST /tick, GET /health, etc.\n * ```\n */\nexport async function startServer(\n config?: import('./AgentEServer.js').ServerConfig,\n): Promise<import('./AgentEServer.js').AgentEServer> {\n const { AgentEServer } = await import('./AgentEServer.js');\n const server = new AgentEServer(config);\n await server.start();\n return server;\n}\n"],"mappings":"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","names":["import_core","import_core","AgentEServer"]}
|
|
1
|
+
{"version":3,"sources":["../src/routes.ts","../src/websocket.ts","../src/AgentEServer.ts","../src/index.ts"],"sourcesContent":["// HTTP routes for AgentE Server\n// Node http module with manual body parsing. CORS on all responses.\n\nimport type * as http from 'node:http';\nimport { validateEconomyState } from '@agent-e/core';\nimport type { AgentEServer } from './AgentEServer.js';\n\nfunction setCorsHeaders(res: http.ServerResponse): void {\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n}\n\nfunction json(res: http.ServerResponse, status: number, data: unknown): void {\n setCorsHeaders(res);\n res.writeHead(status, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(data));\n}\n\nconst MAX_BODY_BYTES = 1_048_576; // 1 MB\n\nfunction readBody(req: http.IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n let totalBytes = 0;\n req.on('data', (chunk: Buffer) => {\n totalBytes += chunk.length;\n if (totalBytes > MAX_BODY_BYTES) {\n req.destroy();\n reject(new Error('Request body too large'));\n return;\n }\n chunks.push(chunk);\n });\n req.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));\n req.on('error', reject);\n });\n}\n\nexport function createRouteHandler(\n server: AgentEServer,\n): (req: http.IncomingMessage, res: http.ServerResponse) => void {\n return async (req, res) => {\n const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);\n const path = url.pathname;\n const method = req.method?.toUpperCase() ?? 'GET';\n\n // CORS preflight\n if (method === 'OPTIONS') {\n setCorsHeaders(res);\n res.writeHead(204);\n res.end();\n return;\n }\n\n try {\n // POST /tick — validate state, run tick, return adjustments/alerts/health\n if (path === '/tick' && method === 'POST') {\n const body = await readBody(req);\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n json(res, 400, { error: 'Invalid JSON' });\n return;\n }\n\n if (!parsed || typeof parsed !== 'object') {\n json(res, 400, { error: 'Body must be a JSON object' });\n return;\n }\n\n const payload = parsed as Record<string, unknown>;\n const state = payload['state'] ?? parsed;\n const events = payload['events'];\n\n // Validate state\n const validation = validateEconomyState(state);\n if (!validation.valid) {\n json(res, 400, {\n error: 'Invalid state',\n validation,\n });\n return;\n }\n\n const result = await server.processTick(\n state as import('@agent-e/core').EconomyState,\n Array.isArray(events) ? events as import('@agent-e/core').EconomicEvent[] : undefined,\n );\n\n json(res, 200, {\n adjustments: result.adjustments,\n alerts: result.alerts.map(a => ({\n principle: a.principle.id,\n name: a.principle.name,\n severity: a.violation.severity,\n evidence: a.violation.evidence,\n suggestedAction: a.violation.suggestedAction,\n })),\n health: result.health,\n decisions: result.decisions.map(d => ({\n id: d.id,\n tick: d.tick,\n principle: d.diagnosis.principle.id,\n parameter: d.plan.parameter,\n result: d.result,\n reasoning: d.reasoning,\n })),\n });\n return;\n }\n\n // GET /health — health, tick, mode, activePlans, uptime\n if (path === '/health' && method === 'GET') {\n const agentE = server.getAgentE();\n json(res, 200, {\n health: agentE.getHealth(),\n tick: agentE.metrics.latest()?.tick ?? 0,\n mode: agentE.getMode(),\n activePlans: agentE.getActivePlans().length,\n uptime: server.getUptime(),\n });\n return;\n }\n\n // GET /decisions — decision log with optional ?limit and ?since\n if (path === '/decisions' && method === 'GET') {\n const limit = parseInt(url.searchParams.get('limit') ?? '50', 10);\n const since = url.searchParams.get('since');\n const agentE = server.getAgentE();\n\n let decisions;\n if (since) {\n decisions = agentE.getDecisions({ since: parseInt(since, 10) });\n } else {\n decisions = agentE.log.latest(limit);\n }\n\n json(res, 200, {\n decisions: decisions.map(d => ({\n id: d.id,\n tick: d.tick,\n timestamp: d.timestamp,\n principle: d.diagnosis.principle.id,\n principeName: d.diagnosis.principle.name,\n parameter: d.plan.parameter,\n currentValue: d.plan.currentValue,\n targetValue: d.plan.targetValue,\n result: d.result,\n reasoning: d.reasoning,\n })),\n });\n return;\n }\n\n // POST /config — lock/unlock/constrain/mode\n if (path === '/config' && method === 'POST') {\n const body = await readBody(req);\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n json(res, 400, { error: 'Invalid JSON' });\n return;\n }\n\n const config = parsed as Record<string, unknown>;\n\n if (config['action'] === 'lock' && typeof config['param'] === 'string') {\n server.lock(config['param']);\n json(res, 200, { ok: true, action: 'lock', param: config['param'] });\n } else if (config['action'] === 'unlock' && typeof config['param'] === 'string') {\n server.unlock(config['param']);\n json(res, 200, { ok: true, action: 'unlock', param: config['param'] });\n } else if (\n config['action'] === 'constrain' &&\n typeof config['param'] === 'string' &&\n typeof config['min'] === 'number' &&\n typeof config['max'] === 'number'\n ) {\n server.constrain(config['param'], { min: config['min'], max: config['max'] });\n json(res, 200, { ok: true, action: 'constrain', param: config['param'] });\n } else if (\n config['action'] === 'mode' &&\n (config['mode'] === 'autonomous' || config['mode'] === 'advisor')\n ) {\n server.setMode(config['mode']);\n json(res, 200, { ok: true, action: 'mode', mode: config['mode'] });\n } else {\n json(res, 400, {\n error: 'Invalid config action. Use: lock, unlock, constrain, or mode',\n });\n }\n return;\n }\n\n // GET /principles — list all principles\n if (path === '/principles' && method === 'GET') {\n const principles = server.getAgentE().getPrinciples();\n json(res, 200, {\n count: principles.length,\n principles: principles.map(p => ({\n id: p.id,\n name: p.name,\n category: p.category,\n description: p.description,\n })),\n });\n return;\n }\n\n // POST /diagnose — standalone Observer+Diagnoser (no side effects)\n if (path === '/diagnose' && method === 'POST') {\n const body = await readBody(req);\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n json(res, 400, { error: 'Invalid JSON' });\n return;\n }\n\n const payload = parsed as Record<string, unknown>;\n const state = payload['state'] ?? parsed;\n\n const validation = validateEconomyState(state);\n if (!validation.valid) {\n json(res, 400, { error: 'Invalid state', validation });\n return;\n }\n\n const result = server.diagnoseOnly(state as import('@agent-e/core').EconomyState);\n\n json(res, 200, {\n health: result.health,\n diagnoses: result.diagnoses.map(d => ({\n principle: d.principle.id,\n name: d.principle.name,\n severity: d.violation.severity,\n evidence: d.violation.evidence,\n suggestedAction: d.violation.suggestedAction,\n })),\n });\n return;\n }\n\n // 404\n json(res, 404, { error: 'Not found' });\n } catch (err) {\n console.error('[AgentE Server] Unhandled route error:', err);\n json(res, 500, { error: 'Internal server error' });\n }\n };\n}\n","// WebSocket handler for AgentE Server\n// Same port via HTTP upgrade. JSON messages with `type` field.\n\nimport type * as http from 'node:http';\nimport { WebSocketServer, WebSocket } from 'ws';\nimport { validateEconomyState, type EconomyState, type EconomicEvent } from '@agent-e/core';\nimport type { AgentEServer } from './AgentEServer.js';\n\ninterface IncomingMessage {\n type: string;\n [key: string]: unknown;\n}\n\nfunction send(ws: WebSocket, data: Record<string, unknown>): void {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify(data));\n }\n}\n\nexport function createWebSocketHandler(\n httpServer: http.Server,\n server: AgentEServer,\n): () => void {\n const wss = new WebSocketServer({ server: httpServer });\n\n // Heartbeat: ping every 30s\n const heartbeatInterval = setInterval(() => {\n for (const ws of wss.clients) {\n if (ws.readyState === WebSocket.OPEN) {\n ws.ping();\n }\n }\n }, 30_000);\n\n wss.on('connection', (ws) => {\n ws.on('message', async (raw) => {\n let msg: IncomingMessage;\n try {\n msg = JSON.parse(raw.toString()) as IncomingMessage;\n } catch {\n send(ws, { type: 'error', error: 'Invalid JSON' });\n return;\n }\n\n if (!msg.type || typeof msg.type !== 'string') {\n send(ws, { type: 'error', error: 'Missing \"type\" field' });\n return;\n }\n\n switch (msg.type) {\n case 'tick': {\n const state = msg['state'];\n const events = msg['events'];\n\n const validation = validateEconomyState(state);\n if (!validation.valid) {\n send(ws, { type: 'validation_error', validation });\n // Also send individual warnings\n for (const w of validation.warnings) {\n send(ws, { type: 'validation_warning', warning: w });\n }\n return;\n }\n\n // Forward warnings even if valid\n for (const w of validation.warnings) {\n send(ws, { type: 'validation_warning', warning: w });\n }\n\n try {\n const result = await server.processTick(\n state as EconomyState,\n Array.isArray(events) ? events as EconomicEvent[] : undefined,\n );\n\n send(ws, {\n type: 'tick_result',\n adjustments: result.adjustments,\n alerts: result.alerts.map(a => ({\n principle: a.principle.id,\n name: a.principle.name,\n severity: a.violation.severity,\n suggestedAction: a.violation.suggestedAction,\n })),\n health: result.health,\n decisions: result.decisions.map(d => ({\n id: d.id,\n tick: d.tick,\n principle: d.diagnosis.principle.id,\n parameter: d.plan.parameter,\n result: d.result,\n })),\n });\n } catch (err) {\n send(ws, { type: 'error', error: 'Tick processing failed' });\n }\n break;\n }\n\n case 'event': {\n const event = msg['event'] as EconomicEvent | undefined;\n if (event) {\n server.getAgentE().ingest(event);\n send(ws, { type: 'event_ack' });\n } else {\n send(ws, { type: 'error', error: 'Missing \"event\" field' });\n }\n break;\n }\n\n case 'health': {\n const agentE = server.getAgentE();\n send(ws, {\n type: 'health_result',\n health: agentE.getHealth(),\n tick: agentE.metrics.latest()?.tick ?? 0,\n mode: agentE.getMode(),\n activePlans: agentE.getActivePlans().length,\n uptime: server.getUptime(),\n });\n break;\n }\n\n case 'diagnose': {\n const state = msg['state'];\n const validation = validateEconomyState(state);\n if (!validation.valid) {\n send(ws, { type: 'validation_error', validation });\n return;\n }\n\n const result = server.diagnoseOnly(state as EconomyState);\n send(ws, {\n type: 'diagnose_result',\n health: result.health,\n diagnoses: result.diagnoses.map(d => ({\n principle: d.principle.id,\n name: d.principle.name,\n severity: d.violation.severity,\n suggestedAction: d.violation.suggestedAction,\n })),\n });\n break;\n }\n\n default:\n send(ws, { type: 'error', error: `Unknown message type: \"${msg.type}\"` });\n }\n });\n });\n\n // Return cleanup function\n return () => {\n clearInterval(heartbeatInterval);\n wss.close();\n };\n}\n","// AgentEServer — HTTP + WebSocket transport for AgentE\n\nimport * as http from 'node:http';\nimport {\n AgentE,\n validateEconomyState,\n type AgentEConfig,\n type EconomyAdapter,\n type EconomyState,\n type EconomicEvent,\n type Diagnosis,\n type AgentEMode,\n} from '@agent-e/core';\nimport { createRouteHandler } from './routes.js';\nimport { createWebSocketHandler } from './websocket.js';\n\nexport interface ServerConfig {\n port?: number;\n host?: string;\n agentEConfig?: Partial<Omit<AgentEConfig, 'adapter'>>;\n}\n\ninterface QueuedAdjustment {\n key: string;\n value: number;\n currency?: string;\n}\n\nexport class AgentEServer {\n private readonly agentE: AgentE;\n private readonly server: http.Server;\n private lastState: EconomyState | null = null;\n private adjustmentQueue: QueuedAdjustment[] = [];\n private alerts: Diagnosis[] = [];\n private readonly port: number;\n private readonly host: string;\n private readonly startedAt = Date.now();\n private cleanupWs: (() => void) | null = null;\n\n constructor(config: ServerConfig = {}) {\n this.port = config.port ?? 3000;\n this.host = config.host ?? '0.0.0.0';\n\n // Build a \"remote\" adapter — state comes from HTTP/WS, not polled\n const adapter: EconomyAdapter = {\n getState: () => {\n if (!this.lastState) {\n return {\n tick: 0,\n roles: [],\n resources: [],\n currencies: ['default'],\n agentBalances: {},\n agentRoles: {},\n agentInventories: {},\n marketPrices: {},\n recentTransactions: [],\n };\n }\n return this.lastState;\n },\n setParam: (key: string, value: number) => {\n this.adjustmentQueue.push({ key, value });\n },\n };\n\n const agentEConfig: AgentEConfig = {\n adapter,\n mode: config.agentEConfig?.mode ?? 'autonomous',\n gracePeriod: config.agentEConfig?.gracePeriod ?? 0,\n checkInterval: config.agentEConfig?.checkInterval ?? 1,\n ...(config.agentEConfig?.dominantRoles ? { dominantRoles: config.agentEConfig.dominantRoles } : {}),\n ...(config.agentEConfig?.idealDistribution ? { idealDistribution: config.agentEConfig.idealDistribution } : {}),\n ...(config.agentEConfig?.maxAdjustmentPercent !== undefined ? { maxAdjustmentPercent: config.agentEConfig.maxAdjustmentPercent } : {}),\n ...(config.agentEConfig?.cooldownTicks !== undefined ? { cooldownTicks: config.agentEConfig.cooldownTicks } : {}),\n ...(config.agentEConfig?.thresholds ? { thresholds: config.agentEConfig.thresholds } : {}),\n };\n\n this.agentE = new AgentE(agentEConfig);\n\n // Capture alerts during tick\n this.agentE.on('alert', (diagnosis: unknown) => {\n this.alerts.push(diagnosis as Diagnosis);\n });\n\n this.agentE.connect(adapter).start();\n\n // Create HTTP server\n const routeHandler = createRouteHandler(this);\n this.server = http.createServer(routeHandler);\n }\n\n async start(): Promise<void> {\n // Wire up WebSocket upgrade\n this.cleanupWs = createWebSocketHandler(this.server, this);\n\n return new Promise((resolve) => {\n this.server.listen(this.port, this.host, () => {\n resolve();\n });\n });\n }\n\n async stop(): Promise<void> {\n this.agentE.stop();\n if (this.cleanupWs) this.cleanupWs();\n return new Promise((resolve, reject) => {\n this.server.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n\n getAgentE(): AgentE {\n return this.agentE;\n }\n\n getAddress(): { port: number; host: string } {\n const addr = this.server.address();\n if (addr && typeof addr === 'object') {\n return { port: addr.port, host: addr.address };\n }\n return { port: this.port, host: this.host };\n }\n\n getUptime(): number {\n return Date.now() - this.startedAt;\n }\n\n /**\n * Process a tick with the given state.\n * 1. Clear adjustment queue\n * 2. Set state\n * 3. Ingest events\n * 4. Run agentE.tick(state)\n * 5. Drain adjustment queue\n * 6. Return response\n */\n async processTick(\n state: EconomyState,\n events?: EconomicEvent[],\n ): Promise<{\n adjustments: QueuedAdjustment[];\n alerts: Diagnosis[];\n health: number;\n decisions: ReturnType<AgentE['getDecisions']>;\n }> {\n // Clear queues\n this.adjustmentQueue = [];\n this.alerts = [];\n\n // Set state\n this.lastState = state;\n\n // Ingest events\n if (events) {\n for (const event of events) {\n this.agentE.ingest(event);\n }\n }\n\n // Run tick\n await this.agentE.tick(state);\n\n // Drain adjustments\n const adjustments = [...this.adjustmentQueue];\n this.adjustmentQueue = [];\n\n // Cross-reference with decision log\n const decisions = this.agentE.getDecisions({ since: state.tick, until: state.tick });\n\n return {\n adjustments,\n alerts: [...this.alerts],\n health: this.agentE.getHealth(),\n decisions,\n };\n }\n\n /**\n * Run Observer + Diagnoser without side effects (no execution)\n */\n diagnoseOnly(state: EconomyState): {\n diagnoses: ReturnType<AgentE['diagnoseNow']>;\n health: number;\n } {\n // Temporarily save and restore state\n const prevState = this.lastState;\n this.lastState = state;\n\n // Run diagnosis without ticking\n const diagnoser = this.agentE;\n const diagnoses = diagnoser.diagnoseNow();\n const health = diagnoser.getHealth();\n\n this.lastState = prevState;\n return { diagnoses, health };\n }\n\n setMode(mode: AgentEMode): void {\n this.agentE.setMode(mode);\n }\n\n lock(param: string): void {\n this.agentE.lock(param);\n }\n\n unlock(param: string): void {\n this.agentE.unlock(param);\n }\n\n constrain(param: string, bounds: { min: number; max: number }): void {\n this.agentE.constrain(param, bounds);\n }\n}\n","export { AgentEServer } from './AgentEServer.js';\nexport type { ServerConfig } from './AgentEServer.js';\n\n/**\n * Quick-start helper — creates and starts an AgentE server.\n *\n * @example\n * ```ts\n * import { startServer } from '@agent-e/server';\n * const server = await startServer({ port: 3000 });\n * // POST /tick, GET /health, etc.\n * ```\n */\nexport async function startServer(\n config?: import('./AgentEServer.js').ServerConfig,\n): Promise<import('./AgentEServer.js').AgentEServer> {\n const { AgentEServer } = await import('./AgentEServer.js');\n const server = new AgentEServer(config);\n await server.start();\n return server;\n}\n"],"mappings":"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","names":["import_core","import_core","AgentEServer"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AgentEServer
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-W7GXJB2K.mjs";
|
|
4
4
|
|
|
5
5
|
// src/index.ts
|
|
6
6
|
async function startServer(config) {
|
|
7
|
-
const { AgentEServer: AgentEServer2 } = await import("./AgentEServer-
|
|
7
|
+
const { AgentEServer: AgentEServer2 } = await import("./AgentEServer-VDZJAOQ6.mjs");
|
|
8
8
|
const server = new AgentEServer2(config);
|
|
9
9
|
await server.start();
|
|
10
10
|
return server;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-e/server",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"description": "Plug-and-play HTTP + WebSocket server for AgentE",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"ws": "^8.18.0"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
|
+
"@types/node": "^20.0.0",
|
|
25
26
|
"@types/ws": "^8.5.0",
|
|
26
27
|
"tsup": "*",
|
|
27
28
|
"typescript": "*"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/AgentEServer.ts","../src/routes.ts","../src/websocket.ts"],"sourcesContent":["// AgentEServer — HTTP + WebSocket transport for AgentE\n\nimport * as http from 'node:http';\nimport {\n AgentE,\n validateEconomyState,\n type AgentEConfig,\n type EconomyAdapter,\n type EconomyState,\n type EconomicEvent,\n type Diagnosis,\n type AgentEMode,\n} from '@agent-e/core';\nimport { createRouteHandler } from './routes.js';\nimport { createWebSocketHandler } from './websocket.js';\n\nexport interface ServerConfig {\n port?: number;\n host?: string;\n agentEConfig?: Partial<Omit<AgentEConfig, 'adapter'>>;\n}\n\ninterface QueuedAdjustment {\n key: string;\n value: number;\n currency?: string;\n}\n\nexport class AgentEServer {\n private readonly agentE: AgentE;\n private readonly server: http.Server;\n private lastState: EconomyState | null = null;\n private adjustmentQueue: QueuedAdjustment[] = [];\n private alerts: Diagnosis[] = [];\n private readonly port: number;\n private readonly host: string;\n private readonly startedAt = Date.now();\n private cleanupWs: (() => void) | null = null;\n\n constructor(config: ServerConfig = {}) {\n this.port = config.port ?? 3000;\n this.host = config.host ?? '0.0.0.0';\n\n // Build a \"remote\" adapter — state comes from HTTP/WS, not polled\n const adapter: EconomyAdapter = {\n getState: () => {\n if (!this.lastState) {\n return {\n tick: 0,\n roles: [],\n resources: [],\n currencies: ['default'],\n agentBalances: {},\n agentRoles: {},\n agentInventories: {},\n marketPrices: {},\n recentTransactions: [],\n };\n }\n return this.lastState;\n },\n setParam: (key: string, value: number) => {\n this.adjustmentQueue.push({ key, value });\n },\n };\n\n const agentEConfig: AgentEConfig = {\n adapter,\n mode: config.agentEConfig?.mode ?? 'autonomous',\n gracePeriod: config.agentEConfig?.gracePeriod ?? 0,\n checkInterval: config.agentEConfig?.checkInterval ?? 1,\n ...(config.agentEConfig?.dominantRoles ? { dominantRoles: config.agentEConfig.dominantRoles } : {}),\n ...(config.agentEConfig?.idealDistribution ? { idealDistribution: config.agentEConfig.idealDistribution } : {}),\n ...(config.agentEConfig?.maxAdjustmentPercent !== undefined ? { maxAdjustmentPercent: config.agentEConfig.maxAdjustmentPercent } : {}),\n ...(config.agentEConfig?.cooldownTicks !== undefined ? { cooldownTicks: config.agentEConfig.cooldownTicks } : {}),\n ...(config.agentEConfig?.thresholds ? { thresholds: config.agentEConfig.thresholds } : {}),\n };\n\n this.agentE = new AgentE(agentEConfig);\n\n // Capture alerts during tick\n this.agentE.on('alert', (diagnosis: unknown) => {\n this.alerts.push(diagnosis as Diagnosis);\n });\n\n this.agentE.connect(adapter).start();\n\n // Create HTTP server\n const routeHandler = createRouteHandler(this);\n this.server = http.createServer(routeHandler);\n }\n\n async start(): Promise<void> {\n // Wire up WebSocket upgrade\n this.cleanupWs = createWebSocketHandler(this.server, this);\n\n return new Promise((resolve) => {\n this.server.listen(this.port, this.host, () => {\n resolve();\n });\n });\n }\n\n async stop(): Promise<void> {\n this.agentE.stop();\n if (this.cleanupWs) this.cleanupWs();\n return new Promise((resolve, reject) => {\n this.server.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n\n getAgentE(): AgentE {\n return this.agentE;\n }\n\n getAddress(): { port: number; host: string } {\n const addr = this.server.address();\n if (addr && typeof addr === 'object') {\n return { port: addr.port, host: addr.address };\n }\n return { port: this.port, host: this.host };\n }\n\n getUptime(): number {\n return Date.now() - this.startedAt;\n }\n\n /**\n * Process a tick with the given state.\n * 1. Clear adjustment queue\n * 2. Set state\n * 3. Ingest events\n * 4. Run agentE.tick(state)\n * 5. Drain adjustment queue\n * 6. Return response\n */\n async processTick(\n state: EconomyState,\n events?: EconomicEvent[],\n ): Promise<{\n adjustments: QueuedAdjustment[];\n alerts: Diagnosis[];\n health: number;\n decisions: ReturnType<AgentE['getDecisions']>;\n }> {\n // Clear queues\n this.adjustmentQueue = [];\n this.alerts = [];\n\n // Set state\n this.lastState = state;\n\n // Ingest events\n if (events) {\n for (const event of events) {\n this.agentE.ingest(event);\n }\n }\n\n // Run tick\n await this.agentE.tick(state);\n\n // Drain adjustments\n const adjustments = [...this.adjustmentQueue];\n this.adjustmentQueue = [];\n\n // Cross-reference with decision log\n const decisions = this.agentE.getDecisions({ since: state.tick, until: state.tick });\n\n return {\n adjustments,\n alerts: [...this.alerts],\n health: this.agentE.getHealth(),\n decisions,\n };\n }\n\n /**\n * Run Observer + Diagnoser without side effects (no execution)\n */\n diagnoseOnly(state: EconomyState): {\n diagnoses: ReturnType<AgentE['diagnoseNow']>;\n health: number;\n } {\n // Temporarily save and restore state\n const prevState = this.lastState;\n this.lastState = state;\n\n // Run diagnosis without ticking\n const diagnoser = this.agentE;\n const diagnoses = diagnoser.diagnoseNow();\n const health = diagnoser.getHealth();\n\n this.lastState = prevState;\n return { diagnoses, health };\n }\n\n setMode(mode: AgentEMode): void {\n this.agentE.setMode(mode);\n }\n\n lock(param: string): void {\n this.agentE.lock(param);\n }\n\n unlock(param: string): void {\n this.agentE.unlock(param);\n }\n\n constrain(param: string, bounds: { min: number; max: number }): void {\n this.agentE.constrain(param, bounds);\n }\n}\n","// HTTP routes for AgentE Server\n// Node http module with manual body parsing. CORS on all responses.\n\nimport type * as http from 'node:http';\nimport { validateEconomyState } from '@agent-e/core';\nimport type { AgentEServer } from './AgentEServer.js';\n\nfunction setCorsHeaders(res: http.ServerResponse): void {\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n}\n\nfunction json(res: http.ServerResponse, status: number, data: unknown): void {\n setCorsHeaders(res);\n res.writeHead(status, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(data));\n}\n\nfunction readBody(req: http.IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on('data', (chunk: Buffer) => chunks.push(chunk));\n req.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));\n req.on('error', reject);\n });\n}\n\nexport function createRouteHandler(\n server: AgentEServer,\n): (req: http.IncomingMessage, res: http.ServerResponse) => void {\n return async (req, res) => {\n const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);\n const path = url.pathname;\n const method = req.method?.toUpperCase() ?? 'GET';\n\n // CORS preflight\n if (method === 'OPTIONS') {\n setCorsHeaders(res);\n res.writeHead(204);\n res.end();\n return;\n }\n\n try {\n // POST /tick — validate state, run tick, return adjustments/alerts/health\n if (path === '/tick' && method === 'POST') {\n const body = await readBody(req);\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n json(res, 400, { error: 'Invalid JSON' });\n return;\n }\n\n if (!parsed || typeof parsed !== 'object') {\n json(res, 400, { error: 'Body must be a JSON object' });\n return;\n }\n\n const payload = parsed as Record<string, unknown>;\n const state = payload['state'] ?? parsed;\n const events = payload['events'];\n\n // Validate state\n const validation = validateEconomyState(state);\n if (!validation.valid) {\n json(res, 400, {\n error: 'Invalid state',\n validation,\n });\n return;\n }\n\n const result = await server.processTick(\n state as import('@agent-e/core').EconomyState,\n Array.isArray(events) ? events as import('@agent-e/core').EconomicEvent[] : undefined,\n );\n\n json(res, 200, {\n adjustments: result.adjustments,\n alerts: result.alerts.map(a => ({\n principle: a.principle.id,\n name: a.principle.name,\n severity: a.violation.severity,\n evidence: a.violation.evidence,\n suggestedAction: a.violation.suggestedAction,\n })),\n health: result.health,\n decisions: result.decisions.map(d => ({\n id: d.id,\n tick: d.tick,\n principle: d.diagnosis.principle.id,\n parameter: d.plan.parameter,\n result: d.result,\n reasoning: d.reasoning,\n })),\n });\n return;\n }\n\n // GET /health — health, tick, mode, activePlans, uptime\n if (path === '/health' && method === 'GET') {\n const agentE = server.getAgentE();\n json(res, 200, {\n health: agentE.getHealth(),\n tick: agentE.metrics.latest()?.tick ?? 0,\n mode: agentE.getMode(),\n activePlans: agentE.getActivePlans().length,\n uptime: server.getUptime(),\n });\n return;\n }\n\n // GET /decisions — decision log with optional ?limit and ?since\n if (path === '/decisions' && method === 'GET') {\n const limit = parseInt(url.searchParams.get('limit') ?? '50', 10);\n const since = url.searchParams.get('since');\n const agentE = server.getAgentE();\n\n let decisions;\n if (since) {\n decisions = agentE.getDecisions({ since: parseInt(since, 10) });\n } else {\n decisions = agentE.log.latest(limit);\n }\n\n json(res, 200, {\n decisions: decisions.map(d => ({\n id: d.id,\n tick: d.tick,\n timestamp: d.timestamp,\n principle: d.diagnosis.principle.id,\n principeName: d.diagnosis.principle.name,\n parameter: d.plan.parameter,\n currentValue: d.plan.currentValue,\n targetValue: d.plan.targetValue,\n result: d.result,\n reasoning: d.reasoning,\n })),\n });\n return;\n }\n\n // POST /config — lock/unlock/constrain/mode\n if (path === '/config' && method === 'POST') {\n const body = await readBody(req);\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n json(res, 400, { error: 'Invalid JSON' });\n return;\n }\n\n const config = parsed as Record<string, unknown>;\n\n if (config['action'] === 'lock' && typeof config['param'] === 'string') {\n server.lock(config['param']);\n json(res, 200, { ok: true, action: 'lock', param: config['param'] });\n } else if (config['action'] === 'unlock' && typeof config['param'] === 'string') {\n server.unlock(config['param']);\n json(res, 200, { ok: true, action: 'unlock', param: config['param'] });\n } else if (\n config['action'] === 'constrain' &&\n typeof config['param'] === 'string' &&\n typeof config['min'] === 'number' &&\n typeof config['max'] === 'number'\n ) {\n server.constrain(config['param'], { min: config['min'], max: config['max'] });\n json(res, 200, { ok: true, action: 'constrain', param: config['param'] });\n } else if (\n config['action'] === 'mode' &&\n (config['mode'] === 'autonomous' || config['mode'] === 'advisor')\n ) {\n server.setMode(config['mode']);\n json(res, 200, { ok: true, action: 'mode', mode: config['mode'] });\n } else {\n json(res, 400, {\n error: 'Invalid config action. Use: lock, unlock, constrain, or mode',\n });\n }\n return;\n }\n\n // GET /principles — list all principles\n if (path === '/principles' && method === 'GET') {\n const principles = server.getAgentE().getPrinciples();\n json(res, 200, {\n count: principles.length,\n principles: principles.map(p => ({\n id: p.id,\n name: p.name,\n category: p.category,\n description: p.description,\n })),\n });\n return;\n }\n\n // POST /diagnose — standalone Observer+Diagnoser (no side effects)\n if (path === '/diagnose' && method === 'POST') {\n const body = await readBody(req);\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n json(res, 400, { error: 'Invalid JSON' });\n return;\n }\n\n const payload = parsed as Record<string, unknown>;\n const state = payload['state'] ?? parsed;\n\n const validation = validateEconomyState(state);\n if (!validation.valid) {\n json(res, 400, { error: 'Invalid state', validation });\n return;\n }\n\n const result = server.diagnoseOnly(state as import('@agent-e/core').EconomyState);\n\n json(res, 200, {\n health: result.health,\n diagnoses: result.diagnoses.map(d => ({\n principle: d.principle.id,\n name: d.principle.name,\n severity: d.violation.severity,\n evidence: d.violation.evidence,\n suggestedAction: d.violation.suggestedAction,\n })),\n });\n return;\n }\n\n // 404\n json(res, 404, { error: 'Not found' });\n } catch (err) {\n json(res, 500, { error: 'Internal server error' });\n }\n };\n}\n","// WebSocket handler for AgentE Server\n// Same port via HTTP upgrade. JSON messages with `type` field.\n\nimport type * as http from 'node:http';\nimport { WebSocketServer, WebSocket } from 'ws';\nimport { validateEconomyState, type EconomyState, type EconomicEvent } from '@agent-e/core';\nimport type { AgentEServer } from './AgentEServer.js';\n\ninterface IncomingMessage {\n type: string;\n [key: string]: unknown;\n}\n\nfunction send(ws: WebSocket, data: Record<string, unknown>): void {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify(data));\n }\n}\n\nexport function createWebSocketHandler(\n httpServer: http.Server,\n server: AgentEServer,\n): () => void {\n const wss = new WebSocketServer({ server: httpServer });\n\n // Heartbeat: ping every 30s\n const heartbeatInterval = setInterval(() => {\n for (const ws of wss.clients) {\n if (ws.readyState === WebSocket.OPEN) {\n ws.ping();\n }\n }\n }, 30_000);\n\n wss.on('connection', (ws) => {\n ws.on('message', async (raw) => {\n let msg: IncomingMessage;\n try {\n msg = JSON.parse(raw.toString()) as IncomingMessage;\n } catch {\n send(ws, { type: 'error', error: 'Invalid JSON' });\n return;\n }\n\n if (!msg.type || typeof msg.type !== 'string') {\n send(ws, { type: 'error', error: 'Missing \"type\" field' });\n return;\n }\n\n switch (msg.type) {\n case 'tick': {\n const state = msg['state'];\n const events = msg['events'];\n\n const validation = validateEconomyState(state);\n if (!validation.valid) {\n send(ws, { type: 'validation_error', validation });\n // Also send individual warnings\n for (const w of validation.warnings) {\n send(ws, { type: 'validation_warning', warning: w });\n }\n return;\n }\n\n // Forward warnings even if valid\n for (const w of validation.warnings) {\n send(ws, { type: 'validation_warning', warning: w });\n }\n\n try {\n const result = await server.processTick(\n state as EconomyState,\n Array.isArray(events) ? events as EconomicEvent[] : undefined,\n );\n\n send(ws, {\n type: 'tick_result',\n adjustments: result.adjustments,\n alerts: result.alerts.map(a => ({\n principle: a.principle.id,\n name: a.principle.name,\n severity: a.violation.severity,\n suggestedAction: a.violation.suggestedAction,\n })),\n health: result.health,\n decisions: result.decisions.map(d => ({\n id: d.id,\n tick: d.tick,\n principle: d.diagnosis.principle.id,\n parameter: d.plan.parameter,\n result: d.result,\n })),\n });\n } catch (err) {\n send(ws, { type: 'error', error: 'Tick processing failed' });\n }\n break;\n }\n\n case 'event': {\n const event = msg['event'] as EconomicEvent | undefined;\n if (event) {\n server.getAgentE().ingest(event);\n send(ws, { type: 'event_ack' });\n } else {\n send(ws, { type: 'error', error: 'Missing \"event\" field' });\n }\n break;\n }\n\n case 'health': {\n const agentE = server.getAgentE();\n send(ws, {\n type: 'health_result',\n health: agentE.getHealth(),\n tick: agentE.metrics.latest()?.tick ?? 0,\n mode: agentE.getMode(),\n activePlans: agentE.getActivePlans().length,\n uptime: server.getUptime(),\n });\n break;\n }\n\n case 'diagnose': {\n const state = msg['state'];\n const validation = validateEconomyState(state);\n if (!validation.valid) {\n send(ws, { type: 'validation_error', validation });\n return;\n }\n\n const result = server.diagnoseOnly(state as EconomyState);\n send(ws, {\n type: 'diagnose_result',\n health: result.health,\n diagnoses: result.diagnoses.map(d => ({\n principle: d.principle.id,\n name: d.principle.name,\n severity: d.violation.severity,\n suggestedAction: d.violation.suggestedAction,\n })),\n });\n break;\n }\n\n default:\n send(ws, { type: 'error', error: `Unknown message type: \"${msg.type}\"` });\n }\n });\n });\n\n // Return cleanup function\n return () => {\n clearInterval(heartbeatInterval);\n wss.close();\n };\n}\n"],"mappings":"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","names":["validateEconomyState"]}
|
|
File without changes
|