fix(codex): narrow legacy hook generation grace (#87386) · openclaw/openclaw@cc2948d
RomneyDa
·
2026-05-28
·
via Recent Commits to openclaw:main
File tree
extensions/codex/src/app-server
| Original file line number | Diff line number | Diff line change |
|---|
@@ -527,6 +527,21 @@ describe("runCodexAppServerAttempt native hook relay", () => {
|
527 | 527 | }, |
528 | 528 | }), |
529 | 529 | ).resolves.toMatchObject({ exitCode: 0 }); |
| 530 | +await expect( |
| 531 | +invokeNativeHookRelay({ |
| 532 | +provider: "codex", |
| 533 | + relayId, |
| 534 | +generation: "different-legacy-generation", |
| 535 | +event: "pre_tool_use", |
| 536 | +requireGeneration: true, |
| 537 | +rawPayload: { |
| 538 | +hook_event_name: "PreToolUse", |
| 539 | +tool_name: "Bash", |
| 540 | +tool_use_id: "unexpected-stale-generation", |
| 541 | +tool_input: { command: "pwd" }, |
| 542 | +}, |
| 543 | +}), |
| 544 | +).rejects.toThrow("native hook relay bridge stale registration"); |
530 | 545 | |
531 | 546 | await harness.completeTurn({ threadId: "thread-existing", turnId: "turn-1" }); |
532 | 547 | await run; |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -772,6 +772,21 @@ describe("native hook relay registry", () => {
|
772 | 772 | runId: "run-1", |
773 | 773 | event: "pre_tool_use", |
774 | 774 | }); |
| 775 | + |
| 776 | +await expect( |
| 777 | +invokeNativeHookRelayBridge({ |
| 778 | +provider: "codex", |
| 779 | +relayId: relay.relayId, |
| 780 | +generation: "different-stale-generation", |
| 781 | +event: "pre_tool_use", |
| 782 | +timeoutMs: 2_000, |
| 783 | +rawPayload: { |
| 784 | +hook_event_name: "PreToolUse", |
| 785 | +tool_name: "Bash", |
| 786 | +tool_input: { command: "pnpm test" }, |
| 787 | +}, |
| 788 | +}), |
| 789 | +).rejects.toThrow("native hook relay bridge stale registration"); |
775 | 790 | }); |
776 | 791 | |
777 | 792 | it("rejects bootstrap generation mismatches after the grace window", async () => { |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -75,6 +75,7 @@ export type NativeHookRelayRegistration = {
|
75 | 75 | relayId: string; |
76 | 76 | provider: NativeHookRelayProvider; |
77 | 77 | generationMismatchGraceExpiresAtMs?: number; |
| 78 | +generationMismatchGraceAcceptedGeneration?: string; |
78 | 79 | agentId?: string; |
79 | 80 | sessionId: string; |
80 | 81 | sessionKey?: string; |
@@ -540,7 +541,7 @@ export async function invokeNativeHookRelay(
|
540 | 541 | if (params.requireGeneration) { |
541 | 542 | const generation = readNonEmptyString(params.generation, "generation"); |
542 | 543 | if (generation !== registration.generation) { |
543 | | -if (!canAcceptNativeHookRelayGenerationMismatch(registration)) { |
| 544 | +if (!canAcceptNativeHookRelayGenerationMismatch(registration, generation)) { |
544 | 545 | throw new Error(NATIVE_HOOK_RELAY_BRIDGE_STALE_REGISTRATION_ERROR); |
545 | 546 | } |
546 | 547 | log.debug("native hook relay accepted bootstrap generation mismatch", { |
@@ -678,9 +679,17 @@ function removeNativeHookRelayInvocations(relayId: string): void {
|
678 | 679 | |
679 | 680 | function canAcceptNativeHookRelayGenerationMismatch( |
680 | 681 | registration: NativeHookRelayRegistration, |
| 682 | +generation: string, |
681 | 683 | ): boolean { |
682 | 684 | const expiresAtMs = registration.generationMismatchGraceExpiresAtMs; |
683 | | -return typeof expiresAtMs === "number" && Date.now() <= expiresAtMs; |
| 685 | +if (typeof expiresAtMs !== "number" || Date.now() > expiresAtMs) { |
| 686 | +return false; |
| 687 | +} |
| 688 | +if (registration.generationMismatchGraceAcceptedGeneration) { |
| 689 | +return registration.generationMismatchGraceAcceptedGeneration === generation; |
| 690 | +} |
| 691 | +registration.generationMismatchGraceAcceptedGeneration = generation; |
| 692 | +return true; |
684 | 693 | } |
685 | 694 | |
686 | 695 | function pruneExpiredNativeHookRelays(now = Date.now()): void { |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。