633 lines
19 KiB
TypeScript
633 lines
19 KiB
TypeScript
export * as SessionV1 from "./session"
|
|
|
|
import { Effect, Schema, Types } from "effect"
|
|
import { EventV2 } from "../event"
|
|
import { PermissionV1 } from "./permission"
|
|
import { ProjectV2 } from "../project"
|
|
import { ProviderV2 } from "../provider"
|
|
import { ModelV2 } from "../model"
|
|
import { optionalOmitUndefined, withStatics } from "../schema"
|
|
import { Identifier } from "../util/identifier"
|
|
import { NonNegativeInt } from "../schema"
|
|
import { NamedError } from "../util/error"
|
|
import { SessionSchema } from "../session/schema"
|
|
import { WorkspaceV2 } from "../workspace"
|
|
|
|
const Timestamp = Schema.Finite.check(Schema.isGreaterThanOrEqualTo(0))
|
|
|
|
export const MessageID = Schema.String.check(Schema.isStartsWith("msg")).pipe(
|
|
Schema.brand("MessageID"),
|
|
withStatics((schema) => ({ ascending: (id?: string) => schema.make(id ?? "msg_" + Identifier.ascending()) })),
|
|
)
|
|
export type MessageID = typeof MessageID.Type
|
|
|
|
export const PartID = Schema.String.check(Schema.isStartsWith("prt")).pipe(
|
|
Schema.brand("PartID"),
|
|
withStatics((schema) => ({ ascending: (id?: string) => schema.make(id ?? "prt_" + Identifier.ascending()) })),
|
|
)
|
|
export type PartID = typeof PartID.Type
|
|
|
|
export const OutputLengthError = NamedError.create("MessageOutputLengthError", {})
|
|
|
|
export const AuthError = NamedError.create("ProviderAuthError", {
|
|
providerID: Schema.String,
|
|
message: Schema.String,
|
|
})
|
|
|
|
export const AbortedError = NamedError.create("MessageAbortedError", { message: Schema.String })
|
|
export const StructuredOutputError = NamedError.create("StructuredOutputError", {
|
|
message: Schema.String,
|
|
retries: NonNegativeInt,
|
|
})
|
|
export const APIError = NamedError.create("APIError", {
|
|
message: Schema.String,
|
|
statusCode: Schema.optional(NonNegativeInt),
|
|
isRetryable: Schema.Boolean,
|
|
responseHeaders: Schema.optional(Schema.Record(Schema.String, Schema.String)),
|
|
responseBody: Schema.optional(Schema.String),
|
|
metadata: Schema.optional(Schema.Record(Schema.String, Schema.String)),
|
|
})
|
|
export type APIError = Schema.Schema.Type<typeof APIError.Schema>
|
|
export const ContextOverflowError = NamedError.create("ContextOverflowError", {
|
|
message: Schema.String,
|
|
responseBody: Schema.optional(Schema.String),
|
|
})
|
|
export const ContentFilterError = NamedError.create("ContentFilterError", {
|
|
message: Schema.String,
|
|
})
|
|
|
|
export class OutputFormatText extends Schema.Class<OutputFormatText>("OutputFormatText")({
|
|
type: Schema.Literal("text"),
|
|
}) {}
|
|
|
|
export class OutputFormatJsonSchema extends Schema.Class<OutputFormatJsonSchema>("OutputFormatJsonSchema")({
|
|
type: Schema.Literal("json_schema"),
|
|
schema: Schema.Record(Schema.String, Schema.Any).annotate({ identifier: "JSONSchema" }),
|
|
retryCount: NonNegativeInt.pipe(Schema.optional, Schema.withDecodingDefault(Effect.succeed(2))),
|
|
}) {}
|
|
|
|
export const Format = Schema.Union([OutputFormatText, OutputFormatJsonSchema]).annotate({
|
|
discriminator: "type",
|
|
identifier: "OutputFormat",
|
|
})
|
|
export type OutputFormat = Schema.Schema.Type<typeof Format>
|
|
|
|
const partBase = {
|
|
id: PartID,
|
|
sessionID: SessionSchema.ID,
|
|
messageID: MessageID,
|
|
}
|
|
|
|
export const SnapshotPart = Schema.Struct({
|
|
...partBase,
|
|
type: Schema.Literal("snapshot"),
|
|
snapshot: Schema.String,
|
|
}).annotate({ identifier: "SnapshotPart" })
|
|
export type SnapshotPart = Types.DeepMutable<Schema.Schema.Type<typeof SnapshotPart>>
|
|
|
|
export const PatchPart = Schema.Struct({
|
|
...partBase,
|
|
type: Schema.Literal("patch"),
|
|
hash: Schema.String,
|
|
files: Schema.Array(Schema.String),
|
|
}).annotate({ identifier: "PatchPart" })
|
|
export type PatchPart = Types.DeepMutable<Schema.Schema.Type<typeof PatchPart>>
|
|
|
|
export const TextPart = Schema.Struct({
|
|
...partBase,
|
|
type: Schema.Literal("text"),
|
|
text: Schema.String,
|
|
synthetic: Schema.optional(Schema.Boolean),
|
|
ignored: Schema.optional(Schema.Boolean),
|
|
time: Schema.optional(
|
|
Schema.Struct({
|
|
start: NonNegativeInt,
|
|
end: Schema.optional(NonNegativeInt),
|
|
}),
|
|
),
|
|
metadata: Schema.optional(Schema.Record(Schema.String, Schema.Any)),
|
|
}).annotate({ identifier: "TextPart" })
|
|
export type TextPart = Types.DeepMutable<Schema.Schema.Type<typeof TextPart>>
|
|
|
|
export const ReasoningPart = Schema.Struct({
|
|
...partBase,
|
|
type: Schema.Literal("reasoning"),
|
|
text: Schema.String,
|
|
metadata: Schema.optional(Schema.Record(Schema.String, Schema.Any)),
|
|
time: Schema.Struct({
|
|
start: NonNegativeInt,
|
|
end: Schema.optional(NonNegativeInt),
|
|
}),
|
|
}).annotate({ identifier: "ReasoningPart" })
|
|
export type ReasoningPart = Types.DeepMutable<Schema.Schema.Type<typeof ReasoningPart>>
|
|
|
|
const filePartSourceBase = {
|
|
text: Schema.Struct({
|
|
value: Schema.String,
|
|
start: Schema.Finite,
|
|
end: Schema.Finite,
|
|
}).annotate({ identifier: "FilePartSourceText" }),
|
|
}
|
|
|
|
export const Range = Schema.Struct({
|
|
start: Schema.Struct({ line: NonNegativeInt, character: NonNegativeInt }),
|
|
end: Schema.Struct({ line: NonNegativeInt, character: NonNegativeInt }),
|
|
}).annotate({ identifier: "Range" })
|
|
export type Range = typeof Range.Type
|
|
|
|
export const FileSource = Schema.Struct({
|
|
...filePartSourceBase,
|
|
type: Schema.Literal("file"),
|
|
path: Schema.String,
|
|
}).annotate({ identifier: "FileSource" })
|
|
|
|
export const SymbolSource = Schema.Struct({
|
|
...filePartSourceBase,
|
|
type: Schema.Literal("symbol"),
|
|
path: Schema.String,
|
|
range: Range,
|
|
name: Schema.String,
|
|
kind: NonNegativeInt,
|
|
}).annotate({ identifier: "SymbolSource" })
|
|
|
|
export const ResourceSource = Schema.Struct({
|
|
...filePartSourceBase,
|
|
type: Schema.Literal("resource"),
|
|
clientName: Schema.String,
|
|
uri: Schema.String,
|
|
}).annotate({ identifier: "ResourceSource" })
|
|
|
|
export const FilePartSource = Schema.Union([FileSource, SymbolSource, ResourceSource]).annotate({
|
|
discriminator: "type",
|
|
identifier: "FilePartSource",
|
|
})
|
|
|
|
export const FilePart = Schema.Struct({
|
|
...partBase,
|
|
type: Schema.Literal("file"),
|
|
mime: Schema.String,
|
|
filename: Schema.optional(Schema.String),
|
|
url: Schema.String,
|
|
source: Schema.optional(FilePartSource),
|
|
}).annotate({ identifier: "FilePart" })
|
|
export type FilePart = Types.DeepMutable<Schema.Schema.Type<typeof FilePart>>
|
|
|
|
export const AgentPart = Schema.Struct({
|
|
...partBase,
|
|
type: Schema.Literal("agent"),
|
|
name: Schema.String,
|
|
source: Schema.optional(
|
|
Schema.Struct({
|
|
value: Schema.String,
|
|
start: NonNegativeInt,
|
|
end: NonNegativeInt,
|
|
}),
|
|
),
|
|
}).annotate({ identifier: "AgentPart" })
|
|
export type AgentPart = Types.DeepMutable<Schema.Schema.Type<typeof AgentPart>>
|
|
|
|
export const CompactionPart = Schema.Struct({
|
|
...partBase,
|
|
type: Schema.Literal("compaction"),
|
|
auto: Schema.Boolean,
|
|
overflow: Schema.optional(Schema.Boolean),
|
|
tail_start_id: Schema.optional(MessageID),
|
|
}).annotate({ identifier: "CompactionPart" })
|
|
export type CompactionPart = Types.DeepMutable<Schema.Schema.Type<typeof CompactionPart>>
|
|
|
|
export const SubtaskPart = Schema.Struct({
|
|
...partBase,
|
|
type: Schema.Literal("subtask"),
|
|
prompt: Schema.String,
|
|
description: Schema.String,
|
|
agent: Schema.String,
|
|
model: Schema.optional(
|
|
Schema.Struct({
|
|
providerID: ProviderV2.ID,
|
|
modelID: ModelV2.ID,
|
|
}),
|
|
),
|
|
command: Schema.optional(Schema.String),
|
|
}).annotate({ identifier: "SubtaskPart" })
|
|
export type SubtaskPart = Types.DeepMutable<Schema.Schema.Type<typeof SubtaskPart>>
|
|
|
|
export const RetryPart = Schema.Struct({
|
|
...partBase,
|
|
type: Schema.Literal("retry"),
|
|
attempt: NonNegativeInt,
|
|
error: APIError.EffectSchema,
|
|
time: Schema.Struct({
|
|
created: NonNegativeInt,
|
|
}),
|
|
}).annotate({ identifier: "RetryPart" })
|
|
export type RetryPart = Omit<Types.DeepMutable<Schema.Schema.Type<typeof RetryPart>>, "error"> & {
|
|
error: APIError
|
|
}
|
|
|
|
export const StepStartPart = Schema.Struct({
|
|
...partBase,
|
|
type: Schema.Literal("step-start"),
|
|
snapshot: Schema.optional(Schema.String),
|
|
}).annotate({ identifier: "StepStartPart" })
|
|
export type StepStartPart = Types.DeepMutable<Schema.Schema.Type<typeof StepStartPart>>
|
|
|
|
export const StepFinishPart = Schema.Struct({
|
|
...partBase,
|
|
type: Schema.Literal("step-finish"),
|
|
reason: Schema.String,
|
|
snapshot: Schema.optional(Schema.String),
|
|
cost: Schema.Finite,
|
|
tokens: Schema.Struct({
|
|
total: Schema.optional(Schema.Finite),
|
|
input: Schema.Finite,
|
|
output: Schema.Finite,
|
|
reasoning: Schema.Finite,
|
|
cache: Schema.Struct({
|
|
read: Schema.Finite,
|
|
write: Schema.Finite,
|
|
}),
|
|
}),
|
|
}).annotate({ identifier: "StepFinishPart" })
|
|
export type StepFinishPart = Types.DeepMutable<Schema.Schema.Type<typeof StepFinishPart>>
|
|
|
|
export const ToolStatePending = Schema.Struct({
|
|
status: Schema.Literal("pending"),
|
|
input: Schema.Record(Schema.String, Schema.Any),
|
|
raw: Schema.String,
|
|
}).annotate({ identifier: "ToolStatePending" })
|
|
export type ToolStatePending = Types.DeepMutable<Schema.Schema.Type<typeof ToolStatePending>>
|
|
|
|
export const ToolStateRunning = Schema.Struct({
|
|
status: Schema.Literal("running"),
|
|
input: Schema.Record(Schema.String, Schema.Any),
|
|
title: Schema.optional(Schema.String),
|
|
metadata: Schema.optional(Schema.Record(Schema.String, Schema.Any)),
|
|
time: Schema.Struct({
|
|
start: NonNegativeInt,
|
|
}),
|
|
}).annotate({ identifier: "ToolStateRunning" })
|
|
export type ToolStateRunning = Types.DeepMutable<Schema.Schema.Type<typeof ToolStateRunning>>
|
|
|
|
export const ToolStateCompleted = Schema.Struct({
|
|
status: Schema.Literal("completed"),
|
|
input: Schema.Record(Schema.String, Schema.Any),
|
|
output: Schema.String,
|
|
title: Schema.String,
|
|
metadata: Schema.Record(Schema.String, Schema.Any),
|
|
time: Schema.Struct({
|
|
start: NonNegativeInt,
|
|
end: NonNegativeInt,
|
|
compacted: Schema.optional(NonNegativeInt),
|
|
}),
|
|
attachments: Schema.optional(Schema.Array(FilePart)),
|
|
}).annotate({ identifier: "ToolStateCompleted" })
|
|
export type ToolStateCompleted = Types.DeepMutable<Schema.Schema.Type<typeof ToolStateCompleted>>
|
|
|
|
export const ToolStateError = Schema.Struct({
|
|
status: Schema.Literal("error"),
|
|
input: Schema.Record(Schema.String, Schema.Any),
|
|
error: Schema.String,
|
|
metadata: Schema.optional(Schema.Record(Schema.String, Schema.Any)),
|
|
time: Schema.Struct({
|
|
start: NonNegativeInt,
|
|
end: NonNegativeInt,
|
|
}),
|
|
}).annotate({ identifier: "ToolStateError" })
|
|
export type ToolStateError = Types.DeepMutable<Schema.Schema.Type<typeof ToolStateError>>
|
|
|
|
export const ToolState = Schema.Union([
|
|
ToolStatePending,
|
|
ToolStateRunning,
|
|
ToolStateCompleted,
|
|
ToolStateError,
|
|
]).annotate({
|
|
discriminator: "status",
|
|
identifier: "ToolState",
|
|
})
|
|
export type ToolState = ToolStatePending | ToolStateRunning | ToolStateCompleted | ToolStateError
|
|
|
|
export const ToolPart = Schema.Struct({
|
|
...partBase,
|
|
type: Schema.Literal("tool"),
|
|
callID: Schema.String,
|
|
tool: Schema.String,
|
|
state: ToolState,
|
|
metadata: Schema.optional(Schema.Record(Schema.String, Schema.Any)),
|
|
}).annotate({ identifier: "ToolPart" })
|
|
export type ToolPart = Omit<Types.DeepMutable<Schema.Schema.Type<typeof ToolPart>>, "state"> & {
|
|
state: ToolState
|
|
}
|
|
|
|
const messageBase = {
|
|
id: MessageID,
|
|
sessionID: partBase.sessionID,
|
|
}
|
|
|
|
const FileDiff = Schema.Struct({
|
|
file: Schema.optional(Schema.String),
|
|
patch: Schema.optional(Schema.String),
|
|
additions: Schema.Finite,
|
|
deletions: Schema.Finite,
|
|
status: Schema.optional(Schema.Literals(["added", "deleted", "modified"])),
|
|
}).annotate({ identifier: "SnapshotFileDiff" })
|
|
|
|
export const User = Schema.Struct({
|
|
...messageBase,
|
|
role: Schema.Literal("user"),
|
|
time: Schema.Struct({
|
|
created: Timestamp,
|
|
}),
|
|
format: Schema.optional(Format),
|
|
summary: Schema.optional(
|
|
Schema.Struct({
|
|
title: Schema.optional(Schema.String),
|
|
body: Schema.optional(Schema.String),
|
|
diffs: Schema.Array(FileDiff),
|
|
}),
|
|
),
|
|
agent: Schema.String,
|
|
model: Schema.Struct({
|
|
providerID: ProviderV2.ID,
|
|
modelID: ModelV2.ID,
|
|
variant: Schema.optional(Schema.String),
|
|
}),
|
|
system: Schema.optional(Schema.String),
|
|
tools: Schema.optional(Schema.Record(Schema.String, Schema.Boolean)),
|
|
}).annotate({ identifier: "UserMessage" })
|
|
export type User = Types.DeepMutable<Schema.Schema.Type<typeof User>>
|
|
|
|
export const Part = Schema.Union([
|
|
TextPart,
|
|
SubtaskPart,
|
|
ReasoningPart,
|
|
FilePart,
|
|
ToolPart,
|
|
StepStartPart,
|
|
StepFinishPart,
|
|
SnapshotPart,
|
|
PatchPart,
|
|
AgentPart,
|
|
RetryPart,
|
|
CompactionPart,
|
|
]).annotate({ discriminator: "type", identifier: "Part" })
|
|
export type Part =
|
|
| TextPart
|
|
| SubtaskPart
|
|
| ReasoningPart
|
|
| FilePart
|
|
| ToolPart
|
|
| StepStartPart
|
|
| StepFinishPart
|
|
| SnapshotPart
|
|
| PatchPart
|
|
| AgentPart
|
|
| RetryPart
|
|
| CompactionPart
|
|
|
|
const AssistantErrorSchema = Schema.Union([
|
|
AuthError.EffectSchema,
|
|
NamedError.Unknown.EffectSchema,
|
|
OutputLengthError.EffectSchema,
|
|
AbortedError.EffectSchema,
|
|
StructuredOutputError.EffectSchema,
|
|
ContextOverflowError.EffectSchema,
|
|
ContentFilterError.EffectSchema,
|
|
APIError.EffectSchema,
|
|
]).annotate({ discriminator: "name" })
|
|
type AssistantError = Schema.Schema.Type<typeof AssistantErrorSchema>
|
|
|
|
export const TextPartInput = Schema.Struct({
|
|
id: Schema.optional(PartID),
|
|
type: Schema.Literal("text"),
|
|
text: Schema.String,
|
|
synthetic: Schema.optional(Schema.Boolean),
|
|
ignored: Schema.optional(Schema.Boolean),
|
|
time: Schema.optional(
|
|
Schema.Struct({
|
|
start: NonNegativeInt,
|
|
end: Schema.optional(NonNegativeInt),
|
|
}),
|
|
),
|
|
metadata: Schema.optional(Schema.Record(Schema.String, Schema.Any)),
|
|
}).annotate({ identifier: "TextPartInput" })
|
|
export type TextPartInput = Types.DeepMutable<Schema.Schema.Type<typeof TextPartInput>>
|
|
|
|
export const FilePartInput = Schema.Struct({
|
|
id: Schema.optional(PartID),
|
|
type: Schema.Literal("file"),
|
|
mime: Schema.String,
|
|
filename: Schema.optional(Schema.String),
|
|
url: Schema.String,
|
|
source: Schema.optional(FilePartSource),
|
|
}).annotate({ identifier: "FilePartInput" })
|
|
export type FilePartInput = Types.DeepMutable<Schema.Schema.Type<typeof FilePartInput>>
|
|
|
|
export const AgentPartInput = Schema.Struct({
|
|
id: Schema.optional(PartID),
|
|
type: Schema.Literal("agent"),
|
|
name: Schema.String,
|
|
source: Schema.optional(
|
|
Schema.Struct({
|
|
value: Schema.String,
|
|
start: NonNegativeInt,
|
|
end: NonNegativeInt,
|
|
}),
|
|
),
|
|
}).annotate({ identifier: "AgentPartInput" })
|
|
export type AgentPartInput = Types.DeepMutable<Schema.Schema.Type<typeof AgentPartInput>>
|
|
|
|
export const SubtaskPartInput = Schema.Struct({
|
|
id: Schema.optional(PartID),
|
|
type: Schema.Literal("subtask"),
|
|
prompt: Schema.String,
|
|
description: Schema.String,
|
|
agent: Schema.String,
|
|
model: Schema.optional(
|
|
Schema.Struct({
|
|
providerID: ProviderV2.ID,
|
|
modelID: ModelV2.ID,
|
|
}),
|
|
),
|
|
command: Schema.optional(Schema.String),
|
|
}).annotate({ identifier: "SubtaskPartInput" })
|
|
export type SubtaskPartInput = Types.DeepMutable<Schema.Schema.Type<typeof SubtaskPartInput>>
|
|
|
|
export const Assistant = Schema.Struct({
|
|
...messageBase,
|
|
role: Schema.Literal("assistant"),
|
|
time: Schema.Struct({
|
|
created: NonNegativeInt,
|
|
completed: Schema.optional(NonNegativeInt),
|
|
}),
|
|
error: Schema.optional(AssistantErrorSchema),
|
|
parentID: MessageID,
|
|
modelID: ModelV2.ID,
|
|
providerID: ProviderV2.ID,
|
|
mode: Schema.String,
|
|
agent: Schema.String,
|
|
path: Schema.Struct({
|
|
cwd: Schema.String,
|
|
root: Schema.String,
|
|
}),
|
|
summary: Schema.optional(Schema.Boolean),
|
|
cost: Schema.Finite,
|
|
tokens: Schema.Struct({
|
|
total: Schema.optional(Schema.Finite),
|
|
input: Schema.Finite,
|
|
output: Schema.Finite,
|
|
reasoning: Schema.Finite,
|
|
cache: Schema.Struct({
|
|
read: Schema.Finite,
|
|
write: Schema.Finite,
|
|
}),
|
|
}),
|
|
structured: Schema.optional(Schema.Any),
|
|
variant: Schema.optional(Schema.String),
|
|
finish: Schema.optional(Schema.String),
|
|
}).annotate({ identifier: "AssistantMessage" })
|
|
export type Assistant = Omit<Types.DeepMutable<Schema.Schema.Type<typeof Assistant>>, "error"> & {
|
|
error?: AssistantError
|
|
}
|
|
|
|
export const Info = Schema.Union([User, Assistant]).annotate({ discriminator: "role", identifier: "Message" })
|
|
export type Info = User | Assistant
|
|
|
|
export const WithParts = Schema.Struct({
|
|
info: Info,
|
|
parts: Schema.Array(Part),
|
|
})
|
|
export type WithParts = {
|
|
info: Info
|
|
parts: Part[]
|
|
}
|
|
|
|
const options = {
|
|
durable: {
|
|
aggregate: "sessionID",
|
|
version: 1,
|
|
},
|
|
} as const
|
|
|
|
const SessionSummary = Schema.Struct({
|
|
additions: Schema.Finite,
|
|
deletions: Schema.Finite,
|
|
files: Schema.Finite,
|
|
diffs: optionalOmitUndefined(Schema.Array(FileDiff)),
|
|
})
|
|
|
|
const SessionTokens = Schema.Struct({
|
|
input: Schema.Finite,
|
|
output: Schema.Finite,
|
|
reasoning: Schema.Finite,
|
|
cache: Schema.Struct({
|
|
read: Schema.Finite,
|
|
write: Schema.Finite,
|
|
}),
|
|
})
|
|
|
|
const SessionShare = Schema.Struct({
|
|
url: Schema.String,
|
|
})
|
|
|
|
const SessionRevert = Schema.Struct({
|
|
messageID: MessageID,
|
|
partID: optionalOmitUndefined(PartID),
|
|
snapshot: optionalOmitUndefined(Schema.String),
|
|
diff: optionalOmitUndefined(Schema.String),
|
|
})
|
|
|
|
const SessionModel = Schema.Struct({
|
|
id: ModelV2.ID,
|
|
providerID: ProviderV2.ID,
|
|
variant: optionalOmitUndefined(Schema.String),
|
|
})
|
|
|
|
export const SessionInfo = Schema.Struct({
|
|
id: SessionSchema.ID,
|
|
slug: Schema.String,
|
|
projectID: ProjectV2.ID,
|
|
workspaceID: optionalOmitUndefined(WorkspaceV2.ID),
|
|
directory: Schema.String,
|
|
path: optionalOmitUndefined(Schema.String),
|
|
parentID: optionalOmitUndefined(SessionSchema.ID),
|
|
summary: optionalOmitUndefined(SessionSummary),
|
|
cost: optionalOmitUndefined(Schema.Finite),
|
|
tokens: optionalOmitUndefined(SessionTokens),
|
|
share: optionalOmitUndefined(SessionShare),
|
|
title: Schema.String,
|
|
agent: optionalOmitUndefined(Schema.String),
|
|
model: optionalOmitUndefined(SessionModel),
|
|
version: Schema.String,
|
|
metadata: optionalOmitUndefined(Schema.Record(Schema.String, Schema.Any)),
|
|
time: Schema.Struct({
|
|
created: NonNegativeInt,
|
|
updated: NonNegativeInt,
|
|
compacting: optionalOmitUndefined(NonNegativeInt),
|
|
archived: optionalOmitUndefined(Schema.Finite),
|
|
}),
|
|
permission: optionalOmitUndefined(PermissionV1.Ruleset),
|
|
revert: optionalOmitUndefined(SessionRevert),
|
|
}).annotate({ identifier: "Session" })
|
|
export type SessionInfo = typeof SessionInfo.Type
|
|
|
|
export const Event = {
|
|
Created: EventV2.define({
|
|
type: "session.created",
|
|
...options,
|
|
schema: {
|
|
sessionID: SessionSchema.ID,
|
|
info: SessionInfo,
|
|
},
|
|
}),
|
|
Updated: EventV2.define({
|
|
type: "session.updated",
|
|
...options,
|
|
schema: {
|
|
sessionID: SessionSchema.ID,
|
|
info: SessionInfo,
|
|
},
|
|
}),
|
|
Deleted: EventV2.define({
|
|
type: "session.deleted",
|
|
...options,
|
|
schema: {
|
|
sessionID: SessionSchema.ID,
|
|
info: SessionInfo,
|
|
},
|
|
}),
|
|
MessageUpdated: EventV2.define({
|
|
type: "message.updated",
|
|
...options,
|
|
schema: {
|
|
sessionID: SessionSchema.ID,
|
|
info: Info,
|
|
},
|
|
}),
|
|
MessageRemoved: EventV2.define({
|
|
type: "message.removed",
|
|
...options,
|
|
schema: {
|
|
sessionID: SessionSchema.ID,
|
|
messageID: MessageID,
|
|
},
|
|
}),
|
|
PartUpdated: EventV2.define({
|
|
type: "message.part.updated",
|
|
...options,
|
|
schema: {
|
|
sessionID: SessionSchema.ID,
|
|
part: Part,
|
|
time: Schema.Finite,
|
|
},
|
|
}),
|
|
PartRemoved: EventV2.define({
|
|
type: "message.part.removed",
|
|
...options,
|
|
schema: {
|
|
sessionID: SessionSchema.ID,
|
|
messageID: MessageID,
|
|
partID: PartID,
|
|
},
|
|
}),
|
|
}
|