Skip to content

Commit c7a0d9b

Browse files
committed
Merge branch 'main' of https://github.com/openclaw/openclaw
* 'main' of https://github.com/openclaw/openclaw: test(models): stabilize provider index list mocks test(cli): cover lazy plugin inspect mocks fix(cli): lazy load plugin maintenance paths fix(models): keep cold catalog lookup registry indexed fix(models): avoid registry for configured list fix(cli): lazy load model commands fix(ui): remove ineffective dynamic imports test: type setup provider mocks fix(update): complete channel switch follow-up work test(parallels): harden smoke agent model setup fix: preserve provider-scoped model options fix: keep post-auth model policy cold docs: note faster onboarding auth setup test: cover setup provider auth selection refactor: keep openai setup auth lightweight fix: use setup providers for auth choices fix: scope provider auth runtime loading fix: keep onboarding setup paths cold fix: keep onboarding model prompts scoped
2 parents 3013916 + 5411f9d commit c7a0d9b

34 files changed

Lines changed: 1410 additions & 186 deletions

.github/workflows/openclaw-live-and-e2e-checks-reusable.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,11 @@ jobs:
430430
command: pnpm test:docker:doctor-switch
431431
timeout_minutes: 60
432432
release_path: true
433+
- suite_id: docker-update-channel-switch
434+
label: Update Channel Switch Docker E2E
435+
command: pnpm test:docker:update-channel-switch
436+
timeout_minutes: 60
437+
release_path: true
433438
- suite_id: docker-session-runtime-context
434439
label: Session Runtime Context Docker E2E
435440
command: pnpm test:docker:session-runtime-context

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ Docs: https://docs.openclaw.ai
1919

2020
### Fixes
2121

22+
- Onboarding/setup: keep first-run config reads, plugin compatibility notices, and post-model sanity checks on cold metadata paths unless the user chooses to browse all models, avoiding full plugin/runtime catalog work between prompts. Thanks @shakkernerd.
23+
- Onboarding/auth: run manifest-owned provider auth choices through scoped setup providers so selecting OpenAI Codex browser/device auth no longer loads every provider runtime before OAuth starts. Thanks @shakkernerd.
24+
- Onboarding/auth: keep the post-auth default-model policy lookup on manifest/setup metadata so the next prompt appears without loading broad provider runtime. Thanks @shakkernerd.
25+
- Onboarding/models: keep skip-auth and provider-scoped model picker prompts off the full global model catalog path, and cache provider catalog hook resolution so setup no longer stalls after auth on large plugin registries. Thanks @shakkernerd.
2226
- Gateway/Bonjour: suppress known @homebridge/ciao cancellation and network assertion failures through scoped process handlers so malformed mDNS packets or restricted VPS networking disable/restart Bonjour instead of crashing the gateway. Fixes #67578. Thanks @zenassist26-create.
2327
- Discord: keep late clicks on already-resolved exec approval buttons quiet when elevated mode auto-resolved the request, while still surfacing real approval submission failures. Fixes #66906. Thanks @rlerikse.
2428

docs/help/testing.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,10 @@ runs the same lanes before release approval.
172172
- Use `--platform macos`, `--platform windows`, or `--platform linux` while
173173
iterating on one guest. Use `--json` for the summary artifact path and
174174
per-lane status.
175+
- The OpenAI lane uses `openai/gpt-5.5` for the live agent-turn proof by
176+
default. Pass `--model <provider/model>` or set
177+
`OPENCLAW_PARALLELS_OPENAI_MODEL` when deliberately validating another
178+
OpenAI model.
175179
- Wrap long local runs in a host timeout so Parallels transport stalls cannot
176180
consume the rest of the testing window:
177181

@@ -603,7 +607,7 @@ These Docker runners split into two buckets:
603607
`OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000`. Override those env vars when you
604608
explicitly want the larger exhaustive scan.
605609
- `test:docker:all` builds the live Docker image once via `test:docker:live-build`, then reuses it for the live Docker lanes. It also builds one shared `scripts/e2e/Dockerfile` image via `test:docker:e2e-build` and reuses it for the E2E container smoke runners that exercise the built app. The aggregate uses a weighted local scheduler: `OPENCLAW_DOCKER_ALL_PARALLELISM` controls process slots, while resource caps keep heavy live, npm-install, and multi-service lanes from all starting at once. Defaults are 10 slots, `OPENCLAW_DOCKER_ALL_LIVE_LIMIT=6`, `OPENCLAW_DOCKER_ALL_NPM_LIMIT=8`, and `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7`; tune `OPENCLAW_DOCKER_ALL_WEIGHT_LIMIT` or `OPENCLAW_DOCKER_ALL_DOCKER_LIMIT` only when the Docker host has more headroom. The runner performs a Docker preflight by default, removes stale OpenClaw E2E containers, prints status every 30 seconds, stores successful lane timings in `.artifacts/docker-tests/lane-timings.json`, and uses those timings to start longer lanes first on later runs. Use `OPENCLAW_DOCKER_ALL_DRY_RUN=1` to print the weighted lane manifest without building or running Docker.
606-
- Container smoke runners: `test:docker:openwebui`, `test:docker:onboard`, `test:docker:npm-onboard-channel-agent`, `test:docker:session-runtime-context`, `test:docker:agents-delete-shared-workspace`, `test:docker:gateway-network`, `test:docker:browser-cdp-snapshot`, `test:docker:mcp-channels`, `test:docker:pi-bundle-mcp-tools`, `test:docker:cron-mcp-cleanup`, `test:docker:plugins`, `test:docker:plugin-update`, and `test:docker:config-reload` boot one or more real containers and verify higher-level integration paths.
610+
- Container smoke runners: `test:docker:openwebui`, `test:docker:onboard`, `test:docker:npm-onboard-channel-agent`, `test:docker:update-channel-switch`, `test:docker:session-runtime-context`, `test:docker:agents-delete-shared-workspace`, `test:docker:gateway-network`, `test:docker:browser-cdp-snapshot`, `test:docker:mcp-channels`, `test:docker:pi-bundle-mcp-tools`, `test:docker:cron-mcp-cleanup`, `test:docker:plugins`, `test:docker:plugin-update`, and `test:docker:config-reload` boot one or more real containers and verify higher-level integration paths.
607611
608612
The live-model Docker runners also bind-mount only the needed CLI auth homes (or all supported ones when the run is not narrowed), then copy them into the container home before the run so external-CLI OAuth can refresh tokens without mutating the host auth store:
609613
@@ -615,6 +619,7 @@ The live-model Docker runners also bind-mount only the needed CLI auth homes (or
615619
- Open WebUI live smoke: `pnpm test:docker:openwebui` (script: `scripts/e2e/openwebui-docker.sh`)
616620
- Onboarding wizard (TTY, full scaffolding): `pnpm test:docker:onboard` (script: `scripts/e2e/onboard-docker.sh`)
617621
- Npm tarball onboarding/channel/agent smoke: `pnpm test:docker:npm-onboard-channel-agent` installs the packed OpenClaw tarball globally in Docker, configures OpenAI via env-ref onboarding plus Telegram by default, verifies doctor repairs activated plugin runtime deps, and runs one mocked OpenAI agent turn. Reuse a prebuilt tarball with `OPENCLAW_NPM_ONBOARD_PACKAGE_TGZ=/path/to/openclaw-*.tgz`, skip the host rebuild with `OPENCLAW_NPM_ONBOARD_HOST_BUILD=0`, or switch channel with `OPENCLAW_NPM_ONBOARD_CHANNEL=discord`.
622+
- Update channel switch smoke: `pnpm test:docker:update-channel-switch` installs the packed OpenClaw tarball globally in Docker, switches from package `stable` to git `dev`, verifies the persisted channel and plugin post-update work, then switches back to package `stable` and checks update status.
618623
- Session runtime context smoke: `pnpm test:docker:session-runtime-context` verifies hidden runtime context transcript persistence plus doctor repair of affected duplicated prompt-rewrite branches.
619624
- Bun global install smoke: `bash scripts/e2e/bun-global-install-smoke.sh` packs the current tree, installs it with `bun install -g` in an isolated home, and verifies `openclaw infer image providers --json` returns bundled image providers instead of hanging. Reuse a prebuilt tarball with `OPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgz`, skip the host build with `OPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0`, or copy `dist/` from a built Docker image with `OPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local`.
620625
- Installer Docker smoke: `bash scripts/test-install-sh-docker.sh` shares one npm cache across its root, update, and direct-npm containers. Update smoke defaults to npm `latest` as the stable baseline before upgrading to the candidate tarball. Non-root installer checks keep an isolated npm cache so root-owned cache entries do not mask user-local install behavior. Set `OPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cache` to reuse the root/update/direct-npm cache across local reruns.

extensions/openai/setup-api.ts

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,111 @@
11
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
2+
import type { ProviderAuthContext, ProviderAuthResult } from "openclaw/plugin-sdk/plugin-entry";
3+
import type { ProviderAuthMethod } from "openclaw/plugin-sdk/plugin-entry";
4+
import type { ProviderPlugin } from "openclaw/plugin-sdk/provider-model-shared";
5+
import {
6+
OPENAI_API_KEY_LABEL,
7+
OPENAI_API_KEY_WIZARD_GROUP,
8+
OPENAI_CODEX_DEVICE_PAIRING_HINT,
9+
OPENAI_CODEX_DEVICE_PAIRING_LABEL,
10+
OPENAI_CODEX_LOGIN_HINT,
11+
OPENAI_CODEX_LOGIN_LABEL,
12+
OPENAI_CODEX_WIZARD_GROUP,
13+
} from "./auth-choice-copy.js";
214
import { buildOpenAICodexCliBackend } from "./cli-backend.js";
315

16+
async function runOpenAIProviderAuthMethod(
17+
methodId: string,
18+
ctx: ProviderAuthContext,
19+
): Promise<ProviderAuthResult> {
20+
const { buildOpenAIProvider } = await import("./openai-provider.js");
21+
const method = buildOpenAIProvider().auth.find((entry) => entry.id === methodId);
22+
if (!method) {
23+
return { profiles: [] };
24+
}
25+
return method.run(ctx);
26+
}
27+
28+
async function runOpenAICodexProviderAuthMethod(
29+
methodId: string,
30+
ctx: ProviderAuthContext,
31+
): Promise<ProviderAuthResult> {
32+
const { buildOpenAICodexProviderPlugin } = await import("./openai-codex-provider.js");
33+
const method = buildOpenAICodexProviderPlugin().auth.find((entry) => entry.id === methodId);
34+
if (!method) {
35+
return { profiles: [] };
36+
}
37+
return method.run(ctx);
38+
}
39+
40+
function buildOpenAISetupProvider(): ProviderPlugin {
41+
const apiKeyMethod = {
42+
id: "api-key",
43+
label: OPENAI_API_KEY_LABEL,
44+
hint: "Use your OpenAI API key directly",
45+
kind: "api_key",
46+
wizard: {
47+
choiceId: "openai-api-key",
48+
choiceLabel: OPENAI_API_KEY_LABEL,
49+
...OPENAI_API_KEY_WIZARD_GROUP,
50+
},
51+
run: async (ctx) => runOpenAIProviderAuthMethod("api-key", ctx),
52+
} satisfies ProviderAuthMethod;
53+
54+
return {
55+
id: "openai",
56+
label: "OpenAI",
57+
docsPath: "/providers/models",
58+
envVars: ["OPENAI_API_KEY"],
59+
auth: [apiKeyMethod],
60+
};
61+
}
62+
63+
function buildOpenAICodexSetupProvider(): ProviderPlugin {
64+
const oauthMethod = {
65+
id: "oauth",
66+
label: OPENAI_CODEX_LOGIN_LABEL,
67+
hint: OPENAI_CODEX_LOGIN_HINT,
68+
kind: "oauth",
69+
wizard: {
70+
choiceId: "openai-codex",
71+
choiceLabel: OPENAI_CODEX_LOGIN_LABEL,
72+
choiceHint: OPENAI_CODEX_LOGIN_HINT,
73+
assistantPriority: -30,
74+
...OPENAI_CODEX_WIZARD_GROUP,
75+
},
76+
run: async (ctx) => runOpenAICodexProviderAuthMethod("oauth", ctx),
77+
} satisfies ProviderAuthMethod;
78+
79+
const deviceCodeMethod = {
80+
id: "device-code",
81+
label: OPENAI_CODEX_DEVICE_PAIRING_LABEL,
82+
hint: OPENAI_CODEX_DEVICE_PAIRING_HINT,
83+
kind: "device_code",
84+
wizard: {
85+
choiceId: "openai-codex-device-code",
86+
choiceLabel: OPENAI_CODEX_DEVICE_PAIRING_LABEL,
87+
choiceHint: OPENAI_CODEX_DEVICE_PAIRING_HINT,
88+
assistantPriority: -10,
89+
...OPENAI_CODEX_WIZARD_GROUP,
90+
},
91+
run: async (ctx) => runOpenAICodexProviderAuthMethod("device-code", ctx),
92+
} satisfies ProviderAuthMethod;
93+
94+
return {
95+
id: "openai-codex",
96+
label: "OpenAI Codex",
97+
docsPath: "/providers/models",
98+
auth: [oauthMethod, deviceCodeMethod],
99+
};
100+
}
101+
4102
export default definePluginEntry({
5103
id: "openai",
6104
name: "OpenAI Setup",
7105
description: "Lightweight OpenAI setup hooks",
8106
register(api) {
107+
api.registerProvider(buildOpenAISetupProvider());
108+
api.registerProvider(buildOpenAICodexSetupProvider());
9109
api.registerCliBackend(buildOpenAICodexCliBackend());
10110
},
11111
});

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1542,6 +1542,7 @@
15421542
"test:docker:plugins": "bash scripts/e2e/plugins-docker.sh",
15431543
"test:docker:qr": "bash scripts/e2e/qr-import-docker.sh",
15441544
"test:docker:session-runtime-context": "bash scripts/e2e/session-runtime-context-docker.sh",
1545+
"test:docker:update-channel-switch": "bash scripts/e2e/update-channel-switch-docker.sh",
15451546
"test:e2e": "node scripts/run-vitest.mjs run --config test/vitest/vitest.e2e.config.ts",
15461547
"test:e2e:openshell": "OPENCLAW_E2E_OPENSHELL=1 node scripts/run-vitest.mjs run --config test/vitest/vitest.e2e.config.ts extensions/openshell/src/backend.e2e.test.ts",
15471548
"test:extension": "node scripts/test-extension.mjs",

scripts/e2e/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ RUN --mount=type=cache,id=openclaw-pnpm-store,target=/home/appuser/.local/share/
4040

4141
FROM deps AS build
4242

43-
COPY --chown=appuser:appuser tsconfig.json tsconfig.plugin-sdk.dts.json tsdown.config.ts vitest.config.ts openclaw.mjs ./
43+
COPY --chown=appuser:appuser .oxlintrc.json tsconfig.json tsconfig.plugin-sdk.dts.json tsconfig.oxlint*.json tsdown.config.ts vitest.config.ts openclaw.mjs ./
4444
COPY --chown=appuser:appuser src ./src
4545
COPY --chown=appuser:appuser test ./test
4646
COPY --chown=appuser:appuser scripts ./scripts

scripts/e2e/parallels-linux-smoke.sh

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ API_KEY_ENV=""
1313
AUTH_CHOICE=""
1414
AUTH_KEY_FLAG=""
1515
MODEL_ID=""
16+
MODEL_ID_EXPLICIT=0
1617
INSTALL_URL="https://openclaw.ai/install.sh"
1718
HOST_PORT="18427"
1819
HOST_PORT_EXPLICIT=0
@@ -103,6 +104,8 @@ Options:
103104
--mode <fresh|upgrade|both>
104105
--provider <openai|anthropic|minimax>
105106
Provider auth/model lane. Default: openai
107+
--model <provider/model> Override the model used for the agent-turn smoke.
108+
Default: openai/gpt-5.5 for the OpenAI lane
106109
--api-key-env <var> Host env var name for provider API key.
107110
Default: OPENAI_API_KEY for openai, ANTHROPIC_API_KEY for anthropic
108111
--openai-api-key-env <var> Alias for --api-key-env (backward compatible)
@@ -142,6 +145,11 @@ while [[ $# -gt 0 ]]; do
142145
PROVIDER="$2"
143146
shift 2
144147
;;
148+
--model)
149+
MODEL_ID="$2"
150+
MODEL_ID_EXPLICIT=1
151+
shift 2
152+
;;
145153
--api-key-env|--openai-api-key-env)
146154
API_KEY_ENV="$2"
147155
shift 2
@@ -200,19 +208,19 @@ case "$PROVIDER" in
200208
openai)
201209
AUTH_CHOICE="openai-api-key"
202210
AUTH_KEY_FLAG="openai-api-key"
203-
MODEL_ID="openai/gpt-5.5"
211+
[[ "$MODEL_ID_EXPLICIT" -eq 1 ]] || MODEL_ID="${OPENCLAW_PARALLELS_OPENAI_MODEL:-openai/gpt-5.5}"
204212
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="OPENAI_API_KEY"
205213
;;
206214
anthropic)
207215
AUTH_CHOICE="apiKey"
208216
AUTH_KEY_FLAG="anthropic-api-key"
209-
MODEL_ID="anthropic/claude-sonnet-4-6"
217+
[[ "$MODEL_ID_EXPLICIT" -eq 1 ]] || MODEL_ID="${OPENCLAW_PARALLELS_ANTHROPIC_MODEL:-anthropic/claude-sonnet-4-6}"
210218
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="ANTHROPIC_API_KEY"
211219
;;
212220
minimax)
213221
AUTH_CHOICE="minimax-global-api"
214222
AUTH_KEY_FLAG="minimax-api-key"
215-
MODEL_ID="minimax/MiniMax-M2.7"
223+
[[ "$MODEL_ID_EXPLICIT" -eq 1 ]] || MODEL_ID="${OPENCLAW_PARALLELS_MINIMAX_MODEL:-minimax/MiniMax-M2.7}"
216224
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="MINIMAX_API_KEY"
217225
;;
218226
*)
@@ -764,13 +772,38 @@ verify_gateway_status() {
764772
return 1
765773
}
766774

775+
prepare_agent_workspace() {
776+
guest_exec /bin/sh -lc 'set -eu
777+
workspace="${OPENCLAW_WORKSPACE_DIR:-$HOME/.openclaw/workspace}"
778+
mkdir -p "$workspace/.openclaw"
779+
cat > "$workspace/IDENTITY.md" <<'"'"'IDENTITY_EOF'"'"'
780+
# Identity
781+
782+
- Name: OpenClaw
783+
- Purpose: Parallels Linux smoke test assistant.
784+
IDENTITY_EOF
785+
cat > "$workspace/.openclaw/workspace-state.json" <<'"'"'STATE_EOF'"'"'
786+
{
787+
"version": 1,
788+
"setupCompletedAt": "2026-01-01T00:00:00.000Z"
789+
}
790+
STATE_EOF
791+
rm -f "$workspace/BOOTSTRAP.md"'
792+
}
793+
767794
verify_local_turn() {
768795
guest_exec openclaw models set "$MODEL_ID"
769-
guest_exec /usr/bin/env "$API_KEY_ENV=$API_KEY_VALUE" openclaw agent \
770-
--local \
771-
--agent main \
772-
--message ping \
773-
--json
796+
guest_exec openclaw config set agents.defaults.skipBootstrap true --strict-json
797+
prepare_agent_workspace
798+
guest_exec /bin/sh -lc "$(cat <<EOF
799+
exec /usr/bin/env $(shell_quote "$API_KEY_ENV=$API_KEY_VALUE") openclaw agent \
800+
--local \
801+
--agent main \
802+
--session-id parallels-linux-smoke \
803+
--message $(shell_quote "Reply with exact ASCII text OK only.") \
804+
--json
805+
EOF
806+
)"
774807
}
775808

776809
phase_log_path() {

scripts/e2e/parallels-macos-smoke.sh

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ API_KEY_ENV=""
1313
AUTH_CHOICE=""
1414
AUTH_KEY_FLAG=""
1515
MODEL_ID=""
16+
MODEL_ID_EXPLICIT=0
1617
INSTALL_URL="https://openclaw.ai/install.sh"
1718
HOST_PORT="18425"
1819
HOST_PORT_EXPLICIT=0
@@ -52,7 +53,7 @@ TIMEOUT_UPDATE_DEV_S="${OPENCLAW_PARALLELS_MACOS_UPDATE_DEV_TIMEOUT_S:-1200}"
5253
TIMEOUT_VERIFY_S=60
5354
TIMEOUT_ONBOARD_S=180
5455
TIMEOUT_GATEWAY_S=180
55-
TIMEOUT_AGENT_S=240
56+
TIMEOUT_AGENT_S="${OPENCLAW_PARALLELS_MACOS_AGENT_TIMEOUT_S:-240}"
5657
TIMEOUT_PERMISSION_S=60
5758
TIMEOUT_DASHBOARD_S=180
5859
TIMEOUT_SNAPSHOT_S=360
@@ -142,6 +143,8 @@ Options:
142143
both = run both lanes
143144
--provider <openai|anthropic|minimax>
144145
Provider auth/model lane. Default: openai
146+
--model <provider/model> Override the model used for the agent-turn smoke.
147+
Default: openai/gpt-5.5 for the OpenAI lane
145148
--api-key-env <var> Host env var name for provider API key.
146149
Default: OPENAI_API_KEY for openai, ANTHROPIC_API_KEY for anthropic
147150
--openai-api-key-env <var> Alias for --api-key-env (backward compatible)
@@ -184,6 +187,11 @@ while [[ $# -gt 0 ]]; do
184187
PROVIDER="$2"
185188
shift 2
186189
;;
190+
--model)
191+
MODEL_ID="$2"
192+
MODEL_ID_EXPLICIT=1
193+
shift 2
194+
;;
187195
--api-key-env|--openai-api-key-env)
188196
API_KEY_ENV="$2"
189197
shift 2
@@ -258,19 +266,19 @@ case "$PROVIDER" in
258266
openai)
259267
AUTH_CHOICE="openai-api-key"
260268
AUTH_KEY_FLAG="openai-api-key"
261-
MODEL_ID="openai/gpt-5.5"
269+
[[ "$MODEL_ID_EXPLICIT" -eq 1 ]] || MODEL_ID="${OPENCLAW_PARALLELS_OPENAI_MODEL:-openai/gpt-5.5}"
262270
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="OPENAI_API_KEY"
263271
;;
264272
anthropic)
265273
AUTH_CHOICE="apiKey"
266274
AUTH_KEY_FLAG="anthropic-api-key"
267-
MODEL_ID="anthropic/claude-sonnet-4-6"
275+
[[ "$MODEL_ID_EXPLICIT" -eq 1 ]] || MODEL_ID="${OPENCLAW_PARALLELS_ANTHROPIC_MODEL:-anthropic/claude-sonnet-4-6}"
268276
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="ANTHROPIC_API_KEY"
269277
;;
270278
minimax)
271279
AUTH_CHOICE="minimax-global-api"
272280
AUTH_KEY_FLAG="minimax-api-key"
273-
MODEL_ID="minimax/MiniMax-M2.7"
281+
[[ "$MODEL_ID_EXPLICIT" -eq 1 ]] || MODEL_ID="${OPENCLAW_PARALLELS_MINIMAX_MODEL:-minimax/MiniMax-M2.7}"
274282
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="MINIMAX_API_KEY"
275283
;;
276284
*)
@@ -1474,11 +1482,28 @@ show_gateway_status_compat() {
14741482

14751483
verify_turn() {
14761484
guest_current_user_exec "$GUEST_NODE_BIN" "$GUEST_OPENCLAW_ENTRY" models set "$MODEL_ID"
1485+
guest_current_user_exec "$GUEST_NODE_BIN" "$GUEST_OPENCLAW_ENTRY" config set agents.defaults.skipBootstrap true --strict-json
14771486
guest_current_user_sh "$(cat <<EOF
14781487
export PATH=$(shell_quote "$GUEST_EXEC_PATH")
1488+
workspace="\${OPENCLAW_WORKSPACE_DIR:-\$HOME/.openclaw/workspace}"
1489+
mkdir -p "\$workspace/.openclaw"
1490+
cat > "\$workspace/IDENTITY.md" <<'IDENTITY_EOF'
1491+
# Identity
1492+
1493+
- Name: OpenClaw
1494+
- Purpose: Parallels macOS smoke test assistant.
1495+
IDENTITY_EOF
1496+
cat > "\$workspace/.openclaw/workspace-state.json" <<'STATE_EOF'
1497+
{
1498+
"version": 1,
1499+
"setupCompletedAt": "2026-01-01T00:00:00.000Z"
1500+
}
1501+
STATE_EOF
1502+
rm -f "\$workspace/BOOTSTRAP.md"
14791503
exec /usr/bin/env $(shell_quote "$API_KEY_ENV=$API_KEY_VALUE") \
14801504
$(shell_quote "$GUEST_NODE_BIN") $(shell_quote "$GUEST_OPENCLAW_ENTRY") agent \
14811505
--agent main \
1506+
--session-id parallels-macos-smoke \
14821507
--message $(shell_quote "Reply with exact ASCII text OK only.") \
14831508
--json
14841509
EOF

0 commit comments

Comments
 (0)