- {visibleLines.map((line, idx) => (
+ {visibleLines.map(({ key, line }) => (
0;
const previewIsChangedFiles = hasChangedFiles && !workEntry.command && !workEntry.detail;
const hasDiffData = workEntry.diffData != null && workEntry.itemType === "file_change";
diff --git a/apps/web/src/components/merge-conflicts/MergeConflictShell.tsx b/apps/web/src/components/merge-conflicts/MergeConflictShell.tsx
index c009f78f4..52df6048e 100644
--- a/apps/web/src/components/merge-conflicts/MergeConflictShell.tsx
+++ b/apps/web/src/components/merge-conflicts/MergeConflictShell.tsx
@@ -254,7 +254,7 @@ function MergeConflictGuidanceRail({
const navigateToLatestThread = useCallback(() => {
openCodeViewer();
- const sorted = [...threads].sort((a, b) =>
+ const sorted = threads.toSorted((a, b) =>
(b.updatedAt ?? b.createdAt).localeCompare(a.updatedAt ?? a.createdAt),
);
const latest = sorted[0];
diff --git a/apps/web/src/hooks/useAutoDeleteMergedThreads.ts b/apps/web/src/hooks/useAutoDeleteMergedThreads.ts
index 810cc5ed1..a8088e63e 100644
--- a/apps/web/src/hooks/useAutoDeleteMergedThreads.ts
+++ b/apps/web/src/hooks/useAutoDeleteMergedThreads.ts
@@ -139,11 +139,12 @@ export function useAutoDeleteMergedThreads(settings: AppSettings) {
// Cleanup all timers on unmount.
useEffect(() => {
+ const timers = timersRef.current;
return () => {
- for (const [, timer] of timersRef.current) {
+ for (const [, timer] of timers) {
clearTimeout(timer.timeoutId);
}
- timersRef.current.clear();
+ timers.clear();
};
}, []);
}
diff --git a/apps/web/src/hooks/useFileViewNavigation.ts b/apps/web/src/hooks/useFileViewNavigation.ts
index bcd636d4d..7835166bd 100644
--- a/apps/web/src/hooks/useFileViewNavigation.ts
+++ b/apps/web/src/hooks/useFileViewNavigation.ts
@@ -22,7 +22,7 @@ export function useFileViewNavigation() {
// If not already on a thread page, navigate to the most recent thread
// so the code-viewer inline sidebar is visible.
if (!threadId) {
- const sorted = [...threads].sort((a, b) =>
+ const sorted = threads.toSorted((a, b) =>
(b.updatedAt ?? b.createdAt).localeCompare(a.updatedAt ?? a.createdAt),
);
const latest = sorted[0];
diff --git a/apps/web/src/routes/_chat.file-view.tsx b/apps/web/src/routes/_chat.file-view.tsx
index 03acbfc98..b35ef7505 100644
--- a/apps/web/src/routes/_chat.file-view.tsx
+++ b/apps/web/src/routes/_chat.file-view.tsx
@@ -27,7 +27,7 @@ function FileViewRouteRedirect() {
}
// Navigate to the most recent thread (or home)
- const sorted = [...threads].sort((a, b) =>
+ const sorted = threads.toSorted((a, b) =>
(b.updatedAt ?? b.createdAt).localeCompare(a.updatedAt ?? a.createdAt),
);
const latest = sorted[0];
diff --git a/docs/releases/v0.14.0/assets.md b/docs/releases/v0.14.0/assets.md
index 0b5250700..3b973e36b 100644
--- a/docs/releases/v0.14.0/assets.md
+++ b/docs/releases/v0.14.0/assets.md
@@ -14,13 +14,13 @@ After the workflow completes, expect **installer and updater** artifacts similar
## Desktop installers and payloads
-| Platform | Kind | Typical pattern |
-| ------------------- | -------------- | ----------------- |
-| macOS Apple Silicon | DMG (signed) | `*.dmg` (arm64) |
-| macOS Intel | DMG (signed) | `*.dmg` (x64) |
-| macOS | ZIP (updater) | `*.zip` |
-| Linux x64 | AppImage | `*.AppImage` |
-| Windows x64 | NSIS installer | `*.exe` |
+| Platform | Kind | Typical pattern |
+| ------------------- | -------------- | --------------- |
+| macOS Apple Silicon | DMG (signed) | `*.dmg` (arm64) |
+| macOS Intel | DMG (signed) | `*.dmg` (x64) |
+| macOS | ZIP (updater) | `*.zip` |
+| Linux x64 | AppImage | `*.AppImage` |
+| Windows x64 | NSIS installer | `*.exe` |
### macOS code signing and notarization
diff --git a/packages/contracts/src/ws.ts b/packages/contracts/src/ws.ts
index 10039aeb4..b64a437a1 100644
--- a/packages/contracts/src/ws.ts
+++ b/packages/contracts/src/ws.ts
@@ -66,12 +66,7 @@ import {
} from "./project";
import { ProjectFileTreeChangedPayload } from "./project";
import { OpenInEditorInput, OpenPathInput } from "./editor";
-import {
- GeneratePairingLinkInput,
- ListTokensResult,
- RevokeTokenInput,
- ServerConfigUpdatedPayload,
-} from "./server";
+import { GeneratePairingLinkInput, RevokeTokenInput, ServerConfigUpdatedPayload } from "./server";
import {
SkillListInput,
SkillCatalogInput,