data.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import type {
  2. Message,
  3. Session,
  4. Part,
  5. FileDiff,
  6. SessionStatus,
  7. PermissionRequest,
  8. QuestionRequest,
  9. QuestionAnswer,
  10. } from "@opencode-ai/sdk/v2"
  11. import { createSimpleContext } from "./helper"
  12. import { PreloadMultiFileDiffResult } from "@pierre/diffs/ssr"
  13. type Data = {
  14. session: Session[]
  15. session_status: {
  16. [sessionID: string]: SessionStatus
  17. }
  18. session_diff: {
  19. [sessionID: string]: FileDiff[]
  20. }
  21. session_diff_preload?: {
  22. [sessionID: string]: PreloadMultiFileDiffResult<any>[]
  23. }
  24. permission?: {
  25. [sessionID: string]: PermissionRequest[]
  26. }
  27. question?: {
  28. [sessionID: string]: QuestionRequest[]
  29. }
  30. message: {
  31. [sessionID: string]: Message[]
  32. }
  33. part: {
  34. [messageID: string]: Part[]
  35. }
  36. }
  37. export type PermissionRespondFn = (input: {
  38. sessionID: string
  39. permissionID: string
  40. response: "once" | "always" | "reject"
  41. }) => void
  42. export type QuestionReplyFn = (input: { requestID: string; answers: QuestionAnswer[] }) => void
  43. export type QuestionRejectFn = (input: { requestID: string }) => void
  44. export type NavigateToSessionFn = (sessionID: string) => void
  45. export type SessionHrefFn = (sessionID: string) => string
  46. export type SyncSessionFn = (sessionID: string) => void | Promise<void>
  47. export const { use: useData, provider: DataProvider } = createSimpleContext({
  48. name: "Data",
  49. init: (props: {
  50. data: Data
  51. directory: string
  52. onPermissionRespond?: PermissionRespondFn
  53. onQuestionReply?: QuestionReplyFn
  54. onQuestionReject?: QuestionRejectFn
  55. onNavigateToSession?: NavigateToSessionFn
  56. onSessionHref?: SessionHrefFn
  57. onSyncSession?: SyncSessionFn
  58. }) => {
  59. return {
  60. get store() {
  61. return props.data
  62. },
  63. get directory() {
  64. return props.directory
  65. },
  66. respondToPermission: props.onPermissionRespond,
  67. replyToQuestion: props.onQuestionReply,
  68. rejectQuestion: props.onQuestionReject,
  69. navigateToSession: props.onNavigateToSession,
  70. sessionHref: props.onSessionHref,
  71. syncSession: props.onSyncSession,
  72. }
  73. },
  74. })