2026-02-08 17:00:26 +09:00
import type { CallOmoAgentArgs } from "./types"
import type { PluginInput } from "@opencode-ai/plugin"
2026-03-11 20:09:17 +09:00
import { subagentSessions , syncSubagentSessions } from "../../features/claude-code-session-state"
2026-03-09 13:11:03 +09:00
import { setSessionFallbackChain } from "../../hooks/model-fallback/hook"
2026-03-11 20:09:17 +09:00
import { getAgentToolRestrictions , log } from "../../shared"
import type { FallbackEntry } from "../../shared/model-requirements"
2026-02-08 17:00:26 +09:00
import { waitForCompletion } from "./completion-poller"
import { processMessages } from "./message-processor"
2026-03-11 20:09:17 +09:00
import { createOrGetSession } from "./session-creator"
2026-02-08 17:00:26 +09:00
2026-02-23 02:42:37 +09:00
type SessionWithPromptAsync = {
promptAsync : ( opts : { path : { id : string } ; body : Record < string , unknown > } ) = > Promise < unknown >
}
2026-02-14 22:06:23 +09:00
type ExecuteSyncDeps = {
createOrGetSession : typeof createOrGetSession
waitForCompletion : typeof waitForCompletion
processMessages : typeof processMessages
2026-03-09 13:11:03 +09:00
setSessionFallbackChain : typeof setSessionFallbackChain
2026-02-14 22:06:23 +09:00
}
2026-03-11 18:44:20 +09:00
type SpawnReservation = {
commit : ( ) = > number
rollback : ( ) = > void
}
2026-02-14 22:06:23 +09:00
const defaultDeps : ExecuteSyncDeps = {
createOrGetSession ,
waitForCompletion ,
processMessages ,
2026-03-09 13:11:03 +09:00
setSessionFallbackChain ,
2026-02-14 22:06:23 +09:00
}
2026-02-08 17:00:26 +09:00
export async function executeSync (
args : CallOmoAgentArgs ,
toolContext : {
sessionID : string
messageID : string
agent : string
abort : AbortSignal
2026-03-11 18:44:20 +09:00
metadata ? : ( input : { title? : string ; metadata? : Record < string , unknown > } ) = > void | Promise < void >
2026-02-08 17:00:26 +09:00
} ,
2026-02-14 22:06:23 +09:00
ctx : PluginInput ,
2026-03-09 13:11:03 +09:00
deps : ExecuteSyncDeps = defaultDeps ,
fallbackChain? : FallbackEntry [ ] ,
2026-03-11 18:44:20 +09:00
spawnReservation? : SpawnReservation ,
2026-02-08 17:00:26 +09:00
) : Promise < string > {
2026-03-11 18:44:20 +09:00
let sessionID : string | undefined
2026-02-08 17:00:26 +09:00
2026-03-11 18:44:20 +09:00
try {
const session = await deps . createOrGetSession ( args , toolContext , ctx )
sessionID = session . sessionID
2026-03-09 13:11:03 +09:00
2026-03-11 18:44:20 +09:00
if ( session . isNew ) {
spawnReservation ? . commit ( )
}
2026-02-08 17:00:26 +09:00
2026-03-11 18:44:20 +09:00
if ( fallbackChain && fallbackChain . length > 0 ) {
deps . setSessionFallbackChain ( sessionID , fallbackChain )
}
2026-02-08 17:00:26 +09:00
2026-03-11 20:09:17 +09:00
await Promise . resolve (
toolContext . metadata ? . ( {
title : args.description ,
metadata : { sessionId : sessionID } ,
} )
)
2026-03-11 18:44:20 +09:00
log ( ` [call_omo_agent] Sending prompt to session ${ sessionID } ` )
log ( ` [call_omo_agent] Prompt text: ` , args . prompt . substring ( 0 , 100 ) )
try {
await ( ctx . client . session as unknown as SessionWithPromptAsync ) . promptAsync ( {
path : { id : sessionID } ,
body : {
agent : args.subagent_type ,
tools : {
. . . getAgentToolRestrictions ( args . subagent_type ) ,
task : false ,
question : false ,
} ,
parts : [ { type : "text" , text : args.prompt } ] ,
} ,
} )
} catch ( error ) {
const errorMessage = error instanceof Error ? error.message : String ( error )
log ( ` [call_omo_agent] Prompt error: ` , errorMessage )
if ( errorMessage . includes ( "agent.name" ) || errorMessage . includes ( "undefined" ) ) {
return ` Error: Agent " ${ args . subagent_type } " not found. Make sure the agent is registered in your opencode.json or provided by a plugin. \ n \ n<task_metadata> \ nsession_id: ${ sessionID } \ n</task_metadata> `
}
return ` Error: Failed to send prompt: ${ errorMessage } \ n \ n<task_metadata> \ nsession_id: ${ sessionID } \ n</task_metadata> `
2026-02-08 17:00:26 +09:00
}
2026-03-11 18:44:20 +09:00
await deps . waitForCompletion ( sessionID , toolContext , ctx )
2026-02-08 17:00:26 +09:00
2026-03-11 18:44:20 +09:00
const responseText = await deps . processMessages ( sessionID , ctx )
2026-02-08 17:00:26 +09:00
2026-03-11 20:09:17 +09:00
return responseText + "\n\n" + [ "<task_metadata>" , ` session_id: ${ sessionID } ` , "</task_metadata>" ] . join ( "\n" )
2026-03-11 18:44:20 +09:00
} catch ( error ) {
spawnReservation ? . rollback ( )
throw error
2026-03-11 20:09:17 +09:00
} finally {
if ( sessionID ) {
subagentSessions . delete ( sessionID )
syncSubagentSessions . delete ( sessionID )
}
2026-03-11 18:44:20 +09:00
}
2026-02-08 17:00:26 +09:00
}