@wenathlan/saddle 1.8.14 → 1.8.16
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/README.md +2 -2
- package/dist/apps/registry.d.ts +1 -1
- package/dist/binary/archive.d.ts +27 -0
- package/dist/binary/archive.d.ts.map +1 -0
- package/dist/binary/archive.js +46 -0
- package/dist/binary/archive.js.map +1 -0
- package/dist/binary/transform.d.ts +70 -0
- package/dist/binary/transform.d.ts.map +1 -0
- package/dist/binary/transform.js +105 -0
- package/dist/binary/transform.js.map +1 -0
- package/dist/delivery/manifest.d.ts +35 -0
- package/dist/delivery/manifest.d.ts.map +1 -0
- package/dist/delivery/manifest.js +68 -0
- package/dist/delivery/manifest.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +3 -3
- package/dist/memory/engine.d.ts +1 -1
- package/dist/memory/planner.d.ts +66 -0
- package/dist/memory/planner.d.ts.map +1 -0
- package/dist/memory/planner.js +108 -0
- package/dist/memory/planner.js.map +1 -0
- 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/runners/chain.d.ts +125 -0
- package/dist/runners/chain.d.ts.map +1 -0
- package/dist/runners/chain.js +95 -0
- package/dist/runners/chain.js.map +1 -0
- package/dist/scrape/robots.js +1 -1
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +1 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/memory.js +2 -2
- package/dist/storage/memory.js.map +1 -1
- package/dist/storage/pool.d.ts +95 -0
- package/dist/storage/pool.d.ts.map +1 -0
- package/dist/storage/pool.js +202 -0
- package/dist/storage/pool.js.map +1 -0
- package/dist/surfaces/requirements.d.ts +29 -0
- package/dist/surfaces/requirements.d.ts.map +1 -0
- package/dist/surfaces/requirements.js +50 -0
- package/dist/surfaces/requirements.js.map +1 -0
- package/docs/artifactavailability.md +13 -1
- package/docs/ecosystemplan.md +1 -1
- package/docs/enginearchitecture.md +30 -0
- package/docs/libraryapi.md +5 -1
- package/docs/plans/00.index.md +2 -2
- package/docs/plans/06.dependencies.md +1 -1
- package/docs/plans/18.research.content.extraction.md +3 -3
- package/docs/plans/22.research.universal.runtime.md +10 -10
- package/docs/plans/28.action.plan.md +1 -1
- package/docs/plans/35.comparativo.concorrencia.md +10 -10
- package/docs/plans/40.npm.publish.md +6 -6
- package/docs/plans/41.o.que.falta.md +2 -2
- package/docs/plans/42.pesquisa.concorrencia.md +2 -2
- package/docs/plans/43.plan.universal.architecture.md +2 -2
- package/docs/plans/44.reference.md +1 -1
- package/docs/plans/45.robotarchitecture.md +3 -3
- package/docs/plans/46.scdnintegration.md +1 -1
- package/docs/plans/README.md +2 -2
- package/docs/plans/missing-facts.md +1 -1
- package/docs/registryresearch.md +3 -3
- package/docs/release17notes.md +1 -1
- package/docs/releasenotes-1.8.14.md +24 -9
- package/docs/releasenotes-1.8.15.md +41 -0
- package/docs/releasenotes-1.8.16.md +40 -0
- package/docs/repo-research-1.8.16.md +439 -0
- package/docs/repo-synthesis-1.8.16.md +56 -0
- package/docs/talks9/README (2).md +2 -2
- package/docs/talks9/README.md +4 -4
- package/docs/talks9/Viabilidade do Saddle_ Uma An/303/241lise T/303/251cnica da Transforma/303/247/303/243o de Armazenamento Remoto em Mem/303/263ria Computacional.md" +4 -4
- package/docs/talks9/conversa.txt +4 -4
- package/docs/todo-1.8.15.md +483 -0
- package/docs/todo-1.8.16.md +651 -0
- package/docs/todo.md +708 -0
- package/extension/manifest.json +1 -1
- package/package.json +10 -2
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* provider chains rank caller-authorized execution candidates without dispatching remote work.
|
|
3
|
+
*/
|
|
4
|
+
/** Creates a stable provider chain over declarative capability reports. */
|
|
5
|
+
export function providerchain(input = {}) {
|
|
6
|
+
const providers = normalizeproviders(input.providers);
|
|
7
|
+
return Object.freeze({ select(request = {}) { return selectprovider(providers, request); }, dispatchplan(request = {}) { const selection = selectprovider(providers, request); return Object.freeze({ version: 1, state: "caller-dispatches", provider: selection.selected, request: normalizerequest(request), rejected: selection.rejected }); }, providers: () => providers.map((provider) => ({ ...provider, capabilities: [...provider.capabilities] })) });
|
|
8
|
+
}
|
|
9
|
+
/** Selects the first eligible provider under stable priority and returns every exclusion reason. */
|
|
10
|
+
export function selectprovider(providers, request = {}) {
|
|
11
|
+
const normalized = normalizeproviders(providers);
|
|
12
|
+
const required = normalizerequest(request);
|
|
13
|
+
const rejected = [];
|
|
14
|
+
const accepted = [];
|
|
15
|
+
for (const provider of normalized) {
|
|
16
|
+
const reasons = eligibility(provider, required);
|
|
17
|
+
if (reasons.length)
|
|
18
|
+
rejected.push(Object.freeze({ id: provider.id, reasons: Object.freeze(reasons) }));
|
|
19
|
+
else
|
|
20
|
+
accepted.push(provider);
|
|
21
|
+
}
|
|
22
|
+
if (accepted.length === 0)
|
|
23
|
+
throw chainerror("PROVIDER_CHAIN_UNAVAILABLE", "provider chain has no eligible providers", { request: required, rejected });
|
|
24
|
+
accepted.sort((left, right) => preferenceindex(required.preferredids, left.id) - preferenceindex(required.preferredids, right.id) || left.priority - right.priority || left.id.localeCompare(right.id));
|
|
25
|
+
const selected = accepted[0];
|
|
26
|
+
return Object.freeze({ version: 1, selected: describe(selected), rejected: Object.freeze(rejected), request: required });
|
|
27
|
+
}
|
|
28
|
+
/** Produces a verified runner-to-storage handoff record without writing an artifact. */
|
|
29
|
+
export function artifacthandoff(input = {}) {
|
|
30
|
+
const key = nonempty(input.key, "artifact handoff key");
|
|
31
|
+
const sha256 = digest(input.sha256, "artifact handoff sha256");
|
|
32
|
+
const providerid = nonempty(input.providerid, "artifact handoff providerid");
|
|
33
|
+
const retention = nonempty(input.retention, "artifact handoff retention");
|
|
34
|
+
return Object.freeze({ version: 1, key, sha256, sizebytes: positive(input.sizebytes, "artifact handoff sizebytes"), providerid, retention, state: "caller-transfers" });
|
|
35
|
+
}
|
|
36
|
+
/** Creates a cancellation intent without claiming that a remote runner has stopped or cleaned up. */
|
|
37
|
+
export function cancellationplan(input = {}) {
|
|
38
|
+
const runid = nonempty(input.runid, "provider cancellation runid");
|
|
39
|
+
const providerid = nonempty(input.providerid, "provider cancellation providerid");
|
|
40
|
+
const reason = nonempty(input.reason ?? "caller-requested", "provider cancellation reason");
|
|
41
|
+
return Object.freeze({ version: 1, runid, providerid, reason, state: "caller-cancels", remotestate: "unknown", compensation: input.compensation === true ? "caller-evaluates" : "not-requested" });
|
|
42
|
+
}
|
|
43
|
+
/** Renders a caller-dispatches plan through an injected forge adapter without sending it. */
|
|
44
|
+
export async function renderdispatch(plan, adapter) {
|
|
45
|
+
if (plan?.state !== "caller-dispatches")
|
|
46
|
+
throw new TypeError("provider dispatch plan is invalid");
|
|
47
|
+
if (typeof adapter?.render !== "function")
|
|
48
|
+
throw chainerror("PROVIDER_DISPATCH_RENDER_UNAVAILABLE", "provider dispatch render adapter is required");
|
|
49
|
+
return adapter.render(Object.freeze({ ...plan }));
|
|
50
|
+
}
|
|
51
|
+
function normalizeproviders(input) {
|
|
52
|
+
if (!Array.isArray(input) || input.length === 0)
|
|
53
|
+
throw new TypeError("provider chain providers must be a non-empty array");
|
|
54
|
+
const ids = new Set();
|
|
55
|
+
return Object.freeze(input.map((value, index) => {
|
|
56
|
+
const id = nonempty(value?.id, "provider chain provider id");
|
|
57
|
+
if (ids.has(id))
|
|
58
|
+
throw new TypeError(`provider chain provider id is duplicated: ${id}`);
|
|
59
|
+
ids.add(id);
|
|
60
|
+
const status = String(value.status ?? "available");
|
|
61
|
+
if (!new Set(["available", "busy", "offline", "disabled"]).has(status))
|
|
62
|
+
throw new TypeError(`provider chain provider status is invalid: ${id}`);
|
|
63
|
+
return Object.freeze({ id, priority: nonnegative(value.priority ?? index, "provider chain provider priority"), status, capabilities: Object.freeze(unique(value.capabilities ?? [], "provider chain capability")), architecture: optionalword(value.architecture, "provider chain provider architecture"), operatingSystem: optionalword(value.operatingSystem, "provider chain provider operating system"), networkpolicy: policy(value.networkpolicy ?? "caller", "provider chain network policy"), storagepolicy: policy(value.storagepolicy ?? "caller", "provider chain storage policy"), cpu: nonnegative(value.cpu ?? 0, "provider chain provider cpu"), memorybytes: nonnegative(value.memorybytes ?? 0, "provider chain provider memorybytes"), maxmilliseconds: nonnegative(value.maxmilliseconds ?? 0, "provider chain provider maxmilliseconds") });
|
|
64
|
+
}).sort((left, right) => left.priority - right.priority || left.id.localeCompare(right.id)));
|
|
65
|
+
}
|
|
66
|
+
function normalizerequest(input) { return Object.freeze({ capabilities: Object.freeze(unique(input.capabilities ?? [], "provider chain requested capability")), preferredids: Object.freeze(unique(input.preferredids ?? [], "provider chain preferred id")), architecture: optionalword(input.architecture, "provider chain requested architecture"), operatingSystem: optionalword(input.operatingSystem, "provider chain requested operating system"), networkpolicy: input.networkpolicy === undefined ? null : policy(input.networkpolicy, "provider chain requested network policy"), storagepolicy: input.storagepolicy === undefined ? null : policy(input.storagepolicy, "provider chain requested storage policy"), mincpu: nonnegative(input.mincpu ?? 0, "provider chain minimum cpu"), minmemorybytes: nonnegative(input.minmemorybytes ?? 0, "provider chain minimum memorybytes"), minmilliseconds: nonnegative(input.minmilliseconds ?? 0, "provider chain minimum milliseconds") }); }
|
|
67
|
+
function eligibility(provider, request) { const reasons = []; if (provider.status !== "available")
|
|
68
|
+
reasons.push(`status:${provider.status}`); for (const capability of request.capabilities)
|
|
69
|
+
if (!provider.capabilities.includes(capability))
|
|
70
|
+
reasons.push(`capability:${capability}`); if (request.architecture && provider.architecture !== request.architecture)
|
|
71
|
+
reasons.push("architecture"); if (request.operatingSystem && provider.operatingSystem !== request.operatingSystem)
|
|
72
|
+
reasons.push("operatingSystem"); if (request.networkpolicy && provider.networkpolicy !== request.networkpolicy)
|
|
73
|
+
reasons.push("networkpolicy"); if (request.storagepolicy && provider.storagepolicy !== request.storagepolicy)
|
|
74
|
+
reasons.push("storagepolicy"); if (provider.cpu < request.mincpu)
|
|
75
|
+
reasons.push("cpu"); if (provider.memorybytes < request.minmemorybytes)
|
|
76
|
+
reasons.push("memorybytes"); if (provider.maxmilliseconds < request.minmilliseconds)
|
|
77
|
+
reasons.push("maxmilliseconds"); return reasons; }
|
|
78
|
+
function describe(provider) { return Object.freeze({ id: provider.id, priority: provider.priority, capabilities: Object.freeze([...provider.capabilities]), architecture: provider.architecture, operatingSystem: provider.operatingSystem, networkpolicy: provider.networkpolicy, storagepolicy: provider.storagepolicy, cpu: provider.cpu, memorybytes: provider.memorybytes, maxmilliseconds: provider.maxmilliseconds }); }
|
|
79
|
+
function unique(input, name) { if (!Array.isArray(input))
|
|
80
|
+
throw new TypeError(`${name} values must be an array`); return [...new Set(input.map((value) => nonempty(value, name)))].sort(); }
|
|
81
|
+
function nonempty(value, name) { const output = String(value ?? ""); if (!output)
|
|
82
|
+
throw new TypeError(`${name} is required`); return output; }
|
|
83
|
+
function optionalword(value, name) { if (value === undefined || value === null || value === "")
|
|
84
|
+
return null; return nonempty(value, name); }
|
|
85
|
+
function policy(value, name) { const output = String(value); if (!new Set(["caller", "restricted", "isolated", "none"]).has(output))
|
|
86
|
+
throw new TypeError(`${name} is invalid`); return output; }
|
|
87
|
+
function preferenceindex(preferredids, id) { const index = preferredids.indexOf(id); return index === -1 ? Number.MAX_SAFE_INTEGER : index; }
|
|
88
|
+
function nonnegative(value, name) { const numeric = Number(value); if (!Number.isSafeInteger(numeric) || numeric < 0)
|
|
89
|
+
throw new TypeError(`${name} must be a non-negative safe integer`); return numeric; }
|
|
90
|
+
function positive(value, name) { const numeric = nonnegative(value, name); if (numeric < 1)
|
|
91
|
+
throw new TypeError(`${name} must be positive`); return numeric; }
|
|
92
|
+
function digest(value, name) { const output = String(value ?? "").toLowerCase(); if (!/^[a-f0-9]{64}$/.test(output))
|
|
93
|
+
throw new TypeError(`${name} is invalid`); return output; }
|
|
94
|
+
function chainerror(code, message, detail) { const error = new Error(message); error.code = code; error.detail = detail; return error; }
|
|
95
|
+
//# sourceMappingURL=chain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain.js","sourceRoot":"","sources":["../../runners/chain.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.16" }, 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;
|
package/dist/storage/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../storage/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../storage/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC"}
|
package/dist/storage/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../storage/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../storage/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC"}
|
package/dist/storage/memory.js
CHANGED
|
@@ -7,8 +7,8 @@ import { storageadapter } from "./adapter.js";
|
|
|
7
7
|
/** Creates a transport-neutral in-memory storage adapter with optional capacity limits. */
|
|
8
8
|
export function memorystorage(options = {}) {
|
|
9
9
|
const values = new Map();
|
|
10
|
-
const maxbytes =
|
|
11
|
-
if (!Number.isFinite(maxbytes) || maxbytes < 0)
|
|
10
|
+
const maxbytes = options.maxbytes === undefined ? Number.POSITIVE_INFINITY : Number(options.maxbytes);
|
|
11
|
+
if ((!Number.isFinite(maxbytes) && maxbytes !== Number.POSITIVE_INFINITY) || maxbytes < 0)
|
|
12
12
|
throw new TypeError("memory storage maxbytes is invalid");
|
|
13
13
|
let usedbytes = 0;
|
|
14
14
|
function manifest(key, data, input = {}) { return artifactmanifest({ key, sizebytes: data.byteLength, sha256: sha256(data), contenttype: input.contenttype ?? "application/octet-stream", createdat: input.createdat ?? Date.now(), metadata: input.metadata }); }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../storage/memory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,2FAA2F;AAC3F,MAAM,UAAU,aAAa,CAAC,OAAO,GAAG,EAAE;IACxC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;IACzB,MAAM,QAAQ,GAAG,
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../storage/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/** Creates a deterministic pool over explicit caller-owned storage adapters. */
|
|
2
|
+
export declare function storagepool(options?: {}): Readonly<{
|
|
3
|
+
read: (key: any, options?: {}) => Promise<Readonly<{
|
|
4
|
+
version: 1;
|
|
5
|
+
key: string;
|
|
6
|
+
memberid: any;
|
|
7
|
+
data: Uint8Array<ArrayBufferLike>;
|
|
8
|
+
sha256: string;
|
|
9
|
+
verified: boolean;
|
|
10
|
+
manifest: any;
|
|
11
|
+
attempts: readonly any[];
|
|
12
|
+
budget: Readonly<{
|
|
13
|
+
maxattempts: number;
|
|
14
|
+
maxbytes: number;
|
|
15
|
+
maxmilliseconds: number;
|
|
16
|
+
}>;
|
|
17
|
+
readat: number;
|
|
18
|
+
}>>;
|
|
19
|
+
readrange: (key: any, start: any, end: any, options?: {}) => Promise<Readonly<{
|
|
20
|
+
version: 1;
|
|
21
|
+
key: string;
|
|
22
|
+
range: Readonly<{
|
|
23
|
+
start: number;
|
|
24
|
+
end: number;
|
|
25
|
+
}>;
|
|
26
|
+
memberid: any;
|
|
27
|
+
data: Uint8Array<ArrayBufferLike>;
|
|
28
|
+
sha256: string;
|
|
29
|
+
verified: boolean;
|
|
30
|
+
attempts: readonly any[];
|
|
31
|
+
budget: Readonly<{
|
|
32
|
+
maxattempts: number;
|
|
33
|
+
maxbytes: number;
|
|
34
|
+
maxmilliseconds: number;
|
|
35
|
+
}>;
|
|
36
|
+
readat: number;
|
|
37
|
+
}>>;
|
|
38
|
+
put: (input?: {}, options?: {}) => Promise<Readonly<{
|
|
39
|
+
version: 1;
|
|
40
|
+
key: string;
|
|
41
|
+
sha256: string;
|
|
42
|
+
sizebytes: number;
|
|
43
|
+
mode: any;
|
|
44
|
+
quorum: number;
|
|
45
|
+
state: "complete" | "partial";
|
|
46
|
+
results: readonly any[];
|
|
47
|
+
written: number;
|
|
48
|
+
budget: Readonly<{
|
|
49
|
+
maxattempts: number;
|
|
50
|
+
maxbytes: number;
|
|
51
|
+
maxmilliseconds: number;
|
|
52
|
+
}>;
|
|
53
|
+
writtenat: number;
|
|
54
|
+
}>>;
|
|
55
|
+
repairplan: (key: any, options?: {}) => Readonly<{
|
|
56
|
+
version: 1;
|
|
57
|
+
key: string;
|
|
58
|
+
sourceid: string;
|
|
59
|
+
sha256: string;
|
|
60
|
+
targets: any;
|
|
61
|
+
action: "caller-executes";
|
|
62
|
+
}>;
|
|
63
|
+
restoreplan: (key: any, options?: {}) => Readonly<{
|
|
64
|
+
version: 1;
|
|
65
|
+
key: string;
|
|
66
|
+
sha256: string;
|
|
67
|
+
action: "caller-restores";
|
|
68
|
+
candidates: any;
|
|
69
|
+
}>;
|
|
70
|
+
members: () => Readonly<{
|
|
71
|
+
id: any;
|
|
72
|
+
priority: any;
|
|
73
|
+
}>[];
|
|
74
|
+
capabilities: () => {
|
|
75
|
+
id: string;
|
|
76
|
+
priority: number;
|
|
77
|
+
capabilities: Readonly<{
|
|
78
|
+
range: boolean;
|
|
79
|
+
conditional: boolean;
|
|
80
|
+
metadata: boolean;
|
|
81
|
+
delete: boolean;
|
|
82
|
+
}>;
|
|
83
|
+
}[];
|
|
84
|
+
metrics: () => {
|
|
85
|
+
reads: number;
|
|
86
|
+
writes: number;
|
|
87
|
+
hits: number;
|
|
88
|
+
misses: number;
|
|
89
|
+
mismatches: number;
|
|
90
|
+
bytes: number;
|
|
91
|
+
attempts: number;
|
|
92
|
+
elapsedms: number;
|
|
93
|
+
};
|
|
94
|
+
}>;
|
|
95
|
+
//# sourceMappingURL=pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../storage/pool.ts"],"names":[],"mappings":"AAMA,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,OAAO,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmHvC"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* storage pools combine caller-owned adapters without selecting a provider or creating background work.
|
|
3
|
+
*/
|
|
4
|
+
import { collectbytes, sha256 } from "./checksum.js";
|
|
5
|
+
import { storagecapabilities } from "./sync.js";
|
|
6
|
+
/** Creates a deterministic pool over explicit caller-owned storage adapters. */
|
|
7
|
+
export function storagepool(options = {}) {
|
|
8
|
+
const members = normalizemembers(options.members);
|
|
9
|
+
const clock = typeof options.clock === "function" ? options.clock : () => Date.now();
|
|
10
|
+
const metrics = { reads: 0, writes: 0, hits: 0, misses: 0, mismatches: 0, bytes: 0, attempts: 0, elapsedms: 0 };
|
|
11
|
+
async function read(key, options = {}) {
|
|
12
|
+
const normalizedkey = requiredkey(key);
|
|
13
|
+
const expectedsha = optionalsha(options.sha256);
|
|
14
|
+
const attempts = [];
|
|
15
|
+
const startedat = Number(clock());
|
|
16
|
+
const selected = selectable(members, options.memberids);
|
|
17
|
+
const budget = operationbudget(options.budget, selected.length);
|
|
18
|
+
metrics.reads += 1;
|
|
19
|
+
for (const member of selected.slice(0, budget.maxattempts)) {
|
|
20
|
+
if (options.signal?.aborted)
|
|
21
|
+
throw poolerror("STORAGE_POOL_ABORTED", "storage pool read was aborted", { key: normalizedkey, attempts });
|
|
22
|
+
if (elapsed(clock, startedat) > budget.maxmilliseconds)
|
|
23
|
+
throw poolerror("STORAGE_POOL_TIME_BUDGET", "storage pool read time budget was exceeded", { key: normalizedkey, attempts });
|
|
24
|
+
try {
|
|
25
|
+
metrics.attempts += 1;
|
|
26
|
+
const manifest = await optionalhead(member.storage, normalizedkey);
|
|
27
|
+
const raw = await member.storage.get(normalizedkey);
|
|
28
|
+
const data = await collectbytes(raw?.data ?? raw);
|
|
29
|
+
if (data.byteLength > budget.maxbytes)
|
|
30
|
+
throw poolerror("STORAGE_POOL_BYTE_BUDGET", "storage pool read byte budget was exceeded", { key: normalizedkey, memberid: member.id, maxbytes: budget.maxbytes, sizebytes: data.byteLength });
|
|
31
|
+
const actualsha = sha256(data);
|
|
32
|
+
const requiredsha = expectedsha ?? manifest?.sha256;
|
|
33
|
+
if (requiredsha && actualsha !== requiredsha) {
|
|
34
|
+
metrics.mismatches += 1;
|
|
35
|
+
throw poolerror("STORAGE_POOL_DIGEST_MISMATCH", "storage pool read digest did not match", { key: normalizedkey, memberid: member.id, expectedsha: requiredsha, actualsha });
|
|
36
|
+
}
|
|
37
|
+
metrics.hits += 1;
|
|
38
|
+
metrics.bytes += data.byteLength;
|
|
39
|
+
metrics.elapsedms += elapsed(clock, startedat);
|
|
40
|
+
return Object.freeze({ version: 1, key: normalizedkey, memberid: member.id, data, sha256: actualsha, verified: Boolean(requiredsha), manifest: manifest ?? null, attempts: Object.freeze(attempts), budget, readat: Number(clock()) });
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
attempts.push(attempt(member.id, error));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
metrics.misses += 1;
|
|
47
|
+
metrics.elapsedms += elapsed(clock, startedat);
|
|
48
|
+
throw poolerror("STORAGE_POOL_READ_FAILED", "storage pool could not read a verified object", { key: normalizedkey, attempts });
|
|
49
|
+
}
|
|
50
|
+
async function put(input = {}, options = {}) {
|
|
51
|
+
const key = requiredkey(input.key);
|
|
52
|
+
const data = await collectbytes(input.data);
|
|
53
|
+
const digest = sha256(data);
|
|
54
|
+
const selected = writeselection(selectable(members, options.memberids), options.mode);
|
|
55
|
+
const budget = operationbudget(options.budget, selected.length);
|
|
56
|
+
if (data.byteLength > budget.maxbytes)
|
|
57
|
+
throw poolerror("STORAGE_POOL_BYTE_BUDGET", "storage pool write byte budget was exceeded", { key, maxbytes: budget.maxbytes, sizebytes: data.byteLength });
|
|
58
|
+
const quorum = positiveinteger(options.quorum ?? 1, "storage pool quorum");
|
|
59
|
+
if (quorum > selected.length)
|
|
60
|
+
throw new RangeError("storage pool quorum exceeds selected members");
|
|
61
|
+
const results = [];
|
|
62
|
+
metrics.writes += 1;
|
|
63
|
+
const startedat = Number(clock());
|
|
64
|
+
for (const member of selected.slice(0, budget.maxattempts)) {
|
|
65
|
+
if (options.signal?.aborted) {
|
|
66
|
+
results.push({ memberid: member.id, state: "skipped", code: "STORAGE_POOL_ABORTED" });
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
if (elapsed(clock, startedat) > budget.maxmilliseconds) {
|
|
70
|
+
results.push({ memberid: member.id, state: "skipped", code: "STORAGE_POOL_TIME_BUDGET" });
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
metrics.attempts += 1;
|
|
75
|
+
const manifest = await member.storage.put({ ...input, key, data: new Uint8Array(data), metadata: { ...(input.metadata ?? {}), sha256: digest } });
|
|
76
|
+
if (manifest?.sha256 && manifest.sha256 !== digest)
|
|
77
|
+
throw poolerror("STORAGE_POOL_DIGEST_MISMATCH", "storage pool write digest did not match", { key, memberid: member.id, expectedsha: digest, actualsha: manifest.sha256 });
|
|
78
|
+
results.push({ memberid: member.id, state: "written", manifest: manifest ?? null });
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
results.push({ memberid: member.id, state: "failed", code: error?.code ?? "STORAGE_POOL_WRITE_FAILED", message: String(error?.message ?? error) });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const written = results.filter((result) => result.state === "written");
|
|
85
|
+
metrics.bytes += data.byteLength * written.length;
|
|
86
|
+
metrics.elapsedms += elapsed(clock, startedat);
|
|
87
|
+
const output = Object.freeze({ version: 1, key, sha256: digest, sizebytes: data.byteLength, mode: options.mode ?? "fanout", quorum, state: written.length === selected.length ? "complete" : "partial", results: Object.freeze(results), written: written.length, budget, writtenat: Number(clock()) });
|
|
88
|
+
if (written.length < quorum)
|
|
89
|
+
throw poolerror("STORAGE_POOL_QUORUM_FAILED", "storage pool write quorum was not met", output);
|
|
90
|
+
return output;
|
|
91
|
+
}
|
|
92
|
+
async function readrange(key, start, end, options = {}) {
|
|
93
|
+
const normalizedkey = requiredkey(key);
|
|
94
|
+
const range = validrange(start, end);
|
|
95
|
+
const expectedsha = optionalsha(options.sha256);
|
|
96
|
+
const attempts = [];
|
|
97
|
+
const selected = selectable(members, options.memberids);
|
|
98
|
+
const budget = operationbudget(options.budget, selected.length);
|
|
99
|
+
const startedat = Number(clock());
|
|
100
|
+
metrics.reads += 1;
|
|
101
|
+
for (const member of selected.slice(0, budget.maxattempts)) {
|
|
102
|
+
if (options.signal?.aborted)
|
|
103
|
+
throw poolerror("STORAGE_POOL_ABORTED", "storage pool range read was aborted", { key: normalizedkey, range, attempts });
|
|
104
|
+
if (elapsed(clock, startedat) > budget.maxmilliseconds)
|
|
105
|
+
throw poolerror("STORAGE_POOL_TIME_BUDGET", "storage pool range read time budget was exceeded", { key: normalizedkey, range, attempts });
|
|
106
|
+
if (typeof member.storage.getrange !== "function") {
|
|
107
|
+
attempts.push({ memberid: member.id, code: "STORAGE_POOL_RANGE_UNSUPPORTED", message: "storage pool member does not support range reads" });
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
metrics.attempts += 1;
|
|
112
|
+
const data = await collectbytes(await member.storage.getrange(normalizedkey, range.start, range.end));
|
|
113
|
+
if (data.byteLength !== range.end - range.start)
|
|
114
|
+
throw poolerror("STORAGE_POOL_RANGE_SIZE", "storage pool range result size did not match", { key: normalizedkey, range, memberid: member.id, sizebytes: data.byteLength });
|
|
115
|
+
const actualsha = sha256(data);
|
|
116
|
+
if (expectedsha && actualsha !== expectedsha)
|
|
117
|
+
throw poolerror("STORAGE_POOL_DIGEST_MISMATCH", "storage pool range digest did not match", { key: normalizedkey, range, memberid: member.id, expectedsha, actualsha });
|
|
118
|
+
metrics.hits += 1;
|
|
119
|
+
metrics.bytes += data.byteLength;
|
|
120
|
+
metrics.elapsedms += elapsed(clock, startedat);
|
|
121
|
+
return Object.freeze({ version: 1, key: normalizedkey, range, memberid: member.id, data, sha256: actualsha, verified: Boolean(expectedsha), attempts: Object.freeze(attempts), budget, readat: Number(clock()) });
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
attempts.push(attempt(member.id, error));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
metrics.misses += 1;
|
|
128
|
+
metrics.elapsedms += elapsed(clock, startedat);
|
|
129
|
+
throw poolerror("STORAGE_POOL_RANGE_FAILED", "storage pool could not read the requested range", { key: normalizedkey, range, attempts });
|
|
130
|
+
}
|
|
131
|
+
function repairplan(key, options = {}) {
|
|
132
|
+
const normalizedkey = requiredkey(key);
|
|
133
|
+
const sourceid = String(options.sourceid ?? "");
|
|
134
|
+
if (!members.some((member) => member.id === sourceid))
|
|
135
|
+
throw new TypeError("storage pool repair source member is unknown");
|
|
136
|
+
return Object.freeze({ version: 1, key: normalizedkey, sourceid, sha256: optionalsha(options.sha256), targets: selectable(members, options.memberids).filter((member) => member.id !== sourceid).map((member) => member.id), action: "caller-executes" });
|
|
137
|
+
}
|
|
138
|
+
function restoreplan(key, options = {}) {
|
|
139
|
+
const normalizedkey = requiredkey(key);
|
|
140
|
+
const selected = selectable(members, options.memberids);
|
|
141
|
+
const evidence = new Map((options.replicas ?? []).map((value) => [String(value?.memberid ?? ""), value?.verified === true]));
|
|
142
|
+
const candidates = selected.map((member) => ({ memberid: member.id, verified: evidence.get(member.id) === true })).sort((left, right) => Number(right.verified) - Number(left.verified) || left.memberid.localeCompare(right.memberid));
|
|
143
|
+
return Object.freeze({ version: 1, key: normalizedkey, sha256: optionalsha(options.sha256), action: "caller-restores", candidates: Object.freeze(candidates) });
|
|
144
|
+
}
|
|
145
|
+
return Object.freeze({ read, readrange, put, repairplan, restoreplan, members: () => members.map(describe), capabilities: () => members.map((member) => ({ id: member.id, priority: member.priority, capabilities: storagecapabilities(member.storage) })), metrics: () => ({ ...metrics }) });
|
|
146
|
+
}
|
|
147
|
+
function normalizemembers(input) {
|
|
148
|
+
if (!Array.isArray(input) || input.length === 0)
|
|
149
|
+
throw new TypeError("storage pool members must be a non-empty array");
|
|
150
|
+
const ids = new Set();
|
|
151
|
+
const members = input.map((value, index) => {
|
|
152
|
+
const id = String(value?.id ?? "");
|
|
153
|
+
if (!id)
|
|
154
|
+
throw new TypeError("storage pool member id is required");
|
|
155
|
+
if (ids.has(id))
|
|
156
|
+
throw new TypeError(`storage pool member id is duplicated: ${id}`);
|
|
157
|
+
ids.add(id);
|
|
158
|
+
if (typeof value?.storage?.get !== "function" || typeof value?.storage?.put !== "function")
|
|
159
|
+
throw new TypeError(`storage pool member requires get and put: ${id}`);
|
|
160
|
+
const priority = Number(value.priority ?? index);
|
|
161
|
+
if (!Number.isFinite(priority))
|
|
162
|
+
throw new TypeError(`storage pool member priority is invalid: ${id}`);
|
|
163
|
+
return Object.freeze({ id, storage: value.storage, priority });
|
|
164
|
+
});
|
|
165
|
+
return Object.freeze(members.sort((left, right) => left.priority - right.priority || left.id.localeCompare(right.id)));
|
|
166
|
+
}
|
|
167
|
+
function selectable(members, ids) {
|
|
168
|
+
if (ids === undefined)
|
|
169
|
+
return members;
|
|
170
|
+
if (!Array.isArray(ids) || ids.length === 0)
|
|
171
|
+
throw new TypeError("storage pool memberids must be a non-empty array");
|
|
172
|
+
const expected = new Set(ids.map((id) => String(id)));
|
|
173
|
+
const selected = members.filter((member) => expected.has(member.id));
|
|
174
|
+
if (selected.length !== expected.size)
|
|
175
|
+
throw new TypeError("storage pool memberids include an unknown member");
|
|
176
|
+
return selected;
|
|
177
|
+
}
|
|
178
|
+
function writeselection(members, mode = "fanout") {
|
|
179
|
+
const normalized = String(mode);
|
|
180
|
+
if (!new Set(["primary", "mirror", "fanout"]).has(normalized))
|
|
181
|
+
throw new TypeError("storage pool write mode is invalid");
|
|
182
|
+
return normalized === "primary" ? members.slice(0, 1) : members;
|
|
183
|
+
}
|
|
184
|
+
async function optionalhead(storage, key) { return typeof storage.head === "function" ? await storage.head(key) : null; }
|
|
185
|
+
function describe(member) { return Object.freeze({ id: member.id, priority: member.priority }); }
|
|
186
|
+
function requiredkey(value) { const key = String(value ?? ""); if (!key)
|
|
187
|
+
throw new TypeError("storage pool key is required"); return key; }
|
|
188
|
+
function optionalsha(value) { if (value === undefined || value === null)
|
|
189
|
+
return null; const digest = String(value); if (!/^[a-f0-9]{64}$/i.test(digest))
|
|
190
|
+
throw new TypeError("storage pool sha256 is invalid"); return digest.toLowerCase(); }
|
|
191
|
+
function positiveinteger(value, name) { const numeric = Number(value); if (!Number.isInteger(numeric) || numeric < 1)
|
|
192
|
+
throw new TypeError(`${name} must be a positive integer`); return numeric; }
|
|
193
|
+
function operationbudget(input = {}, fallbackattempts) { const budget = input ?? {}; return Object.freeze({ maxattempts: positiveinteger(budget.maxattempts ?? fallbackattempts, "storage pool budget maxattempts"), maxbytes: nonnegativebudget(budget.maxbytes, "storage pool budget maxbytes"), maxmilliseconds: nonnegativebudget(budget.maxmilliseconds, "storage pool budget maxmilliseconds") }); }
|
|
194
|
+
function nonnegativebudget(value, name) { if (value === undefined)
|
|
195
|
+
return Infinity; const numeric = Number(value); if (!Number.isSafeInteger(numeric) || numeric < 0)
|
|
196
|
+
throw new TypeError(`${name} must be a non-negative safe integer`); return numeric; }
|
|
197
|
+
function elapsed(clock, startedat) { return Math.max(0, Number(clock()) - startedat); }
|
|
198
|
+
function validrange(start, end) { const from = nonnegativebudget(start, "storage pool range start"); const to = nonnegativebudget(end, "storage pool range end"); if (!Number.isFinite(from) || !Number.isFinite(to) || to < from)
|
|
199
|
+
throw new TypeError("storage pool range is invalid"); return Object.freeze({ start: from, end: to }); }
|
|
200
|
+
function attempt(memberid, error) { return { memberid, code: error?.code ?? "STORAGE_POOL_READ_FAILED", message: String(error?.message ?? error) }; }
|
|
201
|
+
function poolerror(code, message, detail) { const error = new Error(message); error.code = code; error.detail = detail; return error; }
|
|
202
|
+
//# sourceMappingURL=pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../storage/pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* application surface requirements describe Mini App, DNS, and bridge needs without owning credentials or infrastructure.
|
|
3
|
+
*/
|
|
4
|
+
/** Creates a Mini App plan that requires caller-owned origin and validation. */
|
|
5
|
+
export declare function miniappplan(input?: {}): Readonly<{
|
|
6
|
+
version: 1;
|
|
7
|
+
origin: any;
|
|
8
|
+
validation: string;
|
|
9
|
+
capabilities: readonly string[];
|
|
10
|
+
state: "caller-validates";
|
|
11
|
+
provider: string;
|
|
12
|
+
}>;
|
|
13
|
+
/** Creates a DNS and HTTPS requirement record without a registrar or DNS operation. */
|
|
14
|
+
export declare function dnsplan(input?: {}): Readonly<{
|
|
15
|
+
version: 1;
|
|
16
|
+
hostname: string;
|
|
17
|
+
dnssec: boolean;
|
|
18
|
+
https: boolean;
|
|
19
|
+
owner: string;
|
|
20
|
+
state: "caller-configures";
|
|
21
|
+
operations: readonly string[];
|
|
22
|
+
}>;
|
|
23
|
+
/** Maps declared application surfaces without selecting a runtime vendor. */
|
|
24
|
+
export declare function applicationbridge(input?: {}): Readonly<{
|
|
25
|
+
version: 1;
|
|
26
|
+
surfaces: any;
|
|
27
|
+
state: "caller-connects";
|
|
28
|
+
}>;
|
|
29
|
+
//# sourceMappingURL=requirements.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requirements.d.ts","sourceRoot":"","sources":["../../surfaces/requirements.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,KAAK,KAAK;;;;;;;GAKrC;AAED,uFAAuF;AACvF,wBAAgB,OAAO,CAAC,KAAK,KAAK;;;;;;;;GAKjC;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,KAAK,KAAK;;;;GAY3C"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* application surface requirements describe Mini App, DNS, and bridge needs without owning credentials or infrastructure.
|
|
3
|
+
*/
|
|
4
|
+
/** Creates a Mini App plan that requires caller-owned origin and validation. */
|
|
5
|
+
export function miniappplan(input = {}) {
|
|
6
|
+
if ("token" in input || "bottoken" in input || "secret" in input)
|
|
7
|
+
throw new TypeError("Mini App credentials must not be supplied to the library plan");
|
|
8
|
+
const origin = publichttps(input.origin, "Mini App origin");
|
|
9
|
+
const validation = nonempty(input.validation, "Mini App validation");
|
|
10
|
+
return Object.freeze({ version: 1, origin, validation, capabilities: Object.freeze(unique(input.capabilities ?? [])), state: "caller-validates", provider: String(input.provider ?? "telegram") });
|
|
11
|
+
}
|
|
12
|
+
/** Creates a DNS and HTTPS requirement record without a registrar or DNS operation. */
|
|
13
|
+
export function dnsplan(input = {}) {
|
|
14
|
+
const hostname = hostnamevalue(input.hostname);
|
|
15
|
+
const dnssec = input.dnssec === true;
|
|
16
|
+
const https = input.https === true;
|
|
17
|
+
return Object.freeze({ version: 1, hostname, dnssec, https, owner: nonempty(input.owner, "DNS owner"), state: "caller-configures", operations: Object.freeze(["record", "certificate", ...(dnssec ? ["dnssec"] : [])]) });
|
|
18
|
+
}
|
|
19
|
+
/** Maps declared application surfaces without selecting a runtime vendor. */
|
|
20
|
+
export function applicationbridge(input = {}) {
|
|
21
|
+
if (!Array.isArray(input.surfaces) || input.surfaces.length === 0)
|
|
22
|
+
throw new TypeError("application bridge surfaces are required");
|
|
23
|
+
const ids = new Set();
|
|
24
|
+
const surfaces = input.surfaces.map((value) => {
|
|
25
|
+
const id = nonempty(value?.id, "application bridge surface id");
|
|
26
|
+
if (ids.has(id))
|
|
27
|
+
throw new TypeError(`application bridge surface id is duplicated: ${id}`);
|
|
28
|
+
ids.add(id);
|
|
29
|
+
const target = String(value.target ?? "");
|
|
30
|
+
if (!targets.has(target))
|
|
31
|
+
throw new TypeError(`application bridge target is invalid: ${target}`);
|
|
32
|
+
return Object.freeze({ id, target, capabilities: Object.freeze(unique(value.capabilities ?? [])) });
|
|
33
|
+
});
|
|
34
|
+
return Object.freeze({ version: 1, surfaces: Object.freeze(surfaces), state: "caller-connects" });
|
|
35
|
+
}
|
|
36
|
+
const targets = new Set(["browser", "desktop", "mobile", "extension", "miniapp"]);
|
|
37
|
+
function publichttps(value, name) { const output = String(value ?? ""); let url; try {
|
|
38
|
+
url = new URL(output);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
throw new TypeError(`${name} is invalid`);
|
|
42
|
+
} if (url.protocol !== "https:" || !url.hostname)
|
|
43
|
+
throw new TypeError(`${name} must use HTTPS`); return url.toString(); }
|
|
44
|
+
function hostnamevalue(value) { const output = String(value ?? "").toLowerCase(); if (!/^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,63}$/.test(output))
|
|
45
|
+
throw new TypeError("DNS hostname is invalid"); return output; }
|
|
46
|
+
function nonempty(value, name) { const output = String(value ?? ""); if (!output)
|
|
47
|
+
throw new TypeError(`${name} is required`); return output; }
|
|
48
|
+
function unique(values) { if (!Array.isArray(values))
|
|
49
|
+
throw new TypeError("surface capabilities must be an array"); return [...new Set(values.map((value) => nonempty(value, "surface capability")))].sort(); }
|
|
50
|
+
//# sourceMappingURL=requirements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requirements.js","sourceRoot":"","sources":["../../surfaces/requirements.ts"],"names":[],"mappings":"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"}
|