@volter/twin-catalog 0.2.6 → 0.2.8
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/catalog.json +27 -2
- package/docs/process.md +13 -7
- package/evidence/2c123aa480c3d787e21218b005870509fe48379ba534df5a2eed8d2db5956596.json +4011 -0
- package/lib/browse.d.mts +3 -0
- package/lib/registry.mjs +20 -0
- package/package.json +3 -3
- package/policy.json +3 -3
- package/runner/prepare.mjs +2 -5
- package/vendors/anthropic.json +20 -0
package/lib/browse.d.mts
CHANGED
|
@@ -19,6 +19,9 @@ export type Measurements = {
|
|
|
19
19
|
browser: {
|
|
20
20
|
measured: true;
|
|
21
21
|
target: string;
|
|
22
|
+
responseObservation?: string;
|
|
23
|
+
applicationOriginCorsCoverage?: unknown | null;
|
|
24
|
+
cookieJarCoverage?: unknown | null;
|
|
22
25
|
version: string;
|
|
23
26
|
answered?: number;
|
|
24
27
|
failures?: unknown[];
|
package/lib/registry.mjs
CHANGED
|
@@ -57,6 +57,26 @@ export function registryURL(value, registry) {
|
|
|
57
57
|
requireThat(url.origin === new URL(registry).origin && !url.username && !url.password && !url.hash, 'artifact and attestation URLs must remain on the policy registry');
|
|
58
58
|
return url.href;
|
|
59
59
|
}
|
|
60
|
+
/** Artifact bytes can propagate after exact-version metadata. Retry 404 only, never a conflicting artifact. */
|
|
61
|
+
export async function artifactBytes(doc, submission, registry, fetcher = fetch, confirmation = {}) {
|
|
62
|
+
const { now = Date.now, sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)), windowMs = 600_000, intervalMs = 15_000 } = confirmation;
|
|
63
|
+
// Same read-only propagation bound as docs/measurements/registry-confirmation.json.
|
|
64
|
+
requireThat(Number.isFinite(windowMs) && windowMs > 0 && Number.isFinite(intervalMs) && intervalMs > 0, 'invalid registry confirmation timing');
|
|
65
|
+
requireThat(doc.dist?.integrity === submission.integrity, 'artifact metadata integrity mismatch');
|
|
66
|
+
const url = registryURL(doc.dist.tarball, registry), deadline = now() + windowMs;
|
|
67
|
+
for (;;) {
|
|
68
|
+
const response = await fetcher(url, { redirect: 'error' });
|
|
69
|
+
if (response.ok) {
|
|
70
|
+
const bytes = Buffer.from(await response.arrayBuffer());
|
|
71
|
+
verifyArtifact(bytes, submission, doc);
|
|
72
|
+
return bytes;
|
|
73
|
+
}
|
|
74
|
+
requireThat(response.status === 404, `tarball: HTTP ${response.status}`);
|
|
75
|
+
const remaining = deadline - now();
|
|
76
|
+
requireThat(remaining > 0, 'published tarball is not yet visible; retry confirmation, never upload this version again');
|
|
77
|
+
await sleep(Math.min(intervalMs, remaining));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
60
80
|
export const integrityOf = (bytes) => `sha512-${createHash('sha512').update(bytes).digest('base64')}`;
|
|
61
81
|
export function verifyArtifact(bytes, submission, doc) {
|
|
62
82
|
requireThat(doc.dist?.integrity === submission.integrity && integrityOf(bytes) === submission.integrity, 'artifact integrity mismatch');
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@volter/twin-catalog",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.8",
|
|
4
4
|
"description": "The moderated twin distribution: approved versions and submission tooling for independent publishers.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"evidence"
|
|
39
39
|
],
|
|
40
40
|
"catalog": {
|
|
41
|
-
"sourceCommit": "
|
|
42
|
-
"digest": "
|
|
41
|
+
"sourceCommit": "c25260a59113213049ec5d482da2c9da77dbccf4",
|
|
42
|
+
"digest": "59c803c33c856ddc8f6d0d5a90894f8aa5719076a485dd2ae95f638f2e2d7fcd"
|
|
43
43
|
}
|
|
44
44
|
}
|
package/policy.json
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"registry": "https://registry.npmjs.org",
|
|
4
4
|
"tools": {
|
|
5
|
-
"@volter/world-core": "3.0.
|
|
6
|
-
"@volter/world-runtime": "3.0.
|
|
7
|
-
"@volter/twin-standard": "1.0.
|
|
5
|
+
"@volter/world-core": "3.0.72",
|
|
6
|
+
"@volter/world-runtime": "3.0.72",
|
|
7
|
+
"@volter/twin-standard": "1.0.64",
|
|
8
8
|
"playwright": "1.63.0"
|
|
9
9
|
},
|
|
10
10
|
"bun": "1.3.11",
|
package/runner/prepare.mjs
CHANGED
|
@@ -7,16 +7,13 @@ import { x } from 'tar';
|
|
|
7
7
|
import semver from 'semver';
|
|
8
8
|
import { verify as verifyBundle } from 'sigstore';
|
|
9
9
|
import { read, write, requireThat, digest } from '../lib/model.mjs';
|
|
10
|
-
import { metadata, installationMetadata, registryURL,
|
|
10
|
+
import { metadata, installationMetadata, registryURL, artifactBytes, verifiedProvenance } from '../lib/registry.mjs';
|
|
11
11
|
|
|
12
12
|
const input = read('/input/input.json');
|
|
13
13
|
const { submission: s, source, policy } = input;
|
|
14
14
|
const doc = await metadata(s.package, s.version, policy.registry, fetch, {});
|
|
15
15
|
requireThat(doc.dist?.attestations?.url, 'npm provenance required; this version has no attestation');
|
|
16
|
-
const
|
|
17
|
-
requireThat(tarResponse.ok, `tarball: HTTP ${tarResponse.status}`);
|
|
18
|
-
const bytes = Buffer.from(await tarResponse.arrayBuffer());
|
|
19
|
-
verifyArtifact(bytes, s, doc);
|
|
16
|
+
const bytes = await artifactBytes(doc, s, policy.registry);
|
|
20
17
|
writeFileSync('/work/artifact.tgz', bytes);
|
|
21
18
|
mkdirSync('/work/unpacked', { recursive: true });
|
|
22
19
|
await x({ file: '/work/artifact.tgz', cwd: '/work/unpacked', strict: true, filter: (path, entry) => {
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"vendor": "anthropic",
|
|
3
|
+
"packages": [
|
|
4
|
+
{
|
|
5
|
+
"name": "@volter/twin-anthropic",
|
|
6
|
+
"source": "twin-packs-open",
|
|
7
|
+
"versions": [
|
|
8
|
+
{
|
|
9
|
+
"version": "1.0.3",
|
|
10
|
+
"status": "live",
|
|
11
|
+
"integrity": "sha512-B7n7lnObG0nsmpkb4urtxZVixhmw4Gg1B8Xh13Oj2qj2WUulymAjpJ0sghCTdFUi+RXX/tSY43rDX1AWTJexJQ==",
|
|
12
|
+
"submission": "2c123aa480c3d787e21218b005870509fe48379ba534df5a2eed8d2db5956596",
|
|
13
|
+
"commit": "d22a0fed4cf0891f706d99842b7d5b76f9db34f7",
|
|
14
|
+
"at": "2026-10-06T16:43:29Z",
|
|
15
|
+
"by": "moderated-merge"
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|