divi 0.0.1.dev14__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.dev14 → divi-0.0.1.dev17}/PKG-INFO +3 -3
  2. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/src/datasources/datapark-api.ts +7 -1
  3. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/src/resolvers.ts +3 -0
  4. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/src/schema.graphql +28 -2
  5. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/src/types/types.d.ts +67 -4
  6. divi-0.0.1.dev17/apps/web/app/dashboard/@modal/(.)traces/[id]/page.tsx +21 -0
  7. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/components/data-table-cell-viewer.tsx +4 -1
  8. divi-0.0.1.dev17/apps/web/app/dashboard/traces/(children)/[id]/page.tsx +13 -0
  9. {divi-0.0.1.dev14/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.dev14/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.dev14 → divi-0.0.1.dev17}/apps/web/components/Modal.tsx +50 -2
  13. {divi-0.0.1.dev14 → 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.dev14 → 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.dev14 → divi-0.0.1.dev17}/apps/web/lib/server/span.ts +32 -14
  21. divi-0.0.1.dev17/apps/web/lib/types/span.d.ts +23 -0
  22. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/package.json +1 -0
  23. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/__init__.py +1 -1
  24. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/decorators/observable.py +5 -2
  25. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/core/health/v1/health_service_pb2_grpc.py +1 -1
  26. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/trace/v1/trace_pb2.py +7 -9
  27. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/trace/v1/trace_pb2.pyi +0 -12
  28. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/auth/auth.py +1 -9
  29. divi-0.0.1.dev17/divi/services/datapark/datapark.py +55 -0
  30. divi-0.0.1.dev17/divi/services/service.py +54 -0
  31. divi-0.0.1.dev17/divi/utils.py +49 -0
  32. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/pnpm-lock.yaml +91 -0
  33. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/pyproject.toml +4 -3
  34. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/auth/handler/api_key.go +1 -1
  35. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/datapark/handler/openai.go +63 -0
  36. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/datapark/handler/trace.go +8 -4
  37. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/datapark/router/router.go +5 -0
  38. divi-0.0.1.dev17/services/internal/pkg/model/openai.go +29 -0
  39. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/pkg/model/session.go +5 -0
  40. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/pkg/model/trace.go +1 -1
  41. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/pb/trace.pb.go +50 -136
  42. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/tests/unit_tests/decorators/test_obs_openai.py +7 -0
  43. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/uv.lock +81 -64
  44. divi-0.0.1.dev14/apps/web/app/dashboard/@modal/(.)trace/[id]/page.tsx +0 -19
  45. divi-0.0.1.dev14/apps/web/app/dashboard/trace/[id]/page.tsx +0 -19
  46. divi-0.0.1.dev14/apps/web/app/dashboard/trace/components/data-table-row-action.tsx +0 -46
  47. divi-0.0.1.dev14/apps/web/components/trace-chart.tsx +0 -84
  48. divi-0.0.1.dev14/divi/services/datapark/datapark.py +0 -63
  49. divi-0.0.1.dev14/divi/services/service.py +0 -11
  50. divi-0.0.1.dev14/divi/utils.py +0 -22
  51. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/.air.toml +0 -0
  52. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/.dockerignore +0 -0
  53. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/.github/dependabot.yml +0 -0
  54. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/.gitignore +0 -0
  55. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/LICENSE +0 -0
  56. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/README.md +0 -0
  57. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/README.md +0 -0
  58. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/README.md +0 -0
  59. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/concepts/session.mdx +0 -0
  60. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/development/roadmap.mdx +0 -0
  61. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/docs.json +0 -0
  62. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/favicon.ico +0 -0
  63. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/images/researcher-angel.png +0 -0
  64. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/images/scholar-angel.png +0 -0
  65. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/introduction.mdx +0 -0
  66. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/package.json +0 -0
  67. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/quickstart/trace.mdx +0 -0
  68. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/snippets/snippet-intro.mdx +0 -0
  69. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/tutorials/openai.mdx +0 -0
  70. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/Dockerfile +0 -0
  71. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/README.md +0 -0
  72. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/codegen.ts +0 -0
  73. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/package.json +0 -0
  74. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/src/datasources/auth-api.ts +0 -0
  75. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/src/index.ts +0 -0
  76. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/src/types/context.d.ts +0 -0
  77. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/src/types/response.d.ts +0 -0
  78. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/tsconfig.json +0 -0
  79. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/.gitignore +0 -0
  80. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/README.md +0 -0
  81. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/@modal/default.tsx +0 -0
  82. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/actions.ts +0 -0
  83. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/components/columns.tsx +0 -0
  84. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/components/create-dialog.tsx +0 -0
  85. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/components/data-table-toolbar.tsx +0 -0
  86. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/components/data-table.tsx +0 -0
  87. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/components/delete-dialog.tsx +0 -0
  88. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/data/data.tsx +0 -0
  89. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/data/schema.ts +0 -0
  90. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/layout.tsx +0 -0
  91. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/page.tsx +0 -0
  92. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/layout.tsx +0 -0
  93. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/page.tsx +0 -0
  94. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/settings/account/page.tsx +0 -0
  95. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/settings/appearance/page.tsx +0 -0
  96. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/settings/layout.tsx +0 -0
  97. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/settings/page.tsx +0 -0
  98. {divi-0.0.1.dev14/apps/web/app/dashboard/trace → divi-0.0.1.dev17/apps/web/app/dashboard/traces/(overview)}/components/data-table-toolbar.tsx +0 -0
  99. {divi-0.0.1.dev14/apps/web/app/dashboard/trace → divi-0.0.1.dev17/apps/web/app/dashboard/traces/(overview)}/components/data-table.tsx +0 -0
  100. {divi-0.0.1.dev14/apps/web/app/dashboard/trace → divi-0.0.1.dev17/apps/web/app/dashboard/traces/(overview)}/data/data.tsx +0 -0
  101. {divi-0.0.1.dev14/apps/web/app/dashboard/trace → divi-0.0.1.dev17/apps/web/app/dashboard/traces/(overview)}/data/schema.ts +0 -0
  102. {divi-0.0.1.dev14/apps/web/app/dashboard/trace → divi-0.0.1.dev17/apps/web/app/dashboard/traces/(overview)}/page.tsx +0 -0
  103. {divi-0.0.1.dev14/apps/web/app/dashboard/usage → divi-0.0.1.dev17/apps/web/app/dashboard/usages}/page.tsx +0 -0
  104. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/favicon.ico +0 -0
  105. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/home/components/home-header.tsx +0 -0
  106. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/home/components/home-hero.tsx +0 -0
  107. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/home/page.tsx +0 -0
  108. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/layout.tsx +0 -0
  109. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/login/page.tsx +0 -0
  110. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/page.tsx +0 -0
  111. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/signup/page.tsx +0 -0
  112. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/ApolloWrapper.tsx +0 -0
  113. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/account-form.tsx +0 -0
  114. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/appearance-form.tsx +0 -0
  115. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/chart-area-interactive.tsx +0 -0
  116. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/data-table-column-header.tsx +0 -0
  117. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/data-table-faceted-filter.tsx +0 -0
  118. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/data-table-pagination.tsx +0 -0
  119. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/data-table-row.tsx +0 -0
  120. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/data-table-view-options.tsx +0 -0
  121. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/login-form.tsx +0 -0
  122. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/nav-main.tsx +0 -0
  123. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/nav-secondary.tsx +0 -0
  124. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/nav-user.tsx +0 -0
  125. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/profile-form.tsx +0 -0
  126. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/section-cards.tsx +0 -0
  127. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/sidebar-nav.tsx +0 -0
  128. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/signup-form.tsx +0 -0
  129. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/theme-provider.tsx +0 -0
  130. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components.json +0 -0
  131. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/hooks/actionState.ts +0 -0
  132. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/hooks/apolloClient.ts +0 -0
  133. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/lib/callback/toast-callback.ts +0 -0
  134. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/lib/callback/with-callback.ts +0 -0
  135. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/lib/server/README.md +0 -0
  136. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/lib/server/auth.ts +0 -0
  137. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/lib/server/cookies.ts +0 -0
  138. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/lib/types/state.d.ts +0 -0
  139. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/lib/utils.ts +0 -0
  140. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/middleware.ts +0 -0
  141. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/next-env.d.ts +0 -0
  142. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/next.config.ts +0 -0
  143. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/postcss.config.mjs +0 -0
  144. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/public/peeking-angel.png +0 -0
  145. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/public/thinking-angel.png +0 -0
  146. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/tsconfig.json +0 -0
  147. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/vercel.json +0 -0
  148. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/biome.json +0 -0
  149. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/compose-dev.yml +0 -0
  150. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/config/config.py +0 -0
  151. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/decorators/__init__.py +0 -0
  152. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/decorators/obs_openai.py +0 -0
  153. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/common/v1/common.proto +0 -0
  154. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/common/v1/common_pb2.py +0 -0
  155. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/common/v1/common_pb2.pyi +0 -0
  156. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/core/health/v1/health_service.proto +0 -0
  157. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/core/health/v1/health_service_pb2.py +0 -0
  158. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/core/health/v1/health_service_pb2.pyi +0 -0
  159. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/metric/v1/metric.proto +0 -0
  160. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/metric/v1/metric_pb2.py +0 -0
  161. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/metric/v1/metric_pb2.pyi +0 -0
  162. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/trace/v1/trace.proto +0 -0
  163. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/__init__.py +0 -0
  164. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/auth/__init__.py +0 -0
  165. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/auth/init.py +0 -0
  166. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/auth/tokman.py +0 -0
  167. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/core/__init__.py +0 -0
  168. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/core/core.py +0 -0
  169. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/core/finish.py +0 -0
  170. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/core/init.py +0 -0
  171. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/datapark/__init__.py +0 -0
  172. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/datapark/init.py +0 -0
  173. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/finish.py +0 -0
  174. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/init.py +0 -0
  175. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/session/__init__.py +0 -0
  176. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/session/session.py +0 -0
  177. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/session/setup.py +0 -0
  178. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/session/teardown.py +0 -0
  179. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/signals/__init__.py +0 -0
  180. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/signals/trace/__init__.py +0 -0
  181. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/signals/trace/trace.py +0 -0
  182. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/docker-compose.yml +0 -0
  183. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/docs/README.md +0 -0
  184. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/docs/developer_tools.md +0 -0
  185. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/docs/images/architecture.svg +0 -0
  186. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/docs/images/favicon.ico +0 -0
  187. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/docs/images/og-image.png +0 -0
  188. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/docs/images/storage.svg +0 -0
  189. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/docs/package_readme.md +0 -0
  190. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/go.work +0 -0
  191. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/go.work.sum +0 -0
  192. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/hatch.toml +0 -0
  193. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/package.json +0 -0
  194. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/packages/README.md +0 -0
  195. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/pnpm-workspace.yaml +0 -0
  196. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/scripts/README.md +0 -0
  197. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/scripts/hatch_build.py +0 -0
  198. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/scripts/key_build.py +0 -0
  199. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/scripts/proto_build.py +0 -0
  200. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/README.md +0 -0
  201. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/go.mod +0 -0
  202. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/go.sum +0 -0
  203. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/auth/handler/api.go +0 -0
  204. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/auth/handler/auth.go +0 -0
  205. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/auth/handler/user.go +0 -0
  206. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/auth/router/router.go +0 -0
  207. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/core/.keep +0 -0
  208. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/datapark/handler/api.go +0 -0
  209. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/datapark/handler/metric.go +0 -0
  210. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/datapark/handler/session.go +0 -0
  211. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/pkg/auth/auth.go +0 -0
  212. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/pkg/auth/middleware.go +0 -0
  213. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/pkg/config/config.go +0 -0
  214. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/pkg/database/connect.go +0 -0
  215. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/pkg/database/database.go +0 -0
  216. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/pkg/model/api_key.go +0 -0
  217. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/pkg/model/user.go +0 -0
  218. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/pb/common.pb.go +0 -0
  219. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/pb/health_service.pb.go +0 -0
  220. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/pb/health_service_grpc.pb.go +0 -0
  221. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/pb/metric.pb.go +0 -0
  222. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/tests/__init__.py +0 -0
  223. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/tests/unit_tests/decorators/test_observable.py +0 -0
  224. {divi-0.0.1.dev14 → divi-0.0.1.dev17}/turbo.json +0 -0
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: divi
3
- Version: 0.0.1.dev14
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
7
- Requires-Dist: grpcio>=1.69.0
8
- Requires-Dist: protobuf>=5.29.3
7
+ Requires-Dist: grpcio>=1.71.0
8
+ Requires-Dist: protobuf<6.0.dev0,>=5.26.1
9
9
  Requires-Dist: pyjwt>=2.10.1
10
10
  Requires-Dist: requests>=2.32.3
11
11
  Description-Content-Type: text/markdown
@@ -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!
@@ -60,11 +67,30 @@ type Span {
60
67
  name: String!
61
68
  start_time: String!
62
69
  end_time: String!
63
- duration: Int!
64
- kind: String!
70
+ duration: Float!
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'];
@@ -201,10 +235,10 @@ export type RevokeApiKeyResponse = MutationResponse & {
201
235
  /** Span is a record of a single unit of work within a trace */
202
236
  export type Span = {
203
237
  __typename?: 'Span';
204
- duration: Scalars['Int']['output'];
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,13 +361,17 @@ 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']> }>;
333
368
  DeleteUserResponse: ResolverTypeWrapper<DeleteUserResponse>;
369
+ Float: ResolverTypeWrapper<Scalars['Float']['output']>;
334
370
  ID: ResolverTypeWrapper<Scalars['ID']['output']>;
335
371
  Int: ResolverTypeWrapper<Scalars['Int']['output']>;
336
372
  KeyValue: ResolverTypeWrapper<KeyValue>;
373
+ Kind: Kind;
374
+ MessageInput: ResolverTypeWrapper<MessageInput>;
337
375
  Mutation: ResolverTypeWrapper<{}>;
338
376
  MutationResponse: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['MutationResponse']>;
339
377
  NullTime: ResolverTypeWrapper<NullTime>;
@@ -351,13 +389,16 @@ export type ResolversTypes = {
351
389
  export type ResolversParentTypes = {
352
390
  APIKey: APIKeyModel;
353
391
  Boolean: Scalars['Boolean']['output'];
392
+ ChatInput: ChatInput;
354
393
  CreateAPIKeyResponse: Omit<CreateApiKeyResponse, 'data'> & { data?: Maybe<ResolversParentTypes['APIKey']> };
355
394
  CreateTokenResponse: CreateTokenResponse;
356
395
  CreateUserResponse: Omit<CreateUserResponse, 'data'> & { data?: Maybe<ResolversParentTypes['User']> };
357
396
  DeleteUserResponse: DeleteUserResponse;
397
+ Float: Scalars['Float']['output'];
358
398
  ID: Scalars['ID']['output'];
359
399
  Int: Scalars['Int']['output'];
360
400
  KeyValue: KeyValue;
401
+ MessageInput: MessageInput;
361
402
  Mutation: {};
362
403
  MutationResponse: ResolversInterfaceTypes<ResolversParentTypes>['MutationResponse'];
363
404
  NullTime: NullTime;
@@ -379,6 +420,18 @@ export type ApiKeyResolvers<ContextType = DataSourceContext, ParentType extends
379
420
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
380
421
  };
381
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
+
382
435
  export type CreateApiKeyResponseResolvers<ContextType = DataSourceContext, ParentType extends ResolversParentTypes['CreateAPIKeyResponse'] = ResolversParentTypes['CreateAPIKeyResponse']> = {
383
436
  code?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;
384
437
  data?: Resolver<Maybe<ResolversTypes['APIKey']>, ParentType, ContextType>;
@@ -416,6 +469,13 @@ export type KeyValueResolvers<ContextType = DataSourceContext, ParentType extend
416
469
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
417
470
  };
418
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
+
419
479
  export type MutationResolvers<ContextType = DataSourceContext, ParentType extends ResolversParentTypes['Mutation'] = ResolversParentTypes['Mutation']> = {
420
480
  createAPIKey?: Resolver<ResolversTypes['CreateAPIKeyResponse'], ParentType, ContextType, Partial<MutationCreateApiKeyArgs>>;
421
481
  createUser?: Resolver<ResolversTypes['CreateUserResponse'], ParentType, ContextType, RequireFields<MutationCreateUserArgs, 'email' | 'password' | 'username'>>;
@@ -443,6 +503,7 @@ export type NullTimeResolvers<ContextType = DataSourceContext, ParentType extend
443
503
  export type QueryResolvers<ContextType = DataSourceContext, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {
444
504
  all_traces?: Resolver<Maybe<Array<ResolversTypes['Trace']>>, ParentType, ContextType>;
445
505
  api_keys?: Resolver<Maybe<Array<ResolversTypes['APIKey']>>, ParentType, ContextType>;
506
+ chat_input?: Resolver<Maybe<ResolversTypes['ChatInput']>, ParentType, ContextType, RequireFields<QueryChat_InputArgs, 'span_id'>>;
446
507
  me?: Resolver<ResolversTypes['User'], ParentType, ContextType>;
447
508
  spans?: Resolver<Maybe<Array<ResolversTypes['Span']>>, ParentType, ContextType, RequireFields<QuerySpansArgs, 'trace_id'>>;
448
509
  traces?: Resolver<Maybe<Array<ResolversTypes['Trace']>>, ParentType, ContextType, RequireFields<QueryTracesArgs, 'session_id'>>;
@@ -457,10 +518,10 @@ export type RevokeApiKeyResponseResolvers<ContextType = DataSourceContext, Paren
457
518
  };
458
519
 
459
520
  export type SpanResolvers<ContextType = DataSourceContext, ParentType extends ResolversParentTypes['Span'] = ResolversParentTypes['Span']> = {
460
- duration?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;
521
+ duration?: Resolver<ResolversTypes['Float'], ParentType, ContextType>;
461
522
  end_time?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
462
523
  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
463
- kind?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
524
+ kind?: Resolver<ResolversTypes['Kind'], ParentType, ContextType>;
464
525
  metadata?: Resolver<Maybe<Array<ResolversTypes['KeyValue']>>, ParentType, ContextType>;
465
526
  name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
466
527
  parent_id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
@@ -505,11 +566,13 @@ export type UserResolvers<ContextType = DataSourceContext, ParentType extends Re
505
566
 
506
567
  export type Resolvers<ContextType = DataSourceContext> = {
507
568
  APIKey?: ApiKeyResolvers<ContextType>;
569
+ ChatInput?: ChatInputResolvers<ContextType>;
508
570
  CreateAPIKeyResponse?: CreateApiKeyResponseResolvers<ContextType>;
509
571
  CreateTokenResponse?: CreateTokenResponseResolvers<ContextType>;
510
572
  CreateUserResponse?: CreateUserResponseResolvers<ContextType>;
511
573
  DeleteUserResponse?: DeleteUserResponseResolvers<ContextType>;
512
574
  KeyValue?: KeyValueResolvers<ContextType>;
575
+ MessageInput?: MessageInputResolvers<ContextType>;
513
576
  Mutation?: MutationResolvers<ContextType>;
514
577
  MutationResponse?: MutationResponseResolvers<ContextType>;
515
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'}>
@@ -87,7 +90,7 @@ export function TableCellViewer({ item }: { item: z.infer<typeof schema> }) {
87
90
  <Input id="api-key" defaultValue={item.api_key} disabled />
88
91
  </div>
89
92
  <div className="flex flex-col gap-3">
90
- <Label htmlFor="created">Limit</Label>
93
+ <Label htmlFor="created">Created At</Label>
91
94
  <Input id="created" defaultValue={item.created_at} disabled />
92
95
  </div>
93
96
  </div>
@@ -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
+ }