From 8be4041335c193e073f890018ac73b67bda71f21 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Sun, 17 May 2026 11:02:10 -0700 Subject: [PATCH 1/3] fix(knowledge): preserve scroll position when toggling tokenizer in chunk viewer --- .../components/chunk-editor/chunk-editor.tsx | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/chunk-editor/chunk-editor.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/chunk-editor/chunk-editor.tsx index d0f241f1fdc..92bb3bdf92d 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/chunk-editor/chunk-editor.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/chunk-editor/chunk-editor.tsx @@ -1,6 +1,6 @@ 'use client' -import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' +import React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react' import { Label, Switch } from '@/components/emcn' import { isApiClientError } from '@/lib/api/client/errors' import { requestJson } from '@/lib/api/client/request' @@ -50,6 +50,8 @@ export function ChunkEditor({ onCreated, }: ChunkEditorProps) { const textareaRef = useRef(null) + const tokenizedScrollRef = useRef(null) + const preservedScrollTopRef = useRef(0) const { mutateAsync: updateChunk } = useUpdateChunk() const { mutateAsync: createChunk } = useCreateChunk() @@ -170,6 +172,20 @@ export function ChunkEditor({ [saveRef] ) + const handleTokenizerChange = useCallback( + (value: boolean) => { + const source = tokenizerOn ? tokenizedScrollRef.current : textareaRef.current + preservedScrollTopRef.current = source?.scrollTop ?? 0 + setTokenizerOn(value) + }, + [tokenizerOn] + ) + + useLayoutEffect(() => { + const target = tokenizerOn ? tokenizedScrollRef.current : textareaRef.current + if (target) target.scrollTop = preservedScrollTopRef.current + }, [tokenizerOn]) + const tokenStrings = useMemo(() => { if (!tokenizerOn || !editedContent) return [] return getTokenStrings(editedContent) @@ -196,7 +212,10 @@ export function ChunkEditor({ }} > {tokenizerOn ? ( -
+
{tokenStrings.map((token, index) => ( From 0e1e331f5800df7b9e7e6d1d0b1e6016beac520e Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Sun, 17 May 2026 11:19:33 -0700 Subject: [PATCH 2/3] fix(knowledge): skip scroll restore on initial mount of chunk editor --- .../[documentId]/components/chunk-editor/chunk-editor.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/chunk-editor/chunk-editor.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/chunk-editor/chunk-editor.tsx index 92bb3bdf92d..0656d632bf5 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/chunk-editor/chunk-editor.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/chunk-editor/chunk-editor.tsx @@ -172,16 +172,20 @@ export function ChunkEditor({ [saveRef] ) + const hasToggledTokenizerRef = useRef(false) + const handleTokenizerChange = useCallback( (value: boolean) => { const source = tokenizerOn ? tokenizedScrollRef.current : textareaRef.current preservedScrollTopRef.current = source?.scrollTop ?? 0 + hasToggledTokenizerRef.current = true setTokenizerOn(value) }, [tokenizerOn] ) useLayoutEffect(() => { + if (!hasToggledTokenizerRef.current) return const target = tokenizerOn ? tokenizedScrollRef.current : textareaRef.current if (target) target.scrollTop = preservedScrollTopRef.current }, [tokenizerOn]) From 0ff4b45125b62071410972053b55ac5106dbe90e Mon Sep 17 00:00:00 2001 From: waleed Date: Mon, 18 May 2026 09:58:52 -0700 Subject: [PATCH 3/3] chore(dev): add dev:clean script to purge Turbopack cache --- apps/sim/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/sim/package.json b/apps/sim/package.json index f175df18d51..dc6f615477a 100644 --- a/apps/sim/package.json +++ b/apps/sim/package.json @@ -9,6 +9,7 @@ }, "scripts": { "dev": "next dev --port 3000", + "dev:clean": "rm -rf .next/dev/cache", "dev:webpack": "next dev --webpack", "load:workflow": "bun run load:workflow:baseline", "load:workflow:baseline": "BASE_URL=${BASE_URL:-http://localhost:3000} WARMUP_DURATION=${WARMUP_DURATION:-10} WARMUP_RATE=${WARMUP_RATE:-2} PEAK_RATE=${PEAK_RATE:-8} HOLD_DURATION=${HOLD_DURATION:-20} bunx artillery run scripts/load/workflow-concurrency.yml",