
























@@ -6,6 +6,7 @@ import {
66extractToolResultMediaArtifact,
77filterToolResultMediaUrls,
88HEARTBEAT_RESPONSE_TOOL_NAME,
9+type EmbeddedRunAttemptParams,
910isToolWrappedWithBeforeToolCallHook,
1011isMessagingTool,
1112isMessagingToolSendAction,
@@ -24,6 +25,16 @@ import {
2425type JsonValue,
2526} from "./protocol.js";
262728+type CodexDynamicToolHookContext = {
29+agentId?: string;
30+config?: EmbeddedRunAttemptParams["config"];
31+sessionId?: string;
32+sessionKey?: string;
33+runId?: string;
34+};
35+36+type CodexToolResultHookContext = Omit<CodexDynamicToolHookContext, "config">;
37+2738export type CodexDynamicToolBridge = {
2839specs: CodexDynamicToolSpec[];
2940handleToolCall: (
@@ -45,13 +56,9 @@ export type CodexDynamicToolBridge = {
4556export function createCodexDynamicToolBridge(params: {
4657tools: AnyAgentTool[];
4758signal: AbortSignal;
48-hookContext?: {
49-agentId?: string;
50-sessionId?: string;
51-sessionKey?: string;
52-runId?: string;
53-};
59+hookContext?: CodexDynamicToolHookContext;
5460}): CodexDynamicToolBridge {
61+const toolResultHookContext = toToolResultHookContext(params.hookContext);
5562const tools = params.tools.map((tool) =>
5663isToolWrappedWithBeforeToolCallHook(tool)
5764 ? tool
@@ -68,11 +75,10 @@ export function createCodexDynamicToolBridge(params: {
6875};
6976const middlewareRunner = createAgentToolResultMiddlewareRunner({
7077runtime: "codex",
71- ...params.hookContext,
78+ ...toolResultHookContext,
7279});
73-const legacyExtensionRunner = createCodexAppServerToolResultExtensionRunner(
74-params.hookContext ?? {},
75-);
80+const legacyExtensionRunner =
81+createCodexAppServerToolResultExtensionRunner(toolResultHookContext);
76827783return {
7884specs: tools.map((tool) => ({
@@ -124,10 +130,10 @@ export function createCodexDynamicToolBridge(params: {
124130void runAgentHarnessAfterToolCallHook({
125131toolName: tool.name,
126132toolCallId: call.callId,
127-runId: params.hookContext?.runId,
128-agentId: params.hookContext?.agentId,
129-sessionId: params.hookContext?.sessionId,
130-sessionKey: params.hookContext?.sessionKey,
133+runId: toolResultHookContext.runId,
134+agentId: toolResultHookContext.agentId,
135+sessionId: toolResultHookContext.sessionId,
136+sessionKey: toolResultHookContext.sessionKey,
131137startArgs: args,
132138 result,
133139 startedAt,
@@ -147,10 +153,10 @@ export function createCodexDynamicToolBridge(params: {
147153void runAgentHarnessAfterToolCallHook({
148154toolName: tool.name,
149155toolCallId: call.callId,
150-runId: params.hookContext?.runId,
151-agentId: params.hookContext?.agentId,
152-sessionId: params.hookContext?.sessionId,
153-sessionKey: params.hookContext?.sessionKey,
156+runId: toolResultHookContext.runId,
157+agentId: toolResultHookContext.agentId,
158+sessionId: toolResultHookContext.sessionId,
159+sessionKey: toolResultHookContext.sessionKey,
154160startArgs: args,
155161error: error instanceof Error ? error.message : String(error),
156162 startedAt,
@@ -169,6 +175,18 @@ export function createCodexDynamicToolBridge(params: {
169175};
170176}
171177178+function toToolResultHookContext(
179+ctx: CodexDynamicToolHookContext | undefined,
180+): CodexToolResultHookContext {
181+const { agentId, sessionId, sessionKey, runId } = ctx ?? {};
182+return {
183+ ...(agentId && { agentId }),
184+ ...(sessionId && { sessionId }),
185+ ...(sessionKey && { sessionKey }),
186+ ...(runId && { runId }),
187+};
188+}
189+172190function composeAbortSignals(...signals: Array<AbortSignal | undefined>): AbortSignal {
173191const activeSignals = signals.filter((signal): signal is AbortSignal => Boolean(signal));
174192if (activeSignals.length === 0) {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。