module Web.Controller.AgentDelegations where -- IHF Phase 11 — Advanced AI Federation (IHUB-WP-0012 T06) import Web.Controller.Prelude import Web.View.AgentDelegations.Index import Web.View.AgentDelegations.Show import Application.Helper.AgentBridge (callBridge, BridgeRequest(..)) instance Controller AgentDelegationsController where action AgentDelegationsAction = do delegations <- query @AgentDelegation |> orderByDesc #createdAt |> fetch render IndexView { .. } action ShowAgentDelegationAction { agentDelegationId } = do delegation <- fetch agentDelegationId delegatingAgent <- fetch delegation.delegatingAgentId receivingAgent <- fetch delegation.receivingAgentId mParentProposal <- case delegation.parentProposalId of Nothing -> pure Nothing Just pid -> fetchOneOrNothing pid render ShowView { .. } action DelegateSubtaskAction { agentProposalId } = do proposal <- fetch agentProposalId receivingAgentId <- param @(Id AgentRegistration) "receivingAgentId" scope <- param @Text "scope" tokenBudget <- paramOrDefault @Int 1000 "tokenBudget" delegatingAgentId <- case proposal.agentRegistrationId of Just aid -> pure aid Nothing -> respondAndExit =<< renderNotFound receivingAgent <- fetch receivingAgentId delegation <- newRecord @AgentDelegation |> set #delegatingAgentId delegatingAgentId |> set #receivingAgentId receivingAgentId |> set #parentProposalId (Just agentProposalId) |> set #scope scope |> set #tokenBudget tokenBudget |> set #status "pending" |> createRecord result <- liftIO $ callBridge BridgeRequest { provider = receivingAgent.provider , model = receivingAgent.modelName , systemPrompt = receivingAgent.systemPrompt , prompt = scope , maxTokens = tokenBudget , temperature = 0.7 } now <- getCurrentTime case result of Left err -> do delegation |> set #status "failed" |> set #result (Just . A.toJSON $ A.object ["error" A..= err.errorMessage]) |> set #completedAt (Just now) |> updateRecord setErrorMessage ("Delegation failed: " <> err.errorMessage) Right resp -> do delegation |> set #status "completed" |> set #tokensUsed (Just resp.tokensOut) |> set #result (Just . A.toJSON $ A.object ["content" A..= resp.content]) |> set #completedAt (Just now) |> updateRecord setSuccessMessage "Subtask delegated successfully" redirectTo ShowAgentDelegationAction { agentDelegationId = delegation.id }