@sentropic/h2a-cli 0.26.3 → 0.27.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/dist/bin.js +7 -1
- package/dist/bin.js.map +1 -1
- package/dist/cli.d.ts +18 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +104 -0
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/runtime/mirror/accept.d.ts +39 -0
- package/dist/runtime/mirror/accept.d.ts.map +1 -0
- package/dist/runtime/mirror/accept.js +49 -0
- package/dist/runtime/mirror/accept.js.map +1 -0
- package/dist/runtime/mirror/build.d.ts +25 -0
- package/dist/runtime/mirror/build.d.ts.map +1 -0
- package/dist/runtime/mirror/build.js +33 -0
- package/dist/runtime/mirror/build.js.map +1 -0
- package/dist/runtime/mirror/index.d.ts +9 -0
- package/dist/runtime/mirror/index.d.ts.map +1 -0
- package/dist/runtime/mirror/index.js +9 -0
- package/dist/runtime/mirror/index.js.map +1 -0
- package/dist/runtime/mirror/serve.d.ts +30 -0
- package/dist/runtime/mirror/serve.d.ts.map +1 -0
- package/dist/runtime/mirror/serve.js +89 -0
- package/dist/runtime/mirror/serve.js.map +1 -0
- package/package.json +2 -2
package/dist/bin.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { runCli, runDriveServe, runMcpServe, runRemoteSend, runRemoteServe, runDrumbeatRelanceInbox, runDrumbeatWatch, runSysmlVerify } from "./cli.js";
|
|
2
|
+
import { runCli, runDriveServe, runMcpServe, runRemoteSend, runRemoteServe, runMirrorServe, runMirrorPush, runDrumbeatRelanceInbox, runDrumbeatWatch, runSysmlVerify } from "./cli.js";
|
|
3
3
|
const argv = process.argv.slice(2);
|
|
4
4
|
function parseFlagsFrom(start) {
|
|
5
5
|
const flags = {};
|
|
@@ -38,6 +38,12 @@ else if (argv[0] === "remote" && argv[1] === "serve") {
|
|
|
38
38
|
else if (argv[0] === "remote" && argv[1] === "send") {
|
|
39
39
|
runAsync("remote send", runRemoteSend(parseFlagsFrom(2)));
|
|
40
40
|
}
|
|
41
|
+
else if (argv[0] === "remote" && argv[1] === "mirror-serve") {
|
|
42
|
+
runAsync("remote mirror-serve", runMirrorServe(parseFlagsFrom(2)));
|
|
43
|
+
}
|
|
44
|
+
else if (argv[0] === "remote" && argv[1] === "mirror") {
|
|
45
|
+
runAsync("remote mirror", runMirrorPush(parseFlagsFrom(2)));
|
|
46
|
+
}
|
|
41
47
|
else if (argv[0] === "drive" && argv[1] === "serve") {
|
|
42
48
|
runAsync("drive serve", runDriveServe(parseFlagsFrom(2)));
|
|
43
49
|
}
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -111,6 +111,24 @@ export declare function runDriveServe(flags: Record<string, string>, io?: {
|
|
|
111
111
|
* 1 otherwise; prints `{ status, body }`.
|
|
112
112
|
*/
|
|
113
113
|
export declare function runRemoteSend(flags: Record<string, string>, streams?: H2ACliStreams): Promise<number>;
|
|
114
|
+
/**
|
|
115
|
+
* `h2a remote mirror-serve` (EVO-13 P1): long-running ingester that applies
|
|
116
|
+
* signed instance mirrors to the store registry. Authority = an operator-enrolled
|
|
117
|
+
* key or an already-registered key (never a self-declared id). Binds 127.0.0.1
|
|
118
|
+
* unless `--host 0.0.0.0`. Async + blocking → dispatched from bin.ts.
|
|
119
|
+
*/
|
|
120
|
+
export declare function runMirrorServe(flags: Record<string, string>, io?: {
|
|
121
|
+
stdout: NodeJS.WritableStream;
|
|
122
|
+
stderr: NodeJS.WritableStream;
|
|
123
|
+
cwd?: () => string;
|
|
124
|
+
onListening?: (server: import("node:http").Server) => void;
|
|
125
|
+
}): Promise<number>;
|
|
126
|
+
/**
|
|
127
|
+
* `h2a remote mirror` (EVO-13 P1): build the local instance's own registration
|
|
128
|
+
* mirror, sign it with `--private-key`, and POST it to a remote ingester `--url`.
|
|
129
|
+
* Exit 0 on a 2xx. Async (network) → dispatched from bin.ts.
|
|
130
|
+
*/
|
|
131
|
+
export declare function runMirrorPush(flags: Record<string, string>, streams?: H2ACliStreams): Promise<number>;
|
|
114
132
|
/**
|
|
115
133
|
* `h2a org` (EVO-7 slice 2, DEC-109): read-only tooling over the committed org
|
|
116
134
|
* manifest (`org.h2a.yaml`). `validate` parses + checks the h2a invariants;
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AA+CH,OAAO,KAAK,EAOV,eAAe,EAChB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -54,6 +54,7 @@ import { runMcpStdio } from "./runtime/mcp/index.js";
|
|
|
54
54
|
import { renderK8sSidecar } from "./runtime/deploy/k8s-sidecar.js";
|
|
55
55
|
import { renderK8sTenant } from "./runtime/deploy/k8s-tenant.js";
|
|
56
56
|
import { remoteServerForStore, sendRemoteEnvelope } from "./runtime/remote/index.js";
|
|
57
|
+
import { buildInstanceMirror, mirrorServerForStore } from "./runtime/mirror/index.js";
|
|
57
58
|
import { recordStop, scanDrumbeat, clearDrumbeatEntry, runDrumbeatWatch as runDrumbeatWatchLoop, loggingRelauncher, localTmuxRelauncher, headlessRelauncher, remoteRelauncher, chainRelauncher, relanceFromInbox, loggingDecider, subagentDecider, H2A_DEFAULT_MAX_RELANCES } from "./runtime/drumbeat/index.js";
|
|
58
59
|
import { gatherNhiSnapshot } from "./runtime/nhi.js";
|
|
59
60
|
import { raiseBlockage, listBlockages, resolveBlockage } from "./runtime/blockage/index.js";
|
|
@@ -153,6 +154,8 @@ export function renderCliHelp() {
|
|
|
153
154
|
" h2a upgrade [--check] (--check: report current vs latest; bare: npm i -g @sentropic/h2a-cli@latest)",
|
|
154
155
|
" h2a remote serve [--port <n>] [--host <h>] [--path </h2a/envelopes>] [--root <path>]",
|
|
155
156
|
" h2a remote send --url <u> --instance <signer> --private-key <pem> --json <envelope>",
|
|
157
|
+
" h2a remote mirror-serve [--port <n>] [--host <h>] [--path </h2a/mirror>] [--enrolled-keys-file <json>] [--root <path>] (EVO-13 instance-mirror ingester; enrolled keys also via H2A_MIRROR_ENROLLED_KEYS base64)",
|
|
158
|
+
" h2a remote mirror --url <u> --instance <id> --private-key <pem> [--root <path>] (push this instance's registration to a remote ingester)",
|
|
156
159
|
" h2a drive --from <instance> --to <instance> --instruction <text> --private-key <pem> [--driver logging|native|local-tmux|headless|auto] [--host <host>] [--root <path>]",
|
|
157
160
|
" h2a drive receive --to <instance> (--line <signed-line> | --stdin) [--ignore-non-drive] [--root <path>] (verify-before-act gate for host hooks)",
|
|
158
161
|
" h2a drive serve --to <instance> --inject-command <command> [--port <n>] [--host <h>] [--path </h2a/drive>] [--root <path>] (remote verify-before-inject service)",
|
|
@@ -1272,6 +1275,107 @@ export async function runRemoteSend(flags, streams = { stdout: process.stdout, s
|
|
|
1272
1275
|
streams.stdout.write(`${JSON.stringify({ status: result.status, body: result.body }, null, 2)}\n`);
|
|
1273
1276
|
return result.status >= 200 && result.status < 300 ? 0 : 1;
|
|
1274
1277
|
}
|
|
1278
|
+
/**
|
|
1279
|
+
* Operator-enrolled key PEMs the mirror ingester trusts (EVO-13). Source order:
|
|
1280
|
+
* `--enrolled-keys-file` (JSON array of PEM strings), else `H2A_MIRROR_ENROLLED_KEYS`
|
|
1281
|
+
* (base64 of that JSON array — newline-safe for a k8s Secret env). Empty = refuse
|
|
1282
|
+
* every not-yet-registered signer (no TOFU on the wire).
|
|
1283
|
+
*/
|
|
1284
|
+
function loadEnrolledKeys(flags, env) {
|
|
1285
|
+
const raw = flags["enrolled-keys-file"]
|
|
1286
|
+
? readFileSync(flags["enrolled-keys-file"], "utf8")
|
|
1287
|
+
: env.H2A_MIRROR_ENROLLED_KEYS
|
|
1288
|
+
? Buffer.from(env.H2A_MIRROR_ENROLLED_KEYS, "base64").toString("utf8")
|
|
1289
|
+
: "[]";
|
|
1290
|
+
const parsed = JSON.parse(raw);
|
|
1291
|
+
if (!Array.isArray(parsed) || parsed.some((k) => typeof k !== "string")) {
|
|
1292
|
+
throw new Error("enrolled keys must be a JSON array of PEM strings");
|
|
1293
|
+
}
|
|
1294
|
+
return parsed;
|
|
1295
|
+
}
|
|
1296
|
+
/**
|
|
1297
|
+
* `h2a remote mirror-serve` (EVO-13 P1): long-running ingester that applies
|
|
1298
|
+
* signed instance mirrors to the store registry. Authority = an operator-enrolled
|
|
1299
|
+
* key or an already-registered key (never a self-declared id). Binds 127.0.0.1
|
|
1300
|
+
* unless `--host 0.0.0.0`. Async + blocking → dispatched from bin.ts.
|
|
1301
|
+
*/
|
|
1302
|
+
export async function runMirrorServe(flags, io = { stdout: process.stdout, stderr: process.stderr }) {
|
|
1303
|
+
const cwd = io.cwd ?? (() => process.cwd());
|
|
1304
|
+
const root = resolveRoot(flags, cwd);
|
|
1305
|
+
const host = flags.host ?? "127.0.0.1";
|
|
1306
|
+
const port = flags.port ? Number.parseInt(flags.port, 10) : 8788;
|
|
1307
|
+
if (!Number.isInteger(port) || port < 0 || port > 65535) {
|
|
1308
|
+
io.stderr.write(`h2a remote mirror-serve: invalid --port "${flags.port}"\n`);
|
|
1309
|
+
return 1;
|
|
1310
|
+
}
|
|
1311
|
+
let enrolledKeys;
|
|
1312
|
+
try {
|
|
1313
|
+
enrolledKeys = loadEnrolledKeys(flags, process.env);
|
|
1314
|
+
}
|
|
1315
|
+
catch (error) {
|
|
1316
|
+
io.stderr.write(`h2a remote mirror-serve: ${error.message}\n`);
|
|
1317
|
+
return 1;
|
|
1318
|
+
}
|
|
1319
|
+
let store;
|
|
1320
|
+
try {
|
|
1321
|
+
store = createLocalStore({ root });
|
|
1322
|
+
}
|
|
1323
|
+
catch (error) {
|
|
1324
|
+
io.stderr.write(`h2a remote mirror-serve: ${error.message}\n`);
|
|
1325
|
+
return 1;
|
|
1326
|
+
}
|
|
1327
|
+
const server = mirrorServerForStore(store, { enrolledKeys, ...(flags.path ? { path: flags.path } : {}) });
|
|
1328
|
+
return await new Promise((resolve) => {
|
|
1329
|
+
server.on("error", (err) => {
|
|
1330
|
+
io.stderr.write(`h2a remote mirror-serve: ${err.message}\n`);
|
|
1331
|
+
resolve(1);
|
|
1332
|
+
});
|
|
1333
|
+
server.listen(port, host, () => {
|
|
1334
|
+
io.stdout.write(`h2a remote mirror-serve: listening on http://${host}:${port}${flags.path ?? "/h2a/mirror"} (root ${root}, ${enrolledKeys.length} enrolled keys)\n`);
|
|
1335
|
+
io.onListening?.(server);
|
|
1336
|
+
});
|
|
1337
|
+
server.on("close", () => resolve(0));
|
|
1338
|
+
});
|
|
1339
|
+
}
|
|
1340
|
+
/**
|
|
1341
|
+
* `h2a remote mirror` (EVO-13 P1): build the local instance's own registration
|
|
1342
|
+
* mirror, sign it with `--private-key`, and POST it to a remote ingester `--url`.
|
|
1343
|
+
* Exit 0 on a 2xx. Async (network) → dispatched from bin.ts.
|
|
1344
|
+
*/
|
|
1345
|
+
export async function runMirrorPush(flags, streams = { stdout: process.stdout, stderr: process.stderr }) {
|
|
1346
|
+
if (!flags.url || !flags.instance || !flags["private-key"]) {
|
|
1347
|
+
streams.stderr.write("h2a remote mirror: --url, --instance and --private-key are required\n");
|
|
1348
|
+
return 1;
|
|
1349
|
+
}
|
|
1350
|
+
const cwd = streams.cwd ?? (() => process.cwd());
|
|
1351
|
+
const root = resolveRoot(flags, cwd);
|
|
1352
|
+
let envelope;
|
|
1353
|
+
try {
|
|
1354
|
+
envelope = buildInstanceMirror(createLocalStore({ root }), flags.instance, Date.now());
|
|
1355
|
+
}
|
|
1356
|
+
catch (error) {
|
|
1357
|
+
streams.stderr.write(`h2a remote mirror: ${error.message}\n`);
|
|
1358
|
+
return 1;
|
|
1359
|
+
}
|
|
1360
|
+
let privateKeyPem;
|
|
1361
|
+
try {
|
|
1362
|
+
privateKeyPem = readFileSync(flags["private-key"], "utf8");
|
|
1363
|
+
}
|
|
1364
|
+
catch (error) {
|
|
1365
|
+
streams.stderr.write(`h2a remote mirror: cannot read --private-key (${error.message})\n`);
|
|
1366
|
+
return 1;
|
|
1367
|
+
}
|
|
1368
|
+
let result;
|
|
1369
|
+
try {
|
|
1370
|
+
result = await sendRemoteEnvelope(flags.url, envelope, { by: flags.instance, privateKeyPem });
|
|
1371
|
+
}
|
|
1372
|
+
catch (error) {
|
|
1373
|
+
streams.stderr.write(`h2a remote mirror: ${error.message}\n`);
|
|
1374
|
+
return 1;
|
|
1375
|
+
}
|
|
1376
|
+
streams.stdout.write(`${JSON.stringify({ status: result.status, body: result.body }, null, 2)}\n`);
|
|
1377
|
+
return result.status >= 200 && result.status < 300 ? 0 : 1;
|
|
1378
|
+
}
|
|
1275
1379
|
function cmdDrumbeat(argv, streams) {
|
|
1276
1380
|
// DEC-086 (D2): durable anti-stall registry — record stops, scan candidates,
|
|
1277
1381
|
// clear. The long-running `watch` daemon is async (dispatched from bin.ts).
|