2026-02-08 17:00:26 +09:00
import type { CallOmoAgentArgs } from "./types"
import type { PluginInput } from "@opencode-ai/plugin"
import { log } from "../../shared"
2026-03-09 13:11:03 +09:00
import type { FallbackEntry } from "../../shared/model-requirements"
2026-02-08 17:00:26 +09:00
import { getAgentToolRestrictions } from "../../shared"
2026-03-09 13:11:03 +09:00
import { setSessionFallbackChain } from "../../hooks/model-fallback/hook"
2026-02-08 17:00:26 +09:00
import { createOrGetSession } from "./session-creator"
import { waitForCompletion } from "./completion-poller"
import { processMessages } from "./message-processor"
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
}
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
metadata ? : ( input : { title? : string ; metadata? : Record < string , unknown > } ) = > void
} ,
2026-02-14 22:06:23 +09:00
ctx : PluginInput ,
2026-03-09 13:11:03 +09:00
deps : ExecuteSyncDeps = defaultDeps ,
fallbackChain? : FallbackEntry [ ] ,
2026-02-08 17:00:26 +09:00
) : Promise < string > {
2026-02-14 22:06:23 +09:00
const { sessionID } = await deps . createOrGetSession ( args , toolContext , ctx )
2026-02-08 17:00:26 +09:00
2026-03-09 13:11:03 +09:00
if ( fallbackChain && fallbackChain . length > 0 ) {
deps . setSessionFallbackChain ( sessionID , fallbackChain )
}
2026-02-08 17:00:26 +09:00
await toolContext . metadata ? . ( {
title : args.description ,
metadata : { sessionId : sessionID } ,
} )
log ( ` [call_omo_agent] Sending prompt to session ${ sessionID } ` )
log ( ` [call_omo_agent] Prompt text: ` , args . prompt . substring ( 0 , 100 ) )
try {
2026-02-23 02:42:37 +09:00
await ( ctx . client . session as unknown as SessionWithPromptAsync ) . promptAsync ( {
2026-02-08 17:00:26 +09:00
path : { id : sessionID } ,
body : {
agent : args.subagent_type ,
tools : {
. . . getAgentToolRestrictions ( args . subagent_type ) ,
task : false ,
2026-02-13 14:55:46 +09:00
question : false ,
2026-02-08 17:00:26 +09:00
} ,
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-14 22:06:23 +09:00
await deps . waitForCompletion ( sessionID , toolContext , ctx )
2026-02-08 17:00:26 +09:00
2026-02-14 22:06:23 +09:00
const responseText = await deps . processMessages ( sessionID , ctx )
2026-02-08 17:00:26 +09:00
const output =
responseText + "\n\n" + [ "<task_metadata>" , ` session_id: ${ sessionID } ` , "</task_metadata>" ] . join ( "\n" )
return output
}