@@ -31,7 +31,7 @@ const MODEL_ACTION = "model_select";
3131const WORKING_DIR_BLOCK = "working_dir" ;
3232const WORKING_DIR_ACTION = "working_dir_input" ;
3333
34- type AgentProvider = "opencode" | "claudecode" ;
34+ type AgentProvider = "opencode" | "claudecode" | "codex" ;
3535
3636function normalizeModel ( value : string ) : string {
3737 return value . trim ( ) . toLowerCase ( ) ;
@@ -45,14 +45,17 @@ function findMatchingModel(models: string[], value: string | null | undefined):
4545
4646function getSelectableProviders ( ) : AgentProvider [ ] {
4747 const enabled = getEnabledAgentProviders ( ) . filter (
48- ( provider ) : provider is AgentProvider => provider === "opencode" || provider === "claudecode"
48+ ( provider ) : provider is AgentProvider =>
49+ provider === "opencode" || provider === "claudecode" || provider === "codex"
4950 ) ;
5051 if ( enabled . length > 0 ) return enabled ;
51- return [ "opencode" , "claudecode" ] ;
52+ return [ "opencode" , "claudecode" , "codex" ] ;
5253}
5354
5455function toSelectableProvider ( provider : "opencode" | "claudecode" | "codex" ) : AgentProvider {
55- return provider === "claudecode" ? "claudecode" : "opencode" ;
56+ if ( provider === "claudecode" ) return "claudecode" ;
57+ if ( provider === "codex" ) return "codex" ;
58+ return "opencode" ;
5659}
5760
5861function buildSettingsModal ( params : {
@@ -74,6 +77,7 @@ function buildSettingsModal(params: {
7477 const providerLabels : Record < AgentProvider , string > = {
7578 opencode : "OpenCode" ,
7679 claudecode : "Claude Code" ,
80+ codex : "Codex" ,
7781 } ;
7882 const providerOptions = enabledProviders . map ( ( provider ) => ( {
7983 text : { type : "plain_text" as const , text : providerLabels [ provider ] } ,
@@ -90,13 +94,16 @@ function buildSettingsModal(params: {
9094 const initialModel = matchedSelectedModel
9195 ? matchedSelectedModel
9296 : ( opencodeModels [ 0 ] ?? "__none__" ) ;
97+ const introText = selectedProvider === "opencode"
98+ ? "Configure agent, model (OpenCode), and working directory for this channel."
99+ : "Configure agent and working directory for this channel." ;
93100
94101 const blocks : any [ ] = [
95102 {
96103 type : "section" as const ,
97104 text : {
98105 type : "mrkdwn" as const ,
99- text : "Configure agent, model (OpenCode), and working directory for this channel." ,
106+ text : introText ,
100107 } ,
101108 } ,
102109 {
@@ -279,9 +286,12 @@ export function setupInteractiveHandlers(): void {
279286 if ( ! view ) return ;
280287
281288 const channelId = view . private_metadata ;
282- const selectedProvider = ( body as any ) . actions ?. [ 0 ] ?. selected_option ?. value === "claudecode"
289+ const selectedOption = ( body as any ) . actions ?. [ 0 ] ?. selected_option ?. value ;
290+ const selectedProvider = selectedOption === "claudecode"
283291 ? "claudecode"
284- : "opencode" ;
292+ : selectedOption === "codex"
293+ ? "codex"
294+ : "opencode" ;
285295 if ( selectedProvider === "opencode" ) {
286296 try {
287297 await startOpenCodeServer ( ) ;
@@ -316,7 +326,9 @@ export function setupInteractiveHandlers(): void {
316326 const selectedProvider =
317327 values ?. [ PROVIDER_BLOCK ] ?. [ PROVIDER_ACTION ] ?. selected_option ?. value === "claudecode"
318328 ? "claudecode"
319- : "opencode" ;
329+ : values ?. [ PROVIDER_BLOCK ] ?. [ PROVIDER_ACTION ] ?. selected_option ?. value === "codex"
330+ ? "codex"
331+ : "opencode" ;
320332 const selectedModel = values ?. [ MODEL_BLOCK ] ?. [ MODEL_ACTION ] ?. selected_option ?. value ;
321333 const workingDirectory = values ?. [ WORKING_DIR_BLOCK ] ?. [ WORKING_DIR_ACTION ] ?. value || "" ;
322334
@@ -349,7 +361,7 @@ export function setupInteractiveHandlers(): void {
349361 const normalizedSelectedModel = findMatchingModel ( getOpenCodeModels ( ) , selectedModel ) ?? selectedModel ;
350362 setChannelModel ( channelId , normalizedSelectedModel ) ;
351363 }
352- if ( selectedProvider === "claudecode ") {
364+ if ( selectedProvider !== "opencode ") {
353365 setChannelModel ( channelId , "" ) ;
354366 }
355367
0 commit comments