feat(core): add session metadata support (#23068)

Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
This commit is contained in:
Shantur Rathore
2026-05-30 22:58:11 +01:00
committed by GitHub
parent ac8e686f33
commit ddc30cd151
14 changed files with 1707 additions and 1 deletions

View File

@@ -16,6 +16,85 @@ afterEach(async () => {
})
describe("session action routes", () => {
it.instance(
"session routes expose metadata on create, update, get, and fork",
() =>
Effect.gen(function* () {
const test = yield* TestInstance
const app = Server.Default().app
const headers = { "Content-Type": "application/json", "x-opencode-directory": test.directory }
const created = yield* Effect.promise(() =>
Promise.resolve(
app.request("/session", {
method: "POST",
headers,
body: JSON.stringify({
title: "meta-session",
metadata: { source: "sdk", trace: { id: "abc" } },
}),
}),
),
)
expect(created.status).toBe(200)
const session = (yield* Effect.promise(() => created.json())) as SessionNs.Info
expect(session.metadata).toEqual({ source: "sdk", trace: { id: "abc" } })
const updated = yield* Effect.promise(() =>
Promise.resolve(
app.request(`/session/${session.id}`, {
method: "PATCH",
headers,
body: JSON.stringify({ metadata: { source: "sdk", trace: { id: "def" }, tags: ["one"] } }),
}),
),
)
expect(updated.status).toBe(200)
const next = (yield* Effect.promise(() => updated.json())) as SessionNs.Info
expect(next.metadata).toEqual({ source: "sdk", trace: { id: "def" }, tags: ["one"] })
const fetched = yield* Effect.promise(() =>
Promise.resolve(
app.request(`/session/${session.id}`, { headers: { "x-opencode-directory": test.directory } }),
),
)
expect(fetched.status).toBe(200)
expect(((yield* Effect.promise(() => fetched.json())) as SessionNs.Info).metadata).toEqual(next.metadata)
const forked = yield* Effect.promise(() =>
Promise.resolve(
app.request(`/session/${session.id}/fork`, {
method: "POST",
headers,
body: JSON.stringify({}),
}),
),
)
expect(forked.status).toBe(200)
const fork = (yield* Effect.promise(() => forked.json())) as SessionNs.Info
expect(fork.metadata).toEqual(next.metadata)
const reset = yield* Effect.promise(() =>
Promise.resolve(
app.request(`/session/${session.id}`, {
method: "PATCH",
headers,
body: JSON.stringify({ metadata: {} }),
}),
),
)
expect(reset.status).toBe(200)
expect(((yield* Effect.promise(() => reset.json())) as SessionNs.Info).metadata).toEqual({})
yield* SessionNs.Service.use((svc) => svc.remove(fork.id).pipe(Effect.ignore))
yield* SessionNs.Service.use((svc) => svc.remove(session.id).pipe(Effect.ignore))
}),
{ git: true },
)
it.instance(
"abort route returns success",
() =>

View File

@@ -227,4 +227,20 @@ describe("session.list", () => {
}),
{ git: true },
)
it.instance(
"includes metadata in listed sessions",
() =>
Effect.gen(function* () {
const meta = { source: "sdk", trace: { id: "abc" } }
const created = yield* withSession({ title: "meta-session", metadata: meta })
const listed = (yield* SessionNs.Service.use((session) => session.list({ search: "meta-session" }))).find(
(item) => item.id === created.id,
)
expect(listed?.metadata).toEqual(meta)
}),
{ git: true },
)
})