fix: stabilize release validation gates · openclaw/openclaw@9feca3e
steipete
·
2026-05-17
·
via Recent Commits to openclaw:main
| Original file line number | Diff line number | Diff line change |
|---|
@@ -18,6 +18,7 @@ Docs: https://docs.openclaw.ai
|
18 | 18 | |
19 | 19 | ### Fixes |
20 | 20 | |
| 21 | +- Feishu: detect SecretRef top-level credentials as a configured default account instead of treating object-backed app secrets as missing. |
21 | 22 | - 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. |
22 | 23 | - 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. |
23 | 24 | - 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. |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -21,11 +21,12 @@ const { listAccountIds: listFeishuAccountIds, resolveDefaultAccountId } = create
|
21 | 21 | "feishu", |
22 | 22 | { |
23 | 23 | 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 | +}, |
29 | 30 | }, |
30 | 31 | ); |
31 | 32 | |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -789,7 +789,7 @@ for attempt in 1 2; do
|
789 | 789 | set +e |
790 | 790 | /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( |
791 | 791 | "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 |
793 | 793 | rc=$? |
794 | 794 | set -e |
795 | 795 | cat "$output_file" |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -1011,7 +1011,7 @@ for attempt in 1 2; do
|
1011 | 1011 | set +e |
1012 | 1012 | /usr/bin/env ${shellQuote(`${this.auth.apiKeyEnv}=${this.auth.apiKeyValue}`)} ${guestNode} ${guestOpenClawEntry} agent --local --agent main --session-id "$session_id" --message ${shellQuote( |
1013 | 1013 | "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 |
1015 | 1015 | rc=$? |
1016 | 1016 | set -e |
1017 | 1017 | cat "$output_file" |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -49,7 +49,7 @@ for attempt in 1 2; do
|
49 | 49 | rm -f "$HOME/.openclaw/agents/main/sessions/$session_id.jsonl" |
50 | 50 | output_file="$(mktemp)" |
51 | 51 | 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 |
53 | 53 | rc=$? |
54 | 54 | set -e |
55 | 55 | cat "$output_file" |
@@ -118,7 +118,7 @@ for ($attempt = 1; $attempt -le 2; $attempt++) {
|
118 | 118 | $sessionsDir = Join-Path $env:USERPROFILE '.openclaw\\agents\\main\\sessions' |
119 | 119 | $sessionPath = Join-Path $sessionsDir "$sessionId.jsonl" |
120 | 120 | 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 |
122 | 122 | if ($null -ne $output) { $output | ForEach-Object { $_ } } |
123 | 123 | if ($LASTEXITCODE -ne 0) { throw "agent failed with exit code $LASTEXITCODE" } |
124 | 124 | if (($output | Out-String) -match '"finalAssistant(Raw|Visible)Text":\\s*"OK"') { |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -782,7 +782,7 @@ for ($attempt = 1; $attempt -le 2; $attempt++) {
|
782 | 782 | '--message', |
783 | 783 | 'Reply with exact ASCII text OK only.', |
784 | 784 | '--thinking', |
785 | | - 'minimal', |
| 785 | + 'off', |
786 | 786 | '--timeout', |
787 | 787 | '${resolveParallelsModelTimeoutSeconds("windows")}', |
788 | 788 | '--json' |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -3094,7 +3094,7 @@ function buildReleaseAgentTurnArgs(sessionId) {
|
3094 | 3094 | "--message", |
3095 | 3095 | "Reply with exact ASCII text OK only.", |
3096 | 3096 | "--thinking", |
3097 | | -"minimal", |
| 3097 | +"off", |
3098 | 3098 | "--timeout", |
3099 | 3099 | String(CROSS_OS_AGENT_TURN_TIMEOUT_SECONDS), |
3100 | 3100 | "--json", |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -62,6 +62,7 @@ vi.mock("./command/attempt-execution.runtime.js", () => ({
|
62 | 62 | emitAcpLifecycleEnd: vi.fn(), |
63 | 63 | emitAcpLifecycleError: vi.fn(), |
64 | 64 | emitAcpLifecycleStart: vi.fn(), |
| 65 | +emitAcpRuntimeEvent: vi.fn(), |
65 | 66 | persistAcpTurnTranscript: (...args: unknown[]) => state.persistAcpTurnTranscriptMock(...args), |
66 | 67 | persistSessionEntry: vi.fn(), |
67 | 68 | prependInternalEventContext: (_body: string) => _body, |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -82,6 +82,15 @@ function isSchemaRecord(value: unknown): value is Record<string, unknown> {
|
82 | 82 | return !!value && typeof value === "object" && !Array.isArray(value); |
83 | 83 | } |
84 | 84 | |
| 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 | + |
85 | 94 | function hasTopLevelArrayKeyword( |
86 | 95 | schemaRecord: Record<string, unknown>, |
87 | 96 | key: TopLevelConditionalKey, |
@@ -453,7 +462,11 @@ function inlineLocalSchemaRefsWithDefs(
|
453 | 462 | if (key === "$defs" || key === "definitions") { |
454 | 463 | continue; |
455 | 464 | } |
456 | | -result[key] = inlineLocalSchemaRefsWithDefs(value, nextDefs, refStack, state); |
| 465 | +setOwnSchemaProperty( |
| 466 | +result, |
| 467 | +key, |
| 468 | +inlineLocalSchemaRefsWithDefs(value, nextDefs, refStack, state), |
| 469 | +); |
457 | 470 | } |
458 | 471 | if (state.unresolvedLocalRefs) { |
459 | 472 | if ("$defs" in obj) { |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -802,11 +802,13 @@ describe("subagent registry steer restarts", () => {
|
802 | 802 | |
803 | 803 | await vi.advanceTimersByTimeAsync(4_001); |
804 | 804 | 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 | +}); |
810 | 812 | } finally { |
811 | 813 | vi.useRealTimers(); |
812 | 814 | } |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。