summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorKit Langton <[email protected]>2026-04-21 17:37:27 -0400
committerGitHub <[email protected]>2026-04-21 17:37:27 -0400
commit0bcf734a67e3b46b26f9c68d1800086365ed67e7 (patch)
tree0ea3ee9d0b9230f449e2fc66edc72ca646022dd4
parentb1c3095edd901a74aa3ed94b5b6bffe6a4217b24 (diff)
downloadopencode-0bcf734a67e3b46b26f9c68d1800086365ed67e7.tar.gz
opencode-0bcf734a67e3b46b26f9c68d1800086365ed67e7.zip
migrate Snapshot schemas to Effect Schema (#23747)
-rw-r--r--packages/opencode/src/server/routes/instance/session.ts2
-rw-r--r--packages/opencode/src/session/message-v2.ts2
-rw-r--r--packages/opencode/src/session/session.ts4
-rw-r--r--packages/opencode/src/snapshot/index.ts38
-rw-r--r--packages/opencode/src/tool/edit.ts14
5 files changed, 31 insertions, 29 deletions
diff --git a/packages/opencode/src/server/routes/instance/session.ts b/packages/opencode/src/server/routes/instance/session.ts
index bf713935b..a46c2f3bf 100644
--- a/packages/opencode/src/server/routes/instance/session.ts
+++ b/packages/opencode/src/server/routes/instance/session.ts
@@ -471,7 +471,7 @@ export const SessionRoutes = lazy(() =>
description: "Successfully retrieved diff",
content: {
"application/json": {
- schema: resolver(Snapshot.FileDiff.array()),
+ schema: resolver(Snapshot.FileDiff.zod.array()),
},
},
},
diff --git a/packages/opencode/src/session/message-v2.ts b/packages/opencode/src/session/message-v2.ts
index 980e5e2c6..83477d12b 100644
--- a/packages/opencode/src/session/message-v2.ts
+++ b/packages/opencode/src/session/message-v2.ts
@@ -366,7 +366,7 @@ export const User = Base.extend({
.object({
title: z.string().optional(),
body: z.string().optional(),
- diffs: Snapshot.FileDiff.array(),
+ diffs: Snapshot.FileDiff.zod.array(),
})
.optional(),
agent: z.string(),
diff --git a/packages/opencode/src/session/session.ts b/packages/opencode/src/session/session.ts
index ba144da9f..6e9fb5c5d 100644
--- a/packages/opencode/src/session/session.ts
+++ b/packages/opencode/src/session/session.ts
@@ -127,7 +127,7 @@ export const Info = z
additions: z.number(),
deletions: z.number(),
files: z.number(),
- diffs: Snapshot.FileDiff.array().optional(),
+ diffs: Snapshot.FileDiff.zod.array().optional(),
})
.optional(),
share: z
@@ -239,7 +239,7 @@ export const Event = {
"session.diff",
z.object({
sessionID: SessionID.zod,
- diff: Snapshot.FileDiff.array(),
+ diff: Snapshot.FileDiff.zod.array(),
}),
),
Error: BusEvent.define(
diff --git a/packages/opencode/src/snapshot/index.ts b/packages/opencode/src/snapshot/index.ts
index d38034e99..ddc4cb29e 100644
--- a/packages/opencode/src/snapshot/index.ts
+++ b/packages/opencode/src/snapshot/index.ts
@@ -1,4 +1,4 @@
-import { Cause, Duration, Effect, Layer, Schedule, Semaphore, Context, Stream } from "effect"
+import { Cause, Duration, Effect, Layer, Schedule, Schema, Semaphore, Context, Stream } from "effect"
import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process"
import { formatPatch, structuredPatch } from "diff"
import path from "path"
@@ -10,25 +10,25 @@ import { Hash } from "@opencode-ai/shared/util/hash"
import { Config } from "../config"
import { Global } from "../global"
import { Log } from "../util"
-
-export const Patch = z.object({
- hash: z.string(),
- files: z.string().array(),
+import { withStatics } from "@/util/schema"
+import { zod } from "@/util/effect-zod"
+
+export const Patch = Schema.Struct({
+ hash: Schema.String,
+ files: Schema.mutable(Schema.Array(Schema.String)),
+}).pipe(withStatics((s) => ({ zod: zod(s) })))
+export type Patch = typeof Patch.Type
+
+export const FileDiff = Schema.Struct({
+ file: Schema.String,
+ patch: Schema.String,
+ additions: Schema.Number,
+ deletions: Schema.Number,
+ status: Schema.optional(Schema.Literals(["added", "deleted", "modified"])),
})
-export type Patch = z.infer<typeof Patch>
-
-export const FileDiff = z
- .object({
- file: z.string(),
- patch: z.string(),
- additions: z.number(),
- deletions: z.number(),
- status: z.enum(["added", "deleted", "modified"]).optional(),
- })
- .meta({
- ref: "SnapshotFileDiff",
- })
-export type FileDiff = z.infer<typeof FileDiff>
+ .annotate({ identifier: "SnapshotFileDiff" })
+ .pipe(withStatics((s) => ({ zod: zod(s) })))
+export type FileDiff = typeof FileDiff.Type
const log = Log.create({ service: "snapshot" })
const prune = "7.days"
diff --git a/packages/opencode/src/tool/edit.ts b/packages/opencode/src/tool/edit.ts
index 2f53cd194..2c6c2c130 100644
--- a/packages/opencode/src/tool/edit.ts
+++ b/packages/opencode/src/tool/edit.ts
@@ -153,15 +153,17 @@ export const EditTool = Tool.define(
}).pipe(Effect.orDie),
)
+ let additions = 0
+ let deletions = 0
+ for (const change of diffLines(contentOld, contentNew)) {
+ if (change.added) additions += change.count || 0
+ if (change.removed) deletions += change.count || 0
+ }
const filediff: Snapshot.FileDiff = {
file: filePath,
patch: diff,
- additions: 0,
- deletions: 0,
- }
- for (const change of diffLines(contentOld, contentNew)) {
- if (change.added) filediff.additions += change.count || 0
- if (change.removed) filediff.deletions += change.count || 0
+ additions,
+ deletions,
}
yield* ctx.metadata({