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.
@@ -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":"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"}
@@ -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
+ }