Skip to content
← Public packages

@kody/codex

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

src/sessions/items.ts

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

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

/**
 * List saved session items (`GET /v1/agents/sessions/{session_id}/items`).
 * Use after a turn completes or a stream disconnects — streams do not replay.
 *
 * @param raw.sessionId - Session id
 * @param raw.limit - Page size (e.g. 100)
 * @param raw.after - Pagination cursor
 * @param raw.order - Prefer `asc` oldest→newest
 * @param raw.turnId - Optional filter when supported by the API
 * @param raw.dryRun - Preview without calling OpenAI
 * @param raw.apiKeySecret - Optional alternate secret name
 * @returns Items page
 *
 * @example
 * import listItems from 'kody:@kody/codex/sessions/items'
 * const items = await listItems({ sessionId: 'sess_123', order: 'asc', limit: 100 })
 */
export default async function listItems(raw: unknown = {}) {
	const input = parse(itemsInput, raw ?? {})
	const auth = pickAuth(input)
	const sessionId = requireSessionId(input.sessionId)
	const path = `/agents/sessions/${encodeURIComponent(sessionId)}/items`
	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.turnId) query.turn_id = input.turnId

	if (input.dryRun === true) {
		return {
			dryRun: true as const,
			method: 'GET' as const,
			path: `/v1${path}`,
			sessionId,
			query,
			note: 'Would list saved messages and tool calls for the session.',
		}
	}

	const response = await agentsFetch(path, {
		...auth,
		method: 'GET',
		query,
	})
	const body = response.body as { data?: unknown[] } | null
	const data = Array.isArray(body?.data)
		? body.data
		: Array.isArray(response.body)
			? (response.body as unknown[])
			: []

	return {
		ok: true,
		sessionId,
		count: data.length,
		data,
		page: response.body,
		status: response.status,
	}
}