divi 0.0.1.dev15__tar.gz → 0.0.1.dev17__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/PKG-INFO +1 -1
  2. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/graphql/src/datasources/datapark-api.ts +7 -1
  3. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/graphql/src/resolvers.ts +3 -0
  4. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/graphql/src/schema.graphql +27 -1
  5. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/graphql/src/types/types.d.ts +63 -2
  6. divi-0.0.1.dev17/apps/web/app/dashboard/@modal/(.)traces/[id]/page.tsx +21 -0
  7. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/components/data-table-cell-viewer.tsx +3 -0
  8. divi-0.0.1.dev17/apps/web/app/dashboard/traces/(children)/[id]/page.tsx +13 -0
  9. {divi-0.0.1.dev15/apps/web/app/dashboard/trace → divi-0.0.1.dev17/apps/web/app/dashboard/traces/(overview)}/components/columns.tsx +6 -2
  10. divi-0.0.1.dev17/apps/web/app/dashboard/traces/(overview)/components/data-table-row-action.tsx +31 -0
  11. {divi-0.0.1.dev15/apps/web/app/dashboard/trace → divi-0.0.1.dev17/apps/web/app/dashboard/traces/(overview)}/layout.tsx +2 -2
  12. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components/Modal.tsx +50 -2
  13. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components/app-sidebar.tsx +2 -2
  14. divi-0.0.1.dev17/apps/web/components/mode-switcher.tsx +43 -0
  15. divi-0.0.1.dev17/apps/web/components/responsive-resizable.tsx +37 -0
  16. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components/site-header.tsx +3 -1
  17. divi-0.0.1.dev17/apps/web/components/trace-board.tsx +36 -0
  18. divi-0.0.1.dev17/apps/web/components/trace-chart.tsx +116 -0
  19. divi-0.0.1.dev17/apps/web/lib/server/openai.ts +48 -0
  20. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/lib/server/span.ts +32 -13
  21. divi-0.0.1.dev17/apps/web/lib/types/span.d.ts +23 -0
  22. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/package.json +1 -0
  23. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/__init__.py +1 -1
  24. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/decorators/observable.py +5 -2
  25. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/proto/core/health/v1/health_service_pb2_grpc.py +1 -1
  26. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/services/auth/auth.py +1 -9
  27. divi-0.0.1.dev17/divi/services/datapark/datapark.py +55 -0
  28. divi-0.0.1.dev17/divi/services/service.py +54 -0
  29. divi-0.0.1.dev17/divi/utils.py +49 -0
  30. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/pnpm-lock.yaml +91 -0
  31. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/pyproject.toml +1 -0
  32. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/internal/app/datapark/handler/openai.go +63 -0
  33. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/internal/app/datapark/router/router.go +5 -0
  34. divi-0.0.1.dev17/services/internal/pkg/model/openai.go +29 -0
  35. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/tests/unit_tests/decorators/test_obs_openai.py +7 -0
  36. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/uv.lock +11 -0
  37. divi-0.0.1.dev15/apps/web/app/dashboard/@modal/(.)trace/[id]/page.tsx +0 -19
  38. divi-0.0.1.dev15/apps/web/app/dashboard/trace/[id]/page.tsx +0 -19
  39. divi-0.0.1.dev15/apps/web/app/dashboard/trace/components/data-table-row-action.tsx +0 -46
  40. divi-0.0.1.dev15/apps/web/components/trace-chart.tsx +0 -84
  41. divi-0.0.1.dev15/divi/services/datapark/datapark.py +0 -63
  42. divi-0.0.1.dev15/divi/services/service.py +0 -11
  43. divi-0.0.1.dev15/divi/utils.py +0 -22
  44. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/.air.toml +0 -0
  45. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/.dockerignore +0 -0
  46. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/.github/dependabot.yml +0 -0
  47. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/.gitignore +0 -0
  48. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/LICENSE +0 -0
  49. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/README.md +0 -0
  50. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/README.md +0 -0
  51. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/docs/README.md +0 -0
  52. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/docs/concepts/session.mdx +0 -0
  53. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/docs/development/roadmap.mdx +0 -0
  54. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/docs/docs.json +0 -0
  55. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/docs/favicon.ico +0 -0
  56. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/docs/images/researcher-angel.png +0 -0
  57. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/docs/images/scholar-angel.png +0 -0
  58. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/docs/introduction.mdx +0 -0
  59. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/docs/package.json +0 -0
  60. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/docs/quickstart/trace.mdx +0 -0
  61. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/docs/snippets/snippet-intro.mdx +0 -0
  62. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/docs/tutorials/openai.mdx +0 -0
  63. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/graphql/Dockerfile +0 -0
  64. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/graphql/README.md +0 -0
  65. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/graphql/codegen.ts +0 -0
  66. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/graphql/package.json +0 -0
  67. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/graphql/src/datasources/auth-api.ts +0 -0
  68. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/graphql/src/index.ts +0 -0
  69. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/graphql/src/types/context.d.ts +0 -0
  70. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/graphql/src/types/response.d.ts +0 -0
  71. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/graphql/tsconfig.json +0 -0
  72. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/.gitignore +0 -0
  73. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/README.md +0 -0
  74. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/dashboard/@modal/default.tsx +0 -0
  75. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/actions.ts +0 -0
  76. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/components/columns.tsx +0 -0
  77. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/components/create-dialog.tsx +0 -0
  78. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/components/data-table-toolbar.tsx +0 -0
  79. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/components/data-table.tsx +0 -0
  80. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/components/delete-dialog.tsx +0 -0
  81. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/data/data.tsx +0 -0
  82. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/data/schema.ts +0 -0
  83. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/layout.tsx +0 -0
  84. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/page.tsx +0 -0
  85. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/dashboard/layout.tsx +0 -0
  86. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/dashboard/page.tsx +0 -0
  87. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/dashboard/settings/account/page.tsx +0 -0
  88. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/dashboard/settings/appearance/page.tsx +0 -0
  89. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/dashboard/settings/layout.tsx +0 -0
  90. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/dashboard/settings/page.tsx +0 -0
  91. {divi-0.0.1.dev15/apps/web/app/dashboard/trace → divi-0.0.1.dev17/apps/web/app/dashboard/traces/(overview)}/components/data-table-toolbar.tsx +0 -0
  92. {divi-0.0.1.dev15/apps/web/app/dashboard/trace → divi-0.0.1.dev17/apps/web/app/dashboard/traces/(overview)}/components/data-table.tsx +0 -0
  93. {divi-0.0.1.dev15/apps/web/app/dashboard/trace → divi-0.0.1.dev17/apps/web/app/dashboard/traces/(overview)}/data/data.tsx +0 -0
  94. {divi-0.0.1.dev15/apps/web/app/dashboard/trace → divi-0.0.1.dev17/apps/web/app/dashboard/traces/(overview)}/data/schema.ts +0 -0
  95. {divi-0.0.1.dev15/apps/web/app/dashboard/trace → divi-0.0.1.dev17/apps/web/app/dashboard/traces/(overview)}/page.tsx +0 -0
  96. {divi-0.0.1.dev15/apps/web/app/dashboard/usage → divi-0.0.1.dev17/apps/web/app/dashboard/usages}/page.tsx +0 -0
  97. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/favicon.ico +0 -0
  98. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/home/components/home-header.tsx +0 -0
  99. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/home/components/home-hero.tsx +0 -0
  100. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/home/page.tsx +0 -0
  101. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/layout.tsx +0 -0
  102. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/login/page.tsx +0 -0
  103. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/page.tsx +0 -0
  104. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/app/signup/page.tsx +0 -0
  105. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components/ApolloWrapper.tsx +0 -0
  106. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components/account-form.tsx +0 -0
  107. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components/appearance-form.tsx +0 -0
  108. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components/chart-area-interactive.tsx +0 -0
  109. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components/data-table-column-header.tsx +0 -0
  110. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components/data-table-faceted-filter.tsx +0 -0
  111. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components/data-table-pagination.tsx +0 -0
  112. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components/data-table-row.tsx +0 -0
  113. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components/data-table-view-options.tsx +0 -0
  114. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components/login-form.tsx +0 -0
  115. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components/nav-main.tsx +0 -0
  116. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components/nav-secondary.tsx +0 -0
  117. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components/nav-user.tsx +0 -0
  118. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components/profile-form.tsx +0 -0
  119. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components/section-cards.tsx +0 -0
  120. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components/sidebar-nav.tsx +0 -0
  121. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components/signup-form.tsx +0 -0
  122. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components/theme-provider.tsx +0 -0
  123. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/components.json +0 -0
  124. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/hooks/actionState.ts +0 -0
  125. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/hooks/apolloClient.ts +0 -0
  126. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/lib/callback/toast-callback.ts +0 -0
  127. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/lib/callback/with-callback.ts +0 -0
  128. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/lib/server/README.md +0 -0
  129. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/lib/server/auth.ts +0 -0
  130. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/lib/server/cookies.ts +0 -0
  131. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/lib/types/state.d.ts +0 -0
  132. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/lib/utils.ts +0 -0
  133. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/middleware.ts +0 -0
  134. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/next-env.d.ts +0 -0
  135. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/next.config.ts +0 -0
  136. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/postcss.config.mjs +0 -0
  137. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/public/peeking-angel.png +0 -0
  138. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/public/thinking-angel.png +0 -0
  139. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/tsconfig.json +0 -0
  140. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/apps/web/vercel.json +0 -0
  141. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/biome.json +0 -0
  142. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/compose-dev.yml +0 -0
  143. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/config/config.py +0 -0
  144. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/decorators/__init__.py +0 -0
  145. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/decorators/obs_openai.py +0 -0
  146. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/proto/common/v1/common.proto +0 -0
  147. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/proto/common/v1/common_pb2.py +0 -0
  148. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/proto/common/v1/common_pb2.pyi +0 -0
  149. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/proto/core/health/v1/health_service.proto +0 -0
  150. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/proto/core/health/v1/health_service_pb2.py +0 -0
  151. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/proto/core/health/v1/health_service_pb2.pyi +0 -0
  152. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/proto/metric/v1/metric.proto +0 -0
  153. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/proto/metric/v1/metric_pb2.py +0 -0
  154. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/proto/metric/v1/metric_pb2.pyi +0 -0
  155. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/proto/trace/v1/trace.proto +0 -0
  156. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/proto/trace/v1/trace_pb2.py +0 -0
  157. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/proto/trace/v1/trace_pb2.pyi +0 -0
  158. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/services/__init__.py +0 -0
  159. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/services/auth/__init__.py +0 -0
  160. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/services/auth/init.py +0 -0
  161. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/services/auth/tokman.py +0 -0
  162. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/services/core/__init__.py +0 -0
  163. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/services/core/core.py +0 -0
  164. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/services/core/finish.py +0 -0
  165. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/services/core/init.py +0 -0
  166. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/services/datapark/__init__.py +0 -0
  167. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/services/datapark/init.py +0 -0
  168. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/services/finish.py +0 -0
  169. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/services/init.py +0 -0
  170. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/session/__init__.py +0 -0
  171. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/session/session.py +0 -0
  172. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/session/setup.py +0 -0
  173. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/session/teardown.py +0 -0
  174. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/signals/__init__.py +0 -0
  175. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/signals/trace/__init__.py +0 -0
  176. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/divi/signals/trace/trace.py +0 -0
  177. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/docker-compose.yml +0 -0
  178. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/docs/README.md +0 -0
  179. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/docs/developer_tools.md +0 -0
  180. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/docs/images/architecture.svg +0 -0
  181. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/docs/images/favicon.ico +0 -0
  182. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/docs/images/og-image.png +0 -0
  183. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/docs/images/storage.svg +0 -0
  184. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/docs/package_readme.md +0 -0
  185. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/go.work +0 -0
  186. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/go.work.sum +0 -0
  187. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/hatch.toml +0 -0
  188. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/package.json +0 -0
  189. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/packages/README.md +0 -0
  190. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/pnpm-workspace.yaml +0 -0
  191. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/scripts/README.md +0 -0
  192. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/scripts/hatch_build.py +0 -0
  193. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/scripts/key_build.py +0 -0
  194. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/scripts/proto_build.py +0 -0
  195. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/README.md +0 -0
  196. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/go.mod +0 -0
  197. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/go.sum +0 -0
  198. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/internal/app/auth/handler/api.go +0 -0
  199. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/internal/app/auth/handler/api_key.go +0 -0
  200. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/internal/app/auth/handler/auth.go +0 -0
  201. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/internal/app/auth/handler/user.go +0 -0
  202. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/internal/app/auth/router/router.go +0 -0
  203. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/internal/app/core/.keep +0 -0
  204. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/internal/app/datapark/handler/api.go +0 -0
  205. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/internal/app/datapark/handler/metric.go +0 -0
  206. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/internal/app/datapark/handler/session.go +0 -0
  207. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/internal/app/datapark/handler/trace.go +0 -0
  208. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/internal/pkg/auth/auth.go +0 -0
  209. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/internal/pkg/auth/middleware.go +0 -0
  210. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/internal/pkg/config/config.go +0 -0
  211. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/internal/pkg/database/connect.go +0 -0
  212. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/internal/pkg/database/database.go +0 -0
  213. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/internal/pkg/model/api_key.go +0 -0
  214. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/internal/pkg/model/session.go +0 -0
  215. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/internal/pkg/model/trace.go +0 -0
  216. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/internal/pkg/model/user.go +0 -0
  217. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/pb/common.pb.go +0 -0
  218. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/pb/health_service.pb.go +0 -0
  219. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/pb/health_service_grpc.pb.go +0 -0
  220. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/pb/metric.pb.go +0 -0
  221. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/services/pb/trace.pb.go +0 -0
  222. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/tests/__init__.py +0 -0
  223. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/tests/unit_tests/decorators/test_observable.py +0 -0
  224. {divi-0.0.1.dev15 → divi-0.0.1.dev17}/turbo.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: divi
3
- Version: 0.0.1.dev15
3
+ Version: 0.0.1.dev17
4
4
  Summary: The Agent Platform for Observability & Evaluation
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.11
@@ -1,5 +1,5 @@
1
1
  import type { FetchResponse } from '@/types/response';
2
- import type { Span, Trace } from '@/types/types';
2
+ import type { ChatInput, Span, Trace } from '@/types/types';
3
3
  import { type AugmentedRequest, RESTDataSource } from '@apollo/datasource-rest';
4
4
  import type { KeyValueCache } from '@apollo/utils.keyvaluecache';
5
5
 
@@ -29,4 +29,10 @@ export class DataParkAPI extends RESTDataSource {
29
29
  async getSpans(traceId: string) {
30
30
  return await this.get<FetchResponse<Span[]>>(`/api/trace/${traceId}/spans`);
31
31
  }
32
+
33
+ async getChatInput(spanId: string) {
34
+ return await this.get<FetchResponse<ChatInput>>(
35
+ `/api/v1/chat/completions/${spanId}/input`
36
+ );
37
+ }
32
38
  }
@@ -26,6 +26,9 @@ export const resolvers: Resolvers = {
26
26
  spans: async (_, { trace_id }, { dataSources }) => {
27
27
  return (await dataSources.dataparkAPI.getSpans(trace_id)).data;
28
28
  },
29
+ chat_input: async (_, { span_id }, { dataSources }) => {
30
+ return (await dataSources.dataparkAPI.getChatInput(span_id)).data;
31
+ },
29
32
  },
30
33
  Mutation: {
31
34
  createAPIKey: async (_, { name }, { dataSources }) => {
@@ -12,6 +12,8 @@ type Query {
12
12
  all_traces: [Trace!]
13
13
  "Fetch all spans by trace id"
14
14
  spans(trace_id: ID!): [Span!]
15
+ "Fetch openai input by span id"
16
+ chat_input(span_id: ID!): ChatInput
15
17
  }
16
18
 
17
19
  "NullTime is a custom scalar type that represents a time value that can be null"
@@ -52,6 +54,11 @@ type Trace {
52
54
  session_id: ID!
53
55
  }
54
56
 
57
+ enum Kind {
58
+ SPAN_KIND_FUNCTION
59
+ SPAN_KIND_LLM
60
+ }
61
+
55
62
  "Span is a record of a single unit of work within a trace"
56
63
  type Span {
57
64
  id: ID!
@@ -61,10 +68,29 @@ type Span {
61
68
  start_time: String!
62
69
  end_time: String!
63
70
  duration: Float!
64
- kind: String!
71
+ kind: Kind!
65
72
  metadata: [KeyValue!]
66
73
  }
67
74
 
75
+ "OpenInput is the input for the OpenAI API"
76
+ type ChatInput {
77
+ model: String!
78
+ messages: [MessageInput!]
79
+ temperature: Float
80
+ top_p: Float
81
+ n: Int
82
+ stream: Boolean
83
+ logprobs: Boolean
84
+ top_logprobs: Int
85
+ }
86
+
87
+ "MessageInput is a message sent to the OpenAI API"
88
+ type MessageInput {
89
+ role: String!
90
+ content: String!
91
+ name: String
92
+ }
93
+
68
94
  "Mutation is a collection of mutations that can be made to the API"
69
95
  type Mutation {
70
96
  "Auth Mutations"
@@ -29,6 +29,19 @@ export type ApiKey = {
29
29
  name?: Maybe<Scalars['String']['output']>;
30
30
  };
31
31
 
32
+ /** OpenInput is the input for the OpenAI API */
33
+ export type ChatInput = {
34
+ __typename?: 'ChatInput';
35
+ logprobs?: Maybe<Scalars['Boolean']['output']>;
36
+ messages?: Maybe<Array<MessageInput>>;
37
+ model: Scalars['String']['output'];
38
+ n?: Maybe<Scalars['Int']['output']>;
39
+ stream?: Maybe<Scalars['Boolean']['output']>;
40
+ temperature?: Maybe<Scalars['Float']['output']>;
41
+ top_logprobs?: Maybe<Scalars['Int']['output']>;
42
+ top_p?: Maybe<Scalars['Float']['output']>;
43
+ };
44
+
32
45
  /** CreateAPIKeyResponse is a response to the createAPIKey mutation */
33
46
  export type CreateApiKeyResponse = MutationResponse & {
34
47
  __typename?: 'CreateAPIKeyResponse';
@@ -71,6 +84,19 @@ export type KeyValue = {
71
84
  value: Scalars['String']['output'];
72
85
  };
73
86
 
87
+ export enum Kind {
88
+ SpanKindFunction = 'SPAN_KIND_FUNCTION',
89
+ SpanKindLlm = 'SPAN_KIND_LLM'
90
+ }
91
+
92
+ /** MessageInput is a message sent to the OpenAI API */
93
+ export type MessageInput = {
94
+ __typename?: 'MessageInput';
95
+ content: Scalars['String']['output'];
96
+ name?: Maybe<Scalars['String']['output']>;
97
+ role: Scalars['String']['output'];
98
+ };
99
+
74
100
  /** Mutation is a collection of mutations that can be made to the API */
75
101
  export type Mutation = {
76
102
  __typename?: 'Mutation';
@@ -162,6 +188,8 @@ export type Query = {
162
188
  all_traces?: Maybe<Array<Trace>>;
163
189
  /** Fetch current user's API keys */
164
190
  api_keys?: Maybe<Array<ApiKey>>;
191
+ /** Fetch openai input by span id */
192
+ chat_input?: Maybe<ChatInput>;
165
193
  /** Fetch current user */
166
194
  me: User;
167
195
  /** Fetch all spans by trace id */
@@ -173,6 +201,12 @@ export type Query = {
173
201
  };
174
202
 
175
203
 
204
+ /** Query is a collection of queries that can be made to the API */
205
+ export type QueryChat_InputArgs = {
206
+ span_id: Scalars['ID']['input'];
207
+ };
208
+
209
+
176
210
  /** Query is a collection of queries that can be made to the API */
177
211
  export type QuerySpansArgs = {
178
212
  trace_id: Scalars['ID']['input'];
@@ -204,7 +238,7 @@ export type Span = {
204
238
  duration: Scalars['Float']['output'];
205
239
  end_time: Scalars['String']['output'];
206
240
  id: Scalars['ID']['output'];
207
- kind: Scalars['String']['output'];
241
+ kind: Kind;
208
242
  metadata?: Maybe<Array<KeyValue>>;
209
243
  name: Scalars['String']['output'];
210
244
  parent_id: Scalars['ID']['output'];
@@ -327,6 +361,7 @@ export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> =
327
361
  export type ResolversTypes = {
328
362
  APIKey: ResolverTypeWrapper<APIKeyModel>;
329
363
  Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;
364
+ ChatInput: ResolverTypeWrapper<ChatInput>;
330
365
  CreateAPIKeyResponse: ResolverTypeWrapper<Omit<CreateApiKeyResponse, 'data'> & { data?: Maybe<ResolversTypes['APIKey']> }>;
331
366
  CreateTokenResponse: ResolverTypeWrapper<CreateTokenResponse>;
332
367
  CreateUserResponse: ResolverTypeWrapper<Omit<CreateUserResponse, 'data'> & { data?: Maybe<ResolversTypes['User']> }>;
@@ -335,6 +370,8 @@ export type ResolversTypes = {
335
370
  ID: ResolverTypeWrapper<Scalars['ID']['output']>;
336
371
  Int: ResolverTypeWrapper<Scalars['Int']['output']>;
337
372
  KeyValue: ResolverTypeWrapper<KeyValue>;
373
+ Kind: Kind;
374
+ MessageInput: ResolverTypeWrapper<MessageInput>;
338
375
  Mutation: ResolverTypeWrapper<{}>;
339
376
  MutationResponse: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['MutationResponse']>;
340
377
  NullTime: ResolverTypeWrapper<NullTime>;
@@ -352,6 +389,7 @@ export type ResolversTypes = {
352
389
  export type ResolversParentTypes = {
353
390
  APIKey: APIKeyModel;
354
391
  Boolean: Scalars['Boolean']['output'];
392
+ ChatInput: ChatInput;
355
393
  CreateAPIKeyResponse: Omit<CreateApiKeyResponse, 'data'> & { data?: Maybe<ResolversParentTypes['APIKey']> };
356
394
  CreateTokenResponse: CreateTokenResponse;
357
395
  CreateUserResponse: Omit<CreateUserResponse, 'data'> & { data?: Maybe<ResolversParentTypes['User']> };
@@ -360,6 +398,7 @@ export type ResolversParentTypes = {
360
398
  ID: Scalars['ID']['output'];
361
399
  Int: Scalars['Int']['output'];
362
400
  KeyValue: KeyValue;
401
+ MessageInput: MessageInput;
363
402
  Mutation: {};
364
403
  MutationResponse: ResolversInterfaceTypes<ResolversParentTypes>['MutationResponse'];
365
404
  NullTime: NullTime;
@@ -381,6 +420,18 @@ export type ApiKeyResolvers<ContextType = DataSourceContext, ParentType extends
381
420
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
382
421
  };
383
422
 
423
+ export type ChatInputResolvers<ContextType = DataSourceContext, ParentType extends ResolversParentTypes['ChatInput'] = ResolversParentTypes['ChatInput']> = {
424
+ logprobs?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
425
+ messages?: Resolver<Maybe<Array<ResolversTypes['MessageInput']>>, ParentType, ContextType>;
426
+ model?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
427
+ n?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;
428
+ stream?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
429
+ temperature?: Resolver<Maybe<ResolversTypes['Float']>, ParentType, ContextType>;
430
+ top_logprobs?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;
431
+ top_p?: Resolver<Maybe<ResolversTypes['Float']>, ParentType, ContextType>;
432
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
433
+ };
434
+
384
435
  export type CreateApiKeyResponseResolvers<ContextType = DataSourceContext, ParentType extends ResolversParentTypes['CreateAPIKeyResponse'] = ResolversParentTypes['CreateAPIKeyResponse']> = {
385
436
  code?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;
386
437
  data?: Resolver<Maybe<ResolversTypes['APIKey']>, ParentType, ContextType>;
@@ -418,6 +469,13 @@ export type KeyValueResolvers<ContextType = DataSourceContext, ParentType extend
418
469
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
419
470
  };
420
471
 
472
+ export type MessageInputResolvers<ContextType = DataSourceContext, ParentType extends ResolversParentTypes['MessageInput'] = ResolversParentTypes['MessageInput']> = {
473
+ content?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
474
+ name?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
475
+ role?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
476
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
477
+ };
478
+
421
479
  export type MutationResolvers<ContextType = DataSourceContext, ParentType extends ResolversParentTypes['Mutation'] = ResolversParentTypes['Mutation']> = {
422
480
  createAPIKey?: Resolver<ResolversTypes['CreateAPIKeyResponse'], ParentType, ContextType, Partial<MutationCreateApiKeyArgs>>;
423
481
  createUser?: Resolver<ResolversTypes['CreateUserResponse'], ParentType, ContextType, RequireFields<MutationCreateUserArgs, 'email' | 'password' | 'username'>>;
@@ -445,6 +503,7 @@ export type NullTimeResolvers<ContextType = DataSourceContext, ParentType extend
445
503
  export type QueryResolvers<ContextType = DataSourceContext, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {
446
504
  all_traces?: Resolver<Maybe<Array<ResolversTypes['Trace']>>, ParentType, ContextType>;
447
505
  api_keys?: Resolver<Maybe<Array<ResolversTypes['APIKey']>>, ParentType, ContextType>;
506
+ chat_input?: Resolver<Maybe<ResolversTypes['ChatInput']>, ParentType, ContextType, RequireFields<QueryChat_InputArgs, 'span_id'>>;
448
507
  me?: Resolver<ResolversTypes['User'], ParentType, ContextType>;
449
508
  spans?: Resolver<Maybe<Array<ResolversTypes['Span']>>, ParentType, ContextType, RequireFields<QuerySpansArgs, 'trace_id'>>;
450
509
  traces?: Resolver<Maybe<Array<ResolversTypes['Trace']>>, ParentType, ContextType, RequireFields<QueryTracesArgs, 'session_id'>>;
@@ -462,7 +521,7 @@ export type SpanResolvers<ContextType = DataSourceContext, ParentType extends Re
462
521
  duration?: Resolver<ResolversTypes['Float'], ParentType, ContextType>;
463
522
  end_time?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
464
523
  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
465
- kind?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
524
+ kind?: Resolver<ResolversTypes['Kind'], ParentType, ContextType>;
466
525
  metadata?: Resolver<Maybe<Array<ResolversTypes['KeyValue']>>, ParentType, ContextType>;
467
526
  name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
468
527
  parent_id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
@@ -507,11 +566,13 @@ export type UserResolvers<ContextType = DataSourceContext, ParentType extends Re
507
566
 
508
567
  export type Resolvers<ContextType = DataSourceContext> = {
509
568
  APIKey?: ApiKeyResolvers<ContextType>;
569
+ ChatInput?: ChatInputResolvers<ContextType>;
510
570
  CreateAPIKeyResponse?: CreateApiKeyResponseResolvers<ContextType>;
511
571
  CreateTokenResponse?: CreateTokenResponseResolvers<ContextType>;
512
572
  CreateUserResponse?: CreateUserResponseResolvers<ContextType>;
513
573
  DeleteUserResponse?: DeleteUserResponseResolvers<ContextType>;
514
574
  KeyValue?: KeyValueResolvers<ContextType>;
575
+ MessageInput?: MessageInputResolvers<ContextType>;
515
576
  Mutation?: MutationResolvers<ContextType>;
516
577
  MutationResponse?: MutationResponseResolvers<ContextType>;
517
578
  NullTime?: NullTimeResolvers<ContextType>;
@@ -0,0 +1,21 @@
1
+ import { ResponsiveDrawer } from '@/components/Modal';
2
+ import { TraceBoard } from '@/components/trace-board';
3
+ import { getTraceChartData } from '@/lib/server/span';
4
+
5
+ interface TraceModalPageProps {
6
+ params: Promise<{ id: string }>;
7
+ }
8
+
9
+ export default async function TraceModalPage(props: TraceModalPageProps) {
10
+ const { id } = await props.params;
11
+ const spans = await getTraceChartData(id);
12
+
13
+ return (
14
+ <ResponsiveDrawer
15
+ title="Trace"
16
+ description="Click expand button to view full trace"
17
+ >
18
+ <TraceBoard spans={spans} direction="vertical" />
19
+ </ResponsiveDrawer>
20
+ );
21
+ }
@@ -38,6 +38,9 @@ export function TableCellViewer({ item }: { item: z.infer<typeof schema> }) {
38
38
  ),
39
39
  null
40
40
  );
41
+ if (isMobile === undefined) {
42
+ return null;
43
+ }
41
44
 
42
45
  return (
43
46
  <Drawer direction={isMobile ? 'bottom' : 'right'}>
@@ -0,0 +1,13 @@
1
+ import { TraceBoard } from '@/components/trace-board';
2
+ import { getTraceChartData } from '@/lib/server/span';
3
+
4
+ interface TracePageProps {
5
+ params: Promise<{ id: string }>;
6
+ }
7
+
8
+ export default async function TracePage(props: TracePageProps) {
9
+ const { id } = await props.params;
10
+ const spans = await getTraceChartData(id);
11
+
12
+ return <TraceBoard spans={spans} />;
13
+ }
@@ -1,5 +1,4 @@
1
1
  'use client';
2
-
3
2
  import { DataTableColumnHeader } from '@/components/data-table-column-header';
4
3
  import { formatDate } from '@/lib/utils';
5
4
  import type { ColumnDef } from '@tanstack/react-table';
@@ -7,6 +6,7 @@ import Link from 'next/link';
7
6
  import type { z } from 'zod';
8
7
  import { statuses } from '../data/data';
9
8
  import type { traceSchema } from '../data/schema';
9
+ import { DataTableRowActions } from './data-table-row-action';
10
10
 
11
11
  export const columns: ColumnDef<z.infer<typeof traceSchema>>[] = [
12
12
  {
@@ -15,7 +15,7 @@ export const columns: ColumnDef<z.infer<typeof traceSchema>>[] = [
15
15
  <DataTableColumnHeader column={column} title="Trace ID" />
16
16
  ),
17
17
  cell: ({ row }) => (
18
- <Link href={`/dashboard/trace/${row.getValue('id')}`} passHref>
18
+ <Link href={`/dashboard/traces/${row.getValue('id')}`} passHref>
19
19
  {row.getValue('id')}
20
20
  </Link>
21
21
  ),
@@ -93,4 +93,8 @@ export const columns: ColumnDef<z.infer<typeof traceSchema>>[] = [
93
93
  },
94
94
  enableGrouping: false,
95
95
  },
96
+ {
97
+ id: 'actions',
98
+ cell: ({ row }) => <DataTableRowActions row={row} />,
99
+ },
96
100
  ];
@@ -0,0 +1,31 @@
1
+ import type { Row } from '@tanstack/react-table';
2
+ import { Button } from '@workspace/ui/components/button';
3
+ import { Expand, Eye } from 'lucide-react';
4
+ import Link from 'next/link';
5
+ import { traceSchema } from '../data/schema';
6
+
7
+ interface DataTableRowActionsProps<TData> {
8
+ row: Row<TData>;
9
+ }
10
+
11
+ export function DataTableRowActions<TData>({
12
+ row,
13
+ }: DataTableRowActionsProps<TData>) {
14
+ const trace = traceSchema.parse(row.original);
15
+ const href = `/dashboard/traces/${trace.id}`;
16
+
17
+ return (
18
+ <div className="flex items-center space-x-2">
19
+ <Button variant="ghost" size="icon" asChild>
20
+ <Link href={href} passHref>
21
+ <Eye className="h-4 w-4 text-muted-foreground" />
22
+ </Link>
23
+ </Button>
24
+ <Button variant="ghost" size="icon" asChild>
25
+ <a href={href}>
26
+ <Expand className="h-4 w-4 text-muted-foreground" />
27
+ </a>
28
+ </Button>
29
+ </div>
30
+ );
31
+ }
@@ -1,11 +1,11 @@
1
1
  import { Separator } from '@workspace/ui/components/separator';
2
2
  import type React from 'react';
3
3
 
4
- interface APIKeysLayoutProps {
4
+ interface TracesLayoutProps {
5
5
  children: React.ReactNode;
6
6
  }
7
7
 
8
- export default function APIKeysLayout({ children }: APIKeysLayoutProps) {
8
+ export default function TracesLayout({ children }: TracesLayoutProps) {
9
9
  return (
10
10
  <div className="space-y-3 py-3">
11
11
  <div className="flex items-center justify-between px-6">
@@ -1,4 +1,5 @@
1
1
  'use client';
2
+ import { Button } from '@workspace/ui/components/button';
2
3
  import {
3
4
  Dialog,
4
5
  DialogContent,
@@ -17,11 +18,12 @@ import {
17
18
  DrawerTitle,
18
19
  } from '@workspace/ui/components/drawer';
19
20
  import { useMediaQuery } from '@workspace/ui/hooks/use-media-query';
20
- import { useRouter } from 'next/navigation';
21
+ import { Expand } from 'lucide-react';
22
+ import { usePathname, useRouter } from 'next/navigation';
21
23
  import type * as React from 'react';
22
24
  import { useState } from 'react';
23
25
 
24
- export function Modal({
26
+ export function ResponsiveModal({
25
27
  children,
26
28
  title,
27
29
  description,
@@ -67,3 +69,49 @@ export function Modal({
67
69
  </Drawer>
68
70
  );
69
71
  }
72
+
73
+ export function ResponsiveDrawer({
74
+ children,
75
+ title,
76
+ description,
77
+ }: {
78
+ children: React.ReactNode;
79
+ title: string;
80
+ description: string;
81
+ }) {
82
+ const router = useRouter();
83
+ const pathname = usePathname();
84
+ const [open, setOpen] = useState(true);
85
+ const handleOpenChange = (open: boolean) => {
86
+ if (!open) {
87
+ setOpen(false);
88
+ setTimeout(router.back, 200);
89
+ }
90
+ };
91
+
92
+ return (
93
+ <Drawer
94
+ defaultOpen={false}
95
+ open={open}
96
+ onOpenChange={handleOpenChange}
97
+ direction="right"
98
+ >
99
+ <DrawerContent>
100
+ <DrawerHeader>
101
+ <DrawerTitle className="flex items-center justify-between">
102
+ <Button variant="ghost" size="icon" asChild>
103
+ <a href={pathname}>
104
+ <Expand />
105
+ </a>
106
+ </Button>
107
+ {title}
108
+ </DrawerTitle>
109
+ <DrawerDescription className="text-end">
110
+ {description}
111
+ </DrawerDescription>
112
+ </DrawerHeader>
113
+ {children}
114
+ </DrawerContent>
115
+ </Drawer>
116
+ );
117
+ }
@@ -38,12 +38,12 @@ const data = {
38
38
  },
39
39
  {
40
40
  title: 'Trace',
41
- url: '/dashboard/trace',
41
+ url: '/dashboard/traces',
42
42
  icon: IconBinaryTree,
43
43
  },
44
44
  {
45
45
  title: 'Usage',
46
- url: '/dashboard/usage',
46
+ url: '/dashboard/usages',
47
47
  icon: IconCurrencyDollar,
48
48
  },
49
49
  {
@@ -0,0 +1,43 @@
1
+ 'use client';
2
+
3
+ import { MoonIcon, SunIcon } from 'lucide-react';
4
+ import { useTheme } from 'next-themes';
5
+ import * as React from 'react';
6
+
7
+ import { Button } from '@workspace/ui/components/button';
8
+ import {
9
+ META_THEME_COLORS,
10
+ useMetaColor,
11
+ } from '@workspace/ui/hooks/use-meta-color';
12
+ import { cn } from '@workspace/ui/lib/utils';
13
+
14
+ export function ModeSwitcher({
15
+ className,
16
+ ...props
17
+ }: React.ComponentProps<typeof Button>) {
18
+ const { setTheme, resolvedTheme } = useTheme();
19
+ const { setMetaColor } = useMetaColor();
20
+
21
+ const toggleTheme = React.useCallback(() => {
22
+ setTheme(resolvedTheme === 'dark' ? 'light' : 'dark');
23
+ setMetaColor(
24
+ resolvedTheme === 'dark'
25
+ ? META_THEME_COLORS.light
26
+ : META_THEME_COLORS.dark
27
+ );
28
+ }, [resolvedTheme, setTheme, setMetaColor]);
29
+
30
+ return (
31
+ <Button
32
+ variant="ghost"
33
+ size="icon"
34
+ className={cn('group/toggle size-7', className)}
35
+ onClick={toggleTheme}
36
+ {...props}
37
+ >
38
+ <SunIcon className="hidden [html.dark_&]:block" />
39
+ <MoonIcon className="hidden [html.light_&]:block" />
40
+ <span className="sr-only">Toggle theme</span>
41
+ </Button>
42
+ );
43
+ }
@@ -0,0 +1,37 @@
1
+ 'use client';
2
+
3
+ import {
4
+ ResizableHandle,
5
+ ResizablePanel,
6
+ ResizablePanelGroup,
7
+ } from '@workspace/ui/components/resizable';
8
+ import { useIsMobile } from '@workspace/ui/hooks/use-mobile';
9
+ import type { ReactNode } from 'react';
10
+
11
+ interface ResponsiveResizableProps {
12
+ first: ReactNode;
13
+ second: ReactNode;
14
+ direction?: 'horizontal' | 'vertical';
15
+ }
16
+
17
+ export function ResponsiveResizable({
18
+ first,
19
+ second,
20
+ direction,
21
+ }: ResponsiveResizableProps) {
22
+ const isMobile = useIsMobile();
23
+ if (isMobile === undefined) {
24
+ return null;
25
+ }
26
+ const _direction = direction ?? (isMobile ? 'vertical' : 'horizontal');
27
+
28
+ return (
29
+ <ResizablePanelGroup direction={_direction}>
30
+ <ResizablePanel defaultSize={50} minSize={25}>
31
+ {first}
32
+ </ResizablePanel>
33
+ <ResizableHandle />
34
+ <ResizablePanel defaultSize={50}>{second}</ResizablePanel>
35
+ </ResizablePanelGroup>
36
+ );
37
+ }
@@ -1,12 +1,13 @@
1
1
  import { SiGithub } from '@icons-pack/react-simple-icons';
2
2
  import { SidebarTrigger } from '@workspace/ui/components/sidebar';
3
+ import { ModeSwitcher } from './mode-switcher';
3
4
 
4
5
  export function SiteHeader() {
5
6
  return (
6
7
  <header className="flex h-(--header-height) shrink-0 items-center gap-2 border-b transition-[width,height] ease-linear group-has-data-[collapsible=icon]/sidebar-wrapper:h-(--header-height)">
7
8
  <div className="flex w-full items-center gap-1 px-4 lg:gap-2 lg:px-6">
8
9
  <SidebarTrigger className="-ml-1" />
9
- <div className="ml-auto flex items-center gap-2">
10
+ <div className="ml-auto flex items-center gap-3">
10
11
  <a
11
12
  href="https://github.com/Kaikaikaifang/divine-agent"
12
13
  rel="noreferrer Divine Agent GitHub repository"
@@ -15,6 +16,7 @@ export function SiteHeader() {
15
16
  >
16
17
  <SiGithub size={18} />
17
18
  </a>
19
+ <ModeSwitcher />
18
20
  </div>
19
21
  </div>
20
22
  </header>
@@ -0,0 +1,36 @@
1
+ 'use client';
2
+
3
+ import type { ExtendedSpan } from '@/lib/types/span';
4
+ import { useState } from 'react';
5
+ import { ResponsiveResizable } from './responsive-resizable';
6
+ import { TraceWaterfallChart } from './trace-chart';
7
+
8
+ interface TraceBoardProps {
9
+ spans: ExtendedSpan[];
10
+ direction?: 'horizontal' | 'vertical';
11
+ }
12
+
13
+ export function TraceBoard({ spans, direction }: TraceBoardProps) {
14
+ const [index, setIndex] = useState<number | undefined>(undefined);
15
+ const selectAction = (_data: ExtendedSpan, index: number) => {
16
+ setIndex(index);
17
+ };
18
+
19
+ return (
20
+ <ResponsiveResizable
21
+ first={
22
+ <TraceWaterfallChart
23
+ activeIndex={index}
24
+ data={spans}
25
+ selectAction={selectAction}
26
+ />
27
+ }
28
+ second={
29
+ <span className="font-semibold">
30
+ {JSON.stringify(spans[index ?? 0])}
31
+ </span>
32
+ }
33
+ direction={direction}
34
+ />
35
+ );
36
+ }