Skip to content
← Public packages

@kody/codex

Create and manage OpenAI Agents API (Codex harness) cloud agent sessions.

src/sessions/list.ts

73 lines · 1.9 KB · TypeScript
import { boolean, number, object, optional, parse, string } from 'remix/data-schema'
import { agentsFetch, pickAuth } from '../client.ts'

const listInput = object(
	{
		limit: optional(number()),
		after: optional(string()),
		order: optional(string()),
		apiKeySecret: optional(string()),
		dryRun: optional(boolean()),
	},
	{ unknownKeys: 'error' },
)

/**
 * List Agents API sessions (`GET /v1/agents/sessions`).
 * Prefer this for smoke tests and browsing prior work. Paginate with `after`.
 *
 * @param raw.limit - Page size (e.g. 20)
 * @param raw.after - Cursor from previous page `last_id`
 * @param raw.order - `asc` or `desc` when supported
 * @param raw.dryRun - Preview without calling OpenAI
 * @param raw.apiKeySecret - Optional alternate secret name
 * @returns List page (`data`, `has_more`, `last_id`, …)
 *
 * @example
 * import listSessions from 'kody:@kody/codex/sessions/list'
 * const page = await listSessions({ limit: 20 })
 */
export default async function listSessions(raw: unknown = {}) {
	const input = parse(listInput, raw ?? {})
	const auth = pickAuth(input)
	const query: Record<string, string | number> = {}
	if (input.limit != null) query.limit = input.limit
	if (input.after) query.after = input.after
	if (input.order) query.order = input.order

	if (input.dryRun === true) {
		return {
			dryRun: true as const,
			method: 'GET' as const,
			path: '/v1/agents/sessions',
			query,
			note: 'Would list Agents API sessions in the project.',
		}
	}

	const response = await agentsFetch('/agents/sessions', {
		...auth,
		method: 'GET',
		query,
	})
	const body = response.body as {
		data?: unknown[]
		has_more?: boolean
		last_id?: string
	} | null
	const data = Array.isArray(body?.data)
		? body.data
		: Array.isArray(response.body)
			? (response.body as unknown[])
			: []

	return {
		ok: true,
		count: data.length,
		data,
		has_more: body?.has_more ?? false,
		last_id: body?.last_id ?? null,
		page: response.body,
		status: response.status,
	}
}