(client, sessionID, directory, options = {})
| 826 | if (ordered.length === 0) |
| 827 | return "unknown"; |
| 828 | const tail = ordered.at(-1); |
| 829 | const info = tail?.info || tail; |
| 830 | if (!info || info.role !== "assistant") |
| 831 | return "incomplete"; |
| 832 | const completed = Number(info?.time?.completed || 0); |
| 833 | const created = Number(info?.time?.created || 0); |
| 834 | if (!Number.isFinite(completed) || completed <= 0) |
| 835 | return "incomplete"; |
| 836 | const startedAt = Number(active?.startedAt || 0); |
| 837 | if (startedAt > 0 && completed < startedAt && (!Number.isFinite(created) || created < startedAt)) |
| 838 | return "incomplete"; |
| 839 | const relevant = ordered.filter((message) => { |
| 840 | const candidate = message?.info || message || {}; |
| 841 | if (candidate.role !== "assistant") |
| 842 | return false; |
| 843 | if (startedAt <= 0) |
| 844 | return true; |
| 845 | const candidateCreated = Number(candidate?.time?.created || 0); |
| 846 | const candidateCompleted = Number(candidate?.time?.completed || 0); |
| 847 | return candidateCreated >= startedAt || candidateCompleted >= startedAt; |
| 848 | }); |
| 849 | return relevant.some(assistantMessageHasMeaningfulActivity) ? "completed" : "empty"; |
| 850 | } |
| 851 | async function resolveCompactionModel(directory, client, sessionID, preferredModel) { |
| 852 | const preferred = normalizedModelRef(preferredModel); |
| 853 | if (preferred) |
| 854 | return preferred; |
| 855 | const cached = normalizedModelRef(getSessionExecutionContext(sessionID)?.model); |
| 856 | if (cached) |
| 857 | return cached; |
| 858 | const captured = await captureSessionExecutionContext(client, sessionID); |
| 859 | const capturedModel = normalizedModelRef(captured?.model); |
| 860 | if (capturedModel) |
| 861 | return capturedModel; |
| 862 | const messages = await readRecentSessionMessages(client, sessionID, directory); |
| 863 | for (const message of orderedSessionMessages(messages).reverse()) { |
no test coverage detected