From 9a9e31a4d72eda4cc2568a3b378cd702ec3266b0 Mon Sep 17 00:00:00 2001 From: Alex Southwell <4596216+saphid@users.noreply.github.com> Date: Tue, 3 Nov 2026 12:39:30 +1100 Subject: [PATCH] fix(web): long preview annotation comments are no longer dropped from the message Co-Authored-By: Claude Opus 5.5 --- apps/web/src/lib/composerContextRecords.test.ts | 6 ++++++ apps/web/src/lib/composerContextRecords.ts | 6 +++++- packages/contracts/src/composerContext.ts | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/apps/web/src/lib/composerContextRecords.test.ts b/apps/web/src/lib/composerContextRecords.test.ts index f612a302ac8c8..5c0f0076232ce 100644 --- a/apps/web/src/lib/composerContextRecords.test.ts +++ b/apps/web/src/lib/composerContextRecords.test.ts @@ -236,6 +236,12 @@ describe("composerContextRecords", () => { expect(restored.elements[0]?.id).toBe("el_1"); }); + it("clamps an oversized annotation comment so the record still decodes", () => { + const record = previewAnnotationContextRecord({ ...annotation, comment: "c".repeat(8_001) }); + expect(record.comment.endsWith("… truncated …")).toBe(true); + expect(decodeMessageContext({ version: 1, records: [record] }).records).toEqual([record]); + }); + it("removes an expired terminal chip by its kind-scoped id, not the producer id", () => { const context = { id: "term-1", diff --git a/apps/web/src/lib/composerContextRecords.ts b/apps/web/src/lib/composerContextRecords.ts index c4f123f73dcc4..106238cb2d542 100644 --- a/apps/web/src/lib/composerContextRecords.ts +++ b/apps/web/src/lib/composerContextRecords.ts @@ -3,6 +3,7 @@ import { sourceControlClients, } from "@t3tools/client-runtime/source-control-clients"; import { + COMPOSER_CONTEXT_PREVIEW_COMMENT_MAX_CHARS, COMPOSER_CONTEXT_REVIEW_DIFF_MAX_CHARS, COMPOSER_CONTEXT_REVIEW_TEXT_MAX_CHARS, } from "@t3tools/contracts"; @@ -241,7 +242,10 @@ export function previewAnnotationContextRecord( annotationId: annotation.id, pageUrl: annotation.pageUrl, pageTitle: annotation.pageTitle, - comment: annotation.comment.trim(), + comment: clampContextText( + annotation.comment.trim(), + COMPOSER_CONTEXT_PREVIEW_COMMENT_MAX_CHARS, + ), targetSummary: previewAnnotationTargetSummary(annotation), styleChanges: annotation.styleChanges.map( (change) => `${change.property}: ${change.previousValue || "(unset)"} → ${change.value}`, diff --git a/packages/contracts/src/composerContext.ts b/packages/contracts/src/composerContext.ts index 834dbd6821323..3df77e68dde86 100644 --- a/packages/contracts/src/composerContext.ts +++ b/packages/contracts/src/composerContext.ts @@ -39,7 +39,7 @@ const COMPOSER_CONTEXT_ELEMENT_HTML_MAX_CHARS = 8_000; const COMPOSER_CONTEXT_ELEMENT_STYLES_MAX_CHARS = 8_000; export const COMPOSER_CONTEXT_REVIEW_TEXT_MAX_CHARS = 16_000; export const COMPOSER_CONTEXT_REVIEW_DIFF_MAX_CHARS = 32_000; -const COMPOSER_CONTEXT_PREVIEW_COMMENT_MAX_CHARS = 8_000; +export const COMPOSER_CONTEXT_PREVIEW_COMMENT_MAX_CHARS = 8_000; export const ComposerContextId = TrimmedNonEmptyString.check( Schema.isMaxLength(CONTEXT_ID_MAX_CHARS),