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.
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/PKG-INFO +3 -3
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/src/datasources/datapark-api.ts +7 -1
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/src/resolvers.ts +3 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/src/schema.graphql +28 -2
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/src/types/types.d.ts +67 -4
- divi-0.0.1.dev17/apps/web/app/dashboard/@modal/(.)traces/[id]/page.tsx +21 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/components/data-table-cell-viewer.tsx +4 -1
- divi-0.0.1.dev17/apps/web/app/dashboard/traces/(children)/[id]/page.tsx +13 -0
- {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
- divi-0.0.1.dev17/apps/web/app/dashboard/traces/(overview)/components/data-table-row-action.tsx +31 -0
- {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
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/Modal.tsx +50 -2
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/app-sidebar.tsx +2 -2
- divi-0.0.1.dev17/apps/web/components/mode-switcher.tsx +43 -0
- divi-0.0.1.dev17/apps/web/components/responsive-resizable.tsx +37 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/site-header.tsx +3 -1
- divi-0.0.1.dev17/apps/web/components/trace-board.tsx +36 -0
- divi-0.0.1.dev17/apps/web/components/trace-chart.tsx +116 -0
- divi-0.0.1.dev17/apps/web/lib/server/openai.ts +48 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/lib/server/span.ts +32 -14
- divi-0.0.1.dev17/apps/web/lib/types/span.d.ts +23 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/package.json +1 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/__init__.py +1 -1
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/decorators/observable.py +5 -2
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/core/health/v1/health_service_pb2_grpc.py +1 -1
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/trace/v1/trace_pb2.py +7 -9
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/trace/v1/trace_pb2.pyi +0 -12
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/auth/auth.py +1 -9
- divi-0.0.1.dev17/divi/services/datapark/datapark.py +55 -0
- divi-0.0.1.dev17/divi/services/service.py +54 -0
- divi-0.0.1.dev17/divi/utils.py +49 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/pnpm-lock.yaml +91 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/pyproject.toml +4 -3
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/auth/handler/api_key.go +1 -1
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/datapark/handler/openai.go +63 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/datapark/handler/trace.go +8 -4
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/datapark/router/router.go +5 -0
- divi-0.0.1.dev17/services/internal/pkg/model/openai.go +29 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/pkg/model/session.go +5 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/pkg/model/trace.go +1 -1
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/pb/trace.pb.go +50 -136
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/tests/unit_tests/decorators/test_obs_openai.py +7 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/uv.lock +81 -64
- divi-0.0.1.dev14/apps/web/app/dashboard/@modal/(.)trace/[id]/page.tsx +0 -19
- divi-0.0.1.dev14/apps/web/app/dashboard/trace/[id]/page.tsx +0 -19
- divi-0.0.1.dev14/apps/web/app/dashboard/trace/components/data-table-row-action.tsx +0 -46
- divi-0.0.1.dev14/apps/web/components/trace-chart.tsx +0 -84
- divi-0.0.1.dev14/divi/services/datapark/datapark.py +0 -63
- divi-0.0.1.dev14/divi/services/service.py +0 -11
- divi-0.0.1.dev14/divi/utils.py +0 -22
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/.air.toml +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/.dockerignore +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/.github/dependabot.yml +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/.gitignore +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/LICENSE +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/README.md +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/README.md +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/README.md +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/concepts/session.mdx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/development/roadmap.mdx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/docs.json +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/favicon.ico +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/images/researcher-angel.png +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/images/scholar-angel.png +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/introduction.mdx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/package.json +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/quickstart/trace.mdx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/snippets/snippet-intro.mdx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/docs/tutorials/openai.mdx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/Dockerfile +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/README.md +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/codegen.ts +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/package.json +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/src/datasources/auth-api.ts +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/src/index.ts +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/src/types/context.d.ts +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/src/types/response.d.ts +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/graphql/tsconfig.json +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/.gitignore +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/README.md +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/@modal/default.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/actions.ts +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/components/columns.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/components/create-dialog.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/components/data-table-toolbar.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/components/data-table.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/components/delete-dialog.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/data/data.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/data/schema.ts +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/layout.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/api-keys/page.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/layout.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/page.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/settings/account/page.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/settings/appearance/page.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/settings/layout.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/dashboard/settings/page.tsx +0 -0
- {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
- {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
- {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
- {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
- {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
- {divi-0.0.1.dev14/apps/web/app/dashboard/usage → divi-0.0.1.dev17/apps/web/app/dashboard/usages}/page.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/favicon.ico +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/home/components/home-header.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/home/components/home-hero.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/home/page.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/layout.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/login/page.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/page.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/app/signup/page.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/ApolloWrapper.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/account-form.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/appearance-form.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/chart-area-interactive.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/data-table-column-header.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/data-table-faceted-filter.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/data-table-pagination.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/data-table-row.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/data-table-view-options.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/login-form.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/nav-main.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/nav-secondary.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/nav-user.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/profile-form.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/section-cards.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/sidebar-nav.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/signup-form.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components/theme-provider.tsx +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/components.json +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/hooks/actionState.ts +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/hooks/apolloClient.ts +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/lib/callback/toast-callback.ts +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/lib/callback/with-callback.ts +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/lib/server/README.md +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/lib/server/auth.ts +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/lib/server/cookies.ts +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/lib/types/state.d.ts +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/lib/utils.ts +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/middleware.ts +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/next-env.d.ts +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/next.config.ts +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/postcss.config.mjs +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/public/peeking-angel.png +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/public/thinking-angel.png +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/tsconfig.json +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/apps/web/vercel.json +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/biome.json +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/compose-dev.yml +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/config/config.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/decorators/__init__.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/decorators/obs_openai.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/common/v1/common.proto +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/common/v1/common_pb2.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/common/v1/common_pb2.pyi +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/core/health/v1/health_service.proto +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/core/health/v1/health_service_pb2.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/core/health/v1/health_service_pb2.pyi +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/metric/v1/metric.proto +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/metric/v1/metric_pb2.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/metric/v1/metric_pb2.pyi +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/proto/trace/v1/trace.proto +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/__init__.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/auth/__init__.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/auth/init.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/auth/tokman.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/core/__init__.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/core/core.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/core/finish.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/core/init.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/datapark/__init__.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/datapark/init.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/finish.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/services/init.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/session/__init__.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/session/session.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/session/setup.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/session/teardown.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/signals/__init__.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/signals/trace/__init__.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/divi/signals/trace/trace.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/docker-compose.yml +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/docs/README.md +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/docs/developer_tools.md +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/docs/images/architecture.svg +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/docs/images/favicon.ico +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/docs/images/og-image.png +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/docs/images/storage.svg +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/docs/package_readme.md +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/go.work +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/go.work.sum +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/hatch.toml +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/package.json +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/packages/README.md +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/pnpm-workspace.yaml +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/scripts/README.md +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/scripts/hatch_build.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/scripts/key_build.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/scripts/proto_build.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/README.md +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/go.mod +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/go.sum +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/auth/handler/api.go +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/auth/handler/auth.go +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/auth/handler/user.go +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/auth/router/router.go +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/core/.keep +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/datapark/handler/api.go +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/datapark/handler/metric.go +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/app/datapark/handler/session.go +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/pkg/auth/auth.go +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/pkg/auth/middleware.go +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/pkg/config/config.go +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/pkg/database/connect.go +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/pkg/database/database.go +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/pkg/model/api_key.go +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/internal/pkg/model/user.go +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/pb/common.pb.go +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/pb/health_service.pb.go +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/pb/health_service_grpc.pb.go +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/services/pb/metric.pb.go +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/tests/__init__.py +0 -0
- {divi-0.0.1.dev14 → divi-0.0.1.dev17}/tests/unit_tests/decorators/test_observable.py +0 -0
- {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.
|
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.
|
8
|
-
Requires-Dist: protobuf
|
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:
|
64
|
-
kind:
|
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['
|
238
|
+
duration: Scalars['Float']['output'];
|
205
239
|
end_time: Scalars['String']['output'];
|
206
240
|
id: Scalars['ID']['output'];
|
207
|
-
kind:
|
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['
|
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['
|
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">
|
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/
|
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
|
];
|
divi-0.0.1.dev17/apps/web/app/dashboard/traces/(overview)/components/data-table-row-action.tsx
ADDED
@@ -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
|
4
|
+
interface TracesLayoutProps {
|
5
5
|
children: React.ReactNode;
|
6
6
|
}
|
7
7
|
|
8
|
-
export default function
|
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 {
|
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
|
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/
|
41
|
+
url: '/dashboard/traces',
|
42
42
|
icon: IconBinaryTree,
|
43
43
|
},
|
44
44
|
{
|
45
45
|
title: 'Usage',
|
46
|
-
url: '/dashboard/
|
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-
|
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
|
+
}
|