@wenathlan/saddle 2.0.5 → 2.1.0
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 +40 -20
- package/README.md +2 -2
- package/boards.json +1 -1
- package/cores.json +1 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +5 -5
- package/dist/browser.js.map +1 -1
- package/dist/capacitor.config.d.ts +4 -2
- package/dist/capacitor.config.d.ts.map +1 -1
- package/dist/capacitor.config.js +6 -4
- package/dist/capacitor.config.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +59 -1
- package/dist/cli.js.map +1 -1
- package/dist/docs/example-localjob.d.ts +2 -0
- package/dist/docs/example-localjob.d.ts.map +1 -0
- package/dist/docs/example-localjob.js +15 -0
- package/dist/docs/example-localjob.js.map +1 -0
- package/dist/docs/example-publicapi.d.ts +2 -0
- package/dist/docs/example-publicapi.d.ts.map +1 -0
- package/dist/docs/example-publicapi.js +7 -0
- package/dist/docs/example-publicapi.js.map +1 -0
- package/dist/vite.config.d.ts +3 -0
- package/dist/vite.config.d.ts.map +1 -0
- package/dist/vite.config.js +227 -0
- package/dist/vite.config.js.map +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +26 -0
- package/dist/vitest.config.js.map +1 -0
- package/docker.config +3 -3
- package/docs/containerplatforms-2.1.0.md +73 -0
- package/docs/native-wrappers.md +38 -0
- package/gpus.json +1 -1
- package/mttg.config +1 -1
- package/package.json +11 -12
- package/passage.config +2 -2
- package/processors.json +1 -1
- package/qemu.config +2 -2
- package/tsconfig.json +2 -2
- package/virtualhardware.json +1 -1
- package/vm.config.json +1 -1
- package/web/manifest.json +30 -0
- package/web/readme.md +12 -11
- package/web/extension/manifest.json +0 -23
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAa,MAAM,YAAY,CAAC;AAEvH,0EAA0E;AAC1E,iMAAiM;AACjM,0EAA0E;AAC1E;;GAEG;AAEH,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IAClC,4DAA4D;IAC5D,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"example-localjob.d.ts","sourceRoot":"","sources":["../../docs/example-localjob.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* the local example shows that the library can run without a remote service.
|
|
3
|
+
*/
|
|
4
|
+
import { mkdtemp } from "node:fs/promises";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { eventbus, engine, inprocess, scheduler } from "../index.js";
|
|
8
|
+
import { localmemory } from "../virtual.js";
|
|
9
|
+
import { localstorage } from "../virtual.js";
|
|
10
|
+
const root = await mkdtemp(join(tmpdir(), "saddleexample"));
|
|
11
|
+
const events = eventbus();
|
|
12
|
+
const run = engine({ storage: localstorage(root), memory: localmemory(), scheduler: scheduler([inprocess()]), events });
|
|
13
|
+
const result = await run.run({ name: "localexample", input: { source: "example" }, outputkey: "results/example.json" }, ({ job }) => ({ jobid: job.id, ok: true }));
|
|
14
|
+
console.log({ jobid: result.job.id, artifact: result.artifact.key, eventcount: events.all().length });
|
|
15
|
+
//# sourceMappingURL=example-localjob.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"example-localjob.js","sourceRoot":"","sources":["../../docs/example-localjob.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;AAC5D,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;AAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACxH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,sBAAsB,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACpK,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"example-publicapi.d.ts","sourceRoot":"","sources":["../../docs/example-publicapi.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* public api example with an injected fetcher; no network is required to run it.
|
|
3
|
+
*/
|
|
4
|
+
import { scrapeurl, formatforagent } from "../operations.js";
|
|
5
|
+
const result = await scrapeurl("https://example.com", { fetcher: async () => ({ ok: true, status: 200, text: async () => "<title>Example</title><p>Injected content.</p>" }) });
|
|
6
|
+
console.log(JSON.stringify(formatforagent(result), null, 2));
|
|
7
|
+
//# sourceMappingURL=example-publicapi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"example-publicapi.js","sourceRoot":"","sources":["../../docs/example-publicapi.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAE7D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,qBAAqB,EAAE,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,gDAAgD,EAAE,CAAC,EAAE,CAAC,CAAC;AAChL,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite.config.d.ts","sourceRoot":"","sources":["../vite.config.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import tailwindcss from "@tailwindcss/vite";
|
|
2
|
+
import react from "@vitejs/plugin-react";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { defineConfig } from "vite";
|
|
6
|
+
import { vitePluginManusRuntime } from "vite-plugin-manus-runtime";
|
|
7
|
+
// =============================================================================
|
|
8
|
+
// Manus Debug Collector - Vite Plugin
|
|
9
|
+
// Writes browser logs directly to files, trimmed when exceeding size limit
|
|
10
|
+
// =============================================================================
|
|
11
|
+
const REPO_ROOT = import.meta.dirname;
|
|
12
|
+
const WEB_ROOT = path.join(REPO_ROOT, "web");
|
|
13
|
+
const LOG_DIR = path.join(WEB_ROOT, ".manus-logs");
|
|
14
|
+
const MAX_LOG_SIZE_BYTES = 1 * 1024 * 1024; // 1MB per log file
|
|
15
|
+
const TRIM_TARGET_BYTES = Math.floor(MAX_LOG_SIZE_BYTES * 0.6); // Trim to 60% to avoid constant re-trimming
|
|
16
|
+
function ensureLogDir() {
|
|
17
|
+
if (!fs.existsSync(LOG_DIR)) {
|
|
18
|
+
fs.mkdirSync(LOG_DIR, { recursive: true });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function trimLogFile(logPath, maxSize) {
|
|
22
|
+
try {
|
|
23
|
+
if (!fs.existsSync(logPath) || fs.statSync(logPath).size <= maxSize) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const lines = fs.readFileSync(logPath, "utf-8").split("\n");
|
|
27
|
+
const keptLines = [];
|
|
28
|
+
let keptBytes = 0;
|
|
29
|
+
// Keep newest lines (from end) that fit within 60% of maxSize
|
|
30
|
+
const targetSize = TRIM_TARGET_BYTES;
|
|
31
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
32
|
+
const lineBytes = Buffer.byteLength(`${lines[i]}\n`, "utf-8");
|
|
33
|
+
if (keptBytes + lineBytes > targetSize)
|
|
34
|
+
break;
|
|
35
|
+
keptLines.unshift(lines[i]);
|
|
36
|
+
keptBytes += lineBytes;
|
|
37
|
+
}
|
|
38
|
+
fs.writeFileSync(logPath, keptLines.join("\n"), "utf-8");
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
/* ignore trim errors */
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function writeToLogFile(source, entries) {
|
|
45
|
+
if (entries.length === 0)
|
|
46
|
+
return;
|
|
47
|
+
ensureLogDir();
|
|
48
|
+
const logPath = path.join(LOG_DIR, `${source}.log`);
|
|
49
|
+
// Format entries with timestamps
|
|
50
|
+
const lines = entries.map((entry) => {
|
|
51
|
+
const ts = new Date().toISOString();
|
|
52
|
+
return `[${ts}] ${JSON.stringify(entry)}`;
|
|
53
|
+
});
|
|
54
|
+
// Append to log file
|
|
55
|
+
fs.appendFileSync(logPath, `${lines.join("\n")}\n`, "utf-8");
|
|
56
|
+
// Trim if exceeds max size
|
|
57
|
+
trimLogFile(logPath, MAX_LOG_SIZE_BYTES);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Vite plugin to collect browser debug logs
|
|
61
|
+
* - POST /debuglogs: Browser sends logs, written directly to files
|
|
62
|
+
* - Files: browserConsole.log, networkRequests.log, sessionReplay.log
|
|
63
|
+
* - Auto-trimmed when exceeding 1MB (keeps newest entries)
|
|
64
|
+
*/
|
|
65
|
+
function vitePluginManusDebugCollector() {
|
|
66
|
+
return {
|
|
67
|
+
name: "manus-debug-collector",
|
|
68
|
+
transformIndexHtml(html) {
|
|
69
|
+
if (process.env.NODE_ENV === "production") {
|
|
70
|
+
return html;
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
html,
|
|
74
|
+
tags: [
|
|
75
|
+
{
|
|
76
|
+
tag: "script",
|
|
77
|
+
attrs: {
|
|
78
|
+
src: "/debugcollector.ts",
|
|
79
|
+
type: "module",
|
|
80
|
+
defer: true,
|
|
81
|
+
},
|
|
82
|
+
injectTo: "head",
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
};
|
|
86
|
+
},
|
|
87
|
+
configureServer(server) {
|
|
88
|
+
// POST /debuglogs: Browser sends logs (written directly to files)
|
|
89
|
+
server.middlewares.use("/debuglogs", (req, res, next) => {
|
|
90
|
+
if (req.method !== "POST") {
|
|
91
|
+
return next();
|
|
92
|
+
}
|
|
93
|
+
const handlePayload = (payload) => {
|
|
94
|
+
// Write logs directly to files
|
|
95
|
+
if (payload.consoleLogs?.length > 0) {
|
|
96
|
+
writeToLogFile("browserConsole", payload.consoleLogs);
|
|
97
|
+
}
|
|
98
|
+
if (payload.networkRequests?.length > 0) {
|
|
99
|
+
writeToLogFile("networkRequests", payload.networkRequests);
|
|
100
|
+
}
|
|
101
|
+
if (payload.sessionEvents?.length > 0) {
|
|
102
|
+
writeToLogFile("sessionReplay", payload.sessionEvents);
|
|
103
|
+
}
|
|
104
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
105
|
+
res.end(JSON.stringify({ success: true }));
|
|
106
|
+
};
|
|
107
|
+
const reqBody = req.body;
|
|
108
|
+
if (reqBody && typeof reqBody === "object") {
|
|
109
|
+
try {
|
|
110
|
+
handlePayload(reqBody);
|
|
111
|
+
}
|
|
112
|
+
catch (e) {
|
|
113
|
+
res.writeHead(400, { "Content-Type": "application/json" });
|
|
114
|
+
res.end(JSON.stringify({ success: false, error: String(e) }));
|
|
115
|
+
}
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
let body = "";
|
|
119
|
+
req.on("data", (chunk) => {
|
|
120
|
+
body += chunk.toString();
|
|
121
|
+
});
|
|
122
|
+
req.on("end", () => {
|
|
123
|
+
try {
|
|
124
|
+
const payload = JSON.parse(body);
|
|
125
|
+
handlePayload(payload);
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
res.writeHead(400, { "Content-Type": "application/json" });
|
|
129
|
+
res.end(JSON.stringify({ success: false, error: String(e) }));
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function vitePluginStorageProxy() {
|
|
137
|
+
return {
|
|
138
|
+
name: "manus-storage-proxy",
|
|
139
|
+
configureServer(server) {
|
|
140
|
+
server.middlewares.use("/manus-storage", async (req, res) => {
|
|
141
|
+
const key = req.url?.replace(/^\//, "");
|
|
142
|
+
if (!key) {
|
|
143
|
+
res.writeHead(400, { "Content-Type": "text/plain" });
|
|
144
|
+
res.end("Missing storage key");
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const forgeBaseUrl = (process.env.BUILT_IN_FORGE_API_URL || "").replace(/\/+$/, "");
|
|
148
|
+
const forgeKey = process.env.BUILT_IN_FORGE_API_KEY;
|
|
149
|
+
if (!forgeBaseUrl || !forgeKey) {
|
|
150
|
+
res.writeHead(500, { "Content-Type": "text/plain" });
|
|
151
|
+
res.end("Storage proxy not configured");
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
const forgeUrl = new URL("v1/storage/presign/get", forgeBaseUrl + "/");
|
|
156
|
+
forgeUrl.searchParams.set("path", key);
|
|
157
|
+
const forgeResp = await fetch(forgeUrl, {
|
|
158
|
+
headers: { Authorization: `Bearer ${forgeKey}` },
|
|
159
|
+
});
|
|
160
|
+
if (!forgeResp.ok) {
|
|
161
|
+
res.writeHead(502, { "Content-Type": "text/plain" });
|
|
162
|
+
res.end("Storage backend error");
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const { url } = (await forgeResp.json());
|
|
166
|
+
if (!url) {
|
|
167
|
+
res.writeHead(502, { "Content-Type": "text/plain" });
|
|
168
|
+
res.end("Empty signed URL");
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
res.writeHead(307, { Location: url, "Cache-Control": "no-store" });
|
|
172
|
+
res.end();
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
res.writeHead(502, { "Content-Type": "text/plain" });
|
|
176
|
+
res.end("Storage proxy error");
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
function normalizeBasePath(value) {
|
|
183
|
+
const rawvalue = value?.trim() || "/";
|
|
184
|
+
if (rawvalue === "/")
|
|
185
|
+
return "/";
|
|
186
|
+
return `/${rawvalue.replace(/^\/+|\/+$/g, "")}/`;
|
|
187
|
+
}
|
|
188
|
+
const plugins = [react(), tailwindcss(), vitePluginManusRuntime(), vitePluginManusDebugCollector(), vitePluginStorageProxy()];
|
|
189
|
+
const basePath = normalizeBasePath(process.env.VITE_BASE_PATH);
|
|
190
|
+
export default defineConfig({
|
|
191
|
+
plugins,
|
|
192
|
+
base: basePath,
|
|
193
|
+
root: WEB_ROOT,
|
|
194
|
+
resolve: {
|
|
195
|
+
alias: {
|
|
196
|
+
"@": WEB_ROOT,
|
|
197
|
+
// The playground consumes source here so CI never depends on a prebuilt dist directory.
|
|
198
|
+
"@saddle/isolation": path.resolve(REPO_ROOT, "isolation.ts"),
|
|
199
|
+
"@shared": path.resolve(WEB_ROOT, "shared"),
|
|
200
|
+
"@assets": path.resolve(WEB_ROOT, "attached_assets"),
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
envDir: WEB_ROOT,
|
|
204
|
+
build: {
|
|
205
|
+
outDir: path.join(WEB_ROOT, "dist/public"),
|
|
206
|
+
emptyOutDir: true,
|
|
207
|
+
},
|
|
208
|
+
server: {
|
|
209
|
+
port: 3000,
|
|
210
|
+
strictPort: false, // Will find next available port if 3000 is busy
|
|
211
|
+
host: true,
|
|
212
|
+
allowedHosts: [
|
|
213
|
+
".manuspre.computer",
|
|
214
|
+
".manus.computer",
|
|
215
|
+
".manus-asia.computer",
|
|
216
|
+
".manuscomputer.ai",
|
|
217
|
+
".manusvm.computer",
|
|
218
|
+
"localhost",
|
|
219
|
+
"127.0.0.1",
|
|
220
|
+
],
|
|
221
|
+
fs: {
|
|
222
|
+
strict: true,
|
|
223
|
+
deny: ["**/.*"],
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
});
|
|
227
|
+
//# sourceMappingURL=vite.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite.config.js","sourceRoot":"","sources":["../vite.config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.config.d.ts","sourceRoot":"","sources":["../vitest.config.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { defineConfig } from "vitest/config";
|
|
2
|
+
export default defineConfig({
|
|
3
|
+
test: {
|
|
4
|
+
environment: "node",
|
|
5
|
+
include: ["tests/**/*.{test,spec}.{ts,mjs}", "tests/**/*.test.ts"],
|
|
6
|
+
globals: true,
|
|
7
|
+
testTimeout: 15000,
|
|
8
|
+
coverage: {
|
|
9
|
+
provider: "v8",
|
|
10
|
+
reporter: ["text", "json", "html"],
|
|
11
|
+
include: ["src/**/*.ts"],
|
|
12
|
+
exclude: [
|
|
13
|
+
"tests/**",
|
|
14
|
+
"scripts/**",
|
|
15
|
+
"web/**",
|
|
16
|
+
"production/**",
|
|
17
|
+
"docs/**",
|
|
18
|
+
"node_modules/**",
|
|
19
|
+
"dist/**",
|
|
20
|
+
"coverage/**",
|
|
21
|
+
],
|
|
22
|
+
thresholds: { lines: 60, functions: 50, branches: 50, statements: 60 },
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=vitest.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.config.js","sourceRoot":"","sources":["../vitest.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,eAAe,YAAY,CAAC;IAC1B,IAAI,EAAE;QACJ,WAAW,EAAE,MAAM;QACnB,OAAO,EAAE,CAAC,iCAAiC,EAAE,oBAAoB,CAAC;QAClE,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,KAAK;QAClB,QAAQ,EAAE;YACR,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAClC,OAAO,EAAE,CAAC,aAAa,CAAC;YACxB,OAAO,EAAE;gBACP,UAAU;gBACV,YAAY;gBACZ,QAAQ;gBACR,eAAe;gBACf,SAAS;gBACT,iBAAiB;gBACjB,SAAS;gBACT,aAAa;aACd;YACD,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;SACvE;KACF;CACF,CAAC,CAAC"}
|
package/docker.config
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"meta": {
|
|
3
3
|
"name": "docker.config",
|
|
4
4
|
"title": "saddle - Docker Engine and Containerization Configuration",
|
|
5
|
-
"version": "2.
|
|
5
|
+
"version": "2.1.0",
|
|
6
6
|
"date": "2026-08-22",
|
|
7
7
|
"language": "en",
|
|
8
8
|
"sources": [
|
|
@@ -618,7 +618,7 @@
|
|
|
618
618
|
"labels": {
|
|
619
619
|
"org.opencontainers.image.title": "saddle-v6",
|
|
620
620
|
"org.opencontainers.image.description": "Saddle v6 virtualization orchestrator with QEMU 11.1.0, Node 22 LTS, Python 3.13.5, MTTG, Passage, OVMF",
|
|
621
|
-
"org.opencontainers.image.version": "2.
|
|
621
|
+
"org.opencontainers.image.version": "2.1.0",
|
|
622
622
|
"org.opencontainers.image.created": "2026-08-22T00:00:00Z",
|
|
623
623
|
"org.opencontainers.image.authors": "Saddle Core <core@saddle.dev>",
|
|
624
624
|
"org.opencontainers.image.url": "https://saddle.dev",
|
|
@@ -630,7 +630,7 @@
|
|
|
630
630
|
"org.opencontainers.image.base.name": "debian:bookworm-slim",
|
|
631
631
|
"org.opencontainers.image.base.digest": "sha256:bookworm-slim-pinned-2026-08-22",
|
|
632
632
|
"saddle": {
|
|
633
|
-
"com.saddle.version": "2.
|
|
633
|
+
"com.saddle.version": "2.1.0",
|
|
634
634
|
"com.saddle.engine": "qemu-11.1.0",
|
|
635
635
|
"com.saddle.modes": "32",
|
|
636
636
|
"com.saddle.forge.mirrors": "github,gitea,forgejo",
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Container platform decision for 2.1.0
|
|
2
|
+
|
|
3
|
+
## Scope
|
|
4
|
+
|
|
5
|
+
Version 2.1.0 expands the Saddle node-engine OCI image (the `saddle-runtime`
|
|
6
|
+
target of the one container file, published by the `publish ghcr` workflow)
|
|
7
|
+
from a three-platform Linux manifest index to the four-architecture family
|
|
8
|
+
surface: `linux/amd64`, `linux/arm64`, `linux/ppc64le`, and `linux/s390x`.
|
|
9
|
+
The selection unifies the container surfaces of the grand merge: the saddle
|
|
10
|
+
lineage shipped amd64/arm64/ppc64le (the 1.8.17 decision, see
|
|
11
|
+
[containerplatforms-1.8.17.md](containerplatforms-1.8.17.md)) and the e2ugh
|
|
12
|
+
lineage published all four architectures for the virtual-hardware engine
|
|
13
|
+
(`publish ghcr vhe`). One product, one registry, one architecture surface:
|
|
14
|
+
the s390x leg joins the node engine from the e2ugh side of the family.
|
|
15
|
+
|
|
16
|
+
## Platform matrix
|
|
17
|
+
|
|
18
|
+
`linux/amd64` stays because it is the primary GitHub runner architecture and
|
|
19
|
+
the local smoke-test platform. `linux/arm64`, `linux/ppc64le` and
|
|
20
|
+
`linux/s390x` stay (or join) because the vhe engine of the same repository
|
|
21
|
+
already builds, publishes and verifies those architectures under QEMU
|
|
22
|
+
emulation - the publish ghcr vhe lane proves the build path - and the
|
|
23
|
+
node-engine build is a strict subset of that work (npm tooling, no mesa,
|
|
24
|
+
no qemu compilation).[1] [2]
|
|
25
|
+
|
|
26
|
+
`linux/arm/v7` and `linux/386` remain deferred because no inspected Node 26
|
|
27
|
+
base manifest exposes them. `windows/amd64` remains deferred (see the 1.8.17
|
|
28
|
+
decision): the Dockerfile uses Debian Linux stages and a Windows container
|
|
29
|
+
needs a Windows-specific base image, runner and smoke tests. `unknown/*`
|
|
30
|
+
remains rejected: OCI `unknown` descriptors are not a runnable target and
|
|
31
|
+
must not be advertised as a Saddle container platform.
|
|
32
|
+
|
|
33
|
+
## Base image prerequisite (the s390x gap of the bookworm-slim variant)
|
|
34
|
+
|
|
35
|
+
The current node-engine stages build `FROM node:26.8.1-bookworm-slim`. The
|
|
36
|
+
manifest index of that tag (inspected through the Docker Hub registry API on
|
|
37
|
+
2026-09-06, the same view `docker manifest inspect` reads) exposes exactly
|
|
38
|
+
`linux/amd64`, `linux/arm64` and `linux/ppc64le` - the bookworm-slim variant
|
|
39
|
+
does not publish an s390x entry. The Node 26 tags that DO carry s390x are
|
|
40
|
+
the default-distro (Debian trixie) variants: `node:26.8.1` and
|
|
41
|
+
`node:26.8.1-slim`. The four-arch publication therefore requires the
|
|
42
|
+
`saddle-build` and `saddle-runtime` FROM lines of the one container file to
|
|
43
|
+
move to a trixie-based variant (for example `node:26.8.1-slim`, keeping the
|
|
44
|
+
slim profile) before the first 2.1.0 publish run; until that base swap
|
|
45
|
+
lands, the buildx s390x leg cannot resolve its base manifest and the publish
|
|
46
|
+
job fails at the platform-resolution step. That Dockerfile change belongs to
|
|
47
|
+
the same 2.1.0 wave as this decision document (it is recorded here because
|
|
48
|
+
the container file is not part of this workflow-restoration change set).
|
|
49
|
+
|
|
50
|
+
## Workflow design
|
|
51
|
+
|
|
52
|
+
The `publish ghcr` workflow registers QEMU (arm64, ppc64le, s390x emulation)
|
|
53
|
+
before Buildx, scans a loadable `linux/amd64` image (GitHub-hosted runners
|
|
54
|
+
cannot load a multi-platform image into the default local image store, so
|
|
55
|
+
the scan build stays single-platform while the publication is pushed
|
|
56
|
+
directly to GHCR), pushes all four Linux variants through one Buildx
|
|
57
|
+
invocation, and verifies the registry manifest index for the four
|
|
58
|
+
architectures before the amd64 label and CLI smoke test.[2] The publish lane
|
|
59
|
+
also carries the restored idempotency gates: the resolve job (tag ==
|
|
60
|
+
package.json == published release, plus the e2ugh "already shipped"
|
|
61
|
+
tag/HEAD guard) so a duplicate release firing no-ops instead of repushing.
|
|
62
|
+
|
|
63
|
+
## Publication claims
|
|
64
|
+
|
|
65
|
+
The version 2.1.0 release notes and registry documentation may claim only
|
|
66
|
+
the four verified Linux variants after the pushed image index is inspected.
|
|
67
|
+
They must not claim Windows support, an `unknown` platform, or a universal
|
|
68
|
+
OS image.
|
|
69
|
+
|
|
70
|
+
## References
|
|
71
|
+
|
|
72
|
+
[1]: https://docs.docker.com/build/building/multi-platform/ "Docker multi-platform builds"
|
|
73
|
+
[2]: https://docs.docker.com/build/ci/github-actions/multi-platform/ "Multi-platform image with GitHub Actions"
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Saddle native wrappers (generated doctrine)
|
|
2
|
+
|
|
3
|
+
The native wrappers — Android, iOS and desktop — are **generated on the CI runners and never committed**. The repository carries only the conversion configs and the icon source; the Gradle/Xcode/Rust envelopes are 100% regenerable toolchain output (audited in the 2.1.0 wave: `web/android` and `web/ios` were stock Capacitor templates, and the former `web/desktop` Rust files were 12 lines of Tauri boilerplate).
|
|
4
|
+
|
|
5
|
+
## Doctrine
|
|
6
|
+
|
|
7
|
+
- **Generated on the runners, never committed**: the mobile workflows run `npx cap add android` / `npx cap add ios` into `build/native/` (gitignored); the desktop workflow scaffolds the Tauri Rust envelope (Cargo.toml, main.rs, lib.rs, build.rs) via heredoc into `build/native/desktop`. The historical templates remain recoverable from git history.
|
|
8
|
+
- **Single icon source**: `web/icon.svg` is the one source of every native icon family. Runners derive the Android mipmaps/splashs, the iOS AppIcon set and the Tauri bundle icons from it (`npx cap assets` equivalents and `npx --yes @tauri-apps/cli@2.11.4 icon web/icon.svg --output build/native/desktop/icons`).
|
|
9
|
+
- **Versions injected via `SADDLE_VERSION` env**: the workflows patch the generated `tauri.conf.json` copy, the Cargo manifest, the Gradle config and the iOS project with the resolved release version at build time — no committed file carries a stale native version.
|
|
10
|
+
- **One conversion config at the repository root**: `capacitor.config.ts` (`webDir` = `web/dist/public`, `android.path`/`ios.path` = `build/native/{android,ios}`) and `tauri.conf.json` (`frontendDist` = `web/dist/public`, `bundle.icon` relative to the scaffold directory where the runner copies this config).
|
|
11
|
+
|
|
12
|
+
## Android surface (from the retired `web/android/README.md`)
|
|
13
|
+
|
|
14
|
+
The Android surface is a Capacitor conversion target for the shared Saddle web application. The TypeScript library remains the source of engine logic, while the compiled `web/dist/public` directory supplies the WebView payload. The generated project owns application metadata, Gradle configuration, resources and signing hooks only. The workflow runs `npm run web:build:pages`, `npx cap sync android`, regenerates the Saddle icon family from `web/icon.svg` and executes Gradle release tasks. Release builds enable R8 code shrinking and resource shrinking. A production keystore is never committed; `ANDROID_KEY_BASE64`, `ANDROID_KEY_ALIAS`, `ANDROID_STORE_PASSWORD` and `ANDROID_KEY_PASSWORD` are repository secret contracts. A manual test run may opt into a clearly labeled CI test key, but that output is not a trusted store artifact. The public artifact contract is version-derived and uses dotted lowercase names such as `saddle.apk.<version>.apk` and `saddle.aab.<version>.aab`; the release manifest records the signing status and the workflow verifies the APK and AAB signatures before upload.
|
|
15
|
+
|
|
16
|
+
## iOS surface (from the retired `web/ios/README.md`)
|
|
17
|
+
|
|
18
|
+
The iOS surface is a Capacitor conversion target for the shared Saddle web application. The TypeScript library and the compiled `web/dist/public` directory remain authoritative; the generated Xcode project owns only platform metadata, WebView hosting, entitlements and caller-provided signing configuration. The workflow runs on macOS, synchronizes the web output with `npx cap sync ios` and builds an IPA only when Apple certificates, provisioning profiles and export settings are explicitly configured. No signing material is stored in the repository, and an unsigned or unprovisioned build is never described as App Store ready. The public artifact contract is version-derived and uses the dotted lowercase pattern `saddle.ipa.<version>.ipa`.
|
|
19
|
+
|
|
20
|
+
## Desktop surface (from the retired `web/desktop/README.md`)
|
|
21
|
+
|
|
22
|
+
The desktop surface is the Saddle browser application: one Tauri application wrapping the `web/` build. Windows, Linux and macOS use the same web assets, compiled library contracts, window policy and release version; platform differences are limited to native WebView integration, installer format and caller-owned signing. The Rust entrypoint, Cargo manifest and Tauri configuration are scaffolded by the runner (heredoc) — the frontend is `web/dist/public`, generated by `npm run web:build:pages`; the shell never copies or reimplements React routes, storage logic or engine logic. Local regeneration commands:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm ci
|
|
26
|
+
mkdir -p build/native/desktop && cd build/native/desktop
|
|
27
|
+
# heredoc Cargo.toml / main.rs / lib.rs / build.rs here (as the workflow does)
|
|
28
|
+
npx --yes @tauri-apps/cli@2.11.4 icon ../../web/icon.svg --output icons
|
|
29
|
+
cp ../../../tauri.conf.json .
|
|
30
|
+
npx --yes @tauri-apps/cli@2.11.4 dev
|
|
31
|
+
npx --yes @tauri-apps/cli@2.11.4 build --ci --no-sign --bundles deb,rpm,appimage
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
The release workflow runs the native command on the matching GitHub-hosted runner, attaches only files that were actually generated and renames them to `saddle.browser.<version>.<format>`. Signing, notarization, Microsoft Store submission, Snap publication, Flatpak publication and Apple App Store submission require caller-owned credentials and are not embedded in this repository.
|
|
35
|
+
|
|
36
|
+
## Weight removed in the 2.1.0 flatten (shadcn kit pruning, rule 98)
|
|
37
|
+
|
|
38
|
+
The static template kit `web/components/ui/` carried 50 files; only the four referenced by the live React tree survived as loose files at the web root (`button.tsx`, `card.tsx`, `tooltip.tsx`, `sonner.tsx`). The 46 unreferenced template components were deleted as dead weight (OAuth-portal template, never imported by any live page): accordion, alert, alert-dialog, aspect-ratio, avatar, badge, breadcrumb, button-group, calendar, carousel, chart, checkbox, collapsible, command, context-menu, dialog, drawer, dropdown-menu, empty, field, form, hover-card, input, input-group, input-otp, item, kbd, label, menubar, navigation-menu, pagination, popover, progress, radio-group, resizable, scroll-area, select, separator, sheet, sidebar, skeleton, slider, spinner, switch, table, tabs, textarea, toggle, toggle-group. `web/components.json` (zero readers among tests and source) and the whole `web/hooks/` folder (useMobile/useComposition/usePersistFn — imported only by the pruned kit and the dead `Map.tsx`) were deleted with it.
|
package/gpus.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"meta": {
|
|
4
4
|
"name": "gpus.json",
|
|
5
5
|
"title": "saddle - Unified Virtual GPU Database",
|
|
6
|
-
"version": "2.
|
|
6
|
+
"version": "2.1.0",
|
|
7
7
|
"date": "2026-08-22",
|
|
8
8
|
"language": "en",
|
|
9
9
|
"description": "Union of the v5 GPU database (7 virtual identity identities), the S6 registry (RX 8900 XTX + Arc B770 unique), Blackwell architecture specs v5+v6 (B100/GB200/RTX 5070/5070 Ti SKUs), gpu.config TOML SKUs (incl. 5 AMD APU RDNA iGPUs) and the 11-entry vfio profile table. PCI device id for RTX PRO 6000 corrected 2BB5->26B5 per canonical v5.",
|
package/mttg.config
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"meta": {
|
|
3
3
|
"name": "mttg.config",
|
|
4
4
|
"title": "saddle - MTTG Multi-Tenant Task Groups (cgroups v2 + tenants + transcode) with MTTCG (QEMU TCG) section",
|
|
5
|
-
"version": "2.
|
|
5
|
+
"version": "2.1.0",
|
|
6
6
|
"date": "2026-08-22",
|
|
7
7
|
"language": "en",
|
|
8
8
|
"conceptSeparation": "MTTG = Multi-Tenant Task Groups (cgroup v2 cpu.weight/cpuset/memory/io/pids/hugetlb/rdma + tenants + transcode pipelines). MTTCG = QEMU Multi-Threaded TCG (one host thread per vCPU under TCG). Both live here as DISTINCT sections; MTTCG accel flags also in qemu.config#mttcg.",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wenathlan/saddle",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.1.0",
|
|
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,
|
|
@@ -114,7 +114,7 @@
|
|
|
114
114
|
},
|
|
115
115
|
"files": [
|
|
116
116
|
"dist",
|
|
117
|
-
"web/
|
|
117
|
+
"web/manifest.json",
|
|
118
118
|
"docs",
|
|
119
119
|
"README.md",
|
|
120
120
|
"LICENSE",
|
|
@@ -166,13 +166,12 @@
|
|
|
166
166
|
"prepublishOnly": "npm run pack:check",
|
|
167
167
|
"tauri": "npx --yes @tauri-apps/cli@2.11.4",
|
|
168
168
|
"capacitor:sync:android": "npm run web:build:pages && cap sync android",
|
|
169
|
-
"capacitor:flatten:android": "node tests/scripts/flattenandroid.mjs",
|
|
170
169
|
"capacitor:sync:ios": "npm run web:build:pages && cap sync ios",
|
|
171
170
|
"native:check:flat": "node tests/scripts/validateflatnative.mjs",
|
|
172
|
-
"web:dev": "vite --
|
|
171
|
+
"web:dev": "vite --host",
|
|
173
172
|
"web:check": "npm run build:engine && tsc --project web/tsconfig.json --noEmit",
|
|
174
|
-
"web:build": "vite build
|
|
175
|
-
"web:build:pages": "vite build
|
|
173
|
+
"web:build": "vite build",
|
|
174
|
+
"web:build:pages": "vite build",
|
|
176
175
|
"build": "npm run build:engine",
|
|
177
176
|
"build:tsc": "tsc -p tsconfig.json --noEmitOnError false",
|
|
178
177
|
"start": "node --import tsx ./cli.ts plan",
|
|
@@ -194,12 +193,12 @@
|
|
|
194
193
|
"test:unit": "node --test tests/*.test.ts",
|
|
195
194
|
"test:e2e": "node --test tests/*.test.ts",
|
|
196
195
|
"qemu:version": "qemu-system-x86_64 --version || echo 'qemu 11.1.0 expected 2026-08-22'",
|
|
197
|
-
"vm:create": "node ./
|
|
198
|
-
"vm:validate": "node ./
|
|
199
|
-
"gpu:list": "node ./
|
|
200
|
-
"docker:build": "docker build -f Dockerfile -t saddle:2.0
|
|
201
|
-
"docker:run": "docker run --rm --memory-swap=-1 --shm-size=2g saddle:2.0
|
|
202
|
-
"docker:health": "docker run --rm saddle:2.0
|
|
196
|
+
"vm:create": "node --import tsx ./cli.ts vm",
|
|
197
|
+
"vm:validate": "node --import tsx ./cli.ts vmlint",
|
|
198
|
+
"gpu:list": "node --import tsx ./cli.ts gpus",
|
|
199
|
+
"docker:build": "docker build -f Dockerfile -t saddle:2.1.0 .",
|
|
200
|
+
"docker:run": "docker run --rm --memory-swap=-1 --shm-size=2g saddle:2.1.0",
|
|
201
|
+
"docker:health": "docker run --rm saddle:2.1.0 qemu-system-x86_64 --version && curl -fsS http://localhost:8080/health || true",
|
|
203
202
|
"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'",
|
|
204
203
|
"py:bridge": "python3 qemubridge.py",
|
|
205
204
|
"py:test": "python3 -m pytest -q || python3 qemubridge.py",
|
package/passage.config
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"meta": {
|
|
3
3
|
"name": "passage.config",
|
|
4
4
|
"title": "saddle - Passage Configuration (3 homonym domains kept separate + host playbook)",
|
|
5
|
-
"version": "2.
|
|
5
|
+
"version": "2.1.0",
|
|
6
6
|
"date": "2026-08-22",
|
|
7
7
|
"language": "en",
|
|
8
8
|
"conceptSeparation": "'passage' has 3 distinct domains in the pool: (1) gateway - L7 Pingora reverse proxy (routes/upstreams/TLS 1.3); (2) passthrough - PCI device passthrough modes (VFIO/MDEV/MIG/vGPU/SR-IOV/vfio-user/hotplug/KVM/none); (3) network_binding - VM network bridge modes + host port binding (never localhost). A 4th section carries the AetherForge host-side VFIO playbook. Sections are NEVER merged.",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"gateway": {
|
|
57
57
|
"meta": {
|
|
58
58
|
"project": "saddle (grand merge)",
|
|
59
|
-
"version": "2.
|
|
59
|
+
"version": "2.1.0",
|
|
60
60
|
"schema": "passage.config",
|
|
61
61
|
"schemaversion": "2026.08.22",
|
|
62
62
|
"engine": "passage gateway v6",
|
package/processors.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"meta": {
|
|
4
4
|
"name": "processors.json",
|
|
5
5
|
"title": "saddle - Unified Virtual Processor Database",
|
|
6
|
-
"version": "2.
|
|
6
|
+
"version": "2.1.0",
|
|
7
7
|
"date": "2026-08-22",
|
|
8
8
|
"language": "en",
|
|
9
9
|
"description": "Union of the v5 canonical CPU database (6 x86_64 identities), the e2ugh processor catalog (55 SKUs incl. ARM/Apple/Xeon; lineage kept), Zen5/X3D microarchitecture specs and pool minis. Field conflicts resolved V5-first (model_name/max_boost_ghz/tdp_watts canonical); OMNI complementary fields (arch, core_type, topology, memory_support, release_date) merged in place. Versions re-pinned date-first 2026-08-22.",
|