@wenathlan/saddle 2.1.7 → 2.1.8

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/modes.ts ADDED
@@ -0,0 +1,151 @@
1
+ /**
2
+ * modes.ts — target mode resolution and host-neutral deployment contracts.
3
+ *
4
+ * This file is the v2.0.0 grand-merge consolidation of the former nested
5
+ * folders of the repository (modes) into the single
6
+ * root-level domain file of the saddle family standard: one optimized
7
+ * TypeScript file per correlated domain, ordinal sections, JSDoc on every
8
+ * block, intra-domain imports dissolved, cross-domain imports rewritten to
9
+ * ./<domain>.js. Every capability of every source file is preserved here;
10
+ * the pure re-export barrels (none in this domain) folded their surface into this file directly.
11
+ */
12
+
13
+
14
+
15
+ /* ════════════════════════════════════════════════════════════════════ */
16
+ /* Section 1: modes/modes.ts — mode profiles describe paired operation surfaces without changing engine contracts. */
17
+ /* ════════════════════════════════════════════════════════════════════ */
18
+ /**
19
+ * mode profiles describe paired operation surfaces without changing engine contracts.
20
+ */
21
+ const names = ["computer", "library", "application", "browser", "desktop", "mobile", "extension", "cli", "binary", "internet", "physicalfile", "vectorfile", "visible", "headless"];
22
+
23
+ export function modeprofile(options = {}) {
24
+ const enabled = new Set(options.enabled ?? ["library", "cli", "binary"]);
25
+ return Object.fromEntries(names.map((name) => [name, { name, enabled: enabled.has(name), paired: Boolean(options.paired?.includes(name)) }]));
26
+ }
27
+
28
+ export function librarymode(factory) { return { name: "library", start: factory, stop: async () => undefined }; }
29
+ export function climode(run) { return { name: "cli", run }; }
30
+ export function binarymode(run) { return { name: "binary", run }; }
31
+ export function browsermode(adapter) { return { name: "browser", adapter }; }
32
+ export function headlessmode(adapter) { return { name: "headless", adapter }; }
33
+ export function computemode(adapter) { return { name: "computer", adapter }; }
34
+
35
+ /* ════════════════════════════════════════════════════════════════════ */
36
+ /* Section 2: modes/matrix.ts — mode matrix keeps supported execution choices in one grouped contract. */
37
+ /* ════════════════════════════════════════════════════════════════════ */
38
+ /**
39
+ * mode matrix keeps supported execution choices in one grouped contract.
40
+ */
41
+ export const modeaxes = Object.freeze({
42
+ execution: ["library", "application", "browser", "desktopapp", "mobileapp", "extension", "cli", "binary", "computer", "internet"],
43
+ runtime: ["node", "browser", "deno", "bun", "worker", "unknown"],
44
+ memory: ["internal", "external", "physical", "vectorized", "library"],
45
+ file: ["internal", "external", "physical", "vector"],
46
+ dependency: ["internal", "external", "dev"],
47
+ visibility: ["visible", "headless"],
48
+ pair: ["without", "with"]
49
+ });
50
+
51
+ export const operationmodes = Object.freeze(modeaxes.execution.flatMap((execution) => modeaxes.pair.map((pair) => `${execution}${pair}`)));
52
+
53
+ /** Returns true when the matrix contains the requested axis value. */
54
+ export function validatemode(axis, value) { return Boolean(modeaxes[axis]?.includes(value)); }
55
+
56
+ /** Returns a serializable snapshot for documentation and diagnostics. */
57
+ export function modecatalog() { return { axes: Object.fromEntries(Object.entries(modeaxes).map(([key, values]) => [key, [...values]])), operationmodes: [...operationmodes] }; }
58
+
59
+ /* ════════════════════════════════════════════════════════════════════ */
60
+ /* Section 3: modes/resolve.ts — mode resolver selects open defaults while preserving every caller choice. */
61
+ /* ════════════════════════════════════════════════════════════════════ */
62
+ /**
63
+ * mode resolver selects open defaults while preserving every caller choice.
64
+ */
65
+
66
+ /** Resolves an execution profile without starting a process or opening a socket. */
67
+ export function resolvemode(options = {}) {
68
+ const profile = {
69
+ execution: options.execution ?? "library",
70
+ runtime: options.runtime ?? "unknown",
71
+ memory: options.memory ?? "internal",
72
+ file: options.file ?? "internal",
73
+ dependency: options.dependency ?? "internal",
74
+ visibility: options.visibility ?? "headless",
75
+ pair: options.pair ?? "without"
76
+ };
77
+ for (const [axis, value] of Object.entries(profile)) if (!validatemode(axis, value)) throw new TypeError(`unsupported mode ${axis}:${value}`);
78
+ return { ...profile, capabilities: modecapabilities(profile) };
79
+ }
80
+
81
+ /** Returns stable capabilities for adapters and diagnostics. */
82
+ export function modecapabilities(profile) {
83
+ return {
84
+ library: profile.execution === "library" || profile.execution === "application",
85
+ browser: profile.execution === "browser" || profile.execution === "extension" || profile.runtime === "browser" || profile.runtime === "worker",
86
+ cli: profile.execution === "cli" || profile.execution === "binary",
87
+ physicalmemory: profile.memory === "physical",
88
+ vectorizedmemory: profile.memory === "vectorized",
89
+ externalmemory: profile.memory === "external",
90
+ externalfile: profile.file === "external",
91
+ externaldependency: profile.dependency === "external",
92
+ visible: profile.visibility === "visible"
93
+ };
94
+ }
95
+
96
+ /** Returns a stable cross-runtime capability report without starting infrastructure. */
97
+ export function capabilityreport(options = {}) {
98
+ const overrides = { runtime: options.runtime ?? "unknown", memory: options.memory ?? "internal", file: options.file ?? "internal", dependency: options.dependency ?? "internal", visibility: options.visibility ?? "headless", pair: options.pair ?? "without" };
99
+ const profiles = modeaxes.execution.map((execution) => {
100
+ const profile = resolvemode({ ...overrides, execution });
101
+ return { mode: execution, capabilities: profile.capabilities, profile };
102
+ });
103
+ return { version: 1, axes: Object.fromEntries(Object.entries(modeaxes).map(([key, values]) => [key, [...values]])), overrides, profiles, infrastructure: { host: "caller-owned", port: "caller-owned", credentials: "caller-owned", provider: "caller-owned" } };
104
+ }
105
+
106
+ /** Applies one profile to a caller supplied operation. */
107
+ export async function withmode(options, operation) { if (typeof operation !== "function") throw new TypeError("mode operation is required"); return operation(resolvemode(options)); }
108
+
109
+
110
+ /* ════════════════════════════════════════════════════════════════════ */
111
+ /* Section 4: modes/deploy.ts — deploy surface exposes artifact planning without performing provider mutations. */
112
+ /* ════════════════════════════════════════════════════════════════════ */
113
+ /**
114
+ * deploy surface exposes artifact planning without performing provider mutations.
115
+ */
116
+ export { publishplan, registrymanifest } from "./distribution.ts";
117
+ /* the packaging surface pair (surfacemanifest, surfacebundle) moved to
118
+ * devthink with the automation domain (the saddle ownership law, wave a,
119
+ * actions 108-112 — the deploy surface keeps the artifact planning pair
120
+ * the engine owns). */
121
+
122
+ /* ════════════════════════════════════════════════════════════════════ */
123
+ /* Section 5: modes/targets.ts — target profiles keep platform packaging open and describe capability boundaries. */
124
+ /* ════════════════════════════════════════════════════════════════════ */
125
+ /**
126
+ * target profiles keep platform packaging open and describe capability boundaries.
127
+ */
128
+ export const targetprofiles = Object.freeze({
129
+ application: { runtime: "caller", entry: "distpackage/index.js", capabilities: ["memory", "storage", "network"], formats: ["zip", "tarball"] },
130
+ computer: { runtime: "node", entry: "distpackage/index.js", capabilities: ["memory", "storage", "runner"], formats: ["node", "bun", "deno", "singlefile"] },
131
+ desktopapp: { runtime: "tauri", entry: "desktop/src-tauri", capabilities: ["memory", "file", "visible"], formats: ["appimage", "deb", "rpm", "snap", "flatpak", "dmg", "pkg", "exe", "msi", "msix"] },
132
+ mobileapp: { runtime: "capacitor", entry: "index.html", capabilities: ["memory", "network", "visible"], formats: ["apk", "aab", "ipa"] },
133
+ android: { runtime: "capacitor", entry: "android", capabilities: ["memory", "network", "visible"], formats: ["apk", "aab"] },
134
+ ios: { runtime: "capacitor", entry: "ios", capabilities: ["memory", "network", "visible"], formats: ["ipa"] },
135
+ cli: { runtime: "node", entry: "distpackage/cli/main.js", capabilities: ["memory", "storage", "network"], formats: ["node", "bun", "deno", "singlefile", "exe", "deb", "rpm"] },
136
+ binary: { runtime: "caller", entry: "distpackage/cli/main.js", capabilities: ["memory", "storage", "runner"], formats: ["sea", "singlefile", "wasm"] },
137
+ browser: { runtime: "tauri", entry: "desktop/src-tauri", capabilities: ["memory", "network", "visible"], formats: ["html", "pwa", "wasm", "appimage", "deb", "rpm", "dmg", "exe", "msi"] },
138
+ extension: { runtime: "browser", entry: "distpackage/extension/index.js", capabilities: ["browser", "network", "visible"], formats: ["crx", "xpi", "safariextz"] },
139
+ internet: { runtime: "caller", entry: "distpackage/index.js", capabilities: ["network", "webhook", "api"], formats: ["http", "websocket", "grpc", "rest"] },
140
+ web: { runtime: "browser", entry: "index.html", capabilities: ["network", "visible"], formats: ["html", "pwa", "ssg", "ssr", "wasm"] },
141
+ libreoffice: { runtime: "caller", entry: "distpackage/index.js", capabilities: ["file", "network"], formats: ["oxt", "zip"] },
142
+ mcp: { runtime: "caller", entry: "distpackage/adapters/mcpserver.js", capabilities: ["network", "api"], formats: ["stdio", "jsonrpc"] },
143
+ vsix: { runtime: "caller", entry: "distpackage/index.js", capabilities: ["network", "visible"], formats: ["vsix"] },
144
+ container: { runtime: "node", entry: "distpackage/index.js", capabilities: ["memory", "storage", "network"], formats: ["oci", "docker"] }
145
+ });
146
+
147
+ /** Creates a surface target with caller supplied entry and capabilities. */
148
+ export function targetmanifest(target, options = {}) { const profile = targetprofiles[target]; if (!profile) throw new TypeError(`unsupported target: ${target}`); return { target, runtime: options.runtime ?? profile.runtime, entry: options.entry ?? profile.entry, formats: options.formats ?? [...profile.formats], capabilities: options.capabilities ?? [...profile.capabilities], permissions: options.permissions ?? [], metadata: options.metadata ?? {} }; }
149
+
150
+ /** Returns all supported target profiles for documentation and tooling. */
151
+ export function targetcatalog() { return Object.fromEntries(Object.entries(targetprofiles).map(([key, value]) => [key, { ...value, capabilities: [...value.capabilities] }])); }
package/orchestrator.ts CHANGED
@@ -68,8 +68,8 @@ import { cpus, freemem, networkInterfaces, tmpdir, totalmem } from 'node:os';
68
68
  import path from 'node:path';
69
69
  import process from 'node:process';
70
70
  import { setTimeout as sleep } from 'node:timers/promises';
71
- import type { enginetopicname, enginetopics } from './index.js';
72
- import { enginebus, MetricsStore } from './index.js';
71
+ import type { enginetopicname, enginetopics } from './index.ts';
72
+ import { enginebus, MetricsStore } from './index.ts';
73
73
 
74
74
  /* ------------------------------------------------------------------ */
75
75
  /* context: runtime catalog (verified 2026-08-22) */
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@wenathlan/saddle",
3
- "version": "2.1.7",
3
+ "version": "2.1.8",
4
4
  "description": "binary computing engine that turns distributed storage into a publishable working set carrying the merged virtual-hardware engine (the saddle + e2ugh grand merge)",
5
5
  "type": "module",
6
6
  "private": false,
7
7
  "license": "GPL-3.0-only",
8
8
  "author": "Wenathlan",
9
9
  "sideEffects": false,
10
- "main": "./dist/index.js",
11
- "module": "./dist/index.js",
12
- "browser": "./dist/index.js",
13
- "types": "./dist/index.d.ts",
10
+ "main": "./index.ts",
11
+ "module": "./index.ts",
12
+ "browser": "./index.ts",
13
+ "types": "./index.ts",
14
14
  "packageManager": "pnpm@12.3.4",
15
15
  "publishConfig": {
16
16
  "access": "public"
@@ -95,43 +95,42 @@
95
95
  }
96
96
  },
97
97
  "bin": {
98
- "saddle": "./dist/cli.js"
98
+ "saddle": "./cli.ts"
99
99
  },
100
100
  "exports": {
101
- ".": "./dist/index.js",
102
- "./memory": "./dist/virtual.js",
103
- "./memory-node": "./dist/virtual.js",
104
- "./memory-engine": "./dist/virtual.js",
105
- "./memory-plan": "./dist/virtual.js",
106
- "./storage": "./dist/virtual.js",
107
- "./storage-pool": "./dist/virtual.js",
108
- "./storage-node": "./dist/virtual.js",
109
- "./runners": "./dist/execution.js",
110
- "./provider-chain": "./dist/execution.js",
111
- "./sessions": "./dist/foundation.js",
112
- "./modes": "./dist/modes.js",
113
- "./mode": "./dist/modes.js",
114
- "./sandbox": "./dist/sandbox.js",
115
- "./modalities": "./dist/modalityregistry.js",
116
- "./workloadlaw": "./dist/workloadlaw.js",
117
- "./browser": "./dist/browser.js",
118
- "./browser-playwright": "./dist/browser.js",
119
- "./deploy": "./dist/modes.js",
120
- "./extension": "./dist/browser.js",
121
- "./server-node": "./dist/server.js",
122
- "./sessions-file": "./dist/execution.js",
123
- "./sessions-store": "./dist/execution.js",
124
- "./queue-persistent": "./dist/execution.js",
125
- "./hash": "./dist/foundation.js",
126
- "./release-assets": "./dist/distribution.js",
127
- "./release-verify": "./dist/distribution.js",
128
- "./release-evidence": "./dist/distribution.js",
129
- "./delivery": "./dist/distribution.js",
130
- "./worker": "./dist/execution.js",
131
- "./binary-archive": "./dist/distribution.js",
132
- "./binary-transform": "./dist/distribution.js",
133
- "./isolation": "./dist/isolation.js",
134
- "./virtual-browser": "./dist/browser.js",
101
+ ".": "./index.ts",
102
+ "./memory": "./virtual.ts",
103
+ "./memory-node": "./virtual.ts",
104
+ "./memory-engine": "./virtual.ts",
105
+ "./memory-plan": "./virtual.ts",
106
+ "./storage": "./virtual.ts",
107
+ "./storage-pool": "./virtual.ts",
108
+ "./storage-node": "./virtual.ts",
109
+ "./runners": "./execution.ts",
110
+ "./provider-chain": "./execution.ts",
111
+ "./sessions": "./foundation.ts",
112
+ "./modes": "./modes.ts",
113
+ "./mode": "./modes.ts",
114
+ "./sandbox": "./sandbox.ts",
115
+ "./modalities": "./modalityregistry.ts",
116
+ "./workloadlaw": "./workloadlaw.ts",
117
+ "./browser": "./browser.ts",
118
+ "./browser-playwright": "./browser.ts",
119
+ "./deploy": "./modes.ts",
120
+ "./server-node": "./server.ts",
121
+ "./sessions-file": "./execution.ts",
122
+ "./sessions-store": "./execution.ts",
123
+ "./queue-persistent": "./execution.ts",
124
+ "./hash": "./foundation.ts",
125
+ "./release-assets": "./distribution.ts",
126
+ "./release-verify": "./distribution.ts",
127
+ "./release-evidence": "./distribution.ts",
128
+ "./delivery": "./distribution.ts",
129
+ "./worker": "./execution.ts",
130
+ "./binary-archive": "./distribution.ts",
131
+ "./binary-transform": "./distribution.ts",
132
+ "./isolation": "./isolation.ts",
133
+ "./virtual-browser": "./browser.ts",
135
134
  "./virtualcpu": "./virtualcpu.ts",
136
135
  "./virtualmemory": "./virtualmemory.ts",
137
136
  "./virtualgpu": "./virtualgpu.ts",
@@ -157,12 +156,22 @@
157
156
  "./quantum": "./quantum.ts"
158
157
  },
159
158
  "files": [
160
- "dist",
161
- "manifest.json",
159
+ "index.ts",
160
+ "virtual.ts",
161
+ "execution.ts",
162
+ "foundation.ts",
163
+ "modes.ts",
164
+ "sandbox.ts",
165
+ "modalityregistry.ts",
166
+ "workloadlaw.ts",
167
+ "browser.ts",
168
+ "server.ts",
169
+ "distribution.ts",
170
+ "isolation.ts",
171
+ "cli.ts",
162
172
  "docs",
163
173
  "README.md",
164
174
  "LICENSE",
165
- "index.ts",
166
175
  "orchestrator.ts",
167
176
  "scheduler.ts",
168
177
  "compute.ts",
@@ -191,20 +200,18 @@
191
200
  "Dockerfile",
192
201
  "tsconfig.json",
193
202
  "biome.jsonc",
194
- "modalityregistry.ts",
195
203
  "tiers.ts",
196
204
  "quantum.ts"
197
205
  ],
198
206
  "scripts": {
199
207
  "build:engine": "node scriptsbuildengine.ts",
200
- "check": "npm run build:engine && node --check dist/index.js && node --check dist/execution.js && node --check dist/cli.js && node --check dist/browser.js && node --check dist/distribution.js",
208
+ "check": "tsc -p tsconfig.json --noEmit",
201
209
  "formatcheck": "node --import tsx format.ts",
202
210
  "test": "vitest run",
203
- "run": "npm run build:engine && node dist/cli.js",
204
- "extension:build": "npm run build:engine && node dist/browser.js",
205
- "release:assets": "npm run build:engine && node dist/distribution.js",
206
- "release:verify": "npm run build:engine && node dist/distribution.js verify",
207
- "target:manifest": "npm run build:engine && node dist/distribution.js target",
211
+ "run": "npm run build:engine && node --import tsx ./cli.ts",
212
+ "release:assets": "npm run build:engine && node --import tsx ./distribution.ts",
213
+ "release:verify": "npm run build:engine && node --import tsx ./distribution.ts verify",
214
+ "target:manifest": "npm run build:engine && node --import tsx ./distribution.ts target",
208
215
  "pack:check": "npm run check && npm run formatcheck && npm test && npm pack --dry-run",
209
216
  "prepublishOnly": "npm run pack:check",
210
217
  "tauri": "npx --yes @tauri-apps/cli@2.11.4",
@@ -217,7 +224,7 @@
217
224
  "web:build:pages": "vite build",
218
225
  "web:preview": "vite preview --host",
219
226
  "build": "npm run build:engine",
220
- "build:tsc": "tsc -p tsconfig.json --noEmitOnError false",
227
+ "build:tsc": "tsc -p tsconfig.json --noEmit",
221
228
  "start": "node --import tsx ./cli.ts plan",
222
229
  "dev": "node --import tsx --watch ./cli.ts",
223
230
  "web": "node webserver.ts",
@@ -240,13 +247,13 @@
240
247
  "vm:create": "node --import tsx ./cli.ts vm",
241
248
  "vm:validate": "node --import tsx ./cli.ts vmlint",
242
249
  "gpu:list": "node --import tsx ./cli.ts gpus",
243
- "docker:build": "docker build -f Dockerfile -t saddle:2.1.7 .",
244
- "docker:run": "docker run --rm --memory-swap=-1 --shm-size=2g saddle:2.1.7",
245
- "docker:health": "docker run --rm saddle:2.1.7 qemu-system-x86_64 --version && curl -fsS http://localhost:8080/health || true",
250
+ "docker:build": "docker build -f Dockerfile -t saddle:2.1.8 .",
251
+ "docker:run": "docker run --rm --memory-swap=-1 --shm-size=2g saddle:2.1.8",
252
+ "docker:health": "docker run --rm saddle:2.1.8 qemu-system-x86_64 --version && curl -fsS http://localhost:8080/health || true",
246
253
  "firecracker:boot": "firecracker --api-sock /tmp/fc-saddle.sock --config-file vmconfig.json 2>/dev/null || echo 'firecracker 1.16.1 warm-pool boot 125ms target'",
247
254
  "py:bridge": "python3 qemubridge.py",
248
255
  "py:test": "python3 -m pytest -q || python3 qemubridge.py",
249
- "clean": "rm -rf dist coverage .biome __pycache__",
256
+ "clean": "rm -rf distpackage coverage .biome __pycache__",
250
257
  "prepare": "echo 'saddle grand-merge toolchain 2026-08-23: Node 26.12.0 Current / 24.19.0 LTS, npm 12.0.2, TS 7.0.2, Python 3.14.7, Docker 29.7.2, QEMU 11.1.0, Mesa 26.2.1, LLVM 22.1.8, Firecracker 1.16.1'",
251
258
  "start:engine": "node --import tsx ./cli.ts plan"
252
259
  },
@@ -261,17 +268,17 @@
261
268
  "@libsql/client": "^0.18.0",
262
269
  "@prisma/adapter-libsql": "^7.10.1",
263
270
  "@prisma/client": "^7.10.1",
264
- "@wenathlan/cadria": "^2.0.154",
265
- "@wenathlan/debonair": "^2.0.154",
271
+ "@wenathlan/cadria": "^2.1.7",
272
+ "@wenathlan/debonair": "^2.1.7",
266
273
  "@wenathlan/getry": "^2.0.154",
267
- "@wenathlan/saddle": "^2.1.6",
268
- "@wenathlan/vault": "^2.0.154",
274
+ "@wenathlan/saddle": "^2.1.7",
275
+ "@wenathlan/vault": "^2.1.7",
269
276
  "better-sqlite3": "^13.0.3",
270
277
  "drizzle-orm": "^0.45.4",
271
278
  "gsap": "^3.15.0",
272
279
  "hono": "^4.13.16",
273
280
  "ink": "^7.1.1",
274
- "lucide-react": "^1.66.0",
281
+ "lucide-react": "^1.67.0",
275
282
  "motion": "^12.43.0",
276
283
  "react": "^19.3.1",
277
284
  "react-devtools-core": "^8.0.0",
@@ -317,9 +324,9 @@
317
324
  "@radix-ui/react-toggle": "^1.2.1",
318
325
  "@radix-ui/react-toggle-group": "^1.2.1",
319
326
  "@radix-ui/react-tooltip": "^1.4.1",
320
- "@tailwindcss/postcss": "^4.3.3",
327
+ "@tailwindcss/postcss": "^4.3.4",
321
328
  "@tailwindcss/typography": "^0.5.20",
322
- "@tailwindcss/vite": "^4.3.3",
329
+ "@tailwindcss/vite": "^4.3.4",
323
330
  "@tsconfig/node26": "^26.0.1",
324
331
  "@types/better-sqlite3": "^9.6.0",
325
332
  "@types/three": "^0.187.0",
@@ -329,7 +336,7 @@
329
336
  "@types/node": "^26.6.6",
330
337
  "@types/react": "^19.3.0",
331
338
  "@types/react-dom": "^19.3.0",
332
- "@vitejs/plugin-react": "^6.1.2",
339
+ "@vitejs/plugin-react": "^6.2.1",
333
340
  "add": "^2.0.9",
334
341
  "autoprefixer": "^10.6.2",
335
342
  "axios": "^1.21.0",
@@ -349,8 +356,7 @@
349
356
  "framer-motion": "^13.5.1",
350
357
  "hono": "^4.13.16",
351
358
  "input-otp": "^1.5.0",
352
- "jsdom": "26.1.0",
353
- "lucide-react": "^1.66.0",
359
+ "lucide-react": "^1.67.0",
354
360
  "mysql2": "^3.24.6",
355
361
  "nanoid": "^6.0.2",
356
362
  "next-themes": "^0.4.6",
@@ -365,12 +371,12 @@
365
371
  "react-day-picker": "^10.0.2",
366
372
  "react-dom": "^19.3.1",
367
373
  "react-hook-form": "^7.91.0",
368
- "react-resizable-panels": "^4.16.1",
374
+ "react-resizable-panels": "^4.17.0",
369
375
  "recharts": "^3.10.1",
370
376
  "sonner": "^2.0.8",
371
377
  "streamdown": "^2.7.1",
372
378
  "tailwind-merge": "^3.7.0",
373
- "tailwindcss": "^4.3.3",
379
+ "tailwindcss": "^4.3.4",
374
380
  "tailwindcss-animate": "^1.0.7",
375
381
  "tsup": "^8.5.1",
376
382
  "tsx": "^4.23.15",
@@ -379,7 +385,7 @@
379
385
  "vaul": "^1.1.2",
380
386
  "vite": "^8.3.5",
381
387
  "vite-plugin-manus-runtime": "^0.0.59",
382
- "vitest": "^5.0.5",
388
+ "vitest": "^5.1.0",
383
389
  "webpack": "^5.112.2",
384
390
  "webpack-cli": "^6.0.1",
385
391
  "wouter": "^3.13.0",