/**
 * This file was generated by @pikku/cli@0.12.21
 */
/**
 * This provides the structure needed for typescript to be aware of RPCs and their return types
 */

export type AgentApproveCallerInput = {
  agentName: string
  runId: string
  approvals: { toolCallId: string; approved: boolean }[]
}
export type AgentCallerInput = {
  agentName: string
  message: string
  threadId: string
  resourceId: string
}
export type AgentResumeCallerInput = {
  agentName: string
  runId: string
  toolCallId: string
  approved: boolean
}
export type AgentStreamCallerInput = {
  agentName: string
  message: string
  threadId: string
  resourceId: string
}
export type CreateCardInput = {
  title: string
  status: 'todo' | 'doing' | 'done'
  priority?: ('low' | 'medium' | 'high') | undefined
}
export type CreateCardOutput = {
  cardId: string
  title: string
  status: string
  position: number
  createdAt: string
}
export type CreateCardToolInput = {
  title: string
  status: 'todo' | 'doing' | 'done'
}
export type CreateCardToolOutput = { type: 'text'; text: string }[]
export type DeleteAgentThreadInput = { threadId: string; resourceId?: string }
export type DeleteAgentThreadOutput = { deleted: boolean }
export type EnrichCardInput = {
  title: string
  status: 'todo' | 'doing' | 'done'
}
export type EnrichCardOutput = {
  title: string
  status: string
  priority: 'low' | 'medium' | 'high'
  labels: string[]
}
export type GetAgentThreadMessagesInput = { threadId: string; resourceId?: string }
export type GetAgentThreadMessagesOutput = any[]
export type GetAgentThreadRunsInput = { threadId: string; resourceId?: string }
export type GetAgentThreadRunsOutput = any[]
export type GetAgentThreadsInput = {
  agentName?: string
  resourceId?: string
  limit?: number
  offset?: number
}
export type GetAgentThreadsOutput = any[]
export type GetCardFileUploadUrlInput = {
  cardId: string
  fileName: string
  contentType: string
}
export type GetCardFileUploadUrlOutput = {
  uploadUrl: string
  fileKey: string
  expiresAt: string
  uploadMethod?: ('PUT' | 'POST') | undefined
  uploadHeaders?:
    | {
        [key: string]: string
      }
    | undefined
}
export type GraphStarterInput = { workflowName: string; nodeId: string; data?: unknown }
export type GraphStarterOutput = { runId: string }
export type ListCardsInput = {
  status?: ('todo' | 'doing' | 'done') | undefined
}
export type ListCardsOutput = {
  cards: {
    cardId: string
    title: string
    status: string
    position: number
    createdAt: string
  }[]
}
export type ListCardsToolOutput = { type: 'text'; text: string }[]
export type NotifyCardCreatedInput = {
  cardId: string
  title: string
  priority: 'low' | 'medium' | 'high'
  labels: string[]
}
export type OnCardEventTriggerInput = {
  title: string
  status: 'todo' | 'doing' | 'done'
  source?: string | undefined
}
export type OnCardEventTriggerOutput = {
  cardId: string
  title: string
  status: string
}
export type OnCardsClearSessionInput = Record<string, never>
export type OnCardsClearSessionOutput = { cleared: true }
export type OnCardsConnectInput = { type: 'hello'; count: number }
export type OnCardsEchoInput = { text: string }
export type OnCardsEchoOutput = { echo: string }
export type OnCardsGetSessionInput = Record<string, never>
export type OnCardsGetSessionOutput = { session: unknown }
export type OnCardsSetSessionInput = { userId: string; label: string }
export type OnCardsSetSessionOutput = { set: true; label: string }
export type PikkuConsoleGetSecretInput = { secretId: string }
export type PikkuConsoleGetSecretOutput = { exists: boolean; value: unknown }
export type PikkuConsoleGetVariableInput = { variableId: string }
export type PikkuConsoleGetVariableOutput = { exists: boolean; value: unknown }
export type PikkuConsoleHasSecretInput = { secretId: string }
export type PikkuConsoleHasSecretOutput = { exists: boolean }
export type PikkuConsoleSetSecretInput = { secretId: string; value: unknown }
export type PikkuConsoleSetSecretOutput = { success: boolean }
export type PikkuConsoleSetVariableInput = { variableId: string; value: unknown }
export type PikkuConsoleSetVariableOutput = { success: boolean }
export type ProcessCardEventInput = {
  cardId: string
  action: string
  status: string
  createdAt: string
}
export type RemoteRPCHandlerInput = { rpcName: string; data?: unknown }
export type RpcCallerInput = { rpcName: string; data?: unknown }
export type SecretSchema_notificationWebhookSecret = string
export type SignCardFileInput = {
  cardId: string
  fileName: string
}
export type SignCardFileOutput = {
  signedUrl: string
  expiresAt: string
}
export type VariableSchema_maxCardsPerColumn = number
export type WorkflowRunnerInput = { workflowName: string; data?: unknown }
export type WorkflowStarterInput = { workflowName: string; data?: unknown }
export type WorkflowStarterOutput = { runId: string }
export type WorkflowStatusCheckerInput = { workflowName: string; runId: string }
export type WorkflowStatusStreamFullInput = { workflowName: string; runId: string }
export type WorkflowStatusStreamInput = { workflowName: string; runId: string }

interface RPCHandler<I, O> {
  input: I
  output: O
}

export type RPCMap = {
  readonly createCard: RPCHandler<CreateCardInput, CreateCardOutput>
  readonly getCardFileUploadUrl: RPCHandler<GetCardFileUploadUrlInput, GetCardFileUploadUrlOutput>
  readonly listCards: RPCHandler<ListCardsInput, ListCardsOutput>
  readonly signCardFile: RPCHandler<SignCardFileInput, SignCardFileOutput>
  readonly getAgentThreads: RPCHandler<GetAgentThreadsInput, GetAgentThreadsOutput>
  readonly getAgentThreadMessages: RPCHandler<
    GetAgentThreadMessagesInput,
    GetAgentThreadMessagesOutput
  >
  readonly getAgentThreadRuns: RPCHandler<GetAgentThreadRunsInput, GetAgentThreadRunsOutput>
  readonly deleteAgentThread: RPCHandler<DeleteAgentThreadInput, DeleteAgentThreadOutput>
  readonly pikkuConsoleSetSecret: RPCHandler<
    PikkuConsoleSetSecretInput,
    PikkuConsoleSetSecretOutput
  >
  readonly pikkuConsoleGetVariable: RPCHandler<
    PikkuConsoleGetVariableInput,
    PikkuConsoleGetVariableOutput
  >
  readonly pikkuConsoleSetVariable: RPCHandler<
    PikkuConsoleSetVariableInput,
    PikkuConsoleSetVariableOutput
  >
  readonly pikkuConsoleHasSecret: RPCHandler<
    PikkuConsoleHasSecretInput,
    PikkuConsoleHasSecretOutput
  >
  readonly pikkuConsoleGetSecret: RPCHandler<
    PikkuConsoleGetSecretInput,
    PikkuConsoleGetSecretOutput
  >
}

// Addon package RPC maps
import type { RPCMap as ConsoleRPCMap } from '@pikku/addon-console/.pikku/rpc/pikku-rpc-wirings-map.internal.gen.js'

// Utility type to prefix keys with namespace (skips 'any' to prevent type poisoning)
type PrefixKeys<T, Prefix extends string> = unknown extends T
  ? {}
  : {
      [K in keyof T as `${Prefix}:${string & K}`]: T[K]
    }

// Merge all RPC maps with namespace prefixes
export type FlattenedRPCMap = RPCMap & PrefixKeys<ConsoleRPCMap, 'console'>

type IsAny<T> = 0 extends 1 & T ? true : false
type IsVoidishInput<T> =
  IsAny<T> extends true ? false : [T] extends [void | null | undefined] ? true : false

export type RPCInvoke = <Name extends keyof FlattenedRPCMap>(
  ...args: IsVoidishInput<FlattenedRPCMap[Name]['input']> extends true
    ? [name: Name]
    : [name: Name, data: FlattenedRPCMap[Name]['input']]
) => Promise<FlattenedRPCMap[Name]['output']>

export type RPCRemote = <Name extends keyof FlattenedRPCMap>(
  ...args: IsVoidishInput<FlattenedRPCMap[Name]['input']> extends true
    ? [name: Name]
    : [name: Name, data: FlattenedRPCMap[Name]['input']]
) => Promise<FlattenedRPCMap[Name]['output']>

import type { FlattenedWorkflowMap } from '../../../functions/.pikku/workflow/pikku-workflow-map.gen.d.js'

import type { AgentMap } from '../../../functions/.pikku/agent/pikku-agent-map.gen.d.js'

// Addon package Agent maps
import type { AgentMap as ConsoleAgentMap } from '@pikku/addon-console/.pikku/agent/pikku-agent-map.gen.d.js'

type FlattenedAgentMap = AgentMap & PrefixKeys<ConsoleAgentMap, 'console'>

import type { PikkuRPC } from '@pikku/core/rpc'

interface AIAgentInput {
  message: string
  threadId: string
  resourceId: string
}

export type TypedStartWorkflow = <Name extends keyof FlattenedWorkflowMap>(
  name: Name,
  input: FlattenedWorkflowMap[Name]['input'],
  options?: { startNode?: string },
) => Promise<{ runId: string }>

export type TypedRunWorkflow = <Name extends keyof FlattenedWorkflowMap>(
  name: Name,
  input: FlattenedWorkflowMap[Name]['input'],
) => Promise<FlattenedWorkflowMap[Name]['output']>

export type TypedWorkflowStatus = (
  workflowName: string,
  runId: string,
) => Promise<{
  id: string
  status: 'running' | 'suspended' | 'completed' | 'failed' | 'cancelled'
  output?: unknown
  error?: { message?: string }
}>

type TypedAgentRun = [keyof FlattenedAgentMap] extends [never]
  ? (name: string, input: AIAgentInput) => Promise<any>
  : <Name extends keyof FlattenedAgentMap>(
      name: Name,
      input: AIAgentInput,
    ) => Promise<{
      runId: string
      result: FlattenedAgentMap[Name]['output']
      usage: { inputTokens: number; outputTokens: number }
    }>

type TypedAgentStream = [keyof FlattenedAgentMap] extends [never]
  ? (
      name: string,
      input: AIAgentInput,
      options?: { requiresToolApproval?: 'all' | 'explicit' | false },
    ) => Promise<void>
  : <Name extends keyof FlattenedAgentMap>(
      name: Name,
      input: AIAgentInput,
      options?: { requiresToolApproval?: 'all' | 'explicit' | false },
    ) => Promise<void>

export type TypedPikkuRPC = PikkuRPC<
  RPCInvoke,
  RPCRemote,
  TypedStartWorkflow,
  TypedAgentRun,
  TypedAgentStream
>
