@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,578 @@
|
|
|
1
|
+
import { createGatewayResourceCache } from './cache.js';
|
|
2
|
+
import { gitBlobHash } from './content.js';
|
|
3
|
+
import { canonicalResourceJson } from './keys.js';
|
|
4
|
+
import { resourceQuery } from './registry.js';
|
|
5
|
+
const roles = [{ role: 'admin', scope: { kind: 'global' } }];
|
|
6
|
+
const capabilities = {
|
|
7
|
+
httpBearerAuth: true,
|
|
8
|
+
voiceInstructionFormatting: false,
|
|
9
|
+
batchedContent: false,
|
|
10
|
+
resourceChanges: { version: 1, epoch: 'conformance-epoch', versionLists: false },
|
|
11
|
+
};
|
|
12
|
+
const stamp = (revision = 0) => ({
|
|
13
|
+
epoch: 'conformance-epoch',
|
|
14
|
+
dependencies: [{ key: { family: 'sources', scope: 'farm' }, revision }],
|
|
15
|
+
});
|
|
16
|
+
function verify(condition, message) {
|
|
17
|
+
if (!condition)
|
|
18
|
+
throw new Error(`Resource store conformance: ${message}`);
|
|
19
|
+
}
|
|
20
|
+
function sameBytes(actual, expected) {
|
|
21
|
+
return (actual !== undefined &&
|
|
22
|
+
actual.byteLength === expected.length &&
|
|
23
|
+
actual.every((byte, index) => byte === expected[index]));
|
|
24
|
+
}
|
|
25
|
+
/** Internal transport fixture also used by the portable cache's regression tests. */
|
|
26
|
+
export class ResourceCacheConformanceTransport {
|
|
27
|
+
constructor(scope) {
|
|
28
|
+
this.requestCount = 0;
|
|
29
|
+
this.connections = new Set();
|
|
30
|
+
this.changes = new Set();
|
|
31
|
+
this.reads = [];
|
|
32
|
+
this.waiters = [];
|
|
33
|
+
this.getConnection = () => this.connection;
|
|
34
|
+
this.onConnectionChange = (listener) => {
|
|
35
|
+
this.connections.add(listener);
|
|
36
|
+
return () => {
|
|
37
|
+
this.connections.delete(listener);
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
this.onResourceChanged = (listener) => {
|
|
41
|
+
this.changes.add(listener);
|
|
42
|
+
return () => {
|
|
43
|
+
this.changes.delete(listener);
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
this.resynchronize = () => this.setConnection({ connected: false }, 'network');
|
|
47
|
+
this.connection = {
|
|
48
|
+
id: 0,
|
|
49
|
+
connected: false,
|
|
50
|
+
authMode: 'token',
|
|
51
|
+
scope,
|
|
52
|
+
authority: { roles, workspaceAccess: 'farm' },
|
|
53
|
+
capabilities,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
setConnection(change, reason) {
|
|
57
|
+
this.connection = { ...this.connection, ...change };
|
|
58
|
+
for (const listener of this.connections)
|
|
59
|
+
listener(this.connection, reason);
|
|
60
|
+
}
|
|
61
|
+
advance(revision) {
|
|
62
|
+
this.publish({
|
|
63
|
+
version: 1,
|
|
64
|
+
epoch: 'conformance-epoch',
|
|
65
|
+
changes: [{ key: { family: 'sources', scope: 'farm' }, revision, kind: 'updated' }],
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
publish(payload) {
|
|
69
|
+
for (const listener of this.changes)
|
|
70
|
+
listener(payload);
|
|
71
|
+
}
|
|
72
|
+
request(_method, _params, signal) {
|
|
73
|
+
this.requestCount++;
|
|
74
|
+
return new Promise((resolve, reject) => {
|
|
75
|
+
const read = {
|
|
76
|
+
signal,
|
|
77
|
+
resolve: (data, revision) => resolve({ data: data, resourceState: stamp(revision) }),
|
|
78
|
+
reject: (code) => reject(Object.assign(new Error(code), { code })),
|
|
79
|
+
};
|
|
80
|
+
const waiter = this.waiters.shift();
|
|
81
|
+
if (waiter)
|
|
82
|
+
waiter(read);
|
|
83
|
+
else
|
|
84
|
+
this.reads.push(read);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
nextRead() {
|
|
88
|
+
const read = this.reads.shift();
|
|
89
|
+
if (read)
|
|
90
|
+
return Promise.resolve(read);
|
|
91
|
+
return new Promise((resolve, reject) => {
|
|
92
|
+
const timer = setTimeout(() => reject(new Error('Conformance read did not start')), 2000);
|
|
93
|
+
this.waiters.push((next) => {
|
|
94
|
+
clearTimeout(timer);
|
|
95
|
+
resolve(next);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** The query is registered; only this store-seam fixture enables persistence before migration. */
|
|
101
|
+
function persistedQuery() {
|
|
102
|
+
return { ...resourceQuery('sources.status'), persisted: true };
|
|
103
|
+
}
|
|
104
|
+
async function storedState(cache, query) {
|
|
105
|
+
return new Promise((resolve, reject) => {
|
|
106
|
+
const timer = setTimeout(() => reject(new Error('Stored query did not hydrate')), 2000);
|
|
107
|
+
cache.observe(query, (state) => {
|
|
108
|
+
if (state.status === 'stale' && state.data) {
|
|
109
|
+
clearTimeout(timer);
|
|
110
|
+
resolve(state);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/** Experimental, framework-free contract run by every ResourceStore adapter. */
|
|
116
|
+
export async function runResourceStoreConformance(factory) {
|
|
117
|
+
const passed = [];
|
|
118
|
+
let counter = 0;
|
|
119
|
+
const scope = () => ({
|
|
120
|
+
gatewayUrl: 'ws://conformance.invalid/',
|
|
121
|
+
profileId: `conformance-${++counter}`,
|
|
122
|
+
principalId: 'principal-a',
|
|
123
|
+
principalGeneration: 0,
|
|
124
|
+
});
|
|
125
|
+
const query = persistedQuery();
|
|
126
|
+
async function fixture(initialRoles = roles) {
|
|
127
|
+
const identity = scope();
|
|
128
|
+
const store = await factory(identity);
|
|
129
|
+
const metadata = {
|
|
130
|
+
scope: identity,
|
|
131
|
+
authority: { roles: initialRoles, workspaceAccess: 'farm' },
|
|
132
|
+
};
|
|
133
|
+
await store.setMetadata(metadata);
|
|
134
|
+
await store.putQuery({ id: query.id, data: { value: 'stored' }, observedAt: 123, bytes: 18 });
|
|
135
|
+
const transport = new ResourceCacheConformanceTransport(identity);
|
|
136
|
+
transport.connection.authority = metadata.authority;
|
|
137
|
+
const cache = createGatewayResourceCache({
|
|
138
|
+
transport,
|
|
139
|
+
store,
|
|
140
|
+
openStore: (next) => Promise.resolve(factory(next.scope)),
|
|
141
|
+
});
|
|
142
|
+
return { identity, store, transport, cache };
|
|
143
|
+
}
|
|
144
|
+
{
|
|
145
|
+
const store = await factory(scope());
|
|
146
|
+
try {
|
|
147
|
+
const original = { id: 'atomic', data: { value: 'before' }, observedAt: 1, bytes: 18 };
|
|
148
|
+
await store.putQuery(original);
|
|
149
|
+
original.data.value = 'mutated by caller';
|
|
150
|
+
verify((await store.getQuery('atomic'))?.data.value === 'before', 'write must take an owned snapshot');
|
|
151
|
+
await store.putQuery({ id: 'atomic', data: { value: 'after' }, observedAt: 2, bytes: 17 });
|
|
152
|
+
verify((await store.listQueries()).length === 1 && (await store.byteTotals()).queries === 17, 'replacement and byte totals must be atomic');
|
|
153
|
+
const copy = await store.getQuery('atomic');
|
|
154
|
+
copy.data.value = 'mutated read';
|
|
155
|
+
verify((await store.getQuery('atomic'))?.data.value === 'after', 'read must not expose stored mutable state');
|
|
156
|
+
await store.putQuery({
|
|
157
|
+
id: 'placed',
|
|
158
|
+
data: { value: 'prefetched diff' },
|
|
159
|
+
observedAt: 3,
|
|
160
|
+
bytes: 27,
|
|
161
|
+
origin: 'prefetch',
|
|
162
|
+
cohort: 'gate',
|
|
163
|
+
});
|
|
164
|
+
const listed = await store.listQueries();
|
|
165
|
+
const placed = listed.find((row) => row.id === 'placed');
|
|
166
|
+
const reread = await store.getQuery('placed');
|
|
167
|
+
verify((listed.find((row) => row.id === 'atomic')?.origin ?? 'opened') === 'opened' &&
|
|
168
|
+
placed?.origin === 'prefetch' &&
|
|
169
|
+
placed.cohort === 'gate' &&
|
|
170
|
+
reread?.origin === 'prefetch' &&
|
|
171
|
+
reread.cohort === 'gate', 'query placement must persist, and a row without one is opened');
|
|
172
|
+
if (store.touchQuery) {
|
|
173
|
+
await store.touchQuery('placed', 4, 'opened');
|
|
174
|
+
const opened = await store.getQuery('placed');
|
|
175
|
+
verify(opened?.origin === 'opened' && opened.accessedAt === 4, 'touching a query as opened must upgrade its placement');
|
|
176
|
+
}
|
|
177
|
+
await store.deleteQuery('placed');
|
|
178
|
+
await store.deleteAll();
|
|
179
|
+
await store.putQuery(original);
|
|
180
|
+
verify((await store.getQuery('atomic')) === undefined && (await store.byteTotals()).queries === 0, 'deleted store must drop late reads and writes');
|
|
181
|
+
passed.push('atomic snapshots, byte totals and deleted-incarnation fencing');
|
|
182
|
+
}
|
|
183
|
+
finally {
|
|
184
|
+
await store.close();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
{
|
|
188
|
+
const store = await factory(scope());
|
|
189
|
+
try {
|
|
190
|
+
const key = { kind: 'blob', id: 'conformance-blob' };
|
|
191
|
+
const empty = { kind: 'artifact', id: 'conformance-empty' };
|
|
192
|
+
const data = new Uint8Array([0, 1, 2, 255]);
|
|
193
|
+
await store.putContent({
|
|
194
|
+
...key,
|
|
195
|
+
data,
|
|
196
|
+
bytes: 4,
|
|
197
|
+
origin: 'prefetch',
|
|
198
|
+
cohort: 'run',
|
|
199
|
+
accessedAt: 1,
|
|
200
|
+
});
|
|
201
|
+
await store.putContent({
|
|
202
|
+
...empty,
|
|
203
|
+
data: new Uint8Array(),
|
|
204
|
+
bytes: 0,
|
|
205
|
+
origin: 'opened',
|
|
206
|
+
cohort: 'gate',
|
|
207
|
+
accessedAt: 2,
|
|
208
|
+
});
|
|
209
|
+
data[0] = 9;
|
|
210
|
+
const saved = await store.getContent(key);
|
|
211
|
+
verify(sameBytes(saved?.data, [0, 1, 2, 255]) &&
|
|
212
|
+
saved?.origin === 'prefetch' &&
|
|
213
|
+
saved.cohort === 'run' &&
|
|
214
|
+
saved.accessedAt === 1, 'content must round-trip an owned copy of binary bytes');
|
|
215
|
+
saved.data[1] = 9;
|
|
216
|
+
verify(sameBytes((await store.getContent(key))?.data, [0, 1, 2, 255]) &&
|
|
217
|
+
sameBytes((await store.getContent(empty))?.data, []) &&
|
|
218
|
+
(await store.getContent({ kind: 'diff', id: key.id })) === undefined, 'content reads must be owned copies keyed by kind and id');
|
|
219
|
+
verify((await store.hasContent(key)) && !(await store.hasContent({ kind: 'diff', id: key.id })), 'presence must be keyed by kind and id');
|
|
220
|
+
await store.putContentAlias('frozen', key);
|
|
221
|
+
const first = await store.getContentByAlias('frozen');
|
|
222
|
+
await store.putContentAlias('frozen', empty);
|
|
223
|
+
await store.putContentAlias('absent', { kind: 'blob', id: 'not-held' });
|
|
224
|
+
verify(sameBytes(first?.data, [0, 1, 2, 255]) &&
|
|
225
|
+
first?.id === key.id &&
|
|
226
|
+
sameBytes((await store.getContentByAlias('frozen'))?.data, []) &&
|
|
227
|
+
(await store.getContentByAlias('absent')) === undefined, 'an alias must name held content, and the latest alias must win');
|
|
228
|
+
await store.touchContent(key, 5, 'opened');
|
|
229
|
+
const touched = (await store.listContent()).find((row) => row.id === key.id);
|
|
230
|
+
verify(touched?.accessedAt === 5 && touched.origin === 'opened' && !('data' in touched), 'touch must change recency and origin, and listings must omit bytes');
|
|
231
|
+
await store.retainContent(key, 6, { origin: 'prefetch', cohort: 'gate' });
|
|
232
|
+
await store.retainContent({ kind: 'blob', id: 'not-held' }, 6, { cohort: 'gate' });
|
|
233
|
+
const retained = await store.getContent(key);
|
|
234
|
+
verify(retained?.origin === 'opened' &&
|
|
235
|
+
retained.cohort === 'gate' &&
|
|
236
|
+
retained.accessedAt === 6 &&
|
|
237
|
+
!(await store.hasContent({ kind: 'blob', id: 'not-held' })), 'retaining must apply only the stronger origin and cohort to held content');
|
|
238
|
+
await store.deleteContent(empty);
|
|
239
|
+
verify((await store.listContent()).length === 1 &&
|
|
240
|
+
(await store.byteTotals()).content === 4 &&
|
|
241
|
+
(await store.getContentByAlias('frozen')) === undefined, 'content deletion, its aliases and byte totals must be exact');
|
|
242
|
+
await store.putContent({
|
|
243
|
+
...empty,
|
|
244
|
+
data: new Uint8Array(),
|
|
245
|
+
bytes: 0,
|
|
246
|
+
origin: 'opened',
|
|
247
|
+
cohort: 'gate',
|
|
248
|
+
accessedAt: 2,
|
|
249
|
+
});
|
|
250
|
+
verify((await store.getContentByAlias('frozen')) === undefined, 'content stored again must not revive a deleted alias');
|
|
251
|
+
await store.deleteAll();
|
|
252
|
+
await store.putContent({
|
|
253
|
+
...key,
|
|
254
|
+
data,
|
|
255
|
+
bytes: 4,
|
|
256
|
+
origin: 'opened',
|
|
257
|
+
cohort: 'gate',
|
|
258
|
+
accessedAt: 6,
|
|
259
|
+
});
|
|
260
|
+
await store.putContentAlias('frozen', key);
|
|
261
|
+
verify((await store.getContent(key)) === undefined &&
|
|
262
|
+
!(await store.hasContent(key)) &&
|
|
263
|
+
(await store.getContentByAlias('frozen')) === undefined &&
|
|
264
|
+
(await store.byteTotals()).content === 0, 'deleted store must drop late content writes');
|
|
265
|
+
passed.push('content bytes, presence, aliases, origin and recency, byte totals and deletion fencing');
|
|
266
|
+
}
|
|
267
|
+
finally {
|
|
268
|
+
await store.close();
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
{
|
|
272
|
+
const store = await factory(scope());
|
|
273
|
+
try {
|
|
274
|
+
const { getRows, mergeRows } = store;
|
|
275
|
+
verify(getRows && mergeRows, 'a store must hold row-backed entries');
|
|
276
|
+
const rowsOf = (id) => getRows.call(store, id);
|
|
277
|
+
const merge = (id, value) => mergeRows.call(store, id, value);
|
|
278
|
+
const entry = (value, bytes) => ({
|
|
279
|
+
id: 'rows',
|
|
280
|
+
data: { value },
|
|
281
|
+
observedAt: 1,
|
|
282
|
+
bytes,
|
|
283
|
+
});
|
|
284
|
+
const row = (id, version, body) => ({
|
|
285
|
+
id,
|
|
286
|
+
version,
|
|
287
|
+
projection: { id },
|
|
288
|
+
...(body === undefined ? {} : { body }),
|
|
289
|
+
bytes: 10,
|
|
290
|
+
});
|
|
291
|
+
const value = (rows) => rows.entry?.data?.value;
|
|
292
|
+
const absent = await rowsOf('rows');
|
|
293
|
+
verify(absent.entry === undefined && absent.rows.length === 0, 'an absent entry has no rows');
|
|
294
|
+
const first = row('a', 'v1', { a: 1 });
|
|
295
|
+
await merge('rows', {
|
|
296
|
+
entry: entry('index', 40),
|
|
297
|
+
upserts: [first, row('b', 'v1')],
|
|
298
|
+
deletes: [],
|
|
299
|
+
});
|
|
300
|
+
first.version = 'mutated by caller';
|
|
301
|
+
let read = await rowsOf('rows');
|
|
302
|
+
verify(value(read) === 'index' &&
|
|
303
|
+
read.rows.length === 2 &&
|
|
304
|
+
read.rows.find((stored) => stored.id === 'a')?.version === 'v1', 'a row merge must write its entry and owned copies of its rows');
|
|
305
|
+
await merge('rows', {
|
|
306
|
+
entry: entry('next', 30),
|
|
307
|
+
upserts: [row('a', 'v2')],
|
|
308
|
+
deletes: ['b', 'never-stored'],
|
|
309
|
+
});
|
|
310
|
+
read = await rowsOf('rows');
|
|
311
|
+
verify(value(read) === 'next' &&
|
|
312
|
+
read.rows.length === 1 &&
|
|
313
|
+
read.rows[0].version === 'v2' &&
|
|
314
|
+
read.rows[0].body === undefined, 'upserts must replace whole rows by id, and deletes must ignore unknown ids');
|
|
315
|
+
verify((await store.byteTotals()).queries === 30 &&
|
|
316
|
+
(await store.listQueries()).find((listed) => listed.id === 'rows')?.bytes === 30, 'listings and totals must count only the entry bytes, which include its rows');
|
|
317
|
+
await store.putQuery(entry('replaced', 31));
|
|
318
|
+
read = await rowsOf('rows');
|
|
319
|
+
verify(value(read) === 'replaced' && read.rows.length === 1, 'putQuery must keep the rows');
|
|
320
|
+
let refused = false;
|
|
321
|
+
try {
|
|
322
|
+
// A BigInt has no JSON form, so this merge fails while it is being written.
|
|
323
|
+
await merge('rows', {
|
|
324
|
+
entry: entry('broken', 50),
|
|
325
|
+
upserts: [row('c', 'v1'), row('d', 'v1', 1n)],
|
|
326
|
+
deletes: ['a'],
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
refused = true;
|
|
331
|
+
}
|
|
332
|
+
read = await rowsOf('rows');
|
|
333
|
+
verify(refused && value(read) === 'replaced' && read.rows.length === 1 && read.rows[0].id === 'a', 'a failed row merge must change nothing');
|
|
334
|
+
await store.deleteQuery('rows');
|
|
335
|
+
read = await rowsOf('rows');
|
|
336
|
+
verify(read.entry === undefined && read.rows.length === 0, 'deleteQuery must remove its rows');
|
|
337
|
+
await merge('rows', { entry: entry('again', 20), upserts: [row('a', 'v3')], deletes: [] });
|
|
338
|
+
await store.deleteAll();
|
|
339
|
+
await merge('rows', { entry: entry('late', 20), upserts: [row('b', 'v1')], deletes: [] });
|
|
340
|
+
read = await rowsOf('rows');
|
|
341
|
+
verify(read.entry === undefined &&
|
|
342
|
+
read.rows.length === 0 &&
|
|
343
|
+
(await store.byteTotals()).queries === 0, 'a deleted store must drop its rows and late row merges');
|
|
344
|
+
passed.push('row-backed entries: atomic merges, replacement, cascades and deletion fencing');
|
|
345
|
+
}
|
|
346
|
+
finally {
|
|
347
|
+
await store.close();
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
{
|
|
351
|
+
const store = await factory(scope());
|
|
352
|
+
try {
|
|
353
|
+
const entry = { id: 'rows', data: { value: 'index' }, observedAt: 1, bytes: 20 };
|
|
354
|
+
const row = (version) => ({ id: 'a', version, projection: { id: 'a' }, bytes: 10 });
|
|
355
|
+
await store.mergeRows('rows', { entry, upserts: [row('v1')], deletes: [] });
|
|
356
|
+
await store.mergeRows('rows', { entry, upserts: [row('v2')], deletes: ['a'] });
|
|
357
|
+
const read = await store.getRows('rows');
|
|
358
|
+
verify(read.rows.length === 1 && read.rows[0].version === 'v2', 'deletes must apply before upserts, so a row deleted and upserted in one merge stays stored');
|
|
359
|
+
passed.push('row merges apply deletes before upserts');
|
|
360
|
+
}
|
|
361
|
+
finally {
|
|
362
|
+
await store.close();
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
{
|
|
366
|
+
const identity = scope();
|
|
367
|
+
const store = await factory(identity);
|
|
368
|
+
const transport = new ResourceCacheConformanceTransport(identity);
|
|
369
|
+
transport.setConnection({ connected: true, id: 1 });
|
|
370
|
+
const cache = createGatewayResourceCache({
|
|
371
|
+
transport,
|
|
372
|
+
store,
|
|
373
|
+
openStore: (next) => Promise.resolve(factory(next.scope)),
|
|
374
|
+
});
|
|
375
|
+
try {
|
|
376
|
+
const data = new TextEncoder().encode('verified file\n');
|
|
377
|
+
const key = { kind: 'blob', id: gitBlobHash(data) };
|
|
378
|
+
const content = { key, data, origin: 'prefetch', cohort: 'gate' };
|
|
379
|
+
verify(!(await cache.storeContent({
|
|
380
|
+
...content,
|
|
381
|
+
key: { ...key, id: gitBlobHash(new Uint8Array()) },
|
|
382
|
+
})) && (await store.listContent()).length === 0, 'mismatched bytes must be refused before storing');
|
|
383
|
+
verify(await cache.storeContent({ ...content, alias: 'frozen-diff:run:base:head' }), 'verified bytes must be stored');
|
|
384
|
+
verify((await cache.hasContent(key)) &&
|
|
385
|
+
sameBytes(await cache.readContent(key), data) &&
|
|
386
|
+
sameBytes(await cache.readContentByAlias('frozen-diff:run:base:head'), data) &&
|
|
387
|
+
(await store.getContent(key))?.origin === 'prefetch', 'presence and reads, by key or alias, must not mark content opened');
|
|
388
|
+
verify(sameBytes(await cache.openContentByAlias('frozen-diff:run:base:head'), data) &&
|
|
389
|
+
(await store.getContent(key))?.origin === 'opened', 'opening by alias must mark content opened');
|
|
390
|
+
verify((await cache.retainContent(key, { origin: 'prefetch', cohort: 'gate' })) &&
|
|
391
|
+
(await store.getContent(key))?.cohort === 'gate' &&
|
|
392
|
+
(await store.getContent(key))?.origin === 'opened' &&
|
|
393
|
+
!(await cache.retainContent({ kind: 'blob', id: gitBlobHash(new Uint8Array()) }, {})), 'retaining must promote held content and report content that is not held');
|
|
394
|
+
const lateData = new TextEncoder().encode('late file\n');
|
|
395
|
+
const late = cache.storeContent({
|
|
396
|
+
...content,
|
|
397
|
+
key: { kind: 'blob', id: gitBlobHash(lateData) },
|
|
398
|
+
data: lateData,
|
|
399
|
+
});
|
|
400
|
+
transport.setConnection({ connected: false, scope: { ...identity, principalId: 'principal-b' } }, 'principal-change');
|
|
401
|
+
verify(!(await late) &&
|
|
402
|
+
!(await cache.hasContent(key)) &&
|
|
403
|
+
(await cache.readContent(key)) === undefined &&
|
|
404
|
+
(await cache.readContentByAlias('frozen-diff:run:base:head')) === undefined &&
|
|
405
|
+
store.deleted, 'a principal change must fence content reads and late writes');
|
|
406
|
+
passed.push('verified content storage, aliases, opened marking and owner fencing');
|
|
407
|
+
}
|
|
408
|
+
finally {
|
|
409
|
+
await cache.dispose();
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
{
|
|
413
|
+
const { store, transport, cache } = await fixture();
|
|
414
|
+
try {
|
|
415
|
+
const state = await storedState(cache, query);
|
|
416
|
+
verify(state.observedAt === 123 && transport.requestCount === 0, 'offline stored data must retain its age and be stale');
|
|
417
|
+
transport.setConnection({ connected: true, id: 1 });
|
|
418
|
+
const done = cache.retry(query);
|
|
419
|
+
const read = await transport.nextRead();
|
|
420
|
+
read.resolve({ value: 'current' });
|
|
421
|
+
verify((await done).status === 'ready' &&
|
|
422
|
+
(await store.getQuery(query.id))?.data.value === 'current', 'only a current-connection read can become ready');
|
|
423
|
+
transport.setConnection({ connected: false }, 'network');
|
|
424
|
+
verify(cache.read(query).status === 'stale' &&
|
|
425
|
+
cache.read(query).data?.value === 'current' &&
|
|
426
|
+
!store.deleted, 'network loss must preserve stored data');
|
|
427
|
+
transport.setConnection({ connected: true, id: 2 });
|
|
428
|
+
const reconnect = cache.retry(query);
|
|
429
|
+
(await transport.nextRead()).resolve({ value: 'reconnected' });
|
|
430
|
+
verify((await reconnect).status === 'ready' && transport.requestCount === 2, 'same-epoch reconnect must refetch');
|
|
431
|
+
passed.push('stale hydration, observation age and same-epoch reconnect');
|
|
432
|
+
}
|
|
433
|
+
finally {
|
|
434
|
+
await cache.dispose();
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
{
|
|
438
|
+
const { transport, cache } = await fixture();
|
|
439
|
+
try {
|
|
440
|
+
await storedState(cache, query);
|
|
441
|
+
transport.setConnection({ connected: true, id: 1 });
|
|
442
|
+
const secondObserver = cache.observe(query, () => { });
|
|
443
|
+
const done = cache.retry(query);
|
|
444
|
+
const first = await transport.nextRead();
|
|
445
|
+
verify(transport.requestCount === 1, 'observers must share an in-flight read');
|
|
446
|
+
transport.advance(1);
|
|
447
|
+
transport.advance(2);
|
|
448
|
+
first.resolve({ value: 'old' }, 0);
|
|
449
|
+
verify((await done).status === 'stale', 'an invalidated response cannot become ready');
|
|
450
|
+
const followup = await transport.nextRead();
|
|
451
|
+
const refreshed = cache.retry(query);
|
|
452
|
+
followup.resolve({ value: 'new' }, 2);
|
|
453
|
+
verify((await refreshed).data?.value === 'new' && cache.read(query).status === 'ready', 'coalesced writes must be covered before ready');
|
|
454
|
+
transport.advance(2);
|
|
455
|
+
transport.advance(1);
|
|
456
|
+
verify(cache.read(query).status === 'ready', 'duplicate and out-of-order invalidations are harmless');
|
|
457
|
+
secondObserver();
|
|
458
|
+
passed.push('request sharing and read/write races');
|
|
459
|
+
}
|
|
460
|
+
finally {
|
|
461
|
+
await cache.dispose();
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
for (const dimension of ['roles', 'workspaceAccess', 'principalGeneration']) {
|
|
465
|
+
const { store, transport, cache } = await fixture();
|
|
466
|
+
try {
|
|
467
|
+
await storedState(cache, query);
|
|
468
|
+
const authority = {
|
|
469
|
+
roles: dimension === 'roles' ? [] : roles,
|
|
470
|
+
workspaceAccess: dimension === 'workspaceAccess' ? 'native' : 'farm',
|
|
471
|
+
};
|
|
472
|
+
transport.setConnection({
|
|
473
|
+
connected: true,
|
|
474
|
+
id: 1,
|
|
475
|
+
authority,
|
|
476
|
+
scope: {
|
|
477
|
+
...transport.connection.scope,
|
|
478
|
+
...(dimension === 'principalGeneration' ? { principalGeneration: 1 } : {}),
|
|
479
|
+
},
|
|
480
|
+
});
|
|
481
|
+
const done = cache.retry(query);
|
|
482
|
+
const read = await transport.nextRead();
|
|
483
|
+
verify(store.deleted && cache.read(query).data === undefined, `${dimension} change must delete before applying a reply`);
|
|
484
|
+
read.resolve({ value: 'new authority' });
|
|
485
|
+
await done;
|
|
486
|
+
passed.push(`${dimension} scope deletion`);
|
|
487
|
+
}
|
|
488
|
+
finally {
|
|
489
|
+
await cache.dispose();
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
{
|
|
493
|
+
const initialRoles = [...roles, { role: 'operator', scope: { kind: 'global' } }];
|
|
494
|
+
const { store, transport, cache } = await fixture(initialRoles);
|
|
495
|
+
try {
|
|
496
|
+
await storedState(cache, query);
|
|
497
|
+
transport.setConnection({
|
|
498
|
+
connected: true,
|
|
499
|
+
id: 1,
|
|
500
|
+
authority: { roles: [...initialRoles, ...initialRoles].reverse(), workspaceAccess: 'farm' },
|
|
501
|
+
});
|
|
502
|
+
const done = cache.retry(query);
|
|
503
|
+
(await transport.nextRead()).resolve({ value: 'same set' });
|
|
504
|
+
await done;
|
|
505
|
+
verify(!store.deleted, 'roles are compared as a set');
|
|
506
|
+
passed.push('role-set comparison');
|
|
507
|
+
}
|
|
508
|
+
finally {
|
|
509
|
+
await cache.dispose();
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
for (const reason of [
|
|
513
|
+
'sign-out',
|
|
514
|
+
'principal-change',
|
|
515
|
+
'session-ended',
|
|
516
|
+
'credential-refused',
|
|
517
|
+
]) {
|
|
518
|
+
const { store, transport, cache } = await fixture();
|
|
519
|
+
try {
|
|
520
|
+
await storedState(cache, query);
|
|
521
|
+
transport.setConnection({ connected: false }, reason);
|
|
522
|
+
await cache.retry(query);
|
|
523
|
+
verify(store.deleted && cache.read(query).data === undefined, `${reason} must delete the store`);
|
|
524
|
+
passed.push(`${reason} deletion`);
|
|
525
|
+
}
|
|
526
|
+
finally {
|
|
527
|
+
await cache.dispose();
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
for (const reason of ['network', 'access-token-expired', 'token-refresh']) {
|
|
531
|
+
const { store, transport, cache } = await fixture();
|
|
532
|
+
try {
|
|
533
|
+
await storedState(cache, query);
|
|
534
|
+
transport.setConnection({ connected: false }, reason);
|
|
535
|
+
await cache.retry(query);
|
|
536
|
+
verify(!store.deleted && cache.read(query).data?.value === 'stored', `${reason} must preserve observations`);
|
|
537
|
+
passed.push(`${reason} preservation`);
|
|
538
|
+
}
|
|
539
|
+
finally {
|
|
540
|
+
await cache.dispose();
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
for (const code of ['AUTH_FORBIDDEN', 'NOT_FOUND', 'TIMEOUT']) {
|
|
544
|
+
const { store, transport, cache } = await fixture();
|
|
545
|
+
try {
|
|
546
|
+
await storedState(cache, query);
|
|
547
|
+
transport.setConnection({ connected: true, id: 1 });
|
|
548
|
+
const done = cache.retry(query);
|
|
549
|
+
(await transport.nextRead()).reject(code);
|
|
550
|
+
const state = await done;
|
|
551
|
+
verify(state.error?.code === code, 'read failures must remain visible');
|
|
552
|
+
const saved = await store.getQuery(query.id);
|
|
553
|
+
verify(code === 'TIMEOUT'
|
|
554
|
+
? saved !== undefined && state.status === 'stale'
|
|
555
|
+
: saved === undefined && state.data === undefined, `${code} must ${code === 'TIMEOUT' ? 'preserve stale data' : 'evict the observation'}`);
|
|
556
|
+
verify(transport.requestCount === 1, 'a failed read must not enter an automatic retry loop');
|
|
557
|
+
passed.push(`${code} read failure`);
|
|
558
|
+
}
|
|
559
|
+
finally {
|
|
560
|
+
await cache.dispose();
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
{
|
|
564
|
+
const { transport, cache } = await fixture();
|
|
565
|
+
await storedState(cache, query);
|
|
566
|
+
transport.setConnection({ connected: true, id: 1 });
|
|
567
|
+
const done = cache.retry(query);
|
|
568
|
+
const read = await transport.nextRead();
|
|
569
|
+
await cache.dispose();
|
|
570
|
+
verify(read.signal.aborted, 'dispose must cancel owned requests');
|
|
571
|
+
read.resolve({ value: 'late response' });
|
|
572
|
+
await done;
|
|
573
|
+
passed.push('late-response fencing after disposal');
|
|
574
|
+
}
|
|
575
|
+
verify(canonicalResourceJson(passed).length > 0, 'conformance must execute checks');
|
|
576
|
+
return passed;
|
|
577
|
+
}
|
|
578
|
+
//# sourceMappingURL=conformance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformance.js","sourceRoot":"","sources":["../../src/client-cache/conformance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ReviewDiffSnapshot } from '../contracts/runs.js';
|
|
2
|
+
import { type ContentKey, type ResourceContentPlacement, type StoredResourceContentInfo, type StoredResourceQueryInfo } from './store.js';
|
|
3
|
+
/** Content rule 4 (initial): larger files, binary files and larger diffs load only when opened. */
|
|
4
|
+
export declare const RESOURCE_CONTENT_LIMITS: {
|
|
5
|
+
readonly fileBytes: number;
|
|
6
|
+
readonly diffBytes: number;
|
|
7
|
+
readonly imageBytes: number;
|
|
8
|
+
};
|
|
9
|
+
/** The git object id of a file: SHA-1 over the loose-object header and the raw bytes. */
|
|
10
|
+
export declare function gitBlobHash(data: Uint8Array): string;
|
|
11
|
+
/** Content rules 1 and 2: bytes are stored only under the identity they hash to. A diff also
|
|
12
|
+
* verifies against a legacy package's raw SHA-256 `diffHash`. */
|
|
13
|
+
export declare function verifyResourceContent(key: ContentKey, data: Uint8Array, untrackedFiles?: ReviewDiffSnapshot['untrackedFiles']): boolean;
|
|
14
|
+
export declare function resourceContentWithinLimits(key: ContentKey, data: Uint8Array): boolean;
|
|
15
|
+
export interface ResourceBudgetEvictions {
|
|
16
|
+
queries: string[];
|
|
17
|
+
content: ContentKey[];
|
|
18
|
+
}
|
|
19
|
+
/** Content rule 6: prefetch evicts only prefetch rows, and run prefetch never evicts gate rows. */
|
|
20
|
+
export declare function resourceEvictable(incoming: ResourceContentPlacement, row: ResourceContentPlacement): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Content rules 5 and 6: content and workspace snapshots share one least recently used budget.
|
|
23
|
+
* Prefetch uses at most half of it, never evicts what the user opened, and run prefetch never
|
|
24
|
+
* evicts gate rows. Undefined refuses the incoming entry without evicting anything.
|
|
25
|
+
*/
|
|
26
|
+
export declare function resourceBudgetEvictions(incoming: ResourceContentPlacement & {
|
|
27
|
+
bytes: number;
|
|
28
|
+
}, content: readonly StoredResourceContentInfo[], workspace: readonly StoredResourceQueryInfo[], budget: number): ResourceBudgetEvictions | undefined;
|
|
29
|
+
//# sourceMappingURL=content.d.ts.map
|