diff options
| author | Adam <[email protected]> | 2025-11-25 07:40:11 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2025-11-25 07:40:16 -0600 |
| commit | 15facd8cfd5ed43fd503326d950df40e5ef81a3a (patch) | |
| tree | d9bc3650299da970899c0cc2f888d223a5c973a5 /packages/enterprise | |
| parent | 57bd47a44673a03f7c0fd9b509a796b36c94c130 (diff) | |
| download | opencode-15facd8cfd5ed43fd503326d950df40e5ef81a3a.tar.gz opencode-15facd8cfd5ed43fd503326d950df40e5ef81a3a.zip | |
feat(share): SSR'd diffs
Diffstat (limited to 'packages/enterprise')
| -rw-r--r-- | packages/enterprise/package.json | 1 | ||||
| -rw-r--r-- | packages/enterprise/src/app.tsx | 16 | ||||
| -rw-r--r-- | packages/enterprise/src/routes/share/[shareID].tsx | 43 |
3 files changed, 48 insertions, 12 deletions
diff --git a/packages/enterprise/package.json b/packages/enterprise/package.json index 09348b437..6f94a4b2c 100644 --- a/packages/enterprise/package.json +++ b/packages/enterprise/package.json @@ -13,6 +13,7 @@ "dependencies": { "@opencode-ai/util": "workspace:*", "@opencode-ai/ui": "workspace:*", + "@pierre/precision-diffs": "catalog:", "@solidjs/router": "catalog:", "@solidjs/start": "catalog:", "@solidjs/meta": "catalog:", diff --git a/packages/enterprise/src/app.tsx b/packages/enterprise/src/app.tsx index 185b36a79..28c271775 100644 --- a/packages/enterprise/src/app.tsx +++ b/packages/enterprise/src/app.tsx @@ -3,21 +3,19 @@ import { FileRoutes } from "@solidjs/start/router" import { Fonts } from "@opencode-ai/ui/fonts" import { MetaProvider } from "@solidjs/meta" import { MarkedProvider } from "@opencode-ai/ui/context/marked" -import "./app.css" import { Suspense } from "solid-js" +import "./app.css" export default function App() { return ( <Router root={(props) => ( - <Suspense> - <MarkedProvider> - <MetaProvider> - <Fonts /> - {props.children} - </MetaProvider> - </MarkedProvider> - </Suspense> + <MarkedProvider> + <MetaProvider> + <Fonts /> + <Suspense>{props.children}</Suspense> + </MetaProvider> + </MarkedProvider> )} > <FileRoutes /> diff --git a/packages/enterprise/src/routes/share/[shareID].tsx b/packages/enterprise/src/routes/share/[shareID].tsx index f96e4d57a..033d87fed 100644 --- a/packages/enterprise/src/routes/share/[shareID].tsx +++ b/packages/enterprise/src/routes/share/[shareID].tsx @@ -2,8 +2,8 @@ import { FileDiff, Message, Model, Part, Session, SessionStatus, UserMessage } f import { SessionTurn } from "@opencode-ai/ui/session-turn" import { SessionReview } from "@opencode-ai/ui/session-review" import { DataProvider } from "@opencode-ai/ui/context" -import { createAsync, query, RouteDefinition, useParams } from "@solidjs/router" -import { createEffect, createMemo, ErrorBoundary, For, Match, Show, Suspense, Switch } from "solid-js" +import { createAsync, query, useParams } from "@solidjs/router" +import { createEffect, createMemo, ErrorBoundary, For, Match, Show, Switch } from "solid-js" import { Share } from "~/core/share" import { Logo, Mark } from "@opencode-ai/ui/logo" import { IconButton } from "@opencode-ai/ui/icon-button" @@ -16,6 +16,7 @@ import { createStore } from "solid-js/store" import z from "zod" import NotFound from "../[...404]" import { Tabs } from "@opencode-ai/ui/tabs" +import { HunkData, preloadMultiFileDiff, PreloadMultiFileDiffResult } from "@pierre/precision-diffs/ssr" const SessionDataMissingError = NamedError.create( "SessionDataMissingError", @@ -36,6 +37,9 @@ const getData = query(async (shareID) => { session_diff: { [sessionID: string]: FileDiff[] } + session_diff_preload: { + [sessionID: string]: PreloadMultiFileDiffResult<any>[] + } session_status: { [sessionID: string]: SessionStatus } @@ -54,6 +58,9 @@ const getData = query(async (shareID) => { session_diff: { [share.sessionID]: [], }, + session_diff_preload: { + [share.sessionID]: [], + }, session_status: { [share.sessionID]: { type: "idle", @@ -70,6 +77,29 @@ const getData = query(async (shareID) => { break case "session_diff": result.session_diff[share.sessionID] = item.data + result.session_diff_preload[share.sessionID] = await Promise.all( + item.data.map(async (diff) => + preloadMultiFileDiff<any>({ + oldFile: { name: diff.file, contents: diff.before }, + newFile: { name: diff.file, contents: diff.after }, + options: { + theme: "OpenCode", + themeType: "system", + disableLineNumbers: false, + overflow: "wrap", + diffStyle: "unified", + diffIndicators: "bars", + disableBackground: false, + expansionLineCount: 20, + lineDiffType: "word-alt", + maxLineDiffLength: 1000, + maxLineLengthForHighlighting: 1000, + disableFileHeader: true, + }, + // annotations, + }), + ), + ) break case "message": result.message[item.data.sessionID] = result.message[item.data.sessionID] ?? [] @@ -141,7 +171,14 @@ export default function () { const provider = createMemo(() => activeMessage()?.model?.providerID) const modelID = createMemo(() => activeMessage()?.model?.modelID) const model = createMemo(() => data().model[data().sessionID]?.find((m) => m.id === modelID())) - const diffs = createMemo(() => data().session_diff[data().sessionID] ?? []) + const diffs = createMemo(() => { + const diffs = data().session_diff[data().sessionID] ?? [] + const preloaded = data().session_diff_preload[data().sessionID] ?? [] + return diffs.map((diff) => ({ + ...diff, + preloaded: preloaded.find((d) => d.newFile.name === diff.file), + })) + }) const title = () => ( <div class="flex flex-col gap-4 shrink-0"> |
