mlclaw 0.2.2 → 0.2.3

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.
@@ -64,7 +64,7 @@ Space names from that.
64
64
  With Node.js:
65
65
 
66
66
  ```bash
67
- npx mlclaw bootstrap --name mlclaw
67
+ npx mlclaw@latest bootstrap --name mlclaw
68
68
  ```
69
69
 
70
70
  Without Node.js on macOS/Linux:
@@ -92,13 +92,13 @@ node dist/mlclaw.mjs --help
92
92
  Interactive:
93
93
 
94
94
  ```bash
95
- npx mlclaw bootstrap --name mlclaw
95
+ npx mlclaw@latest bootstrap --name mlclaw
96
96
  ```
97
97
 
98
98
  Automation:
99
99
 
100
100
  ```bash
101
- npx mlclaw bootstrap \
101
+ npx mlclaw@latest bootstrap \
102
102
  --name mlclaw \
103
103
  --model huggingface/google/gemma-4-26B-A4B-it:deepinfra \
104
104
  --yes
@@ -118,7 +118,7 @@ Create a public Space only when the user explicitly asks for a public demo or
118
118
  template-style deployment:
119
119
 
120
120
  ```bash
121
- npx mlclaw bootstrap --name mlclaw --public-space
121
+ npx mlclaw@latest bootstrap --name mlclaw --public-space
122
122
  ```
123
123
 
124
124
  ## Optional Telegram
@@ -126,7 +126,7 @@ npx mlclaw bootstrap --name mlclaw --public-space
126
126
  Telegram is optional and should not be required for the default setup.
127
127
 
128
128
  ```bash
129
- npx mlclaw bootstrap \
129
+ npx mlclaw@latest bootstrap \
130
130
  --telegram-token-file ~/secrets/mlclaw_bot.env \
131
131
  --telegram-user-id 1234567890 \
132
132
  --hardware cpu-upgrade \
@@ -143,13 +143,13 @@ restriction because messaging traffic originates from the user's machine.
143
143
  Use local gateway mode when the user wants the gateway on their machine:
144
144
 
145
145
  ```bash
146
- npx mlclaw bootstrap --gateway local --name mlclaw
146
+ npx mlclaw@latest bootstrap --gateway local --name mlclaw
147
147
  ```
148
148
 
149
149
  If the user has multiple Docker engines, pin the intended context:
150
150
 
151
151
  ```bash
152
- npx mlclaw bootstrap \
152
+ npx mlclaw@latest bootstrap \
153
153
  --gateway local \
154
154
  --name mlclaw \
155
155
  --docker-context desktop-linux
@@ -167,7 +167,7 @@ models, use the `huggingface/` prefix.
167
167
  Default/recommended:
168
168
 
169
169
  ```bash
170
- npx mlclaw bootstrap \
170
+ npx mlclaw@latest bootstrap \
171
171
  --name mlclaw \
172
172
  --model huggingface/google/gemma-4-26B-A4B-it:deepinfra
173
173
  ```
@@ -175,6 +175,7 @@ npx mlclaw bootstrap \
175
175
  Known useful router-compatible choices:
176
176
 
177
177
  - `huggingface/google/gemma-4-26B-A4B-it:deepinfra`: default quality target.
178
+ - `huggingface/Qwen/Qwen3.6-35B-A3B:deepinfra`: strong Qwen 3.6 option with tool and structured-output support.
178
179
  - `huggingface/Qwen/Qwen3.6-27B:deepinfra`: live Qwen 3.6 option with tool and structured-output support.
179
180
  - `huggingface/zai-org/GLM-5.2:deepinfra`: long-context GLM option with tool and structured-output support.
180
181
  - `huggingface/moonshotai/Kimi-K2.7-Code:deepinfra`: coding-focused Kimi option with tool and structured-output support.
@@ -183,7 +184,6 @@ Known useful router-compatible choices:
183
184
  - `huggingface/deepseek-ai/DeepSeek-V4-Flash:deepinfra`: low-cost long-context DeepSeek V4 option.
184
185
  - `huggingface/deepseek-ai/DeepSeek-V4-Pro:deepinfra`: higher-quality long-context DeepSeek V4 option.
185
186
  - `huggingface/MiniMaxAI/MiniMax-M3:together`: long-context MiniMax option with tool and structured-output support.
186
- - `huggingface/Qwen/Qwen3-8B:nscale`: cheaper small-model option.
187
187
 
188
188
  Do not assume every Hub model is a Router chat model. If exact current model
189
189
  availability matters, check the Hugging Face Router catalog or run a direct
@@ -236,10 +236,11 @@ to the browser.
236
236
  ## Branding
237
237
 
238
238
  ML Claw white-labels the browser gateway at the proxy layer. App Spaces default
239
- the browser title, PWA manifest, assistant fallback avatar, login heading, and
240
- ML Claw control link to the agent name. The ML Claw logo is reserved for the
241
- control UI brand mark. The gateway shortcut, login logo, and default browser
242
- icons use the Hugging Face logo.
239
+ the browser title, PWA manifest, login heading, and ML Claw control link to the
240
+ agent name. The ML Claw logo is reserved for the control UI brand mark. The
241
+ gateway shortcut, login logo, and default browser icons use the Hugging Face
242
+ logo. The OpenClaw assistant fallback avatar defaults to a neutral assistant
243
+ icon.
243
244
 
244
245
  Use Space variables for explicit branding:
245
246
 
@@ -251,7 +252,8 @@ MLCLAW_BRAND_LOGO="mlclaw.svg"
251
252
  MLCLAW_BRAND_FAVICON="hf-logo.svg"
252
253
  MLCLAW_BRAND_FAVICON_32="hf-logo.svg"
253
254
  MLCLAW_BRAND_FAVICON_ICO="hf-logo.svg"
254
- MLCLAW_BRAND_APPLE_TOUCH_ICON="hf-logo.svg"
255
+ MLCLAW_BRAND_APPLE_TOUCH_ICON="assistant-avatar.svg"
256
+ MLCLAW_BRAND_ASSISTANT_AVATAR="assistant-avatar.svg"
255
257
  ```
256
258
 
257
259
  Brand asset paths are relative to the Space `assets/` directory. ML Claw serves
package/Dockerfile CHANGED
@@ -1,6 +1,6 @@
1
1
  ARG OPENCLAW_VERSION=2026.7.1-beta.2
2
2
  ARG OPENCLAW_BASE_IMAGE=ghcr.io/openclaw/openclaw:${OPENCLAW_VERSION}
3
- ARG MLCLAW_RUNTIME_IMAGE=ghcr.io/osolmaz/mlclaw:0.2.2-openclaw-2026.7.1-beta.2
3
+ ARG MLCLAW_RUNTIME_IMAGE=ghcr.io/osolmaz/mlclaw:0.2.3-openclaw-2026.7.1-beta.2
4
4
 
5
5
  # Stage 1: build the state-sync bundle so the runtime image needs no dev deps.
6
6
  FROM node:24-bookworm-slim AS sync-build
package/README.md CHANGED
@@ -17,7 +17,7 @@ OpenClaw on loopback using OpenClaw trusted-proxy auth.
17
17
  With Node.js:
18
18
 
19
19
  ```bash
20
- npx mlclaw bootstrap
20
+ npx mlclaw@latest bootstrap
21
21
  ```
22
22
 
23
23
  Without Node.js, the launcher fetches a pinned Node runtime into your user
@@ -40,7 +40,7 @@ token into someone else's app; the bootstrapper runs locally.
40
40
  ## Default Flow
41
41
 
42
42
  ```bash
43
- npx mlclaw bootstrap --name mlclaw
43
+ npx mlclaw@latest bootstrap --name mlclaw
44
44
  ```
45
45
 
46
46
  This creates:
@@ -59,13 +59,13 @@ for settings, status, credentials, and sign out.
59
59
  Create a public Space only when you explicitly want a public demo or template:
60
60
 
61
61
  ```bash
62
- npx mlclaw bootstrap --name mlclaw --public-space
62
+ npx mlclaw@latest bootstrap --name mlclaw --public-space
63
63
  ```
64
64
 
65
65
  Choose a Hugging Face Router model with `--model`:
66
66
 
67
67
  ```bash
68
- npx mlclaw bootstrap \
68
+ npx mlclaw@latest bootstrap \
69
69
  --name mlclaw \
70
70
  --model huggingface/google/gemma-4-26B-A4B-it:deepinfra
71
71
  ```
@@ -73,6 +73,7 @@ npx mlclaw bootstrap \
73
73
  Recommended router-compatible options:
74
74
 
75
75
  - `huggingface/google/gemma-4-26B-A4B-it:deepinfra`: default quality target.
76
+ - `huggingface/Qwen/Qwen3.6-35B-A3B:deepinfra`: strong Qwen 3.6 option with tool and structured-output support.
76
77
  - `huggingface/Qwen/Qwen3.6-27B:deepinfra`: live Qwen 3.6 option with tool and structured-output support.
77
78
  - `huggingface/zai-org/GLM-5.2:deepinfra`: long-context GLM option with tool and structured-output support.
78
79
  - `huggingface/moonshotai/Kimi-K2.7-Code:deepinfra`: coding-focused Kimi option with tool and structured-output support.
@@ -81,7 +82,6 @@ Recommended router-compatible options:
81
82
  - `huggingface/deepseek-ai/DeepSeek-V4-Flash:deepinfra`: low-cost long-context DeepSeek V4 option.
82
83
  - `huggingface/deepseek-ai/DeepSeek-V4-Pro:deepinfra`: higher-quality long-context DeepSeek V4 option.
83
84
  - `huggingface/MiniMaxAI/MiniMax-M3:together`: long-context MiniMax option with tool and structured-output support.
84
- - `huggingface/Qwen/Qwen3-8B:nscale`: cheaper small-model option.
85
85
 
86
86
  ## Optional Telegram
87
87
 
@@ -90,7 +90,7 @@ Telegram `getMe`, removes a trailing `_bot` from the username, and can derive
90
90
  the Space and bucket names from the bot username.
91
91
 
92
92
  ```bash
93
- npx mlclaw bootstrap \
93
+ npx mlclaw@latest bootstrap \
94
94
  --telegram-token-file ~/secrets/mlclaw_bot.env \
95
95
  --telegram-user-id 1234567890 \
96
96
  --hardware cpu-upgrade \
@@ -107,7 +107,7 @@ only for automation.
107
107
  You can run the gateway locally instead of inside a Space:
108
108
 
109
109
  ```bash
110
- npx mlclaw bootstrap --gateway local --name mlclaw
110
+ npx mlclaw@latest bootstrap --gateway local --name mlclaw
111
111
  ```
112
112
 
113
113
  Local mode uses Docker on your machine and the same private Storage Bucket.
@@ -182,10 +182,11 @@ mutate only the current Space, inferred from `SPACE_ID`.
182
182
  ## Branding
183
183
 
184
184
  ML Claw white-labels the browser-facing gateway by default. App Spaces use the
185
- agent name as the browser title, PWA name, login heading, assistant fallback
186
- avatar, and ML Claw control link label. The ML Claw logo is reserved for the
187
- control UI brand mark. The gateway shortcut, login logo, and default browser
188
- icons use the Hugging Face logo.
185
+ agent name as the browser title, PWA name, login heading, and ML Claw control
186
+ link label. The ML Claw logo is reserved for the control UI brand mark. The
187
+ gateway shortcut, login logo, and default browser icons use the Hugging Face
188
+ logo. The OpenClaw assistant fallback avatar defaults to a neutral assistant
189
+ icon.
189
190
 
190
191
  Override branding with Space variables:
191
192
 
@@ -197,7 +198,8 @@ MLCLAW_BRAND_LOGO=mlclaw.svg
197
198
  MLCLAW_BRAND_FAVICON=hf-logo.svg
198
199
  MLCLAW_BRAND_FAVICON_32=hf-logo.svg
199
200
  MLCLAW_BRAND_FAVICON_ICO=hf-logo.svg
200
- MLCLAW_BRAND_APPLE_TOUCH_ICON=hf-logo.svg
201
+ MLCLAW_BRAND_APPLE_TOUCH_ICON=assistant-avatar.svg
202
+ MLCLAW_BRAND_ASSISTANT_AVATAR=assistant-avatar.svg
201
203
  ```
202
204
 
203
205
  Brand asset paths are relative to the Space `assets/` directory. ML Claw serves
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" role="img" aria-label="Assistant">
2
+ <rect width="256" height="256" rx="64" fill="#111827"/>
3
+ <path fill="#f9fafb" d="M128 52 146 107h58l-47 34 18 55-47-34-47 34 18-55-47-34h58z"/>
4
+ <circle cx="128" cy="128" r="92" fill="none" stroke="#f9fafb" stroke-width="10" opacity=".22"/>
5
+ </svg>
@@ -17,6 +17,7 @@ var DEFAULT_BRAND_NAME = "ML Claw";
17
17
  var DEFAULT_THEME_COLOR = "#111827";
18
18
  var DEFAULT_LOGO_ASSET = "mlclaw.svg";
19
19
  var DEFAULT_HUGGING_FACE_ASSET = "hf-logo.svg";
20
+ var DEFAULT_ASSISTANT_AVATAR_ASSET = "assistant-avatar.svg";
20
21
  function resolveBranding(env, agentName) {
21
22
  const defaultName = defaultBrandName(agentName);
22
23
  const name = cleanText(env.MLCLAW_BRAND_NAME) ?? defaultName;
@@ -38,8 +39,8 @@ function resolveBranding(env, agentName) {
38
39
  DEFAULT_HUGGING_FACE_ASSET
39
40
  ),
40
41
  appleTouchIconAsset: normalizeAssetRef(
41
- env.MLCLAW_BRAND_APPLE_TOUCH_ICON ?? env.MLCLAW_BRAND_FAVICON_PNG ?? env.MLCLAW_BRAND_FAVICON,
42
- DEFAULT_HUGGING_FACE_ASSET
42
+ env.MLCLAW_BRAND_APPLE_TOUCH_ICON ?? env.MLCLAW_BRAND_ASSISTANT_AVATAR,
43
+ DEFAULT_ASSISTANT_AVATAR_ASSET
43
44
  )
44
45
  };
45
46
  }
@@ -139,6 +140,22 @@ var PRESET_MODEL_CHOICES = [
139
140
  outputModalities: ["text"],
140
141
  preset: true
141
142
  }),
143
+ freezeChoice({
144
+ modelId: "Qwen/Qwen3.6-35B-A3B",
145
+ provider: "deepinfra",
146
+ label: "Qwen 3.6 35B A3B",
147
+ note: "Strong Qwen 3.6 preset on DeepInfra",
148
+ contextLength: 262144,
149
+ pricing: { input: 0.15, output: 0.95 },
150
+ supportsTools: true,
151
+ supportsStructuredOutput: true,
152
+ firstTokenLatencyMs: 401,
153
+ throughput: 43.13170843671405,
154
+ status: "live",
155
+ inputModalities: ["text"],
156
+ outputModalities: ["text"],
157
+ preset: true
158
+ }),
142
159
  freezeChoice({
143
160
  modelId: "Qwen/Qwen3.6-27B",
144
161
  provider: "deepinfra",
@@ -7072,7 +7089,7 @@ function templatePage(config2) {
7072
7089
  <p>Run the local bootstrapper to create a Hugging Face hosted OpenClaw agent for ML workflows.</p>
7073
7090
  <p class="notice">Do not set this up by only clicking Duplicate. The bootstrapper creates the private Space, private Storage Bucket, OAuth settings, secrets, model configuration, and local manifest.</p>
7074
7091
  <h2>With Node.js</h2>
7075
- <pre><code>npx mlclaw bootstrap --name mlclaw</code></pre>
7092
+ <pre><code>npx mlclaw@latest bootstrap --name mlclaw</code></pre>
7076
7093
  <h2>macOS or Linux without Node.js</h2>
7077
7094
  <pre><code>bash &lt;(curl -fsSL https://raw.githubusercontent.com/osolmaz/mlclaw/main/mlclaw.sh) --name mlclaw</code></pre>
7078
7095
  <h2>Windows PowerShell</h2>
@@ -7628,6 +7645,7 @@ function createSpaceRuntimeApp(config2, controls) {
7628
7645
  app.get("/healthz", (c) => health(c, config2, controls));
7629
7646
  app.get("/assets/mlclaw.svg", async () => serveFile(path3.join(config2.assetsDir, "mlclaw.svg"), "image/svg+xml; charset=utf-8"));
7630
7647
  app.get("/assets/hf-logo.svg", async () => serveFile(path3.join(config2.assetsDir, "hf-logo.svg"), "image/svg+xml; charset=utf-8"));
7648
+ app.get("/assets/assistant-avatar.svg", async () => serveFile(path3.join(config2.assetsDir, "assistant-avatar.svg"), "image/svg+xml; charset=utf-8"));
7631
7649
  app.get("/assets/mlclaw-control-branding.js", () => staticScript(CONTROL_BRANDING_SCRIPT));
7632
7650
  app.get("/assets/brand/logo", async () => serveBrandAsset(config2, config2.branding.logoAsset));
7633
7651
  app.get("/favicon.svg", async () => serveBrandAsset(config2, config2.branding.faviconSvgAsset));
@@ -7965,11 +7983,11 @@ async function serveFile(file, contentTypeHeader, immutable = false) {
7965
7983
  }
7966
7984
  }
7967
7985
  async function serveBrandAsset(config2, asset) {
7968
- const response = await serveFile(path3.join(config2.assetsDir, asset), contentType(asset), true);
7986
+ const response = await serveFile(path3.join(config2.assetsDir, asset), contentType(asset));
7969
7987
  if (response.status !== 404 || asset === "mlclaw.svg") {
7970
7988
  return response;
7971
7989
  }
7972
- return serveFile(path3.join(config2.assetsDir, "mlclaw.svg"), "image/svg+xml; charset=utf-8", true);
7990
+ return serveFile(path3.join(config2.assetsDir, "mlclaw.svg"), "image/svg+xml; charset=utf-8");
7973
7991
  }
7974
7992
  function safeRelativePath(value) {
7975
7993
  let decoded;
@@ -8284,7 +8302,7 @@ var SpaceRuntimeServer = class {
8284
8302
  await proxyHttp(req, res, this.config, { username: session.username });
8285
8303
  }
8286
8304
  shouldRouteToMlClaw(pathname) {
8287
- return pathname === "/health" || pathname === "/healthz" || pathname === "/favicon.svg" || pathname === "/favicon-32.png" || pathname === "/favicon.ico" || pathname === "/apple-touch-icon.png" || pathname === "/manifest.webmanifest" || pathname === "/sw.js" || pathname === "/assets/hf-logo.svg" || pathname === "/assets/mlclaw.svg" || pathname === "/assets/mlclaw-control-branding.js" || pathname === "/assets/brand/logo" || pathname === "/login" || pathname === "/logout" || pathname.startsWith("/oauth/") || pathname === "/mlclaw" || pathname.startsWith("/mlclaw/");
8305
+ return pathname === "/health" || pathname === "/healthz" || pathname === "/favicon.svg" || pathname === "/favicon-32.png" || pathname === "/favicon.ico" || pathname === "/apple-touch-icon.png" || pathname === "/manifest.webmanifest" || pathname === "/sw.js" || pathname === "/assets/hf-logo.svg" || pathname === "/assets/mlclaw.svg" || pathname === "/assets/assistant-avatar.svg" || pathname === "/assets/mlclaw-control-branding.js" || pathname === "/assets/brand/logo" || pathname === "/login" || pathname === "/logout" || pathname.startsWith("/oauth/") || pathname === "/mlclaw" || pathname.startsWith("/mlclaw/");
8288
8306
  }
8289
8307
  async startOpenClaw(extraEnv = {}) {
8290
8308
  if (this.openclawStarting || this.openclaw && !this.openclaw.killed) {
@@ -8411,7 +8429,7 @@ function isApiPath(pathname) {
8411
8429
  return pathname.startsWith("/mlclaw/api/");
8412
8430
  }
8413
8431
  function isTemplateRuntimePath(pathname) {
8414
- return pathname === "/health" || pathname === "/healthz" || pathname === "/favicon.svg" || pathname === "/favicon-32.png" || pathname === "/favicon.ico" || pathname === "/apple-touch-icon.png" || pathname === "/manifest.webmanifest" || pathname === "/assets/hf-logo.svg" || pathname === "/assets/mlclaw.svg" || pathname === "/assets/brand/logo";
8432
+ return pathname === "/health" || pathname === "/healthz" || pathname === "/favicon.svg" || pathname === "/favicon-32.png" || pathname === "/favicon.ico" || pathname === "/apple-touch-icon.png" || pathname === "/manifest.webmanifest" || pathname === "/assets/hf-logo.svg" || pathname === "/assets/mlclaw.svg" || pathname === "/assets/assistant-avatar.svg" || pathname === "/assets/brand/logo";
8415
8433
  }
8416
8434
  function formatError2(err) {
8417
8435
  return err instanceof Error ? err.stack ?? err.message : String(err);
package/dist/mlclaw.mjs CHANGED
@@ -14903,6 +14903,7 @@ async function currentTemplateRev(sourceDir) {
14903
14903
  async function generateSpaceRepo(sourceDir, outDir, options = {}) {
14904
14904
  const copies = [
14905
14905
  [".gitattributes", ".gitattributes"],
14906
+ ["assets/assistant-avatar.svg", "assets/assistant-avatar.svg"],
14906
14907
  ["assets/hf-logo.svg", "assets/hf-logo.svg"],
14907
14908
  ["assets/mlclaw.svg", "assets/mlclaw.svg"],
14908
14909
  ["assets/mlclaw-control-ui", "assets/mlclaw-control-ui"],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mlclaw",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "license": "MIT",
5
5
  "config": {
6
6
  "openclawVersion": "2026.7.1-beta.2",