Skip to content

Commit 69a0c92

Browse files
Kaspresteipete
andauthored
fix(codex): cover side-question native hooks (#82559)
* fix(codex): cover side-question native hooks * fix(codex): enforce native approvals for app-server requests * fix(codex): preserve approval fallback after native relay noop * fix(codex): satisfy approval relay json typing * fix(codex): run approval relay in report mode * fix(codex): keep relay pre-tool decisions deny-only * fix(codex): remove dead relay approval branch * fix(codex): dedupe app-server relay approvals * fix(codex): fail closed on native relay rewrites * fix(codex): preserve side-question provider context * fix(codex): route side-question replies to origin * fix(codex): preserve native hook channel context * test(codex): align native relay rewrite assertion * fix(codex): align side-question hook config * fix(codex): route side-question approvals safely * test(codex): fix side-question hook typing * fix(codex): preserve side-question hook policy context * fix(codex): close native hook relay review gaps * fix(codex): keep dynamic tool hook channel context * fix(codex): preserve native finalize hook channel context * fix(codex): scope dynamic tool result hooks by channel * fix(codex): drop stale deadcode allowlist entry --------- Co-authored-by: Peter Steinberger <steipete@gmail.com>
1 parent 3fcc8b1 commit 69a0c92

25 files changed

Lines changed: 2054 additions & 53 deletions

CHANGELOG.md

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

119119
### Fixes
120120

121+
- Codex/app-server: cover `/btw` side-question native hooks and app-server command approvals without relying on unsupported turn-scoped hook config. (#82559) Thanks @Kaspre.
121122
- Gateway/Docker: fail closed for non-loopback gateway starts without explicit shared-secret or trusted-proxy auth, and stop the image default command from bypassing config validation. Fixes #82865. (#82866) Thanks @coygeek.
122123
- Agents/followups: route queued followup turns through CLI runtime backends instead of embedded harness lookup, preventing `claude-cli`/`google-gemini-cli` followups from failing before delivery. Fixes #82847. (#82857) Thanks @hclsys.
123124
- CLI/sessions: let `openclaw sessions cleanup --fix-missing` prune malformed rows with unresolvable transcript metadata instead of throwing. Fixes #80970. (#82745) Thanks @IWhatsskill.

extensions/codex/harness.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@ export function createCodexAppServerAgentHarness(options?: {
4545
},
4646
runSideQuestion: async (params) => {
4747
const { runCodexAppServerSideQuestion } = await import("./src/app-server/side-question.js");
48-
return runCodexAppServerSideQuestion(params, { pluginConfig: options?.pluginConfig });
48+
return runCodexAppServerSideQuestion(params, {
49+
pluginConfig: options?.pluginConfig,
50+
nativeHookRelay: { enabled: true },
51+
});
4952
},
5053
compact: async (params) => {
5154
const { maybeCompactCodexAppServerSession } = await import("./src/app-server/compact.js");

extensions/codex/index.test.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,14 @@ import { createCodexAppServerAgentHarness } from "./harness.js";
55
import plugin from "./index.js";
66

77
const runCodexAppServerAttemptMock = vi.hoisted(() => vi.fn());
8+
const runCodexAppServerSideQuestionMock = vi.hoisted(() => vi.fn());
89

910
vi.mock("./src/app-server/run-attempt.js", () => ({
1011
runCodexAppServerAttempt: runCodexAppServerAttemptMock,
1112
}));
13+
vi.mock("./src/app-server/side-question.js", () => ({
14+
runCodexAppServerSideQuestion: runCodexAppServerSideQuestionMock,
15+
}));
1216

1317
function mockCall(mock: { mock: { calls: unknown[][] } }, index = 0) {
1418
return mock.mock.calls.at(index);
@@ -145,4 +149,24 @@ describe("codex plugin", () => {
145149
},
146150
);
147151
});
152+
153+
it("enables the native hook relay for public Codex side questions", async () => {
154+
const harness = createCodexAppServerAgentHarness({ pluginConfig: { appServer: {} } });
155+
const runSideQuestion = harness.runSideQuestion;
156+
const result = { text: "ok" };
157+
runCodexAppServerSideQuestionMock.mockResolvedValueOnce(result);
158+
159+
if (!runSideQuestion) {
160+
throw new Error("Expected Codex harness to expose side questions");
161+
}
162+
await expect(runSideQuestion({ question: "btw" } as never)).resolves.toBe(result);
163+
164+
expect(runCodexAppServerSideQuestionMock).toHaveBeenCalledWith(
165+
{ question: "btw" },
166+
{
167+
pluginConfig: { appServer: {} },
168+
nativeHookRelay: { enabled: true },
169+
},
170+
);
171+
});
148172
});

0 commit comments

Comments
 (0)