import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts"; import { mutateConfigFile } from "openclaw/plugin-sdk/config-mutation"; import { resolveLivePluginConfigObject } from "openclaw/plugin-sdk/plugin-config-runtime"; import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry"; import { createCodexAppServerAgentHarness } from "./harness.js"; import { buildCodexMediaUnderstandingProvider } from "./media-understanding-provider.js"; import { buildCodexProvider } from "./provider.js"; import type { CodexPluginsConfigBlock } from "./src/command-plugins-management.js"; import { createCodexCommand } from "./src/commands.js"; import { handleCodexConversationBindingResolved, handleCodexConversationInboundClaim, } from "./src/conversation-binding.js"; import { buildCodexMigrationProvider } from "./src/migration/provider.js"; import { createCodexCliSessionNodeHostCommands, createCodexCliSessionNodeInvokePolicies, listCodexCliSessionsOnNode, resumeCodexCliSessionOnNode, resolveCodexCliSessionForBindingOnNode, } from "./src/node-cli-sessions.js"; export default definePluginEntry({ id: "codex", name: "Codex", description: "Codex app-server harness and Codex-managed GPT model catalog.", register(api) { const resolveCurrentPluginConfig = () => resolveLivePluginConfigObject( api.runtime.config?.current ? () => api.runtime.config.current() as OpenClawConfig : undefined, "codex", api.pluginConfig as Record, ) ?? api.pluginConfig; api.registerAgentHarness( createCodexAppServerAgentHarness({ resolvePluginConfig: resolveCurrentPluginConfig }), ); api.registerProvider(buildCodexProvider({ pluginConfig: api.pluginConfig })); api.registerMediaUnderstandingProvider( buildCodexMediaUnderstandingProvider({ pluginConfig: api.pluginConfig }), ); api.registerMigrationProvider(buildCodexMigrationProvider({ runtime: api.runtime })); for (const command of createCodexCliSessionNodeHostCommands()) { api.registerNodeHostCommand(command); } for (const policy of createCodexCliSessionNodeInvokePolicies()) { api.registerNodeInvokePolicy(policy); } api.registerCommand( createCodexCommand({ pluginConfig: api.pluginConfig, deps: { listCodexCliSessionsOnNode: (params) => listCodexCliSessionsOnNode({ runtime: api.runtime, ...params }), resolveCodexCliSessionForBindingOnNode: (params) => resolveCodexCliSessionForBindingOnNode({ runtime: api.runtime, ...params }), codexPluginsManagementIo: { readConfig: () => { const current = (api.runtime.config?.current?.() ?? {}) as OpenClawConfig; const plugins = (current as Record).plugins; if (!plugins || typeof plugins !== "object") { return Promise.resolve({}); } const entries = (plugins as Record).entries; if (!entries || typeof entries !== "object") { return Promise.resolve({}); } const codexEntry = (entries as Record).codex; if (!codexEntry || typeof codexEntry !== "object") { return Promise.resolve({}); } const config = (codexEntry as Record).config; if (!config || typeof config !== "object") { return Promise.resolve({}); } const codexPlugins = (config as Record).codexPlugins; if (!codexPlugins || typeof codexPlugins !== "object") { return Promise.resolve({}); } const declared = (codexPlugins as Record).plugins; if (!declared || typeof declared !== "object") { return Promise.resolve({ enabled: (codexPlugins as Record).enabled === true, }); } return Promise.resolve({ enabled: (codexPlugins as Record).enabled === true, plugins: declared as Record, }); }, mutate: async (update) => { await mutateConfigFile({ mutate: (draft) => { const root = draft as Record; root.plugins = (root.plugins ?? {}) as Record; const pluginsBlock = root.plugins as Record; pluginsBlock.entries = (pluginsBlock.entries ?? {}) as Record; const entries = pluginsBlock.entries as Record; entries.codex = (entries.codex ?? {}) as Record; const codexEntry = entries.codex as Record; codexEntry.config = (codexEntry.config ?? {}) as Record; const config = codexEntry.config as Record; config.codexPlugins = (config.codexPlugins ?? {}) as Record; const codexPlugins = config.codexPlugins as Record; codexPlugins.plugins = (codexPlugins.plugins ?? {}) as Record; update(codexPlugins as CodexPluginsConfigBlock); }, }); }, }, }, }), ); api.on("inbound_claim", (event, ctx) => handleCodexConversationInboundClaim(event, ctx, { config: api.runtime.config?.current?.() as OpenClawConfig | undefined, pluginConfig: resolveCurrentPluginConfig(), resumeCodexCliSessionOnNode: (params) => resumeCodexCliSessionOnNode({ runtime: api.runtime, ...params }), }), ); api.onConversationBindingResolved?.(handleCodexConversationBindingResolved); }, });