OFFWORLD DOCS

API Reference

Convex queries, mutations, and actions

Complete reference for all Convex functions.

Repositories API

repos.getByFullName

Type: Query

Args:

{ fullName: string } // "facebook/react"

Returns:

{
  _id: Id<"repositories">,
  fullName: string,
  owner: string,
  name: string,
  stars: number,
  language: string,
  description: string,
  summary?: string,
  architecture?: string,
  mermaidDiagram?: string,
  status: "queued" | "processing" | "completed" | "failed",
  lastAnalyzedAt?: number
} | null

Usage:

const repo = useQuery(api.repos.getByFullName, {
  fullName: "facebook/react"
});

repos.startAnalysis

Type: Mutation

Auth: Required

Args:

{ fullName: string }

Returns: Id<"repositories">

Usage:

const start = useMutation(api.repos.startAnalysis);
await start.mutateAsync({ fullName: "facebook/react" });

repos.listIndexed

Type: Query

Args: None

Returns:

Array<{
  fullName: string,
  stars: number,
  language: string,
  lastAnalyzedAt: number
}>

Usage:

const indexed = useQuery(api.repos.listIndexed);

Architecture Entities API

architectureEntities.getByRepo

Type: Query

Args:

{ repoId: Id<"repositories"> }

Returns:

Array<{
  _id: Id<"architectureEntities">,
  name: string,
  description: string,
  importance: number,
  layer: "entry-point" | "core" | "feature" | "utility" | "integration",
  path: string,
  githubUrl: string
}>

architectureEntities.getBySlug

Type: Query

Args:

{
  repoId: Id<"repositories">,
  slug: string
}

Returns: Single entity or null

Issues API

issues.getByRepo

Type: Query

Args:

{
  repoId: Id<"repositories">,
  difficulty?: 1 | 2 | 3 | 4 | 5  // Optional filter
}

Returns:

Array<{
  _id: Id<"issues">,
  number: number,
  title: string,
  difficulty: 1 | 2 | 3 | 4 | 5,
  difficultyRationale: string,
  skills: string[],
  filesTouch: string[]
}>

issues.getByNumber

Type: Query

Args:

{
  repoId: Id<"repositories">,
  number: number
}

Returns: Single issue or null

Pull Requests API

pullRequests.getByRepo

Type: Query

Args:

{ repoId: Id<"repositories"> }

Returns:

Array<{
  _id: Id<"pullRequests">,
  number: number,
  title: string,
  summary: string,
  impact: "Low" | "Medium" | "High",
  filesChanged: number
}>

pullRequests.getByNumber

Type: Query

Args:

{
  repoId: Id<"repositories">,
  number: number
}

Returns: Single PR or null

Chat API

chat.getConversation

Type: Query

Args:

{ conversationId: Id<"conversations"> }

Returns:

{
  _id: Id<"conversations">,
  repoId: Id<"repositories">,
  title: string,
  messages: Array<{
    role: "user" | "assistant",
    content: string,
    toolCalls?: Array<{ name: string, args: any }>
  }>
}

chat.sendMessage

Type: Mutation

Auth: Required

Args:

{
  conversationId: Id<"conversations">,
  message: string
}

Returns: Id<"messages">

Usage:

const send = useMutation(api.chat.sendMessage);
await send.mutateAsync({
  conversationId,
  message: "How does auth work?"
});

chat.createConversation

Type: Mutation

Auth: Required

Args:

{
  repoId: Id<"repositories">,
  initialMessage?: string
}

Returns: Id<"conversations">

GitHub API (Actions)

github.getOwnerInfo

Type: Action

Args:

{ owner: string }

Returns:

{
  login: string,
  name?: string,
  avatarUrl: string,
  type: "User" | "Organization"
}

github.searchRepositories

Type: Action

Args:

{
  query: string,
  limit?: number  // Default 10
}

Returns:

Array<{
  fullName: string,
  description: string,
  stars: number,
  language: string
}>

Agent Tools (Internal)

These tools are used by the AI agent, not directly callable by clients.

searchCodeContext

Parameters:

{
  query: string,
  limit?: number  // Default 5
}

Returns: Top-K file chunks with paths and scores

getArchitecture

Parameters: None

Returns: List of architecture entities

listFiles

Parameters:

{
  pattern?: string,  // Glob pattern
  directory?: string
}

Returns: Matching file paths

explainFile

Parameters:

{ path: string }

Returns: File content + AI explanation

findIssues

Parameters:

{ difficulty?: 1 | 2 | 3 | 4 | 5 }

Returns: Filtered issues

getIssueByNumber

Parameters:

{ number: number }

Returns: Issue details

findPullRequests

Parameters: None

Returns: List of PRs

getPullRequestByNumber

Parameters:

{ number: number }

Returns: PR details

Auth API

auth.getCurrentUser

Type: Query

Returns:

{
  _id: Id<"users">,
  name: string,
  email: string,
  image?: string
} | null

Usage:

const user = useQuery(api.auth.getCurrentUser);

Error Codes

UNAUTHORIZED

User not authenticated. Call authClient.signIn.social({ provider: "github" }).

NOT_FOUND

Resource doesn't exist (repo, issue, PR, etc.).

RATE_LIMIT

GitHub API rate limit exceeded. Wait or use GitHub App.

VALIDATION_ERROR

Invalid input args. Check arg types.

ANALYSIS_FAILED

Workflow failed. Check Convex logs for details.

Next Steps