data.tsx 1.9 KB

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