data.tsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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 const { use: useData, provider: DataProvider } = createSimpleContext({
  46. name: "Data",
  47. init: (props: {
  48. data: Data
  49. directory: string
  50. onPermissionRespond?: PermissionRespondFn
  51. onQuestionReply?: QuestionReplyFn
  52. onQuestionReject?: QuestionRejectFn
  53. onNavigateToSession?: NavigateToSessionFn
  54. }) => {
  55. return {
  56. get store() {
  57. return props.data
  58. },
  59. get directory() {
  60. return props.directory
  61. },
  62. respondToPermission: props.onPermissionRespond,
  63. replyToQuestion: props.onQuestionReply,
  64. rejectQuestion: props.onQuestionReject,
  65. navigateToSession: props.onNavigateToSession,
  66. }
  67. },
  68. })