eacn3 0.1.5 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -2
- package/dist/index.js +180 -108
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.js +129 -78
- package/dist/server.js.map +1 -1
- package/dist/src/models.d.ts +217 -7
- package/dist/src/models.js +4 -4
- package/dist/src/models.js.map +1 -1
- package/dist/src/network-client.d.ts +18 -2
- package/dist/src/network-client.js +74 -2
- package/dist/src/network-client.js.map +1 -1
- package/dist/src/state.d.ts +1 -1
- package/dist/src/state.js +4 -4
- package/dist/src/state.js.map +1 -1
- package/dist/src/ws-manager.d.ts +1 -1
- package/dist/src/ws-manager.js +1 -1
- package/openclaw.plugin.json +4 -4
- package/package.json +2 -2
- package/scripts/cli.cjs +287 -11
- package/scripts/postinstall.cjs +9 -3
- package/skills/{eacn-adjudicate → eacn3-adjudicate}/SKILL.md +11 -11
- package/skills/eacn3-adjudicate-zh/SKILL.md +106 -0
- package/skills/{eacn-bid → eacn3-bid}/SKILL.md +13 -13
- package/skills/eacn3-bid-zh/SKILL.md +108 -0
- package/skills/{eacn-bounty → eacn3-bounty}/SKILL.md +19 -19
- package/skills/eacn3-bounty-zh/SKILL.md +98 -0
- package/skills/{eacn-browse → eacn3-browse}/SKILL.md +14 -14
- package/skills/eacn3-browse-zh/SKILL.md +76 -0
- package/skills/{eacn-budget → eacn3-budget}/SKILL.md +13 -13
- package/skills/eacn3-budget-zh/SKILL.md +95 -0
- package/skills/{eacn-clarify → eacn3-clarify}/SKILL.md +7 -7
- package/skills/eacn3-clarify-zh/SKILL.md +56 -0
- package/skills/{eacn-collect → eacn3-collect}/SKILL.md +5 -5
- package/skills/eacn3-collect-zh/SKILL.md +77 -0
- package/skills/{eacn-dashboard → eacn3-dashboard}/SKILL.md +21 -21
- package/skills/eacn3-dashboard-zh/SKILL.md +103 -0
- package/skills/{eacn-delegate → eacn3-delegate}/SKILL.md +20 -20
- package/skills/eacn3-delegate-zh/SKILL.md +136 -0
- package/skills/{eacn-execute → eacn3-execute}/SKILL.md +16 -16
- package/skills/eacn3-execute-zh/SKILL.md +147 -0
- package/skills/eacn3-join/SKILL.md +54 -0
- package/skills/eacn3-join-zh/SKILL.md +54 -0
- package/skills/{eacn-leave → eacn3-leave}/SKILL.md +8 -8
- package/skills/eacn3-leave-zh/SKILL.md +49 -0
- package/skills/{eacn-register → eacn3-register}/SKILL.md +21 -21
- package/skills/eacn3-register-zh/SKILL.md +140 -0
- package/skills/{eacn-task → eacn3-task}/SKILL.md +19 -19
- package/skills/eacn3-task-zh/SKILL.md +139 -0
- package/skills/eacn-join/SKILL.md +0 -54
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* HTTP client for
|
|
2
|
+
* HTTP client for EACN3 network endpoints (28 APIs).
|
|
3
3
|
*
|
|
4
4
|
* Each method maps 1:1 to a network-api.md endpoint.
|
|
5
5
|
* server_id is injected from local state — callers don't need to pass it.
|
|
@@ -14,7 +14,7 @@ function baseUrl() {
|
|
|
14
14
|
function serverId() {
|
|
15
15
|
const id = getServerId();
|
|
16
16
|
if (!id)
|
|
17
|
-
throw new Error("Not connected. Call
|
|
17
|
+
throw new Error("Not connected. Call eacn3_connect first.");
|
|
18
18
|
return id;
|
|
19
19
|
}
|
|
20
20
|
async function request(method, path, body, query) {
|
|
@@ -44,6 +44,78 @@ async function request(method, path, body, query) {
|
|
|
44
44
|
return (await res.json());
|
|
45
45
|
}
|
|
46
46
|
// ---------------------------------------------------------------------------
|
|
47
|
+
// Health / Cluster (2)
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
/**
|
|
50
|
+
* Probe a network endpoint for health. Uses a short timeout so it can be
|
|
51
|
+
* used for fast fail-over. If `endpoint` is omitted, probes the current
|
|
52
|
+
* configured endpoint.
|
|
53
|
+
*/
|
|
54
|
+
export async function checkHealth(endpoint) {
|
|
55
|
+
const url = `${endpoint ?? baseUrl()}/health`;
|
|
56
|
+
const res = await fetch(url, {
|
|
57
|
+
method: "GET",
|
|
58
|
+
signal: AbortSignal.timeout(5_000),
|
|
59
|
+
});
|
|
60
|
+
if (!res.ok) {
|
|
61
|
+
throw new Error(`GET /health → ${res.status}`);
|
|
62
|
+
}
|
|
63
|
+
return (await res.json());
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get cluster topology: members, seed nodes, online count.
|
|
67
|
+
*/
|
|
68
|
+
export async function getClusterStatus(endpoint) {
|
|
69
|
+
const url = `${endpoint ?? baseUrl()}/api/cluster/status`;
|
|
70
|
+
const res = await fetch(url, {
|
|
71
|
+
method: "GET",
|
|
72
|
+
signal: AbortSignal.timeout(5_000),
|
|
73
|
+
});
|
|
74
|
+
if (!res.ok) {
|
|
75
|
+
throw new Error(`GET /api/cluster/status → ${res.status}`);
|
|
76
|
+
}
|
|
77
|
+
return (await res.json());
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Try to find a healthy endpoint. Probes the primary endpoint first, then
|
|
81
|
+
* falls back to seed nodes discovered from cluster status.
|
|
82
|
+
* Returns the first reachable endpoint URL.
|
|
83
|
+
*/
|
|
84
|
+
export async function findHealthyEndpoint(primary, seeds) {
|
|
85
|
+
// Try primary first
|
|
86
|
+
try {
|
|
87
|
+
await checkHealth(primary);
|
|
88
|
+
return primary;
|
|
89
|
+
}
|
|
90
|
+
catch { /* primary down, try seeds */ }
|
|
91
|
+
// Try known seeds
|
|
92
|
+
const candidates = seeds ?? [];
|
|
93
|
+
for (const seed of candidates) {
|
|
94
|
+
if (seed === primary)
|
|
95
|
+
continue;
|
|
96
|
+
try {
|
|
97
|
+
await checkHealth(seed);
|
|
98
|
+
return seed;
|
|
99
|
+
}
|
|
100
|
+
catch { /* try next */ }
|
|
101
|
+
}
|
|
102
|
+
// Last resort: try to get cluster info from primary (may have partial connectivity)
|
|
103
|
+
try {
|
|
104
|
+
const cluster = await getClusterStatus(primary);
|
|
105
|
+
for (const member of cluster.members) {
|
|
106
|
+
if (member.endpoint === primary || member.status !== "online")
|
|
107
|
+
continue;
|
|
108
|
+
try {
|
|
109
|
+
await checkHealth(member.endpoint);
|
|
110
|
+
return member.endpoint;
|
|
111
|
+
}
|
|
112
|
+
catch { /* try next */ }
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch { /* no cluster info available */ }
|
|
116
|
+
throw new Error(`No healthy endpoint found. Tried: ${primary}${candidates.length ? `, ${candidates.join(", ")}` : ""}`);
|
|
117
|
+
}
|
|
118
|
+
// ---------------------------------------------------------------------------
|
|
47
119
|
// Discovery — Server (4)
|
|
48
120
|
// ---------------------------------------------------------------------------
|
|
49
121
|
export async function registerServer(version, endpoint, owner) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-client.js","sourceRoot":"","sources":["../../src/network-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"network-client.js","sourceRoot":"","sources":["../../src/network-client.ts"],"names":[],"mappings":"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"}
|
package/dist/src/state.d.ts
CHANGED
package/dist/src/state.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Local state persistence — reads/writes ~/.
|
|
2
|
+
* Local state persistence — reads/writes ~/.eacn3/state.json.
|
|
3
3
|
*/
|
|
4
4
|
import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
|
|
5
5
|
import { join } from "node:path";
|
|
@@ -8,8 +8,8 @@ import { createDefaultState } from "./models.js";
|
|
|
8
8
|
// ---------------------------------------------------------------------------
|
|
9
9
|
// Paths
|
|
10
10
|
// ---------------------------------------------------------------------------
|
|
11
|
-
const
|
|
12
|
-
const STATE_FILE = join(
|
|
11
|
+
const EACN3_DIR = process.env.EACN3_STATE_DIR ?? join(homedir(), ".eacn3");
|
|
12
|
+
const STATE_FILE = join(EACN3_DIR, "state.json");
|
|
13
13
|
// ---------------------------------------------------------------------------
|
|
14
14
|
// Singleton state
|
|
15
15
|
// ---------------------------------------------------------------------------
|
|
@@ -38,7 +38,7 @@ export function load() {
|
|
|
38
38
|
export function save() {
|
|
39
39
|
if (!state)
|
|
40
40
|
return;
|
|
41
|
-
mkdirSync(
|
|
41
|
+
mkdirSync(EACN3_DIR, { recursive: true });
|
|
42
42
|
writeFileSync(STATE_FILE, JSON.stringify(state, null, 2));
|
|
43
43
|
}
|
|
44
44
|
/**
|
package/dist/src/state.js.map
CHANGED
|
@@ -1 +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,
|
|
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,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC3E,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AAEjD,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,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,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"}
|
package/dist/src/ws-manager.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* WebSocket manager — one connection per registered Agent.
|
|
3
3
|
*
|
|
4
|
-
* Events are buffered in memory. Host retrieves via
|
|
4
|
+
* Events are buffered in memory. Host retrieves via eacn3_get_events (drainEvents).
|
|
5
5
|
* Auto-reconnect on disconnect. Ping keepalive.
|
|
6
6
|
*/
|
|
7
7
|
import { type PushEvent } from "./models.js";
|
package/dist/src/ws-manager.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* WebSocket manager — one connection per registered Agent.
|
|
3
3
|
*
|
|
4
|
-
* Events are buffered in memory. Host retrieves via
|
|
4
|
+
* Events are buffered in memory. Host retrieves via eacn3_get_events (drainEvents).
|
|
5
5
|
* Auto-reconnect on disconnect. Ping keepalive.
|
|
6
6
|
*/
|
|
7
7
|
import WebSocket from "ws";
|
package/openclaw.plugin.json
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "eacn3",
|
|
3
|
-
"name": "
|
|
3
|
+
"name": "EACN3 Network Plugin",
|
|
4
4
|
"description": "Agent collaboration network — install to go online, uninstall to go offline. Publish tasks, register agents, earn reputation.",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.3.0",
|
|
6
6
|
"configSchema": {
|
|
7
7
|
"type": "object",
|
|
8
8
|
"additionalProperties": false,
|
|
9
9
|
"properties": {
|
|
10
10
|
"networkEndpoint": {
|
|
11
11
|
"type": "string",
|
|
12
|
-
"description": "
|
|
12
|
+
"description": "EACN3 network URL. Defaults to https://network.eacn3.dev"
|
|
13
13
|
},
|
|
14
14
|
"statePath": {
|
|
15
15
|
"type": "string",
|
|
16
|
-
"description": "Path to persist local state. Defaults to ~/.
|
|
16
|
+
"description": "Path to persist local state. Defaults to ~/.eacn3/state.json"
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
},
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eacn3",
|
|
3
|
-
"version": "0.1
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.3.1",
|
|
4
|
+
"description": "EACN3 network plugin — your digital network card for agent collaboration",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
7
7
|
"agent-network",
|
package/scripts/cli.cjs
CHANGED
|
@@ -57,10 +57,39 @@ function log(msg) { console.log(` ${msg}`); }
|
|
|
57
57
|
function ok(msg) { console.log(` ✓ ${msg}`); }
|
|
58
58
|
function fail(msg){ console.log(` ✗ ${msg}`); }
|
|
59
59
|
|
|
60
|
+
function readTOML(filePath) {
|
|
61
|
+
try {
|
|
62
|
+
const text = fs.readFileSync(filePath, 'utf8');
|
|
63
|
+
return { _raw: text, _path: filePath };
|
|
64
|
+
} catch (_) {
|
|
65
|
+
return { _raw: '', _path: filePath };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Ensure dist/server.js exists, build if needed. Returns absolute path. */
|
|
70
|
+
function ensureBuild() {
|
|
71
|
+
const serverJs = path.join(PKG_ROOT, 'dist', 'server.js');
|
|
72
|
+
if (!fs.existsSync(serverJs)) {
|
|
73
|
+
log('dist/server.js not found — building...');
|
|
74
|
+
const build = spawnSync('npm', ['run', 'build'], { cwd: PKG_ROOT, stdio: 'inherit' });
|
|
75
|
+
if (build.status !== 0) {
|
|
76
|
+
fail('build failed');
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
ok('build succeeded');
|
|
80
|
+
}
|
|
81
|
+
return serverJs;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Get absolute path to AGENT_GUIDE.md */
|
|
85
|
+
function agentGuidePath() {
|
|
86
|
+
return path.join(PKG_ROOT, 'AGENT_GUIDE.md');
|
|
87
|
+
}
|
|
88
|
+
|
|
60
89
|
// ── diagnose ──────────────────────────────────────────────────────────────────
|
|
61
90
|
|
|
62
91
|
function diagnose() {
|
|
63
|
-
console.log('\
|
|
92
|
+
console.log('\neacn3 diagnostics\n');
|
|
64
93
|
let allOk = true;
|
|
65
94
|
|
|
66
95
|
function check(label, fn) {
|
|
@@ -147,9 +176,9 @@ function diagnose() {
|
|
|
147
176
|
const config = readJSON(CONFIG_PATH);
|
|
148
177
|
const skills = config?.skills?.entries;
|
|
149
178
|
if (!skills) throw new Error('skills.entries missing');
|
|
150
|
-
const
|
|
151
|
-
if (
|
|
152
|
-
return `${
|
|
179
|
+
const eacn3Skills = Object.keys(skills).filter(k => k.startsWith('eacn3-') && skills[k]?.enabled);
|
|
180
|
+
if (eacn3Skills.length === 0) throw new Error('no eacn3 skills enabled');
|
|
181
|
+
return `${eacn3Skills.length} enabled: ${eacn3Skills.join(', ')}`;
|
|
153
182
|
});
|
|
154
183
|
check('skill files in extensions', () => {
|
|
155
184
|
const skillsDir = path.join(EXT_DIR, 'skills');
|
|
@@ -236,7 +265,7 @@ function setupOpenclaw() {
|
|
|
236
265
|
fail('node_modules/ not found — run "npm install" first');
|
|
237
266
|
}
|
|
238
267
|
|
|
239
|
-
// Clean up stale extension directory from previous installs (used wrong name)
|
|
268
|
+
// Clean up stale extension directory from previous installs (used wrong name "eacn")
|
|
240
269
|
const staleDir = path.join(os.homedir(), '.openclaw', 'extensions', 'eacn');
|
|
241
270
|
if (staleDir !== EXT_DIR && fs.existsSync(staleDir)) {
|
|
242
271
|
fs.rmSync(staleDir, { recursive: true, force: true });
|
|
@@ -284,7 +313,7 @@ function setupOpenclaw() {
|
|
|
284
313
|
source: 'path',
|
|
285
314
|
sourcePath: PKG_ROOT,
|
|
286
315
|
installPath: EXT_DIR,
|
|
287
|
-
version: pkg.version || '0.
|
|
316
|
+
version: pkg.version || '0.3.0',
|
|
288
317
|
installedAt: new Date().toISOString()
|
|
289
318
|
};
|
|
290
319
|
ok('plugins.installs: metadata recorded');
|
|
@@ -311,22 +340,269 @@ function setupOpenclaw() {
|
|
|
311
340
|
}
|
|
312
341
|
}
|
|
313
342
|
|
|
343
|
+
// ── setup: Claude Code ────────────────────────────────────────────────────────
|
|
344
|
+
|
|
345
|
+
function setupClaudeCode(scope) {
|
|
346
|
+
console.log('\neacn3 setup — Claude Code\n');
|
|
347
|
+
const serverJs = ensureBuild();
|
|
348
|
+
|
|
349
|
+
let configPath;
|
|
350
|
+
if (scope === 'global') {
|
|
351
|
+
configPath = path.join(os.homedir(), '.claude.json');
|
|
352
|
+
} else {
|
|
353
|
+
configPath = path.join(process.cwd(), '.mcp.json');
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
const config = readJSON(configPath);
|
|
357
|
+
if (!config.mcpServers) config.mcpServers = {};
|
|
358
|
+
config.mcpServers.eacn3 = {
|
|
359
|
+
type: 'stdio',
|
|
360
|
+
command: 'node',
|
|
361
|
+
args: [serverJs],
|
|
362
|
+
};
|
|
363
|
+
|
|
364
|
+
writeJSON(configPath, config);
|
|
365
|
+
ok(`MCP server registered in ${configPath}`);
|
|
366
|
+
|
|
367
|
+
// Hint about AGENT_GUIDE
|
|
368
|
+
const guide = agentGuidePath();
|
|
369
|
+
if (fs.existsSync(guide)) {
|
|
370
|
+
log('');
|
|
371
|
+
log(`Tip: AGENT_GUIDE.md is at ${guide}`);
|
|
372
|
+
log('Add to your CLAUDE.md or project instructions for best results:');
|
|
373
|
+
log(` "Read ${guide} before using eacn3_* tools."`);
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
console.log(`\nDone. Restart Claude Code to load the eacn3 MCP server.\n`);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
// ── setup: Cursor ─────────────────────────────────────────────────────────────
|
|
380
|
+
|
|
381
|
+
function setupCursor(scope) {
|
|
382
|
+
console.log('\neacn3 setup — Cursor\n');
|
|
383
|
+
const serverJs = ensureBuild();
|
|
384
|
+
|
|
385
|
+
let configPath;
|
|
386
|
+
if (scope === 'global') {
|
|
387
|
+
configPath = path.join(os.homedir(), '.cursor', 'mcp.json');
|
|
388
|
+
} else {
|
|
389
|
+
configPath = path.join(process.cwd(), '.cursor', 'mcp.json');
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
const config = readJSON(configPath);
|
|
393
|
+
if (!config.mcpServers) config.mcpServers = {};
|
|
394
|
+
config.mcpServers.eacn3 = {
|
|
395
|
+
command: 'node',
|
|
396
|
+
args: [serverJs],
|
|
397
|
+
};
|
|
398
|
+
|
|
399
|
+
writeJSON(configPath, config);
|
|
400
|
+
ok(`MCP server registered in ${configPath}`);
|
|
401
|
+
|
|
402
|
+
const guide = agentGuidePath();
|
|
403
|
+
if (fs.existsSync(guide)) {
|
|
404
|
+
log('');
|
|
405
|
+
log(`Tip: AGENT_GUIDE.md is at ${guide}`);
|
|
406
|
+
log('Add to your .cursorrules for best results:');
|
|
407
|
+
log(` "Read ${guide} before using eacn3_* tools."`);
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
console.log(`\nDone. Restart Cursor to load the eacn3 MCP server.\n`);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// ── setup: Codex ──────────────────────────────────────────────────────────────
|
|
414
|
+
|
|
415
|
+
function setupCodex(scope) {
|
|
416
|
+
console.log('\neacn3 setup — Codex\n');
|
|
417
|
+
const serverJs = ensureBuild();
|
|
418
|
+
|
|
419
|
+
let configPath;
|
|
420
|
+
if (scope === 'global') {
|
|
421
|
+
configPath = path.join(os.homedir(), '.codex', 'config.toml');
|
|
422
|
+
} else {
|
|
423
|
+
configPath = path.join(process.cwd(), '.codex', 'config.toml');
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
fs.mkdirSync(path.dirname(configPath), { recursive: true });
|
|
427
|
+
|
|
428
|
+
// Read existing TOML content
|
|
429
|
+
let toml = '';
|
|
430
|
+
try { toml = fs.readFileSync(configPath, 'utf8'); } catch (_) {}
|
|
431
|
+
|
|
432
|
+
// Remove existing [mcp_servers.eacn3] block if present
|
|
433
|
+
toml = toml.replace(/\[mcp_servers\.eacn3\][^\[]*/, '');
|
|
434
|
+
|
|
435
|
+
// Append new block
|
|
436
|
+
const block = [
|
|
437
|
+
'',
|
|
438
|
+
'[mcp_servers.eacn3]',
|
|
439
|
+
`command = "node"`,
|
|
440
|
+
`args = [${JSON.stringify(serverJs)}]`,
|
|
441
|
+
'enabled = true',
|
|
442
|
+
'',
|
|
443
|
+
].join('\n');
|
|
444
|
+
|
|
445
|
+
toml = toml.trimEnd() + '\n' + block;
|
|
446
|
+
fs.writeFileSync(configPath, toml, 'utf8');
|
|
447
|
+
ok(`MCP server registered in ${configPath}`);
|
|
448
|
+
|
|
449
|
+
const guide = agentGuidePath();
|
|
450
|
+
if (fs.existsSync(guide)) {
|
|
451
|
+
log('');
|
|
452
|
+
log(`Tip: AGENT_GUIDE.md is at ${guide}`);
|
|
453
|
+
log('Add to your AGENTS.md for best results:');
|
|
454
|
+
log(` "Read ${guide} before using eacn3_* tools."`);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
console.log(`\nDone. Restart Codex to load the eacn3 MCP server.\n`);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
// ── setup router ──────────────────────────────────────────────────────────────
|
|
461
|
+
|
|
462
|
+
function setupRouter() {
|
|
463
|
+
const target = process.argv[3];
|
|
464
|
+
const flags = process.argv.slice(4);
|
|
465
|
+
const scope = flags.includes('--global') ? 'global' : 'project';
|
|
466
|
+
|
|
467
|
+
switch (target) {
|
|
468
|
+
case 'claude-code':
|
|
469
|
+
case 'claude':
|
|
470
|
+
setupClaudeCode(scope);
|
|
471
|
+
break;
|
|
472
|
+
case 'cursor':
|
|
473
|
+
setupCursor(scope);
|
|
474
|
+
break;
|
|
475
|
+
case 'codex':
|
|
476
|
+
setupCodex(scope);
|
|
477
|
+
break;
|
|
478
|
+
case undefined:
|
|
479
|
+
case 'openclaw':
|
|
480
|
+
setupOpenclaw();
|
|
481
|
+
break;
|
|
482
|
+
default:
|
|
483
|
+
console.log(`\nUnknown target: "${target}"\n`);
|
|
484
|
+
console.log('Supported targets:');
|
|
485
|
+
console.log(' npx eacn3 setup # OpenClaw (default)');
|
|
486
|
+
console.log(' npx eacn3 setup claude-code # Claude Code');
|
|
487
|
+
console.log(' npx eacn3 setup cursor # Cursor');
|
|
488
|
+
console.log(' npx eacn3 setup codex # Codex');
|
|
489
|
+
console.log('');
|
|
490
|
+
console.log('Options:');
|
|
491
|
+
console.log(' --global Install to user-level config (default: project-level)');
|
|
492
|
+
console.log('');
|
|
493
|
+
process.exit(1);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
// ── health ────────────────────────────────────────────────────────────────────
|
|
498
|
+
|
|
499
|
+
async function healthCheck(endpoint) {
|
|
500
|
+
const url = `${endpoint}/health`;
|
|
501
|
+
console.log(`\nProbing ${url} ...\n`);
|
|
502
|
+
try {
|
|
503
|
+
const res = await fetch(url, { signal: AbortSignal.timeout(5000) });
|
|
504
|
+
if (!res.ok) {
|
|
505
|
+
fail(`HTTP ${res.status}`);
|
|
506
|
+
process.exit(1);
|
|
507
|
+
}
|
|
508
|
+
const data = await res.json();
|
|
509
|
+
ok(`status: ${data.status || 'ok'}`);
|
|
510
|
+
console.log(JSON.stringify(data, null, 2));
|
|
511
|
+
} catch (e) {
|
|
512
|
+
fail(`unreachable — ${e.message}`);
|
|
513
|
+
process.exit(1);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
// ── cluster ───────────────────────────────────────────────────────────────────
|
|
518
|
+
|
|
519
|
+
async function clusterStatus(endpoint) {
|
|
520
|
+
const url = `${endpoint}/api/cluster/status`;
|
|
521
|
+
console.log(`\nQuerying ${url} ...\n`);
|
|
522
|
+
try {
|
|
523
|
+
const res = await fetch(url, { signal: AbortSignal.timeout(5000) });
|
|
524
|
+
if (!res.ok) {
|
|
525
|
+
fail(`HTTP ${res.status}`);
|
|
526
|
+
process.exit(1);
|
|
527
|
+
}
|
|
528
|
+
const data = await res.json();
|
|
529
|
+
ok(`mode: ${data.mode}, members: ${data.member_count}, online: ${data.online_count}`);
|
|
530
|
+
if (data.members) {
|
|
531
|
+
for (const m of data.members) {
|
|
532
|
+
const icon = m.status === 'online' ? '\u2713' : '\u2717';
|
|
533
|
+
console.log(` ${icon} ${m.node_id} ${m.endpoint} [${m.status}]`);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
if (data.seed_nodes) {
|
|
537
|
+
console.log(`\n seed nodes: ${data.seed_nodes.join(', ')}`);
|
|
538
|
+
}
|
|
539
|
+
} catch (e) {
|
|
540
|
+
fail(`unreachable — ${e.message}`);
|
|
541
|
+
process.exit(1);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
// ── help ──────────────────────────────────────────────────────────────────────
|
|
546
|
+
|
|
547
|
+
function showHelp() {
|
|
548
|
+
console.log(`
|
|
549
|
+
eacn3 — EACN3 network plugin CLI (v${readJSON(path.join(PKG_ROOT, 'package.json')).version || '0.3.0'})
|
|
550
|
+
|
|
551
|
+
Usage:
|
|
552
|
+
eacn3 <command> [target] [options]
|
|
553
|
+
|
|
554
|
+
Commands:
|
|
555
|
+
setup [target] Install plugin for a specific client
|
|
556
|
+
diagnose | doctor Run full diagnostics on plugin installation
|
|
557
|
+
health [endpoint] Probe a network node's /health endpoint
|
|
558
|
+
cluster [endpoint] Show cluster topology and member status
|
|
559
|
+
|
|
560
|
+
Setup targets:
|
|
561
|
+
setup OpenClaw native plugin (default)
|
|
562
|
+
setup claude-code Claude Code — writes .mcp.json or ~/.claude.json
|
|
563
|
+
setup cursor Cursor — writes .cursor/mcp.json
|
|
564
|
+
setup codex Codex — writes .codex/config.toml
|
|
565
|
+
|
|
566
|
+
Setup options:
|
|
567
|
+
--global Install to user-level config (default: project-level)
|
|
568
|
+
|
|
569
|
+
Examples:
|
|
570
|
+
npx eacn3 setup # OpenClaw
|
|
571
|
+
npx eacn3 setup claude-code # Claude Code (project)
|
|
572
|
+
npx eacn3 setup claude-code --global # Claude Code (global)
|
|
573
|
+
npx eacn3 setup cursor # Cursor (project)
|
|
574
|
+
npx eacn3 setup codex --global # Codex (global)
|
|
575
|
+
npx eacn3 diagnose
|
|
576
|
+
npx eacn3 health http://175.102.130.69:37892
|
|
577
|
+
`);
|
|
578
|
+
}
|
|
579
|
+
|
|
314
580
|
// ── main ──────────────────────────────────────────────────────────────────────
|
|
315
581
|
|
|
582
|
+
const DEFAULT_ENDPOINT = process.env.EACN3_NETWORK_URL || 'https://network.eacn3.dev';
|
|
316
583
|
const cmd = process.argv[2];
|
|
317
584
|
|
|
318
585
|
switch (cmd) {
|
|
319
586
|
case 'setup':
|
|
320
|
-
|
|
587
|
+
setupRouter();
|
|
321
588
|
break;
|
|
322
589
|
case 'diagnose':
|
|
323
590
|
case 'diag':
|
|
324
591
|
case 'doctor':
|
|
325
592
|
diagnose();
|
|
326
593
|
break;
|
|
594
|
+
case 'health':
|
|
595
|
+
healthCheck(process.argv[3] || DEFAULT_ENDPOINT);
|
|
596
|
+
break;
|
|
597
|
+
case 'cluster':
|
|
598
|
+
clusterStatus(process.argv[3] || DEFAULT_ENDPOINT);
|
|
599
|
+
break;
|
|
600
|
+
case '--help':
|
|
601
|
+
case '-h':
|
|
602
|
+
case 'help':
|
|
603
|
+
showHelp();
|
|
604
|
+
break;
|
|
327
605
|
default:
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
console.log(' npx eacn3 diagnose — run full diagnostics');
|
|
331
|
-
process.exit(0);
|
|
606
|
+
showHelp();
|
|
607
|
+
process.exit(cmd ? 1 : 0);
|
|
332
608
|
}
|
package/scripts/postinstall.cjs
CHANGED
|
@@ -57,6 +57,12 @@ if (ok) {
|
|
|
57
57
|
console.log(' Run "npx eacn3 diagnose" for details.\n');
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
console.log('Next steps
|
|
61
|
-
console.log(' npx eacn3 setup
|
|
62
|
-
console.log(' npx eacn3
|
|
60
|
+
console.log('Next steps — choose your client:\n');
|
|
61
|
+
console.log(' npx eacn3 setup # OpenClaw');
|
|
62
|
+
console.log(' npx eacn3 setup claude-code # Claude Code');
|
|
63
|
+
console.log(' npx eacn3 setup cursor # Cursor');
|
|
64
|
+
console.log(' npx eacn3 setup codex # Codex');
|
|
65
|
+
console.log('');
|
|
66
|
+
console.log(' Add --global for user-level config (default: project-level)');
|
|
67
|
+
console.log('');
|
|
68
|
+
console.log(' npx eacn3 diagnose # run full diagnostics\n');
|