@wenathlan/saddle 1.8.13 → 1.8.15

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.
Files changed (75) hide show
  1. package/README.md +47 -9
  2. package/dist/binary/archive.d.ts +27 -0
  3. package/dist/binary/archive.d.ts.map +1 -0
  4. package/dist/binary/archive.js +46 -0
  5. package/dist/binary/archive.js.map +1 -0
  6. package/dist/binary/transform.d.ts +70 -0
  7. package/dist/binary/transform.d.ts.map +1 -0
  8. package/dist/binary/transform.js +105 -0
  9. package/dist/binary/transform.js.map +1 -0
  10. package/dist/delivery/manifest.d.ts +35 -0
  11. package/dist/delivery/manifest.d.ts.map +1 -0
  12. package/dist/delivery/manifest.js +68 -0
  13. package/dist/delivery/manifest.js.map +1 -0
  14. package/dist/index.d.ts +7 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +7 -0
  17. package/dist/index.js.map +1 -1
  18. package/dist/memory/planner.d.ts +66 -0
  19. package/dist/memory/planner.d.ts.map +1 -0
  20. package/dist/memory/planner.js +108 -0
  21. package/dist/memory/planner.js.map +1 -0
  22. package/dist/runners/chain.d.ts +125 -0
  23. package/dist/runners/chain.d.ts.map +1 -0
  24. package/dist/runners/chain.js +95 -0
  25. package/dist/runners/chain.js.map +1 -0
  26. package/dist/scrape/robots.js +1 -1
  27. package/dist/storage/index.d.ts +1 -0
  28. package/dist/storage/index.d.ts.map +1 -1
  29. package/dist/storage/index.js +1 -0
  30. package/dist/storage/index.js.map +1 -1
  31. package/dist/storage/memory.js +2 -2
  32. package/dist/storage/memory.js.map +1 -1
  33. package/dist/storage/pool.d.ts +95 -0
  34. package/dist/storage/pool.d.ts.map +1 -0
  35. package/dist/storage/pool.js +202 -0
  36. package/dist/storage/pool.js.map +1 -0
  37. package/dist/surfaces/requirements.d.ts +29 -0
  38. package/dist/surfaces/requirements.d.ts.map +1 -0
  39. package/dist/surfaces/requirements.js +50 -0
  40. package/dist/surfaces/requirements.js.map +1 -0
  41. package/docs/artifactavailability.md +22 -4
  42. package/docs/ecosystemplan.md +1 -1
  43. package/docs/enginearchitecture.md +28 -0
  44. package/docs/plans/00.index.md +2 -2
  45. package/docs/plans/06.dependencies.md +1 -1
  46. package/docs/plans/18.research.content.extraction.md +3 -3
  47. package/docs/plans/22.research.universal.runtime.md +10 -10
  48. package/docs/plans/28.action.plan.md +1 -1
  49. package/docs/plans/35.comparativo.concorrencia.md +10 -10
  50. package/docs/plans/40.npm.publish.md +6 -6
  51. package/docs/plans/41.o.que.falta.md +2 -2
  52. package/docs/plans/42.pesquisa.concorrencia.md +2 -2
  53. package/docs/plans/43.plan.universal.architecture.md +2 -2
  54. package/docs/plans/44.reference.md +1 -1
  55. package/docs/plans/45.robotarchitecture.md +3 -3
  56. package/docs/plans/46.scdnintegration.md +1 -1
  57. package/docs/plans/README.md +2 -2
  58. package/docs/plans/missing-facts.md +1 -1
  59. package/docs/registryresearch.md +3 -3
  60. package/docs/release17notes.md +1 -1
  61. package/docs/releaseassets.md +2 -2
  62. package/docs/releasenotes-1.8.12.md +17 -2
  63. package/docs/releasenotes-1.8.13.md +30 -2
  64. package/docs/releasenotes-1.8.14.md +67 -0
  65. package/docs/releasenotes-1.8.15.md +37 -0
  66. package/docs/talks9/README (2).md +2 -2
  67. package/docs/talks9/README.md +4 -4
  68. 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
  69. package/docs/talks9/conversa.txt +4 -4
  70. package/docs/todo-1.8.15.md +483 -0
  71. package/docs/todo-1.8.16.md +651 -0
  72. package/docs/todo.md +708 -0
  73. package/extension/README.md +1 -1
  74. package/extension/manifest.json +1 -1
  75. package/package.json +9 -2
@@ -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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"}
@@ -85,7 +85,7 @@ The release also contains `manifest.*.1.8.11.json` and `sha256.*.1.8.11` files f
85
85
 
86
86
  ## 1.8.12 release matrix
87
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.
88
+ Version 1.8.12 was published with the expanded matrix below. The release workflows derived the version from the `v1.8.12` tag and attached the generated checksum and manifest files beside each available surface artifact. The release contains 38 assets; iOS was not attached because caller-owned Apple signing and provisioning were not configured.
89
89
 
90
90
  | Surface | Architectures | Artifact naming contract |
91
91
  | --- | --- | --- |
@@ -97,11 +97,11 @@ Version 1.8.12 is prepared to publish the expanded matrix below. The release wor
97
97
  | Container | OCI | `saddle.container.1.8.12.tar.gz` |
98
98
  | Browser extension | Manifest V3 | `saddle.extension.1.8.12.zip` |
99
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.
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 Android manifest records `ci-test-key`, desktop manifests record `unsigned` and the container manifest records `caller-owned`. No state implies production trust.
101
101
 
102
102
  ## 1.8.13 release matrix
103
103
 
104
- Version 1.8.13 keeps the release-tag-derived matrix and adds deterministic retention metadata to generated artifact manifests. The implementation records retention policy and keep/prune decisions but never removes caller-owned files. Final URLs, checksums, sizes and signing states remain pending until the corresponding release workflow completes.
104
+ Version 1.8.13 keeps the release-tag-derived matrix and adds deterministic retention metadata to generated artifact manifests. The implementation records retention policy and keep/prune decisions but never removes caller-owned files. The release contains 38 assets; iOS was not attached because caller-owned Apple signing and provisioning were not configured.
105
105
 
106
106
  | Surface | Architectures | Artifact naming contract |
107
107
  | --- | --- | --- |
@@ -113,4 +113,22 @@ Version 1.8.13 keeps the release-tag-derived matrix and adds deterministic reten
113
113
  | Container | OCI | `saddle.container.1.8.13.tar.gz` |
114
114
  | Browser extension | Manifest V3 | `saddle.extension.1.8.13.zip` |
115
115
 
116
- Each surface also emits `sha256.*.1.8.13`, `manifest.*.1.8.13.json` and, where enabled by the release path, SBOM and provenance metadata. The manifest may additionally carry `retention`, `retentionplan` and `retentionevaluatedat`; these fields are advisory execution decisions and do not imply deletion or publication.
116
+ Each surface also emits `sha256.*.1.8.13`, `manifest.*.1.8.13.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 manifest may additionally carry `retention`, `retentionplan` and `retentionevaluatedat`; these fields are advisory execution decisions and do not imply deletion or publication.
117
+
118
+ ## 1.8.14 release matrix
119
+
120
+ Version 1.8.14 keeps the release-tag-derived matrix and adds post-push container pull and smoke validation. The implementation records retention policy and keep/prune decisions but never removes caller-owned files. The release contains 38 verified assets; iOS remains unavailable until caller-owned Apple signing and provisioning are configured.
121
+
122
+ | Surface | Architectures | Artifact naming contract |
123
+ | --- | --- | --- |
124
+ | Linux desktop browser | x64, arm64 | `saddle.browser.1.8.14.<architecture>.deb`, `.rpm`, `.appimage` |
125
+ | Windows desktop browser | x86, x64, arm64 | `saddle.browser.1.8.14.<architecture>.exe`, `.msi` |
126
+ | macOS desktop browser | x64, arm64 | `saddle.browser.1.8.14.<architecture>.dmg`, `.app.zip` |
127
+ | Android | caller-configured signing | `saddle.apk.1.8.14.apk`, `saddle.aab.1.8.14.aab` |
128
+ | iOS | caller-configured signing and provisioning | `saddle.ipa.1.8.14.ipa`, `saddle.app.1.8.14.app.zip` |
129
+ | Container | OCI | `saddle.container.1.8.14.tar.gz` |
130
+ | Browser extension | Manifest V3 | `saddle.extension.1.8.14.zip` |
131
+
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
+
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.
@@ -46,7 +46,7 @@ Each block follows the same loop:
46
46
  3. Define the smallest transport-neutral contract.
47
47
  4. Implement grouped logic in the domain folder without adding a vendor dependency unless required.
48
48
  5. Add deterministic tests with fake transports and no real credentials.
49
- 6. Update API docs, README claims, changelog and `todo.md`.
49
+ 6. Update API docs, README claims, changelog and `docs/todo.md`.
50
50
  7. Run format, syntax, tests, package and security checks.
51
51
  8. Commit and push the block before starting the next one.
52
52
 
@@ -32,11 +32,39 @@ The public contract uses plain objects and factory functions. The engine never r
32
32
  | contract | responsibility | open choice |
33
33
  |---|---|---|
34
34
  | `storageadapter` | put, get, head, delete, and list artifacts | local, s3 compatible, webdav, hf, kaggle, or another backend |
35
+ | `storagepool` | read verified replicas, write to an explicit quorum, describe capabilities, and produce a repair plan | caller-authorized adapters with explicit priority and no background replication |
35
36
  | `localmemory` | prepare, sync, and cleanup a working set | tmpfs, mmap, sqlite, r2, or a remote bridge |
37
+ | `workingbudget` / `workingadmission` / `bridgeplan` | plan bounded materialization and host-memory operations | caller-owned host adapter; the transport-neutral core never mounts, swaps, or executes a shell command |
38
+ | `providerchain` / `artifacthandoff` | select a declared eligible runner and prepare immutable transfer evidence | caller-authorized provider reports and a caller-owned dispatch or storage adapter |
39
+ | `deliverymanifest` / `verifydelivery` / `pwaplan` | verify immutable transport chunks and describe offline registration requirements | caller-owned CDN or web host; no dynamic import or service-worker registration from the core |
36
40
  | `scheduler` | select the first available provider by stable priority | github, forgejo, gitea, gitlab, hf, kaggle, or custom |
37
41
  | `engine` | coordinate the lifecycle and emit events | library, cli, browser, desktop, mobile, or service |
38
42
  | `validatesession` | accept a versioned session record | browser capture, replay, or external event source |
39
43
 
44
+ `storagepool` is an additive storage contract. It selects members in stable caller-configured priority order, accepts only caller-owned adapters, verifies a returned digest when one is supplied by the caller or manifest, and returns per-member evidence. A quorum write reports partial outcomes and fails when the requested threshold is not met. `repairplan` is declarative: it identifies a source and candidate targets but never starts a background repair, probes an account, or mutates an adapter.
45
+
46
+ `workingadmission` selects serializable candidates against byte and entry budgets without reading data. `bridgeplan` can describe `temporaryfile`, `mmap`, `tmpfs`, `zram`, or `swap` only when a caller declares the capability. A returned `caller-executes` result contains preconditions and cleanup ownership; an unsupported capability is reported without a probe or side effect.
47
+
48
+ `materializationledger` records only validated materialization transitions and produces a `caller-cleans` plan. It does not unlink a file, unmount a volume, modify swap, or delete a remote replica.
49
+
50
+ `magicbytes`, `wasmplan`, `transformationkey`, `transformationcache`, and `executeisolated` define a separate binary boundary. The module classifies verified byte prefixes, plans bounded WASM work, invalidates cache reuse when source, compiler, key, or policy differ, and calls an injected isolated adapter only. It never creates a process, a container, a filesystem mount, or a network connection by itself.
51
+
52
+ `cacheeligibility` rejects reuse for outputs that are unverified, secret-bearing, private, environment-bound, or partial. It reports normalized reasons and never attempts to inspect, upload, or redact an artifact.
53
+
54
+ `archivelimits` and `archiveinspection` validate a caller-provided archive inventory before extraction. The contract rejects excess entry count, nested depth, output bytes, decompression ratio, absolute paths, and traversal paths. `extractarchive` requires an accepted inspection and an injected adapter, so the core neither opens an archive nor writes an extracted file.
55
+
56
+ `providerchain` consumes only explicit provider reports. It rejects unavailable, under-capacity, or capability-incompatible candidates with evidence, chooses the remaining candidate by stable priority, and emits a `caller-dispatches` plan rather than a remote request. `artifacthandoff` requires an artifact digest, size, provider identity, and retention choice before a caller transfers output to storage.
57
+
58
+ `renderdispatch` can serialize an existing dispatch plan only through an injected adapter. It does not post to a forge, create a workflow run, or own an authentication token.
59
+
60
+ `cancellationplan` represents a caller request to cancel a remote run. It deliberately reports the remote state as `unknown` until the selected provider adapter confirms an outcome, and it leaves any compensation decision to the caller.
61
+
62
+ `deliverymanifest` keeps ordered chunks immutable through content type, size, and SHA-256 metadata. `verifydelivery` checks received bytes without evaluating JavaScript or WASM. `pwaplan` only describes scope, offline intent, update policy, and declared service-worker support; the host decides whether to register anything.
63
+
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
+
66
+ `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
+
40
68
  ## execution lifecycle
41
69
 
42
70
  ```text
@@ -1,6 +1,6 @@
1
1
  # Index
2
2
 
3
- Project: **UKA** — computer use agent, sandbox for AI and captcha bypass. Super bot with computational memory. Package `@devthink/saddle`. Domain acquired.
3
+ Project: **UKA** — computer use agent, sandbox for AI and captcha bypass. Super bot with computational memory. Package `@wenathlan/saddle`. Domain acquired.
4
4
 
5
5
  Theme: computer use, bypasses, captcha, sandbox for AI, container for AI, multi-platform bot, storage-to-compute memory transformation.
6
6
 
@@ -30,7 +30,7 @@ Theme: computer use, bypasses, captcha, sandbox for AI, container for AI, multi-
30
30
  | 37 | [deploystrategy.md](./37.deploystrategy.md) | Deploy strategies (Netlify, Vercel, CI/CD, Docker, VM) |
31
31
  | 36 | [computational.memory.md](./36.computational.memory.md) | Storage-to-compute memory transformation system |
32
32
  | 39 | [multi.platform.bot.md](./39.multi.platform.bot.md) | Multi-platform bot (GitHub, GitLab, Forgejo, Gitea, Discord) |
33
- | 40 | [npm.publish.md](./40.npm.publish.md) | NPM package publishing (`@devthink/saddle`) |
33
+ | 40 | [npm.publish.md](./40.npm.publish.md) | NPM package publishing (`@wenathlan/saddle`) |
34
34
  | 46 | [scdnintegration.md](./46.scdnintegration.md) | SCDN integration for assets and deployment |
35
35
  | 44 | [reference.md](./44.reference.md) | Reference index for all saddle documentation |
36
36
  | 33 | [bots.codigo.revisao.md](./33.bots.codigo.revisao.md) | Best AI code review bots (research) |
@@ -1,6 +1,6 @@
1
1
  # 06 Dependencies
2
2
 
3
- Dependency list of the `@devthink/UKA` package, grouped by function. Total: 65 packages (including the dev tooling set). The user asked for "50 to 60, or 60+. Counting 10 more", so this set covers browser automation, ai/vision, sandbox, server, db, storage and validation.
3
+ Dependency list of the `@wenathlan/UKA` package, grouped by function. Total: 65 packages (including the dev tooling set). The user asked for "50 to 60, or 60+. Counting 10 more", so this set covers browser automation, ai/vision, sandbox, server, db, storage and validation.
4
4
 
5
5
  ## Browser automation and mouse (8)
6
6
  1. `playwright` — real brave/chromium automation via cdp.
@@ -396,8 +396,8 @@ OpenGraph (OG) e Twitter Card são metadados usados para social sharing. Menos c
396
396
 
397
397
  <!-- Twitter Card -->
398
398
  <meta name="twitter:card" content="summary_large_image">
399
- <meta name="twitter:site" content="@devthink">
400
- <meta name="twitter:creator" content="@nathlan">
399
+ <meta name="twitter:site" content="@wenathlan">
400
+ <meta name="twitter:creator" content="@nasblor">
401
401
  <meta name="twitter:title" content="Título da Página">
402
402
  <meta name="twitter:description" content="Descrição da Página">
403
403
  <meta name="twitter:image" content="https://example.com/image.jpg">
@@ -868,7 +868,7 @@ console.log(result.siteName);
868
868
 
869
869
  ### turndown 7.2.4 (Padrão)
870
870
 
871
- `turndown` é o conversor HTML→Markdown mais popular. Usado pelo `@devthink/webscrape`.
871
+ `turndown` é o conversor HTML→Markdown mais popular. Usado pelo `@wenathlan/webscrape`.
872
872
 
873
873
  ```ts
874
874
  import TurndownService from 'turndown';