session-message.ts 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. import { Schema } from "effect"
  2. import { Prompt } from "./session-prompt"
  3. import { SessionEvent } from "./session-event"
  4. import { EventV2 } from "./event"
  5. import { ToolOutput } from "./tool-output"
  6. import { V2Schema } from "./v2-schema"
  7. import { ModelV2 } from "./model"
  8. export const ID = EventV2.ID
  9. export type ID = Schema.Schema.Type<typeof ID>
  10. const Base = {
  11. id: ID,
  12. metadata: Schema.Record(Schema.String, Schema.Unknown).pipe(Schema.optional),
  13. time: Schema.Struct({
  14. created: V2Schema.DateTimeUtcFromMillis,
  15. }),
  16. }
  17. export class AgentSwitched extends Schema.Class<AgentSwitched>("Session.Message.AgentSwitched")({
  18. ...Base,
  19. type: Schema.Literal("agent-switched"),
  20. agent: SessionEvent.AgentSwitched.data.fields.agent,
  21. }) {}
  22. export class ModelSwitched extends Schema.Class<ModelSwitched>("Session.Message.ModelSwitched")({
  23. ...Base,
  24. type: Schema.Literal("model-switched"),
  25. model: ModelV2.Ref,
  26. }) {}
  27. export class User extends Schema.Class<User>("Session.Message.User")({
  28. ...Base,
  29. text: Prompt.fields.text,
  30. files: Prompt.fields.files,
  31. agents: Prompt.fields.agents,
  32. references: Prompt.fields.references,
  33. type: Schema.Literal("user"),
  34. time: Schema.Struct({
  35. created: V2Schema.DateTimeUtcFromMillis,
  36. }),
  37. }) {}
  38. export class Synthetic extends Schema.Class<Synthetic>("Session.Message.Synthetic")({
  39. ...Base,
  40. sessionID: SessionEvent.Synthetic.data.fields.sessionID,
  41. text: SessionEvent.Synthetic.data.fields.text,
  42. type: Schema.Literal("synthetic"),
  43. }) {}
  44. export class Shell extends Schema.Class<Shell>("Session.Message.Shell")({
  45. ...Base,
  46. type: Schema.Literal("shell"),
  47. callID: SessionEvent.Shell.Started.data.fields.callID,
  48. command: SessionEvent.Shell.Started.data.fields.command,
  49. output: Schema.String,
  50. time: Schema.Struct({
  51. created: V2Schema.DateTimeUtcFromMillis,
  52. completed: V2Schema.DateTimeUtcFromMillis.pipe(Schema.optional),
  53. }),
  54. }) {}
  55. export class ToolStatePending extends Schema.Class<ToolStatePending>("Session.Message.ToolState.Pending")({
  56. status: Schema.Literal("pending"),
  57. input: Schema.String,
  58. }) {}
  59. export class ToolStateRunning extends Schema.Class<ToolStateRunning>("Session.Message.ToolState.Running")({
  60. status: Schema.Literal("running"),
  61. input: Schema.Record(Schema.String, Schema.Unknown),
  62. structured: ToolOutput.Structured,
  63. content: ToolOutput.Content.pipe(Schema.Array),
  64. }) {}
  65. export class ToolStateCompleted extends Schema.Class<ToolStateCompleted>("Session.Message.ToolState.Completed")({
  66. status: Schema.Literal("completed"),
  67. input: Schema.Record(Schema.String, Schema.Unknown),
  68. attachments: SessionEvent.FileAttachment.pipe(Schema.Array, Schema.optional),
  69. content: ToolOutput.Content.pipe(Schema.Array),
  70. structured: ToolOutput.Structured,
  71. }) {}
  72. export class ToolStateError extends Schema.Class<ToolStateError>("Session.Message.ToolState.Error")({
  73. status: Schema.Literal("error"),
  74. input: Schema.Record(Schema.String, Schema.Unknown),
  75. content: ToolOutput.Content.pipe(Schema.Array),
  76. structured: ToolOutput.Structured,
  77. error: SessionEvent.UnknownError,
  78. }) {}
  79. export const ToolState = Schema.Union([ToolStatePending, ToolStateRunning, ToolStateCompleted, ToolStateError]).pipe(
  80. Schema.toTaggedUnion("status"),
  81. )
  82. export type ToolState = Schema.Schema.Type<typeof ToolState>
  83. export class AssistantTool extends Schema.Class<AssistantTool>("Session.Message.Assistant.Tool")({
  84. type: Schema.Literal("tool"),
  85. id: Schema.String,
  86. name: Schema.String,
  87. provider: Schema.Struct({
  88. executed: Schema.Boolean,
  89. metadata: Schema.Record(Schema.String, Schema.Unknown).pipe(Schema.optional),
  90. }).pipe(Schema.optional),
  91. state: ToolState,
  92. time: Schema.Struct({
  93. created: V2Schema.DateTimeUtcFromMillis,
  94. ran: V2Schema.DateTimeUtcFromMillis.pipe(Schema.optional),
  95. completed: V2Schema.DateTimeUtcFromMillis.pipe(Schema.optional),
  96. pruned: V2Schema.DateTimeUtcFromMillis.pipe(Schema.optional),
  97. }),
  98. }) {}
  99. export class AssistantText extends Schema.Class<AssistantText>("Session.Message.Assistant.Text")({
  100. type: Schema.Literal("text"),
  101. text: Schema.String,
  102. }) {}
  103. export class AssistantReasoning extends Schema.Class<AssistantReasoning>("Session.Message.Assistant.Reasoning")({
  104. type: Schema.Literal("reasoning"),
  105. id: Schema.String,
  106. text: Schema.String,
  107. }) {}
  108. export const AssistantContent = Schema.Union([AssistantText, AssistantReasoning, AssistantTool]).pipe(
  109. Schema.toTaggedUnion("type"),
  110. )
  111. export type AssistantContent = Schema.Schema.Type<typeof AssistantContent>
  112. export class Assistant extends Schema.Class<Assistant>("Session.Message.Assistant")({
  113. ...Base,
  114. type: Schema.Literal("assistant"),
  115. agent: Schema.String,
  116. model: SessionEvent.Step.Started.data.fields.model,
  117. content: AssistantContent.pipe(Schema.Array),
  118. snapshot: Schema.Struct({
  119. start: Schema.String.pipe(Schema.optional),
  120. end: Schema.String.pipe(Schema.optional),
  121. }).pipe(Schema.optional),
  122. finish: Schema.String.pipe(Schema.optional),
  123. cost: Schema.Finite.pipe(Schema.optional),
  124. tokens: Schema.Struct({
  125. input: Schema.Finite,
  126. output: Schema.Finite,
  127. reasoning: Schema.Finite,
  128. cache: Schema.Struct({
  129. read: Schema.Finite,
  130. write: Schema.Finite,
  131. }),
  132. }).pipe(Schema.optional),
  133. error: SessionEvent.Step.Failed.data.fields.error.pipe(Schema.optional),
  134. time: Schema.Struct({
  135. created: V2Schema.DateTimeUtcFromMillis,
  136. completed: V2Schema.DateTimeUtcFromMillis.pipe(Schema.optional),
  137. }),
  138. }) {}
  139. export class Compaction extends Schema.Class<Compaction>("Session.Message.Compaction")({
  140. type: Schema.Literal("compaction"),
  141. reason: SessionEvent.Compaction.Started.data.fields.reason,
  142. summary: Schema.String,
  143. include: Schema.String.pipe(Schema.optional),
  144. ...Base,
  145. }) {}
  146. export const Message = Schema.Union([AgentSwitched, ModelSwitched, User, Synthetic, Shell, Assistant, Compaction])
  147. .pipe(Schema.toTaggedUnion("type"))
  148. .annotate({ identifier: "Session.Message" })
  149. export type Message = Schema.Schema.Type<typeof Message>
  150. export type Type = Message["type"]
  151. export * as SessionMessage from "./session-message"