Skip to content

Commit 9feca3e

Browse files
committed
fix: stabilize release validation gates
1 parent 8dd91b1 commit 9feca3e

18 files changed

Lines changed: 81 additions & 41 deletions

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ Docs: https://docs.openclaw.ai
1818

1919
### Fixes
2020

21+
- Feishu: detect SecretRef top-level credentials as a configured default account instead of treating object-backed app secrets as missing.
2122
- Providers/Google: preserve and recover Gemini 3 tool-call thought signatures during native replay so function-calling turns no longer fail with missing `thought_signature` 400s. Fixes #72879. (#80358) Thanks @abnershang.
2223
- Gateway/secrets: split the lightweight secrets runtime state and auth-store cache from the full secrets runtime and take a startup fast path when the gateway startup config has no SecretRef values, speeding up secrets startup while preserving cleanup and refresh semantics.
2324
- Gateway/restart: drain pending replies and active chat runs during restart shutdown before sockets and channels close, aborting timed-out chat runs through the normal cleanup path. (#69121) Thanks @alexlomt.

extensions/feishu/src/accounts.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,12 @@ const { listAccountIds: listFeishuAccountIds, resolveDefaultAccountId } = create
2121
"feishu",
2222
{
2323
allowUnlistedDefaultAccount: true,
24-
hasImplicitDefaultAccount: (cfg) =>
25-
Boolean(
26-
cfg.channels?.feishu?.appId?.trim() &&
27-
hasConfiguredAccountValue(cfg.channels.feishu.appSecret),
28-
),
24+
hasImplicitDefaultAccount: (cfg) => {
25+
const feishu = cfg.channels?.feishu;
26+
return (
27+
hasConfiguredAccountValue(feishu?.appId) && hasConfiguredAccountValue(feishu?.appSecret)
28+
);
29+
},
2930
},
3031
);
3132

scripts/e2e/parallels/linux-smoke.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -789,7 +789,7 @@ for attempt in 1 2; do
789789
set +e
790790
/usr/bin/env OPENCLAW_ALLOW_ROOT=1 ${shellQuote(`${this.auth.apiKeyEnv}=${this.auth.apiKeyValue}`)} openclaw agent --local --agent main --session-id "$session_id" --message ${shellQuote(
791791
"Reply with exact ASCII text OK only.",
792-
)} --thinking minimal --timeout ${resolveParallelsModelTimeoutSeconds("linux")} --json >"$output_file" 2>&1
792+
)} --thinking off --timeout ${resolveParallelsModelTimeoutSeconds("linux")} --json >"$output_file" 2>&1
793793
rc=$?
794794
set -e
795795
cat "$output_file"

scripts/e2e/parallels/macos-smoke.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1011,7 +1011,7 @@ for attempt in 1 2; do
10111011
set +e
10121012
/usr/bin/env ${shellQuote(`${this.auth.apiKeyEnv}=${this.auth.apiKeyValue}`)} ${guestNode} ${guestOpenClawEntry} agent --local --agent main --session-id "$session_id" --message ${shellQuote(
10131013
"Reply with exact ASCII text OK only.",
1014-
)} --thinking minimal --timeout ${resolveParallelsModelTimeoutSeconds("macos")} --json >"$output_file" 2>&1
1014+
)} --thinking off --timeout ${resolveParallelsModelTimeoutSeconds("macos")} --json >"$output_file" 2>&1
10151015
rc=$?
10161016
set -e
10171017
cat "$output_file"

scripts/e2e/parallels/npm-update-scripts.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ for attempt in 1 2; do
4949
rm -f "$HOME/.openclaw/agents/main/sessions/$session_id.jsonl"
5050
output_file="$(mktemp)"
5151
set +e
52-
OPENCLAW_ALLOW_ROOT="\${OPENCLAW_ALLOW_ROOT:-}" ${input.auth.apiKeyEnv}=${shellQuote(input.auth.apiKeyValue)} ${command} agent --local --agent main --session-id "$session_id" --message 'Reply with exact ASCII text OK only.' --thinking minimal --json >"$output_file" 2>&1
52+
OPENCLAW_ALLOW_ROOT="\${OPENCLAW_ALLOW_ROOT:-}" ${input.auth.apiKeyEnv}=${shellQuote(input.auth.apiKeyValue)} ${command} agent --local --agent main --session-id "$session_id" --message 'Reply with exact ASCII text OK only.' --thinking off --json >"$output_file" 2>&1
5353
rc=$?
5454
set -e
5555
cat "$output_file"
@@ -118,7 +118,7 @@ for ($attempt = 1; $attempt -le 2; $attempt++) {
118118
$sessionsDir = Join-Path $env:USERPROFILE '.openclaw\\agents\\main\\sessions'
119119
$sessionPath = Join-Path $sessionsDir "$sessionId.jsonl"
120120
Remove-Item $sessionPath -Force -ErrorAction SilentlyContinue
121-
$output = Invoke-OpenClaw agent --local --agent main --session-id $sessionId --model ${psSingleQuote(input.auth.modelId)} --message 'Reply with exact ASCII text OK only.' --thinking minimal --timeout ${resolveParallelsModelTimeoutSeconds("windows")} --json 2>&1
121+
$output = Invoke-OpenClaw agent --local --agent main --session-id $sessionId --model ${psSingleQuote(input.auth.modelId)} --message 'Reply with exact ASCII text OK only.' --thinking off --timeout ${resolveParallelsModelTimeoutSeconds("windows")} --json 2>&1
122122
if ($null -ne $output) { $output | ForEach-Object { $_ } }
123123
if ($LASTEXITCODE -ne 0) { throw "agent failed with exit code $LASTEXITCODE" }
124124
if (($output | Out-String) -match '"finalAssistant(Raw|Visible)Text":\\s*"OK"') {

scripts/e2e/parallels/windows-smoke.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -782,7 +782,7 @@ for ($attempt = 1; $attempt -le 2; $attempt++) {
782782
'--message',
783783
'Reply with exact ASCII text OK only.',
784784
'--thinking',
785-
'minimal',
785+
'off',
786786
'--timeout',
787787
'${resolveParallelsModelTimeoutSeconds("windows")}',
788788
'--json'

scripts/openclaw-cross-os-release-checks.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3094,7 +3094,7 @@ function buildReleaseAgentTurnArgs(sessionId) {
30943094
"--message",
30953095
"Reply with exact ASCII text OK only.",
30963096
"--thinking",
3097-
"minimal",
3097+
"off",
30983098
"--timeout",
30993099
String(CROSS_OS_AGENT_TURN_TIMEOUT_SECONDS),
31003100
"--json",

src/agents/agent-command.live-model-switch.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ vi.mock("./command/attempt-execution.runtime.js", () => ({
6262
emitAcpLifecycleEnd: vi.fn(),
6363
emitAcpLifecycleError: vi.fn(),
6464
emitAcpLifecycleStart: vi.fn(),
65+
emitAcpRuntimeEvent: vi.fn(),
6566
persistAcpTurnTranscript: (...args: unknown[]) => state.persistAcpTurnTranscriptMock(...args),
6667
persistSessionEntry: vi.fn(),
6768
prependInternalEventContext: (_body: string) => _body,

src/agents/pi-tools-parameter-schema.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,15 @@ function isSchemaRecord(value: unknown): value is Record<string, unknown> {
8282
return !!value && typeof value === "object" && !Array.isArray(value);
8383
}
8484

85+
function setOwnSchemaProperty(target: Record<string, unknown>, key: string, value: unknown): void {
86+
Object.defineProperty(target, key, {
87+
value,
88+
enumerable: true,
89+
configurable: true,
90+
writable: true,
91+
});
92+
}
93+
8594
function hasTopLevelArrayKeyword(
8695
schemaRecord: Record<string, unknown>,
8796
key: TopLevelConditionalKey,
@@ -453,7 +462,11 @@ function inlineLocalSchemaRefsWithDefs(
453462
if (key === "$defs" || key === "definitions") {
454463
continue;
455464
}
456-
result[key] = inlineLocalSchemaRefsWithDefs(value, nextDefs, refStack, state);
465+
setOwnSchemaProperty(
466+
result,
467+
key,
468+
inlineLocalSchemaRefsWithDefs(value, nextDefs, refStack, state),
469+
);
457470
}
458471
if (state.unresolvedLocalRefs) {
459472
if ("$defs" in obj) {

src/agents/subagent-registry.steer-restart.test.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -802,11 +802,13 @@ describe("subagent registry steer restarts", () => {
802802

803803
await vi.advanceTimersByTimeAsync(4_001);
804804
expect(announceSpy).toHaveBeenCalledTimes(3);
805-
const run = listMainRuns()[0];
806-
expect(run?.pendingFinalDelivery).toBe(true);
807-
expect(run?.deliverySuspendedAt).toBeTypeOf("number");
808-
expect(run?.deliverySuspendedReason).toBe("retry-limit");
809-
expect(run?.cleanupCompletedAt).toBeUndefined();
805+
await waitForRegistrySideEffect(() => {
806+
const run = listMainRuns()[0];
807+
expect(run?.pendingFinalDelivery).toBe(true);
808+
expect(run?.deliverySuspendedAt).toBeTypeOf("number");
809+
expect(run?.deliverySuspendedReason).toBe("retry-limit");
810+
expect(run?.cleanupCompletedAt).toBeUndefined();
811+
});
810812
} finally {
811813
vi.useRealTimers();
812814
}

0 commit comments

Comments
 (0)