@sentropic/h2a-runtime 0.98.3 → 0.98.5
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/gateway-host/sessions.d.ts +6 -0
- package/dist/gateway-host/sessions.d.ts.map +1 -1
- package/dist/gateway-host/sessions.js +64 -0
- package/dist/gateway-host/sessions.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -10
- package/dist/index.js.map +1 -1
- package/dist/llm-mesh-accounts.d.ts +15 -2
- package/dist/llm-mesh-accounts.d.ts.map +1 -1
- package/dist/llm-mesh-accounts.js +13 -3
- package/dist/llm-mesh-accounts.js.map +1 -1
- package/dist/native-terminal/crash-safe-log.d.ts +17 -0
- package/dist/native-terminal/crash-safe-log.d.ts.map +1 -0
- package/dist/native-terminal/crash-safe-log.js +79 -0
- package/dist/native-terminal/crash-safe-log.js.map +1 -0
- package/dist/native-terminal/fault-counters.d.ts +38 -0
- package/dist/native-terminal/fault-counters.d.ts.map +1 -0
- package/dist/native-terminal/fault-counters.js +46 -0
- package/dist/native-terminal/fault-counters.js.map +1 -0
- package/dist/native-terminal/host.d.ts.map +1 -1
- package/dist/native-terminal/host.js +98 -37
- package/dist/native-terminal/host.js.map +1 -1
- package/dist/native-terminal/journal.d.ts +5 -1
- package/dist/native-terminal/journal.d.ts.map +1 -1
- package/dist/native-terminal/journal.js +4 -1
- package/dist/native-terminal/journal.js.map +1 -1
- package/dist/native-terminal/process.d.ts.map +1 -1
- package/dist/native-terminal/process.js +38 -11
- package/dist/native-terminal/process.js.map +1 -1
- package/dist/native-terminal/server.d.ts +31 -0
- package/dist/native-terminal/server.d.ts.map +1 -1
- package/dist/native-terminal/server.js +196 -45
- package/dist/native-terminal/server.js.map +1 -1
- package/dist/native-terminal/socket-path.d.ts +1 -0
- package/dist/native-terminal/socket-path.d.ts.map +1 -1
- package/dist/native-terminal/socket-path.js +3 -3
- package/dist/native-terminal/socket-path.js.map +1 -1
- package/dist/native-terminal/supervisor.d.ts.map +1 -1
- package/dist/native-terminal/supervisor.js +60 -1
- package/dist/native-terminal/supervisor.js.map +1 -1
- package/dist/registry.d.ts +23 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +53 -0
- package/dist/registry.js.map +1 -1
- package/dist/resume-launch-options.d.ts +59 -0
- package/dist/resume-launch-options.d.ts.map +1 -0
- package/dist/resume-launch-options.js +64 -0
- package/dist/resume-launch-options.js.map +1 -0
- package/package.json +1 -1
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
* H2A owns only minting and forwarding this opaque, process-local bearer. It
|
|
5
5
|
* contains no provider credential, account binding, route, model or affinity.
|
|
6
6
|
* Mesh owns every one of those concerns after caller authentication.
|
|
7
|
+
*
|
|
8
|
+
* The registry persists to disk so a gateway restart (or an h2a upgrade, which
|
|
9
|
+
* restarts the gateway) keeps every live session's bearer valid: an old token
|
|
10
|
+
* still authenticates after boot, and re-acquiring the same sessionId returns
|
|
11
|
+
* the same token instead of minting a replacement. Owner decision 2026-10-10:
|
|
12
|
+
* restarts must never invalidate live sessions.
|
|
7
13
|
*/
|
|
8
14
|
export interface SessionEntry {
|
|
9
15
|
readonly sessionId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/gateway-host/sessions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/gateway-host/sessions.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AA+DD,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,aAAa,CAAC,CAgCxB;AAED,wBAAsB,WAAW,CAC/B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAGnC;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAI7E;AAED,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AAED,4EAA4E;AAC5E,wBAAgB,kBAAkB,IAAI,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,EAAE,CAGzE;AAED,wBAAgB,aAAa,IAAI,IAAI,CAKpC"}
|
|
@@ -1,9 +1,66 @@
|
|
|
1
1
|
// Retained h2a adapter — owner decision 2026-10-03 (sessions h2a kept until convergence with sentropic workspace/session notions)
|
|
2
2
|
import { randomBytes } from "node:crypto";
|
|
3
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { sentropicDir, writePrivateMetadata } from "./config-file.js";
|
|
3
6
|
const sessionsByToken = new Map();
|
|
4
7
|
const tokensBySession = new Map();
|
|
5
8
|
const newGatewayToken = () => `gw-v2-${randomBytes(32).toString("base64url")}`;
|
|
9
|
+
/**
|
|
10
|
+
* Persisted store shape. Written atomically (0600, tmp+rename) after every
|
|
11
|
+
* mint and reset; hydrated lazily on first access so any caller (host, daemon,
|
|
12
|
+
* doctor) sees the same restored state without an explicit boot hook.
|
|
13
|
+
*/
|
|
14
|
+
const gatewaySessionsStorePath = () => join(sentropicDir(), "llm-mesh-gateway-sessions.json");
|
|
15
|
+
let storeHydrated = false;
|
|
16
|
+
const validEntry = (value) => typeof value === "object" &&
|
|
17
|
+
value !== null &&
|
|
18
|
+
typeof value.sessionId === "string" &&
|
|
19
|
+
value.sessionId.length > 0 &&
|
|
20
|
+
typeof value.gatewayToken === "string" &&
|
|
21
|
+
value.gatewayToken.length > 0 &&
|
|
22
|
+
typeof value.clientSessionId === "string" &&
|
|
23
|
+
typeof value.createdAt === "string";
|
|
24
|
+
function ensureStoreHydrated() {
|
|
25
|
+
if (storeHydrated)
|
|
26
|
+
return;
|
|
27
|
+
storeHydrated = true;
|
|
28
|
+
const path = gatewaySessionsStorePath();
|
|
29
|
+
if (!existsSync(path))
|
|
30
|
+
return;
|
|
31
|
+
try {
|
|
32
|
+
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
33
|
+
if (!Array.isArray(parsed))
|
|
34
|
+
throw new Error("store is not a JSON array");
|
|
35
|
+
for (const entry of parsed) {
|
|
36
|
+
if (!validEntry(entry))
|
|
37
|
+
continue;
|
|
38
|
+
if (sessionsByToken.has(entry.gatewayToken))
|
|
39
|
+
continue;
|
|
40
|
+
sessionsByToken.set(entry.gatewayToken, entry);
|
|
41
|
+
const existingToken = tokensBySession.get(entry.sessionId);
|
|
42
|
+
if (existingToken === undefined)
|
|
43
|
+
tokensBySession.set(entry.sessionId, entry.gatewayToken);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
// Fail-soft: an unreadable or corrupt store never blocks the boot; the
|
|
48
|
+
// registry simply starts empty and mints fresh tokens as needed.
|
|
49
|
+
process.stderr.write(`[gateway-host] session bearer store unreadable (${error.message}); starting empty\n`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function persistStore() {
|
|
53
|
+
try {
|
|
54
|
+
writePrivateMetadata(gatewaySessionsStorePath(), [...sessionsByToken.values()]);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
// Persistence is best-effort for the running process: a failed write is
|
|
58
|
+
// logged but never blocks minting or serving.
|
|
59
|
+
process.stderr.write(`[gateway-host] session bearer store write failed (${error.message})\n`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
6
62
|
export async function acquireSession(sessionId, options = {}) {
|
|
63
|
+
ensureStoreHydrated();
|
|
7
64
|
const cleanSessionId = sessionId.trim();
|
|
8
65
|
if (!cleanSessionId)
|
|
9
66
|
throw new Error("sessionId (string) required");
|
|
@@ -29,6 +86,7 @@ export async function acquireSession(sessionId, options = {}) {
|
|
|
29
86
|
};
|
|
30
87
|
sessionsByToken.set(gatewayToken, entry);
|
|
31
88
|
tokensBySession.set(cleanSessionId, gatewayToken);
|
|
89
|
+
persistStore();
|
|
32
90
|
return {
|
|
33
91
|
gatewayToken,
|
|
34
92
|
sessionId: entry.sessionId,
|
|
@@ -36,21 +94,27 @@ export async function acquireSession(sessionId, options = {}) {
|
|
|
36
94
|
};
|
|
37
95
|
}
|
|
38
96
|
export async function lookupToken(gatewayToken) {
|
|
97
|
+
ensureStoreHydrated();
|
|
39
98
|
return sessionsByToken.get(gatewayToken);
|
|
40
99
|
}
|
|
41
100
|
export function lookupSessionById(sessionId) {
|
|
101
|
+
ensureStoreHydrated();
|
|
42
102
|
const token = tokensBySession.get(sessionId);
|
|
43
103
|
return token ? sessionsByToken.get(token) : undefined;
|
|
44
104
|
}
|
|
45
105
|
export function sessionCount() {
|
|
106
|
+
ensureStoreHydrated();
|
|
46
107
|
return sessionsByToken.size;
|
|
47
108
|
}
|
|
48
109
|
/** Public registry view for sessions that have not acquired a route yet. */
|
|
49
110
|
export function listPublicSessions() {
|
|
111
|
+
ensureStoreHydrated();
|
|
50
112
|
return [...sessionsByToken.values()].map(({ gatewayToken: _bearer, ...session }) => session);
|
|
51
113
|
}
|
|
52
114
|
export function resetSessions() {
|
|
115
|
+
ensureStoreHydrated();
|
|
53
116
|
sessionsByToken.clear();
|
|
54
117
|
tokensBySession.clear();
|
|
118
|
+
persistStore();
|
|
55
119
|
}
|
|
56
120
|
//# sourceMappingURL=sessions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/gateway-host/sessions.ts"],"names":[],"mappings":"AAAA,kIAAkI;AAClI,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/gateway-host/sessions.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAuEA,OAAO,EAsDL,KAAK,YAAY,EAClB,MAAM,WAAW,CAAC;AAsCnB,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAS7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAQ9C,OAAO,EAOL,KAAK,qBAAqB,EAE3B,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -29,6 +29,7 @@ import { deriveSessionClass } from "./session-class.js";
|
|
|
29
29
|
import { isRelaunchKillable, planRelaunch, relaunchContinuationPrompt, tryAcquireResumeLaunchClaim, wakeRelaunchedSession, } from "./relaunch.js";
|
|
30
30
|
import { isHumanFacingSession, legacySessionEvidence, readConversationCustomTitle, readLastLayout, reconcileRunConvIds, restore as restoreLayout, } from "./restore.js";
|
|
31
31
|
import { getLayoutConfig } from "./config.js";
|
|
32
|
+
import { resolvePinnedLaunchEntries } from "./resume-launch-options.js";
|
|
32
33
|
import { isManagedLocalKind, advanceJob, coerceRegistryTool, enroll, enrollFromRun, isLive, listJobs, listLocalForLs, loadRegistry, loadRegistryWithDiagnostics, probeNativeSession, probeTmuxSession, registryEntriesForNativeTarget, resolveLocalTmuxSessionForName, resolveManagedHost, tryClaimSlot, unreadableRegistryRowsForTarget, withRegistryLock, resolveRegistryPath, } from "./registry.js";
|
|
33
34
|
import { auditSessionLeaseFleet, countLiveSessionLeases, SessionLeaseStore, decideSessionBeat, isSessionLeaseAlive, isSessionLeaseAbandoned, isSessionLeaseDeadBoot, planLeaseSupervision, reclaimProposals, resolveSessionLeasePath, } from "./session-lease.js";
|
|
34
35
|
import { aimdEffectiveCap, assertDelegateEffort, assertSafeName, buildDelegateArgs, buildJobRows, buildRemoteDelegate, buildThrottleResumeArgs, canDelegateAtDepth, childDepthEnvValue, clampDepth, clampRemoteDepthBudget, conductorAdvisory, DEFAULT_MAX_CONCURRENT, DEPTH_ENV, inheritedDepthBudget, isDelegateType, isThrottleResumeDue, jitteredBackoffMs, JOB_ID_ENV, jobDir, planNextStarts, planThrottleStep, readJobResult, THROTTLE_MAX_ATTEMPTS, reconcileRemoteJobs, renderJobsTable, resolveJobCwd, runTrackMirror, sweepStaleJobs, trackItemNewArgs, trackItemRealizeArgs, } from "./delegate.js";
|
|
@@ -4269,16 +4270,22 @@ export async function main(argv) {
|
|
|
4269
4270
|
}
|
|
4270
4271
|
// By default launches are direct. --llm-gateway/--gw opts into the
|
|
4271
4272
|
// local gateway for any profile that consumes Anthropic-compatible env.
|
|
4272
|
-
|
|
4273
|
-
|
|
4273
|
+
// Self-heal (2026-10 outage): conflicting pinned rows are probed and
|
|
4274
|
+
// provably-dead ones pruned before the resume continues; a surviving
|
|
4275
|
+
// conflict is a fatal naming the ids in cause (resume-launch-options.ts).
|
|
4276
|
+
const resumeResolution = opts.resume
|
|
4277
|
+
? resolvePinnedLaunchEntries({ convId: opts.resume, cwd, tool: profile })
|
|
4278
|
+
: { state: "ok", entries: [], prunedIds: [] };
|
|
4279
|
+
if (resumeResolution.state === "unreadable") {
|
|
4274
4280
|
throw new Error("cannot recover pinned launch options: registry unreadable");
|
|
4275
4281
|
}
|
|
4276
|
-
|
|
4277
|
-
|
|
4278
|
-
if (resumeEntries.some((entry) => entry.bare !== resumeEntries[0]?.bare || entry.gatewayMode !== resumeEntries[0]?.gatewayMode)) {
|
|
4279
|
-
throw new Error("cannot recover pinned launch options: conflicting registry rows");
|
|
4282
|
+
if (resumeResolution.state === "conflict") {
|
|
4283
|
+
throw new Error(resumeResolution.reason);
|
|
4280
4284
|
}
|
|
4281
|
-
const
|
|
4285
|
+
for (const prunedId of resumeResolution.prunedIds) {
|
|
4286
|
+
process.stderr.write(`[h2a] pruned dead registry row ${prunedId} that pinned conflicting launch options for this resume\n`);
|
|
4287
|
+
}
|
|
4288
|
+
const pinnedLaunch = resumeResolution.entries[0];
|
|
4282
4289
|
const launchGatewayMode = gatewayModeForProfile(profile, gatewayMode === "auto" ? pinnedLaunch?.gatewayMode ?? "auto" : gatewayMode);
|
|
4283
4290
|
const command = localCliCommand(profile);
|
|
4284
4291
|
// A detached/background or run-once launch is a worker, even when its
|
|
@@ -7512,27 +7519,45 @@ export async function main(argv) {
|
|
|
7512
7519
|
llmMeshAccountCommand
|
|
7513
7520
|
.command("enroll <provider>")
|
|
7514
7521
|
.description("Enroll through the sentropic-owned OAuth state machine " +
|
|
7515
|
-
"(cloud-code, codex, muse
|
|
7522
|
+
"(cloud-code, codex, muse OAuth device flow, or mistral-vibe browser sign-in — alias: vibe). " +
|
|
7523
|
+
"--cli imports credentials from the provider's local CLI store instead (muse only)")
|
|
7516
7524
|
.option("--config-ref <ref>", "sentropic configuration reference for OAuth")
|
|
7525
|
+
.option("--cli", "import credentials from the provider's local CLI store (muse only) instead of the OAuth flow")
|
|
7517
7526
|
.action(async (provider, opts) => {
|
|
7518
7527
|
// "vibe" is the CLI-friendly alias of the mistral-vibe transport.
|
|
7519
7528
|
const normalized = provider === "vibe" ? "mistral-vibe" : provider;
|
|
7529
|
+
if (normalized === "muse-code") {
|
|
7530
|
+
// Owner decision 2026-10-10: muse-code is no longer a user entry —
|
|
7531
|
+
// muse enrolls via the OAuth device flow by default, --cli selects
|
|
7532
|
+
// the CLI-store import. Fail loudly instead of silently aliasing.
|
|
7533
|
+
process.stderr.write("[h2a] llm-mesh account: muse-code was removed; use " +
|
|
7534
|
+
"'h2a llm-mesh account enroll muse' (OAuth) or add --cli (CLI-store import)\n");
|
|
7535
|
+
process.exitCode = 1;
|
|
7536
|
+
return;
|
|
7537
|
+
}
|
|
7520
7538
|
if (normalized !== "cloud-code" &&
|
|
7521
7539
|
normalized !== "codex" &&
|
|
7522
7540
|
normalized !== "muse" &&
|
|
7523
|
-
normalized !== "muse-code" &&
|
|
7524
7541
|
normalized !== "mistral-vibe") {
|
|
7525
7542
|
process.stderr.write(`[h2a] llm-mesh account: unsupported provider "${provider}". ` +
|
|
7526
|
-
"Supported: cloud-code, codex, muse
|
|
7543
|
+
"Supported: cloud-code, codex, muse (OAuth; --cli imports the CLI store), mistral-vibe (alias: vibe)\n");
|
|
7527
7544
|
process.exitCode = 1;
|
|
7528
7545
|
return;
|
|
7529
7546
|
}
|
|
7530
7547
|
try {
|
|
7531
7548
|
const account = await enrollViaFacade(normalized, {
|
|
7532
7549
|
...(opts.configRef ? { configRef: opts.configRef } : {}),
|
|
7550
|
+
...(opts.cli ? { cliImport: true } : {}),
|
|
7533
7551
|
});
|
|
7534
7552
|
process.stdout.write(`[h2a] llm-mesh account: enrolled ${account.provider}; ` +
|
|
7535
7553
|
"account inventory remains in Sentropic\n");
|
|
7554
|
+
// The gateway loads the account inventory at boot only: an account
|
|
7555
|
+
// enrolled while it runs stays invisible and every route then fails
|
|
7556
|
+
// with no eligible candidate. Always say the next step (incident
|
|
7557
|
+
// 2026-10-10: post-boot enrollment invisible => 'No route available').
|
|
7558
|
+
if (readGatewayPid()) {
|
|
7559
|
+
process.stdout.write("[h2a] llm-mesh: the running gateway loads accounts at boot only — restart it to serve the new account (h2a llm-mesh restart)\n");
|
|
7560
|
+
}
|
|
7536
7561
|
}
|
|
7537
7562
|
catch (error) {
|
|
7538
7563
|
process.stderr.write(`[h2a] llm-mesh account: ${error instanceof Error ? error.message : String(error)}\n`);
|