@sentropic/h2a-runtime 0.98.7-rc.1 → 0.98.7-rc.10
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/agent-launch-args.d.ts.map +1 -1
- package/dist/agent-launch-args.js +5 -5
- package/dist/agent-launch-args.js.map +1 -1
- package/dist/agy-claude.d.ts +42 -0
- package/dist/agy-claude.d.ts.map +1 -0
- package/dist/agy-claude.js +148 -0
- package/dist/agy-claude.js.map +1 -0
- package/dist/agy-headless.d.ts +11 -0
- package/dist/agy-headless.d.ts.map +1 -0
- package/dist/agy-headless.js +104 -0
- package/dist/agy-headless.js.map +1 -0
- package/dist/attach.d.ts +3 -0
- package/dist/attach.d.ts.map +1 -1
- package/dist/attach.js +2 -0
- package/dist/attach.js.map +1 -1
- package/dist/central-mcp.d.ts +32 -0
- package/dist/central-mcp.d.ts.map +1 -1
- package/dist/central-mcp.js +186 -69
- package/dist/central-mcp.js.map +1 -1
- package/dist/claude-code-cli-isolation.d.ts +53 -0
- package/dist/claude-code-cli-isolation.d.ts.map +1 -0
- package/dist/claude-code-cli-isolation.js +277 -0
- package/dist/claude-code-cli-isolation.js.map +1 -0
- package/dist/claude-code-cli-lifecycle.d.ts +80 -0
- package/dist/claude-code-cli-lifecycle.d.ts.map +1 -0
- package/dist/claude-code-cli-lifecycle.js +402 -0
- package/dist/claude-code-cli-lifecycle.js.map +1 -0
- package/dist/claude-code-cli-runner.d.ts +89 -0
- package/dist/claude-code-cli-runner.d.ts.map +1 -0
- package/dist/claude-code-cli-runner.js +659 -0
- package/dist/claude-code-cli-runner.js.map +1 -0
- package/dist/claude-seat-input.d.ts +47 -0
- package/dist/claude-seat-input.d.ts.map +1 -0
- package/dist/claude-seat-input.js +272 -0
- package/dist/claude-seat-input.js.map +1 -0
- package/dist/claude-seat-mesh-contract.d.ts +88 -0
- package/dist/claude-seat-mesh-contract.d.ts.map +1 -0
- package/dist/claude-seat-mesh-contract.js +13 -0
- package/dist/claude-seat-mesh-contract.js.map +1 -0
- package/dist/cli-seat-codecs.d.ts +86 -0
- package/dist/cli-seat-codecs.d.ts.map +1 -0
- package/dist/cli-seat-codecs.js +255 -0
- package/dist/cli-seat-codecs.js.map +1 -0
- package/dist/cli-seat-fixtures.d.ts +86 -0
- package/dist/cli-seat-fixtures.d.ts.map +1 -0
- package/dist/cli-seat-fixtures.js +114 -0
- package/dist/cli-seat-fixtures.js.map +1 -0
- package/dist/cli-seat-materialization.d.ts +245 -0
- package/dist/cli-seat-materialization.d.ts.map +1 -0
- package/dist/cli-seat-materialization.js +646 -0
- package/dist/cli-seat-materialization.js.map +1 -0
- package/dist/conv-guard.d.ts.map +1 -1
- package/dist/conv-guard.js +6 -2
- package/dist/conv-guard.js.map +1 -1
- package/dist/delegate.d.ts +10 -0
- package/dist/delegate.d.ts.map +1 -1
- package/dist/delegate.js +29 -0
- package/dist/delegate.js.map +1 -1
- package/dist/file-lock.d.ts +4 -2
- package/dist/file-lock.d.ts.map +1 -1
- package/dist/file-lock.js +24 -10
- package/dist/file-lock.js.map +1 -1
- package/dist/gateway-host/claude-seat-client.d.ts +32 -0
- package/dist/gateway-host/claude-seat-client.d.ts.map +1 -0
- package/dist/gateway-host/claude-seat-client.js +38 -0
- package/dist/gateway-host/claude-seat-client.js.map +1 -0
- package/dist/gateway-host/config-file.d.ts +2 -0
- package/dist/gateway-host/config-file.d.ts.map +1 -1
- package/dist/gateway-host/config-file.js +5 -1
- package/dist/gateway-host/config-file.js.map +1 -1
- package/dist/gateway-host/daemon.d.ts.map +1 -1
- package/dist/gateway-host/daemon.js +1 -2
- package/dist/gateway-host/daemon.js.map +1 -1
- package/dist/gateway-host/host.d.ts +6 -0
- package/dist/gateway-host/host.d.ts.map +1 -1
- package/dist/gateway-host/host.js +24 -3
- package/dist/gateway-host/host.js.map +1 -1
- package/dist/gateway-host/live-auth.d.ts +62 -0
- package/dist/gateway-host/live-auth.d.ts.map +1 -0
- package/dist/gateway-host/live-auth.js +87 -0
- package/dist/gateway-host/live-auth.js.map +1 -0
- package/dist/gateway-host/live-declarations.d.ts.map +1 -1
- package/dist/gateway-host/live-declarations.js +13 -7
- package/dist/gateway-host/live-declarations.js.map +1 -1
- package/dist/gateway-host/live-disclosure.d.ts +124 -0
- package/dist/gateway-host/live-disclosure.d.ts.map +1 -0
- package/dist/gateway-host/live-disclosure.js +347 -0
- package/dist/gateway-host/live-disclosure.js.map +1 -0
- package/dist/gateway-host/live-github.d.ts +11 -0
- package/dist/gateway-host/live-github.d.ts.map +1 -0
- package/dist/gateway-host/live-github.js +374 -0
- package/dist/gateway-host/live-github.js.map +1 -0
- package/dist/gateway-host/live-host.d.ts +20 -0
- package/dist/gateway-host/live-host.d.ts.map +1 -0
- package/dist/gateway-host/live-host.js +14 -0
- package/dist/gateway-host/live-host.js.map +1 -0
- package/dist/gateway-host/live-object-store.d.ts +35 -0
- package/dist/gateway-host/live-object-store.d.ts.map +1 -0
- package/dist/gateway-host/live-object-store.js +447 -0
- package/dist/gateway-host/live-object-store.js.map +1 -0
- package/dist/gateway-model-catalog/model-catalog.d.ts +38 -0
- package/dist/gateway-model-catalog/model-catalog.d.ts.map +1 -0
- package/dist/gateway-model-catalog/model-catalog.js +167 -0
- package/dist/gateway-model-catalog/model-catalog.js.map +1 -0
- package/dist/identity-cull/cull.js +1 -1
- package/dist/identity-cull/cull.js.map +1 -1
- package/dist/identity-cull/identity-fence.d.ts +48 -0
- package/dist/identity-cull/identity-fence.d.ts.map +1 -0
- package/dist/identity-cull/identity-fence.js +221 -0
- package/dist/identity-cull/identity-fence.js.map +1 -0
- package/dist/identity-operator-break.d.ts +43 -0
- package/dist/identity-operator-break.d.ts.map +1 -0
- package/dist/identity-operator-break.js +85 -0
- package/dist/identity-operator-break.js.map +1 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +446 -131
- package/dist/index.js.map +1 -1
- package/dist/launch-layout.d.ts.map +1 -1
- package/dist/launch-layout.js +10 -2
- package/dist/launch-layout.js.map +1 -1
- package/dist/llm-mesh-accounts.d.ts +128 -6
- package/dist/llm-mesh-accounts.d.ts.map +1 -1
- package/dist/llm-mesh-accounts.js +370 -14
- package/dist/llm-mesh-accounts.js.map +1 -1
- package/dist/native-host.d.ts +25 -1
- package/dist/native-host.d.ts.map +1 -1
- package/dist/native-host.js +184 -23
- package/dist/native-host.js.map +1 -1
- package/dist/native-restart.d.ts +2 -0
- package/dist/native-restart.d.ts.map +1 -1
- package/dist/native-restart.js +7 -0
- package/dist/native-restart.js.map +1 -1
- package/dist/native-terminal/fleet.d.ts +11 -0
- package/dist/native-terminal/fleet.d.ts.map +1 -1
- package/dist/native-terminal/fleet.js +58 -1
- package/dist/native-terminal/fleet.js.map +1 -1
- package/dist/native-terminal/host-scope.d.ts +18 -0
- package/dist/native-terminal/host-scope.d.ts.map +1 -0
- package/dist/native-terminal/host-scope.js +65 -0
- package/dist/native-terminal/host-scope.js.map +1 -0
- package/dist/native-terminal/host.d.ts +7 -1
- package/dist/native-terminal/host.d.ts.map +1 -1
- package/dist/native-terminal/host.js +10 -26
- package/dist/native-terminal/host.js.map +1 -1
- package/dist/native-terminal/op.d.ts +36 -1
- package/dist/native-terminal/op.d.ts.map +1 -1
- package/dist/native-terminal/op.js +190 -33
- package/dist/native-terminal/op.js.map +1 -1
- package/dist/native-terminal/process.d.ts.map +1 -1
- package/dist/native-terminal/process.js +10 -1
- package/dist/native-terminal/process.js.map +1 -1
- package/dist/native-terminal/screen.d.ts.map +1 -1
- package/dist/native-terminal/screen.js +1 -1
- package/dist/native-terminal/screen.js.map +1 -1
- package/dist/native-terminal/server.d.ts +12 -2
- package/dist/native-terminal/server.d.ts.map +1 -1
- package/dist/native-terminal/server.js +143 -42
- package/dist/native-terminal/server.js.map +1 -1
- package/dist/native-terminal/session-scope.d.ts +2 -0
- package/dist/native-terminal/session-scope.d.ts.map +1 -0
- package/dist/native-terminal/session-scope.js +32 -0
- package/dist/native-terminal/session-scope.js.map +1 -0
- package/dist/proc-identity.d.ts +31 -0
- package/dist/proc-identity.d.ts.map +1 -1
- package/dist/proc-identity.js +54 -0
- package/dist/proc-identity.js.map +1 -1
- package/dist/prompt-delivery.d.ts +3 -0
- package/dist/prompt-delivery.d.ts.map +1 -1
- package/dist/prompt-delivery.js +8 -3
- package/dist/prompt-delivery.js.map +1 -1
- package/dist/protocol-local.d.ts +16 -0
- package/dist/protocol-local.d.ts.map +1 -1
- package/dist/protocol-local.js +14 -0
- package/dist/protocol-local.js.map +1 -1
- package/dist/registry.d.ts +16 -12
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +39 -5
- package/dist/registry.js.map +1 -1
- package/dist/relaunch.d.ts +16 -0
- package/dist/relaunch.d.ts.map +1 -1
- package/dist/relaunch.js +42 -1
- package/dist/relaunch.js.map +1 -1
- package/dist/restore.d.ts +4 -0
- package/dist/restore.d.ts.map +1 -1
- package/dist/restore.js +9 -37
- package/dist/restore.js.map +1 -1
- package/dist/resume-launch-options.d.ts +3 -3
- package/dist/resume-launch-options.d.ts.map +1 -1
- package/dist/resume-launch-options.js +7 -4
- package/dist/resume-launch-options.js.map +1 -1
- package/dist/run.d.ts +2 -0
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +9 -4
- package/dist/run.js.map +1 -1
- package/dist/soft-refresh.d.ts.map +1 -1
- package/dist/soft-refresh.js +6 -0
- package/dist/soft-refresh.js.map +1 -1
- package/dist/tmux.d.ts +31 -5
- package/dist/tmux.d.ts.map +1 -1
- package/dist/tmux.js +96 -20
- package/dist/tmux.js.map +1 -1
- package/dist/vendor/engram-live/contracts.d.ts +619 -2
- package/dist/vendor/engram-live/contracts.js +1201 -25
- package/dist/vendor/engram-live/integration.d.ts +44 -4
- package/dist/vendor/engram-live/integration.js +65 -5
- package/dist/vendor/engram-live/pr-sync.d.ts +144 -0
- package/dist/vendor/engram-live/pr-sync.js +411 -0
- package/dist/vendor/engram-live/registration.d.ts +2 -2
- package/dist/vendor/engram-live/registration.js +2 -4
- package/dist/vendor/engram-live/retention.d.ts +56 -0
- package/dist/vendor/engram-live/retention.js +179 -0
- package/package.json +5 -5
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
/** R1 (LIVE §4): host-owned committed objects, never an alternate or a checkout.
|
|
2
|
+
* The composition owner supplies an authorized clone/scope and local source.
|
|
3
|
+
* No source config, refs, hooks, transport or credentials are consulted here.
|
|
4
|
+
* Receipt publication follows pack verification, private pin and durable sync.
|
|
5
|
+
*/
|
|
6
|
+
import { execFileSync, spawn } from "node:child_process";
|
|
7
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
8
|
+
import { closeSync, createWriteStream, existsSync, fsyncSync, mkdirSync, openSync, readFileSync, readdirSync, realpathSync, renameSync, rmdirSync, rmSync, statSync, writeFileSync, } from "node:fs";
|
|
9
|
+
import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
10
|
+
import { Transform } from "node:stream";
|
|
11
|
+
import { pipeline } from "node:stream/promises";
|
|
12
|
+
import { validateLiveScope, validateRetentionReceipt, validateRetentionRequest, } from "../vendor/engram-live/contracts.js";
|
|
13
|
+
const snapshot = (value) => JSON.parse(JSON.stringify(value));
|
|
14
|
+
const canonicalPath = (path) => existsSync(path) ? realpathSync(path) : resolve(path);
|
|
15
|
+
const within = (parent, child) => {
|
|
16
|
+
const tail = relative(parent, child);
|
|
17
|
+
return tail === "" || (!isAbsolute(tail) && tail !== ".." && !tail.startsWith(`..${sep}`));
|
|
18
|
+
};
|
|
19
|
+
function syncPath(path) {
|
|
20
|
+
const fd = openSync(path, "r");
|
|
21
|
+
try {
|
|
22
|
+
fsyncSync(fd);
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
closeSync(fd);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function durableJson(path, value, generation) {
|
|
29
|
+
const tmp = generation ? join(generation, `${randomUUID()}.tmp`) : `${path}.${randomUUID()}.tmp`;
|
|
30
|
+
try {
|
|
31
|
+
writeFileSync(tmp, JSON.stringify(value) + "\n", { mode: 0o600, flag: "wx" });
|
|
32
|
+
syncPath(tmp);
|
|
33
|
+
renameSync(tmp, path);
|
|
34
|
+
syncPath(resolve(path, ".."));
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
rmSync(tmp, { force: true });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function syncTree(path) {
|
|
41
|
+
for (const name of readdirSync(path)) {
|
|
42
|
+
const file = join(path, name);
|
|
43
|
+
if (statSync(file).isDirectory())
|
|
44
|
+
syncTree(file);
|
|
45
|
+
else
|
|
46
|
+
syncPath(file);
|
|
47
|
+
}
|
|
48
|
+
syncPath(path);
|
|
49
|
+
}
|
|
50
|
+
function bytesIn(path) {
|
|
51
|
+
return readdirSync(path).reduce((sum, name) => {
|
|
52
|
+
const file = join(path, name);
|
|
53
|
+
const stat = statSync(file);
|
|
54
|
+
return sum + (stat.isDirectory() ? bytesIn(file) : stat.size);
|
|
55
|
+
}, 0);
|
|
56
|
+
}
|
|
57
|
+
// Only the observed generation is removed; age authorizes fencing, never
|
|
58
|
+
// concurrent shared writes. Publications consume sources in that generation.
|
|
59
|
+
function takeoverStaleLock(lockPath) {
|
|
60
|
+
let observed;
|
|
61
|
+
try {
|
|
62
|
+
observed = readdirSync(lockPath);
|
|
63
|
+
if (Date.now() - statSync(lockPath).mtimeMs <= 60_000)
|
|
64
|
+
throw new Error("store_busy");
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
if (error.message === "store_busy")
|
|
68
|
+
throw error;
|
|
69
|
+
if (error.code === "ENOENT" || !existsSync(lockPath))
|
|
70
|
+
throw new Error("store_busy");
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
for (const oldToken of observed)
|
|
74
|
+
rmSync(join(lockPath, oldToken), { recursive: true, force: true });
|
|
75
|
+
try {
|
|
76
|
+
rmdirSync(lockPath);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
if (error.code !== "ENOENT")
|
|
80
|
+
throw new Error("store_busy");
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export function createLiveObjectStore(options) {
|
|
84
|
+
const scope = snapshot(options.scope);
|
|
85
|
+
const algorithm = options.algorithm;
|
|
86
|
+
if (!validateLiveScope(scope).ok || scope.worktree !== undefined)
|
|
87
|
+
throw new Error("invalid retention scope");
|
|
88
|
+
if (algorithm !== "sha1" && algorithm !== "sha256")
|
|
89
|
+
throw new Error("invalid retention algorithm");
|
|
90
|
+
if (!Number.isSafeInteger(options.quotaBytes) || options.quotaBytes < 0)
|
|
91
|
+
throw new Error("invalid object quota");
|
|
92
|
+
const quota = options.quotaBytes;
|
|
93
|
+
const root = realpathSync(options.root);
|
|
94
|
+
const commonDir = canonicalPath(options.source.commonDir);
|
|
95
|
+
for (const source of [commonDir, ...options.source.worktreeRoots.map(canonicalPath)]) {
|
|
96
|
+
if (within(source, root) || within(root, source))
|
|
97
|
+
throw new Error("private object store must be outside source roots");
|
|
98
|
+
}
|
|
99
|
+
const scopeKey = createHash("sha256").update(JSON.stringify([scope.tenant, scope.clone])).digest("hex");
|
|
100
|
+
const metadataDir = join(root, "live-object-store", scopeKey, algorithm);
|
|
101
|
+
const gitDir = join(metadataDir, "objects.git");
|
|
102
|
+
const requests = join(metadataDir, "requests");
|
|
103
|
+
const receipts = join(metadataDir, "receipts");
|
|
104
|
+
const gaps = join(metadataDir, "gaps");
|
|
105
|
+
const empty = join(metadataDir, "empty");
|
|
106
|
+
for (const dir of [join(root, "live-object-store"), join(root, "live-object-store", scopeKey), metadataDir, requests, receipts, gaps, empty]) {
|
|
107
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
108
|
+
}
|
|
109
|
+
const noConfig = join(metadataDir, "no-config");
|
|
110
|
+
if (!existsSync(noConfig))
|
|
111
|
+
writeFileSync(noConfig, "", { mode: 0o600, flag: "wx" });
|
|
112
|
+
// Whitelist the environment: inherited Git config, alternates, SSH commands,
|
|
113
|
+
// credentials, templates and exec-path overrides must never reach Git.
|
|
114
|
+
const env = {
|
|
115
|
+
PATH: process.env.PATH, HOME: metadataDir, XDG_CONFIG_HOME: metadataDir,
|
|
116
|
+
XDG_RUNTIME_DIR: metadataDir, TMPDIR: metadataDir,
|
|
117
|
+
GIT_CONFIG_NOSYSTEM: "1", GIT_CONFIG_SYSTEM: noConfig, GIT_CONFIG_GLOBAL: noConfig,
|
|
118
|
+
GIT_TERMINAL_PROMPT: "0", GIT_NO_REPLACE_OBJECTS: "1", GIT_NO_LAZY_FETCH: "1",
|
|
119
|
+
GIT_OPTIONAL_LOCKS: "0", GIT_ATTR_NOSYSTEM: "1", LC_ALL: "C",
|
|
120
|
+
};
|
|
121
|
+
const flags = ["--no-optional-locks", "-c", `core.hooksPath=${empty}`, "-c", "core.fsmonitor=false",
|
|
122
|
+
"-c", "protocol.allow=never", "-c", "gc.auto=0", "-c", "maintenance.auto=false"];
|
|
123
|
+
const git = (dir, args, extraEnv = {}) => execFileSync("git", [...flags, `--git-dir=${dir}`, ...args], {
|
|
124
|
+
cwd: metadataDir, env: { ...env, ...extraEnv }, encoding: "utf8",
|
|
125
|
+
stdio: ["ignore", "pipe", "pipe"], timeout: 30_000, maxBuffer: 1024 * 1024,
|
|
126
|
+
}).trim();
|
|
127
|
+
const init = (dir) => {
|
|
128
|
+
git(dir, ["init", "--bare", `--object-format=${algorithm}`, `--template=${empty}`, dir]);
|
|
129
|
+
// git init honors the caller's umask for its top directory. Create that
|
|
130
|
+
// directory ourselves before invoking it (all descendants stay protected).
|
|
131
|
+
};
|
|
132
|
+
if (!existsSync(join(gitDir, "HEAD"))) {
|
|
133
|
+
mkdirSync(gitDir, { mode: 0o700 });
|
|
134
|
+
init(gitDir);
|
|
135
|
+
}
|
|
136
|
+
mkdirSync(join(gitDir, "refs", "h2a", "retained"), { recursive: true, mode: 0o700 });
|
|
137
|
+
const acquisitionLockPath = join(metadataDir, "acquisition.lock");
|
|
138
|
+
const checkScope = (candidate, format) => {
|
|
139
|
+
if (!validateLiveScope(candidate).ok || candidate.worktree !== undefined ||
|
|
140
|
+
candidate.tenant !== scope.tenant || candidate.clone !== scope.clone)
|
|
141
|
+
throw new Error("retention scope mismatch");
|
|
142
|
+
if (format !== algorithm)
|
|
143
|
+
throw new Error("retention algorithm mismatch");
|
|
144
|
+
};
|
|
145
|
+
const pin = (oid) => `refs/h2a/retained/${oid}`;
|
|
146
|
+
const backupRef = (oid) => `h2a-live-object:${scopeKey}:${algorithm}:${oid}`;
|
|
147
|
+
const requestPath = (oid) => join(requests, `${oid}.json`);
|
|
148
|
+
const receiptPath = (oid) => join(receipts, `${oid}.json`);
|
|
149
|
+
const acknowledgePin = (oid, generation) => {
|
|
150
|
+
durableJson(receiptPath(oid), { scope, algorithm, oid,
|
|
151
|
+
receivedAt: (options.now ?? Date.now)(), backupRef: backupRef(oid) }, generation);
|
|
152
|
+
};
|
|
153
|
+
const readRequest = (oid) => {
|
|
154
|
+
const request = JSON.parse(readFileSync(requestPath(oid), "utf8"));
|
|
155
|
+
if (!validateRetentionRequest(request).ok || request.oid !== oid)
|
|
156
|
+
throw new Error("invalid durable retention request");
|
|
157
|
+
checkScope(request.scope, request.algorithm);
|
|
158
|
+
return request;
|
|
159
|
+
};
|
|
160
|
+
const verified = (dir, oid) => {
|
|
161
|
+
if (git(dir, ["cat-file", "-t", oid]) !== "commit")
|
|
162
|
+
throw new Error("retention root must be committed history");
|
|
163
|
+
// Includes parents, trees and blobs. A tip alone is never sufficient.
|
|
164
|
+
git(dir, ["fsck", "--strict", "--no-reflogs", "--no-dangling", oid]);
|
|
165
|
+
};
|
|
166
|
+
async function recordReceipt(candidate) {
|
|
167
|
+
const receipt = snapshot(candidate);
|
|
168
|
+
if (!validateRetentionReceipt(receipt).ok)
|
|
169
|
+
throw new Error("invalid retention receipt scope or fields");
|
|
170
|
+
checkScope(receipt.scope, receipt.algorithm);
|
|
171
|
+
if (!existsSync(requestPath(receipt.oid)))
|
|
172
|
+
throw new Error("retention receipt has no recorded request");
|
|
173
|
+
readRequest(receipt.oid);
|
|
174
|
+
if (receipt.backupRef !== backupRef(receipt.oid))
|
|
175
|
+
throw new Error("retention backup reference mismatch");
|
|
176
|
+
if (git(gitDir, ["rev-parse", "--verify", pin(receipt.oid)]) !== receipt.oid)
|
|
177
|
+
throw new Error("unprotected retention pin");
|
|
178
|
+
if (hasReceipt(receipt.oid))
|
|
179
|
+
return { received: true };
|
|
180
|
+
await withAcquisitionLock(async (generation) => {
|
|
181
|
+
verified(gitDir, receipt.oid);
|
|
182
|
+
syncTree(gitDir);
|
|
183
|
+
durableJson(receiptPath(receipt.oid), receipt, generation);
|
|
184
|
+
});
|
|
185
|
+
return { received: true };
|
|
186
|
+
}
|
|
187
|
+
// Single-receipt fast path: one file read plus one rev-parse, no full scan
|
|
188
|
+
// and no fsck. recordRequest uses this instead of a full load per request.
|
|
189
|
+
function hasReceipt(oid) {
|
|
190
|
+
try {
|
|
191
|
+
if (!existsSync(receiptPath(oid)))
|
|
192
|
+
return false;
|
|
193
|
+
const receipt = JSON.parse(readFileSync(receiptPath(oid), "utf8"));
|
|
194
|
+
if (!validateRetentionReceipt(receipt).ok || receipt.oid !== oid)
|
|
195
|
+
return false;
|
|
196
|
+
if (receipt.scope.tenant !== scope.tenant || receipt.scope.clone !== scope.clone ||
|
|
197
|
+
receipt.scope.worktree !== undefined || receipt.algorithm !== algorithm)
|
|
198
|
+
return false;
|
|
199
|
+
if (receipt.backupRef !== backupRef(oid))
|
|
200
|
+
return false;
|
|
201
|
+
readRequest(oid);
|
|
202
|
+
return git(gitDir, ["rev-parse", "--verify", pin(oid)]) === oid;
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
async function loadReceipts(query) {
|
|
209
|
+
checkScope(query.scope, query.algorithm);
|
|
210
|
+
const loaded = [];
|
|
211
|
+
for (const name of readdirSync(receipts).filter((name) => name.endsWith(".json")).sort()) {
|
|
212
|
+
// Quarantine: one corrupt receipt, foreign receipt, missing request or
|
|
213
|
+
// missing pin skips that entry instead of failing the whole pass. The
|
|
214
|
+
// skipped OID stays pending and is reacquired on retry.
|
|
215
|
+
try {
|
|
216
|
+
const receipt = JSON.parse(readFileSync(join(receipts, name), "utf8"));
|
|
217
|
+
if (!validateRetentionReceipt(receipt).ok || name !== `${receipt.oid}.json`)
|
|
218
|
+
continue;
|
|
219
|
+
if (receipt.scope.tenant !== scope.tenant || receipt.scope.clone !== scope.clone ||
|
|
220
|
+
receipt.scope.worktree !== undefined || receipt.algorithm !== algorithm)
|
|
221
|
+
continue;
|
|
222
|
+
try {
|
|
223
|
+
readRequest(receipt.oid);
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
if (receipt.backupRef !== backupRef(receipt.oid))
|
|
229
|
+
continue;
|
|
230
|
+
let pinned;
|
|
231
|
+
try {
|
|
232
|
+
pinned = git(gitDir, ["rev-parse", "--verify", pin(receipt.oid)]);
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
if (pinned !== receipt.oid)
|
|
238
|
+
continue;
|
|
239
|
+
loaded.push(receipt);
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return { receipts: loaded };
|
|
246
|
+
}
|
|
247
|
+
async function acquire(request, stage) {
|
|
248
|
+
// This git-dir has only host-created config. Only immutable source objects
|
|
249
|
+
// are exposed to pack-objects; source refs/config/index are never loaded.
|
|
250
|
+
const sourceObjects = join(commonDir, "objects");
|
|
251
|
+
// Borrowing a source alternate would make both authority and availability
|
|
252
|
+
// ambiguous. Report a gap; never create an alternate in the private store.
|
|
253
|
+
if (existsSync(join(sourceObjects, "info", "alternates")))
|
|
254
|
+
throw new Error("source alternates not authorized");
|
|
255
|
+
const remaining = quota - bytesIn(join(gitDir, "objects"));
|
|
256
|
+
if (remaining <= 0)
|
|
257
|
+
throw new Error("quota_exhausted");
|
|
258
|
+
// Exclude retained history using only host-owned refs. The private store
|
|
259
|
+
// is a read-only, ephemeral alternate for this command, so exclusions
|
|
260
|
+
// also work after the corresponding root disappeared from the source.
|
|
261
|
+
const incoming = join(stage, "incoming.pack");
|
|
262
|
+
const child = spawn("git", [...flags, `--git-dir=${stage}`, "pack-objects", "--stdout", "--revs",
|
|
263
|
+
"--no-use-bitmap-index", "--no-reuse-delta", "--no-reuse-object"], {
|
|
264
|
+
cwd: metadataDir, env: { ...env, GIT_OBJECT_DIRECTORY: sourceObjects, GIT_ALTERNATE_OBJECT_DIRECTORIES: join(gitDir, "objects") }, stdio: ["pipe", "pipe", "pipe"],
|
|
265
|
+
});
|
|
266
|
+
const closed = new Promise((resolve, reject) => {
|
|
267
|
+
child.once("error", reject);
|
|
268
|
+
child.once("close", resolve);
|
|
269
|
+
});
|
|
270
|
+
// Stream exclusions with backpressure: the number of retained refs has no
|
|
271
|
+
// fixed ceiling and must never be limited by execFileSync's maxBuffer.
|
|
272
|
+
const retained = spawn("git", [...flags, `--git-dir=${gitDir}`, "for-each-ref",
|
|
273
|
+
"--format=^%(objectname)", "refs/h2a/retained"], {
|
|
274
|
+
cwd: metadataDir, env, stdio: ["ignore", "pipe", "pipe"],
|
|
275
|
+
});
|
|
276
|
+
const retainedClosed = new Promise((resolve, reject) => {
|
|
277
|
+
retained.once("error", reject);
|
|
278
|
+
retained.once("close", resolve);
|
|
279
|
+
});
|
|
280
|
+
// Drain errors, but never retain/log potentially sensitive source text.
|
|
281
|
+
child.stderr.resume();
|
|
282
|
+
retained.stderr.resume();
|
|
283
|
+
child.stdin.on("error", () => { });
|
|
284
|
+
child.stdin.write(`${request.oid}\n`);
|
|
285
|
+
let count = 0;
|
|
286
|
+
let timedOut = false;
|
|
287
|
+
const timer = setTimeout(() => { timedOut = true; child.kill("SIGKILL"); retained.kill("SIGKILL"); }, 30_000);
|
|
288
|
+
const transfers = [
|
|
289
|
+
pipeline(retained.stdout, child.stdin),
|
|
290
|
+
pipeline(child.stdout, new Transform({ transform(chunk, _encoding, callback) {
|
|
291
|
+
count += chunk.length;
|
|
292
|
+
callback(count > remaining ? new Error("quota_exhausted") : null, count > remaining ? undefined : chunk);
|
|
293
|
+
} }), createWriteStream(incoming, { flags: "wx", mode: 0o600 })),
|
|
294
|
+
];
|
|
295
|
+
try {
|
|
296
|
+
const [code, retainedCode] = await Promise.all([closed, retainedClosed, ...transfers]);
|
|
297
|
+
if (code !== 0 || retainedCode !== 0 || timedOut)
|
|
298
|
+
throw new Error("objects_unavailable");
|
|
299
|
+
}
|
|
300
|
+
finally {
|
|
301
|
+
clearTimeout(timer);
|
|
302
|
+
if (child.exitCode === null && child.signalCode === null)
|
|
303
|
+
child.kill("SIGKILL");
|
|
304
|
+
if (retained.exitCode === null && retained.signalCode === null)
|
|
305
|
+
retained.kill("SIGKILL");
|
|
306
|
+
await Promise.allSettled([closed, retainedClosed, ...transfers]);
|
|
307
|
+
}
|
|
308
|
+
// index-pack writes alongside incoming; move the complete verified
|
|
309
|
+
// pair into staging's object db before connectivity verification.
|
|
310
|
+
writeFileSync(join(stage, "objects", "info", "alternates"), join(gitDir, "objects") + "\n", { flag: "wx", mode: 0o600 });
|
|
311
|
+
const hash = git(stage, ["index-pack", "--strict", incoming]);
|
|
312
|
+
const stagedPacks = join(stage, "objects", "pack");
|
|
313
|
+
renameSync(incoming, join(stagedPacks, `pack-${hash}.pack`));
|
|
314
|
+
renameSync(join(stage, "incoming.idx"), join(stagedPacks, `pack-${hash}.idx`));
|
|
315
|
+
// Closure is verified over the incoming objects plus retained objects;
|
|
316
|
+
// this alternate exists only inside the disposable acquisition generation.
|
|
317
|
+
verified(stage, request.oid);
|
|
318
|
+
if (bytesIn(join(gitDir, "objects")) + bytesIn(stagedPacks) > quota)
|
|
319
|
+
throw new Error("quota_exhausted");
|
|
320
|
+
// Install the pack before its index. A crash can leave an unindexed
|
|
321
|
+
// orphan pack, never an index referring to an absent pack.
|
|
322
|
+
for (const name of readdirSync(stagedPacks).sort((a, b) => Number(b.endsWith(".pack")) - Number(a.endsWith(".pack")))) {
|
|
323
|
+
renameSync(join(stagedPacks, name), join(gitDir, "objects", "pack", name));
|
|
324
|
+
}
|
|
325
|
+
syncTree(join(gitDir, "objects"));
|
|
326
|
+
// Every publication consumes a source in this generation. A takeover
|
|
327
|
+
// removes those sources before a successor is admitted; even a holder
|
|
328
|
+
// suspended inside rename cannot publish after being fenced.
|
|
329
|
+
const stagedPin = join(stage, "pin");
|
|
330
|
+
writeFileSync(stagedPin, request.oid + "\n", { flag: "wx", mode: 0o600 });
|
|
331
|
+
syncPath(stagedPin);
|
|
332
|
+
renameSync(stagedPin, join(gitDir, pin(request.oid)));
|
|
333
|
+
syncPath(join(gitDir, "refs", "h2a", "retained"));
|
|
334
|
+
syncPath(join(gitDir, "refs", "h2a"));
|
|
335
|
+
syncPath(join(gitDir, "refs"));
|
|
336
|
+
syncPath(gitDir);
|
|
337
|
+
syncPath(metadataDir);
|
|
338
|
+
acknowledgePin(request.oid, stage);
|
|
339
|
+
}
|
|
340
|
+
async function withAcquisitionLock(action) {
|
|
341
|
+
const token = randomUUID();
|
|
342
|
+
const candidate = `${acquisitionLockPath}.${token}.candidate`;
|
|
343
|
+
const generation = join(acquisitionLockPath, token);
|
|
344
|
+
let locked = false;
|
|
345
|
+
try {
|
|
346
|
+
mkdirSync(candidate, { mode: 0o700 });
|
|
347
|
+
mkdirSync(join(candidate, token), { mode: 0o700 });
|
|
348
|
+
init(join(candidate, token));
|
|
349
|
+
for (;;) {
|
|
350
|
+
try {
|
|
351
|
+
renameSync(candidate, acquisitionLockPath);
|
|
352
|
+
locked = true;
|
|
353
|
+
break;
|
|
354
|
+
}
|
|
355
|
+
catch (error) {
|
|
356
|
+
if (!["EEXIST", "ENOTEMPTY"].includes(error.code ?? ""))
|
|
357
|
+
throw error;
|
|
358
|
+
}
|
|
359
|
+
takeoverStaleLock(acquisitionLockPath);
|
|
360
|
+
}
|
|
361
|
+
await action(generation);
|
|
362
|
+
}
|
|
363
|
+
finally {
|
|
364
|
+
rmSync(candidate, { recursive: true, force: true });
|
|
365
|
+
if (locked) {
|
|
366
|
+
rmSync(generation, { recursive: true, force: true });
|
|
367
|
+
try {
|
|
368
|
+
rmdirSync(acquisitionLockPath);
|
|
369
|
+
}
|
|
370
|
+
catch (error) {
|
|
371
|
+
if (!["ENOENT", "ENOTEMPTY", "EEXIST"].includes(error.code ?? ""))
|
|
372
|
+
throw error;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
async function recordRequest(input) {
|
|
378
|
+
const request = snapshot(input);
|
|
379
|
+
if (!validateRetentionRequest(request).ok)
|
|
380
|
+
throw new Error("invalid retention request scope or fields");
|
|
381
|
+
checkScope(request.scope, request.algorithm);
|
|
382
|
+
if (!existsSync(requestPath(request.oid)))
|
|
383
|
+
durableJson(requestPath(request.oid), request);
|
|
384
|
+
else
|
|
385
|
+
readRequest(request.oid);
|
|
386
|
+
if (hasReceipt(request.oid))
|
|
387
|
+
return { received: true };
|
|
388
|
+
try {
|
|
389
|
+
await withAcquisitionLock(async (generation) => {
|
|
390
|
+
try {
|
|
391
|
+
let pinned = false;
|
|
392
|
+
try {
|
|
393
|
+
pinned = git(gitDir, ["rev-parse", "--verify", pin(request.oid)]) === request.oid;
|
|
394
|
+
}
|
|
395
|
+
catch { /* not acquired */ }
|
|
396
|
+
if (pinned) {
|
|
397
|
+
// Recover a pin whose receipt was interrupted, without the source.
|
|
398
|
+
verified(gitDir, request.oid);
|
|
399
|
+
syncTree(gitDir);
|
|
400
|
+
acknowledgePin(request.oid, generation);
|
|
401
|
+
}
|
|
402
|
+
else
|
|
403
|
+
await acquire(request, generation);
|
|
404
|
+
}
|
|
405
|
+
catch (error) {
|
|
406
|
+
const code = error.code;
|
|
407
|
+
if (code && ["EACCES", "EROFS", "EIO", "ENOSPC"].includes(code))
|
|
408
|
+
throw error;
|
|
409
|
+
// A fenced holder cannot overwrite its successor's gap or receipt.
|
|
410
|
+
if (!existsSync(generation))
|
|
411
|
+
return;
|
|
412
|
+
const reason = error.message === "quota_exhausted" ? "quota_exhausted" : "objects_unavailable";
|
|
413
|
+
try {
|
|
414
|
+
durableJson(join(gaps, `${request.oid}.json`), { reason }, generation);
|
|
415
|
+
}
|
|
416
|
+
catch (failure) {
|
|
417
|
+
if (failure.code !== "ENOENT")
|
|
418
|
+
throw failure;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
catch (error) {
|
|
424
|
+
if (error.message !== "store_busy")
|
|
425
|
+
throw error;
|
|
426
|
+
// Durable request remains pending; contention never writes a shared gap.
|
|
427
|
+
}
|
|
428
|
+
return { received: true };
|
|
429
|
+
}
|
|
430
|
+
async function pending() {
|
|
431
|
+
const acknowledged = new Set((await loadReceipts({ scope, algorithm })).receipts.map((receipt) => receipt.oid));
|
|
432
|
+
return readdirSync(requests).filter((name) => name.endsWith(".json")).sort().flatMap((name) => {
|
|
433
|
+
const request = readRequest(name.slice(0, -5));
|
|
434
|
+
if (acknowledged.has(request.oid))
|
|
435
|
+
return [];
|
|
436
|
+
const gapPath = join(gaps, name);
|
|
437
|
+
const reason = existsSync(gapPath) ? JSON.parse(readFileSync(gapPath, "utf8")).reason : "store_busy";
|
|
438
|
+
return [{ request, reason }];
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
return { gitDir, acquisitionLockPath, recordRequest, recordReceipt, loadReceipts, pending,
|
|
442
|
+
async retryPending() { for (const { request } of await pending())
|
|
443
|
+
await recordRequest(request); },
|
|
444
|
+
backupManifest: () => ({ gitDir, metadataDir, scope: snapshot(scope) }),
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
//# sourceMappingURL=live-object-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-object-store.js","sourceRoot":"","sources":["../../src/gateway-host/live-object-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* h2a embedded gateway model catalog — H0 mirror of the published #662
|
|
3
|
+
* surface (llm-mesh 0.26.0 / llm-gateway 0.20.0).
|
|
4
|
+
*
|
|
5
|
+
* Canonical routing knowledge stays in llm-mesh; this module only names the
|
|
6
|
+
* model ids `h2a run --model` accepts and normalizes readable aliases to
|
|
7
|
+
* their exact canonical id (identity-only normalization, no cross-model
|
|
8
|
+
* mapping). Unknown names resolve to undefined so the exact-model default
|
|
9
|
+
* never silently maps them.
|
|
10
|
+
*/
|
|
11
|
+
export declare const GEMINI_4_ARGON = "gemini-4-argon";
|
|
12
|
+
export declare const GEMINI_3_8_FLASH = "gemini-3.8-flash";
|
|
13
|
+
export declare const MUSE_SPARK_1_3 = "muse-spark-1.3";
|
|
14
|
+
export declare const MUSE_SPARK_1_3_CONTRIBUTOR = "muse-spark-1.3-contributor";
|
|
15
|
+
export declare const MUSE_WONDER_1_0 = "muse-wonder-1.0";
|
|
16
|
+
export declare const MUSE_WONDER_FULL_1_0 = "muse-wonder-full-1.0";
|
|
17
|
+
export declare const GATEWAY_MODEL_IDS: readonly ["gemini-4-argon", "gemini-3.8-flash", "muse-spark-1.3", "muse-spark-1.3-contributor", "muse-wonder-1.0", "muse-wonder-full-1.0"];
|
|
18
|
+
export type GatewayModelId = (typeof GATEWAY_MODEL_IDS)[number];
|
|
19
|
+
/** Readable aliases accepted by `h2a run --model` (spec §6.6). */
|
|
20
|
+
export declare const GATEWAY_MODEL_ALIASES: Readonly<Record<string, GatewayModelId>>;
|
|
21
|
+
export declare function isKnownGatewayModel(value: string): value is GatewayModelId;
|
|
22
|
+
/** Identity-only normalization: alias → canonical id, else undefined. */
|
|
23
|
+
export declare function resolveGatewayModelAlias(value: string): GatewayModelId | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Claude-family gateway mapping (spec §6.6): requested alias family →
|
|
26
|
+
* cloud slot (Gemini) and Muse slot. Effort is advisory; the mesh validates
|
|
27
|
+
* it against transport capability. Unmentioned legacy families keep llm-mesh's
|
|
28
|
+
* own table and are absent here by design.
|
|
29
|
+
*/
|
|
30
|
+
export type ClaudeGatewaySlot = {
|
|
31
|
+
readonly cloud: GatewayModelId;
|
|
32
|
+
readonly cloudEffort: string;
|
|
33
|
+
readonly muse: GatewayModelId;
|
|
34
|
+
readonly museEffort: string;
|
|
35
|
+
};
|
|
36
|
+
export declare const CLAUDE_GATEWAY_MODEL_MAP: Readonly<Record<string, ClaudeGatewaySlot>>;
|
|
37
|
+
export declare function claudeGatewaySlot(family: string): ClaudeGatewaySlot | undefined;
|
|
38
|
+
//# sourceMappingURL=model-catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-catalog.d.ts","sourceRoot":"","sources":["../../src/gateway-model-catalog/model-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAC/C,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AACnD,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAC/C,eAAO,MAAM,0BAA0B,+BAA+B,CAAC;AACvE,eAAO,MAAM,eAAe,oBAAoB,CAAC;AACjD,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAE3D,eAAO,MAAM,iBAAiB,4IAOpB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE,kEAAkE;AAClE,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAqBxE,CAAC;AAEJ,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,cAAc,CAE1E;AAED,yEAAyE;AACzE,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,GACZ,cAAc,GAAG,SAAS,CAK5B;AAED;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAC7C,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAwGlC,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,GACb,iBAAiB,GAAG,SAAS,CAK/B"}
|