diff --git a/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/ConversationList.tsx b/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/ConversationList.tsx
index 5b870ac..b14e761 100644
--- a/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/ConversationList.tsx
+++ b/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/ConversationList.tsx
@@ -1,8 +1,16 @@
"use client";
-import type { FC } from "react";
+import { AlertTriangle, ChevronDown, ExternalLink } from "lucide-react";
+import { type FC, useMemo } from "react";
+import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
+import {
+ Collapsible,
+ CollapsibleContent,
+ CollapsibleTrigger,
+} from "@/components/ui/collapsible";
import type { Conversation } from "@/lib/conversation-schema";
import type { ToolResultContent } from "@/lib/conversation-schema/content/ToolResultContentSchema";
+import type { ErrorJsonl } from "../../../../../../../server/service/types";
import { useSidechain } from "../../hooks/useSidechain";
import { ConversationItem } from "./ConversationItem";
@@ -26,8 +34,66 @@ const getConversationKey = (conversation: Conversation) => {
throw new Error(`Unknown conversation type: ${conversation}`);
};
+const SchemaErrorDisplay: FC<{ errorLine: string }> = ({ errorLine }) => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ Schema Validation Error
+
+
+ This conversation entry failed to parse correctly. This
+ might indicate a format change or parsing issue.{" "}
+
+ Report this issue
+
+
+
+
+
+
+ Raw Content:
+
+
+ {errorLine}
+
+
+
+
+
+
+
+
+ );
+};
+
type ConversationListProps = {
- conversations: Conversation[];
+ conversations: (Conversation | ErrorJsonl)[];
getToolResult: (toolUseId: string) => ToolResultContent | undefined;
};
@@ -35,12 +101,26 @@ export const ConversationList: FC = ({
conversations,
getToolResult,
}) => {
+ const validConversations = useMemo(
+ () =>
+ conversations.filter((conversation) => conversation.type !== "x-error"),
+ [conversations],
+ );
const { isRootSidechain, getSidechainConversations } =
- useSidechain(conversations);
+ useSidechain(validConversations);
return (
{conversations.flatMap((conversation) => {
+ if (conversation.type === "x-error") {
+ return (
+
+ );
+ }
+
const elm = (
{
filteredSessions = Array.from(sessionMap.values());
}
- return { sessions: filteredSessions };
+ return {
+ sessions: filteredSessions,
+ };
}),
] as const);
diff --git a/src/server/service/parseJsonl.ts b/src/server/service/parseJsonl.ts
index a22a312..e3902df 100644
--- a/src/server/service/parseJsonl.ts
+++ b/src/server/service/parseJsonl.ts
@@ -1,4 +1,5 @@
import { ConversationSchema } from "../../lib/conversation-schema";
+import type { ErrorJsonl } from "./types";
export const parseJsonl = (content: string) => {
const lines = content
@@ -6,11 +7,15 @@ export const parseJsonl = (content: string) => {
.split("\n")
.filter((line) => line.trim() !== "");
- return lines.flatMap((line) => {
+ return lines.map((line) => {
const parsed = ConversationSchema.safeParse(JSON.parse(line));
if (!parsed.success) {
console.warn("Failed to parse jsonl, skipping", parsed.error);
- return [];
+ const errorData: ErrorJsonl = {
+ type: "x-error",
+ line,
+ };
+ return errorData;
}
return parsed.data;
diff --git a/src/server/service/project/getProjectMeta.ts b/src/server/service/project/getProjectMeta.ts
index aeb8618..eaa3c7d 100644
--- a/src/server/service/project/getProjectMeta.ts
+++ b/src/server/service/project/getProjectMeta.ts
@@ -21,7 +21,11 @@ const extractProjectPathFromJsonl = async (filePath: string) => {
for (const line of lines) {
const conversation = parseJsonl(line).at(0);
- if (conversation === undefined || conversation.type === "summary") {
+ if (
+ conversation === undefined ||
+ conversation.type === "summary" ||
+ conversation.type === "x-error"
+ ) {
continue;
}
diff --git a/src/server/service/types.ts b/src/server/service/types.ts
index f76ffb4..19c229d 100644
--- a/src/server/service/types.ts
+++ b/src/server/service/types.ts
@@ -26,6 +26,11 @@ export type SessionMeta = {
lastModifiedAt: string | null;
};
-export type SessionDetail = Session & {
- conversations: Conversation[];
+export type ErrorJsonl = {
+ type: "x-error";
+ line: string;
+};
+
+export type SessionDetail = Session & {
+ conversations: (Conversation | ErrorJsonl)[];
};