@farmslot/protocol 0.73.2 → 0.74.1
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/CHANGELOG.md +22 -8
- package/README.md +9 -0
- package/dist/client-cache/cache.d.ts +4 -0
- package/dist/client-cache/cache.d.ts.map +1 -0
- package/dist/client-cache/cache.js +1102 -0
- package/dist/client-cache/cache.js.map +1 -0
- package/dist/client-cache/collector-admission.d.ts +29 -0
- package/dist/client-cache/collector-admission.d.ts.map +1 -0
- package/dist/client-cache/collector-admission.js +183 -0
- package/dist/client-cache/collector-admission.js.map +1 -0
- package/dist/client-cache/command-method.d.ts +5 -0
- package/dist/client-cache/command-method.d.ts.map +1 -0
- package/dist/client-cache/command-method.js +2 -0
- package/dist/client-cache/command-method.js.map +1 -0
- package/dist/client-cache/conformance.d.ts +36 -0
- package/dist/client-cache/conformance.d.ts.map +1 -0
- package/dist/client-cache/conformance.js +578 -0
- package/dist/client-cache/conformance.js.map +1 -0
- package/dist/client-cache/content.d.ts +29 -0
- package/dist/client-cache/content.d.ts.map +1 -0
- package/dist/client-cache/content.js +101 -0
- package/dist/client-cache/content.js.map +1 -0
- package/dist/client-cache/d07-domains.d.ts +17 -0
- package/dist/client-cache/d07-domains.d.ts.map +1 -0
- package/dist/client-cache/d07-domains.js +111 -0
- package/dist/client-cache/d07-domains.js.map +1 -0
- package/dist/client-cache/diff-apply.d.ts +29 -0
- package/dist/client-cache/diff-apply.d.ts.map +1 -0
- package/dist/client-cache/diff-apply.js +206 -0
- package/dist/client-cache/diff-apply.js.map +1 -0
- package/dist/client-cache/index.d.ts +14 -10
- package/dist/client-cache/index.d.ts.map +1 -1
- package/dist/client-cache/index.js +14 -1
- package/dist/client-cache/index.js.map +1 -1
- package/dist/client-cache/keys.d.ts +126 -0
- package/dist/client-cache/keys.d.ts.map +1 -0
- package/dist/client-cache/keys.js +25 -0
- package/dist/client-cache/keys.js.map +1 -0
- package/dist/client-cache/native-history.d.ts +64 -0
- package/dist/client-cache/native-history.d.ts.map +1 -0
- package/dist/client-cache/native-history.js +285 -0
- package/dist/client-cache/native-history.js.map +1 -0
- package/dist/client-cache/prefetch.d.ts +50 -0
- package/dist/client-cache/prefetch.d.ts.map +1 -0
- package/dist/client-cache/prefetch.js +507 -0
- package/dist/client-cache/prefetch.js.map +1 -0
- package/dist/client-cache/registry.d.ts +1365 -0
- package/dist/client-cache/registry.d.ts.map +1 -0
- package/dist/client-cache/registry.js +1038 -0
- package/dist/client-cache/registry.js.map +1 -0
- package/dist/client-cache/run-list-versions.d.ts +70 -0
- package/dist/client-cache/run-list-versions.d.ts.map +1 -0
- package/dist/client-cache/run-list-versions.js +309 -0
- package/dist/client-cache/run-list-versions.js.map +1 -0
- package/dist/client-cache/store.d.ts +128 -0
- package/dist/client-cache/store.d.ts.map +1 -0
- package/dist/client-cache/store.js +190 -0
- package/dist/client-cache/store.js.map +1 -0
- package/dist/client-cache/transport.d.ts +27 -0
- package/dist/client-cache/transport.d.ts.map +1 -0
- package/dist/client-cache/transport.js +56 -0
- package/dist/client-cache/transport.js.map +1 -0
- package/dist/client-cache/types.d.ts +116 -0
- package/dist/client-cache/types.d.ts.map +1 -0
- package/dist/client-cache/types.js +2 -0
- package/dist/client-cache/types.js.map +1 -0
- package/dist/client-cache/upstream-retention.d.ts +6 -0
- package/dist/client-cache/upstream-retention.d.ts.map +1 -0
- package/dist/client-cache/upstream-retention.js +28 -0
- package/dist/client-cache/upstream-retention.js.map +1 -0
- package/dist/client-cache/workspace-retention.d.ts +7 -0
- package/dist/client-cache/workspace-retention.d.ts.map +1 -0
- package/dist/client-cache/workspace-retention.js +46 -0
- package/dist/client-cache/workspace-retention.js.map +1 -0
- package/dist/contracts/acceptance-registration.d.ts +0 -6
- package/dist/contracts/acceptance-registration.d.ts.map +1 -1
- package/dist/contracts/provider-accounts.d.ts +31 -0
- package/dist/contracts/provider-accounts.d.ts.map +1 -1
- package/dist/contracts/provider-accounts.js +209 -1
- package/dist/contracts/provider-accounts.js.map +1 -1
- package/dist/contracts/run-bundles.d.ts.map +1 -1
- package/dist/contracts/run-bundles.js +2 -0
- package/dist/contracts/run-bundles.js.map +1 -1
- package/dist/contracts/runs.d.ts +5 -20
- package/dist/contracts/runs.d.ts.map +1 -1
- package/dist/contracts/runs.js +5 -21
- package/dist/contracts/runs.js.map +1 -1
- package/dist/contracts/worker-terminal.d.ts +0 -3
- package/dist/contracts/worker-terminal.d.ts.map +1 -1
- package/dist/contracts/worker-terminal.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/person-session-client.d.ts +4 -1
- package/dist/person-session-client.d.ts.map +1 -1
- package/dist/person-session-client.js.map +1 -1
- package/dist/rpc/auth.d.ts +17 -0
- package/dist/rpc/auth.d.ts.map +1 -1
- package/dist/rpc/auth.js.map +1 -1
- package/dist/rpc/config.d.ts +2 -0
- package/dist/rpc/config.d.ts.map +1 -1
- package/dist/rpc/config.js.map +1 -1
- package/dist/rpc/fs.d.ts +110 -4
- package/dist/rpc/fs.d.ts.map +1 -1
- package/dist/rpc/fs.js +7 -1
- package/dist/rpc/fs.js.map +1 -1
- package/dist/rpc/gateway.d.ts +3 -0
- package/dist/rpc/gateway.d.ts.map +1 -1
- package/dist/rpc/git.d.ts +42 -0
- package/dist/rpc/git.d.ts.map +1 -1
- package/dist/rpc/index.d.ts +1 -0
- package/dist/rpc/index.d.ts.map +1 -1
- package/dist/rpc/index.js +1 -0
- package/dist/rpc/index.js.map +1 -1
- package/dist/rpc/native-session.d.ts +2 -0
- package/dist/rpc/native-session.d.ts.map +1 -1
- package/dist/rpc/native-session.js.map +1 -1
- package/dist/rpc/nodes.d.ts +2 -0
- package/dist/rpc/nodes.d.ts.map +1 -1
- package/dist/rpc/nodes.js.map +1 -1
- package/dist/rpc/pr-observations.d.ts +22 -0
- package/dist/rpc/pr-observations.d.ts.map +1 -0
- package/dist/rpc/pr-observations.js +104 -0
- package/dist/rpc/pr-observations.js.map +1 -0
- package/dist/rpc/pr.d.ts +9 -0
- package/dist/rpc/pr.d.ts.map +1 -1
- package/dist/rpc/pr.js +1 -1
- package/dist/rpc/pr.js.map +1 -1
- package/dist/rpc/principal.d.ts +2 -0
- package/dist/rpc/principal.d.ts.map +1 -1
- package/dist/rpc/registry.d.ts +1 -0
- package/dist/rpc/registry.d.ts.map +1 -1
- package/dist/rpc/registry.js +2 -0
- package/dist/rpc/registry.js.map +1 -1
- package/dist/rpc/resource-observers.d.ts +32 -0
- package/dist/rpc/resource-observers.d.ts.map +1 -0
- package/dist/rpc/resource-observers.js +2 -0
- package/dist/rpc/resource-observers.js.map +1 -0
- package/dist/rpc/run.d.ts +23 -0
- package/dist/rpc/run.d.ts.map +1 -1
- package/dist/rpc/run.js.map +1 -1
- package/dist/rpc/runner-models.d.ts +15 -0
- package/dist/rpc/runner-models.d.ts.map +1 -1
- package/dist/rpc/runner-models.js +91 -0
- package/dist/rpc/runner-models.js.map +1 -1
- package/dist/runs/review-diff-identity.d.ts +15 -0
- package/dist/runs/review-diff-identity.d.ts.map +1 -0
- package/dist/runs/review-diff-identity.js +47 -0
- package/dist/runs/review-diff-identity.js.map +1 -0
- package/dist/runs/run-list-filter.d.ts +33 -0
- package/dist/runs/run-list-filter.d.ts.map +1 -0
- package/dist/runs/run-list-filter.js +116 -0
- package/dist/runs/run-list-filter.js.map +1 -0
- package/dist/runs/run-list-observation.d.ts +5 -0
- package/dist/runs/run-list-observation.d.ts.map +1 -0
- package/dist/runs/run-list-observation.js +36 -0
- package/dist/runs/run-list-observation.js.map +1 -0
- package/dist/runs/run-list-view.d.ts +6 -2
- package/dist/runs/run-list-view.d.ts.map +1 -1
- package/dist/runs/run-list-view.js +10 -4
- package/dist/runs/run-list-view.js.map +1 -1
- package/dist/slots/cancelled-run-slot.d.ts +2 -1
- package/dist/slots/cancelled-run-slot.d.ts.map +1 -1
- package/dist/sources/client.d.ts +10 -1
- package/dist/sources/client.d.ts.map +1 -1
- package/dist/sources/client.js +23 -4
- package/dist/sources/client.js.map +1 -1
- package/dist/sources/controller.d.ts +13 -14
- package/dist/sources/controller.d.ts.map +1 -1
- package/dist/sources/controller.js +87 -82
- package/dist/sources/controller.js.map +1 -1
- package/dist/sources/status-view.d.ts +2 -0
- package/dist/sources/status-view.d.ts.map +1 -1
- package/dist/sources/status-view.js +13 -0
- package/dist/sources/status-view.js.map +1 -1
- package/dist/transport/events.d.ts +1 -4
- package/dist/transport/events.d.ts.map +1 -1
- package/dist/transport/events.js +1 -0
- package/dist/transport/events.js.map +1 -1
- package/dist/transport/frames.d.ts +6 -0
- package/dist/transport/frames.d.ts.map +1 -1
- package/dist/transport/frames.js.map +1 -1
- package/dist/transport/observations.d.ts +24 -0
- package/dist/transport/observations.d.ts.map +1 -0
- package/dist/transport/observations.js +2 -0
- package/dist/transport/observations.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/dist/sources/changes.d.ts +0 -37
- package/dist/sources/changes.d.ts.map +0 -1
- package/dist/sources/changes.js +0 -79
- package/dist/sources/changes.js.map +0 -1
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
import { Methods } from '../rpc/registry.js';
|
|
2
|
+
import { isRunArtifactImagePath } from '../runs/artifact-media.js';
|
|
3
|
+
import { reviewDiffHash } from '../runs/review-diff-identity.js';
|
|
4
|
+
import { gitBlobHash, RESOURCE_CONTENT_LIMITS, resourceContentWithinLimits } from './content.js';
|
|
5
|
+
import { applyUnifiedDiff, parseUnifiedDiff } from './diff-apply.js';
|
|
6
|
+
import { RESOURCE_PUBLISH_INTERVAL_MS } from './keys.js';
|
|
7
|
+
import { resourceQuery } from './registry.js';
|
|
8
|
+
/** Prefetch rule 1 (initial). */
|
|
9
|
+
const MAX_PREFETCH_RUNS = 2;
|
|
10
|
+
const GITLINK_MODE = '160000';
|
|
11
|
+
function isRefusal(error) {
|
|
12
|
+
const code = error && typeof error === 'object' ? Reflect.get(error, 'code') : undefined;
|
|
13
|
+
return code === 'AUTH_FORBIDDEN' || code === 'AUTH_REQUIRED';
|
|
14
|
+
}
|
|
15
|
+
function aborted() {
|
|
16
|
+
return Object.assign(new Error('Prefetch stopped'), { code: 'PREFETCH_ABORTED' });
|
|
17
|
+
}
|
|
18
|
+
/** Only a reply read after `since` counts; a stored stale result is not a read. */
|
|
19
|
+
function freshData(state, since, signal) {
|
|
20
|
+
if (signal.aborted)
|
|
21
|
+
throw aborted();
|
|
22
|
+
if (state.data !== undefined && (state.observedAt ?? -Infinity) >= since)
|
|
23
|
+
return state.data;
|
|
24
|
+
throw Object.assign(new Error(state.error?.message ?? 'The read did not complete'), {
|
|
25
|
+
code: state.error?.code,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
function updatedAt(target) {
|
|
29
|
+
const value = typeof target.updatedAt === 'string' ? Date.parse(target.updatedAt) : target.updatedAt;
|
|
30
|
+
return value !== undefined && Number.isFinite(value) ? value : 0;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The base an active run's diff compares with, in the gateway's `publicationBaseForRun` order:
|
|
34
|
+
* the stack base, then the run's project default branch, then `main`.
|
|
35
|
+
*/
|
|
36
|
+
export function activeRunDiffBase(run, defaultBranch) {
|
|
37
|
+
return run.stack?.retargetedTo ?? run.stack?.baseBranch ?? defaultBranch?.(run) ?? 'main';
|
|
38
|
+
}
|
|
39
|
+
/** The active-run diff prefetch keeps: merge-base to worktree, with untracked files. */
|
|
40
|
+
export function activeRunDiffQuery(params) {
|
|
41
|
+
return resourceQuery(Methods.GIT_DIFF, {
|
|
42
|
+
...params,
|
|
43
|
+
target: 'worktree',
|
|
44
|
+
includeUntracked: true,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
function pendingPackage(run) {
|
|
48
|
+
const packageId = run.engineState?.publishGate?.packageId;
|
|
49
|
+
if (!packageId)
|
|
50
|
+
return undefined;
|
|
51
|
+
for (const decision of run.decisions ?? [])
|
|
52
|
+
if (!decision.resolvedAt &&
|
|
53
|
+
decision.payload?.kind === 'ready' &&
|
|
54
|
+
decision.payload.prPackage?.id === packageId)
|
|
55
|
+
return decision.payload.prPackage;
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
function base64Bytes(text) {
|
|
59
|
+
const binary = atob(text);
|
|
60
|
+
const bytes = new Uint8Array(binary.length);
|
|
61
|
+
for (let index = 0; index < binary.length; index++)
|
|
62
|
+
bytes[index] = binary.charCodeAt(index);
|
|
63
|
+
return bytes;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Experimental Prefetch rules 1 to 6: fills the content cache for pending gates and active runs.
|
|
67
|
+
* It reads only while the connection advertises `capabilities.batchedContent`, and never on a timer.
|
|
68
|
+
*/
|
|
69
|
+
export function createContentPrefetcher(options) {
|
|
70
|
+
const { cache, transport } = options;
|
|
71
|
+
const runs = new Map();
|
|
72
|
+
const encoder = new TextEncoder();
|
|
73
|
+
// Bytes must survive the round trip, so a leading byte order mark stays text.
|
|
74
|
+
const decoder = new TextDecoder('utf-8', { ignoreBOM: true });
|
|
75
|
+
let connection = transport.getConnection();
|
|
76
|
+
let enabled = prefetchEnabled(connection);
|
|
77
|
+
let refused = false;
|
|
78
|
+
let disposed = false;
|
|
79
|
+
let running = 0;
|
|
80
|
+
let generation = 0;
|
|
81
|
+
function prefetchEnabled(next) {
|
|
82
|
+
return (next.connected && next.foreground !== false && next.capabilities?.batchedContent === true);
|
|
83
|
+
}
|
|
84
|
+
function stopCheck(state) {
|
|
85
|
+
state.check.controller?.abort();
|
|
86
|
+
state.check.controller = undefined;
|
|
87
|
+
if (state.check.timer !== undefined)
|
|
88
|
+
clearTimeout(state.check.timer);
|
|
89
|
+
state.check.timer = undefined;
|
|
90
|
+
state.check.again = false;
|
|
91
|
+
}
|
|
92
|
+
function halt() {
|
|
93
|
+
generation++;
|
|
94
|
+
running = 0;
|
|
95
|
+
for (const state of runs.values()) {
|
|
96
|
+
state.controller?.abort();
|
|
97
|
+
state.controller = undefined;
|
|
98
|
+
if (state.status === 'running')
|
|
99
|
+
state.status = 'queued';
|
|
100
|
+
stopCheck(state);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function refuse() {
|
|
104
|
+
refused = true;
|
|
105
|
+
halt();
|
|
106
|
+
}
|
|
107
|
+
function pump() {
|
|
108
|
+
if (!enabled || refused || disposed)
|
|
109
|
+
return;
|
|
110
|
+
const queued = [...runs.values()]
|
|
111
|
+
.filter((state) => state.status === 'queued')
|
|
112
|
+
.sort((a, b) => Number(b.target.gate) - Number(a.target.gate) ||
|
|
113
|
+
updatedAt(b.target) - updatedAt(a.target));
|
|
114
|
+
for (const state of queued) {
|
|
115
|
+
if (running >= MAX_PREFETCH_RUNS)
|
|
116
|
+
return;
|
|
117
|
+
start(state);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function start(state) {
|
|
121
|
+
const ticket = generation;
|
|
122
|
+
const controller = new AbortController();
|
|
123
|
+
const prefetched = state.run;
|
|
124
|
+
state.status = 'running';
|
|
125
|
+
state.rerun = false;
|
|
126
|
+
state.run = undefined;
|
|
127
|
+
state.controller = controller;
|
|
128
|
+
running++;
|
|
129
|
+
void prefetchRun(state, prefetched, controller.signal)
|
|
130
|
+
.catch((error) => {
|
|
131
|
+
if (!controller.signal.aborted && isRefusal(error))
|
|
132
|
+
refuse();
|
|
133
|
+
})
|
|
134
|
+
.finally(() => {
|
|
135
|
+
if (ticket !== generation)
|
|
136
|
+
return;
|
|
137
|
+
running--;
|
|
138
|
+
state.controller = undefined;
|
|
139
|
+
if (runs.get(state.target.runId) === state)
|
|
140
|
+
state.status = state.rerun ? 'queued' : 'done';
|
|
141
|
+
pump();
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
function refetch(state, run) {
|
|
145
|
+
if (state.status === 'running') {
|
|
146
|
+
state.rerun = true;
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
state.status = 'queued';
|
|
150
|
+
state.run = run;
|
|
151
|
+
pump();
|
|
152
|
+
}
|
|
153
|
+
/** Prefetch rule 3: one check in flight per run, and slot checks at the workspace cadence. */
|
|
154
|
+
function check(state) {
|
|
155
|
+
const pending = state.check;
|
|
156
|
+
if (!enabled || refused || disposed || (state.plan !== 'gate' && state.plan !== 'slot'))
|
|
157
|
+
return;
|
|
158
|
+
if (pending.controller) {
|
|
159
|
+
pending.again = true;
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
if (pending.timer !== undefined)
|
|
163
|
+
return;
|
|
164
|
+
const interval = state.plan === 'slot' ? (RESOURCE_PUBLISH_INTERVAL_MS.workspace ?? 0) : 0;
|
|
165
|
+
const wait = pending.lastAt + interval - Date.now();
|
|
166
|
+
if (wait > 0) {
|
|
167
|
+
pending.timer = setTimeout(() => {
|
|
168
|
+
pending.timer = undefined;
|
|
169
|
+
check(state);
|
|
170
|
+
}, wait);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const ticket = generation;
|
|
174
|
+
const controller = new AbortController();
|
|
175
|
+
pending.controller = controller;
|
|
176
|
+
pending.lastAt = Date.now();
|
|
177
|
+
void checkRun(state, controller.signal)
|
|
178
|
+
.catch((error) => {
|
|
179
|
+
if (!controller.signal.aborted && isRefusal(error))
|
|
180
|
+
refuse();
|
|
181
|
+
})
|
|
182
|
+
.finally(() => {
|
|
183
|
+
if (ticket !== generation || pending.controller !== controller)
|
|
184
|
+
return;
|
|
185
|
+
pending.controller = undefined;
|
|
186
|
+
if (pending.again) {
|
|
187
|
+
pending.again = false;
|
|
188
|
+
check(state);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
async function checkRun(state, signal) {
|
|
193
|
+
if (state.plan === 'gate') {
|
|
194
|
+
const run = await readRun(state.target.runId, signal);
|
|
195
|
+
if (run.engineState?.publishGate?.packageId !== state.packageId)
|
|
196
|
+
refetch(state, run);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const log = await options.request(Methods.GIT_LOG, { slotId: state.slotId, limit: 1 }, signal);
|
|
200
|
+
if (!signal.aborted && log.entries[0]?.hash !== state.head)
|
|
201
|
+
refetch(state);
|
|
202
|
+
}
|
|
203
|
+
async function readRun(runId, signal) {
|
|
204
|
+
const since = Date.now();
|
|
205
|
+
const query = resourceQuery(Methods.RUN_GET, { runId });
|
|
206
|
+
const state = await cache.retry(query, undefined, signal);
|
|
207
|
+
return freshData(state, since, signal).run;
|
|
208
|
+
}
|
|
209
|
+
/** Over-cap and binary content loads when opened (Content rule 4); skipping it is no refusal. */
|
|
210
|
+
async function store(key, data, { cohort, signal, token }, { untrackedFiles, alias } = {}) {
|
|
211
|
+
if (signal.aborted)
|
|
212
|
+
throw aborted();
|
|
213
|
+
if (!resourceContentWithinLimits(key, data))
|
|
214
|
+
return true;
|
|
215
|
+
return cache.storeContent({
|
|
216
|
+
key,
|
|
217
|
+
data,
|
|
218
|
+
origin: 'prefetch',
|
|
219
|
+
cohort,
|
|
220
|
+
token,
|
|
221
|
+
...(untrackedFiles?.length ? { untrackedFiles } : {}),
|
|
222
|
+
...(alias ? { alias } : {}),
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
/** Held content is reused, never transferred again; reuse by a gate promotes it to that cohort. */
|
|
226
|
+
function retain(key, { cohort, token }) {
|
|
227
|
+
return cache.retainContent(key, { origin: 'prefetch', cohort, token });
|
|
228
|
+
}
|
|
229
|
+
async function readByPath(path, expected, input) {
|
|
230
|
+
if (!expected || !input.head)
|
|
231
|
+
return undefined;
|
|
232
|
+
try {
|
|
233
|
+
// The batched form carries raw bytes, so files that are not UTF-8 can verify too.
|
|
234
|
+
const page = await options.request(Methods.GIT_SHOW, { ...input.scope, ref: input.head, paths: [path] }, input.signal);
|
|
235
|
+
const entry = page.entries[0];
|
|
236
|
+
const data = entry?.status === 'ok' && base64Bytes(entry.content ?? '');
|
|
237
|
+
return data && gitBlobHash(data) === expected ? data : undefined;
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
if (isRefusal(error) || input.signal.aborted)
|
|
241
|
+
throw error;
|
|
242
|
+
return undefined;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/** Prefetch rule 4. False when the cache refused the result. */
|
|
246
|
+
async function rebuild(file, readBase, blobSha, input) {
|
|
247
|
+
if (!file.newPath)
|
|
248
|
+
return true;
|
|
249
|
+
const expected = blobSha ?? file.newId;
|
|
250
|
+
if (expected && (await retain({ kind: 'blob', id: expected }, input)))
|
|
251
|
+
return true;
|
|
252
|
+
const base = await readBase();
|
|
253
|
+
if (!base)
|
|
254
|
+
return true;
|
|
255
|
+
let data = base;
|
|
256
|
+
if (file.hunks.length || file.malformed) {
|
|
257
|
+
const text = applyUnifiedDiff(decoder.decode(base), file);
|
|
258
|
+
data = text === undefined ? undefined : encoder.encode(text);
|
|
259
|
+
}
|
|
260
|
+
if (data && expected && gitBlobHash(data) !== expected)
|
|
261
|
+
data = undefined;
|
|
262
|
+
data ??= await readByPath(file.newPath, expected, input);
|
|
263
|
+
return !data || store({ kind: 'blob', id: gitBlobHash(data) }, data, input);
|
|
264
|
+
}
|
|
265
|
+
/** Base sides through batched `git.show`, then new sides. False when the cache refused. */
|
|
266
|
+
async function prefetchFiles(input) {
|
|
267
|
+
const { signal } = input;
|
|
268
|
+
const manifest = new Map((input.untrackedFiles ?? []).map((file) => [file.path, file.blobSha]));
|
|
269
|
+
const files = parseUnifiedDiff(input.text).filter((file) => !file.binary && file.oldMode !== GITLINK_MODE && file.newMode !== GITLINK_MODE);
|
|
270
|
+
for (const path of manifest.keys())
|
|
271
|
+
if (!files.some((file) => file.newPath === path))
|
|
272
|
+
files.push({ newPath: path, binary: false, malformed: false, hunks: [] });
|
|
273
|
+
const byBase = new Map();
|
|
274
|
+
const held = new Set();
|
|
275
|
+
for (const file of files) {
|
|
276
|
+
if (!file.oldPath)
|
|
277
|
+
continue;
|
|
278
|
+
byBase.set(file.oldPath, [...(byBase.get(file.oldPath) ?? []), file]);
|
|
279
|
+
const id = file.oldId;
|
|
280
|
+
if (id && !held.has(id) && (await retain({ kind: 'blob', id }, input)))
|
|
281
|
+
held.add(id);
|
|
282
|
+
}
|
|
283
|
+
const paths = [...byBase.keys()];
|
|
284
|
+
let after;
|
|
285
|
+
let more = paths.length > 0;
|
|
286
|
+
while (more) {
|
|
287
|
+
const page = await options.request(Methods.GIT_SHOW, {
|
|
288
|
+
...input.scope,
|
|
289
|
+
ref: input.base,
|
|
290
|
+
paths,
|
|
291
|
+
...(held.size ? { have: [...held] } : {}),
|
|
292
|
+
...(after === undefined ? {} : { after }),
|
|
293
|
+
}, signal);
|
|
294
|
+
for (const entry of page.entries) {
|
|
295
|
+
if (!entry.id || (entry.status !== 'ok' && entry.status !== 'held'))
|
|
296
|
+
continue;
|
|
297
|
+
const key = { kind: 'blob', id: entry.id };
|
|
298
|
+
let data;
|
|
299
|
+
if (entry.status === 'ok') {
|
|
300
|
+
data = base64Bytes(entry.content ?? '');
|
|
301
|
+
if (gitBlobHash(data) !== entry.id)
|
|
302
|
+
continue;
|
|
303
|
+
if (!(await store(key, data, input)))
|
|
304
|
+
return false;
|
|
305
|
+
}
|
|
306
|
+
// A held base is read only when one of its new sides is not held.
|
|
307
|
+
const readBase = async () => (data ??= await cache.readContent(key));
|
|
308
|
+
for (const file of byBase.get(entry.path) ?? [])
|
|
309
|
+
if (!(await rebuild(file, readBase, manifest.get(file.newPath ?? ''), input)))
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
312
|
+
more = page.hasMore && page.entries.length > 0;
|
|
313
|
+
after = page.cursor;
|
|
314
|
+
}
|
|
315
|
+
const empty = async () => new Uint8Array();
|
|
316
|
+
for (const file of files) {
|
|
317
|
+
const blobSha = manifest.get(file.newPath ?? '');
|
|
318
|
+
if (!file.oldPath && !(await rebuild(file, empty, blobSha, input)))
|
|
319
|
+
return false;
|
|
320
|
+
}
|
|
321
|
+
return true;
|
|
322
|
+
}
|
|
323
|
+
async function prefetchGate(run, prPackage, write) {
|
|
324
|
+
const { signal } = write;
|
|
325
|
+
const snapshot = prPackage.reviewSnapshot;
|
|
326
|
+
const bundleDigest = prPackage.artifactBundle?.bundleDigest;
|
|
327
|
+
if (snapshot?.diffPath && snapshot.diffHash) {
|
|
328
|
+
const key = { kind: 'diff', id: snapshot.diffHash };
|
|
329
|
+
let data = (await retain(key, write)) ? await cache.readContent(key) : undefined;
|
|
330
|
+
if (!data) {
|
|
331
|
+
const read = await options.readArtifact({ runId: run.id, path: snapshot.diffPath, bundleDigest }, signal);
|
|
332
|
+
if (!(await store(key, read, write, { untrackedFiles: snapshot.untrackedFiles })))
|
|
333
|
+
return;
|
|
334
|
+
if (resourceContentWithinLimits(key, read))
|
|
335
|
+
data = read;
|
|
336
|
+
}
|
|
337
|
+
// Prefetch rule 6: a snapshot not taken at the local merge-base loads its bases when opened.
|
|
338
|
+
if (data && run.slotId && snapshot.baseSha && snapshot.source === 'local-git') {
|
|
339
|
+
const stored = await prefetchFiles({
|
|
340
|
+
text: decoder.decode(data),
|
|
341
|
+
base: snapshot.baseSha,
|
|
342
|
+
head: snapshot.headSha ?? prPackage.headSha,
|
|
343
|
+
scope: { slotId: run.slotId },
|
|
344
|
+
untrackedFiles: snapshot.untrackedFiles,
|
|
345
|
+
...write,
|
|
346
|
+
});
|
|
347
|
+
if (!stored)
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
for (const entry of prPackage.evidenceManifest ?? []) {
|
|
352
|
+
if (!entry.sha256 ||
|
|
353
|
+
!isRunArtifactImagePath(entry.path) ||
|
|
354
|
+
(entry.sizeBytes ?? 0) > RESOURCE_CONTENT_LIMITS.imageBytes)
|
|
355
|
+
continue;
|
|
356
|
+
const key = { kind: 'artifact', id: entry.sha256 };
|
|
357
|
+
if (await retain(key, write))
|
|
358
|
+
continue;
|
|
359
|
+
const data = await options.readArtifact({ runId: run.id, path: entry.path, bundleDigest }, signal);
|
|
360
|
+
if (!(await store(key, data, write)))
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
/** The diff is the observed query result, kept by the cache as a stale prefetch snapshot. */
|
|
365
|
+
async function prefetchSlot(state, run, slotId, write) {
|
|
366
|
+
const since = Date.now();
|
|
367
|
+
const query = activeRunDiffQuery({
|
|
368
|
+
slotId,
|
|
369
|
+
runId: run.id,
|
|
370
|
+
base: activeRunDiffBase(run, options.defaultBranch),
|
|
371
|
+
});
|
|
372
|
+
const placement = { origin: 'prefetch', cohort: write.cohort };
|
|
373
|
+
const diff = freshData(await cache.retry(query, placement, write.signal), since, write.signal);
|
|
374
|
+
state.head = diff.headSha;
|
|
375
|
+
if (diff.mergeBaseSha &&
|
|
376
|
+
encoder.encode(diff.diff).byteLength <= RESOURCE_CONTENT_LIMITS.diffBytes)
|
|
377
|
+
await prefetchFiles({
|
|
378
|
+
text: diff.diff,
|
|
379
|
+
base: diff.mergeBaseSha,
|
|
380
|
+
head: diff.headSha,
|
|
381
|
+
scope: { slotId },
|
|
382
|
+
...write,
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
async function prefetchFrozen(run, subject, write) {
|
|
386
|
+
const scope = { slotId: '', runId: run.id };
|
|
387
|
+
const diff = await options.request(Methods.GIT_DIFF, { ...scope, base: subject.baseSha, head: subject.headSha }, write.signal);
|
|
388
|
+
const key = { kind: 'diff', id: reviewDiffHash(diff.diff) };
|
|
389
|
+
const data = encoder.encode(diff.diff);
|
|
390
|
+
// The alias lets a client find the diff offline from the run's frozen commits.
|
|
391
|
+
const alias = `frozen-diff:${run.id}:${subject.baseSha}:${subject.headSha}`;
|
|
392
|
+
if (!resourceContentWithinLimits(key, data) || !(await store(key, data, write, { alias })))
|
|
393
|
+
return;
|
|
394
|
+
if (diff.mergeBaseSha)
|
|
395
|
+
await prefetchFiles({
|
|
396
|
+
text: diff.diff,
|
|
397
|
+
base: diff.mergeBaseSha,
|
|
398
|
+
head: subject.headSha,
|
|
399
|
+
scope,
|
|
400
|
+
...write,
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
async function prefetchRun(state, prefetched, signal) {
|
|
404
|
+
const token = cache.contentWriteToken();
|
|
405
|
+
const run = prefetched ?? (await readRun(state.target.runId, signal));
|
|
406
|
+
const prPackage = pendingPackage(run);
|
|
407
|
+
state.slotId = run.slotId ?? undefined;
|
|
408
|
+
if (prPackage) {
|
|
409
|
+
state.plan = 'gate';
|
|
410
|
+
state.packageId = run.engineState?.publishGate?.packageId;
|
|
411
|
+
return prefetchGate(run, prPackage, { cohort: 'gate', signal, token });
|
|
412
|
+
}
|
|
413
|
+
const write = { cohort: 'run', signal, token };
|
|
414
|
+
if (run.reviewWorkspace && run.reviewWorkspaceSubject) {
|
|
415
|
+
state.plan = 'frozen';
|
|
416
|
+
return prefetchFrozen(run, run.reviewWorkspaceSubject, write);
|
|
417
|
+
}
|
|
418
|
+
state.plan = run.slotId ? 'slot' : undefined;
|
|
419
|
+
if (run.slotId)
|
|
420
|
+
return prefetchSlot(state, run, run.slotId, write);
|
|
421
|
+
}
|
|
422
|
+
function connectionChanged(next) {
|
|
423
|
+
if (disposed)
|
|
424
|
+
return;
|
|
425
|
+
const nextEnabled = prefetchEnabled(next);
|
|
426
|
+
const same = next.id === connection.id;
|
|
427
|
+
connection = next;
|
|
428
|
+
if (same && nextEnabled === enabled)
|
|
429
|
+
return;
|
|
430
|
+
halt();
|
|
431
|
+
enabled = nextEnabled;
|
|
432
|
+
if (!same) {
|
|
433
|
+
refused = false;
|
|
434
|
+
for (const state of runs.values()) {
|
|
435
|
+
state.status = 'queued';
|
|
436
|
+
state.run = undefined;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
else
|
|
440
|
+
for (const state of runs.values())
|
|
441
|
+
if (state.status === 'done')
|
|
442
|
+
check(state);
|
|
443
|
+
pump();
|
|
444
|
+
}
|
|
445
|
+
function resourceChanged(payload) {
|
|
446
|
+
if (!enabled || refused || disposed)
|
|
447
|
+
return;
|
|
448
|
+
const changed = new Set();
|
|
449
|
+
for (const { key } of payload.changes) {
|
|
450
|
+
if (key.family === 'package') {
|
|
451
|
+
const state = runs.get(key.runId);
|
|
452
|
+
if (state)
|
|
453
|
+
changed.add(state);
|
|
454
|
+
}
|
|
455
|
+
else if (key.family === 'workspace' && 'slotId' in key)
|
|
456
|
+
for (const state of runs.values())
|
|
457
|
+
if (state.plan === 'slot' &&
|
|
458
|
+
state.slotId === key.slotId &&
|
|
459
|
+
(!key.runId || key.runId === state.target.runId))
|
|
460
|
+
changed.add(state);
|
|
461
|
+
}
|
|
462
|
+
for (const state of changed)
|
|
463
|
+
check(state);
|
|
464
|
+
}
|
|
465
|
+
const unsubscribeConnection = transport.onConnectionChange(connectionChanged);
|
|
466
|
+
const unsubscribeChanges = transport.onResourceChanged(resourceChanged);
|
|
467
|
+
return {
|
|
468
|
+
setTargets(targets) {
|
|
469
|
+
if (disposed)
|
|
470
|
+
return;
|
|
471
|
+
const listed = new Map(targets.map((target) => [target.runId, target]));
|
|
472
|
+
for (const [runId, state] of runs)
|
|
473
|
+
if (!listed.has(runId)) {
|
|
474
|
+
state.controller?.abort();
|
|
475
|
+
stopCheck(state);
|
|
476
|
+
runs.delete(runId);
|
|
477
|
+
}
|
|
478
|
+
for (const target of listed.values()) {
|
|
479
|
+
const state = runs.get(target.runId);
|
|
480
|
+
if (!state) {
|
|
481
|
+
runs.set(target.runId, {
|
|
482
|
+
target,
|
|
483
|
+
status: 'queued',
|
|
484
|
+
rerun: false,
|
|
485
|
+
check: { again: false, lastAt: -Infinity },
|
|
486
|
+
});
|
|
487
|
+
continue;
|
|
488
|
+
}
|
|
489
|
+
const promoted = state.target.gate !== target.gate;
|
|
490
|
+
state.target = target;
|
|
491
|
+
if (promoted)
|
|
492
|
+
refetch(state);
|
|
493
|
+
}
|
|
494
|
+
pump();
|
|
495
|
+
},
|
|
496
|
+
dispose() {
|
|
497
|
+
if (disposed)
|
|
498
|
+
return;
|
|
499
|
+
disposed = true;
|
|
500
|
+
unsubscribeConnection();
|
|
501
|
+
unsubscribeChanges();
|
|
502
|
+
halt();
|
|
503
|
+
runs.clear();
|
|
504
|
+
},
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
//# sourceMappingURL=prefetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefetch.js","sourceRoot":"","sources":["../../src/client-cache/prefetch.ts"],"names":[],"mappings":"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"}
|