@wenathlan/saddle 2.0.161 → 2.0.163

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/Dockerfile CHANGED
@@ -1,4 +1,4 @@
1
- # saddle 2.0.161 — THE ENGINE CONTAINER FILE
1
+ # saddle 2.0.162 — THE ENGINE CONTAINER FILE
2
2
  #
3
3
  # THE FAMILY CONTAINER DOCTRINE, THE SADDLE SHAPE: one versioned container
4
4
  # per engine, built like the site homes (argan, cadria) build theirs — a
@@ -16,14 +16,18 @@
16
16
  # THE THREE VARIANT PROFILES (the saddle-exclusive law: the only app of
17
17
  # the family that ships three) — select with the target flag:
18
18
  #
19
- # docker build --target max -t saddle:2.0.161 .
20
- # docker build --target balanced -t saddle:2.0.161-balanced .
21
- # docker build --target lite -t saddle:2.0.161-lite .
19
+ # docker build --target max -t saddle:2.0.162 .
20
+ # docker build --target balanced -t saddle:2.0.162-balanced .
21
+ # docker build --target lite -t saddle:2.0.162-lite .
22
22
  #
23
23
  # max — the full profile catalog: the epyc 9965 class, 192 vcpu,
24
24
  # 384 threads, 1024 gib ram plan, the b200 gpu plan x8.
25
25
  # balanced — the threadripper pro 9995wx class, 96 vcpu, 192 threads,
26
- # 512 gib ram plan, the b200 gpu plan x2.
26
+ # 512 gib ram plan, the b200 gpu plan x2. THE DEFAULT
27
+ # TARGET: the plain `docker build -f saddle/Dockerfile .`
28
+ # with no --target answers the balanced stage (the last
29
+ # stage of the file) — the SADDLE_PROFILE lane's documented
30
+ # default — and the publish legs always name their target.
27
31
  # lite — the ryzen 9950x3d class, 16 vcpu, 32 threads, 128 gib
28
32
  # ram plan, the rtx 5090 gpu plan x1.
29
33
  #
@@ -31,22 +35,55 @@
31
35
  # assert), the catalog constants stay the publish matrix's single source,
32
36
  # and every profile ships the same engine graph — the same ninety
33
37
  # modalities, the same console, the same health surface; only the declared
34
- # hardware plan differs.
38
+ # hardware plan differs. Each variant stage re-declares the six plan
39
+ # build-args with its own honest defaults and re-stamps the plan ENV, so a
40
+ # local `--target` leg answers its real hardware plan with no args passed
41
+ # (the publish legs pass the matrix constants per leg and override the
42
+ # defaults — one lane, two honest entries).
35
43
  #
36
- # THE ELEVEN-ARCHITECTURE PLATFORM STANDARD (the pr15b law): every
37
- # profile answers the eleven architectures the container standard names —
38
- # the CONTAINERARCHIDS of saddle/containerarch.ts: x64, arm64, armv7,
39
- # riscv64, ppc64le, s390x, 386, mips64le, loong64, wasm32, wasip1 (the
40
- # wasm pair rides the oci artifact shapes wasm32/wasip1 and wasip1/wasm
41
- # the wasm runtimes consume). The build legs follow the pinned node
42
- # base's honest manifest list — the four linux seats it carries
43
- # (linux/amd64 the native x64 leg; linux/arm64, linux/ppc64le and
44
- # linux/s390x ride qemu emulation in the publish workflow). The seven
45
- # seats the node base does not ship (armv7, riscv64, 386, mips64le,
46
- # loong64 and the wasm pair) answer the standard's honest coded absence
47
- # (ARCH_IMAGE_ABSENT), never a pretended build leg — the same honesty
48
- # law the containerarch table keeps for its own pinned base: a leg
49
- # never claims a manifest the base does not carry.
44
+ # THE ELEVEN-DEVICE BANK the profiles declare against (the exotic law's
45
+ # hardware vocabulary): the quickCatalog of saddle/virtualhardware.json
46
+ # carries exactly eleven virtual devices — seven cpu classes (epyc 9965,
47
+ # epyc 9755, threadripper 7995wx, ryzen 9950x3d, ryzen 9950x3d2, ryzen
48
+ # 9800x3d, xeon 6980p) and four gpu classes (rtx 5090, rtx pro 6000,
49
+ # b200, h100) — and the three profiles stamp their plan (the cpu class,
50
+ # the vcpu/thread counts, the ram plan, the gpu class and count) from
51
+ # that bank; every device stays virtual (the engine presents it, the
52
+ # visitor machine never lends its own).
53
+ #
54
+ # THE GUEST OS LANE the sandbox modalities answer (the owner's nickname
55
+ # law, saddle/docs/ninetymodalities.md): the spec vocabulary boots linux
56
+ # plus the nickname builds — marsh (marshmallow) resolves android,
57
+ # grapenios and grafene os resolve grapheneos, omashi resolves omarchy —
58
+ # and the owner's "v" names no guest os: it answers the languagev
59
+ # compiler seat of the ninety modalities. The container lane itself rides
60
+ # linux (the eleven-architecture standard below); the guest os vocabulary
61
+ # is the sandbox spec surface the console answers, never a host
62
+ # distribution this container installs.
63
+ #
64
+ # THE ELEVEN-ARCHITECTURE PLATFORM STANDARD (the pr15 law): every
65
+ # profile answers the eleven architecture seats the container standard
66
+ # names — the CONTAINERARCHIDS of saddle/containerarch.ts (linux-x64,
67
+ # darwin-arm64, windows-x64, linux-arm64, darwin-x64, windows-arm64,
68
+ # linux-x64-musl, linux-riscv64, wasm32, darwin-arm64-v8,
69
+ # windows-x64-gnu). The build legs follow the container-carried seats
70
+ # the pinned node base honestly answers: the amd64 leg serves linux-x64
71
+ # and linux-x64-musl, the arm64 leg serves linux-arm64, and the arm64/v8
72
+ # leg serves the darwin-arm64-v8 abi seat (the arm64 legs ride qemu
73
+ # emulation in the publish workflow). The linux-riscv64 seat the
74
+ # containerarch standard carries on the bash:5 driver base answers the
75
+ # honest coded absence on this node engine base (the pinned base ships
76
+ # no riscv64 manifest), and the six target seats (the darwin and
77
+ # windows seats and wasm32) answer the standard's honest coded absence
78
+ # (ARCH_TARGET_NOT_CONTAINER), never a pretended build leg — the same
79
+ # honesty law the containerarch table keeps for its own pinned base: a
80
+ # leg never claims a manifest the base does not carry. The base stage
81
+ # declares the TARGETPLATFORM/TARGETARCH automatic build-args (the
82
+ # devthink container's standard arch interface) and stamps the honesty
83
+ # law into the build log with its arch guard: a leg the base carries
84
+ # answers its leg line, a legacy builder without a platform axis answers
85
+ # its documented note, and anything else answers the coded refusal
86
+ # before a heavy step runs.
50
87
  #
51
88
  # THE CONTEXT LAW (the family context fix): this file COPYs from two
52
89
  # trees (saddle/ and the engine-ownership sibling vault/), so every build
@@ -81,7 +118,7 @@ ARG NODE_BASE_DIGEST
81
118
  # ===== stage: solbuild — the locked npm tree and the console spa =====
82
119
  FROM --platform=$BUILDPLATFORM ${NODE_BASE_TAG}@sha256:${NODE_BASE_DIGEST} AS solbuild
83
120
 
84
- ARG SADDLE_VERSION=2.0.161
121
+ ARG SADDLE_VERSION=2.0.162
85
122
 
86
123
  WORKDIR /app
87
124
 
@@ -109,7 +146,17 @@ RUN npm run web:build:pages \
109
146
  # ===== stage: base — the hardened runtime floor every profile shares =====
110
147
  FROM ${NODE_BASE_TAG}@sha256:${NODE_BASE_DIGEST} AS base
111
148
 
112
- ARG SADDLE_VERSION=2.0.161
149
+ ARG SADDLE_VERSION=2.0.162
150
+ # the revision stamp the devthink container carries (DEVTHINK_REVISION
151
+ # there): the publish legs pass the release sha at build time and the
152
+ # revision label below declares the default-unknown local shape.
153
+ ARG SADDLE_REVISION=unknown
154
+ # the automatic platform args (the devthink standard arch interface):
155
+ # the multi-arch node base resolves each leg's platform itself, and the
156
+ # arch guard below reads TARGETARCH to stamp the eleven-architecture
157
+ # law into the build log of every leg.
158
+ ARG TARGETPLATFORM
159
+ ARG TARGETARCH
113
160
  ARG SADDLE_PROFILE=max
114
161
  ARG VHE_PROFILE_CPU="epyc9965"
115
162
  ARG VHE_PROFILE_VCPUS="192"
@@ -123,7 +170,8 @@ LABEL org.opencontainers.image.title="saddle" \
123
170
  org.opencontainers.image.version="${SADDLE_VERSION}" \
124
171
  org.opencontainers.image.licenses="GPL-3.0-only" \
125
172
  org.opencontainers.image.source="https://github.com/wenathlan/devthink" \
126
- org.opencontainers.image.documentation="https://github.com/wenathlan/devthink/tree/main/saddle"
173
+ org.opencontainers.image.documentation="https://github.com/wenathlan/devthink/tree/main/saddle" \
174
+ org.opencontainers.image.revision="${SADDLE_REVISION}"
127
175
 
128
176
  WORKDIR /app
129
177
 
@@ -144,6 +192,26 @@ ENV NODE_ENV=production \
144
192
  SADDLE_PROFILE_GPU=${VHE_PROFILE_GPU} \
145
193
  SADDLE_PROFILE_GPUS=${VHE_PROFILE_GPUS}
146
194
 
195
+ # the arch-leg guard of the eleven-architecture standard: the pinned
196
+ # node base resolves the platform of every leg buildx names, and this
197
+ # echo layer stamps the honesty law into the build log — the two arches
198
+ # the base carries answer their leg line (the amd64 leg serves the
199
+ # linux-x64 and linux-x64-musl seats, the arm64 leg serves the
200
+ # linux-arm64 seat and the darwin-arm64-v8 abi seat through its v8
201
+ # variant), the legacy builder (no platform axis) answers its documented
202
+ # note, and any other arch answers the coded refusal before the heavy
203
+ # steps below could run (buildx itself fails such a leg at base
204
+ # resolution first; the guard keeps the law loud on every builder).
205
+ RUN case "${TARGETARCH:-}" in \
206
+ amd64|arm64) \
207
+ echo "arch leg ${TARGETARCH} of ${TARGETPLATFORM:-<unresolved>}: one of the two arches the pinned node base carries — the legs of the container-carried seats of the eleven-architecture standard (linux-x64 and linux-x64-musl on amd64, linux-arm64 and the darwin-arm64-v8 abi seat on arm64)" ;; \
208
+ "") \
209
+ echo "arch leg unresolved: the legacy builder carries no platform axis; buildkit answers TARGETARCH per leg" ;; \
210
+ *) \
211
+ echo "the eleven-architecture standard answers the ${TARGETARCH} arch with the honest coded absence (ARCH_TARGET_NOT_CONTAINER for the target seats, ARCH_IMAGE_ABSENT for the riscv64 seat the node engine base does not ship): the pinned node base carries no such manifest" >&2; \
212
+ exit 1 ;; \
213
+ esac
214
+
147
215
  COPY --from=solbuild /app/package.json /app/package-lock.json ./
148
216
  RUN apt-get update \
149
217
  && apt-get upgrade -y \
@@ -196,45 +264,123 @@ RUN apt-get update \
196
264
  # the solbuild stage lands it). with the graph closed, node
197
265
  # webserver.ts starts clean; before the fix the container crashed at
198
266
  # boot with module-not-found.
267
+ #
268
+ # The two lazy engine seats ride the same closed graph (the exotic law:
269
+ # the ninety modalities answer real runs inside the container, never the
270
+ # guarded absence): webserver.ts mounts the edge artifact vault through
271
+ # a first-use import of virtual.ts (the guarded loader degrades to null
272
+ # when the module is absent, so a container without it answers no
273
+ # artifact persistence), and edgelandes.ts lazily mounts virtual.ts for
274
+ # its virtual-file, s3 and persistence recipe seats plus tiers.ts for
275
+ # the kernel recipe seat — copying both keeps those seats live inside
276
+ # the container, and their import closures stay inside the set
277
+ # (virtual.ts pulls foundation.ts only; tiers.ts pulls node builtins
278
+ # only).
199
279
  # run the console with: docker run saddle:<version>
200
- COPY --from=solbuild /app/webserver.ts /app/db.ts /app/labels.ts /app/auth.ts /app/mesh.ts /app/sandbox.ts /app/modalityregistry.ts /app/edgeplane.ts /app/workloadlaw.ts /app/foundation.ts /app/edgelandes.ts /app/scriptlanes.ts /app/execution.ts /app/mime.types /app/init.sql /app/schema.prisma ./
280
+ COPY --from=solbuild /app/webserver.ts /app/db.ts /app/labels.ts /app/auth.ts /app/mesh.ts /app/sandbox.ts /app/modalityregistry.ts /app/edgeplane.ts /app/workloadlaw.ts /app/foundation.ts /app/edgelandes.ts /app/scriptlanes.ts /app/execution.ts /app/virtual.ts /app/tiers.ts /app/mime.types /app/init.sql /app/schema.prisma ./
201
281
  # the label store of the console stack: labels.ts (pulled by db.ts)
202
282
  # resolves ../vault/labelstore.ts at /vault - the same family context
203
283
  # fix the solbuild stage applies.
204
284
  COPY --from=solbuild /vault/labelstore.ts /vault/labelstore.ts
205
285
  COPY --from=solbuild /out/spa ./
206
286
 
287
+ # the writable state home of the engine console (the vault engine
288
+ # container's /app/data pattern): db.ts resolves the sqlite store at
289
+ # import time (SADDLE_DB, else ./saddle.db under the working directory)
290
+ # and every directory the COPY chain staged stays root-owned, so the
291
+ # unprivileged node user needs a home it owns before the database file
292
+ # can open — without it the console crashed at boot on the sqlite
293
+ # cantopen refusal. An operator pins the persistent volume here; the
294
+ # engine creates the store on first boot.
295
+ RUN mkdir -p /app/data && chown -R node:node /app/data
296
+
207
297
  USER node
208
298
 
209
299
  # the console service doors: the webserver answers the engine api and the
210
300
  # staged spa on the saddle port (the source-is-library law runs the .ts
211
- # graph natively - node 26 strips the types, zero npm dependencies).
301
+ # graph natively - node 26 strips the types, zero npm dependencies), the
302
+ # port pin keeps the webserver's random-port fallback from ever
303
+ # answering, and the sqlite store opens under the writable state home
304
+ # above.
212
305
  ENV SADDLE_PORT=8080 \
213
- SADDLE_HOST=0.0.0.0
306
+ SADDLE_HOST=0.0.0.0 \
307
+ SADDLE_DB=/app/data/saddle.db
214
308
 
215
309
  EXPOSE 8080
216
310
 
217
- # the health probe rides the public /health route the webserver answers
218
- # (node fetch, zero wget dependency on the slim debian base; the callback
219
- # spells function() — no arrow, no equal sign — so the dockle CIS-DI-0010
220
- # heuristic never reads a credential pair into the recorded healthcheck).
221
- HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 CMD ["node", "-e", "fetch('http://127.0.0.1:8080/health').then(function(r){if(!r.ok)process.exit(1)}).catch(function(){process.exit(1)})"]
311
+ # the health probe rides the PUBLIC /api/v1/health route the webserver
312
+ # answers (the engine's own health surface: the ok flag, the version, the
313
+ # db healthcheck — never the spa shell the extensionless /health path
314
+ # serves, which would answer 200 html even with the engine sealed). The
315
+ # port follows SADDLE_PORT with the 8080 fallback (node fetch, zero wget
316
+ # dependency on the slim debian base; the callback spells function() — no
317
+ # arrow, no equal sign — so the dockle CIS-DI-0010 heuristic never reads
318
+ # a credential pair into the recorded healthcheck).
319
+ HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 CMD ["node", "-e", "fetch('http://127.0.0.1:'+(process.env.SADDLE_PORT||8080)+'/api/v1/health').then(function(r){return r.json()}).then(function(j){if(!j.ok)process.exit(1)}).catch(function(){process.exit(1)})"]
222
320
 
223
321
  ENTRYPOINT ["node", "webserver.ts"]
224
322
 
225
323
  # ===== the variant profile targets (the saddle-exclusive three) =====
226
- # max — the full profile catalog (the default the plain `docker build`
227
- # answers when no target is named is the last stage of the file: lite
228
- # below; the publish lanes always name their target).
229
- FROM base AS max
230
- ENV SADDLE_PROFILE=max
324
+ # Every variant stage re-declares the six plan build-args with its own
325
+ # honest defaults and re-stamps the plan ENV: a local `--target` leg
326
+ # answers its real hardware plan with no args passed (the pre-fix file
327
+ # stamped the max plan under every profile name when the caller passed
328
+ # no VHE_PROFILE_* args), and the publish legs pass the matrix constants
329
+ # per leg and override the defaults — the publish matrix stays the single
330
+ # source of the catalog either way.
231
331
 
232
- # balanced — the threadripper pro class, the b200 plan x2.
233
- FROM base AS balanced
234
- ENV SADDLE_PROFILE=balanced
332
+ # max — the full profile catalog: the epyc 9965 class, 192 vcpu, 384
333
+ # threads, 1024 gib ram, the b200 gpu plan x8 (the bare version tag the
334
+ # registry lane answers).
335
+ FROM base AS max
336
+ ARG VHE_PROFILE_CPU="epyc9965"
337
+ ARG VHE_PROFILE_VCPUS="192"
338
+ ARG VHE_PROFILE_THREADS="384"
339
+ ARG VHE_PROFILE_RAM_GB="1024"
340
+ ARG VHE_PROFILE_GPU="b200"
341
+ ARG VHE_PROFILE_GPUS="8"
342
+ ENV SADDLE_PROFILE=max \
343
+ SADDLE_PROFILE_CPU=${VHE_PROFILE_CPU} \
344
+ SADDLE_PROFILE_VCPUS=${VHE_PROFILE_VCPUS} \
345
+ SADDLE_PROFILE_THREADS=${VHE_PROFILE_THREADS} \
346
+ SADDLE_PROFILE_RAM_GB=${VHE_PROFILE_RAM_GB} \
347
+ SADDLE_PROFILE_GPU=${VHE_PROFILE_GPU} \
348
+ SADDLE_PROFILE_GPUS=${VHE_PROFILE_GPUS}
235
349
 
236
- # lite — the ryzen class, the rtx 5090 plan x1 (the default target: the
237
- # plain `docker build -f saddle/Dockerfile .` with no --target answers
238
- # lite, the lightest leg the family carries).
350
+ # lite — the ryzen 9950x3d class, 16 vcpu, 32 threads, 128 gib ram, the
351
+ # rtx 5090 gpu plan x1 (the -lite suffix tag the registry lane answers).
239
352
  FROM base AS lite
240
- ENV SADDLE_PROFILE=lite
353
+ ARG VHE_PROFILE_CPU="ryzen9950x3d"
354
+ ARG VHE_PROFILE_VCPUS="16"
355
+ ARG VHE_PROFILE_THREADS="32"
356
+ ARG VHE_PROFILE_RAM_GB="128"
357
+ ARG VHE_PROFILE_GPU="rtx5090"
358
+ ARG VHE_PROFILE_GPUS="1"
359
+ ENV SADDLE_PROFILE=lite \
360
+ SADDLE_PROFILE_CPU=${VHE_PROFILE_CPU} \
361
+ SADDLE_PROFILE_VCPUS=${VHE_PROFILE_VCPUS} \
362
+ SADDLE_PROFILE_THREADS=${VHE_PROFILE_THREADS} \
363
+ SADDLE_PROFILE_RAM_GB=${VHE_PROFILE_RAM_GB} \
364
+ SADDLE_PROFILE_GPU=${VHE_PROFILE_GPU} \
365
+ SADDLE_PROFILE_GPUS=${VHE_PROFILE_GPUS}
366
+
367
+ # balanced — the threadripper pro 9995wx class, 96 vcpu, 192 threads,
368
+ # 512 gib ram, the b200 gpu plan x2 (the -balanced suffix tag the
369
+ # registry lane answers). THE DEFAULT TARGET: the last stage of the
370
+ # file — the plain `docker build -f saddle/Dockerfile .` with no
371
+ # --target answers the balanced profile (the SADDLE_PROFILE lane's
372
+ # documented default).
373
+ FROM base AS balanced
374
+ ARG VHE_PROFILE_CPU="threadripperpro9995wx"
375
+ ARG VHE_PROFILE_VCPUS="96"
376
+ ARG VHE_PROFILE_THREADS="192"
377
+ ARG VHE_PROFILE_RAM_GB="512"
378
+ ARG VHE_PROFILE_GPU="b200"
379
+ ARG VHE_PROFILE_GPUS="2"
380
+ ENV SADDLE_PROFILE=balanced \
381
+ SADDLE_PROFILE_CPU=${VHE_PROFILE_CPU} \
382
+ SADDLE_PROFILE_VCPUS=${VHE_PROFILE_VCPUS} \
383
+ SADDLE_PROFILE_THREADS=${VHE_PROFILE_THREADS} \
384
+ SADDLE_PROFILE_RAM_GB=${VHE_PROFILE_RAM_GB} \
385
+ SADDLE_PROFILE_GPU=${VHE_PROFILE_GPU} \
386
+ SADDLE_PROFILE_GPUS=${VHE_PROFILE_GPUS}
package/README.md CHANGED
@@ -31,7 +31,7 @@ domain modules land beside the saddle domains:
31
31
  | `media.ts`, `render.ts`, `quantum.ts`, `tiers.ts` | media pipeline, GPU registry, quantum simulation, tier policy |
32
32
  | `security.ts`, `alternatives.ts` | hardening gates and the alternative-stack catalog |
33
33
  | `index.html`, `App.tsx`, `sol/` | the single SPA shell and the Sol theme (one tsx app with one stylesheet per theme) |
34
- | `server.ts`, `sandbox.ts` | the zero-dependency self-hosted API of the 2.0.161 grand-merge envelope (`node server.ts`; the api answers its version at `/api/v1/health`) and the browser-pure engine port |
34
+ | `server.ts`, `sandbox.ts` | the zero-dependency self-hosted API of the 2.0.163 grand-merge envelope (`node server.ts`; the api answers its version at `/api/v1/health`) and the browser-pure engine port |
35
35
  | `vercel.json`, `netlify.toml` | the platform deploy adapters beside the surface they publish (the caddy ghost stays out of the tree) |
36
36
  | `specs/*` package exports | processors, gpus, cores, boards and the qemu/mttg/passage/docker envelopes |
37
37
 
package/biome.jsonc CHANGED
File without changes
package/distribution.ts CHANGED
@@ -366,7 +366,20 @@ export async function writeTargetPlan(target: string, format = target, output =
366
366
  return filename;
367
367
  }
368
368
 
369
- if (process.argv[1]?.endsWith("targetcli.js") || process.argv[1]?.endsWith("targetcli.ts")) {
369
+ /** The cli entry seat: argv[1] only exists under the node runtime — the
370
+ * family browser bridges import this module through the modes ladder for
371
+ * the publish contracts, and the raw process.argv[1] read throws at
372
+ * import time in the browser (the blank-window era of the forge and
373
+ * foundry seats). the guard answers undefined everywhere but node. */
374
+ const cliseat =
375
+ typeof process === "object" &&
376
+ process !== null &&
377
+ Array.isArray(process.argv) &&
378
+ typeof process.argv[1] === "string"
379
+ ? process.argv[1]
380
+ : undefined;
381
+
382
+ if (cliseat?.endsWith("targetcli.js") || cliseat?.endsWith("targetcli.ts")) {
370
383
  const [, , target = "library", format = target, output = "build/targets"] = process.argv;
371
384
  writeTargetPlan(target, format, output).then((filename) => console.log(`target plan: ${filename}`)).catch((error) => { console.error(error.message); process.exitCode = 1; });
372
385
  }
@@ -511,7 +524,7 @@ function normalizeupdatedat(value) { const normalized = Number(value ?? 0); if (
511
524
 
512
525
  function comparefreshness(left, right) { return right.updatedat - left.updatedat || right.bytes - left.bytes || left.name.localeCompare(right.name); }
513
526
 
514
- if (process.argv[1] === fileURLToPath(import.meta.url)) createassets(parsearguments(process.argv.slice(2))).then(({ output }) => { console.log(`release assets: ${output}`); }).catch((error) => { console.error(error.message); process.exitCode = 1; });
527
+ if (cliseat !== undefined && cliseat === fileURLToPath(import.meta.url)) createassets(parsearguments(process.argv.slice(2))).then(({ output }) => { console.log(`release assets: ${output}`); }).catch((error) => { console.error(error.message); process.exitCode = 1; });
515
528
 
516
529
  /* ════════════════════════════════════════════════════════════════════ */
517
530
  /* Section 9: release/verify.ts — Release verification checks artifact digests, manifest consistency and */
@@ -613,7 +626,7 @@ function verifyparsearguments(argumentslist) {
613
626
  return options;
614
627
  }
615
628
 
616
- if (process.argv[1] === fileURLToPath(import.meta.url)) verifyassets(verifyparsearguments(process.argv.slice(2))).then((result) => { console.log(JSON.stringify(result)); }).catch((error) => { console.error(error.message); process.exitCode = 1; });
629
+ if (cliseat !== undefined && cliseat === fileURLToPath(import.meta.url)) verifyassets(verifyparsearguments(process.argv.slice(2))).then((result) => { console.log(JSON.stringify(result)); }).catch((error) => { console.error(error.message); process.exitCode = 1; });
617
630
 
618
631
  /* ════════════════════════════════════════════════════════════════════ */
619
632
  /* Section 10: release/evidence.ts — Release evidence evaluates caller-supplied metadata without fetching, signing, */
@@ -0,0 +1,9 @@
1
+ # Saddle acceptable use policy
2
+
3
+ Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, andraneris, and contributors.
4
+
5
+ The Saddle source code is licensed under the GNU General Public License version 3.0 only. This policy governs hosted services, credentials, runners and integrations operated with Saddle; it does not reduce rights granted by the GPL.
6
+
7
+ Operators must use Saddle lawfully, respect the terms of each connected provider, protect credentials, and obtain authorization before accessing systems or data. Operators must not use Saddle to distribute malware, evade access controls, attack third-party systems, violate privacy, infringe intellectual property, or exceed provider quotas.
8
+
9
+ The project may suspend a hosted integration or reject an unsafe request when necessary to protect users, providers or the public. These operational controls do not restrict lawful use, modification or redistribution of the GPL-licensed software itself.
@@ -0,0 +1,16 @@
1
+ # Saddle authors
2
+
3
+ Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, andraneris, and contributors.
4
+
5
+ The project authors and historical copyright holders are:
6
+
7
+ | Contributor | Role |
8
+ |---|---|
9
+ | devthink | Historical author and project contributor |
10
+ | nathlan | Project owner and maintainer |
11
+ | iakadion | Historical author and project contributor |
12
+ | nathu filho | Historical author and project contributor |
13
+ | allan neris | Historical author and project contributor |
14
+ | andraneris | Historical author and project contributor |
15
+
16
+ Saddle is maintained at https://github.com/wenathlan/saddle and distributed under GPL-3.0-only. Contributors retain copyright in their original contributions unless a separate written agreement states otherwise.
@@ -0,0 +1,16 @@
1
+ ---
2
+ name: Bug Report
3
+ about: Report a reproducible issue in Saddle
4
+ title: "[BUG]"
5
+ labels: bug
6
+ ---
7
+
8
+ # Saddle is licensed under GPL-3.0-only. Please do not include secrets or private data.
9
+
10
+ **Describe the issue:**
11
+
12
+ **File / Line:**
13
+
14
+ **Expected behavior:**
15
+
16
+ **Additional context:**
package/docs/cla.md ADDED
@@ -0,0 +1,9 @@
1
+ # Saddle contributor terms
2
+
3
+ Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, andraneris, and contributors.
4
+
5
+ Saddle does not require an exclusive proprietary assignment of contributions. A contributor submitting a change represents that the contributor has the right to submit it and grants the project the permissions necessary to review, merge, reproduce, distribute and maintain the contribution under GPL-3.0-only.
6
+
7
+ The contributor keeps copyright in the contribution. The project may include the contribution in source and binary releases under GPL-3.0-only and may preserve attribution and required notices.
8
+
9
+ If a separate contributor agreement is required for a particular institutional or commercial arrangement, it must be reviewed and accepted in writing before the contribution is merged. This file is not a replacement for legal advice or a bespoke agreement.
@@ -0,0 +1,9 @@
1
+ # Saddle code of conduct
2
+
3
+ Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, andraneris, and contributors.
4
+
5
+ The Saddle community follows a respectful, inclusive and technically constructive standard. Participants communicate in good faith, explain technical concerns with evidence, respect different backgrounds and experience levels, and protect private information.
6
+
7
+ Unacceptable conduct includes harassment, discrimination, threats, deliberate disclosure of private information, malicious interference, impersonation, spam, and behavior that violates applicable law or the project policies.
8
+
9
+ Project maintainers may moderate discussions, remove harmful content, or restrict participation when necessary. Reports should be sent through the repository security or support channels, with private disclosure used for security-sensitive matters.
@@ -0,0 +1,9 @@
1
+ # Contributing to Saddle
2
+
3
+ Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, andraneris, and contributors.
4
+
5
+ Saddle welcomes contributions that improve the library, its adapters, target builds, documentation, tests and security posture. Contributions are licensed under GPL-3.0-only unless a different compatible arrangement is agreed in writing before acceptance.
6
+
7
+ A pull request should explain the change, include focused verification, preserve the root-first architecture and avoid credentials, private data or generated artifacts. Security vulnerabilities must use the private process in `SECURITY.md` rather than a public issue.
8
+
9
+ Maintainers may review, request changes, decline or merge a contribution. No contributor is required to transfer exclusive ownership of their work merely to submit a pull request.
@@ -0,0 +1,7 @@
1
+ # Saddle copyright notice
2
+
3
+ Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, andraneris, and contributors.
4
+
5
+ The Saddle source code and original documentation are distributed under the GNU General Public License version 3.0 only. The complete license text is kept in the root `LICENSE` file and must be distributed with covered copies.
6
+
7
+ Copyright ownership remains with the respective authors and contributors. Copyright ownership does not remove the rights granted by GPL-3.0-only. The Saddle name, logos and other marks are covered separately by `trademarkpolicy.md`.
@@ -0,0 +1,7 @@
1
+ # Saddle disclaimer
2
+
3
+ Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, andraneris, and contributors.
4
+
5
+ Saddle is provided under GPL-3.0-only and without warranty to the maximum extent permitted by law. The project does not guarantee availability, correctness, security, compatibility, performance or fitness for a particular purpose.
6
+
7
+ Operators remain responsible for reviewing source code, configuring integrations, protecting credentials, validating outputs and complying with the terms of connected services. Nothing in this disclaimer removes rights or obligations established by GPL-3.0-only.
package/docs/eula.md ADDED
@@ -0,0 +1,7 @@
1
+ # Saddle end user license notice
2
+
3
+ Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, and contributors.
4
+
5
+ Saddle source code, scripts and covered binaries are licensed under the GNU General Public License version 3.0 only. The root `LICENSE` file controls the copyright license and grants the permissions described there.
6
+
7
+ This notice does not add a proprietary restriction to GPL-licensed code. Separate terms may apply to a hosted service, a third-party provider, a trademark, or data supplied by an operator. Those terms cannot remove rights granted by the GPL for the covered source code.
@@ -0,0 +1,17 @@
1
+ SADDLE - EXPORT CONTROL NOTICE
2
+ Version 1.0, August 2026
3
+
4
+ Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, andraneris, and contributors. Licensed under GPL-3.0-only.
5
+ Project: saddle
6
+
7
+ Project Saddle is open-source software under GPL-3.0-only. Export,
8
+ re-export and sanctions laws may still apply to a particular operator,
9
+ destination, service or use case.
10
+
11
+ You agree not to export, re-export, or transfer Project saddle to any
12
+ prohibited destination, entity, or person, or for any prohibited end-use.
13
+
14
+ Operators are responsible for checking applicable rules before
15
+ transferring source, binaries, credentials or data across borders.
16
+
17
+ END OF EXPORT CONTROL NOTICE
package/docs/features.md CHANGED
File without changes
@@ -0,0 +1,9 @@
1
+ # Saddle governance
2
+
3
+ Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, and contributors.
4
+
5
+ Saddle is maintained as a library-first open-source project under GPL-3.0-only. The repository owner coordinates releases, security response, release approvals and provider integrations. Contributors retain copyright in their contributions unless a separate written agreement states otherwise.
6
+
7
+ Changes should include focused reasoning, tests where practical, documentation for public behavior, and review of security-sensitive workflows. Release artifacts must be traceable to repository source and generated by the documented automation.
8
+
9
+ Technical governance is recorded in the repository plans and workflow files. This document describes project responsibility and does not override the GPL or a contributor's applicable rights.
File without changes
package/docs/notice.md ADDED
@@ -0,0 +1,7 @@
1
+ # Saddle notice
2
+
3
+ Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, and contributors.
4
+
5
+ Saddle is open-source software licensed under the GNU General Public License version 3.0 only. The source code, generated artifacts and documentation may include work from third-party projects; each third-party component remains subject to its own license.
6
+
7
+ The project name and logos are trademarks of their respective owner. The trademark policy does not restrict rights granted by GPL-3.0-only to the source code.
File without changes
File without changes
@@ -0,0 +1,9 @@
1
+ # Saddle privacy policy
2
+
3
+ Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, and contributors.
4
+
5
+ The core Saddle library does not intentionally collect telemetry or transmit data without an operator-requested integration. Browser, scraper, storage and runner features can access data only when the operator configures and invokes them. Operators must review the configuration and the privacy policy of every connected provider.
6
+
7
+ The repository itself is hosted by third-party services such as GitHub. Those services process requests, account data, logs and cookies under their own policies. A deployment that adds analytics, account data, logs or external storage must document that behavior and provide the controls required by applicable law.
8
+
9
+ Privacy questions and reports should use the repository support channel. Security-sensitive reports must follow `SECURITY.md`.
@@ -0,0 +1,13 @@
1
+ <!-- Saddle pull request template -->
2
+
3
+ # Description
4
+
5
+ ## Type of change
6
+
7
+ ## Verification
8
+
9
+ - [ ] The change preserves GPL-3.0-only metadata and required notices.
10
+ - [ ] Tests or a reason for not adding tests are included.
11
+ - [ ] Security-sensitive behavior and workflow changes were reviewed.
12
+ - [ ] No credentials, private data or generated build output was added.
13
+ - [ ] Public documentation was updated when behavior changed.
@@ -0,0 +1,7 @@
1
+ # Saddle support
2
+
3
+ Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, and contributors.
4
+
5
+ Saddle is open-source software under GPL-3.0-only. Questions about installation, configuration, usage and reproducible failures should include the version, target, relevant logs and a minimal reproduction without credentials or private data.
6
+
7
+ Security reports must use the private process in `SECURITY.md`. Requests involving a third-party provider should also include the provider and the operator-controlled configuration. Community support is provided on a best-effort basis and does not create a warranty, service-level agreement or maintenance obligation.
@@ -0,0 +1,9 @@
1
+ # Saddle terms and conditions
2
+
3
+ Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, and contributors.
4
+
5
+ These terms describe access to the Saddle repository, documentation, releases and project services. The source code license is the GNU General Public License version 3.0 only; the root `LICENSE` file controls permissions to copy, modify, run and redistribute covered works.
6
+
7
+ Users must comply with applicable law, third-party provider terms, the acceptable use policy, and the security policy. Users must not use a configured integration to access data or systems without authorization, expose credentials, distribute malware, or evade safety controls.
8
+
9
+ The repository and project services are provided without warranty to the maximum extent permitted by law. Separate provider terms apply to infrastructure, accounts, data and hosted services. These terms do not add restrictions to GPL-licensed source code.
@@ -0,0 +1,9 @@
1
+ # Saddle terms of use
2
+
3
+ Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, and contributors.
4
+
5
+ Saddle may be used, modified and redistributed under GPL-3.0-only. Use of a connected account, runner, storage provider, browser session or hosted service remains subject to the operator's authorization and that provider's terms.
6
+
7
+ Users must protect secrets, respect privacy, avoid unauthorized access, and validate outputs before relying on them. Feedback may be used by the project under the applicable copyright permissions; submitting feedback does not transfer unrelated rights in the contributor's code.
8
+
9
+ The project is provided as-is without a warranty or service-level commitment. The GPL and applicable law control where this document conflicts with a covered source license.
@@ -0,0 +1,19 @@
1
+ # Saddle third-party notices
2
+
3
+ Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, and contributors.
4
+
5
+ Saddle includes or builds with third-party components. Their individual licenses remain in force and are not replaced by GPL-3.0-only. Package manifests, lockfiles and generated license inventories are the source of truth for the exact dependency set of each release.
6
+
7
+ When a component requires a notice, attribution or source offer, the release process must include it. A future dependency should be recorded with its name, version, license identifier, copyright notice and source URL.
8
+
9
+ ## Merged lineage notice — e2ugh (the 2.0.0 grand merge)
10
+
11
+ The e2ugh virtual-hardware engine (the private repository that merged into
12
+ saddle at 2.0.0) was originally published under the MIT license
13
+ ("Copyright (c) 2026 wenathlan"). The merged repository relicenses the
14
+ combined work under GPL-3.0-only; the original MIT grant of the e2ugh
15
+ sources is acknowledged here so the lineage's license history stays
16
+ recorded: every file, feature and document of e2ugh carries into saddle
17
+ (readapted to the saddle product metadata) with the e2ugh release history
18
+ preserved verbatim in the CHANGELOG.md lineage sections and the engine
19
+ reference preserved at docs/e2ughengine.md.
@@ -0,0 +1,7 @@
1
+ # Saddle trademark policy
2
+
3
+ Copyright (C) 2026 devthink, nathlan, iakadion, nathu filho, allan neris, and contributors.
4
+
5
+ The names “Saddle” and “Saddle Browser”, together with associated logos and marks, identify the project and its official releases. GPL-3.0-only grants rights to the source code; it does not grant permission to use project marks in a way that suggests endorsement, affiliation or official distribution.
6
+
7
+ Forks and modified distributions should use distinct names and branding where necessary to avoid confusion. Descriptive references to compatibility, origin or modification are permitted when they are accurate and do not imply sponsorship.
File without changes