@agent-e/server 1.4.0 → 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-VNNX52KX.mjs → chunk-QU3P7LLI.mjs} +143 -115
- 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 +143 -115
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +26 -4
- package/dist/AgentEServer-IF7QK2SK.mjs +0 -7
- package/dist/chunk-VNNX52KX.mjs.map +0 -1
- /package/dist/{AgentEServer-IF7QK2SK.mjs.map → AgentEServer-45WN6DK4.mjs.map} +0 -0
|
@@ -6,31 +6,42 @@ 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
|
}
|
|
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
|
});
|
|
26
36
|
}
|
|
27
37
|
function createRouteHandler(server) {
|
|
38
|
+
const cors = server.corsOrigin;
|
|
28
39
|
return async (req, res) => {
|
|
29
40
|
const url = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
|
|
30
41
|
const path = url.pathname;
|
|
31
42
|
const method = req.method?.toUpperCase() ?? "GET";
|
|
32
43
|
if (method === "OPTIONS") {
|
|
33
|
-
setCorsHeaders(res);
|
|
44
|
+
setCorsHeaders(res, cors);
|
|
34
45
|
res.writeHead(204);
|
|
35
46
|
res.end();
|
|
36
47
|
return;
|
|
@@ -42,47 +53,44 @@ function createRouteHandler(server) {
|
|
|
42
53
|
try {
|
|
43
54
|
parsed = JSON.parse(body);
|
|
44
55
|
} catch {
|
|
45
|
-
json(res, 400, { error: "Invalid JSON" });
|
|
56
|
+
json(res, 400, { error: "Invalid JSON" }, cors);
|
|
46
57
|
return;
|
|
47
58
|
}
|
|
48
59
|
if (!parsed || typeof parsed !== "object") {
|
|
49
|
-
json(res, 400, { error: "Body must be a JSON object" });
|
|
60
|
+
json(res, 400, { error: "Body must be a JSON object" }, cors);
|
|
50
61
|
return;
|
|
51
62
|
}
|
|
52
63
|
const payload = parsed;
|
|
53
64
|
const state = payload["state"] ?? parsed;
|
|
54
65
|
const events = payload["events"];
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
+
}
|
|
62
75
|
}
|
|
63
76
|
const result = await server.processTick(
|
|
64
77
|
state,
|
|
65
78
|
Array.isArray(events) ? events : void 0
|
|
66
79
|
);
|
|
80
|
+
const warnings = server.validateState ? validateEconomyState(state).warnings : [];
|
|
67
81
|
json(res, 200, {
|
|
68
82
|
adjustments: result.adjustments,
|
|
69
83
|
alerts: result.alerts.map((a) => ({
|
|
70
|
-
|
|
71
|
-
|
|
84
|
+
principleId: a.principle.id,
|
|
85
|
+
principleName: a.principle.name,
|
|
72
86
|
severity: a.violation.severity,
|
|
73
87
|
evidence: a.violation.evidence,
|
|
74
|
-
|
|
88
|
+
reasoning: a.violation.suggestedAction.reasoning
|
|
75
89
|
})),
|
|
76
90
|
health: result.health,
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
principle: d.diagnosis.principle.id,
|
|
81
|
-
parameter: d.plan.parameter,
|
|
82
|
-
result: d.result,
|
|
83
|
-
reasoning: d.reasoning
|
|
84
|
-
}))
|
|
85
|
-
});
|
|
91
|
+
tick: result.tick,
|
|
92
|
+
...warnings.length > 0 ? { validationWarnings: warnings } : {}
|
|
93
|
+
}, cors);
|
|
86
94
|
return;
|
|
87
95
|
}
|
|
88
96
|
if (path === "/health" && method === "GET") {
|
|
@@ -93,11 +101,11 @@ function createRouteHandler(server) {
|
|
|
93
101
|
mode: agentE.getMode(),
|
|
94
102
|
activePlans: agentE.getActivePlans().length,
|
|
95
103
|
uptime: server.getUptime()
|
|
96
|
-
});
|
|
104
|
+
}, cors);
|
|
97
105
|
return;
|
|
98
106
|
}
|
|
99
107
|
if (path === "/decisions" && method === "GET") {
|
|
100
|
-
const limit = parseInt(url.searchParams.get("limit") ?? "
|
|
108
|
+
const limit = parseInt(url.searchParams.get("limit") ?? "100", 10);
|
|
101
109
|
const since = url.searchParams.get("since");
|
|
102
110
|
const agentE = server.getAgentE();
|
|
103
111
|
let decisions;
|
|
@@ -106,20 +114,7 @@ function createRouteHandler(server) {
|
|
|
106
114
|
} else {
|
|
107
115
|
decisions = agentE.log.latest(limit);
|
|
108
116
|
}
|
|
109
|
-
json(res, 200, {
|
|
110
|
-
decisions: decisions.map((d) => ({
|
|
111
|
-
id: d.id,
|
|
112
|
-
tick: d.tick,
|
|
113
|
-
timestamp: d.timestamp,
|
|
114
|
-
principle: d.diagnosis.principle.id,
|
|
115
|
-
principeName: d.diagnosis.principle.name,
|
|
116
|
-
parameter: d.plan.parameter,
|
|
117
|
-
currentValue: d.plan.currentValue,
|
|
118
|
-
targetValue: d.plan.targetValue,
|
|
119
|
-
result: d.result,
|
|
120
|
-
reasoning: d.reasoning
|
|
121
|
-
}))
|
|
122
|
-
});
|
|
117
|
+
json(res, 200, { decisions }, cors);
|
|
123
118
|
return;
|
|
124
119
|
}
|
|
125
120
|
if (path === "/config" && method === "POST") {
|
|
@@ -128,27 +123,32 @@ function createRouteHandler(server) {
|
|
|
128
123
|
try {
|
|
129
124
|
parsed = JSON.parse(body);
|
|
130
125
|
} catch {
|
|
131
|
-
json(res, 400, { error: "Invalid JSON" });
|
|
126
|
+
json(res, 400, { error: "Invalid JSON" }, cors);
|
|
132
127
|
return;
|
|
133
128
|
}
|
|
134
129
|
const config = parsed;
|
|
135
|
-
if (config["
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
}
|
|
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") {
|
|
145
149
|
server.setMode(config["mode"]);
|
|
146
|
-
json(res, 200, { ok: true, action: "mode", mode: config["mode"] });
|
|
147
|
-
} else {
|
|
148
|
-
json(res, 400, {
|
|
149
|
-
error: "Invalid config action. Use: lock, unlock, constrain, or mode"
|
|
150
|
-
});
|
|
151
150
|
}
|
|
151
|
+
json(res, 200, { ok: true }, cors);
|
|
152
152
|
return;
|
|
153
153
|
}
|
|
154
154
|
if (path === "/principles" && method === "GET") {
|
|
@@ -161,7 +161,7 @@ function createRouteHandler(server) {
|
|
|
161
161
|
category: p.category,
|
|
162
162
|
description: p.description
|
|
163
163
|
}))
|
|
164
|
-
});
|
|
164
|
+
}, cors);
|
|
165
165
|
return;
|
|
166
166
|
}
|
|
167
167
|
if (path === "/diagnose" && method === "POST") {
|
|
@@ -170,32 +170,35 @@ function createRouteHandler(server) {
|
|
|
170
170
|
try {
|
|
171
171
|
parsed = JSON.parse(body);
|
|
172
172
|
} catch {
|
|
173
|
-
json(res, 400, { error: "Invalid JSON" });
|
|
173
|
+
json(res, 400, { error: "Invalid JSON" }, cors);
|
|
174
174
|
return;
|
|
175
175
|
}
|
|
176
176
|
const payload = parsed;
|
|
177
177
|
const state = payload["state"] ?? parsed;
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
+
}
|
|
182
184
|
}
|
|
183
185
|
const result = server.diagnoseOnly(state);
|
|
184
186
|
json(res, 200, {
|
|
185
187
|
health: result.health,
|
|
186
188
|
diagnoses: result.diagnoses.map((d) => ({
|
|
187
|
-
|
|
188
|
-
|
|
189
|
+
principleId: d.principle.id,
|
|
190
|
+
principleName: d.principle.name,
|
|
189
191
|
severity: d.violation.severity,
|
|
190
192
|
evidence: d.violation.evidence,
|
|
191
193
|
suggestedAction: d.violation.suggestedAction
|
|
192
194
|
}))
|
|
193
|
-
});
|
|
195
|
+
}, cors);
|
|
194
196
|
return;
|
|
195
197
|
}
|
|
196
|
-
json(res, 404, { error: "Not found" });
|
|
198
|
+
json(res, 404, { error: "Not found" }, cors);
|
|
197
199
|
} catch (err) {
|
|
198
|
-
|
|
200
|
+
console.error("[AgentE Server] Unhandled route error:", err);
|
|
201
|
+
json(res, 500, { error: "Internal server error" }, cors);
|
|
199
202
|
}
|
|
200
203
|
};
|
|
201
204
|
}
|
|
@@ -210,40 +213,53 @@ function send(ws, data) {
|
|
|
210
213
|
}
|
|
211
214
|
function createWebSocketHandler(httpServer, server) {
|
|
212
215
|
const wss = new WebSocketServer({ server: httpServer });
|
|
216
|
+
const aliveMap = /* @__PURE__ */ new WeakMap();
|
|
213
217
|
const heartbeatInterval = setInterval(() => {
|
|
214
218
|
for (const ws of wss.clients) {
|
|
215
219
|
if (ws.readyState === WebSocket.OPEN) {
|
|
220
|
+
if (aliveMap.get(ws) === false) {
|
|
221
|
+
ws.terminate();
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
aliveMap.set(ws, false);
|
|
216
225
|
ws.ping();
|
|
217
226
|
}
|
|
218
227
|
}
|
|
219
228
|
}, 3e4);
|
|
220
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
|
+
});
|
|
221
238
|
ws.on("message", async (raw) => {
|
|
222
239
|
let msg;
|
|
223
240
|
try {
|
|
224
241
|
msg = JSON.parse(raw.toString());
|
|
225
242
|
} catch {
|
|
226
|
-
send(ws, { type: "error",
|
|
243
|
+
send(ws, { type: "error", message: "Malformed JSON" });
|
|
227
244
|
return;
|
|
228
245
|
}
|
|
229
246
|
if (!msg.type || typeof msg.type !== "string") {
|
|
230
|
-
send(ws, { type: "error",
|
|
247
|
+
send(ws, { type: "error", message: 'Missing "type" field' });
|
|
231
248
|
return;
|
|
232
249
|
}
|
|
233
250
|
switch (msg.type) {
|
|
234
251
|
case "tick": {
|
|
235
252
|
const state = msg["state"];
|
|
236
253
|
const events = msg["events"];
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
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 });
|
|
242
262
|
}
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
|
-
for (const w of validation.warnings) {
|
|
246
|
-
send(ws, { type: "validation_warning", warning: w });
|
|
247
263
|
}
|
|
248
264
|
try {
|
|
249
265
|
const result = await server.processTick(
|
|
@@ -254,22 +270,16 @@ function createWebSocketHandler(httpServer, server) {
|
|
|
254
270
|
type: "tick_result",
|
|
255
271
|
adjustments: result.adjustments,
|
|
256
272
|
alerts: result.alerts.map((a) => ({
|
|
257
|
-
|
|
258
|
-
|
|
273
|
+
principleId: a.principle.id,
|
|
274
|
+
principleName: a.principle.name,
|
|
259
275
|
severity: a.violation.severity,
|
|
260
|
-
|
|
276
|
+
reasoning: a.violation.suggestedAction.reasoning
|
|
261
277
|
})),
|
|
262
278
|
health: result.health,
|
|
263
|
-
|
|
264
|
-
id: d.id,
|
|
265
|
-
tick: d.tick,
|
|
266
|
-
principle: d.diagnosis.principle.id,
|
|
267
|
-
parameter: d.plan.parameter,
|
|
268
|
-
result: d.result
|
|
269
|
-
}))
|
|
279
|
+
tick: result.tick
|
|
270
280
|
});
|
|
271
281
|
} catch (err) {
|
|
272
|
-
send(ws, { type: "error",
|
|
282
|
+
send(ws, { type: "error", message: "Tick processing failed" });
|
|
273
283
|
}
|
|
274
284
|
break;
|
|
275
285
|
}
|
|
@@ -279,7 +289,7 @@ function createWebSocketHandler(httpServer, server) {
|
|
|
279
289
|
server.getAgentE().ingest(event);
|
|
280
290
|
send(ws, { type: "event_ack" });
|
|
281
291
|
} else {
|
|
282
|
-
send(ws, { type: "error",
|
|
292
|
+
send(ws, { type: "error", message: 'Missing "event" field' });
|
|
283
293
|
}
|
|
284
294
|
break;
|
|
285
295
|
}
|
|
@@ -297,18 +307,20 @@ function createWebSocketHandler(httpServer, server) {
|
|
|
297
307
|
}
|
|
298
308
|
case "diagnose": {
|
|
299
309
|
const state = msg["state"];
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
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
|
+
}
|
|
304
316
|
}
|
|
305
317
|
const result = server.diagnoseOnly(state);
|
|
306
318
|
send(ws, {
|
|
307
319
|
type: "diagnose_result",
|
|
308
320
|
health: result.health,
|
|
309
321
|
diagnoses: result.diagnoses.map((d) => ({
|
|
310
|
-
|
|
311
|
-
|
|
322
|
+
principleId: d.principle.id,
|
|
323
|
+
principleName: d.principle.name,
|
|
312
324
|
severity: d.violation.severity,
|
|
313
325
|
suggestedAction: d.violation.suggestedAction
|
|
314
326
|
}))
|
|
@@ -316,7 +328,7 @@ function createWebSocketHandler(httpServer, server) {
|
|
|
316
328
|
break;
|
|
317
329
|
}
|
|
318
330
|
default:
|
|
319
|
-
send(ws, { type: "error",
|
|
331
|
+
send(ws, { type: "error", message: `Unknown message type: "${msg.type}"` });
|
|
320
332
|
}
|
|
321
333
|
});
|
|
322
334
|
});
|
|
@@ -334,8 +346,10 @@ var AgentEServer = class {
|
|
|
334
346
|
this.alerts = [];
|
|
335
347
|
this.startedAt = Date.now();
|
|
336
348
|
this.cleanupWs = null;
|
|
337
|
-
this.port = config.port ??
|
|
349
|
+
this.port = config.port ?? 3100;
|
|
338
350
|
this.host = config.host ?? "0.0.0.0";
|
|
351
|
+
this.validateState = config.validateState ?? true;
|
|
352
|
+
this.corsOrigin = config.corsOrigin ?? "*";
|
|
339
353
|
const adapter = {
|
|
340
354
|
getState: () => {
|
|
341
355
|
if (!this.lastState) {
|
|
@@ -357,16 +371,17 @@ var AgentEServer = class {
|
|
|
357
371
|
this.adjustmentQueue.push({ key, value });
|
|
358
372
|
}
|
|
359
373
|
};
|
|
374
|
+
const agentECfg = config.agentE ?? {};
|
|
360
375
|
const agentEConfig = {
|
|
361
376
|
adapter,
|
|
362
|
-
mode:
|
|
363
|
-
gracePeriod:
|
|
364
|
-
checkInterval:
|
|
365
|
-
...
|
|
366
|
-
...
|
|
367
|
-
...
|
|
368
|
-
...
|
|
369
|
-
...
|
|
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 } : {}
|
|
370
385
|
};
|
|
371
386
|
this.agentE = new AgentE(agentEConfig);
|
|
372
387
|
this.agentE.on("alert", (diagnosis) => {
|
|
@@ -380,6 +395,8 @@ var AgentEServer = class {
|
|
|
380
395
|
this.cleanupWs = createWebSocketHandler(this.server, this);
|
|
381
396
|
return new Promise((resolve) => {
|
|
382
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}`);
|
|
383
400
|
resolve();
|
|
384
401
|
});
|
|
385
402
|
});
|
|
@@ -413,7 +430,7 @@ var AgentEServer = class {
|
|
|
413
430
|
* 2. Set state
|
|
414
431
|
* 3. Ingest events
|
|
415
432
|
* 4. Run agentE.tick(state)
|
|
416
|
-
* 5. Drain adjustment queue
|
|
433
|
+
* 5. Drain adjustment queue, enrich with reasoning from decisions
|
|
417
434
|
* 6. Return response
|
|
418
435
|
*/
|
|
419
436
|
async processTick(state, events) {
|
|
@@ -426,13 +443,25 @@ var AgentEServer = class {
|
|
|
426
443
|
}
|
|
427
444
|
}
|
|
428
445
|
await this.agentE.tick(state);
|
|
429
|
-
const
|
|
446
|
+
const rawAdj = [...this.adjustmentQueue];
|
|
430
447
|
this.adjustmentQueue = [];
|
|
431
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
|
+
});
|
|
432
460
|
return {
|
|
433
461
|
adjustments,
|
|
434
462
|
alerts: [...this.alerts],
|
|
435
463
|
health: this.agentE.getHealth(),
|
|
464
|
+
tick: state.tick,
|
|
436
465
|
decisions
|
|
437
466
|
};
|
|
438
467
|
}
|
|
@@ -442,9 +471,8 @@ var AgentEServer = class {
|
|
|
442
471
|
diagnoseOnly(state) {
|
|
443
472
|
const prevState = this.lastState;
|
|
444
473
|
this.lastState = state;
|
|
445
|
-
const
|
|
446
|
-
const
|
|
447
|
-
const health = diagnoser.getHealth();
|
|
474
|
+
const diagnoses = this.agentE.diagnoseNow();
|
|
475
|
+
const health = this.agentE.getHealth();
|
|
448
476
|
this.lastState = prevState;
|
|
449
477
|
return { diagnoses, health };
|
|
450
478
|
}
|
|
@@ -465,4 +493,4 @@ var AgentEServer = class {
|
|
|
465
493
|
export {
|
|
466
494
|
AgentEServer
|
|
467
495
|
};
|
|
468
|
-
//# 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
|