@mcsherrylabs/pi-meerkat 0.6.0 → 0.8.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/README.md +234 -54
- package/dist/installer/committee-init.sh +117 -0
- package/dist/installer/committee.conf +102 -0
- package/dist/installer/node-join.sh +228 -0
- package/dist/installer/node.conf +235 -0
- package/dist/installer/runtime.json +1 -0
- package/dist/installer-runtime/dist/scripts/recover-owner.js +15 -0
- package/dist/installer-runtime/dist/scripts/subscriptions-init.js +35 -0
- package/dist/installer-runtime/dist/scripts/versions.mjs +86 -0
- package/dist/installer-runtime/dist/scripts/wait-for-chain.js +90 -0
- package/dist/installer-runtime/dist/src/announcements.js +448 -0
- package/dist/installer-runtime/dist/src/app.js +539 -0
- package/dist/installer-runtime/dist/src/chainfetch.js +87 -0
- package/dist/installer-runtime/dist/src/env.js +425 -0
- package/dist/installer-runtime/dist/src/registry/announce.js +77 -0
- package/dist/installer-runtime/dist/src/registry/announcement.js +141 -0
- package/dist/installer-runtime/dist/src/registry/dependencies.js +28 -0
- package/dist/installer-runtime/dist/src/registry/detail.js +87 -0
- package/dist/installer-runtime/dist/src/registry/drainer.js +131 -0
- package/dist/installer-runtime/dist/src/registry/http.js +194 -0
- package/dist/installer-runtime/dist/src/registry/index.js +52 -0
- package/dist/installer-runtime/dist/src/registry/lease.js +35 -0
- package/dist/installer-runtime/dist/src/registry/ownership.js +31 -0
- package/dist/installer-runtime/dist/src/registry/provision.js +180 -0
- package/dist/installer-runtime/dist/src/registry/store.js +242 -0
- package/dist/installer-runtime/dist/src/registry/sweep.js +9 -0
- package/dist/installer-runtime/dist/src/registry/worker-module.js +87 -0
- package/dist/installer-runtime/dist/src/runtime.js +164 -0
- package/dist/installer-runtime/dist/src/store.js +138 -0
- package/dist/installer-runtime/package.json +1 -0
- package/dist/installer.d.ts +224 -0
- package/dist/installer.d.ts.map +1 -0
- package/dist/installer.js +336 -0
- package/dist/installer.js.map +1 -0
- package/dist/mcp-announce.d.ts +42 -0
- package/dist/mcp-announce.d.ts.map +1 -0
- package/dist/mcp-announce.js +231 -0
- package/dist/mcp-announce.js.map +1 -0
- package/dist/mcp-cli.d.ts +3 -0
- package/dist/mcp-cli.d.ts.map +1 -0
- package/dist/mcp-cli.js +137 -0
- package/dist/mcp-cli.js.map +1 -0
- package/dist/mcp-config.d.ts +28 -0
- package/dist/mcp-config.d.ts.map +1 -0
- package/dist/mcp-config.js +104 -0
- package/dist/mcp-config.js.map +1 -0
- package/dist/mcp-facade.d.ts +20 -0
- package/dist/mcp-facade.d.ts.map +1 -0
- package/dist/mcp-facade.js +200 -0
- package/dist/mcp-facade.js.map +1 -0
- package/dist/mcp-upstream.d.ts +42 -0
- package/dist/mcp-upstream.d.ts.map +1 -0
- package/dist/mcp-upstream.js +151 -0
- package/dist/mcp-upstream.js.map +1 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +11 -5
- package/dist/registry.js.map +1 -1
- package/dist/tools.d.ts +6 -2
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +123 -119
- package/dist/tools.js.map +1 -1
- package/installer/Committee.Dockerfile +6 -0
- package/installer/Node.Dockerfile +6 -0
- package/installer/Registry.Dockerfile +13 -0
- package/installer/runtime-control.mjs +172 -0
- package/installer/session-files.mjs +16 -0
- package/package.json +14 -5
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
// Operator-only deployment orchestration. Key generation/read/signing remains in the released
|
|
2
|
+
// Evolver bootstrap/child. All services/data are owned Docker resources, never host bind mounts.
|
|
3
|
+
import { spawn } from 'node:child_process';
|
|
4
|
+
import { randomBytes } from 'node:crypto';
|
|
5
|
+
import { constants } from 'node:fs';
|
|
6
|
+
import { cp, lstat, mkdir, open, readFile, rename, rm, writeFile } from 'node:fs/promises';
|
|
7
|
+
import { homedir } from 'node:os';
|
|
8
|
+
import { dirname, isAbsolute, join, resolve } from 'node:path';
|
|
9
|
+
import { fileURLToPath } from 'node:url';
|
|
10
|
+
const PACKAGE = '@mcsherrylabs/pi-meerkat';
|
|
11
|
+
const packageDir = resolve(dirname(fileURLToPath(import.meta.url)), '..');
|
|
12
|
+
// Public manifest rechecked anonymously 2026-11-05; coordinated with released SDK 0.22.1.
|
|
13
|
+
const NODE_IMAGE = 'nexus.mcsherrylabs.com/evolver-node@sha256:38b2e175efc9b974dbc26a19eef27ee94c66701aaefd4e49219371c60ef26747';
|
|
14
|
+
const OWNER = 'io.meerkat.installation';
|
|
15
|
+
const installed = '/opt/meerkat/node_modules/@mcsherrylabs/pi-meerkat';
|
|
16
|
+
const runtime = `${installed}/dist/installer-runtime`;
|
|
17
|
+
const control = `${installed}/installer/runtime-control.mjs`;
|
|
18
|
+
export function managedDirectory(env = process.env) {
|
|
19
|
+
const base = env.XDG_STATE_HOME || join(env.HOME || homedir(), '.local', 'state');
|
|
20
|
+
if (!isAbsolute(base))
|
|
21
|
+
throw new Error('HOME/XDG_STATE_HOME must resolve to an absolute operator state directory');
|
|
22
|
+
return join(base, 'meerkat');
|
|
23
|
+
}
|
|
24
|
+
export const managedConfigPath = (env = process.env) => join(managedDirectory(env), 'installation.json');
|
|
25
|
+
export function pinnedRegistration(version) {
|
|
26
|
+
if (!/^\d+\.\d+\.\d+$/.test(version))
|
|
27
|
+
throw new Error('installer requires a released semantic package version');
|
|
28
|
+
return { mcpServers: { meerkat: { command: 'npx', args: ['--yes', `${PACKAGE}@${version}`, 'serve'] } } };
|
|
29
|
+
}
|
|
30
|
+
export function renderDeployment(state) {
|
|
31
|
+
const labels = { [OWNER]: state.id };
|
|
32
|
+
const volume = (name) => ({ name: `${state.project}-${name}`, labels });
|
|
33
|
+
const environment = {
|
|
34
|
+
EVOLVER_TARGET: 'local', EVOLVER_NODE: 'http://node:8440', EVOLVER_FAUCET_URL: 'http://committee:8440',
|
|
35
|
+
EVOLVER_CHAIN_ID: state.binding?.chainId ?? '', APP_NODE_ID: state.nodeId,
|
|
36
|
+
EVOLVER_SUBSCRIPTIONS_FILE: '/subscriptions/channels.conf', REGISTRY_CHANNEL: state.channel,
|
|
37
|
+
REGISTRY_CHANNEL_OPERATOR: state.registryOperator,
|
|
38
|
+
REGISTRY_CONTENT_URL: 'http://node:8450', PROCESSOR_HTTP_PORT: '8090', PROCESSOR_READ_HOST: '0.0.0.0',
|
|
39
|
+
};
|
|
40
|
+
return {
|
|
41
|
+
name: state.project,
|
|
42
|
+
services: {
|
|
43
|
+
committee: { image: `${state.project}-committee:${state.packageVersion}`, labels, container_name: `${state.project}-committee`,
|
|
44
|
+
build: { context: './package', dockerfile: 'installer/Committee.Dockerfile', labels, args: { EVOLVER_NODE_IMAGE: NODE_IMAGE } },
|
|
45
|
+
entrypoint: ['sh', '/config/node-init.sh'], environment: { NODE_ID: state.committeeId, PUBLIC_HOST: 'committee' },
|
|
46
|
+
group_add: ['1000'], volumes: ['committee-data:/data', 'genesis:/public-genesis'], restart: 'unless-stopped' },
|
|
47
|
+
node: { image: `${state.project}-node:${state.packageVersion}`, labels, container_name: `${state.project}-node`, entrypoint: ['sh', '/config/node-join.sh'],
|
|
48
|
+
build: { context: './package', dockerfile: 'installer/Node.Dockerfile', labels, args: { EVOLVER_NODE_IMAGE: NODE_IMAGE } },
|
|
49
|
+
environment: { APP_NODE_ID: state.nodeId, DEVNET_API: 'http://committee:8440', EVOLVER_UPSTREAM_NODE_ID: state.committeeId,
|
|
50
|
+
EVOLVER_ALLOWED_OUTBOUND: '1', EVOLVER_EXECUTION_ENABLED: 'true', EVOLVER_NODE_PORT: '7100', CLAIM_TIMEOUT: '90', CLAIM_WATCH_SECS: '30' },
|
|
51
|
+
group_add: ['1000'], volumes: ['node-data:/data', 'subscriptions:/subscriptions:ro', 'genesis:/public-genesis:ro'],
|
|
52
|
+
restart: 'unless-stopped' },
|
|
53
|
+
registry: { image: `${state.project}-registry:${state.packageVersion}`, labels, container_name: `${state.project}-registry`,
|
|
54
|
+
build: { context: './package', dockerfile: 'installer/Registry.Dockerfile', labels },
|
|
55
|
+
user: '1000:1000', environment,
|
|
56
|
+
volumes: [`app-state:${runtime}/state`, 'subscriptions:/subscriptions:ro', 'agent-state:/meerkat/agent'],
|
|
57
|
+
restart: 'unless-stopped' },
|
|
58
|
+
'subscriptions-init': { image: `${state.project}-registry:${state.packageVersion}`, labels, profiles: ['initialize-only'],
|
|
59
|
+
user: '0:0', environment: { ...environment, EVOLVER_INITIAL_CHANNELS: JSON.stringify([state.channel]),
|
|
60
|
+
EVOLVER_OPERATOR_UID: '1000', EVOLVER_OPERATOR_GID: '1000' },
|
|
61
|
+
entrypoint: ['sh', '-ec'], command: [`chown 1000:1000 ${runtime}/state /meerkat/agent /public-genesis; chmod 700 /meerkat/agent; chmod 2770 /public-genesis; exec node ${runtime}/dist/scripts/subscriptions-init.js`],
|
|
62
|
+
volumes: [`app-state:${runtime}/state`, 'subscriptions:/subscriptions', 'agent-state:/meerkat/agent', 'genesis:/public-genesis'] },
|
|
63
|
+
},
|
|
64
|
+
volumes: { 'committee-data': volume('committee-data'), genesis: volume('genesis'), 'node-data': volume('node-data'),
|
|
65
|
+
'app-state': volume('app-state'), subscriptions: volume('subscriptions'), 'agent-state': volume('agent-state') },
|
|
66
|
+
networks: { default: { name: `${state.project}-network`, internal: true, labels } },
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
async function command(command, args, env = process.env, cwd) {
|
|
70
|
+
return new Promise((resolve, reject) => {
|
|
71
|
+
const child = spawn(command, args, { env, cwd, stdio: ['ignore', 'pipe', 'pipe'] });
|
|
72
|
+
let stdout = '', stderr = '', timedOut = false;
|
|
73
|
+
const timer = setTimeout(() => { timedOut = true; child.kill('SIGTERM'); }, 600_000);
|
|
74
|
+
const hard = setTimeout(() => child.kill('SIGKILL'), 605_000);
|
|
75
|
+
child.stdout.on('data', data => { stdout = (stdout + String(data)).slice(-2 * 1024 * 1024); });
|
|
76
|
+
child.stderr.on('data', data => { stderr = (stderr + String(data)).slice(-8192); });
|
|
77
|
+
child.on('error', error => { clearTimeout(timer); clearTimeout(hard); reject(error); });
|
|
78
|
+
child.on('close', code => {
|
|
79
|
+
clearTimeout(timer);
|
|
80
|
+
clearTimeout(hard);
|
|
81
|
+
if (code !== 0 || timedOut)
|
|
82
|
+
reject(new Error(`${command} ${args[0] ?? ''} failed${timedOut ? ' (deadline)' : ''}: ${stderr}`));
|
|
83
|
+
else
|
|
84
|
+
resolve(stdout);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const composeArgs = (state) => ['compose', '--project-name', state.project, '--file', join(state.dir, 'compose.json')];
|
|
89
|
+
const request = (state) => JSON.stringify({ nodeId: state.nodeId, committeeId: state.committeeId, identity: state.identity, channel: state.channel, binding: state.binding });
|
|
90
|
+
const defaults = {
|
|
91
|
+
command,
|
|
92
|
+
committeeReady: async (state, env) => {
|
|
93
|
+
await command('docker', [...composeArgs(state), 'run', '--rm', '--no-deps',
|
|
94
|
+
'--entrypoint', 'node', 'registry', control, 'committee-ready', request(state)], env, state.dir);
|
|
95
|
+
},
|
|
96
|
+
nodeBinding: async (state, env) => JSON.parse(await command('docker', [...composeArgs(state), 'run', '--rm', '--no-deps',
|
|
97
|
+
'--entrypoint', 'node', 'registry', control, 'node-binding', request(state)], env, state.dir)),
|
|
98
|
+
registryReady: async (state, env) => { await command('docker', ['exec', `${state.project}-registry`, 'node', control, 'ready', request(state)], env); },
|
|
99
|
+
bootstrap: async (state, env) => { await command('docker', ['exec', '--workdir', '/meerkat/agent', `${state.project}-registry`, 'node', control, 'bootstrap', request(state)], env); },
|
|
100
|
+
};
|
|
101
|
+
export function operatorEnvironment(env) {
|
|
102
|
+
const result = {};
|
|
103
|
+
for (const key of ['HOME', 'PATH', 'USER', 'XDG_STATE_HOME', 'TMPDIR', 'DOCKER_HOST', 'DOCKER_CONTEXT', 'DOCKER_TLS_VERIFY', 'DOCKER_CERT_PATH', 'DOCKER_CONFIG'])
|
|
104
|
+
if (env[key] !== undefined)
|
|
105
|
+
result[key] = env[key];
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
async function privateDirectory(path) {
|
|
109
|
+
await mkdir(path, { recursive: true, mode: 0o700 });
|
|
110
|
+
const s = await lstat(path);
|
|
111
|
+
if (!s.isDirectory() || s.isSymbolicLink() || s.uid !== process.getuid?.() || (s.mode & 0o077))
|
|
112
|
+
throw new Error('managed state must be a private operator-owned directory, not a symlink');
|
|
113
|
+
}
|
|
114
|
+
async function readState(path) {
|
|
115
|
+
let handle;
|
|
116
|
+
try {
|
|
117
|
+
handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
118
|
+
}
|
|
119
|
+
catch (e) {
|
|
120
|
+
if (e.code === 'ENOENT')
|
|
121
|
+
return undefined;
|
|
122
|
+
throw e;
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
const info = await handle.stat();
|
|
126
|
+
if (!info.isFile() || info.size > 65536 || info.uid !== process.getuid?.() || (info.mode & 0o077))
|
|
127
|
+
throw new Error('invalid managed installation ownership');
|
|
128
|
+
const parsed = JSON.parse(await handle.readFile('utf8'));
|
|
129
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
130
|
+
throw new Error('invalid saved installation object; refusing adoption');
|
|
131
|
+
return parsed;
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
await handle.close();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async function saveState(state) {
|
|
138
|
+
const temporary = join(state.dir, `installation.${randomBytes(8).toString('hex')}.tmp`);
|
|
139
|
+
const handle = await open(temporary, 'wx', 0o600);
|
|
140
|
+
try {
|
|
141
|
+
await handle.writeFile(JSON.stringify(state, null, 2) + '\n');
|
|
142
|
+
await handle.sync();
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
await handle.close();
|
|
146
|
+
}
|
|
147
|
+
await rename(temporary, join(state.dir, 'installation.json'));
|
|
148
|
+
}
|
|
149
|
+
async function ownership(state, deps, env, fresh) {
|
|
150
|
+
const daemonId = (await deps.command('docker', ['info', '--format', '{{.ID}}'], env)).trim();
|
|
151
|
+
if (daemonId !== state.daemonId)
|
|
152
|
+
throw new Error('Docker daemon identity differs; refusing resource adoption');
|
|
153
|
+
for (const [args, name] of [
|
|
154
|
+
[['ps', '-a'], `^/${state.project}-(committee|node|registry)$`],
|
|
155
|
+
[['volume', 'ls'], `^${state.project}-(committee-data|genesis|node-data|app-state|subscriptions|agent-state)$`],
|
|
156
|
+
[['network', 'ls'], `^${state.project}-network$`],
|
|
157
|
+
]) {
|
|
158
|
+
const output = await deps.command('docker', [...args, '--filter', `name=${name}`, '--format', 'json'], env);
|
|
159
|
+
const rows = output.trim() ? output.trim().startsWith('[') ? JSON.parse(output) : output.trim().split('\n').map(line => JSON.parse(line)) : [];
|
|
160
|
+
if (fresh && rows.length)
|
|
161
|
+
throw new Error('foreign project resources exist; refusing adoption');
|
|
162
|
+
if (state.binding && ((args[0] === 'volume' && rows.length !== 6) || (args[0] === 'network' && rows.length !== 1) || (args[0] === 'ps' && rows.length < (state.ready ? 3 : 2))))
|
|
163
|
+
throw new Error('saved owned deployment resources are missing; refusing regeneration/re-genesis');
|
|
164
|
+
for (const row of rows) {
|
|
165
|
+
const labels = row.Labels;
|
|
166
|
+
if (!(typeof labels === 'string' ? labels.split(',').includes(`${OWNER}=${state.id}`) : labels?.[OWNER] === state.id))
|
|
167
|
+
throw new Error('unrelated resource ownership; refusing start/replacement');
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
function validateState(state, dir, version) {
|
|
172
|
+
if (state.version !== 1 || state.uid !== process.getuid?.() || state.dir !== dir || !/^[0-9a-f]{24}$/.test(state.id) ||
|
|
173
|
+
state.project !== `meerkat-${state.id}` || state.committeeId !== `meerkatquorum${state.id}` || state.nodeId !== `meerkatnode${state.id}` || state.identity !== `meerkatuser${state.id}` ||
|
|
174
|
+
typeof state.daemonId !== 'string' || !/^[A-Za-z0-9:._-]{8,200}$/.test(state.daemonId) ||
|
|
175
|
+
!/^[A-Za-z0-9]{1,50}$/.test(state.registryOperator) || state.channel !== `meerkat.${state.id}.announcements` || state.packageVersion !== version ||
|
|
176
|
+
!['pending', 'attempted', 'complete'].includes(state.initialization) || !Array.isArray(state.ports) || state.ports.length !== 3 ||
|
|
177
|
+
new Set(state.ports).size !== 3 || state.ports.some(p => !Number.isSafeInteger(p) || p < 1024 || p > 65535) ||
|
|
178
|
+
(state.binding && (state.binding.nodeId !== state.nodeId || !/^[0-9a-f]{64}$/.test(state.binding.chainId))))
|
|
179
|
+
throw new Error('invalid saved installation or package version differs; refusing automatic migration/adoption');
|
|
180
|
+
}
|
|
181
|
+
export async function managedInstallation(env = process.env) {
|
|
182
|
+
const state = await readState(managedConfigPath(env));
|
|
183
|
+
if (state) {
|
|
184
|
+
const version = JSON.parse(await readFile(join(packageDir, 'package.json'), 'utf8')).version;
|
|
185
|
+
validateState(state, managedDirectory(env), version);
|
|
186
|
+
}
|
|
187
|
+
return state;
|
|
188
|
+
}
|
|
189
|
+
/** Protocol-only stdio bridge, one new facade/private child/session per harness connection.
|
|
190
|
+
* Docker exec works even when daemon and harness share neither filesystem nor loopback. */
|
|
191
|
+
export async function serveManaged(state, env = process.env) {
|
|
192
|
+
await ownership(state, defaults, operatorEnvironment(env), false);
|
|
193
|
+
if (state.initialization !== 'complete' || !state.binding || !state.ready)
|
|
194
|
+
throw new Error('managed install is incomplete; rerun install');
|
|
195
|
+
const cleanEnv = operatorEnvironment(env);
|
|
196
|
+
const observed = JSON.parse(await command('docker', ['exec', `${state.project}-registry`, 'node', control, 'node-binding', request(state)], cleanEnv));
|
|
197
|
+
if (observed.chainId !== state.binding.chainId || observed.nodeId !== state.binding.nodeId)
|
|
198
|
+
throw new Error('saved managed binding changed');
|
|
199
|
+
const token = randomBytes(16).toString('hex');
|
|
200
|
+
const sessionCommand = (mode) => command('docker', ['exec', `${state.project}-registry`, 'node', control, mode, token], cleanEnv).then(() => { });
|
|
201
|
+
let remoteStop, requestedStop = false, started = false;
|
|
202
|
+
const stopRemote = () => remoteStop ??= sessionCommand('stop-session');
|
|
203
|
+
let onFailure = () => { };
|
|
204
|
+
const stop = () => { requestedStop = true; if (started)
|
|
205
|
+
void stopRemote().catch(error => onFailure(error)); };
|
|
206
|
+
process.once('SIGINT', stop);
|
|
207
|
+
process.once('SIGTERM', stop);
|
|
208
|
+
try {
|
|
209
|
+
await sessionCommand('prepare-session');
|
|
210
|
+
if (requestedStop) {
|
|
211
|
+
await sessionCommand('discard-session');
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
await new Promise((resolve, reject) => {
|
|
215
|
+
onFailure = reject;
|
|
216
|
+
// The remote helper knows this exact preallocated token before docker exec can start.
|
|
217
|
+
// A signal before its PID is recorded sets cancellation, never signals an arbitrary PID.
|
|
218
|
+
started = true;
|
|
219
|
+
const child = spawn('docker', ['exec', '-i', `${state.project}-registry`, 'node', control, 'serve-session', token], { env: cleanEnv, stdio: 'inherit' });
|
|
220
|
+
child.once('error', error => { void sessionCommand('discard-session').then(() => reject(error), reject); });
|
|
221
|
+
child.once('close', code => {
|
|
222
|
+
void stopRemote().then(() => code === 0 || requestedStop ? resolve() : reject(new Error('owned Meerkat stdio process exited')), reject);
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
finally {
|
|
227
|
+
process.off('SIGINT', stop);
|
|
228
|
+
process.off('SIGTERM', stop);
|
|
229
|
+
if (started)
|
|
230
|
+
await stopRemote();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
export async function installMeerkat(env = process.env, deps = defaults) {
|
|
234
|
+
if (Number(process.versions.node.split('.')[0]) < 22)
|
|
235
|
+
throw new Error('Meerkat install requires Node.js 22 or newer, npm/npx, and Docker Engine with Compose v2');
|
|
236
|
+
const packageVersion = JSON.parse(await readFile(join(packageDir, 'package.json'), 'utf8')).version;
|
|
237
|
+
const dir = managedDirectory(env), configPath = managedConfigPath(env), cleanEnv = operatorEnvironment(env);
|
|
238
|
+
await deps.command('docker', ['version', '--format', 'json'], cleanEnv);
|
|
239
|
+
await deps.command('docker', ['compose', 'version'], cleanEnv);
|
|
240
|
+
await deps.command('npm', ['--version'], cleanEnv);
|
|
241
|
+
await deps.command('npx', ['--version'], cleanEnv);
|
|
242
|
+
const daemonId = (await deps.command('docker', ['info', '--format', '{{.ID}}'], cleanEnv)).trim();
|
|
243
|
+
if (!/^[A-Za-z0-9:._-]{8,200}$/.test(daemonId))
|
|
244
|
+
throw new Error('cannot establish Docker daemon identity');
|
|
245
|
+
await privateDirectory(dir);
|
|
246
|
+
const lock = join(dir, 'install.lock');
|
|
247
|
+
// Do not kill a Docker CLI and abandon its remote operation. An interrupt finishes the
|
|
248
|
+
// current bounded operation, persists its known checkpoint, then releases only this lock.
|
|
249
|
+
let interrupted = false, locked = false;
|
|
250
|
+
const interrupt = () => { interrupted = true; };
|
|
251
|
+
const checkpoint = () => { if (interrupted)
|
|
252
|
+
throw new Error('installation interrupted; owned state retained at its last known checkpoint, rerun the same install command'); };
|
|
253
|
+
process.once('SIGINT', interrupt);
|
|
254
|
+
process.once('SIGTERM', interrupt);
|
|
255
|
+
try {
|
|
256
|
+
await mkdir(lock, { mode: 0o700 }).catch(() => { throw new Error(`another installation owns ${lock}; no automatic lock recovery`); });
|
|
257
|
+
locked = true;
|
|
258
|
+
checkpoint();
|
|
259
|
+
let state = await readState(configPath);
|
|
260
|
+
const fresh = !state;
|
|
261
|
+
if (!state) {
|
|
262
|
+
// A previous explicit facade configuration is not ours to replace or adopt.
|
|
263
|
+
try {
|
|
264
|
+
await lstat(join(dir, 'config.json'));
|
|
265
|
+
throw new Error('unrelated Meerkat config exists; refusing replacement');
|
|
266
|
+
}
|
|
267
|
+
catch (e) {
|
|
268
|
+
if (e.code !== 'ENOENT')
|
|
269
|
+
throw e;
|
|
270
|
+
}
|
|
271
|
+
const id = randomBytes(12).toString('hex');
|
|
272
|
+
const assets = JSON.parse(await readFile(join(packageDir, 'dist', 'installer', 'runtime.json'), 'utf8'));
|
|
273
|
+
state = { version: 1, uid: process.getuid(), id, dir, project: `meerkat-${id}`, nodeId: `meerkatnode${id}`, committeeId: `meerkatquorum${id}`,
|
|
274
|
+
identity: `meerkatuser${id}`, registryOperator: assets.operatorIdentity, channel: `meerkat.${id}.announcements`, ports: [8440, 8450, 8090],
|
|
275
|
+
packageVersion, daemonId, initialization: 'pending' };
|
|
276
|
+
}
|
|
277
|
+
validateState(state, dir, packageVersion);
|
|
278
|
+
if (state.initialization === 'attempted')
|
|
279
|
+
throw new Error('fresh initialization was interrupted; retained state requires operator inspection, never automatic reseeding');
|
|
280
|
+
await ownership(state, deps, cleanEnv, fresh);
|
|
281
|
+
checkpoint();
|
|
282
|
+
if (fresh) {
|
|
283
|
+
await cp(join(packageDir, 'dist'), join(dir, 'package', 'dist'), { recursive: true, errorOnExist: true, force: false });
|
|
284
|
+
await cp(join(packageDir, 'installer'), join(dir, 'package', 'installer'), { recursive: true, errorOnExist: true, force: false });
|
|
285
|
+
await cp(join(packageDir, 'package.json'), join(dir, 'package', 'package.json'), { errorOnExist: true, force: false });
|
|
286
|
+
await saveState(state);
|
|
287
|
+
}
|
|
288
|
+
const composePath = join(dir, 'compose.json');
|
|
289
|
+
const compose = async (...args) => deps.command('docker', [...composeArgs(state), ...args], cleanEnv, dir);
|
|
290
|
+
await writeFile(composePath, JSON.stringify(renderDeployment(state), null, 2), { mode: 0o600 });
|
|
291
|
+
await compose('config', '--quiet');
|
|
292
|
+
checkpoint();
|
|
293
|
+
if (state.initialization === 'pending') {
|
|
294
|
+
await compose('build', 'committee', 'node', 'registry');
|
|
295
|
+
checkpoint();
|
|
296
|
+
state.initialization = 'attempted';
|
|
297
|
+
await saveState(state);
|
|
298
|
+
await compose('--profile', 'initialize-only', 'run', '--rm', '--no-deps', 'subscriptions-init');
|
|
299
|
+
state.initialization = 'complete';
|
|
300
|
+
await saveState(state);
|
|
301
|
+
checkpoint();
|
|
302
|
+
}
|
|
303
|
+
await compose('up', '-d', '--no-build', '--no-recreate', 'committee');
|
|
304
|
+
await deps.committeeReady(state, cleanEnv);
|
|
305
|
+
checkpoint();
|
|
306
|
+
await compose('up', '-d', '--no-build', '--no-recreate', 'node');
|
|
307
|
+
checkpoint();
|
|
308
|
+
const observed = await deps.nodeBinding(state, cleanEnv);
|
|
309
|
+
if (observed.nodeId !== state.nodeId || !/^[0-9a-f]{64}$/.test(observed.chainId) || (state.binding && state.binding.chainId !== observed.chainId))
|
|
310
|
+
throw new Error('owned node returned an invalid or changed saved binding');
|
|
311
|
+
state.binding = observed;
|
|
312
|
+
await saveState(state);
|
|
313
|
+
checkpoint();
|
|
314
|
+
await writeFile(composePath, JSON.stringify(renderDeployment(state), null, 2), { mode: 0o600 });
|
|
315
|
+
await compose('up', '-d', '--no-build', '--no-recreate', 'registry');
|
|
316
|
+
checkpoint();
|
|
317
|
+
await deps.registryReady(state, cleanEnv);
|
|
318
|
+
checkpoint();
|
|
319
|
+
await deps.bootstrap(state, cleanEnv);
|
|
320
|
+
state.ready = true;
|
|
321
|
+
await saveState(state);
|
|
322
|
+
checkpoint();
|
|
323
|
+
return { dir, configPath, registration: pinnedRegistration(state.packageVersion) };
|
|
324
|
+
}
|
|
325
|
+
finally {
|
|
326
|
+
try {
|
|
327
|
+
if (locked)
|
|
328
|
+
await rm(lock, { recursive: true });
|
|
329
|
+
}
|
|
330
|
+
finally {
|
|
331
|
+
process.off('SIGINT', interrupt);
|
|
332
|
+
process.off('SIGTERM', interrupt);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import type { AnnounceRequest } from "./announce.js";
|
|
3
|
+
import type { DetailRef } from "./contract.js";
|
|
4
|
+
export interface McpAnnounceSession {
|
|
5
|
+
callTool(name: string, args: Record<string, unknown>, signal?: AbortSignal): Promise<CallToolResult>;
|
|
6
|
+
/** Definitive local session/child liveness; false must not trigger reconnect-and-resume. */
|
|
7
|
+
isOpen(): boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface McpAnnounceOptions {
|
|
10
|
+
/** Trusted facade startup configuration, NOT request.channel or a model argument. */
|
|
11
|
+
readonly channel: string;
|
|
12
|
+
readonly signal?: AbortSignal;
|
|
13
|
+
/** Whole orchestration budget, including an optional awaited dependency hook. */
|
|
14
|
+
readonly timeoutMs?: number;
|
|
15
|
+
/** Dependency injection for an awaited pre-send barrier; never wired to environment/model data. */
|
|
16
|
+
readonly afterSign?: (txId: string) => Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export type McpAnnounceStage = "validation" | "preflight" | "publish" | "sign" | "before_submit" | "submit";
|
|
19
|
+
interface AnnouncementState {
|
|
20
|
+
readonly channel: string;
|
|
21
|
+
readonly ledgerId: string;
|
|
22
|
+
readonly seq?: number;
|
|
23
|
+
readonly expiresAtRound?: string;
|
|
24
|
+
readonly detail: DetailRef | null;
|
|
25
|
+
/** An unread/invalid publication acknowledgement does not prove storage was rolled back. */
|
|
26
|
+
readonly upload: "not_attempted" | "acknowledged" | "unknown";
|
|
27
|
+
readonly stage: McpAnnounceStage;
|
|
28
|
+
readonly message: string;
|
|
29
|
+
readonly reason?: string;
|
|
30
|
+
readonly commitIntervalMs?: number;
|
|
31
|
+
}
|
|
32
|
+
export type McpAnnouncementResult = AnnouncementState & ({
|
|
33
|
+
readonly kind: "committed" | "fined" | "unknown" | "already_submitted";
|
|
34
|
+
readonly txId: string;
|
|
35
|
+
} | {
|
|
36
|
+
readonly kind: "error" | "refused";
|
|
37
|
+
readonly txId?: string;
|
|
38
|
+
});
|
|
39
|
+
/** One same owned session; zero local signing/key/node access; one ordinary submit of its original id. */
|
|
40
|
+
export declare function announceViaMcp(session: McpAnnounceSession, request: AnnounceRequest, options: McpAnnounceOptions): Promise<McpAnnouncementResult>;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=mcp-announce.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-announce.d.ts","sourceRoot":"","sources":["../src/mcp-announce.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,eAAe,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACrG,4FAA4F;IAC5F,MAAM,IAAI,OAAO,CAAC;CACnB;AACD,MAAM,WAAW,kBAAkB;IACjC,qFAAqF;IACrF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,iFAAiF;IACjF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,mGAAmG;IACnG,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AACD,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,eAAe,GAAG,QAAQ,CAAC;AAC5G,UAAU,iBAAiB;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IAClC,4FAA4F;IAC5F,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,cAAc,GAAG,SAAS,CAAC;IAC9D,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AACD,MAAM,MAAM,qBAAqB,GAAG,iBAAiB,GAAG,CACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,mBAAmB,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjG;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CACjE,CAAC;AAkHF,0GAA0G;AAC1G,wBAAsB,cAAc,CAClC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,qBAAqB,CAAC,CA6FhC"}
|