mirror of
https://github.com/supermemoryai/supermemory.git
synced 2026-08-28 05:25:33 +00:00
fix(web): stop truncating multi-line plugin transcript messages (#1185)
This commit is contained in:
parent
942f03eef9
commit
95fc201072
2 changed files with 90 additions and 1 deletions
86
apps/web/lib/plugin-document.test.ts
Normal file
86
apps/web/lib/plugin-document.test.ts
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
import { describe, expect, it } from "bun:test"
|
||||
import { parsePluginDocument } from "./plugin-document"
|
||||
|
||||
type PluginDocumentInput = Parameters<typeof parsePluginDocument>[0]
|
||||
|
||||
function makeCodexSessionDocument(content: string): PluginDocumentInput {
|
||||
return {
|
||||
id: "doc_1",
|
||||
title: "Codex session",
|
||||
content,
|
||||
metadata: { sm_source: "codex" },
|
||||
memoryEntries: [],
|
||||
} as unknown as PluginDocumentInput
|
||||
}
|
||||
|
||||
describe("parsePluginDocument — session transcripts", () => {
|
||||
it("keeps multi-line message bodies intact", () => {
|
||||
const parsed = parsePluginDocument(
|
||||
makeCodexSessionDocument(
|
||||
[
|
||||
"[Session abc-123]",
|
||||
"1. [user] Hello there",
|
||||
"Here is more context on line two",
|
||||
"2. [assistant] Sure!",
|
||||
"Second line of the reply",
|
||||
].join("\n"),
|
||||
),
|
||||
)
|
||||
|
||||
expect(parsed).not.toBeNull()
|
||||
expect(parsed?.kind).toBe("codex-session")
|
||||
expect(parsed?.messages).toHaveLength(2)
|
||||
expect(parsed?.messages[0]?.text).toBe(
|
||||
"Hello there\nHere is more context on line two",
|
||||
)
|
||||
expect(parsed?.messages[1]?.text).toBe("Sure!\nSecond line of the reply")
|
||||
})
|
||||
|
||||
it("surfaces memory id artifacts from continuation lines", () => {
|
||||
const parsed = parsePluginDocument(
|
||||
makeCodexSessionDocument(
|
||||
[
|
||||
"[Session abc-123]",
|
||||
"1. [user] Remember my editor is Neovim",
|
||||
"memory id: mem_456",
|
||||
"2. [assistant] Saved it.",
|
||||
].join("\n"),
|
||||
),
|
||||
)
|
||||
|
||||
expect(parsed?.messages[0]?.text).toBe("Remember my editor is Neovim")
|
||||
expect(parsed?.artifacts).toContainEqual({
|
||||
label: "Memory ID",
|
||||
value: "mem_456",
|
||||
})
|
||||
})
|
||||
|
||||
it("normalizes literal \\n escapes before splitting messages", () => {
|
||||
const parsed = parsePluginDocument(
|
||||
makeCodexSessionDocument(
|
||||
"[Session abc-123]\\n1. [user] First line\\nSecond line\\n2. [assistant] Reply",
|
||||
),
|
||||
)
|
||||
|
||||
expect(parsed?.messages).toHaveLength(2)
|
||||
expect(parsed?.messages[0]?.text).toBe("First line\nSecond line")
|
||||
expect(parsed?.messages[1]?.text).toBe("Reply")
|
||||
})
|
||||
|
||||
it("parses single-line messages as before", () => {
|
||||
const parsed = parsePluginDocument(
|
||||
makeCodexSessionDocument(
|
||||
["[Session abc-123]", "1. [user] Hi", "2. [assistant] Hello!"].join(
|
||||
"\n",
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
expect(parsed?.messages).toHaveLength(2)
|
||||
expect(parsed?.messages[0]?.text).toBe("Hi")
|
||||
expect(parsed?.messages[1]?.text).toBe("Hello!")
|
||||
expect(parsed?.summary).toBe(
|
||||
"1 user message and 1 assistant message captured from Codex.",
|
||||
)
|
||||
})
|
||||
})
|
||||
|
|
@ -227,8 +227,11 @@ function parseTranscriptMessages(content: string): {
|
|||
} {
|
||||
const messages: PluginDocumentMessage[] = []
|
||||
const artifacts: PluginArtifact[] = []
|
||||
// The lookahead must end the last message at the true end of input:
|
||||
// with the m flag, a bare $ matches every line end and would cut each
|
||||
// message body off at its first newline.
|
||||
const regex = new RegExp(
|
||||
`^\\s*(\\d+)\\.\\s+\\[(${TRANSCRIPT_ROLE_PATTERN})\\]\\s*([\\s\\S]*?)(?=^\\s*\\d+\\.\\s+\\[(?:${TRANSCRIPT_ROLE_PATTERN})\\]\\s*|$)`,
|
||||
`^\\s*(\\d+)\\.\\s+\\[(${TRANSCRIPT_ROLE_PATTERN})\\]\\s*([\\s\\S]*?)(?=^\\s*\\d+\\.\\s+\\[(?:${TRANSCRIPT_ROLE_PATTERN})\\]\\s*|(?![\\s\\S]))`,
|
||||
"gm",
|
||||
)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue