Skip to content

Commit 3fb5704

Browse files
committed
wip(share): more styling
1 parent 46a76a7 commit 3fb5704

4 files changed

Lines changed: 59 additions & 15 deletions

File tree

.opencode/opencode.jsonc

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
{
22
"$schema": "https://opencode.ai/config.json",
3-
"plugin": ["opencode-openai-codex-auth"],
4-
// "enterprise": {
5-
// "url": "http://localhost:3000",
6-
// },
3+
"plugin": [
4+
"opencode-openai-codex-auth"
5+
],
6+
"enterprise": {
7+
"url": "http://localhost:3000",
8+
},
79
"provider": {
810
"opencode": {
911
"options": {

packages/enterprise/src/core/share.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { FileDiff, Message, Part, Session, SessionStatus } from "@opencode-ai/sdk"
1+
import { FileDiff, Message, Model, Part, Session, SessionStatus } from "@opencode-ai/sdk"
22
import { fn } from "@opencode-ai/util/fn"
33
import { iife } from "@opencode-ai/util/iife"
44
import z from "zod"
@@ -32,6 +32,10 @@ export namespace Share {
3232
type: z.literal("session_status"),
3333
data: z.custom<SessionStatus>(),
3434
}),
35+
z.object({
36+
type: z.literal("model"),
37+
data: z.custom<Model[]>(),
38+
}),
3539
])
3640
export type Data = z.infer<typeof Data>
3741

@@ -111,6 +115,9 @@ export namespace Share {
111115
case "session_status":
112116
await Storage.write(["share_data", input.share.id, "session_status"], item.data)
113117
break
118+
case "model":
119+
await Storage.write(["share_data", input.share.id, "model"], item.data)
120+
break
114121
}
115122
}),
116123
)

packages/enterprise/src/routes/share/[sessionID].tsx

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { FileDiff, Message, Part, Session, SessionStatus, UserMessage } from "@opencode-ai/sdk"
1+
import { FileDiff, Message, Model, Part, Session, SessionStatus, UserMessage } from "@opencode-ai/sdk"
22
import { SessionTurn } from "@opencode-ai/ui/session-turn"
33
import { SessionReview } from "@opencode-ai/ui/session-review"
4-
import { DataProvider, useData } from "@opencode-ai/ui/context"
4+
import { DataProvider } from "@opencode-ai/ui/context"
55
import { createAsync, query, RouteDefinition, useParams } from "@solidjs/router"
66
import { createMemo, Show } from "solid-js"
77
import { Share } from "~/core/share"
@@ -29,6 +29,9 @@ const getData = query(async (sessionID) => {
2929
part: {
3030
[messageID: string]: Part[]
3131
}
32+
model: {
33+
[sessionID: string]: Model[]
34+
}
3235
} = {
3336
session: [],
3437
session_diff: {
@@ -41,6 +44,7 @@ const getData = query(async (sessionID) => {
4144
},
4245
message: {},
4346
part: {},
47+
model: {},
4448
}
4549
for (const item of data) {
4650
switch (item.type) {
@@ -61,6 +65,9 @@ const getData = query(async (sessionID) => {
6165
result.part[item.data.messageID] = result.part[item.data.messageID] ?? []
6266
result.part[item.data.messageID].push(item.data)
6367
break
68+
case "model":
69+
result.model[sessionID] = item.data
70+
break
6471
}
6572
}
6673
return result
@@ -82,15 +89,14 @@ export default function () {
8289
{(data) => (
8390
<DataProvider data={data()}>
8491
{iife(() => {
85-
const data = useData()
8692
const [store, setStore] = createStore({
8793
messageId: undefined as string | undefined,
8894
})
89-
const match = createMemo(() => Binary.search(data.session, params.sessionID!, (s) => s.id))
95+
const match = createMemo(() => Binary.search(data().session, params.sessionID!, (s) => s.id))
9096
if (!match().found) throw new Error(`Session ${params.sessionID} not found`)
91-
const info = createMemo(() => data.session[match().index])
97+
const info = createMemo(() => data().session[match().index])
9298
const messages = createMemo(() =>
93-
params.sessionID ? (data.message[params.sessionID]?.filter((m) => m.role === "user") ?? []) : [],
99+
params.sessionID ? (data().message[params.sessionID]?.filter((m) => m.role === "user") ?? []) : [],
94100
)
95101
const firstUserMessage = createMemo(() => messages().at(0))
96102
const activeMessage = createMemo(
@@ -104,8 +110,9 @@ export default function () {
104110
}
105111
}
106112
const provider = createMemo(() => activeMessage()?.model?.providerID)
107-
const model = createMemo(() => activeMessage()?.model?.modelID)
108-
const diffs = createMemo(() => data.session_diff[params.sessionID!] ?? [])
113+
const modelID = createMemo(() => activeMessage()?.model?.modelID)
114+
const model = createMemo(() => data().model[params.sessionID!]?.find((m) => m.id === modelID()))
115+
const diffs = createMemo(() => data().session_diff[params.sessionID!] ?? [])
109116

110117
return (
111118
<div class="relative bg-background-stronger w-screen h-screen overflow-hidden flex flex-col">
@@ -152,7 +159,7 @@ export default function () {
152159
src={`https://models.dev/logos/${provider()}.svg`}
153160
class="size-4 shrink-0 dark:invert"
154161
/>
155-
<div class="text-12-regular text-text-base">{model()}</div>
162+
<div class="text-12-regular text-text-base">{model()?.name ?? modelID()}</div>
156163
</div>
157164
<div class="text-12-regular text-text-weaker">
158165
{DateTime.fromMillis(info().time.created).toFormat("dd MMM yyyy, HH:mm")}
@@ -163,7 +170,7 @@ export default function () {
163170
<div class="flex items-start justify-start h-full min-h-0">
164171
<Show when={messages().length > 1}>
165172
<MessageNav
166-
classList={{ "mt-3 mr-3": true }}
173+
classList={{ "mt-2 mr-3": true }}
167174
messages={messages()}
168175
current={activeMessage()}
169176
onMessageSelect={setActiveMessage}

packages/opencode/src/share/share-next.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { Bus } from "@/bus"
22
import { Config } from "@/config/config"
3+
import type { ModelsDev } from "@/provider/models"
4+
import { Provider } from "@/provider/provider"
35
import { Session } from "@/session"
46
import { MessageV2 } from "@/session/message-v2"
57
import { Storage } from "@/storage/storage"
@@ -26,6 +28,18 @@ export namespace ShareNext {
2628
data: evt.properties.info,
2729
},
2830
])
31+
if (evt.properties.info.role === "user") {
32+
await sync(evt.properties.info.sessionID, [
33+
{
34+
type: "model",
35+
data: [
36+
await Provider.getModel(evt.properties.info.model.providerID, evt.properties.info.model.modelID).then(
37+
(m) => m.info,
38+
),
39+
],
40+
},
41+
])
42+
}
2943
})
3044
Bus.subscribe(MessageV2.Event.PartUpdated, async (evt) => {
3145
await sync(evt.properties.part.sessionID, [
@@ -90,6 +104,10 @@ export namespace ShareNext {
90104
type: "session_diff"
91105
data: SDK.FileDiff[]
92106
}
107+
| {
108+
type: "model"
109+
data: ModelsDev.Model[]
110+
}
93111

94112
async function sync(sessionID: string, data: Data[]) {
95113
const url = await Config.get().then((x) => x.enterprise!.url)
@@ -129,6 +147,12 @@ export namespace ShareNext {
129147
const session = await Session.get(sessionID)
130148
const diffs = await Session.diff(sessionID)
131149
const messages = await Array.fromAsync(MessageV2.stream(sessionID))
150+
const models = await Promise.all(
151+
messages
152+
.filter((m) => m.info.role === "user")
153+
.map((m) => (m.info as SDK.UserMessage).model)
154+
.map((m) => Provider.getModel(m.providerID, m.modelID).then((m) => m.info)),
155+
)
132156
await sync(sessionID, [
133157
{
134158
type: "session",
@@ -143,6 +167,10 @@ export namespace ShareNext {
143167
type: "session_diff",
144168
data: diffs,
145169
},
170+
{
171+
type: "model",
172+
data: models,
173+
},
146174
])
147175
}
148176
}

0 commit comments

Comments
 (0)