@sentropic/h2a-runtime 0.98.6 → 0.98.7-rc.2

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.
Files changed (130) hide show
  1. package/dist/agent-launch-args.d.ts.map +1 -1
  2. package/dist/agent-launch-args.js +5 -5
  3. package/dist/agent-launch-args.js.map +1 -1
  4. package/dist/agy-claude.d.ts +2 -0
  5. package/dist/agy-claude.d.ts.map +1 -0
  6. package/dist/agy-claude.js +3 -0
  7. package/dist/agy-claude.js.map +1 -0
  8. package/dist/agy-headless.d.ts +11 -0
  9. package/dist/agy-headless.d.ts.map +1 -0
  10. package/dist/agy-headless.js +104 -0
  11. package/dist/agy-headless.js.map +1 -0
  12. package/dist/attach.d.ts +2 -0
  13. package/dist/attach.d.ts.map +1 -1
  14. package/dist/attach.js +73 -6
  15. package/dist/attach.js.map +1 -1
  16. package/dist/auth-login.d.ts +24 -1
  17. package/dist/auth-login.d.ts.map +1 -1
  18. package/dist/auth-login.js +132 -4
  19. package/dist/auth-login.js.map +1 -1
  20. package/dist/central-mcp.d.ts +2 -0
  21. package/dist/central-mcp.d.ts.map +1 -1
  22. package/dist/central-mcp.js +90 -3
  23. package/dist/central-mcp.js.map +1 -1
  24. package/dist/claude-code-cli-isolation.d.ts +53 -0
  25. package/dist/claude-code-cli-isolation.d.ts.map +1 -0
  26. package/dist/claude-code-cli-isolation.js +277 -0
  27. package/dist/claude-code-cli-isolation.js.map +1 -0
  28. package/dist/claude-code-cli-lifecycle.d.ts +80 -0
  29. package/dist/claude-code-cli-lifecycle.d.ts.map +1 -0
  30. package/dist/claude-code-cli-lifecycle.js +402 -0
  31. package/dist/claude-code-cli-lifecycle.js.map +1 -0
  32. package/dist/claude-code-cli-runner.d.ts +89 -0
  33. package/dist/claude-code-cli-runner.d.ts.map +1 -0
  34. package/dist/claude-code-cli-runner.js +659 -0
  35. package/dist/claude-code-cli-runner.js.map +1 -0
  36. package/dist/claude-seat-input.d.ts +47 -0
  37. package/dist/claude-seat-input.d.ts.map +1 -0
  38. package/dist/claude-seat-input.js +272 -0
  39. package/dist/claude-seat-input.js.map +1 -0
  40. package/dist/claude-seat-mesh-contract.d.ts +88 -0
  41. package/dist/claude-seat-mesh-contract.d.ts.map +1 -0
  42. package/dist/claude-seat-mesh-contract.js +13 -0
  43. package/dist/claude-seat-mesh-contract.js.map +1 -0
  44. package/dist/cli-help-groups.js +1 -1
  45. package/dist/cli-help-groups.js.map +1 -1
  46. package/dist/crash-log.d.ts +112 -0
  47. package/dist/crash-log.d.ts.map +1 -0
  48. package/dist/crash-log.js +560 -0
  49. package/dist/crash-log.js.map +1 -0
  50. package/dist/delegate.d.ts +10 -0
  51. package/dist/delegate.d.ts.map +1 -1
  52. package/dist/delegate.js +29 -0
  53. package/dist/delegate.js.map +1 -1
  54. package/dist/gateway-host/claude-seat-client.d.ts +32 -0
  55. package/dist/gateway-host/claude-seat-client.d.ts.map +1 -0
  56. package/dist/gateway-host/claude-seat-client.js +38 -0
  57. package/dist/gateway-host/claude-seat-client.js.map +1 -0
  58. package/dist/gateway-host/host.d.ts +6 -0
  59. package/dist/gateway-host/host.d.ts.map +1 -1
  60. package/dist/gateway-host/host.js +24 -3
  61. package/dist/gateway-host/host.js.map +1 -1
  62. package/dist/gateway-host/live-declarations.d.ts +58 -0
  63. package/dist/gateway-host/live-declarations.d.ts.map +1 -0
  64. package/dist/gateway-host/live-declarations.js +429 -0
  65. package/dist/gateway-host/live-declarations.js.map +1 -0
  66. package/dist/gateway-host/live-github.d.ts +11 -0
  67. package/dist/gateway-host/live-github.d.ts.map +1 -0
  68. package/dist/gateway-host/live-github.js +374 -0
  69. package/dist/gateway-host/live-github.js.map +1 -0
  70. package/dist/gateway-host/live-object-store.d.ts +35 -0
  71. package/dist/gateway-host/live-object-store.d.ts.map +1 -0
  72. package/dist/gateway-host/live-object-store.js +447 -0
  73. package/dist/gateway-host/live-object-store.js.map +1 -0
  74. package/dist/gateway-host/live-registration.d.ts +162 -0
  75. package/dist/gateway-host/live-registration.d.ts.map +1 -0
  76. package/dist/gateway-host/live-registration.js +455 -0
  77. package/dist/gateway-host/live-registration.js.map +1 -0
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +290 -23
  80. package/dist/index.js.map +1 -1
  81. package/dist/llm-mesh-accounts.d.ts +70 -4
  82. package/dist/llm-mesh-accounts.d.ts.map +1 -1
  83. package/dist/llm-mesh-accounts.js +296 -9
  84. package/dist/llm-mesh-accounts.js.map +1 -1
  85. package/dist/native-host.d.ts +1 -1
  86. package/dist/native-host.d.ts.map +1 -1
  87. package/dist/native-host.js +30 -17
  88. package/dist/native-host.js.map +1 -1
  89. package/dist/native-terminal/host.d.ts +6 -1
  90. package/dist/native-terminal/host.d.ts.map +1 -1
  91. package/dist/native-terminal/host.js +6 -25
  92. package/dist/native-terminal/host.js.map +1 -1
  93. package/dist/native-terminal/journal.d.ts +5 -0
  94. package/dist/native-terminal/journal.d.ts.map +1 -1
  95. package/dist/native-terminal/journal.js +28 -16
  96. package/dist/native-terminal/journal.js.map +1 -1
  97. package/dist/native-terminal/op.d.ts +13 -0
  98. package/dist/native-terminal/op.d.ts.map +1 -1
  99. package/dist/native-terminal/op.js +64 -5
  100. package/dist/native-terminal/op.js.map +1 -1
  101. package/dist/proc-identity.d.ts +31 -0
  102. package/dist/proc-identity.d.ts.map +1 -1
  103. package/dist/proc-identity.js +54 -0
  104. package/dist/proc-identity.js.map +1 -1
  105. package/dist/prompt-delivery.d.ts +3 -0
  106. package/dist/prompt-delivery.d.ts.map +1 -1
  107. package/dist/prompt-delivery.js +8 -3
  108. package/dist/prompt-delivery.js.map +1 -1
  109. package/dist/run.d.ts.map +1 -1
  110. package/dist/run.js +79 -16
  111. package/dist/run.js.map +1 -1
  112. package/dist/terminal-reset.d.ts +104 -0
  113. package/dist/terminal-reset.d.ts.map +1 -0
  114. package/dist/terminal-reset.js +229 -0
  115. package/dist/terminal-reset.js.map +1 -0
  116. package/dist/tmux.d.ts +26 -4
  117. package/dist/tmux.d.ts.map +1 -1
  118. package/dist/tmux.js +60 -25
  119. package/dist/tmux.js.map +1 -1
  120. package/dist/vendor/engram-live/contracts.d.ts +825 -0
  121. package/dist/vendor/engram-live/contracts.js +1734 -0
  122. package/dist/vendor/engram-live/integration.d.ts +113 -0
  123. package/dist/vendor/engram-live/integration.js +254 -0
  124. package/dist/vendor/engram-live/pr-sync.d.ts +144 -0
  125. package/dist/vendor/engram-live/pr-sync.js +411 -0
  126. package/dist/vendor/engram-live/registration.d.ts +138 -0
  127. package/dist/vendor/engram-live/registration.js +358 -0
  128. package/dist/vendor/engram-live/retention.d.ts +56 -0
  129. package/dist/vendor/engram-live/retention.js +179 -0
  130. package/package.json +2 -2
@@ -0,0 +1,374 @@
1
+ /**
2
+ * P1 host implementation of engram's injected GitHub PR page transport.
3
+ * The composition owner supplies an approved absolute gh executable and a
4
+ * service directory (never an observed worktree). gh alone owns credentials.
5
+ * This module lists metadata only; it never acquires/acknowledges Git objects.
6
+ *
7
+ * The listing is newest-first (direction=desc): a PR updated while a sweep is
8
+ * in flight stays in the already-read region. An unread PR updated during
9
+ * the sweep jumps there too, producing a duplicate boundary item; the overlap
10
+ * window recovers the moved PR on the next pass. GitHub exposes the
11
+ * listing Link under the numeric repositories path; every row on such a page
12
+ * must carry the same repository id.
13
+ */
14
+ import { execFile } from "node:child_process";
15
+ import { isAbsolute } from "node:path";
16
+ import { PR_END_PROOF, validatePrPage, validatePullRequestFact, } from "../vendor/engram-live/contracts.js";
17
+ const failure = (kind) => ({ ok: false, kind, message: `GitHub PR transport: ${kind}` });
18
+ const slug = /^[A-Za-z0-9][A-Za-z0-9_.-]*$/;
19
+ const safeHeader = (value) => value.length > 0 && value.length <= 8192 && !/[\x00-\x1f\x7f]/.test(value);
20
+ // Updated rows move toward the read region; the overlap recovers their facts.
21
+ const LIST_FILTER = { state: "all", sort: "updated", direction: "desc", per_page: "100" };
22
+ // Validators rotate every incremental pass, so an unbounded map grows forever
23
+ // on a long-lived host. Eviction only costs a revalidation, never correctness.
24
+ const MAX_CACHED_PAGES = 32;
25
+ function position(request) {
26
+ const { owner, repo } = request.repository;
27
+ if (!slug.test(owner) || !slug.test(repo) || owner.length > 100 || repo.length > 100
28
+ || (request.updatedAtSince !== null && (!Number.isSafeInteger(request.updatedAtSince) || request.updatedAtSince < 0))
29
+ || (request.etag !== null && (typeof request.etag !== "string" || !safeHeader(request.etag))))
30
+ throw new Error("invalid request");
31
+ const scope = JSON.stringify([owner, repo, request.updatedAtSince]);
32
+ let page = 1;
33
+ if (request.cursor !== null) {
34
+ if (typeof request.cursor !== "string" || request.cursor.length > 2048 || !/^[A-Za-z0-9_-]+$/.test(request.cursor))
35
+ throw new Error("invalid cursor");
36
+ const decoded = JSON.parse(Buffer.from(request.cursor, "base64url").toString("utf8"));
37
+ if (!Array.isArray(decoded) || decoded.length !== 3 || decoded[0] !== 1 || decoded[1] !== scope
38
+ || !Number.isSafeInteger(decoded[2]) || decoded[2] < 2)
39
+ throw new Error("foreign cursor");
40
+ page = decoded[2];
41
+ }
42
+ return { scope, page, key: JSON.stringify([scope, page]), path: `/repos/${owner}/${repo}/pulls` };
43
+ }
44
+ function cursorFor(scope, page) {
45
+ return Buffer.from(JSON.stringify([1, scope, page])).toString("base64url");
46
+ }
47
+ function parseHttp(output) {
48
+ const split = output.search(/\r?\n\r?\n/);
49
+ if (split < 0)
50
+ throw new Error("missing HTTP envelope");
51
+ const separator = output.slice(split).match(/^\r?\n\r?\n/)[0];
52
+ const lines = output.slice(0, split).split(/\r?\n/);
53
+ const status = /^HTTP\/(?:1\.[01]|2(?:\.0)?|3(?:\.0)?) ([1-5]\d\d)(?: .*)?$/.exec(lines.shift() ?? "");
54
+ if (!status)
55
+ throw new Error("invalid status line");
56
+ const headers = new Map();
57
+ for (const line of lines) {
58
+ const match = /^([A-Za-z0-9!#$%&'*+.^_`|~-]+):[ \t]*(.*)$/.exec(line);
59
+ if (!match)
60
+ throw new Error("invalid HTTP header");
61
+ const name = match[1].toLowerCase();
62
+ // Duplicate control headers are ambiguous, never silently overwritten.
63
+ if (headers.has(name))
64
+ throw new Error("duplicate HTTP header");
65
+ headers.set(name, match[2]);
66
+ }
67
+ return { status: Number(status[1]), headers, body: output.slice(split + separator.length) };
68
+ }
69
+ function parseLinkProof(header, path, current) {
70
+ // GitHub omits Link only when the whole listing fits one page. From page 2
71
+ // it always sends prev/first, so a missing header past page 1 is a
72
+ // truncation risk, never an end of list.
73
+ if (header === undefined) {
74
+ if (current === 1)
75
+ return { next: null, repoId: null };
76
+ throw new Error("missing Link proof");
77
+ }
78
+ const relations = new Map();
79
+ let repoId = null;
80
+ let canonical = false;
81
+ for (const part of header.split(",")) {
82
+ const match = /^\s*<([^<>]+)>;\s*rel="(next|prev|first|last)"\s*$/.exec(part);
83
+ if (!match)
84
+ throw new Error("invalid Link proof");
85
+ const url = new URL(match[1]);
86
+ if (url.origin !== "https://api.github.com" || url.username || url.password || url.hash)
87
+ throw new Error("foreign Link");
88
+ if (url.pathname === path) {
89
+ if (repoId !== null)
90
+ throw new Error("contradictory Link");
91
+ canonical = true;
92
+ }
93
+ else {
94
+ if (canonical)
95
+ throw new Error("contradictory Link");
96
+ const shaped = /^\/repositories\/(\d+)\/pulls$/.exec(url.pathname);
97
+ if (!shaped)
98
+ throw new Error("foreign Link");
99
+ const id = Number(shaped[1]);
100
+ if (!Number.isSafeInteger(id) || id <= 0)
101
+ throw new Error("foreign Link");
102
+ if (repoId !== null && repoId !== id)
103
+ throw new Error("contradictory Link");
104
+ repoId = id;
105
+ }
106
+ const params = url.searchParams;
107
+ if ([...params.keys()].length !== 5 || params.getAll("page").length !== 1)
108
+ throw new Error("foreign Link query");
109
+ for (const [key, value] of Object.entries(LIST_FILTER)) {
110
+ if (params.getAll(key).length !== 1 || params.get(key) !== value)
111
+ throw new Error("foreign Link filter");
112
+ }
113
+ const text = params.get("page");
114
+ const page = Number(text);
115
+ if (!/^[1-9]\d*$/.test(text) || !Number.isSafeInteger(page))
116
+ throw new Error("invalid page");
117
+ const relation = match[2];
118
+ if (relations.has(relation))
119
+ throw new Error("duplicate Link relation");
120
+ if ((relation === "next" && page !== current + 1) || (relation === "prev" && page !== current - 1)
121
+ || (relation === "first" && page !== 1) || (relation === "last" && page < current))
122
+ throw new Error("contradictory Link");
123
+ relations.set(relation, page);
124
+ }
125
+ if (current > 1 && (!relations.has("prev") || !relations.has("first")))
126
+ throw new Error("missing Link proof");
127
+ const next = relations.get("next") ?? null;
128
+ const last = relations.get("last");
129
+ if (last !== undefined && ((next === null && last !== current) || (next !== null && last < next)))
130
+ throw new Error("contradictory last page");
131
+ return { next, repoId };
132
+ }
133
+ function record(value) {
134
+ if (value === null || typeof value !== "object" || Array.isArray(value))
135
+ throw new Error("invalid object");
136
+ return value;
137
+ }
138
+ function observedOid(value) {
139
+ if (typeof value !== "string" || !/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(value))
140
+ throw new Error("invalid OID");
141
+ return { algorithm: value.length === 40 ? "sha1" : "sha256", oid: value };
142
+ }
143
+ function timestamp(value) {
144
+ if (typeof value !== "string" || !/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d(?:\.\d{3})?Z$/.test(value))
145
+ throw new Error("invalid timestamp");
146
+ const time = Date.parse(value);
147
+ if (!Number.isSafeInteger(time) || time <= 0)
148
+ throw new Error("invalid timestamp");
149
+ return time;
150
+ }
151
+ function observation(value, request, path, linkRepoId) {
152
+ const row = record(value);
153
+ const base = record(row.base);
154
+ const head = record(row.head);
155
+ const repo = record(base.repo);
156
+ const identity = `${request.repository.owner}/${request.repository.repo}`;
157
+ if (row.url !== `https://api.github.com${path}/${row.number}` || repo.full_name !== identity)
158
+ throw new Error("foreign PR");
159
+ // A repositories-shaped Link names the numeric repository: every row on a
160
+ // page carrying it must carry the same id.
161
+ if (linkRepoId !== null && repo.id !== linkRepoId)
162
+ throw new Error("foreign PR");
163
+ if (row.state !== "open" && row.state !== "closed")
164
+ throw new Error("unknown PR state");
165
+ const merged = row.merged_at !== null;
166
+ if (merged)
167
+ timestamp(row.merged_at);
168
+ if (merged && row.state !== "closed")
169
+ throw new Error("contradictory state");
170
+ const fact = {
171
+ repositoryOwner: request.repository.owner, repositoryRepo: request.repository.repo,
172
+ number: row.number, state: merged ? "merged" : row.state,
173
+ isDraft: row.draft, updatedAt: timestamp(row.updated_at),
174
+ headOid: observedOid(head.sha), headRef: head.ref,
175
+ baseOid: observedOid(base.sha), baseRef: base.ref,
176
+ // A live PR's synthetic test-merge commit is not observed merge evidence.
177
+ mergeOid: merged && row.merge_commit_sha !== null ? observedOid(row.merge_commit_sha) : null,
178
+ mergeStrategy: "unknown",
179
+ };
180
+ if (!validatePullRequestFact(fact).ok)
181
+ throw new Error("invalid fact");
182
+ return fact;
183
+ }
184
+ function retryDelay(headers, now) {
185
+ const after = headers.get("retry-after");
186
+ let delay = 60_000;
187
+ if (after !== undefined) {
188
+ const seconds = /^\d+(?:\.\d+)?$/.test(after) ? Number(after) * 1000 : Date.parse(after) - now;
189
+ if (Number.isFinite(seconds))
190
+ delay = seconds;
191
+ }
192
+ else if (headers.has("x-ratelimit-reset")) {
193
+ const reset = Number(headers.get("x-ratelimit-reset")) * 1000 - now;
194
+ if (Number.isFinite(reset))
195
+ delay = reset;
196
+ }
197
+ return Math.min(24 * 60 * 60 * 1000, Math.max(1000, Math.ceil(delay)));
198
+ }
199
+ function isThrottled(reply) {
200
+ if (reply.status === 429)
201
+ return true;
202
+ if (reply.status !== 403)
203
+ return false;
204
+ if (reply.headers.get("x-ratelimit-remaining") === "0" || reply.headers.has("retry-after"))
205
+ return true;
206
+ // Secondary limits may omit Retry-After. Inspect only for classification;
207
+ // the provider body and stderr never become a diagnostic or stored fact.
208
+ try {
209
+ const message = record(JSON.parse(reply.body)).message;
210
+ return typeof message === "string" && /secondary rate limit|API rate limit exceeded|abuse detection/i.test(message);
211
+ }
212
+ catch {
213
+ return false;
214
+ }
215
+ }
216
+ /** The caller owns scheduling/durable backoff; a single call never sleeps. */
217
+ export function createLiveGithubTransport(options) {
218
+ if (!isAbsolute(options.ghPath) || !isAbsolute(options.hostDirectory))
219
+ throw new Error("approved gh and service directory must be absolute");
220
+ const timeoutMs = options.timeoutMs ?? 30_000;
221
+ const concurrency = options.maxConcurrent ?? 2;
222
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 300_000
223
+ || !Number.isSafeInteger(concurrency) || concurrency < 1 || concurrency > 16)
224
+ throw new Error("invalid transport budget");
225
+ const now = options.now ?? Date.now;
226
+ const cache = new Map();
227
+ let active = 0;
228
+ const waiters = [];
229
+ function store(key, page, repoId) {
230
+ if (cache.has(key))
231
+ cache.delete(key);
232
+ cache.set(key, { page: structuredClone(page), repoId });
233
+ while (cache.size > MAX_CACHED_PAGES) {
234
+ const oldest = cache.keys().next();
235
+ if (oldest.done)
236
+ break;
237
+ cache.delete(oldest.value);
238
+ }
239
+ }
240
+ async function fetch(request) {
241
+ let pos;
242
+ try {
243
+ pos = position(request);
244
+ }
245
+ catch {
246
+ return failure("protocol");
247
+ }
248
+ const endpoint = `${pos.path.slice(1)}?${new URLSearchParams(LIST_FILTER)}&page=${pos.page}`;
249
+ const entry = cache.get(pos.key);
250
+ const cached = entry?.page;
251
+ // A persisted ETag without its page is insufficient to interpret 304.
252
+ const validator = cached?.etag && cached.etag === request.etag ? request.etag : null;
253
+ for (let attempt = 0; attempt < 2; attempt++) {
254
+ const args = ["api", "--hostname", "github.com", "--method", "GET", "--include",
255
+ "--header", "Accept: application/vnd.github+json", "--header", "X-GitHub-Api-Version: 2022-11-28"];
256
+ if (attempt === 0 && validator)
257
+ args.push("--header", `If-None-Match: ${validator}`);
258
+ args.push(endpoint);
259
+ const result = await new Promise(resolve => {
260
+ execFile(options.ghPath, args, {
261
+ cwd: options.hostDirectory, encoding: "utf8", timeout: timeoutMs, killSignal: "SIGKILL", maxBuffer: 16 * 1024 * 1024,
262
+ env: { ...process.env, GH_HOST: "github.com", GH_DEBUG: "", GH_PROMPT_DISABLED: "1", GH_PAGER: "cat", PAGER: "cat" },
263
+ windowsHide: true,
264
+ }, (error, stdout) => resolve({ output: stdout, error }));
265
+ });
266
+ if (result.error && (result.error.code === "ENOENT" || result.error.code === "EACCES"))
267
+ return failure("unavailable");
268
+ if (result.error && ("killed" in result.error && result.error.killed || result.error.code === "ERR_CHILD_PROCESS_STDIO_MAXBUFFER"))
269
+ return failure("offline");
270
+ let reply;
271
+ try {
272
+ reply = parseHttp(result.output);
273
+ }
274
+ catch {
275
+ // An unauthenticated gh exits 4 with no HTTP envelope: that is missing
276
+ // credentials, never a network outage.
277
+ return failure(result.error?.code === 4 ? "auth_required" : result.error ? "offline" : "protocol");
278
+ }
279
+ const { status, headers } = reply;
280
+ if (status === 304) {
281
+ if (attempt === 0 && validator && cached && (!headers.has("etag") || headers.get("etag") === validator)) {
282
+ // An ETag validates the body, not a past end-of-list proof: another
283
+ // page may have appeared while this page's items stayed unchanged.
284
+ // A 304 without current Link evidence requires an unconditional GET.
285
+ if (headers.has("link")) {
286
+ try {
287
+ const proof = parseLinkProof(headers.get("link"), pos.path, pos.page);
288
+ // A 304 has no base.repo.id: bind numeric links to the cached
289
+ // response's identity, or obtain a body to verify it first.
290
+ if (proof.repoId !== null) {
291
+ if (entry?.repoId === null)
292
+ continue;
293
+ if (proof.repoId !== entry?.repoId)
294
+ return failure("protocol");
295
+ }
296
+ const page = {
297
+ items: structuredClone(cached.items), etag: cached.etag ?? null,
298
+ nextCursor: proof.next === null ? null : cursorFor(pos.scope, proof.next), hasMore: proof.next !== null,
299
+ ...(proof.next === null ? { endProof: PR_END_PROOF } : {}),
300
+ };
301
+ if (!validatePrPage(page).ok)
302
+ return failure("protocol");
303
+ store(pos.key, page, entry?.repoId ?? null);
304
+ return { ok: true, page };
305
+ }
306
+ catch {
307
+ return failure("protocol");
308
+ }
309
+ }
310
+ }
311
+ if (attempt === 0)
312
+ continue;
313
+ return failure("protocol");
314
+ }
315
+ if (isThrottled(reply)) {
316
+ return { ...failure("rate_limited"), retryAfterMs: retryDelay(headers, now()) };
317
+ }
318
+ if (status === 401 || status === 403)
319
+ return failure("auth_required");
320
+ if (status === 404 || status === 410)
321
+ return failure("unavailable");
322
+ if (status >= 500)
323
+ return failure("offline");
324
+ if (status !== 200 || result.error)
325
+ return failure("protocol");
326
+ try {
327
+ const body = JSON.parse(reply.body);
328
+ if (!Array.isArray(body) || body.length > 100)
329
+ return failure("protocol");
330
+ const proof = parseLinkProof(headers.get("link") ?? undefined, pos.path, pos.page);
331
+ // Validate all rows before applying the local updatedAt filter.
332
+ // REST pulls has no since filter: enumerate all pages, filter locally.
333
+ const facts = body.map(row => observation(row, request, pos.path, proof.repoId));
334
+ const etag = headers.get("etag") ?? null;
335
+ if (etag !== null && !safeHeader(etag))
336
+ return failure("protocol");
337
+ const page = {
338
+ items: facts.filter(fact => request.updatedAtSince === null || fact.updatedAt >= request.updatedAtSince),
339
+ nextCursor: proof.next === null ? null : cursorFor(pos.scope, proof.next), hasMore: proof.next !== null,
340
+ ...(proof.next === null ? { endProof: PR_END_PROOF } : {}), etag,
341
+ };
342
+ if (!validatePrPage(page).ok)
343
+ return failure("protocol");
344
+ const observedId = body.length ? record(record(record(body[0]).base).repo).id : null;
345
+ const repoId = typeof observedId === "number" && Number.isSafeInteger(observedId) && observedId > 0 ? observedId : null;
346
+ store(pos.key, page, repoId);
347
+ return { ok: true, page };
348
+ }
349
+ catch {
350
+ return failure("protocol");
351
+ }
352
+ }
353
+ return failure("protocol");
354
+ }
355
+ return {
356
+ async fetchPage(request) {
357
+ if (active >= concurrency)
358
+ await new Promise(resolve => waiters.push(resolve));
359
+ else
360
+ active++;
361
+ try {
362
+ return await fetch(request);
363
+ }
364
+ finally {
365
+ const next = waiters.shift();
366
+ if (next)
367
+ next();
368
+ else
369
+ active--;
370
+ }
371
+ },
372
+ };
373
+ }
374
+ //# sourceMappingURL=live-github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-github.js","sourceRoot":"","sources":["../../src/gateway-host/live-github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { type LiveScope, type OidAlgorithm, type RetentionRequestDto } from "../vendor/engram-live/contracts.js";
2
+ import type { RetentionPort } from "../vendor/engram-live/retention.js";
3
+ export interface LiveObjectStoreOptions {
4
+ /** Existing host-managed directory, outside every observed worktree/git-dir. */
5
+ readonly root: string;
6
+ readonly scope: LiveScope;
7
+ readonly algorithm: OidAlgorithm;
8
+ readonly source: {
9
+ readonly commonDir: string;
10
+ readonly worktreeRoots: readonly string[];
11
+ };
12
+ /** Maximum protected object bytes, including pack indexes; no eviction. */
13
+ readonly quotaBytes: number;
14
+ readonly now?: () => number;
15
+ }
16
+ type Gap = "quota_exhausted" | "objects_unavailable" | "store_busy";
17
+ export interface PendingRetention {
18
+ readonly request: RetentionRequestDto;
19
+ readonly reason: Gap;
20
+ }
21
+ export interface LiveObjectStore extends RetentionPort {
22
+ readonly gitDir: string;
23
+ readonly acquisitionLockPath: string;
24
+ pending(): Promise<readonly PendingRetention[]>;
25
+ retryPending(): Promise<void>;
26
+ /** Local backup coordination only; never a fact/publication payload. */
27
+ backupManifest(): {
28
+ readonly gitDir: string;
29
+ readonly metadataDir: string;
30
+ readonly scope: LiveScope;
31
+ };
32
+ }
33
+ export declare function createLiveObjectStore(options: LiveObjectStoreOptions): LiveObjectStore;
34
+ export {};
35
+ //# sourceMappingURL=live-object-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-object-store.d.ts","sourceRoot":"","sources":["../../src/gateway-host/live-object-store.ts"],"names":[],"mappings":"AAcA,OAAO,EAEL,KAAK,SAAS,EAAE,KAAK,YAAY,EACL,KAAK,mBAAmB,EACrD,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAExE,MAAM,WAAW,sBAAsB;IACrC,gFAAgF;IAChF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;IAC3F,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B;AACD,KAAK,GAAG,GAAG,iBAAiB,GAAG,qBAAqB,GAAG,YAAY,CAAC;AACpE,MAAM,WAAW,gBAAgB;IAAG,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAA;CAAE;AACjG,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACpD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,OAAO,IAAI,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAAC;IAChD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,wEAAwE;IACxE,cAAc,IAAI;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;KAAE,CAAC;CACxG;AAoDD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAsRtF"}