@opencode-ai/protocol 0.0.0-next-14984 → 0.0.0-next-14986

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,19 +2,7 @@ import { Event } from "@opencode-ai/schema/event";
2
2
  import type { Definition } from "@opencode-ai/schema/event";
3
3
  import { Schema } from "effect";
4
4
  import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from "effect/unstable/httpapi";
5
- export declare const makeEventGroup: <const Definitions extends ReadonlyArray<Definition>>(definitions: Definitions) => HttpApiGroup.HttpApiGroup<"server.event", HttpApiEndpoint.HttpApiEndpoint<"event.changes", "GET", "/api/event/changes", HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiSchema.StreamSse<HttpApiSchema.SseEventFromData<Schema.Union<readonly [Schema.Struct<{
6
- readonly type: Schema.Literal<"log.hint">;
7
- readonly aggregateID: Schema.String;
8
- readonly seq: Schema.brand<Schema.Int, "Event.Seq">;
9
- }>, Schema.Struct<{
10
- readonly type: Schema.Literal<"log.sweep_required">;
11
- }>]>>, Schema.Never, {
12
- readonly type: "log.hint";
13
- readonly aggregateID: string;
14
- readonly seq: number & import("effect/Brand").Brand<"Event.Seq">;
15
- } | {
16
- readonly type: "log.sweep_required";
17
- }>, HttpApiEndpoint.Json<never>, never, never> | HttpApiEndpoint.HttpApiEndpoint<"event.subscribe", "GET", "/api/event", HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiSchema.StreamSse<HttpApiSchema.SseEventFromData<Schema.Union<readonly [...Definitions, ...Schema.Struct<{
5
+ export declare const makeEventGroup: <const Definitions extends ReadonlyArray<Definition>>(definitions: Definitions) => HttpApiGroup.HttpApiGroup<"server.event", HttpApiEndpoint.HttpApiEndpoint<"event.subscribe", "GET", "/api/event", HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiSchema.StreamSse<HttpApiSchema.SseEventFromData<Schema.Union<readonly [...Definitions, ...Schema.Struct<{
18
6
  readonly type: Schema.Literal<"server.connected">;
19
7
  readonly data: Schema.Struct<{}>;
20
8
  readonly id: Schema.brand<Schema.String, "Event.ID"> & {
@@ -43,19 +31,7 @@ export declare const makeEventGroup: <const Definitions extends ReadonlyArray<De
43
31
  readonly workspaceID?: (string & import("effect/Brand").Brand<"WorkspaceV2.ID">) | undefined;
44
32
  } | undefined;
45
33
  }[]])[number]>, HttpApiEndpoint.Json<never>, never, never>, false>;
46
- export declare const EventGroup: HttpApiGroup.HttpApiGroup<"server.event", HttpApiEndpoint.HttpApiEndpoint<"event.changes", "GET", "/api/event/changes", HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiSchema.StreamSse<HttpApiSchema.SseEventFromData<Schema.Union<readonly [Schema.Struct<{
47
- readonly type: Schema.Literal<"log.hint">;
48
- readonly aggregateID: Schema.String;
49
- readonly seq: Schema.brand<Schema.Int, "Event.Seq">;
50
- }>, Schema.Struct<{
51
- readonly type: Schema.Literal<"log.sweep_required">;
52
- }>]>>, Schema.Never, {
53
- readonly type: "log.hint";
54
- readonly aggregateID: string;
55
- readonly seq: number & import("effect/Brand").Brand<"Event.Seq">;
56
- } | {
57
- readonly type: "log.sweep_required";
58
- }>, HttpApiEndpoint.Json<never>, never, never> | HttpApiEndpoint.HttpApiEndpoint<"event.subscribe", "GET", "/api/event", HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiSchema.StreamSse<HttpApiSchema.SseEventFromData<Schema.Union<readonly [Schema.Struct<{
34
+ export declare const EventGroup: HttpApiGroup.HttpApiGroup<"server.event", HttpApiEndpoint.HttpApiEndpoint<"event.subscribe", "GET", "/api/event", HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiSchema.StreamSse<HttpApiSchema.SseEventFromData<Schema.Union<readonly [Schema.Struct<{
59
35
  readonly id: Schema.brand<Schema.String, "Event.ID"> & {
60
36
  create: () => string & import("effect/Brand").Brand<"Event.ID">;
61
37
  };
@@ -1,5 +1,4 @@
1
1
  import { Event } from "@opencode-ai/schema/event";
2
- import { EventLog } from "@opencode-ai/schema/event-log";
3
2
  import { EventManifest } from "@opencode-ai/schema/event-manifest";
4
3
  import { Location } from "@opencode-ai/schema/location";
5
4
  import { Schema } from "effect";
@@ -31,14 +30,7 @@ const make = (definitions) => {
31
30
  }).annotateMerge(OpenApi.annotations({
32
31
  identifier: "v2.event.subscribe",
33
32
  summary: "Subscribe to events",
34
- description: "Subscribe to native event payloads for the server. Volatile by contract: a slow consumer overflows and fails the stream, and events during disconnection are missed. Consumers that need reliability should combine the changes feed with durable session log reads.",
35
- })))
36
- .add(HttpApiEndpoint.get("event.changes", "/api/event/changes", {
37
- success: HttpApiSchema.StreamSse({ data: EventLog.Change }),
38
- }).annotateMerge(OpenApi.annotations({
39
- identifier: "v2.event.changes",
40
- summary: "Subscribe to change hints",
41
- description: "Payload-free hint channel: after an event commits, a subscriber eventually receives a hint for that aggregate with seq at or beyond the event, or a sweep-required marker. Hints coalesce to the latest seq per aggregate under backpressure and the stream never fails from overflow. No consumer may derive correctness from receiving a hint; correctness always comes from durable log reads plus the consumer's own checkpoint. A sweep-required marker is emitted first on every (re)subscribe and whenever hint retention is exceeded: treat every aggregate as potentially dirty and recover via bounded sweep plus log reads.",
33
+ description: "Subscribe to native event payloads for the server. Volatile by contract: a slow consumer overflows and fails the stream, and events during disconnection are missed.",
42
34
  })))
43
35
  .annotateMerge(OpenApi.annotations({ title: "event", description: "Experimental event stream routes." })),
44
36
  };
@@ -1,4 +1,3 @@
1
- import { Event } from "@opencode-ai/schema/event";
2
1
  import { Schema } from "effect";
3
2
  import { HttpApiEndpoint, HttpApiGroup } from "effect/unstable/httpapi";
4
3
  import { InvalidCursorError, SessionNotFoundError, UnknownError } from "../errors.js";
@@ -22,7 +21,7 @@ export declare const MessageGroup: HttpApiGroup.HttpApiGroup<"server.message", H
22
21
  readonly agent: Schema.String;
23
22
  readonly id: Schema.brand<Schema.String, "Session.Message.ID"> & {
24
23
  create: () => string & import("effect/Brand").Brand<"Session.Message.ID">;
25
- fromEvent: (eventID: Event.ID) => string & import("effect/Brand").Brand<"Session.Message.ID">;
24
+ fromEvent: (eventID: import("@opencode-ai/schema/event").ID) => string & import("effect/Brand").Brand<"Session.Message.ID">;
26
25
  };
27
26
  readonly metadata: Schema.decodeTo<Schema.optional<Schema.toType<Schema.$Record<Schema.String, Schema.Unknown>>>, Schema.optionalKey<Schema.$Record<Schema.String, Schema.Unknown>>, never, never>;
28
27
  readonly time: Schema.Struct<{
@@ -82,7 +81,7 @@ export declare const MessageGroup: HttpApiGroup.HttpApiGroup<"server.message", H
82
81
  }>>, never, never>;
83
82
  readonly id: Schema.brand<Schema.String, "Session.Message.ID"> & {
84
83
  create: () => string & import("effect/Brand").Brand<"Session.Message.ID">;
85
- fromEvent: (eventID: Event.ID) => string & import("effect/Brand").Brand<"Session.Message.ID">;
84
+ fromEvent: (eventID: import("@opencode-ai/schema/event").ID) => string & import("effect/Brand").Brand<"Session.Message.ID">;
86
85
  };
87
86
  readonly metadata: Schema.decodeTo<Schema.optional<Schema.toType<Schema.$Record<Schema.String, Schema.Unknown>>>, Schema.optionalKey<Schema.$Record<Schema.String, Schema.Unknown>>, never, never>;
88
87
  readonly time: Schema.Struct<{
@@ -169,7 +168,7 @@ export declare const MessageGroup: HttpApiGroup.HttpApiGroup<"server.message", H
169
168
  readonly type: Schema.Literal<"user">;
170
169
  readonly id: Schema.brand<Schema.String, "Session.Message.ID"> & {
171
170
  create: () => string & import("effect/Brand").Brand<"Session.Message.ID">;
172
- fromEvent: (eventID: Event.ID) => string & import("effect/Brand").Brand<"Session.Message.ID">;
171
+ fromEvent: (eventID: import("@opencode-ai/schema/event").ID) => string & import("effect/Brand").Brand<"Session.Message.ID">;
173
172
  };
174
173
  readonly metadata: Schema.decodeTo<Schema.optional<Schema.toType<Schema.$Record<Schema.String, Schema.Unknown>>>, Schema.optionalKey<Schema.$Record<Schema.String, Schema.Unknown>>, never, never>;
175
174
  readonly time: Schema.Struct<{
@@ -185,7 +184,7 @@ export declare const MessageGroup: HttpApiGroup.HttpApiGroup<"server.message", H
185
184
  readonly type: Schema.Literal<"synthetic">;
186
185
  readonly id: Schema.brand<Schema.String, "Session.Message.ID"> & {
187
186
  create: () => string & import("effect/Brand").Brand<"Session.Message.ID">;
188
- fromEvent: (eventID: Event.ID) => string & import("effect/Brand").Brand<"Session.Message.ID">;
187
+ fromEvent: (eventID: import("@opencode-ai/schema/event").ID) => string & import("effect/Brand").Brand<"Session.Message.ID">;
189
188
  };
190
189
  readonly metadata: Schema.decodeTo<Schema.optional<Schema.toType<Schema.$Record<Schema.String, Schema.Unknown>>>, Schema.optionalKey<Schema.$Record<Schema.String, Schema.Unknown>>, never, never>;
191
190
  readonly time: Schema.Struct<{
@@ -196,7 +195,7 @@ export declare const MessageGroup: HttpApiGroup.HttpApiGroup<"server.message", H
196
195
  readonly text: Schema.String;
197
196
  readonly id: Schema.brand<Schema.String, "Session.Message.ID"> & {
198
197
  create: () => string & import("effect/Brand").Brand<"Session.Message.ID">;
199
- fromEvent: (eventID: Event.ID) => string & import("effect/Brand").Brand<"Session.Message.ID">;
198
+ fromEvent: (eventID: import("@opencode-ai/schema/event").ID) => string & import("effect/Brand").Brand<"Session.Message.ID">;
200
199
  };
201
200
  readonly metadata: Schema.decodeTo<Schema.optional<Schema.toType<Schema.$Record<Schema.String, Schema.Unknown>>>, Schema.optionalKey<Schema.$Record<Schema.String, Schema.Unknown>>, never, never>;
202
201
  readonly time: Schema.Struct<{
@@ -208,7 +207,7 @@ export declare const MessageGroup: HttpApiGroup.HttpApiGroup<"server.message", H
208
207
  readonly text: Schema.String;
209
208
  readonly id: Schema.brand<Schema.String, "Session.Message.ID"> & {
210
209
  create: () => string & import("effect/Brand").Brand<"Session.Message.ID">;
211
- fromEvent: (eventID: Event.ID) => string & import("effect/Brand").Brand<"Session.Message.ID">;
210
+ fromEvent: (eventID: import("@opencode-ai/schema/event").ID) => string & import("effect/Brand").Brand<"Session.Message.ID">;
212
211
  };
213
212
  readonly metadata: Schema.decodeTo<Schema.optional<Schema.toType<Schema.$Record<Schema.String, Schema.Unknown>>>, Schema.optionalKey<Schema.$Record<Schema.String, Schema.Unknown>>, never, never>;
214
213
  readonly time: Schema.Struct<{
@@ -251,7 +250,7 @@ export declare const MessageGroup: HttpApiGroup.HttpApiGroup<"server.message", H
251
250
  }>;
252
251
  readonly id: Schema.brand<Schema.String, "Session.Message.ID"> & {
253
252
  create: () => string & import("effect/Brand").Brand<"Session.Message.ID">;
254
- fromEvent: (eventID: Event.ID) => string & import("effect/Brand").Brand<"Session.Message.ID">;
253
+ fromEvent: (eventID: import("@opencode-ai/schema/event").ID) => string & import("effect/Brand").Brand<"Session.Message.ID">;
255
254
  };
256
255
  readonly metadata: Schema.decodeTo<Schema.optional<Schema.toType<Schema.$Record<Schema.String, Schema.Unknown>>>, Schema.optionalKey<Schema.$Record<Schema.String, Schema.Unknown>>, never, never>;
257
256
  }>, Schema.Struct<{
@@ -454,13 +453,13 @@ export declare const MessageGroup: HttpApiGroup.HttpApiGroup<"server.message", H
454
453
  }>;
455
454
  readonly id: Schema.brand<Schema.String, "Session.Message.ID"> & {
456
455
  create: () => string & import("effect/Brand").Brand<"Session.Message.ID">;
457
- fromEvent: (eventID: Event.ID) => string & import("effect/Brand").Brand<"Session.Message.ID">;
456
+ fromEvent: (eventID: import("@opencode-ai/schema/event").ID) => string & import("effect/Brand").Brand<"Session.Message.ID">;
458
457
  };
459
458
  readonly metadata: Schema.decodeTo<Schema.optional<Schema.toType<Schema.$Record<Schema.String, Schema.Unknown>>>, Schema.optionalKey<Schema.$Record<Schema.String, Schema.Unknown>>, never, never>;
460
459
  }>, Schema.Struct<{
461
460
  readonly id: Schema.brand<Schema.String, "Session.Message.ID"> & {
462
461
  create: () => string & import("effect/Brand").Brand<"Session.Message.ID">;
463
- fromEvent: (eventID: Event.ID) => string & import("effect/Brand").Brand<"Session.Message.ID">;
462
+ fromEvent: (eventID: import("@opencode-ai/schema/event").ID) => string & import("effect/Brand").Brand<"Session.Message.ID">;
464
463
  };
465
464
  readonly metadata: Schema.decodeTo<Schema.optional<Schema.toType<Schema.$Record<Schema.String, Schema.Unknown>>>, Schema.optionalKey<Schema.$Record<Schema.String, Schema.Unknown>>, never, never>;
466
465
  readonly time: Schema.Struct<{
@@ -471,7 +470,6 @@ export declare const MessageGroup: HttpApiGroup.HttpApiGroup<"server.message", H
471
470
  readonly summary: Schema.String;
472
471
  readonly recent: Schema.String;
473
472
  }>]>>;
474
- readonly watermark: Schema.decodeTo<Schema.optional<Schema.toType<Schema.brand<Schema.Int, "Event.Seq">>>, Schema.optionalKey<Schema.brand<Schema.Int, "Event.Seq">>, never, never>;
475
473
  readonly cursor: Schema.Struct<{
476
474
  readonly previous: Schema.optional<Schema.String>;
477
475
  readonly next: Schema.optional<Schema.String>;
@@ -1,7 +1,5 @@
1
1
  import { Session } from "@opencode-ai/schema/session";
2
2
  import { SessionMessage } from "@opencode-ai/schema/session-message";
3
- import { optional } from "@opencode-ai/schema/schema";
4
- import { Event } from "@opencode-ai/schema/event";
5
3
  import { Schema } from "effect";
6
4
  import { HttpApiEndpoint, HttpApiGroup, OpenApi } from "effect/unstable/httpapi";
7
5
  import { InvalidCursorError, SessionNotFoundError, UnknownError } from "../errors.js";
@@ -22,9 +20,6 @@ export const MessageGroup = HttpApiGroup.make("server.message")
22
20
  query: SessionMessagesQuery,
23
21
  success: Schema.Struct({
24
22
  data: Schema.Array(SessionMessage.Message),
25
- watermark: optional(Event.Seq).annotate({
26
- description: "Durable log seq this snapshot was computed at, read before the snapshot. Attach a live log read after the watermark to compose fetch and stream gap-free; events between the watermark and the snapshot read may be redelivered by the tail and are safe to re-apply. Absent when the session has no durable events.",
27
- }),
28
23
  cursor: Schema.Struct({
29
24
  previous: Schema.String.pipe(Schema.optional),
30
25
  next: Schema.String.pipe(Schema.optional),
@@ -263,10 +263,6 @@ export declare const makeSessionGroup: <I extends HttpApiMiddleware.AnyId, S>(se
263
263
  }>>>, never, never>;
264
264
  }>>, never, never>;
265
265
  }>>;
266
- readonly watermarks: Schema.$Record<Schema.brand<Schema.String, "SessionID"> & {
267
- create: () => string & import("effect/Brand").Brand<"SessionID">;
268
- descending: (id?: string) => string & import("effect/Brand").Brand<"SessionID">;
269
- }, Schema.brand<Schema.Int, "Event.Seq">>;
270
266
  readonly cursor: Schema.Struct<{
271
267
  readonly previous: Schema.optional<Schema.brand<Schema.String, "SessionsCursor"> & {
272
268
  make: (input: typeof SessionsCursorInput.Type) => string & import("effect/Brand").Brand<"SessionsCursor">;
@@ -504,10 +500,6 @@ export declare const makeSessionGroup: <I extends HttpApiMiddleware.AnyId, S>(se
504
500
  }, Schema.Struct<{
505
501
  readonly type: Schema.Literal<"running">;
506
502
  }>>;
507
- readonly watermarks: Schema.$Record<Schema.brand<Schema.String, "SessionID"> & {
508
- create: () => string & import("effect/Brand").Brand<"SessionID">;
509
- descending: (id?: string) => string & import("effect/Brand").Brand<"SessionID">;
510
- }, Schema.brand<Schema.Int, "Event.Seq">>;
511
503
  }>>, HttpApiEndpoint.Json<never>, never, never> | HttpApiEndpoint.HttpApiEndpoint<"session.get", "GET", "/api/session/:sessionID", HttpApiEndpoint.StringTree<Schema.Struct<{
512
504
  sessionID: Schema.brand<Schema.String, "SessionID"> & {
513
505
  create: () => string & import("effect/Brand").Brand<"SessionID">;
@@ -1840,7 +1832,7 @@ export declare const makeSessionGroup: <I extends HttpApiMiddleware.AnyId, S>(se
1840
1832
  descending: (id?: string) => string & import("effect/Brand").Brand<"SessionID">;
1841
1833
  };
1842
1834
  key: Schema.String;
1843
- }>>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.Json<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.Json<HttpApiSchema.NoContent>, HttpApiEndpoint.Json<typeof SessionNotFoundError>, I, HttpApiMiddleware.Requires<I>> | HttpApiEndpoint.HttpApiEndpoint<"session.log", "GET", "/api/session/:sessionID/log", HttpApiEndpoint.StringTree<Schema.Struct<{
1835
+ }>>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.Json<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.Json<HttpApiSchema.NoContent>, HttpApiEndpoint.Json<typeof SessionNotFoundError>, I, HttpApiMiddleware.Requires<I>> | HttpApiEndpoint.HttpApiEndpoint<"session.log", "GET", "/api/experimental/session/:sessionID/log", HttpApiEndpoint.StringTree<Schema.Struct<{
1844
1836
  sessionID: Schema.brand<Schema.String, "SessionID"> & {
1845
1837
  create: () => string & import("effect/Brand").Brand<"SessionID">;
1846
1838
  descending: (id?: string) => string & import("effect/Brand").Brand<"SessionID">;
@@ -74,10 +74,6 @@ export const SessionsCursor = Schema.String.pipe(Schema.brand("SessionsCursor"),
74
74
  const SessionActive = Schema.Struct({
75
75
  type: Schema.Literal("running"),
76
76
  }).annotate({ identifier: "SessionActive" });
77
- const SessionWatermarks = Schema.Record(Session.ID, Event.Seq).annotate({
78
- identifier: "SessionWatermarks",
79
- description: "Durable log seq each session's snapshot was computed at. Attach a live log read after the watermark to compose fetch and stream gap-free; apply a snapshot only where its watermark is at or beyond already-applied events. Sessions without durable events are absent.",
80
- });
81
77
  const BooleanFromString = Schema.Literals(["true", "false"]).pipe(Schema.decodeTo(Schema.Boolean, {
82
78
  decode: SchemaGetter.transform((value) => value === "true"),
83
79
  encode: SchemaGetter.transform((value) => (value ? "true" : "false")),
@@ -97,7 +93,6 @@ export const makeSessionGroup = (sessionLocationMiddleware) => HttpApiGroup.make
97
93
  query: SessionsQuery,
98
94
  success: Schema.Struct({
99
95
  data: Schema.Array(Session.Info),
100
- watermarks: SessionWatermarks,
101
96
  cursor: Schema.Struct({
102
97
  previous: SessionsCursor.pipe(Schema.optional),
103
98
  next: SessionsCursor.pipe(Schema.optional),
@@ -123,11 +118,11 @@ export const makeSessionGroup = (sessionLocationMiddleware) => HttpApiGroup.make
123
118
  description: "Create a session at the requested location.",
124
119
  })))
125
120
  .add(HttpApiEndpoint.get("session.active", "/api/session/active", {
126
- success: Schema.Struct({ data: Schema.Record(Session.ID, SessionActive), watermarks: SessionWatermarks }),
121
+ success: Schema.Struct({ data: Schema.Record(Session.ID, SessionActive) }),
127
122
  }).annotateMerge(OpenApi.annotations({
128
123
  identifier: "v2.session.active",
129
124
  summary: "List active sessions",
130
- description: "Retrieve foreground Session drains currently owned by this OpenCode process. Sessions absent from the result are inactive. Watermarks are the durable log positions read alongside the activity snapshot; activity itself is process state, so the pairing is advisory rather than transactional.",
125
+ description: "Retrieve foreground Session drains currently owned by this OpenCode process. Sessions absent from the result are inactive.",
131
126
  })))
132
127
  .add(HttpApiEndpoint.get("session.get", "/api/session/:sessionID", {
133
128
  params: { sessionID: Session.ID },
@@ -367,7 +362,7 @@ export const makeSessionGroup = (sessionLocationMiddleware) => HttpApiGroup.make
367
362
  summary: "Remove context entry",
368
363
  description: "Remove one context entry; the removal is announced to the model at the next turn boundary.",
369
364
  })))
370
- .add(HttpApiEndpoint.get("session.log", "/api/session/:sessionID/log", {
365
+ .add(HttpApiEndpoint.get("session.log", "/api/experimental/session/:sessionID/log", {
371
366
  params: { sessionID: Session.ID },
372
367
  query: {
373
368
  after: Schema.NumberFromString.pipe(Schema.decodeTo(Event.Seq), Schema.optional),
@@ -382,7 +377,7 @@ export const makeSessionGroup = (sessionLocationMiddleware) => HttpApiGroup.make
382
377
  .annotateMerge(OpenApi.annotations({
383
378
  identifier: "v2.session.log",
384
379
  summary: "Read the session log",
385
- description: "Durable, ordered, gap-free read of public session events after an exclusive aggregate sequence. Emits a synced marker once replay reaches the captured watermark, then completes; with follow=true it continues with live events instead. The only event API that promises reliability: attach after a snapshot watermark to compose fetch and stream without a race window.",
380
+ description: "Experimental durable session event log. Reads events after an exclusive aggregate sequence and continues with live events when follow=true.",
386
381
  })))
387
382
  .add(HttpApiEndpoint.post("session.interrupt", "/api/session/:sessionID/interrupt", {
388
383
  params: { sessionID: Session.ID },
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@opencode-ai/protocol",
4
- "version": "0.0.0-next-14984",
4
+ "version": "0.0.0-next-14986",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -26,7 +26,7 @@
26
26
  "typecheck": "tsgo --noEmit"
27
27
  },
28
28
  "dependencies": {
29
- "@opencode-ai/schema": "0.0.0-next-14984",
29
+ "@opencode-ai/schema": "0.0.0-next-14986",
30
30
  "effect": "4.0.0-beta.83"
31
31
  },
32
32
  "devDependencies": {