@mcsherrylabs/pi-meerkat 0.8.0 → 0.10.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.
@@ -1,10 +1,12 @@
1
1
  // Meerkat composition root for the shared processor, not a second collector/runtime.
2
2
  // All paths/capabilities are operator-fixed here; requests can supply only a channel id.
3
3
  import { join } from "node:path";
4
- import { dockerNodeRestarter, nodeObserver, nodePuller, startControlServer, startProcessor, startReadServer, subscriptionConfig, subscriptionController, } from "@mcsherrylabs/evolver-client/processor";
4
+ import { connect as netConnect } from "node:net";
5
+ import { lstat, unlink } from "node:fs/promises";
6
+ import { nodeControlRestarter, nodeObserver, nodePuller, startControlServer, startProcessor, startReadServer, subscriptionConfig, subscriptionController, } from "@mcsherrylabs/evolver-client/processor";
5
7
  import { ensureStateDir } from "./env.js";
6
8
  const productionSdk = {
7
- dockerNodeRestarter, nodeObserver, nodePuller, startControlServer, startProcessor,
9
+ nodeControlRestarter, nodeObserver, nodePuller, startControlServer, startProcessor,
8
10
  startReadServer, subscriptionConfig, subscriptionController,
9
11
  };
10
12
  export function processorBinding() {
@@ -16,6 +18,35 @@ export function processorConfigPath(target) {
16
18
  export function processorStatePath(target) {
17
19
  return join(target.stateDir, "registry.db");
18
20
  }
21
+ /** A stale control socket left by an unclean registry exit would make the SDK's control
22
+ * server refuse to bind ("Never unlink/steal a pre-existing socket"). Only when the path is
23
+ * a SOCKET and nobody is listening (ECONNREFUSED on a bounded connect) is it safe to unlink:
24
+ * this process is the sole owner of its control directory. A live owner (connect succeeds) or
25
+ * any other error, or a non-socket path, is left untouched so the SDK refuses as designed. */
26
+ export async function removeStaleControlSocket(socketPath) {
27
+ let stat;
28
+ try {
29
+ stat = await lstat(socketPath);
30
+ }
31
+ catch (error) {
32
+ if (error.code === "ENOENT")
33
+ return;
34
+ throw error;
35
+ }
36
+ if (!stat.isSocket())
37
+ return; // never unlink a non-socket; the node/SDK fails closed on it
38
+ const result = await new Promise(resolve => {
39
+ const socket = netConnect(socketPath);
40
+ const timer = setTimeout(() => { socket.destroy(); resolve("error"); }, 1000);
41
+ socket.once("connect", () => { clearTimeout(timer); socket.destroy(); resolve("connected"); });
42
+ socket.once("error", (error) => {
43
+ clearTimeout(timer);
44
+ resolve(error.code === "ECONNREFUSED" ? "refused" : "error");
45
+ });
46
+ });
47
+ if (result === "refused")
48
+ await unlink(socketPath);
49
+ }
19
50
  export async function startMeerkatProcessor(args, sdk = productionSdk) {
20
51
  const binding = processorBinding();
21
52
  // Synchronous SDK validation of fixed expectations, NOT an online-node startup dependency.
@@ -72,17 +103,14 @@ export async function startMeerkatServers(args, sdk = productionSdk) {
72
103
  store: args.runtime.store, port: args.port,
73
104
  host: process.env.PROCESSOR_READ_HOST?.trim() || "127.0.0.1", routes: args.routes, say: args.say,
74
105
  }));
75
- const containerName = process.env.EVOLVER_MANAGED_NODE_CONTAINER?.trim();
76
- const socketPath = process.env.EVOLVER_PROCESSOR_CONTROL_SOCKET?.trim() || (containerName ? "/control/control.sock" : undefined);
77
- const dockerSocket = containerName ? "/var/run/docker.sock" : undefined;
78
- if (socketPath || dockerSocket || containerName) {
79
- if (!socketPath || !dockerSocket || !containerName)
80
- throw new Error("managed control requires explicit control socket, Docker socket and fixed node container");
106
+ const socketPath = process.env.EVOLVER_PROCESSOR_CONTROL_SOCKET?.trim();
107
+ if (socketPath) {
108
+ await removeStaleControlSocket(socketPath);
81
109
  const binding = processorBinding();
82
110
  const controller = sdk.subscriptionController({
83
111
  binding, runtime: args.runtime, config: sdk.subscriptionConfig(processorConfigPath(args.target)),
84
112
  observe: sdk.nodeObserver({ baseUrl: args.target.nodeUrl, binding }),
85
- restart: sdk.dockerNodeRestarter({ socketPath: dockerSocket, containerName }),
113
+ restart: sdk.nodeControlRestarter({ socketPath: "/node-control/node.sock", expected: binding }),
86
114
  });
87
115
  servers.push(await sdk.startControlServer({ socketPath, mode: 0o660, controller, say: args.say }));
88
116
  }
@@ -1,11 +1,13 @@
1
+ export type Mode = 'devnet' | 'local';
1
2
  export interface Installation {
2
3
  version: 1;
3
4
  uid: number;
4
5
  id: string;
5
6
  dir: string;
6
7
  project: string;
8
+ mode: Mode;
7
9
  nodeId: string;
8
- committeeId: string;
10
+ committeeId?: string;
9
11
  identity: string;
10
12
  registryOperator: string;
11
13
  channel: string;
@@ -21,17 +23,20 @@ export interface Installation {
21
23
  }
22
24
  export interface InstallerDeps {
23
25
  command(command: string, args: string[], env?: NodeJS.ProcessEnv, cwd?: string): Promise<string>;
24
- committeeReady(state: Installation, env: NodeJS.ProcessEnv): Promise<void>;
26
+ committeeReady?(state: Installation, env: NodeJS.ProcessEnv): Promise<void>;
25
27
  nodeBinding(state: Installation, env: NodeJS.ProcessEnv): Promise<{
26
28
  chainId: string;
27
29
  nodeId: string;
28
30
  }>;
29
31
  registryReady(state: Installation, env: NodeJS.ProcessEnv): Promise<void>;
30
32
  bootstrap(state: Installation, env: NodeJS.ProcessEnv): Promise<void>;
33
+ claimChannel?(state: Installation, env: NodeJS.ProcessEnv): Promise<void>;
31
34
  }
32
35
  export declare function managedDirectory(env?: NodeJS.ProcessEnv): string;
33
- export declare const managedConfigPath: (env?: NodeJS.ProcessEnv) => string;
34
- export declare function pinnedRegistration(version: string): {
36
+ /** Per-mode state directory. The 0.8.0 path `<state>/meerkat/` (installation.json) is never used. */
37
+ export declare function modeDirectory(mode: Mode, env?: NodeJS.ProcessEnv): string;
38
+ export declare const managedConfigPath: (mode?: Mode, env?: NodeJS.ProcessEnv) => string;
39
+ export declare function pinnedRegistration(version: string, mode?: Mode): {
35
40
  mcpServers: {
36
41
  meerkat: {
37
42
  command: string;
@@ -40,6 +45,157 @@ export declare function pinnedRegistration(version: string): {
40
45
  };
41
46
  };
42
47
  export declare function renderDeployment(state: Installation): {
48
+ name: string;
49
+ services: {
50
+ node: {
51
+ image: string;
52
+ labels: {
53
+ "io.meerkat.installation": string;
54
+ };
55
+ container_name: string;
56
+ entrypoint: string[];
57
+ build: {
58
+ context: string;
59
+ dockerfile: string;
60
+ labels: {
61
+ "io.meerkat.installation": string;
62
+ };
63
+ args: {
64
+ EVOLVER_NODE_IMAGE: string;
65
+ };
66
+ };
67
+ environment: {
68
+ APP_NODE_ID: string;
69
+ DEVNET_API: string;
70
+ EVOLVER_UPSTREAM_NODE_ID: string;
71
+ EVOLVER_DA_PEERS: string;
72
+ EVOLVER_ALLOWED_OUTBOUND: string;
73
+ EVOLVER_EXECUTION_ENABLED: string;
74
+ EVOLVER_NODE_PORT: string;
75
+ EVOLVER_NODE_CONFIG: string;
76
+ CLAIM_TIMEOUT?: undefined;
77
+ CLAIM_WATCH_SECS?: undefined;
78
+ };
79
+ group_add: string[];
80
+ volumes: string[];
81
+ restart: string;
82
+ };
83
+ registry: {
84
+ image: string;
85
+ labels: {
86
+ "io.meerkat.installation": string;
87
+ };
88
+ container_name: string;
89
+ build: {
90
+ context: string;
91
+ dockerfile: string;
92
+ labels: {
93
+ "io.meerkat.installation": string;
94
+ };
95
+ };
96
+ user: string;
97
+ group_add: string[];
98
+ environment: {
99
+ EVOLVER_FAUCET_URL: string;
100
+ EVOLVER_CHAIN_ID: string;
101
+ APP_NODE_ID: string;
102
+ EVOLVER_SUBSCRIPTIONS_FILE: string;
103
+ REGISTRY_CHANNEL: string;
104
+ REGISTRY_CHANNEL_OPERATOR: string;
105
+ REGISTRY_READ_ONLY: string;
106
+ REGISTRY_CONTENT_URL: string;
107
+ PROCESSOR_HTTP_PORT: string;
108
+ PROCESSOR_READ_HOST: string;
109
+ EVOLVER_PROCESSOR_CONTROL_SOCKET: string;
110
+ EVOLVER_DEVNET_URL?: string | undefined;
111
+ EVOLVER_TARGET: string;
112
+ EVOLVER_NODE: string;
113
+ };
114
+ volumes: string[];
115
+ restart: string;
116
+ };
117
+ 'subscriptions-init': {
118
+ image: string;
119
+ labels: {
120
+ "io.meerkat.installation": string;
121
+ };
122
+ profiles: string[];
123
+ user: string;
124
+ environment: {
125
+ EVOLVER_INITIAL_CHANNELS: string;
126
+ EVOLVER_OPERATOR_UID: string;
127
+ EVOLVER_OPERATOR_GID: string;
128
+ EVOLVER_FAUCET_URL: string;
129
+ EVOLVER_CHAIN_ID: string;
130
+ APP_NODE_ID: string;
131
+ EVOLVER_SUBSCRIPTIONS_FILE: string;
132
+ REGISTRY_CHANNEL: string;
133
+ REGISTRY_CHANNEL_OPERATOR: string;
134
+ REGISTRY_READ_ONLY: string;
135
+ REGISTRY_CONTENT_URL: string;
136
+ PROCESSOR_HTTP_PORT: string;
137
+ PROCESSOR_READ_HOST: string;
138
+ EVOLVER_PROCESSOR_CONTROL_SOCKET: string;
139
+ EVOLVER_DEVNET_URL?: string | undefined;
140
+ EVOLVER_TARGET: string;
141
+ EVOLVER_NODE: string;
142
+ };
143
+ entrypoint: string[];
144
+ command: string[];
145
+ volumes: string[];
146
+ };
147
+ committee?: undefined;
148
+ };
149
+ volumes: {
150
+ 'node-data': {
151
+ name: string;
152
+ labels: {
153
+ "io.meerkat.installation": string;
154
+ };
155
+ };
156
+ 'app-state': {
157
+ name: string;
158
+ labels: {
159
+ "io.meerkat.installation": string;
160
+ };
161
+ };
162
+ subscriptions: {
163
+ name: string;
164
+ labels: {
165
+ "io.meerkat.installation": string;
166
+ };
167
+ };
168
+ 'agent-state': {
169
+ name: string;
170
+ labels: {
171
+ "io.meerkat.installation": string;
172
+ };
173
+ };
174
+ 'node-control': {
175
+ name: string;
176
+ labels: {
177
+ "io.meerkat.installation": string;
178
+ };
179
+ };
180
+ control: {
181
+ name: string;
182
+ labels: {
183
+ "io.meerkat.installation": string;
184
+ };
185
+ };
186
+ 'committee-data'?: undefined;
187
+ genesis?: undefined;
188
+ };
189
+ networks: {
190
+ default: {
191
+ name: string;
192
+ labels: {
193
+ "io.meerkat.installation": string;
194
+ };
195
+ internal?: undefined;
196
+ };
197
+ };
198
+ } | {
43
199
  name: string;
44
200
  services: {
45
201
  committee: {
@@ -60,7 +216,7 @@ export declare function renderDeployment(state: Installation): {
60
216
  };
61
217
  entrypoint: string[];
62
218
  environment: {
63
- NODE_ID: string;
219
+ NODE_ID: string | undefined;
64
220
  PUBLIC_HOST: string;
65
221
  };
66
222
  group_add: string[];
@@ -87,12 +243,14 @@ export declare function renderDeployment(state: Installation): {
87
243
  environment: {
88
244
  APP_NODE_ID: string;
89
245
  DEVNET_API: string;
90
- EVOLVER_UPSTREAM_NODE_ID: string;
246
+ EVOLVER_UPSTREAM_NODE_ID: string | undefined;
91
247
  EVOLVER_ALLOWED_OUTBOUND: string;
92
248
  EVOLVER_EXECUTION_ENABLED: string;
93
249
  EVOLVER_NODE_PORT: string;
94
250
  CLAIM_TIMEOUT: string;
95
251
  CLAIM_WATCH_SECS: string;
252
+ EVOLVER_DA_PEERS?: undefined;
253
+ EVOLVER_NODE_CONFIG?: undefined;
96
254
  };
97
255
  group_add: string[];
98
256
  volumes: string[];
@@ -112,18 +270,22 @@ export declare function renderDeployment(state: Installation): {
112
270
  };
113
271
  };
114
272
  user: string;
273
+ group_add: string[];
115
274
  environment: {
116
- EVOLVER_TARGET: string;
117
- EVOLVER_NODE: string;
118
275
  EVOLVER_FAUCET_URL: string;
119
276
  EVOLVER_CHAIN_ID: string;
120
277
  APP_NODE_ID: string;
121
278
  EVOLVER_SUBSCRIPTIONS_FILE: string;
122
279
  REGISTRY_CHANNEL: string;
123
280
  REGISTRY_CHANNEL_OPERATOR: string;
281
+ REGISTRY_READ_ONLY: string;
124
282
  REGISTRY_CONTENT_URL: string;
125
283
  PROCESSOR_HTTP_PORT: string;
126
284
  PROCESSOR_READ_HOST: string;
285
+ EVOLVER_PROCESSOR_CONTROL_SOCKET: string;
286
+ EVOLVER_DEVNET_URL?: string | undefined;
287
+ EVOLVER_TARGET: string;
288
+ EVOLVER_NODE: string;
127
289
  };
128
290
  volumes: string[];
129
291
  restart: string;
@@ -139,17 +301,20 @@ export declare function renderDeployment(state: Installation): {
139
301
  EVOLVER_INITIAL_CHANNELS: string;
140
302
  EVOLVER_OPERATOR_UID: string;
141
303
  EVOLVER_OPERATOR_GID: string;
142
- EVOLVER_TARGET: string;
143
- EVOLVER_NODE: string;
144
304
  EVOLVER_FAUCET_URL: string;
145
305
  EVOLVER_CHAIN_ID: string;
146
306
  APP_NODE_ID: string;
147
307
  EVOLVER_SUBSCRIPTIONS_FILE: string;
148
308
  REGISTRY_CHANNEL: string;
149
309
  REGISTRY_CHANNEL_OPERATOR: string;
310
+ REGISTRY_READ_ONLY: string;
150
311
  REGISTRY_CONTENT_URL: string;
151
312
  PROCESSOR_HTTP_PORT: string;
152
313
  PROCESSOR_READ_HOST: string;
314
+ EVOLVER_PROCESSOR_CONTROL_SOCKET: string;
315
+ EVOLVER_DEVNET_URL?: string | undefined;
316
+ EVOLVER_TARGET: string;
317
+ EVOLVER_NODE: string;
153
318
  };
154
319
  entrypoint: string[];
155
320
  command: string[];
@@ -193,6 +358,18 @@ export declare function renderDeployment(state: Installation): {
193
358
  "io.meerkat.installation": string;
194
359
  };
195
360
  };
361
+ 'node-control': {
362
+ name: string;
363
+ labels: {
364
+ "io.meerkat.installation": string;
365
+ };
366
+ };
367
+ control: {
368
+ name: string;
369
+ labels: {
370
+ "io.meerkat.installation": string;
371
+ };
372
+ };
196
373
  };
197
374
  networks: {
198
375
  default: {
@@ -205,11 +382,11 @@ export declare function renderDeployment(state: Installation): {
205
382
  };
206
383
  };
207
384
  export declare function operatorEnvironment(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
208
- export declare function managedInstallation(env?: NodeJS.ProcessEnv): Promise<Installation | undefined>;
385
+ export declare function managedInstallation(mode?: Mode, env?: NodeJS.ProcessEnv): Promise<Installation | undefined>;
209
386
  /** Protocol-only stdio bridge, one new facade/private child/session per harness connection.
210
387
  * Docker exec works even when daemon and harness share neither filesystem nor loopback. */
211
388
  export declare function serveManaged(state: Installation, env?: NodeJS.ProcessEnv): Promise<void>;
212
- export declare function installMeerkat(env?: NodeJS.ProcessEnv, deps?: InstallerDeps): Promise<{
389
+ export declare function installMeerkat(mode?: Mode, env?: NodeJS.ProcessEnv, deps?: InstallerDeps): Promise<{
213
390
  dir: string;
214
391
  configPath: string;
215
392
  registration: {
@@ -1 +1 @@
1
- {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,CAAC,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IACvG,QAAQ,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IACvI,cAAc,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;IAAC,KAAK,CAAC,EAAE,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACnH;AACD,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjG,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvG,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvE;AACD,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAI7E;AACD,eAAO,MAAM,iBAAiB,GAAI,MAAK,MAAM,CAAC,UAAwB,KAAG,MAA0D,CAAC;AACpI,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM;;;;;;;EAGjD;AACD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsCnD;AA2BD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAK7E;AAwDD,wBAAsB,mBAAmB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAOjH;AACD;2FAC2F;AAC3F,wBAAsB,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgC3G;AACD,wBAAsB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,EAAE,IAAI,GAAE,aAAwB;;;;;;;;;;;GAiFxG"}
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"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"}