@wenathlan/saddle 1.8.15 → 1.8.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/apps/registry.d.ts +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +2 -2
- package/dist/release/evidence.d.ts +92 -0
- package/dist/release/evidence.d.ts.map +1 -0
- package/dist/release/evidence.js +148 -0
- package/dist/release/evidence.js.map +1 -0
- package/dist/scrape/robots.js +1 -1
- package/docs/artifactavailability.md +20 -0
- package/docs/containerplatforms-1.8.17.md +29 -0
- package/docs/enginearchitecture.md +2 -0
- package/docs/libraryapi.md +5 -1
- package/docs/releasenotes-1.8.15.md +4 -0
- package/docs/releasenotes-1.8.16.md +44 -0
- package/docs/releasenotes-1.8.17.md +37 -0
- package/docs/repo-research-1.8.16.md +439 -0
- package/docs/repo-synthesis-1.8.16.md +56 -0
- package/docs/todo-1.8.16.md +42 -13
- package/docs/todo.md +2 -2
- package/docs/workflowoperations.md +32 -0
- package/extension/manifest.json +1 -1
- package/package.json +2 -1
package/dist/apps/registry.d.ts
CHANGED
|
@@ -22,10 +22,10 @@ export declare function appregistry(options?: {}): {
|
|
|
22
22
|
missing?: undefined;
|
|
23
23
|
appid?: undefined;
|
|
24
24
|
} | {
|
|
25
|
+
reason?: undefined;
|
|
25
26
|
allowed: boolean;
|
|
26
27
|
missing: any[];
|
|
27
28
|
appid: any;
|
|
28
|
-
reason?: undefined;
|
|
29
29
|
};
|
|
30
30
|
get: (id: any) => any;
|
|
31
31
|
list: () => any[];
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/server.d.ts
CHANGED
|
@@ -4,14 +4,15 @@ export declare function mcpserver(options?: {}): {
|
|
|
4
4
|
description: string;
|
|
5
5
|
}[];
|
|
6
6
|
handle(request: any): Promise<{
|
|
7
|
+
error?: undefined;
|
|
7
8
|
jsonrpc: string;
|
|
8
9
|
id: any;
|
|
9
10
|
result: {
|
|
10
11
|
tools: any;
|
|
11
12
|
content?: undefined;
|
|
12
13
|
};
|
|
13
|
-
error?: undefined;
|
|
14
14
|
} | {
|
|
15
|
+
error?: undefined;
|
|
15
16
|
jsonrpc: string;
|
|
16
17
|
id: any;
|
|
17
18
|
result: {
|
|
@@ -21,7 +22,6 @@ export declare function mcpserver(options?: {}): {
|
|
|
21
22
|
text: string;
|
|
22
23
|
}[];
|
|
23
24
|
};
|
|
24
|
-
error?: undefined;
|
|
25
25
|
} | {
|
|
26
26
|
result?: undefined;
|
|
27
27
|
jsonrpc: string;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Release evidence evaluates caller-supplied metadata without fetching, signing,
|
|
3
|
+
* scanning, publishing or claiming an artifact has more assurance than proven.
|
|
4
|
+
*/
|
|
5
|
+
/** Normalizes an immutable, caller-supplied artifact evidence record. */
|
|
6
|
+
export declare function releaseevidence(input?: Record<string, unknown>): {
|
|
7
|
+
version: number;
|
|
8
|
+
kind: string;
|
|
9
|
+
status: string;
|
|
10
|
+
subjectdigest: string;
|
|
11
|
+
producer: string;
|
|
12
|
+
workflow: string;
|
|
13
|
+
verificationmethod: string;
|
|
14
|
+
verifiedat: number;
|
|
15
|
+
metadata: {
|
|
16
|
+
[x: string]: unknown;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
/** Evaluates evidence against a caller-owned policy and returns reason codes, never a trust claim. */
|
|
20
|
+
export declare function evaluateevidence(input?: Record<string, unknown>): {
|
|
21
|
+
version: number;
|
|
22
|
+
decision: string;
|
|
23
|
+
reasons: string[];
|
|
24
|
+
subjectdigest: string;
|
|
25
|
+
requiredkinds: string[];
|
|
26
|
+
evidence: {
|
|
27
|
+
version: number;
|
|
28
|
+
kind: string;
|
|
29
|
+
status: string;
|
|
30
|
+
subjectdigest: string;
|
|
31
|
+
producer: string;
|
|
32
|
+
workflow: string;
|
|
33
|
+
verificationmethod: string;
|
|
34
|
+
verifiedat: number;
|
|
35
|
+
metadata: {
|
|
36
|
+
[x: string]: unknown;
|
|
37
|
+
};
|
|
38
|
+
}[];
|
|
39
|
+
};
|
|
40
|
+
/** Builds a data-only readiness receipt for a release that a caller may later execute. */
|
|
41
|
+
export declare function releasereadiness(input?: Record<string, unknown>): {
|
|
42
|
+
version: number;
|
|
43
|
+
sourcetag: string;
|
|
44
|
+
manifestversions: Record<string, string>;
|
|
45
|
+
requiredgates: Record<string, string>;
|
|
46
|
+
artifactplandigest: string;
|
|
47
|
+
targets: string[];
|
|
48
|
+
signingstatus: string;
|
|
49
|
+
evaluation: {
|
|
50
|
+
version: number;
|
|
51
|
+
decision: string;
|
|
52
|
+
reasons: string[];
|
|
53
|
+
subjectdigest: string;
|
|
54
|
+
requiredkinds: string[];
|
|
55
|
+
evidence: {
|
|
56
|
+
version: number;
|
|
57
|
+
kind: string;
|
|
58
|
+
status: string;
|
|
59
|
+
subjectdigest: string;
|
|
60
|
+
producer: string;
|
|
61
|
+
workflow: string;
|
|
62
|
+
verificationmethod: string;
|
|
63
|
+
verifiedat: number;
|
|
64
|
+
metadata: {
|
|
65
|
+
[x: string]: unknown;
|
|
66
|
+
};
|
|
67
|
+
}[];
|
|
68
|
+
};
|
|
69
|
+
decision: string;
|
|
70
|
+
ready: boolean;
|
|
71
|
+
reasons: string[];
|
|
72
|
+
};
|
|
73
|
+
/** Maps an already-completed local checksum verification result to evidence records. */
|
|
74
|
+
export declare function evidencefromverification(input?: Record<string, unknown>): {
|
|
75
|
+
version: number;
|
|
76
|
+
releaseversion: string;
|
|
77
|
+
signingstatus: string;
|
|
78
|
+
evidence: {
|
|
79
|
+
version: number;
|
|
80
|
+
kind: string;
|
|
81
|
+
status: string;
|
|
82
|
+
subjectdigest: string;
|
|
83
|
+
producer: string;
|
|
84
|
+
workflow: string;
|
|
85
|
+
verificationmethod: string;
|
|
86
|
+
verifiedat: number;
|
|
87
|
+
metadata: {
|
|
88
|
+
[x: string]: unknown;
|
|
89
|
+
};
|
|
90
|
+
}[];
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=evidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../../release/evidence.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;;;;;;;;;;;;EAalE;AAED,sGAAsG;AACtG,wBAAgB,gBAAgB,CAAC,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;;;;;;;;;;;;;;;;;;;EAqBnE;AAED,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBnE;AAED,wFAAwF;AACxF,wBAAgB,wBAAwB,CAAC,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;;;;;;;;;;;;;;;;;EAoB3E"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Release evidence evaluates caller-supplied metadata without fetching, signing,
|
|
3
|
+
* scanning, publishing or claiming an artifact has more assurance than proven.
|
|
4
|
+
*/
|
|
5
|
+
const evidencestatuses = new Set(["notProvided", "declared", "parsed", "checked", "verified", "rejected", "unknown"]);
|
|
6
|
+
const verifiedstatuses = new Set(["checked", "verified"]);
|
|
7
|
+
/** Normalizes an immutable, caller-supplied artifact evidence record. */
|
|
8
|
+
export function releaseevidence(input = {}) {
|
|
9
|
+
const status = normalizestatus(input.status ?? "notProvided");
|
|
10
|
+
const kind = requiredtext(input.kind, "evidence kind");
|
|
11
|
+
const subjectdigest = optionaldigest(input.subjectdigest, "subject digest");
|
|
12
|
+
const producer = optionaltext(input.producer);
|
|
13
|
+
const workflow = optionaltext(input.workflow);
|
|
14
|
+
const method = optionaltext(input.verificationmethod);
|
|
15
|
+
const verifiedat = optionaltime(input.verifiedat, "verification time");
|
|
16
|
+
if (verifiedstatuses.has(status) && !subjectdigest)
|
|
17
|
+
throw new TypeError("checked evidence requires a subject digest");
|
|
18
|
+
if (verifiedstatuses.has(status) && !method)
|
|
19
|
+
throw new TypeError("checked evidence requires a verification method");
|
|
20
|
+
if (status === "verified" && !producer)
|
|
21
|
+
throw new TypeError("verified evidence requires a producer");
|
|
22
|
+
if (status === "verified" && !verifiedat)
|
|
23
|
+
throw new TypeError("verified evidence requires a verification time");
|
|
24
|
+
return { version: 1, kind, status, subjectdigest, producer, workflow, verificationmethod: method, verifiedat, metadata: objectcopy(input.metadata) };
|
|
25
|
+
}
|
|
26
|
+
/** Evaluates evidence against a caller-owned policy and returns reason codes, never a trust claim. */
|
|
27
|
+
export function evaluateevidence(input = {}) {
|
|
28
|
+
const evidence = Array.isArray(input.evidence) ? input.evidence.map((entry) => releaseevidence(objectvalue(entry, "evidence entry"))) : [];
|
|
29
|
+
const policy = objectcopy(input.policy);
|
|
30
|
+
const requiredkinds = stringlist(policy.requiredkinds, "required kinds");
|
|
31
|
+
const allowedstatuses = new Set(stringlist(policy.allowedstatuses ?? ["verified"], "allowed statuses"));
|
|
32
|
+
const expectedproducer = textmap(policy.expectedproducer, "expected producer");
|
|
33
|
+
const expectedworkflow = textmap(policy.expectedworkflow, "expected workflow");
|
|
34
|
+
const subjectdigest = optionaldigest(input.subjectdigest, "subject digest");
|
|
35
|
+
const reasons = new Set();
|
|
36
|
+
for (const kind of requiredkinds) {
|
|
37
|
+
const matches = evidence.filter((entry) => entry.kind === kind);
|
|
38
|
+
if (matches.length === 0) {
|
|
39
|
+
reasons.add(`required-evidence-missing:${kind}`);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const accepted = matches.some((entry) => evidenceaccepted(entry, { allowedstatuses, expectedproducer, expectedworkflow, subjectdigest }, reasons));
|
|
43
|
+
if (!accepted)
|
|
44
|
+
reasons.add(`required-evidence-unsatisfied:${kind}`);
|
|
45
|
+
}
|
|
46
|
+
const evaluated = requiredkinds.length === 0 ? evidence : evidence.filter((entry) => requiredkinds.includes(entry.kind));
|
|
47
|
+
for (const entry of evaluated)
|
|
48
|
+
evidenceaccepted(entry, { allowedstatuses, expectedproducer, expectedworkflow, subjectdigest }, reasons);
|
|
49
|
+
const ordered = [...reasons].sort();
|
|
50
|
+
const rejected = ordered.some((reason) => reason.startsWith("evidence-rejected:") || reason.startsWith("producer-mismatch:") || reason.startsWith("workflow-mismatch:") || reason.startsWith("subject-mismatch:"));
|
|
51
|
+
const decision = rejected ? "rejected" : ordered.length > 0 ? "insufficient" : "accepted";
|
|
52
|
+
return { version: 1, decision, reasons: ordered, subjectdigest, requiredkinds, evidence };
|
|
53
|
+
}
|
|
54
|
+
/** Builds a data-only readiness receipt for a release that a caller may later execute. */
|
|
55
|
+
export function releasereadiness(input = {}) {
|
|
56
|
+
const sourcetag = requiredtext(input.sourcetag, "source tag");
|
|
57
|
+
const manifestversions = textmap(input.manifestversions, "manifest versions");
|
|
58
|
+
const requiredgates = textmap(input.requiredgates, "required gates");
|
|
59
|
+
const artifactplandigest = optionaldigest(input.artifactplandigest, "artifact plan digest");
|
|
60
|
+
const targets = stringlist(input.targets, "publication targets");
|
|
61
|
+
const signingstatus = optionaltext(input.signingstatus) ?? "unknown";
|
|
62
|
+
const evaluation = evaluateevidence(objectvalue(input.evaluation, "evidence evaluation"));
|
|
63
|
+
const reasons = new Set(evaluation.reasons);
|
|
64
|
+
if (Object.values(manifestversions).some((value) => value !== sourcetag.replace(/^v/, "")))
|
|
65
|
+
reasons.add("manifest-version-mismatch");
|
|
66
|
+
for (const [gate, status] of Object.entries(requiredgates))
|
|
67
|
+
if (status !== "passed")
|
|
68
|
+
reasons.add(`required-gate-not-passed:${gate}`);
|
|
69
|
+
if (!artifactplandigest)
|
|
70
|
+
reasons.add("artifact-plan-digest-missing");
|
|
71
|
+
if (targets.length === 0)
|
|
72
|
+
reasons.add("publication-targets-missing");
|
|
73
|
+
if (signingstatus === "unknown")
|
|
74
|
+
reasons.add("signing-status-unknown");
|
|
75
|
+
const ordered = [...reasons].sort();
|
|
76
|
+
const decision = evaluation.decision === "rejected" ? "rejected" : ordered.length > 0 ? "insufficient" : "accepted";
|
|
77
|
+
return { version: 1, sourcetag, manifestversions, requiredgates, artifactplandigest, targets, signingstatus, evaluation, decision, ready: decision === "accepted", reasons: ordered };
|
|
78
|
+
}
|
|
79
|
+
/** Maps an already-completed local checksum verification result to evidence records. */
|
|
80
|
+
export function evidencefromverification(input = {}) {
|
|
81
|
+
const verification = objectvalue(input.verification, "verification result");
|
|
82
|
+
if (verification.valid !== true)
|
|
83
|
+
throw new TypeError("verification result must be valid");
|
|
84
|
+
const releaseversion = requiredtext(verification.version, "release version");
|
|
85
|
+
const signingstatus = requiredtext(verification.signing, "signing status");
|
|
86
|
+
const files = requiredarray(verification.files, "verification files");
|
|
87
|
+
if (files.length === 0)
|
|
88
|
+
throw new TypeError("verification files must not be empty");
|
|
89
|
+
const names = new Set();
|
|
90
|
+
const producer = optionaltext(input.producer);
|
|
91
|
+
const workflow = optionaltext(input.workflow);
|
|
92
|
+
const verificationmethod = optionaltext(input.verificationmethod) ?? "checksum-manifest";
|
|
93
|
+
const verifiedat = optionaltime(input.verifiedat, "verification time");
|
|
94
|
+
const evidence = files.map((file) => {
|
|
95
|
+
const entry = objectvalue(file, "verification file");
|
|
96
|
+
const name = requiredtext(entry.name, "artifact name");
|
|
97
|
+
if (names.has(name))
|
|
98
|
+
throw new TypeError(`duplicate verification artifact: ${name}`);
|
|
99
|
+
names.add(name);
|
|
100
|
+
return releaseevidence({ kind: "checksum", status: "checked", subjectdigest: entry.digest, producer, workflow, verificationmethod, verifiedat, metadata: { artifact: name, releaseversion, signingstatus } });
|
|
101
|
+
});
|
|
102
|
+
return { version: 1, releaseversion, signingstatus, evidence };
|
|
103
|
+
}
|
|
104
|
+
function evidenceaccepted(entry, policy, reasons) {
|
|
105
|
+
let accepted = true;
|
|
106
|
+
if (entry.status === "rejected") {
|
|
107
|
+
reasons.add(`evidence-rejected:${entry.kind}`);
|
|
108
|
+
accepted = false;
|
|
109
|
+
}
|
|
110
|
+
if (!policy.allowedstatuses.has(entry.status)) {
|
|
111
|
+
reasons.add(`evidence-status-not-allowed:${entry.kind}:${entry.status}`);
|
|
112
|
+
accepted = false;
|
|
113
|
+
}
|
|
114
|
+
if (policy.subjectdigest && entry.subjectdigest !== policy.subjectdigest) {
|
|
115
|
+
reasons.add(`subject-mismatch:${entry.kind}`);
|
|
116
|
+
accepted = false;
|
|
117
|
+
}
|
|
118
|
+
if (policy.expectedproducer[entry.kind] && entry.producer !== policy.expectedproducer[entry.kind]) {
|
|
119
|
+
reasons.add(`producer-mismatch:${entry.kind}`);
|
|
120
|
+
accepted = false;
|
|
121
|
+
}
|
|
122
|
+
if (policy.expectedworkflow[entry.kind] && entry.workflow !== policy.expectedworkflow[entry.kind]) {
|
|
123
|
+
reasons.add(`workflow-mismatch:${entry.kind}`);
|
|
124
|
+
accepted = false;
|
|
125
|
+
}
|
|
126
|
+
return accepted;
|
|
127
|
+
}
|
|
128
|
+
function normalizestatus(value) { const status = requiredtext(value, "evidence status"); if (!evidencestatuses.has(status))
|
|
129
|
+
throw new TypeError(`unknown evidence status: ${status}`); return status; }
|
|
130
|
+
function requiredtext(value, label) { const text = optionaltext(value); if (!text)
|
|
131
|
+
throw new TypeError(`${label} is required`); return text; }
|
|
132
|
+
function optionaltext(value) { const text = value === undefined || value === null ? undefined : String(value).trim(); return text || undefined; }
|
|
133
|
+
function optionaldigest(value, label) { const digest = optionaltext(value)?.toLowerCase(); if (digest && !/^[a-f0-9]{64}$/.test(digest))
|
|
134
|
+
throw new TypeError(`${label} must be a sha256 hex digest`); return digest; }
|
|
135
|
+
function optionaltime(value, label) { if (value === undefined || value === null)
|
|
136
|
+
return undefined; const time = Number(value); if (!Number.isFinite(time) || time < 0)
|
|
137
|
+
throw new TypeError(`${label} must be a non-negative finite number`); return time; }
|
|
138
|
+
function requiredarray(value, label) { if (!Array.isArray(value))
|
|
139
|
+
throw new TypeError(`${label} must be an array`); return value; }
|
|
140
|
+
function stringlist(value, label) { if (value === undefined || value === null)
|
|
141
|
+
return []; if (!Array.isArray(value))
|
|
142
|
+
throw new TypeError(`${label} must be an array`); return [...new Set(value.map((item) => requiredtext(item, label)))].sort(); }
|
|
143
|
+
function textmap(value, label) { if (value === undefined || value === null)
|
|
144
|
+
return {}; const source = objectvalue(value, label); return Object.fromEntries(Object.entries(source).map(([key, item]) => [requiredtext(key, label), requiredtext(item, label)])); }
|
|
145
|
+
function objectcopy(value) { return value && typeof value === "object" && !Array.isArray(value) ? { ...value } : {}; }
|
|
146
|
+
function objectvalue(value, label) { if (!value || typeof value !== "object" || Array.isArray(value))
|
|
147
|
+
throw new TypeError(`${label} must be an object`); return value; }
|
|
148
|
+
//# sourceMappingURL=evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../release/evidence.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;AACtH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;AAE1D,yEAAyE;AACzE,MAAM,UAAU,eAAe,CAAC,KAAK,GAA4B,EAAE;IACjE,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC;IACvE,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa;QAAE,MAAM,IAAI,SAAS,CAAC,4CAA4C,CAAC,CAAC;IACtH,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,SAAS,CAAC,iDAAiD,CAAC,CAAC;IACpH,IAAI,MAAM,KAAK,UAAU,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,SAAS,CAAC,uCAAuC,CAAC,CAAC;IACrG,IAAI,MAAM,KAAK,UAAU,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;IAChH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;AACvJ,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,gBAAgB,CAAC,KAAK,GAA4B,EAAE;IAClE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,WAAW,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3I,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;IACzE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC,UAAU,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACxG,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;IAC/E,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;IAC/E,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAChE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACzF,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QACnJ,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,GAAG,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACzH,KAAK,MAAM,KAAK,IAAI,SAAS;QAAE,gBAAgB,CAAC,KAAK,EAAE,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,CAAC;IACxI,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACnN,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;IAC1F,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;AAC5F,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,gBAAgB,CAAC,KAAK,GAA4B,EAAE;IAClE,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAC9D,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;IAC9E,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;IACrE,MAAM,kBAAkB,GAAG,cAAc,CAAC,KAAK,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;IAC5F,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;IACjE,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,SAAS,CAAC;IACrE,MAAM,UAAU,GAAG,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAC1F,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACrI,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC;QAAE,IAAI,MAAM,KAAK,QAAQ;YAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC;IACrI,IAAI,CAAC,kBAAkB;QAAE,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IACrE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IACrE,IAAI,aAAa,KAAK,SAAS;QAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;IACpH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,aAAa,EAAE,kBAAkB,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,KAAK,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACxL,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,wBAAwB,CAAC,KAAK,GAA4B,EAAE;IAC1E,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;IAC5E,IAAI,YAAY,CAAC,KAAK,KAAK,IAAI;QAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IAC1F,MAAM,cAAc,GAAG,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IAC7E,MAAM,aAAa,GAAG,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,aAAa,CAAC,YAAY,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC;IACtE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;IACpF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,kBAAkB,GAAG,YAAY,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,mBAAmB,CAAC;IACzF,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAClC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QACvD,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,oCAAoC,IAAI,EAAE,CAAC,CAAC;QACrF,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChB,OAAO,eAAe,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;IAChN,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAyC,EAAE,MAAoJ,EAAE,OAAoB;IAC7O,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAAC,QAAQ,GAAG,KAAK,CAAC;IAAC,CAAC;IACtG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,+BAA+B,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAAC,QAAQ,GAAG,KAAK,CAAC;IAAC,CAAC;IAC9I,IAAI,MAAM,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,KAAK,MAAM,CAAC,aAAa,EAAE,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAAC,QAAQ,GAAG,KAAK,CAAC;IAAC,CAAC;IAC9I,IAAI,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAAC,QAAQ,GAAG,KAAK,CAAC;IAAC,CAAC;IACxK,IAAI,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAAC,QAAQ,GAAG,KAAK,CAAC;IAAC,CAAC;IACxK,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,eAAe,CAAC,KAAc,IAAI,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC;IAAE,MAAM,IAAI,SAAS,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC;AAChN,SAAS,YAAY,CAAC,KAAc,EAAE,KAAa,IAAI,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;IAAE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,cAAc,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;AAC/J,SAAS,YAAY,CAAC,KAAc,IAAI,MAAM,IAAI,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC;AAC1J,SAAS,cAAc,CAAC,KAAc,EAAE,KAAa,IAAI,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC;IAAE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,8BAA8B,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC;AACvO,SAAS,YAAY,CAAC,KAAc,EAAE,KAAa,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;IAAE,OAAO,SAAS,CAAC,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;IAAE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,uCAAuC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;AAC5Q,SAAS,aAAa,CAAC,KAAc,EAAE,KAAa,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IAAE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,mBAAmB,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC;AACpJ,SAAS,UAAU,CAAC,KAAc,EAAE,KAAa,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;IAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IAAE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,mBAAmB,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACrQ,SAAS,OAAO,CAAC,KAAc,EAAE,KAAa,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;IAAE,OAAO,EAA4B,CAAC,CAAC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5S,SAAS,UAAU,CAAC,KAAc,IAAI,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAI,KAAiC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5J,SAAS,WAAW,CAAC,KAAc,EAAE,KAAa,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IAAE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,oBAAoB,CAAC,CAAC,CAAC,OAAO,KAAgC,CAAC,CAAC,CAAC"}
|
package/dist/scrape/robots.js
CHANGED
|
@@ -43,7 +43,7 @@ export function robotsrules(text = "") { const directives = []; const groups = [
|
|
|
43
43
|
/** Fetches and caches a site's robots policy without failing the caller's scrape. */
|
|
44
44
|
export async function fetchRobotsTxt(siteUrl, options = {}) { const base = siteUrl.replace(/\/$/, ""); const robotsUrl = `${base}/robots.txt`; const cached = cache.get(robotsUrl); if (cached && Date.now() - cached.fetchedAt < cachettl)
|
|
45
45
|
return cached.robots; try {
|
|
46
|
-
const response = await fetch(robotsUrl, { headers: { "User-Agent": options.userAgent ?? "Saddle/1.8.
|
|
46
|
+
const response = await fetch(robotsUrl, { headers: { "User-Agent": options.userAgent ?? "Saddle/1.8.17" }, signal: AbortSignal.timeout(options.timeout ?? 5000) });
|
|
47
47
|
const robots = response.ok ? robotsrules(await response.text()) : robotsrules();
|
|
48
48
|
cache.set(robotsUrl, { robots, fetchedAt: Date.now() });
|
|
49
49
|
return robots;
|
|
@@ -132,3 +132,23 @@ Version 1.8.14 keeps the release-tag-derived matrix and adds post-push container
|
|
|
132
132
|
Each surface also emits `sha256.*.1.8.14`, `manifest.*.1.8.14.json` and, where enabled by the release path, SBOM and provenance metadata. The Android manifest records `ci-test-key`, desktop manifests record `unsigned` and the container manifest records `caller-owned`. The container image additionally records `org.opencontainers.image.version=1.8.14`; the post-push workflow pulls that exact version and runs the CLI help smoke test.
|
|
133
133
|
|
|
134
134
|
The verified 1.8.14 release contains six Linux assets, six Windows assets, four macOS assets, two Android assets, one container archive, one browser extension, nine manifests and nine checksum files. The release-event mobile job did not bypass missing production credentials; the successful manual rerun used the explicit `ci-test-key` path.
|
|
135
|
+
|
|
136
|
+
## 1.8.15 verified release matrix
|
|
137
|
+
|
|
138
|
+
The published [v1.8.15 release](https://github.com/wenathlan/saddle/releases/tag/v1.8.15) contains 38 attached assets: six Linux desktop artifacts, six Windows desktop artifacts, four macOS desktop artifacts, two Android artifacts, one container archive, one browser extension, nine manifests, and nine checksum files. The primary artifacts use the dotted lowercase names `saddle.browser.1.8.15.<architecture>.<format>`, `saddle.apk.1.8.15.apk`, `saddle.aab.1.8.15.aab`, `saddle.container.1.8.15.tar.gz`, and `saddle.extension.1.8.15.zip`.
|
|
139
|
+
|
|
140
|
+
The available metadata files are `manifest.android.1.8.15.json`, `manifest.container.1.8.15.json`, the seven desktop `manifest.*.1.8.15.json` files, and the matching nine `sha256.*.1.8.15` files. The release record identifies Android as `ci-test-key`, desktop surfaces as `unsigned`, and the container as `caller-owned`; those declared states do not imply production signing, notarization, or registry trust.
|
|
141
|
+
|
|
142
|
+
## 1.8.16 verified release matrix
|
|
143
|
+
|
|
144
|
+
The published [v1.8.16 release](https://github.com/wenathlan/saddle/releases/tag/v1.8.16) contains 38 attached assets: six Linux desktop artifacts, six Windows desktop artifacts, four macOS desktop artifacts, two Android artifacts, one container archive, one browser extension, nine manifests, and nine checksum files. The asset names match the matrix in [releasenotes-1.8.16.md](releasenotes-1.8.16.md).
|
|
145
|
+
|
|
146
|
+
The release-event Android workflow stopped because production signing secrets were not configured. The separately successful manual Android run `31839378707` used the workflow's explicit `ci-test-key` option and attached the APK, AAB, checksum, and manifest. No iOS artifact is claimed because Apple signing, provisioning, and export credentials were not configured. Desktop artifacts remain `unsigned`, the container manifest remains `caller-owned`, and no result is represented as production signing, notarization, registry trust, SBOM validation, or vulnerability status without its own evidence.
|
|
147
|
+
|
|
148
|
+
The release-evidence API can normalize and evaluate results supplied by completed verification adapters, but it cannot generate artifacts, change their signing state, publish them, or validate their registry availability.
|
|
149
|
+
|
|
150
|
+
## 1.8.17 container platform candidate
|
|
151
|
+
|
|
152
|
+
The 1.8.17 candidate keeps the established release asset contract while expanding the GHCR image index to `linux/amd64`, `linux/arm64`, and `linux/ppc64le`. The workflow must inspect the pushed index before this document treats those platform variants as available. The attached `saddle.container.1.8.17.tar.gz` remains one archive artifact and is not evidence of a Windows container variant.
|
|
153
|
+
|
|
154
|
+
`windows/amd64`, `linux/arm/v7`, and `linux/386` are not claimed by this candidate. A Windows image requires its own versioned Windows base, Dockerfile, runner, and compatibility validation; the existing Debian Linux Dockerfile cannot produce it by adding a platform string. `unknown` descriptors are not runnable targets. The platform decision and evidence limits are detailed in [containerplatforms-1.8.17.md](containerplatforms-1.8.17.md).
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Container platform decision for 1.8.17
|
|
2
|
+
|
|
3
|
+
## Scope
|
|
4
|
+
|
|
5
|
+
Version 1.8.17 expands the Saddle OCI image from an unqualified single-platform publication to a Linux manifest index containing `linux/amd64`, `linux/arm64`, and `linux/ppc64le`. The selection is based on the current `node:26.7.0-bookworm-slim` base manifest, which exposes those Linux architectures. Buildx can publish a manifest index and select the compatible variant when a consumer pulls the common tag.[1]
|
|
6
|
+
|
|
7
|
+
## Platform matrix
|
|
8
|
+
|
|
9
|
+
`linux/amd64` is published because it is the primary GitHub runner architecture and the local smoke-test platform. `linux/arm64` is published because the current Node Debian slim base manifest exposes it as a first-class Buildx multi-platform target.[1] [2] `linux/ppc64le` is published because the same base manifest exposes it and QEMU-enabled Buildx can build the selected variant.[1] [2]
|
|
10
|
+
|
|
11
|
+
`linux/arm/v7` and `linux/386` are deferred because the inspected `node:26.7.0-bookworm-slim` manifest does not include them. `windows/amd64` is deferred because the current Dockerfile uses Debian Linux stages. A Windows container needs a Windows-specific base image, compatible Windows runner, and selected Windows base tag; the inspected Node 26.7.0 Windows base-tag candidates were unavailable, and Windows host/image compatibility is materially stricter than Linux compatibility.[3]
|
|
12
|
+
|
|
13
|
+
`unknown/*` is rejected because OCI `unknown` descriptors are not a runnable operating-system or CPU target and must not be advertised as a Saddle container platform.
|
|
14
|
+
|
|
15
|
+
## Workflow design
|
|
16
|
+
|
|
17
|
+
The release workflow must register QEMU before Buildx, scan a loadable `linux/amd64` image, and push all selected Linux variants through one Buildx invocation. The post-push verification must inspect the registry manifest index for the three Linux architectures, then pull and execute the `linux/amd64` variant to retain the existing label verification and CLI smoke test. GitHub-hosted runners cannot load a multi-platform image into the default local image store, so the scan build stays single-platform while the publication is pushed directly to GHCR.[2]
|
|
18
|
+
|
|
19
|
+
Windows containers are intentionally out of scope for 1.8.17. A future Windows implementation must introduce a separate Windows Dockerfile, an explicitly versioned Windows base image, a Windows runner, platform-specific smoke tests, and compatibility documentation. It must not be merged into the Linux image by declaring a platform string alone.
|
|
20
|
+
|
|
21
|
+
## Publication claims
|
|
22
|
+
|
|
23
|
+
The version 1.8.17 release notes and registry documentation may claim only the three verified Linux variants after the pushed image index is inspected. They must not claim Windows support, an `unknown` platform, or a universal OS image.
|
|
24
|
+
|
|
25
|
+
## References
|
|
26
|
+
|
|
27
|
+
[1]: https://docs.docker.com/build/building/multi-platform/ "Docker multi-platform builds"
|
|
28
|
+
[2]: https://docs.docker.com/build/ci/github-actions/multi-platform/ "Multi-platform image with GitHub Actions"
|
|
29
|
+
[3]: https://learn.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility "Windows container version compatibility"
|
|
@@ -63,6 +63,8 @@ The public contract uses plain objects and factory functions. The engine never r
|
|
|
63
63
|
|
|
64
64
|
`cdncapabilities` records only caller-reported delivery properties such as immutable caching, purge support, range delivery, integrity headers, CORS, and visibility. It never performs a CDN probe, purge, upload, or configuration mutation.
|
|
65
65
|
|
|
66
|
+
`releaseevidence` evaluates caller-supplied supply-chain and release metadata as data. It normalizes a subject digest, producer, workflow, evidence kind, verification method, timestamp and explicit status. `evaluateevidence` produces only `accepted`, `rejected`, or `insufficient` with stable reason codes; it never treats an unchecked declaration as a signature, trust decision, compliance result, or vulnerability assessment. `evidencefromverification` converts an already-completed `verifyassets` result into `checked` checksum evidence, retaining its explicit signing state as metadata and never upgrading an `unsigned` or caller-owned state into a signing claim. `releasereadiness` binds a source tag, observed manifest versions, gates, artifact-plan digest, publication targets, signing state, and evidence result into a serializable receipt. These contracts do not edit versions, create a tag, trigger a workflow, publish, sign, scan, download, or contact a registry.
|
|
67
|
+
|
|
66
68
|
`miniappplan`, `dnsplan`, and `applicationbridge` add deployment-neutral application requirements. Mini App plans reject token-bearing input and require an HTTPS origin plus a caller-selected validation method. DNS records list ownership, DNSSEC and HTTPS requirements but cannot buy a domain, change a zone, or obtain a certificate. Surface bridges only report declared capabilities for browser, desktop, mobile, extension, and Mini App targets.
|
|
67
69
|
|
|
68
70
|
## execution lifecycle
|
package/docs/libraryapi.md
CHANGED
|
@@ -39,6 +39,8 @@ The public API is designed around injected transports. Consumers can use the sam
|
|
|
39
39
|
| `commandguard` | enforce caller-defined bot command scopes |
|
|
40
40
|
| `deliveryqueue` | retry webhook deliveries and retain dead letters |
|
|
41
41
|
| `nodeserver` | expose a Web Request/Response handler through Node HTTP |
|
|
42
|
+
| `releaseevidence` / `evaluateevidence` | normalize caller-supplied evidence and evaluate it against explicit policy with bounded decision reasons |
|
|
43
|
+
| `evidencefromverification` / `releasereadiness` | map an already-valid local checksum result and assemble a descriptive readiness receipt without performing a release |
|
|
42
44
|
| `@wenathlan/saddle/browser-playwright` | optional Node-only Playwright session adapter; the peer is caller-installed and the root remains vendor-neutral |
|
|
43
45
|
|
|
44
46
|
```js
|
|
@@ -56,10 +58,12 @@ The `fetcher`, browser adapter, persistence adapter, proxy pool, captcha solver,
|
|
|
56
58
|
|
|
57
59
|
## package surfaces
|
|
58
60
|
|
|
59
|
-
The package exposes explicit subpaths for `./browser`, `./bot`, `./captcha`, `./memory-engine`, and `./
|
|
61
|
+
The package exposes explicit subpaths for `./browser`, `./bot`, `./captcha`, `./memory-engine`, `./deploy`, and `./release-evidence`. Desktop, mobile, target-plan and n8n contracts are exported from the root entry; the root entry remains the complete compiled JavaScript API with generated TypeScript declarations for consumers that prefer one import.
|
|
60
62
|
|
|
61
63
|
The `./extension` subpath exposes browser-neutral message, snapshot and service-worker routing contracts. The concrete Manifest V3 files live in `extension/`; they are not imported by the core at runtime and do not require Chrome when the library is used as a Node package. The browser surface also exposes snapshots, tab/frame context, action results, bounded action batches and recording through `./browser`.
|
|
62
64
|
|
|
63
65
|
The current release exposes `desktopmanifest`, `mobilemanifest`, `desktopadapter`, `mobileadapter`, `n8nnode`, `n8nmatch`, `n8nexecute`, `controlsurface`, `controlservice`, and `workerbridge`. These factories describe surface boundaries and invoke caller-owned handlers; they do not install a native toolkit, start an n8n server, create a dashboard, or store credentials.
|
|
64
66
|
|
|
67
|
+
`releaseevidence` and `evaluateevidence` retain the status that a caller supplies instead of asserting a security property. `evidencefromverification` accepts only an already-valid `verifyassets` result and maps its checksum inventory to `checked` evidence; its signing field remains metadata, so `unsigned`, `caller-owned`, or `caller-configured` does not become a signature or reputation claim. `releasereadiness` is descriptive: it cannot alter files, create tags, invoke CI, publish artifacts, sign content, or contact registries.
|
|
68
|
+
|
|
65
69
|
The root entry is cross-runtime safe for the tested core contract. Filesystem, Node HTTP, persistent queue, file sessions, local memory and captcha evidence adapters remain available through explicit Node-only files or subpaths. `runtimecontract` reports the capabilities of the current global scope, while `memorystorage` provides a process-local backend for browser workers, Deno, Bun and deterministic tests.
|
|
@@ -31,6 +31,10 @@ The release workflows derive artifact names and package versions from `v1.8.15`.
|
|
|
31
31
|
|
|
32
32
|
The six registry workflows publish from the same validated release tag, in container-first order: GHCR, GitHub Packages npm, public npmjs, Maven, NuGet GitHub Packages and RubyGems. GHCR must build, scan, push, pull, inspect its OCI version label and complete a smoke check. Production signing remains caller-owned; the release does not claim SignPath approval, Apple notarization or a production Android signing key unless a workflow reports those states.
|
|
33
33
|
|
|
34
|
+
## Verified publication results
|
|
35
|
+
|
|
36
|
+
The v1.8.15 release has **38 attached assets** after the desktop rerun completed. GHCR, GitHub Packages npm, npmjs, Maven, NuGet and RubyGems completed successfully from the release event. The initial release-event Android job correctly failed because no production signing secrets were present; manual run `31835215420` completed with the explicitly labeled `ci-test-key` fallback. The desktop rerun completed after a transient macOS asset-attachment failure, without changing the tag or claiming notarization.
|
|
37
|
+
|
|
34
38
|
## References
|
|
35
39
|
|
|
36
40
|
[1]: https://github.com/wenathlan/saddle "Saddle source repository"
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Saddle 1.8.16
|
|
2
|
+
|
|
3
|
+
Saddle 1.8.16 adds a pure, policy-evaluable release-evidence layer above existing checksum verification. The library normalizes caller-supplied evidence, evaluates it through explicit policy, and creates a serializable release-readiness receipt. It remains descriptive: it does not fetch artifacts, scan files, query CVE feeds, sign content, create tags, invoke CI, publish packages, or contact a registry.
|
|
4
|
+
|
|
5
|
+
## Changes
|
|
6
|
+
|
|
7
|
+
| Area | Change |
|
|
8
|
+
|---|---|
|
|
9
|
+
| Evidence | Added `releaseevidence` with explicit `notProvided`, `declared`, `parsed`, `checked`, `verified`, `rejected`, and `unknown` states. |
|
|
10
|
+
| Policy | Added `evaluateevidence` with caller-selected evidence kinds, allowed states, expected producer/workflow values, ordered reasons, and `accepted`, `rejected`, or `insufficient` outcomes. |
|
|
11
|
+
| Readiness | Added `releasereadiness`, which binds source tag, observed manifest versions, gates, artifact-plan digest, targets, signing state, and an evidence evaluation without executing a release. |
|
|
12
|
+
| Verification bridge | Added `evidencefromverification`, which converts only an already-valid local `verifyassets` checksum result to `checked` evidence and retains signing state as metadata. |
|
|
13
|
+
| API | Added the root export and `@wenathlan/saddle/release-evidence` subpath, documented in the public library API. |
|
|
14
|
+
| Validation | The candidate passed 136 active tests, 69 legacy tests, engine build, web checks/build, format validation, package dry-run, high-severity audit, flat native validation, and whitespace validation. |
|
|
15
|
+
|
|
16
|
+
## Artifact contract
|
|
17
|
+
|
|
18
|
+
The release workflows derived artifact names and package versions from `v1.8.16`. The matrix below matches the attached release assets after the platform workflows completed; signing status remains explicit rather than inferred from a filename.
|
|
19
|
+
|
|
20
|
+
| Group | Expected attached assets |
|
|
21
|
+
|---|---|
|
|
22
|
+
| Linux desktop | `saddle.browser.1.8.16.x64.appimage`, `saddle.browser.1.8.16.x64.deb`, `saddle.browser.1.8.16.x64.rpm`, `saddle.browser.1.8.16.arm64.appimage`, `saddle.browser.1.8.16.arm64.deb`, `saddle.browser.1.8.16.arm64.rpm` |
|
|
23
|
+
| Windows desktop | `saddle.browser.1.8.16.x86.exe`, `saddle.browser.1.8.16.x86.msi`, `saddle.browser.1.8.16.x64.exe`, `saddle.browser.1.8.16.x64.msi`, `saddle.browser.1.8.16.arm64.exe`, `saddle.browser.1.8.16.arm64.msi` |
|
|
24
|
+
| macOS desktop | `saddle.browser.1.8.16.x64.dmg`, `saddle.browser.1.8.16.x64.app.zip`, `saddle.browser.1.8.16.arm64.dmg`, `saddle.browser.1.8.16.arm64.app.zip` |
|
|
25
|
+
| Android | `saddle.apk.1.8.16.apk`, `saddle.aab.1.8.16.aab` |
|
|
26
|
+
| Container | `saddle.container.1.8.16.tar.gz` |
|
|
27
|
+
| Browser extension | `saddle.extension.1.8.16.zip` |
|
|
28
|
+
| Manifests | `manifest.android.1.8.16.json`, `manifest.container.1.8.16.json`, `manifest.desktop.linux.arm64.1.8.16.json`, `manifest.desktop.linux.x64.1.8.16.json`, `manifest.desktop.macos.arm64.1.8.16.json`, `manifest.desktop.macos.x64.1.8.16.json`, `manifest.desktop.windows.arm64.1.8.16.json`, `manifest.desktop.windows.x64.1.8.16.json`, `manifest.desktop.windows.x86.1.8.16.json` |
|
|
29
|
+
| Checksums | `sha256.android.1.8.16`, `sha256.container.1.8.16`, `sha256.desktop.linux.arm64.1.8.16`, `sha256.desktop.linux.x64.1.8.16`, `sha256.desktop.macos.arm64.1.8.16`, `sha256.desktop.macos.x64.1.8.16`, `sha256.desktop.windows.arm64.1.8.16`, `sha256.desktop.windows.x64.1.8.16`, `sha256.desktop.windows.x86.1.8.16` |
|
|
30
|
+
|
|
31
|
+
The release contains **38 attached assets**: 20 primary artifacts, nine manifests, and nine checksum files. iOS artifacts are absent because Apple signing, provisioning, and export credentials remain caller-owned and no IPA or app archive was built.
|
|
32
|
+
|
|
33
|
+
## Publication and verification policy
|
|
34
|
+
|
|
35
|
+
The six registry workflows publish from the same validated release tag, in container-first order: GHCR, GitHub Packages npm, public npmjs, Maven, NuGet GitHub Packages, and RubyGems. The GHCR workflow must build, scan, push, pull, inspect its OCI version label, and complete a smoke check. The release does not claim SignPath approval, Authenticode trust, Apple notarization, production Android signing, SBOM validation, vulnerability status, or registry availability unless the completed workflow output independently supports that claim.
|
|
36
|
+
|
|
37
|
+
## Verified publication results
|
|
38
|
+
|
|
39
|
+
The release validation, security, container artifact, desktop artifact, target-plan, and extension workflows completed successfully. The six tag-driven registry workflows also completed successfully: GHCR, GitHub Packages npm, public npmjs, Maven, NuGet GitHub Packages, and RubyGems. The release-event Android job correctly stopped when production Android signing secrets were unavailable. Manual run `31839378707` then produced and attached the APK and AAB through the explicitly allowed `ci-test-key` path; it is not presented as a production Android signing result.
|
|
40
|
+
|
|
41
|
+
## References
|
|
42
|
+
|
|
43
|
+
[1]: https://github.com/wenathlan/saddle "Saddle source repository"
|
|
44
|
+
[2]: https://github.com/wenathlan/saddle/releases "Saddle release archive"
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Saddle 1.8.17
|
|
2
|
+
|
|
3
|
+
Saddle 1.8.17 expands the GHCR container from an unqualified single-platform publication to a Linux OCI manifest index. The release workflow builds and publishes `linux/amd64`, `linux/arm64`, and `linux/ppc64le`; it verifies the pushed index, then pulls and runs the amd64 variant for the existing OCI-label and CLI smoke checks. Windows containers are deliberately not claimed because the current Dockerfile is Linux-based and no compatible Node 26.7.0 Windows base was verified.
|
|
4
|
+
|
|
5
|
+
## Changes
|
|
6
|
+
|
|
7
|
+
| Area | Change |
|
|
8
|
+
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
9
|
+
| Container matrix | Adds Buildx publication for `linux/amd64`, `linux/arm64`, and `linux/ppc64le`. |
|
|
10
|
+
| Emulation | Registers QEMU before Buildx so the GitHub-hosted Linux builder can create the selected non-native Linux variants. |
|
|
11
|
+
| Validation | Keeps a locally loadable `linux/amd64` scan target, verifies the pushed OCI index contains exactly the selected Linux architectures, checks the OCI version label, and runs `saddle help`. |
|
|
12
|
+
| Scope boundary | Defers `windows/amd64`, `linux/arm/v7`, and `linux/386`; rejects `unknown/*` as a runtime target. |
|
|
13
|
+
| Dockerfile | Removes an unused Alpine stage so the Dockerfile resolves only the Debian-based build and runtime stages that participate in the selected matrix. |
|
|
14
|
+
| Versioning | Aligns active package, registry, native, extension, crawler, Capacitor, and iOS metadata to `1.8.17`, with iOS build number `1008017`. |
|
|
15
|
+
|
|
16
|
+
## Container publication contract
|
|
17
|
+
|
|
18
|
+
| Image reference | Expected published Linux platforms | Verification after push |
|
|
19
|
+
| --------------------------------- | --------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
|
|
20
|
+
| `ghcr.io/wenathlan/saddle:1.8.17` | `linux/amd64`, `linux/arm64`, `linux/ppc64le` | OCI manifest-index inspection, amd64 pull, OCI version-label comparison, and CLI help smoke test. |
|
|
21
|
+
| `ghcr.io/wenathlan/saddle:latest` | The same platforms as the version tag | The version-specific tag is verified first; `latest` is not claimed until the registry workflow completes. |
|
|
22
|
+
|
|
23
|
+
`windows/amd64` requires a separate Windows Dockerfile, an explicitly versioned Windows base image, a compatible Windows runner, and Windows-specific smoke testing. It is not interchangeable with the Debian Linux image. `unknown/*` descriptors are not advertised as runnable platforms.
|
|
24
|
+
|
|
25
|
+
## Artifact contract
|
|
26
|
+
|
|
27
|
+
The release workflows derive all names from `v1.8.17`. The expected artifact matrix remains 38 files: 20 primary artifacts, nine manifests, and nine checksum files. The container archive name is `saddle.container.1.8.17.tar.gz`; its release manifest records the image reference but does not replace inspection of the pushed registry manifest index.
|
|
28
|
+
|
|
29
|
+
## Verification boundary
|
|
30
|
+
|
|
31
|
+
These notes describe the release candidate and expected outputs. Registry availability, image index contents, scan results, signatures, SBOM validity, Android signing, iOS artifacts, and any platform-specific execution claim are recorded only after the relevant workflow output independently confirms them.
|
|
32
|
+
|
|
33
|
+
## References
|
|
34
|
+
|
|
35
|
+
[1]: https://docs.docker.com/build/building/multi-platform/ "Docker multi-platform builds"
|
|
36
|
+
[2]: https://docs.docker.com/build/ci/github-actions/multi-platform/ "Multi-platform image with GitHub Actions"
|
|
37
|
+
[3]: https://learn.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility "Windows container version compatibility"
|