Skip to content

Commit 25edeaf

Browse files
committed
fix(sdk): preserve generated event contracts
1 parent 1afa9e3 commit 25edeaf

7 files changed

Lines changed: 3120 additions & 2774 deletions

File tree

‎packages/core/src/permission.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,17 @@ export class PermissionID extends Newtype<PermissionID>()(
1414
}
1515
}
1616

17-
export const Action = Schema.Literals(["allow", "deny", "ask"]).annotate({ identifier: "PermissionV2.Action" })
17+
export const Action = Schema.Literals(["allow", "deny", "ask"]).annotate({ identifier: "Permission.Action" })
1818
export type Action = typeof Action.Type
1919

2020
export const Rule = Schema.Struct({
2121
permission: Schema.String,
2222
pattern: Schema.String,
2323
action: Action,
24-
}).annotate({ identifier: "PermissionV2.Rule" })
24+
}).annotate({ identifier: "Permission.Rule" })
2525
export type Rule = typeof Rule.Type
2626

27-
export const Ruleset = Schema.Array(Rule).annotate({ identifier: "PermissionV2.Ruleset" })
27+
export const Ruleset = Schema.Array(Rule).annotate({ identifier: "Permission.Ruleset" })
2828
export type Ruleset = typeof Ruleset.Type
2929

3030
const EDIT_TOOLS = ["edit", "write", "apply_patch"]

‎packages/opencode/src/question/index.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,13 @@ export const Reply = Schema.Struct({
7575
}).annotate({ identifier: "QuestionReply" })
7676
export type Reply = Schema.Schema.Type<typeof Reply>
7777

78-
const Replied = Schema.Struct({
78+
export const Replied = Schema.Struct({
7979
sessionID: SessionID,
8080
requestID: QuestionID,
8181
answers: Schema.Array(Answer),
8282
}).annotate({ identifier: "QuestionReplied" })
8383

84-
const Rejected = Schema.Struct({
84+
export const Rejected = Schema.Struct({
8585
sessionID: SessionID,
8686
requestID: QuestionID,
8787
}).annotate({ identifier: "QuestionRejected" })
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
import { EventV2 } from "@opencode-ai/core/event"
2+
import { Schema } from "effect"
23

34
export const Event = {
45
Connected: EventV2.define({ type: "server.connected", schema: {} }),
56
Disposed: EventV2.define({ type: "global.disposed", schema: {} }),
67
}
8+
9+
export const InstanceDisposed = Schema.Struct({
10+
id: Schema.String,
11+
type: Schema.Literal("server.instance.disposed"),
12+
properties: Schema.Struct({ directory: Schema.String }),
13+
}).annotate({ identifier: "Event.server.instance.disposed" })

‎packages/opencode/src/server/routes/instance/httpapi/api.ts‎

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import { Schema } from "effect"
22
import { HttpApi } from "effect/unstable/httpapi"
33
import { EventV2 } from "@opencode-ai/core/event"
4+
import { InstanceDisposed } from "@/server/event"
5+
import { Question } from "@/question"
46
import { ConfigApi } from "./groups/config"
57
import { ControlApi } from "./groups/control"
68
import { EventApi } from "./groups/event"
79
import { ExperimentalApi } from "./groups/experimental"
810
import { FileApi } from "./groups/file"
9-
import { GlobalApi } from "./groups/global"
1011
import { InstanceApi } from "./groups/instance"
1112
import { McpApi } from "./groups/mcp"
1213
import { PermissionApi } from "./groups/permission"
@@ -19,11 +20,13 @@ import { SyncApi } from "./groups/sync"
1920
import { TuiApi } from "./groups/tui"
2021
import { WorkspaceApi } from "./groups/workspace"
2122
import { V2Api } from "./groups/v2"
23+
// GlobalEventSchema snapshots the registry after event-producing groups register their variants.
24+
import { GlobalApi } from "./groups/global"
2225
import { Authorization } from "./middleware/authorization"
2326
import { SchemaErrorMiddleware } from "./middleware/schema-error"
2427

25-
const EventSchema = Schema.Union(
26-
EventV2.registry
28+
const EventSchema = Schema.Union([
29+
...EventV2.registry
2730
.values()
2831
.map((definition) =>
2932
Schema.Struct({
@@ -33,7 +36,8 @@ const EventSchema = Schema.Union(
3336
}).annotate({ identifier: `Event.${definition.type}` }),
3437
)
3538
.toArray(),
36-
).annotate({ identifier: "Event" })
39+
InstanceDisposed,
40+
]).annotate({ identifier: "Event" })
3741

3842
export const RootHttpApi = HttpApi.make("opencode-root")
3943
.addHttpApi(ControlApi)
@@ -64,7 +68,7 @@ export const OpenCodeHttpApi = HttpApi.make("opencode")
6468
.addHttpApi(EventApi)
6569
.addHttpApi(InstanceHttpApi)
6670
.addHttpApi(PtyConnectApi)
67-
.annotate(HttpApi.AdditionalSchemas, [EventSchema])
71+
.annotate(HttpApi.AdditionalSchemas, [EventSchema, Question.Replied, Question.Rejected])
6872

6973
export type RootHttpApiType = typeof RootHttpApi
7074
export type InstanceHttpApiType = typeof InstanceHttpApi

‎packages/opencode/src/server/routes/instance/httpapi/groups/global.ts‎

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Config } from "@/config/config"
22
import { EventV2 } from "@opencode-ai/core/event"
3-
import "@/server/event"
3+
import { InstanceDisposed } from "@/server/event"
44
import { Schema } from "effect"
55
import { HttpApi, HttpApiEndpoint, HttpApiError, HttpApiGroup, HttpApiSchema, OpenApi } from "effect/unstable/httpapi"
66
import { described } from "./metadata"
@@ -10,18 +10,37 @@ const GlobalHealth = Schema.Struct({
1010
version: Schema.String,
1111
})
1212

13+
const SyncEventSchemas = EventV2.registry
14+
.values()
15+
.flatMap((definition) => {
16+
if (!definition.sync) return []
17+
return [
18+
Schema.Struct({
19+
type: Schema.Literal("sync"),
20+
name: Schema.Literal(EventV2.versionedType(definition.type, definition.sync.version)),
21+
id: Schema.String,
22+
seq: Schema.Finite,
23+
aggregateID: Schema.Literal(definition.sync.aggregate),
24+
data: definition.data,
25+
}).annotate({ identifier: `SyncEvent.${definition.type}` }),
26+
]
27+
})
28+
.toArray()
29+
1330
const GlobalEventSchema = Schema.Struct({
1431
directory: Schema.String,
1532
project: Schema.optional(Schema.String),
1633
workspace: Schema.optional(Schema.String),
17-
payload: Schema.Union(
18-
EventV2.registry
34+
payload: Schema.Union([
35+
...EventV2.registry
1936
.values()
2037
.map((definition) =>
2138
Schema.Struct({ id: Schema.String, type: Schema.Literal(definition.type), properties: definition.data }),
2239
)
2340
.toArray(),
24-
),
41+
InstanceDisposed,
42+
...SyncEventSchemas,
43+
]),
2544
}).annotate({ identifier: "GlobalEvent" })
2645

2746
export const GlobalUpgradeInput = Schema.Struct({

0 commit comments

Comments
 (0)