Skip to content
← Public packages

@kentcdodds/devin

Start, monitor, and manage Devin sessions, knowledge, playbooks, and schedules via the Devin v3 API

src/usage.ts

119 lines · 3.0 KB · TypeScript
import { compact, devinOrgApi } from './lib/client.ts'

/** Unix-seconds window shared by every consumption/metrics endpoint. */
export type TimeWindow = {
	orgId?: string
	timeAfter?: number
	timeBefore?: number
}

function windowQuery(params: TimeWindow) {
	return compact({ time_after: params.timeAfter, time_before: params.timeBefore })
}

/** ACU consumption per day for the whole org. */
export async function dailyConsumption(params: TimeWindow = {}) {
	return devinOrgApi<unknown>({
		orgId: params.orgId,
		path: '/consumption/daily',
		query: windowQuery(params),
	})
}

export async function dailyConsumptionForUser(
	params: TimeWindow & { userId: string },
) {
	return devinOrgApi<unknown>({
		orgId: params.orgId,
		path: `/consumption/daily/users/${encodeURIComponent(params.userId)}`,
		query: windowQuery(params),
	})
}

export async function dailyConsumptionForServiceUser(
	params: TimeWindow & { serviceUserId: string },
) {
	return devinOrgApi<unknown>({
		orgId: params.orgId,
		path: `/consumption/daily/service-users/${encodeURIComponent(params.serviceUserId)}`,
		query: windowQuery(params),
	})
}

export async function dailyConsumptionForSession(
	params: TimeWindow & { sessionId: string },
) {
	return devinOrgApi<unknown>({
		orgId: params.orgId,
		path: `/consumption/daily/sessions/${encodeURIComponent(params.sessionId)}`,
		query: windowQuery(params),
	})
}

export async function usageMetrics(params: TimeWindow = {}) {
	return devinOrgApi<unknown>({
		orgId: params.orgId,
		path: '/metrics/usage',
		query: windowQuery(params),
	})
}

export type ScopedMetricsParams = TimeWindow & {
	/** Required by Devin for session/PR metrics. */
	timeAfter: number
	timeBefore: number
	userIds?: string[]
	serviceUserIds?: string[]
	playbookId?: string
}

export async function sessionMetrics(params: ScopedMetricsParams) {
	return devinOrgApi<unknown>({
		orgId: params.orgId,
		path: '/metrics/sessions',
		query: compact({
			...windowQuery(params),
			user_ids: params.userIds,
			service_user_ids: params.serviceUserIds,
			playbook_id: params.playbookId,
		}),
	})
}

export async function prMetrics(params: ScopedMetricsParams) {
	return devinOrgApi<unknown>({
		orgId: params.orgId,
		path: '/metrics/prs',
		query: compact({
			...windowQuery(params),
			user_ids: params.userIds,
			service_user_ids: params.serviceUserIds,
			playbook_id: params.playbookId,
		}),
	})
}

/** Devin's own analysis of a finished session (issues, action items). */
export async function sessionInsights(params: {
	devinId: string
	orgId?: string
}) {
	return devinOrgApi<unknown>({
		orgId: params.orgId,
		path: `/sessions/${encodeURIComponent(params.devinId)}/insights`,
	})
}

/** Generate insights for a session that has none yet. Consumes ACUs. */
export async function generateSessionInsights(params: {
	devinId: string
	orgId?: string
}) {
	return devinOrgApi<unknown>({
		orgId: params.orgId,
		path: `/sessions/${encodeURIComponent(params.devinId)}/insights/generate`,
		method: 'POST',
	})
}

export default dailyConsumption