earendil-works/pi · error · SessionError

invalid_payload

invalid_payload

Error message

SQLite session metadata must be an object

What it means

Error "SQLite session metadata must be an object" thrown in earendil-works/pi.

Source

Thrown at packages/session-backends/sqlite-node/src/sqlite/storage/sessions.ts:48

			"storage",
			`Invalid SQLite session ${sessionId}: metadata is not valid JSON`,
			error instanceof Error ? error : undefined,
		);
	}
	if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
		throw new SessionError("storage", `Invalid SQLite session ${sessionId}: metadata must be an object`);
	}
	return parsed as Record<string, unknown>;
}

export function sessionExists(db: SqliteDatabase, sessionId: string) {
	return !!sql`SELECT 1 AS found FROM sessions WHERE id = ${sessionId}`.get<{ found: number }>(db);
}

function serializeMetadata(metadata: Record<string, unknown> | undefined): string | null {
	if (metadata === undefined) return null;
	if (typeof metadata !== "object" || metadata === null || Array.isArray(metadata)) {
		throw new SessionError("invalid_payload", "SQLite session metadata must be an object");
	}
	assertJsonSerializable(metadata);
	return JSON.stringify(metadata);
}

export function insertSessionRow(db: SqliteDatabase, session: NewSessionRow) {
	sql`INSERT INTO sessions (id, created_at, metadata, cwd, parent_session_id)
		VALUES (${session.id}, ${session.createdAt}, ${serializeMetadata(session.metadata)}, ${session.cwd}, ${session.parentSessionId ?? null})`.run(
		db,
	);
}

export function readSessionRow(db: SqliteDatabase, sessionId: string) {
	return sql`SELECT s.id, s.created_at, s.metadata, s.cwd, s.parent_session_id,
			name_fact.seq IS NOT NULL AS has_session_name,
			name_fact.value AS session_name
		FROM sessions AS s
		LEFT JOIN facts AS name_fact

View on GitHub (pinned to 4af9d21d3b)

Solutions

  1. Session metadata must be a JSON object.

When it happens

Trigger: Thrown at packages/session-backends/sqlite-node/src/sqlite/storage/sessions.ts:48 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of earendil-works/pi@4af9d21d3b (2026-08-24). Data as JSON: /api/errors/2f61e50f67ca300b. Report an issue: GitHub.