Buckets:
| 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 = { | |
| sync: { | |
| 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, | |
| }, | |
| }), | |
| } | |
Xet Storage Details
- Size:
- 19.4 kB
- Xet hash:
- 25e72852476ebf52358a051ad5e55eabcd07d0159d2acff251bcc0daeb9eeef0
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.