

























@@ -304,10 +304,9 @@ export async function handleCodexConversationBindingResolved(
304304await clearCodexAppServerBinding(data.sessionFile);
305305}
306306307-async function attachExistingThread(params: {
307+type CodexThreadBindingParams = {
308308pluginConfig?: unknown;
309309sessionFile: string;
310-threadId: string;
311310workspaceDir: string;
312311agentDir?: string;
313312model?: string;
@@ -319,7 +318,19 @@ async function attachExistingThread(params: {
319318config?: CodexAppServerAuthProfileLookup["config"];
320319agentId?: string;
321320sessionKey?: string;
322-}): Promise<void> {
321+};
322+323+type ConversationAppServerRuntime = Awaited<ReturnType<typeof resolveConversationAppServerRuntime>>;
324+325+type CodexThreadBindingRuntime = ConversationAppServerRuntime & {
326+agentLookup: ReturnType<typeof buildAgentLookup>;
327+client: Awaited<ReturnType<typeof getLeasedSharedCodexAppServerClient>>;
328+modelProvider?: string;
329+};
330+331+async function resolveThreadBindingRuntime(
332+params: CodexThreadBindingParams,
333+): Promise<CodexThreadBindingRuntime> {
323334const { execPolicy, runtime } = await resolveConversationAppServerRuntime({
324335pluginConfig: params.pluginConfig,
325336config: params.config,
@@ -339,139 +350,112 @@ async function attachExistingThread(params: {
339350authProfileId: params.authProfileId,
340351 ...agentLookup,
341352});
353+return { execPolicy, runtime, agentLookup, modelProvider, client };
354+}
355+356+function buildThreadRequestRuntimeOptions(
357+params: CodexThreadBindingParams,
358+resolved: CodexThreadBindingRuntime,
359+): {
360+approvalPolicy: ConversationAppServerRuntime["runtime"]["approvalPolicy"];
361+approvalsReviewer: ConversationAppServerRuntime["runtime"]["approvalsReviewer"];
362+sandbox: ConversationAppServerRuntime["runtime"]["sandbox"];
363+serviceTier?: CodexServiceTier;
364+} {
365+const serviceTier = params.serviceTier ?? resolved.runtime.serviceTier;
366+return {
367+approvalPolicy: resolved.execPolicy?.touched
368+ ? resolved.runtime.approvalPolicy
369+ : (params.approvalPolicy ?? resolved.runtime.approvalPolicy),
370+approvalsReviewer: resolved.runtime.approvalsReviewer,
371+sandbox: resolved.execPolicy?.touched
372+ ? resolved.runtime.sandbox
373+ : (params.sandbox ?? resolved.runtime.sandbox),
374+ ...(serviceTier ? { serviceTier } : {}),
375+};
376+}
377+378+async function writeThreadBindingFromResponse(
379+params: CodexThreadBindingParams,
380+resolved: CodexThreadBindingRuntime,
381+response: CodexThreadResumeResponse | CodexThreadStartResponse,
382+): Promise<void> {
383+const runtimeApprovalPolicy =
384+typeof resolved.runtime.approvalPolicy === "string"
385+ ? resolved.runtime.approvalPolicy
386+ : undefined;
387+await writeCodexAppServerBinding(
388+params.sessionFile,
389+{
390+threadId: response.thread.id,
391+cwd: response.thread.cwd ?? params.workspaceDir,
392+authProfileId: params.authProfileId,
393+model: response.model ?? params.model,
394+modelProvider: normalizeCodexAppServerBindingModelProvider({
395+authProfileId: params.authProfileId,
396+modelProvider: response.modelProvider ?? params.modelProvider,
397+ ...resolved.agentLookup,
398+}),
399+approvalPolicy: resolved.execPolicy?.touched
400+ ? runtimeApprovalPolicy
401+ : (params.approvalPolicy ?? runtimeApprovalPolicy),
402+sandbox: resolved.execPolicy?.touched
403+ ? resolved.runtime.sandbox
404+ : (params.sandbox ?? resolved.runtime.sandbox),
405+serviceTier: params.serviceTier ?? resolved.runtime.serviceTier,
406+},
407+{
408+ ...resolved.agentLookup,
409+},
410+);
411+}
412+413+async function attachExistingThread(
414+params: CodexThreadBindingParams & {
415+threadId: string;
416+},
417+): Promise<void> {
418+const resolved = await resolveThreadBindingRuntime(params);
342419try {
343-const response: CodexThreadResumeResponse = await client.request(
420+const response: CodexThreadResumeResponse = await resolved.client.request(
344421CODEX_CONTROL_METHODS.resumeThread,
345422{
346423threadId: params.threadId,
347424 ...(params.model ? { model: params.model } : {}),
348- ...(modelProvider ? { modelProvider } : {}),
425+ ...(resolved.modelProvider ? { modelProvider: resolved.modelProvider } : {}),
349426personality: CODEX_NATIVE_PERSONALITY_NONE,
350-approvalPolicy: execPolicy?.touched
351- ? runtime.approvalPolicy
352- : (params.approvalPolicy ?? runtime.approvalPolicy),
353-approvalsReviewer: runtime.approvalsReviewer,
354-sandbox: execPolicy?.touched ? runtime.sandbox : (params.sandbox ?? runtime.sandbox),
355- ...((params.serviceTier ?? runtime.serviceTier)
356- ? { serviceTier: params.serviceTier ?? runtime.serviceTier }
357- : {}),
427+ ...buildThreadRequestRuntimeOptions(params, resolved),
358428persistExtendedHistory: true,
359429},
360-{ timeoutMs: runtime.requestTimeoutMs },
361-);
362-const thread = response.thread;
363-const runtimeApprovalPolicy =
364-typeof runtime.approvalPolicy === "string" ? runtime.approvalPolicy : undefined;
365-await writeCodexAppServerBinding(
366-params.sessionFile,
367-{
368-threadId: thread.id,
369-cwd: thread.cwd ?? params.workspaceDir,
370-authProfileId: params.authProfileId,
371-model: response.model ?? params.model,
372-modelProvider: normalizeCodexAppServerBindingModelProvider({
373-authProfileId: params.authProfileId,
374-modelProvider: response.modelProvider ?? params.modelProvider,
375- ...agentLookup,
376-}),
377-approvalPolicy: execPolicy?.touched
378- ? runtimeApprovalPolicy
379- : (params.approvalPolicy ?? runtimeApprovalPolicy),
380-sandbox: execPolicy?.touched ? runtime.sandbox : (params.sandbox ?? runtime.sandbox),
381-serviceTier: params.serviceTier ?? runtime.serviceTier,
382-},
383-{
384- ...agentLookup,
385-},
430+{ timeoutMs: resolved.runtime.requestTimeoutMs },
386431);
432+await writeThreadBindingFromResponse(params, resolved, response);
387433} finally {
388-releaseLeasedSharedCodexAppServerClient(client);
434+releaseLeasedSharedCodexAppServerClient(resolved.client);
389435}
390436}
391437392-async function createThread(params: {
393-pluginConfig?: unknown;
394-sessionFile: string;
395-workspaceDir: string;
396-agentDir?: string;
397-model?: string;
398-modelProvider?: string;
399-authProfileId?: string;
400-approvalPolicy?: CodexAppServerApprovalPolicy;
401-sandbox?: CodexAppServerSandboxMode;
402-serviceTier?: CodexServiceTier;
403-config?: CodexAppServerAuthProfileLookup["config"];
404-agentId?: string;
405-sessionKey?: string;
406-}): Promise<void> {
407-const { execPolicy, runtime } = await resolveConversationAppServerRuntime({
408-pluginConfig: params.pluginConfig,
409-config: params.config,
410-agentId: params.agentId,
411-sessionKey: params.sessionKey,
412-workspaceDir: params.workspaceDir,
413-});
414-const agentLookup = buildAgentLookup({ agentDir: params.agentDir, config: params.config });
415-const modelProvider = resolveThreadRequestModelProvider({
416-authProfileId: params.authProfileId,
417-modelProvider: params.modelProvider,
418- ...agentLookup,
419-});
420-const client = await getLeasedSharedCodexAppServerClient({
421-startOptions: runtime.start,
422-timeoutMs: runtime.requestTimeoutMs,
423-authProfileId: params.authProfileId,
424- ...agentLookup,
425-});
438+async function createThread(params: CodexThreadBindingParams): Promise<void> {
439+const resolved = await resolveThreadBindingRuntime(params);
426440try {
427-const response: CodexThreadStartResponse = await client.request(
441+const response: CodexThreadStartResponse = await resolved.client.request(
428442"thread/start",
429443{
430444cwd: params.workspaceDir,
431445 ...(params.model ? { model: params.model } : {}),
432- ...(modelProvider ? { modelProvider } : {}),
446+ ...(resolved.modelProvider ? { modelProvider: resolved.modelProvider } : {}),
433447personality: CODEX_NATIVE_PERSONALITY_NONE,
434-approvalPolicy: execPolicy?.touched
435- ? runtime.approvalPolicy
436- : (params.approvalPolicy ?? runtime.approvalPolicy),
437-approvalsReviewer: runtime.approvalsReviewer,
438-sandbox: execPolicy?.touched ? runtime.sandbox : (params.sandbox ?? runtime.sandbox),
439- ...((params.serviceTier ?? runtime.serviceTier)
440- ? { serviceTier: params.serviceTier ?? runtime.serviceTier }
441- : {}),
448+ ...buildThreadRequestRuntimeOptions(params, resolved),
442449developerInstructions:
443450"This Codex thread is bound to an OpenClaw conversation. Answer normally; OpenClaw will deliver your final response back to the conversation.",
444451experimentalRawEvents: true,
445452persistExtendedHistory: true,
446453},
447-{ timeoutMs: runtime.requestTimeoutMs },
448-);
449-const runtimeApprovalPolicy =
450-typeof runtime.approvalPolicy === "string" ? runtime.approvalPolicy : undefined;
451-await writeCodexAppServerBinding(
452-params.sessionFile,
453-{
454-threadId: response.thread.id,
455-cwd: response.thread.cwd ?? params.workspaceDir,
456-authProfileId: params.authProfileId,
457-model: response.model ?? params.model,
458-modelProvider: normalizeCodexAppServerBindingModelProvider({
459-authProfileId: params.authProfileId,
460-modelProvider: response.modelProvider ?? params.modelProvider,
461- ...agentLookup,
462-}),
463-approvalPolicy: execPolicy?.touched
464- ? runtimeApprovalPolicy
465- : (params.approvalPolicy ?? runtimeApprovalPolicy),
466-sandbox: execPolicy?.touched ? runtime.sandbox : (params.sandbox ?? runtime.sandbox),
467-serviceTier: params.serviceTier ?? runtime.serviceTier,
468-},
469-{
470- ...agentLookup,
471-},
454+{ timeoutMs: resolved.runtime.requestTimeoutMs },
472455);
456+await writeThreadBindingFromResponse(params, resolved, response);
473457} finally {
474-releaseLeasedSharedCodexAppServerClient(client);
458+releaseLeasedSharedCodexAppServerClient(resolved.client);
475459}
476460}
477461此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。