Buckets:
| import { Schema } from "effect" | |
| import { ProviderMetadata, ToolContent } from "@opencode-ai/llm" | |
| import { EventV2 } from "../event" | |
| import { ModelV2 } from "../model" | |
| import { NonNegativeInt } from "../schema" | |
| import { V2Schema } from "../v2-schema" | |
| import { FileAttachment, Prompt } from "./prompt" | |
| import { SessionSchema } from "./schema" | |
| import { Location } from "../location" | |
| import { RelativePath } from "../schema" | |
| import { SessionMessageID } from "./message-id" | |
| export { FileAttachment } | |
| export const Source = Schema.Struct({ | |
| start: NonNegativeInt, | |
| end: NonNegativeInt, | |
| text: Schema.String, | |
| }).annotate({ | |
| identifier: "session.next.event.source", | |
| }) | |
| export type Source = typeof Source.Type | |
| const Base = { | |
| timestamp: V2Schema.DateTimeUtcFromMillis, | |
| sessionID: SessionSchema.ID, | |
| } | |
| const options = { | |
| sync: { | |
| aggregate: "sessionID", | |
| version: 1, | |
| }, | |
| } as const | |
| const stepSettlementOptions = { | |
| sync: { | |
| aggregate: "sessionID", | |
| version: 2, | |
| }, | |
| } as const | |
| export const UnknownError = Schema.Struct({ | |
| type: Schema.Literal("unknown"), | |
| message: Schema.String, | |
| }).annotate({ | |
| identifier: "Session.Error.Unknown", | |
| }) | |
| export type UnknownError = typeof UnknownError.Type | |
| export const AgentSwitched = EventV2.define({ | |
| type: "session.next.agent.switched", | |
| ...options, | |
| schema: { | |
| ...Base, | |
| messageID: SessionMessageID.ID, | |
| agent: Schema.String, | |
| }, | |
| }) | |
| export type AgentSwitched = typeof AgentSwitched.Type | |
| export const ModelSwitched = EventV2.define({ | |
| type: "session.next.model.switched", | |
| ...options, | |
| schema: { | |
| ...Base, | |
| messageID: SessionMessageID.ID, | |
| model: ModelV2.Ref, | |
| }, | |
| }) | |
| export type ModelSwitched = typeof ModelSwitched.Type | |
| export const Moved = EventV2.define({ | |
| type: "session.next.moved", | |
| ...options, | |
| schema: { | |
| ...Base, | |
| location: Location.Ref, | |
| subdirectory: RelativePath.pipe(Schema.optional), | |
| }, | |
| }) | |
| export type Moved = typeof Moved.Type | |
| export const Prompted = EventV2.define({ | |
| type: "session.next.prompted", | |
| ...options, | |
| schema: { | |
| ...Base, | |
| messageID: SessionMessageID.ID, | |
| prompt: Prompt, | |
| delivery: Schema.Literals(["steer", "queue"]), | |
| }, | |
| }) | |
| export type Prompted = typeof Prompted.Type | |
| export namespace PromptLifecycle { | |
| export const Admitted = EventV2.define({ | |
| type: "session.next.prompt.admitted", | |
| ...options, | |
| schema: { | |
| ...Base, | |
| messageID: SessionMessageID.ID, | |
| prompt: Prompt, | |
| delivery: Schema.Literals(["steer", "queue"]), | |
| }, | |
| }) | |
| export type Admitted = typeof Admitted.Type | |
| export const Promoted = EventV2.define({ | |
| type: "session.next.prompt.promoted", | |
| ...options, | |
| schema: { | |
| ...Base, | |
| messageID: SessionMessageID.ID, | |
| prompt: Prompt, | |
| timeCreated: V2Schema.DateTimeUtcFromMillis, | |
| }, | |
| }) | |
| export type Promoted = typeof Promoted.Type | |
| } | |
| export const InterruptRequested = EventV2.define({ | |
| type: "session.next.interrupt.requested", | |
| ...options, | |
| schema: Base, | |
| }) | |
| export type InterruptRequested = typeof InterruptRequested.Type | |
| export const ContextUpdated = EventV2.define({ | |
| type: "session.next.context.updated", | |
| ...options, | |
| schema: { | |
| ...Base, | |
| messageID: SessionMessageID.ID, | |
| text: Schema.String, | |
| }, | |
| }) | |
| export type ContextUpdated = typeof ContextUpdated.Type | |
| export const Synthetic = EventV2.define({ | |
| type: "session.next.synthetic", | |
| ...options, | |
| schema: { | |
| ...Base, | |
| messageID: SessionMessageID.ID, | |
| text: Schema.String, | |
| }, | |
| }) | |
| export type Synthetic = typeof Synthetic.Type | |
| export namespace Shell { | |
| export const Started = EventV2.define({ | |
| type: "session.next.shell.started", | |
| ...options, | |
| schema: { | |
| ...Base, | |
| messageID: SessionMessageID.ID, | |
| callID: Schema.String, | |
| command: Schema.String, | |
| }, | |
| }) | |
| export type Started = typeof Started.Type | |
| export const Ended = EventV2.define({ | |
| type: "session.next.shell.ended", | |
| ...options, | |
| schema: { | |
| ...Base, | |
| callID: Schema.String, | |
| output: Schema.String, | |
| }, | |
| }) | |
| export type Ended = typeof Ended.Type | |
| } | |
| export namespace Step { | |
| export const Started = EventV2.define({ | |
| type: "session.next.step.started", | |
| ...options, | |
| schema: { | |
| ...Base, | |
| assistantMessageID: SessionMessageID.ID, | |
| agent: Schema.String, | |
| model: ModelV2.Ref, | |
| snapshot: Schema.String.pipe(Schema.optional), | |
| }, | |
| }) | |
| export type Started = typeof Started.Type | |
| export const Ended = EventV2.define({ | |
| type: "session.next.step.ended", | |
| ...stepSettlementOptions, | |
| schema: { | |
| ...Base, | |
| assistantMessageID: SessionMessageID.ID, | |
| finish: Schema.String, | |
| cost: Schema.Finite, | |
| tokens: Schema.Struct({ | |
| input: Schema.Finite, | |
| output: Schema.Finite, | |
| reasoning: Schema.Finite, | |
| cache: Schema.Struct({ | |
| read: Schema.Finite, | |
| write: Schema.Finite, | |
| }), | |
| }), | |
| snapshot: Schema.String.pipe(Schema.optional), | |
| }, | |
| }) | |
| export type Ended = typeof Ended.Type | |
| export const Failed = EventV2.define({ | |
| type: "session.next.step.failed", | |
| ...stepSettlementOptions, | |
| schema: { | |
| ...Base, | |
| assistantMessageID: SessionMessageID.ID, | |
| error: UnknownError, | |
| }, | |
| }) | |
| export type Failed = typeof Failed.Type | |
| } | |
| export namespace Text { | |
| export const Started = EventV2.define({ | |
| type: "session.next.text.started", | |
| ...options, | |
| schema: { | |
| ...Base, | |
| assistantMessageID: SessionMessageID.ID, | |
| textID: Schema.String, | |
| }, | |
| }) | |
| export type Started = typeof Started.Type | |
| // Stream fragments are live-only; Text.Ended is the replayable full-value boundary. | |
| export const Delta = EventV2.define({ | |
| type: "session.next.text.delta", | |
| schema: { | |
| ...Base, | |
| assistantMessageID: SessionMessageID.ID, | |
| textID: Schema.String, | |
| delta: Schema.String, | |
| }, | |
| }) | |
| export type Delta = typeof Delta.Type | |
| export const Ended = EventV2.define({ | |
| type: "session.next.text.ended", | |
| ...options, | |
| schema: { | |
| ...Base, | |
| assistantMessageID: SessionMessageID.ID, | |
| textID: Schema.String, | |
| text: Schema.String, | |
| }, | |
| }) | |
| export type Ended = typeof Ended.Type | |
| } | |
| export namespace Reasoning { | |
| export const Started = EventV2.define({ | |
| type: "session.next.reasoning.started", | |
| ...options, | |
| schema: { | |
| ...Base, | |
| assistantMessageID: SessionMessageID.ID, | |
| reasoningID: Schema.String, | |
| providerMetadata: ProviderMetadata.pipe(Schema.optional), | |
| }, | |
| }) | |
| export type Started = typeof Started.Type | |
| // Stream fragments are live-only; Reasoning.Ended is the replayable full-value boundary. | |
| export const Delta = EventV2.define({ | |
| type: "session.next.reasoning.delta", | |
| schema: { | |
| ...Base, | |
| assistantMessageID: SessionMessageID.ID, | |
| reasoningID: Schema.String, | |
| delta: Schema.String, | |
| }, | |
| }) | |
| export type Delta = typeof Delta.Type | |
| export const Ended = EventV2.define({ | |
| type: "session.next.reasoning.ended", | |
| ...options, | |
| schema: { | |
| ...Base, | |
| assistantMessageID: SessionMessageID.ID, | |
| reasoningID: Schema.String, | |
| text: Schema.String, | |
| providerMetadata: ProviderMetadata.pipe(Schema.optional), | |
| }, | |
| }) | |
| export type Ended = typeof Ended.Type | |
| } | |
| export namespace Tool { | |
| const ToolBase = { | |
| ...Base, | |
| assistantMessageID: SessionMessageID.ID, | |
| callID: Schema.String, | |
| } | |
| export namespace Input { | |
| export const Started = EventV2.define({ | |
| type: "session.next.tool.input.started", | |
| ...options, | |
| schema: { | |
| ...ToolBase, | |
| name: Schema.String, | |
| }, | |
| }) | |
| export type Started = typeof Started.Type | |
| // Stream fragments are live-only; Input.Ended is the replayable raw-input boundary. | |
| export const Delta = EventV2.define({ | |
| type: "session.next.tool.input.delta", | |
| schema: { | |
| ...ToolBase, | |
| delta: Schema.String, | |
| }, | |
| }) | |
| export type Delta = typeof Delta.Type | |
| export const Ended = EventV2.define({ | |
| type: "session.next.tool.input.ended", | |
| ...options, | |
| schema: { | |
| ...ToolBase, | |
| text: Schema.String, | |
| }, | |
| }) | |
| export type Ended = typeof Ended.Type | |
| } | |
| export const Called = EventV2.define({ | |
| type: "session.next.tool.called", | |
| ...options, | |
| schema: { | |
| ...ToolBase, | |
| tool: Schema.String, | |
| input: Schema.Record(Schema.String, Schema.Unknown), | |
| provider: Schema.Struct({ | |
| executed: Schema.Boolean, | |
| metadata: ProviderMetadata.pipe(Schema.optional), | |
| }), | |
| }, | |
| }) | |
| export type Called = typeof Called.Type | |
| /** | |
| * Replayable bounded running-tool state. Tools should checkpoint semantic | |
| * transitions or at a bounded cadence, not persist every stdout/stderr chunk. | |
| */ | |
| export const Progress = EventV2.define({ | |
| type: "session.next.tool.progress", | |
| ...options, | |
| schema: { | |
| ...ToolBase, | |
| structured: Schema.Record(Schema.String, Schema.Any), | |
| content: Schema.Array(ToolContent), | |
| }, | |
| }) | |
| export type Progress = typeof Progress.Type | |
| export const Success = EventV2.define({ | |
| type: "session.next.tool.success", | |
| ...options, | |
| schema: { | |
| ...ToolBase, | |
| structured: Schema.Record(Schema.String, Schema.Any), | |
| content: Schema.Array(ToolContent), | |
| outputPaths: Schema.Array(Schema.String).pipe(Schema.optional), | |
| result: Schema.Unknown.pipe(Schema.optional), | |
| provider: Schema.Struct({ | |
| executed: Schema.Boolean, | |
| metadata: ProviderMetadata.pipe(Schema.optional), | |
| }), | |
| }, | |
| }) | |
| export type Success = typeof Success.Type | |
| export const Failed = EventV2.define({ | |
| type: "session.next.tool.failed", | |
| ...options, | |
| schema: { | |
| ...ToolBase, | |
| error: UnknownError, | |
| result: Schema.Unknown.pipe(Schema.optional), | |
| provider: Schema.Struct({ | |
| executed: Schema.Boolean, | |
| metadata: ProviderMetadata.pipe(Schema.optional), | |
| }), | |
| }, | |
| }) | |
| export type Failed = typeof Failed.Type | |
| } | |
| export const RetryError = Schema.Struct({ | |
| message: Schema.String, | |
| statusCode: Schema.Finite.pipe(Schema.optional), | |
| isRetryable: Schema.Boolean, | |
| responseHeaders: Schema.Record(Schema.String, Schema.String).pipe(Schema.optional), | |
| responseBody: Schema.String.pipe(Schema.optional), | |
| metadata: Schema.Record(Schema.String, Schema.String).pipe(Schema.optional), | |
| }).annotate({ | |
| identifier: "session.next.retry_error", | |
| }) | |
| export type RetryError = typeof RetryError.Type | |
| export const Retried = EventV2.define({ | |
| type: "session.next.retried", | |
| ...options, | |
| schema: { | |
| ...Base, | |
| attempt: Schema.Finite, | |
| error: RetryError, | |
| }, | |
| }) | |
| export type Retried = typeof Retried.Type | |
| export namespace Compaction { | |
| export const Started = EventV2.define({ | |
| type: "session.next.compaction.started", | |
| ...options, | |
| schema: { | |
| ...Base, | |
| messageID: SessionMessageID.ID, | |
| reason: Schema.Union([Schema.Literal("auto"), Schema.Literal("manual")]), | |
| }, | |
| }) | |
| export type Started = typeof Started.Type | |
| export const Delta = EventV2.define({ | |
| type: "session.next.compaction.delta", | |
| schema: { | |
| ...Base, | |
| messageID: SessionMessageID.ID, | |
| text: Schema.String, | |
| }, | |
| }) | |
| export type Delta = typeof Delta.Type | |
| // Retain the unpublished v1 decoder so stored beta events remain replayable. | |
| export const EndedV1 = EventV2.define({ | |
| type: "session.next.compaction.ended", | |
| ...options, | |
| schema: { | |
| ...Base, | |
| text: Schema.String, | |
| include: Schema.String.pipe(Schema.optional), | |
| }, | |
| }) | |
| export const Ended = EventV2.define({ | |
| type: "session.next.compaction.ended", | |
| sync: { aggregate: "sessionID", version: 2 }, | |
| schema: { | |
| ...Base, | |
| messageID: SessionMessageID.ID, | |
| reason: Started.data.fields.reason, | |
| text: Schema.String, | |
| recent: Schema.String, | |
| }, | |
| }) | |
| export type Ended = typeof Ended.Type | |
| } | |
| const DurableDefinitions = [ | |
| AgentSwitched, | |
| ModelSwitched, | |
| Moved, | |
| Prompted, | |
| PromptLifecycle.Admitted, | |
| PromptLifecycle.Promoted, | |
| InterruptRequested, | |
| ContextUpdated, | |
| Synthetic, | |
| Shell.Started, | |
| Shell.Ended, | |
| Step.Started, | |
| Step.Ended, | |
| Step.Failed, | |
| Text.Started, | |
| Text.Ended, | |
| Tool.Input.Started, | |
| Tool.Input.Ended, | |
| Tool.Called, | |
| Tool.Progress, | |
| Tool.Success, | |
| Tool.Failed, | |
| Reasoning.Started, | |
| Reasoning.Ended, | |
| Retried, | |
| Compaction.Started, | |
| Compaction.Ended, | |
| ] as const | |
| const EphemeralDefinitions = [Text.Delta, Tool.Input.Delta, Reasoning.Delta, Compaction.Delta] as const | |
| export const Durable = Schema.Union(DurableDefinitions, { mode: "oneOf" }).pipe(Schema.toTaggedUnion("type")) | |
| export type DurableEvent = typeof Durable.Type | |
| export const All = Schema.Union([...DurableDefinitions, ...EphemeralDefinitions], { mode: "oneOf" }).pipe( | |
| Schema.toTaggedUnion("type"), | |
| ) | |
| export type Event = typeof All.Type | |
| export type Type = Event["type"] | |
| export * as SessionEvent from "./event" | |
Xet Storage Details
- Size:
- 13 kB
- Xet hash:
- 27e2383f9c10eba51cdd9d510e3f85597daeecab5ba30920162d2cc07a7b0cf8
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.