@mcsherrylabs/evolver-mcp 0.8.9 → 0.9.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/deploy/docker-compose.yml +13 -6
- package/dist/install.d.ts +40 -8
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +93 -26
- package/dist/install.js.map +1 -1
- package/package.json +1 -1
|
@@ -75,17 +75,24 @@ services:
|
|
|
75
75
|
retries: 30
|
|
76
76
|
start_period: 30s
|
|
77
77
|
# ⚠️ PUBLISHED LOOPBACK-ONLY (B1: the frictionless single-box install path). The host-side
|
|
78
|
-
# `npx … install` bootstrap reaches the node at http://127.0.0.1
|
|
79
|
-
# http://127.0.0.1
|
|
80
|
-
# 127.0.0.1` keeps both listeners local, and the
|
|
81
|
-
# (they are for PEERS, reached over the compose
|
|
78
|
+
# `npx … install` bootstrap reaches the node at http://127.0.0.1:${EVOLVER_HOST_HTTP_PORT:-8440}
|
|
79
|
+
# (chain API) and http://127.0.0.1:${EVOLVER_HOST_CONTENT_PORT:-8450} (content) after `up -d
|
|
80
|
+
# node`. Nothing leaves the machine: `host_ip: 127.0.0.1` keeps both listeners local, and the
|
|
81
|
+
# node's p2p/TLS listeners stay unpublished (they are for PEERS, reached over the compose
|
|
82
|
+
# network's DNS).
|
|
83
|
+
#
|
|
84
|
+
# TWO NODES ON ONE HOST: the node ALWAYS binds 8440/8450 internally (node.conf, baked into the
|
|
85
|
+
# image — not env-overridable), so `target` stays fixed at those; only the PUBLISHED host port
|
|
86
|
+
# varies. Give a second install non-clashing host ports via
|
|
87
|
+
# EVOLVER_HOST_HTTP_PORT=8442 EVOLVER_HOST_CONTENT_PORT=8451 COMPOSE_PROJECT_NAME=evolver-mcp2
|
|
88
|
+
# and `install` must be run with the SAME two values (it polls + bootstraps against them).
|
|
82
89
|
ports:
|
|
83
90
|
- target: 8440
|
|
84
|
-
published: "8440"
|
|
91
|
+
published: "${EVOLVER_HOST_HTTP_PORT:-8440}"
|
|
85
92
|
host_ip: 127.0.0.1
|
|
86
93
|
protocol: tcp
|
|
87
94
|
- target: 8450
|
|
88
|
-
published: "8450"
|
|
95
|
+
published: "${EVOLVER_HOST_CONTENT_PORT:-8450}"
|
|
89
96
|
host_ip: 127.0.0.1
|
|
90
97
|
protocol: tcp
|
|
91
98
|
|
package/dist/install.d.ts
CHANGED
|
@@ -1,17 +1,39 @@
|
|
|
1
|
+
/** Host-published chain-API port (matches deploy/docker-compose.yml `EVOLVER_HOST_HTTP_PORT`). */
|
|
2
|
+
declare const LOCAL_HTTP_PORT: () => string;
|
|
3
|
+
/** Host-published content-listener port (matches `EVOLVER_HOST_CONTENT_PORT`). */
|
|
4
|
+
declare const LOCAL_CONTENT_PORT: () => string;
|
|
5
|
+
declare const LOCAL_CHAIN_URL: () => string;
|
|
6
|
+
export { LOCAL_CHAIN_URL, LOCAL_CONTENT_PORT, LOCAL_HTTP_PORT };
|
|
1
7
|
/** The WELL-FUNDED faucet origin that sponsors the AGENT identity claim. The node the install
|
|
2
8
|
* starts is a fresh follower with an empty wallet, so it cannot sponsor the claim (it would
|
|
3
9
|
* answer `node_underfunded`, need 5100 tokens). Chain reads go to the local node; the CLAIM — and
|
|
4
10
|
* only the claim — goes to this funded devnet entry. Mirrors the compose's `DEVNET_API` default. */
|
|
5
11
|
declare const FAUCET_DEFAULT_URL = "https://devnet.mcsherrylabs.com";
|
|
6
12
|
export { FAUCET_DEFAULT_URL };
|
|
7
|
-
/**
|
|
8
|
-
*
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
/** Result of parsing the install command line: the convenience flags, and the bootstrap-shaped
|
|
14
|
+
* argv (`[node, script, --target, local, …]`) to forward to runBootstrap. */
|
|
15
|
+
export interface InstallArgs {
|
|
16
|
+
readonly mcpHome: string | undefined;
|
|
17
|
+
readonly fresh: boolean;
|
|
18
|
+
readonly rest: string[];
|
|
19
|
+
}
|
|
20
|
+
export declare function parseInstallArgs(argv: string[]): InstallArgs;
|
|
21
|
+
/** List `evolver-mcp*` compose project names via `docker compose ls -a`. Runs the daemon CLI; returns
|
|
22
|
+
* [] on any failure (the `--new` path then falls back to a fresh N=2, still safe). */
|
|
23
|
+
export declare function listEvolverMcpProjects(): string[];
|
|
24
|
+
/** Chosen project name + host ports for this install. `project` derives N where
|
|
25
|
+
* http=8440+2*(N-1) and content=8450+2*(N-1); the `evolver-mcp` base is N=1 (default, no `--new`).
|
|
26
|
+
* `--new` scans existing `evolver-mcp*` projects and picks the next free N. */
|
|
27
|
+
export interface NodeAssignment {
|
|
28
|
+
readonly project: string;
|
|
29
|
+
readonly httpPort: string;
|
|
30
|
+
readonly contentPort: string;
|
|
31
|
+
}
|
|
32
|
+
/** Pick a free project name + port pair. With `fresh` (i.e. `--new`), scan `existing` project names
|
|
33
|
+
* and select `evolver-mcp<n>` where n = 1 + the highest existing numeric suffix (base name counts
|
|
34
|
+
* as 1), then derive host ports by the same index. Explicit env overrides (http/content port) are
|
|
35
|
+
* applied by the CALLER so the operator can still pin a specific N or ports. */
|
|
36
|
+
export declare function assignNode(fresh: boolean, existing: readonly string[], httpEnv?: string, contentEnv?: string): NodeAssignment;
|
|
15
37
|
interface InstallEnv {
|
|
16
38
|
/** Override the shipped compose file path (default: `../deploy/docker-compose.yml` beside dist). */
|
|
17
39
|
EVOLVER_INSTALL_COMPOSE?: string;
|
|
@@ -21,10 +43,20 @@ interface InstallEnv {
|
|
|
21
43
|
EVOLVER_INSTALL_HEALTH_URL?: string;
|
|
22
44
|
/** Chain-API URL the bootstrap reads from (default LOCAL_CHAIN_URL = local node loopback). */
|
|
23
45
|
EVOLVER_NODE?: string;
|
|
46
|
+
/** Content-listener URL the bootstrap derives (default loopback content port). */
|
|
47
|
+
EVOLVER_CONTENT_URL?: string;
|
|
48
|
+
/** Host-published chain-API port for THIS node (default 8440; vary for a 2nd node). */
|
|
49
|
+
EVOLVER_HOST_HTTP_PORT?: string;
|
|
50
|
+
/** Host-published content port for THIS node (default 8450; vary for a 2nd node). */
|
|
51
|
+
EVOLVER_HOST_CONTENT_PORT?: string;
|
|
24
52
|
/** Funded faucet origin for the AGENT identity claim (default devnet). */
|
|
25
53
|
EVOLVER_FAUCET_URL?: string;
|
|
26
54
|
/** Explicit bootstrap state dir (overrides `--mcp-home`'s derived default). */
|
|
27
55
|
EVOLVER_MCP_STATE_DIR?: string;
|
|
56
|
+
/** Comma-separated existing `evolver-mcp*` project names (test seam) for `--new` auto-pick. */
|
|
57
|
+
EVOLVER_INSTALL_PROJECTS?: string;
|
|
58
|
+
/** Explicit compose project name (overrides the auto-picked name). */
|
|
59
|
+
COMPOSE_PROJECT_NAME?: string;
|
|
28
60
|
}
|
|
29
61
|
export interface InstallResult {
|
|
30
62
|
readonly exitCode: number;
|
package/dist/install.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AA4BA,kGAAkG;AAClG,QAAA,MAAM,eAAe,cAA6D,CAAC;AACnF,kFAAkF;AAClF,QAAA,MAAM,kBAAkB,cAAgE,CAAC;AACzF,QAAA,MAAM,eAAe,cAAyD,CAAC;AAE/E,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,eAAe,EAAE,CAAC;AAEhE;;;qGAGqG;AACrG,QAAA,MAAM,kBAAkB,oCAAoC,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAY9B;8EAC8E;AAC9E,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;CACzB;AACD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAyB5D;AAED;uFACuF;AACvF,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAUjD;AAMD;;gFAEgF;AAChF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;;iFAGiF;AACjF,wBAAgB,UAAU,CACxB,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,OAAO,CAAC,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,GAClB,cAAc,CAqBhB;AASD,UAAU,UAAU;IAClB,oGAAoG;IACpG,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,kDAAkD;IAClD,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,kGAAkG;IAClG,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,8FAA8F;IAC9F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kFAAkF;IAClF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,uFAAuF;IACvF,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qFAAqF;IACrF,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,0EAA0E;IAC1E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,+EAA+E;IAC/E,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,+FAA+F;IAC/F,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,sEAAsE;IACtE,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAIvE;AAED,+FAA+F;AAC/F,wBAAgB,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,6FAA6F;AAC7F,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,UAAU,GAClC,OAAO,CAAC,aAAa,CAAC,CA0FxB"}
|
package/dist/install.js
CHANGED
|
@@ -23,8 +23,13 @@ import { fileURLToPath } from "node:url";
|
|
|
23
23
|
import { runBootstrap } from "./bootstrap.js";
|
|
24
24
|
/** The node's chain-API host the install bootstrap targets, per B1 (loopback publish). */
|
|
25
25
|
const LOCAL_NODE_HOST = "127.0.0.1";
|
|
26
|
-
|
|
26
|
+
/** Host-published chain-API port (matches deploy/docker-compose.yml `EVOLVER_HOST_HTTP_PORT`). */
|
|
27
|
+
const LOCAL_HTTP_PORT = () => process.env.EVOLVER_HOST_HTTP_PORT?.trim() || "8440";
|
|
28
|
+
/** Host-published content-listener port (matches `EVOLVER_HOST_CONTENT_PORT`). */
|
|
29
|
+
const LOCAL_CONTENT_PORT = () => process.env.EVOLVER_HOST_CONTENT_PORT?.trim() || "8450";
|
|
30
|
+
const LOCAL_CHAIN_URL = () => `http://${LOCAL_NODE_HOST}:${LOCAL_HTTP_PORT()}`;
|
|
27
31
|
const HEALTH_PATH = "/api/explorer/blocks?limit=1";
|
|
32
|
+
export { LOCAL_CHAIN_URL, LOCAL_CONTENT_PORT, LOCAL_HTTP_PORT };
|
|
28
33
|
/** The WELL-FUNDED faucet origin that sponsors the AGENT identity claim. The node the install
|
|
29
34
|
* starts is a fresh follower with an empty wallet, so it cannot sponsor the claim (it would
|
|
30
35
|
* answer `node_underfunded`, need 5100 tokens). Chain reads go to the local node; the CLAIM — and
|
|
@@ -35,38 +40,86 @@ export { FAUCET_DEFAULT_URL };
|
|
|
35
40
|
* machine where `install` runs (Claude in a container with a bind-mounted `$HOME`). Unset means
|
|
36
41
|
* "same machine, same `$HOME`" — the default, and the correct non-container case. */
|
|
37
42
|
const MCP_HOME_FLAG = "--mcp-home";
|
|
38
|
-
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
|
|
42
|
-
export function
|
|
43
|
+
/** `--new`: instead of using/creating the default `evolver-mcp` project, AUTO-PICK a free project
|
|
44
|
+
* name (`evolver-mcp<n>`) and clashing-free host ports (8440→8442→8444…, 8450→8451→8453…), so a
|
|
45
|
+
* second (or Nth) independent node needs no manual port/project typing. Explicit env vars still win. */
|
|
46
|
+
const NEW_FLAG = "--new";
|
|
47
|
+
export function parseInstallArgs(argv) {
|
|
43
48
|
let mcpHome;
|
|
49
|
+
let fresh = false;
|
|
44
50
|
const rest = [];
|
|
45
51
|
for (let i = 0; i < argv.length; i++) {
|
|
46
52
|
const a = argv[i];
|
|
47
53
|
if (a === MCP_HOME_FLAG) {
|
|
48
54
|
mcpHome = argv[++i];
|
|
49
55
|
if (mcpHome === undefined)
|
|
50
|
-
return { mcpHome: undefined, rest: argv };
|
|
56
|
+
return { mcpHome: undefined, fresh, rest: argv };
|
|
51
57
|
continue;
|
|
52
58
|
}
|
|
53
59
|
if (a.startsWith(`${MCP_HOME_FLAG}=`)) {
|
|
54
60
|
mcpHome = a.slice(MCP_HOME_FLAG.length + 1);
|
|
55
61
|
continue;
|
|
56
62
|
}
|
|
63
|
+
if (a === NEW_FLAG) {
|
|
64
|
+
fresh = true;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
57
67
|
if (a === "install")
|
|
58
68
|
continue; // the subcommand token, not a bootstrap flag
|
|
59
69
|
rest.push(a);
|
|
60
70
|
}
|
|
61
|
-
// Force the local target: install always bootstraps against the node it just started. Skip only
|
|
62
|
-
// if the operator already named one (their choice wins — but a non-local target would be wrong).
|
|
63
71
|
const targetIdx = rest.indexOf("--target");
|
|
64
72
|
const hasTarget = targetIdx >= 0 || rest.some((x) => x.startsWith("--target="));
|
|
65
73
|
if (!hasTarget) {
|
|
66
|
-
// insert after [node, script] (indices 0,1) so parseBootstrapArgs picks it up at index 2+
|
|
67
74
|
rest.splice(2, 0, "--target", "local");
|
|
68
75
|
}
|
|
69
|
-
return { mcpHome, rest };
|
|
76
|
+
return { mcpHome, fresh, rest };
|
|
77
|
+
}
|
|
78
|
+
/** List `evolver-mcp*` compose project names via `docker compose ls -a`. Runs the daemon CLI; returns
|
|
79
|
+
* [] on any failure (the `--new` path then falls back to a fresh N=2, still safe). */
|
|
80
|
+
export function listEvolverMcpProjects() {
|
|
81
|
+
const r = spawnSync("docker", ["compose", "ls", "-a"], { encoding: "utf8" });
|
|
82
|
+
if (r.status !== 0)
|
|
83
|
+
return [];
|
|
84
|
+
const out = r.stdout || "";
|
|
85
|
+
const names = [];
|
|
86
|
+
for (const line of out.split("\n")) {
|
|
87
|
+
const m = /^(evolver-mcp\d*)\s/.exec(line.trimStart());
|
|
88
|
+
if (m)
|
|
89
|
+
names.push(m[1]);
|
|
90
|
+
}
|
|
91
|
+
return names;
|
|
92
|
+
}
|
|
93
|
+
const BASE_PROJECT_NAME = "evolver-mcp";
|
|
94
|
+
const HTTP_PORT_BASE = 8440;
|
|
95
|
+
const CONTENT_PORT_BASE = 8450;
|
|
96
|
+
/** Pick a free project name + port pair. With `fresh` (i.e. `--new`), scan `existing` project names
|
|
97
|
+
* and select `evolver-mcp<n>` where n = 1 + the highest existing numeric suffix (base name counts
|
|
98
|
+
* as 1), then derive host ports by the same index. Explicit env overrides (http/content port) are
|
|
99
|
+
* applied by the CALLER so the operator can still pin a specific N or ports. */
|
|
100
|
+
export function assignNode(fresh, existing, httpEnv, contentEnv) {
|
|
101
|
+
if (httpEnv !== undefined || contentEnv !== undefined) {
|
|
102
|
+
// Operator pinned a port (or both): honor it verbatim; keep the project name decision below.
|
|
103
|
+
// A pin means they want THIS node on a specific port; still bump N if `fresh`.
|
|
104
|
+
}
|
|
105
|
+
let n = 1;
|
|
106
|
+
if (fresh) {
|
|
107
|
+
const suffixes = [1]; // the base name occupies index 1
|
|
108
|
+
const re = new RegExp(`^${BASE_PROJECT_NAME}(\\d*)$`);
|
|
109
|
+
for (const name of existing) {
|
|
110
|
+
const m = re.exec(name);
|
|
111
|
+
if (!m)
|
|
112
|
+
continue;
|
|
113
|
+
const s = m[1] === "" ? 1 : Number(m[1]);
|
|
114
|
+
if (Number.isFinite(s) && s > 0)
|
|
115
|
+
suffixes.push(s);
|
|
116
|
+
}
|
|
117
|
+
n = Math.max(...suffixes) + 1;
|
|
118
|
+
}
|
|
119
|
+
const project = n === 1 ? BASE_PROJECT_NAME : `${BASE_PROJECT_NAME}${n}`;
|
|
120
|
+
const httpPort = httpEnv?.trim() || String(HTTP_PORT_BASE + 2 * (n - 1));
|
|
121
|
+
const contentPort = contentEnv?.trim() || String(CONTENT_PORT_BASE + 2 * (n - 1));
|
|
122
|
+
return { project, httpPort, contentPort };
|
|
70
123
|
}
|
|
71
124
|
/** Translate a `--mcp-home` value into the `EVOLVER_MCP_STATE_DIR` the bootstrap should derive,
|
|
72
125
|
* i.e. `<home>/.local/state/evolver-mcp/local` (mirroring stateDirFor's default). Only a
|
|
@@ -95,18 +148,32 @@ export async function runInstall(argv, env) {
|
|
|
95
148
|
output: `install: the node compose file is missing at ${composeFile} — the published package must ship deploy/ (see package.json "files").\n`,
|
|
96
149
|
};
|
|
97
150
|
}
|
|
98
|
-
// Parse `--mcp-home` (and the `install` token / forced `--target local`) up front, so a
|
|
99
|
-
// flag fails fast instead of after the node boot.
|
|
100
|
-
const { mcpHome, rest } =
|
|
151
|
+
// Parse `--mcp-home` / `--new` (and the `install` token / forced `--target local`) up front, so a
|
|
152
|
+
// malformed flag fails fast instead of after the node boot.
|
|
153
|
+
const { mcpHome, fresh, rest } = parseInstallArgs(argv);
|
|
101
154
|
if (argv.includes(MCP_HOME_FLAG) && (mcpHome === undefined || mcpHome.trim() === "")) {
|
|
102
155
|
return { exitCode: 1, toStderr: true, output: `install: ${MCP_HOME_FLAG} needs a value (Claude's $HOME, e.g. /home/rig)\n` };
|
|
103
156
|
}
|
|
157
|
+
// Decide WHERE this node lives: default project `evolver-mcp` on 8440/8450; `--new` auto-picks the
|
|
158
|
+
// next project name + non-clashing host ports from what is already deployed. Explicit env vars
|
|
159
|
+
// (EVOLVER_HOST_HTTP_PORT / EVOLVER_HOST_CONTENT_PORT / COMPOSE_PROJECT_NAME) always override.
|
|
160
|
+
const existing = fresh ? (env.EVOLVER_INSTALL_PROJECTS?.split(",").map((s) => s.trim()).filter(Boolean) ?? listEvolverMcpProjects()) : [];
|
|
161
|
+
const assignment = assignNode(fresh, existing, env.EVOLVER_HOST_HTTP_PORT, env.EVOLVER_HOST_CONTENT_PORT);
|
|
162
|
+
// A pinned COMPOSE_PROJECT_NAME (operator-set) wins over the auto-picked project.
|
|
163
|
+
const projectName = env.COMPOSE_PROJECT_NAME?.trim() || assignment.project;
|
|
104
164
|
// 1. Start the follower node (claims its own identity on devnet, then syncs from block 0).
|
|
105
165
|
// `--build` builds the config-bearing image (deploy/Dockerfile) on first use; the config is
|
|
106
|
-
// baked in, so no host bind-mount and no checkout-path dependency.
|
|
166
|
+
// baked in, so no host bind-mount and no checkout-path dependency. The project name + host
|
|
167
|
+
// ports are the SAME values the compose file consumes, so a second node is fully self-contained.
|
|
107
168
|
const up = spawnSync("docker", ["compose", "-f", composeFile, "up", "-d", "--build", "node"], {
|
|
108
169
|
encoding: "utf8",
|
|
109
|
-
env: {
|
|
170
|
+
env: {
|
|
171
|
+
...process.env,
|
|
172
|
+
...env,
|
|
173
|
+
COMPOSE_PROJECT_NAME: projectName,
|
|
174
|
+
EVOLVER_HOST_HTTP_PORT: assignment.httpPort,
|
|
175
|
+
EVOLVER_HOST_CONTENT_PORT: assignment.contentPort,
|
|
176
|
+
},
|
|
110
177
|
});
|
|
111
178
|
if (up.status !== 0) {
|
|
112
179
|
return {
|
|
@@ -116,13 +183,14 @@ export async function runInstall(argv, env) {
|
|
|
116
183
|
};
|
|
117
184
|
}
|
|
118
185
|
// 2. Wait for the node to answer its chain API before bootstrapping against it.
|
|
119
|
-
const
|
|
186
|
+
const devHttpPort = env.EVOLVER_HOST_HTTP_PORT?.trim() || assignment.httpPort;
|
|
187
|
+
const healthUrl = env.EVOLVER_INSTALL_HEALTH_URL?.trim() || `http://${LOCAL_NODE_HOST}:${devHttpPort}${HEALTH_PATH}`;
|
|
120
188
|
const timeoutMs = Number(env.EVOLVER_INSTALL_TIMEOUT_MS ?? "120000");
|
|
121
189
|
const ok = await waitHealthy(healthUrl, timeoutMs);
|
|
122
190
|
if (!ok) {
|
|
123
191
|
const logs = spawnSync("docker", ["compose", "-f", composeFile, "logs", "--tail", "40", "node"], {
|
|
124
192
|
encoding: "utf8",
|
|
125
|
-
env: { ...process.env, ...env },
|
|
193
|
+
env: { ...process.env, ...env, COMPOSE_PROJECT_NAME: projectName },
|
|
126
194
|
});
|
|
127
195
|
return {
|
|
128
196
|
exitCode: 1,
|
|
@@ -131,17 +199,16 @@ export async function runInstall(argv, env) {
|
|
|
131
199
|
};
|
|
132
200
|
}
|
|
133
201
|
// 3. Bootstrap the SEPARATE agent identity against the local node. `--target local` +
|
|
134
|
-
// EVOLVER_NODE=http://127.0.0.1
|
|
135
|
-
// EVOLVER_CONTENT_URL=http://127.0.0.1
|
|
136
|
-
//
|
|
137
|
-
//
|
|
138
|
-
|
|
139
|
-
// Unset → no translation: the bootstrap defaults to THIS process's `$HOME`, which is exactly
|
|
140
|
-
// right when Claude runs on the same machine as `install`.
|
|
202
|
+
// EVOLVER_NODE=http://127.0.0.1:<httpPort> makes the bootstrap derive
|
|
203
|
+
// EVOLVER_CONTENT_URL=http://127.0.0.1:<contentPort> (the local node's content listener). Both
|
|
204
|
+
// derive from the SAME assignment the compose received, so a `--new` node bootstraps against its
|
|
205
|
+
// own non-clashing ports with no operator input.
|
|
206
|
+
const devContentPort = env.EVOLVER_HOST_CONTENT_PORT?.trim() || assignment.contentPort;
|
|
141
207
|
const nodeEnv = {
|
|
142
208
|
...process.env,
|
|
143
209
|
...env,
|
|
144
|
-
EVOLVER_NODE: env.EVOLVER_NODE ??
|
|
210
|
+
EVOLVER_NODE: env.EVOLVER_NODE ?? `http://${LOCAL_NODE_HOST}:${devHttpPort}`,
|
|
211
|
+
EVOLVER_CONTENT_URL: env.EVOLVER_CONTENT_URL ?? `http://${LOCAL_NODE_HOST}:${devContentPort}`,
|
|
145
212
|
// The claim is sponsored by the FUNDED faucet, never the fresh local node (which is empty and
|
|
146
213
|
// would refuse `node_underfunded`). An operator's explicit EVOLVER_FAUCET_URL still wins.
|
|
147
214
|
EVOLVER_FAUCET_URL: env.EVOLVER_FAUCET_URL ?? FAUCET_DEFAULT_URL,
|
package/dist/install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,mGAAmG;AACnG,EAAE;AACF,kGAAkG;AAClG,oGAAoG;AACpG,kGAAkG;AAClG,sFAAsF;AACtF,EAAE;AACF,iGAAiG;AACjG,gFAAgF;AAChF,gGAAgG;AAChG,EAAE;AACF,gGAAgG;AAChG,mGAAmG;AACnG,iGAAiG;AACjG,gGAAgG;AAChG,kGAAkG;AAClG,yFAAyF;AAEzF,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,0FAA0F;AAC1F,MAAM,eAAe,GAAG,WAAW,CAAC;AACpC,MAAM,eAAe,GAAG,UAAU,eAAe,
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,mGAAmG;AACnG,EAAE;AACF,kGAAkG;AAClG,oGAAoG;AACpG,kGAAkG;AAClG,sFAAsF;AACtF,EAAE;AACF,iGAAiG;AACjG,gFAAgF;AAChF,gGAAgG;AAChG,EAAE;AACF,gGAAgG;AAChG,mGAAmG;AACnG,iGAAiG;AACjG,gGAAgG;AAChG,kGAAkG;AAClG,yFAAyF;AAEzF,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,0FAA0F;AAC1F,MAAM,eAAe,GAAG,WAAW,CAAC;AACpC,kGAAkG;AAClG,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC;AACnF,kFAAkF;AAClF,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC;AACzF,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,UAAU,eAAe,IAAI,eAAe,EAAE,EAAE,CAAC;AAC/E,MAAM,WAAW,GAAG,8BAA8B,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,eAAe,EAAE,CAAC;AAEhE;;;qGAGqG;AACrG,MAAM,kBAAkB,GAAG,iCAAiC,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B;;sFAEsF;AACtF,MAAM,aAAa,GAAG,YAAY,CAAC;AAEnC;;yGAEyG;AACzG,MAAM,QAAQ,GAAG,OAAO,CAAC;AASzB,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,IAAI,OAA2B,CAAC;IAChC,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,KAAK,aAAa,EAAE,CAAC;YACxB,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAI,OAAO,KAAK,SAAS;gBAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC5E,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,aAAa,GAAG,CAAC,EAAE,CAAC;YACtC,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC5C,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;YAAC,KAAK,GAAG,IAAI,CAAC;YAAC,SAAS;QAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,SAAS;YAAE,SAAS,CAAC,6CAA6C;QAC5E,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;IAChF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAClC,CAAC;AAED;uFACuF;AACvF,MAAM,UAAU,sBAAsB;IACpC,MAAM,CAAC,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7E,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,iBAAiB,GAAG,aAAa,CAAC;AACxC,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAW/B;;;iFAGiF;AACjF,MAAM,UAAU,UAAU,CACxB,KAAc,EACd,QAA2B,EAC3B,OAAgB,EAChB,UAAmB;IAEnB,IAAI,OAAO,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QACtD,6FAA6F;QAC7F,+EAA+E;IACjF,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,QAAQ,GAAa,CAAC,CAAC,CAAC,CAAC,CAAC,iCAAiC;QACjE,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,IAAI,iBAAiB,SAAS,CAAC,CAAC;QACtD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,IAAI,CAAC,CAAC;gBAAE,SAAS;YACjB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;QACD,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,iBAAiB,GAAG,CAAC,EAAE,CAAC;IACzE,MAAM,QAAQ,GAAG,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACzE,MAAM,WAAW,GAAG,UAAU,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC,iBAAiB,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AAC5C,CAAC;AAED;;uFAEuF;AACvF,SAAS,kBAAkB,CAAC,OAAe;IACzC,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;AAClE,CAAC;AAiCD,sFAAsF;AACtF,MAAM,UAAU,cAAc,CAAC,GAAe,EAAE,OAAe;IAC7D,MAAM,QAAQ,GAAG,GAAG,CAAC,uBAAuB,EAAE,IAAI,EAAE,CAAC;IACrD,IAAI,QAAQ;QAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,UAAU,CAAC,aAAqB;IAC9C,OAAO,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,6FAA6F;AAC7F,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAc,EACd,GAAmC;IAEnC,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAEjF,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,gDAAgD,WAAW,0EAA0E;SAC9I,CAAC;IACJ,CAAC;IAED,kGAAkG;IAClG,4DAA4D;IAC5D,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACrF,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,aAAa,mDAAmD,EAAE,CAAC;IAC/H,CAAC;IAED,mGAAmG;IACnG,+FAA+F;IAC/F,+FAA+F;IAC/F,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,wBAAwB,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,sBAAsB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1I,MAAM,UAAU,GAAG,UAAU,CAC3B,KAAK,EACL,QAAQ,EACR,GAAG,CAAC,sBAAsB,EAC1B,GAAG,CAAC,yBAAyB,CAC9B,CAAC;IACF,kFAAkF;IAClF,MAAM,WAAW,GAAG,GAAG,CAAC,oBAAoB,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC,OAAO,CAAC;IAE3E,2FAA2F;IAC3F,+FAA+F;IAC/F,8FAA8F;IAC9F,oGAAoG;IACpG,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE;QAC5F,QAAQ,EAAE,MAAM;QAChB,GAAG,EAAE;YACH,GAAG,OAAO,CAAC,GAAG;YACd,GAAG,GAAG;YACN,oBAAoB,EAAE,WAAW;YACjC,sBAAsB,EAAE,UAAU,CAAC,QAAQ;YAC3C,yBAAyB,EAAE,UAAU,CAAC,WAAW;SAClD;KACF,CAAC,CAAC;IACH,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO;YACL,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,+CAA+C,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,MAAM,EAAE;SAChF,CAAC;IACJ,CAAC;IAED,gFAAgF;IAChF,MAAM,WAAW,GAAG,GAAG,CAAC,sBAAsB,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC,QAAQ,CAAC;IAC9E,MAAM,SAAS,GAAG,GAAG,CAAC,0BAA0B,EAAE,IAAI,EAAE,IAAI,UAAU,eAAe,IAAI,WAAW,GAAG,WAAW,EAAE,CAAC;IACrH,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,0BAA0B,IAAI,QAAQ,CAAC,CAAC;IACrE,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE;YAC/F,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,oBAAoB,EAAE,WAAW,EAAE;SACnE,CAAC,CAAC;QACH,OAAO;YACL,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,2CAA2C,SAAS,WAAW,SAAS,oBAAoB,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,WAAW,IAAI;SAClJ,CAAC;IACJ,CAAC;IAED,sFAAsF;IACtF,yEAAyE;IACzE,kGAAkG;IAClG,oGAAoG;IACpG,oDAAoD;IACpD,MAAM,cAAc,GAAG,GAAG,CAAC,yBAAyB,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC,WAAW,CAAC;IACvF,MAAM,OAAO,GAAsB;QACjC,GAAG,OAAO,CAAC,GAAG;QACd,GAAG,GAAG;QACN,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,UAAU,eAAe,IAAI,WAAW,EAAE;QAC5E,mBAAmB,EAAE,GAAG,CAAC,mBAAmB,IAAI,UAAU,eAAe,IAAI,cAAc,EAAE;QAC7F,8FAA8F;QAC9F,0FAA0F;QAC1F,kBAAkB,EAAE,GAAG,CAAC,kBAAkB,IAAI,kBAAkB;KACjE,CAAC;IACF,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,OAAO,CAAC,qBAAqB,KAAK,SAAS,EAAE,CAAC;QAClG,OAAO,CAAC,qBAAqB,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/C,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AACnF,CAAC;AAED,6FAA6F;AAC7F,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,SAAiB;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClE,IAAI,CAAC,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcsherrylabs/evolver-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.1",
|
|
4
4
|
"description": "MCP server over a configurable Evolver node — read the chain, sign a transfer, administer what you own, write to a channel, submit a signed transaction. Wraps @mcsherrylabs/evolver-client; implements no wire format of its own.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|