eacn3 0.1.0
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/index.d.ts +7 -0
- package/dist/index.js +574 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +8 -0
- package/dist/server.js +640 -0
- package/dist/server.js.map +1 -0
- package/dist/src/models.d.ts +161 -0
- package/dist/src/models.js +14 -0
- package/dist/src/models.js.map +1 -0
- package/dist/src/network-client.d.ts +96 -0
- package/dist/src/network-client.js +228 -0
- package/dist/src/network-client.js.map +1 -0
- package/dist/src/state.d.ts +33 -0
- package/dist/src/state.js +113 -0
- package/dist/src/state.js.map +1 -0
- package/dist/src/ws-manager.d.ts +30 -0
- package/dist/src/ws-manager.js +150 -0
- package/dist/src/ws-manager.js.map +1 -0
- package/openclaw.plugin.json +21 -0
- package/package.json +52 -0
- package/scripts/cli.cjs +332 -0
- package/scripts/postinstall.cjs +62 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local state persistence — reads/writes ~/.eacn/state.json.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { homedir } from "node:os";
|
|
7
|
+
import { createDefaultState } from "./models.js";
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Paths
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
const EACN_DIR = join(homedir(), ".eacn");
|
|
12
|
+
const STATE_FILE = join(EACN_DIR, "state.json");
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Singleton state
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
let state = null;
|
|
17
|
+
/**
|
|
18
|
+
* Load state from disk. Creates default if not exists.
|
|
19
|
+
*/
|
|
20
|
+
export function load() {
|
|
21
|
+
if (existsSync(STATE_FILE)) {
|
|
22
|
+
try {
|
|
23
|
+
const raw = readFileSync(STATE_FILE, "utf-8");
|
|
24
|
+
state = JSON.parse(raw);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
state = createDefaultState();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
state = createDefaultState();
|
|
32
|
+
}
|
|
33
|
+
return state;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Persist current state to disk.
|
|
37
|
+
*/
|
|
38
|
+
export function save() {
|
|
39
|
+
if (!state)
|
|
40
|
+
return;
|
|
41
|
+
mkdirSync(EACN_DIR, { recursive: true });
|
|
42
|
+
writeFileSync(STATE_FILE, JSON.stringify(state, null, 2));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get current state (loads from disk if not yet loaded).
|
|
46
|
+
*/
|
|
47
|
+
export function getState() {
|
|
48
|
+
if (!state)
|
|
49
|
+
load();
|
|
50
|
+
return state;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Replace entire state.
|
|
54
|
+
*/
|
|
55
|
+
export function setState(newState) {
|
|
56
|
+
state = newState;
|
|
57
|
+
}
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// Convenience methods
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
export function addAgent(agent) {
|
|
62
|
+
getState().agents[agent.agent_id] = agent;
|
|
63
|
+
save();
|
|
64
|
+
}
|
|
65
|
+
export function removeAgent(agentId) {
|
|
66
|
+
delete getState().agents[agentId];
|
|
67
|
+
save();
|
|
68
|
+
}
|
|
69
|
+
export function getAgent(agentId) {
|
|
70
|
+
return getState().agents[agentId];
|
|
71
|
+
}
|
|
72
|
+
export function listAgents() {
|
|
73
|
+
return Object.values(getState().agents);
|
|
74
|
+
}
|
|
75
|
+
export function updateTask(info) {
|
|
76
|
+
getState().local_tasks[info.task_id] = info;
|
|
77
|
+
save();
|
|
78
|
+
}
|
|
79
|
+
export function removeTask(taskId) {
|
|
80
|
+
delete getState().local_tasks[taskId];
|
|
81
|
+
save();
|
|
82
|
+
}
|
|
83
|
+
export function updateTaskStatus(taskId, status) {
|
|
84
|
+
const task = getState().local_tasks[taskId];
|
|
85
|
+
if (task) {
|
|
86
|
+
task.status = status;
|
|
87
|
+
save();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export function getTask(taskId) {
|
|
91
|
+
return getState().local_tasks[taskId];
|
|
92
|
+
}
|
|
93
|
+
export function pushEvents(events) {
|
|
94
|
+
getState().pending_events.push(...events);
|
|
95
|
+
// No save — events are transient, only persist on explicit save
|
|
96
|
+
}
|
|
97
|
+
export function drainEvents() {
|
|
98
|
+
const s = getState();
|
|
99
|
+
const events = s.pending_events;
|
|
100
|
+
s.pending_events = [];
|
|
101
|
+
return events;
|
|
102
|
+
}
|
|
103
|
+
export function updateReputationCache(agentId, score) {
|
|
104
|
+
getState().reputation_cache[agentId] = score;
|
|
105
|
+
// Don't save on every cache update — caller decides
|
|
106
|
+
}
|
|
107
|
+
export function isConnected() {
|
|
108
|
+
return getState().server_card !== null;
|
|
109
|
+
}
|
|
110
|
+
export function getServerId() {
|
|
111
|
+
return getState().server_card?.server_id ?? null;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/state.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAsE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAErH,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;AAEhD,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,IAAI,KAAK,GAAqB,IAAI,CAAC;AAEnC;;GAEG;AACH,MAAM,UAAU,IAAI;IAClB,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC9C,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,GAAG,kBAAkB,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,kBAAkB,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,IAAI;IAClB,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ;IACtB,IAAI,CAAC,KAAK;QAAE,IAAI,EAAE,CAAC;IACnB,OAAO,KAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAmB;IAC1C,KAAK,GAAG,QAAQ,CAAC;AACnB,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,MAAM,UAAU,QAAQ,CAAC,KAAgB;IACvC,QAAQ,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;IAC1C,IAAI,EAAE,CAAC;AACT,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,QAAQ,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,EAAE,CAAC;AACT,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,QAAQ,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAmB;IAC5C,QAAQ,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5C,IAAI,EAAE,CAAC;AACT,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,QAAQ,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,EAAE,CAAC;AACT,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,MAAc;IAC7D,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,CAAC,MAAM,GAAG,MAA0C,CAAC;QACzD,IAAI,EAAE,CAAC;IACT,CAAC;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,MAAc;IACpC,OAAO,QAAQ,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAmB;IAC5C,QAAQ,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;IAC1C,gEAAgE;AAClE,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;IACrB,MAAM,MAAM,GAAG,CAAC,CAAC,cAAc,CAAC;IAChC,CAAC,CAAC,cAAc,GAAG,EAAE,CAAC;IACtB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAe,EAAE,KAAa;IAClE,QAAQ,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;IAC7C,oDAAoD;AACtD,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,QAAQ,EAAE,CAAC,WAAW,KAAK,IAAI,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,QAAQ,EAAE,CAAC,WAAW,EAAE,SAAS,IAAI,IAAI,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket manager — one connection per registered Agent.
|
|
3
|
+
*
|
|
4
|
+
* Events are buffered in memory. Host retrieves via eacn_get_events (drainEvents).
|
|
5
|
+
* Auto-reconnect on disconnect. Ping keepalive.
|
|
6
|
+
*/
|
|
7
|
+
import { type PushEvent } from "./models.js";
|
|
8
|
+
type EventCallback = (agentId: string, event: PushEvent) => void;
|
|
9
|
+
export declare function setEventCallback(cb: EventCallback): void;
|
|
10
|
+
/**
|
|
11
|
+
* Establish WebSocket connection for an Agent.
|
|
12
|
+
*/
|
|
13
|
+
export declare function connect(agentId: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* Disconnect a specific Agent's WebSocket.
|
|
16
|
+
*/
|
|
17
|
+
export declare function disconnect(agentId: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* Disconnect all WebSocket connections.
|
|
20
|
+
*/
|
|
21
|
+
export declare function disconnectAll(): void;
|
|
22
|
+
/**
|
|
23
|
+
* Check if an Agent has an active WebSocket connection.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isConnected(agentId: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Get all connected agent IDs.
|
|
28
|
+
*/
|
|
29
|
+
export declare function connectedAgents(): string[];
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket manager — one connection per registered Agent.
|
|
3
|
+
*
|
|
4
|
+
* Events are buffered in memory. Host retrieves via eacn_get_events (drainEvents).
|
|
5
|
+
* Auto-reconnect on disconnect. Ping keepalive.
|
|
6
|
+
*/
|
|
7
|
+
import WebSocket from "ws";
|
|
8
|
+
import { getState, pushEvents } from "./state.js";
|
|
9
|
+
let onEventCallback = null;
|
|
10
|
+
export function setEventCallback(cb) {
|
|
11
|
+
onEventCallback = cb;
|
|
12
|
+
}
|
|
13
|
+
const connections = new Map();
|
|
14
|
+
const PING_INTERVAL_MS = 30_000;
|
|
15
|
+
const RECONNECT_DELAY_MS = 5_000;
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Internal helpers
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
function wsUrl(agentId) {
|
|
20
|
+
const httpUrl = getState().network_endpoint;
|
|
21
|
+
const wsBase = httpUrl.replace(/^http/, "ws");
|
|
22
|
+
return `${wsBase}/ws/${agentId}`;
|
|
23
|
+
}
|
|
24
|
+
function handleMessage(agentId, data) {
|
|
25
|
+
try {
|
|
26
|
+
const raw = typeof data === "string" ? data : data.toString("utf-8");
|
|
27
|
+
if (raw === "pong")
|
|
28
|
+
return; // keepalive response
|
|
29
|
+
const event = JSON.parse(raw);
|
|
30
|
+
const pushEvent = { ...event, received_at: Date.now() };
|
|
31
|
+
pushEvents([pushEvent]);
|
|
32
|
+
// Trigger registered callback for auto-actions
|
|
33
|
+
if (onEventCallback) {
|
|
34
|
+
try {
|
|
35
|
+
onEventCallback(agentId, pushEvent);
|
|
36
|
+
}
|
|
37
|
+
catch { /* callback errors non-fatal */ }
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Ignore malformed messages
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function scheduleReconnect(agentId) {
|
|
45
|
+
const existing = connections.get(agentId);
|
|
46
|
+
if (existing?.reconnectTimeout)
|
|
47
|
+
return; // already scheduled
|
|
48
|
+
const timeout = setTimeout(() => {
|
|
49
|
+
if (connections.has(agentId)) {
|
|
50
|
+
const conn = connections.get(agentId);
|
|
51
|
+
conn.reconnectTimeout = null;
|
|
52
|
+
// Only reconnect if we haven't explicitly disconnected
|
|
53
|
+
connect(agentId);
|
|
54
|
+
}
|
|
55
|
+
}, RECONNECT_DELAY_MS);
|
|
56
|
+
if (existing) {
|
|
57
|
+
existing.reconnectTimeout = timeout;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
// Public API
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
/**
|
|
64
|
+
* Establish WebSocket connection for an Agent.
|
|
65
|
+
*/
|
|
66
|
+
export function connect(agentId) {
|
|
67
|
+
// Close existing connection if any
|
|
68
|
+
const existing = connections.get(agentId);
|
|
69
|
+
if (existing) {
|
|
70
|
+
clearInterval(existing.pingInterval);
|
|
71
|
+
if (existing.reconnectTimeout)
|
|
72
|
+
clearTimeout(existing.reconnectTimeout);
|
|
73
|
+
try {
|
|
74
|
+
existing.ws.close();
|
|
75
|
+
}
|
|
76
|
+
catch { /* ignore */ }
|
|
77
|
+
connections.delete(agentId);
|
|
78
|
+
}
|
|
79
|
+
const url = wsUrl(agentId);
|
|
80
|
+
let ws;
|
|
81
|
+
try {
|
|
82
|
+
ws = new WebSocket(url);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Connection failed — schedule retry
|
|
86
|
+
connections.set(agentId, {
|
|
87
|
+
ws: null,
|
|
88
|
+
agentId,
|
|
89
|
+
pingInterval: setInterval(() => { }, 999999), // placeholder
|
|
90
|
+
reconnectTimeout: null,
|
|
91
|
+
});
|
|
92
|
+
scheduleReconnect(agentId);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const pingInterval = setInterval(() => {
|
|
96
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
97
|
+
ws.send("ping");
|
|
98
|
+
}
|
|
99
|
+
}, PING_INTERVAL_MS);
|
|
100
|
+
const conn = { ws, agentId, pingInterval, reconnectTimeout: null };
|
|
101
|
+
connections.set(agentId, conn);
|
|
102
|
+
ws.on("message", (data) => handleMessage(agentId, data));
|
|
103
|
+
ws.on("close", () => {
|
|
104
|
+
// Auto-reconnect if still in connections map (not explicitly disconnected)
|
|
105
|
+
if (connections.has(agentId)) {
|
|
106
|
+
scheduleReconnect(agentId);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
ws.on("error", () => {
|
|
110
|
+
// Error will be followed by close event — reconnect handled there
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Disconnect a specific Agent's WebSocket.
|
|
115
|
+
*/
|
|
116
|
+
export function disconnect(agentId) {
|
|
117
|
+
const conn = connections.get(agentId);
|
|
118
|
+
if (!conn)
|
|
119
|
+
return;
|
|
120
|
+
clearInterval(conn.pingInterval);
|
|
121
|
+
if (conn.reconnectTimeout)
|
|
122
|
+
clearTimeout(conn.reconnectTimeout);
|
|
123
|
+
try {
|
|
124
|
+
conn.ws.close();
|
|
125
|
+
}
|
|
126
|
+
catch { /* ignore */ }
|
|
127
|
+
connections.delete(agentId);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Disconnect all WebSocket connections.
|
|
131
|
+
*/
|
|
132
|
+
export function disconnectAll() {
|
|
133
|
+
for (const agentId of connections.keys()) {
|
|
134
|
+
disconnect(agentId);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Check if an Agent has an active WebSocket connection.
|
|
139
|
+
*/
|
|
140
|
+
export function isConnected(agentId) {
|
|
141
|
+
const conn = connections.get(agentId);
|
|
142
|
+
return conn !== undefined && conn.ws?.readyState === WebSocket.OPEN;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get all connected agent IDs.
|
|
146
|
+
*/
|
|
147
|
+
export function connectedAgents() {
|
|
148
|
+
return Array.from(connections.keys());
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=ws-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-manager.js","sourceRoot":"","sources":["../../src/ws-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "eacn",
|
|
3
|
+
"name": "EACN Network Plugin",
|
|
4
|
+
"description": "Agent collaboration network — install to go online, uninstall to go offline. Publish tasks, register agents, earn reputation.",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"configSchema": {
|
|
7
|
+
"type": "object",
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"networkEndpoint": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "EACN network URL. Defaults to https://network.eacn.dev"
|
|
13
|
+
},
|
|
14
|
+
"statePath": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"description": "Path to persist local state. Defaults to ~/.eacn/state.json"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"skills": ["./skills"]
|
|
21
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "eacn3",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "EACN network plugin — your digital network card for agent collaboration",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"ai",
|
|
7
|
+
"agent-network",
|
|
8
|
+
"mcp",
|
|
9
|
+
"collaboration",
|
|
10
|
+
"openclaw"
|
|
11
|
+
],
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "git+https://github.com/DataLab-atom/eacn-dev.git"
|
|
16
|
+
},
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=16"
|
|
19
|
+
},
|
|
20
|
+
"type": "module",
|
|
21
|
+
"main": "dist/index.js",
|
|
22
|
+
"openclaw": {
|
|
23
|
+
"extensions": ["./dist/index.js"]
|
|
24
|
+
},
|
|
25
|
+
"bin": {
|
|
26
|
+
"eacn": "scripts/cli.cjs"
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsc",
|
|
30
|
+
"prepublishOnly": "npm run build",
|
|
31
|
+
"postinstall": "node scripts/postinstall.cjs",
|
|
32
|
+
"dev": "tsc --watch",
|
|
33
|
+
"start": "node dist/server.js"
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"openclaw.plugin.json",
|
|
37
|
+
"dist/",
|
|
38
|
+
"plugin/",
|
|
39
|
+
"scripts/",
|
|
40
|
+
"README.md"
|
|
41
|
+
],
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
44
|
+
"ws": "^8.18.0",
|
|
45
|
+
"zod": "^3.24.0"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@types/node": "^22.0.0",
|
|
49
|
+
"@types/ws": "^8.5.0",
|
|
50
|
+
"typescript": "^5.7.0"
|
|
51
|
+
}
|
|
52
|
+
}
|