@sentropic/h2a 0.97.3 → 0.97.4
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/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/dist/cli.d.ts +13 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +86 -40
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/mcp.d.ts +1 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +1 -0
- package/dist/mcp.js.map +1 -1
- package/dist/runtime/identity/bindings.d.ts +33 -0
- package/dist/runtime/identity/bindings.d.ts.map +1 -1
- package/dist/runtime/identity/bindings.js +49 -1
- package/dist/runtime/identity/bindings.js.map +1 -1
- package/dist/runtime/identity/index.d.ts +4 -4
- package/dist/runtime/identity/index.d.ts.map +1 -1
- package/dist/runtime/identity/index.js +2 -2
- package/dist/runtime/identity/index.js.map +1 -1
- package/dist/runtime/identity/live.d.ts +63 -0
- package/dist/runtime/identity/live.d.ts.map +1 -1
- package/dist/runtime/identity/live.js +339 -64
- package/dist/runtime/identity/live.js.map +1 -1
- package/dist/runtime/identity/worker.d.ts +19 -0
- package/dist/runtime/identity/worker.d.ts.map +1 -0
- package/dist/runtime/identity/worker.js +189 -0
- package/dist/runtime/identity/worker.js.map +1 -0
- package/dist/runtime/local-files/locks.d.ts +14 -0
- package/dist/runtime/local-files/locks.d.ts.map +1 -1
- package/dist/runtime/local-files/locks.js +13 -0
- package/dist/runtime/local-files/locks.js.map +1 -1
- package/dist/runtime/local-files/store.d.ts +21 -0
- package/dist/runtime/local-files/store.d.ts.map +1 -1
- package/dist/runtime/local-files/store.js +37 -6
- package/dist/runtime/local-files/store.js.map +1 -1
- package/dist/runtime/mcp/identity-state.d.ts +131 -0
- package/dist/runtime/mcp/identity-state.d.ts.map +1 -0
- package/dist/runtime/mcp/identity-state.js +288 -0
- package/dist/runtime/mcp/identity-state.js.map +1 -0
- package/dist/runtime/mcp/index.d.ts +1 -0
- package/dist/runtime/mcp/index.d.ts.map +1 -1
- package/dist/runtime/mcp/index.js +1 -0
- package/dist/runtime/mcp/index.js.map +1 -1
- package/dist/runtime/mcp/server.d.ts +23 -0
- package/dist/runtime/mcp/server.d.ts.map +1 -1
- package/dist/runtime/mcp/server.js +105 -2
- package/dist/runtime/mcp/server.js.map +1 -1
- package/dist/runtime/mcp/sessions.d.ts +12 -2
- package/dist/runtime/mcp/sessions.d.ts.map +1 -1
- package/dist/runtime/mcp/sessions.js +15 -3
- package/dist/runtime/mcp/sessions.js.map +1 -1
- package/dist/runtime/mcp/stdio.d.ts +21 -0
- package/dist/runtime/mcp/stdio.d.ts.map +1 -1
- package/dist/runtime/mcp/stdio.js +203 -84
- package/dist/runtime/mcp/stdio.js.map +1 -1
- package/dist/runtime/mcp/tools.d.ts.map +1 -1
- package/dist/runtime/mcp/tools.js +16 -0
- package/dist/runtime/mcp/tools.js.map +1 -1
- package/dist/runtime/mcp-http/readonly-allowlist.d.ts.map +1 -1
- package/dist/runtime/mcp-http/readonly-allowlist.js +3 -0
- package/dist/runtime/mcp-http/readonly-allowlist.js.map +1 -1
- package/package.json +3 -3
package/dist/cli.d.ts
CHANGED
|
@@ -38,6 +38,7 @@
|
|
|
38
38
|
*/
|
|
39
39
|
import type { H2AWorkspaceRef } from "@sentropic/h2a";
|
|
40
40
|
import { type HostInstallationDoctorOptions, type HostInstallationDoctorReport } from "./hosts/installation-doctor.js";
|
|
41
|
+
import { type McpIdentityRequest } from "./runtime/mcp/index.js";
|
|
41
42
|
import { type MirrorPushDaemonOptions } from "./runtime/mirror/index.js";
|
|
42
43
|
import { type H2ADrumbeatEntry } from "./runtime/drumbeat/index.js";
|
|
43
44
|
import { type H2ADriveInstructionPayload } from "./runtime/drive/index.js";
|
|
@@ -59,11 +60,23 @@ export declare function renderCliHelp(): string;
|
|
|
59
60
|
* (write-only) cannot express a readable stdin; tests cover `runMcpStdio`
|
|
60
61
|
* with `PassThrough` streams instead of going through this verb.
|
|
61
62
|
*/
|
|
63
|
+
/**
|
|
64
|
+
* L2: build the DEFERRED identity request from `mcp-serve` flags — pure, total,
|
|
65
|
+
* and lock-free (no key read, no registry parse, no lock wait). The transport
|
|
66
|
+
* hands this to a child worker that resolves identity OFF the MCP event loop, so
|
|
67
|
+
* `initialize` / `tools/list` / `h2a_identity_status` answer immediately. The
|
|
68
|
+
* synchronous {@link resolveAutoOpen} is kept unchanged for existing consumers.
|
|
69
|
+
*/
|
|
70
|
+
export declare function buildMcpIdentityRequest(flags: Record<string, string>, cwd: () => string): McpIdentityRequest;
|
|
62
71
|
/**
|
|
63
72
|
* DEC-105 (EVO-6): resolve the auto-open session config from `mcp-serve` flags.
|
|
64
73
|
* `--auto-open` enables it; the instance is `--instance <id>` or, if absent,
|
|
65
74
|
* `<host>:<cwd-leaf>` (host = `--host` or "agent"). Pure + total so it can be
|
|
66
75
|
* unit-tested without spawning the server. Returns undefined when not enabled.
|
|
76
|
+
*
|
|
77
|
+
* NOTE (L2): `mcp-serve` no longer calls this on its boot path — it defers
|
|
78
|
+
* identity via {@link buildMcpIdentityRequest}. This stays exported for the CLI
|
|
79
|
+
* consumers and tests that resolve identity synchronously.
|
|
67
80
|
*/
|
|
68
81
|
export declare function resolveAutoOpen(flags: Record<string, string>, cwd: () => string): {
|
|
69
82
|
instance: string;
|
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;AAwEH,OAAO,KAAK,EAOV,eAAe,EAChB,MAAM,gBAAgB,CAAC;AAQxB,OAAO,EAIL,KAAK,6BAA6B,EAClC,KAAK,4BAA4B,EAClC,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -1330,11 +1330,34 @@ function cmdComprehension(argv, streams) {
|
|
|
1330
1330
|
* (write-only) cannot express a readable stdin; tests cover `runMcpStdio`
|
|
1331
1331
|
* with `PassThrough` streams instead of going through this verb.
|
|
1332
1332
|
*/
|
|
1333
|
+
/**
|
|
1334
|
+
* L2: build the DEFERRED identity request from `mcp-serve` flags — pure, total,
|
|
1335
|
+
* and lock-free (no key read, no registry parse, no lock wait). The transport
|
|
1336
|
+
* hands this to a child worker that resolves identity OFF the MCP event loop, so
|
|
1337
|
+
* `initialize` / `tools/list` / `h2a_identity_status` answer immediately. The
|
|
1338
|
+
* synchronous {@link resolveAutoOpen} is kept unchanged for existing consumers.
|
|
1339
|
+
*/
|
|
1340
|
+
export function buildMcpIdentityRequest(flags, cwd) {
|
|
1341
|
+
const host = flags.host ?? "agent";
|
|
1342
|
+
return {
|
|
1343
|
+
root: resolveRoot(flags, cwd),
|
|
1344
|
+
host,
|
|
1345
|
+
cwd: cwd(),
|
|
1346
|
+
declaredCapabilities: [...H2A_CLI_DECLARED_CAPABILITIES],
|
|
1347
|
+
...(flags.instance !== undefined ? { explicitInstance: flags.instance } : {}),
|
|
1348
|
+
...(flags.name !== undefined ? { name: flags.name } : {}),
|
|
1349
|
+
...(flags.scope !== undefined ? { scopes: [flags.scope] } : {})
|
|
1350
|
+
};
|
|
1351
|
+
}
|
|
1333
1352
|
/**
|
|
1334
1353
|
* DEC-105 (EVO-6): resolve the auto-open session config from `mcp-serve` flags.
|
|
1335
1354
|
* `--auto-open` enables it; the instance is `--instance <id>` or, if absent,
|
|
1336
1355
|
* `<host>:<cwd-leaf>` (host = `--host` or "agent"). Pure + total so it can be
|
|
1337
1356
|
* unit-tested without spawning the server. Returns undefined when not enabled.
|
|
1357
|
+
*
|
|
1358
|
+
* NOTE (L2): `mcp-serve` no longer calls this on its boot path — it defers
|
|
1359
|
+
* identity via {@link buildMcpIdentityRequest}. This stays exported for the CLI
|
|
1360
|
+
* consumers and tests that resolve identity synchronously.
|
|
1338
1361
|
*/
|
|
1339
1362
|
export function resolveAutoOpen(flags, cwd) {
|
|
1340
1363
|
if (flags["auto-open"] === undefined)
|
|
@@ -1454,12 +1477,13 @@ export async function runMcpServe(flags, io = {
|
|
|
1454
1477
|
const root = trace
|
|
1455
1478
|
? trace.span("root_resolve", () => resolveRoot(flags, cwd))
|
|
1456
1479
|
: resolveRoot(flags, cwd);
|
|
1457
|
-
//
|
|
1458
|
-
//
|
|
1459
|
-
// live.
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1480
|
+
// L2: identity is resolved ASYNCHRONOUSLY in a dedicated child worker so
|
|
1481
|
+
// `initialize` / `tools/list` / `h2a_identity_status` answer immediately even
|
|
1482
|
+
// under a live lock. Here we ONLY capture the deferred request — no key read,
|
|
1483
|
+
// no lock wait, no ~17 MB registry parse on this event loop (the #249
|
|
1484
|
+
// "move-don't-shrink" trap is avoided by not resolving synchronously at all).
|
|
1485
|
+
// `--auto-open` absent → no identity (the explicit mode, unchanged).
|
|
1486
|
+
const identityRequest = flags["auto-open"] !== undefined ? buildMcpIdentityRequest(flags, cwd) : undefined;
|
|
1463
1487
|
const readinessEnv = io.env ?? process.env;
|
|
1464
1488
|
const readyFile = readinessEnv[H2A_MCP_READY_FILE_ENV];
|
|
1465
1489
|
const readyNonce = readinessEnv[H2A_MCP_READY_NONCE_ENV];
|
|
@@ -1565,55 +1589,79 @@ try {
|
|
|
1565
1589
|
}
|
|
1566
1590
|
}
|
|
1567
1591
|
// EVO-1 inbox wake (bug #3): --wake <driver-kind> injects a signed wake on
|
|
1568
|
-
// inbox arrival (requires --auto-open + a resolvable private key).
|
|
1592
|
+
// inbox arrival (requires --auto-open + a resolvable private key). The KIND is
|
|
1593
|
+
// validated eagerly; the driver is BUILT only after asynchronous activation,
|
|
1594
|
+
// when the resolved private key is available (deferred `buildWake`).
|
|
1569
1595
|
const WAKE_KINDS = ["logging", "native", "local-tmux", "headless", "auto"];
|
|
1570
1596
|
const nativeSessionId = nativePtyWakeTarget(readinessEnv);
|
|
1571
|
-
let
|
|
1572
|
-
if (autoOpen?.privateKeyPath) {
|
|
1573
|
-
try {
|
|
1574
|
-
identityPrivateKeyPem = readFileSync(autoOpen.privateKeyPath, "utf8");
|
|
1575
|
-
}
|
|
1576
|
-
catch (err) {
|
|
1577
|
-
io.stderr.write(`h2a mcp-serve: local signing unavailable (cannot read key): ${err.message}\n`);
|
|
1578
|
-
}
|
|
1579
|
-
}
|
|
1580
|
-
let wake;
|
|
1597
|
+
let wakeKind;
|
|
1581
1598
|
if (flags.wake !== undefined && !WAKE_KINDS.includes(flags.wake)) {
|
|
1582
1599
|
io.stderr.write("h2a mcp-serve: --wake must be one of logging|native|local-tmux|headless|auto; ignored\n");
|
|
1583
1600
|
}
|
|
1584
1601
|
else if (flags.wake === "headless") {
|
|
1585
|
-
// A self-wake must NEVER spawn a new agent. headless does exactly that.
|
|
1586
1602
|
io.stderr.write("h2a mcp-serve: --wake headless is unsafe (it would spawn a NEW agent on inbox arrival, not wake this one); use auto. ignored\n");
|
|
1587
1603
|
}
|
|
1588
|
-
else if (flags.wake !== undefined &&
|
|
1604
|
+
else if (flags.wake !== undefined && identityRequest === undefined) {
|
|
1605
|
+
io.stderr.write("h2a mcp-serve: --wake requires --auto-open; ignored\n");
|
|
1606
|
+
}
|
|
1607
|
+
else if (flags.wake !== undefined) {
|
|
1608
|
+
wakeKind = flags.wake;
|
|
1609
|
+
}
|
|
1610
|
+
// L2 activation wiring: turn the ASYNC-resolved identity into the presence
|
|
1611
|
+
// config + wake driver + live signer. Runs only once identity is really bound.
|
|
1612
|
+
const buildAutoOpen = (identity) => {
|
|
1613
|
+
const host = flags.host;
|
|
1614
|
+
if (identity.migrationNotice) {
|
|
1615
|
+
io.stderr.write(`h2a mcp-serve: ${identity.migrationNotice}\n`);
|
|
1616
|
+
}
|
|
1617
|
+
// §D1b: follow the host title only when the name was implicit and a real
|
|
1618
|
+
// provider session id was readable, and only for a host we can re-read.
|
|
1619
|
+
const refreshableHost = host === "claude" || host === "codex";
|
|
1620
|
+
const refreshDisplayName = flags.name === undefined && identity.providerSessionId !== undefined && refreshableHost
|
|
1621
|
+
? createHostSessionNameRefresher({
|
|
1622
|
+
host,
|
|
1623
|
+
cwd: cwd(),
|
|
1624
|
+
sessionId: identity.providerSessionId
|
|
1625
|
+
})
|
|
1626
|
+
: undefined;
|
|
1627
|
+
// The worker sends the real workspace object over IPC (typed `unknown` there
|
|
1628
|
+
// because IPC carries no nominal types); it is an H2AWorkspaceRef at runtime.
|
|
1629
|
+
const workspace = identity.workspace;
|
|
1630
|
+
return {
|
|
1631
|
+
instance: identity.instance,
|
|
1632
|
+
...(host ? { host } : {}),
|
|
1633
|
+
...(workspace !== undefined ? { workspace } : {}),
|
|
1634
|
+
...(identity.name !== undefined ? { name: identity.name } : {}),
|
|
1635
|
+
...(refreshDisplayName ? { refreshDisplayName } : {}),
|
|
1636
|
+
...(flags.scope ? { scopes: [flags.scope] } : {}),
|
|
1637
|
+
// An explicit --instance is an operator label, not an owned identity: it
|
|
1638
|
+
// may open presence but never attributes an h2a_run delegation.
|
|
1639
|
+
...(flags.instance === undefined ? { delegationEligible: true } : {})
|
|
1640
|
+
};
|
|
1641
|
+
};
|
|
1642
|
+
const buildWake = (privateKeyPem, _instance, host) => {
|
|
1643
|
+
if (wakeKind === undefined)
|
|
1644
|
+
return undefined;
|
|
1589
1645
|
try {
|
|
1590
1646
|
const log = (line) => io.stderr.write(`${line}\n`);
|
|
1591
|
-
|
|
1592
|
-
// fallback spawns a new agent, wrong for waking yourself).
|
|
1593
|
-
// The shared `--wake auto` configuration stays bounded here: its native
|
|
1594
|
-
// launcher marker chooses the backchannel first, with tmux as fallback.
|
|
1595
|
-
const driver = flags.wake === "auto"
|
|
1647
|
+
const driver = wakeKind === "auto"
|
|
1596
1648
|
? chainDriver(nativePtyBackchannelDriver(log), localTmuxDriver({ log }))
|
|
1597
|
-
: buildDriveDriver(nativeSessionId !== undefined &&
|
|
1649
|
+
: buildDriveDriver(nativeSessionId !== undefined && wakeKind === "local-tmux"
|
|
1598
1650
|
? "native"
|
|
1599
|
-
:
|
|
1600
|
-
|
|
1651
|
+
: wakeKind, log);
|
|
1652
|
+
void host;
|
|
1653
|
+
return {
|
|
1601
1654
|
driver,
|
|
1602
|
-
privateKeyPem
|
|
1655
|
+
privateKeyPem,
|
|
1603
1656
|
...(nativeSessionId !== undefined ? { nativeSessionId } : {})
|
|
1604
1657
|
};
|
|
1605
1658
|
}
|
|
1606
1659
|
catch (err) {
|
|
1607
|
-
io.stderr.write(`h2a mcp-serve: --wake disabled
|
|
1660
|
+
io.stderr.write(`h2a mcp-serve: --wake disabled: ${err.message}\n`);
|
|
1661
|
+
return undefined;
|
|
1608
1662
|
}
|
|
1609
|
-
}
|
|
1610
|
-
else if (flags.wake !== undefined && !autoOpen) {
|
|
1611
|
-
io.stderr.write("h2a mcp-serve: --wake requires --auto-open; ignored\n");
|
|
1612
|
-
}
|
|
1663
|
+
};
|
|
1613
1664
|
try {
|
|
1614
|
-
if (autoOpen?.migrationNotice) {
|
|
1615
|
-
io.stderr.write(`h2a mcp-serve: ${autoOpen.migrationNotice}\n`);
|
|
1616
|
-
}
|
|
1617
1665
|
trace?.phase("transport_enter");
|
|
1618
1666
|
await runMcpStdio({
|
|
1619
1667
|
root,
|
|
@@ -1621,12 +1669,10 @@ try {
|
|
|
1621
1669
|
stdin: io.stdin,
|
|
1622
1670
|
stdout: io.stdout,
|
|
1623
1671
|
stderr: io.stderr,
|
|
1624
|
-
...(
|
|
1625
|
-
|
|
1626
|
-
? { sendContext: { instance: autoOpen.instance, privateKeyPem: identityPrivateKeyPem } }
|
|
1672
|
+
...(identityRequest
|
|
1673
|
+
? { identityRequest, identityActivation: { buildAutoOpen, buildWake } }
|
|
1627
1674
|
: {}),
|
|
1628
1675
|
...(readiness ? { readiness } : {}),
|
|
1629
|
-
...(wake ? { wake } : {}),
|
|
1630
1676
|
...(io.signal ? { signal: io.signal } : {})
|
|
1631
1677
|
});
|
|
1632
1678
|
return 0;
|