diff --git a/packages/opencode/package.json b/packages/opencode/package.json index 41ce3b4d..0895476b 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -9,10 +9,7 @@ "dev": "bun run ./src/index.ts" }, "exports": { - "./*": [ - "./src/*.ts", - "./src/*/index.ts" - ] + "./*": "./src/*.ts" }, "devDependencies": { "@tsconfig/bun": "1.0.7", diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts index 2672d93d..962b1e57 100644 --- a/packages/opencode/src/session/index.ts +++ b/packages/opencode/src/session/index.ts @@ -42,7 +42,6 @@ export namespace Session { parentID: Identifier.schema("session").optional(), share: z .object({ - secret: z.string(), url: z.string(), }) .optional(), @@ -58,6 +57,12 @@ export namespace Session { }) export type Info = z.output + export const ShareInfo = z.object({ + secret: z.string(), + url: z.string(), + }) + export type ShareInfo = z.output + export const Event = { Updated: Bus.event( "session.updated", @@ -132,13 +137,20 @@ export namespace Session { return read as Info } + export async function getShare(id: string) { + return Storage.readJSON("session/share/" + id) + } + export async function share(id: string) { const session = await get(id) if (session.share) return session.share const share = await Share.create(id) await update(id, (draft) => { - draft.share = share + draft.share = { + url: share.url, + } }) + await Storage.writeJSON("session/share/" + id, share) for (const msg of await messages(id)) { await Share.sync("session/message/" + id + "/" + msg.id, msg) } diff --git a/packages/opencode/src/share/share.ts b/packages/opencode/src/share/share.ts index 877ac0aa..8605644c 100644 --- a/packages/opencode/src/share/share.ts +++ b/packages/opencode/src/share/share.ts @@ -19,10 +19,11 @@ export namespace Share { export async function sync(key: string, content: any) { const [root, ...splits] = key.split("/") if (root !== "session") return - const [, sessionID] = splits - const session = await Session.get(sessionID) - if (!session.share) return - const { secret } = session.share + const [sub, sessionID] = splits + if (sub === "share") return + const share = await Session.getShare(sessionID).catch(() => {}) + if (!share) return + const { secret } = share pending.set(key, content) queue = queue .then(async () => { diff --git a/packages/web/src/components/Share.tsx b/packages/web/src/components/Share.tsx index 2fafe5f9..9089cf2b 100644 --- a/packages/web/src/components/Share.tsx +++ b/packages/web/src/components/Share.tsx @@ -37,7 +37,7 @@ import CodeBlock from "./CodeBlock" import MarkdownView from "./MarkdownView" import styles from "./share.module.css" import { type Message } from "opencode/session/message" -import { type Session } from "opencode/session" +import { type Session } from "opencode/session/index" const MIN_DURATION = 2