@agent-e/server 1.4.1 → 1.4.4
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-45WN6DK4.mjs +7 -0
- package/dist/{chunk-W7GXJB2K.mjs → chunk-QU3P7LLI.mjs} +131 -114
- package/dist/chunk-QU3P7LLI.mjs.map +1 -0
- package/dist/cli.d.mts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +538 -0
- package/dist/cli.js.map +1 -0
- package/dist/cli.mjs +28 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/index.d.mts +14 -8
- package/dist/index.d.ts +14 -8
- package/dist/index.js +130 -113
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +25 -4
- package/dist/AgentEServer-VDZJAOQ6.mjs +0 -7
- package/dist/chunk-W7GXJB2K.mjs.map +0 -1
- /package/dist/{AgentEServer-VDZJAOQ6.mjs.map → AgentEServer-45WN6DK4.mjs.map} +0 -0
|
@@ -6,13 +6,13 @@ import {
|
|
|
6
6
|
|
|
7
7
|
// src/routes.ts
|
|
8
8
|
import { validateEconomyState } from "@agent-e/core";
|
|
9
|
-
function setCorsHeaders(res) {
|
|
10
|
-
res.setHeader("Access-Control-Allow-Origin",
|
|
9
|
+
function setCorsHeaders(res, origin) {
|
|
10
|
+
res.setHeader("Access-Control-Allow-Origin", origin);
|
|
11
11
|
res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
|
|
12
12
|
res.setHeader("Access-Control-Allow-Headers", "Content-Type");
|
|
13
13
|
}
|
|
14
|
-
function json(res, status, data) {
|
|
15
|
-
setCorsHeaders(res);
|
|
14
|
+
function json(res, status, data, origin) {
|
|
15
|
+
setCorsHeaders(res, origin);
|
|
16
16
|
res.writeHead(status, { "Content-Type": "application/json" });
|
|
17
17
|
res.end(JSON.stringify(data));
|
|
18
18
|
}
|
|
@@ -35,12 +35,13 @@ function readBody(req) {
|
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
37
|
function createRouteHandler(server) {
|
|
38
|
+
const cors = server.corsOrigin;
|
|
38
39
|
return async (req, res) => {
|
|
39
40
|
const url = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
|
|
40
41
|
const path = url.pathname;
|
|
41
42
|
const method = req.method?.toUpperCase() ?? "GET";
|
|
42
43
|
if (method === "OPTIONS") {
|
|
43
|
-
setCorsHeaders(res);
|
|
44
|
+
setCorsHeaders(res, cors);
|
|
44
45
|
res.writeHead(204);
|
|
45
46
|
res.end();
|
|
46
47
|
return;
|
|
@@ -52,47 +53,44 @@ function createRouteHandler(server) {
|
|
|
52
53
|
try {
|
|
53
54
|
parsed = JSON.parse(body);
|
|
54
55
|
} catch {
|
|
55
|
-
json(res, 400, { error: "Invalid JSON" });
|
|
56
|
+
json(res, 400, { error: "Invalid JSON" }, cors);
|
|
56
57
|
return;
|
|
57
58
|
}
|
|
58
59
|
if (!parsed || typeof parsed !== "object") {
|
|
59
|
-
json(res, 400, { error: "Body must be a JSON object" });
|
|
60
|
+
json(res, 400, { error: "Body must be a JSON object" }, cors);
|
|
60
61
|
return;
|
|
61
62
|
}
|
|
62
63
|
const payload = parsed;
|
|
63
64
|
const state = payload["state"] ?? parsed;
|
|
64
65
|
const events = payload["events"];
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
66
|
+
if (server.validateState) {
|
|
67
|
+
const validation = validateEconomyState(state);
|
|
68
|
+
if (!validation.valid) {
|
|
69
|
+
json(res, 400, {
|
|
70
|
+
error: "invalid_state",
|
|
71
|
+
validationErrors: validation.errors
|
|
72
|
+
}, cors);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
72
75
|
}
|
|
73
76
|
const result = await server.processTick(
|
|
74
77
|
state,
|
|
75
78
|
Array.isArray(events) ? events : void 0
|
|
76
79
|
);
|
|
80
|
+
const warnings = server.validateState ? validateEconomyState(state).warnings : [];
|
|
77
81
|
json(res, 200, {
|
|
78
82
|
adjustments: result.adjustments,
|
|
79
83
|
alerts: result.alerts.map((a) => ({
|
|
80
|
-
|
|
81
|
-
|
|
84
|
+
principleId: a.principle.id,
|
|
85
|
+
principleName: a.principle.name,
|
|
82
86
|
severity: a.violation.severity,
|
|
83
87
|
evidence: a.violation.evidence,
|
|
84
|
-
|
|
88
|
+
reasoning: a.violation.suggestedAction.reasoning
|
|
85
89
|
})),
|
|
86
90
|
health: result.health,
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
principle: d.diagnosis.principle.id,
|
|
91
|
-
parameter: d.plan.parameter,
|
|
92
|
-
result: d.result,
|
|
93
|
-
reasoning: d.reasoning
|
|
94
|
-
}))
|
|
95
|
-
});
|
|
91
|
+
tick: result.tick,
|
|
92
|
+
...warnings.length > 0 ? { validationWarnings: warnings } : {}
|
|
93
|
+
}, cors);
|
|
96
94
|
return;
|
|
97
95
|
}
|
|
98
96
|
if (path === "/health" && method === "GET") {
|
|
@@ -103,11 +101,11 @@ function createRouteHandler(server) {
|
|
|
103
101
|
mode: agentE.getMode(),
|
|
104
102
|
activePlans: agentE.getActivePlans().length,
|
|
105
103
|
uptime: server.getUptime()
|
|
106
|
-
});
|
|
104
|
+
}, cors);
|
|
107
105
|
return;
|
|
108
106
|
}
|
|
109
107
|
if (path === "/decisions" && method === "GET") {
|
|
110
|
-
const limit = parseInt(url.searchParams.get("limit") ?? "
|
|
108
|
+
const limit = parseInt(url.searchParams.get("limit") ?? "100", 10);
|
|
111
109
|
const since = url.searchParams.get("since");
|
|
112
110
|
const agentE = server.getAgentE();
|
|
113
111
|
let decisions;
|
|
@@ -116,20 +114,7 @@ function createRouteHandler(server) {
|
|
|
116
114
|
} else {
|
|
117
115
|
decisions = agentE.log.latest(limit);
|
|
118
116
|
}
|
|
119
|
-
json(res, 200, {
|
|
120
|
-
decisions: decisions.map((d) => ({
|
|
121
|
-
id: d.id,
|
|
122
|
-
tick: d.tick,
|
|
123
|
-
timestamp: d.timestamp,
|
|
124
|
-
principle: d.diagnosis.principle.id,
|
|
125
|
-
principeName: d.diagnosis.principle.name,
|
|
126
|
-
parameter: d.plan.parameter,
|
|
127
|
-
currentValue: d.plan.currentValue,
|
|
128
|
-
targetValue: d.plan.targetValue,
|
|
129
|
-
result: d.result,
|
|
130
|
-
reasoning: d.reasoning
|
|
131
|
-
}))
|
|
132
|
-
});
|
|
117
|
+
json(res, 200, { decisions }, cors);
|
|
133
118
|
return;
|
|
134
119
|
}
|
|
135
120
|
if (path === "/config" && method === "POST") {
|
|
@@ -138,27 +123,32 @@ function createRouteHandler(server) {
|
|
|
138
123
|
try {
|
|
139
124
|
parsed = JSON.parse(body);
|
|
140
125
|
} catch {
|
|
141
|
-
json(res, 400, { error: "Invalid JSON" });
|
|
126
|
+
json(res, 400, { error: "Invalid JSON" }, cors);
|
|
142
127
|
return;
|
|
143
128
|
}
|
|
144
129
|
const config = parsed;
|
|
145
|
-
if (config["
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
}
|
|
130
|
+
if (Array.isArray(config["lock"])) {
|
|
131
|
+
for (const param of config["lock"]) {
|
|
132
|
+
if (typeof param === "string") server.lock(param);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (Array.isArray(config["unlock"])) {
|
|
136
|
+
for (const param of config["unlock"]) {
|
|
137
|
+
if (typeof param === "string") server.unlock(param);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (Array.isArray(config["constrain"])) {
|
|
141
|
+
for (const c of config["constrain"]) {
|
|
142
|
+
if (c && typeof c === "object" && typeof c["param"] === "string" && typeof c["min"] === "number" && typeof c["max"] === "number") {
|
|
143
|
+
const constraint = c;
|
|
144
|
+
server.constrain(constraint.param, { min: constraint.min, max: constraint.max });
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (config["mode"] === "autonomous" || config["mode"] === "advisor") {
|
|
155
149
|
server.setMode(config["mode"]);
|
|
156
|
-
json(res, 200, { ok: true, action: "mode", mode: config["mode"] });
|
|
157
|
-
} else {
|
|
158
|
-
json(res, 400, {
|
|
159
|
-
error: "Invalid config action. Use: lock, unlock, constrain, or mode"
|
|
160
|
-
});
|
|
161
150
|
}
|
|
151
|
+
json(res, 200, { ok: true }, cors);
|
|
162
152
|
return;
|
|
163
153
|
}
|
|
164
154
|
if (path === "/principles" && method === "GET") {
|
|
@@ -171,7 +161,7 @@ function createRouteHandler(server) {
|
|
|
171
161
|
category: p.category,
|
|
172
162
|
description: p.description
|
|
173
163
|
}))
|
|
174
|
-
});
|
|
164
|
+
}, cors);
|
|
175
165
|
return;
|
|
176
166
|
}
|
|
177
167
|
if (path === "/diagnose" && method === "POST") {
|
|
@@ -180,33 +170,35 @@ function createRouteHandler(server) {
|
|
|
180
170
|
try {
|
|
181
171
|
parsed = JSON.parse(body);
|
|
182
172
|
} catch {
|
|
183
|
-
json(res, 400, { error: "Invalid JSON" });
|
|
173
|
+
json(res, 400, { error: "Invalid JSON" }, cors);
|
|
184
174
|
return;
|
|
185
175
|
}
|
|
186
176
|
const payload = parsed;
|
|
187
177
|
const state = payload["state"] ?? parsed;
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
178
|
+
if (server.validateState) {
|
|
179
|
+
const validation = validateEconomyState(state);
|
|
180
|
+
if (!validation.valid) {
|
|
181
|
+
json(res, 400, { error: "invalid_state", validationErrors: validation.errors }, cors);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
192
184
|
}
|
|
193
185
|
const result = server.diagnoseOnly(state);
|
|
194
186
|
json(res, 200, {
|
|
195
187
|
health: result.health,
|
|
196
188
|
diagnoses: result.diagnoses.map((d) => ({
|
|
197
|
-
|
|
198
|
-
|
|
189
|
+
principleId: d.principle.id,
|
|
190
|
+
principleName: d.principle.name,
|
|
199
191
|
severity: d.violation.severity,
|
|
200
192
|
evidence: d.violation.evidence,
|
|
201
193
|
suggestedAction: d.violation.suggestedAction
|
|
202
194
|
}))
|
|
203
|
-
});
|
|
195
|
+
}, cors);
|
|
204
196
|
return;
|
|
205
197
|
}
|
|
206
|
-
json(res, 404, { error: "Not found" });
|
|
198
|
+
json(res, 404, { error: "Not found" }, cors);
|
|
207
199
|
} catch (err) {
|
|
208
200
|
console.error("[AgentE Server] Unhandled route error:", err);
|
|
209
|
-
json(res, 500, { error: "Internal server error" });
|
|
201
|
+
json(res, 500, { error: "Internal server error" }, cors);
|
|
210
202
|
}
|
|
211
203
|
};
|
|
212
204
|
}
|
|
@@ -221,40 +213,53 @@ function send(ws, data) {
|
|
|
221
213
|
}
|
|
222
214
|
function createWebSocketHandler(httpServer, server) {
|
|
223
215
|
const wss = new WebSocketServer({ server: httpServer });
|
|
216
|
+
const aliveMap = /* @__PURE__ */ new WeakMap();
|
|
224
217
|
const heartbeatInterval = setInterval(() => {
|
|
225
218
|
for (const ws of wss.clients) {
|
|
226
219
|
if (ws.readyState === WebSocket.OPEN) {
|
|
220
|
+
if (aliveMap.get(ws) === false) {
|
|
221
|
+
ws.terminate();
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
aliveMap.set(ws, false);
|
|
227
225
|
ws.ping();
|
|
228
226
|
}
|
|
229
227
|
}
|
|
230
228
|
}, 3e4);
|
|
231
229
|
wss.on("connection", (ws) => {
|
|
230
|
+
console.log("[AgentE Server] Client connected");
|
|
231
|
+
aliveMap.set(ws, true);
|
|
232
|
+
ws.on("pong", () => {
|
|
233
|
+
aliveMap.set(ws, true);
|
|
234
|
+
});
|
|
235
|
+
ws.on("close", () => {
|
|
236
|
+
console.log("[AgentE Server] Client disconnected");
|
|
237
|
+
});
|
|
232
238
|
ws.on("message", async (raw) => {
|
|
233
239
|
let msg;
|
|
234
240
|
try {
|
|
235
241
|
msg = JSON.parse(raw.toString());
|
|
236
242
|
} catch {
|
|
237
|
-
send(ws, { type: "error",
|
|
243
|
+
send(ws, { type: "error", message: "Malformed JSON" });
|
|
238
244
|
return;
|
|
239
245
|
}
|
|
240
246
|
if (!msg.type || typeof msg.type !== "string") {
|
|
241
|
-
send(ws, { type: "error",
|
|
247
|
+
send(ws, { type: "error", message: 'Missing "type" field' });
|
|
242
248
|
return;
|
|
243
249
|
}
|
|
244
250
|
switch (msg.type) {
|
|
245
251
|
case "tick": {
|
|
246
252
|
const state = msg["state"];
|
|
247
253
|
const events = msg["events"];
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
254
|
+
if (server.validateState) {
|
|
255
|
+
const validation = validateEconomyState2(state);
|
|
256
|
+
if (!validation.valid) {
|
|
257
|
+
send(ws, { type: "validation_error", validationErrors: validation.errors });
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
if (validation.warnings.length > 0) {
|
|
261
|
+
send(ws, { type: "validation_warning", validationWarnings: validation.warnings });
|
|
253
262
|
}
|
|
254
|
-
return;
|
|
255
|
-
}
|
|
256
|
-
for (const w of validation.warnings) {
|
|
257
|
-
send(ws, { type: "validation_warning", warning: w });
|
|
258
263
|
}
|
|
259
264
|
try {
|
|
260
265
|
const result = await server.processTick(
|
|
@@ -265,22 +270,16 @@ function createWebSocketHandler(httpServer, server) {
|
|
|
265
270
|
type: "tick_result",
|
|
266
271
|
adjustments: result.adjustments,
|
|
267
272
|
alerts: result.alerts.map((a) => ({
|
|
268
|
-
|
|
269
|
-
|
|
273
|
+
principleId: a.principle.id,
|
|
274
|
+
principleName: a.principle.name,
|
|
270
275
|
severity: a.violation.severity,
|
|
271
|
-
|
|
276
|
+
reasoning: a.violation.suggestedAction.reasoning
|
|
272
277
|
})),
|
|
273
278
|
health: result.health,
|
|
274
|
-
|
|
275
|
-
id: d.id,
|
|
276
|
-
tick: d.tick,
|
|
277
|
-
principle: d.diagnosis.principle.id,
|
|
278
|
-
parameter: d.plan.parameter,
|
|
279
|
-
result: d.result
|
|
280
|
-
}))
|
|
279
|
+
tick: result.tick
|
|
281
280
|
});
|
|
282
281
|
} catch (err) {
|
|
283
|
-
send(ws, { type: "error",
|
|
282
|
+
send(ws, { type: "error", message: "Tick processing failed" });
|
|
284
283
|
}
|
|
285
284
|
break;
|
|
286
285
|
}
|
|
@@ -290,7 +289,7 @@ function createWebSocketHandler(httpServer, server) {
|
|
|
290
289
|
server.getAgentE().ingest(event);
|
|
291
290
|
send(ws, { type: "event_ack" });
|
|
292
291
|
} else {
|
|
293
|
-
send(ws, { type: "error",
|
|
292
|
+
send(ws, { type: "error", message: 'Missing "event" field' });
|
|
294
293
|
}
|
|
295
294
|
break;
|
|
296
295
|
}
|
|
@@ -308,18 +307,20 @@ function createWebSocketHandler(httpServer, server) {
|
|
|
308
307
|
}
|
|
309
308
|
case "diagnose": {
|
|
310
309
|
const state = msg["state"];
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
310
|
+
if (server.validateState) {
|
|
311
|
+
const validation = validateEconomyState2(state);
|
|
312
|
+
if (!validation.valid) {
|
|
313
|
+
send(ws, { type: "validation_error", validationErrors: validation.errors });
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
315
316
|
}
|
|
316
317
|
const result = server.diagnoseOnly(state);
|
|
317
318
|
send(ws, {
|
|
318
319
|
type: "diagnose_result",
|
|
319
320
|
health: result.health,
|
|
320
321
|
diagnoses: result.diagnoses.map((d) => ({
|
|
321
|
-
|
|
322
|
-
|
|
322
|
+
principleId: d.principle.id,
|
|
323
|
+
principleName: d.principle.name,
|
|
323
324
|
severity: d.violation.severity,
|
|
324
325
|
suggestedAction: d.violation.suggestedAction
|
|
325
326
|
}))
|
|
@@ -327,7 +328,7 @@ function createWebSocketHandler(httpServer, server) {
|
|
|
327
328
|
break;
|
|
328
329
|
}
|
|
329
330
|
default:
|
|
330
|
-
send(ws, { type: "error",
|
|
331
|
+
send(ws, { type: "error", message: `Unknown message type: "${msg.type}"` });
|
|
331
332
|
}
|
|
332
333
|
});
|
|
333
334
|
});
|
|
@@ -345,8 +346,10 @@ var AgentEServer = class {
|
|
|
345
346
|
this.alerts = [];
|
|
346
347
|
this.startedAt = Date.now();
|
|
347
348
|
this.cleanupWs = null;
|
|
348
|
-
this.port = config.port ??
|
|
349
|
+
this.port = config.port ?? 3100;
|
|
349
350
|
this.host = config.host ?? "0.0.0.0";
|
|
351
|
+
this.validateState = config.validateState ?? true;
|
|
352
|
+
this.corsOrigin = config.corsOrigin ?? "*";
|
|
350
353
|
const adapter = {
|
|
351
354
|
getState: () => {
|
|
352
355
|
if (!this.lastState) {
|
|
@@ -368,16 +371,17 @@ var AgentEServer = class {
|
|
|
368
371
|
this.adjustmentQueue.push({ key, value });
|
|
369
372
|
}
|
|
370
373
|
};
|
|
374
|
+
const agentECfg = config.agentE ?? {};
|
|
371
375
|
const agentEConfig = {
|
|
372
376
|
adapter,
|
|
373
|
-
mode:
|
|
374
|
-
gracePeriod:
|
|
375
|
-
checkInterval:
|
|
376
|
-
...
|
|
377
|
-
...
|
|
378
|
-
...
|
|
379
|
-
...
|
|
380
|
-
...
|
|
377
|
+
mode: agentECfg.mode ?? "autonomous",
|
|
378
|
+
gracePeriod: agentECfg.gracePeriod ?? 0,
|
|
379
|
+
checkInterval: agentECfg.checkInterval ?? 1,
|
|
380
|
+
...agentECfg.dominantRoles ? { dominantRoles: agentECfg.dominantRoles } : {},
|
|
381
|
+
...agentECfg.idealDistribution ? { idealDistribution: agentECfg.idealDistribution } : {},
|
|
382
|
+
...agentECfg.maxAdjustmentPercent !== void 0 ? { maxAdjustmentPercent: agentECfg.maxAdjustmentPercent } : {},
|
|
383
|
+
...agentECfg.cooldownTicks !== void 0 ? { cooldownTicks: agentECfg.cooldownTicks } : {},
|
|
384
|
+
...agentECfg.thresholds ? { thresholds: agentECfg.thresholds } : {}
|
|
381
385
|
};
|
|
382
386
|
this.agentE = new AgentE(agentEConfig);
|
|
383
387
|
this.agentE.on("alert", (diagnosis) => {
|
|
@@ -391,6 +395,8 @@ var AgentEServer = class {
|
|
|
391
395
|
this.cleanupWs = createWebSocketHandler(this.server, this);
|
|
392
396
|
return new Promise((resolve) => {
|
|
393
397
|
this.server.listen(this.port, this.host, () => {
|
|
398
|
+
const addr = this.getAddress();
|
|
399
|
+
console.log(`[AgentE Server] Listening on http://${addr.host}:${addr.port}`);
|
|
394
400
|
resolve();
|
|
395
401
|
});
|
|
396
402
|
});
|
|
@@ -424,7 +430,7 @@ var AgentEServer = class {
|
|
|
424
430
|
* 2. Set state
|
|
425
431
|
* 3. Ingest events
|
|
426
432
|
* 4. Run agentE.tick(state)
|
|
427
|
-
* 5. Drain adjustment queue
|
|
433
|
+
* 5. Drain adjustment queue, enrich with reasoning from decisions
|
|
428
434
|
* 6. Return response
|
|
429
435
|
*/
|
|
430
436
|
async processTick(state, events) {
|
|
@@ -437,13 +443,25 @@ var AgentEServer = class {
|
|
|
437
443
|
}
|
|
438
444
|
}
|
|
439
445
|
await this.agentE.tick(state);
|
|
440
|
-
const
|
|
446
|
+
const rawAdj = [...this.adjustmentQueue];
|
|
441
447
|
this.adjustmentQueue = [];
|
|
442
448
|
const decisions = this.agentE.getDecisions({ since: state.tick, until: state.tick });
|
|
449
|
+
const adjustments = rawAdj.map((adj) => {
|
|
450
|
+
const decision = decisions.find(
|
|
451
|
+
(d) => d.plan.parameter === adj.key && d.result === "applied"
|
|
452
|
+
);
|
|
453
|
+
return {
|
|
454
|
+
parameter: adj.key,
|
|
455
|
+
value: adj.value,
|
|
456
|
+
...adj.currency ? { currency: adj.currency } : {},
|
|
457
|
+
reasoning: decision?.diagnosis.violation.suggestedAction.reasoning ?? ""
|
|
458
|
+
};
|
|
459
|
+
});
|
|
443
460
|
return {
|
|
444
461
|
adjustments,
|
|
445
462
|
alerts: [...this.alerts],
|
|
446
463
|
health: this.agentE.getHealth(),
|
|
464
|
+
tick: state.tick,
|
|
447
465
|
decisions
|
|
448
466
|
};
|
|
449
467
|
}
|
|
@@ -453,9 +471,8 @@ var AgentEServer = class {
|
|
|
453
471
|
diagnoseOnly(state) {
|
|
454
472
|
const prevState = this.lastState;
|
|
455
473
|
this.lastState = state;
|
|
456
|
-
const
|
|
457
|
-
const
|
|
458
|
-
const health = diagnoser.getHealth();
|
|
474
|
+
const diagnoses = this.agentE.diagnoseNow();
|
|
475
|
+
const health = this.agentE.getHealth();
|
|
459
476
|
this.lastState = prevState;
|
|
460
477
|
return { diagnoses, health };
|
|
461
478
|
}
|
|
@@ -476,4 +493,4 @@ var AgentEServer = class {
|
|
|
476
493
|
export {
|
|
477
494
|
AgentEServer
|
|
478
495
|
};
|
|
479
|
-
//# sourceMappingURL=chunk-
|
|
496
|
+
//# sourceMappingURL=chunk-QU3P7LLI.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 agentE?: Partial<Omit<AgentEConfig, 'adapter'>>;\n validateState?: boolean;\n corsOrigin?: string;\n}\n\nexport interface EnrichedAdjustment {\n parameter: string;\n value: number;\n currency?: string;\n reasoning: string;\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 readonly port: number;\n private readonly host: string;\n private readonly startedAt = Date.now();\n private cleanupWs: (() => void) | null = null;\n readonly validateState: boolean;\n readonly corsOrigin: string;\n\n constructor(config: ServerConfig = {}) {\n this.port = config.port ?? 3100;\n this.host = config.host ?? '0.0.0.0';\n this.validateState = config.validateState ?? true;\n this.corsOrigin = config.corsOrigin ?? '*';\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 agentECfg = config.agentE ?? {};\n const agentEConfig: AgentEConfig = {\n adapter,\n mode: agentECfg.mode ?? 'autonomous',\n gracePeriod: agentECfg.gracePeriod ?? 0,\n checkInterval: agentECfg.checkInterval ?? 1,\n ...(agentECfg.dominantRoles ? { dominantRoles: agentECfg.dominantRoles } : {}),\n ...(agentECfg.idealDistribution ? { idealDistribution: agentECfg.idealDistribution } : {}),\n ...(agentECfg.maxAdjustmentPercent !== undefined ? { maxAdjustmentPercent: agentECfg.maxAdjustmentPercent } : {}),\n ...(agentECfg.cooldownTicks !== undefined ? { cooldownTicks: agentECfg.cooldownTicks } : {}),\n ...(agentECfg.thresholds ? { thresholds: agentECfg.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 const addr = this.getAddress();\n console.log(`[AgentE Server] Listening on http://${addr.host}:${addr.port}`);\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, enrich with reasoning from decisions\n * 6. Return response\n */\n async processTick(\n state: EconomyState,\n events?: EconomicEvent[],\n ): Promise<{\n adjustments: EnrichedAdjustment[];\n alerts: Diagnosis[];\n health: number;\n tick: 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 rawAdj = [...this.adjustmentQueue];\n this.adjustmentQueue = [];\n\n // Cross-reference with decision log to attach reasoning\n const decisions = this.agentE.getDecisions({ since: state.tick, until: state.tick });\n\n const adjustments: EnrichedAdjustment[] = rawAdj.map(adj => {\n const decision = decisions.find(d =>\n d.plan.parameter === adj.key && d.result === 'applied',\n );\n return {\n parameter: adj.key,\n value: adj.value,\n ...(adj.currency ? { currency: adj.currency } : {}),\n reasoning: decision?.diagnosis.violation.suggestedAction.reasoning ?? '',\n };\n });\n\n return {\n adjustments,\n alerts: [...this.alerts],\n health: this.agentE.getHealth(),\n tick: state.tick,\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 const diagnoses = this.agentE.diagnoseNow();\n const health = this.agentE.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, origin: string): void {\n res.setHeader('Access-Control-Allow-Origin', 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, origin: string): void {\n setCorsHeaders(res, origin);\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 const cors = server.corsOrigin;\n\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, cors);\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' }, cors);\n return;\n }\n\n if (!parsed || typeof parsed !== 'object') {\n json(res, 400, { error: 'Body must be a JSON object' }, cors);\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 (if enabled)\n if (server.validateState) {\n const validation = validateEconomyState(state);\n if (!validation.valid) {\n json(res, 400, {\n error: 'invalid_state',\n validationErrors: validation.errors,\n }, cors);\n return;\n }\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 // Include validation warnings if any\n const warnings = server.validateState\n ? validateEconomyState(state).warnings\n : [];\n\n json(res, 200, {\n adjustments: result.adjustments,\n alerts: result.alerts.map(a => ({\n principleId: a.principle.id,\n principleName: a.principle.name,\n severity: a.violation.severity,\n evidence: a.violation.evidence,\n reasoning: a.violation.suggestedAction.reasoning,\n })),\n health: result.health,\n tick: result.tick,\n ...(warnings.length > 0 ? { validationWarnings: warnings } : {}),\n }, cors);\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 }, cors);\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') ?? '100', 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, { decisions }, cors);\n return;\n }\n\n // POST /config — batch 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' }, cors);\n return;\n }\n\n const config = parsed as Record<string, unknown>;\n\n // Lock parameters\n if (Array.isArray(config['lock'])) {\n for (const param of config['lock']) {\n if (typeof param === 'string') server.lock(param);\n }\n }\n\n // Unlock parameters\n if (Array.isArray(config['unlock'])) {\n for (const param of config['unlock']) {\n if (typeof param === 'string') server.unlock(param);\n }\n }\n\n // Constrain parameters\n if (Array.isArray(config['constrain'])) {\n for (const c of config['constrain'] as unknown[]) {\n if (\n c && typeof c === 'object' &&\n typeof (c as Record<string, unknown>)['param'] === 'string' &&\n typeof (c as Record<string, unknown>)['min'] === 'number' &&\n typeof (c as Record<string, unknown>)['max'] === 'number'\n ) {\n const constraint = c as { param: string; min: number; max: number };\n server.constrain(constraint.param, { min: constraint.min, max: constraint.max });\n }\n }\n }\n\n // Mode switch\n if (config['mode'] === 'autonomous' || config['mode'] === 'advisor') {\n server.setMode(config['mode']);\n }\n\n json(res, 200, { ok: true }, cors);\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 }, cors);\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' }, cors);\n return;\n }\n\n const payload = parsed as Record<string, unknown>;\n const state = payload['state'] ?? parsed;\n\n if (server.validateState) {\n const validation = validateEconomyState(state);\n if (!validation.valid) {\n json(res, 400, { error: 'invalid_state', validationErrors: validation.errors }, cors);\n return;\n }\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 principleId: d.principle.id,\n principleName: d.principle.name,\n severity: d.violation.severity,\n evidence: d.violation.evidence,\n suggestedAction: d.violation.suggestedAction,\n })),\n }, cors);\n return;\n }\n\n // 404\n json(res, 404, { error: 'Not found' }, cors);\n } catch (err) {\n console.error('[AgentE Server] Unhandled route error:', err);\n json(res, 500, { error: 'Internal server error' }, cors);\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, disconnect if no pong within 10s\n const aliveMap = new WeakMap<WebSocket, boolean>();\n\n const heartbeatInterval = setInterval(() => {\n for (const ws of wss.clients) {\n if (ws.readyState === WebSocket.OPEN) {\n if (aliveMap.get(ws) === false) {\n // No pong received since last ping — terminate\n ws.terminate();\n continue;\n }\n aliveMap.set(ws, false);\n ws.ping();\n }\n }\n }, 30_000);\n\n wss.on('connection', (ws) => {\n console.log('[AgentE Server] Client connected');\n aliveMap.set(ws, true);\n\n ws.on('pong', () => {\n aliveMap.set(ws, true);\n });\n\n ws.on('close', () => {\n console.log('[AgentE Server] Client disconnected');\n });\n\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', message: 'Malformed JSON' });\n return;\n }\n\n if (!msg.type || typeof msg.type !== 'string') {\n send(ws, { type: 'error', message: '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 if (server.validateState) {\n const validation = validateEconomyState(state);\n if (!validation.valid) {\n send(ws, { type: 'validation_error', validationErrors: validation.errors });\n return;\n }\n\n // Forward warnings even if valid\n if (validation.warnings.length > 0) {\n send(ws, { type: 'validation_warning', validationWarnings: validation.warnings });\n }\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 principleId: a.principle.id,\n principleName: a.principle.name,\n severity: a.violation.severity,\n reasoning: a.violation.suggestedAction.reasoning,\n })),\n health: result.health,\n tick: result.tick,\n });\n } catch (err) {\n send(ws, { type: 'error', message: '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', message: '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\n if (server.validateState) {\n const validation = validateEconomyState(state);\n if (!validation.valid) {\n send(ws, { type: 'validation_error', validationErrors: validation.errors });\n return;\n }\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 principleId: d.principle.id,\n principleName: 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', message: `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/cli.d.mts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|