@wenathlan/saddle 1.8.11 → 1.8.12
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/LICENSE +646 -175
- package/README.md +11 -3
- package/dist/apps/registry.d.ts +1 -1
- package/dist/browser/recorder.d.ts +7 -13
- package/dist/browser/recorder.d.ts.map +1 -1
- package/dist/browser/recorder.js +42 -6
- package/dist/browser/recorder.js.map +1 -1
- package/dist/extension/build.d.ts.map +1 -1
- package/dist/extension/build.js +27 -3
- package/dist/extension/build.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +2 -2
- package/dist/memory/engine.d.ts +10 -0
- package/dist/memory/engine.d.ts.map +1 -1
- package/dist/memory/engine.js +57 -7
- package/dist/memory/engine.js.map +1 -1
- package/dist/modes/resolve.d.ts +55 -0
- package/dist/modes/resolve.d.ts.map +1 -1
- package/dist/modes/resolve.js +9 -0
- package/dist/modes/resolve.js.map +1 -1
- package/dist/packager/manifest.d.ts +15 -0
- package/dist/packager/manifest.d.ts.map +1 -1
- package/dist/packager/manifest.js +36 -0
- package/dist/packager/manifest.js.map +1 -1
- package/dist/release/verify.d.ts +12 -0
- package/dist/release/verify.d.ts.map +1 -0
- package/dist/release/verify.js +112 -0
- package/dist/release/verify.js.map +1 -0
- package/dist/scrape/robots.js +1 -1
- package/dist/storage/s3compatible.d.ts +1 -0
- package/dist/storage/s3compatible.d.ts.map +1 -1
- package/dist/storage/s3compatible.js +43 -4
- package/dist/storage/s3compatible.js.map +1 -1
- package/dist/workflow/manifest.d.ts +1 -0
- package/dist/workflow/manifest.d.ts.map +1 -1
- package/dist/workflow/manifest.js +1 -0
- package/dist/workflow/manifest.js.map +1 -1
- package/dist/workflow/triggers.d.ts +30 -2
- package/dist/workflow/triggers.d.ts.map +1 -1
- package/dist/workflow/triggers.js +67 -1
- package/dist/workflow/triggers.js.map +1 -1
- package/docs/actionrecorder.md +12 -0
- package/docs/artifactavailability.md +36 -1
- package/docs/batches-1816-1820.md +13 -0
- package/docs/capabilityreport.md +13 -0
- package/docs/documentmap-1.8.12.md +17 -0
- package/docs/licenseaudit-1.8.12.md +21 -0
- package/docs/memoryengine.md +21 -0
- package/docs/nativeidentityresearch-1.8.11.md +69 -0
- package/docs/releaseassets.md +6 -2
- package/docs/s3compatible.md +12 -0
- package/docs/scanningresearch-1.8.11.md +17 -0
- package/docs/securityreferences-1.8.11.md +10 -0
- package/docs/securityresearch-1.8.11.md +19 -0
- package/docs/signingresearch-1.8.12.md +167 -0
- package/docs/signingwithoutcertificates.md +54 -0
- package/docs/signpathapplication.md +11 -0
- package/docs/sitemap.md +14 -0
- package/docs/tauri-glib-risk-1.8.11.md +11 -0
- package/docs/workflowinputs.md +17 -0
- package/extension/manifest.json +15 -2
- package/package.json +2 -1
- package/license.md +0 -203
- package/license.txt +0 -203
|
@@ -18,6 +18,25 @@ export function artifactname(target, version, format) {
|
|
|
18
18
|
throw new TypeError("artifact name contains unsupported characters");
|
|
19
19
|
return normalized;
|
|
20
20
|
}
|
|
21
|
+
/** Creates the supported cross-platform release matrix for a version. */
|
|
22
|
+
export function releaseartifactmatrix(version, options = {}) {
|
|
23
|
+
const normalizedversion = normalizeversion(version);
|
|
24
|
+
const signing = String(options.signing ?? "caller-owned");
|
|
25
|
+
const entries = [
|
|
26
|
+
entry("desktop", "linux", "x64", ["deb", "rpm", "appimage"], normalizedversion, signing),
|
|
27
|
+
entry("desktop", "linux", "arm64", ["deb", "rpm", "appimage"], normalizedversion, signing),
|
|
28
|
+
entry("desktop", "windows", "x86", ["exe", "msi"], normalizedversion, signing),
|
|
29
|
+
entry("desktop", "windows", "x64", ["exe", "msi"], normalizedversion, signing),
|
|
30
|
+
entry("desktop", "windows", "arm64", ["exe", "msi"], normalizedversion, signing),
|
|
31
|
+
entry("desktop", "macos", "x64", ["dmg", "app.zip"], normalizedversion, signing),
|
|
32
|
+
entry("desktop", "macos", "arm64", ["dmg", "app.zip"], normalizedversion, signing),
|
|
33
|
+
entry("android", "android", "caller", ["apk", "aab"], normalizedversion, signing),
|
|
34
|
+
entry("ios", "ios", "caller", ["ipa", "app.zip"], normalizedversion, signing),
|
|
35
|
+
entry("container", "oci", "caller", ["tar.gz"], normalizedversion, signing),
|
|
36
|
+
entry("extension", "browser", "caller", ["zip"], normalizedversion, signing),
|
|
37
|
+
];
|
|
38
|
+
return { version: normalizedversion, signing, entries };
|
|
39
|
+
}
|
|
21
40
|
/** Creates a distribution manifest for caller-owned build and publication steps. */
|
|
22
41
|
export function distributionmanifest(options = {}) {
|
|
23
42
|
if (!options.name || !options.version || !options.entry)
|
|
@@ -55,4 +74,21 @@ export function containerplan(manifest, options = {}) {
|
|
|
55
74
|
lines.splice(3, 0, `expose ${options.port}`);
|
|
56
75
|
return { base, workdir, command, dockerfile: `${lines.join("\n")}\n` };
|
|
57
76
|
}
|
|
77
|
+
function normalizeversion(value) { const normalized = String(value).trim(); if (!/^\d+\.\d+\.\d+$/.test(normalized))
|
|
78
|
+
throw new TypeError(`invalid release version: ${value}`); return normalized; }
|
|
79
|
+
function entry(surface, platform, architecture, formats, version, signing) {
|
|
80
|
+
const files = formats.map((format) => {
|
|
81
|
+
if (surface === "android")
|
|
82
|
+
return `saddle.${format}.${version}.${format}`;
|
|
83
|
+
if (surface === "ios")
|
|
84
|
+
return `saddle.${format}.${version}.${format === "app.zip" ? "app.zip" : format}`;
|
|
85
|
+
if (surface === "container")
|
|
86
|
+
return `saddle.container.${version}.tar.gz`;
|
|
87
|
+
if (surface === "extension")
|
|
88
|
+
return `saddle.extension.${version}.zip`;
|
|
89
|
+
return `saddle.browser.${version}.${architecture}.${format}`;
|
|
90
|
+
});
|
|
91
|
+
const metadata = surface === "desktop" ? `desktop.${platform}.${architecture}` : surface;
|
|
92
|
+
return { surface, platform, architecture, formats, files, signing, checksums: `sha256.${metadata}.${version}`, manifest: `manifest.${metadata}.${version}.json` };
|
|
93
|
+
}
|
|
58
94
|
//# sourceMappingURL=manifest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../packager/manifest.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../packager/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Release verification checks artifact digests, manifest consistency and
|
|
3
|
+
* explicit signing state without contacting a registry or a provider.
|
|
4
|
+
*/
|
|
5
|
+
/** Verifies a release checksum file and its correlated public manifest. */
|
|
6
|
+
export declare function verifyassets(options?: {}): Promise<{
|
|
7
|
+
valid: boolean;
|
|
8
|
+
version: string;
|
|
9
|
+
signing: string;
|
|
10
|
+
files: any[];
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../release/verify.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,2EAA2E;AAC3E,wBAAsB,YAAY,CAAC,OAAO,KAAK;;;;;GAyB9C"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Release verification checks artifact digests, manifest consistency and
|
|
3
|
+
* explicit signing state without contacting a registry or a provider.
|
|
4
|
+
*/
|
|
5
|
+
import { createHash } from "node:crypto";
|
|
6
|
+
import { readFile } from "node:fs/promises";
|
|
7
|
+
import { basename, dirname, isAbsolute, relative, resolve, sep } from "node:path";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
const modulepath = dirname(fileURLToPath(import.meta.url));
|
|
10
|
+
const rootpath = resolve(modulepath, "..");
|
|
11
|
+
const signingstatuses = new Set([
|
|
12
|
+
"unsigned",
|
|
13
|
+
"ci-test-key",
|
|
14
|
+
"caller-owned",
|
|
15
|
+
"caller-configured",
|
|
16
|
+
"notarized",
|
|
17
|
+
"signpath-foundation",
|
|
18
|
+
"provider-verified",
|
|
19
|
+
]);
|
|
20
|
+
/** Verifies a release checksum file and its correlated public manifest. */
|
|
21
|
+
export async function verifyassets(options = {}) {
|
|
22
|
+
const checksumsfile = resolve(String(options.checksums ?? ""));
|
|
23
|
+
const manifestfile = resolve(String(options.manifest ?? ""));
|
|
24
|
+
if (!options.checksums || !options.manifest)
|
|
25
|
+
throw new TypeError("checksums and manifest are required");
|
|
26
|
+
const artifactroot = resolve(String(options.artifactroot ?? dirname(checksumsfile)));
|
|
27
|
+
const manifest = JSON.parse(await readFile(manifestfile, "utf8"));
|
|
28
|
+
const expectedversion = options.version === undefined ? undefined : String(options.version);
|
|
29
|
+
const version = String(manifest.version ?? "");
|
|
30
|
+
if (!version)
|
|
31
|
+
throw new TypeError("release manifest version is required");
|
|
32
|
+
if (expectedversion && expectedversion !== version)
|
|
33
|
+
throw new Error(`release version mismatch: expected ${expectedversion}, received ${version}`);
|
|
34
|
+
const signing = String(manifest.signing ?? "");
|
|
35
|
+
if (!signingstatuses.has(signing))
|
|
36
|
+
throw new Error(`unknown release signing status: ${signing || "empty"}`);
|
|
37
|
+
const checksums = parsechecksums(await readFile(checksumsfile, "utf8"));
|
|
38
|
+
const manifestfiles = normalizefiles(manifest.files);
|
|
39
|
+
const checksumfiles = [...checksums.keys()].sort();
|
|
40
|
+
if (manifestfiles.length !== checksumfiles.length || manifestfiles.some((name, index) => name !== checksumfiles[index]))
|
|
41
|
+
throw new Error("release manifest files do not match checksum entries");
|
|
42
|
+
const verified = [];
|
|
43
|
+
for (const name of checksumfiles) {
|
|
44
|
+
const artifact = safepath(artifactroot, name);
|
|
45
|
+
const digest = await sha256(artifact);
|
|
46
|
+
const expected = checksums.get(name);
|
|
47
|
+
if (digest !== expected)
|
|
48
|
+
throw new Error(`checksum mismatch: ${name}`);
|
|
49
|
+
verified.push({ name, digest });
|
|
50
|
+
}
|
|
51
|
+
return { valid: true, version, signing, files: verified };
|
|
52
|
+
}
|
|
53
|
+
/** Parses sha256sum output while accepting binary filenames with spaces. */
|
|
54
|
+
function parsechecksums(value) {
|
|
55
|
+
const entries = new Map();
|
|
56
|
+
for (const line of String(value).split(/\r?\n/)) {
|
|
57
|
+
if (!line.trim())
|
|
58
|
+
continue;
|
|
59
|
+
const match = line.match(/^([a-f0-9]{64})\s+[ *](.+)$/i);
|
|
60
|
+
if (!match)
|
|
61
|
+
throw new TypeError(`invalid checksum line: ${line}`);
|
|
62
|
+
const name = basename(match[2]);
|
|
63
|
+
if (entries.has(name))
|
|
64
|
+
throw new Error(`duplicate checksum entry: ${name}`);
|
|
65
|
+
entries.set(name, match[1].toLowerCase());
|
|
66
|
+
}
|
|
67
|
+
return entries;
|
|
68
|
+
}
|
|
69
|
+
/** Normalizes and validates the manifest file list. */
|
|
70
|
+
function normalizefiles(value) {
|
|
71
|
+
if (!Array.isArray(value) || value.some((item) => typeof item !== "string"))
|
|
72
|
+
throw new TypeError("release manifest files must be a string array");
|
|
73
|
+
const names = value.map((item) => basename(item));
|
|
74
|
+
if (new Set(names).size !== names.length)
|
|
75
|
+
throw new Error("duplicate release manifest file");
|
|
76
|
+
return names.sort();
|
|
77
|
+
}
|
|
78
|
+
/** Rejects absolute paths and path traversal outside the selected artifact root. */
|
|
79
|
+
function safepath(root, name) {
|
|
80
|
+
const artifact = resolve(root, name);
|
|
81
|
+
const boundary = relative(root, artifact);
|
|
82
|
+
if (isAbsolute(boundary) || boundary === ".." || boundary.startsWith(`..${sep}`))
|
|
83
|
+
throw new Error(`release artifact escapes root: ${name}`);
|
|
84
|
+
return artifact;
|
|
85
|
+
}
|
|
86
|
+
/** Computes a SHA-256 digest with the Node.js standard library. */
|
|
87
|
+
async function sha256(path) {
|
|
88
|
+
const hash = createHash("sha256");
|
|
89
|
+
hash.update(await readFile(path));
|
|
90
|
+
return hash.digest("hex");
|
|
91
|
+
}
|
|
92
|
+
/** Parses the standalone verification command used by release automation. */
|
|
93
|
+
function parsearguments(argumentslist) {
|
|
94
|
+
const options = { artifactroot: rootpath };
|
|
95
|
+
for (let index = 0; index < argumentslist.length; index += 1) {
|
|
96
|
+
const argument = argumentslist[index];
|
|
97
|
+
if (argument === "--checksums")
|
|
98
|
+
options.checksums = argumentslist[++index];
|
|
99
|
+
else if (argument === "--manifest")
|
|
100
|
+
options.manifest = argumentslist[++index];
|
|
101
|
+
else if (argument === "--root")
|
|
102
|
+
options.artifactroot = argumentslist[++index];
|
|
103
|
+
else if (argument === "--version")
|
|
104
|
+
options.version = argumentslist[++index];
|
|
105
|
+
else
|
|
106
|
+
throw new TypeError(`unsupported release verification argument: ${argument}`);
|
|
107
|
+
}
|
|
108
|
+
return options;
|
|
109
|
+
}
|
|
110
|
+
if (process.argv[1] === fileURLToPath(import.meta.url))
|
|
111
|
+
verifyassets(parsearguments(process.argv.slice(2))).then((result) => { console.log(JSON.stringify(result)); }).catch((error) => { console.error(error.message); process.exitCode = 1; });
|
|
112
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../release/verify.ts"],"names":[],"mappings":"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"}
|
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.12" }, 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;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3compatible.d.ts","sourceRoot":"","sources":["../../storage/s3compatible.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"s3compatible.d.ts","sourceRoot":"","sources":["../../storage/s3compatible.ts"],"names":[],"mappings":"AAMA,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,OAAO,KAAK,OAqCxC"}
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* s3 compatible storage stays open by accepting a caller supplied signer.
|
|
3
|
+
* List operations use the S3 ListObjectsV2 contract without owning credentials.
|
|
3
4
|
*/
|
|
4
5
|
import { storageadapter } from "./adapter.js";
|
|
6
|
+
/** Creates an S3-compatible adapter with signed CRUD and paginated listing. */
|
|
5
7
|
export function s3compatible(options = {}) {
|
|
6
8
|
if (!options.endpoint || !options.bucket || typeof options.sign !== "function")
|
|
7
9
|
throw new TypeError("s3 compatible storage requires endpoint bucket and sign");
|
|
8
10
|
const endpoint = new URL(options.endpoint);
|
|
9
11
|
const fetcher = options.fetcher ?? fetch;
|
|
10
|
-
async function request(method, key, body) {
|
|
11
|
-
const signed = await options.sign({ method, endpoint, bucket: options.bucket, key, body });
|
|
12
|
-
const
|
|
12
|
+
async function request(method, key, body, query = {}) {
|
|
13
|
+
const signed = await options.sign({ method, endpoint, bucket: options.bucket, key, query, body });
|
|
14
|
+
const url = new URL(signed.url, endpoint);
|
|
15
|
+
if (!url.search && Object.keys(query).length)
|
|
16
|
+
for (const [name, value] of Object.entries(query))
|
|
17
|
+
url.searchParams.set(name, String(value));
|
|
18
|
+
const response = await fetcher(url, { method, headers: signed.headers, body });
|
|
13
19
|
if (!response.ok)
|
|
14
20
|
throw new Error(`storage request failed with ${response.status}`);
|
|
15
21
|
return response;
|
|
@@ -25,7 +31,40 @@ export function s3compatible(options = {}) {
|
|
|
25
31
|
return null;
|
|
26
32
|
} },
|
|
27
33
|
async delete(key) { await request("DELETE", key); },
|
|
28
|
-
async list(
|
|
34
|
+
async list(prefix = "", listoptions = {}) {
|
|
35
|
+
const maxkeys = Math.max(1, Math.min(1000, Number(listoptions.maxkeys ?? options.maxkeys ?? 1000)));
|
|
36
|
+
const maxpages = Math.max(1, Number(listoptions.maxpages ?? options.maxpages ?? 100));
|
|
37
|
+
const entries = [];
|
|
38
|
+
let continuation = listoptions.continuationToken;
|
|
39
|
+
for (let page = 0; page < maxpages; page += 1) {
|
|
40
|
+
const query = { "list-type": "2", prefix, "max-keys": maxkeys };
|
|
41
|
+
if (continuation)
|
|
42
|
+
query["continuation-token"] = continuation;
|
|
43
|
+
const response = await request("GET", "", undefined, query);
|
|
44
|
+
const parsed = parseListXml(await response.text());
|
|
45
|
+
entries.push(...parsed.entries);
|
|
46
|
+
if (!parsed.truncated || !parsed.nextToken)
|
|
47
|
+
return entries;
|
|
48
|
+
if (parsed.nextToken === continuation)
|
|
49
|
+
throw new Error("s3 list continuation token did not advance");
|
|
50
|
+
continuation = parsed.nextToken;
|
|
51
|
+
}
|
|
52
|
+
return entries;
|
|
53
|
+
},
|
|
29
54
|
});
|
|
30
55
|
}
|
|
56
|
+
function parseListXml(xml) {
|
|
57
|
+
const entries = [];
|
|
58
|
+
for (const block of xml.match(/<Contents\b[\s\S]*?<\/Contents>/gi) ?? []) {
|
|
59
|
+
const key = xmlvalue(block, "Key");
|
|
60
|
+
if (!key)
|
|
61
|
+
continue;
|
|
62
|
+
const etag = xmlvalue(block, "ETag");
|
|
63
|
+
entries.push({ key, sizebytes: Number(xmlvalue(block, "Size") ?? 0), sha256: etag?.replace(/^"|"$/g, "") ?? "", contenttype: "application/octet-stream", createdat: Date.now(), metadata: { etag, lastmodified: xmlvalue(block, "LastModified"), storageclass: xmlvalue(block, "StorageClass") } });
|
|
64
|
+
}
|
|
65
|
+
const truncated = xmlvalue(xml, "IsTruncated") === "true";
|
|
66
|
+
return { entries, truncated, nextToken: xmlvalue(xml, "NextContinuationToken") };
|
|
67
|
+
}
|
|
68
|
+
function xmlvalue(xml, name) { const match = String(xml).match(new RegExp(`<${name}>([\\s\\S]*?)</${name}>`, "i")); return match ? decodexml(match[1].trim()) : undefined; }
|
|
69
|
+
function decodexml(value) { return String(value).replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll(""", '"').replaceAll("'", "'"); }
|
|
31
70
|
//# sourceMappingURL=s3compatible.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3compatible.js","sourceRoot":"","sources":["../../storage/s3compatible.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"s3compatible.js","sourceRoot":"","sources":["../../storage/s3compatible.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../workflow/manifest.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,aAAa,mBAAwE,CAAC;AAEnG,wBAAgB,gBAAgB,CAAC,OAAO,KAAK;IAGzC,IAAI;IACJ,OAAO;IACP,OAAO;IACP,SAAS;IACT,WAAW;IACX,SAAS;IACT,cAAc;IACd,YAAY;EAEf;AAED,wBAAgB,cAAc,CAAC,QAAQ,KAAA;IAAa,IAAI;IAAiB,OAAO;IAAoB,cAAc;IAA2B,SAAS;EAAmC"}
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../workflow/manifest.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,aAAa,mBAAwE,CAAC;AAEnG,wBAAgB,gBAAgB,CAAC,OAAO,KAAK;IAGzC,IAAI;IACJ,OAAO;IACP,OAAO;IACP,MAAM;IACN,SAAS;IACT,WAAW;IACX,SAAS;IACT,cAAc;IACd,YAAY;EAEf;AAED,wBAAgB,cAAc,CAAC,QAAQ,KAAA;IAAa,IAAI;IAAiB,OAAO;IAAoB,cAAc;IAA2B,SAAS;EAAmC"}
|
|
@@ -9,6 +9,7 @@ export function workflowmanifest(options = {}) {
|
|
|
9
9
|
name: options.name,
|
|
10
10
|
command: options.command,
|
|
11
11
|
trigger: options.trigger ?? ["manual", "dispatch"],
|
|
12
|
+
inputs: options.inputs ?? {},
|
|
12
13
|
platforms: options.platforms ?? forgeprofiles,
|
|
13
14
|
environment: options.environment ?? {},
|
|
14
15
|
artifacts: options.artifacts ?? ["results/**"],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../workflow/manifest.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEnG,MAAM,UAAU,gBAAgB,CAAC,OAAO,GAAG,EAAE;IAC3C,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO;QAAE,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;IAC1G,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;QAClD,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,aAAa;QAC7C,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;QACtC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,CAAC,YAAY,CAAC;QAC9C,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE;QAC5C,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,IAAI;KAC3C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAQ,IAAI,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,cAAc,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../workflow/manifest.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEnG,MAAM,UAAU,gBAAgB,CAAC,OAAO,GAAG,EAAE;IAC3C,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO;QAAE,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;IAC1G,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;QAClD,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,aAAa;QAC7C,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;QACtC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,CAAC,YAAY,CAAC;QAC9C,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE;QAC5C,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,IAAI;KAC3C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAQ,IAAI,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,cAAc,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -9,12 +9,29 @@ export declare function triggermatch(manifest: any, event?: {}): {
|
|
|
9
9
|
matched: boolean;
|
|
10
10
|
type: string;
|
|
11
11
|
reason: string;
|
|
12
|
+
errors?: undefined;
|
|
13
|
+
inputs?: undefined;
|
|
12
14
|
requestid?: undefined;
|
|
13
15
|
} | {
|
|
14
16
|
matched: boolean;
|
|
15
17
|
type: string;
|
|
16
|
-
|
|
18
|
+
reason: string;
|
|
19
|
+
errors: any[];
|
|
20
|
+
inputs?: undefined;
|
|
21
|
+
requestid?: undefined;
|
|
22
|
+
} | {
|
|
17
23
|
reason?: undefined;
|
|
24
|
+
errors?: undefined;
|
|
25
|
+
matched: boolean;
|
|
26
|
+
type: string;
|
|
27
|
+
inputs: {};
|
|
28
|
+
requestid: any;
|
|
29
|
+
};
|
|
30
|
+
/** Validates and normalizes caller-supplied workflow inputs against a manifest schema. */
|
|
31
|
+
export declare function validateworkflowinputs(manifest: any, values?: {}): {
|
|
32
|
+
valid: boolean;
|
|
33
|
+
values: {};
|
|
34
|
+
errors: any[];
|
|
18
35
|
};
|
|
19
36
|
/** Keeps trigger declarations and produces deterministic matching results. */
|
|
20
37
|
export declare function triggerregistry(): {
|
|
@@ -24,12 +41,23 @@ export declare function triggerregistry(): {
|
|
|
24
41
|
matched: boolean;
|
|
25
42
|
type: string;
|
|
26
43
|
reason: string;
|
|
44
|
+
errors?: undefined;
|
|
45
|
+
inputs?: undefined;
|
|
27
46
|
requestid?: undefined;
|
|
28
47
|
} | {
|
|
29
48
|
matched: boolean;
|
|
30
49
|
type: string;
|
|
31
|
-
|
|
50
|
+
reason: string;
|
|
51
|
+
errors: any[];
|
|
52
|
+
inputs?: undefined;
|
|
53
|
+
requestid?: undefined;
|
|
54
|
+
} | {
|
|
32
55
|
reason?: undefined;
|
|
56
|
+
errors?: undefined;
|
|
57
|
+
matched: boolean;
|
|
58
|
+
type: string;
|
|
59
|
+
inputs: {};
|
|
60
|
+
requestid: any;
|
|
33
61
|
};
|
|
34
62
|
list: () => any[];
|
|
35
63
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triggers.d.ts","sourceRoot":"","sources":["../../workflow/triggers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,YAAY,mBAAqF,CAAC;AAE/G,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,KAAK,WAAa,YAIlD;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,QAAQ,KAAA,EAAE,KAAK,KAAK
|
|
1
|
+
{"version":3,"file":"triggers.d.ts","sourceRoot":"","sources":["../../workflow/triggers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,YAAY,mBAAqF,CAAC;AAE/G,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,KAAK,WAAa,YAIlD;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,QAAQ,KAAA,EAAE,KAAK,KAAK;;;;;;;;;;;;;;;;;;;;;EAQhD;AAED,0FAA0F;AAC1F,wBAAgB,sBAAsB,CAAC,QAAQ,KAAA,EAAE,MAAM,KAAK;;;;EAoB3D;AAED,8EAA8E;AAC9E,wBAAgB,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;EAO9B"}
|
|
@@ -17,7 +17,42 @@ export function triggermatch(manifest, event = {}) {
|
|
|
17
17
|
return { matched: false, type, reason: "trigger-not-declared" };
|
|
18
18
|
if (type === "schedule" && event.at !== undefined && Number(event.at) > Date.now())
|
|
19
19
|
return { matched: false, type, reason: "not-due" };
|
|
20
|
-
|
|
20
|
+
const validation = validateworkflowinputs(manifest, event.inputs ?? {});
|
|
21
|
+
if (!validation.valid)
|
|
22
|
+
return { matched: false, type, reason: "invalid-inputs", errors: validation.errors };
|
|
23
|
+
return { matched: true, type, inputs: validation.values, requestid: event.requestid ?? `${manifest.name}/${type}/${stablevalue(event)}` };
|
|
24
|
+
}
|
|
25
|
+
/** Validates and normalizes caller-supplied workflow inputs against a manifest schema. */
|
|
26
|
+
export function validateworkflowinputs(manifest, values = {}) {
|
|
27
|
+
const schema = manifest?.inputs ?? {};
|
|
28
|
+
const source = values && typeof values === "object" && !Array.isArray(values) ? values : {};
|
|
29
|
+
const errors = [];
|
|
30
|
+
const normalized = {};
|
|
31
|
+
for (const name of Object.keys(source))
|
|
32
|
+
if (!Object.hasOwn(schema, name))
|
|
33
|
+
errors.push({ name, reason: "unknown-input" });
|
|
34
|
+
for (const [name, declaration] of Object.entries(schema)) {
|
|
35
|
+
const rule = typeof declaration === "string" ? { type: declaration } : declaration ?? {};
|
|
36
|
+
let value = source[name];
|
|
37
|
+
if (value === undefined && rule.default !== undefined)
|
|
38
|
+
value = rule.default;
|
|
39
|
+
if (value === undefined) {
|
|
40
|
+
if (rule.required)
|
|
41
|
+
errors.push({ name, reason: "required" });
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const converted = convertinput(value, rule.type ?? "string");
|
|
45
|
+
if (converted.error) {
|
|
46
|
+
errors.push({ name, reason: converted.error });
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (Array.isArray(rule.choices) && !rule.choices.includes(converted.value)) {
|
|
50
|
+
errors.push({ name, reason: "choice" });
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
normalized[name] = converted.value;
|
|
54
|
+
}
|
|
55
|
+
return { valid: errors.length === 0, values: normalized, errors };
|
|
21
56
|
}
|
|
22
57
|
/** Keeps trigger declarations and produces deterministic matching results. */
|
|
23
58
|
export function triggerregistry() {
|
|
@@ -30,4 +65,35 @@ export function triggerregistry() {
|
|
|
30
65
|
function list() { return [...values.values()].map((manifest) => ({ ...manifest, trigger: [...manifest.trigger] })); }
|
|
31
66
|
return { register, get, match, list };
|
|
32
67
|
}
|
|
68
|
+
function convertinput(value, type) {
|
|
69
|
+
if (type === "string")
|
|
70
|
+
return { value: String(value) };
|
|
71
|
+
if (type === "number") {
|
|
72
|
+
const number = typeof value === "number" ? value : Number(value);
|
|
73
|
+
return Number.isFinite(number) ? { value: number } : { error: "number" };
|
|
74
|
+
}
|
|
75
|
+
if (type === "boolean") {
|
|
76
|
+
if (value === true || value === "true")
|
|
77
|
+
return { value: true };
|
|
78
|
+
if (value === false || value === "false")
|
|
79
|
+
return { value: false };
|
|
80
|
+
return { error: "boolean" };
|
|
81
|
+
}
|
|
82
|
+
if (type === "json") {
|
|
83
|
+
try {
|
|
84
|
+
return { value: typeof value === "string" ? JSON.parse(value) : value };
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return { error: "json" };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return { error: "type" };
|
|
91
|
+
}
|
|
92
|
+
function stablevalue(value) {
|
|
93
|
+
if (Array.isArray(value))
|
|
94
|
+
return `[${value.map(stablevalue).join(",")}]`;
|
|
95
|
+
if (value && typeof value === "object")
|
|
96
|
+
return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${stablevalue(value[key])}`).join(",")}}`;
|
|
97
|
+
return JSON.stringify(value);
|
|
98
|
+
}
|
|
33
99
|
//# sourceMappingURL=triggers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triggers.js","sourceRoot":"","sources":["../../workflow/triggers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;AAE/G,sDAAsD;AACtD,MAAM,UAAU,gBAAgB,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC;IACjD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACpD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAC;IACnI,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,YAAY,CAAC,QAAQ,EAAE,KAAK,GAAG,EAAE;IAC/C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;IAC9F,IAAI,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACvI,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,IAAI,IAAI,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"triggers.js","sourceRoot":"","sources":["../../workflow/triggers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Action recorder
|
|
2
|
+
|
|
3
|
+
The browser `actionrecorder` links actions to the snapshot, tab, frame and window context that preceded them. The optional `maxevents` limit keeps long sessions bounded by dropping the oldest events and reporting the number dropped in the manifest.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
const recorder = actionrecorder({ maxevents: 2000 });
|
|
7
|
+
recorder.snapshot(snapshot);
|
|
8
|
+
recorder.action({ action: "click", payload: { ref: "e1" } });
|
|
9
|
+
const archive = recorder.exportjson();
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
`manifest()` and `exportjson()` return copies of the recorded payloads. `clear()` resets the event stream and correlation boundary. The recorder remains an in-memory, caller-owned component; it does not select a browser, persistence backend or credential.
|
|
@@ -62,4 +62,39 @@ Version 1.8.11 keeps the Tauri browser build flat at `desktop/`, with `Cargo.tom
|
|
|
62
62
|
|
|
63
63
|
The Android project maps Saddle-owned `AndroidManifest.xml`, `main/`, `res/`, `test/` and `androidtest/` directly from the `android/` root through Gradle `sourceSets`. Capacitor staging under `android/app`, `android/assets` and plugin internals is generated during synchronization, removed or ignored before build, and is not project-owned source. The iOS surface keeps its generated Xcode and Swift Package internals because Capacitor owns those paths; Saddle-owned configuration remains at the `ios/` root and no project-owned `ios/src` directory is added.
|
|
64
64
|
|
|
65
|
-
The v1.8.11 workflows derive the version from the release tag, run flat-surface validation, reject helper binaries and attach only outputs matching the dotted lowercase contract. The live release asset list
|
|
65
|
+
The v1.8.11 workflows derive the version from the release tag, run flat-surface validation, reject helper binaries and attach only outputs matching the dotted lowercase contract. The live release asset list below was verified against the published GitHub release.
|
|
66
|
+
|
|
67
|
+
## Verified 1.8.11 primary assets
|
|
68
|
+
|
|
69
|
+
Sizes are bytes and exclude the separate manifest and checksum files.
|
|
70
|
+
|
|
71
|
+
| Surface | Asset | Size |
|
|
72
|
+
| --------------- | ----------------------------------------------------------------------------------------------------------- | ---------: |
|
|
73
|
+
| Desktop browser | [AppImage](https://github.com/wenathlan/saddle/releases/download/v1.8.11/saddle.browser.1.8.11.appimage) | 79,870,456 |
|
|
74
|
+
| Desktop browser | [Debian](https://github.com/wenathlan/saddle/releases/download/v1.8.11/saddle.browser.1.8.11.deb) | 5,294,158 |
|
|
75
|
+
| Desktop browser | [RPM](https://github.com/wenathlan/saddle/releases/download/v1.8.11/saddle.browser.1.8.11.rpm) | 5,297,619 |
|
|
76
|
+
| Desktop browser | [Windows EXE](https://github.com/wenathlan/saddle/releases/download/v1.8.11/saddle.browser.1.8.11.exe) | 4,343,237 |
|
|
77
|
+
| Desktop browser | [Windows MSI](https://github.com/wenathlan/saddle/releases/download/v1.8.11/saddle.browser.1.8.11.msi) | 5,246,976 |
|
|
78
|
+
| Desktop browser | [macOS DMG](https://github.com/wenathlan/saddle/releases/download/v1.8.11/saddle.browser.1.8.11.dmg) | 5,216,935 |
|
|
79
|
+
| Android | [APK](https://github.com/wenathlan/saddle/releases/download/v1.8.11/saddle.apk.1.8.11.apk) | 3,498,594 |
|
|
80
|
+
| Android | [AAB](https://github.com/wenathlan/saddle/releases/download/v1.8.11/saddle.aab.1.8.11.aab) | 3,893,324 |
|
|
81
|
+
| Container | [OCI tarball](https://github.com/wenathlan/saddle/releases/download/v1.8.11/saddle.container.1.8.11.tar.gz) | 81,722,975 |
|
|
82
|
+
| Extension | [ZIP](https://github.com/wenathlan/saddle/releases/download/v1.8.11/saddle.extension.1.8.11.zip) | 10,760 |
|
|
83
|
+
|
|
84
|
+
The release also contains `manifest.*.1.8.11.json` and `sha256.*.1.8.11` files for Android, container, and each desktop runner. No IPA was attached because caller-owned Apple signing and provisioning were not enabled for this release.
|
|
85
|
+
|
|
86
|
+
## 1.8.12 release matrix
|
|
87
|
+
|
|
88
|
+
Version 1.8.12 is prepared to publish the expanded matrix below. The release workflows derive the version from the `v1.8.12` tag and generate the checksum and manifest files beside each surface artifact. Sizes and final signing states remain pending until the release workflows complete; this section does not claim that an artifact exists before CI attaches it.
|
|
89
|
+
|
|
90
|
+
| Surface | Architectures | Artifact naming contract |
|
|
91
|
+
| --- | --- | --- |
|
|
92
|
+
| Linux desktop browser | x64, arm64 | `saddle.browser.1.8.12.<architecture>.deb`, `.rpm`, `.appimage` |
|
|
93
|
+
| Windows desktop browser | x86, x64, arm64 | `saddle.browser.1.8.12.<architecture>.exe`, `.msi` |
|
|
94
|
+
| macOS desktop browser | x64, arm64 | `saddle.browser.1.8.12.<architecture>.dmg`, `.app.zip` |
|
|
95
|
+
| Android | caller-configured signing | `saddle.apk.1.8.12.apk`, `saddle.aab.1.8.12.aab` |
|
|
96
|
+
| iOS | caller-configured signing and provisioning | `saddle.ipa.1.8.12.ipa`, `saddle.app.1.8.12.app.zip` |
|
|
97
|
+
| Container | OCI | `saddle.container.1.8.12.tar.gz` |
|
|
98
|
+
| Browser extension | Manifest V3 | `saddle.extension.1.8.12.zip` |
|
|
99
|
+
|
|
100
|
+
Each surface also emits `sha256.*.1.8.12`, `manifest.*.1.8.12.json` and, where enabled by the release path, SBOM and provenance metadata. The manifest must state `unsigned`, `ci-test-key`, `caller-owned`, `notarized` or the verified provider status actually produced by CI.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Objective driven batches 1.8.16 to 1.8.20
|
|
2
|
+
|
|
3
|
+
The uploaded scope README remains an objective reference. It describes the intended package behavior, runtime independence, storage-to-compute bridge and public target surfaces; it does not prescribe a deterministic file sequence or implementation recipe.
|
|
4
|
+
|
|
5
|
+
| Batch | Selected objective | Acceptance evidence |
|
|
6
|
+
|---|---|---|
|
|
7
|
+
| 1.8.16 | Complete the generic S3-compatible storage surface with caller-signed paginated listing. | XML listing fixtures, prefix and continuation handling, malformed-response errors and adapter contract tests. |
|
|
8
|
+
| 1.8.17 | Make sitemap index traversal bounded, recursive, deduplicated and cycle-safe. | Nested index fixtures, duplicate URLs, cycles, `maxUrls` and network-error tests. |
|
|
9
|
+
| 1.8.18 | Make browser action recording bounded and exportable without losing snapshot correlation. | Event limit, clear/export behavior, immutable manifest copies and correlation tests. |
|
|
10
|
+
| 1.8.19 | Add explicit workflow input validation and deterministic trigger matching for caller-owned CI dispatch. | Strict input fixtures, unknown input rejection, event filtering and registry tests. |
|
|
11
|
+
| 1.8.20 | Add a cross-runtime capability report for library, browser, desktop, mobile, CLI and binary modes. | Stable capability matrix, caller overrides and no host, port or credential ownership. |
|
|
12
|
+
|
|
13
|
+
The batches are deliberately grouped by objective rather than by a fixed folder plan. Each batch must pass focused tests before the next batch is selected. Version bumps, commits, tags and releases remain separate delivery actions and wait for the user's explicit authorization.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Capability report
|
|
2
|
+
|
|
3
|
+
The `capabilityreport` contract produces a stable, serializable view of the execution, runtime, memory, file, dependency, visibility and pairing axes. It resolves every execution mode with caller-selected overrides and exposes the effective boolean capabilities for diagnostics, documentation and adapters.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
const report = capabilityreport({
|
|
7
|
+
runtime: "unknown",
|
|
8
|
+
memory: "external",
|
|
9
|
+
pair: "with",
|
|
10
|
+
});
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
The report explicitly labels host, port, credentials and provider as caller-owned. It does not start a process, open a socket, select a cloud service or promise that every target has an installed toolchain. It describes the library contract and preserves user choice across browser, desktop, mobile, CLI, binary and application modes.
|