Files
makelore/src/lib/project-agent-session.ts
2026-07-29 17:22:35 +08:00

48 lines
1.8 KiB
TypeScript

import type { OpencodeSession } from '@/types/opencode';
function record(value: unknown): Record<string, unknown> | null {
return value !== null && typeof value === 'object'
? value as Record<string, unknown>
: null;
}
function timestamp(value: unknown): number | null {
if (typeof value === 'number' && Number.isFinite(value)) return value;
if (typeof value !== 'string') return null;
const parsed = Date.parse(value);
return Number.isFinite(parsed) ? parsed : null;
}
function hasPositiveNumber(value: unknown): boolean {
if (typeof value === 'number') return Number.isFinite(value) && value > 0;
const item = record(value);
return item ? Object.values(item).some(hasPositiveNumber) : false;
}
function hasMeaningfulSummary(value: unknown): boolean {
if (typeof value === 'string') return value.trim().length > 0;
if (typeof value === 'number') return Number.isFinite(value) && value > 0;
if (typeof value === 'boolean') return value;
if (Array.isArray(value)) return value.length > 0;
const item = record(value);
return item ? Object.values(item).some(hasMeaningfulSummary) : false;
}
function hasConversationActivity(session: OpencodeSession): boolean {
const time = record(session.time);
const created = timestamp(time?.created ?? session.createdAt);
const updated = timestamp(time?.updated ?? session.updatedAt);
return Boolean(created !== null && updated !== null && updated > created)
|| hasPositiveNumber(session.cost)
|| hasPositiveNumber(session.tokens)
|| hasMeaningfulSummary(session.summary);
}
export function findPrimaryProjectAgentSession(
sessions: OpencodeSession[],
agentId: string,
): OpencodeSession | undefined {
const matches = sessions.filter((session) => session.agent === agentId);
return matches.find(hasConversationActivity) ?? matches[0];
}