|
|
@@ -5,12 +5,11 @@ import { DataProvider } from "@opencode-ai/ui/context"
|
|
|
import { FileComponentProvider } from "@opencode-ai/ui/context/file"
|
|
|
import { WorkerPoolProvider } from "@opencode-ai/ui/context/worker-pool"
|
|
|
import { createAsync, query, useParams } from "@solidjs/router"
|
|
|
-import { createEffect, createMemo, ErrorBoundary, For, Match, Show, Switch } from "solid-js"
|
|
|
+import { createMemo, createSignal, 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"
|
|
|
import { ProviderIcon } from "@opencode-ai/ui/provider-icon"
|
|
|
-import { createDefaultOptions } from "@opencode-ai/ui/pierre"
|
|
|
import { iife } from "@opencode-ai/util/iife"
|
|
|
import { Binary } from "@opencode-ai/util/binary"
|
|
|
import { NamedError } from "@opencode-ai/util/error"
|
|
|
@@ -20,11 +19,11 @@ import z from "zod"
|
|
|
import NotFound from "../[...404]"
|
|
|
import { Tabs } from "@opencode-ai/ui/tabs"
|
|
|
import { MessageNav } from "@opencode-ai/ui/message-nav"
|
|
|
-import { preloadMultiFileDiff, PreloadMultiFileDiffResult } from "@pierre/diffs/ssr"
|
|
|
import { FileSSR } from "@opencode-ai/ui/file-ssr"
|
|
|
import { clientOnly } from "@solidjs/start"
|
|
|
import { Meta, Title } from "@solidjs/meta"
|
|
|
import { Base64 } from "js-base64"
|
|
|
+import { getRequestEvent } from "solid-js/web"
|
|
|
|
|
|
const ClientOnlyWorkerPoolProvider = clientOnly(() =>
|
|
|
import("@opencode-ai/ui/pierre/worker").then((m) => ({
|
|
|
@@ -54,12 +53,6 @@ const getData = query(async (shareID) => {
|
|
|
session_diff: {
|
|
|
[sessionID: string]: FileDiff[]
|
|
|
}
|
|
|
- session_diff_preload: {
|
|
|
- [sessionID: string]: PreloadMultiFileDiffResult<any>[]
|
|
|
- }
|
|
|
- session_diff_preload_split: {
|
|
|
- [sessionID: string]: PreloadMultiFileDiffResult<any>[]
|
|
|
- }
|
|
|
session_status: {
|
|
|
[sessionID: string]: SessionStatus
|
|
|
}
|
|
|
@@ -79,12 +72,6 @@ const getData = query(async (shareID) => {
|
|
|
session_diff: {
|
|
|
[share.sessionID]: [],
|
|
|
},
|
|
|
- session_diff_preload: {
|
|
|
- [share.sessionID]: [],
|
|
|
- },
|
|
|
- session_diff_preload_split: {
|
|
|
- [share.sessionID]: [],
|
|
|
- },
|
|
|
session_status: {
|
|
|
[share.sessionID]: {
|
|
|
type: "idle",
|
|
|
@@ -101,28 +88,6 @@ const getData = query(async (shareID) => {
|
|
|
break
|
|
|
case "session_diff":
|
|
|
result.session_diff[share.sessionID] = item.data
|
|
|
- await Promise.all([
|
|
|
- Promise.all(
|
|
|
- item.data.map(async (diff) =>
|
|
|
- preloadMultiFileDiff<any>({
|
|
|
- oldFile: { name: diff.file, contents: diff.before },
|
|
|
- newFile: { name: diff.file, contents: diff.after },
|
|
|
- options: createDefaultOptions("unified"),
|
|
|
- // annotations,
|
|
|
- }),
|
|
|
- ),
|
|
|
- ).then((r) => (result.session_diff_preload[share.sessionID] = r)),
|
|
|
- Promise.all(
|
|
|
- item.data.map(async (diff) =>
|
|
|
- preloadMultiFileDiff<any>({
|
|
|
- oldFile: { name: diff.file, contents: diff.before },
|
|
|
- newFile: { name: diff.file, contents: diff.after },
|
|
|
- options: createDefaultOptions("split"),
|
|
|
- // annotations,
|
|
|
- }),
|
|
|
- ),
|
|
|
- ).then((r) => (result.session_diff_preload_split[share.sessionID] = r)),
|
|
|
- ])
|
|
|
break
|
|
|
case "message":
|
|
|
result.message[item.data.sessionID] = result.message[item.data.sessionID] ?? []
|
|
|
@@ -143,17 +108,15 @@ const getData = query(async (shareID) => {
|
|
|
}, "getShareData")
|
|
|
|
|
|
export default function () {
|
|
|
+ getRequestEvent()?.response.headers.set(
|
|
|
+ "Cache-Control",
|
|
|
+ "public, max-age=30, s-maxage=300, stale-while-revalidate=86400",
|
|
|
+ )
|
|
|
+
|
|
|
const params = useParams()
|
|
|
const data = createAsync(async () => {
|
|
|
if (!params.shareID) throw new Error("Missing shareID")
|
|
|
- const now = Date.now()
|
|
|
- const data = getData(params.shareID)
|
|
|
- console.log("getData", Date.now() - now)
|
|
|
- return data
|
|
|
- })
|
|
|
-
|
|
|
- createEffect(() => {
|
|
|
- console.log(data())
|
|
|
+ return getData(params.shareID)
|
|
|
})
|
|
|
|
|
|
return (
|
|
|
@@ -241,22 +204,8 @@ 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(() => {
|
|
|
- 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 splitDiffs = createMemo(() => {
|
|
|
- const diffs = data().session_diff[data().sessionID] ?? []
|
|
|
- const preloaded = data().session_diff_preload_split[data().sessionID] ?? []
|
|
|
- return diffs.map((diff) => ({
|
|
|
- ...diff,
|
|
|
- preloaded: preloaded.find((d) => d.newFile.name === diff.file),
|
|
|
- }))
|
|
|
- })
|
|
|
+ const diffs = createMemo(() => data().session_diff[data().sessionID] ?? [])
|
|
|
+ const [diffStyle, setDiffStyle] = createSignal<"unified" | "split">("unified")
|
|
|
|
|
|
const title = () => (
|
|
|
<div class="flex flex-col gap-4">
|
|
|
@@ -380,18 +329,9 @@ export default function () {
|
|
|
<Show when={diffs().length > 0}>
|
|
|
<div class="@container relative grow pt-14 flex-1 min-h-0 border-l border-border-weak-base">
|
|
|
<SessionReview
|
|
|
- class="@4xl:hidden"
|
|
|
diffs={diffs()}
|
|
|
- classes={{
|
|
|
- root: "pb-20",
|
|
|
- header: "px-6",
|
|
|
- container: "px-6",
|
|
|
- }}
|
|
|
- />
|
|
|
- <SessionReview
|
|
|
- split
|
|
|
- class="hidden @4xl:flex"
|
|
|
- diffs={splitDiffs()}
|
|
|
+ diffStyle={diffStyle()}
|
|
|
+ onDiffStyleChange={setDiffStyle}
|
|
|
classes={{
|
|
|
root: "pb-20",
|
|
|
header: "px-6",
|
|
|
@@ -419,11 +359,7 @@ export default function () {
|
|
|
<Tabs.Content value="session" class="!overflow-hidden">
|
|
|
{turns()}
|
|
|
</Tabs.Content>
|
|
|
- <Tabs.Content
|
|
|
- forceMount
|
|
|
- value="review"
|
|
|
- class="!overflow-hidden hidden data-[selected]:block"
|
|
|
- >
|
|
|
+ <Tabs.Content value="review" class="!overflow-hidden hidden data-[selected]:block">
|
|
|
<div class="relative h-full pt-8 overflow-y-auto no-scrollbar">
|
|
|
<SessionReview
|
|
|
diffs={diffs()}
|