Skip to main content

createResolvers

@forge/monorepo


@forge/monorepo / backend/src / createResolvers

Function: createResolvers()

createResolvers(deps): object

Defined in: backend/src/graphql/resolvers.ts:78

Parameters

deps

ResolverDeps

Returns

object

Mutation

Mutation: object

Mutation.answerQuestion()

answerQuestion(_, args, ctx): Promise<boolean>

Parameters
_

unknown

args
input

{ answers: Record<string, string>; interactionId: string; runId: string; }

input.answers

Record<string, string>

input.interactionId

string

input.runId

string

ctx

GraphQLContext

Returns

Promise<boolean>

Mutation.archiveConversation()

archiveConversation(_, args, ctx): Promise<Conversation>

Parameters
_

unknown

args
expectedVersion

number

id

string

ctx

GraphQLContext

Returns

Promise<Conversation>

Mutation.cancelRun()

cancelRun(_, args, ctx): Promise<boolean>

Parameters
_

unknown

args
runId

string

ctx

GraphQLContext

Returns

Promise<boolean>

Mutation.createConversation()

createConversation(_, args, ctx): Promise<Conversation>

Parameters
_

unknown

args
id

string

title

string

ctx

GraphQLContext

Returns

Promise<Conversation>

Mutation.decideApproval()

decideApproval(_, args, ctx): Promise<boolean>

Parameters
_

unknown

args
input

{ decision: string; interactionId: string; runId: string; }

input.decision

string

input.interactionId

string

input.runId

string

ctx

GraphQLContext

Returns

Promise<boolean>

Mutation.deleteConversation()

deleteConversation(_, args, ctx): Promise<boolean>

Parameters
_

unknown

args
id

string

ctx

GraphQLContext

Returns

Promise<boolean>

Mutation.renameConversation()

renameConversation(_, args, ctx): Promise<Conversation>

Parameters
_

unknown

args
expectedVersion

number

id

string

title

string

ctx

GraphQLContext

Returns

Promise<Conversation>

Mutation.sendMessage()

sendMessage(_, args, ctx): Promise<{ conversationId: string | undefined; createdAt: string; finishedAt: string | null; id: string; status: string; }>

Parameters
_

unknown

args
conversationId

string

runId

string

ctx

GraphQLContext

Returns

Promise<{ conversationId: string | undefined; createdAt: string; finishedAt: string | null; id: string; status: string; }>

Query

Query: object

Query.conversation()

conversation(_, args, ctx): Promise<Conversation | null>

Parameters
_

unknown

args
id

string

ctx

GraphQLContext

Returns

Promise<Conversation | null>

Query.conversationContext()

conversationContext(_, args, ctx): Promise<ContextInspection | null>

Parameters
_

unknown

args
conversationId

string

runId?

string

ctx

GraphQLContext

Returns

Promise<ContextInspection | null>

Query.conversations()

conversations(_, args, ctx): Promise<Page<Conversation>>

Parameters
_

unknown

args
cursor?

string

limit

number

ctx

GraphQLContext

Returns

Promise<Page<Conversation>>

Query.findTools()

findTools(_, args, ctx): Promise<ToolSearchOutcome>

Parameters
_

unknown

args
limit?

number

query

string

ctx

GraphQLContext

Returns

Promise<ToolSearchOutcome>

Query.pendingApproval()

pendingApproval(_, args, ctx): Promise<{ expiresAt: string; interactionId: InteractionId; normalizedInput: unknown; riskCategory: string; runId: RunId; summary: string; toolName: string; } | null>

#163, the mirror of pendingQuestion. Wired the same way so the two cannot drift.

Parameters
_

unknown

args
runId

string

ctx

GraphQLContext

Returns

Promise<{ expiresAt: string; interactionId: InteractionId; normalizedInput: unknown; riskCategory: string; runId: RunId; summary: string; toolName: string; } | null>

Query.pendingQuestion()

pendingQuestion(_, args, ctx): Promise<{ createdAt: string; interactionId: InteractionId; questions: object[]; runId: RunId; } | null>

#163. Shaped for rendering: the optional fields are filled in rather than passed through, because a client that has to treat null as "one choice" and undefined as "one choice" and false as "one choice" will eventually treat one of them as "several".

Parameters
_

unknown

args
runId

string

ctx

GraphQLContext

Returns

Promise<{ createdAt: string; interactionId: InteractionId; questions: object[]; runId: RunId; } | null>

Query.run()

run(_, args, ctx): Promise<{ conversationId: string | undefined; createdAt: string; finishedAt: string | null; id: string; status: string; } | null>

Parameters
_

unknown

args
id

string

ctx

GraphQLContext

Returns

Promise<{ conversationId: string | undefined; createdAt: string; finishedAt: string | null; id: string; status: string; } | null>

Query.toolCatalog()

toolCatalog(_, args, ctx): Promise<ToolCatalog>

Parameters
_

unknown

args
categories

string[]

excluded

string[]

preloaded

string[]

ctx

GraphQLContext

Returns

Promise<ToolCatalog>

Query.usage()

usage(_, args, ctx): Promise<UsageTotals>

Parameters
_

unknown

args
runId?

string

ctx

GraphQLContext

Returns

Promise<UsageTotals>

Query.usageReport()

usageReport(_, args, ctx): Promise<{ buckets: object[]; byConversation: readonly object[]; byModel: readonly object[]; currency: string; from: string; period: "hour" | "day"; quota: { costLimitMinorUnits: number | null; exceeded: boolean; inputTokenLimit: number | null; modelId: string | null; outputTokenLimit: number | null; period: "hour" | "day" | "week" | "month" | null; warnAt: number; warning: boolean; window: string; } | null; to: string; totals: UsageTotals; }>

The spend panel's one query (#140).

Headline totals and buckets come from the rollups, so a page load never scans raw records however much a tenant has used. Breakdowns come from the ledger over the same bounded range — a deliberate trade documented on UsageStore.breakdown.

Everything in one resolver so a panel cannot show a total from one moment and a breakdown from another; the discrepancy would look like a bug in the numbers rather than in the fetching.

Parameters
_

unknown

args
breakdownLimit?

number

from

string

period

string

to

string

ctx

GraphQLContext

Returns

Promise<{ buckets: object[]; byConversation: readonly object[]; byModel: readonly object[]; currency: string; from: string; period: "hour" | "day"; quota: { costLimitMinorUnits: number | null; exceeded: boolean; inputTokenLimit: number | null; modelId: string | null; outputTokenLimit: number | null; period: "hour" | "day" | "week" | "month" | null; warnAt: number; warning: boolean; window: string; } | null; to: string; totals: UsageTotals; }>

Subscription

Subscription: object

Subscription.runEvents

runEvents: object

Subscription.runEvents.resolve

resolve: (event) => object

Parameters
event
occurredAt

string

runId

string

sequence

number

type

string

Returns

object

occurredAt

occurredAt: string = event.occurredAt

payload

payload: object = event

payload.occurredAt

occurredAt: string

payload.runId

runId: string

payload.sequence

sequence: number

payload.type

type: string

runId

runId: string = event.runId

sequence

sequence: number = event.sequence

type

type: string = event.type

Subscription.runEvents.subscribe()

subscribe(_, args, ctx): AsyncIterable<RunEvent, any, any>

Parameters
_

unknown

args
after?

number

conversationId

string

runId

string

ctx

GraphQLContext

Returns

AsyncIterable<RunEvent, any, any>