diffs.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import type { SnapshotFileDiff, VcsFileDiff } from "@opencode-ai/sdk/v2"
  2. import type { Message } from "@opencode-ai/sdk/v2/client"
  3. type Diff = SnapshotFileDiff | VcsFileDiff
  4. function diff(value: unknown): value is Diff {
  5. if (!value || typeof value !== "object" || Array.isArray(value)) return false
  6. if (!("file" in value) || typeof value.file !== "string") return false
  7. if (!("patch" in value) || typeof value.patch !== "string") return false
  8. if (!("additions" in value) || typeof value.additions !== "number") return false
  9. if (!("deletions" in value) || typeof value.deletions !== "number") return false
  10. if (!("status" in value) || value.status === undefined) return true
  11. return value.status === "added" || value.status === "deleted" || value.status === "modified"
  12. }
  13. function object(value: unknown): value is Record<string, unknown> {
  14. return !!value && typeof value === "object" && !Array.isArray(value)
  15. }
  16. export function diffs(value: unknown): Diff[] {
  17. if (Array.isArray(value) && value.every(diff)) return value
  18. if (Array.isArray(value)) return value.filter(diff)
  19. if (diff(value)) return [value]
  20. if (!object(value)) return []
  21. return Object.values(value).filter(diff)
  22. }
  23. export function message(value: Message): Message {
  24. if (value.role !== "user") return value
  25. const raw = value.summary as unknown
  26. if (raw === undefined) return value
  27. if (!object(raw)) return { ...value, summary: undefined }
  28. const title = typeof raw.title === "string" ? raw.title : undefined
  29. const body = typeof raw.body === "string" ? raw.body : undefined
  30. const next = diffs(raw.diffs)
  31. if (title === raw.title && body === raw.body && next === raw.diffs) return value
  32. return {
  33. ...value,
  34. summary: {
  35. ...(title === undefined ? {} : { title }),
  36. ...(body === undefined ? {} : { body }),
  37. diffs: next,
  38. },
  39. }
  40. }